indrajitghosh20006/HgfhhuybotPublic · Bot Template
AIThis bot provides a command‑based admin interface for managing user balances, products, and resellers. It supports adding balances via UPI or Binance Pay, approving payments, and configuring product details and categories. The bot also handles user role changes, stock uploads, and offers a simple calculator UI for entering amounts. All interactions are handled through short commands and inline keyboards, with no long‑running listeners or external frameworks.
Utilityadminbalanceproductresellerpaymentupi
138 commands0 envUpdated 15h agoCreated Sep 27, 2026
commands/_start.js
javascript · 971 lines
1/**#command2name: /start3answer: 4keyboard: 5parse_mode: markdown6aliases: /START,/Start,/STArt,/stARt7allow_only_group: false8need_reply: false9is_web: 010#command**/11 12try { 13 var adminId = Bot.getProperty("owner_id") || "7839151435";14 var userId = String(user.telegramid);15 16 // ⭐ TELEGRAM STARS — fallback event detection (payment events may route here17 // generically depending on the platform, so we check and delegate explicitly)18 if (request && request.pre_checkout_query) {19 Bot.run({ command: "/onPreCheckoutQuery" });20 return;21 }22 if (request && request.message && request.message.successful_payment) {23 Bot.run({ command: "/onSuccessfulPayment" });24 return;25 }26 27 // Safe variable fallbacks for BJS environment28 var msgText = (typeof message !== 'undefined' && message) ? message.trim() : "";29 // ✅ FIXED: pehle "data" naam ka ek undefined global variable padha ja raha tha, jo hamesha30 // empty rehta tha — isliye koi bhi callback button jo "/start" call karta tha (jaise "Back to31 // Menu"), silently fail ho jaata tha aur user ko koi response hi nahi milta tha.32 var callbackData = (request && request.callback_query && request.callback_query.data) ? request.callback_query.data : "";33 34 // =====================================================35 // 🛠 MAINTENANCE MODE GATE (✅ NEW)36 // Owner/Co-Admins hamesha through jaate hain; baaki sabko premium screen dikhta hai.37 // =====================================================38 var isMaintenanceOn = Bot.getProperty("maintenance_mode") || false;39 var isOwnerOrCoAdmin = (userId === adminId) || Bot.getProperty("co_admin_" + userId);40 41 if (isMaintenanceOn && !isOwnerOrCoAdmin) {42 Bot.sendMessage(43 "<blockquote><tg-emoji emoji-id='6100657257605763582'>🛠</tg-emoji> <b>BOT UNDER MAINTENANCE</b></blockquote>\n\n" +44 "<i>Hum kuch premium improvements kar rahe hain! Kripya thodi der baad wapas try karein.</i>\n\n" +45 "<tg-emoji emoji-id='6100170496077204999'>👑</tg-emoji> <i>Dhanyawad for your patience!</i>",46 { parse_mode: "HTML" }47 );48 return;49 }50 51 // ✅ NEW: Maintenance abhi-abhi hata hai — is user ko ek baar premium "We're Back!" welcome do52 var maintenanceRemovedAt = Bot.getProperty("maintenance_removed_at");53 var userSeenMaintenanceRemoved = User.getProperty("seen_maintenance_removed_at");54 if (!isMaintenanceOn && maintenanceRemovedAt && userSeenMaintenanceRemoved !== maintenanceRemovedAt) {55 User.setProperty("seen_maintenance_removed_at", maintenanceRemovedAt, "number");56 Api.sendMessage({57 chat_id: chat.chatid,58 text: "<blockquote><tg-emoji emoji-id='6102856637343600044'>✅</tg-emoji> <b>MAINTENANCE REMOVED — WE'RE BACK!</b></blockquote>\n\n" +59 "<tg-emoji emoji-id='6091571559233755994'>🚀</tg-emoji> <i>Bot fully automated system ke saath phir se live hai!</i>\n" +60 "<i>Tap /start to continue, or Buy Now to grab your keys instantly.</i>",61 parse_mode: "HTML",62 reply_markup: JSON.stringify({63 inline_keyboard: [[64 { text: "Buy Now", callback_data: "/buy_hack", style: "success", icon_custom_emoji_id: "6312263493051489212" }65 ]]66 })67 });68 }69 70 var currentStep = User.getProperty("add_product_step");71 var demoVideoStep = User.getProperty("demo_video_step");72 var isAwaitingBroadcast = User.getProperty("awaiting_broadcast_data");73 74 // 🎨 PREMIUM CUSTOM EMOJIS DEFINITION (Fixed with escaped double quotes)75 var EMJ_VERIFIED_CHECK = "<tg-emoji emoji-id=\"5875465628285931233\">✔️</tg-emoji>";76 var EMJ_CROWN = "<tg-emoji emoji-id=\"6311975081702597046\">👑</tg-emoji>";77 var EMJ_DROP = "<tg-emoji emoji-id=\"6080228009439141516\">💧</tg-emoji>";78 var EMJ_CHECK = "<tg-emoji emoji-id=\"6080214566191505147\">✅</tg-emoji>";79 var EMJ_ROCKET = "<tg-emoji emoji-id=\"6091571559233755994\">🚀</tg-emoji>";80 var EMJ_RADAR = "<tg-emoji emoji-id=\"6093591495237967001\">📡</tg-emoji>";81 var EMJ_STAR = "<tg-emoji emoji-id=\"6093677128295914531\">✨</tg-emoji>";82 var EMJ_RED_DOT = "<tg-emoji emoji-id=\"6093854128193152827\">🔴</tg-emoji>";83 84 // Access Granted ke liye aapka requested special premium custom emoji85 var EMJ_NEW_ACCESS = "<tg-emoji emoji-id=\"5875465628285931233\">✔️</tg-emoji>";86 87 // ==========================================88 // 🏠 HELPER: DIRECTLY SEND MAIN SHOP MENU89 // (Bot.runCommand("/menu") is unreliable in BJS -> inline it instead)90 // ==========================================91 function sendMainMenu() {92 try {93 // ✅ FIXED: ab same wallet store se read hoga jo purchase flows use karte hain94 // (Libs.ResourcesLib "balance" resource + admin bonus balance), taaki balance sab jagah same dikhe.95 var userBal = (function() {96 var resBal = 0;97 try { resBal = Number(Libs.ResourcesLib.userRes("balance").value()) || 0; } catch (e) {}98 return resBal.toFixed(2);99 })();100 101 var EMJ_HEADER_ROCKET = "<tg-emoji emoji-id='5217822164362739968'>🚀</tg-emoji>";102 var EMJ_HEADER_NEW = "<tg-emoji emoji-id='6082603117763894396'>✨</tg-emoji>";103 var EMJ_HEADER_SHIELD = "<tg-emoji emoji-id='6113743082358841933'>🔰</tg-emoji>";104 105 var MSG_EMJ_STORE = "<tg-emoji emoji-id='5866053971960929280'>🛒</tg-emoji>";106 var MSG_EMJ_FFID = "<tg-emoji emoji-id='5334890573281114250'>🎮</tg-emoji>";107 var MSG_EMJ_PROFILE = "<tg-emoji emoji-id='5260399854500191689'>🔰</tg-emoji>";108 var MSG_EMJ_ADDBAL = "<tg-emoji emoji-id='6147815702163102310'>✨</tg-emoji>";109 var MSG_EMJ_HISTORY = "<tg-emoji emoji-id='6113743082358841933'>🔰</tg-emoji>";110 var MSG_EMJ_LUDO = "<tg-emoji emoji-id='5371043439020353782'>🎲</tg-emoji>";111 var MSG_EMJ_TUTORIAL = "<tg-emoji emoji-id='5258077307985207053'>📹</tg-emoji>";112 var MSG_EMJ_PROOF = "<tg-emoji emoji-id='5330237710655306682'>✅</tg-emoji>";113 var MSG_EMJ_SUPPORT = "<tg-emoji emoji-id='5436113877181941026'>🔰</tg-emoji>";114 115 var EMJ_PREMIUM_MENU = "<tg-emoji emoji-id='5406745015365943482'>✨</tg-emoji>";116 var EMJ_YOUR_BALANCE = "<tg-emoji emoji-id='5231200819986047254'>💰</tg-emoji>";117 var EMJ_GET_STARTED = "<tg-emoji emoji-id='6057415823222379852'>👇</tg-emoji>";118 119 var welcomeMessage =120 "<tg-emoji emoji-id=\"6266967801580231067\">💎</tg-emoji> <tg-emoji emoji-id=\"5866053971960929280\">🏪</tg-emoji> <b>— DEV MODZ STORE —</b> <tg-emoji emoji-id=\"5866053971960929280\">🏪</tg-emoji> <tg-emoji emoji-id=\"6266967801580231067\">💎</tg-emoji>\n\n" +121 "<tg-emoji emoji-id=\"6102856637343600044\">🎉</tg-emoji> <b>Hello, " + ((user && user.first_name) ? user.first_name.toUpperCase() : "RESELLER") + "!</b>\n\n" +122 "<tg-emoji emoji-id=\"6080228009439141516\">💧</tg-emoji> <b>Genuine, limited-stock books. Instant delivery.</b>\n\n" +123 "<tg-emoji emoji-id=\"6147767796097884213\">📦</tg-emoji> Wide product catalog\n" +124 "<tg-emoji emoji-id=\"6215386799133433653\">🔒</tg-emoji> Instant delivery on payment\n" +125 "<tg-emoji emoji-id=\"6267068789146260253\">💰</tg-emoji> Multiple payment gateways\n" +126 "<tg-emoji emoji-id=\"6100170496077204999\">👑</tg-emoji> 24/7 admin support\n\n" +127 "<i>" + EMJ_YOUR_BALANCE + " Balance: ₹" + userBal + "</i>\n\n" +128 "<i>Tap any button below to begin:</i> " + EMJ_GET_STARTED;129 130 var multiColorKeyboard = [131 [{ text: "Shop Now", callback_data: "/buy_hack", style: "primary", icon_custom_emoji_id: "5866053971960929280" }],132 [133 { text: "Profile", callback_data: "/profile", style: "primary", icon_custom_emoji_id: "6145572393499762737" },134 { text: "Add Balance", callback_data: "/addfund", style: "success", icon_custom_emoji_id: "5409048419211682843" }135 ],136 [137 { text: "My Keys", callback_data: "/mykey", style: "primary", icon_custom_emoji_id: "6215386799133433653" },138 { text: "How to use", callback_data: "/how", style: "danger", icon_custom_emoji_id: "6192842983948162969" }139 ],140 [141 { text: "Download Files", callback_data: "/download_updates", style: "primary", icon_custom_emoji_id: "5208790878931415568" },142 { text: "Lucky Spin", callback_data: "/dailygift", style: "success", icon_custom_emoji_id: "6194922667242429131" }143 ],144 [145 { text: "Refer & Earn", callback_data: "/refer", style: "success", icon_custom_emoji_id: "5823654080584618403" },146 { text: "Support", callback_data: "/support", style: "danger", icon_custom_emoji_id: "6267129592998270736" }147 ],148 [{ text: "Payment Proofs", url: (Bot.getProperty("payment_proof_link") || "https://t.me/DevModz_Proof"), style: "success", icon_custom_emoji_id: "5330237710655306682" }]149 ];150 151 if (Bot.getProperty("reseller_system_enabled") && !Bot.getProperty("is_reseller_" + userId)) {152 multiColorKeyboard.push([153 { text: "Reseller Upgrade", callback_data: "/reseller_upgrade", style: "success", icon_custom_emoji_id: "6102856637343600044" }154 ]);155 }156 157 Api.sendMessage({158 chat_id: chat.chatid,159 text: welcomeMessage,160 parse_mode: "HTML",161 reply_markup: JSON.stringify({ inline_keyboard: multiColorKeyboard })162 });163 } catch (menuErr) {164 Bot.sendMessage("🛑 <b>Menu Send Error:</b> <code>" + menuErr.message + "</code>", { parse_mode: "HTML" });165 }166 }167 168 // [Auto-Track User] List me user track karne ke liye169 var trackedUsers = Bot.getProperty("all_users_list") || [];170 if (!trackedUsers.includes(userId)) {171 trackedUsers.push(userId);172 Bot.setProperty("all_users_list", trackedUsers, "json");173 174 // ==========================================175 // 🎁 REFER & EARN — capture referral on this user's very first /start176 // Deep link format: https://t.me/<bot>?start=ref<referrerTelegramId>177 // ==========================================178 try {179 var refParam = (typeof params !== "undefined" && params) ? String(params).trim() : "";180 if (refParam.toLowerCase().indexOf("ref") === 0) {181 var referrerId = refParam.substring(3).replace(/[^0-9]/g, "");182 if (referrerId && referrerId !== userId && !User.getProperty("referred_by")) {183 User.setProperty("referred_by", referrerId, "string");184 185 var refList = Bot.getProperty("referrals_of_" + referrerId) || [];186 if (refList.indexOf(userId) === -1) {187 refList.push(userId);188 Bot.setProperty("referrals_of_" + referrerId, refList, "json");189 }190 191 try {192 Api.sendMessage({193 chat_id: referrerId,194 text: "<blockquote><tg-emoji emoji-id='6102856637343600044'>🎉</tg-emoji> <b>New Referral!</b>\n\n" +195 "<tg-emoji emoji-id='5260399854500191689'>👤</tg-emoji> " + (user && user.first_name ? user.first_name : "A user") +196 " ne aapke link se bot join kiya hai.\n<i>Jab wo balance add ya purchase karega, aapko bonus milega!</i></blockquote>",197 parse_mode: "HTML"198 });199 } catch (e) {}200 }201 }202 } catch (e) {}203 }204 205 // 🛡️ [ANTI-DUPLICATE CHECK] Agar user already verified hai toh seedhe menu par bhejein206 // ✅ FIXED: pehle sirf exact "msgText === '/start'" ya "callbackData === '/trigger_contact_popup'"207 // match hone par hi menu bhejta tha. Kisi bhi button jo callback_data "/start" call karta tha208 // (jaise cancel-order ke baad "Back to Menu"), us case me match fail ho jaata tha aur user ko209 // koi response nahi milta tha. Ab ye check robust hai — jab tak ye genuinely ek contact-share210 // event nahi hai ya admin ek mid-flow step me nahi hai, verified user ko hamesha menu milega.211 var couponGenStep = User.getProperty("coupon_gen_step");212 var awaitingCouponFor = User.getProperty("awaiting_coupon_for");213 var isAlreadyVerified = Bot.getProperty("verified_" + userId);214 var isContactShareEvent = !!(request && request.contact && request.contact.user_id);215 var isAdminMidFlow = (userId === adminId && (currentStep || isAwaitingBroadcast || couponGenStep ||216 User.getProperty("addbal_step") || User.getProperty("addbalall_step") || User.getProperty("rembal_step") || User.getProperty("checkbal_step") ||217 User.getProperty("set_download_link_step") || User.getProperty("set_payment_upi_step") ||218 User.getProperty("set_payment_binance_step") ||219 User.getProperty("set_dailygift_price_step") || User.getProperty("set_refer_earn_step") ||220 User.getProperty("set_how_link_step") || User.getProperty("set_proof_link_step") || User.getProperty("set_support_link_step") || demoVideoStep));221 var binanceUtrStep = User.getProperty("binance_utr_step");222 var isUserMidFlow = !!awaitingCouponFor || !!binanceUtrStep;223 224 // ✅ NEW: User ne jo bhi "/start"/"/START"/"/Start" type kiya, menu aane ke225 // baad us typed command-message ko vanish (delete) kar do — chat clean rahe.226 if (msgText.toLowerCase() === "/start" && request && request.message_id) {227 try { Api.deleteMessage({ chat_id: chat.chatid, message_id: request.message_id }); } catch (delStartErr) {}228 }229 230 if (isAlreadyVerified && !isContactShareEvent && !isAdminMidFlow && !isUserMidFlow) {231 sendMainMenu();232 return;233 }234 235 // ==========================================236 // ⚡ MODULE: LIVE CONTACT RECEIVER & VERIFIER237 // ==========================================238 if (request && request.contact && request.contact.user_id) {239 if (String(request.contact.user_id) === userId) {240 241 var phoneNumber = request.contact.phone_number;242 var fullName = ((user.first_name || "") + " " + (user.last_name || "")).trim() || "No Name";243 var username = user.username ? "@" + user.username : "No Username";244 245 // Permanently mark user as verified globally246 Bot.setProperty("verified_" + userId, true, "boolean");247 Bot.setProperty("phone_" + userId, phoneNumber, "string");248 // ✅ NEW: Joined date save karo (Profile section me dikhane ke liye)249 if (!Bot.getProperty("joined_date_" + userId)) {250 Bot.setProperty("joined_date_" + userId, new Date().toLocaleDateString("en-IN", { day: "2-digit", month: "short", year: "numeric" }), "string");251 }252 253 // 1. USER DETAILS TO ADMIN254 var adminNotification = 255 "<blockquote><b>" + EMJ_CROWN + " NEW USER VERIFIED " + EMJ_VERIFIED_CHECK + "</b></blockquote>\n" +256 "<b>━━━━━━━━━━━━━━━━━━━━━━━━━━</b>\n" +257 "<b>👤 Name:</b> " + fullName + "\n" +258 "<b>🆔 User ID:</b> <code>" + userId + "</code>\n" +259 "<b>🌐 Username:</b> " + username + "\n" +260 "<b>📞 Number:</b> <code>" + phoneNumber + "</code>\n" +261 "<b>━━━━━━━━━━━━━━━━━━━━━━━━━━</b>";262 263 Api.sendMessage({264 chat_id: adminId,265 text: adminNotification,266 parse_mode: "HTML"267 });268 269 // 2. USER SUCCESS MESSAGE (With your exact requested custom emojis)270 var successMessage = 271 "<blockquote><b>" + EMJ_NEW_ACCESS + " ACCESS GRANTED " + EMJ_NEW_ACCESS + "</b></blockquote>\n" +272 "<b>" + EMJ_VERIFIED_CHECK + " Verification Successful!</b>\n" +273 "<b>━━━━━━━━━━━━━━━━━━━━━━━━━━</b>\n" +274 "<b>Welcome to DEV MODZ STORE PANEL </b>\n" +275 "<b>Your profile is now securely fully verified.</b>\n\n" +276 "<b>" + EMJ_ROCKET + " Store Loaded Successfully Use Now! " + EMJ_CROWN + "</b>";277 278 Api.sendMessage({279 chat_id: chat.chatid,280 text: successMessage,281 parse_mode: "HTML",282 reply_markup: JSON.stringify({ remove_keyboard: true }) 283 });284 285 // ✅ FIX: Direct inline menu instead of unreliable Bot.runCommand("/menu")286 sendMainMenu();287 return; 288 } else {289 Bot.sendMessage("❌ <b>Verification Failed!</b> Please share your own contact number only.", { parse_mode: "HTML" });290 return;291 }292 }293 294 // ==========================================295 // 📱 MODULE 0: VERIFICATION CALLBACK HANDLER296 // ==========================================297 if (msgText.toLowerCase() === "/start" || callbackData === "/trigger_contact_popup") {298 299 var verifyMessage = 300 "<blockquote><b>" + EMJ_ROCKET + " DEV MODZ STORE " + EMJ_RADAR + "</b></blockquote>\n" +301 "<b>" + EMJ_STAR + " Welcome, " + (user.first_name || "User") + " " + EMJ_DROP + "</b>\n" +302 "<b>━━━━━━━━━━━━━━━━━━━━━━━━━━</b>\n" +303 "<b>" + EMJ_RED_DOT + " VERIFICATION REQUIRED " + EMJ_CHECK + "</b>\n" +304 "<b>━━━━━━━━━━━━━━━━━━━━━━━━━━</b>\n" +305 "<b>" + EMJ_RADAR + " To start shopping, please verify your phone number.</b>\n\n" +306 "<b>" + EMJ_ROCKET + " Why we need this:</b>\n" +307 "<b> • Secure your purchases " + EMJ_CHECK + "</b>\n" +308 "<b> • Deliver your books to you " + EMJ_DROP + "</b>\n" +309 "<b> • Protect your account " + EMJ_STAR + "</b>\n\n" +310 "<b>" + EMJ_RED_DOT + " Tap the blue button below to verify your account:</b>";311 312 // Standard native reply keyboard because contact sharing works securely here313 var nativeKeyboard = {314 keyboard: [315 [{ text: "✅ Verify Account", request_contact: true }]316 ],317 resize_keyboard: true,318 one_time_keyboard: true319 };320 321 Api.sendMessage({322 chat_id: chat.chatid,323 text: verifyMessage,324 parse_mode: "HTML",325 reply_markup: JSON.stringify(nativeKeyboard)326 });327 return; 328 }329 330 // ==========================================331 // 📹 MODULE 0.5: ADMIN DEMO VIDEO UPLOAD332 // /set_demo_video now lets admin choose a product and directly upload a Telegram video.333 // ==========================================334 if (userId === adminId && demoVideoStep) {335 var incomingVideo = null;336 try {337 if (request) {338 if (request.message && request.message.video) incomingVideo = request.message.video;339 else if (request.video) incomingVideo = request.video;340 else if (request.update && request.update.message && request.update.message.video) incomingVideo = request.update.message.video;341 }342 } catch (videoDetectErr) {}343 344 if (demoVideoStep === "waiting_product_name") {345 if (!msgText) {346 Bot.sendMessage("⚠️ Product name text me bhejein.", {parse_mode:"HTML"});347 return;348 }349 var demoList = Bot.getProperty("stored_products") || [];350 var demoIdx = -1;351 for (var di=0; di<demoList.length; di++) {352 if (String(demoList[di].name || "").toLowerCase() === msgText.toLowerCase()) { demoIdx = di; break; }353 }354 if (demoIdx < 0) {355 Bot.sendMessage("❌ Product not found! Exact product name bhejein.", {parse_mode:"HTML"});356 return;357 }358 User.setProperty("demo_video_product_idx", demoIdx, "string");359 User.setProperty("demo_video_step", "waiting_video", "string");360 Bot.sendMessage("📹 <b>NOW UPLOAD DEMO VIDEO</b>\n\n📦 Product: <b>" + demoList[demoIdx].name + "</b>\n\n👇 Ab yahin <b>video upload/send</b> karein.\n✨ Video automatically is product ka Demo Video ban jayega.", {parse_mode:"HTML"});361 return;362 }363 364 if (demoVideoStep === "waiting_video") {365 if (!incomingVideo || !incomingVideo.file_id) {366 Bot.sendMessage("⚠️ Kripya <b>video</b> upload/send karein. Sirf text ya link nahi.", {parse_mode:"HTML"});367 return;368 }369 var demoIdx2 = Number(User.getProperty("demo_video_product_idx"));370 var demoList2 = Bot.getProperty("stored_products") || [];371 if (!demoList2[demoIdx2]) {372 User.setProperty("demo_video_step", null, "string");373 User.setProperty("demo_video_product_idx", null, "string");374 Bot.sendMessage("❌ Product session expire ho gayi. /set_demo_video dobara use karein.");375 return;376 }377 demoList2[demoIdx2].demo_video = incomingVideo.file_id;378 Bot.setProperty("stored_products", demoList2, "json");379 User.setProperty("demo_video_step", null, "string");380 User.setProperty("demo_video_product_idx", null, "string");381 Bot.sendMessage("<blockquote>✅ <b>DEMO VIDEO UPLOADED!</b></blockquote>\n\n📦 <b>Product:</b> " + demoList2[demoIdx2].name + "\n📹 <b>Status:</b> Demo video saved successfully.\n✨ Product page me Demo Video button automatically show hoga.", {parse_mode:"HTML"});382 return;383 }384 }385 386 // ==========================================387 // 📦 MODULE 1: STEP-BY-STEP PRODUCT CREATION (UPDATED FOR WEBSITE API ID)388 // ==========================================389 if (userId === adminId && currentStep) {390 if (currentStep === "waiting_for_name") {391 if (!msgText) {392 Bot.sendMessage("⚠️ Invalid name. Please type a valid Product Name:");393 return;394 }395 User.setProperty("temp_product_name", msgText, "string");396 User.setProperty("add_product_step", "waiting_for_emoji", "string");397 Bot.sendMessage("💎 Great! Now send the <b>Premium Emoji ID</b> for this product:", { parse_mode: "HTML" });398 return; 399 }400 401 if (currentStep === "waiting_for_emoji") {402 if (!msgText) {403 Bot.sendMessage("⚠️ Invalid Emoji ID. Please send a valid Telegram Premium Emoji ID:");404 return;405 }406 User.setProperty("temp_product_emoji", msgText, "string");407 User.setProperty("add_product_step", "waiting_for_pid", "string");408 Bot.sendMessage("🔑 Nice! Now please enter the <b>Website API Product ID (PID)</b> for this item:", { parse_mode: "HTML" });409 return;410 }411 412 if (currentStep === "waiting_for_pid") {413 if (!msgText) {414 Bot.sendMessage("⚠️ Invalid Product ID. Please type a valid Website PID:");415 return;416 }417 418 var savedName = User.getProperty("temp_product_name");419 var savedEmoji = User.getProperty("temp_product_emoji");420 var savedPid = msgText; // User ne jo PID abhi bheja421 User.setProperty("temp_product_pid", savedPid, "string");422 User.setProperty("add_product_step", "waiting_for_features", "string");423 Bot.sendMessage("✨ <b>Optional Product Features</b>\n\nFeatures comma-separated bhej sakte hain, jaise:\n<code>Anti Ban, Smooth Aim, Fast Update</code>\n\nAgar features nahi chahiye to <b>skip</b> likh dein.", { parse_mode: "HTML" });424 return;425 }426 427 if (currentStep === "waiting_for_features") {428 var savedName = User.getProperty("temp_product_name");429 var savedEmoji = User.getProperty("temp_product_emoji");430 var savedPid = User.getProperty("temp_product_pid");431 var savedFeatures = (msgText && msgText.toLowerCase() !== "skip") ? msgText.split(/[,\n]+/).map(function(f){return f.trim();}).filter(function(f){return !!f;}) : [];432 433 var productList = Bot.getProperty("stored_products") || [];434 if (!Array.isArray(productList)) { productList = []; }435 436 // Saving Name, Emoji and Website API ID (id) inside database object437 productList.push({ 438 name: savedName, 439 emoji: savedEmoji, 440 id: savedPid, 441 features: savedFeatures,442 plans: [] 443 });444 445 Bot.setProperty("stored_products", productList, "json");446 447 // Cleanup temporary states448 User.setProperty("add_product_step", null, "string");449 User.setProperty("temp_product_name", null, "string");450 User.setProperty("temp_product_emoji", null, "string");451 User.setProperty("temp_product_pid", null, "string");452 453 var successMsg = "✅ <b>Product Added Successfully!</b>\n\n" +454 "📦 <b>Name:</b> " + savedName + "\n" +455 "💎 <b>Emoji ID:</b> <code>" + savedEmoji + "</code>\n" +456 "🔑 <b>API Product ID (PID):</b> <code>" + savedPid + "</code>\n" +457 "✨ <b>Features:</b> " + (savedFeatures.length ? savedFeatures.join(", ") : "<i>Not set</i>") + "\n\n" +458 "<i>Aap is product ke andar plans baad me configure kar sakte hain. Automatically website se integration ho gaya hai!</i>";459 460 Bot.sendMessage(successMsg, { parse_mode: "HTML" });461 return; 462 }463 }464 465 // ==========================================466 // 🟡 MODULE 4b: ADMIN — BINANCE PAYMENT CONFIG WIZARD467 // Step 1: QR (photo OR image URL — whichever the admin sends, both work).468 // Step 2: Binance Pay ID. Step 3: USDT Address. Step 4: USD rate.469 // ==========================================470 if (userId === adminId) {471 var setPaymentBinanceStep = User.getProperty("set_payment_binance_step");472 473 // ✅ ROBUST photo detection — different update shapes have shown up in this474 // environment, so we check every place Telegram (or this platform) might475 // put the photo array before giving up.476 var incomingPhotoArr = null;477 try {478 if (request) {479 if (request.message && request.message.photo && request.message.photo.length) {480 incomingPhotoArr = request.message.photo;481 } else if (request.photo && request.photo.length) {482 incomingPhotoArr = request.photo;483 } else if (request.update && request.update.message && request.update.message.photo && request.update.message.photo.length) {484 incomingPhotoArr = request.update.message.photo;485 }486 }487 } catch (photoDetectErr) {}488 489 if (setPaymentBinanceStep === "waiting_qr") {490 var savedQr = false;491 492 if (incomingPhotoArr) {493 var largestPhoto = incomingPhotoArr[incomingPhotoArr.length - 1];494 var qrFileId = largestPhoto.file_id;495 Bot.setProperty("binance_qr_file_id", qrFileId, "string");496 Bot.setProperty("binance_qr_url", null, "string");497 savedQr = true;498 } else if (msgText && (msgText.trim().indexOf("http://") === 0 || msgText.trim().indexOf("https://") === 0)) {499 Bot.setProperty("binance_qr_url", msgText.trim(), "string");500 Bot.setProperty("binance_qr_file_id", null, "string");501 savedQr = true;502 }503 504 if (savedQr) {505 User.setProperty("set_payment_binance_step", "waiting_binance_id", "string");506 Bot.sendMessage(507 "✅ <b>QR Saved!</b>\n\n" +508 "<i>Step 2/4 —</i> Ab apna <b>Binance Pay ID</b> bhejein (jaise: <code>839548203</code>):",509 { parse_mode: "HTML" }510 );511 return;512 }513 514 // ❌ Neither a photo nor a URL was recognised — don't silently drop it.515 Bot.sendMessage(516 "⚠️ QR receive nahi hua. Kripya QR ko ya toh <b>photo/image</b> ke roop me bhejein, ya QR image ka <b>direct URL link</b> (https://...) paste karein.",517 { parse_mode: "HTML" }518 );519 return;520 }521 522 if (setPaymentBinanceStep === "waiting_binance_id" && msgText) {523 Bot.setProperty("binance_pay_id", msgText.trim(), "string");524 User.setProperty("set_payment_binance_step", "waiting_usdt_address", "string");525 Bot.sendMessage(526 "✅ <b>Binance Pay ID Saved!</b>\n\n" +527 "<i>Step 3/4 —</i> Ab apna <b>USDT Address</b> bhejein (jaise: <code>TNvySU5Wk2mBAJNpBLGwvLk9pk4EgkeLXt</code>):",528 { parse_mode: "HTML" }529 );530 return;531 }532 533 if (setPaymentBinanceStep === "waiting_usdt_address" && msgText) {534 Bot.setProperty("binance_usdt_address", msgText.trim(), "string");535 User.setProperty("set_payment_binance_step", "waiting_usd_rate", "string");536 var rateNow = Bot.getProperty("usd_rate") || 91;537 Bot.sendMessage(538 "✅ <b>USDT Address Saved!</b>\n\n" +539 "<i>Step 4/4 —</i> Ab USD conversion rate bhejein (₹ kitne ka $1, jaise <code>91</code>).\n" +540 "<i>Current:</i> <code>₹" + rateNow + " = $1</code>\n" +541 "<i>Same rakhna ho to bhi number type karke bhej dein.</i>",542 { parse_mode: "HTML" }543 );544 return;545 }546 547 if (setPaymentBinanceStep === "waiting_usd_rate" && msgText) {548 var finalRate = parseFloat(msgText.trim());549 if (isNaN(finalRate) || finalRate <= 0) {550 Bot.sendMessage("❌ Invalid rate! Ek valid positive number bhejein, jaise 91.", { parse_mode: "HTML" });551 return;552 }553 Bot.setProperty("usd_rate", finalRate, "string");554 User.setProperty("set_payment_binance_step", null, "string");555 556 var qrStatusMsg = Bot.getProperty("binance_qr_file_id") || Bot.getProperty("binance_qr_url") ? "✅ Set" : "❌ Not set";557 Bot.sendMessage(558 "<blockquote>🟡 <b>BINANCE PAY CONFIG COMPLETE!</b></blockquote>\n\n" +559 "🖼 <b>QR:</b> " + qrStatusMsg + "\n" +560 "🆔 <b>Binance Pay ID:</b> <code>" + Bot.getProperty("binance_pay_id") + "</code>\n" +561 "💳 <b>USDT Address:</b> <code>" + Bot.getProperty("binance_usdt_address") + "</code>\n" +562 "💱 <b>USD Rate:</b> <code>₹" + finalRate + " = $1</code>\n\n" +563 "<i>Binance Pay ab live hai!</i>",564 { parse_mode: "HTML" }565 );566 return;567 }568 }569 570 // ==========================================571 // 🟡 MODULE 4c: USER — BINANCE PROOF SUBMISSION (screenshot only)572 // ==========================================573 if (binanceUtrStep === "awaiting_screenshot") {574 var ssPhotoArr = null;575 try {576 if (request) {577 if (request.message && request.message.photo && request.message.photo.length) {578 ssPhotoArr = request.message.photo;579 } else if (request.photo && request.photo.length) {580 ssPhotoArr = request.photo;581 } else if (request.update && request.update.message && request.update.message.photo && request.update.message.photo.length) {582 ssPhotoArr = request.update.message.photo;583 }584 }585 } catch (ssPhotoDetectErr) {}586 587 if (!ssPhotoArr) {588 Bot.sendMessage("⚠️ Kripya payment screenshot ek <b>image/photo</b> ke roop me bhejein.", { parse_mode: "HTML" });589 return;590 }591 592 var ssLargest = ssPhotoArr[ssPhotoArr.length - 1];593 var ssFileId = ssLargest.file_id;594 595 var subInr = User.getProperty("binance_pending_amount_inr");596 var subUsd = User.getProperty("binance_pending_amount_usd");597 var adminSupportId = Bot.getProperty("owner_id") || "7839151435";598 599 var fullNameSub = ((user.first_name || "") + " " + (user.last_name || "")).trim() || "No Name";600 var usernameSub = user.username ? "@" + user.username : "No Username";601 602 var adminCaption =603 "<blockquote><tg-emoji emoji-id='6312263493051489212'>🟡</tg-emoji> <b>NEW BINANCE PAY SUBMISSION</b></blockquote>\n" +604 "👤 <b>User:</b> <a href='tg://user?id=" + userId + "'>" + fullNameSub + "</a> (<code>" + userId + "</code>)\n" +605 "🌐 <b>Username:</b> " + usernameSub + "\n" +606 "💰 <b>Amount:</b> $<code>" + subUsd + "</code> <i>(₹" + subInr + ")</i>\n\n" +607 "<i>Verify the screenshot, then credit balance with the button below or:</i>\n<code>/addbal " + userId + "|" + subInr + "</code>";608 609 try {610 Api.sendPhoto({611 chat_id: adminSupportId,612 photo: ssFileId,613 caption: adminCaption,614 parse_mode: "HTML",615 reply_markup: JSON.stringify({616 inline_keyboard: [[617 { text: "✅ Approve & Credit ₹" + subInr, callback_data: "/addbal_binance_approve " + userId + " " + subInr, style: "success" }618 ]]619 })620 });621 } catch (notifyAdminErr) {}622 623 User.setProperty("binance_utr_step", null, "string");624 User.setProperty("binance_pending_amount_inr", null, "string");625 User.setProperty("binance_pending_amount_usd", null, "string");626 627 Bot.sendMessage(628 "<blockquote><tg-emoji emoji-id='6147936236125298267'>⏳</tg-emoji> <b>WAIT FOR ADMIN CHECK</b></blockquote>\n\n" +629 "<i>Aapka payment screenshot admin ko bhej diya gaya hai. Admin manually verify karke aapka balance add karega — thodi der wait karein!</i>",630 {631 parse_mode: "HTML",632 reply_markup: JSON.stringify({ inline_keyboard: [[{ text: "Back to Menu", callback_data: "/back", style: "primary" }]] })633 }634 );635 return;636 }637 638 // ==========================================639 // 💵 MODULE 5: ADMIN BALANCE TOOLS (Add Bal / Remove Bal / Check Bal640 // button-click continuation — fixes buttons that previously just641 // showed a "Wrong Format" error with no way to actually complete it)642 // ==========================================643 if (userId === adminId) {644 var addbalStep = User.getProperty("addbal_step");645 var addbalAllStep = User.getProperty("addbalall_step");646 var rembalStep = User.getProperty("rembal_step");647 var checkbalStep = User.getProperty("checkbal_step");648 649 if (addbalStep === "waiting_input" && msgText) {650 User.setProperty("addbal_step", null, "string");651 652 // ✅ FIXED: pehle sirf Bot.run(...) se /addbal ko dobara call kiya jaata tha —653 // agar us re-run me "message" text sahi se forward nahi hota tha (jo wildcard654 // "*" -> /start delegation ke through hone par silently fail ho sakta tha),655 // toh balance kabhi credit hi nahi hota tha aur admin ko koi error bhi nahi656 // dikhta tha. Ab balance yahin, isi jagah, seedha add hota hai — kisi doosre657 // command re-run par depend nahi karta. Bot.run wala call sirf backup ke658 // taur par neeche rakha hai.659 var addbalData = msgText.trim();660 661 if (addbalData.indexOf("|") === -1) {662 Bot.sendMessage("❌ *Invalid Format! Use:* `user_id|amount`", { parse_mode: "Markdown" });663 return;664 }665 666 var addbalParts = addbalData.split("|");667 var addbalTargetId = addbalParts[0].trim();668 var addbalAmount = parseFloat(addbalParts[1].trim());669 670 if (!addbalTargetId || isNaN(addbalAmount) || addbalAmount <= 0) {671 Bot.sendMessage("❌ *Invalid Format! Use:* `user_id|amount`", { parse_mode: "Markdown" });672 return;673 }674 675 try {676 // Primary wallet resource (same store the rest of the bot reads for purchases)677 try {678 Libs.ResourcesLib.anotherUserRes("balance", addbalTargetId).add(addbalAmount);679 } catch (resErr) {}680 681 Bot.sendMessage("✅ Success! Added " + addbalAmount + " to user " + addbalTargetId, { parse_mode: "HTML" });682 683 try {684 Api.sendMessage({685 chat_id: addbalTargetId,686 text: "<blockquote>" +687 "<tg-emoji emoji-id='6192822213486321961'>🗣</tg-emoji> Admin Added: " + addbalAmount + "\n" +688 "<tg-emoji emoji-id='6266967801580231067'>💎</tg-emoji> Balance Credited!\n" +689 "<tg-emoji emoji-id='6267068789146260253'>💰</tg-emoji> Wallet Updated\n" +690 "<tg-emoji emoji-id='5866053971960929280'>🛒</tg-emoji> /start TO SHOP NOW" +691 "</blockquote>",692 parse_mode: "HTML"693 });694 } catch (notifyErr) {}695 } catch (addbalErr) {696 Bot.sendMessage("⚠️ *Error:* " + addbalErr.message, { parse_mode: "Markdown" });697 }698 return;699 }700 if (addbalAllStep === "waiting_input" && msgText) {701 User.setProperty("addbalall_step", null, "string");702 Bot.run({ command: "/addbal_all", options: { message: "/addbal_all " + msgText.trim() } });703 return;704 }705 if (rembalStep === "waiting_input" && msgText) {706 User.setProperty("rembal_step", null, "string");707 Bot.run({ command: "/rembal", options: { message: "/rembal " + msgText.trim() } });708 return;709 }710 if (checkbalStep === "waiting_input" && msgText) {711 User.setProperty("checkbal_step", null, "string");712 Bot.run({ command: "/checkbal", options: { params: msgText.trim() } });713 return;714 }715 716 var setDownloadLinkStep = User.getProperty("set_download_link_step");717 if (setDownloadLinkStep === "waiting_input" && msgText) {718 User.setProperty("set_download_link_step", null, "string");719 Bot.run({ command: "/set_update_link", options: { params: msgText.trim() } });720 return;721 }722 723 var setPaymentUpiStep = User.getProperty("set_payment_upi_step");724 if (setPaymentUpiStep === "waiting_input" && msgText) {725 User.setProperty("set_payment_upi_step", null, "string");726 Bot.run({ command: "/set_payment_upi", options: { params: msgText.trim() } });727 return;728 }729 730 var setDailyGiftPriceStep = User.getProperty("set_dailygift_price_step");731 if (setDailyGiftPriceStep === "waiting_input" && msgText) {732 User.setProperty("set_dailygift_price_step", null, "string");733 Bot.run({ command: "/set_dailygift_price", options: { params: msgText.trim() } });734 return;735 }736 737 var setReferEarnStep = User.getProperty("set_refer_earn_step");738 if (setReferEarnStep === "waiting_input" && msgText) {739 User.setProperty("set_refer_earn_step", null, "string");740 Bot.run({ command: "/set_refer_earn", options: { params: msgText.trim() } });741 return;742 }743 744 var setHowLinkStep = User.getProperty("set_how_link_step");745 if (setHowLinkStep === "waiting_input" && msgText) {746 User.setProperty("set_how_link_step", null, "string");747 Bot.run({ command: "/set_how_link", options: { params: msgText.trim() } });748 return;749 }750 751 var setProofLinkStep = User.getProperty("set_proof_link_step");752 if (setProofLinkStep === "waiting_input" && msgText) {753 User.setProperty("set_proof_link_step", null, "string");754 Bot.run({ command: "/set_proof_link", options: { params: msgText.trim() } });755 return;756 }757 758 var setSupportLinkStep = User.getProperty("set_support_link_step");759 if (setSupportLinkStep === "waiting_input" && msgText) {760 User.setProperty("set_support_link_step", null, "string");761 Bot.run({ command: "/set_support_link", options: { params: msgText.trim() } });762 return;763 }764 }765 766 // ==========================================767 // 🎟 MODULE 3: ADMIN COUPON GENERATOR (step-by-step wizard)768 // ==========================================769 if (userId === adminId && couponGenStep) {770 771 if (couponGenStep === "code") {772 if (!msgText) { Bot.sendMessage("⚠️ Kripya ek valid coupon code bhejein."); return; }773 var couponCodeUpper = msgText.trim().toUpperCase();774 if (Bot.getProperty("coupon_" + couponCodeUpper)) {775 Bot.sendMessage("❌ Ye coupon code pehle se exist karta hai! Doosra naam try karein.");776 return;777 }778 User.setProperty("coupon_gen_code", couponCodeUpper, "string");779 User.setProperty("coupon_gen_step", "maxclaims", "string");780 Bot.sendMessage("<tg-emoji emoji-id='6091571559233755994'>👥</tg-emoji> <b>Kitne users ye coupon use (claim) kar sakte hain?</b>\n<i>Sirf number bhejein, jaise: 50</i>", { parse_mode: "HTML" });781 return;782 }783 784 if (couponGenStep === "maxclaims") {785 var maxClaimsVal = parseInt(msgText.trim());786 if (isNaN(maxClaimsVal) || maxClaimsVal <= 0) { Bot.sendMessage("❌ Kripya ek valid number bhejein (jaise 50)."); return; }787 User.setProperty("coupon_gen_maxclaims", maxClaimsVal, "number");788 User.setProperty("coupon_gen_step", "discount", "string");789 Bot.sendMessage("<tg-emoji emoji-id='6093591495237967001'>💸</tg-emoji> <b>Kitne % discount dena hai?</b>\n<i>Sirf number bhejein (1-100), jaise: 10</i>", { parse_mode: "HTML" });790 return;791 }792 793 if (couponGenStep === "discount") {794 var discountVal = parseFloat(msgText.trim());795 if (isNaN(discountVal) || discountVal <= 0 || discountVal > 100) { Bot.sendMessage("❌ Discount 1 se 100 ke beech honi chahiye."); return; }796 User.setProperty("coupon_gen_discount", discountVal, "number");797 User.setProperty("coupon_gen_step", "scope", "string");798 Bot.sendMessage(799 "<tg-emoji emoji-id='6093677128295914531'>🎯</tg-emoji> <b>Scope batayein:</b>\n\n" +800 "• Sabhi products/plans ke liye: <code>global</code> likh kar bhejein\n" +801 "• Sirf ek specific product+plan ke liye: <code>Product Name | Duration</code>\n" +802 " <i>Example:</i> <code>Atomic Habits (Book) | 1d</code>",803 { parse_mode: "HTML" }804 );805 return;806 }807 808 if (couponGenStep === "scope") {809 var scopeInput = msgText.trim();810 var couponData = {811 code: User.getProperty("coupon_gen_code"),812 maxClaims: User.getProperty("coupon_gen_maxclaims"),813 discountPercent: User.getProperty("coupon_gen_discount"),814 claimedBy: [],815 isPaused: false,816 createdAt: new Date().toLocaleDateString()817 };818 819 if (scopeInput.toLowerCase() === "global") {820 couponData.scope = "global";821 } else if (scopeInput.indexOf("|") > -1) {822 var scopeParts = scopeInput.split("|");823 couponData.scope = "specific";824 couponData.productName = scopeParts[0].trim();825 couponData.duration = scopeParts[1].trim();826 } else {827 Bot.sendMessage("❌ Galat format! 'global' likhein ya 'Product Name | Duration' format me bhejein.");828 return;829 }830 831 Bot.setProperty("coupon_" + couponData.code, couponData, "json");832 833 // ✅ NEW: master list me bhi add karo, taaki /coupons admin command sabko list kar sake834 var couponList = Bot.getProperty("coupon_list") || [];835 if (couponList.indexOf(couponData.code) === -1) {836 couponList.push(couponData.code);837 Bot.setProperty("coupon_list", couponList, "json");838 }839 840 // Cleanup wizard state841 User.setProperty("coupon_gen_step", null, "string");842 User.setProperty("coupon_gen_code", null, "string");843 User.setProperty("coupon_gen_maxclaims", null, "number");844 User.setProperty("coupon_gen_discount", null, "number");845 846 Bot.sendMessage(847 "<blockquote>🎟 <b>COUPON CREATED SUCCESSFULLY!</b></blockquote>\n\n" +848 "🏷 <b>Code:</b> <code>" + couponData.code + "</code>\n" +849 "👥 <b>Max Claims:</b> " + couponData.maxClaims + "\n" +850 "💸 <b>Discount:</b> " + couponData.discountPercent + "%\n" +851 "🎯 <b>Scope:</b> " + (couponData.scope === "global" ? "🌍 Global (All Plans)" : "📦 " + couponData.productName + " (" + couponData.duration + ")"),852 { parse_mode: "HTML" }853 );854 return;855 }856 }857 858 // ==========================================859 // 🎟 MODULE 4: USER — APPLY COUPON CODE TEXT ENTRY860 // ==========================================861 if (awaitingCouponFor) {862 var enteredCode = msgText.trim().toUpperCase();863 var couponRec = Bot.getProperty("coupon_" + enteredCode);864 865 User.setProperty("awaiting_coupon_for", null, "string");866 867 if (!couponRec) {868 Bot.sendMessage("❌ <b>Invalid Coupon Code!</b>", { parse_mode: "HTML" });869 return;870 }871 if (couponRec.isPaused) {872 Bot.sendMessage("⏸ Ye coupon abhi paused hai, thodi der baad try karein.", { parse_mode: "HTML" });873 return;874 }875 if (!Array.isArray(couponRec.claimedBy)) { couponRec.claimedBy = []; }876 if (couponRec.claimedBy.indexOf(userId) > -1) {877 Bot.sendMessage("⚠️ Aapne ye coupon already use kar liya hai!", { parse_mode: "HTML" });878 return;879 }880 if (couponRec.claimedBy.length >= couponRec.maxClaims) {881 Bot.sendMessage("❌ Is coupon ki claim limit khatam ho gayi hai!", { parse_mode: "HTML" });882 return;883 }884 885 var couponTargetParts = awaitingCouponFor.split(" ");886 var cTargetProdIdx = couponTargetParts[0];887 var cTargetPlanIdx = couponTargetParts[1];888 889 if (couponRec.scope === "specific") {890 var cProductList = Bot.getProperty("stored_products") || [];891 var cProduct = cProductList[Number(cTargetProdIdx)];892 var cPlan = cProduct ? cProduct.plans[Number(cTargetPlanIdx)] : null;893 var cDurationDisplay = cPlan ? (cPlan.durationDisplay || (cPlan.days + " Days")) : "";894 var matchesProduct = cProduct && cProduct.name.trim().toLowerCase() === couponRec.productName.trim().toLowerCase();895 var matchesDuration = cDurationDisplay.toLowerCase().indexOf(String(couponRec.duration).toLowerCase().replace(/[^a-z0-9]/g, "")) > -1 ||896 String(couponRec.duration).replace(/[^0-9]/g, "") === String(cPlan ? cPlan.days : "");897 if (!matchesProduct) {898 Bot.sendMessage("❌ Ye coupon is product ke liye valid nahi hai!", { parse_mode: "HTML" });899 return;900 }901 }902 903 // ✅ Valid — apply and mark claimed904 couponRec.claimedBy.push(userId);905 Bot.setProperty("coupon_" + enteredCode, couponRec, "json");906 User.setProperty("applied_coupon_" + cTargetProdIdx + "_" + cTargetPlanIdx, enteredCode, "string");907 908 Bot.sendMessage("🎉 <b>Coupon Applied!</b> -" + couponRec.discountPercent + "% discount added.", { parse_mode: "HTML" });909 910 Bot.run({911 command: "buyitem",912 options: { params: cTargetProdIdx + " " + cTargetPlanIdx }913 });914 return;915 }916 917 // ==========================================918 // 📢 MODULE 2: PREMIUM BROADCAST SYSTEM919 // ==========================================920 if (userId === adminId && isAwaitingBroadcast) {921 User.setProperty("awaiting_broadcast_data", false, "boolean");922 var userList = Bot.getProperty("all_users_list") || [];923 924 if (userList.length === 0) {925 Bot.sendMessage("❌ Bot mein abhi tak koi bhi user registered nahi hai.");926 return;927 }928 929 var targetMessageId = null;930 if (request) {931 if (request.message_id) { targetMessageId = request.message_id; }932 else if (request.message && request.message.message_id) { targetMessageId = request.message.message_id; }933 }934 935 if (!targetMessageId) {936 Bot.sendMessage("❌ Unable to fetch message ID for broadcast.");937 return;938 }939 940 Bot.sendMessage("⏳ Sending premium broadcast to " + userList.length + " users... Please wait.");941 942 // ✅ FIXED: pehle ek bhi blocked/invalid user Api.copyMessage() ko throw karwa deta943 // tha, jo bahar wale catch() tak chala jaata tha — isse loop beech me hi ruk jaata944 // tha (baaki users ko broadcast nahi jaata tha) aur admin ko scary "Error in handling"945 // dikhta tha, jabki zyada tar users ko message mil chuka hota tha. Ab har send apne946 // try/catch me hai, aur end me accurate success/fail count milega.947 var sentCount = 0;948 var failedCount = 0;949 for (var i = 0; i < userList.length; i++) {950 try {951 Api.copyMessage({952 chat_id: String(userList[i]),953 from_chat_id: adminId,954 message_id: Number(targetMessageId)955 });956 sentCount++;957 } catch (perUserErr) {958 failedCount++;959 }960 }961 Bot.sendMessage(962 "✅ <b>Broadcast Complete!</b>\n" +963 "📤 <b>Sent:</b> " + sentCount + " users\n" +964 (failedCount > 0 ? "⚠️ <b>Failed/Blocked:</b> " + failedCount + " users" : "🎉 <b>No failures!</b>"),965 { parse_mode: "HTML" }966 );967 }968 969} catch (err) {970 Bot.sendMessage("Error in handling: " + err.message);971}