/** * bot.ts * Scans the chat for reactions and updates the leaderboard database. */ import { Client, Events, GatewayIntentBits, MessageReaction, PartialMessageReaction, Partials, User } from 'discord.js'; import { db, openDb, reactionEmojis, recordReaction } from './util'; const client = new Client({ intents: [GatewayIntentBits.Guilds, GatewayIntentBits.GuildMessages, GatewayIntentBits.GuildMessageReactions], partials: [Partials.Message, Partials.Channel, Partials.Reaction], }); client.once(Events.ClientReady, async () => { console.log('[bot] Ready.'); for (let i = 0; i < reactionEmojis.length; ++i) console.log(`[bot] config: reaction_${i + 1} = ${reactionEmojis[i]}`); }); async function onMessageReactionChanged(reaction: MessageReaction | PartialMessageReaction, user: User) { // When a reaction is received, check if the structure is partial if (reaction.partial) { // If the message this reaction belongs to was removed, the fetching might result in an API error which should be handled try { await reaction.fetch(); } catch (error) { console.error('[bot] Something went wrong when fetching the reaction:', error); // Return as `reaction.message.author` may be undefined/null return; } } if (reaction.message.partial) { // If the message this reaction belongs to was removed, the fetching might result in an API error which should be handled try { await reaction.message.fetch(); } catch (error) { console.error('[bot] Something went wrong when fetching the message:', error); // Return as `reaction.message.author` may be undefined/null return; } } // Now the message has been cached and is fully available console.log(`[bot] ${reaction.message.author.id}'s message reaction count changed: ${reaction.emoji.name}x${reaction.count}`); await recordReaction( reaction); } client.on(Events.MessageReactionAdd, onMessageReactionChanged); client.on(Events.MessageReactionRemove, onMessageReactionChanged); async function startup() { console.log("[db] Opening..."); await openDb(); console.log("[db] Migrating..."); await db.migrate(); console.log("[db] Ready."); console.log("[bot] Logging in..."); await client.login(process.env.TOKEN); } startup();