44 EmbedBuilder ,
55 Events ,
66 GuildMember ,
7+ PermissionFlagsBits ,
78 TextChannel ,
89} from "discord.js" ;
910import {
@@ -40,16 +41,57 @@ export default {
4041 const isBoostingNow = newMember . premiumSince !== null ;
4142
4243 if ( ! wasBoostingBefore && isBoostingNow ) {
43- await onBoostStart ( newMember ) ;
44+ try {
45+ await onBoostStart ( newMember ) ;
46+ } catch ( error ) {
47+ logger . error (
48+ `onBoostStart failed for user ${ newMember . id } in guild ${ newMember . guild . id } :` ,
49+ error ,
50+ ) ;
51+ }
4452 } else if ( wasBoostingBefore && ! isBoostingNow ) {
45- await onBoostEnd ( newMember ) ;
53+ try {
54+ await onBoostEnd ( newMember ) ;
55+ } catch ( error ) {
56+ logger . error (
57+ `onBoostEnd failed for user ${ newMember . id } in guild ${ newMember . guild . id } :` ,
58+ error ,
59+ ) ;
60+ }
4661 }
4762 } ,
4863} ;
4964
5065async function getGuildSettings ( guildId : string ) {
5166 return prisma . guildSetting . findUnique ( { where : { gid : guildId } } ) ;
5267}
68+ async function safeSend (
69+ channel : TextChannel | undefined ,
70+ payload : Parameters < TextChannel [ "send" ] > [ 0 ] ,
71+ ) : Promise < void > {
72+ if ( ! channel ) return ;
73+
74+ const me = channel . guild . members . me ;
75+ const perms = me ? channel . permissionsFor ( me ) : null ;
76+
77+ if (
78+ ! perms ?. has ( [
79+ PermissionFlagsBits . ViewChannel ,
80+ PermissionFlagsBits . SendMessages ,
81+ ] )
82+ ) {
83+ logger . warn (
84+ `Missing permission to send in channel ${ channel . id } (guild ${ channel . guild . id } )` ,
85+ ) ;
86+ return ;
87+ }
88+
89+ try {
90+ await channel . send ( payload ) ;
91+ } catch ( error ) {
92+ logger . error ( `Failed to send message in channel ${ channel . id } :` , error ) ;
93+ }
94+ }
5395
5496async function onBoostStart ( member : GuildMember ) : Promise < void > {
5597 const guild = member . guild ;
@@ -76,48 +118,48 @@ async function onBoostStart(member: GuildMember): Promise<void> {
76118 const greetChannel = guild . channels . cache . get ( settings . greetChannelId ) as
77119 | TextChannel
78120 | undefined ;
79- if ( greetChannel ) {
80- const embed = new EmbedBuilder ( )
81- . setColor ( 0xf47fff )
82- . setTitle ( "New Server Boost! 🎉" )
83- . setDescription ( `${ member } has boosted the server!` )
84- . addFields (
85- {
86- name : "Total Boosts" ,
87- value : String ( record . boostCounts ?? 1 ) ,
88- inline : true ,
89- } ,
90- { name : "Member" , value : member . user . tag , inline : true } ,
91- )
92- . setThumbnail ( member . displayAvatarURL ( { size : 512 } ) )
93- . setFooter ( { text : "Thank youuu!" } )
94- . setTimestamp ( ) ;
95- await greetChannel . send ( { embeds : [ embed ] } ) ;
96- }
121+
122+ const embed = new EmbedBuilder ( )
123+ . setColor ( 0xf47fff )
124+ . setTitle ( "New Server Boost! 🎉" )
125+ . setDescription ( `${ member } has boosted the server!` )
126+ . addFields (
127+ {
128+ name : "Total Boosts" ,
129+ value : String ( record . boostCounts ?? 1 ) ,
130+ inline : true ,
131+ } ,
132+ { name : "Member" , value : member . user . tag , inline : true } ,
133+ )
134+ . setThumbnail ( member . displayAvatarURL ( { size : 512 } ) )
135+ . setFooter ( { text : "Thank youuu!" } )
136+ . setTimestamp ( ) ;
137+
138+ await safeSend ( greetChannel , { embeds : [ embed ] } ) ;
97139
98140 const logChannel = guild . channels . cache . get ( settings . logChannelId ) as
99141 | TextChannel
100142 | undefined ;
101- if ( logChannel ) {
102- const logEmbed = new EmbedBuilder ( )
103- . setColor ( 0x57f287 )
104- . setTitle ( "Boost Started" )
105- . addFields (
106- {
107- name : "User" ,
108- value : `${ member . user . tag } (${ member . id } )` ,
109- inline : false ,
110- } ,
111- {
112- name : "Total Boost Count" ,
113- value : String ( record . boostCounts ?? 1 ) ,
114- inline : true ,
115- } ,
116- )
117- . setThumbnail ( member . displayAvatarURL ( { size : 512 } ) )
118- . setTimestamp ( ) ;
119- await logChannel . send ( { embeds : [ logEmbed ] } ) ;
120- }
143+
144+ const logEmbed = new EmbedBuilder ( )
145+ . setColor ( 0x57f287 )
146+ . setTitle ( "Boost Started" )
147+ . addFields (
148+ {
149+ name : "User" ,
150+ value : `${ member . user . tag } (${ member . id } )` ,
151+ inline : false ,
152+ } ,
153+ {
154+ name : "Total Boost Count" ,
155+ value : String ( record . boostCounts ?? 1 ) ,
156+ inline : true ,
157+ } ,
158+ )
159+ . setThumbnail ( member . displayAvatarURL ( { size : 512 } ) )
160+ . setTimestamp ( ) ;
161+
162+ await safeSend ( logChannel , { embeds : [ logEmbed ] } ) ;
121163
122164 try {
123165 await member . send (
@@ -146,24 +188,24 @@ async function onBoostEnd(member: GuildMember): Promise<void> {
146188 const logChannel = guild . channels . cache . get ( settings . logChannelId ) as
147189 | TextChannel
148190 | undefined ;
149- if ( logChannel ) {
150- const logEmbed = new EmbedBuilder ( )
151- . setColor ( 0xed4245 )
152- . setTitle ( "Boost Ended" )
153- . addFields (
154- {
155- name : "User" ,
156- value : `${ member . user . tag } (${ member . id } )` ,
157- inline : false ,
158- } ,
159- {
160- name : "Historical Boost Count" ,
161- value : String ( result . boostCounts ?? 0 ) ,
162- inline : true ,
163- } ,
164- )
165- . setThumbnail ( member . displayAvatarURL ( { size : 512 } ) )
166- . setTimestamp ( ) ;
167- await logChannel . send ( { embeds : [ logEmbed ] } ) ;
168- }
169- }
191+
192+ const logEmbed = new EmbedBuilder ( )
193+ . setColor ( 0xed4245 )
194+ . setTitle ( "Boost Ended" )
195+ . addFields (
196+ {
197+ name : "User" ,
198+ value : `${ member . user . tag } (${ member . id } )` ,
199+ inline : false ,
200+ } ,
201+ {
202+ name : "Historical Boost Count" ,
203+ value : String ( result . boostCounts ?? 0 ) ,
204+ inline : true ,
205+ } ,
206+ )
207+ . setThumbnail ( member . displayAvatarURL ( { size : 512 } ) )
208+ . setTimestamp ( ) ;
209+
210+ await safeSend ( logChannel , { embeds : [ logEmbed ] } ) ;
211+ }
0 commit comments