aboutsummaryrefslogtreecommitdiff
path: root/src/lib/extensions
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/extensions')
-rw-r--r--src/lib/extensions/BushClient.ts27
-rw-r--r--src/lib/extensions/BushClientUtil.ts251
-rw-r--r--src/lib/extensions/BushCommand.ts9
-rw-r--r--src/lib/extensions/BushCommandHandler.ts268
4 files changed, 67 insertions, 488 deletions
diff --git a/src/lib/extensions/BushClient.ts b/src/lib/extensions/BushClient.ts
index 5c7729c..8592281 100644
--- a/src/lib/extensions/BushClient.ts
+++ b/src/lib/extensions/BushClient.ts
@@ -3,6 +3,7 @@ import { AkairoClient, TaskHandler } from 'discord-akairo';
import { APIMessage, Guild, Intents, Message, MessageOptions, Snowflake, UserResolvable } from 'discord.js';
import * as path from 'path';
import { exit } from 'process';
+import readline from 'readline';
import { Sequelize } from 'sequelize';
import * as config from '../../config/options';
import * as Models from '../models';
@@ -17,6 +18,12 @@ import { BushListenerHandler } from './BushListenerHandler';
export type BotConfig = typeof config;
export type BushMessageType = string | APIMessage | (MessageOptions & { split?: false });
+const rl = readline.createInterface({
+ input: process.stdin,
+ output: process.stdout,
+ terminal: false
+});
+
export class BushClient extends AkairoClient {
public config: BotConfig;
public listenerHandler: BushListenerHandler;
@@ -66,9 +73,9 @@ export class BushClient extends AkairoClient {
this.commandHandler = new BushCommandHandler(this, {
directory: path.join(__dirname, '..', '..', 'commands'),
prefix: async ({ guild }: { guild: Guild }) => {
+ if (this.config.dev) return 'dev';
const row = await Models.Guild.findByPk(guild.id);
- if (!row) return this.config.prefix;
- return row.prefix as string;
+ return (row?.prefix || this.config.prefix) as string;
},
allowMention: true,
handleEdits: true,
@@ -114,9 +121,14 @@ export class BushClient extends AkairoClient {
this.commandHandler.useListenerHandler(this.listenerHandler);
this.commandHandler.useInhibitorHandler(this.inhibitorHandler);
this.listenerHandler.setEmitters({
+ client: this,
commandHandler: this.commandHandler,
listenerHandler: this.listenerHandler,
- process
+ inhibitorHandler: this.inhibitorHandler,
+ taskHandler: this.taskHandler,
+ process,
+ stdin: rl,
+ gateway: this.ws
});
// loads all the handlers
const loaders = {
@@ -128,7 +140,7 @@ export class BushClient extends AkairoClient {
for (const loader of Object.keys(loaders)) {
try {
loaders[loader].loadAll();
- this.logger.success('Startup', `Successfully loaded <<${loader}>>.` + chalk.cyan() + '.', false);
+ this.logger.success('Startup', `Successfully loaded <<${loader}>>.`, false);
} catch (e) {
this.logger.error('Startup', `Unable to load loader <<${loader}>> with error:\n${e?.stack}`, false);
}
@@ -145,7 +157,10 @@ export class BushClient extends AkairoClient {
Models.Ban.initModel(this.db);
Models.Level.initModel(this.db);
await this.db.sync(); // Sync all tables to fix everything if updated
- } catch (error) {}
+ this.console.success('Startup', `Successfully connected to <<database>>.`, false);
+ } catch (error) {
+ this.console.error('Startup', `Failed to connect to <<database>> with error:\n` + error, false);
+ }
}
public async start(): Promise<void> {
@@ -158,7 +173,7 @@ export class BushClient extends AkairoClient {
}
}
- public destroy(relogin = true): void | Promise<string> {
+ public destroy(relogin = false): void | Promise<string> {
super.destroy();
if (relogin) {
return this.login(this.token);
diff --git a/src/lib/extensions/BushClientUtil.ts b/src/lib/extensions/BushClientUtil.ts
index 2836983..2ecdc42 100644
--- a/src/lib/extensions/BushClientUtil.ts
+++ b/src/lib/extensions/BushClientUtil.ts
@@ -1,5 +1,5 @@
import { exec } from 'child_process';
-import { ClientUtil, Command } from 'discord-akairo';
+import { ClientUtil } from 'discord-akairo';
import {
APIInteractionDataResolvedChannel,
APIInteractionDataResolvedGuildMember,
@@ -12,7 +12,6 @@ import {
CommandInteraction,
CommandInteractionOption,
Constants,
- Guild,
GuildChannel,
GuildMember,
InteractionReplyOptions,
@@ -312,11 +311,11 @@ export class BushClientUtil extends ClientUtil {
const style = Constants.MessageButtonStyles.PRIMARY;
let curPage = 0;
if (typeof embeds !== 'object') throw 'embeds must be an object';
- const msg = (await message.util.reply({
+ const msg: Message = await message.util.reply({
content: text,
embeds: [embeds[curPage]],
components: [getPaginationRow()]
- })) as Message;
+ });
const filter = (interaction: ButtonInteraction) =>
interaction.customID.startsWith('paginate_') && interaction.message == msg;
const collector = msg.createMessageComponentInteractionCollector(filter, { time: 300000 });
@@ -406,7 +405,7 @@ export class BushClientUtil extends ClientUtil {
/** Sends a message with a button for the user to delete it. */
public async sendWithDeleteButton(message: BushMessage, options: MessageOptions): Promise<void> {
updateOptions();
- const msg = (await message.util.reply(options as MessageOptions & { split?: false })) as Message;
+ const msg = await message.util.reply(options as MessageOptions & { split?: false });
const filter = (interaction: ButtonInteraction) => interaction.customID == 'paginate__stop' && interaction.message == msg;
const collector = msg.createMessageComponentInteractionCollector(filter, { time: 300000 });
collector.on('collect', async (interaction: MessageComponentInteraction) => {
@@ -488,248 +487,6 @@ export class BushClientUtil extends ClientUtil {
public getConfigChannel(channel: 'log' | 'error' | 'dm'): Promise<TextChannel> {
return this.client.channels.fetch(this.client.config.channels[channel]) as Promise<TextChannel>;
}
-
- /** A bunch of mappings */
- public mappings = {
- guilds: {
- bush: '516977525906341928',
- tree: '767448775450820639',
- staff: '784597260465995796',
- space_ship: '717176538717749358',
- sbr: '839287012409999391'
- },
-
- permissions: {
- CREATE_INSTANT_INVITE: { name: 'Create Invite', important: false },
- KICK_MEMBERS: { name: 'Kick Members', important: true },
- BAN_MEMBERS: { name: 'Ban Members', important: true },
- ADMINISTRATOR: { name: 'Administrator', important: true },
- MANAGE_CHANNELS: { name: 'Manage Channels', important: true },
- MANAGE_GUILD: { name: 'Manage Server', important: true },
- ADD_REACTIONS: { name: 'Add Reactions', important: false },
- VIEW_AUDIT_LOG: { name: 'View Audit Log', important: true },
- PRIORITY_SPEAKER: { name: 'Priority Speaker', important: true },
- STREAM: { name: 'Video', important: false },
- VIEW_CHANNEL: { name: 'View Channel', important: false },
- SEND_MESSAGES: { name: 'Send Messages', important: false },
- SEND_TTS_MESSAGES: { name: 'Send Text-to-Speech Messages', important: true },
- MANAGE_MESSAGES: { name: 'Manage Messages', important: true },
- EMBED_LINKS: { name: 'Embed Links', important: false },
- ATTACH_FILES: { name: 'Attach Files', important: false },
- READ_MESSAGE_HISTORY: { name: 'Read Message History', important: false },
- MENTION_EVERYONE: { name: 'Mention @​everyone, @​here, and All Roles', important: true }, // name has a zero-width space to prevent accidents
- USE_EXTERNAL_EMOJIS: { name: 'Use External Emoji', important: false },
- VIEW_GUILD_INSIGHTS: { name: 'View Server Insights', important: true },
- CONNECT: { name: 'Connect', important: false },
- SPEAK: { name: 'Speak', important: false },
- MUTE_MEMBERS: { name: 'Mute Members', important: true },
- DEAFEN_MEMBERS: { name: 'Deafen Members', important: true },
- MOVE_MEMBERS: { name: 'Move Members', important: true },
- USE_VAD: { name: 'Use Voice Activity', important: false },
- CHANGE_NICKNAME: { name: 'Change Nickname', important: false },
- MANAGE_NICKNAMES: { name: 'Change Nicknames', important: true },
- MANAGE_ROLES: { name: 'Manage Roles', important: true },
- MANAGE_WEBHOOKS: { name: 'Manage Webhooks', important: true },
- MANAGE_EMOJIS: { name: 'Manage Emojis', important: true },
- USE_APPLICATION_COMMANDS: { name: 'Use Slash Commands', important: false },
- REQUEST_TO_SPEAK: { name: 'Request to Speak', important: false },
- USE_PUBLIC_THREADS: { name: 'Use Public Threads', important: false },
- USE_PRIVATE_THREADS: { name: 'Use Private Threads', important: true }
- },
-
- features: {
- ANIMATED_ICON: { name: 'Animated Icon', important: false, emoji: '<:animatedIcon:850774498071412746>', weight: 14 },
- BANNER: { name: 'Banner', important: false, emoji: '<:banner:850786673150787614>', weight: 15 },
- COMMERCE: { name: 'Store Channels', important: true, emoji: '<:storeChannels:850786692432396338>', weight: 11 },
- COMMUNITY: { name: 'Community', important: false, emoji: '<:community:850786714271875094>', weight: 20 },
- DISCOVERABLE: { name: 'Discoverable', important: true, emoji: '<:discoverable:850786735360966656>', weight: 6 },
- ENABLED_DISCOVERABLE_BEFORE: {
- name: 'Enabled Discovery Before',
- important: false,
- emoji: '<:enabledDiscoverableBefore:850786754670624828>',
- weight: 7
- },
- FEATURABLE: { name: 'Featurable', important: true, emoji: '<:featurable:850786776372084756>', weight: 4 },
- INVITE_SPLASH: { name: 'Invite Splash', important: false, emoji: '<:inviteSplash:850786798246559754>', weight: 16 },
- MEMBER_VERIFICATION_GATE_ENABLED: {
- name: 'Membership Verification Gate',
- important: false,
- emoji: '<:memberVerificationGateEnabled:850786829984858212>',
- weight: 18
- },
- MONETIZATION_ENABLED: { name: 'Monetization Enabled', important: true, emoji: null, weight: 8 },
- MORE_EMOJI: { name: 'More Emoji', important: true, emoji: '<:moreEmoji:850786853497602080>', weight: 3 },
- MORE_STICKERS: { name: 'More Stickers', important: true, emoji: null, weight: 2 },
- NEWS: {
- name: 'Announcement Channels',
- important: false,
- emoji: '<:announcementChannels:850790491796013067>',
- weight: 17
- },
- PARTNERED: { name: 'Partnered', important: true, emoji: '<:partneredServer:850794851955507240>', weight: 1 },
- PREVIEW_ENABLED: { name: 'Preview Enabled', important: true, emoji: '<:previewEnabled:850790508266913823>', weight: 10 },
- RELAY_ENABLED: { name: 'Relay Enabled', important: true, emoji: '<:relayEnabled:850790531441229834>', weight: 5 },
- TICKETED_EVENTS_ENABLED: { name: 'Ticketed Events Enabled', important: true, emoji: null, weight: 9 },
- VANITY_URL: { name: 'Vanity URL', important: false, emoji: '<:vanityURL:850790553079644160>', weight: 12 },
- VERIFIED: { name: 'Verified', important: true, emoji: '<:verified:850795049817473066>', weight: 0 },
- VIP_REGIONS: { name: 'VIP Regions', important: false, emoji: '<:VIPRegions:850794697496854538>', weight: 13 },
- WELCOME_SCREEN_ENABLED: {
- name: 'Welcome Screen Enabled',
- important: false,
- emoji: '<:welcomeScreenEnabled:850790575875817504>',
- weight: 19
- }
- },
-
- otherEmojis: {
- SERVER_BOOSTER_1: '<:serverBooster1:848740052091142145>',
- SERVER_BOOSTER_2: '<:serverBooster2:848740090506510388>',
- SERVER_BOOSTER_3: '<:serverBooster3:848740124992077835>',
- SERVER_BOOSTER_6: '<:serverBooster6:848740155245461514>',
- SERVER_BOOSTER_9: '<:serverBooster9:848740188846030889>',
- SERVER_BOOSTER_12: '<:serverBooster12:848740304365551668>',
- SERVER_BOOSTER_15: '<:serverBooster15:848740354890137680>',
- SERVER_BOOSTER_18: '<:serverBooster18:848740402886606868>',
- SERVER_BOOSTER_24: '<:serverBooster24:848740444628320256>',
- NITRO: '<:nitro:848740498054971432>',
- BOOSTER: '<:booster:848747775020892200>',
- OWNER: '<:owner:848746439311753286>',
- ADMIN: '<:admin:848963914628333598>',
- SUPERUSER: '<:superUser:848947986326224926>',
- DEVELOPER: '<:developer:848954538111139871>',
- BUSH_VERIFIED: '<:verfied:853360152090771497>',
- BOOST_1: '<:boostitle:853363736679940127>',
- BOOST_2: '<:boostitle:853363752728789075>',
- BOOST_3: '<:boostitle:853363769132056627>',
- TEXT: '<:text:853375537791893524>',
- NEWS: '<:announcements:853375553531674644>',
- VOICE: '<:voice:853375566735212584>',
- STAGE: '<:stage:853375583521210468>',
- STORE: '<:store:853375601175691266>',
- CATEGORY: '<:category:853375615260819476>'
- },
-
- userFlags: {
- DISCORD_EMPLOYEE: '<:discordEmployee:848742947826434079>',
- PARTNERED_SERVER_OWNER: '<:partneredServerOwner:848743051593777152>',
- HYPESQUAD_EVENTS: '<:hypeSquadEvents:848743108283072553>',
- BUGHUNTER_LEVEL_1: '<:bugHunter:848743239850393640>',
- HOUSE_BRAVERY: '<:hypeSquadBravery:848742910563844127>',
- HOUSE_BRILLIANCE: '<:hypeSquadBrilliance:848742840649646101>',
- HOUSE_BALANCE: '<:hypeSquadBalance:848742877537370133>',
- EARLY_SUPPORTER: '<:earlySupporter:848741030102171648>',
- //'TEAM_USER': '',
- //'SYSTEM': '',
- BUGHUNTER_LEVEL_2: '<:bugHunterGold:848743283080822794>',
- //'VERIFIED_BOT': '',
- EARLY_VERIFIED_BOT_DEVELOPER: '<:earlyVerifiedBotDeveloper:848741079875846174>'
- },
-
- status: {
- online: '<:online:848937141639577690>',
- idle: '<:idle:848937158261211146>',
- dnd: '<:dnd:848937173780135986>',
- offline: '<:offline:848939387277672448>',
- streaming: '<:streaming:848937187479519242>'
- },
-
- maybeNitroDiscrims: ['1111', '2222', '3333', '4444', '5555', '6666', '6969', '7777', '8888', '9999'],
-
- capes: [
- // supporter capes
- { name: 'patreon1', index: 0 },
- { name: 'patreon2', index: 1 },
- { name: 'fade', custom: 'https://raw.githubusercontent.com/NotEnoughUpdates/capes/master/fade.gif', index: 2 },
- { name: 'lava', custom: 'https://raw.githubusercontent.com/NotEnoughUpdates/capes/master/lava.gif', index: 3 },
- {
- name: 'mcworld',
- custom: 'https://raw.githubusercontent.com/NotEnoughUpdates/capes/master/mcworld_compressed.gif',
- index: 4
- },
- {
- name: 'negative',
- custom: 'https://raw.githubusercontent.com/NotEnoughUpdates/capes/master/negative_compressed.gif',
- index: 5
- },
- {
- name: 'space',
- custom: 'https://raw.githubusercontent.com/NotEnoughUpdates/capes/master/space_compressed.gif',
- index: 6
- },
- { name: 'void', custom: 'https://raw.githubusercontent.com/NotEnoughUpdates/capes/master/void.gif', index: 7 },
- { name: 'tunnel', custom: 'https://raw.githubusercontent.com/NotEnoughUpdates/capes/master/tunnel.gif', index: 8 },
- // Staff capes
- { name: 'contrib', index: 9 },
- { name: 'mbstaff', index: 10 },
- { name: 'ironmoon', index: 11 },
- { name: 'gravy', index: 12 },
- { name: 'nullzee', index: 13 },
- // partner capes
- { name: 'thebakery', index: 14 },
- { name: 'dsm', index: 15 },
- { name: 'packshq', index: 16 },
- { name: 'furf', index: 17 },
- { name: 'skytils', index: 18 },
- { name: 'sbp', index: 19 },
- { name: 'subreddit_light', index: 20 },
- { name: 'subreddit_dark', index: 21 },
- // streamer capes
- { name: 'alexxoffi', index: 22 },
- { name: 'jakethybro', index: 23 },
- { name: 'krusty', index: 24 },
- { name: 'soldier', index: 25 },
- { name: 'zera', index: 26 }
- ],
- roleMap: [
- { name: '*', id: '792453550768390194' },
- { name: 'Admin Perms', id: '746541309853958186' },
- { name: 'Sr. Moderator', id: '782803470205190164' },
- { name: 'Moderator', id: '737308259823910992' },
- { name: 'Helper', id: '737440116230062091' },
- { name: 'Trial Helper', id: '783537091946479636' },
- { name: 'Contributor', id: '694431057532944425' },
- { name: 'Giveaway Donor', id: '784212110263451649' },
- { name: 'Giveaway (200m)', id: '810267756426690601' },
- { name: 'Giveaway (100m)', id: '801444430522613802' },
- { name: 'Giveaway (50m)', id: '787497512981757982' },
- { name: 'Giveaway (25m)', id: '787497515771232267' },
- { name: 'Giveaway (10m)', id: '787497518241153025' },
- { name: 'Giveaway (5m)', id: '787497519768403989' },
- { name: 'Giveaway (1m)', id: '787497521084891166' },
- { name: 'Suggester', id: '811922322767609877' },
- { name: 'Partner', id: '767324547312779274' },
- { name: 'Level Locked', id: '784248899044769792' },
- { name: 'No Files', id: '786421005039173633' },
- { name: 'No Reactions', id: '786421270924361789' },
- { name: 'No Links', id: '786421269356740658' },
- { name: 'No Bots', id: '786804858765312030' },
- { name: 'No VC', id: '788850482554208267' },
- { name: 'No Giveaways', id: '808265422334984203' },
- { name: 'No Support', id: '790247359824396319' },
- { name: 'DJ', id: '782619038403919902' }
- ],
- roleWhitelist: {
- 'Partner': ['*', 'Admin Perms', 'Sr. Moderator', 'Moderator'],
- '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 Support': ['*', 'Admin Perms', 'Sr. Moderator', 'Moderator'],
- 'Giveaway Donor': ['*', 'Admin Perms', 'Sr. Moderator', 'Moderator'],
- 'Giveaway (200m)': ['*', 'Admin Perms', 'Sr. Moderator', 'Moderator'],
- 'Giveaway (100m)': ['*', 'Admin Perms', 'Sr. Moderator', 'Moderator'],
- 'Giveaway (50m)': ['*', 'Admin Perms', 'Sr. Moderator', 'Moderator'],
- 'Giveaway (25m)': ['*', 'Admin Perms', 'Sr. Moderator', 'Moderator'],
- 'Giveaway (10m)': ['*', 'Admin Perms', 'Sr. Moderator', 'Moderator'],
- 'Giveaway (5m)': ['*', 'Admin Perms', 'Sr. Moderator', 'Moderator'],
- 'Giveaway (1m)': ['*', 'Admin Perms', 'Sr. Moderator', 'Moderator'],
- 'DJ': ['*', 'Admin Perms', 'Sr. Moderator', 'Moderator']
- }
- };
}
// I just copy pasted this code from stackoverflow don't yell at me if there is issues for it
diff --git a/src/lib/extensions/BushCommand.ts b/src/lib/extensions/BushCommand.ts
index 9de2c95..edd3c31 100644
--- a/src/lib/extensions/BushCommand.ts
+++ b/src/lib/extensions/BushCommand.ts
@@ -2,7 +2,7 @@
/* eslint-disable @typescript-eslint/no-explicit-any */
import { Command, CommandOptions } from 'discord-akairo';
import { APIApplicationCommandOption } from 'discord-api-types';
-import { CommandInteraction, Snowflake } from 'discord.js';
+import { Snowflake } from 'discord.js';
import { BushClient } from './BushClient';
import { BushInteractionMessage } from './BushInteractionMessage';
import { BushMessage } from './BushMessage';
@@ -42,11 +42,4 @@ export class BushCommand extends Command {
// @ts-ignore: They are close enough
super.exec(message, args);
}
-
- /** Be careful when using this with a slash command since only the interaction is parsed as the message */
- public before(message: BushMessage): any;
- public before(message: BushMessage | CommandInteraction): any;
- public before(message) {
- super.before(message);
- }
}
diff --git a/src/lib/extensions/BushCommandHandler.ts b/src/lib/extensions/BushCommandHandler.ts
index b6501c2..8e8936e 100644
--- a/src/lib/extensions/BushCommandHandler.ts
+++ b/src/lib/extensions/BushCommandHandler.ts
@@ -1,106 +1,16 @@
/* eslint-disable @typescript-eslint/no-explicit-any */
-import { AkairoMessage, Category, CommandHandler, CommandHandlerOptions, CommandUtil, Util } from 'discord-akairo';
-import { Collection, CommandInteraction, GuildMember, Interaction } from 'discord.js';
+import { Category, CommandHandler, CommandHandlerOptions } from 'discord-akairo';
+import { Collection } from 'discord.js';
+import { BushConstants } from '../utils/BushConstants';
import { BushClient } from './BushClient';
import { BushCommand } from './BushCommand';
import { BushMessage } from './BushMessage';
-export const ArgumentMatches = {
- PHRASE: 'phrase',
- FLAG: 'flag',
- OPTION: 'option',
- REST: 'rest',
- SEPARATE: 'separate',
- TEXT: 'text',
- CONTENT: 'content',
- REST_CONTENT: 'restContent',
- NONE: 'none'
-};
export type BushCommandHandlerOptions = CommandHandlerOptions;
-export const ArgumentTypes = {
- STRING: 'string',
- LOWERCASE: 'lowercase',
- UPPERCASE: 'uppercase',
- CHAR_CODES: 'charCodes',
- NUMBER: 'number',
- INTEGER: 'integer',
- BIGINT: 'bigint',
- EMOJINT: 'emojint',
- URL: 'url',
- DATE: 'date',
- COLOR: 'color',
- USER: 'user',
- USERS: 'users',
- MEMBER: 'member',
- MEMBERS: 'members',
- RELEVANT: 'relevant',
- RELEVANTS: 'relevants',
- CHANNEL: 'channel',
- CHANNELS: 'channels',
- TEXT_CHANNEL: 'textChannel',
- TEXT_CHANNELS: 'textChannels',
- VOICE_CHANNEL: 'voiceChannel',
- VOICE_CHANNELS: 'voiceChannels',
- CATEGORY_CHANNEL: 'categoryChannel',
- CATEGORY_CHANNELS: 'categoryChannels',
- NEWS_CHANNEL: 'newsChannel',
- NEWS_CHANNELS: 'newsChannels',
- STORE_CHANNEL: 'storeChannel',
- STORE_CHANNELS: 'storeChannels',
- ROLE: 'role',
- ROLES: 'roles',
- EMOJI: 'emoji',
- EMOJIS: 'emojis',
- GUILD: 'guild',
- GUILDS: 'guilds',
- MESSAGE: 'message',
- GUILD_MESSAGE: 'guildMessage',
- RELEVANT_MESSAGE: 'relevantMessage',
- INVITE: 'invite',
- MEMBER_MENTION: 'memberMention',
- CHANNEL_MENTION: 'channelMention',
- ROLE_MENTION: 'roleMention',
- EMOJI_MENTION: 'emojiMention',
- COMMAND_ALIAS: 'commandAlias',
- COMMAND: 'command',
- INHIBITOR: 'inhibitor',
- LISTENER: 'listener'
-};
+const CommandHandlerEvents = BushConstants.CommandHandlerEvents;
+const BlockedReasons = BushConstants.BlockedReasons;
-export const blockedReasons = {
- DM: 'dm',
- BOT: 'bot',
- GUILD: 'guild',
- OWNER: 'owner',
- CLIENT: 'client',
- DISABLED: 'disabled',
- SUPERUSER: 'superuser',
- ROLE_BLACKLIST: 'roleBlacklist',
- USER_BLACKLIST: 'userBlacklist',
- RESTRICTED_GUILD: 'restrictedGuild',
- CHANNEL_BLACKLIST: 'channelBlacklist',
- RESTRICTED_CHANNEL: 'restrictedChannel'
-};
-
-export const CommandHandlerEvents = {
- MESSAGE_BLOCKED: 'messageBlocked',
- MESSAGE_INVALID: 'messageInvalid',
- COMMAND_BLOCKED: 'commandBlocked',
- COMMAND_STARTED: 'commandStarted',
- COMMAND_FINISHED: 'commandFinished',
- COMMAND_CANCELLED: 'commandCancelled',
- COMMAND_LOCKED: 'commandLocked',
- COMMAND_INVALID: 'commandInvalid',
- COMMAND_LOCKED_NSFW: 'commandLockedNsfw',
- MISSING_PERMISSIONS: 'missingPermissions',
- COOLDOWN: 'cooldown',
- IN_PROMPT: 'inPrompt',
- ERROR: 'error',
- SLASH_COMMAND_BLOCKED: 'slashCommandBlocked'
-};
-
-// A large amount of this code is copied from Akairo so that I can add custom checks to it.
export class BushCommandHandler extends CommandHandler {
public declare client: BushClient;
public declare modules: Collection<string, BushCommand>;
@@ -110,138 +20,61 @@ export class BushCommandHandler extends CommandHandler {
this.client = client;
}
- async handleSlash(interaction: Interaction): Promise<boolean> {
- if (!interaction.isCommand()) return false;
-
- if (await this.runAllTypeInhibitors(interaction)) {
- return false;
- }
-
- if (!interaction.guildID) {
- this.emit('slashGuildOnly', interaction);
- return false;
- }
- const command = this.findCommand(interaction.commandName) as BushCommand;
- const before = command.before(interaction);
- if (Util.isPromise(before)) await before;
-
- if (!command) {
- this.emit('slashNotFound', interaction);
- return false;
- }
-
- if (command.ownerOnly && !this.client.isOwner(interaction.user)) {
- this.emit('slashBlocked', interaction, command, 'owner');
- return false;
- }
- if (command.superUserOnly && !this.client.isSuperUser(interaction.user)) {
- this.emit('slashBlocked', interaction, command, 'superuser');
- return false;
- }
-
- if (interaction.channel.type !== 'dm') {
- const userPermissions = interaction.channel.permissionsFor(interaction.member as GuildMember).toArray();
-
- if (command.userPermissions) {
- const userMissingPermissions =
- typeof command.userPermissions === 'object'
- ? command.userPermissions.filter((p) => !userPermissions.includes(p))
- : '';
- if (command.userPermissions && command.userPermissions.length > 0 && userMissingPermissions.length > 0) {
- this.emit('slashMissingPermissions', interaction, command, 'user', userMissingPermissions);
- return false;
- }
- }
-
- const clientPermissions = interaction.channel.permissionsFor(interaction.guild.me).toArray();
-
- if (command.clientPermissions) {
- const clientMissingPermissions = command.clientPermissions.filter((p) => !clientPermissions.includes(p));
- if (command.clientPermissions && command.clientPermissions.length > 0 && clientMissingPermissions.length > 0) {
- this.emit('slashMissingPermissions', interaction, command, 'client', clientMissingPermissions);
- return false;
- }
- }
- }
-
- //@ts-ignore: Typings are wrong
- if (this.runCooldowns(interaction, command)) {
- return true;
- }
- const message = new AkairoMessage(this.client, interaction, {
- slash: true,
- replied: this.autoDefer || command.slashEphemeral
- });
-
- if (this.commandUtil) {
- if (this.commandUtils.has(message.id)) {
- message.util = this.commandUtils.get(message.id);
- } else {
- message.util = new CommandUtil(this, message);
- this.commandUtils.set(message.id, message.util);
+ public async runPostTypeInhibitors(message: BushMessage, command: BushCommand, slash = false): Promise<boolean> {
+ if (command.ownerOnly) {
+ const isOwner = this.client.isOwner(message.author);
+ if (!isOwner) {
+ this.emit(
+ slash ? CommandHandlerEvents.SLASH_BLOCKED : CommandHandlerEvents.COMMAND_BLOCKED,
+ message,
+ command,
+ BlockedReasons.OWNER
+ );
+ return true;
}
}
- let parsed = await this.parseCommand(message);
- if (!parsed.command) {
- const overParsed = await this.parseCommandOverwrittenPrefixes(message);
- if (overParsed.command || (parsed.prefix == null && overParsed.prefix != null)) {
- parsed = overParsed;
+ if (command.superUserOnly) {
+ const isSuperUser = this.client.isSuperUser(message.author);
+ if (!isSuperUser) {
+ this.emit(
+ slash ? CommandHandlerEvents.SLASH_BLOCKED : CommandHandlerEvents.COMMAND_BLOCKED,
+ message,
+ command,
+ BlockedReasons.OWNER
+ );
+ return true;
}
}
- if (this.commandUtil) {
- message.util.parsed = parsed;
- }
-
- try {
- if (this.autoDefer || command.slashEphemeral) {
- await interaction.defer(command.slashEphemeral);
- }
- const convertedOptions = {};
- for (const option of interaction.options.values()) {
- if (option.member) convertedOptions[option.name] = option.member;
- else if (option.channel) convertedOptions[option.name] = option.channel;
- else if (option.role) convertedOptions[option.name] = option.role;
- else convertedOptions[option.name] = option.value;
- }
- this.emit('slashStarted', interaction, command);
-
- if (command.execSlash || this.execSlash) await command.execSlash(message, convertedOptions);
- else await command.exec(message, convertedOptions);
-
- return true;
- } catch (err) {
- this.emit('slashError', err, message, command);
- return false;
- }
- }
- public async runPostTypeInhibitors(message: BushMessage, command: BushCommand): Promise<boolean> {
- if (command.ownerOnly && !message.client.isOwner(message.author)) {
- super.emit(CommandHandlerEvents.COMMAND_BLOCKED, message, command, blockedReasons.OWNER);
- return true;
- }
- if (command.superUserOnly && !(this.client.isSuperUser(message.author) || this.client.isOwner(message.author))) {
- super.emit(CommandHandlerEvents.COMMAND_BLOCKED, message, command, blockedReasons.SUPERUSER);
- return true;
- }
if (command.channel === 'guild' && !message.guild) {
- this.emit(CommandHandlerEvents.COMMAND_BLOCKED, message, command, blockedReasons.GUILD);
+ this.emit(
+ slash ? CommandHandlerEvents.SLASH_BLOCKED : CommandHandlerEvents.COMMAND_BLOCKED,
+ message,
+ command,
+ BlockedReasons.GUILD
+ );
return true;
}
+
if (command.channel === 'dm' && message.guild) {
- this.emit(CommandHandlerEvents.COMMAND_BLOCKED, message, command, blockedReasons.DM);
+ this.emit(
+ slash ? CommandHandlerEvents.SLASH_BLOCKED : CommandHandlerEvents.COMMAND_BLOCKED,
+ message,
+ command,
+ BlockedReasons.DM
+ );
return true;
}
if (command.restrictedChannels?.length && message.channel) {
if (!command.restrictedChannels.includes(message.channel.id)) {
- this.emit(CommandHandlerEvents.COMMAND_BLOCKED, message, command, blockedReasons.RESTRICTED_CHANNEL);
+ this.emit(CommandHandlerEvents.COMMAND_BLOCKED, message, command, BlockedReasons.RESTRICTED_CHANNEL);
return true;
}
}
if (command.restrictedGuilds?.length && message.guild) {
if (!command.restrictedGuilds.includes(message.guild.id)) {
- this.emit(CommandHandlerEvents.COMMAND_BLOCKED, message, command, blockedReasons.RESTRICTED_GUILD);
+ this.emit(CommandHandlerEvents.COMMAND_BLOCKED, message, command, BlockedReasons.RESTRICTED_GUILD);
return true;
}
}
@@ -258,23 +91,4 @@ export class BushCommandHandler extends CommandHandler {
}
return false;
}
- public async runCommand(message: BushMessage, command: BushCommand, args: unknown): Promise<void> {
- if (command.typing) {
- message.channel.startTyping();
- }
- try {
- this.emit(CommandHandlerEvents.COMMAND_STARTED, message, command, args);
- const ret = await command.exec(message, args);
- this.emit(CommandHandlerEvents.COMMAND_FINISHED, message, command, args, ret);
- } finally {
- if (command.typing) {
- message.channel.stopTyping();
- }
- }
- }
- public runAllTypeInhibitors(message: BushMessage): any;
- public runAllTypeInhibitors(message: BushMessage | CommandInteraction): any;
- public runAllTypeInhibitors(message): any {
- super.runAllTypeInhibitors(message);
- }
}