indrajitghosh20006/Igstore_01botPublic Β· Bot Template

ProfileTelegram

AIThe bot provides an admin interface for a digital store, allowing the owner or co‑admins to add balances, products, plans, and categories. It supports payment workflows via UPI and Binance Pay, automatically generating QR codes and handling manual approval of deposits. The code patches inline keyboards to use premium emoji icons and includes helper functions for user and bot properties. Overall, it serves as a commerce management tool for a Telegram-based storefront.

Commercestoreadminbalanceproductplancategory
170 commands0 envUpdated 7h agoCreated Oct 30, 2026
Back to folder

commands/_execute_id_buy.js

javascript Β· 306 lines

Raw
1/**#command2name: /execute_id_buy3answer: 4keyboard: 5parse_mode: markdown6aliases: 7allow_only_group: false8need_reply: false9is_web: 010#command**/11 12/**#command13name: /execute_id_buy14answer: 15keyboard: 16parse_mode: markdown17aliases: 18allow_only_group: false19need_reply: false20case_insensitive: false21is_web: 022#command**/23 24// =========================================================25// πŸ›’ COMMAND = /execute_id_buy26// STATUS: FIXED - Real QR HTTP call + FF ID flow tracking for delivery after QR pay27// =========================================================28 29try {30  if (!params || typeof params !== "string") return;31 32  let data = params.split(" ");33  let rawType = data[0] ? data[0].toLowerCase().trim() : "";34  let actionState = data[1] ? data[1].toLowerCase().trim() : "";35 36  // Safe Callback Query ID & Context Extraction37  let queryId = request.id || (request.callback_query && request.callback_query.id);38  let userId = user.telegramid.toString().trim(); 39  let chatID = chat.chatid;40 41  // ===================================================42  // πŸ‘‘ DYNAMIC PRICING SYSTEM & CATEGORY RESOLVER43  // ===================================================44  let rawResellers = Bot.getProperty("resellers_list");45  let resellers = [];46 47  if (rawResellers) {48      if (Array.isArray(rawResellers)) {49          resellers = rawResellers;50      } else if (typeof rawResellers === "string") {51          try { resellers = JSON.parse(rawResellers); } catch(e) { resellers = rawResellers.split(","); }52      } else if (typeof rawResellers === "object") {53          resellers = rawResellers.resellers || rawResellers.list || rawResellers.users || Object.values(rawResellers);54      }55  }56  if (!Array.isArray(resellers)) { resellers = []; }57 58  // Check if User is Reseller OR Admin59  let isReseller = resellers.map(function(id) {60      return id ? id.toString().toLowerCase().trim() : "";61  }).includes(userId) || (userId === "7839151435");62  63  let finalCost = 0;64  let stockData = [];65  let displayTypeName = "";66  let isDynamicCategory = false;67  let isGeneralCategory = false;68  let selectedCat = null;69  70  // βœ… FIX: BJS getProperty doesn't reliably take a default 2nd arg β€” use || [] pattern everywhere71  let fbCategories = Bot.getProperty("fb_categories") || [];72  if (!Array.isArray(fbCategories)) { fbCategories = []; }73 74  if (rawType.startsWith("fb_")) {75      isDynamicCategory = true;76      let targetCatId = rawType.replace("fb_", "").trim();77      78      for (let i = 0; i < fbCategories.length; i++) {79          if (fbCategories[i].id === targetCatId) {80              selectedCat = fbCategories[i];81              break;82          }83      }84      85      if (!selectedCat) {86          if (queryId) Api.answerCallbackQuery({ callback_query_id: String(queryId), text: "❌ Category deleted!", show_alert: true });87          return;88      }89      90      if (isReseller && selectedCat.reseller_price !== undefined && selectedCat.reseller_price !== "") {91          finalCost = Number(selectedCat.reseller_price);92      } else {93          finalCost = Number(selectedCat.price || 0);94      }95      stockData = selectedCat.stock_list || [];96      displayTypeName = selectedCat.name;97  } else if (rawType == "fb" || rawType == "google") {98      let priceRes = parseFloat(Bot.getProperty("price_res_" + rawType) || 0);99      let priceNorm = parseFloat(Bot.getProperty("price_norm_" + rawType) || 0);100      finalCost = isReseller ? priceRes : priceNorm;101      stockData = Bot.getProperty("ff_stock_" + rawType) || [];102      displayTypeName = rawType.toUpperCase();103  } else {104      var categories = Bot.getProperty("ff_categories") || {};105      if (!categories[rawType]) {106          if (queryId) Api.answerCallbackQuery({ callback_query_id: String(queryId), text: "❌ Invalid Product!", show_alert: true });107          return;108      }109      isGeneralCategory = true;110      selectedCat = categories[rawType];111      112      if (isReseller) {113          if (selectedCat.reseller_price !== undefined && selectedCat.reseller_price !== "" && selectedCat.reseller_price !== null && Number(selectedCat.reseller_price) > 0) {114              finalCost = Number(selectedCat.reseller_price);115          } else if (selectedCat.price !== undefined && selectedCat.price !== "" && selectedCat.price !== null) {116              finalCost = Number(selectedCat.price); 117          } else {118              finalCost = Number(selectedCat.normal_price || 0);119          }120      } else {121          finalCost = Number(selectedCat.normal_price || selectedCat.price || 0);122      }123      124      let fallbackStock = Bot.getProperty("ff_stock_" + rawType) || [];125      stockData = (selectedCat.stock_list && selectedCat.stock_list.length > 0) ? selectedCat.stock_list : fallbackStock;126      displayTypeName = selectedCat.name;127  }128 129  // Out of stock hard block check130  if (!stockData || stockData.length === 0) {131      if (queryId) {132          Api.answerCallbackQuery({133              callback_query_id: String(queryId),134              text: "❌ Stock is empty! Cannot process purchase.",135              show_alert: true136          });137      } else {138          Api.sendMessage({ chat_id: chatID, text: "❌ Out of stock items cannot be processed." });139      }140      return;141  }142 143  // Wallet engine balance extraction sequence144  var userRes = Libs.ResourcesLib.userRes("balance");145  var bonusBal = Bot.getProperty("balance" + userId) || 0;146  var unifiedTotalBalance = Number(userRes.value()) + Number(bonusBal);147 148  // 🚨 INSUFFICIENT BALANCE SYSTEM -> REDIRECT TO QR WITH SHORTAGE AMOUNT149  if (unifiedTotalBalance < finalCost) {150      var needToPay = finalCost - unifiedTotalBalance;151      152      // Save details for QR generation pipeline153      User.setProperty("buy_price", finalCost, "number");154      User.setProperty("buy_needpay", needToPay, "number");155      User.setProperty("buy_prod_name", displayTypeName, "string");156 157      // βœ… FIX: Tag this purchase as an FF-ID stock-based flow so /onBuyCheck158      // knows to deliver from local stock instead of the plan-based external API159      User.setProperty("buy_flow_type", "ffid", "string");160      User.setProperty("buy_ffid_rawtype", rawType, "string");161      User.setProperty("buy_ffid_is_reseller", isReseller ? true : false, "boolean");162 163      if (queryId) {164          Api.answerCallbackQuery({ 165              callback_query_id: String(queryId), 166              text: "⚠️ Balance low! Generating QR for β‚Ή" + needToPay + "...", 167              show_alert: true 168          });169      }170 171      // Gram UPI Gateway QR creation for FF-ID checkout.172      var gramApiKey = String(Bot.getProperty("gramupi_api_key") || "").trim();173      if (!gramApiKey) {174          Api.sendMessage({ chat_id: chatID, text: "❌ Gram UPI Gateway API Key configured nahi hai. Admin Panel se set karein.", parse_mode: "HTML" });175          return;176      }177      var exactGramAmount = Number(needToPay.toFixed(2));178      Api.sendMessage({179          chat_id: chatID,180          text: "<b>πŸ“‰ Creating Gram UPI Gateway order for β‚Ή" + exactGramAmount.toFixed(2) + "...</b>",181          parse_mode: "HTML"182      });183      HTTP.get({184      url: "https://gateway.anujbots.in/autoqr.php?api_key=" + encodeURIComponent(String(gramApiKey)) + "&amount=" + encodeURIComponent(String(exactGramAmount)),185      success: "/onBuyQR",186      error: "/onApiError"187  });188      return;189  }190 191  // Deduct balanced values systematically192  if (bonusBal >= finalCost) {193      Bot.setProperty("balance" + userId, bonusBal - finalCost, "number");194  } else {195      var remainingDeduction = finalCost - bonusBal;196      Bot.setProperty("balance" + userId, 0, "number");197      userRes.remove(remainingDeduction);198  }199 200  // Shift asset entry from inventory safely201  var accountExtracted = stockData.shift();202  203  // Stock data save back logic204  if (isDynamicCategory && selectedCat) {205      selectedCat.stock_list = stockData;206      Bot.setProperty("fb_categories", fbCategories, "json");207  } else if (isGeneralCategory && selectedCat) {208      selectedCat.stock_list = stockData;209      var categories = Bot.getProperty("ff_categories") || {};210      categories[rawType] = selectedCat;211      Bot.setProperty("ff_categories", categories, "json");212      Bot.setProperty("ff_stock_" + rawType, stockData, "json");213  } else {214      Bot.setProperty("ff_stock_" + rawType, stockData, "json");215  }216 217  // ===================================================218  // ⚑ CRITICAL SPLIT & BOUNDARY ISOLATION219  // ===================================================220  var fullRawString = String(accountExtracted || "").trim();221  var emailData = fullRawString;222  var passwordData = "No Password Found";223 224  if (fullRawString.indexOf("|") !== -1) {225      var lastPipeIndex = fullRawString.lastIndexOf("|");226      var firstPart = fullRawString.substring(0, lastPipeIndex).trim();227      var secondPart = fullRawString.substring(lastPipeIndex + 1).trim();228 229      if (firstPart.indexOf(" ") !== -1) {230          var spaceParts = firstPart.split(" ");231          emailData = spaceParts[spaceParts.length - 1].trim();232      } else {233          emailData = firstPart;234      }235      passwordData = secondPart;236  }237 238  // ===================================================239  // πŸ’Ύ AUTOMATIC HISTORY STORAGE ENGINE240  // ===================================================241  let purchasedKeys = User.getProperty("my_purchased_keys") || [];242  if (!Array.isArray(purchasedKeys)) { purchasedKeys = []; }243  244  let currentDate = new Date().toLocaleDateString('en-IN', { timeZone: 'Asia/Kolkata' });245  purchasedKeys.push({246      productName: displayTypeName,247      cost: finalCost.toString(),248      key: emailData + (passwordData !== "No Password Found" ? " | " + passwordData : ""),249      days: "Permanent", 250      date: currentDate251  });252  User.setProperty("my_purchased_keys", purchasedKeys, "json");253 254  // ===================================================255  // ⭐ COMPACT USER DISPLAY LOGIC256  // ===================================================257  var deliveryText = 258    "┏━━━━━━━━━━━━━━━━━━━━━━━━┓\n" +259    "┃ <tg-emoji emoji-id='6267140231632262769'>❀️‍πŸ”₯</tg-emoji> <b>PURCHASE SUCCESSFUL!</b> <tg-emoji emoji-id='6267140231632262769'>❀️‍πŸ”₯</tg-emoji> ┃\n" +260    "┗━━━━━━━━━━━━━━━━━━━━━━━━┛\n\n" +261    "<tg-emoji emoji-id='5463172695132745432'>πŸ“¦</tg-emoji> <b>Item:</b> <code>" + displayTypeName + "</code>\n" +262    "<tg-emoji emoji-id='6267068789146260253'>πŸ’°</tg-emoji> <b>Paid:</b> <code>β‚Ή" + finalCost + "</code> " + (isReseller ? "<b>(Reseller)</b>" : "") + "\n" +263    "━━━━━━━━━━━━━━━━━━━━━━━━━━\n" +264    "<tg-emoji emoji-id='6145572393499762737'>πŸ‘€</tg-emoji> <b>ACCOUNT DETAILS:</b>\n\n" +265    "<tg-emoji emoji-id='6041705726206808304'>πŸš€</tg-emoji> <b>Email:</b> <code>" + emailData + "</code>\n" +266    "<tg-emoji emoji-id='5902002809573740949'>πŸ”’</tg-emoji> <b>Password:</b> <code>" + passwordData + "</code>\n" +267    "━━━━━━━━━━━━━━━━━━━━━━━━━━\n" +268    "<tg-emoji emoji-id='5210956306952758910'>⚠️</tg-emoji> <i>Copy details instantly.</i>";269 270  Api.sendMessage({271      chat_id: chatID,272      text: deliveryText,273      parse_mode: "HTML"274  });275 276  if (queryId) {277      Api.answerCallbackQuery({278          callback_query_id: String(queryId),279          text: "βœ… Released Successfully!",280          show_alert: false281      });282  }283 284  // ===================================================285  // πŸ”” COMPACT ADMIN NOTIFICATION PIPELINE286  // ===================================================287  var adminLogChannel = "7839151435"; 288  var adminNotificationMsg = 289    "<blockquote><tg-emoji emoji-id='5447644880824181073'>⚠️</tg-emoji> <b>NEW ORDER ALERT</b>" + (isReseller ? " [RESELLER]" : "") + "</blockquote>\n" +290    "πŸ‘€ <b>User:</b> <a href='tg://user?id=" + userId + "'>" + user.first_name + "</a> (<code>" + userId + "</code>)\n" +291    "πŸ“¦ <b>Item:</b> <code>" + displayTypeName + "</code>\n" +292    "πŸ’° <b>Revenue:</b> <code>β‚Ή" + finalCost + "</code>\n" +293    "⚑ <b>Stock Left:</b> <code>" + stockData.length + " units</code>\n\n" +294    "πŸ–₯ <b>ACCOUNT DETAILS:</b>\n" +295    "βž” <b>Email:</b> <code>" + emailData + "</code>\n" +296    "βž” <b>Password:</b> <code>" + passwordData + "</code>";297 298  Api.sendMessage({299      chat_id: adminLogChannel,300      text: adminNotificationMsg,301      parse_mode: "HTML"302  });303 304} catch(e) {305  Bot.sendMessage("Critical Execution Failure Module Error: " + e.message);306}