devbro468/Dev_x_store_botPublic · Bot Template

AIThis bot operates a digital storefront (DEV X STORE) selling subscription-based products — likely game hacks, accounts, or access keys — categorized by platform (Android Root, Non-Root, iPhone). It features a reseller program with discounted pricing, a dual-currency wallet (INR balance + Telegram Stars/XTR), and a full admin/co-admin panel for managing products, plans, per-plan pricing, stock (keys/accounts), coupons, and API endpoints. Purchases flow through a plan selection screen offering wallet payment, Stars invoices (sendInvoice with XTR currency), and coupon application. Successful Stars payments are handled via successful_payment webhook, crediting wallet or delivering keys directly. Admin tools include user listing with chunked messaging, stock viewing/deletion with inline keyboards, co-admin management, and API registry updates. The bot registers users on first interaction and

Commercecommercedigital-goodsstars-paymentreseller-systemadmin-panelstock-management
ProfileTelegram
119 commands0 envUpdated 15d agoCreated Aug 23, 2026
Back to folder

commands/_viewprod.js

javascript · 145 lines

Raw
1/**#command2name: /viewprod3answer: 4keyboard: 5parse_mode: markdown6aliases: 7allow_only_group: false8need_reply: false9is_web: 010#command**/11 12// =========================================================13// 📦 Shows a product's plans (Step 2 of the buy flow)14// ✅ CRITICAL BUG FIX: pehle "<tg-emoji emoji-id='X'></tg-emoji>" ek EMPTY15// tag tha (koi fallback character nahi) — Telegram ka HTML parser aise16// malformed tg-emoji tag par POORA MESSAGE hi reject kar deta hai. Isi17// wajah se product par click karne par plan-list screen kabhi aati hi nahi18// thi — poora buy flow yahi pe tootta tha!19// ✅ Photo-message-edit bug bhi fix, aur missing else-branch (fresh send)20// bhi add kiya.21// =========================================================22 23try {24  var productList = Bot.getProperty("stored_products") || [];25  var callbackId = request ? request.id : null;26  var chatId = chat.chatid;27  var messageId = request && request.message ? request.message.message_id : (request ? request.message_id : null);28  var isPhotoMsg = !!(request && request.message && request.message.photo);29 30  var userId = user.telegramid;31  var isReseller = Bot.getProperty("is_reseller_" + userId) === true;32 33  var productIndex = params ? params.trim() : "";34  if (productIndex === "") {35    var cbData = request && request.callback_query ? request.callback_query.data : "";36    productIndex = cbData.replace("/viewprod ", "").replace("viewprod ", "");37  }38 39  var selectedProduct = productList[Number(productIndex)];40 41  if (!selectedProduct) {42    if (callbackId) {43      try { Api.answerCallbackQuery({ callback_query_id: String(callbackId), text: "⚠️ Product not found!", show_alert: true }); } catch (e) {}44    }45    return;46  }47 48  var planButtons = [];49  var productEmojiId = selectedProduct.emoji ? String(selectedProduct.emoji) : "6102856637343600044";50 51  var plans = selectedProduct.plans || [];52 53  if (plans.length === 0) {54    plans = [55      { days: "1", normal_price: "79", reseller_price: "65" },56      { days: "7", normal_price: "350", reseller_price: "300" }57    ];58  }59 60  for (var j = 0; j < plans.length; j++) {61    var plan = plans[j];62    var planUnit = plan.unit || "day";63 64    var cleanProdName = selectedProduct.name.trim().toUpperCase();65    var cleanPlanDays = String(plan.days).replace(/[^0-9.]/g, "").trim();66 67    var priceKeySuffix = (planUnit === "day") ? cleanPlanDays : (cleanPlanDays + "_" + planUnit);68    var normalKey = "price_normal_" + cleanProdName + "_" + priceKeySuffix;69    var resellerKey = "price_reseller_" + cleanProdName + "_" + priceKeySuffix;70 71    var adminNormalPrice = Bot.getProperty(normalKey);72    var adminResellerPrice = Bot.getProperty(resellerKey);73 74    var currentNormal = (adminNormalPrice !== undefined && adminNormalPrice !== null) ? adminNormalPrice : plan.normal_price;75    var currentReseller = (adminResellerPrice !== undefined && adminResellerPrice !== null) ? adminResellerPrice : plan.reseller_price;76 77    var displayPrice = isReseller ? currentReseller : currentNormal;78    var unitLabelWord = (planUnit === "hour") ? (Number(cleanPlanDays) === 1 ? "Hour" : "Hours") :79                         (planUnit === "minute") ? (Number(cleanPlanDays) === 1 ? "Minute" : "Minutes") :80                         (Number(cleanPlanDays) === 1 ? "Day" : "Days");81    var dayLabel = plan.durationDisplay || (cleanPlanDays + " " + unitLabelWord);82 83    // 🎉 Discount badge preview (auto-discount only, coupon shown later on confirm screen)84    var discPreviewKey1 = "auto_discount_" + cleanProdName + "_" + cleanPlanDays + "_" + planUnit.toUpperCase();85    var discPreviewKey2 = "auto_discount_" + cleanProdName + "_ALL";86    var discPreview = Bot.getProperty(discPreviewKey1) || Bot.getProperty(discPreviewKey2) || Bot.getProperty("auto_discount_global") || 0;87    var badgeText = discPreview > 0 ? " 🎉-" + discPreview + "%" : "";88 89    planButtons.push([90      {91        text: dayLabel + " — ₹" + displayPrice + badgeText,92        callback_data: "/buyitem " + productIndex + " " + j,93        style: "primary",94        icon_custom_emoji_id: "6100657257605763582"95      }96    ]);97  }98 99  // ✅ NEW: Back button ab is product ki category wali list par le jaata hai100  // (Android Root / Android Non Root), generic /buy_hack (category-select) par nahi.101  var backCategory = selectedProduct.category ? String(selectedProduct.category).toLowerCase() : "both";102  var backCallback = (backCategory === "root") ? "/buy_hack_cat root" : (backCategory === "iphone") ? "/buy_hack_cat iphone" : "/buy_hack_cat nonroot";103 104  planButtons.push([105    {106      text: "Back to Shop",107      callback_data: backCallback,108      style: "danger",109      icon_custom_emoji_id: "5893163582194978381"110    }111  ]);112 113  // ✅ FIX: empty tg-emoji tag hata diya — ab sirf plain product emoji text hai114  var planText =115    "<blockquote><tg-emoji emoji-id='" + productEmojiId + "'>📦</tg-emoji> <b>PRODUCT: " + selectedProduct.name.toUpperCase() + "</b></blockquote>\n\n" +116    "<tg-emoji emoji-id='6093677128295914531'>✏️</tg-emoji> <b>CHOOSE YOUR PLAN</b> <tg-emoji emoji-id='6093677128295914531'>✏️</tg-emoji>\n\n" +117    "<blockquote><tg-emoji emoji-id='6093854128193152827'>🎉</tg-emoji> Select your validity plan below to proceed with the secure order <tg-emoji emoji-id='6091571559233755994'>👉</tg-emoji></blockquote>";118 119  var replyMarkupStr = JSON.stringify({ inline_keyboard: planButtons });120 121  if (messageId) {122    if (isPhotoMsg) {123      try { Api.deleteMessage({ chat_id: chatId, message_id: messageId }); } catch (e) {}124      Api.sendMessage({ chat_id: chatId, text: planText, parse_mode: "HTML", reply_markup: replyMarkupStr });125    } else {126      Api.editMessageText({127        chat_id: chatId,128        message_id: Number(messageId),129        text: planText,130        parse_mode: "HTML",131        reply_markup: replyMarkupStr132      });133    }134  } else {135    // ✅ FIX: pehle is case me kuch bhejta hi nahi tha136    Api.sendMessage({ chat_id: chatId, text: planText, parse_mode: "HTML", reply_markup: replyMarkupStr });137  }138 139  if (callbackId) {140    try { Api.answerCallbackQuery({ callback_query_id: String(callbackId) }); } catch (e) {}141  }142 143} catch (err) {144  Bot.sendMessage("⚠️ View Product Error: " + err.message, { parse_mode: "HTML" });145}