@ -4,7 +4,6 @@ import { promisify } from "util";
import generateKeyValueList from "./generateKeyValueList.js" ;
import client from "./client.js" ;
import { DiscordAPIError } from "discord.js" ;
import { Stream } from "node:stream" ;
import EmojiEmbed from "./generateEmojiEmbed.js" ;
const wait = promisify ( setTimeout ) ;
@ -17,15 +16,8 @@ export interface LoggerOptions {
color : number ;
emoji : string ;
timestamp : number ;
files ? : (
| Discord . BufferResolvable
| Stream
| Discord . JSONEncodable < Discord.APIAttachment >
| Discord . Attachment
| Discord . AttachmentBuilder
| Discord . AttachmentPayload
) [ ] ;
showDetails? : boolean ;
buttons ? : { buttonText : string ; buttonId : string ; buttonStyle : Discord.ButtonStyle } [ ] ;
imageData? : string ;
} ;
list : Record < string | symbol | number , unknown > ;
hidden : {
@ -47,6 +39,13 @@ async function isLogging(guild: string, type: string): Promise<boolean> {
return true ;
}
const NucleusColors = {
red : 0xf27878 ,
yellow : 0xf2d478 ,
green : 0x68d49e ,
blue : 0x72aef5
} ;
export const Logger = {
renderUser ( user : Discord.User | string ) {
if ( typeof user === "string" ) user = client . users . cache . get ( user ) ! ;
@ -62,6 +61,13 @@ export const Logger = {
t = Math . floor ( ( t /= 1000 ) ) ;
return ` <t: ${ t } :R> (<t: ${ t } :D> at <t: ${ t } :T>) ` ;
} ,
renderDateFooter ( t : number ) {
if ( isNaN ( t ) ) return "Unknown" ;
const date = new Date ( t ) ;
return ` ${ date . getUTCFullYear ( ) } - ${
date . getUTCMonth ( ) + 1
} - $ { date . getUTCDate ( ) } at $ { date . getUTCHours ( ) } : $ { date . getUTCMinutes ( ) } : $ { date . getUTCSeconds ( ) } UTC ` ;
} ,
renderNumberDelta ( num1 : number , num2 : number ) {
const delta = num2 - num1 ;
return ` ${ num1 } -> ${ num2 } ( ${ delta > 0 ? "+" : "" } ${ delta } ) ` ;
@ -86,11 +92,7 @@ export const Logger = {
renderEmoji ( emoji : Discord.GuildEmoji ) {
return ` < ${ emoji . animated ? "a" : "" } : ${ emoji . name } : ${ emoji . id } > [ \` : ${ emoji . name } : \` ] ` ;
} ,
NucleusColors : {
red : 0xf27878 ,
yellow : 0xf2d478 ,
green : 0x68d49e
} ,
NucleusColors ,
async getAuditLog (
guild : Discord.Guild ,
event : Discord.GuildAuditLogsResolvable ,
@ -106,6 +108,7 @@ export const Logger = {
throw e ;
}
} ,
async log ( log : LoggerOptions ) : Promise < void > {
if ( ! ( await isLogging ( log . hidden . guild , log . meta . calculateType ) ) ) return ;
const config = await client . database . guilds . read ( log . hidden . guild ) ;
@ -138,17 +141,29 @@ export const Logger = {
)
. setTimestamp ( log . meta . timestamp )
. setColor ( log . meta . color )
. setImage ( log . meta . imageData ? "attachment://extra_log_data.json.base64" : null )
] ;
if ( log . meta . files ) messageOptions . files = log . meta . files ;
if ( log . meta . showDetails ) {
components . addComponents (
new Discord . ButtonBuilder ( )
. setCustomId ( "log:showDetails" )
. setLabel ( "Show Details" )
. setStyle ( Discord . ButtonStyle . Primary )
) ;
if ( log . meta . buttons ) {
const buttons = [ ] ;
for ( const button of log . meta . buttons ) {
buttons . push (
new Discord . ButtonBuilder ( )
. setCustomId ( button . buttonId )
. setLabel ( button . buttonText )
. setStyle ( button . buttonStyle )
) ;
}
components . addComponents ( buttons ) ;
messageOptions . components = [ components ] ;
}
if ( log . meta . imageData ) {
messageOptions . files = [
{
attachment : Buffer.from ( btoa ( log . meta . imageData ) , "utf-8" ) , // Use base 64 to prevent virus scanning (EICAR)
name : "extra_log_data.json.base64"
}
] ;
}
await channel . send ( messageOptions ) ;
}
}