diff --git a/discord/events/MessageReactionAdd.ts b/discord/events/MessageReactionAdd.ts new file mode 100644 index 0000000..c537207 --- /dev/null +++ b/discord/events/MessageReactionAdd.ts @@ -0,0 +1,38 @@ +import DiscordEvent from "../../util/DiscordEvent"; +import { MessageReaction, PartialMessageReaction, PartialUser, User, Events } from "discord.js"; +import MemberUtil from "../../util/MemberUtil"; + +const PUSH_PIN_EMOJI = "📌"; // Unicode + +export default class MessageReactionAdd extends DiscordEvent { + constructor(client) { + super(Events.MessageReactionAdd, client); + } + + public async execute(reaction: MessageReaction | PartialMessageReaction, user: User | PartialUser): Promise { + try { + // Fetch partials if necessary + if (reaction.partial) await reaction.fetch(); + + // Condensed check for guild existence and emoji name + if (!reaction.message.guild || reaction.emoji.name !== PUSH_PIN_EMOJI) return; + + const guild = reaction.message.guild; + const member = await guild.members.fetch(user.id); + + // Combine all partner roles from PartnerDiscordRoleMap + const allPartnerRoles = Object.values(MemberUtil.PartnerDiscordRoleMap).flat(); + + // Check if the user has any of the partner roles + if (!member.roles.cache.some(role => allPartnerRoles.includes(role.id))) return; + + // Attempt to pin the message + await reaction.message.pin(); + const channel = reaction.message.channel; + await channel.send(`Pinned message: ${reaction.message.id}`); + } catch (error) { + const channel = reaction.message.channel; + await channel.send(`Error pinning message: ${error}`); + } + } +}