@@ -18,6 +18,7 @@ import {
1818 GuildTextThreadCreateOptions ,
1919 AutocompleteInteraction ,
2020} from "discord.js" ;
21+ import { logger } from "../features/log.js" ;
2122
2223export 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) => {
5051export 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