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/dl.js

javascript · 368 lines

Raw
1/**#command2name: dl3answer: 4keyboard: 5parse_mode: markdown6aliases: 7allow_only_group: false8need_reply: false9is_web: 010#command**/11 12// ═══════════ dl — کارت آموزش (dl <کد>) + تحویل آموزش (dl go <کد>) + حالت تست قفل ═══════════13// 🧩 نسخه R1014let isCb = (update_type === "callback_query" && update && update.callback_query)15try { if (isCb) { await Api.answerCallbackQuery({ callback_query_id: update.callback_query.id }) } } catch (e) {}16 17let toks = String(params || "").trim().split(" ").filter(x => x.length > 0)18if (toks.length > 1 && (toks[0] === "dl" || toks[0] === "/dl" || toks[0] === "get" || toks[0] === "/get")) { toks.shift() }19let mode = toks[0] || ""20let arg = ""21if (mode === "go" || mode === "ftestoff") { arg = toks[1] || ""; if (arg === "go" && toks[2]) { arg = toks[2] } } else { arg = mode; mode = "card" }22 23// ── 🧪 پایان حالت تست قفل24if (mode === "ftestoff") {25  await db.bot.del("forcetest")26  if (!arg || arg === "-") {27    return Api.sendMessage({28      chat_id: chat.id,29      text: "🧪 <b>حالت تست قفل خاموش شد.</b>\n\nحالا از منو یه آموزش بگیر تا مسیر واقعی رو ببینی 👇",30      parse_mode: "HTML",31      reply_markup: { inline_keyboard: [[{ text: "📚 همه آموزش‌ها", callback_data: "files 0" , style: "primary" }], [{ text: "🔐 قفل‌ها", callback_data: "adm gates" , style: "primary" }]] }32    })33  }34  Bot.sendMessage("🧪 حالت تست خاموش شد — الان همون مسیر واقعی رو می‌ری 👇")35  return Bot.runCommand("dl go " + arg)36}37 38// ── 🎁「دعوت دوستان」 — لینک اختصاصی من + پیشرفت جایزه‌ها39if (arg === "davat" || mode === "davat") {40  let cfgD = {}41  try { cfgD = (await db.bot.get("cfg", {})) || {} } catch (e) { cfgD = {} }42  let inv = 043  try { inv = Number((await db.bot.get("inv:" + user.id, 0)) || 0) } catch (e) { inv = 0 }44  let uname = ""45  try { uname = String((bot && (bot.username || bot.name)) ? (bot.username || bot.name) : "") } catch (e) { uname = "" }46  if (!uname) { try { uname = String((await db.bot.get("uname", "")) || "") } catch (e) { uname = "" } }47  let link = uname ? ("https://t.me/" + uname + "?start=ref_" + user.id) : ""48  let plist0 = []49  try { plist0 = (await db.bot.get("plist", [])) || [] } catch (e) { plist0 = [] }50  let needList = []51  if (plist0.length) {52    let dd0 = {}53    try { dd0 = (await db.bot.mget(plist0.slice(0, 30).map(x => "p:" + x))) || {} } catch (e) { dd0 = {} }54    for (let id3 of plist0) {55      let px = dd0["p:" + id3]56      if (!px) { continue }57      let nd = Number(px.refneed || cfgD.gate_ref || 0)58      if (nd > 0) {59        needList.push("• " + Libs.tgutil.escapeText(px.title || ("#" + id3), "html") + " → " + nd + " دعوت — " + (inv >= nd ? "✅ بازِ باز" : "🔒 " + (nd - inv) + " نفر مانده"))60      }61    }62  }63  let lastPid = ""64  try { lastPid = String((await db.bot.get("last:" + user.id, "")) || "") } catch (e) { lastPid = "" }65  let t3 = "🎁 <b>دعوت دوستان</b>\n\n"66  t3 = t3 + "👥 دعوت‌های تو: <b>" + inv + "</b> نفر\n\n"67  if (link) {68    t3 = t3 + "🔗 <b>لینک اختصاصی تو:</b>\n<code>" + link + "</code>\n\nهر کسی با این لینک وارد ربات بشه، <b>یک دعوت</b> برات ثبت می‌شه (هر اکانت فقط یک‌بار).\n"69  } else {70    t3 = t3 + "⚠️ لینک اختصاصی فعلاً ساخته نشد — به پشتیبانی بگو.\n"71  }72  if (needList.length) {73    t3 = t3 + "\n🎯 <b>آموزش‌هایی که با دعوت باز می‌شن:</b>\n" + needList.join("\n") + "\n"74  } else {75    t3 = t3 + "\nℹ️ الان هیچ آموزشی قفل دعوت نداره.\n"76  }77  let dRows = []78  if (link) {79    dRows.push([{ text: "📤 اشتراک‌گذاری لینک دعوت", url: "https://t.me/share/url?url=" + encodeURIComponent(link) + "&text=" + encodeURIComponent("بیا این ربات آموزشی 👇") }])80  }81  if (lastPid) { dRows.push([{ text: "📥 دریافت آخرین آموزش", callback_data: "dl go " + lastPid }]) }82  dRows.push([{ text: "🔄 بررسی وضعیت", callback_data: "verify" , style: "primary" }])83  dRows.push([{ text: "📚 همه آموزش‌ها", callback_data: "files 0" , style: "primary" }])84  if (lastPid) { await db.bot.set("wstep:" + user.id, "gate:" + lastPid, { ttl: 1800 }) }85  return Api.sendMessage({ chat_id: chat.id, text: t3, parse_mode: "HTML", reply_markup: { inline_keyboard: dRows } })86}87 88if (!arg) { return Bot.sendMessage("❓ کد آموزش مشخص نیست. /start بزن.") }89 90// 📦 همه‌ی خواندن‌ها با یک درخواست (سبک و سریع)91let cfg = {}92let p = null93let ftest = null94let sokV = false95let rokV = false96let passV = null97try {98  let m0 = await db.bot.mget(["cfg", "p:" + arg, "forcetest", "sok:" + user.id, "rok:" + user.id, "pass:" + user.id])99  if (m0) {100    if (m0["cfg"]) { cfg = m0["cfg"] }101    if (m0["p:" + arg]) { p = m0["p:" + arg] }102    if (m0["forcetest"]) { ftest = m0["forcetest"] }103    if (m0["sok:" + user.id] === true) { sokV = true }104    if (m0["rok:" + user.id] === true) { rokV = true }105    if (m0["pass:" + user.id]) { passV = m0["pass:" + user.id] }106  }107} catch (e) { }108if (!p) { return Bot.sendMessage("❌ این آموزش پیدا نشد یا حذف شده. /start بزن.") }109let pid = String(p.id || arg)110let chans = (cfg.channels || []).filter(x => x)111 112// 🧑‍✈️ معافیت ادمین — پیش‌فرض خاموشه (پنل → 🔐 قفل‌ها)113let isStaff = (user.id === 5861439682 || (cfg.admins || []).indexOf(user.id) !== -1)114let bypass = (isStaff && cfg.gate_admin_bypass === true)115 116// 🔐 قفل‌ها پیش‌فرض روشنن (پنل → 🔐 قفل‌ها)117let gJoin = (cfg.gate_join !== false)118let gSave = (cfg.gate_save !== false)119let gReact = (cfg.gate_react !== false)120 121// 🔁 پیش‌فرض: «یک‌بار برای هر اکانت»122let gAlways = (cfg.gate_always === true)123let freshOk = false124if (passV && (Date.now() - Number(passV) < 180000)) { freshOk = true }125 126// 🧪 حالت تست قفل127let testMode = (ftest && ftest.on === true)128 129await db.bot.set("last:" + user.id, pid, { ttl: 86400 })130 131let sJoin = "off"132let leftCh = []133if (gJoin && chans.length) {134  try {135    let r = await Libs.mcl.check(user.id, chans.slice(0, 10))136    let badCh = (r && Array.isArray(r.invalid)) ? r.invalid : []137    if (badCh.length) {138      let bn = []139      for (let bx of badCh) { bn.push(String(bx.channel || bx)) }140      await db.bot.set("gjoin_bad", { t: Date.now(), list: bn })141    }142    leftCh = (r && Array.isArray(r.left)) ? r.left : []143    let isOk = (r && r.allJoined === true)144    if (!isOk && badCh.length && leftCh.length === 0) { isOk = true }145    sJoin = isOk ? "ok" : "no"146  } catch (e) { sJoin = "no" }147}148let sSave = "off"149if (gSave) { sSave = (sokV === true && (!gAlways || freshOk)) ? "ok" : "no" }150let sReact = "off"151if (gReact) { sReact = (rokV === true && (!gAlways || freshOk)) ? "ok" : "no" }152 153if (testMode) {154  let tm = "🧪 <b>حالت تست قفل روشن است</b>\n\n"155  tm = tm + "🗂 آموزش: <b>" + Libs.tgutil.escapeText(p.title || ("#" + pid), "html") + "</b>\n"156  tm = tm + "👤 آیدی تو: <code>" + user.id + "</code>\n\n"157  tm = tm + "🔐 <b>وضعیت قفل‌ها برای همین اکانت:</b>\n"158  tm = tm + "▫️ 📢 جوین اجباری — " + (gJoin ? "روشن 🟢" : "خاموش 🔴") + " | " + (gJoin ? (sJoin === "ok" ? "تو انجام دادی ✅" : (sJoin === "no" ? "تو انجام ندادی ❌" : "کانالی ثبت نشده ⚠️")) : "—") + "\n"159  tm = tm + "▫️ 💾 سیو/سین — " + (gSave ? "روشن 🟢" : "خاموش 🔴") + " | " + (gSave ? (sSave === "ok" ? "تو انجام دادی ✅" : "تو انجام ندادی ❌") : "—") + "\n"160  let rnF = Number(p.refneed || cfg.gate_ref || 0)161  if (rnF > 0) {162    let myInvT = 0163    try { myInvT = Number((await db.bot.get("inv:" + user.id, 0)) || 0) } catch (e) { myInvT = 0 }164    tm = tm + "▫️ 🎁 دعوت دوستان — " + rnF + " نفر لازم | تو: " + myInvT + " نفر " + (myInvT >= rnF ? "✅" : "❌") + "\n"165  }166  tm = tm + "▫️ ❤️ ری‌اکشن — " + (gReact ? "روشن 🟢" : "خاموش 🔴") + " | " + (gReact ? (sReact === "ok" ? "تو انجام دادی ✅ (۳۰ روز ثبت می‌مونه)" : "تو انجام ندادی ❌") : "—") + "\n"167  if (bypass) { tm = tm + "\n🧑‍✈️ معافیت ادمین برای تو روشنه (قفل‌ها برات رد می‌شن).\n" }168  tm = tm + "\n🔁 حالت پرسش: " + (gAlways ? "هر بار از نو می‌پرسه 🔁" : "یک‌بار برای هر اکانت ✅ (اگه انجام داده باشی دیگه نمی‌پرسه)") + "\n"169  tm = tm + "\n⚠️ این پیام <b>فقط تست</b>ه: چون حالت تست روشنه، قفل‌ها آزمایشی نشون داده می‌شن حتی اگه قبلاً انجامشون داده باشی.\n"170  tm = tm + "\n👉 اگه همین پیام رو می‌بینی، یعنی مسیر قفل <b>سالم کار می‌کنه</b> ✅"171  let tempRows = [[{ text: "✅ پایان تست و دریافت آموزش", callback_data: "dl ftestoff " + pid }], [{ text: "🧪 فقط خاموش کن", callback_data: "dl ftestoff -" , style: "danger" }]]172  return Api.sendMessage({ chat_id: chat.id, text: tm, parse_mode: "HTML", reply_markup: { inline_keyboard: tempRows } })173}174 175// ─────────────── حالت ۱: کارت آموزش (بدون تحویل)176if (mode === "card") {177  let eTitle = Libs.tgutil.escapeText(p.title || "آموزش بی‌عنوان", "html")178  let cap = "📌 <b>" + eTitle + "</b>\n"179  if (p.preview) {180    let pShort = Libs.tgutil.escapeText(p.preview, "html")181    if (pShort.length > 700) { pShort = pShort.slice(0, 700) + "…" }182    cap = cap + "\n👁 " + pShort + "\n"183  } else {184    cap = cap + "\nℹ️ برای دریافت آموزش و فایل، روی دکمهٔ «📥 دریافت آموزش» بزنید.\n"185  }186  cap = cap + "\n🆔 کد آموزش: <code>" + pid + "</code>"187  if (p.pass) { cap = cap + "\n🔒 این آموزش رمز داره" }188 189  let locks = []190  if (!bypass) {191    if (gJoin && chans.length) { locks.push("📢 جوین") }192    if (gSave) { locks.push("💾 سیو/سین") }193    if (gReact) { locks.push("❤️ ری‌اکشن") }194    let rn0 = Number(p.refneed || cfg.gate_ref || 0)195    if (rn0 > 0) { locks.push("🎁 دعوت " + rn0 + " نفری") }196    if (p.pass) { locks.push("🔒 رمز") }197  }198  if (locks.length) { cap = cap + "\n🔐 قفل‌های فعال: " + locks.join(" | ") }199  cap = cap + "\n\n🟢 می‌خوای؟ روی «📥 دریافت آموزش» بزن 👇"200 201  let rows = [[{ text: "📥 دریافت آموزش", callback_data: "dl go " + pid }]]202  if (p.link) { rows.push([{ text: "▶️ دیدن ویدیو", url: p.link }]) }203  rows.push([{ text: "📚 همه آموزش‌ها", callback_data: "files 0" , style: "primary" }])204 205  // 🖼 عکس کارت: کاور ثبت‌شده، یا خودِ فایل اگه عکسه (تا کارت بدون عکس نمونه)206  let cardImg = ""207  if (p.cover) { cardImg = p.cover }208  else if (p.file_type === "photo" && p.file_id) { cardImg = p.file_id }209 210  if (cardImg) {211    return Api.sendPhoto({ chat_id: chat.id, photo: cardImg, caption: cap, parse_mode: "HTML", reply_markup: { inline_keyboard: rows } })212  }213  return Api.sendMessage({ chat_id: chat.id, text: cap, parse_mode: "HTML", reply_markup: { inline_keyboard: rows } })214}215 216// ─────────────── حالت ۲: تحویل آموزش (قفل‌ها → رمز → یک پیام تمیز)217let problems = []218let gateRows = []219 220if (!bypass && gJoin && sJoin === "no") {221  problems.push("📢 عضویت در کانال‌های ما")222  let btnCh = (leftCh.length ? leftCh : chans).slice(0, 10)223  let jb2 = null224  try { jb2 = Libs.mcl.getBtn(btnCh, { buttonPrefix: "📢 عضویت" }) } catch (e) { jb2 = null }225  if (Array.isArray(jb2)) { gateRows = gateRows.concat(jb2) }226  if (!jb2 || !jb2.length) {227    let hint2 = false228    for (let ci3 = 0; ci3 < btnCh.length; ci3++) {229      let cc = String(btnCh[ci3])230      if (cc.indexOf("@") === 0) { gateRows.push([{ text: "📢 عضویت " + cc, url: "https://t.me/" + cc.replace("@", "") }]); hint2 = true }231    }232    if (!hint2) { problems.push("⚠️ کانال‌ها یوزرنیم عمومی ندارن — به پشتیبانی بگو") }233  }234}235 236if (!bypass && gSave && sSave !== "ok") {237  problems.push("💾 سیو (سین) کردن پست کانال")238  gateRows.push([{ text: "💾 سیو کردم / سین کردم", callback_data: "save" , style: "success" }])239}240 241if (!bypass && gReact && sReact !== "ok") {242  problems.push("❤️ ری‌اکشن روی پست کانال")243  if (cfg.react_link) { gateRows.push([{ text: "📌 رفتن به پست کانال", url: cfg.react_link }]) }244  gateRows.push([{ text: "✅ ری‌اکشن زدم", callback_data: "rc" , style: "success" }])245}246 247// 🎁 قفل ۳.۵ — دعوت دوستان (تعدادش رو ادمین برای هر آموزش تعیین می‌کنه)248let refNeed = Number(p.refneed || cfg.gate_ref || 0)249let myInv = 0250if (refNeed > 0) {251  try { myInv = Number((await db.bot.get("inv:" + user.id, 0)) || 0) } catch (e) { myInv = 0 }252  if (!bypass && myInv < refNeed) {253    problems.push("🎁 دعوت " + refNeed + " نفر از دوستات (تا الان: " + myInv + " نفر)")254    gateRows.push([{ text: "🎁 دعوت دوستان / لینک من", callback_data: "dl davat" , style: "primary" }])255  }256}257 258if (problems.length) {259  gateRows.push([{ text: "🔄 بررسی وضعیت", callback_data: "verify" , style: "primary" }])260  let gtxt = "🔐 <b>برای دریافت این آموزش باید این‌ها رو انجام بدی:</b>\n\n"261  for (let i = 0; i < problems.length; i++) { gtxt = gtxt + "▫️ " + Libs.tgutil.escapeText(problems[i], "html") + "\n" }262  if (p.pass) { gtxt = gtxt + "▫️ 🔒 رمز آموزش (بعد از این‌ها ازت پرسیده می‌شه)\n" }263  if (gReact && !bypass && sReact !== "ok") {264    gtxt = gtxt + "\n❤️ ری‌اکشن رو روی پست کانال بزن، بعد دکمه‌ی «✅ ری‌اکشن زدم» رو بزن."265  }266  let act = []267  if (gJoin && chans.length) { act.push("📢 جوین") }268  if (gSave) { act.push("💾 سیو/سین") }269  if (gReact) { act.push("❤️ ری‌اکشن") }270  if (refNeed > 0) { act.push("🎁 دعوت " + refNeed + " نفری") }271  if (p.pass) { act.push("🔒 رمز") }272  gtxt = gtxt + "\n🔐 قفل‌های فعال: " + (act.length ? act.join(" | ") : "هیچ")273  gtxt = gtxt + "\n\n🤖 هر دکمه‌ای که بزنی، خودم <b>خودکار</b> همه‌ی قفل‌ها رو دوباره چک می‌کنم و آموزش رو می‌فرستم."274  await db.bot.set("wstep:" + user.id, "gate:" + pid, { ttl: 1800 })275  return Api.sendMessage({ chat_id: chat.id, text: gtxt, parse_mode: "HTML", reply_markup: { inline_keyboard: gateRows } })276}277 278// 🔒 قفل ۴ — رمز آموزش279if (!bypass && p.pass) {280  let unlocked = await db.bot.get("ok:" + user.id + ":" + pid, false)281  if (unlocked !== true) {282    await db.bot.set("wstep:" + user.id, "pass:" + pid, { ttl: 3600 })283    return Api.sendMessage({284      chat_id: chat.id,285      text: "🔒 <b>این آموزش رمز داره</b>\n\nرمز رو بفرست 👇",286      parse_mode: "HTML",287      reply_markup: { inline_keyboard: [[{ text: "🗂 کارت آموزش", callback_data: "dl " + pid }]] }288    })289  }290}291 292// ✅ همه‌ی قفل‌ها بازه → تحویل «توضیحات + عکس» — فقط یک پیام، بدون پیام اضافه293let eTitle3 = Libs.tgutil.escapeText(p.title || "آموزش", "html")294let dBody = p.desc ? Libs.tgutil.escapeText(String(p.desc), "html") : eTitle3295if (dBody.length > 900) { dBody = dBody.slice(0, 900) + "…" }296let delCap = dBody297let btnRows = []298if (p.link) { btnRows.push([{ text: "▶️ دیدن ویدیو", url: p.link }]) }299btnRows.push([{ text: "📚 همه آموزش‌ها", callback_data: "files 0" , style: "primary" }])300 301// 🖼 عکس این آموزش: کاور ثبت‌شده، یا خود فایل اگه عکسه (تا کارت بی‌عکس نمونه)302let covImg = ""303if (p.cover) { covImg = p.cover }304else if (p.file_type === "photo" && p.file_id) { covImg = p.file_id }305 306let sent = false307 308// ۱) فایل اصلی (سند/ویدیو/عکس/صدا/ویس) — متن پیام = توضیحات آموزش309if (p.file_id) {310  try {311    if (p.file_type === "video") {312      await Api.sendVideo({ chat_id: chat.id, video: p.file_id, caption: delCap, parse_mode: "HTML", supports_streaming: true, reply_markup: { inline_keyboard: btnRows } })313    } else if (p.file_type === "photo") {314      await Api.sendPhoto({ chat_id: chat.id, photo: p.file_id, caption: delCap, parse_mode: "HTML", reply_markup: { inline_keyboard: btnRows } })315    } else if (p.file_type === "audio") {316      await Api.sendAudio({ chat_id: chat.id, audio: p.file_id, caption: delCap, parse_mode: "HTML", reply_markup: { inline_keyboard: btnRows } })317    } else if (p.file_type === "voice") {318      await Api.sendVoice({ chat_id: chat.id, voice: p.file_id, caption: delCap, parse_mode: "HTML", reply_markup: { inline_keyboard: btnRows } })319    } else {320      await Api.sendDocument({ chat_id: chat.id, document: p.file_id, caption: delCap, parse_mode: "HTML", reply_markup: { inline_keyboard: btnRows } })321    }322    sent = true323  } catch (e) { sent = false }324}325 326// ۲) اگه فایل نبود → عکس آموزش (کاور) با متن توضیحات327if (!sent && covImg) {328  try {329    await Api.sendPhoto({ chat_id: chat.id, photo: covImg, caption: delCap, parse_mode: "HTML", reply_markup: { inline_keyboard: btnRows } })330    sent = true331  } catch (e) { sent = false }332}333 334// ۳) فقط لینک → یک پیام با دکمه‌ی ویدیو335if (!sent && p.link) {336  await Api.sendMessage({337    chat_id: chat.id,338    text: delCap + "\n\n🎬 برای تماشای آموزش روی دکمه‌ی زیر بزن 👇",339    parse_mode: "HTML",340    reply_markup: { inline_keyboard: btnRows }341  })342  sent = true343}344 345// ۴) فقط متن توضیحات346if (!sent && p.desc) {347  await Api.sendMessage({ chat_id: chat.id, text: delCap, parse_mode: "HTML", reply_markup: { inline_keyboard: btnRows } })348  sent = true349}350 351// ۵) هیچی نداشت352if (!sent) {353  await Api.sendMessage({354    chat_id: chat.id,355    text: eTitle3 + "\n\n⚠️ محتوایی برای این آموزش ثبت نشده — به پشتیبانی بگو تا درستش کنه.",356    parse_mode: "HTML",357    reply_markup: { inline_keyboard: [[{ text: "📞 پشتیبانی", callback_data: "support" , style: "danger" }]] }358  })359}360 361// 🪪 گذرنامه مصرف شد — بعد از این، رفتار «یک‌بار برای هر اکانت» برقراره362await db.bot.del("pass:" + user.id)363await db.bot.del("wstep:" + user.id)364 365await db.bot.incr("stat:dl", 1)366await db.bot.incr("udl:" + user.id, 1)367p.dl = (p.dl || 0) + 1368await db.bot.set("p:" + pid, p)