tarunpoonia905/OfcDevShopBotPublic · Bot Template
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
commands/_onWebKeyReceive.js
javascript · 307 lines
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, "&").replace(/</g, "<").replace(/>/g, ">"); }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}