indrajitghosh20006/Igstore_01botPublic Β· Bot Template
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 8h agoCreated Oct 30, 2026
commands/_execute_id_buy.js
javascript Β· 306 lines
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}