amanjha18v/AMAN_SHOPS_BOTPublic · Bot Template

AIAMAN SHOP STORE appears to be a Telegram automation bot. Commands include /*, /addbal, /addbal_all, /addbal_binance, /addbal_binance_approve, /addbal_binance_paid, /addbal_upi, /addcat_id. Observed in code: messaging, http, libs, keyboards, payments.

Utilityutility
ProfileTelegram
132 commands0 envUpdated 7h agoCreated Sep 4, 2026
Back to folder

commands/_onWebKeyReceive.js

javascript · 279 lines

Raw
1/**#command2name: /onWebKeyReceive3answer: 4keyboard: 5parse_mode: markdown6aliases: 7allow_only_group: false8need_reply: false9is_web: 010#command**/11 12try { 13  // Parse response safely only if content exists14  var response = null;15  if (typeof content === "string" && content.trim() !== "") {16    try {17      response = JSON.parse(content);18    } catch (e) {19      // Keep response as null if JSON parsing fails20    }21  }22 23  var userId = user.telegramid;24  var chatId = chat.chatid;25 26  // 🔄 PRODUCT DATA ACCURACY CORE (DYNAMIC)27  var dataOptions = options || {}; 28  29  // 🆔 1. PRODUCT ID LAYER (Added for flawless API requests)30  var prodId = dataOptions.prod_id || dataOptions.id || dataOptions.product_id || User.getProperty("last_pending_prod_id") || null;31 32  // 2. Raw options fallback mechanisms33  var rawProdName = dataOptions.prod_name || dataOptions.product || dataOptions.name || User.getProperty("last_pending_prod_name") || "Product";34  var planDays = String(dataOptions.plan_days || dataOptions.days || User.getProperty("last_pending_plan_days") || "1");35  var pDaysNumOnly = planDays.replace(/[^0-9]/g, "").trim(); 36  var planUnit = dataOptions.plan_unit || User.getProperty("last_pending_plan_unit") || "day";37  var unitLabelWordW = (planUnit === "hour") ? (Number(pDaysNumOnly) === 1 ? "Hour" : "Hours") :38                        (planUnit === "minute") ? (Number(pDaysNumOnly) === 1 ? "Minute" : "Minutes") :39                        (Number(pDaysNumOnly) === 1 ? "Day" : "Days");40  var durationDisplayW = pDaysNumOnly + " " + unitLabelWordW;41 42  // 3. Database validation layer to completely kill the "Product" fallback string bug43  var productList = Bot.getProperty("stored_products") || [];44  var prodName = rawProdName.trim(); 45 46  // ⚡ DEEP ADVANCED DATABASE SEARCH MATCH (Matches by ID first if available, then name)47  if (productList.length > 0) {48    var checkTerm = prodName.toLowerCase();49    var foundMatch = false;50 51    for (var i = 0; i < productList.length; i++) {52      var dbItem = productList[i];53      var dbName = dbItem.name ? dbItem.name.trim() : "";54      var dbId = dbItem.id || null;55      56      // If ID matches directly, use it!57      if (prodId && dbId && String(prodId) === String(dbId)) {58        prodName = dbName;59        foundMatch = true;60        break;61      }62 63      if (!dbName) continue;64      65      if (dbName.toLowerCase() === checkTerm || 66          (checkTerm !== "product" && (checkTerm.indexOf(dbName.toLowerCase()) > -1 || dbName.toLowerCase().indexOf(checkTerm) > -1))) {67        prodName = dbName; 68        if (dbId) { prodId = dbId; } // Backfill ID if name matched69        foundMatch = true;70        break;71      }72    }73 74    if (!foundMatch || prodName.toLowerCase() === "product") {75      var lastPending = User.getProperty("last_pending_prod_name");76      if (lastPending && lastPending.toLowerCase() !== "product") {77        prodName = lastPending.trim();78      } else if (productList.length === 1) {79        prodName = productList[0].name.trim();80        if (productList[0].id) { prodId = productList[0].id; }81      }82    }83  }84 85  var price = Number(dataOptions.price) || Number(User.getProperty("last_pending_price")) || 0;86  var firstName = dataOptions.first_name || user.first_name || "User";87  var usernameText = user.username ? "@" + user.username : "No Username";88  var currentWalletBal = Libs.ResourcesLib.userRes("balance").value().toFixed(2);89 90  var generatedKey = null;91  var isApiDelivery = false;92  var isBackupUsed = false;93 94  var cleanProdNameUpper = prodName.trim().toUpperCase();95  var manualKeysStorageKey = "manual_keys_" + cleanProdNameUpper + "_" + pDaysNumOnly;96  var backupStockKey = "stock_" + prodName.trim() + "_" + pDaysNumOnly + "_Day";97  98  // ⚡ STEP 1: FORCE CHECK MANUAL STOCK (CRITICAL OVERRIDE)99  var manualStock = Bot.getProperty(manualKeysStorageKey);100 101  if (!manualStock || (Array.isArray(manualStock) && manualStock.length === 0)) {102    manualStock = Bot.getProperty(backupStockKey);103    isBackupUsed = true;104  }105 106  if (typeof manualStock === "string" && manualStock.trim() !== "") {107    try {108      manualStock = JSON.parse(manualStock);109    } catch(err) {110      manualStock = manualStock.split("\n").map(function(k) { return k.trim(); }).filter(Boolean);111    }112  }113 114  if (Array.isArray(manualStock) && manualStock.length > 0) {115    generatedKey = manualStock.shift(); 116    117    if (isBackupUsed) {118      Bot.setProperty(backupStockKey, manualStock, "json");119      var mainStock = Bot.getProperty(manualKeysStorageKey) || [];120      if (typeof mainStock === "string") { mainStock = mainStock.split("\n").map(function(k) { return k.trim(); }).filter(Boolean); }121      if (Array.isArray(mainStock)) {122        var idx = mainStock.indexOf(generatedKey);123        if (idx > -1) { mainStock.splice(idx, 1); }124        Bot.setProperty(manualKeysStorageKey, mainStock, "json");125      }126    } else {127      Bot.setProperty(manualKeysStorageKey, manualStock, "json");128      var backupStock = Bot.getProperty(backupStockKey) || [];129      if (typeof backupStock === "string") { backupStock = backupStock.split("\n").map(function(k) { return k.trim(); }).filter(Boolean); }130      if (Array.isArray(backupStock)) {131        var idx = backupStock.indexOf(generatedKey);132        if (idx > -1) { backupStock.splice(idx, 1); }133        Bot.setProperty(backupStockKey, backupStock, "json");134      }135    }136  }137 138  // ⚡ STEP 2: FALLBACK TO API KEYS (IF NO MANUAL STOCK WAS FOUND)139  if (!generatedKey && response && response.status === "success") {140    generatedKey = response.key || response.code || response.serial;141    if (generatedKey) {142      isApiDelivery = true;143    }144  }145 146  // STEP 3: SUCCESS DELIVERY MECHANICS147  if (generatedKey) {148    Libs.ResourcesLib.userRes("balance").add(-price);149 150    var pastSpent = Bot.getProperty("total_spent_by_" + userId) || 0;151    Bot.setProperty("total_spent_by_" + userId, Number(pastSpent) + price, "number");152 153    // 🎁 REFER & EARN — referrer bonus jab referred friend PEHLI baar purchase kare154    try {155      var referredByBuy3 = User.getProperty("referred_by");156      if (referredByBuy3 && !User.getProperty("ref_buy_bonus_given")) {157        var refBonusBuy3 = Number(Bot.getProperty("refer_earn_buy_amount"));158        if (isNaN(refBonusBuy3)) refBonusBuy3 = 2;159        if (refBonusBuy3 > 0) {160          Libs.ResourcesLib.anotherUserRes("balance", referredByBuy3).add(refBonusBuy3);161          var pastEarnBuy3 = Number(Bot.getProperty("refer_earnings_" + referredByBuy3) || 0);162          Bot.setProperty("refer_earnings_" + referredByBuy3, pastEarnBuy3 + refBonusBuy3, "number");163          try {164            Api.sendMessage({165              chat_id: referredByBuy3,166              text: "<blockquote>💸 <b>Referral Bonus!</b>\n\nAapke referred friend ne pehli purchase ki — aapko ₹" + refBonusBuy3.toFixed(2) + " mile hain!</blockquote>",167              parse_mode: "HTML"168            });169          } catch (e) {}170        }171        User.setProperty("ref_buy_bonus_given", true, "boolean");172      }173    } catch (e) {}174 175    var userKeysHistory = User.getProperty("my_purchased_keys") || [];176    userKeysHistory.push({177      product: prodName,178      product_id: prodId,179      days: pDaysNumOnly,180      price: price,181      key: generatedKey,182      date: new Date().toLocaleDateString()183    });184    User.setProperty("my_purchased_keys", userKeysHistory, "json");185 186    var remainingBal = Libs.ResourcesLib.userRes("balance").value().toFixed(2);187    188    var updateLinkForKey = Bot.getProperty("update_channel_link");189    var keyDeliveryButtons = [[{ text: "📋 Copy Key", copy_text: { text: generatedKey } }]];190    if (updateLinkForKey) {191      keyDeliveryButtons.push([{ text: "📥 Join Updates", url: updateLinkForKey, style: "primary", icon_custom_emoji_id: "6091571559233755994" }]);192    }193    keyDeliveryButtons.push([{ text: "Back to Menu", callback_data: "/back", style: "primary", icon_custom_emoji_id: "5893163582194978381" }]);194    var keyDeliveryMarkup = JSON.stringify({ inline_keyboard: keyDeliveryButtons });195 196    var deliverText = "<blockquote>" +197                      "<tg-emoji emoji-id='5350447674971660988'>✅</tg-emoji> <b>PURCHASE SUCCESSFUL!</b>\n\n" +198                      "<tg-emoji emoji-id='6147767796097884213'>📦</tg-emoji> <b>Product:</b> <code>" + prodName + "</code>\n" +199                      "<tg-emoji emoji-id='6284816251143331422'>🗝</tg-emoji> <b>Validity:</b> <code>" + durationDisplayW + "</code>\n" +200                      "<tg-emoji emoji-id='5352825278672412291'>👆</tg-emoji> <b>Your Key:</b> <code>" + generatedKey + "</code>\n\n" +201                      "━━━━━ <tg-emoji emoji-id='6147934084346682063'>#⃣</tg-emoji> <b>BALANCE DETAILS</b> ━━━━━\n" +202                      "<tg-emoji emoji-id='6195037488898121775'>✨</tg-emoji> <b>Total Invest:</b> ₹" + price.toFixed(2) + "\n" +203                      "<tg-emoji emoji-id='5409048419211682843'>💵</tg-emoji> <b>New Wallet Balance:</b> ₹" + remainingBal + "\n\n" +204                      "<i>Enjoy your purchase. <tg-emoji emoji-id='6057881002540274780'>🥳</tg-emoji></i>" +205                      "</blockquote>";206                      207    // ✅ FIX: "Processing your order..." wala purana message ab delete ho jaata208    // hai, taaki chat me sirf final key-delivery message rahe.209    try {210      var procMsgId = Bot.getProperty("gen_msg_id_" + userId) || User.getProperty("gen_msg_id_" + userId);211      if (procMsgId) {212        Api.deleteMessage({ chat_id: chatId, message_id: Number(procMsgId) });213        Bot.setProperty("gen_msg_id_" + userId, null, "string");214        User.setProperty("gen_msg_id_" + userId, null, "string");215      }216    } catch (cleanupErr) {}217 218    Api.sendMessage({219      chat_id: chatId,220      text: deliverText,221      parse_mode: "HTML",222      reply_markup: keyDeliveryMarkup223    });224 225    var adminId = "5191323229"; 226    var deliveryMethodLabel = isApiDelivery ? "API" : "MANUAL STOCK";227    var adminMsg = "🔔 <b>NEW PURCHASE DELIVERED (" + deliveryMethodLabel + ")</b> ✔️\n\n" +228                   "👤 <b>Buyer:</b> " + firstName + " (<code>" + userId + "</code>)\n" +229                   "📦 <b>Product:</b> " + prodName + " (ID: " + (prodId || "N/A") + ")\n" +230                   "⏳ <b>Plan:</b> " + durationDisplayW + "\n" +231                   "💸 <b>Price Deducted:</b> ₹" + price.toFixed(2) + "\n" +232                   "💳 <b>User Remaining Bal:</b> ₹" + remainingBal + "\n" +233                   "🔑 <b>Key:</b> <code>" + generatedKey + "</code>";234                   235    Api.sendMessage({ chat_id: adminId, text: adminMsg, parse_mode: "HTML" });236 237    User.setProperty("last_pending_price", null);238    User.setProperty("last_pending_prod_name", null);239    User.setProperty("last_pending_plan_days", null);240    User.setProperty("last_pending_prod_id", null);241    User.setProperty("last_pending_plan_unit", null);242 243  } else {244    // STEP 4: BOTH FAILED (System goes into error notification mode)245    Api.sendMessage({246      chat_id: chatId,247      text: "⏳ <b>Wait some time admin will stock refill soon</b>\n<i>Your funds were not deducted.</i>",248      parse_mode: "HTML"249    });250 251    var webBalance = "Low/Empty";252    var websiteErrorReason = "Website API Empty Response / Down";253    254    if (response) {255      webBalance = response.balance || response.website_balance || "Low/Empty";256      websiteErrorReason = response.msg || response.message || "Low Balance / Out of Stock";257    }258 259    var alertAdminId = "5191323229";260    var lowBalanceAdminMsg = "⚠️ <b>LOW BALANCE IN WEBSITE / API ERROR</b>\n" +261                             "━━━━━━━━━━━━━━━━━━━━━━━━━━\n\n" +262                             "🛒 <b>PRODUCT DETAILS:</b>\n" +263                             "📦 <b>Product Name:</b> <code>" + prodName + "</code>\n" +264                             "🆔 <b>Product ID:</b> <code>" + (prodId || "Not Passed") + "</code>\n" +265                             "⏳ <b>Days:</b> <code>" + pDaysNumOnly + " Days</code>\n" +266                             "💰 <b>Your Balance Website:</b> <code>" + webBalance + "</code>\n" +267                             "ℹ️ <b>API Reason:</b> <code>" + websiteErrorReason + "</code>\n\n" +268                             "👤 <b>USER DETAILS:</b>\n" +269                             "🗣 <b>User Name:</b> " + usernameText + "\n" +270                             "📛 <b>Name:</b> " + firstName + "\n" +271                             "🆔 <b>User ID:</b> <code>" + userId + "</code>\n" +272                             "💳 <b>Available Balance (User Wallet):</b> ₹" + currentWalletBal + "\n\n" +273                             "📌 <i>Action Required: Please refill your website API or add/deliver the key manually to this user!</i>";274 275    Api.sendMessage({ chat_id: alertAdminId, text: lowBalanceAdminMsg, parse_mode: "HTML" });276  }277} catch (e) {278  Bot.sendMessage("❌ Error executing delivery pipeline: " + e.message);279}