aziziyanmahdiyar/ZorenixUploaderAI_UploaderbotPublic · Bot Template
AIZorenixUploader AI appears to be a Telegram automation bot. Commands include /start, /@, /!, /@@, /*, /files, /dl, /verify. Observed in code: messaging, storage, libs, keyboards, web.
Utilityutility
42 commands0 envUpdated 1mo agoCreated Sep 22, 2026
commands/dbg.js
javascript · 350 lines
1/**#command2name: dbg3answer: 4keyboard: 5parse_mode: markdown6aliases: 7allow_only_group: false8need_reply: false9is_web: 010#command**/11 12// ═══════════ dbg — 🐞 دیباگ کامل ربات + رفع خودکار (فقط ادمین) ═══════════13let OWNER = 586143968214let cfg = await db.bot.get("cfg", {})15let admins = cfg.admins || []16let uid = Number(user ? (user.id || user.telegramid) : 0)17let isOwner = (uid === 5861439682)18let isAdm = isOwner || (admins || []).map(Number).indexOf(uid) !== -119if (!isAdm) {20 return Bot.sendMessage("⛔️ این بخش فقط برای مدیران رباته.")21}22let isCb = (update_type === "callback_query" && update && update.callback_query)23if (isCb) { try { await Api.answerCallbackQuery({ callback_query_id: update.callback_query.id }) } catch (e) {} }24 25// 🕐 ساعت تهران (+۳:۳۰)26let p2 = (x) => (x < 10 ? "0" + x : "" + x)27let nw = new Date(Date.now() + 12600000)28let stamp = nw.getUTCFullYear() + "/" + p2(nw.getUTCMonth() + 1) + "/" + p2(nw.getUTCDate()) + " " + p2(nw.getUTCHours()) + ":" + p2(nw.getUTCMinutes())29 30let args = String(params || "").trim().split(" ").filter(x => x.length > 0)31let mode = args[0] || "full"32let page = parseInt(args[1] || "0", 10)33if (isNaN(page) || page < 0) { page = 0 }34 35let R = []36let ISSUES = []37let FIXED = []38let addR = (n, ok, t) => { R.push({ n: n, ok: ok === true, t: t || "" }) }39let addI = (t) => { ISSUES.push(String(t)) }40 41// ─────────── 📣 تست کامندها (صدا زدن یکییکی + گزارش)42if (mode === "ping") {43 let PING = ["/start", "files 0", "search", "dl 1", "verify", "save", "rc", "profile", "help", "about", "support", "report", "wcancel", "adm home", "adm list 0", "adm gates", "adm set", "adm errs 0", "adm tkt 0", "adm chans", "adm admins", "add", "addch", "setout", "settext welcome", "reactlink", "mkreact", "dbg full"]44 let per = 545 let total = Math.ceil(PING.length / per)46 if (page > total - 1) { page = total - 1 }47 let batch = PING.slice(page * per, page * per + per)48 49 await Api.sendMessage({50 chat_id: chat.id,51 text: "📣 <b>تست کامندها — دسته " + (page + 1) + " از " + total + "</b>\n\nدارم این " + batch.length + " تا رو یکییکی صدا میزنم:\n" + Libs.tgutil.escapeText(batch.join(" · "), "html") + "\n\n⚠️ هر کامندی که جوابی نداد یا خطا داد، یعنی ساخته نشده یا کدش خرابه — خطاهاش تو 🐞 خطاها ثبت میشه.",52 parse_mode: "HTML"53 })54 55 for (let cmd of batch) {56 try { await Bot.run({ command: cmd, ignoreMissingCommand: true }) } catch (e) { }57 await db.bot.del("wstep:" + user.id)58 await db.bot.del("draft:" + user.id)59 await db.bot.del("want:" + user.id)60 try { await new Promise((res) => setTimeout(res, 1200)) } catch (e) { }61 }62 63 let errs0 = await db.bot.get("errs", [])64 let rows0 = []65 let nav0 = []66 if (page > 0) { nav0.push({ text: "⬅️ دسته قبل", callback_data: "dbg ping " + (page - 1) }) }67 nav0.push({ text: "دسته " + (page + 1) + "/" + total, callback_data: "dbg ping " + page })68 if (page < total - 1) { nav0.push({ text: "دسته بعد ➡️", callback_data: "dbg ping " + (page + 1) }) }69 rows0.push(nav0)70 rows0.push([{ text: "🐞 خطاها (" + errs0.length + ")", callback_data: "dbg errs" }, { text: "🧪 تست کامل", callback_data: "dbg full" , style: "primary" }])71 rows0.push([{ text: "🏠 پنل", callback_data: "adm home" , style: "primary" }])72 return Api.sendMessage({73 chat_id: chat.id,74 text: "✅ <b>دسته " + (page + 1) + " تموم شد.</b>\n\n👉 اگه از این کامندها جوابی نگرفتی، همونها تو پنل ساخته نشدن یا خطا دارن.\n🐞 الان <b>" + errs0.length + "</b> خطا تو دفترچه ثبت شده — لیستش رو ببین.",75 parse_mode: "HTML",76 reply_markup: { inline_keyboard: rows0 }77 })78}79 80// ─────────── 🐞 گزارش خطاها (گروهبندیشده)81if (mode === "errs") {82 let errs = await db.bot.get("errs", [])83 let groups = {}84 for (let e of errs) {85 let w = String((e && e.w) || "نامشخص")86 if (!groups[w]) { groups[w] = { c: 0, last: "", t: "" } }87 groups[w].c = groups[w].c + 188 groups[w].last = String((e && e.m) || "")89 groups[w].t = String((e && e.t) || "")90 }91 let outT = "🐞 <b>گزارش خطاها</b> — کل: <b>" + errs.length + "</b>\n\n"92 if (!errs.length) {93 outT = outT + "✅ هیچ خطایی ثبت نشده — یعنی همهی کامندهایی که اجرا شدن، بدون خطا کار کردن."94 } else {95 outT = outT + "📌 بهترتیب کامند:\n"96 for (let w in groups) {97 let g = groups[w]98 outT = outT + "\n▫️ <b>" + Libs.tgutil.escapeText(w, "html") + "</b> — " + g.c + " بار\n 🕐 " + Libs.tgutil.escapeText(g.t, "html") + "\n 📄 <code>" + Libs.tgutil.escapeText(g.last.slice(0, 200), "html") + "</code>"99 }100 let last5 = errs.slice(-5)101 outT = outT + "\n\n🕘 <b>آخرین ۵ خطا:</b>\n"102 for (let e of last5) {103 outT = outT + "• [" + Libs.tgutil.escapeText(String((e && e.w) || "—"), "html") + "] " + Libs.tgutil.escapeText(String((e && e.m) || "").slice(0, 120), "html") + "\n"104 }105 }106 let rowsE = [107 [{ text: "🧪 تست کامل ربات", callback_data: "dbg full" , style: "primary" }],108 [{ text: "🗑 پاک کردن خطاها", callback_data: "adm errclr" , style: "danger" }],109 [{ text: "🏠 پنل", callback_data: "adm home" , style: "primary" }]110 ]111 if (isCb) { return Api.editMessageText({ chat_id: chat.id, message_id: update.callback_query.message.message_id, text: outT, parse_mode: "HTML", reply_markup: { inline_keyboard: rowsE } }) }112 return Api.sendMessage({ chat_id: chat.id, text: outT, parse_mode: "HTML", reply_markup: { inline_keyboard: rowsE } })113}114 115// ─────────── 📋 لیست کامندهای ربات (چکلیست)116if (mode === "cmds") {117 let CMDS = ["@", "!", "@@", "*", "/start", "files", "search", "dl", "get", "verify", "save", "rc", "/handle_message_reaction", "profile", "help", "about", "support", "report", "sreply", "tclose", "wcancel", "adm", "add", "addch", "addadmin", "settext", "setout", "bc", "bc_send", "mkreact", "reactlink", "fsave", "fcancel", "dbg"]118 let outT = "📋 <b>چکلیست کامندهای ربات</b> — " + CMDS.length + " کامند\n\n"119 for (let i = 0; i < CMDS.length; i++) { outT = outT + "<code>" + Libs.tgutil.escapeText(CMDS[i], "html") + "</code>\n" }120 outT = outT + "\n👉 اینها باید تو پنل تلهباتهاست ساخته شده باشن. اگه اسمی نبود، کدش رو پیست کن.\n📣 با «تست کامندها» میتونم یکییکی صداشون بزنم."121 let rowsC = [[{ text: "📣 تست کامندها", callback_data: "dbg ping 0" , style: "primary" }], [{ text: "🧪 تست کامل", callback_data: "dbg full" , style: "primary" }], [{ text: "🏠 پنل", callback_data: "adm home" , style: "primary" }]]122 if (isCb) { return Api.editMessageText({ chat_id: chat.id, message_id: update.callback_query.message.message_id, text: outT, parse_mode: "HTML", reply_markup: { inline_keyboard: rowsC } }) }123 return Api.sendMessage({ chat_id: chat.id, text: outT, parse_mode: "HTML", reply_markup: { inline_keyboard: rowsC } })124}125 126// ─────────── ۱) تست دیتابیس127try {128 let pk = "dbgprobe:" + user.id129 await db.bot.set(pk, { n: 42 })130 let rv = await db.bot.get(pk, null)131 let mv = null132 try { mv = await db.bot.mget([pk]) } catch (e) { mv = null }133 let iv = await db.bot.incr("dbgprobe_n", 1)134 await db.bot.del(pk)135 await db.bot.del("dbgprobe_n")136 let okAll = (rv && rv.n === 42 && typeof iv === "number" && mv && mv[pk])137 addR("دیتابیس (ذخیره/خواندن/mget/incr/حذف)", okAll === true, okAll ? "همهی عملیات سالم ✅" : ("خروجی نامنتظر: " + JSON.stringify(rv)))138} catch (e) { addR("دیتابیس (ذخیره/خواندن/mget/incr/حذف)", false, String((e && e.message) || e)) }139 140// ─────────── ۲) تست ارسال پیام141try {142 await Api.sendMessage({ chat_id: chat.id, text: "🧪 <b>تست ارسال پیام</b> — اگه این رو میبینی، ارسال پیام سالمه ✅", parse_mode: "HTML" })143 addR("ارسال پیام (Api.sendMessage)", true, "پیام آزمایشی فرستادم")144} catch (e) { addR("ارسال پیام (Api.sendMessage)", false, String((e && (e.message || e.description)) || e)) }145 146// ─────────── ۳) هویت ربات147let uname = ""148try { if (bot && bot.username) { uname = String(bot.username) } } catch (e) { uname = "" }149if (!uname) {150 try { let me = await Api.getMe({}); if (me && me.username) { uname = String(me.username) } } catch (e) { uname = "" }151}152addR("هویت ربات (یوزرنیم)", !!uname, uname ? ("https://t.me/" + uname) : "یوزرنیم پیدا نشد — دکمههای لینکدار (پست کانال) کار نمیکنن")153 154// ─────────── ۴) Libs155try {156 let v = Libs.tgutil.escapeText("<b>تست & تست</b>", "html")157 addR("Libs.tgutil (فرار کاراکترها)", String(v).indexOf("<") !== -1, "نمونه: " + String(v).slice(0, 40))158} catch (e) { addR("Libs.tgutil (فرار کاراکترها)", false, String((e && e.message) || e)) }159 160let chn = (cfg.channels || []).filter(x => x)161try {162 if (!chn.length) {163 addR("Libs.mcl (چک عضویت)", false, "کانال جوینی ثبت نشده — قفل جوین چیزی برای چک کردن نداره")164 } else {165 let r = await Libs.mcl.check(user.id, chn.slice(0, 10))166 let iv = (r && Array.isArray(r.invalid)) ? r.invalid : []167 let lf = (r && Array.isArray(r.left)) ? r.left : []168 let jn = (r && Array.isArray(r.joined)) ? r.joined : []169 let nm = []170 for (let x of iv) { nm.push(String(x.channel || x)) }171 addR("Libs.mcl (چک عضویت " + chn.length + " کانال)", iv.length === 0, iv.length ? ("ربات تو این کانالها ادمین نیست: " + nm.join(", ")) : ("✅ عضو: " + jn.length + " | مونده: " + lf.length + " | سالم"))172 for (let x of nm) { addI("کانال «" + x + "»: ربات ادمین نیست — قفل جوین برای کاربرا گیر میکنه. ربات رو ادمینش کن.") }173 }174} catch (e) { addR("Libs.mcl (چک عضویت)", false, String((e && e.message) || e)) }175 176// ─────────── ۵) کانال خروجی177try {178 if (!cfg.out_channel) {179 addR("کانال خروجی", false, "تنظیم نشده — «ارسال به کانال» کار نمیکنه")180 addI("کانال خروجی تنظیم نشده — از پنل → ⚙️ تنظیمات ثبتش کن.")181 } else {182 let okCh = false183 let erCh = ""184 try { await Api.sendMessage({ chat_id: cfg.out_channel, text: "🧪 تست دیباگ — اگه این پیام رو میبینی، ارسال به کانال سالمه ✅" }); okCh = true } catch (e2) { erCh = String((e2 && (e2.message || e2.description)) || e2) }185 addR("کانال خروجی (" + String(cfg.out_channel) + ")", okCh, okCh ? "پیام آزمایشی رفت ✅" : ("خطای تلگرام: " + erCh.slice(0, 160)))186 if (!okCh) { addI("ارسال به کانال خروجی خطا داد — " + erCh.slice(0, 160) + " (ربات رو تو کانال ادمین کن / یوزرنیم رو درست بنویس)") }187 }188} catch (e) { addR("کانال خروجی", false, String((e && e.message) || e)) }189 190// ─────────── ۶) ادمینها191let badA = []192try {193 let ads = cfg.admins || []194 for (let a of ads) {195 if (typeof a !== "number" || isNaN(a)) { badA.push(String(a)); continue }196 try { await Api.getChat({ chat_id: a }) } catch (e2) { badA.push(String(a)) }197 }198 addR("ادمینهای ربات (" + ads.length + " نفر)", badA.length === 0, badA.length ? ("مشکلدار: " + badA.join(", ")) : "همه معتبرن ✅")199 if (badA.length) { addI("ادمینهای نامعتبر: " + badA.join(", ") + " — یا آیدی غلطه یا کاربر ربات رو بلاک کرده") }200} catch (e) { addR("ادمینهای ربات", false, String((e && e.message) || e)) }201 202// ─────────── ۷) ساعت تهران203try {204 let th = new Date(Date.now() + 12600000)205 addR("ساعت تهران", true, stamp + " (اختلاف با UTC: +۳:۳۰)")206} catch (e) { addR("ساعت تهران", false, String((e && e.message) || e)) }207 208// ─────────── ۸) سلامت دادهها (یک درخواست، سبک)209let pack = {}210try { pack = (await db.bot.mget(["plist", "tlist", "forcetest", "errs"])) || {} } catch (e) { pack = {} }211let plist = (pack["plist"] || [])212let tl = (pack["tlist"] || [])213let ft = (pack["forcetest"] || null)214let errs = (pack["errs"] || [])215let items = {}216for (let i = 0; i < plist.length; i += 30) {217 let ck = plist.slice(i, i + 30)218 let cp = await db.bot.mget(ck.map(x => "p:" + x))219 if (cp) { for (let k in cp) { items[k] = cp[k] } }220}221let missing = []222let empty = []223for (let id of plist) {224 let it = items["p:" + id]225 if (!it) { missing.push(id); continue }226 if (!it.title && !it.file_id && !it.cover && !it.link && !it.desc) { empty.push(id) }227}228let seen = {}229let dup = []230for (let id of plist) { if (seen[id]) { dup.push(id) } else { seen[id] = 1 } }231if (missing.length) { addI("این کدها تو لیست آموزشها هستن ولی خودِ آموزششون وجود نداره: " + missing.join(", ")) }232if (empty.length) { addI("این آموزشها هیچ محتوایی ندارن (نه فایل، نه عکس، نه لینک، نه متن): " + empty.join(", ")) }233if (dup.length) { addI("کدهای تکراری تو لیست آموزشها: " + dup.join(", ")) }234 235let deadT = []236if (tl.length) {237 let tail = tl.slice(-30)238 let td = await db.bot.mget(tail.map(x => "tkt:" + x))239 for (let id of tail) { if (!td["tkt:" + id]) { deadT.push(id) } }240}241if (deadT.length) { addI("تیکتهای بیصاحب تو لیست تیکتها: " + deadT.join(", ")) }242 243if (ft && ft.on === true) { addI("🧪 حالت تست قفل روشنه (کاربرا قفل آزمایشی میبینن) — اگه یادت رفته، خاموشش کن") }244 245let chansAll = (cfg.channels || [])246if (chansAll.length > 10) { addI("بیشتر از ۱۰ کانال جوین ثبت شده — فقط ۱۰ تای اول چک میشه: " + chansAll.length + " کانال") }247let seenC = {}248let dupC = []249for (let c of chansAll) { let k = String(c).toLowerCase(); if (seenC[k]) { dupC.push(String(c)) } else { seenC[k] = 1 } }250if (dupC.length) { addI("کانالهای تکراری: " + dupC.join(", ")) }251if (cfg.out_channel && String(cfg.out_channel).indexOf("http") === 0) { addI("کانال خروجی با «http» ذخیره شده — باید @username یا -100… باشه") }252if (cfg.react_msg && !cfg.react_link) { addI("پست ریاکشن ساخته شده ولی لینکش ثبت نشده — کاربر دکمهی «رفتن به پست» رو نمیبینه") }253 254// ─────────── 🤖 رفع خودکار255if (mode === "fix" || mode === "auto") {256 try {257 let workList = []258 let sn = {}259 for (let id of plist) { if (!sn[id]) { sn[id] = 1; workList.push(id) } }260 if (dup.length) { FIXED.push("کدهای تکراری لیست حذف شد: " + dup.join(", ")) }261 if (missing.length) {262 let kept = []263 for (let id of workList) { if (missing.indexOf(id) === -1) { kept.push(id) } }264 workList = kept265 FIXED.push("لیست آموزشها تمیز شد — کدهای بیآموزش حذف شدن: " + missing.join(", "))266 }267 if (dup.length || missing.length) { await db.bot.set("plist", workList) }268 if (deadT.length) {269 let keepT = []270 for (let id of tl) { if (deadT.indexOf(id) === -1) { keepT.push(id) } }271 await db.bot.set("tlist", keepT)272 FIXED.push("تیکتهای بیصاحب از لیست حذف شد: " + deadT.join(", "))273 }274 if (ft && ft.on === true) {275 await db.bot.del("forcetest")276 FIXED.push("🧪 حالت تست قفل خاموش شد")277 }278 if (dupC.length) {279 let kc = []280 let sc = {}281 for (let c of chansAll) { let k = String(c).toLowerCase(); if (!sc[k]) { sc[k] = 1; kc.push(c) } }282 cfg.channels = kc283 FIXED.push("کانالهای تکراری حذف شد")284 }285 if ((cfg.channels || []).length > 10) {286 cfg.channels = (cfg.channels || []).slice(0, 10)287 FIXED.push("کانالهای جوین به ۱۰ تا محدود شد")288 }289 if (badA.length) {290 let okA = []291 for (let a of (cfg.admins || [])) { if (typeof a === "number" && !isNaN(a)) { okA.push(a) } }292 cfg.admins = okA293 FIXED.push("ادمینهای نامعتبر حذف شد: " + badA.join(", "))294 }295 if (cfg.out_channel && String(cfg.out_channel).indexOf("http") === 0) {296 let oc = String(cfg.out_channel)297 oc = oc.replace("https://t.me/", "").replace("http://t.me/", "").replace("t.me/", "").split("/")[0]298 cfg.out_channel = "@" + oc.replace("@", "")299 FIXED.push("کانال خروجی اصلاح شد: " + cfg.out_channel)300 }301 try { await db.bot.del("gjoin_bad") } catch (e) { }302 await db.bot.set("cfg", cfg)303 if (!FIXED.length) { FIXED.push("چیزی برای درست کردن پیدا نشد — همه چیز سالم بود ✅") }304 } catch (e) {305 FIXED.push("⚠️ موقع رفع خودکار خطا خورد: " + String((e && e.message) || e))306 }307}308 309// ─────────── 📊 گزارش نهایی310let outText = "🧪 <b>دیباگ کامل ربات</b>\n\n🕐 " + stamp + "\n\n"311outText = outText + "<b>۱) تست سیستمها:</b>\n"312for (let r of R) { outText = outText + (r.ok ? "✅ " : "❌ ") + Libs.tgutil.escapeText(r.n, "html") + (r.t ? " — " + Libs.tgutil.escapeText(r.t, "html") : "") + "\n" }313let okCount = 0314for (let r of R) { if (r.ok) { okCount++ } }315outText = outText + "\n📈 نتیجه: <b>" + okCount + " از " + R.length + "</b> تست پاس شد\n"316 317if (mode === "fix" || mode === "auto") {318 outText = outText + "\n<b>۲) 🤖 رفع خودکار:</b>\n"319 for (let f of FIXED) { outText = outText + "🔧 " + Libs.tgutil.escapeText(f, "html") + "\n" }320}321 322outText = outText + "\n<b>۳) سلامت دادهها:</b> "323if (!ISSUES.length) { outText = outText + "سالم ✅ (هیچ مشکلی پیدا نشد)\n" }324else {325 outText = outText + "<b>" + ISSUES.length + " مورد</b> 👇\n"326 for (let i = 0; i < ISSUES.length; i++) { outText = outText + "▫️ " + Libs.tgutil.escapeText(ISSUES[i], "html") + "\n" }327 outText = outText + "\n👉 با «🤖 رفع خودکار» هر چیزی که بشه خودم درست میکنم.\n"328}329 330outText = outText + "\n<b>۴) خطاهای ثبتشده:</b> " + errs.length + "\n"331if (errs.length) {332 let last3 = errs.slice(-3)333 for (let e of last3) { outText = outText + "• [" + Libs.tgutil.escapeText(String((e && e.w) || "—"), "html") + "] " + Libs.tgutil.escapeText(String((e && e.m) || "").slice(0, 100), "html") + "\n" }334 outText = outText + "👉 لیست کامل با 🐞 خطاها\n"335} else {336 outText = outText + "✅ هیچ خطایی تو دفترچه نیست\n"337}338 339let rowsD = [340 [{ text: "🤖 رفع خودکار", callback_data: "dbg fix" , style: "primary" }, { text: "🧪 تست دوباره", callback_data: "dbg full" , style: "primary" }],341 [{ text: "📣 تست کامندها", callback_data: "dbg ping 0" , style: "primary" }, { text: "📋 چکلیست کامندها", callback_data: "dbg cmds" , style: "primary" }],342 [{ text: "🐞 خطاها", callback_data: "dbg errs" , style: "primary" }, { text: "🏠 پنل", callback_data: "adm home" , style: "primary" }]343]344 345if (isCb && update.callback_query.message) {346 try {347 return Api.editMessageText({ chat_id: chat.id, message_id: update.callback_query.message.message_id, text: outText, parse_mode: "HTML", reply_markup: { inline_keyboard: rowsD } })348 } catch (e) { }349}350return Api.sendMessage({ chat_id: chat.id, text: outText, parse_mode: "HTML", reply_markup: { inline_keyboard: rowsD } })