ashoksarande3/ASHOK_HACK_STORE_BOTPublic ยท Bot Template
AIThis bot operates as a commercial storefront for selling Free Fire game hacks and cheats via UPI QR code payments. It features a dynamic pricing system with separate normal and reseller prices, product plans with flexible durations (days, hours, minutes), and a reseller program requiring a one-time upgrade fee. The bot handles payment verification through QR code generation and expiry tracking, user verification via Telegram contact sharing, and admin tools for stock management, plan creation, and ownership transfer. It includes a balance system, maintenance mode, and Telegram Stars payment fallback. The codebase uses TeleBotHost's TBL JavaScript APIs (Bot, Api, HTTP, db properties, Libs) for all logic.
commands/_onBuyCheck.js
javascript ยท 397 lines
1/**#command2name: /onBuyCheck3answer: 4keyboard: 5parse_mode: markdown6aliases: 7allow_only_group: false8need_reply: false9is_web: 010#command**/11 12try {13 var userId = user.telegramid;14 15 // โ
CRITICAL FIX: Proper atomic duplicate-payment prevention16 var utrFromContent = null;17 18 // Parse content to get UTR early19 if (content) {20 var res = (typeof content === "object") ? content : JSON.parse(content);21 if (res && res.data && res.data.utr) {22 utrFromContent = res.data.utr;23 }24 }25 26 // ๐ STEP 1: Check if payment already processed using UTR (most reliable identifier)27 if (utrFromContent && Bot.getProperty("paid_" + utrFromContent)) {28 // โ
FIX: Vanish the QR completely instead of leaving a stale "already used" caption behind29 try {30 Api.deleteMessage({ chat_id: chat.chatid, message_id: request.message.message_id });31 } catch (e) {}32 33 try {34 Bot.setProperty("buy_qr_msg_id_" + userId, null, "string");35 User.setProperty("buy_qr_msg_id_" + userId, null, "string");36 } catch (e) {}37 38 if (request && request.id) {39 try {40 Api.answerCallbackQuery({41 callback_query_id: String(request.id),42 text: "โ
ALREADY CLAIMED โ
\nYe order pehle hi deliver ho chuka hai.",43 show_alert: true44 });45 } catch (e) {}46 }47 48 Api.sendMessage({49 chat_id: chat.chatid,50 text: "<blockquote><tg-emoji emoji-id='5330237710655306682'>โ
</tg-emoji> <b>ORDER ALREADY CLAIMED</b>\n<i>Ye payment pehle hi verify ho kar item deliver ho chuka hai. Apni keys 'All History' me check karein.</i></blockquote>",51 parse_mode: "HTML",52 reply_markup: JSON.stringify({53 inline_keyboard: [[54 { text: "๐ My Keys", callback_data: "/mykey", style: "primary" },55 { text: "๐ Shop Menu", callback_data: "/buy_hack", style: "success" }56 ]]57 })58 });59 return;60 }61 62 // ๐ STEP 2: Duplicate-click lock check63 var isChecking = User.getProperty("buy_verifying_lock_" + userId);64 if (isChecking) {65 if (request && request.id) {66 Api.answerCallbackQuery({67 callback_query_id: String(request.id),68 text: "โณ ALREADY CHECKING โ PLEASE WAIT...",69 show_alert: true70 });71 }72 return;73 }74 75 // ๐ STEP 3: SET LOCK IMMEDIATELY before any async operations76 User.setProperty("buy_verifying_lock_" + userId, true, "boolean");77 78 if (!content) {79 Api.editMessageCaption({80 chat_id: chat.chatid, message_id: request.message.message_id,81 caption: "<blockquote>โ ๏ธ <b>Server didn't respond.</b>\nClick 'I have paid' again.</blockquote>", parse_mode: "HTML"82 });83 User.setProperty("buy_verifying_lock_" + userId, false, "boolean");84 return;85 }86 87 var res = (typeof content === "object") ? content : JSON.parse(content);88 89 if (res.status === "success" && res.data) {90 var utr = res.data.utr;91 var isPaid = Bot.getProperty("paid_" + utr);92 93 if (isPaid) {94 // โ
FIX: Vanish the QR completely instead of leaving a stale "already used" caption behind95 try {96 Api.deleteMessage({ chat_id: chat.chatid, message_id: request.message.message_id });97 } catch (e) {}98 99 try {100 Bot.setProperty("buy_qr_msg_id_" + userId, null, "string");101 User.setProperty("buy_qr_msg_id_" + userId, null, "string");102 } catch (e) {}103 104 if (request && request.id) {105 try {106 Api.answerCallbackQuery({107 callback_query_id: String(request.id),108 text: "โ
ALREADY CLAIMED โ
\nYe order pehle hi deliver ho chuka hai.",109 show_alert: true110 });111 } catch (e) {}112 }113 114 Api.sendMessage({115 chat_id: chat.chatid,116 text: "<blockquote><tg-emoji emoji-id='5330237710655306682'>โ
</tg-emoji> <b>ORDER ALREADY CLAIMED</b>\n<i>Ye payment pehle hi verify ho kar item deliver ho chuka hai. Apni keys 'All History' me check karein.</i></blockquote>",117 parse_mode: "HTML",118 reply_markup: JSON.stringify({119 inline_keyboard: [[120 { text: "๐ My Keys", callback_data: "/mykey", style: "primary" },121 { text: "๐ Shop Menu", callback_data: "/buy_hack", style: "success" }122 ]]123 })124 });125 User.setProperty("buy_verifying_lock_" + userId, false, "boolean");126 return;127 }128 129 // โ
IMMEDIATELY mark as paid BEFORE any async API calls to prevent race condition130 Bot.setProperty("paid_" + utr, true, "boolean");131 132 Api.editMessageCaption({133 chat_id: chat.chatid, message_id: request.message.message_id,134 caption: "<tg-emoji emoji-id='6192822213486321961'>๐</tg-emoji> <b>Payment verified! Delivering your key...</b>",135 parse_mode: "HTML"136 });137 138 // โ
FIX: Detect which purchase pipeline this QR payment belongs to.139 // "ffid" = local stock-based FF ID item (set by /execute_id_buy on low balance)140 // default/"plan" = original plan-based product via external xyzcheats API141 var flowType = User.getProperty("buy_flow_type") || "plan";142 143 if (flowType === "ffid") {144 // =========================================================145 // ๐ฎ FF ID STOCK DELIVERY (after successful QR payment)146 // =========================================================147 try {148 var rawType = User.getProperty("buy_ffid_rawtype") || "";149 var isResellerFlow = User.getProperty("buy_ffid_is_reseller") === true;150 var finalCost = Number(User.getProperty("buy_price") || 0);151 var displayTypeName = User.getProperty("buy_prod_name") || rawType;152 153 var stockData = [];154 var isDynamicCategory = false;155 var isGeneralCategory = false;156 var selectedCat = null;157 158 var fbCategories = Bot.getProperty("fb_categories") || [];159 if (!Array.isArray(fbCategories)) { fbCategories = []; }160 161 if (rawType.indexOf("fb_") === 0) {162 isDynamicCategory = true;163 var targetCatId = rawType.replace("fb_", "").trim();164 for (var i = 0; i < fbCategories.length; i++) {165 if (fbCategories[i].id === targetCatId) { selectedCat = fbCategories[i]; break; }166 }167 if (selectedCat) { stockData = selectedCat.stock_list || []; }168 } else if (rawType === "fb" || rawType === "google") {169 stockData = Bot.getProperty("ff_stock_" + rawType) || [];170 } else {171 isGeneralCategory = true;172 var categoriesFF = Bot.getProperty("ff_categories") || {};173 selectedCat = categoriesFF[rawType];174 if (selectedCat) {175 var fallbackStock = Bot.getProperty("ff_stock_" + rawType) || [];176 stockData = (selectedCat.stock_list && selectedCat.stock_list.length > 0) ? selectedCat.stock_list : fallbackStock;177 }178 }179 180 if (!stockData || stockData.length === 0) {181 Api.editMessageCaption({182 chat_id: chat.chatid, message_id: request.message.message_id,183 caption: "โ ๏ธ Payment received but item went out of stock. Contact admin with UTR: " + utr,184 parse_mode: "HTML"185 });186 User.setProperty("buy_verifying_lock_" + userId, false, "boolean");187 return;188 }189 190 var accountExtracted = stockData.shift();191 192 if (isDynamicCategory && selectedCat) {193 selectedCat.stock_list = stockData;194 Bot.setProperty("fb_categories", fbCategories, "json");195 } else if (isGeneralCategory && selectedCat) {196 selectedCat.stock_list = stockData;197 var categoriesFF2 = Bot.getProperty("ff_categories") || {};198 categoriesFF2[rawType] = selectedCat;199 Bot.setProperty("ff_categories", categoriesFF2, "json");200 Bot.setProperty("ff_stock_" + rawType, stockData, "json");201 } else {202 Bot.setProperty("ff_stock_" + rawType, stockData, "json");203 }204 205 var fullRawString = String(accountExtracted || "").trim();206 var emailData = fullRawString;207 var passwordData = "No Password Found";208 209 if (fullRawString.indexOf("|") !== -1) {210 var lastPipeIndex = fullRawString.lastIndexOf("|");211 var firstPart = fullRawString.substring(0, lastPipeIndex).trim();212 var secondPart = fullRawString.substring(lastPipeIndex + 1).trim();213 214 if (firstPart.indexOf(" ") !== -1) {215 var spaceParts = firstPart.split(" ");216 emailData = spaceParts[spaceParts.length - 1].trim();217 } else {218 emailData = firstPart;219 }220 passwordData = secondPart;221 }222 223 var purchasedKeys = User.getProperty("my_purchased_keys") || [];224 if (!Array.isArray(purchasedKeys)) { purchasedKeys = []; }225 var currentDate = new Date().toLocaleDateString('en-IN', { timeZone: "Asia/Kolkata" });226 purchasedKeys.push({227 productName: displayTypeName,228 cost: finalCost.toString(),229 key: emailData + (passwordData !== "No Password Found" ? " | " + passwordData : ""),230 days: "Permanent",231 date: currentDate232 });233 User.setProperty("my_purchased_keys", purchasedKeys, "json");234 235 var deliveryText =236 "โโโโโโโโโโโโโโโโโโโโโโโโโโ\n" +237 "โ โค๏ธโ๐ฅ <b>PURCHASE SUCCESSFUL!</b> โค๏ธโ๐ฅ โ\n" +238 "โโโโโโโโโโโโโโโโโโโโโโโโโโ\n\n" +239 "๐ฆ <b>Item:</b> <code>" + displayTypeName + "</code>\n" +240 "๐ฐ <b>Paid:</b> <code>โน" + finalCost + "</code> " + (isResellerFlow ? "<b>(Reseller)</b>" : "") + "\n" +241 "โโโโโโโโโโโโโโโโโโโโโโโโโโ\n" +242 "๐ค <b>ACCOUNT DETAILS:</b>\n\n" +243 "๐ <b>Email:</b> <code>" + emailData + "</code>\n" +244 "๐ <b>Password:</b> <code>" + passwordData + "</code>\n" +245 "โโโโโโโโโโโโโโโโโโโโโโโโโโ\n" +246 "โ ๏ธ <i>Copy details instantly.</i>";247 248 Api.sendMessage({249 chat_id: chat.chatid,250 text: deliveryText,251 parse_mode: "HTML"252 });253 254 var adminLogChannel = "8660373585";255 var adminNotificationMsg =256 "<blockquote>โ ๏ธ <b>NEW ORDER ALERT (QR)</b>" + (isResellerFlow ? " [RESELLER]" : "") + "</blockquote>\n" +257 "๐ค <b>User:</b> <a href='tg://user?id=" + userId + "'>" + user.first_name + "</a> (<code>" + userId + "</code>)\n" +258 "๐ฆ <b>Item:</b> <code>" + displayTypeName + "</code>\n" +259 "๐ฐ <b>Revenue:</b> <code>โน" + finalCost + "</code>\n" +260 "โก <b>Stock Left:</b> <code>" + stockData.length + " units</code>\n\n" +261 "๐ฅ <b>ACCOUNT DETAILS:</b>\n" +262 "โ <b>Email:</b> <code>" + emailData + "</code>\n" +263 "โ <b>Password:</b> <code>" + passwordData + "</code>";264 265 Api.sendMessage({266 chat_id: adminLogChannel,267 text: adminNotificationMsg,268 parse_mode: "HTML"269 });270 271 // Cleanup all buy_ state for this order272 User.setProperty("buy_flow_type", null, "string");273 User.setProperty("buy_ffid_rawtype", null, "string");274 User.setProperty("buy_ffid_is_reseller", null, "boolean");275 User.setProperty("buy_price", null, "number");276 User.setProperty("buy_needpay", null, "number");277 User.setProperty("buy_prod_name", null, "string");278 User.setProperty("buy_pending_order_id", null);279 Bot.setProperty("buy_qr_msg_id_" + userId, null, "string");280 User.setProperty("buy_qr_msg_id_" + userId, null, "string");281 Bot.setProperty("buy_qr_caption_" + userId, null, "string");282 User.setProperty("buy_qr_caption_" + userId, null, "string");283 Bot.setProperty("buy_qr_buttons_" + userId, null, "string");284 User.setProperty("buy_qr_buttons_" + userId, null, "string");285 286 } catch (ffErr) {287 Api.editMessageCaption({288 chat_id: chat.chatid, message_id: request.message.message_id,289 caption: "โ ๏ธ Delivery error. Contact admin with UTR: " + utr + " | Error: " + ffErr.message,290 parse_mode: "HTML"291 });292 }293 User.setProperty("buy_verifying_lock_" + userId, false, "boolean");294 return;295 }296 297 // =========================================================298 // ๐ฆ ORIGINAL PLAN-BASED DELIVERY (external xyzcheats API)299 // =========================================================300 var prodIdx = User.getProperty("buy_prod_idx");301 var planIdx = User.getProperty("buy_plan_idx");302 var productList = Bot.getProperty("stored_products") || [];303 var product = productList[prodIdx];304 var plan = product && product.plans ? product.plans[planIdx] : null;305 306 if (!product || !plan) {307 Api.editMessageCaption({308 chat_id: chat.chatid, message_id: request.message.message_id,309 caption: "โ ๏ธ Payment received but product data missing. Contact admin with UTR: " + utr,310 parse_mode: "HTML"311 });312 User.setProperty("buy_verifying_lock_" + userId, false, "boolean");313 return;314 }315 316 var webProductId = String(product.id || "PID_ID").trim();317 var cleanPlanDays = User.getProperty("buy_plan_days") || String(plan.days);318 var prodNameLower = String(product.name).toLowerCase();319 var durationParam = cleanPlanDays + " Days";320 321 var rawPlanName = plan.name || plan.title || plan.name_on_website || "";322 if (rawPlanName.trim() !== "" && isNaN(rawPlanName)) {323 durationParam = rawPlanName.trim();324 } else if (prodNameLower.indexOf("pato") > -1 || prodNameLower.indexOf("all android") > -1 || prodNameLower.indexOf("mix") > -1) {325 durationParam = cleanPlanDays + " DaYs All Colours Mix";326 } else if (prodNameLower.indexOf("prime") > -1 || prodNameLower.indexOf("hook") > -1) {327 durationParam = (cleanPlanDays === "7") ? "7 Days NonRoot" : cleanPlanDays + " Days Nonroot";328 } else if (prodNameLower.indexOf("nonroot") > -1) {329 durationParam = cleanPlanDays + " DaYs NONROOT";330 }331 332 var postFieldsString = "api_key=" + encodeURIComponent("4047db881702c80259f417e2283aea5b") +333 "&action=" + encodeURIComponent("buy") +334 "&product_id=" + encodeURIComponent(webProductId) +335 "&duration=" + encodeURIComponent(durationParam);336 337 User.setProperty("last_pending_price", User.getProperty("buy_price"), "number");338 User.setProperty("last_pending_prod_id", webProductId, "string");339 User.setProperty("last_pending_prod_name", String(product.name).trim(), "string");340 User.setProperty("last_pending_plan_days", cleanPlanDays, "string");341 342 HTTP.post({343 url: "https://xyzcheats.com/api/reseller_v1.php",344 body: postFieldsString,345 headers: {346 "Content-Type": "application/x-www-form-urlencoded",347 "x-master-key": "4047db881702c80259f417e2283aea5b"348 },349 success: "/onWebKeyReceive",350 error: "/onWebKeyError"351 });352 353 User.setProperty("buy_pending_order_id", null);354 User.setProperty("buy_prod_idx", null);355 User.setProperty("buy_plan_idx", null);356 Bot.setProperty("buy_qr_msg_id_" + userId, null, "string");357 User.setProperty("buy_qr_msg_id_" + userId, null, "string");358 Bot.setProperty("buy_qr_caption_" + userId, null, "string");359 User.setProperty("buy_qr_caption_" + userId, null, "string");360 Bot.setProperty("buy_qr_buttons_" + userId, null, "string");361 User.setProperty("buy_qr_buttons_" + userId, null, "string");362 363 User.setProperty("buy_verifying_lock_" + userId, false, "boolean");364 365 } else {366 // โ Payment not found โ restore original QR caption/buttons, then show dismissible notice367 try {368 var origCaption = Bot.getProperty("buy_qr_caption_" + userId) || User.getProperty("buy_qr_caption_" + userId);369 var origButtons = Bot.getProperty("buy_qr_buttons_" + userId) || User.getProperty("buy_qr_buttons_" + userId);370 371 if (origCaption) {372 Api.editMessageCaption({373 chat_id: chat.chatid,374 message_id: request.message.message_id,375 caption: origCaption,376 parse_mode: "HTML",377 reply_markup: origButtons ? origButtons : undefined378 });379 }380 } catch (e) {}381 382 if (request && request.id) {383 Api.answerCallbackQuery({384 callback_query_id: String(request.id),385 text: "โ PAYMENT NOT FOUND โ\nPlease complete the payment first, then tap again.",386 show_alert: true387 });388 }389 User.setProperty("buy_verifying_lock_" + userId, false, "boolean");390 }391 392} catch (err) {393 try {394 User.setProperty("buy_verifying_lock_" + user.telegramid, false, "boolean");395 } catch (e) {}396 Bot.sendMessage("โ ๏ธ <b>Verification Exception:</b> " + err.message, { parse_mode: "HTML" });397}