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/_onBuyCheck.js

javascript · 447 lines

Raw
1/**#command2name: /onBuyCheck3answer: 4keyboard: 5parse_mode: markdown6aliases: 7allow_only_group: false8need_reply: false9is_web: 010#command**/11 12function resolveApiDuration(plan, cleanPlanDays, planUnit, productNameOverride) {13  // IMPORTANT: Keep the admin/API duration name exactly as entered.14  // The product-specific day ranges below are used only when the stored plan15  // contains a plain numeric Day duration; this lets 1-30 Day plans target16  // the exact website/API names requested by the admin without changing any17  // other product data or purchase logic.18  var raw = String((plan && (plan.api_duration || plan.name_on_website || plan.durationDisplay || plan.name || plan.title)) || "").replace(/\s+/g, " ").trim();19 20  // Already-custom API labels (including casing/suffixes) must pass through unchanged.21  if (raw && !/^[0-9]+(?:\.[0-9]+)?\s*(day|days)$/i.test(raw)) {22    return raw;23  }24 25  var dayMatch = raw.match(/^([0-9]+(?:\.[0-9]+)?)\s*(day|days)$/i);26  var n = dayMatch ? dayMatch[1] : String(cleanPlanDays || "1");27  var productName = String(productNameOverride || (plan && (plan.product_name || plan.productName || plan.product || plan.category)) || "").trim().toLowerCase();28 29  // If product name is not stored on the plan, the caller's raw API label is30  // still preserved above. Generic numeric Day plans remain "N Days".31  if (/pc\s*aim\s*silent/.test(productName)) return n + " Day Pc Aim Silent";32  if (/pc\s*modmenu\s*x86/.test(productName)) return n + " Day Pc Modmenu x86";33  if (/pc\s*bypass\s*\+\s*silent/.test(productName) || /bypass\s*\+\s*silent/.test(productName)) return n + " Days Pc Bypass + Silent";34  if (/nonroot/.test(productName) && !/root\s*\+\s*nonroot/.test(productName)) return n + " DaYS NONROOT";35  if (/pc\s*aimkill/.test(productName) || /aimkill/.test(productName)) return n + " DaYS PC AIMKILL";36  if (/root\s*\+\s*nonroot/.test(productName)) return n + " DaYs Root + Nonroot";37  if (/fluo?rite\s*ff/.test(productName)) return n + " DAYs FluoRite FF";38  if (/\broot\b/.test(productName)) return n + " DaYs ROOT";39  if (/all\s*colou?rs\s*mix/.test(productName)) return n + " DaYs All Colours Mix";40  if (/\bbasic\b/.test(productName)) return n + " DaYs Basic";41  if (/\bpro\b/.test(productName)) return n + " DaYs PRO";42  if (/\bsafe\b/.test(productName)) return n + " DaYs SAFE";43  if (/\bbrutal\b/.test(productName)) return n + " DaYs BRUTAL";44  if (/\bbrutal\b/.test(productName)) return n + " DaYs";45 46  // Hours/minutes are preserved exactly; no existing API duration is removed.47  var gh = raw.match(/^([0-9]+(?:\.[0-9]+)?)\s*(hour|hours)$/i);48  if (gh) return gh[1] + " Hours";49  var gm = raw.match(/^([0-9]+(?:\.[0-9]+)?)\s*(minute|minutes)$/i);50  if (gm) return gm[1] + (Number(gm[1]) === 1 ? " Minute" : " Minutes");51 52  return raw || n + " Days";53}54 55 56try {57  var userId = user.telegramid;58 59  // ✅ CRITICAL FIX: Proper atomic duplicate-payment prevention60  var utrFromContent = null;61  62  // Parse content to get UTR early63  if (content) {64    var res = (typeof content === "object") ? content : JSON.parse(content);65    if (res && res.data && res.data.utr) {66      utrFromContent = res.data.utr;67    }68  }69 70  // 🛑 STEP 1: Check if payment already processed using UTR (most reliable identifier)71  if (utrFromContent && Bot.getProperty("paid_" + utrFromContent)) {72    // ✅ FIX: Vanish the QR completely instead of leaving a stale "already used" caption behind73    try {74      Api.deleteMessage({ chat_id: chat.chatid, message_id: request.message.message_id });75    } catch (e) {}76 77    try {78      Bot.setProperty("buy_qr_msg_id_" + userId, null, "string");79      User.setProperty("buy_qr_msg_id_" + userId, null, "string");80    } catch (e) {}81 82    if (request && request.id) {83      try {84        key.answerCallbackQuery({85          callback_query_id: String(request.id),86          text: "✅ ALREADY CLAIMED ✅\nYe order pehle hi deliver ho chuka hai.",87          show_alert: true88        });89      } catch (e) {}90    }91 92    Api.sendMessage({93      chat_id: chat.chatid,94      text: "<blockquote><tg-emoji emoji-id='5330237710655306682'>✅</tg-emoji> <b>ORDER ALREADY CLAIMED</b>\n<i>Ye payment pehle hi verify ho kar item deliver ho chuka hai. Apni keys 'All History' me check karein.</i></blockquote>",95      parse_mode: "HTML",96      reply_markup: JSON.stringify({97        inline_keyboard: [[98          { text: "📜 My Keys", callback_data: "/mykey", style: "primary" },99          { text: "🛒 Shop Menu", callback_data: "/buy_hack", style: "success" }100        ]]101      })102    });103    return;104  }105 106  // 🛑 STEP 2: Duplicate-click lock check107  var isChecking = User.getProperty("buy_verifying_lock_" + userId);108  if (isChecking) {109    if (request && request.id) {110      Api.answerCallbackQuery({111        callback_query_id: String(request.id),112        text: "⏳ ALREADY CHECKING — PLEASE WAIT...",113        show_alert: true114      });115    }116    return;117  }118  119  // 🛑 STEP 3: SET LOCK IMMEDIATELY before any async operations120  User.setProperty("buy_verifying_lock_" + userId, true, "boolean");121 122  if (!content) {123    Api.editMessageCaption({124      chat_id: chat.chatid, message_id: request.message.message_id,125      caption: "<blockquote>⚠️ <b>Server didn't respond.</b>\nClick 'I have paid' again.</blockquote>", parse_mode: "HTML"126    });127    User.setProperty("buy_verifying_lock_" + userId, false, "boolean");128    return;129  }130 131  var res = (typeof content === "object") ? content : JSON.parse(content);132 133  if (res.status === "success" && res.data) {134    var utr = res.data.utr;135    var isPaid = Bot.getProperty("paid_" + utr);136 137    if (isPaid) {138      // ✅ FIX: Vanish the QR completely instead of leaving a stale "already used" caption behind139      try {140        Api.deleteMessage({ chat_id: chat.chatid, message_id: request.message.message_id });141      } catch (e) {}142 143      try {144        Bot.setProperty("buy_qr_msg_id_" + userId, null, "string");145        User.setProperty("buy_qr_msg_id_" + userId, null, "string");146      } catch (e) {}147 148      if (request && request.id) {149        try {150          Api.answerCallbackQuery({151            callback_query_id: String(request.id),152            text: "✅ ALREADY CLAIMED ✅\nYe order pehle hi deliver ho chuka hai.",153            show_alert: true154          });155        } catch (e) {}156      }157 158      Api.sendMessage({159        chat_id: chat.chatid,160        text: "<blockquote><tg-emoji emoji-id='5330237710655306682'>✅</tg-emoji> <b>ORDER ALREADY CLAIMED</b>\n<i>Ye payment pehle hi verify ho kar item deliver ho chuka hai. Apni keys 'All History' me check karein.</i></blockquote>",161        parse_mode: "HTML",162        reply_markup: JSON.stringify({163          inline_keyboard: [[164            { text: "📜 My Keys", callback_data: "/mykey", style: "primary" },165            { text: "🛒 Shop Menu", callback_data: "/buy_hack", style: "success" }166          ]]167        })168      });169      User.setProperty("buy_verifying_lock_" + userId, false, "boolean");170      return;171    }172    173    // ✅ IMMEDIATELY mark as paid BEFORE any async API calls to prevent race condition174    Bot.setProperty("paid_" + utr, true, "boolean");175 176    Api.editMessageCaption({177      chat_id: chat.chatid, message_id: request.message.message_id,178      caption: "<tg-emoji emoji-id='6192822213486321961'>🔄</tg-emoji> <b>Payment verified! Delivering your key...</b>",179      parse_mode: "HTML"180    });181 182    // ✅ FIX: Detect which purchase pipeline this QR payment belongs to.183    // "ffid" = local stock-based FF ID item (set by /execute_id_buy on low balance)184    // default/"plan" = original plan-based product via external xyzcheats API185    var flowType = User.getProperty("buy_flow_type") || "plan";186 187    if (flowType === "ffid") {188      // =========================================================189      // 🎮 FF ID STOCK DELIVERY (after successful QR payment)190      // =========================================================191      try {192        var rawType = User.getProperty("buy_ffid_rawtype") || "";193        var isResellerFlow = User.getProperty("buy_ffid_is_reseller") === true;194        var finalCost = Number(User.getProperty("buy_price") || 0);195        var displayTypeName = User.getProperty("buy_prod_name") || rawType;196 197        var stockData = [];198        var isDynamicCategory = false;199        var isGeneralCategory = false;200        var selectedCat = null;201 202        var fbCategories = Bot.getProperty("fb_categories") || [];203        if (!Array.isArray(fbCategories)) { fbCategories = []; }204 205        if (rawType.indexOf("fb_") === 0) {206          isDynamicCategory = true;207          var targetCatId = rawType.replace("fb_", "").trim();208          for (var i = 0; i < fbCategories.length; i++) {209            if (fbCategories[i].id === targetCatId) { selectedCat = fbCategories[i]; break; }210          }211          if (selectedCat) { stockData = selectedCat.stock_list || []; }212        } else if (rawType === "fb" || rawType === "google") {213          stockData = Bot.getProperty("ff_stock_" + rawType) || [];214        } else {215          isGeneralCategory = true;216          var categoriesFF = Bot.getProperty("ff_categories") || {};217          selectedCat = categoriesFF[rawType];218          if (selectedCat) {219            var fallbackStock = Bot.getProperty("ff_stock_" + rawType) || [];220            stockData = (selectedCat.stock_list && selectedCat.stock_list.length > 0) ? selectedCat.stock_list : fallbackStock;221          }222        }223 224        if (!stockData || stockData.length === 0) {225          Api.editMessageCaption({226            chat_id: chat.chatid, message_id: request.message.message_id,227            caption: "⚠️ Payment received but item went out of stock. Contact admin with UTR: " + utr,228            parse_mode: "HTML"229          });230          User.setProperty("buy_verifying_lock_" + userId, false, "boolean");231          return;232        }233 234        var accountExtracted = stockData.shift();235 236        if (isDynamicCategory && selectedCat) {237          selectedCat.stock_list = stockData;238          Bot.setProperty("fb_categories", fbCategories, "json");239        } else if (isGeneralCategory && selectedCat) {240          selectedCat.stock_list = stockData;241          var categoriesFF2 = Bot.getProperty("ff_categories") || {};242          categoriesFF2[rawType] = selectedCat;243          Bot.setProperty("ff_categories", categoriesFF2, "json");244          Bot.setProperty("ff_stock_" + rawType, stockData, "json");245        } else {246          Bot.setProperty("ff_stock_" + rawType, stockData, "json");247        }248 249        var fullRawString = String(accountExtracted || "").trim();250        var emailData = fullRawString;251        var passwordData = "No Password Found";252 253        if (fullRawString.indexOf("|") !== -1) {254          var lastPipeIndex = fullRawString.lastIndexOf("|");255          var firstPart = fullRawString.substring(0, lastPipeIndex).trim();256          var secondPart = fullRawString.substring(lastPipeIndex + 1).trim();257 258          if (firstPart.indexOf(" ") !== -1) {259            var spaceParts = firstPart.split(" ");260            emailData = spaceParts[spaceParts.length - 1].trim();261          } else {262            emailData = firstPart;263          }264          passwordData = secondPart;265        }266 267        var purchasedKeys = User.getProperty("my_purchased_keys") || [];268        if (!Array.isArray(purchasedKeys)) { purchasedKeys = []; }269        var currentDate = new Date().toLocaleDateString('en-IN', { timeZone: "Asia/Kolkata" });270        purchasedKeys.push({271          productName: displayTypeName,272          cost: finalCost.toString(),273          key: emailData + (passwordData !== "No Password Found" ? " | " + passwordData : ""),274          days: "Permanent",275          date: currentDate276        });277        User.setProperty("my_purchased_keys", purchasedKeys, "json");278 279        var deliveryText =280          "┏━━━━━━━━━━━━━━━━━━━━━━━━┓\n" +281          "┃ ❤️‍🔥 <b>PURCHASE SUCCESSFUL!</b> ❤️‍🔥 ┃\n" +282          "┗━━━━━━━━━━━━━━━━━━━━━━━━┛\n\n" +283          "📦 <b>Item:</b> <code>" + displayTypeName + "</code>\n" +284          "💰 <b>Paid:</b> <code>₹" + finalCost + "</code> " + (isResellerFlow ? "<b>(Reseller)</b>" : "") + "\n" +285          "━━━━━━━━━━━━━━━━━━━━━━━━━━\n" +286          "👤 <b>ACCOUNT DETAILS:</b>\n\n" +287          "🚀 <b>Email:</b> <code>" + emailData + "</code>\n" +288          "🔒 <b>Password:</b> <code>" + passwordData + "</code>\n" +289          "━━━━━━━━━━━━━━━━━━━━━━━━━━\n" +290          "⚠️ <i>Copy details instantly.</i>";291 292        Api.sendMessage({293          chat_id: chat.chatid,294          text: deliveryText,295          parse_mode: "HTML"296        });297 298        var adminLogChannel = "7839151435";299        var adminNotificationMsg =300          "<blockquote>⚠️ <b>NEW ORDER ALERT (QR)</b>" + (isResellerFlow ? " [RESELLER]" : "") + "</blockquote>\n" +301          "👤 <b>User:</b> <a href='tg://user?id=" + userId + "'>" + user.first_name + "</a> (<code>" + userId + "</code>)\n" +302          "📦 <b>Item:</b> <code>" + displayTypeName + "</code>\n" +303          "💰 <b>Revenue:</b> <code>₹" + finalCost + "</code>\n" +304          "⚡ <b>Stock Left:</b> <code>" + stockData.length + " units</code>\n\n" +305          "🖥 <b>ACCOUNT DETAILS:</b>\n" +306          "➔ <b>Email:</b> <code>" + emailData + "</code>\n" +307          "➔ <b>Password:</b> <code>" + passwordData + "</code>";308 309        Api.sendMessage({310          chat_id: adminLogChannel,311          text: adminNotificationMsg,312          parse_mode: "HTML"313        });314 315        // Cleanup all buy_ state for this order316        User.setProperty("buy_flow_type", null, "string");317        User.setProperty("buy_ffid_rawtype", null, "string");318        User.setProperty("buy_ffid_is_reseller", null, "boolean");319        User.setProperty("buy_price", null, "number");320        User.setProperty("buy_needpay", null, "number");321        User.setProperty("buy_prod_name", null, "string");322        User.setProperty("buy_plan_unit", null, "string");323        User.setProperty("buy_plan_name_on_website", null, "string");324        User.setProperty("buy_pending_order_id", null);325        Bot.setProperty("buy_qr_msg_id_" + userId, null, "string");326        User.setProperty("buy_qr_msg_id_" + userId, null, "string");327        Bot.setProperty("buy_qr_caption_" + userId, null, "string");328        User.setProperty("buy_qr_caption_" + userId, null, "string");329        Bot.setProperty("buy_qr_buttons_" + userId, null, "string");330        User.setProperty("buy_qr_buttons_" + userId, null, "string");331 332      } catch (ffErr) {333        Api.editMessageCaption({334          chat_id: chat.chatid, message_id: request.message.message_id,335          caption: "⚠️ Delivery error. Contact admin with UTR: " + utr + " | Error: " + ffErr.message,336          parse_mode: "HTML"337        });338      }339      User.setProperty("buy_verifying_lock_" + userId, false, "boolean");340      return;341    }342 343    // =========================================================344    // 📦 ORIGINAL PLAN-BASED DELIVERY (external xyzcheats API)345    // =========================================================346    var prodIdx = User.getProperty("buy_prod_idx");347    var planIdx = User.getProperty("buy_plan_idx");348    var productList = Bot.getProperty("stored_products") || [];349    var product = productList[prodIdx];350    var plan = product && product.plans ? product.plans[planIdx] : null;351 352    if (!product || !plan) {353      Api.editMessageCaption({354        chat_id: chat.chatid, message_id: request.message.message_id,355        caption: "⚠️ Payment received but product data missing. Contact admin with UTR: " + utr,356        parse_mode: "HTML"357      });358      User.setProperty("buy_verifying_lock_" + userId, false, "boolean");359      return;360    }361 362    var webProductId = String(product.id || "PID_ID").trim();363    var cleanPlanDays = User.getProperty("buy_plan_days") || String(plan.days);364    var planUnit = User.getProperty("buy_plan_unit") || plan.unit || "day";365    var prodNameLower = String(product.name).toLowerCase();366    var durationParam = resolveApiDuration(plan, cleanPlanDays, planUnit, product && product.name);367 368    // 🔌 Use configured multi-API system instead of a hardcoded API.369    var apiRegistry = Bot.getProperty("api_registry") || {};370    var activeApiId = Bot.getProperty("active_reseller_api") || "";371    var selectedApi = activeApiId ? apiRegistry[activeApiId] : null;372    if (!selectedApi) {373      selectedApi = { id:"default", url:"https://bantibhaiya.to/api/reseller_v1.php", api_key:"YOUR-API", master_key:"a7f3e8b2c9d1f4a6b8c2d5e9f1a3b6c8", android_required:false, enabled:true };374    }375    if (selectedApi.enabled === false) {376      Bot.sendMessage("❌ Selected API is disabled. Admin ko /apiset se active API select karna hoga.");377      return;378    }379    var postFields = { api_key:selectedApi.api_key || "", action:"buy", product_id:webProductId, duration:durationParam };380    var savedAndroidId = User.getProperty("android_id") || User.getProperty("android_id_" + userId) || Bot.getProperty("android_id_" + userId) || "";381    if (selectedApi.android_required && !savedAndroidId) {382      Bot.sendMessage("⚠️ Android ID required for this API/product.");383      return;384    }385    if (savedAndroidId) postFields.android_id = String(savedAndroidId);386    var postFieldsString = Object.keys(postFields).map(function(k){ return encodeURIComponent(k) + "=" + encodeURIComponent(postFields[k]); }).join("&");387    User.setProperty("last_pending_api_id", String(selectedApi.id || activeApiId || ""), "string");388 389    User.setProperty("last_pending_price", User.getProperty("buy_price"), "number");390    User.setProperty("last_pending_prod_id", webProductId, "string");391    User.setProperty("last_pending_prod_name", String(product.name).trim(), "string");392    User.setProperty("last_pending_plan_days", cleanPlanDays, "string");393    User.setProperty("last_pending_plan_unit", planUnit, "string");394 395    HTTP.post({396      url: selectedApi.url,397      body: postFieldsString,398      headers: (function(){ var h={"Content-Type":"application/x-www-form-urlencoded"}; if(selectedApi.master_key) h["x-master-key"]=selectedApi.master_key; return h; })(),399      success: "/onWebKeyReceive",400      error: "/onWebKeyError"401    });402 403    User.setProperty("buy_pending_order_id", null);404    User.setProperty("buy_prod_idx", null);405    User.setProperty("buy_plan_idx", null);406    Bot.setProperty("buy_qr_msg_id_" + userId, null, "string");407    User.setProperty("buy_qr_msg_id_" + userId, null, "string");408    Bot.setProperty("buy_qr_caption_" + userId, null, "string");409    User.setProperty("buy_qr_caption_" + userId, null, "string");410    Bot.setProperty("buy_qr_buttons_" + userId, null, "string");411    User.setProperty("buy_qr_buttons_" + userId, null, "string");412    413    User.setProperty("buy_verifying_lock_" + userId, false, "boolean");414 415  } else {416    // ❌ Payment not found — restore original QR caption/buttons, then show dismissible notice417    try {418      var origCaption = Bot.getProperty("buy_qr_caption_" + userId) || User.getProperty("buy_qr_caption_" + userId);419      var origButtons = Bot.getProperty("buy_qr_buttons_" + userId) || User.getProperty("buy_qr_buttons_" + userId);420 421      if (origCaption) {422        Api.editMessageCaption({423          chat_id: chat.chatid,424          message_id: request.message.message_id,425          caption: origCaption,426          parse_mode: "HTML",427          reply_markup: origButtons ? origButtons : undefined428        });429      }430    } catch (e) {}431 432    if (request && request.id) {433      Api.answerCallbackQuery({434        callback_query_id: String(request.id),435        text: "❌ PAYMENT NOT FOUND ❌\nPlease complete the payment first, then tap again.",436        show_alert: true437      });438    }439    User.setProperty("buy_verifying_lock_" + userId, false, "boolean");440  }441 442} catch (err) {443  try {444    User.setProperty("buy_verifying_lock_" + user.telegramid, false, "boolean");445  } catch (e) {}446  Bot.sendMessage("⚠️ <b>Verification Exception:</b> " + err.message, { parse_mode: "HTML" });447}