2021-03-30 10:25:07 +00:00
import Command , { handler } from "../core/command" ;
import { botHasPermission , clean } from "../core/libd" ;
2020-12-15 01:44:28 +00:00
import { Config , Storage } from "../core/structures" ;
import { PermissionNames , getPermissionLevel } from "../core/permissions" ;
import { Permissions } from "discord.js" ;
import * as discord from "discord.js" ;
2021-03-30 08:58:21 +00:00
import { logs } from "../globals" ;
2020-12-15 01:44:28 +00:00
function getLogBuffer ( type : string ) {
return {
files : [
{
attachment : Buffer.alloc ( logs [ type ] . length , logs [ type ] ) ,
name : ` ${ Date . now ( ) } . ${ type } .log `
}
]
} ;
}
const activities = [ "playing" , "listening" , "streaming" , "watching" ] ;
const statuses = [ "online" , "idle" , "dnd" , "invisible" ] ;
export default new Command ( {
description :
"An all-in-one command to do admin stuff. You need to be either an admin of the server or one of the bot's mechanics to use this command." ,
2021-03-30 10:25:07 +00:00
async run ( $ ) {
if ( ! $ . member ) {
$ . channel . send ( "Couldn't find a member object for you! Did you make sure you used this in a server?" ) ;
return ;
}
2020-12-15 01:44:28 +00:00
const permLevel = getPermissionLevel ( $ . member ) ;
$ . channel . send (
2020-12-15 07:56:09 +00:00
` ${ $ . author . toString ( ) } , your permission level is \` ${ PermissionNames [ permLevel ] } \` ( ${ permLevel } ). `
2020-12-15 01:44:28 +00:00
) ;
} ,
subcommands : {
set : new Command ( {
description : "Set different per-guild settings for the bot." ,
run : "You have to specify the option you want to set." ,
permission : Command.PERMISSIONS.ADMIN ,
subcommands : {
prefix : new Command ( {
2020-12-15 07:56:09 +00:00
description : "Set a custom prefix for your guild. Removes your custom prefix if none is provided." ,
2020-12-15 01:44:28 +00:00
usage : "(<prefix>)" ,
2021-03-30 10:25:07 +00:00
async run ( $ ) {
2020-12-15 01:44:28 +00:00
Storage . getGuild ( $ . guild ? . id || "N/A" ) . prefix = null ;
Storage . save ( ) ;
$ . channel . send (
` The custom prefix for this guild has been removed. My prefix is now back to \` ${ Config . prefix } \` . `
) ;
} ,
any : new Command ( {
2021-03-30 10:25:07 +00:00
async run ( $ ) {
2020-12-15 07:56:09 +00:00
Storage . getGuild ( $ . guild ? . id || "N/A" ) . prefix = $ . args [ 0 ] ;
2020-12-15 01:44:28 +00:00
Storage . save ( ) ;
2020-12-15 07:56:09 +00:00
$ . channel . send ( ` The custom prefix for this guild is now \` ${ $ . args [ 0 ] } \` . ` ) ;
2020-12-15 01:44:28 +00:00
}
} )
} )
}
} ) ,
diag : new Command ( {
2020-12-15 07:56:09 +00:00
description : 'Requests a debug log with the "info" verbosity level.' ,
2020-12-15 01:44:28 +00:00
permission : Command.PERMISSIONS.BOT_SUPPORT ,
2021-03-30 10:25:07 +00:00
async run ( $ ) {
2020-12-15 01:44:28 +00:00
$ . channel . send ( getLogBuffer ( "info" ) ) ;
} ,
any : new Command ( {
2020-12-15 07:56:09 +00:00
description : ` Select a verbosity to listen to. Available levels: \` [ ${ Object . keys ( logs ) . join ( ", " ) } ] \` ` ,
2021-03-30 10:25:07 +00:00
async run ( $ ) {
2020-12-15 01:44:28 +00:00
const type = $ . args [ 0 ] ;
if ( type in logs ) $ . channel . send ( getLogBuffer ( type ) ) ;
else
$ . channel . send (
` Couldn't find a verbosity level named \` ${ type } \` ! The available types are \` [ ${ Object . keys (
logs
) . join ( ", " ) } ] \ ` . `
) ;
}
} )
} ) ,
status : new Command ( {
description : "Changes the bot's status." ,
permission : Command.PERMISSIONS.BOT_SUPPORT ,
2021-03-30 10:25:07 +00:00
async run ( $ ) {
2020-12-15 01:44:28 +00:00
$ . channel . send ( "Setting status to `online`..." ) ;
} ,
any : new Command ( {
2020-12-15 07:56:09 +00:00
description : ` Select a status to set to. Available statuses: \` [ ${ statuses . join ( ", " ) } ] \` . ` ,
2021-03-30 10:25:07 +00:00
async run ( $ ) {
if ( ! statuses . includes ( $ . args [ 0 ] ) ) {
$ . channel . send ( "That status doesn't exist!" ) ;
return ;
} else {
2020-12-15 01:44:28 +00:00
$ . client . user ? . setStatus ( $ . args [ 0 ] ) ;
$ . channel . send ( ` Setting status to \` ${ $ . args [ 0 ] } \` ... ` ) ;
}
}
} )
} ) ,
purge : new Command ( {
description : "Purges bot messages." ,
permission : Command.PERMISSIONS.BOT_SUPPORT ,
2021-03-30 10:25:07 +00:00
async run ( $ ) {
2020-12-15 01:44:28 +00:00
if ( $ . message . channel instanceof discord . DMChannel ) {
return ;
}
$ . message . delete ( ) ;
const msgs = await $ . channel . messages . fetch ( {
limit : 100
} ) ;
2020-12-15 07:56:09 +00:00
const travMessages = msgs . filter ( ( m ) = > m . author . id === $ . client . user ? . id ) ;
2020-12-15 01:44:28 +00:00
2020-12-15 07:56:09 +00:00
await $ . message . channel . send ( ` Found ${ travMessages . size } messages to delete. ` ) . then ( ( m ) = >
m . delete ( {
timeout : 5000
} )
) ;
2020-12-15 01:44:28 +00:00
await $ . message . channel . bulkDelete ( travMessages ) ;
}
} ) ,
clear : new Command ( {
description : "Clears a given amount of messages." ,
usage : "<amount>" ,
run : "A number was not provided." ,
number : new Command ( {
description : "Amount of messages to delete." ,
2021-03-30 10:25:07 +00:00
async run ( $ ) {
2021-01-29 17:15:18 +00:00
if ( $ . channel . type === "dm" ) {
await $ . channel . send ( "Can't clear messages in the DMs!" ) ;
return ;
}
2020-12-15 01:44:28 +00:00
$ . message . delete ( ) ;
const fetched = await $ . channel . messages . fetch ( {
limit : $.args [ 0 ]
} ) ;
2021-01-29 17:15:18 +00:00
await $ . channel . bulkDelete ( fetched ) ;
2020-12-15 01:44:28 +00:00
}
} )
} ) ,
eval : new Command ( {
description : "Evaluate code." ,
usage : "<code>" ,
permission : Command.PERMISSIONS.BOT_OWNER ,
2020-12-15 23:29:40 +00:00
// You have to bring everything into scope to use them. AFAIK, there isn't a more maintainable way to do this, but at least TS will let you know if anything gets removed.
2021-03-30 10:25:07 +00:00
async run ( { args , author , channel , client , guild , member , message } ) {
2020-12-15 01:44:28 +00:00
try {
2020-12-15 23:29:40 +00:00
const code = args . join ( " " ) ;
2020-12-15 01:44:28 +00:00
let evaled = eval ( code ) ;
2020-12-15 07:56:09 +00:00
if ( typeof evaled !== "string" ) evaled = require ( "util" ) . inspect ( evaled ) ;
2020-12-15 23:29:40 +00:00
channel . send ( clean ( evaled ) , { code : "js" , split : true } ) ;
2020-12-15 01:44:28 +00:00
} catch ( err ) {
2021-01-26 13:22:23 +00:00
channel . send ( clean ( err ) , { code : "js" , split : true } ) ;
2020-12-15 01:44:28 +00:00
}
}
} ) ,
nick : new Command ( {
description : "Change the bot's nickname." ,
permission : Command.PERMISSIONS.BOT_SUPPORT ,
2021-03-30 10:25:07 +00:00
async run ( $ ) {
2020-12-15 01:44:28 +00:00
const nickName = $ . args . join ( " " ) ;
2021-01-29 19:12:53 +00:00
await $ . guild ? . me ? . setNickname ( nickName ) ;
2020-12-15 07:56:09 +00:00
if ( botHasPermission ( $ . guild , Permissions . FLAGS . MANAGE_MESSAGES ) )
2021-03-30 10:25:07 +00:00
$ . message . delete ( { timeout : 5000 } ) . catch ( handler . bind ( $ ) ) ;
2020-12-15 07:56:09 +00:00
$ . channel . send ( ` Nickname set to \` ${ nickName } \` ` ) . then ( ( m ) = > m . delete ( { timeout : 5000 } ) ) ;
2020-12-15 01:44:28 +00:00
}
} ) ,
guilds : new Command ( {
description : "Shows a list of all guilds the bot is a member of." ,
permission : Command.PERMISSIONS.BOT_SUPPORT ,
2021-03-30 10:25:07 +00:00
async run ( $ ) {
2020-12-15 07:56:09 +00:00
const guildList = $ . client . guilds . cache . array ( ) . map ( ( e ) = > e . name ) ;
2020-12-15 01:44:28 +00:00
$ . channel . send ( guildList ) ;
}
} ) ,
activity : new Command ( {
description : "Set the activity of the bot." ,
permission : Command.PERMISSIONS.BOT_SUPPORT ,
usage : "<type> <string>" ,
2021-03-30 10:25:07 +00:00
async run ( $ ) {
2020-12-15 01:44:28 +00:00
$ . client . user ? . setActivity ( ".help" , {
type : "LISTENING"
} ) ;
$ . channel . send ( "Activity set to default." ) ;
} ,
any : new Command ( {
2020-12-15 07:56:09 +00:00
description : ` Select an activity type to set. Available levels: \` [ ${ activities . join ( ", " ) } ] \` ` ,
2021-03-30 10:25:07 +00:00
async run ( $ ) {
2020-12-15 01:44:28 +00:00
const type = $ . args [ 0 ] ;
if ( activities . includes ( type ) ) {
$ . client . user ? . setActivity ( $ . args . slice ( 1 ) . join ( " " ) , {
type : $ . args [ 0 ] . toUpperCase ( )
} ) ;
$ . channel . send (
2020-12-15 07:56:09 +00:00
` Set activity to \` ${ $ . args [ 0 ] . toUpperCase ( ) } \` \` ${ $ . args . slice ( 1 ) . join ( " " ) } \` . `
2020-12-15 01:44:28 +00:00
) ;
} else
$ . channel . send (
` Couldn't find an activity type named \` ${ type } \` ! The available types are \` [ ${ activities . join (
", "
) } ] \ ` . `
) ;
}
} )
} )
}
} ) ;