mansuriamaan803/SANJEEVFFSTORE_botPublic · Bot Template
AIThis bot is a commerce platform for selling digital products, primarily focused on FreeFire accounts and related services. It provides admin tools for managing products, categories, stock, reseller roles, and a balance system for user payments. Users can browse products, apply coupons, and check their balance through an interactive interface with premium emojis and inline keyboards.
Commercecommercestoreproductsresellerbalancecoupon
102 commands0 envUpdated 12d agoCreated Aug 26, 2026
commands/_start.js
javascript · 585 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") || "8963001413";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 isAwaitingBroadcast = User.getProperty("awaiting_broadcast_data");72 73 // 🎨 PREMIUM CUSTOM EMOJIS DEFINITION (Fixed with escaped double quotes)74 var EMJ_VERIFIED_CHECK = "<tg-emoji emoji-id=\"5875465628285931233\">✔️</tg-emoji>";75 var EMJ_CROWN = "<tg-emoji emoji-id=\"6311975081702597046\">👑</tg-emoji>";76 var EMJ_DROP = "<tg-emoji emoji-id=\"6080228009439141516\">💧</tg-emoji>";77 var EMJ_CHECK = "<tg-emoji emoji-id=\"6080214566191505147\">✅</tg-emoji>";78 var EMJ_ROCKET = "<tg-emoji emoji-id=\"6091571559233755994\">🚀</tg-emoji>";79 var EMJ_RADAR = "<tg-emoji emoji-id=\"6093591495237967001\">📡</tg-emoji>";80 var EMJ_STAR = "<tg-emoji emoji-id=\"6093677128295914531\">✨</tg-emoji>";81 var EMJ_RED_DOT = "<tg-emoji emoji-id=\"6093854128193152827\">🔴</tg-emoji>";82 83 // Access Granted ke liye aapka requested special premium custom emoji84 var EMJ_NEW_ACCESS = "<tg-emoji emoji-id=\"5875465628285931233\">✔️</tg-emoji>";85 86 // ==========================================87 // 🏠 HELPER: DIRECTLY SEND MAIN SHOP MENU88 // (Bot.runCommand("/menu") is unreliable in BJS -> inline it instead)89 // ==========================================90 function sendMainMenu() {91 try {92 // ✅ FIXED: ab same wallet store se read hoga jo purchase flows use karte hain93 // (Libs.ResourcesLib "balance" resource + admin bonus balance), taaki balance sab jagah same dikhe.94 var userBal = (function() {95 var resBal = 0;96 try { resBal = Number(Libs.ResourcesLib.userRes("balance").value()) || 0; } catch (e) {}97 var bonusBal = Number(Bot.getProperty("balance" + userId) || 0);98 return (resBal + bonusBal).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>— Aman Panel 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 [{ text: "Payment Proofs", url: "https://t.me/GaluModz_Proof", style: "success", icon_custom_emoji_id: "5330237710655306682" }],141 [{ text: "Support", callback_data: "/support", style: "danger", icon_custom_emoji_id: "6267129592998270736" }]142 ];143 144 if (Bot.getProperty("reseller_system_enabled") && !Bot.getProperty("is_reseller_" + userId)) {145 multiColorKeyboard.push([146 { text: "Reseller Upgrade", callback_data: "/reseller_upgrade", style: "success", icon_custom_emoji_id: "6102856637343600044" }147 ]);148 }149 150 Api.sendMessage({151 chat_id: chat.chatid,152 text: welcomeMessage,153 parse_mode: "HTML",154 reply_markup: JSON.stringify({ inline_keyboard: multiColorKeyboard })155 });156 } catch (menuErr) {157 Bot.sendMessage("🛑 <b>Menu Send Error:</b> <code>" + menuErr.message + "</code>", { parse_mode: "HTML" });158 }159 }160 161 // [Auto-Track User] List me user track karne ke liye162 var trackedUsers = Bot.getProperty("all_users_list") || [];163 if (!trackedUsers.includes(userId)) {164 trackedUsers.push(userId);165 Bot.setProperty("all_users_list", trackedUsers, "json");166 }167 168 // 🛡️ [ANTI-DUPLICATE CHECK] Agar user already verified hai toh seedhe menu par bhejein169 // ✅ FIXED: pehle sirf exact "msgText === '/start'" ya "callbackData === '/trigger_contact_popup'"170 // match hone par hi menu bhejta tha. Kisi bhi button jo callback_data "/start" call karta tha171 // (jaise cancel-order ke baad "Back to Menu"), us case me match fail ho jaata tha aur user ko172 // koi response nahi milta tha. Ab ye check robust hai — jab tak ye genuinely ek contact-share173 // event nahi hai ya admin ek mid-flow step me nahi hai, verified user ko hamesha menu milega.174 var couponGenStep = User.getProperty("coupon_gen_step");175 var awaitingCouponFor = User.getProperty("awaiting_coupon_for");176 var isAlreadyVerified = Bot.getProperty("verified_" + userId);177 var isContactShareEvent = !!(request && request.contact && request.contact.user_id);178 var isAdminMidFlow = (userId === adminId && (currentStep || isAwaitingBroadcast || couponGenStep ||179 User.getProperty("addbal_step") || User.getProperty("rembal_step") || User.getProperty("checkbal_step")));180 var isUserMidFlow = !!awaitingCouponFor;181 182 // ✅ NEW: User ne jo bhi "/start"/"/START"/"/Start" type kiya, menu aane ke183 // baad us typed command-message ko vanish (delete) kar do — chat clean rahe.184 if (msgText.toLowerCase() === "/start" && request && request.message_id) {185 try { Api.deleteMessage({ chat_id: chat.chatid, message_id: request.message_id }); } catch (delStartErr) {}186 }187 188 if (isAlreadyVerified && !isContactShareEvent && !isAdminMidFlow && !isUserMidFlow) {189 sendMainMenu();190 return;191 }192 193 // ==========================================194 // ⚡ MODULE: LIVE CONTACT RECEIVER & VERIFIER195 // ==========================================196 if (request && request.contact && request.contact.user_id) {197 if (String(request.contact.user_id) === userId) {198 199 var phoneNumber = request.contact.phone_number;200 var fullName = ((user.first_name || "") + " " + (user.last_name || "")).trim() || "No Name";201 var username = user.username ? "@" + user.username : "No Username";202 203 // Permanently mark user as verified globally204 Bot.setProperty("verified_" + userId, true, "boolean");205 Bot.setProperty("phone_" + userId, phoneNumber, "string");206 // ✅ NEW: Joined date save karo (Profile section me dikhane ke liye)207 if (!Bot.getProperty("joined_date_" + userId)) {208 Bot.setProperty("joined_date_" + userId, new Date().toLocaleDateString("en-IN", { day: "2-digit", month: "short", year: "numeric" }), "string");209 }210 211 // 1. USER DETAILS TO ADMIN212 var adminNotification = 213 "<blockquote><b>" + EMJ_CROWN + " NEW USER VERIFIED " + EMJ_VERIFIED_CHECK + "</b></blockquote>\n" +214 "<b>━━━━━━━━━━━━━━━━━━━━━━━━━━</b>\n" +215 "<b>👤 Name:</b> " + fullName + "\n" +216 "<b>🆔 User ID:</b> <code>" + userId + "</code>\n" +217 "<b>🌐 Username:</b> " + username + "\n" +218 "<b>📞 Number:</b> <code>" + phoneNumber + "</code>\n" +219 "<b>━━━━━━━━━━━━━━━━━━━━━━━━━━</b>";220 221 Api.sendMessage({222 chat_id: adminId,223 text: adminNotification,224 parse_mode: "HTML"225 });226 227 // 2. USER SUCCESS MESSAGE (With your exact requested custom emojis)228 var successMessage = 229 "<blockquote><b>" + EMJ_NEW_ACCESS + " ACCESS GRANTED " + EMJ_NEW_ACCESS + "</b></blockquote>\n" +230 "<b>" + EMJ_VERIFIED_CHECK + " Verification Successful!</b>\n" +231 "<b>━━━━━━━━━━━━━━━━━━━━━━━━━━</b>\n" +232 "<b>Welcome to Aman Panel Store PANEL </b>\n" +233 "<b>Your profile is now securely fully verified.</b>\n\n" +234 "<b>" + EMJ_ROCKET + " Store Loaded Successfully Use Now! " + EMJ_CROWN + "</b>";235 236 Api.sendMessage({237 chat_id: chat.chatid,238 text: successMessage,239 parse_mode: "HTML",240 reply_markup: JSON.stringify({ remove_keyboard: true }) 241 });242 243 // ✅ FIX: Direct inline menu instead of unreliable Bot.runCommand("/menu")244 sendMainMenu();245 return; 246 } else {247 Bot.sendMessage("❌ <b>Verification Failed!</b> Please share your own contact number only.", { parse_mode: "HTML" });248 return;249 }250 }251 252 // ==========================================253 // 📱 MODULE 0: VERIFICATION CALLBACK HANDLER254 // ==========================================255 if (msgText.toLowerCase() === "/start" || callbackData === "/trigger_contact_popup") {256 257 var verifyMessage = 258 "<blockquote><b>" + EMJ_ROCKET + " Aman Panel Store " + EMJ_RADAR + "</b></blockquote>\n" +259 "<b>" + EMJ_STAR + " Welcome, " + (user.first_name || "User") + " " + EMJ_DROP + "</b>\n" +260 "<b>━━━━━━━━━━━━━━━━━━━━━━━━━━</b>\n" +261 "<b>" + EMJ_RED_DOT + " VERIFICATION REQUIRED " + EMJ_CHECK + "</b>\n" +262 "<b>━━━━━━━━━━━━━━━━━━━━━━━━━━</b>\n" +263 "<b>" + EMJ_RADAR + " To start shopping, please verify your phone number.</b>\n\n" +264 "<b>" + EMJ_ROCKET + " Why we need this:</b>\n" +265 "<b> • Secure your purchases " + EMJ_CHECK + "</b>\n" +266 "<b> • Deliver your books to you " + EMJ_DROP + "</b>\n" +267 "<b> • Protect your account " + EMJ_STAR + "</b>\n\n" +268 "<b>" + EMJ_RED_DOT + " Tap the blue button below to verify your account:</b>";269 270 // Standard native reply keyboard because contact sharing works securely here271 var nativeKeyboard = {272 keyboard: [273 [{ text: "✅ Verify Account", request_contact: true }]274 ],275 resize_keyboard: true,276 one_time_keyboard: true277 };278 279 Api.sendMessage({280 chat_id: chat.chatid,281 text: verifyMessage,282 parse_mode: "HTML",283 reply_markup: JSON.stringify(nativeKeyboard)284 });285 return; 286 }287 288 // ==========================================289 // 📦 MODULE 1: STEP-BY-STEP PRODUCT CREATION (UPDATED FOR WEBSITE API ID)290 // ==========================================291 if (userId === adminId && currentStep) {292 if (currentStep === "waiting_for_name") {293 if (!msgText) {294 Bot.sendMessage("⚠️ Invalid name. Please type a valid Product Name:");295 return;296 }297 User.setProperty("temp_product_name", msgText, "string");298 User.setProperty("add_product_step", "waiting_for_emoji", "string");299 Bot.sendMessage("💎 Great! Now send the <b>Premium Emoji ID</b> for this product:", { parse_mode: "HTML" });300 return; 301 }302 303 if (currentStep === "waiting_for_emoji") {304 if (!msgText) {305 Bot.sendMessage("⚠️ Invalid Emoji ID. Please send a valid Telegram Premium Emoji ID:");306 return;307 }308 User.setProperty("temp_product_emoji", msgText, "string");309 User.setProperty("add_product_step", "waiting_for_pid", "string");310 Bot.sendMessage("🔑 Nice! Now please enter the <b>Website API Product ID (PID)</b> for this item:", { parse_mode: "HTML" });311 return;312 }313 314 if (currentStep === "waiting_for_pid") {315 if (!msgText) {316 Bot.sendMessage("⚠️ Invalid Product ID. Please type a valid Website PID:");317 return;318 }319 320 var savedName = User.getProperty("temp_product_name");321 var savedEmoji = User.getProperty("temp_product_emoji");322 var savedPid = msgText; // User ne jo PID abhi bheja323 324 var productList = Bot.getProperty("stored_products") || [];325 if (!Array.isArray(productList)) { productList = []; }326 327 // Saving Name, Emoji and Website API ID (id) inside database object328 productList.push({ 329 name: savedName, 330 emoji: savedEmoji, 331 id: savedPid, 332 plans: [] 333 });334 335 Bot.setProperty("stored_products", productList, "json");336 337 // Cleanup temporary states338 User.setProperty("add_product_step", null, "string");339 User.setProperty("temp_product_name", null, "string");340 User.setProperty("temp_product_emoji", null, "string");341 342 var successMsg = "✅ <b>Product Added Successfully!</b>\n\n" +343 "📦 <b>Name:</b> " + savedName + "\n" +344 "💎 <b>Emoji ID:</b> <code>" + savedEmoji + "</code>\n" +345 "🔑 <b>API Product ID (PID):</b> <code>" + savedPid + "</code>\n\n" +346 "<i>Aap is product ke andar plans baad me configure kar sakte hain. Automatically website se integration ho gaya hai!</i>";347 348 Bot.sendMessage(successMsg, { parse_mode: "HTML" });349 return; 350 }351 }352 353 // ==========================================354 // 💵 MODULE 5: ADMIN BALANCE TOOLS (Add Bal / Remove Bal / Check Bal355 // button-click continuation — fixes buttons that previously just356 // showed a "Wrong Format" error with no way to actually complete it)357 // ==========================================358 if (userId === adminId) {359 var addbalStep = User.getProperty("addbal_step");360 var rembalStep = User.getProperty("rembal_step");361 var checkbalStep = User.getProperty("checkbal_step");362 363 if (addbalStep === "waiting_input" && msgText) {364 User.setProperty("addbal_step", null, "string");365 Bot.run({ command: "/addbal", options: { message: "/addbal " + msgText.trim() } });366 return;367 }368 if (rembalStep === "waiting_input" && msgText) {369 User.setProperty("rembal_step", null, "string");370 Bot.run({ command: "/rembal", options: { message: "/rembal " + msgText.trim() } });371 return;372 }373 if (checkbalStep === "waiting_input" && msgText) {374 User.setProperty("checkbal_step", null, "string");375 Bot.run({ command: "/checkbal", options: { params: msgText.trim() } });376 return;377 }378 }379 380 // ==========================================381 // 🎟 MODULE 3: ADMIN COUPON GENERATOR (step-by-step wizard)382 // ==========================================383 if (userId === adminId && couponGenStep) {384 385 if (couponGenStep === "code") {386 if (!msgText) { Bot.sendMessage("⚠️ Kripya ek valid coupon code bhejein."); return; }387 var couponCodeUpper = msgText.trim().toUpperCase();388 if (Bot.getProperty("coupon_" + couponCodeUpper)) {389 Bot.sendMessage("❌ Ye coupon code pehle se exist karta hai! Doosra naam try karein.");390 return;391 }392 User.setProperty("coupon_gen_code", couponCodeUpper, "string");393 User.setProperty("coupon_gen_step", "maxclaims", "string");394 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" });395 return;396 }397 398 if (couponGenStep === "maxclaims") {399 var maxClaimsVal = parseInt(msgText.trim());400 if (isNaN(maxClaimsVal) || maxClaimsVal <= 0) { Bot.sendMessage("❌ Kripya ek valid number bhejein (jaise 50)."); return; }401 User.setProperty("coupon_gen_maxclaims", maxClaimsVal, "number");402 User.setProperty("coupon_gen_step", "discount", "string");403 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" });404 return;405 }406 407 if (couponGenStep === "discount") {408 var discountVal = parseFloat(msgText.trim());409 if (isNaN(discountVal) || discountVal <= 0 || discountVal > 100) { Bot.sendMessage("❌ Discount 1 se 100 ke beech honi chahiye."); return; }410 User.setProperty("coupon_gen_discount", discountVal, "number");411 User.setProperty("coupon_gen_step", "scope", "string");412 Bot.sendMessage(413 "<tg-emoji emoji-id='6093677128295914531'>🎯</tg-emoji> <b>Scope batayein:</b>\n\n" +414 "• Sabhi products/plans ke liye: <code>global</code> likh kar bhejein\n" +415 "• Sirf ek specific product+plan ke liye: <code>Product Name | Duration</code>\n" +416 " <i>Example:</i> <code>Atomic Habits (Book) | 1d</code>",417 { parse_mode: "HTML" }418 );419 return;420 }421 422 if (couponGenStep === "scope") {423 var scopeInput = msgText.trim();424 var couponData = {425 code: User.getProperty("coupon_gen_code"),426 maxClaims: User.getProperty("coupon_gen_maxclaims"),427 discountPercent: User.getProperty("coupon_gen_discount"),428 claimedBy: [],429 isPaused: false,430 createdAt: new Date().toLocaleDateString()431 };432 433 if (scopeInput.toLowerCase() === "global") {434 couponData.scope = "global";435 } else if (scopeInput.indexOf("|") > -1) {436 var scopeParts = scopeInput.split("|");437 couponData.scope = "specific";438 couponData.productName = scopeParts[0].trim();439 couponData.duration = scopeParts[1].trim();440 } else {441 Bot.sendMessage("❌ Galat format! 'global' likhein ya 'Product Name | Duration' format me bhejein.");442 return;443 }444 445 Bot.setProperty("coupon_" + couponData.code, couponData, "json");446 447 // ✅ NEW: master list me bhi add karo, taaki /coupons admin command sabko list kar sake448 var couponList = Bot.getProperty("coupon_list") || [];449 if (couponList.indexOf(couponData.code) === -1) {450 couponList.push(couponData.code);451 Bot.setProperty("coupon_list", couponList, "json");452 }453 454 // Cleanup wizard state455 User.setProperty("coupon_gen_step", null, "string");456 User.setProperty("coupon_gen_code", null, "string");457 User.setProperty("coupon_gen_maxclaims", null, "number");458 User.setProperty("coupon_gen_discount", null, "number");459 460 Bot.sendMessage(461 "<blockquote>🎟 <b>COUPON CREATED SUCCESSFULLY!</b></blockquote>\n\n" +462 "🏷 <b>Code:</b> <code>" + couponData.code + "</code>\n" +463 "👥 <b>Max Claims:</b> " + couponData.maxClaims + "\n" +464 "💸 <b>Discount:</b> " + couponData.discountPercent + "%\n" +465 "🎯 <b>Scope:</b> " + (couponData.scope === "global" ? "🌍 Global (All Plans)" : "📦 " + couponData.productName + " (" + couponData.duration + ")"),466 { parse_mode: "HTML" }467 );468 return;469 }470 }471 472 // ==========================================473 // 🎟 MODULE 4: USER — APPLY COUPON CODE TEXT ENTRY474 // ==========================================475 if (awaitingCouponFor) {476 var enteredCode = msgText.trim().toUpperCase();477 var couponRec = Bot.getProperty("coupon_" + enteredCode);478 479 User.setProperty("awaiting_coupon_for", null, "string");480 481 if (!couponRec) {482 Bot.sendMessage("❌ <b>Invalid Coupon Code!</b>", { parse_mode: "HTML" });483 return;484 }485 if (couponRec.isPaused) {486 Bot.sendMessage("⏸ Ye coupon abhi paused hai, thodi der baad try karein.", { parse_mode: "HTML" });487 return;488 }489 if (!Array.isArray(couponRec.claimedBy)) { couponRec.claimedBy = []; }490 if (couponRec.claimedBy.indexOf(userId) > -1) {491 Bot.sendMessage("⚠️ Aapne ye coupon already use kar liya hai!", { parse_mode: "HTML" });492 return;493 }494 if (couponRec.claimedBy.length >= couponRec.maxClaims) {495 Bot.sendMessage("❌ Is coupon ki claim limit khatam ho gayi hai!", { parse_mode: "HTML" });496 return;497 }498 499 var couponTargetParts = awaitingCouponFor.split(" ");500 var cTargetProdIdx = couponTargetParts[0];501 var cTargetPlanIdx = couponTargetParts[1];502 503 if (couponRec.scope === "specific") {504 var cProductList = Bot.getProperty("stored_products") || [];505 var cProduct = cProductList[Number(cTargetProdIdx)];506 var cPlan = cProduct ? cProduct.plans[Number(cTargetPlanIdx)] : null;507 var cDurationDisplay = cPlan ? (cPlan.durationDisplay || (cPlan.days + " Days")) : "";508 var matchesProduct = cProduct && cProduct.name.trim().toLowerCase() === couponRec.productName.trim().toLowerCase();509 var matchesDuration = cDurationDisplay.toLowerCase().indexOf(String(couponRec.duration).toLowerCase().replace(/[^a-z0-9]/g, "")) > -1 ||510 String(couponRec.duration).replace(/[^0-9]/g, "") === String(cPlan ? cPlan.days : "");511 if (!matchesProduct) {512 Bot.sendMessage("❌ Ye coupon is product ke liye valid nahi hai!", { parse_mode: "HTML" });513 return;514 }515 }516 517 // ✅ Valid — apply and mark claimed518 couponRec.claimedBy.push(userId);519 Bot.setProperty("coupon_" + enteredCode, couponRec, "json");520 User.setProperty("applied_coupon_" + cTargetProdIdx + "_" + cTargetPlanIdx, enteredCode, "string");521 522 Bot.sendMessage("🎉 <b>Coupon Applied!</b> -" + couponRec.discountPercent + "% discount added.", { parse_mode: "HTML" });523 524 Bot.run({525 command: "buyitem",526 options: { params: cTargetProdIdx + " " + cTargetPlanIdx }527 });528 return;529 }530 531 // ==========================================532 // 📢 MODULE 2: PREMIUM BROADCAST SYSTEM533 // ==========================================534 if (userId === adminId && isAwaitingBroadcast) {535 User.setProperty("awaiting_broadcast_data", false, "boolean");536 var userList = Bot.getProperty("all_users_list") || [];537 538 if (userList.length === 0) {539 Bot.sendMessage("❌ Bot mein abhi tak koi bhi user registered nahi hai.");540 return;541 }542 543 var targetMessageId = null;544 if (request) {545 if (request.message_id) { targetMessageId = request.message_id; }546 else if (request.message && request.message.message_id) { targetMessageId = request.message.message_id; }547 }548 549 if (!targetMessageId) {550 Bot.sendMessage("❌ Unable to fetch message ID for broadcast.");551 return;552 }553 554 Bot.sendMessage("⏳ Sending premium broadcast to " + userList.length + " users... Please wait.");555 556 // ✅ FIXED: pehle ek bhi blocked/invalid user Api.copyMessage() ko throw karwa deta557 // tha, jo bahar wale catch() tak chala jaata tha — isse loop beech me hi ruk jaata558 // tha (baaki users ko broadcast nahi jaata tha) aur admin ko scary "Error in handling"559 // dikhta tha, jabki zyada tar users ko message mil chuka hota tha. Ab har send apne560 // try/catch me hai, aur end me accurate success/fail count milega.561 var sentCount = 0;562 var failedCount = 0;563 for (var i = 0; i < userList.length; i++) {564 try {565 Api.copyMessage({566 chat_id: String(userList[i]),567 from_chat_id: adminId,568 message_id: Number(targetMessageId)569 });570 sentCount++;571 } catch (perUserErr) {572 failedCount++;573 }574 }575 Bot.sendMessage(576 "✅ <b>Broadcast Complete!</b>\n" +577 "📤 <b>Sent:</b> " + sentCount + " users\n" +578 (failedCount > 0 ? "⚠️ <b>Failed/Blocked:</b> " + failedCount + " users" : "🎉 <b>No failures!</b>"),579 { parse_mode: "HTML" }580 );581 }582 583} catch (err) {584 Bot.sendMessage("Error in handling: " + err.message);585}