aboutsummaryrefslogtreecommitdiff
path: root/src/commands
diff options
context:
space:
mode:
authorIRONM00N <64110067+IRONM00N@users.noreply.github.com>2021-06-24 00:56:16 -0400
committerIRONM00N <64110067+IRONM00N@users.noreply.github.com>2021-06-24 00:56:16 -0400
commit4176b6258e44e4a095376aaf0f4c687244243a69 (patch)
tree3b9144be9a2045483c90d92fff05b3ca0b288e52 /src/commands
parente80446e23060c0325bbd6db620920d86694ec3ce (diff)
downloadtanzanite-4176b6258e44e4a095376aaf0f4c687244243a69.tar.gz
tanzanite-4176b6258e44e4a095376aaf0f4c687244243a69.tar.bz2
tanzanite-4176b6258e44e4a095376aaf0f4c687244243a69.zip
feat(*): Began working on other punishment commands etc
Diffstat (limited to 'src/commands')
-rw-r--r--src/commands/config/muteRole.ts57
-rw-r--r--src/commands/config/prefix.ts16
-rw-r--r--src/commands/config/welcomeChannel.ts49
-rw-r--r--src/commands/dev/eval.ts4
-rw-r--r--src/commands/dev/reload.ts7
-rw-r--r--src/commands/dev/setLevel.ts12
-rw-r--r--src/commands/dev/superUser.ts2
-rw-r--r--src/commands/info/botInfo.ts17
-rw-r--r--src/commands/info/help.ts10
-rw-r--r--src/commands/info/ping.ts2
-rw-r--r--src/commands/info/pronouns.ts7
-rw-r--r--src/commands/moderation/ban.ts148
-rw-r--r--src/commands/moderation/block.ts0
-rw-r--r--src/commands/moderation/kick.ts18
-rw-r--r--src/commands/moderation/modlog.ts36
-rw-r--r--src/commands/moderation/mute.ts166
-rw-r--r--src/commands/moderation/unban.ts0
-rw-r--r--src/commands/moderation/unblock.ts0
-rw-r--r--src/commands/moderation/unmute.ts0
-rw-r--r--src/commands/moderation/warn.ts6
-rw-r--r--src/commands/moulberry-bush/capePerms.ts138
-rw-r--r--src/commands/moulberry-bush/giveawayPing.ts35
-rw-r--r--src/commands/moulberry-bush/level.ts15
-rw-r--r--src/commands/moulberry-bush/rule.ts228
24 files changed, 607 insertions, 366 deletions
diff --git a/src/commands/config/muteRole.ts b/src/commands/config/muteRole.ts
new file mode 100644
index 0000000..f51c5ce
--- /dev/null
+++ b/src/commands/config/muteRole.ts
@@ -0,0 +1,57 @@
+import { Role } from 'discord.js';
+import { BushCommand } from '../../lib/extensions/BushCommand';
+import { BushSlashMessage } from '../../lib/extensions/BushInteractionMessage';
+import { BushMessage } from '../../lib/extensions/BushMessage';
+import { Guild } from '../../lib/models';
+import AllowedMentions from '../../lib/utils/AllowedMentions';
+
+export default class MuteRoleCommand extends BushCommand {
+ constructor() {
+ super('muteRole', {
+ aliases: ['muterole'],
+ category: 'config',
+ description: {
+ content: 'Set the prefix of the current server (resets to default if prefix is not given)',
+ usage: 'prefix [prefix]',
+ examples: ['prefix', 'prefix +']
+ },
+ clientPermissions: ['SEND_MESSAGES'],
+ userPermissions: ['SEND_MESSAGES', 'MANAGE_GUILD'],
+ args: [
+ {
+ id: 'role',
+ type: 'role',
+ prompt: {
+ start: "What would you like to set the server's mute role to?",
+ retry: '{error} Choose a valid role.',
+ optional: false
+ }
+ }
+ ],
+ slash: true,
+ slashOptions: [
+ {
+ type: 'ROLE',
+ name: 'role',
+ description: 'The mute role for this server.',
+ required: true
+ }
+ ]
+ });
+ }
+
+ async exec(message: BushMessage | BushSlashMessage, args: { role: Role }): Promise<void> {
+ let row = await Guild.findByPk(message.guild.id);
+ if (!row) {
+ row = Guild.build({
+ id: message.guild.id
+ });
+ }
+ row.muteRole = args.role.id;
+ await row.save();
+ await message.util.send({
+ content: `${this.client.util.emojis.success} Changed the mute role to <@&${args.role.id}>.`,
+ allowedMentions: AllowedMentions.none()
+ });
+ }
+}
diff --git a/src/commands/config/prefix.ts b/src/commands/config/prefix.ts
index 1326426..5b73a1a 100644
--- a/src/commands/config/prefix.ts
+++ b/src/commands/config/prefix.ts
@@ -1,6 +1,6 @@
-import { Message } from 'discord.js';
import { BushCommand } from '../../lib/extensions/BushCommand';
import { BushSlashMessage } from '../../lib/extensions/BushInteractionMessage';
+import { BushMessage } from '../../lib/extensions/BushMessage';
import { Guild } from '../../lib/models';
export default class PrefixCommand extends BushCommand {
@@ -11,10 +11,16 @@ export default class PrefixCommand extends BushCommand {
args: [
{
id: 'prefix',
- type: 'string'
+ type: 'string',
+ prompt: {
+ start: 'What would you like the new prefix to be?',
+ retry: '{error} Choose a valid prefix',
+ optional: true
+ }
}
],
- userPermissions: ['MANAGE_GUILD'],
+ clientPermissions: ['SEND_MESSAGES'],
+ userPermissions: ['SEND_MESSAGES', 'MANAGE_GUILD'],
description: {
content: 'Set the prefix of the current server (resets to default if prefix is not given)',
usage: 'prefix [prefix]',
@@ -32,7 +38,7 @@ export default class PrefixCommand extends BushCommand {
});
}
- async exec(message: Message | BushSlashMessage, { prefix }: { prefix?: string }): Promise<void> {
+ async exec(message: BushMessage | BushSlashMessage, { prefix }: { prefix?: string }): Promise<void> {
let row = await Guild.findByPk(message.guild.id);
if (!row) {
row = Guild.build({
@@ -41,7 +47,7 @@ export default class PrefixCommand extends BushCommand {
}
await row.update({ prefix: prefix || this.client.config.prefix });
if (prefix) {
- await message.util.send(`${this.client.util.emojis.success} changed prefix from \`${prefix}\``);
+ await message.util.send(`${this.client.util.emojis.success} changed prefix from \`${prefix}\` to `);
} else {
await message.util.send(`${this.client.util.emojis.success} reset prefix to \`${this.client.config.prefix}\``);
}
diff --git a/src/commands/config/welcomeChannel.ts b/src/commands/config/welcomeChannel.ts
new file mode 100644
index 0000000..72e55f1
--- /dev/null
+++ b/src/commands/config/welcomeChannel.ts
@@ -0,0 +1,49 @@
+import { User } from 'discord.js';
+import { BushCommand } from '../../lib/extensions/BushCommand';
+import { BushMessage } from '../../lib/extensions/BushMessage';
+import { Global } from '../../lib/models';
+
+export default class WelcomeChannelCommand extends BushCommand {
+ public constructor() {
+ super('welcomeChannel', {
+ aliases: ['welcomechannel', 'wc'],
+ category: 'config',
+ description: {
+ content: 'Configure the what channel you want the bot to send a message in when someone joins the server.',
+ usage: 'welcomechannel [channel]',
+ examples: ['welcomechannel #welcome']
+ },
+ clientPermissions: ['SEND_MESSAGES'],
+ ownerOnly: true
+ });
+ }
+ public async exec(message: BushMessage, args: { action: 'add' | 'remove'; user: User }): Promise<unknown> {
+ if (!this.client.config.owners.includes(message.author.id))
+ return await message.util.reply(`${this.client.util.emojis.error} Only my developers can run this command...`);
+
+ const superUsers = (await Global.findByPk(this.client.config.dev ? 'development' : 'production')).superUsers;
+ let success;
+ if (args.action === 'add') {
+ if (superUsers.includes(args.user.id)) {
+ return message.util.reply(`${this.client.util.emojis.warn} \`${args.user.tag}\` is already a superuser.`);
+ }
+ success = await this.client.util.insertOrRemoveFromGlobal('add', 'superUsers', args.user.id).catch(() => false);
+ } else {
+ if (!superUsers.includes(args.user.id)) {
+ return message.util.reply(`${this.client.util.emojis.warn} \`${args.user.tag}\` is not superuser.`);
+ }
+ success = await this.client.util.insertOrRemoveFromGlobal('remove', 'superUsers', args.user.id).catch(() => false);
+ }
+ if (success) {
+ const responses = [args.action == 'remove' ? `` : 'made', args.action == 'remove' ? 'is no longer' : ''];
+ return message.util.reply(
+ `${this.client.util.emojis.success} ${responses[0]} \`${args.user.tag}\` ${responses[1]} a superuser.`
+ );
+ } else {
+ const response = [args.action == 'remove' ? `removing` : 'making', args.action == 'remove' ? `from` : 'to'];
+ return message.util.reply(
+ `${this.client.util.emojis.error} There was an error ${response[0]} \`${args.user.tag}\` ${response[1]} the superuser list.`
+ );
+ }
+ }
+}
diff --git a/src/commands/dev/eval.ts b/src/commands/dev/eval.ts
index d2fe432..310a2c5 100644
--- a/src/commands/dev/eval.ts
+++ b/src/commands/dev/eval.ts
@@ -10,7 +10,7 @@ import { BushMessage } from '../../lib/extensions/BushMessage';
const clean = (text) => {
if (typeof text === 'string') {
- return (text = Util.cleanCodeBlockContent(text));
+ return Util.cleanCodeBlockContent(text);
} else return text;
};
const sh = promisify(exec);
@@ -186,7 +186,7 @@ export default class EvalCommand extends BushCommand {
{ Global } = await import('../../lib/models/Global'),
{ Guild } = await import('../../lib/models/Guild'),
{ Level } = await import('../../lib/models/Level'),
- { Modlog } = await import('../../lib/models/Modlog'),
+ { ModLog } = await import('../../lib/models/ModLog'),
{ StickyRole } = await import('../../lib/models/StickyRole');
if (code[code.lang].replace(/ /g, '').includes('9+10' || '10+9')) {
output = 21;
diff --git a/src/commands/dev/reload.ts b/src/commands/dev/reload.ts
index 94e31b0..f5fee88 100644
--- a/src/commands/dev/reload.ts
+++ b/src/commands/dev/reload.ts
@@ -1,6 +1,5 @@
import { stripIndent } from 'common-tags';
import { Message } from 'discord.js';
-import { SlashCommandOption } from '../../lib/extensions/BushClientUtil';
import { BushCommand } from '../../lib/extensions/BushCommand';
import { BushSlashMessage } from '../../lib/extensions/BushInteractionMessage';
@@ -51,11 +50,7 @@ export default class ReloadCommand extends BushCommand {
}
}
- public async exec(message: Message, { fast }: { fast: boolean }): Promise<void> {
+ public async exec(message: Message | BushSlashMessage, { fast }: { fast: boolean }): Promise<void> {
await message.util.send(await this.getResponse(fast));
}
-
- public async execSlash(message: BushSlashMessage, { fast }: { fast: SlashCommandOption<boolean> }): Promise<void> {
- await message.interaction.reply(await this.getResponse(fast?.value));
- }
}
diff --git a/src/commands/dev/setLevel.ts b/src/commands/dev/setLevel.ts
index ca555db..f536109 100644
--- a/src/commands/dev/setLevel.ts
+++ b/src/commands/dev/setLevel.ts
@@ -1,7 +1,5 @@
import { Message, User } from 'discord.js';
-import { SlashCommandOption } from '../../lib/extensions/BushClientUtil';
import { BushCommand } from '../../lib/extensions/BushCommand';
-import { BushSlashMessage } from '../../lib/extensions/BushInteractionMessage';
import { Level } from '../../lib/models';
import AllowedMentions from '../../lib/utils/AllowedMentions';
@@ -71,14 +69,4 @@ export default class SetLevelCommand extends BushCommand {
allowedMentions: AllowedMentions.none()
});
}
-
- async execSlash(
- message: BushSlashMessage,
- { user, level }: { user: SlashCommandOption<void>; level: SlashCommandOption<number> }
- ): Promise<void> {
- await message.interaction.reply({
- content: await this.setLevel(user.user, level.value),
- allowedMentions: AllowedMentions.none()
- });
- }
}
diff --git a/src/commands/dev/superUser.ts b/src/commands/dev/superUser.ts
index c3ed0b0..4562e6f 100644
--- a/src/commands/dev/superUser.ts
+++ b/src/commands/dev/superUser.ts
@@ -2,7 +2,7 @@ import { Constants } from 'discord-akairo';
import { User } from 'discord.js';
import { BushCommand } from '../../lib/extensions/BushCommand';
import { BushMessage } from '../../lib/extensions/BushMessage';
-import { Global } from '../../lib/models/Global';
+import { Global } from '../../lib/models';
export default class SuperUserCommand extends BushCommand {
public constructor() {
diff --git a/src/commands/info/botInfo.ts b/src/commands/info/botInfo.ts
index 120527d..3db4151 100644
--- a/src/commands/info/botInfo.ts
+++ b/src/commands/info/botInfo.ts
@@ -1,7 +1,6 @@
import { Message, MessageEmbed } from 'discord.js';
import { duration } from 'moment';
import { BushCommand } from '../../lib/extensions/BushCommand';
-import { BushSlashMessage } from '../../lib/extensions/BushInteractionMessage';
export default class BotInfoCommand extends BushCommand {
constructor() {
@@ -13,11 +12,13 @@ export default class BotInfoCommand extends BushCommand {
usage: 'botinfo',
examples: ['botinfo']
},
- slash: true
+ slash: true,
+ clientPermissions: ['SEND_MESSAGES', 'EMBED_LINKS'],
+ userPermissions: ['SEND_MESSAGES']
});
}
- private async generateEmbed(): Promise<MessageEmbed> {
+ public async exec(message: Message): Promise<void> {
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', '');
@@ -44,14 +45,6 @@ export default class BotInfoCommand extends BushCommand {
}
])
.setTimestamp();
- return embed;
- }
-
- public async exec(message: Message): Promise<void> {
- await message.util.send({ embeds: [await this.generateEmbed()] });
- }
-
- public async execSlash(message: BushSlashMessage): Promise<void> {
- await message.interaction.reply({ embeds: [await this.generateEmbed()] });
+ await message.util.reply({ embeds: [embed] });
}
}
diff --git a/src/commands/info/help.ts b/src/commands/info/help.ts
index 0efc6b3..8969efc 100644
--- a/src/commands/info/help.ts
+++ b/src/commands/info/help.ts
@@ -14,6 +14,7 @@ export default class HelpCommand extends BushCommand {
examples: ['help prefix']
},
clientPermissions: ['EMBED_LINKS'],
+
args: [
{
id: 'command',
@@ -31,15 +32,15 @@ export default class HelpCommand extends BushCommand {
flag: '--hidden'
}
],
+ slash: true,
slashOptions: [
{
type: 'STRING',
name: 'command',
- description: `The command you would like to find information about.`,
+ description: 'The command you would like to find information about.',
required: false
}
- ],
- slash: true
+ ]
});
}
@@ -79,8 +80,7 @@ export default class HelpCommand extends BushCommand {
if (command.superUserOnly && !isSuperUser) {
return false;
}
- if (command.restrictedGuilds?.includes(message.guild.id) == !true && !args.showHidden) return false;
- return true;
+ return !(command.restrictedGuilds?.includes(message.guild.id) == false && !args.showHidden);
});
const categoryNice = category.id
.replace(/(\b\w)/gi, (lc): string => lc.toUpperCase())
diff --git a/src/commands/info/ping.ts b/src/commands/info/ping.ts
index e80cfb3..3038658 100644
--- a/src/commands/info/ping.ts
+++ b/src/commands/info/ping.ts
@@ -12,6 +12,8 @@ export default class PingCommand extends BushCommand {
usage: 'ping',
examples: ['ping']
},
+ clientPermissions: ['SEND_MESSAGES', 'EMBED_LINKS'],
+ userPermissions: ['SEND_MESSAGES'],
slash: true
});
}
diff --git a/src/commands/info/pronouns.ts b/src/commands/info/pronouns.ts
index 79baeef..2175233 100644
--- a/src/commands/info/pronouns.ts
+++ b/src/commands/info/pronouns.ts
@@ -1,8 +1,6 @@
import { CommandInteraction, Message, MessageEmbed, User } from 'discord.js';
import got, { HTTPError } from 'got';
-import { SlashCommandOption } from '../../lib/extensions/BushClientUtil';
import { BushCommand } from '../../lib/extensions/BushCommand';
-import { BushSlashMessage } from '../../lib/extensions/BushInteractionMessage';
export const pronounMapping = {
unspecified: 'Unspecified',
@@ -55,7 +53,6 @@ export default class PronounsCommand extends BushCommand {
required: false
}
],
- slashEphemeral: true, // I'll add dynamic checking to this later
slash: true
});
}
@@ -107,8 +104,4 @@ export default class PronounsCommand extends BushCommand {
const u = user || message.author;
await this.sendResponse(message, u, u.id === message.author.id);
}
- async execSlash(message: BushSlashMessage, { user }: { user?: SlashCommandOption<void> }): Promise<void> {
- const u = user?.user || message.author;
- await this.sendResponse(message.interaction, u, u.id === message.author.id);
- }
}
diff --git a/src/commands/moderation/ban.ts b/src/commands/moderation/ban.ts
index 692691e..7ce222a 100644
--- a/src/commands/moderation/ban.ts
+++ b/src/commands/moderation/ban.ts
@@ -1,18 +1,17 @@
+import { Argument } from 'discord-akairo';
import { CommandInteraction, Message, User } from 'discord.js';
import moment from 'moment';
-import { SlashCommandOption } from '../../lib/extensions/BushClientUtil';
import { BushCommand } from '../../lib/extensions/BushCommand';
-import { BushSlashMessage } from '../../lib/extensions/BushInteractionMessage';
-import { Ban, Guild, Modlog, ModlogType } from '../../lib/models';
+import { Ban, Guild, ModLog, ModLogType } from '../../lib/models';
-const durationAliases: Record<string, string[]> = {
+/* const durationAliases: Record<string, string[]> = {
weeks: ['w', 'weeks', 'week', 'wk', 'wks'],
days: ['d', 'days', 'day'],
hours: ['h', 'hours', 'hour', 'hr', 'hrs'],
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 BanCommand extends BushCommand {
constructor() {
@@ -25,15 +24,21 @@ export default class BanCommand extends BushCommand {
type: 'user',
prompt: {
start: 'What user would you like to ban?',
- retry: 'Invalid response. What user would you like to ban?'
+ retry: '{error} Choose a valid user to ban.'
}
},
{
id: 'reason',
- match: 'rest'
+ match: 'restContent',
+ prompt: {
+ start: 'Why would you like to ban this user?',
+ retry: '{error} Choose a ban reason.',
+ optional: true
+ }
},
{
id: 'time',
+ type: 'duration',
match: 'option',
flag: '--time'
}
@@ -41,27 +46,27 @@ export default class BanCommand extends BushCommand {
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 from the server.',
usage: 'ban <member> <reason> [--time]',
- examples: ['ban @Tyman being cool', 'ban @Tyman being cool --time 7days']
+ examples: ['ban @user bad --time 69d']
},
slashOptions: [
{
type: 'USER',
name: 'user',
- description: 'The user to ban',
+ description: 'Who would you like to ban?',
required: true
},
{
type: 'STRING',
name: 'reason',
- description: 'The reason to show in modlogs and audit log',
+ description: 'Why are they getting banned?',
required: false
},
{
type: 'STRING',
name: 'time',
- description: 'The time the user should be banned for (default permanent)',
+ description: 'How long should they be banned for?',
required: false
}
],
@@ -72,12 +77,12 @@ export default class BanCommand extends BushCommand {
message: Message | CommandInteraction,
user: User,
reason?: string,
- time?: string
+ time?: number
): AsyncIterable<string> {
const duration = moment.duration();
- let modlogEnry: Modlog;
+ let modLogEntry: ModLog;
let banEntry: Ban;
- const translatedTime: string[] = [];
+ // const translatedTime: string[] = [];
// Create guild entry so postgres doesn't get mad when I try and add a modlog entry
await Guild.findOrCreate({
where: {
@@ -88,62 +93,58 @@ export default class BanCommand extends BushCommand {
}
});
try {
- try {
- if (time) {
- const parsed = [...time.matchAll(durationRegex)];
+ if (time) {
+ duration.add(time);
+ /* const parsed = [...time.matchAll(durationRegex)];
if (parsed.length < 1) {
- yield 'Invalid time.';
+ yield `${this.client.util.emojis.error} Invalid time.`;
return;
}
for (const part of parsed) {
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');
- }
- modlogEnry = Modlog.build({
- user: user.id,
- guild: message.guild.id,
- reason,
- type: ModlogType.TEMPBAN,
- duration: duration.asMilliseconds(),
- moderator: message instanceof CommandInteraction ? message.user.id : message.author.id
- });
- banEntry = Ban.build({
- user: user.id,
- guild: message.guild.id,
- reason,
- expires: new Date(new Date().getTime() + duration.asMilliseconds()),
- modlog: modlogEnry.id
- });
- } else {
- modlogEnry = Modlog.build({
- user: user.id,
- guild: message.guild.id,
- reason,
- type: ModlogType.BAN,
- moderator: message instanceof CommandInteraction ? message.user.id : message.author.id
- });
- banEntry = Ban.build({
- user: user.id,
- guild: message.guild.id,
- reason,
- modlog: modlogEnry.id
- });
- }
- await modlogEnry.save();
- await banEntry.save();
- } catch (e) {
- this.client.console.error(`BanCommand`, `Error saving to database. ${e?.stack}`);
- yield `${this.client.util.emojis.error} Error saving to database. Please report this to a developer.`;
- return;
+ } */
+ modLogEntry = ModLog.build({
+ user: user.id,
+ guild: message.guild.id,
+ reason,
+ type: ModLogType.TEMP_BAN,
+ duration: duration.asMilliseconds(),
+ moderator: message instanceof CommandInteraction ? message.user.id : message.author.id
+ });
+ banEntry = Ban.build({
+ user: user.id,
+ guild: message.guild.id,
+ reason,
+ expires: new Date(new Date().getTime() + duration.asMilliseconds()),
+ modlog: modLogEntry.id
+ });
+ } else {
+ modLogEntry = ModLog.build({
+ user: user.id,
+ guild: message.guild.id,
+ reason,
+ type: ModLogType.BAN,
+ moderator: message instanceof CommandInteraction ? message.user.id : message.author.id
+ });
+ banEntry = Ban.build({
+ user: user.id,
+ guild: message.guild.id,
+ reason,
+ modlog: modLogEntry.id
+ });
}
+ await modLogEntry.save();
+ await banEntry.save();
+
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} ${duration ? duration.humanize() : 'permanently'} with reason \`${
+ reason || 'No reason given'
+ }\``
);
- } catch (e) {
+ } catch {
yield `${this.client.util.emojis.warn} Unable to dm user`;
}
await message.guild.members.ban(user, {
@@ -152,35 +153,22 @@ export default class BanCommand extends BushCommand {
}`
});
yield `${this.client.util.emojis.success} Banned <@!${user.id}> ${
- translatedTime.length >= 1 ? `for ${translatedTime.join(', ')}` : 'permanently'
+ duration ? duration.humanize() : 'permanently'
} with reason \`${reason || 'No reason given'}\``;
} catch {
yield `${this.client.util.emojis.error} Error banning :/`;
await banEntry.destroy();
- await modlogEnry.destroy();
+ await modLogEntry.destroy();
return;
}
}
- async exec(message: Message, { user, reason, time }: { user: User; reason?: string; time?: string }): Promise<void> {
+ async exec(message: Message, { user, reason, time }: { user: User; reason?: string; time?: number | string }): Promise<void> {
+ if (typeof time === 'string') {
+ time = (await Argument.cast('duration', this.client.commandHandler.resolver, message, time)) as number;
+ //// time = this.client.commandHandler.resolver.type('duration')
+ }
for await (const response of this.genResponses(message, user, reason, time)) {
await message.util.send(response);
}
}
-
- async execSlash(
- message: BushSlashMessage,
- {
- user,
- reason,
- time
- }: {
- user: SlashCommandOption<undefined>;
- reason: SlashCommandOption<string>;
- time: SlashCommandOption<string>;
- }
- ): Promise<void> {
- for await (const response of this.genResponses(message.interaction, user.user, reason?.value, time?.value)) {
- await message.reply(response);
- }
- }
}
diff --git a/src/commands/moderation/block.ts b/src/commands/moderation/block.ts
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/src/commands/moderation/block.ts
diff --git a/src/commands/moderation/kick.ts b/src/commands/moderation/kick.ts
index d00ae55..eed3038 100644
--- a/src/commands/moderation/kick.ts
+++ b/src/commands/moderation/kick.ts
@@ -1,7 +1,7 @@
import { CommandInteraction, GuildMember, Message } from 'discord.js';
import { BushCommand } from '../../lib/extensions/BushCommand';
import { BushSlashMessage } from '../../lib/extensions/BushInteractionMessage';
-import { Guild, Modlog, ModlogType } from '../../lib/models';
+import { Guild, ModLog, ModLogType } from '../../lib/models';
export default class KickCommand extends BushCommand {
constructor() {
@@ -14,17 +14,19 @@ export default class KickCommand extends BushCommand {
type: 'member',
prompt: {
start: 'What user would you like to kick?',
- retry: 'Invalid response. What user would you like to kick?'
+ retry: '{error} Choose a valid user to kick.'
}
},
{
- id: 'reason'
+ id: 'reason',
+ type: 'string',
+ match: 'restContent'
}
],
clientPermissions: ['KICK_MEMBERS'],
userPermissions: ['KICK_MEMBERS'],
description: {
- content: 'Kick a member and log it in modlogs',
+ content: 'Kick a member from the server.',
usage: 'kick <member> <reason>',
examples: ['kick @Tyman being cool']
},
@@ -51,7 +53,7 @@ export default class KickCommand extends BushCommand {
user: GuildMember,
reason?: string
): AsyncIterable<string> {
- let modlogEnry: Modlog;
+ let modlogEnry: ModLog;
// Create guild entry so postgres doesn't get mad when I try and add a modlog entry
await Guild.findOrCreate({
where: {
@@ -62,16 +64,16 @@ export default class KickCommand extends BushCommand {
}
});
try {
- modlogEnry = Modlog.build({
+ modlogEnry = ModLog.build({
user: user.id,
guild: message.guild.id,
moderator: message instanceof Message ? message.author.id : message.user.id,
- type: ModlogType.KICK,
+ type: ModLogType.KICK,
reason
});
await modlogEnry.save();
} catch (e) {
- this.client.console.error(`BanCommand`, `Error saving to database. ${e?.stack}`);
+ this.client.console.error(`KickCommand`, `Error saving to database. ${e?.stack}`);
yield `${this.client.util.emojis.error} Error saving to database. Please report this to a developer.`;
return;
}
diff --git a/src/commands/moderation/modlog.ts b/src/commands/moderation/modlog.ts
index 862a26d..e32df42 100644
--- a/src/commands/moderation/modlog.ts
+++ b/src/commands/moderation/modlog.ts
@@ -3,7 +3,7 @@ import { Argument } from 'discord-akairo';
import { Message, MessageEmbed } from 'discord.js';
import moment from 'moment';
import { BushCommand } from '../../lib/extensions/BushCommand';
-import { Modlog } from '../../lib/models';
+import { ModLog } from '../../lib/models';
export default class ModlogCommand extends BushCommand {
constructor() {
@@ -35,7 +35,8 @@ export default class ModlogCommand extends BushCommand {
id: 'search',
type: Argument.union('user', 'string'),
prompt: {
- start: 'What modlog id or user would you like to see?'
+ start: 'What modlog id or user would you like to see?',
+ retry: '{error} Choose a valid modlog id or user.'
}
};
if (typeof search === 'string') return { search, page: null };
@@ -45,7 +46,7 @@ export default class ModlogCommand extends BushCommand {
type: 'number',
prompt: {
start: 'What page?',
- retry: 'Not a number. What page?',
+ retry: '{error} Choose a valid page to view.',
optional: true
}
};
@@ -55,7 +56,7 @@ export default class ModlogCommand extends BushCommand {
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({
+ const logs = await ModLog.findAll({
where: {
guild: message.guild.id,
user: foundUser.id
@@ -65,24 +66,25 @@ export default class ModlogCommand extends BushCommand {
const niceLogs: string[] = [];
for (const log of logs) {
niceLogs.push(stripIndent`
- ID: ${log.id}
- 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'}
- Reason: ${log.reason || 'None given'}
- ${this.client.util.ordinal(logs.indexOf(log) + 1)} action
+ **Case ID**: ${log.id}
+ **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'}
+ **Reason**: ${log.reason || 'None given'}
+ **${this.client.util.ordinal(logs.indexOf(log) + 1)}** action
`);
}
const chunked: string[][] = this.client.util.chunk(niceLogs, 3);
const embedPages = chunked.map(
(e, i) =>
new MessageEmbed({
- title: `Modlogs page ${i + 1}`,
- description: e.join('\n-------------------------------------------------------\n'),
+ title: foundUser.tag,
+ description: e.join('\n**---------------------------**\n'),
footer: {
text: `Page ${i + 1}/${chunked.length}`
- }
+ },
+ color: this.client.util.colors.default
})
);
if (page) {
@@ -93,15 +95,15 @@ export default class Modlog