indrajitghosh20006/Igstore_01botPublic ยท Bot Template

ProfileTelegram

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
Back to folder

commands/_menu.js

javascript ยท 179 lines

Raw
1/**#command2name: /menu3answer: 4keyboard: 5parse_mode: markdown6aliases: 7allow_only_group: false8need_reply: false9is_web: 010#command**/11 12// PREMIUM BUTTON ICONS13(function(){14  try {15    if (!JSON.__premiumPatched) {16      var __origStringify = JSON.stringify;17      JSON.stringify = function(value, replacer, space) {18        try {19          if (value && value.inline_keyboard && Array.isArray(value.inline_keyboard)) {20            var premiumIds = [21              "6143444134125379822",22              "6091379307907652768",23              "6147534454819661264",24              "6147817325660741985",25              "6235683689292897318",26              "6102856637343600044"27            ];28            var rows = value.inline_keyboard.map(function(row, ri) {29              if (!Array.isArray(row)) return row;30              return row.map(function(btn, bi) {31                if (!btn || typeof btn !== "object") return btn;32                var copy = {};33                for (var k in btn) copy[k] = btn[k];34                if (!copy.icon_custom_emoji_id) copy.icon_custom_emoji_id = premiumIds[(ri + bi) % premiumIds.length];35                return copy;36              });37            });38            var cloned = {};39            for (var key in value) cloned[key] = value[key];40            cloned.inline_keyboard = rows;41            return __origStringify.call(JSON, cloned, replacer, space);42          }43        } catch (e) {}44        return __origStringify.call(JSON, value, replacer, space);45      };46      JSON.__premiumPatched = true;47    }48  } catch (e) {}49})();50 51 52 53// =========================================================54// ๐Ÿ  MEMBER MAIN SHOP MENU55// - Personalized welcome name56// - Owner-configurable store name57// - Download Files button is always LAST58// - Back returns to this same menu59// =========================================================60try {61  var userId = String(user.telegramid);62  var uid = userId;63  var chatId = String(chat.chatid);64  var storeName = String(Bot.getProperty("store_name") || "๐™„๐™‚ ๐™Ž๐™๐™Š๐™๐™€");65  var firstName = String((user && user.first_name) || "User");66 67  // Basic HTML escaping for Telegram HTML parse mode.68  firstName = firstName.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;");69  storeName = storeName.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;");70 71  var resBal = 0;72  try { resBal = Number(Libs.ResourcesLib.userRes("balance").value()) || 0; } catch (e) {}73  var bonusBal = Number(Bot.getProperty("balance" + userId) || 0);74  var userBal = (resBal + bonusBal).toFixed(2);75 76  var welcomeMessage =77    "<tg-emoji emoji-id=\"6091170843080007327\">๐Ÿ›’</tg-emoji> โ”โ”โ”โ” <b>" + storeName + "</b> โ”โ”โ”โ” <tg-emoji emoji-id=\"6091170843080007327\">๐Ÿ›’</tg-emoji>\n\n" +78    "<tg-emoji emoji-id=\"6057721277001504261\">๐Ÿ‘‘</tg-emoji> <b>Welcome, " + firstName + "!</b>\n\n" +79    "<tg-emoji emoji-id=\"6147565374289220368\">๐Ÿ”</tg-emoji> <b>โ”โ” STORE HIGHLIGHTS โ”โ”</b> <tg-emoji emoji-id=\"6147565374289220368\">๐Ÿ”</tg-emoji>\n\n" +80    "<tg-emoji emoji-id=\"6285210748184434476\">๐ŸŽฎ</tg-emoji> Premium Game Keys\n" +81    "<tg-emoji emoji-id=\"6205981761353030383\">๐Ÿผ</tg-emoji> Instant Delivery 24/7\n" +82    "<tg-emoji emoji-id=\"6055639815590781298\">๐Ÿ’ฏ</tg-emoji> 100% Secure Payment\n" +83    "<tg-emoji emoji-id=\"6059653892025618055\">๐Ÿ›</tg-emoji> Best Prices Guaranteed\n" +84    "<tg-emoji emoji-id=\"6053197860395033789\">๐Ÿ‡ฎ๐Ÿ‡ณ</tg-emoji> Safe And Trusted\n" +85    "<tg-emoji emoji-id=\"6208445114075847396\">โœ…</tg-emoji> Professional Support\n" +86    "โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\n" +87    "<tg-emoji emoji-id=\"6267068789146260253\">๐Ÿ’ฐ</tg-emoji> <b>Wallet Balance: โ‚น" + userBal + "</b>\n" +88    "โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€\n\n" +89    "<tg-emoji emoji-id=\"6064280370667332428\">๐Ÿ”ฅ</tg-emoji> <b>Tap Shop Now to Start!</b>";90 91  // ๐ŸŽ› ADMIN-CONTROLLED MAIN MENU UI92  // Name + Premium Emoji + Button Color + Row/Category can be changed from /manage_button.93  var buttonDefaults = {94    shop:     { name:"Shop / Store Product", callback:"/buy_hack",       style:"danger",  emoji:"6143444134125379822", row:1 },95    addfund:  { name:"Add Balance",          callback:"/addfund",         style:"success", emoji:"5409048419211682843", row:2 },96    profile:  { name:"My Profile",           callback:"/profile",         style:"primary", emoji:"6091379307907652768", row:2 },97    how:      { name:"How To Use",            callback:"/how",             style:"primary", emoji:"5341357385279612709", row:3 },98    lucky:    { name:"Lucky",                 callback:"/ludospin",        style:"success", emoji:"6116155973510895366", row:3 },99    share:    { name:"Share",                 callback:"/referral",        style:"primary", emoji:"6147534454819661264", row:4 },100    support:  { name:"Support",               callback:"/support",         style:"primary", emoji:"6147817325660741985", row:4 },101    download: { name:"Download File",         callback:"/download_updates",style:"primary", emoji:"6235683689292897318", row:5 },102    reseller: { name:"Reseller VIP",          callback:"/reseller_upgrade",style:"success",emoji:"6102856637343600044", row:5 }103  };104 105  var theme = String(Bot.getProperty("ui_theme") || "mixed").toLowerCase();106  var themeStyle = { blue:"primary", green:"success", red:"danger", mixed:null }[theme] || null;107  var active = [];108  Object.keys(buttonDefaults).forEach(function(k){109    if (k === "reseller" && !(Bot.getProperty("reseller_system_enabled") && !Bot.getProperty("is_reseller_" + userId))) return;110    var d = buttonDefaults[k];111    var n = String(Bot.getProperty("menu_btn_name_" + k) || d.name);112    var e = String(Bot.getProperty("menu_btn_emoji_" + k) || d.emoji);113    var st = String(Bot.getProperty("menu_btn_style_" + k) || d.style).toLowerCase();114    var row = parseInt(Bot.getProperty("menu_btn_row_" + k), 10);115    if (!row || row < 1 || row > 5) row = d.row;116    if (["primary","success","danger"].indexOf(st) === -1) st = d.style;117    if (themeStyle) st = themeStyle;118    active.push({ key:k, text:n, callback_data:d.callback, style:st, icon_custom_emoji_id:e, row:row });119  });120 121  // Keep Download + Reseller together by default, while allowing admin row changes.122  active.sort(function(a,b){ return a.row-b.row || a.key.localeCompare(b.key); });123  var keyboard = [];124  for (var rr=1; rr<=5; rr++) {125    var group = active.filter(function(x){ return x.row === rr; });126    if (group.length) {127      var rowButtons = group.map(function(x){128        return { text:x.text, callback_data:x.callback_data, style:x.style, icon_custom_emoji_id:x.icon_custom_emoji_id };129      });130      keyboard.push(rowButtons);131    }132  }133 134  var markup = JSON.stringify({ inline_keyboard: keyboard });135  var photoId = Bot.getProperty("start_photo_file_id");136 137  if (request && request.id) {138    try { Api.answerCallbackQuery({ callback_query_id: String(request.id) }); } catch (e0) {}139  }140 141  if (photoId && request && request.message && request.message.message_id && request.message.photo) {142    try {143      Api.editMessageCaption({144        chat_id: chatId,145        message_id: Number(request.message.message_id),146        caption: welcomeMessage,147        parse_mode: "HTML",148        reply_markup: markup149      });150      return;151    } catch (photoEditErr) {152      try { Api.deleteMessage({ chat_id: chatId, message_id: Number(request.message.message_id) }); } catch (delPhotoErr) {}153    }154  }155 156  if (request && request.message && request.message.message_id) {157    try { Api.deleteMessage({ chat_id: chatId, message_id: Number(request.message.message_id) }); } catch (delErr) {}158  }159 160  if (photoId) {161    Api.sendPhoto({162      chat_id: chatId,163      photo: String(photoId),164      caption: welcomeMessage,165      parse_mode: "HTML",166      reply_markup: markup167    });168  } else {169    Api.sendMessage({170      chat_id: chatId,171      text: welcomeMessage,172      parse_mode: "HTML",173      reply_markup: markup174    });175  }176 177} catch (err) {178  Bot.sendMessage("๐Ÿ›‘ <b>Menu Error:</b> <code>" + String(err.message || err) + "</code>", { parse_mode: "HTML" });179}