indrajitghosh20006/HgfhhuybotPublic · Bot Template

ProfileTelegram

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

commands/_start.js

javascript · 971 lines

Raw
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}