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/_aiadd.js
javascript · 412 lines
1/**#command2name: /aiadd3answer: 4keyboard: 5parse_mode: markdown6aliases: 7allow_only_group: false8need_reply: false9is_web: 010#command**/11 12/*#SIZE_V1*/try{(function(){var z=Bot.getProperty("ui_btn_size");var mx=z==="large"?1:(z==="medium"?2:0);if(!mx||Api.__sz)return;var NAV=/^[◀▶⬅➡«»‹›⏪⏩]|\d+\s*\/\s*\d+|prev|next|page/i;var T=function(m){try{var o=typeof m==="string"?JSON.parse(m):m;if(!o||!o.inline_keyboard)return m;var out=[],cnt=0;o.inline_keyboard.forEach(function(row){var nav=row.some(function(b){return NAV.test(String(b.text||"").trim());});if(row.length<=mx||nav){out.push(row);cnt+=row.length;return;}for(var i=0;i<row.length;i+=mx){var c=row.slice(i,i+mx);out.push(c);cnt+=c.length;}});if(cnt>100||out.length>100)return m;o.inline_keyboard=out;return typeof m==="string"?JSON.stringify(o):o;}catch(e){return m;}};["sendMessage","editMessageText","editMessageCaption","editMessageReplyMarkup","sendPhoto","sendVideo","sendAnimation","sendDocument"].forEach(function(n){var f=Api[n];if(typeof f!=="function")return;Api[n]=function(p){try{if(p&&p.reply_markup)p.reply_markup=T(p.reply_markup);}catch(e){}return f.apply(Api,arguments);};});Api.__sz=true;})();}catch(__szE){}13/*#ANIM_V1*/try{(function(){var M={party:"5046509860389126442",fire:"5104841245755180586",heart:"5159385139981059251",like:"5107584321108051014"};var a=Bot.getProperty("ui_anim");if(!a||!M[a]||Api.__an)return;var E=M[a];var OK=/PURCHASE SUCCESSFUL|PAYMENT SUCCESSFUL|Payment verified|CONGRATULATIONS/i;var priv=function(p){return p&&p.chat_id&&String(p.chat_id).charAt(0)!=="-";};["sendMessage","sendPhoto","sendVideo","sendAnimation"].forEach(function(n){var f=Api[n];if(typeof f!=="function")return;Api[n]=function(p){try{if(priv(p)&&!p.message_effect_id&&OK.test(String(p.text||p.caption||"")))p.message_effect_id=E;}catch(e){}return f.apply(Api,arguments);};});var fe=Api.editMessageText;if(typeof fe==="function"){Api.editMessageText=function(p){var r=fe.apply(Api,arguments);try{if(priv(p)&&OK.test(String(p.text||"")))Api.sendMessage({chat_id:p.chat_id,text:"🎉",message_effect_id:E});}catch(e){}return r;};}Api.__an=true;})();}catch(__anE){}14/*#PREMIUM_UI_V1*/try{(function(){if(Bot.getProperty("ui_premium")!==true||Api.__pm)return;var R=function(t,c){var s=(String(t||"")+" "+String(c||"")).toLowerCase();if(/back|cancel|close|delete|remove|clear|reject|stop|ban|exit/.test(s))return"danger";if(/pay|buy|confirm|verify|paid|add|deposit|shop|claim|yes|receive|wallet|download|update/.test(s))return"success";return"primary";};var T=function(m){try{var o=typeof m==="string"?JSON.parse(m):m;if(!o||!o.inline_keyboard)return m;o.inline_keyboard.forEach(function(row){row.forEach(function(b){if(b.copy_text||b.url||b.callback_data||b.web_app){b.style=R(b.text,b.callback_data||b.url);if(!b.icon_custom_emoji_id&&b.text&&!/^[\u2600-\u27BF\uD83C-\uD83E]/.test(String(b.text).trim())&&!/^[✦✨💎]/.test(b.text))b.text="✦ "+b.text;}});});return typeof m==="string"?JSON.stringify(o):o;}catch(e){return m;}};["sendMessage","editMessageText","editMessageCaption","editMessageReplyMarkup","sendPhoto","sendVideo","sendAnimation","sendDocument"].forEach(function(n){var f=Api[n];if(typeof f!=="function")return;Api[n]=function(p){try{if(p&&p.reply_markup)p.reply_markup=T(p.reply_markup);}catch(e){}return f.apply(Api,arguments);};});Api.__pm=true;})();}catch(__pmE){}15 16 17// =========================================================================18// 🤖 AI ADD PRODUCT (screenshot -> plans)19//20// Flow: Category -> Screenshot (supplier website, prices in $) -> AI reads21// PID + hours/days + $ price -> bot converts $ to INR (usd_rate) ->22// Panel name confirm -> per plan: Public price -> Reseller price ->23// Confirm & Save (same stored_products + price_* properties as /wz).24//25// Async pieces: /aiadd_file (Telegram getFile) -> AI vision call ->26// /aiadd_result (parse) | /aiadd_error27// Text + photo answers reach this command through the wildcard (_.js).28// State lives in User property "aiadd_state" (auto-expires in 20 min).29// =========================================================================30 31try {32 var ownerId = String(Bot.getProperty("owner_id") || "7127818616");33 var me = String(chat.chatid);34 var isCo = !!Bot.getProperty("co_admin_" + me);35 if (me !== ownerId && !isCo) { Bot.sendMessage("❌ Restricted command!"); return; }36 37 var opt = (typeof options !== "undefined" && options) ? options : {};38 var isText = !!opt.ai_text;39 var isPhoto = !!opt.ai_photo;40 var isCb = !isText && !isPhoto;41 var cmd = (isCb && typeof params !== "undefined" && params) ? String(params).trim() : "";42 var cmdParts = cmd.split(/\s+/);43 var verb = (cmdParts[0] || "").toLowerCase();44 var arg = cmdParts.slice(1).join(" ").trim();45 46 var qid = null, mid = null;47 if (isCb && request) {48 qid = request.id || (request.callback_query && request.callback_query.id) || null;49 mid = (request.message && request.message.message_id) ||50 (request.callback_query && request.callback_query.message && request.callback_query.message.message_id) || null;51 }52 if (qid) { try { Api.answerCallbackQuery({ callback_query_id: String(qid) }); } catch (e) {} }53 54 // ---------------------------------------------------------------- helpers55 function esc(s) { return String(s === undefined || s === null ? "" : s).replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">"); }56 function short(s, n) { s = String(s || ""); return s.length > n ? s.slice(0, n - 1) + "…" : s; }57 function r2(n) { return Math.round(Number(n) * 100) / 100; }58 function nice(x) { return x >= 50 ? Math.ceil(x / 5) * 5 : Math.ceil(x); }59 function getRate() { var r = parseFloat(Bot.getProperty("usd_rate")); return (r > 0) ? r : 91; }60 61 function show(text, rows) {62 var kb = JSON.stringify({ inline_keyboard: rows || [] });63 if (mid && isCb) {64 try { Api.editMessageText({ chat_id: me, message_id: Number(mid), text: text, parse_mode: "HTML", reply_markup: kb }); return; } catch (e) {}65 }66 Api.sendMessage({ chat_id: me, text: text, parse_mode: "HTML", reply_markup: kb });67 }68 69 var CAT_LABELS = { root: "ANDROID ROOT", nonroot: "ANDROID NON ROOT", iphone: "iPHONE", both: "BOTH" };70 var DEFAULT_EMOJI = "5226656353744862682";71 var NAV_CANCEL = { text: "❌ Cancel", callback_data: "/aiadd cancel", style: "danger" };72 var BACK_ADMIN = [{ text: "🔙 Back to Admin", callback_data: "/admin", style: "danger" }];73 74 function loadState() {75 var st = User.getProperty("aiadd_state");76 if (typeof st === "string") { try { st = JSON.parse(st); } catch (e) { st = null; } }77 if (st && st.t && (Date.now() - st.t) > 20 * 60 * 1000) { st = null; }78 if (!st || !st.step) { clearState(); return null; }79 return st;80 }81 function saveState(st) { st.t = Date.now(); User.setProperty("aiadd_state", st, "json"); }82 function clearState() { User.setProperty("aiadd_state", null, "json"); }83 84 function prods() {85 var p = Bot.getProperty("stored_products");86 if (typeof p === "string") { try { p = JSON.parse(p); } catch (e) { p = []; } }87 return Array.isArray(p) ? p : [];88 }89 function parseDuration(t) {90 var lower = String(t).toLowerCase();91 var m = lower.match(/^([0-9]+(?:\.[0-9]+)?)\s*(d|day|days|h|hr|hrs|hour|hours|m|min|mins|minute|minutes)/);92 var value = m ? m[1] : "0";93 var u = m ? m[2] : "d";94 var unit = "day";95 if (/^h/.test(u)) unit = "hour"; else if (/^m/.test(u)) unit = "minute";96 return { value: String(value), unit: unit };97 }98 99 // Supplier price INR me ho to as-is, USD me ho to rate se convert.100 function costInr(p, rate) {101 var amt = (p.amt !== undefined) ? p.amt : p.usd;102 return (p.cur === "INR") ? r2(amt) : r2(amt * rate);103 }104 function planLine(p, rate) {105 var amt = (p.amt !== undefined) ? p.amt : p.usd;106 var base = "⏱ <b>" + esc(p.dur) + "</b> • 🆔 <code>" + esc(p.pid) + "</code> • ";107 var stk = (p.stock !== undefined && p.stock !== null) ? " • 📦 <b>" + esc(p.stock) + "</b>" : "";108 if (p.api && p.api !== p.dur) stk += " • 📡 <code>" + esc(p.api) + "</code>";109 return base + "Cost <b>₹" + costInr(p, rate) + "</b>" + stk;110 }111 function activePlans(st) { return (st.plans || []).filter(function (p) { return !p.skip; }); }112 function planTable(st) {113 var L = [];114 for (var i = 0; i < (st.plans || []).length; i++) {115 var p = st.plans[i];116 L.push((i + 1) + ". " + planLine(p, st.rate) + (p.skip ? " <i>(skip)</i>" : ""));117 }118 return L.join("\n");119 }120 function nextIndex(st, from) {121 for (var i = from; i < st.plans.length; i++) { if (!st.plans[i].skip) return i; }122 return -1;123 }124 125 // ---------------------------------------------------------------- render126 function render(st) {127 var rate = st.rate = getRate();128 if (st.step === "cat") {129 show("<blockquote><b>🤖 AI ADD PRODUCT</b> • Step 1</blockquote>\n\n📂 <b>Category chuniye:</b>\n\n💱 Rate: <b>₹" + rate + "</b> per $",130 [[{ text: CAT_LABELS.root, callback_data: "/aiadd cat root", style: "danger" }],131 [{ text: CAT_LABELS.nonroot, callback_data: "/aiadd cat nonroot", style: "danger" }],132 [{ text: CAT_LABELS.iphone, callback_data: "/aiadd cat iphone", style: "danger" }],133 [{ text: CAT_LABELS.both, callback_data: "/aiadd cat both", style: "danger" }],134 [{ text: "💱 Rate badlo (₹" + rate + "/$)", callback_data: "/aiadd rate", style: "primary" }],135 [NAV_CANCEL]]);136 return;137 }138 if (st.step === "photo" && st.mode === "two") {139 var shotN = Number(st.shot) || 1;140 var catRow = [{ text: "📂 Category: " + (CAT_LABELS[st.cat] || "BOTH") + " (badlo)", callback_data: "/aiadd catnext", style: "primary" }, { text: "💱 Rate badlo", callback_data: "/aiadd rate", style: "primary" }];141 if (shotN === 1) {142 show("<blockquote><b>🧾 AI ADD (2 Screenshot)</b> • 1/2</blockquote>\n\n📂 Category: <b>" + esc(CAT_LABELS[st.cat]) + "</b>\n💱 Rate: <b>₹" + rate + "</b> per $\n\n" +143 "📸 <b>Screenshot 1 bhejo: Product ka NAAM + PRICE</b>\n<i>Jisme panel/product ka naam aur price (₹ ya $) dikh raha ho. Photo ki tarah bhejo (file/document nahi).</i>",144 [catRow, [NAV_CANCEL]]);145 } else {146 var pr1 = (st.s1 && st.s1.prices) ? st.s1.prices : [];147 var got = pr1.map(function (x) { return (x.dur ? x.dur + " = " : "") + "₹" + costInr(x, rate); }).join(", ");148 show("<blockquote><b>🧾 AI ADD (2 Screenshot)</b> • 2/2</blockquote>\n\n✅ <b>Screenshot 1 padh liya</b>\n🏷 Naam: <b>" + (st.pn ? esc(st.pn) : "—") + "</b>\n💰 Price: <b>" + esc(short(got, 200)) + "</b>\n\n" +149 "📸 <b>Screenshot 2 bhejo: DURATIONS + STOCK + PID</b>\n<i>Jisme har plan ka time (hours/days), stock aur PID dikh raha ho. Photo ki tarah bhejo.</i>",150 [[{ text: "↩️ Screenshot 1 dobara", callback_data: "/aiadd redo", style: "primary" }], catRow, [NAV_CANCEL]]);151 }152 return;153 }154 if (st.step === "photo") {155 show("<blockquote><b>🤖 AI ADD PRODUCT</b> • Step 2</blockquote>\n\n📂 Category: <b>" + esc(CAT_LABELS[st.cat]) + "</b>\n💱 Rate: <b>₹" + rate + "</b> per $\n\n" +156 "📸 <b>Website ka screenshot bhejo</b>\n<i>AI product naam, PID, time aur price padhega (₹ ya $ dono chalega, $ ko ₹ me badal dega). Baad me sirf Public aur Reseller price puchunga. Photo ki tarah bhejo (file/document nahi).</i>",157 [[{ text: "📂 Category: " + (CAT_LABELS[st.cat] || "BOTH") + " (badlo)", callback_data: "/aiadd catnext", style: "primary" }], [{ text: "💱 Rate badlo", callback_data: "/aiadd rate", style: "primary" }], [NAV_CANCEL]]);158 return;159 }160 if (st.step === "rate") {161 show("💱 <b>1 USD = kitne ₹?</b>\n<i>Abhi: ₹" + rate + ". Naya number bhejo, jaise 91.5</i>", [[NAV_CANCEL]]);162 return;163 }164 if (st.step === "name") {165 var rows = [];166 if (st.pn) rows.push([{ text: "✅ Yahi naam: " + short(st.pn, 30), callback_data: "/aiadd usename", style: "success" }]);167 rows.push([{ text: "🔄 Naya screenshot", callback_data: "/aiadd redo", style: "primary" }]);168 rows.push([NAV_CANCEL]);169 show("<blockquote><b>🤖 AI ADD PRODUCT</b> • Screenshot padh liya ✅</blockquote>\n\n📂 Category: <b>" + esc(CAT_LABELS[st.cat]) + "</b>\n💱 Rate: ₹" + rate + "/$\n\n" +170 planTable(st) + (st.warn ? "\n\n⚠️ <i>" + esc(st.warn) + "</i>" : "") + "\n\n" +171 "📦 <b>Panel ka naam</b>" + (st.pn ? ": <b>" + esc(st.pn) + "</b>\n<i>Sahi hai to button dabao, warna sahi naam type karo.</i>" : " bhejo\n<i>Jaise: MST PANEL, DRIP CLIENT</i>"), rows);172 return;173 }174 if (st.step === "pub" || st.step === "res") {175 var p = st.plans[st.i];176 var cost = costInr(p, rate);177 var isPub = st.step === "pub";178 var opts = isPub ? [30, 50, 80, 100] : [10, 20, 30, 40];179 var brow = [], seen = {};180 for (var k = 0; k < opts.length; k++) {181 var v = nice(cost * (1 + opts[k] / 100));182 if (!(v > 0)) continue;183 if (!isPub && p.price !== undefined && v >= p.price) continue;184 if (seen[v]) continue; seen[v] = 1;185 brow.push({ text: "₹" + v + " (+" + opts[k] + "%)", callback_data: "/aiadd " + (isPub ? "p " : "r ") + v, style: "primary" });186 }187 var krows = [];188 for (var b = 0; b < brow.length; b += 2) krows.push(brow.slice(b, b + 2));189 if (!isPub && p.price !== undefined) krows.push([{ text: "🟰 Public jitna (₹" + p.price + ")", callback_data: "/aiadd rsame", style: "success" }]);190 if (isPub) krows.push([{ text: "⏭ Ye plan skip karo", callback_data: "/aiadd skip", style: "danger" }]);191 if (isPub) krows.push([{ text: "✏️ Naam badlo", callback_data: "/aiadd rename", style: "primary" }]);192 krows.push([NAV_CANCEL]);193 var pos = (st.plans.slice(0, st.i).filter(function (x) { return !x.skip; }).length) + 1;194 show("<blockquote><b>🤖 AI ADD PRODUCT</b> • Plan " + pos + "/" + activePlans(st).length + "</blockquote>\n\n📦 Panel: <b>" + esc(st.pn) + "</b>\n" + planLine(p, rate) + "\n" +195 (p.price !== undefined ? "💰 Public: <b>₹" + p.price + "</b>\n" : "") +196 (st.warn && st.step === "pub" && st.i === nextIndex(st, 0) ? "⚠️ <i>" + esc(st.warn) + "</i>\n" : "") + "\n" +197 (isPub ? "💰 <b>Public price kya rakhoge?</b>\n<i>Cost ₹" + r2(cost) + ". Button dabao, ya number type karo. Dono ek saath: <code>250 200</code> (public reseller).</i>"198 : "👑 <b>Reseller price kya rakhoge?</b>\n<i>Cost ₹" + r2(cost) + ". Button dabao ya apna number type karo.</i>"), krows);199 return;200 }201 if (st.step === "confirm") {202 var act = activePlans(st), L = [];203 for (var c = 0; c < act.length; c++) {204 var q = act[c];205 L.push("• <b>" + esc(q.dur) + "</b> • PID <code>" + esc(q.pid) + "</code>\n Cost ₹" + costInr(q, rate) + " → Public <b>₹" + q.price + "</b> • Reseller <b>₹" + q.rprice + "</b>\n 📡 API naam: <code>" + esc(q.api || q.dur) + "</code>" + (q.api ? "" : " <i>(exact naam nahi mila)</i>"));206 }207 var existing = "";208 var pl = prods();209 for (var e = 0; e < pl.length; e++) { if (pl[e] && pl[e].name && String(pl[e].name).trim().toLowerCase() === String(st.pn).toLowerCase()) { existing = "\n\n⚠️ <i>Ye panel pehle se hai — plans add/update honge (same time wala plan update ho jayega).</i>"; break; } }210 show("<blockquote><b>🤖 AI ADD PRODUCT</b> • Confirm</blockquote>\n\n📂 Category: <b>" + esc(CAT_LABELS[st.cat]) + "</b>\n📦 Panel: <b>" + esc(st.pn) + "</b>\n\n" + L.join("\n") + existing + "\n\n<b>Sab sahi hai?</b>",211 [[{ text: "✅ Confirm & Save", callback_data: "/aiadd ok", style: "success" }],212 [{ text: "🔄 Naya screenshot", callback_data: "/aiadd redo", style: "primary" }, NAV_CANCEL]]);213 return;214 }215 if (st.step === "processing") {216 show("⏳ <b>Screenshot padh raha hu...</b>\n<i>Kuch second lagenge. 40 sec se zyada lage to neeche Dobara dabao.</i>",217 [[{ text: "🔁 Dobara screenshot bhejo", callback_data: "/aiadd retry", style: "primary" }], [NAV_CANCEL]]);218 }219 }220 221 // ---------------------------------------------------------------- save222 function savePlans(st) {223 var list = prods();224 var pName = st.pn;225 var idx = -1;226 for (var i = 0; i < list.length; i++) {227 if (list[i] && list[i].name && String(list[i].name).trim().toLowerCase() === pName.toLowerCase()) { idx = i; break; }228 }229 var isNew = idx === -1;230 if (isNew) { list.push({ name: pName, emoji: DEFAULT_EMOJI, category: st.cat || "both", plans: [] }); idx = list.length - 1; }231 else { list[idx].category = st.cat || list[idx].category || "both"; delete list[idx].id; }232 if (!Array.isArray(list[idx].plans)) list[idx].plans = [];233 234 var act = activePlans(st), added = 0, updated = 0;235 for (var a = 0; a < act.length; a++) {236 var d = act[a];237 var pd = parseDuration(d.dur);238 var suffix = (pd.unit === "day") ? pd.value : (pd.value + "_" + pd.unit);239 var cleanName = pName.toUpperCase();240 Bot.setProperty("price_normal_" + cleanName + "_" + suffix, d.price, "number");241 Bot.setProperty("price_reseller_" + cleanName + "_" + suffix, d.rprice, "number");242 var plan = {243 days: pd.value, unit: pd.unit, durationDisplay: d.dur,244 normal_price: d.price, reseller_price: d.rprice,245 name_on_website: d.api || d.dur, api_duration: d.api || d.dur,246 pid: d.pid, product_id: d.pid, variant_id: d.pid247 };248 var found = false;249 for (var p = 0; p < list[idx].plans.length; p++) {250 var pl = list[idx].plans[p];251 if (String(pl.days) === pd.value && (pl.unit || "day") === pd.unit) { list[idx].plans[p] = plan; found = true; break; }252 }253 if (!found) { list[idx].plans.push(plan); added++; } else { updated++; }254 }255 Bot.setProperty("stored_products", list, "json");256 return { idx: idx, isNew: isNew, added: added, updated: updated };257 }258 259 function activeAi() {260 var activeId = Bot.getProperty("ai_active_api_id");261 var configs = Bot.getProperty("ai_api_configs") || [];262 for (var i = 0; i < configs.length; i++) { if (String(configs[i].id) === String(activeId)) return configs[i]; }263 return null;264 }265 266 function parseNum(s) {267 var t = String(s).replace(/[₹,\s]/g, "");268 if (!/^\d+(\.\d+)?$/.test(t)) return NaN;269 return r2(parseFloat(t));270 }271 272 function afterPrice(st) {273 // move to reseller price (same plan) or next plan / confirm274 if (st.step === "pub") { st.step = "res"; return; }275 var n = nextIndex(st, st.i + 1);276 if (n === -1) { st.step = "confirm"; } else { st.i = n; st.step = "pub"; }277 }278 279 // ---------------------------------------------------------------- photo in280 if (isPhoto) {281 var sp = loadState();282 var stuck = sp && sp.step === "processing" && (Date.now() - (sp.t || 0)) > 40000;283 if (!sp || (sp.step !== "photo" && !stuck)) { Bot.sendMessage("ℹ️ Abhi screenshot nahi chahiye. /admin -> AI Add Product se shuru karo."); return; }284 var ai = activeAi();285 if (!ai || !ai.api_key) {286 clearState();287 Api.sendMessage({ chat_id: me, parse_mode: "HTML", text: "❌ <b>AI API connect nahi hai.</b>\nPehle AI Support Manager me ek <b>vision-supported</b> model (jaise gpt-4o-mini) add karke active karo.",288 reply_markup: JSON.stringify({ inline_keyboard: [[{ text: "🤖 AI Manager", callback_data: "/admin_ai", style: "primary" }], BACK_ADMIN[0]] }) });289 return;290 }291 if (!opt.file_id) { Bot.sendMessage("⚠️ Photo detect nahi hui, dobara bhejo."); return; }292 sp.step = "processing"; saveState(sp);293 render(sp);294 var __BT = (function(){ var t = ""; try { if (typeof bot !== "undefined" && bot && bot.token) t = String(bot.token); } catch (e) {} try { if (!t && typeof process !== "undefined" && process.env && process.env.BOT_TOKEN) t = String(process.env.BOT_TOKEN); } catch (e) {} if (!t) t = String(Bot.getProperty("tg_bot_token") || ""); return t; })();295 if (!__BT) { clearState(); Bot.sendMessage("⚠️ Bot token nahi mila. Admin chat me ye bhejo:\n/set_bot_token TUMHARA_BOT_TOKEN\n(BotFather wala token. Message apne aap delete ho jayega.)"); return; }296 HTTP.get({297 url: "https://api.telegram.org/bot" + __BT + "/getFile?file_id=" + encodeURIComponent(String(opt.file_id)),298 success: "/aiadd_file",299 error: "/aiadd_error"300 });301 return;302 }303 304 // ---------------------------------------------------------------- text in305 if (isText) {306 var raw = String(opt.text || "").trim();307 var st0 = loadState();308 if (!st0) { Bot.sendMessage("ℹ️ Koi active AI Add wizard nahi hai. /admin se shuru karo."); return; }309 if (st0.step === "rate") {310 var rt = parseNum(raw);311 if (isNaN(rt) || rt < 1 || rt > 1000) { Bot.sendMessage("❌ Valid rate bhejo (jaise 91.5)."); return; }312 Bot.setProperty("usd_rate", String(rt), "string");313 st0.step = st0.rateBack || "cat"; st0.rate = rt;314 saveState(st0); render(st0); return;315 }316 if (st0.step === "name") {317 var nm = raw.replace(/\s+/g, " ").trim();318 if (!nm || nm.length > 60 || nm.indexOf("|") !== -1) { Bot.sendMessage("❌ Naam 1-60 characters ka ho aur usme | na ho."); return; }319 st0.pn = nm; st0.i = nextIndex(st0, 0); st0.step = "pub";320 saveState(st0); render(st0); return;321 }322 if (st0.step === "pub") {323 var __tk = raw.split(/[\s,\/|]+/).filter(Boolean);324 if (__tk.length === 2) {325 var __a = parseNum(__tk[0]), __b = parseNum(__tk[1]);326 if (!isNaN(__a) && !isNaN(__b) && __a > 0 && __b > 0) {327 st0.plans[st0.i].price = __a; st0.plans[st0.i].rprice = __b;328 st0.step = "res"; afterPrice(st0); saveState(st0); render(st0); return;329 }330 }331 }332 if (st0.step === "pub" || st0.step === "res") {333 var val = parseNum(raw);334 if (isNaN(val) || val <= 0) { Bot.sendMessage("❌ Sirf number bhejo (₹), jaise 250."); return; }335 if (st0.step === "pub") st0.plans[st0.i].price = val; else st0.plans[st0.i].rprice = val;336 afterPrice(st0); saveState(st0); render(st0); return;337 }338 Bot.sendMessage(st0.step === "photo" ? "📸 Text nahi, website ka <b>screenshot (photo)</b> bhejo." : "👆 Upar diye gaye buttons use karo.", { parse_mode: "HTML" });339 return;340 }341 342 // ---------------------------------------------------------------- buttons343 if (verb === "go") {344 User.setProperty("wz_state", null, "json");345 var stn = { step: "photo", cat: "both", plans: [], rate: getRate() };346 saveState(stn); render(stn); return;347 }348 if (verb === "go2") {349 User.setProperty("wz_state", null, "json");350 var stn2 = { step: "photo", mode: "two", shot: 1, cat: "both", plans: [], rate: getRate() };351 saveState(stn2); render(stn2); return;352 }353 if (verb === "cancel") { clearState(); show("❌ <b>Cancel ho gaya.</b>", [BACK_ADMIN]); return; }354 355 var cur = loadState();356 if (!cur) { show("⌛ Session expire ho gaya. /admin se dobara shuru karo.", [BACK_ADMIN]); return; }357 358 if (verb === "catnext") {359 var __order = ["both", "root", "nonroot", "iphone"]; var __ci = __order.indexOf(cur.cat || "both");360 cur.cat = __order[(__ci + 1) % __order.length]; cur.step = "photo"; saveState(cur); render(cur); return;361 }362 if (verb === "cat") {363 if (!CAT_LABELS[arg]) { render(cur); return; }364 cur.cat = arg; cur.step = "photo"; saveState(cur); render(cur); return;365 }366 if (verb === "rate") { cur.rateBack = cur.step; cur.step = "rate"; saveState(cur); render(cur); return; }367 if (verb === "retry") { cur.step = "photo"; cur.plans = []; cur.warn = ""; saveState(cur); render(cur); return; }368 if (verb === "rename") { if (!cur.plans || !cur.plans.length) { render(cur); return; } cur.step = "name"; saveState(cur); render(cur); return; }369 if (verb === "redo") { cur.step = "photo"; cur.plans = []; cur.pn = ""; cur.warn = ""; if (cur.mode === "two") { cur.shot = 1; cur.s1 = null; } saveState(cur); render(cur); return; }370 if (verb === "usename") {371 if (cur.step !== "name" || !cur.pn) { render(cur); return; }372 cur.i = nextIndex(cur, 0); cur.step = "pub"; saveState(cur); render(cur); return;373 }374 if ((verb === "p" || verb === "r") && (cur.step === "pub" || cur.step === "res")) {375 var num = parseNum(arg);376 if (isNaN(num) || num <= 0) { render(cur); return; }377 if (cur.step === "pub" && verb === "p") cur.plans[cur.i].price = num;378 else if (cur.step === "res" && verb === "r") cur.plans[cur.i].rprice = num;379 else { render(cur); return; }380 afterPrice(cur); saveState(cur); render(cur); return;381 }382 if (verb === "rsame" && cur.step === "res") {383 cur.plans[cur.i].rprice = cur.plans[cur.i].price;384 afterPrice(cur); saveState(cur); render(cur); return;385 }386 if (verb === "skip" && cur.step === "pub") {387 cur.plans[cur.i].skip = true;388 var nx = nextIndex(cur, cur.i + 1);389 if (nx === -1) {390 if (!activePlans(cur).length) { cur.step = "photo"; cur.plans = []; saveState(cur); Bot.sendMessage("Saare plans skip ho gaye. Dusra screenshot bhejo."); render(cur); return; }391 cur.step = "confirm";392 } else { cur.i = nx; cur.step = "pub"; }393 saveState(cur); render(cur); return;394 }395 if (verb === "ok" && cur.step === "confirm") {396 var res = savePlans(cur);397 clearState();398 Api.sendMessage({ chat_id: me, parse_mode: "HTML",399 text: "<blockquote>✅ <b>" + (res.isNew ? "Product Add Ho Gaya!" : "Product Update Ho Gaya!") + "</b></blockquote>\n\n📦 <b>" + esc(cur.pn) + "</b>\n" +400 "➕ Naye plans: <b>" + res.added + "</b> • ✏️ Update: <b>" + res.updated + "</b>\n\n<i>Ab ye store mein dikhega.</i>",401 reply_markup: JSON.stringify({ inline_keyboard: [402 [{ text: "🔑 Keys Add Karein", callback_data: "/wz go add_key", style: "primary" }],403 [{ text: "🤖 Ek aur AI Add", callback_data: (cur.mode === "two" ? "/aiadd go2" : "/aiadd go"), style: "success" }],404 BACK_ADMIN405 ] }) });406 return;407 }408 render(cur);409 410} catch (err) {411 Bot.sendMessage("⚠️ AI Add Error: " + err.message);412}