diff options
Diffstat (limited to 'src/commands')
-rw-r--r-- | src/commands/dev/eval.ts (renamed from src/commands/owner/eval.ts) | 61 | ||||
-rw-r--r-- | src/commands/dev/reload.ts (renamed from src/commands/owner/reload.ts) | 5 | ||||
-rw-r--r-- | src/commands/dev/setLevel.ts (renamed from src/commands/owner/setlevel.ts) | 23 | ||||
-rw-r--r-- | src/commands/info/botInfo.ts (renamed from src/commands/info/botinfo.ts) | 26 | ||||
-rw-r--r-- | src/commands/info/help.ts | 52 | ||||
-rw-r--r-- | src/commands/info/ping.ts | 35 | ||||
-rw-r--r-- | src/commands/info/pronouns.ts | 6 | ||||
-rw-r--r-- | src/commands/moderation/ban.ts | 84 | ||||
-rw-r--r-- | src/commands/moderation/kick.ts | 40 | ||||
-rw-r--r-- | src/commands/moderation/modlog.ts | 26 | ||||
-rw-r--r-- | src/commands/moderation/role.ts | 112 | ||||
-rw-r--r-- | src/commands/moderation/warn.ts | 22 | ||||
-rw-r--r-- | src/commands/moulberry-bush/capePerms.ts (renamed from src/commands/moulberry-bush/capeperms.ts) | 34 | ||||
-rw-r--r-- | src/commands/moulberry-bush/giveawayPing.ts (renamed from src/commands/moulberry-bush/giveawayping.ts) | 34 | ||||
-rw-r--r-- | src/commands/moulberry-bush/level.ts | 8 | ||||
-rw-r--r-- | src/commands/moulberry-bush/rule.ts | 67 | ||||
-rw-r--r-- | src/commands/server-config/prefix.ts (renamed from src/commands/admin/prefix.ts) | 28 |
17 files changed, 181 insertions, 482 deletions
diff --git a/src/commands/owner/eval.ts b/src/commands/dev/eval.ts index a63b977..cfe75cc 100644 --- a/src/commands/owner/eval.ts +++ b/src/commands/dev/eval.ts @@ -1,18 +1,15 @@ /* eslint-disable @typescript-eslint/no-unused-vars */ -import { BotCommand } from '../../lib/extensions/BotCommand'; +import { BushCommand } from '../../lib/extensions/BushCommand'; import { MessageEmbed, Message } from 'discord.js'; import { inspect, promisify } from 'util'; import { exec } from 'child_process'; const clean = (text) => { - if (typeof text === 'string') - return text - .replace(/`/g, '`' + String.fromCharCode(8203)) - .replace(/@/g, '@' + String.fromCharCode(8203)); + if (typeof text === 'string') return text.replace(/`/g, '`' + String.fromCharCode(8203)).replace(/@/g, '@' + String.fromCharCode(8203)); else return text; }; -export default class EvalCommand extends BotCommand { +export default class EvalCommand extends BushCommand { public constructor() { super('eval', { aliases: ['eval', 'ev'], @@ -50,10 +47,7 @@ export default class EvalCommand extends BotCommand { }); } - public async exec( - message: Message, - { depth, code, silent }: { depth: number; code: string; silent: boolean } - ): Promise<void> { + public async exec(message: Message, { depth, code, silent }: { depth: number; code: string; silent: boolean }): Promise<void> { const embed: MessageEmbed = new MessageEmbed(); try { @@ -70,58 +64,27 @@ export default class EvalCommand extends BotCommand { output = eval(code); output = await output; if (typeof output !== 'string') output = inspect(output, { depth }); - output = output.replace( - new RegExp(this.client.token, 'g'), - '[token omitted]' - ); + output = output.replace(new RegExp(this.client.token, 'g'), '[token omitted]'); output = clean(output); embed .setTitle('✅ Evaled code successfully') - .addField( - '📥 Input', - code.length > 1012 - ? 'Too large to display. Hastebin: ' + - (await this.client.util.haste(code)) - : '```js\n' + code + '```' - ) - .addField( - '📤 Output', - output.length > 1012 - ? 'Too large to display. Hastebin: ' + - (await this.client.util.haste(output)) - : '```js\n' + output + '```' - ) + .addField('📥 Input', code.length > 1012 ? 'Too large to display. Hastebin: ' + (await this.client.util.haste(code)) : '```js\n' + code + '```') + .addField('📤 Output', output.length > 1012 ? 'Too large to display. Hastebin: ' + (await this.client.util.haste(output)) : '```js\n' + output + '```') .setColor('#66FF00') - .setFooter( - message.author.username, - message.author.displayAvatarURL({ dynamic: true }) - ) + .setFooter(message.author.username, message.author.displayAvatarURL({ dynamic: true })) .setTimestamp(); } catch (e) { embed .setTitle('❌ Code was not able to be evaled') - .addField( - '📥 Input', - code.length > 1012 - ? 'Too large to display. Hastebin: ' + - (await this.client.util.haste(code)) - : '```js\n' + code + '```' - ) + .addField('📥 Input', code.length > 1012 ? 'Too large to display. Hastebin: ' + (await this.client.util.haste(code)) : '```js\n' + code + '```') .addField( '📤 Output', e.length > 1012 - ? 'Too large to display. Hastebin: ' + - (await this.client.util.haste(e)) - : '```js\n' + - e + - '```Full stack:' + - (await this.client.util.haste(e.stack)) + ? 'Too large to display. Hastebin: ' + (await this.client.util.haste(e)) + : '```js\n' + e + '```Full stack:' + (await this.client.util.haste(e.stack)) ) .setColor('#FF0000') - .setFooter( - message.author.username, - message.author.displayAvatarURL({ dynamic: true }) - ) + .setFooter(message.author.username, message.author.displayAvatarURL({ dynamic: true })) .setTimestamp(); } if (!silent) { diff --git a/src/commands/owner/reload.ts b/src/commands/dev/reload.ts index 8ba6160..36c6fd7 100644 --- a/src/commands/owner/reload.ts +++ b/src/commands/dev/reload.ts @@ -1,14 +1,15 @@ -import { BotCommand } from '../../lib/extensions/BotCommand'; +import { BushCommand } from '../../lib/extensions/BushCommand'; import { stripIndent } from 'common-tags'; import { Message } from 'discord.js'; import { CommandInteraction } from 'discord.js'; import { SlashCommandOption } from '../../lib/extensions/Util'; import { ApplicationCommandOptionType } from 'discord-api-types'; -export default class ReloadCommand extends BotCommand { +export default class ReloadCommand extends BushCommand { constructor() { super('reload', { aliases: ['reload'], + category: 'dev', description: { content: 'Reloads the bot', usage: 'reload', diff --git a/src/commands/owner/setlevel.ts b/src/commands/dev/setLevel.ts index 6987385..3a1bc85 100644 --- a/src/commands/owner/setlevel.ts +++ b/src/commands/dev/setLevel.ts @@ -2,19 +2,20 @@ import { ApplicationCommandOptionType } from 'discord-api-types'; import { CommandInteraction } from 'discord.js'; import { User } from 'discord.js'; import { Message } from 'discord.js'; -import { BotCommand } from '../../lib/extensions/BotCommand'; +import { BushCommand } from '../../lib/extensions/BushCommand'; import { SlashCommandOption } from '../../lib/extensions/Util'; import { Level } from '../../lib/models'; import AllowedMentions from '../../lib/utils/AllowedMentions'; -export default class SetLevelCommand extends BotCommand { +export default class SetLevelCommand extends BushCommand { constructor() { super('setlevel', { aliases: ['setlevel'], + category: 'dev', description: { content: 'Sets the level of a user', usage: 'setlevel <user> <level>', - examples: ['setlevel @Moulberry 69'] + examples: ['setlevel @Moulberry 69'] //nice }, args: [ { @@ -22,8 +23,7 @@ export default class SetLevelCommand extends BotCommand { type: 'user', prompt: { start: 'What user would you like to change the level of?', - retry: - 'Invalid user. What user would you like to change the level of?' + retry: 'Invalid user. What user would you like to change the level of?' } }, { @@ -67,22 +67,13 @@ export default class SetLevelCommand extends BotCommand { return `Successfully set level of <@${user.id}> to \`${level}\` (\`${levelEntry.xp}\` XP)`; } - async exec( - message: Message, - { user, level }: { user: User; level: number } - ): Promise<void> { + async exec(message: Message, { user, level }: { user: User; level: number }): Promise<void> { await message.util.send(await this.setLevel(user, level), { allowedMentions: AllowedMentions.none() }); } - async execSlash( - message: CommandInteraction, - { - user, - level - }: { user: SlashCommandOption<void>; level: SlashCommandOption<number> } - ): Promise<void> { + async execSlash(message: CommandInteraction, { user, level }: { user: SlashCommandOption<void>; level: SlashCommandOption<number> }): Promise<void> { await message.reply(await this.setLevel(user.user, level.value), { allowedMentions: AllowedMentions.none() }); diff --git a/src/commands/info/botinfo.ts b/src/commands/info/botInfo.ts index 8f5f055..ebbd0c9 100644 --- a/src/commands/info/botinfo.ts +++ b/src/commands/info/botInfo.ts @@ -1,11 +1,12 @@ import { MessageEmbed, Message, CommandInteraction } from 'discord.js'; -import { BotCommand } from '../../lib/extensions/BotCommand'; +import { BushCommand } from '../../lib/extensions/BushCommand'; import { duration } from 'moment'; -export default class BotInfoCommand extends BotCommand { +export default class BotInfoCommand extends BushCommand { constructor() { super('botinfo', { aliases: ['botinfo'], + category: 'info', description: { content: 'Shows information about the bot', usage: 'botinfo', @@ -15,15 +16,9 @@ export default class BotInfoCommand extends BotCommand { } private async generateEmbed(): Promise<MessageEmbed> { - const owners = (await this.client.util.mapIDs(this.client.ownerID)) - .map((u) => u.tag) - .join('\n'); - const currentCommit = ( - await this.client.util.shell('git rev-parse HEAD') - ).stdout.replace('\n', ''); - const repoUrl = ( - await this.client.util.shell('git remote get-url origin') - ).stdout.replace('\n', ''); + const owners = (await this.client.util.mapIDs(this.client.ownerID)).map((u) => u.tag).join('\n'); + const currentCommit = (await this.client.util.shell('git rev-parse HEAD')).stdout.replace('\n', ''); + const repoUrl = (await this.client.util.shell('git remote get-url origin')).stdout.replace('\n', ''); const embed = new MessageEmbed() .setTitle('Bot Info:') .addFields([ @@ -34,9 +29,7 @@ export default class BotInfoCommand extends BotCommand { }, { name: 'Uptime', - value: this.client.util.capitalize( - duration(this.client.uptime, 'milliseconds').humanize() - ) + value: this.client.util.capitalize(duration(this.client.uptime, 'milliseconds').humanize()) }, { name: 'User count', @@ -45,10 +38,7 @@ export default class BotInfoCommand extends BotCommand { }, { name: 'Current commit', - value: `[${currentCommit.substring( - 0, - 7 - )}](${repoUrl}/commit/${currentCommit})` + value: `[${currentCommit.substring(0, 7)}](${repoUrl}/commit/${currentCommit})` } ]) .setTimestamp(); diff --git a/src/commands/info/help.ts b/src/commands/info/help.ts index 116669c..7f6c8f4 100644 --- a/src/commands/info/help.ts +++ b/src/commands/info/help.ts @@ -1,14 +1,15 @@ import { Message, MessageEmbed } from 'discord.js'; -import { BotCommand } from '../../lib/extensions/BotCommand'; +import { BushCommand } from '../../lib/extensions/BushCommand'; import { stripIndent } from 'common-tags'; import { ApplicationCommandOptionType } from 'discord-api-types'; import { CommandInteraction } from 'discord.js'; import { SlashCommandOption } from '../../lib/extensions/Util'; -export default class HelpCommand extends BotCommand { +export default class HelpCommand extends BushCommand { constructor() { super('help', { aliases: ['help'], + category: 'info', description: { content: 'Shows the commands of the bot', usage: 'help', @@ -32,7 +33,7 @@ export default class HelpCommand extends BotCommand { }); } - private generateEmbed(command?: BotCommand): MessageEmbed { + private generateEmbed(command?: BushCommand): MessageEmbed { const prefix = this.handler.prefix; if (!command) { const embed = new MessageEmbed() @@ -42,15 +43,11 @@ export default class HelpCommand extends BotCommand { For additional info on a command, type \`${prefix}help <command>\` ` ) - .setFooter( - `For more information about a command use "${this.client.config.prefix}help <command>"` - ) + .setFooter(`For more information about a command use "${this.client.config.prefix}help <command>"`) .setTimestamp(); for (const category of this.handler.categories.values()) { embed.addField( - `${category.id.replace(/(\b\w)/gi, (lc): string => - lc.toUpperCase() - )}`, + `${category.id.replace(/(\b\w)/gi, (lc): string => lc.toUpperCase())}`, `${category .filter((cmd): boolean => cmd.aliases.length > 0) .map((cmd): string => `\`${cmd.aliases[0]}\``) @@ -61,45 +58,22 @@ export default class HelpCommand extends BotCommand { } else { const embed = new MessageEmbed() .setColor([155, 200, 200]) - .setTitle( - `\`${command.description.usage ? command.description.usage : ''}\`` - ) - .addField( - 'Description', - `${command.description.content ? command.description.content : ''} ${ - command.ownerOnly ? '\n__Owner Only__' : '' - }` - ); + .setTitle(`\`${command.description.usage ? command.description.usage : ''}\``) + .addField('Description', `${command.description.content ? command.description.content : ''} ${command.ownerOnly ? '\n__Owner Only__' : ''}`); - if (command.aliases.length > 1) - embed.addField('Aliases', `\`${command.aliases.join('` `')}\``, true); - if (command.description.examples && command.description.examples.length) - embed.addField( - 'Examples', - `\`${command.description.examples.join('`\n`')}\``, - true - ); + if (command.aliases.length > 1) embed.addField('Aliases', `\`${command.aliases.join('` `')}\``, true); + if (command.description.examples && command.description.examples.length) embed.addField('Examples', `\`${command.description.examples.join('`\n`')}\``, true); return embed; } } - public async exec( - message: Message, - { command }: { command: BotCommand } - ): Promise<void> { + public async exec(message: Message, { command }: { command: BushCommand }): Promise<void> { await message.util.send(this.generateEmbed(command)); } - public async execSlash( - message: CommandInteraction, - { command }: { command: SlashCommandOption<string> } - ): Promise<void> { + public async execSlash(message: CommandInteraction, { command }: { command: SlashCommandOption<string> }): Promise<void> { if (command) { - await message.reply( - this.generateEmbed( - this.handler.findCommand(command.value) as BotCommand - ) - ); + await message.reply(this.generateEmbed(this.handler.findCommand(command.value) as BushCommand)); } else { await message.reply(this.generateEmbed()); } diff --git a/src/commands/info/ping.ts b/src/commands/info/ping.ts index e51867f..b130e6d 100644 --- a/src/commands/info/ping.ts +++ b/src/commands/info/ping.ts @@ -1,12 +1,13 @@ import { CommandInteraction } from 'discord.js'; import { Message } from 'discord.js'; import { MessageEmbed } from 'discord.js'; -import { BotCommand } from '../../lib/extensions/BotCommand'; +import { BushCommand } from '../../lib/extensions/BushCommand'; -export default class PingCommand extends BotCommand { +export default class PingCommand extends BushCommand { constructor() { super('ping', { aliases: ['ping'], + category: 'info', description: { content: 'Gets the latency of the bot', usage: 'ping', @@ -17,23 +18,14 @@ export default class PingCommand extends BotCommand { public async exec(message: Message): Promise<void> { const sentMessage = await message.util.send('Pong!'); - const timestamp: number = message.editedTimestamp - ? message.editedTimestamp - : message.createdTimestamp; - const botLatency = `\`\`\`\n ${Math.floor( - sentMessage.createdTimestamp - timestamp - )}ms \`\`\``; - const apiLatency = `\`\`\`\n ${Math.round( - message.client.ws.ping - )}ms \`\`\``; + const timestamp: number = message.editedTimestamp ? message.editedTimestamp : message.createdTimestamp; + const botLatency = `\`\`\`\n ${Math.floor(sentMessage.createdTimestamp - timestamp)}ms \`\`\``; + const apiLatency = `\`\`\`\n ${Math.round(message.client.ws.ping)}ms \`\`\``; const embed = new MessageEmbed() .setTitle('Pong! 🏓') .addField('Bot Latency', botLatency, true) .addField('API Latency', apiLatency, true) - .setFooter( - message.author.username, - message.author.displayAvatarURL({ dynamic: true }) - ) + .setFooter(message.author.username, message.author.displayAvatarURL({ dynamic: true })) .setTimestamp(); await sentMessage.edit({ content: null, @@ -44,21 +36,14 @@ export default class PingCommand extends BotCommand { public async execSlash(message: CommandInteraction): Promise<void> { const timestamp1 = message.createdTimestamp; await message.reply('Pong!'); - const timestamp2 = await message - .fetchReply() - .then((m) => (m as Message).createdTimestamp); - const botLatency = `\`\`\`\n ${Math.floor( - timestamp2 - timestamp1 - )}ms \`\`\``; + const timestamp2 = await message.fetchReply().then((m) => (m as Message).createdTimestamp); + const botLatency = `\`\`\`\n ${Math.floor(timestamp2 - timestamp1)}ms \`\`\``; const apiLatency = `\`\`\`\n ${Math.round(this.client.ws.ping)}ms \`\`\``; const embed = new MessageEmbed() .setTitle('Pong! 🏓') .addField('Bot Latency', botLatency, true) .addField('API Latency', apiLatency, true) - .setFooter( - message.user.username, - message.user.displayAvatarURL({ dynamic: true }) - ) + .setFooter(message.user.username, message.user.displayAvatarURL({ dynamic: true })) .setTimestamp(); await message.editReply({ content: null, diff --git a/src/commands/info/pronouns.ts b/src/commands/info/pronouns.ts index 97cca34..2c1d5f2 100644 --- a/src/commands/info/pronouns.ts +++ b/src/commands/info/pronouns.ts @@ -1,4 +1,4 @@ -import { BotCommand } from '../../lib/extensions/BotCommand'; +import { BushCommand } from '../../lib/extensions/BushCommand'; import { User, Message, MessageEmbed } from 'discord.js'; import got, { HTTPError } from 'got'; import { CommandInteraction } from 'discord.js'; @@ -30,11 +30,11 @@ export const pronounMapping = { }; export type pronounsType = keyof typeof pronounMapping; -export default class PronounsCommand extends BotCommand { +export default class PronounsCommand extends BushCommand { constructor() { super('pronouns', { aliases: ['pronouns', 'pronoun'], - category: 'utilities', + category: 'info', description: { usage: 'pronouns <user>', examples: ['pronouns IRONM00N'], diff --git a/src/commands/moderation/ban.ts b/src/commands/moderation/ban.ts index 556dd6b..e59a528 100644 --- a/src/commands/moderation/ban.ts +++ b/src/commands/moderation/ban.ts @@ -1,6 +1,6 @@ import { User } from 'discord.js'; import { Guild } from '../../lib/models'; -import { BotCommand } from '../../lib/extensions/BotCommand'; +import { BushCommand } from '../../lib/extensions/BushCommand'; import { Ban, Modlog, ModlogType } from '../../lib/models'; import moment from 'moment'; import { Message } from 'discord.js'; @@ -15,13 +15,13 @@ const durationAliases: Record<string, string[]> = { minutes: ['m', 'min', 'mins', 'minutes', 'minute'], months: ['mo', 'month', 'months'] }; -const durationRegex = - /(?:(\d+)(d(?:ays?)?|h(?:ours?|rs?)?|m(?:inutes?|ins?)?|mo(?:nths?)?|w(?:eeks?|ks?)?)(?: |$))/g; +const durationRegex = /(?:(\d+)(d(?:ays?)?|h(?:ours?|rs?)?|m(?:inutes?|ins?)?|mo(?:nths?)?|w(?:eeks?|ks?)?)(?: |$))/g; -export default class PrefixCommand extends BotCommand { +export default class BanCommand extends BushCommand { constructor() { super('ban', { aliases: ['ban'], + category: 'moderation', args: [ { id: 'user', @@ -44,13 +44,9 @@ export default class PrefixCommand extends BotCommand { clientPermissions: ['BAN_MEMBERS'], userPermissions: ['BAN_MEMBERS'], description: { - content: - 'Ban a member and log it in modlogs (with optional time to unban)', + content: 'Ban a member and log it in modlogs (with optional time to unban)', usage: 'ban <member> <reason> [--time]', - examples: [ - 'ban @Tyman being cool', - 'ban @Tyman being cool --time 7days' - ] + examples: ['ban @Tyman being cool', 'ban @Tyman being cool --time 7days'] }, slashCommandOptions: [ { @@ -68,19 +64,13 @@ export default class PrefixCommand extends BotCommand { { type: ApplicationCommandOptionType.STRING, name: 'time', - description: - 'The time the user should be banned for (default permanent)', + description: 'The time the user should be banned for (default permanent)', required: false } ] }); } - async *genResponses( - message: Message | CommandInteraction, - user: User, - reason?: string, - time?: string - ): AsyncIterable<string> { + async *genResponses(message: Message | CommandInteraction, user: User, reason?: string, time?: string): AsyncIterable<string> { const duration = moment.duration(); let modlogEnry: Modlog; let banEntry: Ban; @@ -103,14 +93,9 @@ export default class PrefixCommand extends BotCommand { return; } for (const part of parsed) { - const translated = Object.keys(durationAliases).find((k) => - durationAliases[k].includes(part[2]) - ); + const translated = Object.keys(durationAliases).find((k) => durationAliases[k].includes(part[2])); translatedTime.push(part[1] + ' ' + translated); - duration.add( - Number(part[1]), - translated as 'weeks' | 'days' | 'hours' | 'months' | 'minutes' - ); + duration.add(Number(part[1]), translated as 'weeks' | 'days' | 'hours' | 'months' | 'minutes'); } modlogEnry = Modlog.build({ user: user.id, @@ -118,10 +103,7 @@ export default class PrefixCommand extends BotCommand { reason, type: ModlogType.TEMPBAN, duration: duration.asMilliseconds(), - moderator: - message instanceof CommandInteraction - ? message.user.id - : message.author.id + moderator: message instanceof CommandInteraction ? message.user.id : message.author.id }); banEntry = Ban.build({ user: user.id, @@ -136,10 +118,7 @@ export default class PrefixCommand extends BotCommand { guild: message.guild.id, reason, type: ModlogType.BAN, - moderator: - message instanceof CommandInteraction - ? message.user.id - : message.author.id + moderator: message instanceof CommandInteraction ? message.user.id : message.author.id }); banEntry = Ban.build({ user: user.id, @@ -157,27 +136,17 @@ export default class PrefixCommand extends BotCommand { } try { await user.send( - `You were banned in ${message.guild.name} ${ - translatedTime.length >= 1 - ? `for ${translatedTime.join(', ')}` - : 'permanently' - } with reason \`${reason || 'No reason given'}\`` + `You were banned in ${message.guild.name} ${translatedTime.length >= 1 ? `for ${translatedTime.join(', ')}` : 'permanently'} with reason \`${ + reason || 'No reason given' + }\`` ); } catch (e) { yield 'Error sending message to user'; } await message.guild.members.ban(user, { - reason: `Banned by ${ - message instanceof CommandInteraction - ? message.user.tag - : message.author.tag - } with ${reason ? `reason ${reason}` : 'no reason'}` + reason: `Banned by ${message instanceof CommandInteraction ? message.user.tag : message.author.tag} with ${reason ? `reason ${reason}` : 'no reason'}` }); - yield `Banned <@!${user.id}> ${ - translatedTime.length >= 1 - ? `for ${translatedTime.join(', ')}` - : 'permanently' - } with reason \`${reason || 'No reason given'}\``; + yield `Banned <@!${user.id}> ${translatedTime.length >= 1 ? `for ${translatedTime.join(', ')}` : 'permanently'} with reason \`${reason || 'No reason given'}\``; } catch { yield 'Error banning :/'; await banEntry.destroy(); @@ -185,16 +154,8 @@ export default class PrefixCommand extends BotCommand { return; } } - async exec( - message: Message, - { user, reason, time }: { user: User; reason?: string; time?: string } - ): Promise<void> { - for await (const response of this.genResponses( - message, - user, - reason, - time - )) { + async exec(message: Message, { user, reason, time }: { user: User; reason?: string; time?: string }): Promise<void> { + for await (const response of this.genResponses(message, user, reason, time)) { await message.util.send(response); } } @@ -211,12 +172,7 @@ export default class PrefixCommand extends BotCommand { time: SlashCommandOption<string>; } ): Promise<void> { - for await (const response of this.genResponses( - message, - user.user, - reason?.value, - time?.value - )) { + for await (const response of this.genResponses(message, user.user, reason?.value, time?.value)) { await message.reply(response); } } diff --git a/src/commands/moderation/kick.ts b/src/commands/moderation/kick.ts index f31047e..182485a 100644 --- a/src/commands/moderation/kick.ts +++ b/src/commands/moderation/kick.ts @@ -1,13 +1,14 @@ -import { BotCommand } from '../../lib/extensions/BotCommand'; +import { BushCommand } from '../../lib/extensions/BushCommand'; import { Guild, Modlog, ModlogType } from '../../lib/models'; import { GuildMember, Message } from 'discord.js'; import { ApplicationCommandOptionType } from 'discord-api-types'; import { CommandInteraction } from 'discord.js'; -export default class KickCommand extends BotCommand { +export default class KickCommand extends BushCommand { constructor() { super('kick', { aliases: ['kick'], + category: 'moderation', args: [ { id: 'user', @@ -45,11 +46,7 @@ export default class KickCommand extends BotCommand { }); } - private async *genResponses( - message: Message | CommandInteraction, - user: GuildMember, - reason?: string - ): AsyncIterable<string> { + private async *genResponses(message: Message | CommandInteraction, user: GuildMember, reason?: string): AsyncIterable<string> { let modlogEnry: Modlog; // Create guild entry so postgres doesn't get mad when I try and add a modlog entry await Guild.findOrCreate({ @@ -64,8 +61,7 @@ export default class KickCommand extends BotCommand { modlogEnry = Modlog.build({ user: user.id, guild: message.guild.id, - moderator: - message instanceof Message ? message.author.id : message.user.id, + moderator: message instanceof Message ? message.author.id : message.user.id, type: ModlogType.KICK, reason }); @@ -76,43 +72,27 @@ export default class KickCommand extends BotCommand { return; } try { - await user.send( - `You were kicked in ${message.guild.name} with reason \`${ - reason || 'No reason given' - }\`` - ); + await user.send(`You were kicked in ${message.guild.name} with reason \`${reason || 'No reason given'}\``); } catch (e) { yield 'Error sending message to user'; } try { - await user.kick( - `Kicked by ${ - message instanceof Message ? message.author.tag : message.user.tag - } with ${reason ? `reason ${reason}` : 'no reason'}` - ); + await user.kick(`Kicked by ${message instanceof Message ? message.author.tag : message.user.tag} with ${reason ? `reason ${reason}` : 'no reason'}`); } catch { yield 'Error kicking :/'; await modlogEnry.destroy(); return; } - yield `Kicked <@!${user.id}> with reason \`${ - reason || 'No reason given' - }\``; + yield `Kicked <@!${user.id}> with reason \`${reason || 'No reason given'}\``; } - async exec( - message: Message, - { user, reason }: { user: GuildMember; reason?: string } - ): Promise<void> { + async exec(message: Message, { user, reason }: { user: GuildMember; reason?: string }): Promise<void> { for await (const response of this.genResponses(message, user, reason)) { await message.util.send(response); } } - async execSlash( - message: CommandInteraction, - { user, reason }: { user: GuildMember; reason?: string } - ): Promise<void> { + async execSlash(message: CommandInteraction, { user, reason }: { user: GuildMember; reason?: string }): Promise<void> { for await (const response of this.genResponses(message, user, reason)) { await message.reply(response); } diff --git a/src/commands/moderation/modlog.ts b/src/commands/moderation/modlog.ts index 320c6b4..806c00a 100644 --- a/src/commands/moderation/modlog.ts +++ b/src/commands/moderation/modlog.ts @@ -1,4 +1,4 @@ -import { BotCommand } from '../../lib/extensions/BotCommand'; +import { BushCommand } from '../../lib/extensions/BushCommand'; import { Message } from 'discord.js'; import { Modlog } from '../../lib/models'; import { MessageEmbed } from 'discord.js'; @@ -6,10 +6,11 @@ import moment from 'moment'; import { stripIndent } from 'common-tags'; import { Argument } from 'discord-akairo'; -export default class ModlogCommand extends BotCommand { +export default class ModlogCommand extends BushCommand { constructor() { super('modlog', { aliases: ['modlog', 'modlogs'], + category: 'moderation', args: [ { id: 'search', @@ -52,10 +53,7 @@ export default class ModlogCommand extends BotCommand { return { search, page }; } } - async exec( - message: Message, - { search, page }: { search: string; page: number } - ): Promise<void> { + async exec(message: Message, { search, page }: { search: string; page: number }): Promise<void> { const foundUser = await this.client.util.resolveUserAsync(search); if (foundUser) { const logs = await Modlog.findAll({ @@ -72,11 +70,7 @@ export default class ModlogCommand extends BotCommand { Type: ${log.type.toLowerCase()} User: <@!${log.user}> (${log.user}) Moderator: <@!${log.moderator}> (${log.moderator}) - Duration: ${ - log.duration - ? moment.duration(log.duration, 'milliseconds').humanize() - : 'N/A' - } + Duration: ${log.duration ? moment.duration(log.duration, 'milliseconds').humanize() : 'N/A'} Reason: ${log.reason || 'None given'} ${this.client.util.ordinal(logs.indexOf(log) + 1)} action `); @@ -86,9 +80,7 @@ export default class ModlogCommand extends BotCommand { (e, i) => new MessageEmbed({ title: `Modlogs page ${i + 1}`, - description: e.join( - '\n-------------------------------------------------------\n' - ), + description: e.join('\n-------------------------------------------------------\n'), footer: { text: `Page ${i + 1}/${chunked.length}` } @@ -118,11 +110,7 @@ export default class ModlogCommand extends BotCommand { }, { name: 'Duration', - value: `${ - entry.duration - ? moment.duration(entry.duration, 'milliseconds').humanize() - : 'N/A' - }`, + value: `${entry.duration ? moment.duration(entry.duration, 'milliseconds').humanize() : 'N/A'}`, inline: true }, { diff --git a/src/commands/moderation/role.ts b/src/commands/moderation/role.ts index 2a67e5b..0c7d7db 100644 --- a/src/commands/moderation/role.ts +++ b/src/commands/moderation/role.ts @@ -1,34 +1,20 @@ /* eslint-disable @typescript-eslint/no-empty-function */ -import { BotCommand } from '../../lib/extensions/BotCommand'; +import { BushCommand } from '../../lib/extensions/BushCommand'; import AllowedMentions from '../../lib/utils/AllowedMentions'; import { Message, Role, GuildMember } from 'discord.js'; import { ApplicationCommandOptionType } from 'discord-api-types'; -export default class RoleCommand extends BotCommand { +export default class RoleCommand extends BushCommand { private roleWhitelist: Record<string, string[]> = { 'Partner': ['*', 'Admin Perms', 'Sr. Moderator', 'Moderator'], - 'Suggester': [ - '*', - 'Admin Perms', - 'Sr. Moderator', - 'Moderator', - 'Helper', - 'Trial Helper', - 'Contributor' - ], + 'Suggester': ['*', 'Admin Perms', 'Sr. Moderator', 'Moderator', 'Helper', 'Trial Helper', 'Contributor'], 'Level Locked': ['*', 'Admin Perms', 'Sr. Moderator', 'Moderator'], 'No Files': ['*', 'Admin Perms', 'Sr. Moderator', 'Moderator'], 'No Reactions': ['*', 'Admin Perms', 'Sr. Moderator', 'Moderator'], 'No Links': ['*', 'Admin Perms', 'Sr. Moderator', 'Moderator'], 'No Bots': ['*', 'Admin Perms', 'Sr. Moderator', 'Moderator'], 'No VC': ['*', 'Admin Perms', 'Sr. Moderator', 'Moderator'], - 'No Giveaways': [ - '*', - 'Admin Perms', - 'Sr. Moderator', - 'Moderator', - 'Helper' - ], + 'No Giveaways': ['*', 'Admin Perms', 'Sr. Moderator', 'Moderator', 'Helper'], 'No Support': ['*', 'Admin Perms', 'Sr. Moderator', 'Moderator'], 'Giveaway Donor': ['*', 'Admin Perms', 'Sr. Moderator', 'Moderator'], 'Giveaway (200m)': ['*', 'Admin Perms', 'Sr. Moderator', 'Moderator'], @@ -42,7 +28,7 @@ export default class RoleCommand extends BotCommand { constructor() { super('role', { aliases: ['role', 'addrole', 'removerole'], - category: "Moulberry's Bush", + category: 'moderation', description: { content: "Manages users' roles.", usage: 'role <add|remove> <user> <role>', @@ -87,66 +73,38 @@ export default class RoleCommand extends BotCommand { }); } - public async exec( - message: Message, - { user, role }: { user: GuildMember; role: Role } - ): Promise<unknown> { - if ( - !message.member.permissions.has('MANAGE_ROLES') && - !this.client.ownerID.includes(message.author.id) - ) { - const mappedRole = this.client.util.moulberryBushRoleMap.find( - (m) => m.id === role.id - ); + public async exec(message: Message, { user, role }: { user: GuildMember; role: Role }): Promise<unknown> { + if (!message.member.permissions.has('MANAGE_ROLES') && !this.client.ownerID.includes(message.author.id)) { + const mappedRole = this.client.util.moulberryBushRoleMap.find((m) => m.id === role.id); if (!mappedRole || !this.roleWhitelist[mappedRole.name]) { - return message.util.reply( - `<:error:837123021016924261> <@&${role.id}> is not whitelisted, and you do not have manage roles permission.`, - { - allowedMentions: AllowedMentions.none() - } - ); + return message.util.reply(`<:error:837123021016924261> <@&${role.id}> is not whitelisted, and you do not have manage roles permission.`, { + allowedMentions: AllowedMentions.none() + }); } const allowedRoles = this.roleWhitelist[mappedRole.name].map((r) => { - return this.client.util.moulberryBushRoleMap.find((m) => m.name === r) - .id; + return this.client.util.moulberryBushRoleMap.find((m) => m.name === r).id; }); - if ( - !message.member.roles.cache.some((role) => - allowedRoles.includes(role.id) - ) - ) { - return message.util.reply( - `<:error:837123021016924261> <@&${role.id}> is whitelisted, but you do not have any of the roles required to manage it.`, - { - allowedMentions: AllowedMentions.none() - } - ); + if (!message.member.roles.cache.some((role) => allowedRoles.includes(role.id))) { + return message.util.reply(`<:error:837123021016924261> <@&${role.id}> is whitelisted, but you do not have any of the roles required to manage it.`, { + allowedMentions: AllowedMentions.none() + }); } } if (!this.client.ownerID.includes(message.author.id)) { if (role.comparePositionTo(message.member.roles.highest) >= 0) { - return message.util.reply( - `<:error:837123021016924261> <@&${role.id}> is higher or equal to your highest role.`, - { - allowedMentions: AllowedMentions.none() - } - ); + return message.util.reply(`<:error:837123021016924261> <@&${role.id}> is higher or equal to your highest role.`, { + allowedMentions: AllowedMentions.none() + }); } if (role.comparePositionTo(message.guild.me.roles.highest) >= 0) { - return message.util.reply( - `<:error:837123021016924261> <@&${role.id}> is higher or equal to my highest role.`, - { - allowedMentions: AllowedMentions.none() - } - ); + return message.util.reply(`<:error:837123021016924261> <@&${role.id}> is higher or equal to my highest role.`, { + allowedMentions: AllowedMentions.none() + }); } if (role.managed) { - await message.util.reply( - `<:error:837123021016924261> <@&${role.id}> is managed by an integration and cannot be managed.`, - { - allowedMentions: AllowedMentions.none() - } - ); + await message.util.reply(`<:error:837123021016924261> <@&${role.id}> is managed by an integration and cannot be managed.`, { + allowedMentions: AllowedMentions.none() + }); } } // No checks if the user has MANAGE_ROLES @@ -154,28 +112,16 @@ export default class RoleCommand extends BotCommand { try { await user.roles.remove(role.id); } catch { - return message.util.reply( - `<:error:837123021016924261> Could not remove <@&${role.id}> from <@${user.id}>.`, - { allowedMentions: AllowedMentions.none() } - ); + return message.util.reply(`<:error:837123021016924261> Could not remove <@&${role.id}> from <@${user.id}>.`, { allowedMentions: AllowedMentions.none() }); } - return message.util.reply( - `<:checkmark:837109864101707807> Successfully removed <@&${role.id}> from <@${user.id}>!`, - { allowedMentions: AllowedMentions.none() } - ); + return message.util.reply(`<:checkmark:837109864101707807> Successfully removed <@&${role.id}> from <@${user.id}>!`, { allowedMentions: AllowedMentions.none() }); } else { try { await user.roles.add(role.id); } catch { - return message.util.reply( - `<:error:837123021016924261> Could not add <@&${role.id}> to <@${user.id}>.`, - { allowedMentions: AllowedMentions.none() } - ); + return message.util.reply(`<:error:837123021016924261> Could not add <@&${role.id}> to <@${user.id}>.`, { allowedMentions: AllowedMentions.none() }); } - return message.util.reply( - `<:checkmark:837109864101707807> Successfully added <@&${role.id}> to <@${user.id}>!`, - { allowedMentions: AllowedMentions.none() } - ); + return message.util.reply(`<:checkmark:837109864101707807> Successfully added <@&${role.id}> to <@${user.id}>!`, { allowedMentions: AllowedMentions.none() }); } } } diff --git a/src/commands/moderation/warn.ts b/src/commands/moderation/warn.ts index 41e0032..3410d81 100644 --- a/src/commands/moderation/warn.ts +++ b/src/commands/moderation/warn.ts @@ -1,11 +1,12 @@ import { GuildMember, Message } from 'discord.js'; -import { BotCommand } from '../../lib/extensions/BotCommand'; +import { BushCommand } from '../../lib/extensions/BushCommand'; import { Guild, Modlog, ModlogType } from '../../lib/models'; -export default class WarnCommand extends BotCommand { +export default class WarnCommand extends BushCommand { public constructor() { super('warn', { aliases: ['warn'], + category: 'moderation', userPermissions: ['MANAGE_MESSAGES'], args: [ { @@ -24,10 +25,7 @@ export default class WarnCommand extends BotCommand { } }); } - public async exec( - message: Message, - { member, reason }: { member: GuildMember; reason: string } - ): Promise<void> { + public async exec(message: Message, { member, reason }: { member: GuildMember; reason: string }): Promise<void> { // Create guild entry so postgres doesn't get mad when I try and add a modlog entry await Guild.findOrCreate({ where: { @@ -47,21 +45,15 @@ export default class WarnCommand extends BotCommand { }); await entry.save(); } catch (e) { - await message.util.send( - 'Error saving to database, please contact the developers' - ); + await message.util.send('Error saving to database, please contact the developers'); return; } try { - await member.send( - `You were warned in ${message.guild.name} for reason "${reason}".` - ); + await member.send(`You were warned in ${message.guild.name} for reason "${reason}".`); } catch (e) { await message.util.send('Error messaging user, warning still saved.'); return; } - await message.util.send( - `${member.user.tag} was warned for reason "${reason}".` - ); + await message.util.send(`${member.user.tag} was warned for reason "${reason}".`); } } diff --git a/src/commands/moulberry-bush/capeperms.ts b/src/commands/moulberry-bush/capePerms.ts index 5b3dc10..79f9d6b 100644 --- a/src/commands/moulberry-bush/capeperms.ts +++ b/src/commands/moulberry-bush/capePerms.ts @@ -3,7 +3,7 @@ import { MessageEmbed } from 'discord.js'; import { CommandInteraction } from 'discord.js'; import { Message } from 'discord.js'; import got from 'got'; -import { BotCommand } from '../../lib/extensions/BotCommand'; +import { BushCommand } from '../../lib/extensions/BushCommand'; import { SlashCommandOption } from '../../lib/extensions/Util'; interface Capeperms { @@ -15,7 +15,7 @@ interface User { perms: string[]; } -export default class CapePermsCommand extends BotCommand { +export default class CapePermissionsCommand extends BushCommand { private nameMap = { patreon1: 'Patreon Tier 1', patreon2: 'Patreon Tier 2', @@ -45,7 +45,7 @@ export default class CapePermsCommand extends BotCommand { }; public constructor() { super('capeperms', { - aliases: ['capeperms', 'capeperm'], + aliases: ['capeperms', 'capeperm', 'capepermissions', 'capepermission'], category: "Moulberry's Bush", description: { content: 'A command to see what capes someone has access to.', @@ -58,8 +58,7 @@ export default class CapePermsCommand extends BotCommand { type: 'string', prompt: { start: 'Who would you like to see the cape permissions of?', - retry: - '<:error:837123021016924261> Choose someone to see the capes their available capes.', + retry: '<:error:837123021016924261> Choose someone to see the capes their available capes.', optional: false } } @@ -70,8 +69,7 @@ export default class CapePermsCommand extends BotCommand { { type: ApplicationCommandOptionType.STRING, name: 'user', - description: - 'The username of the player to see the cape permissions of', + description: 'The username of the player to see the cape permissions of', required: true } ] @@ -86,9 +84,7 @@ export default class CapePermsCommand extends BotCommand { } try { - capeperms = await got - .get('http://moulberry.codes/permscapes.json') - .json(); + capeperms = await got.get('http://moulberry.codes/permscapes.json').json(); } catch (error) { capeperms = null; } @@ -97,30 +93,20 @@ export default class CapePermsCommand extends BotCommand { } else { if (capeperms?.perms) { const foundUser = capeperms.perms.find((u) => u._id === uuid); - if (foundUser == null) - return `<:error:837123021016924261> \`${user}\` does not appear to have any capes.`; + if (foundUser == null) return `<:error:837123021016924261> \`${user}\` does not appear to have any capes.`; const userPerm: string[] = foundUser.perms; - const embed = this.client.util - .createEmbed(this.client.util.colors.default) - .setTitle(`${user}'s Capes`) - .setDescription(userPerm.join('\n')); + const embed = this.client.util.createEmbed(this.client.util.colors.default).setTitle(`${user}'s Capes`).setDescription(userPerm.join('\n')); return embed; } else { return `<:error:837123021016924261> There was an error finding cape perms for ${user}.`; } } } - public async exec( - message: Message, - { user }: { user: string } - ): Promise<void> { + public async exec(message: Message, { user }: { user: string }): Promise<void> { await message.reply(await this.getResponse(user)); } - public async execSlash( - message: CommandInteraction, - { user }: { user: SlashCommandOption<string> } - ): Promise<void> { + public async execSlash(message: CommandInteraction, { user }: { user: SlashCommandOption<string> }): Promise<void> { await message.reply(await this.getResponse(user.value)); } } diff --git a/src/commands/moulberry-bush/giveawayping.ts b/src/commands/moulberry-bush/giveawayPing.ts index d99f475..e11585a 100644 --- a/src/commands/moulberry-bush/giveawayping.ts +++ b/src/commands/moulberry-bush/giveawayPing.ts @@ -1,10 +1,10 @@ -import { BotCommand } from '../../lib/extensions/BotCommand'; +import { BushCommand } from '../../lib/extensions/BushCommand'; import AllowedMentions from '../../lib/utils/AllowedMentions'; import { Message, WebhookClient } from 'discord.js'; import { TextChannel } from 'discord.js'; import { NewsChannel } from 'discord.js'; -export default class GiveawayPingCommand extends BotCommand { +export default class GiveawayPingCommand extends BushCommand { constructor() { super('giveawayping', { aliases: ['giveawayping', 'giveawaypong'], @@ -15,14 +15,7 @@ export default class GiveawayPingCommand extends BotCommand { examples: ['giveawayping'] }, clientPermissions: ['MANAGE_MESSAGES'], - userPermissions: [ - 'SEND_MESSAGES', - 'MANAGE_GUILD', - 'MANAGE_MESSAGES', - 'BAN_MEMBERS', - 'KICK_MEMBERS', - 'VIEW_CHANNEL' - ], + userPermissions: ['SEND_MESSAGES', 'MANAGE_GUILD', 'MANAGE_MESSAGES', 'BAN_MEMBERS', 'KICK_MEMBERS', 'VIEW_CHANNEL'], channel: 'guild', ignoreCooldown: [], ignorePermissions: [], @@ -32,25 +25,14 @@ export default class GiveawayPingCommand extends BotCommand { }); } public async exec(message: Message): Promise<unknown> { - if (message.guild.id !== '516977525906341928') - return message.reply( - "<:error:837123021016924261> This command may only be run in Moulberry's Bush." - ); - if ( - !['767782084981817344', '833855738501267456'].includes(message.channel.id) - ) - return message.reply( - '<:error:837123021016924261> This command may only be run in giveaway channels.' - ); + if (message.guild.id !== '516977525906341928') return message.reply("<:error:837123021016924261> This command may only be run in Moulberry's Bush."); + if (!['767782084981817344', '833855738501267456'].includes(message.channel.id)) + return message.reply('<:error:837123021016924261> This command may only be run in giveaway channels.'); await message.delete().catch(() => undefined); - const webhooks = await ( - message.channel as TextChannel | NewsChannel - ).fetchWebhooks(); + const webhooks = await (message.channel as TextChannel | NewsChannel).fetchWebhooks(); let webhookClient: WebhookClient; if (webhooks.size < 1) { - const webhook = await ( - message.channel as TextChannel | NewsChannel - ).createWebhook('Giveaway ping webhook'); + const webhook = await (message.channel as TextChannel | NewsChannel).createWebhook('Giveaway ping webhook'); webhookClient = new WebhookClient(webhook.id, webhook.token); } else { const webhook = webhooks.first(); diff --git a/src/commands/moulberry-bush/level.ts b/src/commands/moulberry-bush/level.ts index 046940a..554219d 100644 --- a/src/commands/moulberry-bush/level.ts +++ b/src/commands/moulberry-bush/level.ts @@ -3,7 +3,7 @@ import { Message } from 'discord.js'; import { CommandInteractionOption } from 'discord.js'; import { CommandInteraction } from 'discord.js'; import { User } from 'discord.js'; -import { BotCommand } from '../../lib/extensions/BotCommand'; +import { BushCommand } from '../../lib/extensions/BushCommand'; import { Level } from '../../lib/models'; import canvas from 'canvas'; import { MessageAttachment } from 'discord.js'; @@ -11,10 +11,11 @@ import { join } from 'path'; import got from 'got/dist/source'; import { CanvasProgressBar } from '../../lib/extensions/Util'; -export default class LevelCommand extends BotCommand { +export default class LevelCommand extends BushCommand { constructor() { super('level', { aliases: ['level', 'rank'], + category: "Moulberry's Bush", description: { content: 'Shows the level of a user', usage: 'level [user]', @@ -26,8 +27,7 @@ export default class LevelCommand extends BotCommand { type: 'user', prompt: { start: 'What user would you like to see the level of?', - retry: - 'Invalid user. What user would you like to see the level of?', + retry: 'Invalid user. What user would you like to see the level of?', optional: true } } diff --git a/src/commands/moulberry-bush/rule.ts b/src/commands/moulberry-bush/rule.ts index bd8b08a..e3f9e34 100644 --- a/src/commands/moulberry-bush/rule.ts +++ b/src/commands/moulberry-bush/rule.ts @@ -1,11 +1,11 @@ import { Argument } from 'discord-akairo'; import { Message, MessageEmbed, User } from 'discord.js'; -import { BotCommand } from '../../lib/extensions/BotCommand'; +import { BushCommand } from '../../lib/extensions/BushCommand'; import { ApplicationCommandOptionType } from 'discord-api-types'; import { CommandInteraction } from 'discord.js'; import { SlashCommandOption } from '../../lib/extensions/Util'; -export default class RuleCommand extends BotCommand { +export default class RuleCommand extends BushCommand { private rules = [ { title: "Follow Discord's TOS", @@ -19,28 +19,23 @@ export default class RuleCommand extends BotCommand { }, { title: 'No Spamming', - description: - 'Including but not limited to: any messages that do not contribute to the conversation, repeated messages, randomly tagging users, and chat flood.' + description: 'Including but not limited to: any messages that do not contribute to the conversation, repeated messages, randomly tagging users, and chat flood.' }, { title: 'English', - description: - 'The primary language of the server is English, please keep all discussions in English.' + description: 'The primary language of the server is English, please keep all discussions in English.' }, { title: 'Safe for Work', - description: - 'Please keep NSFW and NSFL content out of this server, avoid borderline images as well as keeping your status and profile picture SFW.' + description: 'Please keep NSFW and NSFL content out of this server, avoid borderline images as well as keeping your status and profile picture SFW.' }, { title: 'No Advertising', - description: - 'Do not promote anything without prior approval from a staff member, this includes DM advertising.' + description: 'Do not promote anything without prior approval from a staff member, this includes DM advertising.' }, { title: 'Impersonation', - description: - 'Do not try to impersonate others for the express intent of being deceitful, defamation , and/or personal gain.' + description: 'Do not try to impersonate others for the express intent of being deceitful, defamation , and/or personal gain.' }, { title: 'Swearing', @@ -48,23 +43,19 @@ export default class RuleCommand extends BotCommand { }, { title: 'Only ping @emergency in emergencies', - description: - 'Pinging <@&833802660209229854> for no reason will result in severe punishment. <@&833802660209229854> is only to be pinged in true emergencies.' + description: 'Pinging <@&833802660209229854> for no reason will result in severe punishment. <@&833802660209229854> is only to be pinged in true emergencies.' }, { title: 'No Backseat Moderating', - description: - 'If you see a rule being broken be broken, please report it using: `-report <user> [evidence]`.' + description: 'If you see a rule being broken be broken, please report it using: `-report <user> [evidence]`.' }, { title: 'Staff may moderate at their discretion', - description: - 'If there are loopholes in our rules, the staff team may moderate based on what they deem appropriate. The staff team holds final discretion.' + description: 'If there are loopholes in our rules, the staff team may moderate based on what they deem appropriate. The staff team holds final discretion.' }, { title: "Sending media that are able to crash a user's Discord", - description: - "Sending videos, GIFs, emojis, etc. that are able to crash someone's discord will result in a **permanent** mute that cannot be appealed." + description: "Sending videos, GIFs, emojis, etc. that are able to crash someone's discord will result in a **permanent** mute that cannot be appealed." } ]; @@ -117,35 +108,20 @@ export default class RuleCommand extends BotCommand { ] }); } - private getResponse( - message: Message | CommandInteraction, - rule?: number, - user?: User - ): string | MessageEmbed | [string, MessageEmbed] { - if ( - message.guild.id !== '516977525906341928' && - !this.client.ownerID.includes( - message instanceof Message ? message.author.id : message.user.id - ) - ) { + private getResponse(message: Message | CommandInteraction, rule?: number, user?: User): string | MessageEmbed | [string, MessageEmbed] { + if (message.guild.id !== '516977525906341928' && !this.client.ownerID.includes(message instanceof Message ? message.author.id : message.user.id)) { return "<:no:787549684196704257> This command can only be run in Moulberry's Bush."; } let rulesEmbed = new MessageEmbed().setColor('ef3929'); if (message instanceof Message) { - rulesEmbed = rulesEmbed.setFooter( - `Triggered by ${message.author.tag}`, - message.author.avatarURL({ dynamic: true }) - ); + rulesEmbed = rulesEmbed.setFooter(`Triggered by ${message.author.tag}`, message.author.avatarURL({ dynamic: true })); } if (rule) { const foundRule = this.rules[rule - 1]; rulesEmbed.addField(`${rule}) ${foundRule.title}`, foundRule.description); } else { for (const curRule of this.rules) { - rulesEmbed.addField( - `${this.rules.indexOf(curRule) + 1}) ${curRule.title}`, - curRule.description - ); + rulesEmbed.addField(`${this.rules.indexOf(curRule) + 1}) ${curRule.title}`, curRule.description); } } if (!user) { @@ -154,10 +130,7 @@ export default class RuleCommand extends BotCommand { return [`<@!${user.id}>`, rulesEmbed]; } } - public async exec( - message: Message, - { rule, user }: { rule?: number; user?: User } - ): Promise<void> { + public async exec(message: Message, { rule, user }: { rule?: number; user?: User }): Promise<void> { const response = this.getResponse(message, rule, user); if (Array.isArray(response)) { await message.util.send(response[0], { @@ -169,13 +142,7 @@ export default class RuleCommand extends BotCommand { await message.delete().catch(() => undefined); } - public async execSlash( - message: CommandInteraction, - { - rule, - user - }: { rule?: SlashCommandOption<number>; user?: SlashCommandOption<void> } - ): Promise<void> { + public async execSlash(message: CommandInteraction, { rule, user }: { rule?: SlashCommandOption<number>; user?: SlashCommandOption<void> }): Promise<void> { const response = this.getResponse(message, rule?.value, user?.user); if (Array.isArray(response)) { await message.reply(response[0], { diff --git a/src/commands/admin/prefix.ts b/src/commands/server-config/prefix.ts index 112f6b8..c60f8fb 100644 --- a/src/commands/admin/prefix.ts +++ b/src/commands/server-config/prefix.ts @@ -1,13 +1,14 @@ import { ApplicationCommandOptionType } from 'discord-api-types'; import { CommandInteraction, Message, Guild as DiscordGuild } from 'discord.js'; -import { BotCommand } from '../../lib/extensions/BotCommand'; +import { BushCommand } from '../../lib/extensions/BushCommand'; import { SlashCommandOption } from '../../lib/extensions/Util'; import { Guild } from '../../lib/models'; -export default class PrefixCommand extends BotCommand { +export default class PrefixCommand extends BushCommand { constructor() { super('prefix', { aliases: ['prefix'], + category: 'server config', args: [ { id: 'prefix' @@ -15,8 +16,7 @@ export default class PrefixCommand extends BotCommand { ], userPermissions: ['MANAGE_GUILD'], description: { - content: - 'Set the prefix of the current server (resets to default if prefix is not given)', + content: 'Set the prefix of the current server (resets to default if prefix is not given)', usage: 'prefix [prefix]', examples: ['prefix', 'prefix +'] }, @@ -32,8 +32,13 @@ export default class PrefixCommand extends BotCommand { } async changePrefix(guild: DiscordGuild, prefix?: string): Promise<void> { + let row = await Guild.findByPk(guild.id); + if (!row) { + row = Guild.build({ + id: guild.id + }); + } if (prefix) { - const row = await Guild.findByPk(guild.id); row.prefix = prefix; await row.save(); } else { @@ -48,23 +53,16 @@ export default class PrefixCommand extends BotCommand { if (prefix) { await message.util.send(`Sucessfully set prefix to \`${prefix}\``); } else { - await message.util.send( - `Sucessfully reset prefix to \`${this.client.config.prefix}\`` - ); + await message.util.send(`Sucessfully reset prefix to \`${this.client.config.prefix}\``); } } - async execSlash( - message: CommandInteraction, - { prefix }: { prefix?: SlashCommandOption<string> } - ): Promise<void> { + async execSlash(message: CommandInteraction, { prefix }: { prefix?: SlashCommandOption<string> }): Promise<void> { await this.changePrefix(message.guild, prefix?.value); if (prefix) { await message.reply(`Sucessfully set prefix to \`${prefix.value}\``); } else { - await message.reply( - `Sucessfully reset prefix to \`${this.client.config.prefix}\`` - ); + await message.reply(`Sucessfully reset prefix to \`${this.client.config.prefix}\``); } } } |