n1cat-discord-script-manager
Version:
A Discord.js plugin for dynamic script management and execution
161 lines (142 loc) • 5.06 kB
JavaScript
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,
});
}
},
};