const fs = require("fs-extra"); const path = require("path"); const https = require("https"); module.exports = { config: { name: "help", aliases: ["menu", "commands"], version: "5.0", author: "ajmaul", shortDescription: "๐™Ž๐™๐™ค๐™ฌ ๐™–๐™ก๐™ก ๐™˜๐™ค๐™ข๐™ข๐™–๐™ฃ๐™™๐™จ", longDescription: "๐˜ฟ๐™ž๐™จ๐™ฅ๐™ก๐™–๐™ฎ๐™จ ๐™– ๐™—๐™š๐™–๐™ช๐™ฉ๐™ž๐™›๐™ช๐™ก ๐™›๐™ค๐™ฃ๐™ฉ-๐™จ๐™ฉ๐™ฎ๐™ก๐™š๐™™ ๐™˜๐™–๐™ฉ๐™š๐™œ๐™ค๐™ง๐™ž๐™ฏ๐™š๐™™ ๐™˜๐™ค๐™ข๐™ข๐™–๐™ฃ๐™™ ๐™ข๐™š๐™ฃ๐™ช.", category: "system", guide: "{pn}help [command name]" }, onStart: async function ({ message, args, prefix }) { const allCommands = global.GoatBot.commands; const categories = {}; const fontMap = { A: "๐™ฐ", B: "๐™ฑ", C: "๐™ฒ", D: "๐™ณ", E: "๐™ด", F: "๐™ต", G: "๐™ถ", H: "๐™ท", I: "๐™ธ", J: "๐™น", K: "๐™บ", L: "๐™ป", M: "๐™ผ", N: "๐™ฝ", O: "๐™พ", P: "๐™ฟ", Q: "๐š€", R: "๐š", S: "๐š‚", T: "๐šƒ", U: "๐š„", V: "๐š…", W: "๐š†", X: "๐š‡", Y: "๐šˆ", Z: "๐š‰", a: "๐šŠ", b: "๐š‹", c: "๐šŒ", d: "๐š", e: "๐šŽ", f: "๐š", g: "๐š", h: "๐š‘", i: "๐š’", j: "๐š“", k: "๐š”", l: "๐š•", m: "๐š–", n: "๐š—", o: "๐š˜", p: "๐š™", q: "๐šš", r: "๐š›", s: "๐šœ", t: "๐š", u: "๐šž", v: "๐šŸ", w: "๐š ", x: "๐šก", y: "๐šข", z: "๐šฃ" }; const fancy = (str) => String(str).replace(/[A-Za-z]/g, (c) => fontMap[c] || c); const emojiMap = { ai: "๐Ÿค–", "ai-image": "๐ŸŽจ", group: "๐Ÿ‘ฅ", system: "โš™๏ธ", fun: "๐ŸŽฏ", owner: "๐Ÿ‘‘", config: "๐Ÿง ", economy: "๐Ÿ’ฐ", media: "๐ŸŽฌ", "18+": "๐Ÿ”ž", tools: "๐Ÿงฐ", utility: "๐Ÿ”ง", info: "โ„น๏ธ", image: "๐Ÿ–ผ๏ธ", game: "๐ŸŽฎ", admin: "๐Ÿ›ก๏ธ", rank: "๐Ÿ…", boxchat: "๐Ÿ’ฌ", others: "๐Ÿ“" }; const cleanCategoryName = (text) => { if (!text) return "others"; return text .normalize("NFKD") .replace(/[^\w\s-]/g, "") .replace(/\s+/g, " ") .trim() .toLowerCase(); }; for (const [name, cmd] of allCommands) { const cat = cleanCategoryName(cmd.config.category); if (!categories[cat]) categories[cat] = []; categories[cat].push(cmd.config.name); } const gifURLs = [ "https://i.imgur.com/DLYrB7b.gif", "https://i.imgur.com/GWgU6AH.gif", "https://i.imgur.com/JwBjiOB.gif", "https://i.imgur.com/BkVaVNk.gif", "https://i.imgur.com/B6PlgIG.gif", "https://i.imgur.com/DJwJ9t9.gif" ]; const randomGifURL = gifURLs[Math.floor(Math.random() * gifURLs.length)]; const gifFolder = path.join(__dirname, "cache"); if (!fs.existsSync(gifFolder)) fs.mkdirSync(gifFolder, { recursive: true }); const gifName = path.basename(randomGifURL); const gifPath = path.join(gifFolder, gifName); let gifReady = false; try { if (!fs.existsSync(gifPath)) await downloadGif(randomGifURL, gifPath); gifReady = fs.existsSync(gifPath) && fs.statSync(gifPath).size > 0; } catch (e) { gifReady = false; } // เฆเฆ•เฆ• เฆ•เฆฎเฆพเฆจเงเฆก เฆกเฆฟเฆŸเง‡เฆ‡เฆฒ if (args[0]) { const query = args[0].toLowerCase(); const cmd = allCommands.get(query) || [...allCommands.values()].find((c) => (c.config.aliases || []).includes(query)); if (!cmd) return message.reply(`โŒ ${fancy(`Command "${query}" not found.`)}`); const { name, version, author, guide, category, shortDescription, longDescription, aliases } = cmd.config; const desc = typeof longDescription === "string" ? longDescription : longDescription?.en || shortDescription?.en || shortDescription || "No description"; const usage = typeof guide === "string" ? guide.replace(/{pn}/g, prefix) : guide?.en?.replace(/{pn}/g, prefix) || `${prefix}${name}`; const infoBody = `โ˜ ๏ธ ${fancy("COMMAND INFO")} โ˜ ๏ธ\n\n` + `โžฅ ${fancy("Name")}: ${fancy(name)}\n` + `โžฅ ${fancy("Category")}: ${fancy(category || "Uncategorized")}\n` + `โžฅ ${fancy("Description")}: ${fancy(desc)}\n` + `โžฅ ${fancy("Aliases")}: ${fancy(aliases?.length ? aliases.join(", ") : "None")}\n` + `โžฅ ${fancy("Usage")}: ${fancy(usage)}\n` + `โžฅ ${fancy("Author")}: ${fancy(author || "Unknown")}\n` + `โžฅ ${fancy("Version")}: ${fancy(version || "1.0")}`; if (gifReady) { return message.reply({ body: infoBody, attachment: fs.createReadStream(gifPath) }); } else { return message.reply(infoBody); } } // เฆธเฆฌ เฆ•เฆฎเฆพเฆจเงเฆก เฆฒเฆฟเฆธเงเฆŸ const formatCommands = (cmds) => cmds.sort().map((cmd) => `๐Ÿ”น ${fancy(cmd)}`).join("\n"); let msg = `${fancy("โœจ ๐—š๐—ข๐—”๐—ง๐—•๐—ข๐—ง ๐— ๐—˜๐—ก๐—จ โœจ")}\nโ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”\n`; const sortedCategories = Object.keys(categories).sort(); for (const cat of sortedCategories) { const emoji = emojiMap[cat] || "๐Ÿ“"; msg += `\n${emoji} ${fancy(`CATEGORY: ${cat.toUpperCase()}`)}\n`; msg += `${formatCommands(categories[cat])}\n`; } msg += `โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”โ”\n๐Ÿ’ก ${fancy(`TIP: USE "${prefix}help [command]" TO GET FULL DETAILS.`)}\n๐Ÿช„ ${fancy("BOT BY: Ajmaul โœจ")}`; if (gifReady) { return message.reply({ body: msg, attachment: fs.createReadStream(gifPath) }); } else { return message.reply(msg); } } }; // GIF เฆกเฆพเฆ‰เฆจเฆฒเง‹เฆก เฆซเฆพเฆ‚เฆถเฆจ function downloadGif(url, dest) { return new Promise((resolve, reject) => { const file = fs.createWriteStream(dest); https.get(url, (res) => { if (res.statusCode !== 200) { fs.unlink(dest, () => {}); return reject(new Error(`Failed to download '${url}' (${res.statusCode})`)); } res.pipe(file); file.on("finish", () => file.close(resolve)); }).on("error", (err) => { fs.unlink(dest, () => {}); reject(err); }); }); }