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/dl.js
javascript · 368 lines
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)