Skip to content

Commit

Permalink
fix(bots/discord): fix reload not working
Browse files Browse the repository at this point in the history
  • Loading branch information
PalmDevs committed Oct 17, 2024
1 parent 488d37e commit 11582d5
Show file tree
Hide file tree
Showing 2 changed files with 36 additions and 15 deletions.
11 changes: 3 additions & 8 deletions bots/discord/src/commands/admin/reload.ts
Original file line number Diff line number Diff line change
@@ -1,19 +1,14 @@
import { dirname, join } from 'path'
import { AdminCommand } from '$/classes/Command'

import type { Config } from 'config.schema'

export default new AdminCommand({
name: 'reload',
description: 'Reload configuration',
async execute(context, trigger) {
const { api, logger, discord } = context
logger.info(`Reload triggered by ${context.executor.tag} (${context.executor.id})`)

// Apparently the query strings only work with non-Windows "URLs", otherwise it'd just infinitely hang
const path = `${Bun.pathToFileURL(join(dirname(Bun.main), '..', 'config.js')).toString()}?cache=${Date.now()}`
logger.debug(`Reloading configuration from: ${path}`)
context.config = ((await import(path)) as { default: Config }).default
logger.debug('Invalidating previous config...')
context.config.invalidate()

if ('deferReply' in trigger) await trigger.deferReply({ ephemeral: true })

Expand All @@ -28,7 +23,7 @@ export default new AdminCommand({
api.client.disconnect(true)
api.disconnectCount = 0
api.intentionallyDisconnecting = false
await api.client.connect()
api.client.connect()

logger.info('Reinitializing Discord client to reload configuration...')
await discord.client.destroy()
Expand Down
40 changes: 33 additions & 7 deletions bots/discord/src/context.ts
Original file line number Diff line number Diff line change
@@ -1,23 +1,49 @@
import { Database } from 'bun:sqlite'
import { existsSync, readFileSync, readdirSync } from 'fs'
import { join } from 'path'
import { dirname, join } from 'path'
import { Client as APIClient } from '@revanced/bot-api'
import { createLogger } from '@revanced/bot-shared'
import { Client as DiscordClient, type Message, Partials } from 'discord.js'
import { drizzle } from 'drizzle-orm/bun-sqlite'
import type { default as Command, CommandOptionsOptions, CommandType } from './classes/Command'
import * as schemas from './database/schemas'

// Export some things first, as commands require them
import config from '../config.js'
export { config }
import _firstConfig from '../config.js'

let currentConfig = _firstConfig

// Other parts of the code will access properties of this proxy, they don't care what the target looks like
export const config = new Proxy(
{
INSPECTION_WARNING: 'Run `context.__getConfig()` to inspect the latest config.',
} as unknown as typeof currentConfig,
{
get(_, p, receiver) {
if (p === 'invalidate')
return async () => {
const path = join(dirname(Bun.main), '..', 'config.js')
Loader.registry.delete(path)
currentConfig = (await import(path)).default
logger.debug('New config set')
}

return Reflect.get(currentConfig, p, receiver)
},
set(_, p, newValue, receiver) {
return Reflect.set(currentConfig, p, newValue, receiver)
},
},
) as typeof _firstConfig & { invalidate(): void }

export const __getConfig = () => currentConfig

export const logger = createLogger({
level: config.logLevel === 'none' ? Number.MAX_SAFE_INTEGER : config.logLevel,
})

import * as commands from './commands'
import * as schemas from './database/schemas'

import type { default as Command, CommandOptionsOptions, CommandType } from './classes/Command'
// Importing later because config needs to be exported before
const commands = await import('./commands')

export const api = {
client: new APIClient({
Expand Down

0 comments on commit 11582d5

Please sign in to comment.