// Der laufende Teil der Discord-Anbindung: haelt die Gateway-Verbindung und // beantwortet Klicks auf die Rollen-Knoepfe. // // Laeuft im Ingest-Daemon mit. Ohne hinterlegtes Bot-Token passiert nichts - // das ist kein Fehler, sondern der Zustand vor der Einrichtung. import { logger } from '#core/logger.ts'; import { readSecrets } from '#twitch/secrets.ts'; import { Discord } from './api.ts'; import { createGateway } from './gateway.ts'; import { createRoleButtons } from './selfroles.ts'; const log = logger('discord:bot'); export type Bot = { run: (signal: AbortSignal) => Promise; isConnected: () => boolean; }; /** * Gibt null zurueck, wenn Token oder Server-ID fehlen. Der Aufrufer soll dann * einfach ohne Discord weiterlaufen. */ export function createBot(): Bot | null { const cfg = readSecrets().discord; if (!cfg?.botToken || !cfg.guildId) { log.info('Kein Discord-Bot hinterlegt - Rollen-Knoepfe bleiben aus. ' + 'Einrichten mit: abdulive discord:setup'); return null; } const api = new Discord(cfg.botToken); const buttons = createRoleButtons(api, cfg.guildId); const gateway = createGateway( api.botToken, (path) => api.get<{ url: string }>(path), { onInteraction: (i) => buttons.handle(i), onReady: ({ user }) => log.info(`Rollen-Knoepfe sind scharf (${user.username})`), }, ); return { run: (signal) => gateway.run(signal), isConnected: () => gateway.isConnected() }; }