aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorIRONM00N <64110067+IRONM00N@users.noreply.github.com>2021-07-14 21:22:09 -0400
committerIRONM00N <64110067+IRONM00N@users.noreply.github.com>2021-07-14 21:22:09 -0400
commit53d2b18f7f73d5696fb7cd86d1c164a790dfdcc3 (patch)
treef95f23aad382879b35860d4d3be3642068fac8a2 /src
parenteaaae08aeee1fa16a4e1ad0b26fceb42885bfcde (diff)
downloadtanzanite-53d2b18f7f73d5696fb7cd86d1c164a790dfdcc3.tar.gz
tanzanite-53d2b18f7f73d5696fb7cd86d1c164a790dfdcc3.tar.bz2
tanzanite-53d2b18f7f73d5696fb7cd86d1c164a790dfdcc3.zip
started moving over some other commands
Diffstat (limited to 'src')
-rw-r--r--src/commands/config/autoPublishChannel.ts53
-rw-r--r--src/commands/config/muteRole.ts7
-rw-r--r--src/commands/config/prefix.ts7
-rw-r--r--src/commands/config/punishmentFooter.ts7
-rw-r--r--src/commands/config/welcomeChannel.ts7
-rw-r--r--src/commands/dev/_testDuration.ts53
-rw-r--r--src/commands/dev/say.ts58
-rw-r--r--src/commands/dev/setLevel.ts6
-rw-r--r--src/commands/dev/testDuration.ts53
-rw-r--r--src/commands/fun/coinflip.ts26
-rw-r--r--src/commands/fun/dice.ts23
-rw-r--r--src/commands/fun/eightBall.ts64
-rw-r--r--src/commands/fun/minesweeper.ts123
-rw-r--r--src/commands/info/avatar.ts51
-rw-r--r--src/commands/info/botInfo.ts2
-rw-r--r--src/commands/info/color.ts42
-rw-r--r--src/commands/info/guildInfo.ts171
-rw-r--r--src/commands/info/help.ts6
-rw-r--r--src/commands/info/icon.ts34
-rw-r--r--src/commands/info/invite.ts33
-rw-r--r--src/commands/info/ping.ts4
-rw-r--r--src/commands/info/snowflakeInfo.ts151
-rw-r--r--src/commands/info/userInfo.ts160
-rw-r--r--src/commands/moderation/modlog.ts12
-rw-r--r--src/commands/moderation/removeReactionEmoji.ts64
-rw-r--r--src/commands/moderation/slowmode.ts87
-rw-r--r--src/commands/skyblockReborn/chooseColorCommand.ts179
-rw-r--r--src/commands/utilities/_whoHasRole.ts (renamed from src/commands/utilities/whoHasRole.ts)0
-rw-r--r--src/commands/utilities/decode.ts131
-rw-r--r--src/commands/utilities/serverStatus.ts58
-rw-r--r--src/commands/utilities/uuid.ts43
-rw-r--r--src/commands/utilities/viewraw.ts75
-rw-r--r--src/lib/extensions/discord-akairo/BushClient.ts2
-rw-r--r--src/lib/extensions/discord-akairo/BushClientUtil.ts43
-rw-r--r--src/lib/extensions/discord.js/BushGuildMember.ts24
-rw-r--r--src/lib/models/Guild.ts8
-rw-r--r--src/lib/utils/BushConstants.ts3
-rw-r--r--src/listeners/commands/commandMissingPermissions.ts13
38 files changed, 1772 insertions, 111 deletions
diff --git a/src/commands/config/autoPublishChannel.ts b/src/commands/config/autoPublishChannel.ts
new file mode 100644
index 0000000..421e030
--- /dev/null
+++ b/src/commands/config/autoPublishChannel.ts
@@ -0,0 +1,53 @@
+import { BushCommand, BushMessage } from '@lib';
+import { Channel } from 'discord.js';
+
+export default class AutoPublishChannelCommand extends BushCommand {
+ public constructor() {
+ super('autopublishchannel', {
+ aliases: ['autopublishchannel', 'apc', 'publishchannel', 'autopublishchannels', 'publishchannels', 'autopublish'],
+ category: 'config',
+ description: {
+ content: 'A command to add/remove channels from being automatically published.',
+ usage: 'autopublishchannel <channel>',
+ examples: ['autopublishchannel #github']
+ },
+ args: [
+ {
+ id: 'channel',
+ type: 'channel',
+ match: 'content',
+ prompt: {
+ start: 'What channel would you like to toggle auto publishing in?',
+ retry: '{error} Choose a valid channel.',
+ optional: false
+ }
+ }
+ ],
+ slash: true,
+ slashOptions: [
+ {
+ name: 'channel',
+ description: 'What channel would you like me to send welcome messages in?',
+ type: 'CHANNEL',
+ required: false
+ }
+ ],
+ channel: 'guild',
+ clientPermissions: ['SEND_MESSAGES'],
+ userPermissions: ['MANAGE_GUILD', 'SEND_MESSAGES']
+ });
+ }
+
+ public async exec(message: BushMessage, { channel }: { channel: Channel }): Promise<unknown> {
+ const autoPublishChannels = await message.guild.getSetting('autoPublishChannels');
+ autoPublishChannels.includes(channel.id)
+ ? autoPublishChannels.splice(autoPublishChannels.indexOf(channel.id), 1)
+ : autoPublishChannels.push(channel.id);
+ await message.guild.setSetting('autoPublishChannels', autoPublishChannels);
+ return await message.util.reply(
+ `${this.client.util.emojis.success} Successfully ${
+ autoPublishChannels.includes(channel.id) ? 'disabled' : 'enabled'
+ } auto publishing in <#${channel.id}>.`
+ );
+ }
+}
diff --git a/src/commands/config/muteRole.ts b/src/commands/config/muteRole.ts
index 1bec4a9..9074a1d 100644
--- a/src/commands/config/muteRole.ts
+++ b/src/commands/config/muteRole.ts
@@ -11,8 +11,6 @@ export default class MuteRoleCommand extends BushCommand {
usage: 'muterole <role>',
examples: ['muterole 748912426581229690']
},
- clientPermissions: ['SEND_MESSAGES'],
- userPermissions: ['SEND_MESSAGES', 'MANAGE_GUILD'],
args: [
{
id: 'role',
@@ -32,7 +30,10 @@ export default class MuteRoleCommand extends BushCommand {
type: 'ROLE',
required: true
}
- ]
+ ],
+ channel: 'guild',
+ clientPermissions: ['SEND_MESSAGES'],
+ userPermissions: ['SEND_MESSAGES', 'MANAGE_GUILD']
});
}
diff --git a/src/commands/config/prefix.ts b/src/commands/config/prefix.ts
index 4624e99..79956be 100644
--- a/src/commands/config/prefix.ts
+++ b/src/commands/config/prefix.ts
@@ -10,8 +10,6 @@ export default class PrefixCommand extends BushCommand {
usage: 'prefix [prefix]',
examples: ['prefix', 'prefix -']
},
- clientPermissions: ['SEND_MESSAGES'],
- userPermissions: ['SEND_MESSAGES', 'MANAGE_GUILD'],
args: [
{
id: 'prefix',
@@ -31,7 +29,10 @@ export default class PrefixCommand extends BushCommand {
type: 'STRING',
required: false
}
- ]
+ ],
+ channel: 'guild',
+ clientPermissions: ['SEND_MESSAGES'],
+ userPermissions: ['SEND_MESSAGES', 'MANAGE_GUILD']
});
}
diff --git a/src/commands/config/punishmentFooter.ts b/src/commands/config/punishmentFooter.ts
index 3a246df..6b2759a 100644
--- a/src/commands/config/punishmentFooter.ts
+++ b/src/commands/config/punishmentFooter.ts
@@ -11,8 +11,6 @@ export default class PunishmentFooterCommand extends BushCommand {
usage: 'punishmentfooter [message]',
examples: ['punishmentfooter', 'prefix you can appeal at https://example.com.']
},
- clientPermissions: ['SEND_MESSAGES'],
- userPermissions: ['SEND_MESSAGES', 'MANAGE_GUILD'],
args: [
{
id: 'ending',
@@ -33,7 +31,10 @@ export default class PunishmentFooterCommand extends BushCommand {
type: 'STRING',
required: false
}
- ]
+ ],
+ channel: 'guild',
+ clientPermissions: ['SEND_MESSAGES'],
+ userPermissions: ['SEND_MESSAGES', 'MANAGE_GUILD']
});
}
diff --git a/src/commands/config/welcomeChannel.ts b/src/commands/config/welcomeChannel.ts
index 71d59f8..488a0a9 100644
--- a/src/commands/config/welcomeChannel.ts
+++ b/src/commands/config/welcomeChannel.ts
@@ -11,8 +11,6 @@ export default class WelcomeChannelCommand extends BushCommand {
usage: 'welcomechannel [channel]',
examples: ['welcomechannel #welcome']
},
- clientPermissions: ['SEND_MESSAGES'],
- userPermissions: ['SEND_MESSAGES', 'MANAGE_GUILD'],
args: [
{
id: 'channel',
@@ -32,7 +30,10 @@ export default class WelcomeChannelCommand extends BushCommand {
type: 'CHANNEL',
required: false
}
- ]
+ ],
+ channel: 'guild',
+ clientPermissions: ['SEND_MESSAGES'],
+ userPermissions: ['SEND_MESSAGES', 'MANAGE_GUILD']
});
}
public async exec(message: BushMessage | BushSlashMessage, args: { channel: Channel }): Promise<unknown> {
diff --git a/src/commands/dev/_testDuration.ts b/src/commands/dev/_testDuration.ts
new file mode 100644
index 0000000..3ad9aff
--- /dev/null
+++ b/src/commands/dev/_testDuration.ts
@@ -0,0 +1,53 @@
+// import { BushCommand, BushSlashMessage } from '@lib';
+// import { stripIndents } from 'common-tags';
+// import { Message } from 'discord.js';
+
+// export default class TestDurationCommand extends BushCommand {
+// public constructor() {
+// super('testduration', {
+// aliases: ['testduration'],
+// category: 'dev',
+// description: {
+// content: 'Tests duration parsing.',
+// usage: 'testduration [reason]',
+// examples: ['testduration']
+// },
+// args: [
+// {
+// id: 'reason',
+// type: 'contentWithDuration',
+// match: 'rest',
+// prompt: {
+// start: 'Enter text and a duration here.',
+// retry: '{error} Error parsing duration and text.',
+// optional: true
+// }
+// }
+// ],
+// slash: true,
+// slashOptions: [
+// {
+// name: 'reason',
+// description: 'Enter text and a duration here.',
+// type: 'STRING',
+// required: false
+// }
+// ],
+// hidden: true,
+// ownerOnly: true
+// });
+// }
+
+// async exec(
+// message: Message | BushSlashMessage,
+// { reason }: { reason?: { duration: number; contentWithoutTime: string } }
+// ): Promise<unknown> {
+// const rawDuration = reason.duration;
+// const text = reason.contentWithoutTime;
+// const humanizedDuration = this.client.util.humanizeDuration(rawDuration);
+// return await message.util.reply(stripIndents`
+// **rawDuration:** ${rawDuration}
+// **text:** ${text}
+// **humanizedDuration:** ${humanizedDuration}`);
+// }
+// }
diff --git a/src/commands/dev/say.ts b/src/commands/dev/say.ts
new file mode 100644
index 0000000..9dc2632
--- /dev/null
+++ b/src/commands/dev/say.ts
@@ -0,0 +1,58 @@
+import { AllowedMentions, BushCommand, BushMessage } from '@lib';
+import { AkairoMessage } from 'discord-akairo';
+
+export default class SayCommand extends BushCommand {
+ public constructor() {
+ super('say', {
+ aliases: ['say'],
+ category: 'dev',
+ description: {
+ content: 'A command make the bot say something.',
+ usage: 'say <message>',
+ examples: ['say hello']
+ },
+ args: [
+ {
+ id: 'say',
+ type: 'string',
+ match: 'rest',
+ prompt: {
+ start: 'What would you like the bot to say?',
+ retry: '{error} Choose something valid to say.'
+ }
+ }
+ ],
+ slashOptions: [
+ {
+ name: 'content',
+ description: 'What would you like the bot to say?',
+ type: 'STRING'
+ }
+ ],
+ ownerOnly: true,
+ clientPermissions: ['SEND_MESSAGES'],
+ slash: true
+ });
+ }
+
+ public async exec(message: BushMessage, { say }: { say: string }): Promise<unknown> {
+ if (!message.author.isOwner())
+ return await message.util.reply(`${this.client.util.emojis.error} Only my developers can run this command.`);
+
+ if (message.deletable) {
+ await message.delete();
+ }
+ await message.util.send({ content: say, allowedMentions: AllowedMentions.none() });
+ }
+
+ public async execSlash(message: AkairoMessage, { content }: { content: string }): Promise<unknown> {
+ if (!this.client.config.owners.includes(message.author.id)) {
+ return await message.interaction.reply({
+ content: `${this.client.util.emojis.error} Only my developers can run this command.`,
+ ephemeral: true
+ });
+ }
+ await message.interaction.reply({ content: 'Attempting to send message.', ephemeral: true });
+ return message.channel.send({ content, allowedMentions: AllowedMentions.none() });
+ }
+}
diff --git a/src/commands/dev/setLevel.ts b/src/commands/dev/setLevel.ts
index db0cfab..f2ae6c7 100644
--- a/src/commands/dev/setLevel.ts
+++ b/src/commands/dev/setLevel.ts
@@ -29,21 +29,21 @@ export default class SetLevelCommand extends BushCommand {
}
}
],
- ownerOnly: true,
slashOptions: [
{
name: 'user',
- description: 'The user to change the level of',
+ description: 'What user would you like to change the level of?',
type: 'USER',
required: true
},
{
name: 'level',
- description: 'The level to set the user to',
+ description: 'What level would you like to set the user to?',
type: 'INTEGER',
required: true
}
],
+ ownerOnly: true,
slash: true
});
}
diff --git a/src/commands/dev/testDuration.ts b/src/commands/dev/testDuration.ts
deleted file mode 100644
index 2d636d2..0000000
--- a/src/commands/dev/testDuration.ts
+++ /dev/null
@@ -1,53 +0,0 @@
-import { BushCommand, BushSlashMessage } from '@lib';
-import { stripIndents } from 'common-tags';
-import { Message } from 'discord.js';
-
-export default class TestDurationCommand extends BushCommand {
- public constructor() {
- super('testduration', {
- aliases: ['testduration'],
- category: 'dev',
- description: {
- content: 'Tests duration parsing.',
- usage: 'testduration [reason]',
- examples: ['testduration']
- },
- args: [
- {
- id: 'reason',
- type: 'contentWithDuration',
- match: 'rest',
- prompt: {
- start: 'Enter text and a duration here.',
- retry: '{error} Error parsing duration and text.',
- optional: true
- }
- }
- ],
- slash: true,
- slashOptions: [
- {
- name: 'reason',
- description: 'Enter text and a duration here.',
- type: 'STRING',
- required: false
- }
- ],
- hidden: true,
- ownerOnly: true
- });
- }
-
- async exec(
- message: Message | BushSlashMessage,
- { reason }: { reason?: { duration: number; contentWithoutTime: string } }
- ): Promise<unknown> {
- const rawDuration = reason.duration;
- const text = reason.contentWithoutTime;
- const humanizedDuration = this.client.util.humanizeDuration(rawDuration);
- return await message.util.reply(stripIndents`
- **rawDuration:** ${rawDuration}
- **text:** ${text}
- **humanizedDuration:** ${humanizedDuration}`);
- }
-}
diff --git a/src/commands/fun/coinflip.ts b/src/commands/fun/coinflip.ts
new file mode 100644
index 0000000..68484bb
--- /dev/null
+++ b/src/commands/fun/coinflip.ts
@@ -0,0 +1,26 @@
+import { BushCommand, BushMessage, BushSlashMessage } from '@lib';
+
+export default class CoinFlipCommand extends BushCommand {
+ public constructor() {
+ super('coinflip', {
+ aliases: ['coinflip', 'cf'],
+ category: 'fun',
+ description: {
+ content: 'Flip a virtual coin.',
+ usage: 'coinflip',
+ examples: ['coinflip']
+ },
+ clientPermissions: ['SEND_MESSAGES']
+ });
+ }
+
+ public async exec(message: BushMessage | BushSlashMessage): Promise<void> {
+ const random = Math.random();
+ let result: string;
+ const fall = message.author.id === '322862723090219008' ? 0.1 : 0.001;
+ if (random < fall) result = 'The coin fell off the table :(';
+ else if (random <= 0.5 + fall / 2) result = 'Heads';
+ else result = 'Tails';
+ await message.util.reply(result);
+ }
+}
diff --git a/src/commands/fun/dice.ts b/src/commands/fun/dice.ts
new file mode 100644
index 0000000..46b159b
--- /dev/null
+++ b/src/commands/fun/dice.ts
@@ -0,0 +1,23 @@
+import { BushCommand, BushMessage, BushSlashMessage } from '@lib';
+
+export default class EightBallCommand extends BushCommand {
+ public constructor() {
+ super('dice', {
+ aliases: ['dice', 'die'],
+ category: 'fun',
+ description: {
+ content: 'Roll virtual dice.',
+ usage: 'dice',
+ examples: ['dice']
+ },
+ clientPermissions: ['SEND_MESSAGES'],
+ slash: true
+ });
+ }
+
+ public async exec(message: BushMessage | BushSlashMessage): Promise<unknown> {
+ const responses = ['1', '2', '3', '4', '5', '6'];
+ const answer = responses[Math.floor(Math.random() * responses.length)];
+ return await message.util.reply(`You rolled a **${answer}**.`);
+ }
+}
diff --git a/src/commands/fun/eightBall.ts b/src/commands/fun/eightBall.ts
new file mode 100644
index 0000000..7b7d39c
--- /dev/null
+++ b/src/commands/fun/eightBall.ts
@@ -0,0 +1,64 @@
+import { BushCommand, BushMessage, BushSlashMessage } from '../../lib';
+
+export default class EightBallCommand extends BushCommand {
+ public constructor() {
+ super('eightBall', {
+ aliases: ['8ball', 'eightball'],
+ category: 'fun',
+ description: {
+ content: 'Ask questions for a randomly generated response.',
+ usage: '8Ball <question>',
+ examples: ['8Ball does anyone love me?']
+ },
+ args: [
+ {
+ id: 'question',
+ type: 'string',
+ match: 'rest',
+ prompt: {
+ start: 'What question would you like answered?',
+ retry: '{error} Invalid question.'
+ }
+ }
+ ],
+ slash: true,
+ slashOptions: [
+ {
+ name: 'question',
+ description: 'What question would you like answered?',
+ type: 'STRING',
+ required: true
+ }
+ ],
+ clientPermissions: ['SEND_MESSAGES'],
+ userPermissions: ['SEND_MESSAGES']
+ });
+ }
+
+ public async exec(message: BushMessage | BushSlashMessage): Promise<void> {
+ const responses = [
+ 'It is certain',
+ 'Without a doubt',
+ 'You may rely on it',
+ 'Yes definitely',
+ 'It is decidedly so',
+ 'As I see it, yes',
+ 'Most likely',
+ 'Yes',
+ 'Outlook good',
+ 'Signs point to yes',
+ 'Reply hazy try again',
+ 'Better not tell you now',
+ 'Ask again later',
+ 'Cannot predict now',
+ 'Concentrate and ask again',
+ "Don't count on it",
+ 'Outlook not so good',
+ 'My sources say no',
+ 'Very doubtful',
+ 'My reply is no'
+ ];
+ const answer = responses[Math.floor(Math.random() * responses.length)];
+ await message.util.reply(answer);
+ }
+}
diff --git a/src/commands/fun/minesweeper.ts b/src/commands/fun/minesweeper.ts
new file mode 100644
index 0000000..2b46e34
--- /dev/null
+++ b/src/commands/fun/minesweeper.ts
@@ -0,0 +1,123 @@
+import { BushCommand, BushMessage, BushSlashMessage } from '@lib';
+import Minesweeper from 'discord.js-minesweeper';
+
+export default class MinesweeperCommand extends BushCommand {
+ public constructor() {
+ super('minesweeper', {
+ aliases: ['minesweeper'],
+ category: 'fun',
+ description: {
+ content: 'minesweeper command.',
+ usage: 'minesweeper <rows> <columns> <mines> [--spaces] [--revealFirstCell]',
+ examples: ['minesweeper 10 10 2']
+ },
+ args: [
+ {
+ id: 'rows',
+ type: 'integer',
+ prompt: {
+ start: 'How many rows would you like?',
+ retry: '{error} Choose a valid number of rows',
+ optional: true
+ },
+ default: 9
+ },
+ {
+ id: 'columns',
+ type: 'integer',
+ prompt: {
+ start: 'How many columns would you like?',
+ retry: '{error} Choose a valid number of columns',
+ optional: true
+ },
+ default: 9
+ },
+ {
+ id: 'mines',
+ type: 'integer',
+ prompt: {
+ start: 'How many mines would you like?',
+ retry: '{error} Choose a valid number of mines',
+ optional: true
+ },
+ default: 10
+ },
+ {
+ id: 'spaces',
+ match: 'flag',
+ flag: '--spaces'
+ },
+ {
+ id: 'reveal_first_cell',
+ match: 'flag',
+ flag: '--revealFirstCell'
+ }
+ ],
+ slash: true,
+ slashOptions: [
+ {
+ name: 'rows',
+ description: 'How many rows would you like?',
+ type: 'INTEGER',
+ required: false
+ },
+ {
+ name: 'columns',
+ description: 'How many rows would you like?',
+ type: 'INTEGER',
+ required: false
+ },
+ {
+ name: 'mines',
+ description: 'How many rows would you like?',
+ type: 'INTEGER',
+ required: false
+ },
+ {
+ name: 'spaces',
+ description: 'Would you like there to be spaces?',
+ type: 'BOOLEAN',
+ required: false
+ },
+ {
+ name: 'reveal_first_cell',
+ description: 'Would you like to automatically reveal the first cell?',
+ type: 'BOOLEAN',
+ required: false
+ }
+ ],
+ clientPermissions: ['SEND_MESSAGES'],
+ userPermissions: ['SEND_MESSAGES']
+ });
+ }
+
+ public async exec(
+ message: BushMessage | BushSlashMessage,
+ {
+ rows,
+ columns,
+ mines,
+ spaces,
+ reveal_first_cell
+ }: {
+ rows: number;
+ columns: number;
+ mines: number;
+ spaces: boolean;
+ reveal_first_cell: boolean;
+ }
+ ): Promise<unknown> {
+ const minesweeper = new Minesweeper({
+ rows: rows ?? 9,
+ columns: columns ?? 9,
+ mines: mines ?? 10,
+ emote: 'boom',
+ revealFirstCell: reveal_first_cell ?? false,
+ zeroFirstCell: true,
+ spaces: spaces ?? false,
+ returnType: 'emoji'
+ });
+ const matrix = minesweeper.start();
+ return await message.util.reply(matrix.toString());
+ }
+}
diff --git a/src/commands/info/avatar.ts b/src/commands/info/avatar.ts
new file mode 100644
index 0000000..3d1776f
--- /dev/null
+++ b/src/commands/info/avatar.ts
@@ -0,0 +1,51 @@
+import { Constants } from 'discord-akairo';
+import { MessageEmbed, User } from 'discord.js';
+import { BushCommand, BushMessage, BushSlashMessage } from '../../lib';
+
+export default class AvatarCommand extends BushCommand {
+ constructor() {
+ super('avatar', {
+ aliases: ['avatar', 'av'],
+ category: 'info',
+ description: {
+ content: "A command to get a user's avatar",
+ usage: 'avatar [user]',
+ examples: 'avatar'
+ },
+ args: [
+ {
+ id: 'user',
+ type: Constants.ArgumentTypes.USER,
+ match: Constants.ArgumentMatches.PHRASE,
+ prompt: {
+ start: 'Who would you like to see the avatar of?',
+ retry: '{error} Choose a valid user.',
+ optional: true
+ }
+ }
+ ],
+ clientPermissions: ['SEND_MESSAGES', 'EMBED_LINKS'],
+ slash: true,
+ slashOptions: [
+ {
+ name: 'user',
+ description: 'The user you would like to find the avatar of.',
+ type: 'USER',
+ required: false
+ }
+ ]
+ });
+ }
+
+ async exec(message: BushMessage | BushSlashMessage, { user }: { user: User }): Promise<void> {
+ user = user ?? message.author;
+
+ const embed = new MessageEmbed()
+ .setTimestamp()
+ .setColor(this.client.util.colors.default)
+ .setTitle(user.tag)
+ .setImage(user.avatarURL({ size: 2048, format: 'png', dynamic: true }));
+
+ await message.util.reply({ embeds: [embed] });
+ }
+}
diff --git a/src/commands/info/botInfo.ts b/src/commands/info/botInfo.ts
index d5941b2..986bd01 100644
--- a/src/commands/info/botInfo.ts
+++ b/src/commands/info/botInfo.ts
@@ -4,7 +4,7 @@ import { MessageEmbed, version as discordJSVersion } from 'discord.js';
export default class BotInfoCommand extends BushCommand {
public constructor() {
super('botinfo', {
- aliases: ['botinfo'],
+ aliases: ['botinfo', 'stats'],
category: 'info',
description: {
content: 'Shows information about the bot',
diff --git a/src/commands/info/color.ts b/src/commands/info/color.ts
new file mode 100644
index 0000000..4db20e7
--- /dev/null
+++ b/src/commands/info/color.ts
@@ -0,0 +1,42 @@
+import { BushCommand, BushMessage, BushSlashMessage } from '@lib';
+import { Constants } from 'discord-akairo';
+import { ColorResolvable, MessageEmbed } from 'discord.js';
+
+export default class ColorCommand extends BushCommand {
+ public constructor() {
+ super('color', {
+ aliases: ['color'],
+ category: 'info',
+ description: {
+ content: 'See what color a hex code is.',
+ usage: 'color <color>',
+ examples: ['color #0000FF']
+ },
+ args: [
+ {
+ id: 'color',
+ type: /^#?(?<code>[0-9A-F]{6})$/i,
+ match: Constants.ArgumentMatches.PHRASE,
+ prompt: {
+ start: 'What color value would you like to see the color of',
+ retry: '{error} Choose a valid hex color code.'
+ }
+ }
+ ],
+ channel: 'guild',
+ clientPermissions: ['EMBED_LINKS', 'SEND_MESSAGES']
+ });
+ }
+
+ public async exec(
+ message: BushMessage | BushSlashMessage,
+ { color: { match } }: { color: { match: RegExpMatchArray; matches: RegExpMatchArray[] } }
+ ): Promise<unknown> {
+ const embed = new MessageEmbed()
+ .addField('Hex', match.groups.code, false)
+ .addField('RGB', this.client.util.hexToRgb(match.groups.code), false)
+ .setColor(match.groups.code as ColorResolvable);
+
+ return await message.util.reply({ embeds: [embed] });
+ }
+}
diff --git a/src/commands/info/guildInfo.ts b/src/commands/info/guildInfo.ts
new file mode 100644
index 0000000..a3e7405
--- /dev/null
+++ b/src/commands/info/guildInfo.ts
@@ -0,0 +1,171 @@
+import { Argument, Constants } from 'discord-akairo';
+import { Guild, GuildPreview, MessageEmbed, Snowflake, Vanity } from 'discord.js';
+import { BushCommand, BushMessage, BushSlashMessage } from '../../lib';
+
+// TODO: Implement regions and security
+export default class GuildInfoCommand extends BushCommand {
+ public constructor() {
+ super('guildInfo', {
+ aliases: ['guildinfo', 'serverinfo', 'guild', 'server', 'g'],
+ category: 'info',
+ description: {
+ content: 'Get info about a server.',
+ usage: 'guildinfo [guild]',
+ examples: ['guildinfo 516977525906341928']
+ },
+ args: [
+ {
+ id: 'guild',
+ type: Argument.union(Constants.ArgumentTypes.GUILD, Constants.ArgumentTypes.BIGINT),
+ match: Constants.ArgumentMatches.PHRASE,
+ prompt: {
+ start: 'What server would you like to find information about?',
+ retry: '{error} Choose a valid server to find information about.',
+ optional: true
+ }
+ }
+ ],
+ slash: true,
+ slashOptions: [
+ {
+ name: 'guild',
+ description: 'The id of the guild you would like to find information about.',
+ type: 'STRING',
+ required: false
+ }
+ ],
+ clientPermissions: ['EMBED_LINKS', 'SEND_MESSAGES'],
+ userPermissions: ['SEND_MESSAGES']
+ });
+ }
+
+ public async exec(me