aboutsummaryrefslogtreecommitdiff
path: root/src/lib/extensions/discord-akairo
diff options
context:
space:
mode:
authorIRONM00N <64110067+IRONM00N@users.noreply.github.com>2022-06-14 12:47:57 -0400
committerIRONM00N <64110067+IRONM00N@users.noreply.github.com>2022-06-14 12:47:57 -0400
commit661e4c9935aeb8760dafc7ced4bbec6cc356a033 (patch)
treebb4c12bdef067d203f100e13e05ccb705b299834 /src/lib/extensions/discord-akairo
parenteaf592b72eb5b1d66aa2bde5151a8947570a506c (diff)
downloadtanzanite-661e4c9935aeb8760dafc7ced4bbec6cc356a033.tar.gz
tanzanite-661e4c9935aeb8760dafc7ced4bbec6cc356a033.tar.bz2
tanzanite-661e4c9935aeb8760dafc7ced4bbec6cc356a033.zip
remove the war crimes that I previously committed
- Remove custom typings and replace with declaration merging - Fix the typings for args - Replace all discord-api-types imports with discord.js imports - Fix discord.js breaking changes
Diffstat (limited to 'src/lib/extensions/discord-akairo')
-rw-r--r--src/lib/extensions/discord-akairo/BushArgumentTypeCaster.ts4
-rw-r--r--src/lib/extensions/discord-akairo/BushClient.ts146
-rw-r--r--src/lib/extensions/discord-akairo/BushClientUtil.ts49
-rw-r--r--src/lib/extensions/discord-akairo/BushCommand.ts87
-rw-r--r--src/lib/extensions/discord-akairo/BushCommandHandler.ts45
-rw-r--r--src/lib/extensions/discord-akairo/BushCommandUtil.ts22
-rw-r--r--src/lib/extensions/discord-akairo/BushInhibitor.ts9
-rw-r--r--src/lib/extensions/discord-akairo/BushInhibitorHandler.ts5
-rw-r--r--src/lib/extensions/discord-akairo/BushListener.ts3
-rw-r--r--src/lib/extensions/discord-akairo/BushListenerHandler.ts5
-rw-r--r--src/lib/extensions/discord-akairo/BushSlashMessage.ts34
-rw-r--r--src/lib/extensions/discord-akairo/BushTask.ts11
-rw-r--r--src/lib/extensions/discord-akairo/BushTaskHandler.ts9
-rw-r--r--src/lib/extensions/discord-akairo/SlashMessage.ts3
14 files changed, 151 insertions, 281 deletions
diff --git a/src/lib/extensions/discord-akairo/BushArgumentTypeCaster.ts b/src/lib/extensions/discord-akairo/BushArgumentTypeCaster.ts
index 7a9a3db..def7ad6 100644
--- a/src/lib/extensions/discord-akairo/BushArgumentTypeCaster.ts
+++ b/src/lib/extensions/discord-akairo/BushArgumentTypeCaster.ts
@@ -1,3 +1,3 @@
-import { type BushMessage } from '#lib';
+import { type CommandMessage } from '#lib';
-export type BushArgumentTypeCaster<R = unknown> = (message: BushMessage, phrase: string) => R;
+export type BushArgumentTypeCaster<R = unknown> = (message: CommandMessage, phrase: string) => R;
diff --git a/src/lib/extensions/discord-akairo/BushClient.ts b/src/lib/extensions/discord-akairo/BushClient.ts
index db0ad91..2644231 100644
--- a/src/lib/extensions/discord-akairo/BushClient.ts
+++ b/src/lib/extensions/discord-akairo/BushClient.ts
@@ -10,28 +10,20 @@ import {
roleWithDuration,
snowflake
} from '#args';
-import type {
- BushBaseGuildEmojiManager,
- BushChannelManager,
- BushClientEvents,
- BushClientUser,
- BushGuildManager,
- BushUserManager,
- BushUserResolvable,
- Config
-} from '#lib';
+import type { BushClientEvents, Config } from '#lib';
import { patch, type PatchedElements } from '@notenoughupdates/events-intercept';
import * as Sentry from '@sentry/node';
import {
AkairoClient,
- ArgumentPromptData,
ContextMenuCommandHandler,
- OtherwiseContentSupplier,
- version as akairoVersion
+ version as akairoVersion,
+ type ArgumentPromptData,
+ type ClientUtil,
+ type OtherwiseContentSupplier
} from 'discord-akairo';
-import { GatewayIntentBits } from 'discord-api-types/v10';
import {
ActivityType,
+ GatewayIntentBits,
MessagePayload,
Options,
Partials,
@@ -45,19 +37,21 @@ import {
type MessageOptions,
type ReplyMessageOptions,
type Snowflake,
+ type UserResolvable,
type WebhookEditMessageOptions
} from 'discord.js';
-import EventEmitter from 'events';
+import type EventEmitter from 'events';
import { google } from 'googleapis';
import path from 'path';
import readline from 'readline';
import type { Options as SequelizeOptions, Sequelize as SequelizeType } from 'sequelize';
import { fileURLToPath } from 'url';
+import { tinyColor } from '../../../arguments/tinyColor.js';
import UpdateCacheTask from '../../../tasks/updateCache.js';
import UpdateStatsTask from '../../../tasks/updateStats.js';
import { HighlightManager } from '../../common/HighlightManager.js';
import { ActivePunishment } from '../../models/instance/ActivePunishment.js';
-import { Guild as GuildModel } from '../../models/instance/Guild.js';
+import { Guild as GuildDB } from '../../models/instance/Guild.js';
import { Highlight } from '../../models/instance/Highlight.js';
import { Level } from '../../models/instance/Level.js';
import { ModLog } from '../../models/instance/ModLog.js';
@@ -71,26 +65,10 @@ import { AllowedMentions } from '../../utils/AllowedMentions.js';
import { BushCache } from '../../utils/BushCache.js';
import { BushConstants } from '../../utils/BushConstants.js';
import { BushLogger } from '../../utils/BushLogger.js';
-import { BushButtonInteraction } from '../discord.js/BushButtonInteraction.js';
-import { BushCategoryChannel } from '../discord.js/BushCategoryChannel.js';
-import { BushChatInputCommandInteraction } from '../discord.js/BushChatInputCommandInteraction.js';
-import { BushDMChannel } from '../discord.js/BushDMChannel.js';
-import { BushGuild } from '../discord.js/BushGuild.js';
-import { BushGuildEmoji } from '../discord.js/BushGuildEmoji.js';
-import { BushGuildMember } from '../discord.js/BushGuildMember.js';
-import { BushMessage } from '../discord.js/BushMessage.js';
-import { BushMessageReaction } from '../discord.js/BushMessageReaction.js';
-import { BushModalSubmitInteraction } from '../discord.js/BushModalSubmitInteraction.js';
-import { BushNewsChannel } from '../discord.js/BushNewsChannel.js';
-import { BushPresence } from '../discord.js/BushPresence.js';
-import { BushRole } from '../discord.js/BushRole.js';
-import { BushSelectMenuInteraction } from '../discord.js/BushSelectMenuInteraction.js';
-import { BushTextChannel } from '../discord.js/BushTextChannel.js';
-import { BushThreadChannel } from '../discord.js/BushThreadChannel.js';
-import { BushThreadMember } from '../discord.js/BushThreadMember.js';
-import { BushUser } from '../discord.js/BushUser.js';
-import { BushVoiceChannel } from '../discord.js/BushVoiceChannel.js';
-import { BushVoiceState } from '../discord.js/BushVoiceState.js';
+import { ExtendedGuild } from '../discord.js/ExtendedGuild.js';
+import { ExtendedGuildMember } from '../discord.js/ExtendedGuildMember.js';
+import { ExtendedMessage } from '../discord.js/ExtendedMessage.js';
+import { ExtendedUser } from '../discord.js/ExtendedUser.js';
import { BushClientUtil } from './BushClientUtil.js';
import { BushCommandHandler } from './BushCommandHandler.js';
import { BushInhibitorHandler } from './BushInhibitorHandler.js';
@@ -98,11 +76,43 @@ import { BushListenerHandler } from './BushListenerHandler.js';
import { BushTaskHandler } from './BushTaskHandler.js';
const { Sequelize } = (await import('sequelize')).default;
-export type BushReplyMessageType = string | MessagePayload | ReplyMessageOptions;
-export type BushEditMessageType = string | MessageEditOptions | MessagePayload;
-export type BushSlashSendMessageType = string | MessagePayload | InteractionReplyOptions;
-export type BushSlashEditMessageType = string | MessagePayload | WebhookEditMessageOptions;
-export type BushSendMessageType = string | MessagePayload | MessageOptions;
+declare module 'discord.js' {
+ export interface Client extends EventEmitter {
+ /**
+ * The ID of the owner(s).
+ */
+ ownerID: Snowflake | Snowflake[];
+ /**
+ * The ID of the superUser(s).
+ */
+ superUserID: Snowflake | Snowflake[];
+ /**
+ * Utility methods.
+ */
+ util: ClientUtil | BushClientUtil;
+ on<K extends keyof BushClientEvents>(event: K, listener: (...args: BushClientEvents[K]) => Awaitable<void>): this;
+ once<K extends keyof BushClientEvents>(event: K, listener: (...args: BushClientEvents[K]) => Awaitable<void>): this;
+ emit<K extends keyof BushClientEvents>(event: K, ...args: BushClientEvents[K]): boolean;
+ off<K extends keyof BushClientEvents>(event: K, listener: (...args: BushClientEvents[K]) => Awaitable<void>): this;
+ removeAllListeners<K extends keyof BushClientEvents>(event?: K): this;
+ /**
+ * Checks if a user is the owner of this bot.
+ * @param user - User to check.
+ */
+ isOwner(user: UserResolvable): boolean;
+ /**
+ * Checks if a user is a super user of this bot.
+ * @param user - User to check.
+ */
+ isSuperUser(user: UserResolvable): boolean;
+ }
+}
+
+export type ReplyMessageType = string | MessagePayload | ReplyMessageOptions;
+export type EditMessageType = string | MessageEditOptions | MessagePayload;
+export type SlashSendMessageType = string | MessagePayload | InteractionReplyOptions;
+export type SlashEditMessageType = string | MessagePayload | WebhookEditMessageOptions;
+export type SendMessageType = string | MessagePayload | MessageOptions;
const rl = readline.createInterface({
input: process.stdin,
@@ -116,12 +126,9 @@ const __dirname = path.dirname(fileURLToPath(import.meta.url));
* The main hub for interacting with the Discord API.
*/
export class BushClient<Ready extends boolean = boolean> extends AkairoClient<Ready> {
- public declare channels: BushChannelManager;
- public declare guilds: BushGuildManager;
- public declare user: If<Ready, BushClientUser>;
- public declare users: BushUserManager;
- public declare util: BushClientUtil;
public declare ownerID: Snowflake[];
+ public declare superUserID: Snowflake[];
+ public declare util: BushClientUtil;
/**
* Whether or not the client is ready.
@@ -272,7 +279,7 @@ export class BushClient<Ready extends boolean = boolean> extends AkairoClient<Re
prefix: async ({ guild }: Message) => {
if (this.config.isDevelopment) return 'dev ';
if (!guild) return this.config.prefix;
- const prefix = await (guild as BushGuild).getSetting('prefix');
+ const prefix = await guild.getSetting('prefix');
return (prefix ?? this.config.prefix) as string;
},
allowMention: true,
@@ -296,7 +303,6 @@ export class BushClient<Ready extends boolean = boolean> extends AkairoClient<Re
automateCategories: false,
autoRegisterSlashCommands: true,
skipBuiltInPostInhibitors: true,
- useSlashPermissions: false,
aliasReplacement: /-/g
});
this.contextMenuCommandHandler = new ContextMenuCommandHandler(this, {
@@ -342,26 +348,10 @@ export class BushClient<Ready extends boolean = boolean> extends AkairoClient<Re
* Extends discord.js structures before the client is instantiated.
*/
public static extendStructures(): void {
- Structures.extend('GuildEmoji', () => BushGuildEmoji);
- Structures.extend('DMChannel', () => BushDMChannel);
- Structures.extend('TextChannel', () => BushTextChannel);
- Structures.extend('VoiceChannel', () => BushVoiceChannel);
- Structures.extend('CategoryChannel', () => BushCategoryChannel);
- Structures.extend('NewsChannel', () => BushNewsChannel);
- Structures.extend('ThreadChannel', () => BushThreadChannel);
- Structures.extend('GuildMember', () => BushGuildMember);
- Structures.extend('ThreadMember', () => BushThreadMember);
- Structures.extend('Guild', () => BushGuild);
- Structures.extend('Message', () => BushMessage);
- Structures.extend('MessageReaction', () => BushMessageReaction);
- Structures.extend('Presence', () => BushPresence);
- Structures.extend('VoiceState', () => BushVoiceState);
- Structures.extend('Role', () => BushRole);
- Structures.extend('User', () => BushUser);
- Structures.extend('ChatInputCommandInteraction', () => BushChatInputCommandInteraction);
- Structures.extend('ButtonInteraction', () => BushButtonInteraction);
- Structures.extend('SelectMenuInteraction', () => BushSelectMenuInteraction);
- Structures.extend('ModalSubmitInteraction', () => BushModalSubmitInteraction);
+ Structures.extend('GuildMember', () => ExtendedGuildMember);
+ Structures.extend('Guild', () => ExtendedGuild);
+ Structures.extend('Message', () => ExtendedMessage);
+ Structures.extend('User', () => ExtendedUser);
}
/**
@@ -407,7 +397,8 @@ export class BushClient<Ready extends boolean = boolean> extends AkairoClient<Re
abbreviatedNumber,
durationSeconds,
globalUser,
- messageLink
+ messageLink,
+ tinyColor
});
this.sentry = Sentry;
@@ -448,7 +439,7 @@ export class BushClient<Ready extends boolean = boolean> extends AkairoClient<Re
public async dbPreInit() {
try {
await this.instanceDB.authenticate();
- GuildModel.initModel(this.instanceDB, this);
+ GuildDB.initModel(this.instanceDB, this);
ModLog.initModel(this.instanceDB);
ActivePunishment.initModel(this.instanceDB);
Level.initModel(this.instanceDB);
@@ -527,33 +518,22 @@ export class BushClient<Ready extends boolean = boolean> extends AkairoClient<Re
}
}
- public override isOwner(user: BushUserResolvable): boolean {
+ public override isOwner(user: UserResolvable): boolean {
return this.config.owners.includes(this.users.resolveId(user!)!);
}
- public override isSuperUser(user: BushUserResolvable): boolean {
+ public override isSuperUser(user: UserResolvable): boolean {
const userID = this.users.resolveId(user)!;
return client.cache.shared.superUsers.includes(userID) || this.config.owners.includes(userID);
}
}
export interface BushClient<Ready extends boolean = boolean> extends EventEmitter, PatchedElements, AkairoClient<Ready> {
- get emojis(): BushBaseGuildEmojiManager;
-
on<K extends keyof BushClientEvents>(event: K, listener: (...args: BushClientEvents[K]) => Awaitable<void>): this;
- // on<S extends string | symbol>(event: Exclude<S, keyof BushClientEvents>, listener: (...args: any[]) => Awaitable<void>): this;
-
once<K extends keyof BushClientEvents>(event: K, listener: (...args: BushClientEvents[K]) => Awaitable<void>): this;
- // once<S extends string | symbol>(event: Exclude<S, keyof BushClientEvents>, listener: (...args: any[]) => Awaitable<void>): this;
-
emit<K extends keyof BushClientEvents>(event: K, ...args: BushClientEvents[K]): boolean;
- // emit<S extends string | symbol>(event: Exclude<S, keyof BushClientEvents>, ...args: unknown[]): boolean;
-
off<K extends keyof BushClientEvents>(event: K, listener: (...args: BushClientEvents[K]) => Awaitable<void>): this;
- // off<S extends string | symbol>(event: Exclude<S, keyof BushClientEvents>, listener: (...args: any[]) => Awaitable<void>): this;
-
removeAllListeners<K extends keyof BushClientEvents>(event?: K): this;
- // removeAllListeners<S extends string | symbol>(event?: Exclude<S, keyof BushClientEvents>): this;
}
export interface BushStats {
diff --git a/src/lib/extensions/discord-akairo/BushClientUtil.ts b/src/lib/extensions/discord-akairo/BushClientUtil.ts
index 9fe70fa..19810bd 100644
--- a/src/lib/extensions/discord-akairo/BushClientUtil.ts
+++ b/src/lib/extensions/discord-akairo/BushClientUtil.ts
@@ -1,41 +1,43 @@
import {
Arg,
- BaseBushArgumentType,
BushConstants,
+ CommandMessage,
Global,
Shared,
- SharedCache,
+ type BaseBushArgumentType,
type BushClient,
type BushInspectOptions,
- type BushMessage,
- type BushSlashEditMessageType,
- type BushSlashMessage,
- type BushSlashSendMessageType,
- type BushUser,
type CodeBlockLang,
type GlobalCache,
type Pronoun,
- type PronounCode
+ type PronounCode,
+ type SharedCache,
+ type SlashEditMessageType,
+ type SlashMessage,
+ type SlashSendMessageType
} from '#lib';
import { humanizeDuration } from '@notenoughupdates/humanize-duration';
import assert from 'assert';
import { exec } from 'child_process';
import deepLock from 'deep-lock';
import { ClientUtil, Util as AkairoUtil } from 'discord-akairo';
-import { APIEmbed, APIMessage, OAuth2Scopes, Routes } from 'discord-api-types/v10';
import {
Constants as DiscordConstants,
EmbedBuilder,
GuildMember,
Message,
+ OAuth2Scopes,
PermissionFlagsBits,
PermissionsBitField,
- PermissionsString,
+ Routes,
ThreadMember,
User,
Util as DiscordUtil,
+ type APIEmbed,
+ type APIMessage,
type CommandInteraction,
type InteractionReplyOptions,
+ type PermissionsString,
type Snowflake,
type TextChannel,
type UserResolvable
@@ -377,7 +379,7 @@ export class BushClientUtil extends ClientUtil {
*/
public async slashRespond(
interaction: CommandInteraction,
- responseOptions: BushSlashSendMessageType | BushSlashEditMessageType
+ responseOptions: SlashSendMessageType | SlashEditMessageType
): Promise<Message | APIMessage | undefined> {
const newResponseOptions = typeof responseOptions === 'string' ? { content: responseOptions } : responseOptions;
if (interaction.replied || interaction.deferred) {
@@ -696,17 +698,17 @@ export class BushClientUtil extends ClientUtil {
* @param user The user to fetch
* @returns Undefined if the user is not found, otherwise the user.
*/
- public async resolveNonCachedUser(user: UserResolvable | undefined | null): Promise<BushUser | undefined> {
+ public async resolveNonCachedUser(user: UserResolvable | undefined | null): Promise<User | undefined> {
if (user == null) return undefined;
const resolvedUser =
user instanceof User
- ? <BushUser>user
+ ? user
: user instanceof GuildMember
- ? <BushUser>user.user
+ ? user.user
: user instanceof ThreadMember
- ? <BushUser>user.user
+ ? user.user
: user instanceof Message
- ? <BushUser>user.author
+ ? user.author
: undefined;
return resolvedUser ?? (await client.users.fetch(user as Snowflake).catch(() => undefined));
@@ -831,9 +833,10 @@ export class BushClientUtil extends ClientUtil {
* @returns The missing permissions or null if none are missing.
*/
public userGuildPermCheck(
- message: BushMessage | BushSlashMessage,
+ message: CommandMessage | SlashMessage,
permissions: typeof PermissionFlagsBits[keyof typeof PermissionFlagsBits][]
): PermissionsString[] | null {
+ if (!message.inGuild()) return null;
const missing = message.member?.permissions.missing(permissions) ?? [];
return missing.length ? missing : null;
@@ -845,7 +848,7 @@ export class BushClientUtil extends ClientUtil {
* @param permissions The permissions to check for.
* @returns The missing permissions or null if none are missing.
*/
- public clientGuildPermCheck(message: BushMessage | BushSlashMessage, permissions: bigint[]): PermissionsString[] | null {
+ public clientGuildPermCheck(message: CommandMessage | SlashMessage, permissions: bigint[]): PermissionsString[] | null {
const missing = message.guild?.members.me?.permissions.missing(permissions) ?? [];
return missing.length ? missing : null;
@@ -860,7 +863,7 @@ export class BushClientUtil extends ClientUtil {
* @returns The missing permissions or null if none are missing.
*/
public clientSendAndPermCheck(
- message: BushMessage | BushSlashMessage,
+ message: CommandMessage | SlashMessage,
permissions: bigint[] = [],
checkChannel = false
): PermissionsString[] | null {
@@ -868,7 +871,7 @@ export class BushClientUtil extends ClientUtil {
const sendPerm = message.channel!.isThread() ? 'SendMessages' : 'SendMessagesInThreads';
if (!message.inGuild()) return null;
- if (!message.guild.members.me!.permissionsIn(message.channel.id).has(sendPerm)) missing.push(sendPerm);
+ if (!message.guild.members.me!.permissionsIn(message.channel!.id).has(sendPerm)) missing.push(sendPerm);
missing.push(
...(checkChannel
@@ -884,7 +887,7 @@ export class BushClientUtil extends ClientUtil {
* @param message The message to get the prefix from.
* @returns The prefix.
*/
- public prefix(message: BushMessage | BushSlashMessage): string {
+ public prefix(message: CommandMessage | SlashMessage): string {
return message.util.isSlash
? '/'
: client.config.isDevelopment
@@ -970,7 +973,7 @@ export class BushClientUtil extends ClientUtil {
*/
public async castDurationContent(
arg: string | ParsedDuration | null,
- message: BushMessage | BushSlashMessage
+ message: CommandMessage | SlashMessage
): Promise<ParsedDurationRes> {
const res = typeof arg === 'string' ? await util.arg.cast('contentWithDuration', message, arg) : arg;
@@ -987,7 +990,7 @@ export class BushClientUtil extends ClientUtil {
public async cast<T extends keyof BaseBushArgumentType>(
type: T,
arg: BaseBushArgumentType[T] | string,
- message: BushMessage | BushSlashMessage
+ message: CommandMessage | SlashMessage
) {
return typeof arg === 'string' ? await util.arg.cast(type, message, arg) : arg;
}
diff --git a/src/lib/extensions/discord-akairo/BushCommand.ts b/src/lib/extensions/discord-akairo/BushCommand.ts
index c727e98..5fb4e06 100644
--- a/src/lib/extensions/discord-akairo/BushCommand.ts
+++ b/src/lib/extensions/discord-akairo/BushCommand.ts
@@ -1,33 +1,17 @@
import { type DiscordEmojiInfo, type RoleWithDuration } from '#args';
import {
type BushArgumentTypeCaster,
- type BushBaseGuildVoiceChannel,
- type BushCategoryChannel,
type BushClient,
type BushCommandHandler,
- type BushEmoji,
- type BushGuild,
- type BushGuildBasedChannel,
- type BushGuildChannel,
- type BushGuildEmoji,
- type BushGuildMember,
type BushInhibitor,
type BushListener,
- type BushMessage,
- type BushNewsChannel,
- type BushRole,
- type BushSlashMessage,
- type BushStageChannel,
type BushTask,
- type BushTextChannel,
- type BushThreadChannel,
- type BushUser,
- type BushVoiceChannel,
type ParsedDuration
} from '#lib';
import {
ArgumentMatch,
Command,
+ CommandUtil,
type AkairoApplicationCommandAutocompleteOption,
type AkairoApplicationCommandChannelOptionData,
type AkairoApplicationCommandChoicesData,
@@ -47,51 +31,17 @@ import {
type SlashResolveType
} from 'discord-akairo';
import {
+ Message,
+ User,
type ApplicationCommandOptionChoiceData,
- type Collection,
- type Invite,
type PermissionResolvable,
type PermissionsString,
type Snowflake
} from 'discord.js';
import _ from 'lodash';
+import { SlashMessage } from './SlashMessage.js';
export interface OverriddenBaseArgumentType extends BaseArgumentType {
- user: BushUser | null;
- users: Collection<string, BushUser> | null;
- member: BushGuildMember | null;
- members: Collection<string, BushGuildMember> | null;
- relevant: BushUser | BushGuildMember | null;
- relevants: Collection<string, BushUser> | Collection<string, BushGuildMember> | null;
- channel: BushGuildBasedChannel | BushBaseGuildVoiceChannel | null;
- channels: Collection<string, BushGuildBasedChannel | BushBaseGuildVoiceChannel> | null;
- textChannel: BushTextChannel | null;
- textChannels: Collection<string, BushTextChannel> | null;
- voiceChannel: BushVoiceChannel | null;
- voiceChannels: Collection<string, BushVoiceChannel> | null;
- categoryChannel: BushCategoryChannel | null;
- categoryChannels: Collection<string, BushCategoryChannel> | null;
- newsChannel: BushNewsChannel | null;
- newsChannels: Collection<string, BushNewsChannel> | null;
- stageChannel: BushStageChannel | null;
- stageChannels: Collection<string, BushStageChannel> | null;
- threadChannel: BushThreadChannel | null;
- threadChannels: Collection<string, BushThreadChannel> | null;
- role: BushRole | null;
- roles: Collection<string, BushRole> | null;
- emoji: BushEmoji | null;
- emojis: Collection<string, BushEmoji> | null;
- guild: BushGuild | null;
- guilds: Collection<string, BushGuild> | null;
- message: BushMessage | null;
- guildMessage: BushMessage | null;
- relevantMessage: BushMessage | null;
- invite: Invite | null;
- userMention: BushUser | null;
- memberMention: BushGuildMember | null;
- channelMention: BushThreadChannel | BushGuildChannel | null;
- roleMention: BushRole | null;
- emojiMention: BushGuildEmoji | null;
commandAlias: BushCommand | null;
command: BushCommand | null;
inhibitor: BushInhibitor | null;
@@ -108,9 +58,10 @@ export interface BaseBushArgumentType extends OverriddenBaseArgumentType {
discordEmoji: DiscordEmojiInfo | null;
roleWithDuration: RoleWithDuration | null;
abbreviatedNumber: number | null;
- globalUser: BushUser | null;
- messageLink: BushMessage | null;
+ globalUser: User | null;
+ messageLink: Message | null;
durationSeconds: number | null;
+ tinyColor: string | null;
}
export type BushArgumentType = keyof BaseBushArgumentType | RegExp;
@@ -247,6 +198,7 @@ export interface BushArgumentOptions extends BaseBushArgumentOptions {
*/
type?: BushArgumentType | (keyof BaseBushArgumentType)[] | BushArgumentTypeCaster;
}
+
export interface CustomBushArgumentOptions extends BaseBushArgumentOptions {
/**
* An array of strings can be used to restrict input to only those strings, case insensitive.
@@ -259,7 +211,7 @@ export interface CustomBushArgumentOptions extends BaseBushArgumentOptions {
customType?: (string | string[])[] | RegExp | string | null;
}
-export type BushMissingPermissionSupplier = (message: BushMessage | BushSlashMessage) => Promise<any> | any;
+export type BushMissingPermissionSupplier = (message: CommandMessage | SlashMessage) => Promise<any> | any;
interface ExtendedCommandOptions {
/**
@@ -407,9 +359,7 @@ export interface ArgsInfo {
export class BushCommand extends Command {
public declare client: BushClient;
-
public declare handler: BushCommandHandler;
-
public declare description: string;
/**
@@ -595,13 +545,13 @@ export interface BushCommand extends Command {
* @param message - Message that triggered the command.
* @param args - Evaluated arguments.
*/
- exec(message: BushMessage, args: any): any;
+ exec(message: CommandMessage, args: any): any;
/**
* Executes the command.
* @param message - Message that triggered the command.
* @param args - Evaluated arguments.
*/
- exec(message: BushMessage | BushSlashMessage, args: any): any;
+ exec(message: CommandMessage | SlashMessage, args: any): any;
}
type SlashOptionKeys =
@@ -615,7 +565,22 @@ type SlashOptionKeys =
interface PseudoArguments extends BaseBushArgumentType {
boolean: boolean;
+ flag: boolean;
+ regex: { match: RegExpMatchArray; matches: RegExpExecArray[] };
}
export type ArgType<T extends keyof PseudoArguments> = NonNullable<PseudoArguments[T]>;
export type OptArgType<T extends keyof PseudoArguments> = PseudoArguments[T];
+
+/**
+ * `util` is always defined for messages after `'all'` inhibitors
+ */
+export type CommandMessage = Message & {
+ /**
+ * Extra properties applied to the Discord.js message object.
+ * Utilities for command responding.
+ * Available on all messages after 'all' inhibitors and built-in inhibitors (bot, client).
+ * Not all properties of the util are available, depending on the input.
+ * */
+ util: CommandUtil<Message>;
+};
diff --git a/src/lib/extensions/discord-akairo/BushCommandHandler.ts b/src/lib/extensions/discord-akairo/BushCommandHandler.ts
index 2c1903f..f095356 100644
--- a/src/lib/extensions/discord-akairo/BushCommandHandler.ts
+++ b/src/lib/extensions/discord-akairo/BushCommandHandler.ts
@@ -1,35 +1,30 @@
-import { type BushClient, type BushCommand, type BushMessage, type BushSlashMessage } from '#lib';
+import { type BushClient, type BushCommand, type CommandMessage, type SlashMessage } from '#lib';
import { CommandHandler, type Category, type CommandHandlerEvents, type CommandHandlerOptions } from 'discord-akairo';
-import { type Collection, type PermissionsString } from 'discord.js';
+import { type Collection, type Message, type PermissionsString } from 'discord.js';
export type BushCommandHandlerOptions = CommandHandlerOptions;
export interface BushCommandHandlerEvents extends CommandHandlerEvents {
- commandBlocked: [message: BushMessage, command: BushCommand, reason: string];
- commandBreakout: [message: BushMessage, command: BushCommand, breakMessage: BushMessage];
- commandCancelled: [message: BushMessage, command: BushCommand, retryMessage?: BushMessage];
- commandFinished: [message: BushMessage, command: BushCommand, args: any, returnValue: any];
- commandInvalid: [message: BushMessage, command: BushCommand];
- commandLocked: [message: BushMessage, command: BushCommand];
- commandStarted: [message: BushMessage, command: BushCommand, args: any];
- cooldown: [message: BushMessage | BushSlashMessage, command: BushCommand, remaining: number];
- error: [error: Error, message: BushMessage, command?: BushCommand];
- inPrompt: [message: BushMessage];
+ commandBlocked: [message: CommandMessage, command: BushCommand, reason: string];
+ commandBreakout: [message: CommandMessage, command: BushCommand, /* no util */ breakMessage: Message];
+ commandCancelled: [message: CommandMessage, command: BushCommand, /* no util */ retryMessage?: Message];
+ commandFinished: [message: CommandMessage, command: BushCommand, args: any, returnValue: any];
+ commandInvalid: [message: CommandMessage, command: BushCommand];
+ commandLocked: [message: CommandMessage, command: BushCommand];
+ commandStarted: [message: CommandMessage, command: BushCommand, args: any];
+ cooldown: [message: CommandMessage | SlashMessage, command: BushCommand, remaining: number];
+ error: [error: Error, message: /* no util */ Message, command?: BushCommand];
+ inPrompt: [message: /* no util */ Message];
load: [command: BushCommand, isReload: boolean];
- messageBlocked: [message: BushMessage | BushSlashMessage, reason: string];
- messageInvalid: [message: BushMessage];
- missingPermissions: [message: BushMessage, command: BushCommand, type: 'client' | 'user', missing: PermissionsString[]];
+ messageBlocked: [message: /* no util */ Message | CommandMessage | SlashMessage, reason: string];
+ messageInvalid: [message: CommandMessage];
+ missingPermissions: [message: CommandMessage, command: BushCommand, type: 'client' | 'user', missing: PermissionsString[]];
remove: [command: BushCommand];
- slashBlocked: [message: BushSlashMessage, command: BushCommand, reason: string];
- slashError: [error: Error, message: BushSlashMessage, command: BushCommand];
- slashFinished: [message: BushSlashMessage, command: BushCommand, args: any, returnValue: any];
- slashMissingPermissions: [
- message: BushSlashMessage,
- command: BushCommand,
- type: 'client' | 'user',
- missing: PermissionsString[]
- ];
- slashStarted: [message: BushSlashMessage, command: BushCommand, args: any];
+ slashBlocked: [message: SlashMessage, command: BushCommand, reason: string];
+ slashError: [error: Error, message: SlashMessage, command: BushCommand];
+ slashFinished: [message: SlashMessage, command: BushCommand, args: any, returnValue: any];
+ slashMissingPermissions: [message: SlashMessage, command: BushCommand, type: 'client' | 'user', missing: PermissionsString[]];
+ slashStarted: [message: SlashMessage, command: BushCommand, args: any];
}
export class BushCommandHandler extends CommandHandler {
diff --git a/src/lib/extensions/discord-akairo/BushCommandUtil.ts b/src/lib/extensions/discord-akairo/BushCommandUtil.ts
deleted file mode 100644
index 7a06b35..0000000
--- a/src/lib/extensions/discord-akairo/BushCommandUtil.ts
+++ /dev/null
@@ -1,22 +0,0 @@
-import { type BushCommand, type BushCommandHandler, type BushMessage, type BushSlashMessage } from '#lib';
-import { CommandUtil, type ParsedComponentData } from 'discord-akairo';
-import { type Collection, type Snowflake } from 'discord.js';
-
-export interface BushParsedComponentData extends ParsedComponentData {
- command?: BushCommand;
-}
-
-export class BushCommandUtil<BushMessageType extends BushMessage | BushSlashMessage> extends CommandUtil<BushMessageType> {
- public declare parsed: BushParsedComponentData | null;
- public declare handler: BushCommandHandler;
- public declare message: BushMessageType;
- public declare messages: Collection<Snowflake, BushMessage> | null;
-
- public constructor(handler: BushCommandHandler, message: BushMessageType) {
- super(handler, message);
- }
-}
-
-export interface BushCommandUtil<BushMessageType extends BushMessage | BushSlashMessage> extends CommandUtil<BushMessageType> {
- isSlashMessage(message: BushMessage | BushSlashMessage): message is BushSlashMessage;
-}
diff --git a/src/lib/extensions/discord-akairo/BushInhibitor.ts b/src/lib/extensions/discord-akairo/BushInhibitor.ts
index 7f13594..12b2baf 100644
--- a/src/lib/extensions/discord-akairo/BushInhibitor.ts
+++ b/src/lib/extensions/discord-akairo/BushInhibitor.ts
@@ -1,4 +1,4 @@
-import { type BushClient, type BushCommand, type BushMessage, type BushSlashMessage } from '#lib';
+import { type BushClient, type BushCommand, type CommandMessage, type SlashMessage } from '#lib';
import { Inhibitor } from 'discord-akairo';
export class BushInhibitor extends Inhibitor {
@@ -10,9 +10,12 @@ export interface BushInhibitor {
* Checks if message should be blocked.
* A return value of true will block the message.
* If returning a Promise, a resolved value of true will block the message.
+ *
+ * **Note:** `all` type inhibitors do not have `message.util` defined.
+ *
* @param message - Message being handled.
* @param command - Command to check.
*/
- exec(message: BushMessage, command: BushCommand): any;
- exec(message: BushMessage | BushSlashMessage, command: BushCommand): any;
+ exec(message: CommandMessage, command: BushCommand): any;
+ exec(message: CommandMessage | SlashMessage, command: BushCommand): any;
}
diff --git a/src/lib/extensions/discord-akairo/BushInhibitorHandler.ts b/src/lib/extensions/discord-akairo/BushInhibitorHandler.ts
index a607bf7..5e4fb6c 100644
--- a/src/lib/extensions/discord-akairo/BushInhibitorHandler.ts
+++ b/src/lib/extensions/discord-akairo/BushInhibitorHandler.ts
@@ -1,6 +1,3 @@
-import { type BushClient } from '#lib';
import { InhibitorHandler } from 'discord-akairo';
-export class BushInhibitorHandler extends InhibitorHandler {
- public declare client: BushClient;
-}
+export class BushInhibitorHandler extends InhibitorHandler {}
diff --git a/src/lib/extensions/discord-akairo/BushListener.ts b/src/lib/extensions/discord-akairo/BushListener.ts
index f6247ec..3efe527 100644
--- a/src/lib/extensions/discord-akairo/BushListener.ts
+++ b/src/lib/extensions/discord-akairo/BushListener.ts
@@ -1,10 +1,7 @@
-import { type BushClient } from '#lib';
import { Listener } from 'discord-akairo';
import type EventEmitter from 'events';
export class BushListener extends Listener {
- public declare client: BushClient;
-
public constructor(
id: string,
options: {
diff --g