tarunpoonia905/OfcDevShopBotPublic · Bot Template

ProfileTelegram

AIDEV SHOP appears to be a Telegram automation bot. Commands include /confirm_delete_stock, /addstock_id, /extkey_menu, /partner_api, /apidelete, /buy_hack_cat, /admin_manage_products, /check_buy. Observed in code: messaging, keyboards, payments, libs, web, http, games.

Utilityutility
228 commands0 envUpdated 12d agoCreated Oct 18, 2026
Back to folder

commands/_onWebKeyReceive.js

javascript · 307 lines

Raw
1/**#command2name: /onWebKeyReceive3answer: 4keyboard: 5parse_mode: markdown6aliases: 7allow_only_group: false8need_reply: false9is_web: 010#command**/11 12/*#SIZE_V1*/try{(function(){var z=Bot.getProperty("ui_btn_size");var mx=z==="large"?1:(z==="medium"?2:0);if(!mx||Api.__sz)return;var NAV=/^[◀▶⬅➡«»‹›⏪⏩]|\d+\s*\/\s*\d+|prev|next|page/i;var T=function(m){try{var o=typeof m==="string"?JSON.parse(m):m;if(!o||!o.inline_keyboard)return m;var out=[],cnt=0;o.inline_keyboard.forEach(function(row){var nav=row.some(function(b){return NAV.test(String(b.text||"").trim());});if(row.length<=mx||nav){out.push(row);cnt+=row.length;return;}for(var i=0;i<row.length;i+=mx){var c=row.slice(i,i+mx);out.push(c);cnt+=c.length;}});if(cnt>100||out.length>100)return m;o.inline_keyboard=out;return typeof m==="string"?JSON.stringify(o):o;}catch(e){return m;}};["sendMessage","editMessageText","editMessageCaption","editMessageReplyMarkup","sendPhoto","sendVideo","sendAnimation","sendDocument"].forEach(function(n){var f=Api[n];if(typeof f!=="function")return;Api[n]=function(p){try{if(p&&p.reply_markup)p.reply_markup=T(p.reply_markup);}catch(e){}return f.apply(Api,arguments);};});Api.__sz=true;})();}catch(__szE){}13/*#ANIM_V1*/try{(function(){var M={party:"5046509860389126442",fire:"5104841245755180586",heart:"5159385139981059251",like:"5107584321108051014"};var a=Bot.getProperty("ui_anim");if(!a||!M[a]||Api.__an)return;var E=M[a];var OK=/PURCHASE SUCCESSFUL|PAYMENT SUCCESSFUL|Payment verified|CONGRATULATIONS/i;var priv=function(p){return p&&p.chat_id&&String(p.chat_id).charAt(0)!=="-";};["sendMessage","sendPhoto","sendVideo","sendAnimation"].forEach(function(n){var f=Api[n];if(typeof f!=="function")return;Api[n]=function(p){try{if(priv(p)&&!p.message_effect_id&&OK.test(String(p.text||p.caption||"")))p.message_effect_id=E;}catch(e){}return f.apply(Api,arguments);};});var fe=Api.editMessageText;if(typeof fe==="function"){Api.editMessageText=function(p){var r=fe.apply(Api,arguments);try{if(priv(p)&&OK.test(String(p.text||"")))Api.sendMessage({chat_id:p.chat_id,text:"🎉",message_effect_id:E});}catch(e){}return r;};}Api.__an=true;})();}catch(__anE){}14/*#PREMIUM_UI_V1*/try{(function(){if(Bot.getProperty("ui_premium")!==true||Api.__pm)return;var R=function(t,c){var s=(String(t||"")+" "+String(c||"")).toLowerCase();if(/back|cancel|close|delete|remove|clear|reject|stop|ban|exit/.test(s))return"danger";if(/pay|buy|confirm|verify|paid|add|deposit|shop|claim|yes|receive|wallet|download|update/.test(s))return"success";return"primary";};var T=function(m){try{var o=typeof m==="string"?JSON.parse(m):m;if(!o||!o.inline_keyboard)return m;o.inline_keyboard.forEach(function(row){row.forEach(function(b){if(b.copy_text||b.url||b.callback_data||b.web_app){b.style=R(b.text,b.callback_data||b.url);if(!b.icon_custom_emoji_id&&b.text&&!/^[\u2600-\u27BF\uD83C-\uD83E]/.test(String(b.text).trim())&&!/^[✦✨💎]/.test(b.text))b.text="✦ "+b.text;}});});return typeof m==="string"?JSON.stringify(o):o;}catch(e){return m;}};["sendMessage","editMessageText","editMessageCaption","editMessageReplyMarkup","sendPhoto","sendVideo","sendAnimation","sendDocument"].forEach(function(n){var f=Api[n];if(typeof f!=="function")return;Api[n]=function(p){try{if(p&&p.reply_markup)p.reply_markup=T(p.reply_markup);}catch(e){}return f.apply(Api,arguments);};});Api.__pm=true;})();}catch(__pmE){}15 16 17try { 18  // Parse response safely only if content exists19  var response = null;20  if (typeof content === "string" && content.trim() !== "") {21    try {22      response = JSON.parse(content);23    } catch (e) {24      // Keep response as null if JSON parsing fails25    }26  }27 28  var userId = user.telegramid;29  var chatId = chat.chatid;30 31  // 🔄 PRODUCT DATA ACCURACY CORE (DYNAMIC)32  var dataOptions = (typeof options !== "undefined" && options) ? options : {}; 33  34  // 🆔 1. PRODUCT ID LAYER (Added for flawless API requests)35  var prodId = dataOptions.prod_id || dataOptions.id || dataOptions.product_id || User.getProperty("last_pending_prod_id") || null;36 37  // 2. Raw options fallback mechanisms38  var rawProdName = dataOptions.prod_name || dataOptions.product || dataOptions.name || User.getProperty("last_pending_prod_name") || "Product";39  var planDays = String(dataOptions.plan_days || dataOptions.days || User.getProperty("last_pending_plan_days") || "1");40  var pDaysNumOnly = planDays.replace(/[^0-9]/g, "").trim(); 41  var planUnit = dataOptions.plan_unit || User.getProperty("last_pending_plan_unit") || "day";42  var unitLabelWordW = (planUnit === "hour") ? (Number(pDaysNumOnly) === 1 ? "Hour" : "Hours") :43                        (planUnit === "minute") ? (Number(pDaysNumOnly) === 1 ? "Minute" : "Minutes") :44                        (Number(pDaysNumOnly) === 1 ? "Day" : "Days");45  var durationDisplayW = pDaysNumOnly + " " + unitLabelWordW;46 47  // 3. Database validation layer to completely kill the "Product" fallback string bug48  var productList = Bot.getProperty("stored_products") || [];49  var prodName = rawProdName.trim(); 50 51  // ⚡ DEEP ADVANCED DATABASE SEARCH MATCH (Matches by ID first if available, then name)52  if (productList.length > 0) {53    var checkTerm = prodName.toLowerCase();54    var foundMatch = false;55 56    for (var i = 0; i < productList.length; i++) {57      var dbItem = productList[i];58      var dbName = dbItem.name ? dbItem.name.trim() : "";59      var dbId = dbItem.id || null;60      61      // If ID matches directly, use it!62      if (prodId && dbId && String(prodId) === String(dbId)) {63        prodName = dbName;64        foundMatch = true;65        break;66      }67 68      if (!dbName) continue;69      70      if (dbName.toLowerCase() === checkTerm || 71          (checkTerm !== "product" && (checkTerm.indexOf(dbName.toLowerCase()) > -1 || dbName.toLowerCase().indexOf(checkTerm) > -1))) {72        prodName = dbName; 73        if (dbId) { prodId = dbId; } // Backfill ID if name matched74        foundMatch = true;75        break;76      }77    }78 79    if (!foundMatch || prodName.toLowerCase() === "product") {80      var lastPending = User.getProperty("last_pending_prod_name");81      if (lastPending && lastPending.toLowerCase() !== "product") {82        prodName = lastPending.trim();83      } else if (productList.length === 1) {84        prodName = productList[0].name.trim();85        if (productList[0].id) { prodId = productList[0].id; }86      }87    }88  }89 90  var price = Number(dataOptions.price) || Number(User.getProperty("last_pending_price")) || 0;91  var firstName = dataOptions.first_name || user.first_name || "User";92  var usernameText = user.username ? "@" + user.username : "No Username";93  var currentWalletBal = Libs.ResourcesLib.userRes("balance").value().toFixed(2);94 95  var generatedKey = null;96  var isApiDelivery = false;97  var isBackupUsed = false;98 99  var cleanProdNameUpper = prodName.trim().toUpperCase();100  var manualKeysStorageKey = "manual_keys_" + cleanProdNameUpper + "_" + pDaysNumOnly;101  var backupStockKey = "stock_" + prodName.trim() + "_" + pDaysNumOnly + "_Day";102  103  // ⚡ STEP 1: FORCE CHECK MANUAL STOCK (CRITICAL OVERRIDE)104  var manualStock = Bot.getProperty(manualKeysStorageKey);105 106  if (!manualStock || (Array.isArray(manualStock) && manualStock.length === 0)) {107    manualStock = Bot.getProperty(backupStockKey);108    isBackupUsed = true;109  }110 111  if (typeof manualStock === "string" && manualStock.trim() !== "") {112    try {113      manualStock = JSON.parse(manualStock);114    } catch(err) {115      manualStock = manualStock.split("\n").map(function(k) { return k.trim(); }).filter(Boolean);116    }117  }118 119  if (Array.isArray(manualStock) && manualStock.length > 0) {120    generatedKey = manualStock.shift(); 121    122    if (isBackupUsed) {123      Bot.setProperty(backupStockKey, manualStock, "json");124      var mainStock = Bot.getProperty(manualKeysStorageKey) || [];125      if (typeof mainStock === "string") { mainStock = mainStock.split("\n").map(function(k) { return k.trim(); }).filter(Boolean); }126      if (Array.isArray(mainStock)) {127        var idx = mainStock.indexOf(generatedKey);128        if (idx > -1) { mainStock.splice(idx, 1); }129        Bot.setProperty(manualKeysStorageKey, mainStock, "json");130      }131    } else {132      Bot.setProperty(manualKeysStorageKey, manualStock, "json");133      var backupStock = Bot.getProperty(backupStockKey) || [];134      if (typeof backupStock === "string") { backupStock = backupStock.split("\n").map(function(k) { return k.trim(); }).filter(Boolean); }135      if (Array.isArray(backupStock)) {136        var idx = backupStock.indexOf(generatedKey);137        if (idx > -1) { backupStock.splice(idx, 1); }138        Bot.setProperty(backupStockKey, backupStock, "json");139      }140    }141  }142 143  // ⚡ STEP 2: FALLBACK TO API KEYS (IF NO MANUAL STOCK WAS FOUND)144  // ✅ FIX: accept the common reseller-panel reply shapes, not only145  // {status:"success", key:"..."}: {success:true,data:{key}}, {keys:[...]},146  // {license_key}, etc. An explicit error reply is never treated as success.147  var apiOrderId = "";148  var apiExpires = "";149  var apiFailed = !!(response && (response.success === false || response.ok === false ||150                     /^(error|fail|failed)$/i.test(String(response.status || ""))));151  if (!generatedKey && response && !apiFailed) {152    var dataObj = (response.data && typeof response.data === "object" && !Array.isArray(response.data)) ? response.data : {};153    var firstOf = function (v) { return (Array.isArray(v) && v.length) ? v[0] : v; };154    var cand = response.key || response.code || response.serial || response.license || response.license_key ||155               response.generated_key || response.new_key || response.access_key || response.user_key ||156               dataObj.key || dataObj.code || dataObj.serial || dataObj.license || dataObj.license_key ||157               dataObj.generated_key || dataObj.new_key || dataObj.access_key || dataObj.user_key ||158               firstOf(response.keys) || firstOf(dataObj.keys) || (Array.isArray(response.data) ? response.data[0] : null);159    if (cand && typeof cand === "object") cand = cand.key || cand.code || cand.serial || cand.license || cand.license_key || "";160    if (cand) generatedKey = String(cand).trim();161    if (generatedKey) {162      isApiDelivery = true;163      apiOrderId = String(response.order_id || dataObj.order_id || "");164      apiExpires = String(response.expires_at || dataObj.expires_at || "");165      // Preserve server-side order metadata for history/admin logs.166      User.setProperty("last_api_order_id", apiOrderId, "string");167      User.setProperty("last_api_expires_at", apiExpires, "string");168    }169  }170 171  // STEP 3: SUCCESS DELIVERY MECHANICS172  if (generatedKey) {173    (function(){var __uid=user.telegramid;var __b=Number(Bot.getProperty("balance"+__uid)||0);var __tb=Math.min(Math.max(__b,0),price);if(__tb>0)Bot.setProperty("balance"+__uid,__b-__tb,"number");var __tw=price-__tb;if(__tw>0)Libs.ResourcesLib.userRes("balance").add(-__tw);})();174 175    var pastSpent = Bot.getProperty("total_spent_by_" + userId) || 0;176    Bot.setProperty("total_spent_by_" + userId, Number(pastSpent) + price, "number");177 178 179    var userKeysHistory = User.getProperty("my_purchased_keys") || [];180    userKeysHistory.push({181      product: prodName,182      product_id: prodId,183      days: pDaysNumOnly,184      price: price,185      key: generatedKey,186      date: new Date().toLocaleDateString()187    });188    User.setProperty("my_purchased_keys", userKeysHistory, "json");189 190    var remainingBal = (Number(Libs.ResourcesLib.userRes("balance").value()||0)+Number(Bot.getProperty("balance"+user.telegramid)||0)).toFixed(2);191    192    var updateLinkForKey = Bot.getProperty("update_channel_link");193    var keyDeliveryButtons = [[{ text: "📋 Copy Key", copy_text: { text: generatedKey } }]];194    if (updateLinkForKey) {195      keyDeliveryButtons.push([{ text: "📁 Files Channel", url: updateLinkForKey, style: "primary", icon_custom_emoji_id: "6091571559233755994" }]);196    }197    keyDeliveryButtons.push([{ text: "Back to Menu", callback_data: "/back", style: "danger", icon_custom_emoji_id: "5893163582194978381" }]);198    var keyDeliveryMarkup = JSON.stringify({ inline_keyboard: keyDeliveryButtons });199 200    var deliverText = "<blockquote>" +201                      "<tg-emoji emoji-id='5350447674971660988'>✅</tg-emoji> <b>PURCHASE SUCCESSFUL!</b>\n\n" +202                      "<tg-emoji emoji-id='6147767796097884213'>📦</tg-emoji> <b>Product:</b> <code>" + prodName + "</code>\n" +203                      "<tg-emoji emoji-id='6284816251143331422'>🗝</tg-emoji> <b>Validity:</b> <code>" + durationDisplayW + "</code>\n" +204                      "<tg-emoji emoji-id='5352825278672412291'>👆</tg-emoji> <b>Your Key:</b> <code>" + generatedKey + "</code>\n\n" +205                      "━━━━━ <tg-emoji emoji-id='6147934084346682063'>#⃣</tg-emoji> <b>BALANCE DETAILS</b> ━━━━━\n" +206                      "<tg-emoji emoji-id='6195037488898121775'>✨</tg-emoji> <b>Total Invest:</b> ₹" + price.toFixed(2) + "\n" +207                      "<tg-emoji emoji-id='5409048419211682843'>💵</tg-emoji> <b>New Wallet Balance:</b> ₹" + remainingBal + "\n\n" +208                      "<i>Enjoy your purchase. <tg-emoji emoji-id='6057881002540274780'>🥳</tg-emoji></i>" +209                      "</blockquote>";210                      211    // ✅ FIX: "Processing your order..." wala purana message ab delete ho jaata212    // hai, taaki chat me sirf final key-delivery message rahe.213    try {214      var procMsgId = Bot.getProperty("gen_msg_id_" + userId) || User.getProperty("gen_msg_id_" + userId);215      if (procMsgId) {216        Api.deleteMessage({ chat_id: chatId, message_id: Number(procMsgId) });217        Bot.setProperty("gen_msg_id_" + userId, null, "string");218        User.setProperty("gen_msg_id_" + userId, null, "string");219      }220    } catch (cleanupErr) {}221 222    Api.sendMessage({223      chat_id: chatId,224      text: deliverText,225      parse_mode: "HTML",226      reply_markup: keyDeliveryMarkup227    });228 229    var adminId = String(Bot.getProperty("owner_id") || "7127818616"); 230    var deliveryMethodLabel = isApiDelivery ? "API" : "MANUAL STOCK";231    var adminMsg = "🔔 <b>NEW PURCHASE DELIVERED (" + deliveryMethodLabel + ")</b> ✔️\n\n" +232                   "👤 <b>Buyer:</b> " + firstName + " (<code>" + userId + "</code>)\n" +233                   "📦 <b>Product:</b> " + prodName + " (ID: " + (prodId || "N/A") + ")\n" +234                   "⏳ <b>Plan:</b> " + durationDisplayW + "\n" +235                   "💸 <b>Price Deducted:</b> ₹" + price.toFixed(2) + "\n" +236                   "💳 <b>User Remaining Bal:</b> ₹" + remainingBal + "\n" +237                   "🔑 <b>Key:</b> <code>" + generatedKey + "</code>" +238                   (isApiDelivery && apiOrderId ? "\n🧾 <b>API Order:</b> <code>" + apiOrderId + "</code>" : "") +239                   (isApiDelivery && apiExpires ? "\n⏳ <b>Expires:</b> <code>" + apiExpires + "</code>" : "");240                   241    Api.sendMessage({ chat_id: adminId, text: adminMsg, parse_mode: "HTML" });242 243    User.setProperty("last_pending_price", null);244    User.setProperty("last_pending_prod_name", null);245    User.setProperty("last_pending_plan_days", null);246    User.setProperty("last_pending_prod_id", null);247    User.setProperty("last_pending_plan_unit", null);248 249  } else {250    // STEP 4: BOTH FAILED (System goes into error notification mode)251    function escH(s) { return String(s === undefined || s === null ? "" : s).replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;"); }252 253    // ✅ FIX: the "Processing your order..." message used to stay stuck forever on failure.254    try {255      var failProcId = Bot.getProperty("gen_msg_id_" + userId) || User.getProperty("gen_msg_id_" + userId);256      if (failProcId) {257        Api.deleteMessage({ chat_id: chatId, message_id: Number(failProcId) });258        Bot.setProperty("gen_msg_id_" + userId, null, "string");259        User.setProperty("gen_msg_id_" + userId, null, "string");260      }261    } catch (cleanupErr2) {}262 263    Api.sendMessage({264      chat_id: chatId,265      text: "⏳ <b>Wait some time admin will stock refill soon</b>\n<i>Your funds were not deducted.</i>",266      parse_mode: "HTML",267      reply_markup: JSON.stringify({ inline_keyboard: [[{ text: "Back to Menu", callback_data: "/back", style: "danger" }]] })268    });269 270    var webBalance = "Low/Empty";271    var websiteErrorReason = "Website API Empty Response / Down";272 273    if (response) {274      webBalance = response.balance || response.website_balance || (response.data && response.data.balance) || "Low/Empty";275      websiteErrorReason = response.msg || response.message || response.error ||276        (response.data && (response.data.message || response.data.error)) ||277        (apiFailed ? "API returned an error" : "Reply me key nahi mili (unknown format) - Raw Response dekho");278    } else if (typeof content === "string" && content.trim() !== "") {279      websiteErrorReason = "Reply JSON nahi hai (galat URL / login page / HTML aa raha hai)";280    }281 282    var rawSnippet = "";283    try { rawSnippet = (typeof content === "string") ? content : JSON.stringify(content || ""); } catch (eRaw) {}284    rawSnippet = String(rawSnippet || "(empty)").replace(/\s+/g, " ").slice(0, 400);285 286    var alertAdminId = String(Bot.getProperty("owner_id") || "7127818616");287    var lowBalanceAdminMsg = "⚠️ <b>LOW BALANCE IN WEBSITE / API ERROR</b>\n" +288                             "━━━━━━━━━━━━━━━━━━━━━━━━━━\n\n" +289                             "🛒 <b>PRODUCT DETAILS:</b>\n" +290                             "📦 <b>Product Name:</b> <code>" + escH(prodName) + "</code>\n" +291                             "🆔 <b>Product ID:</b> <code>" + escH(prodId || "Not Passed") + "</code>\n" +292                             "⏳ <b>Days:</b> <code>" + escH(pDaysNumOnly) + " Days</code>\n" +293                             "💰 <b>Your Balance Website:</b> <code>" + escH(webBalance) + "</code>\n" +294                             "ℹ️ <b>API Reason:</b> <code>" + escH(websiteErrorReason) + "</code>\n" +295                             "🧾 <b>Raw Response:</b> <code>" + escH(rawSnippet) + "</code>\n\n" +296                             "👤 <b>USER DETAILS:</b>\n" +297                             "🗣 <b>User Name:</b> " + escH(usernameText) + "\n" +298                             "📛 <b>Name:</b> " + escH(firstName) + "\n" +299                             "🆔 <b>User ID:</b> <code>" + userId + "</code>\n" +300                             "💳 <b>Available Balance (User Wallet):</b> ₹" + currentWalletBal + "\n\n" +301                             "📌 <i>Action Required: Please refill your website API or add/deliver the key manually to this user!</i>";302 303    Api.sendMessage({ chat_id: alertAdminId, text: lowBalanceAdminMsg, parse_mode: "HTML" });304  }305} catch (e) {306  Bot.sendMessage("❌ Error executing delivery pipeline: " + e.message);307}
commands/_onWebKeyReceive.js · tarunpoonia905/OfcDevShopBot · TeleDevs