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/_start.js
javascript · 356 lines
1/**#command2name: /start3answer: 4keyboard: 5parse_mode: markdown6aliases: 7allow_only_group: false8need_reply: false9is_web: 010#command**/11 12// ═══════════ /start — منوی اصلی و استارت ربات ═══════════13// بارگذاری تجمیعی برای کاهش صداهای دیتابیس (زیر ۵ صدا)14let initKeys = ["cfg", "plist"]15if (user) {16 initKeys.push("lang:" + user.id, "sok:" + user.id, "rok:" + user.id, "inv:" + user.id, "pass:" + user.id)17}18let mInit = await db.bot.mget(initKeys) || {}19 20let cfg = mInit["cfg"] || {}21let userLang = (user && mInit["lang:" + user.id]) ? mInit["lang:" + user.id] : (cfg.default_lang || "fa")22let name = user ? Libs.tgutil.escapeText(user.first_name || (userLang === "en" ? "Friend" : (userLang === "ar" ? "عزيزي" : "دوست عزیز")), "html") : "دوست عزیز"23 24let plist = mInit["plist"] || []25 26// 🔗 لینک مستقیم (دکمهی «📥 دریافت از ربات» تو پست کانال): /start <کد آموزش>27let dlPayload = String(params || "").trim()28if (/^\d+$/.test(dlPayload) && plist.indexOf(Number(dlPayload)) !== -1) {29 return Bot.run({ command: "dl " + Number(dlPayload), ignoreMissingCommand: true })30}31 32// 🔐 گارد قفل — همهٔ قفلها از همینجا (حتی اولین /start) چک میشن و تا رعایت نشه رها نمیکنیم33let gsok = (user && mInit["sok:" + user.id] === true)34let grok = (user && mInit["rok:" + user.id] === true)35let ginv = Number((user && mInit["inv:" + user.id]) || 0)36let gfresh = false37if (user && mInit["pass:" + user.id] && (Date.now() - Number(mInit["pass:" + user.id]) < 180000)) { gfresh = true }38 39let gstaff = (user && (user.id === 5861439682 || (cfg.admins || []).indexOf(user.id) !== -1))40if (!gstaff && user) {41 let galways = (cfg.gate_always === true)42 let gchans = (cfg.channels || []).filter(x => x)43 let gjoinBad = false44 let gleft = []45 if (cfg.gate_join !== false && gchans.length) {46 let gres = null47 try { gres = await Libs.mcl.check(user.id, gchans.slice(0, 10)) } catch (e) { gres = null }48 if (gres) {49 let gbad = Array.isArray(gres.invalid) ? gres.invalid : []50 gleft = Array.isArray(gres.left) ? gres.left : []51 gjoinBad = (gres.allJoined !== true)52 if (gjoinBad && gbad.length && gleft.length === 0) { gjoinBad = false }53 }54 }55 let gsaveNeed = (cfg.gate_save !== false && !(gsok === true && (!galways || gfresh)))56 let greactNeed = (cfg.gate_react !== false && !(grok === true && (!galways || gfresh)))57 let grefNeed = Number(cfg.gate_ref || 0)58 let grefBad = (grefNeed > 0 && ginv < grefNeed)59 60 if (gjoinBad || gsaveNeed || greactNeed || grefBad) {61 let grows = []62 if (gjoinBad) {63 let gbtn = null64 try { gbtn = Libs.mcl.getBtn((gleft.length ? gleft : gchans).slice(0, 10), { buttonPrefix: (userLang === "en" ? "📢 Join" : (userLang === "ar" ? "📢 انضمام" : "📢 عضویت")) }) } catch (e) { gbtn = null }65 if (Array.isArray(gbtn) && gbtn.length) {66 grows = grows.concat(gbtn)67 } else {68 for (let gcx of (gleft.length ? gleft : gchans)) {69 if (String(gcx).indexOf("@") === 0) { grows.push([{ text: (userLang === "en" ? "📢 Join " : (userLang === "ar" ? "📢 انضمام " : "📢 عضویت ")) + gcx, url: "https://t.me/" + String(gcx).replace("@", ""), style: "primary" }]) }70 }71 }72 }73 if (cfg.react_link && (gsaveNeed || greactNeed)) { grows.push([{ text: (userLang === "en" ? "📌 Go to Channel Post" : (userLang === "ar" ? "📌 الذهاب لمنشور القناة" : "📌 رفتن به پست کانال")), url: cfg.react_link, style: "success" }]) }74 if (gsaveNeed) { grows.push([{ text: (userLang === "en" ? "🟢 💾 I Saved / Viewed" : (userLang === "ar" ? "🟢 💾 حفظت / شاهدت" : "💾 سیو کردم / سین کردم")), callback_data: "save", style: "success" }]) }75 if (greactNeed) { grows.push([{ text: (userLang === "en" ? "🟢 ❤️ I Reacted" : (userLang === "ar" ? "🟢 ❤️ تفاعلت مع المنشور" : "✅ ریاکشن زدم")), callback_data: "rc", style: "success" }]) }76 if (grefBad) { grows.push([{ text: (userLang === "en" ? "🔵 🎁 Invite Friends / My Link" : (userLang === "ar" ? "🔵 🎁 دعوة الأصدقاء / رابطي" : "🎁 دعوت دوستان / لینک من")), callback_data: "dl davat", style: "primary" }]) }77 grows.push([78 { text: (userLang === "en" ? "🔵 🔄 Verify Status" : (userLang === "ar" ? "🔵 🔄 التحقق من الحالة" : "🔄 بررسی وضعیت")), callback_data: "verify", style: "primary" },79 { text: (userLang === "en" ? "🔴 ✈️ Support" : (userLang === "ar" ? "🔴 ✈️ الدعم الفني" : "📞 پشتیبانی")), callback_data: "support", style: "danger" }80 ])81 82 let gtxt = ""83 if (userLang === "en") {84 gtxt = "🔐 <b>Access Restricted — Complete Requirements First</b>\n\n" +85 "You must complete the following to unlock the bot:\n\n"86 if (gjoinBad) { gtxt = gtxt + "▫️ 📢 Join our " + gchans.length + " channel(s)\n" }87 if (gsaveNeed) { gtxt = gtxt + "▫️ 💾 Save / View channel post\n" }88 if (greactNeed) { gtxt = gtxt + "▫️ ❤️ Add reaction to channel post\n" }89 if (grefBad) { gtxt = gtxt + "▫️ 🎁 Invite " + grefNeed + " friends (Current: " + ginv + ")\n" }90 gtxt = gtxt + "\n🤖 Click 'Verify Status' after completing them."91 } else if (userLang === "ar") {92 gtxt = "🔐 <b>الدخول مقفل — يرجى إكمال الشروط أولاً</b>\n\n" +93 "لفتح البوت يجب عليك إتمام ما يلي:\n\n"94 if (gjoinBad) { gtxt = gtxt + "▫️ 📢 الانضمام إلى " + gchans.length + " من قنواتنا\n" }95 if (gsaveNeed) { gtxt = gtxt + "▫️ 💾 حفظ / مشاهدة منشور القناة\n" }96 if (greactNeed) { gtxt = gtxt + "▫️ ❤️ التفاعل مع منشور القناة\n" }97 if (grefBad) { gtxt = gtxt + "▫️ 🎁 دعوة " + grefNeed + " أصدقاء (حالياً: " + ginv + ")\n" }98 gtxt = gtxt + "\n🤖 اضغط على 'التحقق من الحالة' بعد الإتمام."99 } else {100 gtxt = "🔐 <b>درِ ورود بسته است — اول قفلها</b>\n\n" +101 "تا اینها انجام نشه، ربات برات باز نمیشه:\n\n"102 if (gjoinBad) { gtxt = gtxt + "▫️ 📢 عضویت در " + gchans.length + " کانال ما\n" }103 if (gsaveNeed) { gtxt = gtxt + "▫️ 💾 سیو (سین) کردن پست کانال\n" }104 if (greactNeed) { gtxt = gtxt + "▫️ ❤️ ریاکشن روی پست کانال\n" }105 if (grefBad) { gtxt = gtxt + "▫️ 🎁 دعوت " + grefNeed + " نفر از دوستات (تا الان: " + ginv + " نفر)\n" }106 gtxt = gtxt + "\n🤖 هر دکمهای بزنی خودم دوباره چک میکنم؛ تا همه رعایت نشه از همین صفحه بیرون نمیری."107 }108 return Api.sendMessage({ chat_id: chat.id, text: gtxt, parse_mode: "HTML", reply_markup: { inline_keyboard: grows } })109 }110}111 112// 🎁 لینک دعوت دوستان: /start ref_<آیدی عددی>113if (/^ref_\d+$/.test(dlPayload)) {114 let inviter = Number(dlPayload.slice(4))115 let meId = Number(user ? user.id : 0)116 if (inviter && inviter !== meId) {117 let seen = false118 try { seen = await db.bot.get("refseen:" + meId, false) } catch (e) { seen = false }119 if (seen !== true) {120 await db.bot.set("refseen:" + meId, true)121 let c1 = 0122 try { c1 = Number((await db.bot.incr("inv:" + inviter, 1)) || 0) } catch (e) { c1 = 0 }123 try { await db.bot.incr("inv_total", 1) } catch (e) { }124 try {125 let invLang = "fa"126 try { invLang = await db.bot.get("lang:" + inviter, "fa") } catch(e){}127 let invMsg = ""128 if (invLang === "en") {129 invMsg = "🎉 <b>Someone joined with your invite link!</b>\n\n👥 Total invites: <b>" + c1 + "</b> users\n\nLocked tutorials unlock automatically as you invite! 👇"130 } else if (invLang === "ar") {131 invMsg = "🎉 <b>انضم شخص جديد عبر رابطك!</b>\n\n👥 إجمالي دعواتك: <b>" + c1 + "</b> شخص\n\nالشروحات المقفلة تفتح بالدعوات 👇"132 } else {133 invMsg = "🎉 <b>یک نفر با لینک تو اومد!</b>\n\n👥 دعوتهای تو: <b>" + c1 + "</b> نفر\n\nاگه آموزشی برات قفل باشه، با دعوت باز میشه 👇"134 }135 await Api.sendMessage({136 chat_id: inviter,137 text: invMsg,138 parse_mode: "HTML",139 reply_markup: { inline_keyboard: [[{ text: (invLang === "en" ? "🔵 🎁 Invite Friends" : (invLang === "ar" ? "🔵 🎁 دعوة الأصدقاء" : "🎁 دعوت دوستان")), callback_data: "dl davat", style: "primary" }]] }140 })141 } catch (e) { }142 }143 }144}145 146// ۶ آموزش آخر برای دسترسی مستقیم147let ids = plist.slice(-6).reverse()148let data = ids.length ? await db.bot.mget(ids.map(x => "p:" + x)) : {}149 150let rows = []151for (let id of ids) {152 let p = data["p:" + id]153 if (!p) { continue }154 let t = p.title ? p.title : ((userLang === "en" ? "Course #" : (userLang === "ar" ? "شرح #" : "آموزش #")) + id)155 if (t.length > 30) { t = t.slice(0, 30) + "…" }156 rows.push([{ text: (p.pass ? "🔒 " : "📄 ") + t, callback_data: "dl " + id, style: "primary" }])157}158 159// دکمههای شیشهای ۱۰۰٪ رنگی و متناظر160if (userLang === "en") {161 rows.push([{ text: "🔴 📚 𝑩𝒓𝒐𝒘𝒔𝒆 𝑻𝒖𝒕𝒐𝒓𝒊𝒂𝒍𝒔 (" + plist.length + ")", callback_data: "files 0", style: "danger" }])162 rows.push([163 { text: "🟢 🔍 𝑺𝒆𝒂𝒓𝒄𝒉", callback_data: "search", style: "success" },164 { text: "🔵 ⚙️ 𝑴𝒚 𝑷𝒓𝒐𝒇𝒊𝒍𝒆", callback_data: "profile", style: "primary" }165 ])166 rows.push([167 { text: "🟢 🎁 𝑫𝒂𝒊𝒍𝒚 𝑮𝒊𝒇𝒕", callback_data: "daily", style: "success" },168 { text: "🔵 🔗 𝑹𝒆𝒇𝒆𝒓 & 𝑬𝒂𝒓𝒏", callback_data: "dl davat", style: "primary" }169 ])170 rows.push([171 { text: "🟣 🌐 𝑳𝒂𝒏𝒈𝒖𝒂𝒈𝒆", callback_data: "lang", style: "primary" },172 { text: "🔵 ❓ 𝑯𝒐𝒘 𝑻𝒐 𝑼𝒔𝒆", callback_data: "help", style: "primary" }173 ])174 rows.push([175 { text: "🔴 ✈️ 𝑺𝒖𝒑𝒑𝒐𝒓𝒕", callback_data: "support", style: "danger" }176 ])177} else if (userLang === "ar") {178 rows.push([{ text: "🔴 📚 𝑩𝒓𝒐𝒘𝒔𝒆 𝑻𝒖𝒕𝒐𝒓𝒊𝒂𝒍𝒔 — تصفح الدورات (" + plist.length + ")", callback_data: "files 0", style: "danger" }])179 rows.push([180 { text: "🟢 🔍 𝑺𝒆𝒂𝒓𝒄𝒉 / بحث", callback_data: "search", style: "success" },181 { text: "🔵 ⚙️ 𝑴𝒚 𝑷𝒓𝒐𝒇𝒊𝒍𝒆 / حسابي", callback_data: "profile", style: "primary" }182 ])183 rows.push([184 { text: "🟢 🎁 𝑫𝒂𝒊𝒍𝒚 𝑮𝒊𝒇𝒕 / الهدية", callback_data: "daily", style: "success" },185 { text: "🔵 🔗 𝑹𝒆𝒇𝒆𝒓 & 𝑬𝒂𝒓𝒏 / دعوة", callback_data: "dl davat", style: "primary" }186 ])187 rows.push([188 { text: "🟣 🌐 𝑳𝒂𝒏𝒈𝒖𝒂𝒈𝒆 / اللغة", callback_data: "lang", style: "primary" },189 { text: "🔵 ❓ 𝑯𝒐𝒘 𝑻𝒐 𝑼𝒔𝒆 / التعليمات", callback_data: "help", style: "primary" }190 ])191 rows.push([192 { text: "🔴 ✈️ 𝑺𝒖𝒑𝒑𝒐𝒓𝒕 / الدعم", callback_data: "support", style: "danger" }193 ])194} else {195 if (!rows.length) { rows.push([{ text: "📭 هنوز آموزشی اضافه نشده", callback_data: "files 0", style: "primary" }]) }196 rows.push([{ text: "🔴 📚 𝑩𝒓𝒐𝒘𝒔𝒆 𝑻𝒖𝒕𝒐𝒓𝒊𝒂𝒍𝒔 — همه آموزشها (" + plist.length + ")", callback_data: "files 0", style: "danger" }])197 rows.push([198 { text: "🟢 🔍 𝑺𝒆𝒂𝒓𝒄𝒉 / جستوجو", callback_data: "search", style: "success" },199 { text: "🔵 ⚙️ 𝑴𝒚 𝑷𝒓𝒐𝒇𝒊𝒍𝒆 / پروفایل من", callback_data: "profile", style: "primary" }200 ])201 rows.push([202 { text: "🟢 🎁 𝑫𝒂𝒊𝒍𝒚 𝑮𝒊𝒇𝒕 / هدیه روزانه", callback_data: "daily", style: "success" },203 { text: "🔵 🔗 𝑹𝒆𝒇𝒆𝒓 & 𝑬𝒂𝒓𝒏 / 🎁 دعوت دوستان", callback_data: "dl davat", style: "primary" }204 ])205 rows.push([206 { text: "🟣 🌐 𝑳𝒂𝒏𝒈𝒖𝒂𝒈𝒆 / تغییر زبان", callback_data: "lang", style: "primary" },207 { text: "🔵 ❓ 𝑯𝒐𝒘 𝑻𝒐 𝑼𝒔𝒆 / راهنما", callback_data: "help", style: "primary" }208 ])209 rows.push([210 { text: "🔴 ✈️ 𝑺𝒖𝒑𝒑𝒐𝒓𝒕 / پشتیبانی", callback_data: "support", style: "danger" }211 ])212}213 214let chans = (cfg.channels || []).filter(x => x)215if (chans.length && String(chans[0]).indexOf("@") === 0) {216 let chanTitle = (userLang === "en" ? "🟢 📢 𝑶𝒇𝒇𝒊𝒄𝒊𝒂𝒍 𝑪𝒉𝒂𝒏𝒏𝒆𝒍 ↗" : (userLang === "ar" ? "🟢 📢 القناة الرسمية ↗" : "🟢 📢 کانال ما ↗"))217 rows.push([{ text: chanTitle, url: "https://t.me/" + String(chans[0]).replace("@", ""), style: "success" }])218}219 220let admins2 = cfg.admins || []221if (user && (user.id === 5861439682 || admins2.indexOf(user.id) !== -1)) {222 rows.push([{ text: "🟣 🛠 𝑨𝒅𝒎𝒊𝒏 𝑷𝒂𝒏𝒆𝒍 / پنل مدیریت", callback_data: "adm home", style: "primary" }])223}224 225let botTitle = cfg.bot_name || "ZORENIX LEARNING BOT"226let txt = ""227 228if (userLang === "en") {229 txt = "<blockquote>📸 <b>" + Libs.tgutil.escapeText(botTitle, "html") + "</b></blockquote>\n\n" +230 "┣ 🔄 <b>Browse Tutorials :</b> Access all courses & exclusive files\n" +231 "┣ 🔍 <b>Smart Search :</b> Find tutorials instantly by keyword\n" +232 "┣ ⚙️ <b>My Profile + Stats :</b> Check account info & locks status\n" +233 "┣ 🔗 <b>Refer And Earn :</b> Share invite link & unlock content\n" +234 "┣ 🎁 <b>Daily Gift :</b> Free spin & random balance daily (24h)\n" +235 "┣ 🌐 <b>Language :</b> Choose English, Persian or Arabic\n" +236 "┣ ✈️ <b>Support Admin :</b> Direct contact with support team\n" +237 "┣ ❓ <b>How To Use :</b> Step-by-step bot learning guide\n" +238 "➤ ━━━━━━━━━━━━━━━━━━━━\n" +239 "💰 <b>Your Invites / Points:</b> <code>" + ginv + "</code>\n" +240 "➤ ━━━━━━━━━━━━━━━━━━━━\n" +241 "👇 <b>Select an option from the menu below:</b>"242} else if (userLang === "ar") {243 txt = "<blockquote>📸 <b>" + Libs.tgutil.escapeText(botTitle, "html") + "</b></blockquote>\n\n" +244 "┣ 🔄 <b>تصفح الدورات :</b> الوصول إلى أحدث الدروس والملفات\n" +245 "┣ 🔍 <b>البحث الذكي :</b> البحث السريع بالكلمات المفتاحية\n" +246 "┣ ⚙️ <b>الملف الشخصي :</b> معلومات الحساب والإحصائيات\n" +247 "┣ 🔗 <b>دعوة الأصدقاء :</b> مشاركة الرابط وفتح الشروحات المقفلة\n" +248 "┣ 🎁 <b>الهدية اليومية :</b> رصيد ونقاط مجانية كل 24 ساعة\n" +249 "┣ 🌐 <b>تغيير اللغة :</b> اختيار العربية أو الفارسية أو الإنجليزية\n" +250 "┣ ✈️ <b>الدعم الفني :</b> تواصل مباشر مع إدارة البوت\n" +251 "┣ ❓ <b>دليل الاستخدام :</b> شرح كامل لطريقة عمل البوت\n" +252 "➤ ━━━━━━━━━━━━━━━━━━━━\n" +253 "💰 <b>رصيدك ودعواتك:</b> <code>" + ginv + "</code>\n" +254 "➤ ━━━━━━━━━━━━━━━━━━━━\n" +255 "👇 <b>اختر من القائمة أدناه:</b>"256} else {257 txt = cfg.welcome258 if (!txt) {259 txt = "<blockquote>📸 <b>" + Libs.tgutil.escapeText(botTitle, "html") + "</b></blockquote>\n\n" +260 "┣ 🔄 <b>مشاهده آموزشها :</b> دسترسی به جدیدترین دورهها و فایلها\n" +261 "┣ 🔍 <b>جستجوی هوشمند :</b> سرچ سریع بر اساس عنوان یا کلیدواژه\n" +262 "┣ ⚙️ <b>پروفایل و آمار :</b> وضعیت حساب، دانلودها و قفلها\n" +263 "┣ 🔗 <b>دعوت دوستان :</b> اشتراک لینک اختصاصی و پاداش دعوت\n" +264 "┣ 🎁 <b>هدیه روزانه :</b> دریافت شانس و امتیاز رایگان هر ۲۴ ساعت\n" +265 "┣ 🌐 <b>تغییر زبان :</b> تنظیم زبان به فارسی، انگلیسی یا عربی\n" +266 "┣ ✈️ <b>پشتیبانی آنلاین :</b> ارسال تیکت و پیام مستقیم به مدیریت\n" +267 "┣ ❓ <b>راهنمای ربات :</b> آموزش استفاده از بخشهای مختلف ربات\n" +268 "➤ ━━━━━━━━━━━━━━━━━━━━\n" +269 "💰 <b>امتیاز و دعوتهای شما:</b> <code>" + ginv + " نفر</code>\n" +270 "➤ ━━━━━━━━━━━━━━━━━━━━\n" +271 "👋 سلام <b>" + name + "</b>!\n\n📚 <b>کتابخانه آموزشها</b>\nاز دکمههای زیر، آموزش مورد نظرت رو انتخاب کن.\n\n🎬 روی کارت هر آموزش، دکمهی «📥 دریافت آموزش» و «▶️ دیدن ویدیو» هست."272 }273}274 275let banner = cfg.banner_url || cfg.banner276if (banner) {277 try {278 await Api.sendPhoto({ chat_id: chat.id, photo: banner, caption: txt, parse_mode: "HTML", reply_markup: { inline_keyboard: rows } })279 } catch(e) {280 await Api.sendMessage({ chat_id: chat.id, text: txt, parse_mode: "HTML", reply_markup: { inline_keyboard: rows } })281 }282} else {283 await Api.sendMessage({ chat_id: chat.id, text: txt, parse_mode: "HTML", reply_markup: { inline_keyboard: rows } })284}285 286// ⌨️ کیبورد پایین صفحه (Reply Keyboard) — ۱۰۰٪ متناظر و رنگی با تمام امکانات شیشهای287if (cfg.show_kb !== false) {288 let kIds = plist.slice().reverse()289 let kData = {}290 for (let ci = 0; ci < kIds.length; ci += 30) {291 let ck = kIds.slice(ci, ci + 30)292 let cp = await db.bot.mget(ck.map(x => "p:" + x))293 if (cp) { for (let key in cp) { kData[key] = cp[key] } }294 }295 296 let replyKb = []297 if (userLang === "en") {298 replyKb = [299 [{ text: "🔴 📚 𝑩𝒓𝒐𝒘𝒔𝒆 𝑻𝒖𝒕𝒐𝒓𝒊𝒂𝒍𝒔" }, { text: "🟢 🔍 𝑺𝒆𝒂𝒓𝒄𝒉" }],300 [{ text: "🔵 ⚙️ 𝑴𝒚 𝑷𝒓𝒐𝒇𝒊𝒍𝒆" }, { text: "🔵 ❓ 𝑯𝒐𝒘 𝑻𝒐 𝑼𝒔𝒆" }],301 [{ text: "🟢 🎁 𝑫𝒂𝒊𝒍𝒚 𝑮𝒊𝒇𝒕" }, { text: "🔵 🔗 𝑹𝒆𝒇𝒆𝒓 & 𝑬𝒂𝒓𝒏" }],302 [{ text: "🟣 🌐 𝑳𝒂𝒏𝒈𝒖𝒂𝒈𝒆" }, { text: "🔴 ✈️ 𝑺𝒖𝒑𝒑𝒐𝒓𝒕" }]303 ]304 if (user && (user.id === 5861439682 || (cfg.admins || []).indexOf(user.id) !== -1)) {305 replyKb.push([{ text: "🟣 🛠 𝑨𝒅𝒎𝒊𝒏 𝑷𝒂𝒏𝒆𝒍" }])306 }307 } else if (userLang === "ar") {308 replyKb = [309 [{ text: "🔴 📚 𝑩𝒓𝒐𝒘𝒔𝒆 𝑻𝒖𝒕𝒐𝒓𝒊𝒂𝒍𝒔 — تصفح الدورات" }, { text: "🟢 🔍 𝑺𝒆𝒂𝒓𝒄𝒉 / بحث" }],310 [{ text: "🔵 ⚙️ 𝑴𝒚 𝑷𝒓𝒐𝒇𝒊𝒍𝒆 / حسابي" }, { text: "🔵 ❓ 𝑯𝒐𝒘 𝑻𝒐 𝑼𝒔𝒆 / التعليمات" }],311 [{ text: "🟢 🎁 𝑫𝒂𝒊𝒍𝒚 𝑮𝒊𝒇𝒕 / الهدية" }, { text: "🔵 🔗 𝑹𝒆𝒇𝒆𝒓 & 𝑬𝒂𝒓𝒏 / دعوة" }],312 [{ text: "🟣 🌐 𝑳𝒂𝒏𝒈𝒖𝒂𝒈𝒆 / اللغة" }, { text: "🔴 ✈️ 𝑺𝒖𝒑𝒑𝒐𝒓𝒕 / الدعم" }]313 ]314 if (user && (user.id === 5861439682 || (cfg.admins || []).indexOf(user.id) !== -1)) {315 replyKb.push([{ text: "🟣 🛠 𝑨𝒅𝒎𝒊𝒏 𝑷𝒂𝒏𝒆𝒍 / لوحة الإدارة" }])316 }317 } else {318 replyKb = [319 [{ text: "🔴 📚 آموزشها" }, { text: "🟢 🔎 جستوجو" }],320 [{ text: "🔵 👤 پروفایل من" }, { text: "🔵 ❓ راهنما" }],321 [{ text: "🟢 🎁 هدیه روزانه" }, { text: "🔵 🎁 دعوت دوستان" }],322 [{ text: "🟣 🌐 تغییر زبان" }, { text: "🔴 📞 پشتیبانی" }]323 ]324 if (user && (user.id === 5861439682 || (cfg.admins || []).indexOf(user.id) !== -1)) {325 replyKb.push([{ text: "🟣 🛠 پنل مدیریت" }])326 }327 }328 329 // اضافه کردن آموزشها به کیبورد330 let fRows = []331 let cur = []332 for (let kid of kIds) {333 let kp = kData["p:" + kid]334 if (!kp) { continue }335 let kt = kp.title || ((userLang === "en" ? "Course #" : (userLang === "ar" ? "شرح #" : "آموزش #")) + kid)336 if (kt.length > 28) { kt = kt.slice(0, 28) + "…" }337 cur.push({ text: (kp.pass ? "🔒 " : "📄 ") + kt })338 if (cur.length === 2) { fRows.push(cur); cur = [] }339 }340 if (cur.length) { fRows.push(cur) }341 342 let finalReplyKb = [replyKb[0]].concat(fRows).concat(replyKb.slice(1))343 344 let kbMsg = (userLang === "en" ? "⌨️ You can also use the bottom keyboard menu 👇\n📚 Total tutorials: " + kIds.length345 : (userLang === "ar" ? "⌨️ يمكنك أيضاً استخدام القائمة السفلية 👇\n📚 إجمالي الشروحات: " + kIds.length346 : "⌨️ میتونی از دکمههای پایین صفحه هم استفاده کنی 👇\n📚 تعداد آموزشها: " + kIds.length))347 348 Api.sendMessage({349 chat_id: chat.id,350 text: kbMsg,351 reply_markup: { keyboard: finalReplyKb, resize_keyboard: true }352 })353} else {354 let offMsg = (userLang === "en" ? "⌨️ Bottom keyboard is OFF." : (userLang === "ar" ? "⌨️ القائمة السفلية معطلة." : "⌨️ کیبورد پایین صفحه خاموشه (از پنل → ⚙️ تنظیمات روشنش کن)."))355 Api.sendMessage({ chat_id: chat.id, text: offMsg, reply_markup: { remove_keyboard: true } })356}