From 63e4ba7bc329b22a57931f2e96ec6f4c7a6fe1c8 Mon Sep 17 00:00:00 2001 From: "Ean Milligan (Bastion)" Date: Sun, 4 Sep 2022 15:41:58 -0400 Subject: [PATCH] Update pollReaction system to handle 3rd party emojis --- config.example.ts | 2 +- deps.ts | 2 +- src/events.ts | 1 + src/events/_index.ts | 2 ++ src/events/messageCreate.ts | 3 ++- src/events/reactionAdd.ts | 12 ++++++++++++ src/functions/_index.ts | 2 +- src/functions/pollReactions.ts | 20 +++++++++++++++----- src/types/eventTypes.ts | 11 +++++++++++ src/utils.ts | 4 ++-- 10 files changed, 48 insertions(+), 11 deletions(-) create mode 100644 src/events/reactionAdd.ts create mode 100644 src/types/eventTypes.ts diff --git a/config.example.ts b/config.example.ts index ff22595..8c766b4 100644 --- a/config.example.ts +++ b/config.example.ts @@ -1,6 +1,6 @@ export const config = { 'name': 'Sweeper Bot', // Name of the bot - 'version': '0.2.2', // Version of the bot + 'version': '0.2.3', // Version of the bot 'token': 'the_bot_token', // Discord API Token for this bot 'localtoken': 'local_testing_token', // Discord API Token for a secondary OPTIONAL testing bot, THIS MUST BE DIFFERENT FROM "token" 'prefix': 's!', // Prefix for all commands diff --git a/deps.ts b/deps.ts index 3832a11..0932426 100644 --- a/deps.ts +++ b/deps.ts @@ -6,7 +6,7 @@ export const botId = getBotIdFromToken(LOCALMODE ? config.localtoken : config.to export { ActivityTypes, createBot, editBotNickname, editBotStatus, Intents, sendMessage, startBot } from 'https://deno.land/x/discordeno@13.0.0/mod.ts'; -export type { Bot, CreateMessage, EventHandlers, Guild, Message } from 'https://deno.land/x/discordeno@13.0.0/mod.ts'; +export type { Bot, CreateMessage, Emoji, EventHandlers, Guild, Member, Message, User } from 'https://deno.land/x/discordeno@13.0.0/mod.ts'; export { Client } from 'https://deno.land/x/mysql@v2.10.2/mod.ts'; diff --git a/src/events.ts b/src/events.ts index eaa9b49..f92501f 100644 --- a/src/events.ts +++ b/src/events.ts @@ -12,6 +12,7 @@ events.guildCreate = eventHandlers.guildCreate; events.guildDelete = eventHandlers.guildDelete; events.messageCreate = eventHandlers.messageCreate; events.messageUpdate = eventHandlers.messageUpdate; +events.reactionAdd = eventHandlers.reactionAdd; if (DEVMODE) { events.debug = eventHandlers.debug; diff --git a/src/events/_index.ts b/src/events/_index.ts index 9b5bb3b..cab6fc6 100644 --- a/src/events/_index.ts +++ b/src/events/_index.ts @@ -4,6 +4,7 @@ import { guildDelete } from './guildDelete.ts'; import { debug } from './debug.ts'; import { messageCreate } from './messageCreate.ts'; import { messageUpdate } from './messageUpdate.ts'; +import { reactionAdd } from './reactionAdd.ts'; export default { ready, @@ -12,4 +13,5 @@ export default { debug, messageCreate, messageUpdate, + reactionAdd, }; diff --git a/src/events/messageCreate.ts b/src/events/messageCreate.ts index 9275a31..88bfb14 100644 --- a/src/events/messageCreate.ts +++ b/src/events/messageCreate.ts @@ -10,10 +10,11 @@ import { Message, } from '../../deps.ts'; import commands from '../commands/_index.ts'; +import { pollReactions } from '../functions/pollReactions.ts'; import functions from '../functions/_index.ts'; import utils from '../utils.ts'; -export const messageCreate = (bot: Bot, message: Message) => { +export const messageCreate = async (bot: Bot, message: Message) => { // Ignore all other bots if (message.isFromBot) return; diff --git a/src/events/reactionAdd.ts b/src/events/reactionAdd.ts new file mode 100644 index 0000000..4d0d570 --- /dev/null +++ b/src/events/reactionAdd.ts @@ -0,0 +1,12 @@ +import config from '../../config.ts'; +import { + // Discordeno deps + Bot, +} from '../../deps.ts'; +import { ReactionAdd } from '../types/eventTypes.ts'; + +export const reactionAdd = (bot: Bot, payload: ReactionAdd) => { + if (config.pollChannels.includes(payload.channelId)) { + console.log(payload); + } +}; diff --git a/src/functions/_index.ts b/src/functions/_index.ts index b375b2d..c9cc05b 100644 --- a/src/functions/_index.ts +++ b/src/functions/_index.ts @@ -1,4 +1,4 @@ -import { pollReactions } from "./pollReactions.ts"; +import { pollReactions } from './pollReactions.ts'; export default { pollReactions, diff --git a/src/functions/pollReactions.ts b/src/functions/pollReactions.ts index eb11096..8d2ca12 100644 --- a/src/functions/pollReactions.ts +++ b/src/functions/pollReactions.ts @@ -1,3 +1,4 @@ +import config from '../../config.ts'; import { // Discordeno deps Bot, @@ -11,7 +12,7 @@ export const pollReactions = async (bot: Bot, message: Message, update = false) // Emoji RegExp const unicodeEmojis = '(\\p{Emoji_Presentation}|\\p{Extended_Pictographic})'; const unicodeEmojiRX = `(${unicodeEmojis}(\u200d${unicodeEmojis})*)`; - const discordEmojiRX = '(:[a-zA-Z\\d_]+:\\d+)'; + const discordEmojiRX = '(a?:[a-zA-Z\\d_]+:\\d+)'; const allEmojiRX = new RegExp(`${unicodeEmojiRX}|${discordEmojiRX}`, 'gu'); // Get list of emojis in message @@ -28,15 +29,24 @@ export const pollReactions = async (bot: Bot, message: Message, update = false) if (reaction.emoji.name) { // Make emoji name that matches our allEmojis array format const emojiName = reaction.emoji.id ? `:${reaction.emoji.name}:${reaction.emoji.id}` : reaction.emoji.name; - if (!allEmojis.includes(emojiName)) { - bot.helpers.deleteReaction(message.channelId, message.id, emojiName).catch((e: Error) => utils.commonLoggers.reactionDeleteError('pollReactions.ts:32', message, e, emojiName)); - } + await bot.helpers.deleteReaction(message.channelId, message.id, emojiName).catch((e: Error) => utils.commonLoggers.reactionDeleteError('pollReactions.ts:32', message, e, emojiName)); } } } } // Finally, add all reactions to the message - bot.helpers.addReactions(message.channelId, message.id, allEmojis, true).catch((e: Error) => utils.commonLoggers.reactionAddError('pollReactions.ts:40', message, e, allEmojis.toString())); + for (const emoji of allEmojis) { + await bot.helpers.addReaction(message.channelId, message.id, emoji).catch(async (_err) => { + try { + const [animated, emojiName, emojiId] = emoji.split(':'); + const newEmoji = await bot.helpers.createEmoji(config.devServer, {name: emojiName, image: `https://cdn.discordapp.com/emojis/${emojiId}.${animated ? 'gif' : 'webp'}`}) + await bot.helpers.addReaction(message.channelId, message.id, `:${newEmoji.name}:${newEmoji.id}`); + await bot.helpers.deleteEmoji(config.devServer, newEmoji.id || 0n); + } catch (e) { + utils.commonLoggers.reactionAddError('pollReactions.ts:45', message, e, emoji); + } + }); + } } }; diff --git a/src/types/eventTypes.ts b/src/types/eventTypes.ts new file mode 100644 index 0000000..e45f0fc --- /dev/null +++ b/src/types/eventTypes.ts @@ -0,0 +1,11 @@ +import { Emoji, Member, User } from '../../deps.ts'; + +export type ReactionAdd = { + userId: bigint; + channelId: bigint; + messageId: bigint; + guildId?: bigint; + member?: Member; + user?: User; + emoji: Emoji; +}; diff --git a/src/utils.ts b/src/utils.ts index 27197b6..94ecf82 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -19,8 +19,8 @@ const jsonStringifyBig = (input: any) => { const genericLogger = (level: LT, message: string) => log(level, message); const messageEditError = (location: string, message: Message | string, err: Error) => genericLogger(LT.ERROR, `${location} | Failed to edit message: ${jsonStringifyBig(message)} | Error: ${err.name} - ${err.message}`); - const messageGetError = (location: string, message: Message | string, err: Error) => - genericLogger(LT.ERROR, `${location} | Failed to get message: ${jsonStringifyBig(message)} | Error: ${err.name} - ${err.message}`); +const messageGetError = (location: string, message: Message | string, err: Error) => + genericLogger(LT.ERROR, `${location} | Failed to get message: ${jsonStringifyBig(message)} | Error: ${err.name} - ${err.message}`); const messageSendError = (location: string, message: Message | string, err: Error) => genericLogger(LT.ERROR, `${location} | Failed to send message: ${jsonStringifyBig(message)} | Error: ${err.name} - ${err.message}`); const messageDeleteError = (location: string, message: Message | string, err: Error) =>