1- import { Snowflake , TextChannel } from "discord.js" ;
1+ import { PermissionsBitField , Snowflake , TextChannel } from "discord.js" ;
22import { TemplateParseError , TemplateSafeValueContainer , renderTemplate } from "../../../templateFormatter.js" ;
3- import { createChunkedMessage , verboseChannelMention , verboseUserMention } from "../../../utils.js" ;
3+ import {
4+ createChunkedMessage ,
5+ renderRecursively ,
6+ verboseChannelMention ,
7+ verboseUserMention
8+ } from "../../../utils.js" ;
9+ import { MessageContent } from "../../../utils.js" ;
10+ import { hasDiscordPermissions } from "../../../utils/hasDiscordPermissions.js" ;
411import { sendDM } from "../../../utils/sendDM.js" ;
512import {
613 guildToTemplateSafeGuild ,
@@ -28,25 +35,27 @@ export const SendWelcomeMessageEvt = welcomeMessageEvt({
2835
2936 pluginData . state . sentWelcomeMessages . add ( member . id ) ;
3037
31- let formatted ;
38+ const templateValues = new TemplateSafeValueContainer ( {
39+ member : memberToTemplateSafeMember ( member ) ,
40+ user : userToTemplateSafeUser ( member . user ) ,
41+ guild : guildToTemplateSafeGuild ( member . guild ) ,
42+ } ) ;
43+
44+ const renderMessageText = ( str : string ) => renderTemplate ( str , templateValues ) ;
45+
46+ let formatted : MessageContent ;
3247
3348 try {
34- formatted = await renderTemplate (
35- config . message ,
36- new TemplateSafeValueContainer ( {
37- member : memberToTemplateSafeMember ( member ) ,
38- user : userToTemplateSafeUser ( member . user ) ,
39- guild : guildToTemplateSafeGuild ( member . guild ) ,
40- } ) ,
41- ) ;
49+ formatted = typeof config . message === "string"
50+ ? await renderMessageText ( config . message )
51+ : ( ( await renderRecursively ( config . message , renderMessageText ) ) as MessageContent ) ;
4252 } catch ( e ) {
4353 if ( e instanceof TemplateParseError ) {
4454 pluginData . getPlugin ( LogsPlugin ) . logBotAlert ( {
4555 body : `Error formatting welcome message: ${ e . message } ` ,
4656 } ) ;
4757 return ;
4858 }
49-
5059 throw e ;
5160 }
5261
@@ -65,17 +74,49 @@ export const SendWelcomeMessageEvt = welcomeMessageEvt({
6574 const channel = meta . args . member . guild . channels . cache . get ( config . send_to_channel as Snowflake ) ;
6675 if ( ! channel || ! ( channel instanceof TextChannel ) ) return ;
6776
68- try {
69- await createChunkedMessage ( channel , formatted , {
70- parse : [ "users" ] ,
77+ if (
78+ ! hasDiscordPermissions (
79+ channel . permissionsFor ( pluginData . client . user ! . id ) ,
80+ PermissionsBitField . Flags . SendMessages | PermissionsBitField . Flags . ViewChannel ,
81+ )
82+ ) {
83+ pluginData . getPlugin ( LogsPlugin ) . logBotAlert ( {
84+ body : `Missing permissions to send welcome message in ${ verboseChannelMention ( channel ) } ` ,
7185 } ) ;
86+ return ;
87+ }
88+
89+ if (
90+ typeof formatted === "object" && formatted . embeds && formatted . embeds . length > 0 &&
91+ ! hasDiscordPermissions (
92+ channel . permissionsFor ( pluginData . client . user ! . id ) ,
93+ PermissionsBitField . Flags . EmbedLinks ,
94+ )
95+ ) {
96+ pluginData . getPlugin ( LogsPlugin ) . logBotAlert ( {
97+ body : `Missing permissions to send welcome message **with embeds** in ${ verboseChannelMention ( channel ) } ` ,
98+ } ) ;
99+ return ;
100+ }
101+
102+ try {
103+ if ( typeof formatted === "string" ) {
104+ await createChunkedMessage ( channel , formatted , {
105+ parse : [ "users" ] ,
106+ } ) ;
107+ } else {
108+ await channel . send ( {
109+ ...formatted ,
110+ allowedMentions : {
111+ parse : [ "users" ] ,
112+ } ,
113+ } ) ;
114+ }
72115 } catch {
73116 pluginData . getPlugin ( LogsPlugin ) . logBotAlert ( {
74- body : `Failed send a welcome message for ${ verboseUserMention ( member . user ) } to ${ verboseChannelMention (
75- channel ,
76- ) } `,
117+ body : `Failed to send welcome message for ${ verboseUserMention ( member . user ) } to ${ verboseChannelMention ( channel ) } ` ,
77118 } ) ;
78119 }
79120 }
80121 } ,
81- } ) ;
122+ } ) ;
0 commit comments