From 661e4c9935aeb8760dafc7ced4bbec6cc356a033 Mon Sep 17 00:00:00 2001 From: IRONM00N <64110067+IRONM00N@users.noreply.github.com> Date: Tue, 14 Jun 2022 12:47:57 -0400 Subject: 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 --- src/lib/common/AutoMod.ts | 12 +- src/lib/common/ButtonPaginator.ts | 25 +- src/lib/common/ConfirmationPrompt.ts | 8 +- src/lib/common/DeleteButton.ts | 10 +- src/lib/common/HighlightManager.ts | 10 +- src/lib/common/util/Arg.ts | 16 +- src/lib/common/util/Moderation.ts | 51 +- .../discord-akairo/BushArgumentTypeCaster.ts | 4 +- src/lib/extensions/discord-akairo/BushClient.ts | 146 +-- .../extensions/discord-akairo/BushClientUtil.ts | 49 +- src/lib/extensions/discord-akairo/BushCommand.ts | 87 +- .../discord-akairo/BushCommandHandler.ts | 45 +- .../extensions/discord-akairo/BushCommandUtil.ts | 22 - src/lib/extensions/discord-akairo/BushInhibitor.ts | 9 +- .../discord-akairo/BushInhibitorHandler.ts | 5 +- src/lib/extensions/discord-akairo/BushListener.ts | 3 - .../discord-akairo/BushListenerHandler.ts | 5 +- .../extensions/discord-akairo/BushSlashMessage.ts | 34 - src/lib/extensions/discord-akairo/BushTask.ts | 11 +- .../extensions/discord-akairo/BushTaskHandler.ts | 9 +- src/lib/extensions/discord-akairo/SlashMessage.ts | 3 + src/lib/extensions/discord.js/BushActivity.ts | 14 - .../discord.js/BushApplicationCommand.ts | 16 - .../discord.js/BushApplicationCommandManager.ts | 151 --- .../BushApplicationCommandPermissionsManager.ts | 184 --- .../discord.js/BushBaseGuildEmojiManager.ts | 19 - .../discord.js/BushBaseGuildTextChannel.ts | 28 - .../discord.js/BushBaseGuildVoiceChannel.ts | 13 - .../extensions/discord.js/BushButtonInteraction.ts | 30 - .../extensions/discord.js/BushCategoryChannel.ts | 41 - .../discord.js/BushCategoryChannelChildManager.ts | 44 - src/lib/extensions/discord.js/BushChannel.ts | 39 - .../extensions/discord.js/BushChannelManager.ts | 25 - .../discord.js/BushChatInputCommandInteraction.ts | 49 - src/lib/extensions/discord.js/BushClientEvents.ts | 291 ++--- src/lib/extensions/discord.js/BushClientUser.ts | 98 -- src/lib/extensions/discord.js/BushDMChannel.ts | 45 - src/lib/extensions/discord.js/BushEmoji.ts | 14 - src/lib/extensions/discord.js/BushGuild.ts | 782 ------------ .../BushGuildApplicationCommandManager.ts | 114 -- src/lib/extensions/discord.js/BushGuildBan.ts | 15 - src/lib/extensions/discord.js/BushGuildChannel.ts | 47 - .../discord.js/BushGuildChannelManager.ts | 183 --- src/lib/extensions/discord.js/BushGuildEmoji.ts | 20 - .../discord.js/BushGuildEmojiRoleManager.ts | 55 - src/lib/extensions/discord.js/BushGuildManager.ts | 35 - src/lib/extensions/discord.js/BushGuildMember.ts | 1159 ------------------ .../discord.js/BushGuildMemberManager.ts | 177 --- src/lib/extensions/discord.js/BushMessage.ts | 63 - .../extensions/discord.js/BushMessageManager.ts | 113 -- .../extensions/discord.js/BushMessageReaction.ts | 20 - .../discord.js/BushModalSubmitInteraction.ts | 96 -- src/lib/extensions/discord.js/BushNewsChannel.ts | 15 - src/lib/extensions/discord.js/BushPresence.ts | 19 - src/lib/extensions/discord.js/BushReactionEmoji.ts | 16 - src/lib/extensions/discord.js/BushRole.ts | 18 - .../discord.js/BushSelectMenuInteraction.ts | 30 - src/lib/extensions/discord.js/BushStageChannel.ts | 20 - src/lib/extensions/discord.js/BushStageInstance.ts | 17 - src/lib/extensions/discord.js/BushTextChannel.ts | 42 - src/lib/extensions/discord.js/BushThreadChannel.ts | 47 - src/lib/extensions/discord.js/BushThreadManager.ts | 84 -- src/lib/extensions/discord.js/BushThreadMember.ts | 19 - .../discord.js/BushThreadMemberManager.ts | 62 - src/lib/extensions/discord.js/BushUser.ts | 34 - src/lib/extensions/discord.js/BushUserManager.ts | 60 - src/lib/extensions/discord.js/BushVoiceChannel.ts | 40 - src/lib/extensions/discord.js/BushVoiceState.ts | 20 - src/lib/extensions/discord.js/ExtendedGuild.ts | 870 ++++++++++++++ .../extensions/discord.js/ExtendedGuildMember.ts | 1240 ++++++++++++++++++++ src/lib/extensions/discord.js/ExtendedMessage.ts | 12 + src/lib/extensions/discord.js/ExtendedUser.ts | 35 + src/lib/extensions/discord.js/other.ts | 188 --- src/lib/index.ts | 53 +- src/lib/utils/BushLogger.ts | 6 +- 75 files changed, 2462 insertions(+), 5029 deletions(-) delete mode 100644 src/lib/extensions/discord-akairo/BushCommandUtil.ts delete mode 100644 src/lib/extensions/discord-akairo/BushSlashMessage.ts create mode 100644 src/lib/extensions/discord-akairo/SlashMessage.ts delete mode 100644 src/lib/extensions/discord.js/BushActivity.ts delete mode 100644 src/lib/extensions/discord.js/BushApplicationCommand.ts delete mode 100644 src/lib/extensions/discord.js/BushApplicationCommandManager.ts delete mode 100644 src/lib/extensions/discord.js/BushApplicationCommandPermissionsManager.ts delete mode 100644 src/lib/extensions/discord.js/BushBaseGuildEmojiManager.ts delete mode 100644 src/lib/extensions/discord.js/BushBaseGuildTextChannel.ts delete mode 100644 src/lib/extensions/discord.js/BushBaseGuildVoiceChannel.ts delete mode 100644 src/lib/extensions/discord.js/BushButtonInteraction.ts delete mode 100644 src/lib/extensions/discord.js/BushCategoryChannel.ts delete mode 100644 src/lib/extensions/discord.js/BushCategoryChannelChildManager.ts delete mode 100644 src/lib/extensions/discord.js/BushChannel.ts delete mode 100644 src/lib/extensions/discord.js/BushChannelManager.ts delete mode 100644 src/lib/extensions/discord.js/BushChatInputCommandInteraction.ts delete mode 100644 src/lib/extensions/discord.js/BushClientUser.ts delete mode 100644 src/lib/extensions/discord.js/BushDMChannel.ts delete mode 100644 src/lib/extensions/discord.js/BushEmoji.ts delete mode 100644 src/lib/extensions/discord.js/BushGuild.ts delete mode 100644 src/lib/extensions/discord.js/BushGuildApplicationCommandManager.ts delete mode 100644 src/lib/extensions/discord.js/BushGuildBan.ts delete mode 100644 src/lib/extensions/discord.js/BushGuildChannel.ts delete mode 100644 src/lib/extensions/discord.js/BushGuildChannelManager.ts delete mode 100644 src/lib/extensions/discord.js/BushGuildEmoji.ts delete mode 100644 src/lib/extensions/discord.js/BushGuildEmojiRoleManager.ts delete mode 100644 src/lib/extensions/discord.js/BushGuildManager.ts delete mode 100644 src/lib/extensions/discord.js/BushGuildMember.ts delete mode 100644 src/lib/extensions/discord.js/BushGuildMemberManager.ts delete mode 100644 src/lib/extensions/discord.js/BushMessage.ts delete mode 100644 src/lib/extensions/discord.js/BushMessageManager.ts delete mode 100644 src/lib/extensions/discord.js/BushMessageReaction.ts delete mode 100644 src/lib/extensions/discord.js/BushModalSubmitInteraction.ts delete mode 100644 src/lib/extensions/discord.js/BushNewsChannel.ts delete mode 100644 src/lib/extensions/discord.js/BushPresence.ts delete mode 100644 src/lib/extensions/discord.js/BushReactionEmoji.ts delete mode 100644 src/lib/extensions/discord.js/BushRole.ts delete mode 100644 src/lib/extensions/discord.js/BushSelectMenuInteraction.ts delete mode 100644 src/lib/extensions/discord.js/BushStageChannel.ts delete mode 100644 src/lib/extensions/discord.js/BushStageInstance.ts delete mode 100644 src/lib/extensions/discord.js/BushTextChannel.ts delete mode 100644 src/lib/extensions/discord.js/BushThreadChannel.ts delete mode 100644 src/lib/extensions/discord.js/BushThreadManager.ts delete mode 100644 src/lib/extensions/discord.js/BushThreadMember.ts delete mode 100644 src/lib/extensions/discord.js/BushThreadMemberManager.ts delete mode 100644 src/lib/extensions/discord.js/BushUser.ts delete mode 100644 src/lib/extensions/discord.js/BushUserManager.ts delete mode 100644 src/lib/extensions/discord.js/BushVoiceChannel.ts delete mode 100644 src/lib/extensions/discord.js/BushVoiceState.ts create mode 100644 src/lib/extensions/discord.js/ExtendedGuild.ts create mode 100644 src/lib/extensions/discord.js/ExtendedGuildMember.ts create mode 100644 src/lib/extensions/discord.js/ExtendedMessage.ts create mode 100644 src/lib/extensions/discord.js/ExtendedUser.ts delete mode 100644 src/lib/extensions/discord.js/other.ts (limited to 'src/lib') diff --git a/src/lib/common/AutoMod.ts b/src/lib/common/AutoMod.ts index f30eab7..982e0e8 100644 --- a/src/lib/common/AutoMod.ts +++ b/src/lib/common/AutoMod.ts @@ -1,4 +1,4 @@ -import { banResponse, Moderation, type BushButtonInteraction, type BushMessage } from '#lib'; +import { banResponse, Moderation } from '#lib'; import assert from 'assert'; import chalk from 'chalk'; import { @@ -8,6 +8,8 @@ import { EmbedBuilder, GuildMember, PermissionFlagsBits, + type ButtonInteraction, + type Message, type TextChannel } from 'discord.js'; @@ -18,7 +20,7 @@ export class AutoMod { /** * The message to check for blacklisted phrases on */ - private message: BushMessage; + private message: Message; /** * Whether or not a punishment has already been given to the user @@ -28,7 +30,7 @@ export class AutoMod { /** * @param message The message to check and potentially perform automod actions to */ - public constructor(message: BushMessage) { + public constructor(message: Message) { this.message = message; if (message.author.id === client.user?.id) return; void this.handle(); @@ -355,7 +357,7 @@ export class AutoMod { * Handles the ban button in the automod log. * @param interaction The button interaction. */ - public static async handleInteraction(interaction: BushButtonInteraction) { + public static async handleInteraction(interaction: ButtonInteraction) { if (!interaction.memberPermissions?.has(PermissionFlagsBits.BanMembers)) return interaction.reply({ content: `${util.emojis.error} You are missing the **Ban Members** permission.`, @@ -382,7 +384,7 @@ export class AutoMod { user: userId, reason, moderator: interaction.user.id, - evidence: (interaction.message as BushMessage).url ?? undefined + evidence: (interaction.message as Message).url ?? undefined }); const victimUserFormatted = (await util.resolveNonCachedUser(userId))?.tag ?? userId; diff --git a/src/lib/common/ButtonPaginator.ts b/src/lib/common/ButtonPaginator.ts index cc95601..64870cf 100644 --- a/src/lib/common/ButtonPaginator.ts +++ b/src/lib/common/ButtonPaginator.ts @@ -1,7 +1,14 @@ -import { DeleteButton, type BushMessage, type BushSlashMessage } from '#lib'; +import { DeleteButton, type CommandMessage, type SlashMessage } from '#lib'; import { CommandUtil } from 'discord-akairo'; -import { APIEmbed } from 'discord-api-types/v10'; -import { ActionRowBuilder, ButtonBuilder, ButtonStyle, EmbedBuilder, type MessageComponentInteraction } from 'discord.js'; +import { + ActionRowBuilder, + ButtonBuilder, + ButtonStyle, + EmbedBuilder, + type APIEmbed, + type Message, + type MessageComponentInteraction +} from 'discord.js'; /** * Sends multiple embeds with controls to switch between them @@ -10,7 +17,7 @@ export class ButtonPaginator { /** * The message that triggered the command */ - protected message: BushMessage | BushSlashMessage; + protected message: CommandMessage | SlashMessage; /** * The embeds to paginate @@ -35,7 +42,7 @@ export class ButtonPaginator { /** * The paginator message */ - protected sentMessage: BushMessage | undefined; + protected sentMessage: Message | undefined; /** * @param message The message to respond to @@ -45,7 +52,7 @@ export class ButtonPaginator { * @param startOn The page to start from (**not** the index) */ protected constructor( - message: BushMessage | BushSlashMessage, + message: CommandMessage | SlashMessage, embeds: EmbedBuilder[] | APIEmbed[], text: string | null, deleteOnExit: boolean, @@ -80,11 +87,11 @@ export class ButtonPaginator { * Sends the paginator message */ protected async send() { - this.sentMessage = (await this.message.util.reply({ + this.sentMessage = await this.message.util.reply({ content: this.text, embeds: [this.embeds[this.curPage]], components: [this.getPaginationRow()] - })) as BushMessage; + }); const collector = this.sentMessage.createMessageComponentCollector({ filter: (i) => i.customId.startsWith('paginate_'), @@ -214,7 +221,7 @@ export class ButtonPaginator { * @param startOn The page to start from (**not** the index) */ public static async send( - message: BushMessage | BushSlashMessage, + message: CommandMessage | SlashMessage, embeds: EmbedBuilder[] | APIEmbed[], text: string | null = null, deleteOnExit = true, diff --git a/src/lib/common/ConfirmationPrompt.ts b/src/lib/common/ConfirmationPrompt.ts index c611fd3..c95dbbc 100644 --- a/src/lib/common/ConfirmationPrompt.ts +++ b/src/lib/common/ConfirmationPrompt.ts @@ -1,4 +1,4 @@ -import { type BushMessage, type BushSlashMessage } from '#lib'; +import { type CommandMessage, type SlashMessage } from '#lib'; import { ActionRowBuilder, ButtonBuilder, ButtonStyle, type MessageComponentInteraction, type MessageOptions } from 'discord.js'; /** @@ -13,13 +13,13 @@ export class ConfirmationPrompt { /** * The message that triggered the command */ - protected message: BushMessage | BushSlashMessage; + protected message: CommandMessage | SlashMessage; /** * @param message The message to respond to * @param options The send message options */ - protected constructor(message: BushMessage | BushSlashMessage, messageOptions: MessageOptions) { + protected constructor(message: CommandMessage | SlashMessage, messageOptions: MessageOptions) { this.message = message; this.messageOptions = messageOptions; } @@ -71,7 +71,7 @@ export class ConfirmationPrompt { * @param message The message to respond to * @param options The send message options */ - public static async send(message: BushMessage | BushSlashMessage, sendOptions: MessageOptions): Promise { + public static async send(message: CommandMessage | SlashMessage, sendOptions: MessageOptions): Promise { return new ConfirmationPrompt(message, sendOptions).send(); } } diff --git a/src/lib/common/DeleteButton.ts b/src/lib/common/DeleteButton.ts index 03e2639..91f4bfa 100644 --- a/src/lib/common/DeleteButton.ts +++ b/src/lib/common/DeleteButton.ts @@ -1,4 +1,4 @@ -import { PaginateEmojis, type BushMessage, type BushSlashMessage } from '#lib'; +import { PaginateEmojis, type CommandMessage, type SlashMessage } from '#lib'; import { CommandUtil } from 'discord-akairo'; import { ActionRowBuilder, @@ -22,13 +22,13 @@ export class DeleteButton { /** * The message that triggered the command */ - protected message: BushMessage | BushSlashMessage; + protected message: CommandMessage | SlashMessage; /** * @param message The message to respond to * @param options The send message options */ - protected constructor(message: BushMessage | BushSlashMessage, options: MessageOptions) { + protected constructor(message: CommandMessage | SlashMessage, options: MessageOptions) { this.message = message; this.messageOptions = options; } @@ -39,7 +39,7 @@ export class DeleteButton { protected async send() { this.updateComponents(); - const msg = (await this.message.util.reply(this.messageOptions)) as BushMessage; + const msg = await this.message.util.reply(this.messageOptions); const collector = msg.createMessageComponentCollector({ filter: (interaction) => interaction.customId == 'paginate__stop' && interaction.message?.id == msg.id, @@ -85,7 +85,7 @@ export class DeleteButton { * @param message The message to respond to * @param options The send message options */ - public static async send(message: BushMessage | BushSlashMessage, options: Omit) { + public static async send(message: CommandMessage | SlashMessage, options: Omit) { return new DeleteButton(message, options).send(); } } diff --git a/src/lib/common/HighlightManager.ts b/src/lib/common/HighlightManager.ts index fffb266..fdec322 100644 --- a/src/lib/common/HighlightManager.ts +++ b/src/lib/common/HighlightManager.ts @@ -1,6 +1,6 @@ -import { Highlight, type BushMessage, type HighlightWord } from '#lib'; +import { Highlight, type HighlightWord } from '#lib'; import assert from 'assert'; -import { Collection, type Snowflake } from 'discord.js'; +import { Collection, type Message, type Snowflake } from 'discord.js'; import { Time } from '../utils/BushConstants.js'; const NOTIFY_COOLDOWN = 5 * Time.Minute; @@ -75,7 +75,7 @@ export class HighlightManager { * @param message The message to check. * @returns A collection users mapped to the highlight matched */ - public checkMessage(message: BushMessage): Collection { + public checkMessage(message: Message): Collection { // even if there are multiple matches, only the first one is returned const ret = new Collection(); if (!message.content || !message.inGuild()) return ret; @@ -225,7 +225,7 @@ export class HighlightManager { * @param hl The highlight that was matched. * @returns Whether or a dm was sent. */ - public async notify(message: BushMessage, user: Snowflake, hl: HighlightWord): Promise { + public async notify(message: Message, user: Snowflake, hl: HighlightWord): Promise { assert(message.inGuild()); dmCooldown: { @@ -301,7 +301,7 @@ export class HighlightManager { * Updates the time that a user last talked in a particular guild. * @param message The message the user sent. */ - public updateLastTalked(message: BushMessage): void { + public updateLastTalked(message: Message): void { if (!message.inGuild()) return; const lastTalked = ( this.userLastTalkedCooldown.has(message.guildId) diff --git a/src/lib/common/util/Arg.ts b/src/lib/common/util/Arg.ts index 01d3b0b..51d8065 100644 --- a/src/lib/common/util/Arg.ts +++ b/src/lib/common/util/Arg.ts @@ -1,4 +1,10 @@ -import { type BaseBushArgumentType, type BushArgumentType, type BushArgumentTypeCaster, type BushSlashMessage } from '#lib'; +import { + type BaseBushArgumentType, + type BushArgumentType, + type BushArgumentTypeCaster, + type CommandMessage, + type SlashMessage +} from '#lib'; import { Argument, type Flag, type ParsedValuePredicate } from 'discord-akairo'; import { type Message } from 'discord.js'; @@ -12,10 +18,10 @@ export class Arg { * @param message - Message that called the command. * @param phrase - Phrase to process. */ - public static async cast(type: T, message: Message | BushSlashMessage, phrase: string): Promise>; - public static async cast(type: T, message: Message | BushSlashMessage, phrase: string): Promise; - public static async cast(type: AT | ATC, message: Message | BushSlashMessage, phrase: string): Promise; - public static async cast(type: ATC | AT, message: Message | BushSlashMessage, phrase: string): Promise { + public static async cast(type: T, message: CommandMessage | SlashMessage, phrase: string): Promise>; + public static async cast(type: T, message: CommandMessage | SlashMessage, phrase: string): Promise; + public static async cast(type: AT | ATC, message: CommandMessage | SlashMessage, phrase: string): Promise; + public static async cast(type: ATC | AT, message: CommandMessage | SlashMessage, phrase: string): Promise { return Argument.cast(type as any, client.commandHandler.resolver, message as Message, phrase); } diff --git a/src/lib/common/util/Moderation.ts b/src/lib/common/util/Moderation.ts index 9f93375..6cdc141 100644 --- a/src/lib/common/util/Moderation.ts +++ b/src/lib/common/util/Moderation.ts @@ -1,17 +1,18 @@ -import { - ActivePunishment, - ActivePunishmentType, - Guild, - ModLog, - type BushGuild, - type BushGuildMember, - type BushGuildMemberResolvable, - type BushGuildResolvable, - type BushUserResolvable, - type ModLogType -} from '#lib'; +import { ActivePunishment, ActivePunishmentType, Guild as GuildDB, ModLog, type ModLogType } from '#lib'; import assert from 'assert'; -import { ActionRowBuilder, ButtonBuilder, ButtonStyle, EmbedBuilder, PermissionFlagsBits, type Snowflake } from 'discord.js'; +import { + ActionRowBuilder, + ButtonBuilder, + ButtonStyle, + EmbedBuilder, + PermissionFlagsBits, + type Guild, + type GuildMember, + type GuildMemberResolvable, + type GuildResolvable, + type Snowflake, + type UserResolvable +} from 'discord.js'; enum punishMap { 'warned' = 'warn', @@ -52,8 +53,8 @@ export class Moderation { * @returns `true` if the moderator can perform the action otherwise a reason why they can't. */ public static async permissionCheck( - moderator: BushGuildMember, - victim: BushGuildMember, + moderator: GuildMember, + victim: GuildMember, type: | 'mute' | 'unmute' @@ -146,7 +147,7 @@ export class Moderation { getCaseNumber = false ): Promise<{ log: ModLog | null; caseNum: number | null }> { // If guild does not exist create it so the modlog can reference a guild. - await Guild.findOrCreate({ + await GuildDB.findOrCreate({ where: { id: options.guild }, defaults: { id: options.guild } }); @@ -349,17 +350,17 @@ export interface CreateModLogEntryOptions extends BaseCreateModLogEntryOptions { /** * The user that a modlog entry is created for. */ - user: BushGuildMemberResolvable; + user: GuildMemberResolvable; /** * The moderator that created the modlog entry. */ - moderator: BushGuildMemberResolvable; + moderator: GuildMemberResolvable; /** * The guild that the punishment is created for. */ - guild: BushGuildResolvable; + guild: GuildResolvable; } /** @@ -394,7 +395,7 @@ export interface CreatePunishmentEntryOptions { /** * The user that the punishment is created for. */ - user: BushGuildMemberResolvable; + user: GuildMemberResolvable; /** * The length of time the punishment lasts for. @@ -404,7 +405,7 @@ export interface CreatePunishmentEntryOptions { /** * The guild that the punishment is created for. */ - guild: BushGuildResolvable; + guild: GuildResolvable; /** * The id of the modlog that is linked to the punishment entry. @@ -429,12 +430,12 @@ export interface RemovePunishmentEntryOptions { /** * The user that the punishment is destroyed for. */ - user: BushGuildMemberResolvable; + user: GuildMemberResolvable; /** * The guild that the punishment was in. */ - guild: BushGuildResolvable; + guild: GuildResolvable; /** * Extra information for the punishment. The role for role punishments and the channel for blocks. @@ -454,12 +455,12 @@ export interface PunishDMOptions { /** * The guild that the punishment is taking place in. */ - guild: BushGuild; + guild: Guild; /** * The user that is being punished. */ - user: BushUserResolvable; + user: UserResolvable; /** * The punishment that the user has received. 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 = (message: BushMessage, phrase: string) => R; +export type BushArgumentTypeCaster = (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(event: K, listener: (...args: BushClientEvents[K]) => Awaitable): this; + once(event: K, listener: (...args: BushClientEvents[K]) => Awaitable): this; + emit(event: K, ...args: BushClientEvents[K]): boolean; + off(event: K, listener: (...args: BushClientEvents[K]) => Awaitable): this; + removeAllListeners(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 extends AkairoClient { - public declare channels: BushChannelManager; - public declare guilds: BushGuildManager; - public declare user: If; - 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 extends AkairoClient { 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 extends AkairoClient extends AkairoClient 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 extends AkairoClient extends AkairoClient extends AkairoClient extends EventEmitter, PatchedElements, AkairoClient { - get emojis(): BushBaseGuildEmojiManager; - on(event: K, listener: (...args: BushClientEvents[K]) => Awaitable): this; - // on(event: Exclude, listener: (...args: any[]) => Awaitable): this; - once(event: K, listener: (...args: BushClientEvents[K]) => Awaitable): this; - // once(event: Exclude, listener: (...args: any[]) => Awaitable): this; - emit(event: K, ...args: BushClientEvents[K]): boolean; - // emit(event: Exclude, ...args: unknown[]): boolean; - off(event: K, listener: (...args: BushClientEvents[K]) => Awaitable): this; - // off(event: Exclude, listener: (...args: any[]) => Awaitable): this; - removeAllListeners(event?: K): this; - // removeAllListeners(event?: Exclude): 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 { 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 { + public async resolveNonCachedUser(user: UserResolvable | undefined | null): Promise { if (user == null) return undefined; const resolvedUser = user instanceof User - ? user + ? user : user instanceof GuildMember - ? user.user + ? user.user : user instanceof ThreadMember - ? user.user + ? user.user : user instanceof Message - ? 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 { 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( 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 | null; - member: BushGuildMember | null; - members: Collection | null; - relevant: BushUser | BushGuildMember | null; - relevants: Collection | Collection | null; - channel: BushGuildBasedChannel | BushBaseGuildVoiceChannel | null; - channels: Collection | null; - textChannel: BushTextChannel | null; - textChannels: Collection | null; - voiceChannel: BushVoiceChannel | null; - voiceChannels: Collection | null; - categoryChannel: BushCategoryChannel | null; - categoryChannels: Collection | null; - newsChannel: BushNewsChannel | null; - newsChannels: Collection | null; - stageChannel: BushStageChannel | null; - stageChannels: Collection | null; - threadChannel: BushThreadChannel | null; - threadChannels: Collection | null; - role: BushRole | null; - roles: Collection | null; - emoji: BushEmoji | null; - emojis: Collection | null; - guild: BushGuild | null; - guilds: Collection | 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; +export type BushMissingPermissionSupplier = (message: CommandMessage | SlashMessage) => Promise | 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 = NonNullable; export type OptArgType = 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; +}; 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 extends CommandUtil { - public declare parsed: BushParsedComponentData | null; - public declare handler: BushCommandHandler; - public declare message: BushMessageType; - public declare messages: Collection | null; - - public constructor(handler: BushCommandHandler, message: BushMessageType) { - super(handler, message); - } -} - -export interface BushCommandUtil extends CommandUtil { - 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 --git a/src/lib/extensions/discord-akairo/BushListenerHandler.ts b/src/lib/extensions/discord-akairo/BushListenerHandler.ts index 517fb55..9c3e4af 100644 --- a/src/lib/extensions/discord-akairo/BushListenerHandler.ts +++ b/src/lib/extensions/discord-akairo/BushListenerHandler.ts @@ -1,6 +1,3 @@ -import { type BushClient } from '#lib'; import { ListenerHandler } from 'discord-akairo'; -export class BushListenerHandler extends ListenerHandler { - public declare client: BushClient; -} +export class BushListenerHandler extends ListenerHandler {} diff --git a/src/lib/extensions/discord-akairo/BushSlashMessage.ts b/src/lib/extensions/discord-akairo/BushSlashMessage.ts deleted file mode 100644 index 0860964..0000000 --- a/src/lib/extensions/discord-akairo/BushSlashMessage.ts +++ /dev/null @@ -1,34 +0,0 @@ -import { - BushCommandHandler, - BushGuildTextBasedChannel, - type BushClient, - type BushCommandUtil, - type BushGuild, - type BushGuildMember, - type BushTextBasedChannel, - type BushUser -} from '#lib'; -import { AkairoMessage } from 'discord-akairo'; -import { type ChatInputCommandInteraction } from 'discord.js'; - -export class BushSlashMessage extends AkairoMessage { - public declare client: BushClient; - public declare util: BushCommandUtil & { handler: BushCommandHandler }; - public declare author: BushUser; - public declare member: BushGuildMember | null; - public declare interaction: ChatInputCommandInteraction; - public constructor(client: BushClient, interaction: ChatInputCommandInteraction) { - super(client, interaction); - } -} - -export interface BushSlashMessage extends AkairoMessage { - get channel(): BushTextBasedChannel | null; - get guild(): BushGuild | null; - inGuild(): this is BushSlashMessageInGuild & this; -} - -interface BushSlashMessageInGuild { - guild: BushGuild; - channel: BushGuildTextBasedChannel; -} diff --git a/src/lib/extensions/discord-akairo/BushTask.ts b/src/lib/extensions/discord-akairo/BushTask.ts index b4359ce..9f5c0cd 100644 --- a/src/lib/extensions/discord-akairo/BushTask.ts +++ b/src/lib/extensions/discord-akairo/BushTask.ts @@ -1,10 +1,3 @@ -import { type BushClient } from '#lib'; -import { Task, type TaskOptions } from 'discord-akairo'; +import { Task } from 'discord-akairo'; -export class BushTask extends Task { - public declare client: BushClient; - - public constructor(id: string, options: TaskOptions) { - super(id, options); - } -} +export class BushTask extends Task {} diff --git a/src/lib/extensions/discord-akairo/BushTaskHandler.ts b/src/lib/extensions/discord-akairo/BushTaskHandler.ts index ed6b91d..f667ead 100644 --- a/src/lib/extensions/discord-akairo/BushTaskHandler.ts +++ b/src/lib/extensions/discord-akairo/BushTaskHandler.ts @@ -1,12 +1,5 @@ -import { type BushClient } from '#lib'; import { TaskHandler, type AkairoHandlerOptions } from 'discord-akairo'; export type BushTaskHandlerOptions = AkairoHandlerOptions; -export class BushTaskHandler extends TaskHandler { - public declare client: BushClient; - - public constructor(client: BushClient, options: BushTaskHandlerOptions) { - super(client, options); - } -} +export class BushTaskHandler extends TaskHandler {} diff --git a/src/lib/extensions/discord-akairo/SlashMessage.ts b/src/lib/extensions/discord-akairo/SlashMessage.ts new file mode 100644 index 0000000..0a6669b --- /dev/null +++ b/src/lib/extensions/discord-akairo/SlashMessage.ts @@ -0,0 +1,3 @@ +import { AkairoMessage } from 'discord-akairo'; + +export class SlashMessage extends AkairoMessage {} diff --git a/src/lib/extensions/discord.js/BushActivity.ts b/src/lib/extensions/discord.js/BushActivity.ts deleted file mode 100644 index 3f19232..0000000 --- a/src/lib/extensions/discord.js/BushActivity.ts +++ /dev/null @@ -1,14 +0,0 @@ -import type { BushEmoji, BushPresence } from '#lib'; -import { Activity } from 'discord.js'; -import type { RawActivityData } from 'discord.js/typings/rawDataTypes'; - -/** - * Represents an activity that is part of a user's presence. - */ -export class BushActivity extends Activity { - public declare emoji: BushEmoji | null; - - public constructor(presence: BushPresence, data?: RawActivityData) { - super(presence, data); - } -} diff --git a/src/lib/extensions/discord.js/BushApplicationCommand.ts b/src/lib/extensions/discord.js/BushApplicationCommand.ts deleted file mode 100644 index 8298830..0000000 --- a/src/lib/extensions/discord.js/BushApplicationCommand.ts +++ /dev/null @@ -1,16 +0,0 @@ -/* eslint-disable @typescript-eslint/ban-types */ -import type { BushClient, BushGuild } from '#lib'; -import { ApplicationCommand, type Snowflake } from 'discord.js'; -import type { RawApplicationCommandData } from 'discord.js/typings/rawDataTypes'; - -/** - * Represents an application command. - */ -export class BushApplicationCommand extends ApplicationCommand { - public declare readonly client: BushClient; - public declare guild: BushGuild | null; - - public constructor(client: BushClient, data: RawApplicationCommandData, guild?: BushGuild, guildID?: Snowflake) { - super(client, data, guild, guildID); - } -} diff --git a/src/lib/extensions/discord.js/BushApplicationCommandManager.ts b/src/lib/extensions/discord.js/BushApplicationCommandManager.ts deleted file mode 100644 index dc27dbf..0000000 --- a/src/lib/extensions/discord.js/BushApplicationCommandManager.ts +++ /dev/null @@ -1,151 +0,0 @@ -import type { - BushApplicationCommand, - BushApplicationCommandPermissionsManager, - BushApplicationCommandResolvable, - BushClient, - BushGuildResolvable, - StripPrivate -} from '#lib'; -import type { APIApplicationCommand } from 'discord-api-types/v10'; -import { - ApplicationCommandManager, - CachedManager, - type ApplicationCommandData, - type Collection, - type FetchApplicationCommandOptions, - type Snowflake -} from 'discord.js'; - -/** - * Manages API methods for application commands and stores their cache. - */ -export declare class BushApplicationCommandManager< - ApplicationCommandScope = BushApplicationCommand<{ guild: BushGuildResolvable }>, - PermissionsOptionsExtras = { guild: BushGuildResolvable }, - PermissionsGuildType = null - > - extends CachedManager - implements StripPrivate> -{ - public constructor(client: BushClient, iterable?: Iterable); - - /** - * The manager for permissions of arbitrary commands on arbitrary guilds - */ - public permissions: BushApplicationCommandPermissionsManager< - { command?: BushApplicationCommandResolvable } & PermissionsOptionsExtras, - { command: BushApplicationCommandResolvable } & PermissionsOptionsExtras, - PermissionsOptionsExtras, - PermissionsGuildType, - null - >; - - /** - * The APIRouter path to the commands - * @param id The application command's id - * @param guildId The guild's id to use in the path, - * ignored when using a {@link GuildApplicationCommandManager} - */ - private commandPath({ id, guildId }: { id?: Snowflake; guildId?: Snowflake }): unknown; - - /** - * Creates an application command. - * @param command The command - * @param guildId The guild's id to create this command in, ignored when using a {@link GuildApplicationCommandManager} - * @example - * // Create a new command - * client.application.commands.create({ - * name: 'test', - * description: 'A test command', - * }) - * .then(console.log) - * .catch(console.error); - */ - public create(command: BushApplicationCommandResolvable, guildId?: Snowflake): Promise; - - /** - * Deletes an application command. - * @param command The command to delete - * @param guildId The guild's id where the command is registered, - * ignored when using a {@link GuildApplicationCommandManager} - * @example - * // Delete a command - * guild.commands.delete('123456789012345678') - * .then(console.log) - * .catch(console.error); - */ - public delete(command: BushApplicationCommandResolvable, guildId?: Snowflake): Promise; - - /** - * Edits an application command. - * @param command The command to edit - * @param data The data to update the command with - * @param guildId The guild's id where the command registered, - * ignored when using