const fs = require("fs"); const path = require("path"); module.exports = { config: { name: "setting", version: "1.0.0", author: "šŒššš‘š®š…", countDown: 5, role: 2, shortDescription: "Bot settings", longDescription: "Control bot settings", category: "admin", guide: "{prefix}setting" }, onStart: async function ({ api, event, args, message }) { const mainMenu = [ "╭─〔 āš™ļø ššØš­ š’šžš­š­š¢š§š š¬ 怕", "│", "│ āžŠ ššØš­ š‚šØš§šŸš¢š ", "│ āž‹ š€šš¦š¢š§ šŒššš§ššš šž", "│ āžŒ š–š”š¢š­šžš„š¢š¬š­ šŒššš§ššš šž", "│ āž ššØ šš«šžšŸš¢š±", "│ āžŽ š‘šžšššœš­ š”š§š¬šžš§š", "│ āž šš¢šœš¤š§ššš¦šž", "│ āž š…š‚š€ šŽš©š­š¢šØš§š¬", "│", "╰─〔 › š‘šžš©š„š² šŸā€“šŸ• 怕" ].join("\n"); const sent = await message.reply(mainMenu); global.GoatBot.onReply.set(sent.messageID, { commandName: "setting", messageID: sent.messageID, author: event.senderID, state: "main" }); }, onReply: async function ({ api, event, Reply, message }) { const { author, state } = Reply; if (event.senderID !== author) return; const configPath = path.join(process.cwd(), "config.json"); const config = JSON.parse(fs.readFileSync(configPath, "utf8")); const input = event.body.trim(); const num = parseInt(input); function saveConfig() { fs.writeFileSync( configPath, JSON.stringify(config, null, 2), "utf8" ); } function status(val) { return val ? "ā— šŽš" : "ā—‹ šŽš…š…"; } async function sendAndListen(text, newState, extra = {}) { const sent = await message.reply(text); global.GoatBot.onReply.set(sent.messageID, { commandName: "setting", messageID: sent.messageID, author, state: newState, ...extra }); } if (state === "main") { if (num === 1) { const menu = [ "╭─〔 āš™ļø ššØš­ š‚šØš§šŸš¢š  怕", "│", `│ āžŠ š€šš¦š¢š§ šŽš§š„š² ${status(config.adminOnly?.enable)}`, `│ āž‹ š€š®š­šØ š‘šžš¬š­ššš«š­ ${status(config.autoRestart?.enable)}`, `│ āžŒ š€š§š­š¢ šˆš§š›šØš± ${status(config.antiInbox?.enable)}`, `│ āž šŽš§š„š² š€šš¦š¢š§ ššØš± ${status(config.onlyAdminBox)}`, "│", "╰─〔 › š‘šžš©š„š² šŸā€“šŸ’ š­šØ š­šØš š š„šž 怕" ].join("\n"); return await sendAndListen(menu, "botConfig"); } if (num === 2) { const menu = [ "╭─〔 šŸ‘‘ š€šš¦š¢š§ šŒššš§ššš šž 怕", "│", "│ āžŠ š€šš š€šš¦š¢š§", "│ āž‹ š‘šžš¦šØšÆšž š€šš¦š¢š§", "│ āžŒ š‹š¢š¬š­ š€šš¦š¢š§š¬", "│", "╰─〔 › š‘šžš©š„š² šŸā€“šŸ‘ 怕" ].join("\n"); return await sendAndListen(menu, "adminManage"); } if (num === 3) { const menu = [ "╭─〔 šŸ›”ļø š–š”š¢š­šžš„š¢š¬š­ 怕", "│", `│ āžŠ š“š”š«šžššš š–š”š¢š­šžš„š¢š¬š­ ${status(config.whiteListModeThread?.enable)}`, "│ āž‹ š€šš š“š”š«šžššš", "│ āžŒ š‘šžš¦šØšÆšž š“š”š«šžššš", `│ āž š”š¬šžš« š–š”š¢š­šžš„š¢š¬š­ ${status(config.whiteListMode?.enable)}`, "│ āžŽ š€šš š”š¬šžš«", "│ āž š‘šžš¦šØšÆšž š”š¬šžš«", "│", "╰─〔 › š‘šžš©š„š² šŸā€“šŸ” 怕" ].join("\n"); return await sendAndListen(menu, "whitelist"); } if (num === 4) { config.noPrefix = config.noPrefix || {}; config.noPrefix.enable = !config.noPrefix.enable; saveConfig(); return message.reply( `╭─〔 ✦ ššØ šš«šžšŸš¢š± 怕\n│\n│ ${status(config.noPrefix.enable)}\n╰─` ); } if (num === 5) { const menu = [ "╭─〔 šŸ’« š‘šžšššœš­ š”š§š¬šžš§š 怕", "│", `│ āžŠ š“šØš š š„šž ${status(config.reactUnsend?.enable)}`, `│ āž‹ šŽš§š„š² š€šš¦š¢š§ ${status(config.reactUnsend?.onlyAdmin)}`, "│ āžŒ š€šš š„š¦šØš£š¢", "│ āž š‘šžš¦šØšÆšž š„š¦šØš£š¢", "│ āžŽ š‹š¢š¬š­ š„š¦šØš£š¢š¬", "│", "╰─〔 › š‘šžš©š„š² šŸā€“šŸ“ 怕" ].join("\n"); return await sendAndListen(menu, "reactUnsend"); } if (num === 6) { const current = config.nickNameBot || "Not set"; const menu = [ "╭─〔 āœļø šš¢šœš¤š§ššš¦šž 怕", "│", `│ ✦ š‚š®š«š«šžš§š­: ${current}`, "│", "│ āžŠ š’šžš­ šš¢šœš¤š§ššš¦šž ć€”š“š”š¢š¬ š†š«šØš®š©ć€•", "│ āž‹ š’šžš­ šš¢šœš¤š§ššš¦šž ć€”š€š„š„ š†š«šØš®š©š¬ć€•", "│ āžŒ š‘šžš¬šžš­ šš¢šœš¤š§ššš¦šž", "│", "╰─〔 › š‘šžš©š„š² šŸā€“šŸ‘ 怕" ].join("\n"); return await sendAndListen(menu, "nickname"); } if (num === 7) { const o = config.optionsFca || {}; const menu = [ "╭─〔 šŸ”§ š…š‚š€ šŽš©š­š¢šØš§š¬ 怕", "│", `│ āžŠ š€š®š­šØ š”š©šššš­šž ${status(o.autoUpdate)}`, `│ āž‹ š‹š¢š¬š­šžš§ š„šÆšžš§š­š¬ ${status(o.listenEvents)}`, `│ āžŒ š’šžš„šŸ š‹š¢š¬š­šžš§ ${status(o.selfListen)}`, `│ āž š‹š¢š¬š­šžš§ š“š²š©š¢š§š  ${status(o.listenTyping)}`, `│ āžŽ š”š©šššš­šž šš«šžš¬šžš§šœšž ${status(o.updatePresence)}`, `│ āž š…šØš«šœšž š‹šØš š¢š§ ${status(o.forceLogin)}`, `│ āž š€š®š­šØ šŒššš«š¤ š‘šžššš ${status(o.autoMarkRead)}`, `│ āž‘ š€š®š­šØ š‘šžšœšØš§š§šžšœš­ ${status(o.autoReconnect)}`, `│ āž’ š„šŸš„š„ š„š§ššš›š„šžš ${status(config.e2ee?.enable)}`, "│", "╰─〔 › š‘šžš©š„š² šŸā€“šŸ— š­šØ š­šØš š š„šž 怕" ].join("\n"); return await sendAndListen(menu, "fcaOptions"); } } if (state === "botConfig") { if (num === 1) { config.adminOnly = config.adminOnly || {}; config.adminOnly.enable = !config.adminOnly.enable; saveConfig(); return message.reply(`✦ š€šš¦š¢š§ šŽš§š„š² — ${status(config.adminOnly.enable)}`); } if (num === 2) { config.autoRestart = config.autoRestart || {}; config.autoRestart.enable = !config.autoRestart.enable; saveConfig(); return message.reply(`✦ š€š®š­šØ š‘šžš¬š­ššš«š­ — ${status(config.autoRestart.enable)}`); } if (num === 3) { config.antiInbox = config.antiInbox || {}; config.antiInbox.enable = !config.antiInbox.enable; saveConfig(); return message.reply(`✦ š€š§š­š¢ šˆš§š›šØš± — ${status(config.antiInbox.enable)}`); } if (num === 4) { config.onlyAdminBox = !config.onlyAdminBox; saveConfig(); return message.reply(`✦ šŽš§š„š² š€šš¦š¢š§ ššØš± — ${status(config.onlyAdminBox)}`); } } if (state === "adminManage") { if (num === 1) { return await sendAndListen( "╭─〔 šŸ‘‘ š€šš š€šš¦š¢š§ 怕\n│\n│ › š‘šžš©š„š² š°š¢š­š” š”šˆšƒ šØš« š­ššš  š®š¬šžš«\n╰─", "adminAdd" ); } if (num === 2) { const admins = config.adminBot || []; if (!admins.length) return message.reply("╰─〔 š—« ššØ šššš¦š¢š§š¬ šŸšØš®š§š 怕"); const list = admins .map((id, i) => `│ ${i + 1}. ${id}`) .join("\n"); const menu = [ "╭─〔 šŸ‘‘ š‘šžš¦šØšÆšž š€šš¦š¢š§ 怕", "│", list, "│", "╰─〔 › š‘šžš©š„š² š§š®š¦š›šžš« 怕" ].join("\n"); return await sendAndListen(menu, "adminRemoveSelect"); } if (num === 3) { const admins = config.adminBot || []; if (!admins.length) return message.reply("╰─〔 š—« ššØ šššš¦š¢š§š¬ šŸšØš®š§š 怕"); return message.reply( `╭─〔 šŸ‘‘ š€šš¦š¢š§š¬ 怕\n│\n│ ${admins.join("\n│ ")}\n╰─` ); } } if (state === "adminAdd") { let uid = input; if (event.mentions && Object.keys(event.mentions).length > 0) uid = Object.keys(event.mentions)[0]; if (!uid || isNaN(uid)) return message.reply("╰─〔 š—« šˆš§šÆššš„š¢š š”šˆšƒ 怕"); config.adminBot = config.adminBot || []; if (config.adminBot.includes(uid)) return message.reply("╰─〔 š—« š€š„š«šžšššš² ššš§ šššš¦š¢š§ 怕"); config.adminBot.push(uid); saveConfig(); return message.reply(`╰─〔 ✦ š€šššžš šššš¦š¢š§: ${uid} 怕`); } if (state === "adminRemoveSelect") { const admins = config.adminBot || []; const idx = num - 1; if (isNaN(num) || !admins[idx]) return message.reply("╰─〔 š—« šˆš§šÆššš„š¢š š¬šžš„šžšœš­š¢šØš§ 怕"); const removed = admins.splice(idx, 1)[0]; config.adminBot = admins; saveConfig(); return message.reply(`╰─〔 ✦ š‘šžš¦šØšÆšžš: ${removed} 怕`); } if (state === "whitelist") { if (num === 1) { config.whiteListModeThread = config.whiteListModeThread || {}; config.whiteListModeThread.enable = !config.whiteListModeThread.enable; saveConfig(); return message.reply( `✦ š“š”š«šžššš š–š”š¢š­šžš„š¢š¬š­ — ${status(config.whiteListModeThread.enable)}` ); } if (num === 2) { return await sendAndListen( "╭─〔 šŸ›”ļø š€šš š“š”š«šžššš 怕\n│\n│ › š‘šžš©š„š² š°š¢š­š” š“š”š«šžššš šˆšƒ\n╰─", "threadAdd" ); } if (num === 3) { const threads = config.whiteListModeThread?.whiteListThreadIds || []; if (!threads.length) return message.reply("╰─〔 š—« ššØ š­š”š«šžšššš¬ šŸšØš®š§š 怕"); const list = threads .map((id, i) => `│ ${i + 1}. ${id}`) .join("\n"); return await sendAndListen( `╭─〔 šŸ›”ļø š‘šžš¦šØšÆšž š“š”š«šžššš 怕\n│\n${list}\n│\n╰─〔 › š‘šžš©š„š² š§š®š¦š›šžš« 怕`, "threadRemoveSelect" ); } if (num === 4) { config.whiteListMode = config.whiteListMode || {}; config.whiteListMode.enable = !config.whiteListMode.enable; saveConfig(); return message.reply( `✦ š”š¬šžš« š–š”š¢š­šžš„š¢š¬š­ — ${status(config.whiteListMode.enable)}` ); } if (num === 5) { return await sendAndListen( "╭─〔 šŸ›”ļø š€šš š”š¬šžš« 怕\n│\n│ › š‘šžš©š„š² š°š¢š­š” š”šˆšƒ šØš« š­ššš  š®š¬šžš«\n╰─", "userAdd" ); } if (num === 6) { const users = config.whiteListMode?.whiteListIds || []; if (!users.length) return message.reply("╰─〔 š—« ššØ š®š¬šžš«š¬ šŸšØš®š§š 怕"); const list = users .map((id, i) => `│ ${i + 1}. ${id}`) .join("\n"); return await sendAndListen( `╭─〔 šŸ›”ļø š‘šžš¦šØšÆšž š”š¬šžš« 怕\n│\n${list}\n│\n╰─〔 › š‘šžš©š„š² š§š®š¦š›šžš« 怕`, "userRemoveSelect" ); } } if (state === "threadAdd") { const tid = input; if (!tid || isNaN(tid)) return message.reply("╰─〔 š—« šˆš§šÆššš„š¢š š“š”š«šžššš šˆšƒ 怕"); config.whiteListModeThread = config.whiteListModeThread || {}; config.whiteListModeThread.whiteListThreadIds = config.whiteListModeThread.whiteListThreadIds || []; if ( config.whiteListModeThread.whiteListThreadIds.includes(tid) ) return message.reply("╰─〔 š—« š€š„š«šžšššš² š¢š§ š°š”š¢š­šžš„š¢š¬š­ 怕"); config.whiteListModeThread.whiteListThreadIds.push(tid); saveConfig(); return message.reply(`╰─〔 ✦ š“š”š«šžššš šššššžš: ${tid} 怕`); } if (state === "threadRemoveSelect") { const threads = config.whiteListModeThread?.whiteListThreadIds || []; const idx = num - 1; if (isNaN(num) || !threads[idx]) return message.reply("╰─〔 š—« šˆš§šÆššš„š¢š š¬šžš„šžšœš­š¢šØš§ 怕"); const removed = threads.splice(idx, 1)[0]; config.whiteListModeThread.whiteListThreadIds = threads; saveConfig(); return message.reply(`╰─〔 ✦ š‘šžš¦šØšÆšžš: ${removed} 怕`); } if (state === "userAdd") { let uid = input; if (event.mentions && Object.keys(event.mentions).length > 0) uid = Object.keys(event.mentions)[0]; if (!uid || isNaN(uid)) return message.reply("╰─〔 š—« šˆš§šÆššš„š¢š š”šˆšƒ 怕"); config.whiteListMode = config.whiteListMode || {}; config.whiteListMode.whiteListIds = config.whiteListMode.whiteListIds || []; if (config.whiteListMode.whiteListIds.includes(uid)) return message.reply("╰─〔 š—« š€š„š«šžšššš² š¢š§ š°š”š¢š­šžš„š¢š¬š­ 怕"); config.whiteListMode.whiteListIds.push(uid); saveConfig(); return message.reply(`╰─〔 ✦ š”š¬šžš« šššššžš: ${uid} 怕`); } if (state === "userRemoveSelect") { const users = config.whiteListMode?.whiteListIds || []; const idx = num - 1; if (isNaN(num) || !users[idx]) return message.reply("╰─〔 š—« šˆš§šÆššš„š¢š š¬šžš„šžšœš­š¢šØš§ 怕"); const removed = users.splice(idx, 1)[0]; config.whiteListMode.whiteListIds = users; saveConfig(); return message.reply(`╰─〔 ✦ š‘šžš¦šØšÆšžš: ${removed} 怕`); } if (state === "reactUnsend") { if (num === 1) { config.reactUnsend = config.reactUnsend || {}; config.reactUnsend.enable = !config.reactUnsend.enable; saveConfig(); return message.reply( `✦ š‘šžšššœš­ š”š§š¬šžš§š — ${status(config.reactUnsend.enable)}` ); } if (num === 2) { config.reactUnsend = config.reactUnsend || {}; config.reactUnsend.onlyAdmin = !config.reactUnsend.onlyAdmin; saveConfig(); return message.reply( `✦ šŽš§š„š² š€šš¦š¢š§ — ${status(config.reactUnsend.onlyAdmin)}` ); } if (num === 3) { return await sendAndListen( "╭─〔 šŸ’« š€šš š„š¦šØš£š¢ 怕\n│\n│ › š‘šžš©š„š² š°š¢š­š” šžš¦šØš£š¢\n╰─", "emojiAdd" ); } if (num === 4) { const emojis = config.reactUnsend?.emojis || []; if (!emojis.length) return message.reply("╰─〔 š—« ššØ šžš¦šØš£š¢š¬ šŸšØš®š§š 怕"); const list = emojis .map((e, i) => `│ ${i + 1}. ${e}`) .join("\n"); return await sendAndListen( `╭─〔 šŸ’« š‘šžš¦šØšÆšž š„š¦šØš£š¢ 怕\n│\n${list}\n│\n╰─〔 › š‘šžš©š„š² š§š®š¦š›šžš« 怕`, "emojiRemoveSelect" ); } if (num === 5) { const emojis = config.reactUnsend?.emojis || []; if (!emojis.length) return message.reply("╰─〔 š—« ššØ šžš¦šØš£š¢š¬ 怕"); return message.reply( `╭─〔 šŸ’« š„š¦šØš£š¢š¬ 怕\n│\n│ ${emojis.join(" ")}\n╰─` ); } } if (state === "emojiAdd") { const emoji = input.trim(); if (!emoji) return message.reply("╰─〔 š—« šˆš§šÆššš„š¢š šžš¦šØš£š¢ 怕"); config.reactUnsend = config.reactUnsend || {}; config.reactUnsend.emojis = config.reactUnsend.emojis || []; if (config.reactUnsend.emojis.includes(emoji)) return message.reply("╰─〔 š—« š€š„š«šžšššš² šššššžš 怕"); config.reactUnsend.emojis.push(emoji); saveConfig(); return message.reply(`╰─〔 ✦ š€šššžš: ${emoji} 怕`); } if (state === "emojiRemoveSelect") { const emojis = config.reactUnsend?.emojis || []; const idx = num - 1; if (isNaN(num) || !emojis[idx]) return message.reply("╰─〔 š—« šˆš§šÆššš„š¢š š¬šžš„šžšœš­š¢šØš§ 怕"); const removed = emojis.splice(idx, 1)[0]; config.reactUnsend.emojis = emojis; saveConfig(); return message.reply(`╰─〔 ✦ š‘šžš¦šØšÆšžš: ${removed} 怕`); } if (state === "nickname") { if (num === 1) { return await sendAndListen( "╭─〔 āœļø šš¢šœš¤š§ššš¦šž 怕\n│\n│ › š‘šžš©š„š² š°š¢š­š” š§šžš° š§š¢šœš¤š§ššš¦šž\n╰─", "nicknameSet" ); } if (num === 2) { return await sendAndListen( "╭─〔 āœļø šš¢šœš¤š§ššš¦šž ć€”š€š„š„ć€•ć€•\n│\n│ › š‘šžš©š„š² š°š¢š­š” š§šžš° š§š¢šœš¤š§ššš¦šž\n╰─", "nicknameSetAll" ); } if (num === 3) { config.nickNameBot = ""; saveConfig(); try { await api.changeNickname( "", event.threadID, api.getCurrentUserID() ); } catch (e) {} return message.reply("╰─〔 ✦ šš¢šœš¤š§ššš¦šž š«šžš¬šžš­ 怕"); } } if (state === "nicknameSet") { const nickname = input; if (!nickname) return message.reply("╰─〔 š—« šˆš§šÆššš„š¢š š§š¢šœš¤š§ššš¦šž 怕"); config.nickNameBot = nickname; saveConfig(); try { await api.changeNickname( nickname, event.threadID, api.getCurrentUserID() ); } catch (e) {} return message.reply( `╰─〔 ✦ šš¢šœš¤š§ššš¦šž: ${nickname} 怕` ); } if (state === "nicknameSetAll") { const nickname = input; if (!nickname) return message.reply("╰─〔 š—« šˆš§šÆššš„š¢š š§š¢šœš¤š§ššš¦šž 怕"); config.nickNameBot = nickname; saveConfig(); const threads = await api.getThreadList( 100, null, ["INBOX"] ); let success = 0; for (const thread of threads) { if (!thread.isGroup) continue; try { await api.changeNickname( nickname, thread.threadID, api.getCurrentUserID() ); success++; } catch (e) {} } return message.reply( `╭─〔 ✦ šš¢šœš¤š§ššš¦šž š”š©šššš­šžš 怕\n│\n│ › ${nickname}\n│ › š†š«šØš®š©š¬: ${success}\n╰─` ); } if (state === "fcaOptions") { const keys = [ "autoUpdate", "listenEvents", "selfListen", "listenTyping", "updatePresence", "forceLogin", "autoMarkRead", "autoReconnect" ]; if (num === 9) { config.e2ee = config.e2ee || {}; config.e2ee.enable = !config.e2ee.enable; saveConfig(); return message.reply( `╭─〔 šŸ” š„šŸš„š„ 怕\n│\n│ ${status(config.e2ee.enable)}\n│\n╰─〔 › š‘šžš¬š­ššš«š­ š›šØš­ šŸšØš« šœš”ššš§š šž 怕` ); } const key = keys[num - 1]; if (!key) return message.reply( "╰─〔 š—« šˆš§šÆššš„š¢š š¬šžš„šžšœš­š¢šØš§ 怕" ); config.optionsFca = config.optionsFca || {}; config.optionsFca[key] = !config.optionsFca[key]; saveConfig(); if (key !== "autoUpdate" && key !== "forceLogin") { api.setOptions({ [key]: config.optionsFca[key] }); } return message.reply( `╰─〔 ✦ š…š‚š€ ${key} — ${status(config.optionsFca[key])} 怕` ); } } };