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/_addstock.js
javascript · 151 lines
1/**#command2name: _addstock3answer: 4keyboard: 5parse_mode: 6aliases: 7allow_only_group: false8need_reply: false9is_web: 010#command**/11 12/**#command13name: /addstock14answer:15keyboard:16parse_mode: markdown17aliases:18allow_only_group: false19need_reply: false20case_insensitive: false21is_web: 022#end**/23 24/*25 /addstock PRODUCT NAME | DURATION | KEY1 KEY2 ...26 1 key = 1 stock.27 Stock is isolated by Product + Duration + Unit.28 Duplicate and previously-sold keys are rejected.29*/30try {31 var adminId = Bot.getProperty("owner_id") || "7127818616";32 var isCoAdmin = Bot.getProperty("co_admin_" + String(chat.chatid));33 if ((String(chat.chatid) !== String(adminId) && !Bot.getProperty("co_admin_" + String(chat.chatid))) && !isCoAdmin) {34 Bot.sendMessage("❌ You are not the admin!");35 return;36 }37 38 var input = String(params || "").trim();39 var parts = input.split("|");40 if (parts.length < 3) {41 Bot.sendMessage("❌ <b>Format:</b> <code>/addstock PRODUCT NAME | DURATION | KEY1 KEY2 ...</code>", {parse_mode:"HTML"});42 return;43 }44 45 var productName = parts[0].trim();46 var durationText = parts[1].trim();47 var keyText = parts.slice(2).join("|").trim();48 49 var products = Bot.getProperty("stored_products") || [];50 var product = null;51 for (var i = 0; i < products.length; i++) {52 if (String(products[i].name || "").trim().toLowerCase() === productName.toLowerCase()) {53 product = products[i];54 productName = String(products[i].name).trim();55 break;56 }57 }58 if (!product) {59 Bot.sendMessage("❌ Product nahi mila: <code>" + productName.replace(/</g,"<").replace(/>/g,">") + "</code>", {parse_mode:"HTML"});60 return;61 }62 63 var rawDur = durationText.replace(/\s+/g, " ").trim();64 var dm = rawDur.toLowerCase().match(/^([0-9]+(?:\.[0-9]+)?)\s*(h|hr|hrs|hour|hours|d|day|days|m|min|mins|minute|minutes)$/);65 var value = null, unit = null;66 67 if (dm) {68 value = dm[1];69 if (/^h/.test(dm[2])) unit = "hour";70 else if (/^m/.test(dm[2])) unit = "minute";71 else unit = "day";72 } else {73 for (var p = 0; p < (product.plans || []).length; p++) {74 var pp = product.plans[p];75 var labels = [pp.durationDisplay, pp.api_duration, pp.name_on_website];76 for (var l = 0; l < labels.length; l++) {77 if (labels[l] && String(labels[l]).trim().toLowerCase() === rawDur.toLowerCase()) {78 value = String(pp.days);79 unit = pp.unit || "day";80 break;81 }82 }83 if (value !== null) break;84 }85 }86 87 if (value === null) {88 Bot.sendMessage("❌ Duration match nahi hua. Example: <code>1d</code>, <code>2 days</code>, <code>1h</code>, <code>16 hours</code>.", {parse_mode:"HTML"});89 return;90 }91 92 var productSlug = productName.toUpperCase().replace(/[^A-Z0-9_-]/g, "_");93 var stockKey = "manual_keys_" + productSlug + "_" + value + "_" + unit;94 var stock = Bot.getProperty(stockKey) || [];95 if (!Array.isArray(stock)) stock = [];96 97 var soldIndex = Bot.getProperty("manual_sold_key_index") || {};98 if (!soldIndex || typeof soldIndex !== "object") soldIndex = {};99 100 // Prevent a key from being added twice anywhere in manual stock.101 var existingIndex = {};102 for (var si = 0; si < products.length; si++) {103 var sp = products[si];104 var spSlug = String(sp.name || "").toUpperCase().replace(/[^A-Z0-9_-]/g, "_");105 var splans = sp.plans || [];106 for (var sj = 0; sj < splans.length; sj++) {107 var sv = String(splans[sj].days);108 var su = splans[sj].unit || "day";109 var sk = "manual_keys_" + spSlug + "_" + sv + "_" + su;110 var ss = Bot.getProperty(sk) || [];111 if (!Array.isArray(ss)) continue;112 for (var sx = 0; sx < ss.length; sx++) existingIndex[String(ss[sx]).trim()] = true;113 }114 }115 116 var rawKeys = keyText.split(/[\s,\n]+/).map(function(k){return String(k).trim();}).filter(Boolean);117 var accepted = [];118 var acceptedSet = {}; // v63: O(n) dedupe — unlimited keys, koi limit nahi119 var duplicateCount = 0;120 var soldAgainCount = 0;121 122 for (var k = 0; k < rawKeys.length; k++) {123 var key = rawKeys[k];124 if (soldIndex[key]) {125 soldAgainCount++;126 continue;127 }128 if (existingIndex[key] || acceptedSet[key]) {129 duplicateCount++;130 continue;131 }132 acceptedSet[key] = true;133 accepted.push(key);134 }135 136 for (var a = 0; a < accepted.length; a++) stock.push(accepted[a]);137 Bot.setProperty(stockKey, stock, "json");138 139 Bot.sendMessage(140 "📦 <b>STOCK UPDATED</b>\n\n" +141 "📌 <b>Panel:</b> <code>" + productName + "</code>\n" +142 "⏱️ <b>Duration:</b> <code>" + rawDur + "</code>\n" +143 "➕ <b>Added:</b> <code>" + accepted.length + "</code>\n" +144 "📊 <b>Current Stock:</b> <code>" + stock.length + "</code>\n" +145 "♻️ <b>Duplicates skipped:</b> <code>" + duplicateCount + "</code>\n" +146 "🚫 <b>Already sold keys skipped:</b> <code>" + soldAgainCount + "</code>",147 {parse_mode:"HTML"}148 );149} catch (e) {150 Bot.sendMessage("❌ /addstock error: <code>" + String(e.message || e).replace(/</g,"<").replace(/>/g,">") + "</code>", {parse_mode:"HTML"});151}