UNPKG

rashi-discord-bot-lib

Version:

🚀 Powerful Discord bot framework with built-in database, event handling, and utilities

107 lines • 3.92 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.MusicManager = void 0; const shoukaku_1 = require("shoukaku"); const Logger_1 = require("../utils/Logger"); class MusicManager { client; config; logger; shoukaku; /** Opcjonalne – na teraz nie tworzymy instancji Kazagumo (brak zewn. konektora), ale zostawiamy pole na przyszłość */ kazagumo; _ready = false; constructor(client, config, logger) { this.client = client; this.config = config; this.logger = logger ?? new Logger_1.Logger(); } /** * Inicjalizacja Shoukaku + eventy */ async init() { // Mapowanie node’ów z Twojego configu na NodeOption Shoukaku const nodes = this.config.nodes.map((n) => ({ name: n.name, url: n.url, // format: "host:port" auth: n.auth, secure: !!n.secure })); // Opcje Shoukaku – 'resume' zamiast 'resumable' const options = { resume: true, resumeTimeout: 60, userAgent: 'rashi-discord-bot-lib' }; // Konektor dla discord.js v14 const connector = new shoukaku_1.Connectors.DiscordJS(this.client); this.shoukaku = new shoukaku_1.Shoukaku(connector, nodes, options); // --- Eventy --- this.shoukaku.on('ready', (name) => { this.logger.info(`Lavalink node "${name}" is ready`); this._ready = true; }); this.shoukaku.on('error', (name, err) => { this.logger.error(`Lavalink node "${name}" error:`, err); }); // Uwaga: w Shoukaku 'close' i 'disconnect' mają inne sygnatury this.shoukaku.on('close', (name, code, reason) => { this.logger.warn(`Lavalink node "${name}" closed: code=${code} reason=${reason || 'no reason'}`); }); this.shoukaku.on('disconnect', (name, count) => { this.logger.warn(`Lavalink node "${name}" disconnected (reconnects: ${count})`); }); // (opcjonalnie) Połącz pierwszy node natychmiast (Shoukaku i tak łączy on-demand) // Możesz tez tutaj zrobić "ping" do /version, ale nie jest to wymagane. } /** Czy został w pełni przygotowany */ isReady() { return this._ready; } /** Czy w użyciu jest Kazagumo (obecnie nie tworzymy instancji – zwróci false) */ isKazagumo() { return !!this.kazagumo; } /** Lista node’ów wraz ze stanem */ getNodesStatus() { if (!this.shoukaku) return []; return Array.from(this.shoukaku.nodes.values()).map((node) => ({ name: node.name, state: node.state })); } /** Syntactic sugar – nazwy node’ów */ getNodeNames() { if (!this.shoukaku) return []; return Array.from(this.shoukaku.nodes.keys()); } /** * Zamyka połączenia i sprząta eventy */ async destroy() { try { if (this.shoukaku) { // Rozłącz wszystkie node’y for (const node of Array.from(this.shoukaku.nodes.values())) { try { // Shoukaku nie ma "disconnect()" na Node; od v4 Shoukaku zarządza socketem wewnętrznie. // Usunięcie node’a wymaga restartu/rekonfiguracji – tu ograniczamy się do zdjęcia eventów. } catch { /* ignore single node issues */ } } this.shoukaku.removeAllListeners(); } } catch (e) { this.logger.warn('MusicManager.destroy() encountered an error:', e); } finally { this._ready = false; } } } exports.MusicManager = MusicManager; exports.default = MusicManager; //# sourceMappingURL=MusicManager.js.map