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/_addstock.js

javascript · 151 lines

Raw
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,"&lt;").replace(/>/g,"&gt;") + "</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,"&lt;").replace(/>/g,"&gt;") + "</code>", {parse_mode:"HTML"});151}
commands/_addstock.js · tarunpoonia905/OfcDevShopBot · TeleDevs