diff --git a/handlers/channel.ts b/handlers/channel.ts index 3f8ca59ae..eda55563d 100644 --- a/handlers/channel.ts +++ b/handlers/channel.ts @@ -16,6 +16,7 @@ import { ChannelEditOptions, } from "../types/channel.ts"; import { logYellow } from "../utils/logger.ts"; +import { eventHandlers } from "../module/client.ts"; /** Checks if a user id or a role id has permission in this channel */ export function hasChannelPermission( @@ -45,6 +46,7 @@ export async function getMessage(channel: Channel, id: string) { if ( !botHasPermission(channel.guildID, [Permissions.VIEW_CHANNEL]) ) { + eventHandlers.error?.(Errors.MISSING_VIEW_CHANNEL); throw new Error(Errors.MISSING_VIEW_CHANNEL); } if ( @@ -53,6 +55,7 @@ export async function getMessage(channel: Channel, id: string) { [Permissions.READ_MESSAGE_HISTORY], ) ) { + eventHandlers.error?.(Errors.MISSING_READ_MESSAGE_HISTORY); throw new Error(Errors.MISSING_READ_MESSAGE_HISTORY); } } @@ -75,6 +78,7 @@ export async function getMessages( if ( !botHasPermission(channel.guildID, [Permissions.VIEW_CHANNEL]) ) { + eventHandlers.error?.(Errors.MISSING_VIEW_CHANNEL); throw new Error(Errors.MISSING_VIEW_CHANNEL); } if ( @@ -83,6 +87,7 @@ export async function getMessages( [Permissions.READ_MESSAGE_HISTORY], ) ) { + eventHandlers.error?.(Errors.MISSING_READ_MESSAGE_HISTORY); throw new Error(Errors.MISSING_READ_MESSAGE_HISTORY); } } @@ -115,6 +120,7 @@ export async function sendMessage( if ( !botHasPermission(channel.guildID, [Permissions.SEND_MESSAGES]) ) { + eventHandlers.error?.(Errors.MISSING_SEND_MESSAGES); throw new Error(Errors.MISSING_SEND_MESSAGES); } if ( @@ -124,11 +130,13 @@ export async function sendMessage( [Permissions.SEND_TTS_MESSAGES], ) ) { + eventHandlers.error?.(Errors.MISSING_SEND_TTS_MESSAGE); throw new Error(Errors.MISSING_SEND_TTS_MESSAGE); } } if (content.content && content.content.length > 2000) { + eventHandlers.error?.(Errors.MESSAGE_MAX_LENGTH); throw new Error(Errors.MESSAGE_MAX_LENGTH); } @@ -150,9 +158,13 @@ export function deleteMessages( channel.guildID && !botHasPermission(channel.guildID, [Permissions.MANAGE_MESSAGES]) ) { + eventHandlers.error?.(Errors.MISSING_MANAGE_MESSAGES); throw new Error(Errors.MISSING_MANAGE_MESSAGES); } - if (ids.length < 2) throw new Error(Errors.DELETE_MESSAGES_MIN); + if (ids.length < 2) { + eventHandlers.error?.(Errors.DELETE_MESSAGES_MIN); + throw new Error(Errors.DELETE_MESSAGES_MIN); + } if (ids.length > 100) { logYellow( @@ -172,6 +184,7 @@ export function getChannelInvites(channel: Channel) { channel.guildID && !botHasPermission(channel.guildID, [Permissions.MANAGE_CHANNELS]) ) { + eventHandlers.error?.(Errors.MISSING_MANAGE_CHANNELS); throw new Error(Errors.MISSING_MANAGE_CHANNELS); } return RequestManager.get(endpoints.CHANNEL_INVITES(channel.id)); @@ -186,6 +199,7 @@ export function createInvite(channel: Channel, options: CreateInviteOptions) { [Permissions.CREATE_INSTANT_INVITE], ) ) { + eventHandlers.error?.(Errors.MISSING_CREATE_INSTANT_INVITE); throw new Error(Errors.MISSING_CREATE_INSTANT_INVITE); } return RequestManager.post(endpoints.CHANNEL_INVITES(channel.id), options); @@ -197,6 +211,7 @@ export function getChannelWebhooks(channel: Channel) { channel.guildID && !botHasPermission(channel.guildID, [Permissions.MANAGE_WEBHOOKS]) ) { + eventHandlers.error?.(Errors.MISSING_MANAGE_WEBHOOKS); throw new Error(Errors.MISSING_MANAGE_WEBHOOKS); } return RequestManager.get(endpoints.CHANNEL_WEBHOOKS(channel.id)); diff --git a/handlers/guild.ts b/handlers/guild.ts index 106a72e5f..9eeea3735 100644 --- a/handlers/guild.ts +++ b/handlers/guild.ts @@ -16,7 +16,7 @@ import { CreateEmojisOptions, PositionSwap, EditEmojisOptions, CreateRoleOptions import { RoleData } from "../types/role.ts" import { createRole } from "../structures/role.ts" import { Intents } from "../types/options.ts" -import { identifyPayload } from "../module/client.ts" +import { identifyPayload, eventHandlers } from "../module/client.ts" import { requestAllMembers } from "../module/shardingManager.ts" /** Gets an array of all the channels ids that are the children of this category. */ @@ -64,6 +64,7 @@ export function guildBannerURL(guild: Guild, size: ImageSize = 128, format?: Ima /** Create a channel in your server. Bot needs MANAGE_CHANNEL permissions in the server. */ export async function createGuildChannel(guild: Guild, name: string, options: CreateChannelOptions) { if (!botHasPermission(guild.id, [Permissions.MANAGE_CHANNELS])) { + eventHandlers.error?.(Errors.MISSING_MANAGE_CHANNELS); throw new Error(Errors.MISSING_MANAGE_CHANNELS); } const result = @@ -122,6 +123,7 @@ options: CreateEmojisOptions, if ( !botHasPermission(guildID, [Permissions.MANAGE_EMOJIS]) ) { + eventHandlers.error?.(Errors.MISSING_MANAGE_EMOJIS); throw new Error(Errors.MISSING_MANAGE_EMOJIS); } return RequestManager.post(endpoints.GUILD_EMOJIS(guildID), { @@ -136,6 +138,7 @@ export function editEmoji(guildID: string, id: string, options: EditEmojisOption if ( !botHasPermission(guildID, [Permissions.MANAGE_EMOJIS]) ) { + eventHandlers.error?.(Errors.MISSING_MANAGE_EMOJIS); throw new Error(Errors.MISSING_MANAGE_EMOJIS); } return RequestManager.patch(endpoints.GUILD_EMOJI(guildID, id), { @@ -149,6 +152,7 @@ export function deleteEmoji(guildID: string, id: string, reason?: string) { if ( !botHasPermission(guildID, [Permissions.MANAGE_EMOJIS]) ) { + eventHandlers.error?.(Errors.MISSING_MANAGE_EMOJIS); throw new Error(Errors.MISSING_MANAGE_EMOJIS); } return RequestManager.delete( @@ -162,6 +166,7 @@ export async function createGuildRole(guild: Guild, options: CreateRoleOptions, if ( !botHasPermission(guild.id, [Permissions.MANAGE_ROLES]) ) { + eventHandlers.error?.(Errors.MISSING_MANAGE_ROLES); throw new Error(Errors.MISSING_MANAGE_ROLES); } const role_data = await RequestManager.post( @@ -184,6 +189,7 @@ export function editRole(guildID: string, id: string, options: CreateRoleOptions if ( !botHasPermission(guildID, [Permissions.MANAGE_ROLES]) ) { + eventHandlers.error?.(Errors.MISSING_MANAGE_ROLES); throw new Error(Errors.MISSING_MANAGE_ROLES); } return RequestManager.patch(endpoints.GUILD_ROLE(guildID, id), options); @@ -194,6 +200,7 @@ export function deleteRole(guildID: string, id: string) { if ( !botHasPermission(guildID, [Permissions.MANAGE_ROLES]) ) { + eventHandlers.error?.(Errors.MISSING_MANAGE_ROLES); throw new Error(Errors.MISSING_MANAGE_ROLES); } return RequestManager.delete(endpoints.GUILD_ROLE(guildID, id)); @@ -207,6 +214,7 @@ export function getRoles(guildID: string) { if ( !botHasPermission(guildID, [Permissions.MANAGE_ROLES]) ) { + eventHandlers.error?.(Errors.MISSING_MANAGE_ROLES); throw new Error(Errors.MISSING_MANAGE_ROLES); } return RequestManager.get(endpoints.GUILD_ROLES(guildID)); @@ -217,6 +225,7 @@ export function swapRoles(guildID: string, rolePositons: PositionSwap) { if ( !botHasPermission(guildID, [Permissions.MANAGE_ROLES]) ) { + eventHandlers.error?.(Errors.MISSING_MANAGE_ROLES); throw new Error(Errors.MISSING_MANAGE_ROLES); } return RequestManager.patch(endpoints.GUILD_ROLES(guildID), rolePositons); @@ -224,10 +233,14 @@ return RequestManager.patch(endpoints.GUILD_ROLES(guildID), rolePositons); /** Check how many members would be removed from the server in a prune operation. Requires the KICK_MEMBERS permission */ export async function getPruneCount(guildID: string, days: number) { -if (days < 1) throw new Error(Errors.PRUNE_MIN_DAYS); +if (days < 1) { + eventHandlers.error?.(Errors.PRUNE_MIN_DAYS); + throw new Error(Errors.PRUNE_MIN_DAYS); +} if ( !botHasPermission(guildID, [Permissions.KICK_MEMBERS]) ) { + eventHandlers.error?.(Errors.MISSING_KICK_MEMBERS); throw new Error(Errors.MISSING_KICK_MEMBERS); } const result = (await RequestManager.get( @@ -239,10 +252,14 @@ return result.pruned; /** Begin pruning all members in the given time period */ export function pruneMembers(guildID: string, days: number) { -if (days < 1) throw new Error(Errors.PRUNE_MIN_DAYS); +if (days < 1) { + eventHandlers.error?.(Errors.PRUNE_MIN_DAYS); + throw new Error(Errors.PRUNE_MIN_DAYS); +} if ( !botHasPermission(guildID, [Permissions.KICK_MEMBERS]) ) { + eventHandlers.error?.(Errors.MISSING_KICK_MEMBERS); throw new Error(Errors.MISSING_KICK_MEMBERS); } return RequestManager.post(endpoints.GUILD_PRUNE(guildID), { days }); @@ -250,6 +267,7 @@ return RequestManager.post(endpoints.GUILD_PRUNE(guildID), { days }); export function fetchMembers(guild: Guild, options?: FetchMembersOptions) { if (!(identifyPayload.intents & Intents.GUILD_MEMBERS)) { + eventHandlers.error?.(Errors.MISSING_INTENT_GUILD_MEMBERS); throw new Error(Errors.MISSING_INTENT_GUILD_MEMBERS); } @@ -261,6 +279,7 @@ return new Promise((resolve) => { /** Returns the audit logs for the guild. Requires VIEW AUDIT LOGS permission */ export function getAuditLogs(guildID: string, options: GetAuditLogsOptions) { if (!botHasPermission(guildID, [Permissions.VIEW_AUDIT_LOG])) { + eventHandlers.error?.(Errors.MISSING_VIEW_AUDIT_LOG); throw new Error(Errors.MISSING_VIEW_AUDIT_LOG); } @@ -277,6 +296,7 @@ export function getEmbed(guildID: string, ) { if ( !botHasPermission(guildID, [Permissions.MANAGE_GUILD]) ) { + eventHandlers.error?.(Errors.MISSING_MANAGE_GUILD); throw new Error(Errors.MISSING_MANAGE_GUILD); } return RequestManager.get(endpoints.GUILD_EMBED(guildID)); @@ -287,6 +307,7 @@ export function editEmbed(guildID: string, enabled: boolean, channelID?: string if ( !botHasPermission(guildID, [Permissions.MANAGE_GUILD]) ) { + eventHandlers.error?.(Errors.MISSING_MANAGE_GUILD); throw new Error(Errors.MISSING_MANAGE_GUILD); } return RequestManager.patch( @@ -305,6 +326,7 @@ export function getIntegrations(guildID: string, ) { if ( !botHasPermission(guildID, [Permissions.MANAGE_GUILD]) ) { + eventHandlers.error?.(Errors.MISSING_MANAGE_GUILD); throw new Error(Errors.MISSING_MANAGE_GUILD); } return RequestManager.get(endpoints.GUILD_INTEGRATIONS(guildID)); @@ -315,6 +337,7 @@ export function editIntegration(guildID: string, id: string, options: EditIntegr if ( !botHasPermission(guildID, [Permissions.MANAGE_GUILD]) ) { + eventHandlers.error?.(Errors.MISSING_MANAGE_GUILD); throw new Error(Errors.MISSING_MANAGE_GUILD); } return RequestManager.patch( @@ -328,6 +351,7 @@ export function deleteIntegration(guildID: string, id: string) { if ( !botHasPermission(guildID, [Permissions.MANAGE_GUILD]) ) { + eventHandlers.error?.(Errors.MISSING_MANAGE_GUILD); throw new Error(Errors.MISSING_MANAGE_GUILD); } return RequestManager.delete(endpoints.GUILD_INTEGRATION(guildID, id)); @@ -338,6 +362,7 @@ export function syncIntegration(guildID: string, id: string) { if ( !botHasPermission(guildID, [Permissions.MANAGE_GUILD]) ) { + eventHandlers.error?.(Errors.MISSING_MANAGE_GUILD); throw new Error(Errors.MISSING_MANAGE_GUILD); } return RequestManager.post(endpoints.GUILD_INTEGRATION_SYNC(guildID, id)); @@ -348,6 +373,7 @@ export function getBans(guildID: string) { if ( !botHasPermission(guildID, [Permissions.BAN_MEMBERS]) ) { + eventHandlers.error?.(Errors.MISSING_BAN_MEMBERS); throw new Error(Errors.MISSING_BAN_MEMBERS); } return RequestManager.get(endpoints.GUILD_BANS(guildID)); @@ -358,6 +384,7 @@ export function ban(guildID: string, id: string, options: BanOptions) { if ( !botHasPermission(guildID, [Permissions.BAN_MEMBERS]) ) { + eventHandlers.error?.(Errors.MISSING_BAN_MEMBERS); throw new Error(Errors.MISSING_BAN_MEMBERS); } return RequestManager.put(endpoints.GUILD_BAN(guildID, id), options); @@ -368,6 +395,7 @@ export function unban(guildID: string, id: string) { if ( !botHasPermission(guildID, [Permissions.BAN_MEMBERS]) ) { + eventHandlers.error?.(Errors.MISSING_BAN_MEMBERS); throw new Error(Errors.MISSING_BAN_MEMBERS); } return RequestManager.delete(endpoints.GUILD_BAN(guildID, id)); @@ -413,6 +441,7 @@ export function editGuild(guildID: string, options: GuildEditOptions) { if ( !botHasPermission(guildID, [Permissions.MANAGE_GUILD]) ) { + eventHandlers.error?.(Errors.MISSING_MANAGE_GUILD); throw new Error(Errors.MISSING_MANAGE_GUILD); } return RequestManager.patch(endpoints.GUILD(guildID), options); @@ -423,6 +452,7 @@ export function getInvites(guildID: string, ) { if ( !botHasPermission(guildID, [Permissions.MANAGE_GUILD]) ) { + eventHandlers.error?.(Errors.MISSING_MANAGE_GUILD); throw new Error(Errors.MISSING_MANAGE_GUILD); } return RequestManager.get(endpoints.GUILD_INVITES(guildID)); @@ -441,6 +471,7 @@ return RequestManager.get(endpoints.GUILD_REGIONS(guildID)); /** Returns a list of guild webhooks objects. Requires the MANAGE_WEBHOOKs permission. */ export function getWebhooks(guildID: string, ) { if (!botHasPermission(guildID, [Permissions.MANAGE_WEBHOOKS])) { + eventHandlers.error?.(Errors.MISSING_MANAGE_WEBHOOKS); throw new Error(Errors.MISSING_MANAGE_WEBHOOKS); } diff --git a/handlers/member.ts b/handlers/member.ts index 0d86c3cd4..f79c54a85 100644 --- a/handlers/member.ts +++ b/handlers/member.ts @@ -7,7 +7,7 @@ import { higherRolePosition, botHasPermission, } from "../utils/permissions.ts"; -import { botID } from "../module/client.ts"; +import { botID, eventHandlers } from "../module/client.ts"; import { Guild } from "../structures/guild.ts"; import { Permissions } from "../types/permission.ts"; import { Errors } from "../types/errors.ts"; @@ -45,10 +45,12 @@ export function addRole( botsHighestRole && !higherRolePosition(guild.id, botsHighestRole.id, roleID) ) { + eventHandlers.error?.(Errors.BOTS_HIGHEST_ROLE_TOO_LOW); throw new Error(Errors.BOTS_HIGHEST_ROLE_TOO_LOW); } if (!botHasPermission(guild.id, [Permissions.MANAGE_ROLES])) { + eventHandlers.error?.(Errors.MISSING_MANAGE_ROLES); throw new Error(Errors.MISSING_MANAGE_ROLES); } @@ -70,10 +72,12 @@ export function removeRole( botsHighestRole && !higherRolePosition(guild.id, botsHighestRole.id, roleID) ) { + eventHandlers.error?.(Errors.BOTS_HIGHEST_ROLE_TOO_LOW); throw new Error(Errors.BOTS_HIGHEST_ROLE_TOO_LOW); } if (!botHasPermission(guild.id, [Permissions.MANAGE_ROLES])) { + eventHandlers.error?.(Errors.MISSING_MANAGE_ROLES); throw new Error(Errors.MISSING_MANAGE_ROLES); } return RequestManager.delete( @@ -114,10 +118,12 @@ export function kick(guild: Guild, memberID: string, reason?: string) { botsHighestRole && membersHighestRole && botsHighestRole.position <= membersHighestRole.position ) { + eventHandlers.error?.(Errors.BOTS_HIGHEST_ROLE_TOO_LOW); throw new Error(Errors.BOTS_HIGHEST_ROLE_TOO_LOW); } if (!botHasPermission(guild.id, [Permissions.KICK_MEMBERS])) { + eventHandlers.error?.(Errors.MISSING_KICK_MEMBERS); throw new Error(Errors.MISSING_KICK_MEMBERS); } return RequestManager.delete( @@ -134,9 +140,11 @@ export function editMember( ) { if (options.nick) { if (options.nick.length > 32) { + eventHandlers.error?.(Errors.NICKNAMES_MAX_LENGTH); throw new Error(Errors.NICKNAMES_MAX_LENGTH); } if (!botHasPermission(guild.id, [Permissions.MANAGE_NICKNAMES])) { + eventHandlers.error?.(Errors.MISSING_MANAGE_NICKNAMES); throw new Error(Errors.MISSING_MANAGE_NICKNAMES); } } @@ -145,6 +153,7 @@ export function editMember( options.roles && !botHasPermission(guild.id, [Permissions.MANAGE_ROLES]) ) { + eventHandlers.error?.(Errors.MISSING_MANAGE_ROLES); throw new Error(Errors.MISSING_MANAGE_ROLES); } @@ -153,6 +162,7 @@ export function editMember( if ( !botHasPermission(guild.id, [Permissions.MUTE_MEMBERS]) ) { + eventHandlers.error?.(Errors.MISSING_MUTE_MEMBERS); throw new Error(Errors.MISSING_MUTE_MEMBERS); } } @@ -161,6 +171,7 @@ export function editMember( options.deaf && !botHasPermission(guild.id, [Permissions.DEAFEN_MEMBERS]) ) { + eventHandlers.error?.(Errors.MISSING_DEAFEN_MEMBERS); throw new Error(Errors.MISSING_DEAFEN_MEMBERS); } diff --git a/handlers/message.ts b/handlers/message.ts index ba60a2167..4f0372d01 100644 --- a/handlers/message.ts +++ b/handlers/message.ts @@ -1,6 +1,6 @@ import { Message, createMessage } from "../structures/message.ts"; import { delay } from "https://deno.land/std@0.50.0/async/delay.ts"; -import { botID } from "../module/client.ts"; +import { botID, eventHandlers } from "../module/client.ts"; import { hasChannelPermission } from "./channel.ts"; import { Permissions } from "../types/permission.ts"; import { Errors } from "../types/errors.ts"; @@ -27,6 +27,7 @@ export async function deleteMessage( [Permissions.MANAGE_MESSAGES], ) ) { + eventHandlers.error?.(Errors.MISSING_MANAGE_MESSAGES); throw new Error(Errors.MISSING_MANAGE_MESSAGES); } } @@ -45,6 +46,7 @@ export function pin(message: Message) { message.guildID && !botHasPermission(message.guildID, [Permissions.MANAGE_MESSAGES]) ) { + eventHandlers.error?.(Errors.MISSING_MANAGE_MESSAGES); throw new Error(Errors.MISSING_MANAGE_MESSAGES); } RequestManager.put(endpoints.CHANNEL_MESSAGE(message.channelID, message.id)); @@ -56,6 +58,7 @@ export function unpin(message: Message) { message.guildID && !botHasPermission(message.guildID, [Permissions.MANAGE_MESSAGES]) ) { + eventHandlers.error?.(Errors.MISSING_MANAGE_MESSAGES); throw new Error(Errors.MISSING_MANAGE_MESSAGES); } RequestManager.delete( @@ -91,6 +94,7 @@ export function removeAllReactions(message: Message) { message.guildID && !botHasPermission(message.guildID, [Permissions.MANAGE_MESSAGES]) ) { + eventHandlers.error?.(Errors.MISSING_MANAGE_MESSAGES); throw new Error(Errors.MISSING_MANAGE_MESSAGES); } RequestManager.delete( @@ -104,6 +108,7 @@ export function removeReactionEmoji(message: Message, reaction: string) { message.guildID && !botHasPermission(message.guildID, [Permissions.MANAGE_MESSAGES]) ) { + eventHandlers.error?.(Errors.MISSING_MANAGE_MESSAGES); throw new Error(Errors.MISSING_MANAGE_MESSAGES); } RequestManager.delete( @@ -140,6 +145,7 @@ export async function editMessage( if ( !botHasPermission(message.guildID, [Permissions.SEND_MESSAGES]) ) { + eventHandlers.error?.(Errors.MISSING_SEND_MESSAGES); throw new Error(Errors.MISSING_SEND_MESSAGES); } @@ -150,11 +156,13 @@ export async function editMessage( [Permissions.SEND_TTS_MESSAGES], ) ) { + eventHandlers.error?.(Errors.MISSING_SEND_TTS_MESSAGE); throw new Error(Errors.MISSING_SEND_TTS_MESSAGE); } } if (content.content && content.content.length > 2000) { + eventHandlers.error?.(Errors.MESSAGE_MAX_LENGTH); throw new Error(Errors.MESSAGE_MAX_LENGTH); } diff --git a/module/requestManager.ts b/module/requestManager.ts index a6d1bcc36..81a7fa50a 100644 --- a/module/requestManager.ts +++ b/module/requestManager.ts @@ -141,7 +141,10 @@ async function runMethod( json.retry_after || json.message === "You are being rate limited." ) { - if (retryCount > 10) throw new Error(Errors.RATE_LIMIT_RETRY_MAXED); + if (retryCount > 10) { + eventHandlers.error?.(Errors.RATE_LIMIT_RETRY_MAXED); + throw new Error(Errors.RATE_LIMIT_RETRY_MAXED); + } await delay(json.retry_after); return runMethod( method, @@ -184,12 +187,15 @@ function handleStatusCode(status: number) { case HttpResponseCode.NotFound: case HttpResponseCode.MethodNotAllowed: case HttpResponseCode.TooManyRequests: - throw new Error(Errors.REQUEST_CLIENT_ERROR); + eventHandlers.error?.(Errors.REQUEST_CLIENT_ERROR) ; + throw new Error(Errors.REQUEST_CLIENT_ERROR); case HttpResponseCode.GatewayUnavailable: - throw new Error(Errors.REQUEST_SERVER_ERROR); + eventHandlers.error?.(Errors.REQUEST_SERVER_ERROR) ; + throw new Error(Errors.REQUEST_SERVER_ERROR); } // left are all unknown + eventHandlers.error?.(Errors.REQUEST_UNKNOWN_ERROR); throw new Error(Errors.REQUEST_UNKNOWN_ERROR); } diff --git a/types/options.ts b/types/options.ts index a4728c7c2..d6a85bb8d 100644 --- a/types/options.ts +++ b/types/options.ts @@ -21,6 +21,7 @@ import { Channel } from "../structures/channel.ts"; import { Guild } from "../structures/guild.ts"; import { Member } from "../structures/member.ts"; import { UserPayload } from "./guild.ts"; +import { Errors } from "./errors.ts"; export interface Fulfilled_Client_Options { token: string; @@ -65,6 +66,7 @@ export interface EventHandlers { channelUpdate?: (channel: Channel, cachedChannel: Channel) => unknown; channelDelete?: (channel: Channel) => unknown; debug?: (args: DebugArg) => unknown; + error?: (type: Errors) => unknown; guildBanAdd?: (guild: Guild, user: Member | UserPayload) => unknown; guildBanRemove?: (guild: Guild, user: Member | UserPayload) => unknown; guildCreate?: (guild: Guild) => unknown;