n1cat-discord-script-manager
Version:
A Discord.js plugin for dynamic script management and execution
203 lines (182 loc) • 5.26 kB
JavaScript
/**
* 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;