11import { EmbedBuilder , Events , GuildMember , TextChannel } from "discord.js" ;
22import { Config } from "../libs/loadVariables.js" ;
33import { registerBoost , removeBoost } from "../services/boosterService.js" ;
4- import { assignBoosterRole , removeBoosterRole , assignLevelRoles , removeAllLevelRoles , deleteCustomRole } from "../services/roleService.js" ;
4+ import {
5+ assignBoosterRole ,
6+ removeBoosterRole ,
7+ assignLevelRoles ,
8+ removeAllLevelRoles ,
9+ deleteCustomRole ,
10+ } from "../services/roleService.js" ;
11+ import { logger } from "../libs/logger.js" ;
512
613export default {
714 name : Events . GuildMemberUpdate ,
8- async execute ( oldMember : GuildMember , newMember : GuildMember , config : Config ) {
15+ async execute (
16+ oldMember : GuildMember ,
17+ newMember : GuildMember ,
18+ config : Config ,
19+ ) {
20+ try {
21+ if ( oldMember . partial ) oldMember = await oldMember . fetch ( ) ;
22+ if ( newMember . partial ) newMember = await newMember . fetch ( ) ;
23+ } catch ( error ) {
24+ logger . error (
25+ `Failed to fetch partials for user ${ oldMember . user . username } ` ,
26+ ) ;
27+ }
928 const wasBoostingBefore = oldMember . premiumSince !== null ;
1029 const isBoostingNow = newMember . premiumSince !== null ;
1130
@@ -14,55 +33,76 @@ export default {
1433 } else if ( wasBoostingBefore && ! isBoostingNow ) {
1534 await onBoostEnd ( newMember , config ) ;
1635 }
17- }
36+ } ,
1837} ;
1938
20- async function onBoostStart ( member : GuildMember , config : Config ) : Promise < void > {
39+ async function onBoostStart (
40+ member : GuildMember ,
41+ config : Config ,
42+ ) : Promise < void > {
2143 const guild = member . guild ;
2244
2345 const record = await registerBoost (
2446 member . id ,
2547 guild . id ,
2648 guild . name ,
27- guild . iconURL ( )
49+ guild . iconURL ( ) ,
2850 ) ;
2951
3052 if ( ! record ) return ;
3153
3254 await assignBoosterRole ( member , config ) ;
3355 await assignLevelRoles ( member , record . boostCounts ?? 1 ) ;
3456
35- const greetChannel = guild . channels . cache . get ( config . greetChannelId ) as TextChannel | undefined ;
57+ const greetChannel = guild . channels . cache . get ( config . greetChannelId ) as
58+ | TextChannel
59+ | undefined ;
3660 if ( greetChannel ) {
3761 const embed = new EmbedBuilder ( )
3862 . setColor ( 0xf47fff )
3963 . setTitle ( "New Server Boost! 🎉" )
4064 . setDescription ( `${ member } has boosted the server!` )
4165 . addFields (
42- { name : "Total Boosts" , value : String ( record . boostCounts ?? 1 ) , inline : true } ,
43- { name : "Member" , value : member . user . tag , inline : true }
66+ {
67+ name : "Total Boosts" ,
68+ value : String ( record . boostCounts ?? 1 ) ,
69+ inline : true ,
70+ } ,
71+ { name : "Member" , value : member . user . tag , inline : true } ,
4472 )
4573 . setTimestamp ( ) ;
4674
4775 await greetChannel . send ( { embeds : [ embed ] } ) ;
4876 }
4977
50- const logChannel = guild . channels . cache . get ( config . logChannelId ) as TextChannel | undefined ;
78+ const logChannel = guild . channels . cache . get ( config . logChannelId ) as
79+ | TextChannel
80+ | undefined ;
5181 if ( logChannel ) {
5282 const logEmbed = new EmbedBuilder ( )
5383 . setColor ( 0x57f287 )
5484 . setTitle ( "Boost Started" )
5585 . addFields (
56- { name : "User" , value : `${ member . user . tag } (${ member . id } )` , inline : false } ,
57- { name : "Total Boost Count" , value : String ( record . boostCounts ?? 1 ) , inline : true }
86+ {
87+ name : "User" ,
88+ value : `${ member . user . tag } (${ member . id } )` ,
89+ inline : false ,
90+ } ,
91+ {
92+ name : "Total Boost Count" ,
93+ value : String ( record . boostCounts ?? 1 ) ,
94+ inline : true ,
95+ } ,
5896 )
5997 . setTimestamp ( ) ;
6098
6199 await logChannel . send ( { embeds : [ logEmbed ] } ) ;
62100 }
63101
64102 try {
65- await member . send ( `Thank you for boosting the server! You now have access to booster perks.` ) ;
103+ await member . send (
104+ `Thank you for boosting the server! You now have access to booster perks.` ,
105+ ) ;
66106 } catch {
67107 // DMs may be closed
68108 }
@@ -78,17 +118,27 @@ async function onBoostEnd(member: GuildMember, config: Config): Promise<void> {
78118 await removeAllLevelRoles ( member ) ;
79119 await deleteCustomRole ( guild , member . id ) ;
80120
81- const logChannel = guild . channels . cache . get ( config . logChannelId ) as TextChannel | undefined ;
121+ const logChannel = guild . channels . cache . get ( config . logChannelId ) as
122+ | TextChannel
123+ | undefined ;
82124 if ( logChannel ) {
83125 const logEmbed = new EmbedBuilder ( )
84126 . setColor ( 0xed4245 )
85127 . setTitle ( "Boost Ended" )
86128 . addFields (
87- { name : "User" , value : `${ member . user . tag } (${ member . id } )` , inline : false } ,
88- { name : "Historical Boost Count" , value : String ( result . boostCounts ?? 0 ) , inline : true }
129+ {
130+ name : "User" ,
131+ value : `${ member . user . tag } (${ member . id } )` ,
132+ inline : false ,
133+ } ,
134+ {
135+ name : "Historical Boost Count" ,
136+ value : String ( result . boostCounts ?? 0 ) ,
137+ inline : true ,
138+ } ,
89139 )
90140 . setTimestamp ( ) ;
91141
92142 await logChannel . send ( { embeds : [ logEmbed ] } ) ;
93143 }
94- }
144+ }
0 commit comments