Skip to content

Commit

Permalink
feat(MessageReaction): add remove method and Client#messageReactionRe…
Browse files Browse the repository at this point in the history
…moveEmoji (#3723)

* Add support for MessageReaction#remove and MESSAGE_REACTION_REMOVE_EMOJI

* Remove reaction from cache

Co-Authored-By: matthewfripp <[email protected]>

* fix: message may be partial

* Clarify what the event entails

* Document client in MessageReaction

Co-Authored-By: SpaceEEC <[email protected]>

* await the REST call

* Add MessageReaction#remove to typings

Co-authored-by: matthewfripp <[email protected]>
Co-authored-by: SpaceEEC <[email protected]>
  • Loading branch information
3 people committed Jan 25, 2020
1 parent d8b4725 commit 030d263
Show file tree
Hide file tree
Showing 7 changed files with 56 additions and 1 deletion.
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 @@ -262,6 +262,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 @@ -379,6 +380,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 @@ -191,6 +191,7 @@ declare module 'discord.js' {
public on(event: 'inviteCreate' | 'inviteDelete', listener: (invite: Invite) => 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 @@ -1113,6 +1114,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

0 comments on commit 030d263

Please sign in to comment.