ini_set('display_errors', 1); ini_set('display_startup_errors', 1); error_reporting(E_ALL); ini_set('log_errors', 1); ini_set('error_log', __DIR__ . '/error_log.txt'); include_once 'config.php'; $update = json_decode(file_get_contents('php://input')); if (!$update) { exit; } // استخراج آیدی چت و کاربر در حالت‌های مختلف پیام و کال‌بک $chat_id = $update->message->chat->id ?? $update->callback_query->message->chat->id ?? null; $from_id = $update->message->from->id ?? $update->callback_query->from->id ?? null; if (!$chat_id || !$from_id) { exit; } // دکمه‌های منوهای اصلی ربات $main_menu = [ ["🛍 خرید کانفیگ", "🎁 اکانت تست"], ["💎 تبدیل رفرال به کانفیگ", "👥 زیرمجموعه‌گیری"], ["👤 حساب کاربری", "🆘 پشتیبانی"] ]; $admin_menu = [ ["📊 آمار", "➕ تعریف پلن"], ["📥 افزودن لینک انبار", "📢 ارسال همگانی"], ["پنل مدیریت"] ]; // ۱. قفل جوین اجباری کانال (استثنا برای ادمین) if (!isMember($from_id) && $from_id != ADMIN_ID) { if (isset($update->callback_query) && $update->callback_query->data == "check_join") { // اجازه عبور برای بررسی در بخش کال‌بک } else { // اگر کاربر جدید با لینک رفرال آمده، آیدی دعوت‌کننده را موقت ذخیره می‌کنیم if (isset($update->message->text) && strpos($update->message->text, "/start") === 0) { $parts = explode(" ", $update->message->text); if (count($parts) > 1) { $inviter_id = trim($parts[1]); if (is_numeric($inviter_id) && $inviter_id != $from_id) { file_put_contents(__DIR__ . "/temp_ref_$from_id.txt", $inviter_id); } } } $channel_url = "https://t.me/" . str_replace('@', '', CHANNEL_ID); $text = "⚠️ برای استفاده از ربات، ابتدا باید عضو کانال شوید!\n\nپس از عضویت روی دکمه زیر کلیک کنید:"; $btn = [ [["text" => "📢 عضویت در کانال", "url" => $channel_url]], [["text" => "✅ تایید عضویت", "callback_data" => "check_join"]] ]; sendMessage($chat_id, $text, $btn, true); exit; } } // ۲. پردازش دکمه‌های شیشه‌ای (Callback Queries) if (isset($update->callback_query)) { $callback = $update->callback_query; $data = $callback->data; // تایید عضویت و اعمال رفرال if ($data == "check_join") { if (isMember($from_id)) { checkUser($from_id); // ایجاد کاربر در دیتابیس در صورت عدم وجود $temp_file = __DIR__ . "/temp_ref_$from_id.txt"; if (file_exists($temp_file)) { $inviter_id = file_get_contents($temp_file); $stmt = $db->prepare("SELECT has_inviter FROM `users` WHERE `user_id` = ?"); $stmt->execute([$from_id]); $userData = $stmt->fetch(); if ($userData && $userData['has_inviter'] == 0 && $inviter_id != $from_id) { $db->prepare("UPDATE `users` SET `referral_count` = referral_count + 1 WHERE `user_id` = ?")->execute([$inviter_id]); $db->prepare("UPDATE `users` SET `has_inviter` = 1 WHERE `user_id` = ?")->execute([$from_id]); sendMessage($inviter_id, "🎉 یک نفر با لینک شما عضو ربات شد و امتیاز آن برای شما ثبت گردید."); } @unlink($temp_file); } sendMessage($chat_id, "✅ عضویت شما تایید شد. به نئونت خوش آمدید!", $main_menu); } else { $url = "https://api.telegram.org/bot" . TOKEN . "/answerCallbackQuery?callback_query_id=" . $callback->id . "&text=" . urlencode("❌ هنوز عضو کانال نشده‌اید!") . "&show_alert=true"; @file_get_contents($url); } } // تبدیل ۲۵ رفرال به کانفیگ ۱ گیگابایتی elseif ($data == "claim_ref_1gb") { $stmt = $db->prepare("SELECT referral_count, used_referrals FROM `users` WHERE `user_id` = ?"); $stmt->execute([$from_id]); $uData = $stmt->fetch(); $available = ($uData['referral_count'] ?? 0) - ($uData['used_referrals'] ?? 0); if ($available >= 25) { // پیدا کردن کانفیگ هدیه از انبار (محصولی که نامش شامل 1 گیگ یا تست باشد برحسب ساختار دیتابیس شما) $confStmt = $db->prepare("SELECT cp.id, cp.link FROM `config_pool` cp JOIN `products` p ON cp.product_id = p.id WHERE p.name LIKE '%1 گیگ%' AND cp.is_used = 0 LIMIT 1"); $confStmt->execute(); $config = $confStmt->fetch(); if ($config) { $db->prepare("UPDATE `config_pool` SET `is_used` = 1 WHERE `id` = ?")->execute([$config['id']]); $db->prepare("UPDATE `users` SET `used_referrals` = used_referrals + 25 WHERE `user_id` = ?")->execute([$from_id]); $formatted = preg_replace('/(vless:\/\/[^\s]+|http[^\s]+)/', '$1', $config['link']); sendMessage($chat_id, "🎉 پکیج هدیه ۱ گیگابایتی شما صادر شد:\n\n$formatted"); } else { sendMessage($chat_id, "❌ انبار پکیج‌های ۱ گیگابایتی هدیه فعلاً خالی است. لطفاً به مدیریت اطلاع دهید."); } } else { sendMessage($chat_id, "❌ تعداد رفرال‌های مجاز شما کافی نیست (نیاز به ۲۵ عدد، موجودی فعلی: $available)."); } @file_get_contents("https://api.telegram.org/bot" . TOKEN . "/answerCallbackQuery?callback_query_id=" . $callback->id); } // انتخاب پلن خرید elseif (strpos($data, 'buy_') === 0) { $prod_id = str_replace('buy_', '', $data); file_put_contents(__DIR__ . "/temp_buy_id_$from_id.txt", $prod_id); $stmt = $db->prepare("SELECT * FROM `products` WHERE `id` = ?"); $stmt->execute([$prod_id]); $p = $stmt->fetch(); $text = "🛒 پلن انتخابی: {$p['name']}\n💰 قیمت: " . number_format($p['price']) . " تومان\n\nلطفاً روش پرداخت را انتخاب کنید:"; $btn = [ [["text" => "💳 کارت به کارت", "callback_data" => "pay_card"], ["text" => "💎 ارز دیجیتال", "callback_data" => "pay_crypto"]], [["text" => "❌ انصراف", "callback_data" => "home"]] ]; sendMessage($chat_id, $text, $btn, true); } // روش‌های پرداخت elseif ($data == "pay_card" || $data == "pay_crypto") { if ($data == "pay_card") { $pay_info = "💳 واریز کارت به کارت:\n\nشماره کارت: 6219861456118115\nبه نام: ارشان سعادت نیا\n\n"; } else { $pay_info = "💎 واریز ارز دیجیتال (TRC20):\n\nآدرس ولت ترون:\nTWwpNxuVgKv8LLwRZV6ifGuqBVTXZqnF1d\n\n"; } $pay_info .= "⚠️ لطفاً پس از واریز، تصویر فیش یا رسید واریز خود را ارسال کنید:"; setStep($from_id, 'wait_proof'); sendMessage($chat_id, $pay_info, [["انصراف"]]); } // تایید فیش توسط ادمین و تحویل خودکار elseif ($from_id == ADMIN_ID && strpos($data, 'confirm_') === 0) { $parts = explode('_', $data); $u_id = $parts[1]; $p_id = $parts[2]; $stmt = $db->prepare("SELECT id, link FROM `config_pool` WHERE `product_id` = ? AND `is_used` = 0 LIMIT 1"); $stmt->execute([$p_id]); $config = $stmt->fetch(); if ($config) { $db->prepare("UPDATE `config_pool` SET `is_used` = 1 WHERE `id` = ?")->execute([$config['id']]); $db->prepare("UPDATE `products` SET `quantity` = quantity - 1 WHERE `id` = ?")->execute([$p_id]); $formatted = preg_replace('/(vless:\/\/[^\s]+|http[^\s]+)/', '$1', $config['link']); sendMessage($u_id, "✅ پرداخت شما تایید شد!\n🎯 کانفیگ اختصاصی شما:\n\n$formatted"); sendMessage($chat_id, "✅ اکانت با موفقیت صادر و برای کاربر ارسال شد."); } else { sendMessage($chat_id, "❌ خطا: انبار برای این پلن خالی است! ابتدا انبار را شارژ کنید."); } } // افزودن کانفیگ به انبار توسط ادمین elseif ($from_id == ADMIN_ID && strpos($data, 'addstock_') === 0) { $prod_id = str_replace('addstock_', '', $data); file_put_contents(__DIR__ . "/temp_stock_id_$from_id.txt", $prod_id); setStep($from_id, 'send_bulk_configs'); sendMessage($chat_id, "🚀 لیست کانفیگ‌ها را بفرستید.\n⚠️ هر کانفیگ را در یک خط قرار داده و بین کانفیگ‌ها علامت *** بگذارید:", [["انصراف"]]); } elseif ($data == "home") { setStep($from_id, 'home'); sendMessage($chat_id, "منوی اصلی:", $main_menu); } exit; } // ۳. پردازش پیام‌های ورودی (متن، عکس و تیکت‌ها) if (isset($update->message)) { $message = $update->message; $text = $message->text ?? ''; // دریافت اطلاعات کاربر از دیتابیس $user = checkUser($from_id); // دستورات بازنشانی عمومی if (strpos($text, "/start") === 0 || $text == "برگشت 🔙" || $text == "انصراف") { setStep($from_id, 'home'); // بررسی مجدد رفرال برای کاربرانی که قبلاً عضو دیتابیس نبودند $parts = explode(" ", $text); if (count($parts) > 1) { $inviter_id = trim($parts[1]); if (is_numeric($inviter_id) && $inviter_id != $from_id && $user['has_inviter'] == 0) { file_put_contents(__DIR__ . "/temp_ref_$from_id.txt", $inviter_id); } } sendMessage($chat_id, "🦾 به نئونت خوش آمدید. لطفاً گزینه مورد نظر خود را انتخاب کنید:", $main_menu); } // بخش حساب کاربری elseif ($text == "👤 حساب کاربری") { $total_ref = $user['referral_count'] ?? 0; $used_ref = $user['used_referrals'] ?? 0; $available_ref = $total_ref - $used_ref; if ($available_ref < 0) $available_ref = 0; $msg = "👤 اطلاعات حساب کاربری شما:\n\n" . "🆔 آیدی عددی شما: $from_id\n" . "👥 کل زیرمجموعه‌های شما: $total_ref نفر\n" . "🪙 رفرال‌های مصرف شده: $used_ref عدد\n" . "🔋 رفرال‌های قابل استفاده فعلی: $available_ref عدد"; sendMessage($chat_id, $msg); } // بخش تبدیل رفرال elseif ($text == "💎 تبدیل رفرال به کانفیگ") { $total_ref = $user['referral_count'] ?? 0; $used_ref = $user['used_referrals'] ?? 0; $available_ref = $total_ref - $used_ref; if ($available_ref < 0) $available_ref = 0; $msg = "💎 فروشگاه رفرال نئونت\n\n" . "تعداد رفرال‌های آزاد شما: $available_ref عدد\n\n" . "🛍 پله فعلی:\n" . "🎁 دریافت کانفیگ ۱ گیگابایتی رایگان در قبال خرُج ۲۵ رفرال فعال."; $btn = [[["text" => "🎁 دریافت پکیج ۱ گیگابایتی (کسر ۲۵ رفرال)", "callback_data" => "claim_ref_1gb"]]]; sendMessage($chat_id, $msg, $btn, true); } // بخش زیرمجموعه‌گیری elseif ($text == "👥 زیرمجموعه‌گیری") { $bot_user = str_replace('@', '', BOT_USER); $ref_link = "https://t.me/$bot_user?start=$from_id"; $total_ref = $user['referral_count'] ?? 0; $used_ref = $user['used_referrals'] ?? 0; $available_ref = $total_ref - $used_ref; if ($available_ref < 0) $available_ref = 0; $msg = "🤝 سیستم زیرمجموعه‌گیری پله‌ای نئونت\n\n" . "با دعوت از دوستان خود به صورت پله‌ای هدایای پرحجم بگیرید:\n" . "🎁 پکیج تست ۱ گیگابایتی رایگان ⇽ فقط با گرفتن ۲۵ رفرال!\n\n" . "📊 آمار دعوت‌های شما: $total_ref نفر\n" . "🔋 رفرال‌های موجود شما: $available_ref عدد\n\n" . "🔗 لینک دعوت اختصاصی شما:\n$ref_link"; $btn = [[["text" => "🚀 ارسال لینک برای دوستان", "url" => "https://t.me/share/url?url=" . urlencode($ref_link)]]]; sendMessage($chat_id, $msg, $btn, true); } // سیستم اکانت تست هوشمند پله‌ای elseif ($text == "🎁 اکانت تست") { $ref_count = $user['referral_count'] ?? 0; $free_test_status = $user['free_test'] ?? 0; $target_plan = ''; $current_level = 0; if ($free_test_status == 0) { $target_plan = "تست 20 مگ"; $current_level = 1; } elseif ($ref_count >= 2 && $free_test_status < 2) { $target_plan = "تست 40 مگ"; $current_level = 2; } elseif ($ref_count >= 5 && $free_test_status < 5) { $target_plan = "تست 100 مگ"; $current_level = 5; } elseif ($ref_count >= 10 && $free_test_status < 10) { $target_plan = "تست 200 مگ"; $current_level = 10; } elseif ($ref_count >= 15 && $free_test_status < 15) { $target_plan = "تست 350 مگ"; $current_level = 15; } elseif ($ref_count >= 20 && $free_test_status < 20) { $target_plan = "تست 700 مگ"; $current_level = 20; } elseif ($ref_count >= 25 && $free_test_status < 25) { $target_plan = "تست 1 گیگ"; $current_level = 25; } if (empty($target_plan)) { if ($free_test_status == 25) { sendMessage($chat_id, "❌ شما تمام اکانت‌های تست رایگان پله‌ای را تا سطح نهایی (۱ گیگابایت) دریافت کرده‌اید!"); } else { $next_req = 2; if ($free_test_status == 1) $next_req = 2; elseif ($free_test_status == 2) $next_req = 5; elseif ($free_test_status == 5) $next_req = 10; elseif ($free_test_status == 10) $next_req = 15; elseif ($free_test_status == 15) $next_req = 20; elseif ($free_test_status == 20) $next_req = 25; $needed = $next_req - $ref_count; $bot_user = str_replace('@', '', BOT_USER); $ref_link = "https://t.me/$bot_user?start=$from_id"; $msg = "🔒 اکانت تست سطح بعدی قفل است!\n\nبرای باز کردن سطح جدید هدایا، باید $needed کاربر جدید دیگر دعوت کنید.\n\n👥 وضعیت فعلی: $ref_count دعوت از $next_req مورد نیاز.\n\n🔗 لینک دعوت شما:\n$ref_link"; sendMessage($chat_id, $msg, [[["text" => "🚀 ارسال لینک برای دوستان", "url" => "https://t.me/share/url?url=" . urlencode($ref_link)]]], true); } } else { $stmt = $db->prepare("SELECT cp.id, cp.link FROM `config_pool` cp JOIN `products` p ON cp.product_id = p.id WHERE p.type = 'test' AND p.name = ? AND cp.is_used = 0 LIMIT 1"); $stmt->execute([$target_plan]); $conf = $stmt->fetch(); if ($conf) { $db->prepare("UPDATE `config_pool` SET `is_used` = 1 WHERE `id` = ?")->execute([$conf['id']]); $db->prepare("UPDATE `users` SET `free_test` = ? WHERE `user_id` = ?")->execute([$current_level, $from_id]); $formatted = preg_replace('/(vless:\/\/[^\s]+|http[^\s]+)/', '$1', $conf['link']); sendMessage($chat_id, "🎁 اکانت تست سطح {$target_plan} شما صادر شد:\n\n$formatted\n\n👥 کل زیرمجموعه‌های شما: $ref_count نفر"); } else { sendMessage($chat_id, "😔 انبار اکانت‌های تست مربوط به پلن «{$target_plan}» در حال حاضر خالی است. لطفاً به مدیریت اطلاع دهید."); } } } // منوی خرید کانفیگ پرمیوم elseif ($text == "🛍 خرید کانفیگ") { $stmt = $db->query("SELECT * FROM `products` WHERE `type` = 'premium' AND `quantity` > 0"); $prods = $stmt->fetchAll(); if ($prods) { $btns = []; foreach ($prods as $p) { $btns[] = [["text" => $p['name'] . " | " . number_format($p['price']) . " ت", "callback_data" => "buy_" . $p['id']]]; } sendMessage($chat_id, "👇 لطفا یکی از پلن‌های زیر را جهت خرید انتخاب کنید:", $btns, true); } else { sendMessage($chat_id, "❌ در حال حاضر موجودی کانفیگ‌های فروشی تمام شده است. به زودی شارژ خواهد شد."); } } // بخش پشتیبانی و تیکتینگ elseif ($text == "🆘 پشتیبانی") { setStep($from_id, 'wait_ticket'); sendMessage($chat_id, "💬 پیام پشتیبانی خود را (به صورت متن یا فرمت‌های دیگر) بنویسید تا مستقیماً به دست مدیریت برسد:", [["برگشت 🔙"]]); } // ذخیره تیکت کاربران و ارسال به ادمین elseif ($user['step'] == 'wait_ticket' && $text != "برگشت 🔙") { sendMessage(ADMIN_ID, "📩 پیام پشتیبانی جدید!\n👤 فرستنده: $from_id\n\n📝 متن پیام:\n$text"); sendMessage($chat_id, "✅ پیام شما با موفقیت برای مدیریت ارسال شد. به زودی پاسخ شما داده خواهد شد.", $main_menu); setStep($from_id, 'home'); } // دریافت فیش واریزی کاربران و فوروارد به ادمین برای تایید elseif ($user['step'] == 'wait_proof' && $text != "انصراف") { $p_id = @file_get_contents(__DIR__ . "/temp_buy_id_$from_id.txt"); $admin_msg = "💰 رسید پرداخت جدید واصل شد!\n👤 آیدی خریدار: $from_id\n📦 آیدی پلن درخواستی: $p_id"; $admin_btn = [[["text" => "✅ تایید فیش و تحویل خودکار کانفیگ", "callback_data" => "confirm_{$from_id}_{$p_id}"]]]; if (isset($message->photo)) { $photo_id = end($message->photo)->file_id; sendPhoto(ADMIN_ID, $photo_id, $admin_msg, $admin_btn); } else { sendMessage(ADMIN_ID, $admin_msg . "\n📝 متن همراه: $text", $admin_btn, true); } @unlink(__DIR__ . "/temp_buy_id_$from_id.txt"); sendMessage($chat_id, "✅ رسید شما برای ادمین ارسال شد. پس از تایید نهایی، کانفیگ اختصاصی شما به صورت خودکار همین‌جا برایتان صادر خواهد شد.", $main_menu); setStep($from_id, 'home'); } // ----------------------------------------------------- // ⚙️ کلیدها و تسک‌های اختصاصی ادمین ربات (ADMIN_ID) // ----------------------------------------------------- if ($from_id == ADMIN_ID) { if ($text == "/admin" || $text == "پنل مدیریت") { setStep($from_id, 'home'); sendMessage($chat_id, "🔧 به کنترل پنل مدیریت نئونت خوش آمدید:", $admin_menu); } elseif ($text == "📊 آمار") { $u_c = $db->query("SELECT COUNT(*) FROM `users`")->fetchColumn(); $s_c = $db->query("SELECT COUNT(*) FROM `config_pool` WHERE `is_used` = 0")->fetchColumn(); sendMessage($chat_id, "📊 آمار زنده ربات شما:\n\n👤 کل کاربران ثبت‌شده: $u_c نفر\n💾 کانفیگ‌های موجود و آماده در انبار: $s_c اکانت"); } elseif ($text == "➕ تعریف پلن") { setStep($from_id, 'add_type'); sendMessage($chat_id, "نوع پلنی که می‌خواهید ایجاد کنید را تعیین کنید:", [["فروشی 💰", "تست 🎁"], ["انصراف"]]); } elseif ($user['step'] == 'add_type' && $text != "انصراف") { file_put_contents(__DIR__ . "/temp_type_$from_id.txt", ($text == "تست 🎁" ? "test" : "premium")); setStep($from_id, 'add_name'); sendMessage($chat_id, "🏷 نام پلن را وارد کنید (مثال: تست 40 مگ یا پرمیوم یکماهه):"); } elseif ($user['step'] == 'add_name' && $text != "انصراف") { file_put_contents(__DIR__ . "/temp_name_$from_id.txt", $text); setStep($from_id, 'add_price'); sendMessage($chat_id, "💰 قیمت پلن را به عدد و واحد تومان وارد کنید (برای پلن تست عدد 0 بزنید):"); } elseif ($user['step'] == 'add_price' && $text != "انصراف") { $stmt = $db->prepare("INSERT INTO `products` (name, type, price, quantity) VALUES (?, ?, ?, 0)"); $stmt->execute([file_get_contents(__DIR__ . "/temp_name_$from_id.txt"), file_get_contents(__DIR__ . "/temp_type_$from_id.txt"), (int)$text]); @unlink(__DIR__ . "/temp_name_$from_id.txt"); @unlink(__DIR__ . "/temp_type_$from_id.txt"); setStep($from_id, 'home'); sendMessage($chat_id, "✅ پلن جدید با موفقیت در دیتابیس ثبت شد.", $admin_menu); } elseif ($text == "📥 افزودن لینک انبار") { $stmt = $db->query("SELECT id, name FROM `products`"); $btns = []; foreach ($stmt->fetchAll() as $p) { $btns[] = [["text" => $p['name'], "callback_data" => "addstock_" . $p['id']]]; } sendMessage($chat_id, "👇 مایلید به کدام پکیج، لینک کانفیگ اضافه کنید؟", $btns, true); } elseif ($user['step'] == 'send_bulk_configs' && $text != "انصراف") { $prod_id = file_get_contents(__DIR__ . "/temp_stock_id_$from_id.txt"); $configs = explode("***", $text); $counter = 0; foreach ($configs as $cfg) { $cfg = trim($cfg); if (!empty($cfg)) { $db->prepare("INSERT INTO `config_pool` (product_id, link, is_used) VALUES (?, ?, 0)")->execute([$prod_id, $cfg]); $counter++; } } $db->prepare("UPDATE `products` SET `quantity` = quantity + ? WHERE `id` = ?")->execute([$counter, $prod_id]); @unlink(__DIR__ . "/temp_stock_id_$from_id.txt"); setStep($from_id, 'home'); sendMessage($chat_id, "✅ تعداد $counter کانفیگ با موفقیت به انبار پکیج متصل شد.", $admin_menu); } elseif ($text == "📢 ارسال همگانی") { setStep($from_id, 'send_to_all_users'); sendMessage($chat_id, "✍️ پیام خود را بفرستید (متن خالی، یا عکس به همراه متن زیر آن):\n\nبرای لغو دستور کلمه انصراف را بفرستید.", [["انصراف"]]); } elseif ($user['step'] == 'send_to_all_users' && $text != "انصراف") { sendMessage($chat_id, "⏳ فرآیند ارسال همگانی به کل دیتابیس آغاز شد. لطفاً صبور باشید...", $admin_menu); setStep($from_id, 'home'); $all_users = $db->query("SELECT user_id FROM `users`")->fetchAll(); $success = 0; $failed = 0; foreach ($all_users as $u) { $target_id = $u['user_id']; if (isset($message->photo)) { $photo_id = end($message->photo)->file_id; $caption = $message->caption ?? ""; $url = "https://api.telegram.org/bot" . TOKEN . "/sendPhoto"; $data = ['chat_id' => $target_id, 'photo' => $photo_id, 'caption' => $caption, 'parse_mode' => 'HTML']; $res = curlRequest($url, $data); } else { $url = "https://api.telegram.org/bot" . TOKEN . "/sendMessage"; $data = ['chat_id' => $target_id, 'text' => $text, 'parse_mode' => 'HTML']; $res = curlRequest($url, $data); } if ($res && $res->ok) { $success++; } else { $failed++; } usleep(40000); // تاخیر ۴۰ میلی‌ثانیه‌ای استاندارد برای جلوگیری از بلاک ترافیک توسط تلگرام } $report = "📢 نتیجه نهایی ارسال همگانی:\n\n🟢 ارسال موفق: $success کاربر\n🔴 ناموفق (بلاک/لغو عضویت): $failed کاربر"; sendMessage($chat_id, $report, $admin_menu); } } }