UNPKG

n1cat-discord-script-manager

Version:

A Discord.js plugin for dynamic script management and execution

161 lines (142 loc) 5.06 kB
const { SlashCommandBuilder, PermissionFlagsBits, ActionRowBuilder, ButtonBuilder, ButtonStyle, } = require("discord.js"); const fs = require("fs"); const path = require("path"); const Logger = require("../utils/logger"); module.exports = { data: new SlashCommandBuilder() .setName("deletescript") .setDescription("刪除已停用的腳本") .setDefaultMemberPermissions(PermissionFlagsBits.Administrator) .addStringOption((option) => option .setName("script") .setDescription("要刪除的腳本名稱") .setRequired(true) .setAutocomplete(true) ), async autocomplete(interaction) { const logger = Logger.createContextLogger({ module: "DeleteScript", debug: interaction.client.config?.debug || false, }); try { logger.log("開始處理自動完成請求"); const scriptManager = interaction.client.scriptManager; if (!scriptManager) { logger.error("找不到腳本管理器"); return await interaction.respond([]); } const focusedValue = interaction.options.getFocused().toLowerCase(); logger.log(`搜尋腳本: ${focusedValue}`); // 僅顯示已停用的腳本 const scripts = Array.from(scriptManager.scripts.entries()) .filter(([, script]) => script.enabled === false) .map(([name, script]) => ({ name: `${name} (已停用)`, value: name, })) .filter( (script) => script.value.toLowerCase().includes(focusedValue) || script.name.toLowerCase().includes(focusedValue) ); logger.log(`找到的腳本: ${scripts.map((s) => s.value).join(", ")}`); await interaction.respond(scripts.slice(0, 25)); logger.log("自動完成請求處理完成"); } catch (error) { const logger = Logger.createContextLogger({ module: "DeleteScript", debug: interaction.client.config?.debug || false, }); logger.error(`自動完成時出錯: ${error.message}`, { showStack: true }); console.error("詳細錯誤信息:", { error: error.message, code: error.code, interactionId: interaction.id, interactionState: { replied: interaction.replied, deferred: interaction.deferred, }, timestamp: new Date().toISOString(), }); try { await interaction.respond([]); logger.log("已發送空的自動完成回應"); } catch (e) { logger.error(`回應自動完成時出錯: ${e.message}`, { showStack: true }); } } }, async execute(interaction) { const logger = Logger.createContextLogger({ module: "DeleteScript", debug: interaction.client.config?.debug || false, }); logger.log("開始執行 deletescript 命令"); try { const scriptManager = interaction.client.scriptManager; if (!scriptManager) { logger.error("找不到腳本管理器"); return await interaction.reply({ content: "❌ 找不到腳本管理器", ephemeral: true, }); } const scriptName = interaction.options.getString("script"); logger.log(`準備刪除腳本: ${scriptName}`); const script = scriptManager.scripts.get(scriptName); if (!script) { logger.error(`找不到腳本: ${scriptName}`); return await interaction.reply({ content: `❌ 找不到腳本:${scriptName}`, ephemeral: true, }); } // 確認是否為已停用腳本 if (script.enabled !== false) { logger.error(`嘗試刪除未停用的腳本: ${scriptName}`); return await interaction.reply({ content: `❌ 只能刪除已停用的腳本。請先使用 /managescript 停用該腳本。`, ephemeral: true, }); } // 創建確認按鈕 const confirmButton = new ButtonBuilder() .setCustomId(`confirm_delete_${scriptName}`) .setLabel("確認刪除") .setStyle(ButtonStyle.Danger); const cancelButton = new ButtonBuilder() .setCustomId("cancel_delete") .setLabel("取消") .setStyle(ButtonStyle.Secondary); const row = new ActionRowBuilder().addComponents( confirmButton, cancelButton ); // 發送確認消息 await interaction.reply({ content: `⚠️ 您確定要刪除腳本 \`${scriptName}\` 嗎?\n此操作不可逆,腳本將永久刪除。`, components: [row], ephemeral: true, }); } catch (error) { logger.error(`刪除腳本時出錯: ${error.message}`, { showStack: true }); console.error("詳細錯誤信息:", { error: error.message, code: error.code, interactionId: interaction.id, timestamp: new Date().toISOString(), }); await interaction.reply({ content: `❌ 執行命令時發生錯誤:${error.message}`, ephemeral: true, }); } }, };