UNPKG

n1cat-discord-script-manager

Version:

A Discord.js plugin for dynamic script management and execution

203 lines (182 loc) 5.26 kB
/** * EventHandler - 事件處理系統 * 負責處理 Discord 事件和腳本事件 */ const { EmbedBuilder } = require("discord.js"); const Logger = require("../utils/logger"); class EventHandler { /** * 創建一個新的事件處理器 * @param {Object} client - Discord.js 客戶端 * @param {Object} [options] - 配置選項 * @param {boolean} [options.debug=false] - 是否開啟調試模式 */ constructor(client, options = {}) { if (!client) { throw new Error("Discord client is required"); } this.client = client; this.options = { debug: options.debug || false, }; // 創建上下文日誌器 this.logger = Logger.createContextLogger({ module: "EventHandler", debug: this.options.debug, }); this._eventHandlers = new Map(); this._scriptEvents = new Map(); } /** * 設置基本事件監聽器 */ setupBasicListeners() { try { // 客戶端準備就緒事件 this.client.once("ready", () => { this.logger.log(`✅ 已登入為 ${this.client.user.tag}`); }); // 錯誤事件 this.client.on("error", (error) => { this.logger.error("Discord 客戶端錯誤", { showStack: true, additionalInfo: error.message, }); }); // 警告事件 this.client.on("warn", (warning) => { this.logger.log(`⚠️ Discord 警告: ${warning}`, { debug: true, }); }); } catch (error) { this.logger.error("設置基本事件監聽器時出錯", { showStack: true, additionalInfo: error.message, }); } } /** * 設置消息事件監聽器 * @param {Function} messageHandler - 處理消息的函數 */ setupMessageListener(messageHandler) { try { this.client.on("messageCreate", async (message) => { try { await messageHandler(message, this.client); } catch (error) { this.logger.error("處理消息時出錯", { showStack: true, additionalInfo: { messageContent: message.content, channelId: message.channel.id, guildId: message.guild?.id, }, }); } }); this.logger.log("✅ 消息事件監聽器已設置"); } catch (error) { this.logger.error("設置消息事件監聽器時出錯", { showStack: true, additionalInfo: error.message, }); } } /** * 設置互動事件監聽器 * @param {Function} interactionHandler - 處理互動的函數 */ setupInteractionListener(interactionHandler) { try { this.client.on("interactionCreate", async (interaction) => { try { await interactionHandler(interaction, this.client); } catch (error) { this.logger.error("處理互動時出錯", { showStack: true, additionalInfo: { interactionType: interaction.type, interactionId: interaction.id, }, }); } }); this.logger.log("✅ 互動事件監聽器已設置"); } catch (error) { this.logger.error("設置互動事件監聽器時出錯", { showStack: true, additionalInfo: error.message, }); } } /** * 註冊 Discord 事件處理器 * @param {string} eventName - 事件名稱 * @param {Function} handler - 事件處理函數 */ registerEvent(eventName, handler) { if (this._eventHandlers.has(eventName)) { this.client.removeListener(eventName, this._eventHandlers.get(eventName)); } this.client.on(eventName, handler); this._eventHandlers.set(eventName, handler); } /** * 註冊腳本事件處理器 * @param {string} eventName - 事件名稱 * @param {Function} handler - 事件處理函數 */ registerScriptEvent(eventName, handler) { this._scriptEvents.set(eventName, handler); } /** * 觸發腳本事件 * @param {string} eventName - 事件名稱 * @param {...any} args - 事件參數 */ async triggerScriptEvent(eventName, ...args) { const handler = this._scriptEvents.get(eventName); if (handler) { try { await handler(...args); } catch (error) { if (this.options.debug) { console.error(`Error in script event ${eventName}:`, error); } } } } /** * 移除事件處理器 * @param {string} eventName - 事件名稱 */ removeEvent(eventName) { const handler = this._eventHandlers.get(eventName); if (handler) { this.client.removeListener(eventName, handler); this._eventHandlers.delete(eventName); } } /** * 移除腳本事件處理器 * @param {string} eventName - 事件名稱 */ removeScriptEvent(eventName) { this._scriptEvents.delete(eventName); } /** * 清理所有事件處理器 */ cleanup() { // 移除所有 Discord 事件處理器 for (const [eventName, handler] of this._eventHandlers) { this.client.removeListener(eventName, handler); } this._eventHandlers.clear(); // 清理腳本事件處理器 this._scriptEvents.clear(); } } module.exports = EventHandler;