From 4252cb5ce054b5cd1a4fff98a128ca4da2d44cad Mon Sep 17 00:00:00 2001 From: Ruby Date: Sun, 12 May 2024 12:14:02 +0200 Subject: [PATCH 1/8] feat: polls update DJS version, add new permissions, and add `match_polls` option --- backend/package.json | 2 +- backend/src/data/GuildSavedMessages.ts | 10 + backend/src/data/entities/SavedMessage.ts | 11 + .../matchMultipleTextTypesOnMessage.ts | 14 +- .../plugins/Automod/triggers/matchInvites.ts | 1 + .../plugins/Automod/triggers/matchLinks.ts | 1 + .../plugins/Automod/triggers/matchRegex.ts | 1 + .../plugins/Automod/triggers/matchWords.ts | 3 + backend/src/utils/permissionNames.ts | 4 + package-lock.json | 204 +++++++++--------- 10 files changed, 150 insertions(+), 101 deletions(-) diff --git a/backend/package.json b/backend/package.json index 744cc320..39ef4070 100644 --- a/backend/package.json +++ b/backend/package.json @@ -37,7 +37,7 @@ "cors": "^2.8.5", "cross-env": "^7.0.3", "deep-diff": "^1.0.2", - "discord.js": "^14.14.1", + "discord.js": "^14.15.2", "dotenv": "^4.0.0", "emoji-regex": "^8.0.0", "escape-string-regexp": "^1.0.5", diff --git a/backend/src/data/GuildSavedMessages.ts b/backend/src/data/GuildSavedMessages.ts index 39eb4b7c..dd097b4e 100644 --- a/backend/src/data/GuildSavedMessages.ts +++ b/backend/src/data/GuildSavedMessages.ts @@ -119,6 +119,16 @@ export class GuildSavedMessages extends BaseGuildRepository { })); } + if (msg.poll) { + data.poll = { + answers: Array.from(msg.poll.answers.values()).map((answer) => ({ + id: answer.id, + text: answer.text, + })), + question: msg.poll.question, + }; + } + return data; } diff --git a/backend/src/data/entities/SavedMessage.ts b/backend/src/data/entities/SavedMessage.ts index 67ac729b..5e4bf103 100644 --- a/backend/src/data/entities/SavedMessage.ts +++ b/backend/src/data/entities/SavedMessage.ts @@ -64,6 +64,16 @@ export interface ISavedMessageStickerData { type: StickerType | null; } +export interface ISavedMessagePollData { + answers: { + id: number; + text: string | null; + }[]; + question: { + text: string; + }; +} + export interface ISavedMessageData { attachments?: ISavedMessageAttachmentData[]; author: { @@ -73,6 +83,7 @@ export interface ISavedMessageData { content: string; embeds?: ISavedMessageEmbedData[]; stickers?: ISavedMessageStickerData[]; + poll?: ISavedMessagePollData; timestamp: number; } diff --git a/backend/src/plugins/Automod/functions/matchMultipleTextTypesOnMessage.ts b/backend/src/plugins/Automod/functions/matchMultipleTextTypesOnMessage.ts index a82c526e..92fd572d 100644 --- a/backend/src/plugins/Automod/functions/matchMultipleTextTypesOnMessage.ts +++ b/backend/src/plugins/Automod/functions/matchMultipleTextTypesOnMessage.ts @@ -12,9 +12,17 @@ type TextTriggerWithMultipleMatchTypes = { match_usernames: boolean; match_nicknames: boolean; match_custom_status: boolean; + match_polls: boolean; }; -export type MatchableTextType = "message" | "embed" | "visiblename" | "username" | "nickname" | "customstatus"; +export type MatchableTextType = + | "message" + | "embed" + | "visiblename" + | "username" + | "nickname" + | "customstatus" + | "polls"; type YieldedContent = [MatchableTextType, string]; @@ -59,4 +67,8 @@ export async function* matchMultipleTextTypesOnMessage( break; } } + + if (trigger.match_polls && msg.data.poll) { + yield ["polls", JSON.stringify(msg.data.poll)]; + } } diff --git a/backend/src/plugins/Automod/triggers/matchInvites.ts b/backend/src/plugins/Automod/triggers/matchInvites.ts index 4ea7c3cd..aaf5d504 100644 --- a/backend/src/plugins/Automod/triggers/matchInvites.ts +++ b/backend/src/plugins/Automod/triggers/matchInvites.ts @@ -22,6 +22,7 @@ const configSchema = z.strictObject({ match_usernames: z.boolean().default(false), match_nicknames: z.boolean().default(false), match_custom_status: z.boolean().default(false), + match_polls: z.boolean().default(false), }); export const MatchInvitesTrigger = automodTrigger()({ diff --git a/backend/src/plugins/Automod/triggers/matchLinks.ts b/backend/src/plugins/Automod/triggers/matchLinks.ts index c43d8320..e6b23a58 100644 --- a/backend/src/plugins/Automod/triggers/matchLinks.ts +++ b/backend/src/plugins/Automod/triggers/matchLinks.ts @@ -47,6 +47,7 @@ const configSchema = z.strictObject({ match_usernames: z.boolean().default(false), match_nicknames: z.boolean().default(false), match_custom_status: z.boolean().default(false), + match_polls: z.boolean().default(false), }); export const MatchLinksTrigger = automodTrigger()({ diff --git a/backend/src/plugins/Automod/triggers/matchRegex.ts b/backend/src/plugins/Automod/triggers/matchRegex.ts index 41df0396..654a7934 100644 --- a/backend/src/plugins/Automod/triggers/matchRegex.ts +++ b/backend/src/plugins/Automod/triggers/matchRegex.ts @@ -24,6 +24,7 @@ const configSchema = z.strictObject({ match_usernames: z.boolean().default(false), match_nicknames: z.boolean().default(false), match_custom_status: z.boolean().default(false), + match_polls: z.boolean().default(false), }); const regexCache = new WeakMap(); diff --git a/backend/src/plugins/Automod/triggers/matchWords.ts b/backend/src/plugins/Automod/triggers/matchWords.ts index df3ee366..17324649 100644 --- a/backend/src/plugins/Automod/triggers/matchWords.ts +++ b/backend/src/plugins/Automod/triggers/matchWords.ts @@ -27,6 +27,7 @@ const configSchema = z.strictObject({ match_usernames: z.boolean().default(false), match_nicknames: z.boolean().default(false), match_custom_status: z.boolean().default(false), + match_polls: z.boolean().default(false), }); export const MatchWordsTrigger = automodTrigger()({ @@ -65,6 +66,8 @@ export const MatchWordsTrigger = automodTrigger()({ str = normalizeText(str); } + console.log([type, str]); + for (const regex of regexes) { if (regex.test(str)) { return { diff --git a/backend/src/utils/permissionNames.ts b/backend/src/utils/permissionNames.ts index ca4922de..21580e11 100644 --- a/backend/src/utils/permissionNames.ts +++ b/backend/src/utils/permissionNames.ts @@ -48,4 +48,8 @@ export const PERMISSION_NAMES = { UseExternalSounds: "Use External Sounds", UseSoundboard: "Use Soundboard", ViewCreatorMonetizationAnalytics: "View Creator Monetization Analytics", + SendPolls: "Allows Sending Polls", + CreateEvents: "Allows for creating scheduled events, and editing and deleting those created by the current user.", + CreateGuildExpressions: + "Allows for creating emojis, stickers, and soundboard sounds, and editing and deleting those created by the current user.", } as const satisfies Record; diff --git a/package-lock.json b/package-lock.json index 1558e553..6bddacf7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -36,7 +36,7 @@ "cors": "^2.8.5", "cross-env": "^7.0.3", "deep-diff": "^1.0.2", - "discord.js": "^14.14.1", + "discord.js": "^14.15.2", "dotenv": "^4.0.0", "emoji-regex": "^8.0.0", "escape-string-regexp": "^1.0.5", @@ -3084,20 +3084,23 @@ } }, "node_modules/@discordjs/builders": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@discordjs/builders/-/builders-1.7.0.tgz", - "integrity": "sha512-GDtbKMkg433cOZur8Dv6c25EHxduNIBsxeHrsRoIM8+AwmEZ8r0tEpckx/sHwTLwQPOF3e2JWloZh9ofCaMfAw==", + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/@discordjs/builders/-/builders-1.8.1.tgz", + "integrity": "sha512-GkF+HM01FHy+NSoTaUPR8z44otfQgJ1AIsRxclYGUZDyUbdZEFyD/5QVv2Y1Flx6M+B0bQLzg2M9CJv5lGTqpA==", "dependencies": { - "@discordjs/formatters": "^0.3.3", - "@discordjs/util": "^1.0.2", - "@sapphire/shapeshift": "^3.9.3", - "discord-api-types": "0.37.61", + "@discordjs/formatters": "^0.4.0", + "@discordjs/util": "^1.1.0", + "@sapphire/shapeshift": "^3.9.7", + "discord-api-types": "0.37.83", "fast-deep-equal": "^3.1.3", - "ts-mixer": "^6.0.3", + "ts-mixer": "^6.0.4", "tslib": "^2.6.2" }, "engines": { "node": ">=16.11.0" + }, + "funding": { + "url": "https://github.com/discordjs/discord.js?sponsor" } }, "node_modules/@discordjs/builders/node_modules/tslib": { @@ -3114,41 +3117,50 @@ } }, "node_modules/@discordjs/formatters": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/@discordjs/formatters/-/formatters-0.3.3.tgz", - "integrity": "sha512-wTcI1Q5cps1eSGhl6+6AzzZkBBlVrBdc9IUhJbijRgVjCNIIIZPgqnUj3ntFODsHrdbGU8BEG9XmDQmgEEYn3w==", + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/@discordjs/formatters/-/formatters-0.4.0.tgz", + "integrity": "sha512-fJ06TLC1NiruF35470q3Nr1bi95BdvKFAF+T5bNfZJ4bNdqZ3VZ+Ttg6SThqTxm6qumSG3choxLBHMC69WXNXQ==", "dependencies": { - "discord-api-types": "0.37.61" + "discord-api-types": "0.37.83" }, "engines": { "node": ">=16.11.0" + }, + "funding": { + "url": "https://github.com/discordjs/discord.js?sponsor" } }, "node_modules/@discordjs/rest": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@discordjs/rest/-/rest-2.2.0.tgz", - "integrity": "sha512-nXm9wT8oqrYFRMEqTXQx9DUTeEtXUDMmnUKIhZn6O2EeDY9VCdwj23XCPq7fkqMPKdF7ldAfeVKyxxFdbZl59A==", + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@discordjs/rest/-/rest-2.3.0.tgz", + "integrity": "sha512-C1kAJK8aSYRv3ZwMG8cvrrW4GN0g5eMdP8AuN8ODH5DyOCbHgJspze1my3xHOAgwLJdKUbWNVyAeJ9cEdduqIg==", "dependencies": { - "@discordjs/collection": "^2.0.0", - "@discordjs/util": "^1.0.2", - "@sapphire/async-queue": "^1.5.0", - "@sapphire/snowflake": "^3.5.1", - "@vladfrangu/async_event_emitter": "^2.2.2", - "discord-api-types": "0.37.61", - "magic-bytes.js": "^1.5.0", + "@discordjs/collection": "^2.1.0", + "@discordjs/util": "^1.1.0", + "@sapphire/async-queue": "^1.5.2", + "@sapphire/snowflake": "^3.5.3", + "@vladfrangu/async_event_emitter": "^2.2.4", + "discord-api-types": "0.37.83", + "magic-bytes.js": "^1.10.0", "tslib": "^2.6.2", - "undici": "5.27.2" + "undici": "6.13.0" }, "engines": { "node": ">=16.11.0" + }, + "funding": { + "url": "https://github.com/discordjs/discord.js?sponsor" } }, "node_modules/@discordjs/rest/node_modules/@discordjs/collection": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@discordjs/collection/-/collection-2.0.0.tgz", - "integrity": "sha512-YTWIXLrf5FsrLMycpMM9Q6vnZoR/lN2AWX23/Cuo8uOOtS8eHB2dyQaaGnaF8aZPYnttf2bkLMcXn/j6JUOi3w==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@discordjs/collection/-/collection-2.1.0.tgz", + "integrity": "sha512-mLcTACtXUuVgutoznkh6hS3UFqYirDYAg5Dc1m8xn6OvPjetnUlf/xjtqnnc47OwWdaoCQnHmHh9KofhD6uRqw==", "engines": { "node": ">=18" + }, + "funding": { + "url": "https://github.com/discordjs/discord.js?sponsor" } }, "node_modules/@discordjs/rest/node_modules/tslib": { @@ -3157,38 +3169,47 @@ "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" }, "node_modules/@discordjs/util": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@discordjs/util/-/util-1.0.2.tgz", - "integrity": "sha512-IRNbimrmfb75GMNEjyznqM1tkI7HrZOf14njX7tCAAUetyZM1Pr8hX/EK2lxBCOgWDRmigbp24fD1hdMfQK5lw==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@discordjs/util/-/util-1.1.0.tgz", + "integrity": "sha512-IndcI5hzlNZ7GS96RV3Xw1R2kaDuXEp7tRIy/KlhidpN/BQ1qh1NZt3377dMLTa44xDUNKT7hnXkA/oUAzD/lg==", "engines": { "node": ">=16.11.0" + }, + "funding": { + "url": "https://github.com/discordjs/discord.js?sponsor" } }, "node_modules/@discordjs/ws": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/@discordjs/ws/-/ws-1.0.2.tgz", - "integrity": "sha512-+XI82Rm2hKnFwAySXEep4A7Kfoowt6weO6381jgW+wVdTpMS/56qCvoXyFRY0slcv7c/U8My2PwIB2/wEaAh7Q==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@discordjs/ws/-/ws-1.1.0.tgz", + "integrity": "sha512-O97DIeSvfNTn5wz5vaER6ciyUsr7nOqSEtsLoMhhIgeFkhnxLRqSr00/Fpq2/ppLgjDGLbQCDzIK7ilGoB/M7A==", "dependencies": { - "@discordjs/collection": "^2.0.0", - "@discordjs/rest": "^2.1.0", - "@discordjs/util": "^1.0.2", - "@sapphire/async-queue": "^1.5.0", - "@types/ws": "^8.5.9", - "@vladfrangu/async_event_emitter": "^2.2.2", - "discord-api-types": "0.37.61", + "@discordjs/collection": "^2.1.0", + "@discordjs/rest": "^2.3.0", + "@discordjs/util": "^1.1.0", + "@sapphire/async-queue": "^1.5.2", + "@types/ws": "^8.5.10", + "@vladfrangu/async_event_emitter": "^2.2.4", + "discord-api-types": "0.37.83", "tslib": "^2.6.2", - "ws": "^8.14.2" + "ws": "^8.16.0" }, "engines": { "node": ">=16.11.0" + }, + "funding": { + "url": "https://github.com/discordjs/discord.js?sponsor" } }, "node_modules/@discordjs/ws/node_modules/@discordjs/collection": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@discordjs/collection/-/collection-2.0.0.tgz", - "integrity": "sha512-YTWIXLrf5FsrLMycpMM9Q6vnZoR/lN2AWX23/Cuo8uOOtS8eHB2dyQaaGnaF8aZPYnttf2bkLMcXn/j6JUOi3w==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@discordjs/collection/-/collection-2.1.0.tgz", + "integrity": "sha512-mLcTACtXUuVgutoznkh6hS3UFqYirDYAg5Dc1m8xn6OvPjetnUlf/xjtqnnc47OwWdaoCQnHmHh9KofhD6uRqw==", "engines": { "node": ">=18" + }, + "funding": { + "url": "https://github.com/discordjs/discord.js?sponsor" } }, "node_modules/@discordjs/ws/node_modules/tslib": { @@ -3299,14 +3320,6 @@ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==" }, - "node_modules/@fastify/busboy": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.1.0.tgz", - "integrity": "sha512-+KpH+QxZU7O4675t3mnkQKcZZg56u+K/Ct2K+N2AZYNVK8kyeo/bI18tI8aPm3tvNNRyTWfj6s5tnGNlcbQRsA==", - "engines": { - "node": ">=14" - } - }, "node_modules/@fastify/error": { "version": "3.4.1", "resolved": "https://registry.npmjs.org/@fastify/error/-/error-3.4.1.tgz", @@ -3837,21 +3850,21 @@ } }, "node_modules/@sapphire/shapeshift": { - "version": "3.9.6", - "resolved": "https://registry.npmjs.org/@sapphire/shapeshift/-/shapeshift-3.9.6.tgz", - "integrity": "sha512-4+Na/fxu2SEepZRb9z0dbsVh59QtwPuBg/UVaDib3av7ZY14b14+z09z6QVn0P6Dv6eOU2NDTsjIi0mbtgP56g==", + "version": "3.9.7", + "resolved": "https://registry.npmjs.org/@sapphire/shapeshift/-/shapeshift-3.9.7.tgz", + "integrity": "sha512-4It2mxPSr4OGn4HSQWGmhFMsNFGfFVhWeRPCRwbH972Ek2pzfGRZtb0pJ4Ze6oIzcyh2jw7nUDa6qGlWofgd9g==", "dependencies": { "fast-deep-equal": "^3.1.3", "lodash": "^4.17.21" }, "engines": { - "node": ">=v18" + "node": ">=v16" } }, "node_modules/@sapphire/snowflake": { - "version": "3.5.1", - "resolved": "https://registry.npmjs.org/@sapphire/snowflake/-/snowflake-3.5.1.tgz", - "integrity": "sha512-BxcYGzgEsdlG0dKAyOm0ehLGm2CafIrfQTZGWgkfKYbj+pNNsorZ7EotuZukc2MT70E0UbppVbtpBrqpzVzjNA==", + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/@sapphire/snowflake/-/snowflake-3.5.3.tgz", + "integrity": "sha512-jjmJywLAFoWeBi1W7994zZyiNWPIiqRRNAmSERxyg93xRGzNYvGjlZ0gR6x0F4gPRi2+0O6S71kOZYyr3cxaIQ==", "engines": { "node": ">=v14.0.0", "npm": ">=7.0.0" @@ -4341,9 +4354,9 @@ "integrity": "sha512-LKVgNmBxN0BbljJrVUwkxwRYqzsAEPcZOe6S2T6ZaBDIrFp0qu4FNlpc5sM1tGbXUYFgdVQIoeLk1Y1UoblyEg==" }, "node_modules/@types/ws": { - "version": "8.5.9", - "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.9.tgz", - "integrity": "sha512-jbdrY0a8lxfdTp/+r7Z4CkycbOFN8WX+IOchLJr3juT/xzbJ8URyTVSJ/hvNdadTgM1mnedb47n+Y31GsFnQlg==", + "version": "8.5.10", + "resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.10.tgz", + "integrity": "sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==", "dependencies": { "@types/node": "*" } @@ -9091,32 +9104,33 @@ } }, "node_modules/discord-api-types": { - "version": "0.37.61", - "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.37.61.tgz", - "integrity": "sha512-o/dXNFfhBpYHpQFdT6FWzeO7pKc838QeeZ9d91CfVAtpr5XLK4B/zYxQbYgPdoMiTDvJfzcsLW5naXgmHGDNXw==" + "version": "0.37.83", + "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.37.83.tgz", + "integrity": "sha512-urGGYeWtWNYMKnYlZnOnDHm8fVRffQs3U0SpE8RHeiuLKb/u92APS8HoQnPTFbnXmY1vVnXjXO4dOxcAn3J+DA==" }, "node_modules/discord.js": { - "version": "14.14.1", - "resolved": "https://registry.npmjs.org/discord.js/-/discord.js-14.14.1.tgz", - "integrity": "sha512-/hUVzkIerxKHyRKopJy5xejp4MYKDPTszAnpYxzVVv4qJYf+Tkt+jnT2N29PIPschicaEEpXwF2ARrTYHYwQ5w==", + "version": "14.15.2", + "resolved": "https://registry.npmjs.org/discord.js/-/discord.js-14.15.2.tgz", + "integrity": "sha512-wGD37YCaTUNprtpqMIRuNiswwsvSWXrHykBSm2SAosoTYut0VUDj9yo9t4iLtMKvuhI49zYkvKc2TNdzdvpJhg==", "dependencies": { - "@discordjs/builders": "^1.7.0", + "@discordjs/builders": "^1.8.1", "@discordjs/collection": "1.5.3", - "@discordjs/formatters": "^0.3.3", - "@discordjs/rest": "^2.1.0", - "@discordjs/util": "^1.0.2", - "@discordjs/ws": "^1.0.2", - "@sapphire/snowflake": "3.5.1", - "@types/ws": "8.5.9", - "discord-api-types": "0.37.61", + "@discordjs/formatters": "^0.4.0", + "@discordjs/rest": "^2.3.0", + "@discordjs/util": "^1.1.0", + "@discordjs/ws": "^1.1.0", + "@sapphire/snowflake": "3.5.3", + "discord-api-types": "0.37.83", "fast-deep-equal": "3.1.3", "lodash.snakecase": "4.1.1", "tslib": "2.6.2", - "undici": "5.27.2", - "ws": "8.14.2" + "undici": "6.13.0" }, "engines": { "node": ">=16.11.0" + }, + "funding": { + "url": "https://github.com/discordjs/discord.js?sponsor" } }, "node_modules/discord.js/node_modules/tslib": { @@ -13259,11 +13273,6 @@ "node": ">=8" } }, - "node_modules/knub/node_modules/discord-api-types": { - "version": "0.37.73", - "resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.37.73.tgz", - "integrity": "sha512-mi915PBUxF1G233EwHKNegNAF/tVfiSRN9+hKwu0G3NpbtLXvWUxCuCjgSyY+QmQ6/Hvpqm0xs5HxzfvhAS20A==" - }, "node_modules/labeled-stream-splicer": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/labeled-stream-splicer/-/labeled-stream-splicer-2.0.2.tgz", @@ -14048,9 +14057,9 @@ } }, "node_modules/magic-bytes.js": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/magic-bytes.js/-/magic-bytes.js-1.8.0.tgz", - "integrity": "sha512-lyWpfvNGVb5lu8YUAbER0+UMBTdR63w2mcSUlhhBTyVbxJvjgqwyAf3AZD6MprgK0uHuBoWXSDAMWLupX83o3Q==" + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/magic-bytes.js/-/magic-bytes.js-1.10.0.tgz", + "integrity": "sha512-/k20Lg2q8LE5xiaaSkMXk4sfvI+9EGEykFS4b0CHHGWqDYU0bGUFSwchNOMA56D7TCs9GwVTkqe9als1/ns8UQ==" }, "node_modules/magic-string": { "version": "0.25.1", @@ -22291,9 +22300,9 @@ } }, "node_modules/ts-mixer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/ts-mixer/-/ts-mixer-6.0.3.tgz", - "integrity": "sha512-k43M7uCG1AkTyxgnmI5MPwKoUvS/bRvLvUb7+Pgpdlmok8AoqmUaZxUUw8zKM5B1lqZrt41GjYgnvAi0fppqgQ==" + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/ts-mixer/-/ts-mixer-6.0.4.tgz", + "integrity": "sha512-ufKpbmrugz5Aou4wcr5Wc1UUFWOLhq+Fm6qa6P0w0K5Qw2yhaUoiWszhCVuNQyNwrlGiscHOmqYoAox1PtvgjA==" }, "node_modules/ts-node": { "version": "10.9.2", @@ -22901,14 +22910,11 @@ "integrity": "sha512-Vy4dx7gquTeMcQR/hDkYLGUnwVil6vk4FOOct+djUnHOUWt+zJPJAaRIXaAFkPXtJjvlY7o3rfRu0/3hpnwoUA==" }, "node_modules/undici": { - "version": "5.27.2", - "resolved": "https://registry.npmjs.org/undici/-/undici-5.27.2.tgz", - "integrity": "sha512-iS857PdOEy/y3wlM3yRp+6SNQQ6xU0mmZcwRSriqk+et/cwWAtwmIGf6WkoDN2EK/AMdCO/dfXzIwi+rFMrjjQ==", - "dependencies": { - "@fastify/busboy": "^2.0.0" - }, + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/undici/-/undici-6.13.0.tgz", + "integrity": "sha512-Q2rtqmZWrbP8nePMq7mOJIN98M0fYvSgV89vwl/BQRT4mDOeY2GXZngfGpcBBhtky3woM7G24wZV3Q304Bv6cw==", "engines": { - "node": ">=14.0" + "node": ">=18.0" } }, "node_modules/undici-types": { @@ -24066,9 +24072,9 @@ } }, "node_modules/ws": { - "version": "8.14.2", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.14.2.tgz", - "integrity": "sha512-wEBG1ftX4jcglPxgFCMJmZ2PLtSbJ2Peg6TmpJFTbe9GZYOQCDPdMYu/Tm0/bGZkw8paZnJY45J4K2PZrLYq8g==", + "version": "8.17.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.0.tgz", + "integrity": "sha512-uJq6108EgZMAl20KagGkzCKfMEjxmKvZHG7Tlq0Z6nOky7YF7aq4mOx6xK8TJ/i1LeK4Qus7INktacctDgY8Ow==", "engines": { "node": ">=10.0.0" }, From 112bbc5478ec4b9b562100d036f562f334411685 Mon Sep 17 00:00:00 2001 From: Ruby Date: Sun, 12 May 2024 13:10:56 +0200 Subject: [PATCH 2/8] fix: partial summary --- backend/src/data/GuildSavedMessages.ts | 2 +- backend/src/data/entities/SavedMessage.ts | 6 +++--- .../Automod/functions/getTextMatchPartialSummary.ts | 5 +++++ .../functions/matchMultipleTextTypesOnMessage.ts | 11 ++--------- backend/src/utils.ts | 4 ++++ 5 files changed, 15 insertions(+), 13 deletions(-) diff --git a/backend/src/data/GuildSavedMessages.ts b/backend/src/data/GuildSavedMessages.ts index dd097b4e..008b9e9b 100644 --- a/backend/src/data/GuildSavedMessages.ts +++ b/backend/src/data/GuildSavedMessages.ts @@ -121,11 +121,11 @@ export class GuildSavedMessages extends BaseGuildRepository { if (msg.poll) { data.poll = { + question: msg.poll.question, answers: Array.from(msg.poll.answers.values()).map((answer) => ({ id: answer.id, text: answer.text, })), - question: msg.poll.question, }; } diff --git a/backend/src/data/entities/SavedMessage.ts b/backend/src/data/entities/SavedMessage.ts index 5e4bf103..78856e7f 100644 --- a/backend/src/data/entities/SavedMessage.ts +++ b/backend/src/data/entities/SavedMessage.ts @@ -65,13 +65,13 @@ export interface ISavedMessageStickerData { } export interface ISavedMessagePollData { + question: { + text: string; + }; answers: { id: number; text: string | null; }[]; - question: { - text: string; - }; } export interface ISavedMessageData { diff --git a/backend/src/plugins/Automod/functions/getTextMatchPartialSummary.ts b/backend/src/plugins/Automod/functions/getTextMatchPartialSummary.ts index 3d7e993f..34b0fc75 100644 --- a/backend/src/plugins/Automod/functions/getTextMatchPartialSummary.ts +++ b/backend/src/plugins/Automod/functions/getTextMatchPartialSummary.ts @@ -30,5 +30,10 @@ export function getTextMatchPartialSummary( return `visible name: ${visibleName}`; } else if (type === "customstatus") { return `custom status: ${context.member!.presence?.activities.find((a) => a.type === ActivityType.Custom)?.name}`; + } else if (type == "poll") { + const message = context.message!; + const channel = pluginData.guild.channels.cache.get(message.channel_id as Snowflake); + const channelMention = channel ? verboseChannelMention(channel) : `\`#${message.channel_id}\``; + return `poll in ${channelMention}:\n${messageSummary(message)}`; } } diff --git a/backend/src/plugins/Automod/functions/matchMultipleTextTypesOnMessage.ts b/backend/src/plugins/Automod/functions/matchMultipleTextTypesOnMessage.ts index 92fd572d..a271516f 100644 --- a/backend/src/plugins/Automod/functions/matchMultipleTextTypesOnMessage.ts +++ b/backend/src/plugins/Automod/functions/matchMultipleTextTypesOnMessage.ts @@ -15,14 +15,7 @@ type TextTriggerWithMultipleMatchTypes = { match_polls: boolean; }; -export type MatchableTextType = - | "message" - | "embed" - | "visiblename" - | "username" - | "nickname" - | "customstatus" - | "polls"; +export type MatchableTextType = "message" | "embed" | "visiblename" | "username" | "nickname" | "customstatus" | "poll"; type YieldedContent = [MatchableTextType, string]; @@ -69,6 +62,6 @@ export async function* matchMultipleTextTypesOnMessage( } if (trigger.match_polls && msg.data.poll) { - yield ["polls", JSON.stringify(msg.data.poll)]; + yield ["poll", JSON.stringify(msg.data.poll)]; } } diff --git a/backend/src/utils.ts b/backend/src/utils.ts index 174a720f..2e2d5ca3 100644 --- a/backend/src/utils.ts +++ b/backend/src/utils.ts @@ -1326,6 +1326,10 @@ export function messageSummary(msg: SavedMessage) { "\n"; } + if (msg.data.poll) { + result += "Poll: ```" + escapeCodeBlock(JSON.stringify(msg.data.poll)) + "```"; + } + return result; } From 16f5dc4fd738e53d809b62a6eb437c83cad33555 Mon Sep 17 00:00:00 2001 From: Ruby Date: Sun, 12 May 2024 14:27:39 +0200 Subject: [PATCH 3/8] whoops --- backend/src/plugins/Automod/triggers/matchWords.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/backend/src/plugins/Automod/triggers/matchWords.ts b/backend/src/plugins/Automod/triggers/matchWords.ts index 17324649..992494b3 100644 --- a/backend/src/plugins/Automod/triggers/matchWords.ts +++ b/backend/src/plugins/Automod/triggers/matchWords.ts @@ -66,8 +66,6 @@ export const MatchWordsTrigger = automodTrigger()({ str = normalizeText(str); } - console.log([type, str]); - for (const regex of regexes) { if (regex.test(str)) { return { From 289b7cc79aafef038ecf91f88df0fa7be9429c55 Mon Sep 17 00:00:00 2001 From: Ruby Date: Sun, 12 May 2024 16:35:11 +0200 Subject: [PATCH 4/8] better summary format --- backend/src/utils.ts | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/backend/src/utils.ts b/backend/src/utils.ts index 2e2d5ca3..5cc7a199 100644 --- a/backend/src/utils.ts +++ b/backend/src/utils.ts @@ -1327,7 +1327,14 @@ export function messageSummary(msg: SavedMessage) { } if (msg.data.poll) { - result += "Poll: ```" + escapeCodeBlock(JSON.stringify(msg.data.poll)) + "```"; + const poll = msg.data.poll; + result += + "Poll: ```" + + escapeCodeBlock( + `Question: ${poll.question.text} + Answers: ${poll.answers.map((answer) => answer.text).join(" | ")}`, + ) + + "```"; } return result; From a4d5ec7a0e139601606a981df4f947463dfd9576 Mon Sep 17 00:00:00 2001 From: Ruby Date: Sun, 12 May 2024 17:44:41 +0200 Subject: [PATCH 5/8] make answers not weird if they have | in them why would you ever have | in a poll answer?? --- backend/src/utils.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/src/utils.ts b/backend/src/utils.ts index 5cc7a199..d0ab63cc 100644 --- a/backend/src/utils.ts +++ b/backend/src/utils.ts @@ -1332,7 +1332,7 @@ export function messageSummary(msg: SavedMessage) { "Poll: ```" + escapeCodeBlock( `Question: ${poll.question.text} - Answers: ${poll.answers.map((answer) => answer.text).join(" | ")}`, + Answers: ${poll.answers.map((answer) => `"${answer.text}"`).join(" | ")}`, ) + "```"; } From 9aca2d5f269608f38e81094f5d26cf2d18f7896d Mon Sep 17 00:00:00 2001 From: rubyowo Date: Sun, 2 Jun 2024 16:23:57 +0000 Subject: [PATCH 6/8] fix: suggestion Co-authored-by: Almeida --- backend/src/data/GuildSavedMessages.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/src/data/GuildSavedMessages.ts b/backend/src/data/GuildSavedMessages.ts index 974bdb2b..a979ad84 100644 --- a/backend/src/data/GuildSavedMessages.ts +++ b/backend/src/data/GuildSavedMessages.ts @@ -122,7 +122,7 @@ export class GuildSavedMessages extends BaseGuildRepository { if (msg.poll) { data.poll = { question: msg.poll.question, - answers: Array.from(msg.poll.answers.values()).map((answer) => ({ + answers: msg.poll.answers.map((answer) => ({ id: answer.id, text: answer.text, })), From e34690ff6c8d5733014769bbf6105c69e2c93c45 Mon Sep 17 00:00:00 2001 From: Ruby Date: Sun, 2 Jun 2024 18:27:57 +0200 Subject: [PATCH 7/8] chore: sort permissions alphabetically --- backend/src/utils/permissionNames.ts | 23 +++++++++++------------ 1 file changed, 11 insertions(+), 12 deletions(-) diff --git a/backend/src/utils/permissionNames.ts b/backend/src/utils/permissionNames.ts index 8b68eecf..b80c0bb4 100644 --- a/backend/src/utils/permissionNames.ts +++ b/backend/src/utils/permissionNames.ts @@ -8,6 +8,8 @@ export const PERMISSION_NAMES = { BanMembers: "Ban Members", ChangeNickname: "Change Nickname", Connect: "Connect", + CreateEvents: "Create Events", + CreateGuildExpressions: "Create Expressions", CreateInstantInvite: "Create Invite", CreatePrivateThreads: "Create Private Threads", CreatePublicThreads: "Create Public Threads", @@ -16,13 +18,16 @@ export const PERMISSION_NAMES = { KickMembers: "Kick Members", ManageChannels: "Manage Channels", ManageEmojisAndStickers: "Manage Emojis and Stickers", + ManageEvents: "Manage Events", ManageGuild: "Manage Server", + ManageGuildExpressions: "Manage Expressions", ManageMessages: "Manage Messages", ManageNicknames: "Manage Nicknames", ManageRoles: "Manage Roles", ManageThreads: "Manage Threads", ManageWebhooks: "Manage Webhooks", MentionEveryone: `Mention @${EMPTY_CHAR}everyone, @${EMPTY_CHAR}here, and All Roles`, + ModerateMembers: "Moderate Members", MoveMembers: "Move Members", MuteMembers: "Mute Members", PrioritySpeaker: "Priority Speaker", @@ -30,26 +35,20 @@ export const PERMISSION_NAMES = { RequestToSpeak: "Request to Speak", SendMessages: "Send Messages", SendMessagesInThreads: "Send Messages in Threads", + SendPolls: "Create Polls", SendTTSMessages: "Send Text-To-Speech Messages", + SendVoiceMessages: "Send Voice Messages", Speak: "Speak", - UseEmbeddedActivities: "Start Embedded Activities", Stream: "Video", UseApplicationCommands: "Use Application Commands", + UseEmbeddedActivities: "Start Embedded Activities", UseExternalEmojis: "Use External Emoji", + UseExternalSounds: "Use External Sounds", UseExternalStickers: "Use External Stickers", + UseSoundboard: "Use Soundboard", UseVAD: "Use Voice Activity", ViewAuditLog: "View Audit Log", ViewChannel: "View Channels", - ViewGuildInsights: "View Guild Insights", - ModerateMembers: "Moderate Members", - ManageEvents: "Manage Events", - ManageGuildExpressions: "Manage Expressions", - SendVoiceMessages: "Send Voice Messages", - UseExternalSounds: "Use External Sounds", - UseSoundboard: "Use Soundboard", ViewCreatorMonetizationAnalytics: "View Creator Monetization Analytics", - SendPolls: "Allows Sending Polls", - CreateEvents: "Allows for creating scheduled events, and editing and deleting those created by the current user.", - CreateGuildExpressions: - "Allows for creating emojis, stickers, and soundboard sounds, and editing and deleting those created by the current user.", + ViewGuildInsights: "View Guild Insights", } as const satisfies Record; From 9290497350d0de4ebaf680bc0a6464462d5b86fa Mon Sep 17 00:00:00 2001 From: Ruby Date: Mon, 3 Jun 2024 15:03:00 +0200 Subject: [PATCH 8/8] chore: update discord.js --- backend/package.json | 2 +- package-lock.json | 22 +++++++++++----------- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/backend/package.json b/backend/package.json index 8f6f64e3..7302706b 100644 --- a/backend/package.json +++ b/backend/package.json @@ -38,7 +38,7 @@ "cors": "^2.8.5", "cross-env": "^7.0.3", "deep-diff": "^1.0.2", - "discord.js": "^14.15.2", + "discord.js": "^14.15.3", "dotenv": "^4.0.0", "emoji-regex": "^8.0.0", "escape-string-regexp": "^1.0.5", diff --git a/package-lock.json b/package-lock.json index caa12329..804016a6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -3068,9 +3068,9 @@ } }, "node_modules/@discordjs/builders": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/@discordjs/builders/-/builders-1.8.1.tgz", - "integrity": "sha512-GkF+HM01FHy+NSoTaUPR8z44otfQgJ1AIsRxclYGUZDyUbdZEFyD/5QVv2Y1Flx6M+B0bQLzg2M9CJv5lGTqpA==", + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/@discordjs/builders/-/builders-1.8.2.tgz", + "integrity": "sha512-6wvG3QaCjtMu0xnle4SoOIeFB4y6fKMN6WZfy3BMKJdQQtPLik8KGzDwBVL/+wTtcE/ZlFjgEk74GublyEVZ7g==", "dependencies": { "@discordjs/formatters": "^0.4.0", "@discordjs/util": "^1.1.0", @@ -3164,9 +3164,9 @@ } }, "node_modules/@discordjs/ws": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@discordjs/ws/-/ws-1.1.0.tgz", - "integrity": "sha512-O97DIeSvfNTn5wz5vaER6ciyUsr7nOqSEtsLoMhhIgeFkhnxLRqSr00/Fpq2/ppLgjDGLbQCDzIK7ilGoB/M7A==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@discordjs/ws/-/ws-1.1.1.tgz", + "integrity": "sha512-PZ+vLpxGCRtmr2RMkqh8Zp+BenUaJqlS6xhgWKEZcgC/vfHLEzpHtKkB0sl3nZWpwtcKk6YWy+pU3okL2I97FA==", "dependencies": { "@discordjs/collection": "^2.1.0", "@discordjs/rest": "^2.3.0", @@ -8951,16 +8951,16 @@ "integrity": "sha512-urGGYeWtWNYMKnYlZnOnDHm8fVRffQs3U0SpE8RHeiuLKb/u92APS8HoQnPTFbnXmY1vVnXjXO4dOxcAn3J+DA==" }, "node_modules/discord.js": { - "version": "14.15.2", - "resolved": "https://registry.npmjs.org/discord.js/-/discord.js-14.15.2.tgz", - "integrity": "sha512-wGD37YCaTUNprtpqMIRuNiswwsvSWXrHykBSm2SAosoTYut0VUDj9yo9t4iLtMKvuhI49zYkvKc2TNdzdvpJhg==", + "version": "14.15.3", + "resolved": "https://registry.npmjs.org/discord.js/-/discord.js-14.15.3.tgz", + "integrity": "sha512-/UJDQO10VuU6wQPglA4kz2bw2ngeeSbogiIPx/TsnctfzV/tNf+q+i1HlgtX1OGpeOBpJH9erZQNO5oRM2uAtQ==", "dependencies": { - "@discordjs/builders": "^1.8.1", + "@discordjs/builders": "^1.8.2", "@discordjs/collection": "1.5.3", "@discordjs/formatters": "^0.4.0", "@discordjs/rest": "^2.3.0", "@discordjs/util": "^1.1.0", - "@discordjs/ws": "^1.1.0", + "@discordjs/ws": "^1.1.1", "@sapphire/snowflake": "3.5.3", "discord-api-types": "0.37.83", "fast-deep-equal": "3.1.3",