'use strict'; const Action = require('./Action'); const { Events, VoiceBasedChannelTypes } = require('../../util/Constants'); const { PartialTypes } = require('../../util/Constants'); /* { user_id: 'id', message_id: 'id', emoji: { name: '�', id: null }, channel_id: 'id', // If originating from a guild guild_id: 'id', member: { ..., user: { ... } } } */ class MessageReactionAdd extends Action { handle(data) { if (!data.emoji) return false; const user = this.getUserFromMember(data); if (!user) return false; // Verify channel const channel = this.getChannel(data); if (!channel || channel.type in VoiceBasedChannelTypes) return false; // Verify message const message = this.getMessage(data, channel); if (!message) return false; // Verify reaction if (message.partial && !this.client.options.partials.includes(PartialTypes.REACTION)) return false; const existing = message.reactions.cache.get(data.emoji.id ?? data.emoji.name); if (existing?.users.cache.has(user.id)) return { message, reaction: existing, user }; const reaction = message.reactions._add({ emoji: data.emoji, count: message.partial ? null : 0, me: user.id === this.client.user.id, }); if (!reaction) return false; reaction._add(user); /** * Emitted whenever a reaction is added to a cached message. * @event Client#messageReactionAdd * @param {MessageReaction} messageReaction The reaction object * @param {User} user The user that applied the guild or reaction emoji */ this.client.emit(Events.MESSAGE_REACTION_ADD, reaction, user); return { message, reaction, user }; } } module.exports = MessageReactionAdd;