@ -1,33 +1,46 @@
import { AuditLogEvent , GuildAuditLogsEntry , GuildMember } from "discord.js" ;
import type { NucleusClient } from "../utils/client.js" ;
import type { LoggerOptions } from "../utils/log.js" ;
import { generalException } from "../utils/createTemporaryStorage.js" ;
export const event = "guildMemberUpdate" ;
export async function callback ( client : NucleusClient , before : GuildMember , after : GuildMember ) {
const { log , NucleusColors , entry , renderUser , renderDelta , getAuditLog } = client . logger ;
const auditLog = ( await getAuditLog ( after . guild , AuditLogEvent . MemberUpdate ) )
if ( ! before . roles . cache . equals ( after . roles . cache ) ) {
const auditLog = ( await getAuditLog ( after . guild , AuditLogEvent . MemberRoleUpdate ) )
. filter ( ( entry : GuildAuditLogsEntry ) = > ( entry . target as GuildMember ) ! . id === after . id ) [ 0 ] ;
if ( ! auditLog ) return ;
if ( auditLog . executor ! . id === client . user ! . id ) return ;
if ( ! before . roles . cache . equals ( after . roles . cache ) ) {
let rolesAdded = after . roles . cache . filter ( role = > ! before . roles . cache . has ( role . id ) ) ;
let rolesRemoved = before . roles . cache . filter ( role = > ! after . roles . cache . has ( role . id ) ) ;
if ( client . noLog . includes ( ` ${ after . guild . id } ${ after . id } ${ auditLog . id } ` ) ) return ;
generalException ( ` ${ after . guild . id } ${ after . id } ${ auditLog . id } ` ) ;
if ( auditLog . executor ! . id !== client . user ! . id ) {
const rolesAdded = after . roles . cache . filter ( role = > ! before . roles . cache . has ( role . id ) ) ;
const rolesRemoved = before . roles . cache . filter ( role = > ! after . roles . cache . has ( role . id ) ) ;
let displayName = "Roles Removed" ;
let color = NucleusColors . red ;
let emoji = "GUILD.ROLES.DELETE" ;
if ( rolesAdded . size > 0 && rolesRemoved . size > 0 ) { displayName = "Roles Changed" ; color = NucleusColors . yellow ; emoji = "GUILD.ROLES.EDIT" ; }
else if ( rolesAdded . size > 0 ) { displayName = "Roles Added" ; color = NucleusColors . green ; emoji = "GUILD.ROLES.CREATE" ; }
le t removedEntry = rolesRemoved . map ( role = > role . id ) ;
le t addedEntry = rolesAdded . map ( role = > role . id ) ;
cons t removedEntry = rolesRemoved . map ( role = > role . id ) ;
cons t addedEntry = rolesAdded . map ( role = > role . id ) ;
let list = {
memberId : entry ( after . id , ` \` ${ after . id } \` ` ) ,
name : entry ( after . user . id , renderUser ( after . user ) ) ,
} ;
if ( rolesAdded . size > 0 ) {
list = Object . assign ( list , { rolesAdded : entry ( addedEntry , addedEntry . map ( id = > ` <@& ${ id } > ` ) . join ( ", " ) ) } ) ;
}
if ( rolesRemoved . size > 0 ) {
list = Object . assign ( list , { rolesRemoved : entry ( removedEntry , removedEntry . map ( id = > ` <@& ${ id } > ` ) . join ( ", " ) ) } ) ;
}
list = Object . assign ( list , {
changed : entry ( Date . now ( ) , renderDelta ( Date . now ( ) ) ) ,
changedBy : entry ( auditLog . executor ! . id , renderUser ( auditLog . executor ! ) )
} ;
} ) ;
let data : LoggerOptions = {
meta : {
@ -38,9 +51,7 @@ export async function callback(client: NucleusClient, before: GuildMember, after
emoji : emoji ,
timestamp : Date.now ( )
} ,
list : {
} ,
list : { } ,
hidden : {
guild : after.guild.id
}
@ -55,6 +66,11 @@ export async function callback(client: NucleusClient, before: GuildMember, after
data = Object . assign ( data , { list : list } ) ;
log ( data ) ;
}
}
const auditLog = ( await getAuditLog ( after . guild , AuditLogEvent . MemberUpdate ) )
. filter ( ( entry : GuildAuditLogsEntry ) = > ( entry . target as GuildMember ) ! . id === after . id ) [ 0 ] ;
if ( ! auditLog ) return ;
if ( auditLog . executor ! . id === client . user ! . id ) return ;
if ( before . nickname !== after . nickname ) {
await client . database . history . create (
"nickname" ,