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/_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 = "7839151435"; 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 = "7839151435";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}