11import { EmbedBuilder , Events , type Guild , type GuildBan , type GuildMember , type Message , type PartialGuildMember , type PartialMessage } from "discord.js" ;
22import { guildDB } from "../db" ;
33import Colors from "../util/colors" ;
4+ import type { ActionLogEvent } from "../types" ;
45
56
6- async function getLogChannel ( guild : Guild ) {
7+ async function getLogChannel ( guild : Guild , event : ActionLogEvent ) {
78 const settings = await guildDB . get ( guild . id ) ;
89 if ( ! settings ?. actionlog ) return null ;
10+ // An event is enabled unless explicitly set to false
11+ if ( settings . actionlogEvents ?. [ event ] === false ) return null ;
912 const channel = guild . channels . cache . get ( settings . actionlog ) ;
1013 if ( ! channel ?. isTextBased ( ) ) return null ;
1114 return channel ;
@@ -19,7 +22,7 @@ export default [
1922 async execute ( message : Message | PartialMessage ) {
2023 if ( ! message . inGuild ( ) || message . author ?. bot ) return ;
2124
22- const logChannel = await getLogChannel ( message . guild ) ;
25+ const logChannel = await getLogChannel ( message . guild , "message_delete" ) ;
2326 if ( ! logChannel ) return ;
2427
2528 const embed = new EmbedBuilder ( )
@@ -44,7 +47,7 @@ export default [
4447 if ( ! newMessage . inGuild ( ) || ! newMessage . author || newMessage . author . bot ) return ;
4548 if ( oldMessage . content === newMessage . content ) return ;
4649
47- const logChannel = await getLogChannel ( newMessage . guild ) ;
50+ const logChannel = await getLogChannel ( newMessage . guild , "message_edit" ) ;
4851 if ( ! logChannel ) return ;
4952
5053 const embed = new EmbedBuilder ( )
@@ -67,7 +70,7 @@ export default [
6770 name : Events . GuildBanAdd ,
6871
6972 async execute ( ban : GuildBan ) {
70- const logChannel = await getLogChannel ( ban . guild ) ;
73+ const logChannel = await getLogChannel ( ban . guild , "member_ban" ) ;
7174 if ( ! logChannel ) return ;
7275
7376 const embed = new EmbedBuilder ( )
@@ -88,7 +91,7 @@ export default [
8891 name : Events . GuildBanRemove ,
8992
9093 async execute ( ban : GuildBan ) {
91- const logChannel = await getLogChannel ( ban . guild ) ;
94+ const logChannel = await getLogChannel ( ban . guild , "member_unban" ) ;
9295 if ( ! logChannel ) return ;
9396
9497 const embed = new EmbedBuilder ( )
@@ -108,46 +111,49 @@ export default [
108111 name : Events . GuildMemberUpdate ,
109112
110113 async execute ( oldMember : GuildMember | PartialGuildMember , newMember : GuildMember ) {
111- const logChannel = await getLogChannel ( newMember . guild ) ;
112- if ( ! logChannel ) return ;
113-
114114 // Nickname changes
115115 if ( oldMember . nickname !== newMember . nickname ) {
116- const embed = new EmbedBuilder ( )
117- . setColor ( Colors . Info )
118- . setTitle ( "Nickname Changed" )
119- . addFields (
120- { name : "User" , value : `<@${ newMember . user . id } > (${ newMember . user . tag } )` , inline : true } ,
121- { name : "Before" , value : oldMember . nickname ?? "*None*" , inline : true } ,
122- { name : "After" , value : newMember . nickname ?? "*None*" , inline : true }
123- )
124- . setFooter ( { text : `User ID: ${ newMember . user . id } ` } )
125- . setTimestamp ( ) ;
126-
127- await logChannel . send ( { embeds : [ embed ] } ) . catch ( console . error ) ;
128- }
129-
130- // Role changes — only reliable when the old member was fully cached
131- if ( ! oldMember . partial ) {
132- const addedRoles = newMember . roles . cache . filter ( r => ! oldMember . roles . cache . has ( r . id ) ) ;
133- const removedRoles = oldMember . roles . cache . filter ( r => ! newMember . roles . cache . has ( r . id ) ) ;
134-
135- if ( addedRoles . size || removedRoles . size ) {
116+ const logChannel = await getLogChannel ( newMember . guild , "nickname_change" ) ;
117+ if ( logChannel ) {
136118 const embed = new EmbedBuilder ( )
137119 . setColor ( Colors . Info )
138- . setTitle ( "Member Roles Updated " )
120+ . setTitle ( "Nickname Changed " )
139121 . addFields (
140- { name : "User" , value : `<@${ newMember . user . id } > (${ newMember . user . tag } )` , inline : true }
122+ { name : "User" , value : `<@${ newMember . user . id } > (${ newMember . user . tag } )` , inline : true } ,
123+ { name : "Before" , value : oldMember . nickname ?? "*None*" , inline : true } ,
124+ { name : "After" , value : newMember . nickname ?? "*None*" , inline : true }
141125 )
142126 . setFooter ( { text : `User ID: ${ newMember . user . id } ` } )
143127 . setTimestamp ( ) ;
144128
145- if ( addedRoles . size ) embed . addFields ( { name : "Roles Added" , value : addedRoles . map ( r => `<@&${ r . id } >` ) . join ( ", " ) } ) ;
146- if ( removedRoles . size ) embed . addFields ( { name : "Roles Removed" , value : removedRoles . map ( r => `<@&${ r . id } >` ) . join ( ", " ) } ) ;
147-
148129 await logChannel . send ( { embeds : [ embed ] } ) . catch ( console . error ) ;
149130 }
150131 }
132+
133+ // Role changes — only reliable when the old member was fully cached
134+ if ( ! oldMember . partial ) {
135+ const addedRoles = newMember . roles . cache . filter ( r => ! oldMember . roles . cache . has ( r . id ) ) ;
136+ const removedRoles = oldMember . roles . cache . filter ( r => ! newMember . roles . cache . has ( r . id ) ) ;
137+
138+ if ( addedRoles . size || removedRoles . size ) {
139+ const logChannel = await getLogChannel ( newMember . guild , "role_change" ) ;
140+ if ( logChannel ) {
141+ const embed = new EmbedBuilder ( )
142+ . setColor ( Colors . Info )
143+ . setTitle ( "Member Roles Updated" )
144+ . addFields (
145+ { name : "User" , value : `<@${ newMember . user . id } > (${ newMember . user . tag } )` , inline : true }
146+ )
147+ . setFooter ( { text : `User ID: ${ newMember . user . id } ` } )
148+ . setTimestamp ( ) ;
149+
150+ if ( addedRoles . size ) embed . addFields ( { name : "Roles Added" , value : addedRoles . map ( r => `<@&${ r . id } >` ) . join ( ", " ) } ) ;
151+ if ( removedRoles . size ) embed . addFields ( { name : "Roles Removed" , value : removedRoles . map ( r => `<@&${ r . id } >` ) . join ( ", " ) } ) ;
152+
153+ await logChannel . send ( { embeds : [ embed ] } ) . catch ( console . error ) ;
154+ }
155+ }
156+ }
151157 } ,
152158 } ,
153159] ;
0 commit comments