From f74112a2b756c095aed2ede3a7d193fdeda002a7 Mon Sep 17 00:00:00 2001 From: Luca Montaigut Date: Tue, 25 Jul 2023 21:58:09 +0200 Subject: [PATCH 1/5] feat: add cool links voting and autothread --- .env.example | 1 + package.json | 1 + pnpm-lock.yaml | 139 +++++++++++++++++- src/config.ts | 1 + src/cool-links-management.ts | 20 +++ src/handlers/handle-guild-message-creation.ts | 8 + 6 files changed, 167 insertions(+), 3 deletions(-) create mode 100644 src/cool-links-management.ts diff --git a/.env.example b/.env.example index b656572..4022c60 100644 --- a/.env.example +++ b/.env.example @@ -1,4 +1,5 @@ DISCORD_TOKEN= DISCORD_CLIENT_ID= DISCORD_GUILD_ID= +COOL_LINKS_CHANNEL_ID= REDIS_URL= \ No newline at end of file diff --git a/package.json b/package.json index ff12299..bb447b5 100644 --- a/package.json +++ b/package.json @@ -31,6 +31,7 @@ "eslint-plugin-simple-import-sort": "10.0.0", "eslint-plugin-sonarjs": "0.19.0", "eslint-plugin-unused-imports": "3.0.0", + "open-graph-scraper": "6.2.2", "prettier": "3.0.0", "tsup": "7.2.0", "type-fest": "4.1.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e3b8f77..eda5730 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -57,7 +57,14 @@ devDependencies: version: 0.19.0(eslint@8.46.0) eslint-plugin-unused-imports: specifier: 3.0.0 +<<<<<<< HEAD version: 3.0.0(@typescript-eslint/eslint-plugin@6.2.1)(eslint@8.46.0) +======= + version: 3.0.0(@typescript-eslint/eslint-plugin@6.0.0)(eslint@8.45.0) + open-graph-scraper: + specifier: 6.2.2 + version: 6.2.2 +>>>>>>> 2d6a5d6 (feat: add cool links voting and autothread) prettier: specifier: 3.0.0 version: 3.0.0 @@ -781,6 +788,10 @@ packages: engines: {node: '>=8'} dev: true + /boolbase@1.0.0: + resolution: {integrity: sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==} + dev: true + /bplist-parser@0.2.0: resolution: {integrity: sha512-z0M+byMThzQmD9NILRniCUXYsYpjwnlO8N5uCFaCqIOpqRsJCrQL9NK3JsD67CN5a08nF5oIL2bD6loTdHOuKw==} engines: {node: '>= 5.10.0'} @@ -824,7 +835,6 @@ packages: engines: {node: '>=10.16.0'} dependencies: streamsearch: 1.1.0 - dev: false /cac@6.7.14: resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} @@ -851,6 +861,34 @@ packages: supports-color: 7.2.0 dev: true + /chardet@1.6.0: + resolution: {integrity: sha512-+QOTw3otC4+FxdjK9RopGpNOglADbr4WPFi0SonkO99JbpkTPbMxmdm4NenhF5Zs+4gPXLI1+y2uazws5TMe8w==} + dev: true + + /cheerio-select@2.1.0: + resolution: {integrity: sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==} + dependencies: + boolbase: 1.0.0 + css-select: 5.1.0 + css-what: 6.1.0 + domelementtype: 2.3.0 + domhandler: 5.0.3 + domutils: 3.0.1 + dev: true + + /cheerio@1.0.0-rc.12: + resolution: {integrity: sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==} + engines: {node: '>= 6'} + dependencies: + cheerio-select: 2.1.0 + dom-serializer: 2.0.0 + domhandler: 5.0.3 + domutils: 3.0.1 + htmlparser2: 8.0.2 + parse5: 7.1.2 + parse5-htmlparser2-tree-adapter: 7.0.0 + dev: true + /chokidar@3.5.3: resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} engines: {node: '>= 8.10.0'} @@ -900,6 +938,21 @@ packages: which: 2.0.2 dev: true + /css-select@5.1.0: + resolution: {integrity: sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==} + dependencies: + boolbase: 1.0.0 + css-what: 6.1.0 + domhandler: 5.0.3 + domutils: 3.0.1 + nth-check: 2.1.1 + dev: true + + /css-what@6.1.0: + resolution: {integrity: sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==} + engines: {node: '>= 6'} + dev: true + /debug@3.2.7: resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} peerDependencies: @@ -1010,6 +1063,33 @@ packages: esutils: 2.0.3 dev: true + /dom-serializer@2.0.0: + resolution: {integrity: sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==} + dependencies: + domelementtype: 2.3.0 + domhandler: 5.0.3 + entities: 4.4.0 + dev: true + + /domelementtype@2.3.0: + resolution: {integrity: sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==} + dev: true + + /domhandler@5.0.3: + resolution: {integrity: sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==} + engines: {node: '>= 4'} + dependencies: + domelementtype: 2.3.0 + dev: true + + /domutils@3.0.1: + resolution: {integrity: sha512-z08c1l761iKhDFtfXO04C7kTdPBLi41zwOZl00WS8b5eiaebNpY00HKbztwBq+e3vyqWNwWF3mP9YLUeqIrF+Q==} + dependencies: + dom-serializer: 2.0.0 + domelementtype: 2.3.0 + domhandler: 5.0.3 + dev: true + /dot-case@3.0.4: resolution: {integrity: sha512-Kv5nKlh6yRrdrGvxeJ2e5y2eRUpkUosIW4A2AS38zwSz27zu7ufDwQPi5Jhs3XAlGNetl3bmnGhQsMtkKJnj3w==} dependencies: @@ -1022,6 +1102,11 @@ packages: engines: {node: '>=12'} dev: true + /entities@4.4.0: + resolution: {integrity: sha512-oYp7156SP8LkeGD0GF85ad1X9Ai79WtRsZ2gxJqtBuzH+98YUV6jkHEKlZkMbcrjJjIVJNIDP/3WL9wQkoPbWA==} + engines: {node: '>=0.12'} + dev: true + /env-var@7.3.1: resolution: {integrity: sha512-Sq9qMnbBApv7SeUOKhw5GZ0VxAwltjFTzXTOvRV9NZEKmMCBZuFCumAvkXwBC5Fo396D7BnOpb5dXud7Vzhliw==} engines: {node: '>=10'} @@ -1624,6 +1709,15 @@ packages: function-bind: 1.1.1 dev: true + /htmlparser2@8.0.2: + resolution: {integrity: sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==} + dependencies: + domelementtype: 2.3.0 + domhandler: 5.0.3 + domutils: 3.0.1 + entities: 4.4.0 + dev: true + /human-signals@2.1.0: resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} engines: {node: '>=10.17.0'} @@ -2045,6 +2139,12 @@ packages: path-key: 4.0.0 dev: true + /nth-check@2.1.1: + resolution: {integrity: sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==} + dependencies: + boolbase: 1.0.0 + dev: true + /object-assign@4.1.1: resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} engines: {node: '>=0.10.0'} @@ -2116,6 +2216,16 @@ packages: mimic-fn: 4.0.0 dev: true + /open-graph-scraper@6.2.2: + resolution: {integrity: sha512-cQO0c0HF9ZMhSoIEOKMyxbSYwKn6qWBDEdQeCvZnAVwKCxSWj2DV8AwC1J4JCiwZbn/C4grGCJXpvmlAyTXrBg==} + engines: {node: '>=18.0.0'} + dependencies: + chardet: 1.6.0 + cheerio: 1.0.0-rc.12 + undici: 5.22.1 + validator: 13.9.0 + dev: true + /open@9.1.0: resolution: {integrity: sha512-OS+QTnw1/4vrf+9hh1jc1jnYjzSG4ttTBB8UxOwAnInG3Uo4ssetzC1ihqaIHjLJnA5GGlRl6QlZXOTQhRBUvg==} engines: {node: '>=14.16'} @@ -2166,6 +2276,19 @@ packages: callsites: 3.1.0 dev: true + /parse5-htmlparser2-tree-adapter@7.0.0: + resolution: {integrity: sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g==} + dependencies: + domhandler: 5.0.3 + parse5: 7.1.2 + dev: true + + /parse5@7.1.2: + resolution: {integrity: sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==} + dependencies: + entities: 4.4.0 + dev: true + /path-exists@4.0.0: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} @@ -2405,7 +2528,6 @@ packages: /streamsearch@1.1.0: resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} engines: {node: '>=10.0.0'} - dev: false /string.prototype.trim@1.2.7: resolution: {integrity: sha512-p6TmeT1T3411M8Cgg9wBTMRtY2q9+PNy9EV1i2lIXUN/btt763oIfxwN3RR8VU6wHX8j/1CFy0L+YuThm6bgOg==} @@ -2651,7 +2773,6 @@ packages: engines: {node: '>=14.0'} dependencies: busboy: 1.6.0 - dev: false /untildify@4.0.0: resolution: {integrity: sha512-KK8xQ1mkzZeg9inewmFVDNkg3l5LUhoq9kN6iWYB/CC9YMG8HA+c1Q8HwDe6dEX7kErrEVNVBO3fWsVq5iDgtw==} @@ -2664,6 +2785,18 @@ packages: punycode: 2.3.0 dev: true +<<<<<<< HEAD +======= + /util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + dev: false + + /validator@13.9.0: + resolution: {integrity: sha512-B+dGG8U3fdtM0/aNK4/X8CXq/EcxU2WPrPEkJGslb47qyHsxmbggTWK0yEA4qnYVNF+nxNlN88o14hIcPmSIEA==} + engines: {node: '>= 0.10'} + dev: true + +>>>>>>> 2d6a5d6 (feat: add cool links voting and autothread) /webidl-conversions@4.0.2: resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} dev: true diff --git a/src/config.ts b/src/config.ts index 29db2d1..239f951 100644 --- a/src/config.ts +++ b/src/config.ts @@ -5,6 +5,7 @@ export const config = { token: env.get('DISCORD_TOKEN').required().asString(), clientId: env.get('DISCORD_CLIENT_ID').required().asString(), guildId: env.get('DISCORD_GUILD_ID').required().asString(), + coolLinksChannelId: env.get('COOL_LINKS_CHANNEL_ID').required().asString(), }, redis: { url: env.get('REDIS_URL').required().asString(), diff --git a/src/cool-links-management.ts b/src/cool-links-management.ts new file mode 100644 index 0000000..025f79d --- /dev/null +++ b/src/cool-links-management.ts @@ -0,0 +1,20 @@ +import type { Message } from 'discord.js'; +import ogs from 'open-graph-scraper'; + +export const coolLinksManagement = async (message: Message) => { + const urlRegex = /(((https?:\/\/)|(www\.))[^\s]+)/g; + const detectedURLs = message.content.match(urlRegex); + + if (detectedURLs === null) { + await message.delete(); + return; + } + + await message.react('✅'); + await message.react('❌'); + const { result, error } = await ogs({ url: detectedURLs[0] }); + const threadName = error ? message.content : `${result.ogSiteName} - ${result.ogTitle}`; + await message.startThread({ + name: threadName, + }); +}; diff --git a/src/handlers/handle-guild-message-creation.ts b/src/handlers/handle-guild-message-creation.ts index 3d8bdbd..db63928 100644 --- a/src/handlers/handle-guild-message-creation.ts +++ b/src/handlers/handle-guild-message-creation.ts @@ -1,6 +1,9 @@ import type { Message } from 'discord.js'; import { MessageType } from 'discord.js'; +import { config } from '../config'; +import { coolLinksManagement } from '../cool-links-management'; + const urlMappings = [ { pattern: /https?:\/\/(mobile\.)?twitter\.com\/(\S+)\/status\/(\d+)/g, @@ -17,6 +20,11 @@ export const handleGuildMessageCreation = async (message: Message) => { return; } + if (message.channelId === config.discord.coolLinksChannelId) { + await coolLinksManagement(message); + return; + } + let modifiedContent = message.content; let hasModification = false; From f2cb0fb1436263cd78ae522fbf56beedccdfc692 Mon Sep 17 00:00:00 2001 From: Luca Montaigut Date: Tue, 25 Jul 2023 21:59:12 +0200 Subject: [PATCH 2/5] refactor: extract vxtwitter feature --- src/handlers/handle-guild-message-creation.ts | 26 ++----------------- src/pattern-replacement.ts | 26 +++++++++++++++++++ 2 files changed, 28 insertions(+), 24 deletions(-) create mode 100644 src/pattern-replacement.ts diff --git a/src/handlers/handle-guild-message-creation.ts b/src/handlers/handle-guild-message-creation.ts index db63928..253ec93 100644 --- a/src/handlers/handle-guild-message-creation.ts +++ b/src/handlers/handle-guild-message-creation.ts @@ -3,13 +3,7 @@ import { MessageType } from 'discord.js'; import { config } from '../config'; import { coolLinksManagement } from '../cool-links-management'; - -const urlMappings = [ - { - pattern: /https?:\/\/(mobile\.)?twitter\.com\/(\S+)\/status\/(\d+)/g, - replacement: 'https://vxtwitter.com/$2/status/$3', - }, -]; +import { patternReplacement } from '../pattern-replacement'; export const handleGuildMessageCreation = async (message: Message) => { if (message.author.bot) { @@ -25,21 +19,5 @@ export const handleGuildMessageCreation = async (message: Message) => { return; } - let modifiedContent = message.content; - let hasModification = false; - - for (const { pattern, replacement } of urlMappings) { - if (pattern.test(modifiedContent)) { - modifiedContent = modifiedContent.replace(pattern, replacement); - hasModification = true; - } - } - - if (!hasModification) { - return; - } - const newMessage = [`<@${message.author.id}>`, modifiedContent].join('\n'); - - await message.channel.send(newMessage); - await message.delete(); + await patternReplacement(message); }; diff --git a/src/pattern-replacement.ts b/src/pattern-replacement.ts new file mode 100644 index 0000000..c50515e --- /dev/null +++ b/src/pattern-replacement.ts @@ -0,0 +1,26 @@ +import type { Message } from 'discord.js'; + +const urlMappings = [ + { + pattern: /https?:\/\/(mobile\.)?twitter\.com\/(\S+)\/status\/(\d+)/g, + replacement: 'https://vxtwitter.com/$2/status/$3', + }, +]; + +export const patternReplacement = async (message: Message) => { + let modifiedContent = message.content; + + for (const { pattern, replacement } of urlMappings) { + if (pattern.test(modifiedContent)) { + modifiedContent = modifiedContent.replace(pattern, replacement); + } + } + + const hasModification = message.content !== modifiedContent; + if (!hasModification) return; + + const newMessage = [`<@${message.author.id}>`, modifiedContent].join('\n'); + + await message.channel.send(newMessage); + await message.delete(); +}; From 6ec79ce88bb425368a555752a0fd3d84386986f9 Mon Sep 17 00:00:00 2001 From: Luca Montaigut Date: Tue, 25 Jul 2023 22:24:10 +0200 Subject: [PATCH 3/5] feat: autoarchive and error handling --- src/cool-links-management.ts | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/src/cool-links-management.ts b/src/cool-links-management.ts index 025f79d..1fa2493 100644 --- a/src/cool-links-management.ts +++ b/src/cool-links-management.ts @@ -12,9 +12,16 @@ export const coolLinksManagement = async (message: Message) => { await message.react('✅'); await message.react('❌'); - const { result, error } = await ogs({ url: detectedURLs[0] }); - const threadName = error ? message.content : `${result.ogSiteName} - ${result.ogTitle}`; - await message.startThread({ - name: threadName, - }); + try { + const { result } = await ogs({ url: detectedURLs[0] }); + const threadName = result.success + ? `${result.ogSiteName} - ${result.ogTitle}` + : message.content; + await message.startThread({ + name: threadName, + autoArchiveDuration: 4320, + }); + } catch (error) { + console.error(error); + } }; From 0fcef0c30f6ef292a65d86bd451436ef31ee7f5f Mon Sep 17 00:00:00 2001 From: Luca Montaigut Date: Tue, 25 Jul 2023 22:39:19 +0200 Subject: [PATCH 4/5] feat: clean thread name --- src/cool-links-management.ts | 39 +++++++++++++++++++++++++----------- 1 file changed, 27 insertions(+), 12 deletions(-) diff --git a/src/cool-links-management.ts b/src/cool-links-management.ts index 1fa2493..043630e 100644 --- a/src/cool-links-management.ts +++ b/src/cool-links-management.ts @@ -1,6 +1,27 @@ import type { Message } from 'discord.js'; import ogs from 'open-graph-scraper'; +const getThreadNameFromOpenGraph = async (url: string): Promise => { + try { + const { result } = await ogs({ url }); + if (!result.success) throw new Error('No OG data found'); + + const ogSiteName = result.ogSiteName; + const ogTitle = result.ogTitle; + if (ogSiteName && ogTitle) { + return `${ogSiteName} - ${ogTitle}`; + } else if (ogSiteName) { + return ogSiteName; + } else if (ogTitle) { + return ogTitle; + } + } catch (error) { + console.error(error); + } + + return null; +}; + export const coolLinksManagement = async (message: Message) => { const urlRegex = /(((https?:\/\/)|(www\.))[^\s]+)/g; const detectedURLs = message.content.match(urlRegex); @@ -12,16 +33,10 @@ export const coolLinksManagement = async (message: Message) => { await message.react('✅'); await message.react('❌'); - try { - const { result } = await ogs({ url: detectedURLs[0] }); - const threadName = result.success - ? `${result.ogSiteName} - ${result.ogTitle}` - : message.content; - await message.startThread({ - name: threadName, - autoArchiveDuration: 4320, - }); - } catch (error) { - console.error(error); - } + + const threadName = await getThreadNameFromOpenGraph(detectedURLs[0]); + await message.startThread({ + name: threadName ?? message.content, + autoArchiveDuration: 4320, + }); }; From 2b86ff364fc3a1caada5bffa956cd03d6681a679 Mon Sep 17 00:00:00 2001 From: Luca Montaigut Date: Wed, 2 Aug 2023 21:33:19 +0200 Subject: [PATCH 5/5] fix: if/else pattern and enum for threadautoarchive value --- pnpm-lock.yaml | 179 ++++++++++++++++++++++++----------- src/cool-links-management.ts | 10 +- 2 files changed, 131 insertions(+), 58 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index eda5730..1dbdc67 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -57,14 +57,10 @@ devDependencies: version: 0.19.0(eslint@8.46.0) eslint-plugin-unused-imports: specifier: 3.0.0 -<<<<<<< HEAD version: 3.0.0(@typescript-eslint/eslint-plugin@6.2.1)(eslint@8.46.0) -======= - version: 3.0.0(@typescript-eslint/eslint-plugin@6.0.0)(eslint@8.45.0) open-graph-scraper: specifier: 6.2.2 version: 6.2.2 ->>>>>>> 2d6a5d6 (feat: add cool links voting and autothread) prettier: specifier: 3.0.0 version: 3.0.0 @@ -373,7 +369,7 @@ packages: ajv: 6.12.6 debug: 4.3.4 espree: 9.6.1 - globals: 13.20.0 + globals: 13.19.0 ignore: 5.2.4 import-fresh: 3.3.0 js-yaml: 4.1.0 @@ -412,13 +408,13 @@ packages: resolution: {integrity: sha512-Sx1pU8EM64o2BrqNpEO1CNLtKQwyhuXuqyfH7oGKCk+1a33d2r5saW8zNwm3j6BTExtjrv2BxTgzzkMwts6vGg==} dev: false - /@jridgewell/gen-mapping@0.3.3: - resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==} + /@jridgewell/gen-mapping@0.3.2: + resolution: {integrity: sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==} engines: {node: '>=6.0.0'} dependencies: '@jridgewell/set-array': 1.1.2 - '@jridgewell/sourcemap-codec': 1.4.15 - '@jridgewell/trace-mapping': 0.3.18 + '@jridgewell/sourcemap-codec': 1.4.14 + '@jridgewell/trace-mapping': 0.3.17 dev: true /@jridgewell/resolve-uri@3.1.0: @@ -435,12 +431,8 @@ packages: resolution: {integrity: sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==} dev: true - /@jridgewell/sourcemap-codec@1.4.15: - resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} - dev: true - - /@jridgewell/trace-mapping@0.3.18: - resolution: {integrity: sha512-w+niJYzMHdd7USdiH2U6869nqhD2nbfZXND5Yp93qIbEmnDNk7PD48o+YchRVpzMU7M6jVCbenTR7PA1FLQ9pA==} + /@jridgewell/trace-mapping@0.3.17: + resolution: {integrity: sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==} dependencies: '@jridgewell/resolve-uri': 3.1.0 '@jridgewell/sourcemap-codec': 1.4.14 @@ -727,9 +719,9 @@ packages: engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.2 - define-properties: 1.2.0 - es-abstract: 1.21.2 - get-intrinsic: 1.2.1 + define-properties: 1.1.4 + es-abstract: 1.21.0 + get-intrinsic: 1.1.3 is-string: 1.0.7 dev: true @@ -743,10 +735,10 @@ packages: engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.2 - define-properties: 1.2.0 - es-abstract: 1.21.2 + define-properties: 1.1.4 + es-abstract: 1.21.0 es-shim-unscopables: 1.0.0 - get-intrinsic: 1.2.1 + get-intrinsic: 1.1.3 dev: true /array.prototype.flat@1.3.1: @@ -754,8 +746,8 @@ packages: engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.2 - define-properties: 1.2.0 - es-abstract: 1.21.2 + define-properties: 1.1.4 + es-abstract: 1.21.0 es-shim-unscopables: 1.0.0 dev: true @@ -764,8 +756,8 @@ packages: engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.2 - define-properties: 1.2.0 - es-abstract: 1.21.2 + define-properties: 1.1.4 + es-abstract: 1.21.0 es-shim-unscopables: 1.0.0 dev: true @@ -1002,6 +994,14 @@ packages: engines: {node: '>=12'} dev: true + /define-properties@1.1.4: + resolution: {integrity: sha512-uckOqKcfaVvtBdsVkdPv3XjveQJsNQqmhXgRi8uhvWWuPYZCNlzT8qAyblUgNoXdHdjMTzAqeGjAoli8f+bzPA==} + engines: {node: '>= 0.4'} + dependencies: + has-property-descriptors: 1.0.0 + object-keys: 1.1.1 + dev: true + /define-properties@1.2.0: resolution: {integrity: sha512-xvqAVKGfT1+UAvPwKTVw/njhdQ8ZhXK4lI0bCIuCMrp2up9nPnaDftrLtmpTazqd1o+UY4zgzU+avtMbDP+ldA==} engines: {node: '>= 0.4'} @@ -1112,6 +1112,44 @@ packages: engines: {node: '>=10'} dev: false + /es-abstract@1.21.0: + resolution: {integrity: sha512-GUGtW7eXQay0c+PRq0sGIKSdaBorfVqsCMhGHo4elP7YVqZu9nCZS4UkK4gv71gOWNMra/PaSKD3ao1oWExO0g==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + es-set-tostringtag: 2.0.1 + es-to-primitive: 1.2.1 + function-bind: 1.1.1 + function.prototype.name: 1.1.5 + get-intrinsic: 1.2.1 + get-symbol-description: 1.0.0 + globalthis: 1.0.3 + gopd: 1.0.1 + has: 1.0.3 + has-property-descriptors: 1.0.0 + has-proto: 1.0.1 + has-symbols: 1.0.3 + internal-slot: 1.0.4 + is-array-buffer: 3.0.1 + is-callable: 1.2.7 + is-negative-zero: 2.0.2 + is-regex: 1.1.4 + is-shared-array-buffer: 1.0.2 + is-string: 1.0.7 + is-typed-array: 1.1.10 + is-weakref: 1.0.2 + object-inspect: 1.12.2 + object-keys: 1.1.1 + object.assign: 4.1.4 + regexp.prototype.flags: 1.4.3 + safe-regex-test: 1.0.0 + string.prototype.trimend: 1.0.6 + string.prototype.trimstart: 1.0.6 + typed-array-length: 1.0.4 + unbox-primitive: 1.0.2 + which-typed-array: 1.1.9 + dev: true + /es-abstract@1.21.2: resolution: {integrity: sha512-y/B5POM2iBnIxCiernH1G7rC9qQoM77lLIMQLuob0zhp8C56Po81+2Nj0WFKnd0pNReDTnkYryc+zhOzpEIROg==} engines: {node: '>= 0.4'} @@ -1142,7 +1180,7 @@ packages: object-inspect: 1.12.3 object-keys: 1.1.1 object.assign: 4.1.4 - regexp.prototype.flags: 1.5.0 + regexp.prototype.flags: 1.4.3 safe-regex-test: 1.0.0 string.prototype.trim: 1.2.7 string.prototype.trimend: 1.0.6 @@ -1403,7 +1441,7 @@ packages: file-entry-cache: 6.0.1 find-up: 5.0.0 glob-parent: 6.0.2 - globals: 13.20.0 + globals: 13.19.0 graphemer: 1.4.0 ignore: 5.2.4 imurmurhash: 0.1.4 @@ -1492,6 +1530,17 @@ packages: resolution: {integrity: sha512-xJuoT5+L99XlZ8twedaRf6Ax2TgQVxvgZOYoPKqZufmJib0tL2tegPBOZb1pVNgIhlqDlA0eO0c3wBvQcmzx4w==} dev: true + /fast-glob@3.2.12: + resolution: {integrity: sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==} + engines: {node: '>=8.6.0'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.5 + dev: true + /fast-glob@3.3.0: resolution: {integrity: sha512-ChDuvbOypPuNjO8yIDf36x7BlZX1smcUMTTcyoIjycexOxd6DFsKsg21qVBzEmr3G7fUKIRy2/psii+CIUt7FA==} engines: {node: '>=8.6.0'} @@ -1587,6 +1636,14 @@ packages: resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} dev: true + /get-intrinsic@1.1.3: + resolution: {integrity: sha512-QJVz1Tj7MS099PevUG5jvnt9tSkXN8K14dxQlikJuPt4uD9hHAHjLyLBiLR5zELelBdD9QNRAXZzsJx0WaDL9A==} + dependencies: + function-bind: 1.1.1 + has: 1.0.3 + has-symbols: 1.0.3 + dev: true + /get-intrinsic@1.2.1: resolution: {integrity: sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==} dependencies: @@ -1634,8 +1691,8 @@ packages: path-is-absolute: 1.0.1 dev: true - /globals@13.20.0: - resolution: {integrity: sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==} + /globals@13.19.0: + resolution: {integrity: sha512-dkQ957uSRWHw7CFXLUtUHQI3g3aWApYhfNR2O6jn/907riyTYKVBmxYVROkBcY614FSSeSJh7Xm7SrUWCxvJMQ==} engines: {node: '>=8'} dependencies: type-fest: 0.20.2 @@ -1654,7 +1711,7 @@ packages: dependencies: array-union: 2.1.0 dir-glob: 3.0.1 - fast-glob: 3.3.0 + fast-glob: 3.2.12 ignore: 5.2.4 merge2: 1.4.1 slash: 3.0.0 @@ -1757,6 +1814,15 @@ packages: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} dev: true + /internal-slot@1.0.4: + resolution: {integrity: sha512-tA8URYccNzMo94s5MQZgH8NB/XTa6HsOo0MLfXTKKEnHVVdegzaQoFZ7Jp44bdvLvY2waT5dc+j5ICEswhi7UQ==} + engines: {node: '>= 0.4'} + dependencies: + get-intrinsic: 1.2.1 + has: 1.0.3 + side-channel: 1.0.4 + dev: true + /internal-slot@1.0.5: resolution: {integrity: sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==} engines: {node: '>= 0.4'} @@ -1783,6 +1849,14 @@ packages: - supports-color dev: false + /is-array-buffer@3.0.1: + resolution: {integrity: sha512-ASfLknmY8Xa2XtB4wmbz13Wu202baeA18cJBCeCy0wXUHZF0IPyVEXqKEcd+t2fNSLLL1vC6k7lxZEojNbISXQ==} + dependencies: + call-bind: 1.0.2 + get-intrinsic: 1.2.1 + is-typed-array: 1.1.10 + dev: true + /is-array-buffer@3.0.2: resolution: {integrity: sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==} dependencies: @@ -2150,6 +2224,10 @@ packages: engines: {node: '>=0.10.0'} dev: true + /object-inspect@1.12.2: + resolution: {integrity: sha512-z+cPxW0QGUp0mcqcsgQyLVRDoXFQbXOwBaqyF7VIgI4TWNQsDHrBpUQslRmIfAoYWdYzs6UlKJtB2XJpTaNSpQ==} + dev: true + /object-inspect@1.12.3: resolution: {integrity: sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==} dev: true @@ -2174,8 +2252,8 @@ packages: engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.2 - define-properties: 1.2.0 - es-abstract: 1.21.2 + define-properties: 1.1.4 + es-abstract: 1.21.0 dev: true /object.groupby@1.0.0: @@ -2192,8 +2270,8 @@ packages: engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.2 - define-properties: 1.2.0 - es-abstract: 1.21.2 + define-properties: 1.1.4 + es-abstract: 1.21.0 dev: true /once@1.4.0: @@ -2345,7 +2423,7 @@ packages: optional: true dependencies: lilconfig: 2.1.0 - yaml: 2.3.1 + yaml: 2.2.1 dev: true /prelude-ls@1.2.1: @@ -2366,8 +2444,8 @@ packages: hasBin: true dev: true - /punycode@2.3.0: - resolution: {integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==} + /punycode@2.2.0: + resolution: {integrity: sha512-LN6QV1IJ9ZhxWTNdktaPClrNfp8xdSAYS0Zk2ddX7XsXZAxckMHPCBcHRo0cTcEIgYPRiGEkmji3Idkh2yFtYw==} engines: {node: '>=6'} dev: true @@ -2394,8 +2472,8 @@ packages: redis-errors: 1.2.0 dev: false - /regexp.prototype.flags@1.5.0: - resolution: {integrity: sha512-0SutC3pNudRKgquxGoRGIz946MZVHqbNfPjBdxeOhBrdgDKlRoXmYLQN9xRbrR09ZXWeGAdPuif7egofn6v5LA==} + /regexp.prototype.flags@1.4.3: + resolution: {integrity: sha512-fjggEOO3slI6Wvgjwflkc4NFRCTZAu5CnNfBd5qOMYhWdn67nJBBu34/TkD++eeFmd8C9r9jfXJ27+nSiRkSUA==} engines: {node: '>= 0.4'} dependencies: call-bind: 1.0.2 @@ -2443,8 +2521,8 @@ packages: glob: 7.1.6 dev: true - /rollup@3.21.7: - resolution: {integrity: sha512-KXPaEuR8FfUoK2uHwNjxTmJ18ApyvD6zJpYv9FOJSqLStmt6xOY84l1IjK2dSolQmoXknrhEFRaPRgOPdqCT5w==} + /rollup@3.20.2: + resolution: {integrity: sha512-3zwkBQl7Ai7MFYQE0y1MeQ15+9jsi7XxfrqwTb/9EK8D9C9+//EBR4M+CuA1KODRaNbFez/lWxA5vhEGZp4MUg==} engines: {node: '>=14.18.0', npm: '>=8.0.0'} hasBin: true optionalDependencies: @@ -2586,7 +2664,7 @@ packages: engines: {node: '>=8'} hasBin: true dependencies: - '@jridgewell/gen-mapping': 0.3.3 + '@jridgewell/gen-mapping': 0.3.2 commander: 4.1.1 glob: 7.1.6 lines-and-columns: 1.2.4 @@ -2647,7 +2725,7 @@ packages: /tr46@1.0.1: resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==} dependencies: - punycode: 2.3.0 + punycode: 2.2.0 dev: true /tree-kill@1.2.2: @@ -2718,7 +2796,7 @@ packages: joycon: 3.1.1 postcss-load-config: 4.0.1 resolve-from: 5.0.0 - rollup: 3.21.7 + rollup: 3.20.2 source-map: 0.8.0-beta.0 sucrase: 3.32.0 tree-kill: 1.2.2 @@ -2782,21 +2860,14 @@ packages: /uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} dependencies: - punycode: 2.3.0 + punycode: 2.2.0 dev: true -<<<<<<< HEAD -======= - /util-deprecate@1.0.2: - resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} - dev: false - /validator@13.9.0: resolution: {integrity: sha512-B+dGG8U3fdtM0/aNK4/X8CXq/EcxU2WPrPEkJGslb47qyHsxmbggTWK0yEA4qnYVNF+nxNlN88o14hIcPmSIEA==} engines: {node: '>= 0.10'} dev: true ->>>>>>> 2d6a5d6 (feat: add cool links voting and autothread) /webidl-conversions@4.0.2: resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} dev: true @@ -2860,8 +2931,8 @@ packages: resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} dev: true - /yaml@2.3.1: - resolution: {integrity: sha512-2eHWfjaoXgTBC2jNM1LRef62VQa0umtvRiDSk6HSzW7RvS5YtkabJrwYLLEKWBc8a5U2PTSCs+dJjUTJdlHsWQ==} + /yaml@2.2.1: + resolution: {integrity: sha512-e0WHiYql7+9wr4cWMx3TVQrNwejKaEe7/rHNmQmqRjazfOP5W8PB6Jpebb5o6fIapbz9o9+2ipcaTM2ZwDI6lw==} engines: {node: '>= 14'} dev: true diff --git a/src/cool-links-management.ts b/src/cool-links-management.ts index 043630e..dacf7ee 100644 --- a/src/cool-links-management.ts +++ b/src/cool-links-management.ts @@ -1,4 +1,4 @@ -import type { Message } from 'discord.js'; +import { type Message, ThreadAutoArchiveDuration } from 'discord.js'; import ogs from 'open-graph-scraper'; const getThreadNameFromOpenGraph = async (url: string): Promise => { @@ -10,9 +10,11 @@ const getThreadNameFromOpenGraph = async (url: string): Promise = const ogTitle = result.ogTitle; if (ogSiteName && ogTitle) { return `${ogSiteName} - ${ogTitle}`; - } else if (ogSiteName) { + } + if (ogSiteName) { return ogSiteName; - } else if (ogTitle) { + } + if (ogTitle) { return ogTitle; } } catch (error) { @@ -37,6 +39,6 @@ export const coolLinksManagement = async (message: Message) => { const threadName = await getThreadNameFromOpenGraph(detectedURLs[0]); await message.startThread({ name: threadName ?? message.content, - autoArchiveDuration: 4320, + autoArchiveDuration: ThreadAutoArchiveDuration.ThreeDays, }); };