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
Back to folder

commands/dbg.js

javascript · 350 lines

Raw
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("&lt;") !== -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 } })