rashi-discord-bot-lib
Version:
🚀 Powerful Discord bot framework with built-in database, event handling, and utilities
107 lines • 3.92 kB
JavaScript
"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