From 0bfd03583d89ce3e80f900479b4b24ee7d126a05 Mon Sep 17 00:00:00 2001 From: PalmDevs Date: Thu, 4 Jul 2024 20:53:29 +0700 Subject: [PATCH] feat(events)!: use better api for events --- bots/discord/src/events/api/disconnect.ts | 9 ++++---- bots/discord/src/events/api/ready.ts | 7 ++----- .../src/events/discord/cureRequired.ts | 9 ++++---- ...ly-role-presets.ts => applyRolePresets.ts} | 4 ++-- .../{chat-commmand.ts => chatCommand.ts} | 4 ++-- ...correct-response.ts => correctResponse.ts} | 4 ++-- .../{scan.ts => messageScanRequired.ts} | 10 ++++----- ...correct-response.ts => correctResponse.ts} | 6 +++--- bots/discord/src/events/discord/ready.ts | 4 ++-- bots/discord/src/utils/api/events.ts | 21 ++++++++++++------- bots/discord/src/utils/discord/events.ts | 14 ++++++++----- 11 files changed, 48 insertions(+), 44 deletions(-) rename bots/discord/src/events/discord/guildMemberAdd/{apply-role-presets.ts => applyRolePresets.ts} (80%) rename bots/discord/src/events/discord/interactionCreate/{chat-commmand.ts => chatCommand.ts} (96%) rename bots/discord/src/events/discord/interactionCreate/{correct-response.ts => correctResponse.ts} (97%) rename bots/discord/src/events/discord/messageCreate/{scan.ts => messageScanRequired.ts} (92%) rename bots/discord/src/events/discord/messageReactionAdd/{correct-response.ts => correctResponse.ts} (96%) diff --git a/bots/discord/src/events/api/disconnect.ts b/bots/discord/src/events/api/disconnect.ts index 29d1ae4..6b6c230 100644 --- a/bots/discord/src/events/api/disconnect.ts +++ b/bots/discord/src/events/api/disconnect.ts @@ -1,8 +1,7 @@ -import { on } from '$utils/api/events' +import { on, withContext } from '$utils/api/events' import { DisconnectReason, HumanizedDisconnectReason } from '@revanced/bot-shared' -import { api, logger } from 'src/context' -on('disconnect', (reason, msg) => { +withContext(on, 'disconnect', ({ api, config, logger }, reason, msg) => { if (reason === DisconnectReason.PlannedDisconnect && api.isStopping) return const ws = api.client.ws @@ -16,8 +15,7 @@ on('disconnect', (reason, msg) => { }`, ) - // TODO: move to config - if (api.disconnectCount >= 3) { + if (api.disconnectCount >= (config.api.disconnectLimit ?? 3)) { console.error('Disconnected from bot API too many times') // We don't want the process hanging process.exit(1) @@ -26,5 +24,6 @@ on('disconnect', (reason, msg) => { logger.info( `Disconnected from bot API ${++api.disconnectCount} times (this time because: ${reason}, ${msg}), reconnecting again...`, ) + setTimeout(() => api.client.connect(), 10000) }) diff --git a/bots/discord/src/events/api/ready.ts b/bots/discord/src/events/api/ready.ts index 4df8ab9..94e55df 100644 --- a/bots/discord/src/events/api/ready.ts +++ b/bots/discord/src/events/api/ready.ts @@ -1,6 +1,3 @@ -import { on } from '$utils/api/events' -import { logger } from 'src/context' +import { on, withContext } from '$utils/api/events' -on('ready', () => { - logger.info('Connected to the bot API') -}) +withContext(on, 'ready', ({ logger }) => void logger.info('Connected to the bot API')) diff --git a/bots/discord/src/events/discord/cureRequired.ts b/bots/discord/src/events/discord/cureRequired.ts index 4c810a8..b8e930b 100644 --- a/bots/discord/src/events/discord/cureRequired.ts +++ b/bots/discord/src/events/discord/cureRequired.ts @@ -1,18 +1,17 @@ import { on } from '$/utils/discord/events' import { cureNickname } from '$/utils/discord/moderation' -on('guildMemberUpdate', async (_, oldMember, newMember) => { +on('guildMemberUpdate', async (oldMember, newMember) => { if (newMember.user.bot) return if (oldMember.displayName !== newMember.displayName) await cureNickname(newMember) }) -on('guildMemberAdd', (_, member) => { +on('guildMemberAdd', member => { if (member.user.bot) return cureNickname(member) }) -on('messageCreate', async (_, msg) => { - if (msg.author.bot) return - if (!msg.member) return +on('messageCreate', async msg => { + if (msg.author.bot || !msg.member) return await cureNickname(msg.member) }) diff --git a/bots/discord/src/events/discord/guildMemberAdd/apply-role-presets.ts b/bots/discord/src/events/discord/guildMemberAdd/applyRolePresets.ts similarity index 80% rename from bots/discord/src/events/discord/guildMemberAdd/apply-role-presets.ts rename to bots/discord/src/events/discord/guildMemberAdd/applyRolePresets.ts index 034d094..90f176f 100644 --- a/bots/discord/src/events/discord/guildMemberAdd/apply-role-presets.ts +++ b/bots/discord/src/events/discord/guildMemberAdd/applyRolePresets.ts @@ -1,9 +1,9 @@ import { appliedPresets } from '$/database/schemas' -import { on } from '$/utils/discord/events' +import { on, withContext } from '$/utils/discord/events' import { applyRolesUsingPreset } from '$/utils/discord/rolePresets' import { and, eq, gt } from 'drizzle-orm' -on('guildMemberAdd', async ({ database }, member) => { +withContext(on, 'guildMemberAdd', async ({ database }, member) => { const applieds = await database.query.appliedPresets.findMany({ where: and( eq(appliedPresets.memberId, member.id), diff --git a/bots/discord/src/events/discord/interactionCreate/chat-commmand.ts b/bots/discord/src/events/discord/interactionCreate/chatCommand.ts similarity index 96% rename from bots/discord/src/events/discord/interactionCreate/chat-commmand.ts rename to bots/discord/src/events/discord/interactionCreate/chatCommand.ts index 9300b75..0972b16 100644 --- a/bots/discord/src/events/discord/interactionCreate/chat-commmand.ts +++ b/bots/discord/src/events/discord/interactionCreate/chatCommand.ts @@ -1,8 +1,8 @@ import CommandError from '$/classes/CommandError' import { createErrorEmbed, createStackTraceEmbed } from '$utils/discord/embeds' -import { on } from '$utils/discord/events' +import { on, withContext } from '$utils/discord/events' -export default on('interactionCreate', async (context, interaction) => { +withContext(on, 'interactionCreate', async (context, interaction) => { if (!interaction.isChatInputCommand()) return const { logger, discord, config } = context diff --git a/bots/discord/src/events/discord/interactionCreate/correct-response.ts b/bots/discord/src/events/discord/interactionCreate/correctResponse.ts similarity index 97% rename from bots/discord/src/events/discord/interactionCreate/correct-response.ts rename to bots/discord/src/events/discord/interactionCreate/correctResponse.ts index 9c1c810..81b67a8 100644 --- a/bots/discord/src/events/discord/interactionCreate/correct-response.ts +++ b/bots/discord/src/events/discord/interactionCreate/correctResponse.ts @@ -1,13 +1,13 @@ import { responses } from '$/database/schemas' import { handleUserResponseCorrection } from '$/utils/discord/messageScan' import { createErrorEmbed, createStackTraceEmbed, createSuccessEmbed } from '$utils/discord/embeds' -import { on } from '$utils/discord/events' +import { on, withContext } from '$utils/discord/events' import type { ButtonInteraction, StringSelectMenuInteraction, TextBasedChannel } from 'discord.js' import { eq } from 'drizzle-orm' // No permission check required as it is already done when the user reacts to a bot response -export default on('interactionCreate', async (context, interaction) => { +withContext(on, 'interactionCreate', async (context, interaction) => { const { logger, database: db, diff --git a/bots/discord/src/events/discord/messageCreate/scan.ts b/bots/discord/src/events/discord/messageCreate/messageScanRequired.ts similarity index 92% rename from bots/discord/src/events/discord/messageCreate/scan.ts rename to bots/discord/src/events/discord/messageCreate/messageScanRequired.ts index 4400172..1ba7ef6 100644 --- a/bots/discord/src/events/discord/messageCreate/scan.ts +++ b/bots/discord/src/events/discord/messageCreate/messageScanRequired.ts @@ -2,15 +2,15 @@ import { MessageScanLabeledResponseReactions } from '$/constants' import { responses } from '$/database/schemas' import { getResponseFromText, shouldScanMessage } from '$/utils/discord/messageScan' import { createMessageScanResponseEmbed } from '$utils/discord/embeds' -import { on } from '$utils/discord/events' +import { on, withContext } from '$utils/discord/events' -on('messageCreate', async (ctx, msg) => { +withContext(on, 'messageCreate', async (context, msg) => { const { api, config: { messageScan: config }, database: db, logger, - } = ctx + } = context if (!config || !config.responses) return @@ -21,7 +21,7 @@ on('messageCreate', async (ctx, msg) => { try { logger.debug(`Classifying message ${msg.id}`) - const { response, label } = await getResponseFromText(msg.content, filteredResponses, ctx) + const { response, label } = await getResponseFromText(msg.content, filteredResponses, context) if (response) { logger.debug('Response found') @@ -59,7 +59,7 @@ on('messageCreate', async (ctx, msg) => { try { const { text: content } = await api.client.parseImage(attachment.url) - const { response } = await getResponseFromText(content, filteredResponses, ctx, true) + const { response } = await getResponseFromText(content, filteredResponses, context, true) if (response) { logger.debug(`Response found for attachment: ${attachment.url}`) diff --git a/bots/discord/src/events/discord/messageReactionAdd/correct-response.ts b/bots/discord/src/events/discord/messageReactionAdd/correctResponse.ts similarity index 96% rename from bots/discord/src/events/discord/messageReactionAdd/correct-response.ts rename to bots/discord/src/events/discord/messageReactionAdd/correctResponse.ts index b90a21a..2e8bd2a 100644 --- a/bots/discord/src/events/discord/messageReactionAdd/correct-response.ts +++ b/bots/discord/src/events/discord/messageReactionAdd/correctResponse.ts @@ -1,6 +1,6 @@ import { MessageScanLabeledResponseReactions as Reactions } from '$/constants' import { createErrorEmbed, createStackTraceEmbed, createSuccessEmbed } from '$/utils/discord/embeds' -import { on } from '$/utils/discord/events' +import { on, withContext } from '$/utils/discord/events' import { ActionRowBuilder, @@ -10,14 +10,14 @@ import { StringSelectMenuOptionBuilder, } from 'discord.js' +import type { ConfigMessageScanResponseLabelConfig } from '$/../config.schema' import { responses } from '$/database/schemas' import { handleUserResponseCorrection } from '$/utils/discord/messageScan' -import type { ConfigMessageScanResponseLabelConfig } from 'config.schema' import { eq } from 'drizzle-orm' const PossibleReactions = Object.values(Reactions) as string[] -on('messageReactionAdd', async (context, rct, user) => { +withContext(on, 'messageReactionAdd', async (context, rct, user) => { if (user.bot) return const { database: db, logger, config } = context diff --git a/bots/discord/src/events/discord/ready.ts b/bots/discord/src/events/discord/ready.ts index e5f9a73..73e8742 100644 --- a/bots/discord/src/events/discord/ready.ts +++ b/bots/discord/src/events/discord/ready.ts @@ -3,9 +3,9 @@ import { appliedPresets } from '$/database/schemas' import { removeRolePreset } from '$/utils/discord/rolePresets' import type { Client } from 'discord.js' import { lt } from 'drizzle-orm' -import { on } from 'src/utils/discord/events' +import { on, withContext } from 'src/utils/discord/events' -export default on('ready', ({ config, logger }, client) => { +export default withContext(on, 'ready', ({ config, logger }, client) => { logger.info(`Connected to Discord API, logged in as ${client.user.displayName} (@${client.user.tag})!`) logger.info( `Bot is in ${client.guilds.cache.size} guilds, if this is not expected, please run the /leave-unknowns command`, diff --git a/bots/discord/src/utils/api/events.ts b/bots/discord/src/utils/api/events.ts index 5f6dbfa..363eda3 100644 --- a/bots/discord/src/utils/api/events.ts +++ b/bots/discord/src/utils/api/events.ts @@ -1,15 +1,20 @@ import type { ClientWebSocketEvents } from '@revanced/bot-api' -import { api } from '../../context' +import * as context from '../../context' -const { client } = api +const { client } = context.api -export const on = (event: Event, listener: ListenerOf) => { - client.on(event, listener) -} +export const withContext = ( + fn: typeof on | typeof once, + event: Event, + listener: ListenerWithContextOf, + // @ts-expect-error: Not smart enough, sorry! +) => fn(event, (...args) => listener(context, ...args)) -export const once = (event: Event, listener: ListenerOf) => { - client.once(event, listener) -} +export const on = (event: Event, listener: ListenerOf) => client.on(event, listener) +export const once = (event: Event, listener: ListenerOf) => client.once(event, listener) export type EventName = keyof ClientWebSocketEvents export type ListenerOf = ClientWebSocketEvents[Event] +export type ListenerWithContextOf = ( + ...args: [typeof import('../../context'), ...Parameters] +) => void | Promise diff --git a/bots/discord/src/utils/discord/events.ts b/bots/discord/src/utils/discord/events.ts index 97e0205..0283471 100644 --- a/bots/discord/src/utils/discord/events.ts +++ b/bots/discord/src/utils/discord/events.ts @@ -3,17 +3,21 @@ import type { ClientEvents } from 'discord.js' const { client } = context.discord -export const on = (event: Event, listener: ListenerOf) => - client.on(event, (...args) => listener(context, ...args)) +export const withContext = ( + fn: typeof on | typeof once, + event: Event, + listener: ListenerWithContextOf, +) => fn(event, (...args) => listener(context, ...args)) -export const once = (event: Event, listener: ListenerOf) => - client.once(event, (...args) => listener(context, ...args)) +export const on = (event: Event, listener: ListenerOf) => client.on(event, listener) +export const once = (event: Event, listener: ListenerOf) => client.once(event, listener) export type EventName = keyof ClientEvents export type EventMap = { [K in EventName]: ListenerOf } -type ListenerOf = ( +type ListenerOf = (...args: ClientEvents[Event]) => void | Promise +type ListenerWithContextOf = ( ...args: [typeof import('$/context'), ...ClientEvents[Event]] ) => void | Promise