Skip to content

Commit 26b6251

Browse files
authored
fix: use Promise.allSettled instead of Promise.all to fetch users in emojiMod (#489)
1 parent 936682c commit 26b6251

File tree

2 files changed

+28
-8
lines changed

2 files changed

+28
-8
lines changed

src/features/emojiMod.ts

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -160,8 +160,6 @@ const emojiMod: ChannelHandlers = {
160160

161161
if (authorMember.id === bot.user?.id) return;
162162

163-
if (authorMember.id === bot.user?.id) return;
164-
165163
reactionHandlers[emoji]({
166164
guild,
167165
author: authorMember,

src/helpers/discord.ts

Lines changed: 28 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import {
1818
GuildTextThreadCreateOptions,
1919
AutocompleteInteraction,
2020
} from "discord.js";
21+
import { logger } from "../features/log.js";
2122

2223
export const difference = <T>(a: Set<T>, b: Set<T>) =>
2324
new Set(Array.from(a).filter((x) => !b.has(x)));
@@ -50,16 +51,37 @@ export const isStaffOrHelpful = (member: GuildMember) => {
5051
export const constructDiscordLink = (message: Message | PartialMessage) =>
5152
`https://discord.com/channels/${message.guild?.id}/${message.channel.id}/${message.id}`;
5253

53-
export const fetchReactionMembers = (
54+
export const fetchReactionMembers = async (
5455
guild: Guild,
5556
reaction: MessageReaction | PartialMessageReaction,
5657
) => {
5758
try {
58-
return reaction.users
59-
.fetch()
60-
.then((users) =>
61-
Promise.all(users.map((user) => guild.members.fetch(user.id))),
62-
);
59+
const users = await reaction.users.fetch();
60+
const members = await Promise.allSettled(
61+
users.map((user) =>
62+
guild.members.fetch(user.id).then(
63+
(member) => ({ member, user }),
64+
() => ({ member: null, user }),
65+
),
66+
),
67+
);
68+
69+
return members.flatMap((result) => {
70+
// NOTE: This can't be a rejected promise, but we handle it just in case
71+
if (result.status !== "fulfilled") {
72+
return [];
73+
}
74+
75+
if (!result.value.member) {
76+
logger.log(
77+
"REACTION_MEMBERS",
78+
`Failed to fetch member for user ${result.value.user.username}, id: ${result.value.user.id} in guild ${guild.id}.`,
79+
);
80+
return [];
81+
}
82+
83+
return [result.value.member];
84+
});
6385
} catch (e) {
6486
return Promise.resolve([] as GuildMember[]);
6587
}

0 commit comments

Comments
 (0)