Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add support for MessageReaction#remove and MESSAGE_REACTION_REMOVE_EMOJI #3723

Merged
merged 8 commits into from
Jan 25, 2020
2 changes: 1 addition & 1 deletion src/client/actions/Action.js
Original file line number Diff line number Diff line change
Expand Up @@ -54,7 +54,7 @@ class GenericAction {
return this.getPayload({
emoji: data.emoji,
count: message.partial ? null : 0,
me: user.id === this.client.user.id,
me: user ? user.id === this.client.user.id : false,
}, message.reactions, id, PartialTypes.REACTION);
}

Expand Down
1 change: 1 addition & 0 deletions src/client/actions/ActionsManager.js
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ class ActionsManager {
this.register(require('./MessageReactionAdd'));
this.register(require('./MessageReactionRemove'));
this.register(require('./MessageReactionRemoveAll'));
this.register(require('./MessageReactionRemoveEmoji'));
this.register(require('./ChannelCreate'));
this.register(require('./ChannelDelete'));
this.register(require('./ChannelUpdate'));
Expand Down
28 changes: 28 additions & 0 deletions src/client/actions/MessageReactionRemoveEmoji.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
'use strict';

const Action = require('./Action');
const { Events } = require('../../util/Constants');

class MessageReactionRemoveEmoji extends Action {
handle(data) {
const channel = this.getChannel(data);
if (!channel || channel.type === 'voice') return false;

const message = this.getMessage(data, channel);
if (!message) return false;

const reaction = this.getReaction(data, message);
if (!reaction) return false;
if (!message.partial) message.reactions.delete(reaction.emoji.id || reaction.emoji.name);

/**
* Emitted when a bot removes an emoji reaction from a cached message.
* @event Client#messageReactionRemoveEmoji
* @param {MessageReaction} reaction The reaction that was removed
*/
this.client.emit(Events.MESSAGE_REACTION_REMOVE_EMOJI, reaction);
return { reaction };
}
}

module.exports = MessageReactionRemoveEmoji;
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
'use strict';

module.exports = (client, packet) => {
client.actions.MessageReactionRemoveEmoji.handle(packet.d);
};
17 changes: 17 additions & 0 deletions src/structures/MessageReaction.js
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,13 @@ class MessageReaction {
* @param {Message} message The message the reaction refers to
*/
constructor(client, data, message) {
/**
* The client that instantiated this message reaction
* @name MessageReaction#client
* @type {Client}
* @readonly
*/
Object.defineProperty(this, 'client', { value: client });
/**
* The message that this reaction refers to
* @type {Message}
Expand Down Expand Up @@ -47,6 +54,16 @@ class MessageReaction {
if (this.count == undefined) this.count = data.count;
}

/**
* Removes all users from this reaction.
* @returns {Promise<MessageReaction>}
*/
async remove() {
await this.client.api.channels(this.message.channel.id).messages(this.message.id).reactions(this._emoji.identifier)
.delete();
return this;
}

/**
* The emoji of this reaction, either an GuildEmoji object for known custom emojis, or a ReactionEmoji
* object which has fewer properties. Whatever the prototype of the emoji, it will still have
Expand Down
2 changes: 2 additions & 0 deletions src/util/Constants.js
Original file line number Diff line number Diff line change
Expand Up @@ -260,6 +260,7 @@ exports.Events = {
MESSAGE_REACTION_ADD: 'messageReactionAdd',
MESSAGE_REACTION_REMOVE: 'messageReactionRemove',
MESSAGE_REACTION_REMOVE_ALL: 'messageReactionRemoveAll',
MESSAGE_REACTION_REMOVE_EMOJI: 'messageReactionRemoveEmoji',
USER_UPDATE: 'userUpdate',
PRESENCE_UPDATE: 'presenceUpdate',
VOICE_SERVER_UPDATE: 'voiceServerUpdate',
Expand Down Expand Up @@ -375,6 +376,7 @@ exports.WSEvents = keyMirror([
'MESSAGE_REACTION_ADD',
'MESSAGE_REACTION_REMOVE',
'MESSAGE_REACTION_REMOVE_ALL',
'MESSAGE_REACTION_REMOVE_EMOJI',
'USER_UPDATE',
'PRESENCE_UPDATE',
'TYPING_START',
Expand Down
2 changes: 2 additions & 0 deletions typings/index.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -190,6 +190,7 @@ declare module 'discord.js' {
public on(event: 'guildUpdate', listener: (oldGuild: Guild, newGuild: Guild) => void): this;
public on(event: 'guildIntegrationsUpdate', listener: (guild: Guild) => void): this;
public on(event: 'message' | 'messageDelete' | 'messageReactionRemoveAll', listener: (message: Message | PartialMessage) => void): this;
public on(event: 'messageReactionRemoveEmoji', listener: (reaction: MessageReaction) => void): this;
public on(event: 'messageDeleteBulk', listener: (messages: Collection<Snowflake, Message | PartialMessage>) => void): this;
public on(event: 'messageReactionAdd' | 'messageReactionRemove', listener: (messageReaction: MessageReaction, user: User | PartialUser) => void): this;
public on(event: 'messageUpdate', listener: (oldMessage: Message | PartialMessage, newMessage: Message | PartialMessage) => void): this;
Expand Down Expand Up @@ -1111,6 +1112,7 @@ declare module 'discord.js' {
public message: Message;
public readonly partial: boolean;
public users: ReactionUserStore;
public remove(): Promise<MessageReaction>;
public fetch(): Promise<MessageReaction>;
public toJSON(): object;
}
Expand Down