Skip to content

Commit 8a87287

Browse files
committed
1 parent 7f7b71b commit 8a87287

File tree

6 files changed

+71
-33
lines changed

6 files changed

+71
-33
lines changed

lib/gateway/Shard.ts

Lines changed: 42 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -702,17 +702,29 @@ export default class Shard extends TypedEmitter<ShardEvents> {
702702
: this.client.users.get(packet.d.user_id) ?? { id: packet.d.user_id };
703703

704704
if (message) {
705-
const name = packet.d.emoji.id ? `${packet.d.emoji.name}:${packet.d.emoji.id}` : packet.d.emoji.name;
706-
if (message.reactions[name]) {
707-
message.reactions[name].count++;
705+
const index = message.reactions.findIndex(r => r.emoji.id === packet.d.emoji.id && r.emoji.name === packet.d.emoji.name);
706+
if (index === -1) {
707+
message.reactions.push({
708+
burstColors: packet.d.burst_colors,
709+
count: 1,
710+
countDetails: {
711+
burst: packet.d.burst ? 1 : 0,
712+
normal: packet.d.burst ? 0 : 1
713+
},
714+
emoji: packet.d.emoji,
715+
me: packet.d.user_id === this.client.user.id,
716+
meBurst: packet.d.user_id === this.client.user.id && packet.d.burst
717+
});
718+
} else {
719+
if (packet.d.burst) {
720+
message.reactions[index].countDetails.burst++;
721+
} else {
722+
message.reactions[index].countDetails.normal++;
723+
}
724+
message.reactions[index].count++;
708725
if (packet.d.user_id === this.client.user.id) {
709-
message.reactions[name].me = true;
726+
message.reactions[index].me = true;
710727
}
711-
} else {
712-
message.reactions[name] = {
713-
count: 1,
714-
me: packet.d.user_id === this.client.user.id
715-
};
716728
}
717729

718730
}
@@ -724,7 +736,7 @@ export default class Shard extends TypedEmitter<ShardEvents> {
724736
guildID: packet.d.guild_id,
725737
id: packet.d.message_id ,
726738
author: packet.d.message_author_id === undefined ? undefined : guild?.members.get(packet.d.user_id) ?? this.client.users.get(packet.d.user_id) ?? { id: packet.d.message_author_id }
727-
}, reactor, packet.d.emoji);
739+
}, reactor, packet.d.emoji, packet.d.burst);
728740
break;
729741
}
730742

@@ -734,14 +746,23 @@ export default class Shard extends TypedEmitter<ShardEvents> {
734746
const reactor = this.client.users.get(packet.d.user_id) ?? { id: packet.d.user_id };
735747

736748
if (message) {
737-
const name = packet.d.emoji.id ? `${packet.d.emoji.name}:${packet.d.emoji.id}` : packet.d.emoji.name;
738-
if (message.reactions[name]) {
739-
message.reactions[name].count--;
749+
const index = message.reactions.findIndex(r => r.emoji.id === packet.d.emoji.id && r.emoji.name === packet.d.emoji.name);
750+
if (index !== -1) {
751+
if (packet.d.burst) {
752+
message.reactions[index].countDetails.burst--;
753+
} else {
754+
message.reactions[index].countDetails.normal--;
755+
}
756+
message.reactions[index].count--;
740757
if (packet.d.user_id === this.client.user.id) {
741-
message.reactions[name].me = false;
758+
if (packet.d.burst) {
759+
message.reactions[index].meBurst = false;
760+
} else {
761+
message.reactions[index].me = false;
762+
}
742763
}
743-
if (message.reactions[name].count === 0) {
744-
delete message.reactions[name];
764+
if (message.reactions[index].count === 0) {
765+
message.reactions.splice(index, 1);
745766
}
746767
}
747768
}
@@ -752,7 +773,7 @@ export default class Shard extends TypedEmitter<ShardEvents> {
752773
guild: packet.d.guild_id ? this.client.guilds.get(packet.d.guild_id) : undefined,
753774
guildID: packet.d.guild_id,
754775
id: packet.d.message_id
755-
}, reactor, packet.d.emoji);
776+
}, reactor, packet.d.emoji, packet.d.burst);
756777
break;
757778
}
758779

@@ -761,7 +782,7 @@ export default class Shard extends TypedEmitter<ShardEvents> {
761782
const message = channel?.messages?.get(packet.d.message_id);
762783

763784
if (message) {
764-
message.reactions = {};
785+
message.reactions = [];
765786
}
766787

767788
this.client.emit("messageReactionRemoveAll", message ?? {
@@ -779,9 +800,9 @@ export default class Shard extends TypedEmitter<ShardEvents> {
779800
const message = channel?.messages?.get(packet.d.message_id);
780801

781802
if (message) {
782-
const name = packet.d.emoji.id ? `${packet.d.emoji.name}:${packet.d.emoji.id}` : packet.d.emoji.name;
783-
if (message.reactions[name]) {
784-
delete message.reactions[name];
803+
const index = message.reactions.findIndex(r => r.emoji.id === packet.d.emoji.id && r.emoji.name === packet.d.emoji.name);
804+
if (index !== -1) {
805+
message.reactions.splice(index, 1);
785806
}
786807
}
787808

lib/structures/Message.ts

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@ export default class Message<T extends AnyTextableChannel | Uncached = AnyTextab
105105
/** This message's relative position, if in a thread. */
106106
position?: number;
107107
/** The reactions on this message. */
108-
reactions: Record<string, MessageReaction>;
108+
reactions: Array<MessageReaction>;
109109
/** If this message is a `REPLY` or `THREAD_STARTER_MESSAGE`, this will be the message that's referenced. */
110110
referencedMessage?: Message | null;
111111
/** The data of the role subscription purchase or renewal that prompted this message. */
@@ -142,7 +142,7 @@ export default class Message<T extends AnyTextableChannel | Uncached = AnyTextab
142142
users: []
143143
};
144144
this.pinned = !!data.pinned;
145-
this.reactions = {};
145+
this.reactions = [];
146146
// message updates can be missing a timestamp
147147
this.timestamp = data.timestamp === undefined ? Base.getCreatedAt(this.id) : new Date(data.timestamp);
148148
this.tts = !!data.tts;
@@ -250,13 +250,14 @@ export default class Message<T extends AnyTextableChannel | Uncached = AnyTextab
250250
this.position = data.position;
251251
}
252252
if (data.reactions) {
253-
for (const reaction of data.reactions) {
254-
const name = reaction.emoji.id ? `${reaction.emoji.name}:${reaction.emoji.id}` : reaction.emoji.name;
255-
this.reactions[name] = {
256-
count: reaction.count,
257-
me: reaction.me
258-
};
259-
}
253+
this.reactions = data.reactions.map(r => ({
254+
burstColors: r.burst_colors,
255+
count: r.count,
256+
countDetails: r.count_details,
257+
emoji: r.emoji,
258+
me: r.me,
259+
meBurst: r.me_burst
260+
}));
260261
}
261262

262263
if (data.referenced_message !== undefined) {

lib/types/channels.d.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -689,15 +689,27 @@ export interface ChannelMention {
689689
type: ChannelTypes;
690690
}
691691

692+
export interface MessageReactionCountDetails {
693+
burst: number;
694+
normal: number;
695+
}
696+
692697
export interface RawMessageReaction {
698+
burst_colors: Array<string>;
693699
count: number;
700+
count_details: MessageReactionCountDetails;
694701
emoji: PartialEmoji;
695702
me: boolean;
703+
me_burst: boolean;
696704
}
697705

698706
export interface MessageReaction {
707+
burstColors: Array<string>;
699708
count: number;
709+
countDetails: MessageReactionCountDetails;
710+
emoji: PartialEmoji;
700711
me: boolean;
712+
meBurst: boolean;
701713
}
702714

703715
export interface MessageActivity {

lib/types/events.d.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -165,9 +165,9 @@ export interface ClientEvents {
165165
/** @event Emitted when messages are bulk deleted. Requires the `GUILD_MESSAGES` intent. The `MESSAGE_CONTENT` intent is required for `content`, `embeds`, and similar to be present on most messages. */
166166
messageDeleteBulk: [messages: Array<PossiblyUncachedMessage>];
167167
/** @event Emitted when a reaction is added to a message. For uncached messages, `author` will not be present if the reaction was added to a webhook message. Requires the `GUILD_MESSAGE_REACTIONS` for guild messages, and `DIRECT_MESSAGE_REACTIONS` for direct messages. */
168-
messageReactionAdd: [message: PossiblyUncachedMessage & { author?: Member | User | Uncached; }, reactor: Member | User | Uncached, reaction: PartialEmoji];
168+
messageReactionAdd: [message: PossiblyUncachedMessage & { author?: Member | User | Uncached; }, reactor: Member | User | Uncached, reaction: PartialEmoji, burst: boolean];
169169
/** @event Emitted when a reaction is removed from a message. Requires the `GUILD_MESSAGE_REACTIONS` for guild messages, and `DIRECT_MESSAGE_REACTIONS` for direct messages. */
170-
messageReactionRemove: [message: PossiblyUncachedMessage, reactor: Member | User | Uncached, reaction: PartialEmoji];
170+
messageReactionRemove: [message: PossiblyUncachedMessage, reactor: Member | User | Uncached, reaction: PartialEmoji, burst: boolean];
171171
/** @event Emitted when all reactions are removed from a message. Requires the `GUILD_MESSAGE_REACTIONS` for guild messages, and `DIRECT_MESSAGE_REACTIONS` for direct messages. */
172172
messageReactionRemoveAll: [message: PossiblyUncachedMessage];
173173
/** @event Emitted when a specific reaction is removed for all users from a message. Requires the `GUILD_MESSAGE_REACTIONS` for guild messages, and `DIRECT_MESSAGE_REACTIONS` for direct messages. */

lib/types/gateway-raw.d.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -407,6 +407,8 @@ export interface MessageUpdatePacket extends BaseDispatchPacket {
407407

408408
export interface MessageReactionAddPacket extends BaseDispatchPacket {
409409
d: {
410+
burst: boolean;
411+
burst_colors: Array<string>;
410412
channel_id: string;
411413
emoji: PartialEmoji;
412414
guild_id?: string;
@@ -420,6 +422,8 @@ export interface MessageReactionAddPacket extends BaseDispatchPacket {
420422

421423
export interface MessageReactionRemovePacket extends BaseDispatchPacket {
422424
d: {
425+
burst: boolean;
426+
burst_colors: Array<string>;
423427
channel_id: string;
424428
emoji: PartialEmoji;
425429
guild_id?: string;

lib/types/json.d.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -417,7 +417,7 @@ export interface JSONMessage extends JSONBase {
417417
nonce?: number | string;
418418
pinned: boolean;
419419
position?: number;
420-
reactions: Record<string, MessageReaction>;
420+
reactions: Array<MessageReaction>;
421421
referencedMessage?: JSONMessage | null;
422422
stickerItems?: Array<StickerItem>;
423423
thread?: JSONAnnouncementThreadChannel | JSONPublicThreadChannel | JSONPrivateThreadChannel;

0 commit comments

Comments
 (0)