2022-12-12 20:23:53 -05:00
import Discord , { SlashCommandBuilder } from 'discord.js' ;
2022-11-17 12:58:19 -05:00
import { TClient } from 'src/client' ;
import si from 'systeminformation' ;
import os from 'node:os' ;
2022-12-12 20:23:53 -05:00
import { version } from 'typescript' ;
2022-11-17 12:58:19 -05:00
import { VERSION } from 'ts-node' ;
export default {
async run ( client : TClient , interaction : Discord.ChatInputCommandInteraction < 'cached' > ) {
2022-11-30 03:34:53 -05:00
await interaction . deferReply ( ) ;
const columns = [ 'Command name' , 'Count' ] ;
const includedCommands = client . commands . filter ( x = > x . uses ) . sort ( ( a , b ) = > b . uses - a . uses ) ;
if ( includedCommands . size == 0 ) return interaction . reply ( ` No commands have been used yet. \ nUptime: ${ client . formatTime ( client . uptime as number , 2 , { longNames : true , commas : true } )} ` ) ;
const nameLength = Math . max ( . . . includedCommands . map ( x = > x . default . data . name . length ) , columns [ 0 ] . length ) + 2 ;
const amountLength = Math . max ( . . . includedCommands . map ( x = > x . uses . toLocaleString ( ) . length ) , columns [ 1 ] . length ) + 1 ;
const rows = [ ` ${ columns [ 0 ] + ' ' . repeat ( nameLength - columns [ 0 ] . length ) } | ${ ' ' . repeat ( amountLength - columns [ 1 ] . length ) + columns [ 1 ] } \ n ` , '-' . repeat ( nameLength ) + '-' . repeat ( amountLength ) + '\n' ] ;
includedCommands . forEach ( command = > {
const name = command . default . data . name ;
const count = command . uses . toString ( ) ;
2022-12-17 08:35:08 -05:00
rows . push ( ` ${ name + '_' . repeat ( nameLength - name . length ) } ${ '_' . repeat ( amountLength - count . length ) + count } \ n ` ) ;
2022-11-30 03:34:53 -05:00
} ) ;
const embed = new client . embed ( ) . setColor ( client . config . embedColor ) . setTitle ( 'Statistics: Command Usage' )
. setDescription ( [
'List of commands that have been used in this session, ordered by amount of use. Table contains command name and amount of uses.' ,
` Total amount of commands used in this session: ${ client . commands . filter ( x = > x . uses ) . map ( x = > x . uses ) . reduce ( ( a , b ) = > a + b , 0 ) } `
] . join ( '\n' ) )
if ( rows . join ( '' ) . length > 1024 ) {
let fieldValue = '' ;
rows . forEach ( row = > {
if ( fieldValue . length + row . length > 1024 ) {
embed . addFields ( { name : '\u200b' , value : ` \` \` \` \ n ${ fieldValue } \` \` \` ` } ) ;
fieldValue = row ;
} else {
fieldValue += row ;
}
2022-11-17 12:58:19 -05:00
} ) ;
2022-11-30 03:34:53 -05:00
embed . addFields ( { name : '\u200b' , value : ` \` \` \` \ n ${ fieldValue } \` \` \` ` } ) ;
} else {
embed . addFields ( { name : '\u200b' , value : ` \` \` \` \ n ${ rows . join ( '' ) } \` \` \` ` } )
} ;
// Bytes conversion
function formatBytes ( bytes , decimals = 2 ) {
if ( bytes === 0 ) return '0 Bytes' ;
const k = 1024 ;
const dm = decimals < 0 ? 0 : decimals ;
const sizes = [ 'Bytes' , 'KB' , 'MB' , 'GB' ] ;
const i = Math . floor ( Math . log ( bytes ) / Math . log ( k ) ) ;
return parseFloat ( ( bytes / Math . pow ( k , i ) ) . toFixed ( dm ) ) + ' ' + sizes [ i ] ;
}
2022-12-12 20:23:53 -05:00
var DJSver = require ( 'discord.js' ) . version ;
2022-11-30 03:34:53 -05:00
const cpu = await si . cpu ( ) ;
const ram = await si . mem ( ) ;
const osInfo = await si . osInfo ( ) ;
const currentLoad = await si . currentLoad ( ) ;
const embed1 = new client . embed ( ) . setColor ( client . config . embedColor ) . setTitle ( 'Statistics: Host Info' ) . setDescription ( [
` > __Dependencies__ ` ,
2022-12-12 20:23:53 -05:00
` **TypeScript:** ${ version } ` ,
2022-11-30 03:34:53 -05:00
` **TS-Node:** ${ VERSION } ` ,
` **NodeJS:** ${ process . version } ` ,
2022-12-12 20:23:53 -05:00
` **DiscordJS:** ${ DJSver } ` ,
2022-11-30 03:34:53 -05:00
` > __Host__ ` ,
` **Operating System:** ${ osInfo . distro + ' ' + osInfo . release } ` ,
2022-12-12 20:23:53 -05:00
` **CPU:** ${ cpu . manufacturer } ${ cpu . brand } ` ,
2022-11-30 03:34:53 -05:00
` **Memory:** ${ formatBytes ( ram . used ) } / ${ formatBytes ( ram . total ) } ` ,
` **NodeJS:** ${ formatBytes ( process . memoryUsage ( ) . heapUsed ) } / ${ formatBytes ( process . memoryUsage ( ) . heapTotal ) } ` ,
` **Load Usage:** \ nUser: ${ currentLoad . currentLoadUser . toFixed ( 1 ) } % \ nSystem: ${ currentLoad . currentLoadSystem . toFixed ( 1 ) } % ` ,
` **Uptime:** \ nHost: ${ client . formatTime ( ( os . uptime ( ) * 1000 ) , 2 , { longNames : true , commas : true } )} \ nBot: ${ client . formatTime ( client . uptime as number , 2 , { commas : true , longNames : true } )} `
] . join ( '\n' ) )
2022-12-17 08:35:08 -05:00
. setFooter ( { text : ` Load time: ${ client . formatTime ( Date . now ( ) - interaction . createdTimestamp , 2 , { longNames : true , commas : true } )} ` } ) ;
2022-11-30 03:34:53 -05:00
interaction . editReply ( { embeds : [ embed , embed1 ] } ) ;
2022-11-17 12:58:19 -05:00
} ,
data : new SlashCommandBuilder ( )
. setName ( 'statistics' )
. setDescription ( 'See a list of commands ordered by their usage or bot stats' )
2022-11-29 09:22:26 -05:00
. setDMPermission ( false )
2022-11-17 12:58:19 -05:00
}