import Command from '../core/command'; import { CommonLibrary, logs, botHasPermission, clean } from '../core/lib'; import { Config, Storage } from '../core/structures'; import { PermissionNames, getPermissionLevel } from '../core/permissions'; import { Permissions } from 'discord.js'; import * as discord from 'discord.js'; 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.", async run($: CommonLibrary): Promise { if (!$.member) return $.channel.send( "Couldn't find a member object for you! Did you make sure you used this in a server?", ); const permLevel = getPermissionLevel($.member); $.channel.send( `${$.author.toString()}, your permission level is \`${ PermissionNames[permLevel] }\` (${permLevel}).`, ); }, 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({ description: 'Set a custom prefix for your guild. Removes your custom prefix if none is provided.', usage: '()', async run($: CommonLibrary): Promise { 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({ async run($: CommonLibrary): Promise { Storage.getGuild($.guild?.id || 'N/A').prefix = $.args[0]; Storage.save(); $.channel.send( `The custom prefix for this guild is now \`${$.args[0]}\`.`, ); }, }), }), }, }), diag: new Command({ description: 'Requests a debug log with the "info" verbosity level.', permission: Command.PERMISSIONS.BOT_SUPPORT, async run($: CommonLibrary): Promise { $.channel.send(getLogBuffer('info')); }, any: new Command({ description: `Select a verbosity to listen to. Available levels: \`[${Object.keys( logs, ).join(', ')}]\``, async run($: CommonLibrary): Promise { 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, async run($: CommonLibrary): Promise { $.channel.send('Setting status to `online`...'); }, any: new Command({ description: `Select a status to set to. Available statuses: \`[${statuses.join( ', ', )}]\`.`, async run($: CommonLibrary): Promise { if (!statuses.includes($.args[0])) return $.channel.send("That status doesn't exist!"); else { $.client.user?.setStatus($.args[0]); $.channel.send(`Setting status to \`${$.args[0]}\`...`); } }, }), }), purge: new Command({ description: 'Purges bot messages.', permission: Command.PERMISSIONS.BOT_SUPPORT, async run($: CommonLibrary): Promise { if ($.message.channel instanceof discord.DMChannel) { return; } $.message.delete(); const msgs = await $.channel.messages.fetch({ limit: 100, }); const travMessages = msgs.filter( (m) => m.author.id === $.client.user?.id, ); await $.message.channel .send(`Found ${travMessages.size} messages to delete.`) .then((m) => m.delete({ timeout: 5000, }), ); await $.message.channel.bulkDelete(travMessages); }, }), clear: new Command({ description: "Clears a given amount of messages.", usage: "", run: "A number was not provided.", number: new Command({ description: "Amount of messages to delete.", async run($: CommonLibrary): Promise { $.message.delete(); const fetched = await $.channel.messages.fetch({ limit: $.args[0], }); /// @ts-ignore $.channel.bulkDelete(fetched) .catch((error: any) => $.channel.send(`Error: ${error}`)); } }) }), eval: new Command({ description: 'Evaluate code.', usage: '', permission: Command.PERMISSIONS.BOT_OWNER, async run($: CommonLibrary): Promise { try { const code = $.args.join(' '); let evaled = eval(code); if (typeof evaled !== 'string') evaled = require('util').inspect(evaled); $.channel.send(clean(evaled), { code: 'x1' }); } catch (err) { $.channel.send(`\`ERROR\` \`\`\`x1\n${clean(err)}\n\`\`\``); } }, }), nick: new Command({ description: "Change the bot's nickname.", permission: Command.PERMISSIONS.BOT_SUPPORT, async run($: CommonLibrary): Promise { const nickName = $.args.join(' '); const trav = $.guild?.members.cache.find( (member) => member.id === $.client.user?.id, ); await trav?.setNickname(nickName); if (botHasPermission($.guild, Permissions.FLAGS.MANAGE_MESSAGES)) $.message.delete({ timeout: 5000 }).catch($.handler.bind($)); $.channel .send(`Nickname set to \`${nickName}\``) .then((m) => m.delete({ timeout: 5000 })); }, }), guilds: new Command({ description: 'Shows a list of all guilds the bot is a member of.', permission: Command.PERMISSIONS.BOT_SUPPORT, async run($: CommonLibrary): Promise { const guildList = $.client.guilds.cache.array().map((e) => e.name); $.channel.send(guildList); }, }), activity: new Command({ description: 'Set the activity of the bot.', permission: Command.PERMISSIONS.BOT_SUPPORT, usage: ' ', async run($: CommonLibrary): Promise { $.client.user?.setActivity('.help', { type: 'LISTENING', }); $.channel.send('Activity set to default.'); }, any: new Command({ description: `Select an activity type to set. Available levels: \`[${activities.join( ', ', )}]\``, async run($: CommonLibrary): Promise { const type = $.args[0]; if (activities.includes(type)) { $.client.user?.setActivity($.args.slice(1).join(' '), { type: $.args[0].toUpperCase(), }); $.channel.send( `Set activity to \`${$.args[0].toUpperCase()}\` \`${$.args .slice(1) .join(' ')}\`.`, ); } else $.channel.send( `Couldn't find an activity type named \`${type}\`! The available types are \`[${activities.join( ', ', )}]\`.`, ); }, }), }), }, });