'8830673953:AAEuhfaFQ-vKNRvhoilWtjyKXJCOa86OAQY', 'OWNER_ID' => '6681317209', 'OWNER_USERNAME' => 'admin', 'DB_HOST' => 'localhost', 'DB_NAME' => 'reporter_bot', 'DB_USER' => 'root', 'DB_PASS' => '', 'BOT_URL' => 'https://yourdomain.com/bot/', 'CARD_NUMBER' => '6037-9975-1234-5678', 'CARD_HOLDER' => 'پارسا تریاکیان' ]; // ============================================ // اگر فرم ارسال شده، فایل‌ها رو بساز // ============================================ if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['create_bot'])) { $botToken = $_POST['bot_token'] ?? $defaultConfig['BOT_TOKEN']; $ownerId = $_POST['owner_id'] ?? $defaultConfig['OWNER_ID']; $ownerUsername = $_POST['owner_username'] ?? $defaultConfig['OWNER_USERNAME']; $dbHost = $_POST['db_host'] ?? $defaultConfig['DB_HOST']; $dbName = $_POST['db_name'] ?? $defaultConfig['DB_NAME']; $dbUser = $_POST['db_user'] ?? $defaultConfig['DB_USER']; $dbPass = $_POST['db_pass'] ?? $defaultConfig['DB_PASS']; $botUrl = $_POST['bot_url'] ?? $defaultConfig['BOT_URL']; $cardNumber = $_POST['card_number'] ?? $defaultConfig['CARD_NUMBER']; $cardHolder = $_POST['card_holder'] ?? $defaultConfig['CARD_HOLDER']; // ساخت فایل‌ها $files = createBotFiles([ 'BOT_TOKEN' => $botToken, 'OWNER_ID' => $ownerId, 'OWNER_USERNAME' => $ownerUsername, 'DB_HOST' => $dbHost, 'DB_NAME' => $dbName, 'DB_USER' => $dbUser, 'DB_PASS' => $dbPass, 'BOT_URL' => $botUrl, 'CARD_NUMBER' => $cardNumber, 'CARD_HOLDER' => $cardHolder ]); // ساخت ZIP $zipName = 'reporter_bot_' . date('Y-m-d_H-i-s') . '.zip'; $zip = new ZipArchive(); $zip->open($zipName, ZipArchive::CREATE); foreach ($files as $filename => $content) { $zip->addFromString($filename, $content); } $zip->close(); // دانلود فایل header('Content-Type: application/zip'); header('Content-Disposition: attachment; filename="' . $zipName . '"'); header('Content-Length: ' . filesize($zipName)); readfile($zipName); unlink($zipName); exit; } // ============================================ // تابع ساخت همه فایل‌ها // ============================================ function createBotFiles($config) { $files = []; // 1. index.php $files['index.php'] = 'checkHealth(); exit; } // پردازش آپدیت try { $bot = new ReporterBot(); $bot->processUpdate($update); } catch (Exception $e) { error_log("Bot Error: " . $e->getMessage()); // ذخیره خطا در فایل file_put_contents(__DIR__ . "/error.log", date("Y-m-d H:i:s") . " - " . $e->getMessage() . "\n", FILE_APPEND); } ?>'; // 2. config.php $files['config.php'] = ' ["name" => "یک ماهه", "price" => 100000, "days" => 30, "traffic" => "50GB"], "2month" => ["name" => "دو ماهه", "price" => 180000, "days" => 60, "traffic" => "120GB"], "3month" => ["name" => "سه ماهه", "price" => 250000, "days" => 90, "traffic" => "200GB"], "6month" => ["name" => "شش ماهه", "price" => 450000, "days" => 180, "traffic" => "500GB"], "1year" => ["name" => "یک ساله", "price" => 800000, "days" => 365, "traffic" => "نامحدود"] ]; // سطوح دسترسی $GLOBALS["accessLevels"] = [ "owner" => 100, "super_admin" => 80, "admin" => 50, "moderator" => 30, "user" => 10 ]; // منطقه زمانی date_default_timezone_set("Asia/Tehran"); ?>'; // 3. database.php $files['database.php'] = ' PDO::ERRMODE_EXCEPTION, PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, PDO::ATTR_EMULATE_PREPARES => false, PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8mb4" ]; $this->conn = new PDO($dsn, DB_USER, DB_PASS, $options); $this->createTables(); } catch(PDOException $e) { die("❌ خطا در اتصال به دیتابیس: " . $e->getMessage()); } } public static function getInstance() { if (self::$instance === null) { self::$instance = new self(); } return self::$instance; } private function createTables() { // جدول کاربران $this->conn->exec("CREATE TABLE IF NOT EXISTS users ( user_id BIGINT PRIMARY KEY, username VARCHAR(255) DEFAULT NULL, first_name VARCHAR(255) DEFAULT NULL, phone VARCHAR(20) DEFAULT NULL, balance BIGINT DEFAULT 0, joined_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP, referral_by BIGINT DEFAULT NULL, subscription_until TIMESTAMP NULL DEFAULT NULL, total_referrals INT DEFAULT 0, referral_earnings BIGINT DEFAULT 0, access_level INT DEFAULT 10, is_banned TINYINT DEFAULT 0, ban_reason TEXT DEFAULT NULL, total_purchases INT DEFAULT 0, INDEX idx_referral (referral_by), INDEX idx_access (access_level) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci"); // جدول پرسنل $this->conn->exec("CREATE TABLE IF NOT EXISTS staff ( user_id BIGINT PRIMARY KEY, username VARCHAR(255) DEFAULT NULL, full_name VARCHAR(255) DEFAULT NULL, role VARCHAR(50) DEFAULT NULL, access_level INT DEFAULT 50, added_by BIGINT DEFAULT NULL, added_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP, permissions TEXT DEFAULT NULL, is_active TINYINT DEFAULT 1, INDEX idx_role (role) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci"); // جدول زیرمجموعه‌ها $this->conn->exec("CREATE TABLE IF NOT EXISTS referrals ( id INT AUTO_INCREMENT PRIMARY KEY, inviter_id BIGINT NOT NULL, invited_id BIGINT NOT NULL, date TIMESTAMP DEFAULT CURRENT_TIMESTAMP, commission_paid BIGINT DEFAULT 0, UNIQUE KEY unique_referral (inviter_id, invited_id), INDEX idx_inviter (inviter_id), INDEX idx_invited (invited_id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci"); // جدول تراکنش‌ها $this->conn->exec("CREATE TABLE IF NOT EXISTS transactions ( id INT AUTO_INCREMENT PRIMARY KEY, user_id BIGINT NOT NULL, amount BIGINT NOT NULL, type VARCHAR(50) DEFAULT NULL, status VARCHAR(20) DEFAULT \"pending\", date TIMESTAMP DEFAULT CURRENT_TIMESTAMP, plan VARCHAR(50) DEFAULT NULL, confirmed_by BIGINT DEFAULT NULL, receipt_file VARCHAR(255) DEFAULT NULL, INDEX idx_user (user_id), INDEX idx_status (status), INDEX idx_date (date) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci"); // جدول برداشت‌ها $this->conn->exec("CREATE TABLE IF NOT EXISTS withdrawals ( id INT AUTO_INCREMENT PRIMARY KEY, user_id BIGINT NOT NULL, amount BIGINT NOT NULL, card_number VARCHAR(20) DEFAULT NULL, status VARCHAR(20) DEFAULT \"pending\", request_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP, processed_date TIMESTAMP NULL DEFAULT NULL, processed_by BIGINT DEFAULT NULL, INDEX idx_user (user_id), INDEX idx_status (status) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci"); // جدول لاگ‌ها $this->conn->exec("CREATE TABLE IF NOT EXISTS activity_logs ( id INT AUTO_INCREMENT PRIMARY KEY, user_id BIGINT DEFAULT NULL, username VARCHAR(255) DEFAULT NULL, action VARCHAR(100) DEFAULT NULL, details TEXT DEFAULT NULL, timestamp TIMESTAMP DEFAULT CURRENT_TIMESTAMP, INDEX idx_user (user_id), INDEX idx_action (action), INDEX idx_timestamp (timestamp) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci"); // جدول کانال‌ها $this->conn->exec("CREATE TABLE IF NOT EXISTS channels ( id INT AUTO_INCREMENT PRIMARY KEY, channel_id VARCHAR(255) UNIQUE NOT NULL, channel_name VARCHAR(255) DEFAULT NULL, type VARCHAR(20) DEFAULT NULL, added_by BIGINT DEFAULT NULL, added_date TIMESTAMP DEFAULT CURRENT_TIMESTAMP, is_required TINYINT DEFAULT 0 ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci"); // جدول تنظیمات $this->conn->exec("CREATE TABLE IF NOT EXISTS settings ( setting_key VARCHAR(100) PRIMARY KEY, setting_value TEXT DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci"); // اضافه کردن ادمین اصلی $stmt = $this->conn->prepare("INSERT IGNORE INTO staff (user_id, username, full_name, role, access_level) VALUES (?, ?, ?, \"owner\", 100)"); $stmt->execute([OWNER_ID, OWNER_USERNAME, "مالک اصلی"]); $stmt = $this->conn->prepare("UPDATE users SET access_level = 100 WHERE user_id = ?"); $stmt->execute([OWNER_ID]); // تنظیمات پیش‌فرض $defaultSettings = [ "min_withdraw" => MIN_WITHDRAW, "commission_percent" => COMMISSION_PERCENT, "referral_bonus" => REFERRAL_BONUS, "bot_version" => BOT_VERSION, "support_username" => "@" . OWNER_USERNAME ]; $stmt = $this->conn->prepare("INSERT IGNORE INTO settings (setting_key, setting_value) VALUES (?, ?)"); foreach ($defaultSettings as $key => $value) { $stmt->execute([$key, $value]); } } // متدهای کوئری public function query($sql, $params = []) { $stmt = $this->conn->prepare($sql); $stmt->execute($params); return $stmt; } public function fetch($sql, $params = []) { $stmt = $this->query($sql, $params); return $stmt->fetch(); } public function fetchAll($sql, $params = []) { $stmt = $this->query($sql, $params); return $stmt->fetchAll(); } public function insert($sql, $params = []) { $this->query($sql, $params); return $this->conn->lastInsertId(); } // متدهای کاربران public function addUser($userId, $username, $firstName, $referralBy = null) { $user = $this->fetch("SELECT user_id FROM users WHERE user_id = ?", [$userId]); if (!$user) { $this->query("INSERT INTO users (user_id, username, first_name, referral_by) VALUES (?, ?, ?, ?)", [$userId, $username, $firstName, $referralBy]); if ($referralBy && $referralBy != $userId) { // ثبت زیرمجموعه $checkRef = $this->fetch("SELECT id FROM referrals WHERE inviter_id = ? AND invited_id = ?", [$referralBy, $userId]); if (!$checkRef) { $this->query("INSERT INTO referrals (inviter_id, invited_id) VALUES (?, ?)", [$referralBy, $userId]); $this->query("UPDATE users SET total_referrals = total_referrals + 1 WHERE user_id = ?", [$referralBy]); // هدیه ثبت‌نام $bonus = REFERRAL_BONUS; $this->query("UPDATE users SET referral_earnings = referral_earnings + ? WHERE user_id = ?", [$bonus, $referralBy]); } } } return $this->getUser($userId); } public function getUser($userId) { return $this->fetch("SELECT * FROM users WHERE user_id = ?", [$userId]); } public function getUserAccess($userId) { $user = $this->getUser($userId); return $user ? $user["access_level"] : 10; } // متدهای پرسنل public function addStaff($userId, $username, $fullName, $role, $accessLevel, $addedBy) { $this->query("INSERT INTO staff (user_id, username, full_name, role, access_level, added_by) VALUES (?, ?, ?, ?, ?, ?) ON DUPLICATE KEY UPDATE full_name=?, role=?, access_level=?", [$userId, $username, $fullName, $role, $accessLevel, $addedBy, $fullName, $role, $accessLevel]); $this->query("UPDATE users SET access_level = ? WHERE user_id = ?", [$accessLevel, $userId]); } public function removeStaff($userId) { $this->query("DELETE FROM staff WHERE user_id = ?", [$userId]); $this->query("UPDATE users SET access_level = 10 WHERE user_id = ?", [$userId]); } public function getAllStaff() { return $this->fetchAll("SELECT * FROM staff WHERE is_active = 1 ORDER BY access_level DESC"); } // متدهای مالی public function addTransaction($userId, $amount, $type, $plan = null, $receipt = null) { $sql = "INSERT INTO transactions (user_id, amount, type, plan, receipt_file) VALUES (?, ?, ?, ?, ?)"; return $this->insert($sql, [$userId, $amount, $type, $plan, $receipt]); } public function confirmTransaction($txId, $confirmedBy) { $tx = $this->fetch("SELECT * FROM transactions WHERE id = ?", [$txId]); if ($tx && $tx["status"] == "pending") { $this->query("UPDATE transactions SET status = \"confirmed\", confirmed_by = ? WHERE id = ?", [$confirmedBy, $txId]); // فعال‌سازی اشتراک if ($tx["plan"] && isset($GLOBALS["plans"][$tx["plan"]])) { $days = $GLOBALS["plans"][$tx["plan"]]["days"]; $this->addSubscription($tx["user_id"], $days); $this->query("UPDATE users SET total_purchases = total_purchases + 1 WHERE user_id = ?", [$tx["user_id"]]); } // پورسانت معرف $user = $this->getUser($tx["user_id"]); if ($user && $user["referral_by"]) { $commission = intval($tx["amount"] * COMMISSION_PERCENT / 100); $this->query("UPDATE users SET referral_earnings = referral_earnings + ? WHERE user_id = ?", [$commission, $user["referral_by"]]); $this->query("UPDATE referrals SET commission_paid = commission_paid + ? WHERE inviter_id = ? AND invited_id = ?", [$commission, $user["referral_by"], $tx["user_id"]]); } return true; } return false; } public function addSubscription($userId, $days) { $user = $this->getUser($userId); $startDate = new DateTime(); if ($user && $user["subscription_until"]) { $subDate = new DateTime($user["subscription_until"]); if ($subDate > $startDate) { $startDate = $subDate; } } $startDate->modify("+{$days} days"); $this->query("UPDATE users SET subscription_until = ? WHERE user_id = ?", [$startDate->format("Y-m-d H:i:s"), $userId]); } public function getPendingTransactions() { return $this->fetchAll("SELECT t.*, u.username, u.first_name FROM transactions t LEFT JOIN users u ON t.user_id = u.user_id WHERE t.status = \"pending\" ORDER BY t.date DESC LIMIT 50"); } public function requestWithdrawal($userId, $amount, $cardNumber) { $user = $this->getUser($userId); if ($user && $user["referral_earnings"] >= $amount) { $id = $this->insert("INSERT INTO withdrawals (user_id, amount, card_number) VALUES (?, ?, ?)", [$userId, $amount, $cardNumber]); $this->query("UPDATE users SET referral_earnings = referral_earnings - ? WHERE user_id = ?", [$amount, $userId]); return $id; } return false; } public function getPendingWithdrawals() { return $this->fetchAll("SELECT w.*, u.username, u.first_name FROM withdrawals w LEFT JOIN users u ON w.user_id = u.user_id WHERE w.status = \"pending\" ORDER BY w.request_date DESC"); } public function confirmWithdrawal($withdrawalId, $processedBy) { $this->query("UPDATE withdrawals SET status = \"confirmed\", processed_date = NOW(), processed_by = ? WHERE id = ?", [$processedBy, $withdrawalId]); } // متدهای آماری public function getFullStats() { $stats = []; $stats["total_users"] = $this->fetch("SELECT COUNT(*) as cnt FROM users")["cnt"] ?? 0; $stats["total_admins"] = $this->fetch("SELECT COUNT(*) as cnt FROM users WHERE access_level >= 50")["cnt"] ?? 0; $stats["banned_users"] = $this->fetch("SELECT COUNT(*) as cnt FROM users WHERE is_banned = 1")["cnt"] ?? 0; $revenue = $this->fetch("SELECT COALESCE(SUM(amount), 0) as total, COUNT(*) as cnt FROM transactions WHERE status = \"confirmed\""); $stats["total_revenue"] = $revenue["total"] ?? 0; $stats["total_sales"] = $revenue["cnt"] ?? 0; $pending = $this->fetch("SELECT COALESCE(SUM(amount), 0) as total, COUNT(*) as cnt FROM transactions WHERE status = \"pending\""); $stats["pending_amount"] = $pending["total"] ?? 0; $stats["pending_count"] = $pending["cnt"] ?? 0; $stats["new_users_week"] = $this->fetch("SELECT COUNT(*) as cnt FROM users WHERE joined_date >= DATE_SUB(NOW(), INTERVAL 7 DAY)")["cnt"] ?? 0; $stats["new_users_month"] = $this->fetch("SELECT COUNT(*) as cnt FROM users WHERE joined_date >= DATE_SUB(NOW(), INTERVAL 30 DAY)")["cnt"] ?? 0; $weekRevenue = $this->fetch("SELECT COALESCE(SUM(amount), 0) as total FROM transactions WHERE status = \"confirmed\" AND date >= DATE_SUB(NOW(), INTERVAL 7 DAY)"); $stats["week_revenue"] = $weekRevenue["total"] ?? 0; return $stats; } // لاگ public function addLog($userId, $username, $action, $details = []) { $this->query("INSERT INTO activity_logs (user_id, username, action, details) VALUES (?, ?, ?, ?)", [$userId, $username, $action, json_encode($details, JSON_UNESCAPED_UNICODE)]); } public function getRecentLogs($limit = 50) { return $this->fetchAll("SELECT * FROM activity_logs ORDER BY timestamp DESC LIMIT ?", [$limit]); } // مسدودسازی public function banUser($userId, $reason) { $this->query("UPDATE users SET is_banned = 1, ban_reason = ? WHERE user_id = ?", [$reason, $userId]); } public function unbanUser($userId) { $this->query("UPDATE users SET is_banned = 0, ban_reason = NULL WHERE user_id = ?", [$userId]); } public function getBannedUsers() { return $this->fetchAll("SELECT * FROM users WHERE is_banned = 1"); } // کانال‌ها public function addChannel($channelId, $channelName, $type, $addedBy, $isRequired = 0) { $this->query("INSERT INTO channels (channel_id, channel_name, type, added_by, is_required) VALUES (?, ?, ?, ?, ?) ON DUPLICATE KEY UPDATE channel_name=?, is_required=?", [$channelId, $channelName, $type, $addedBy, $isRequired, $channelName, $isRequired]); } public function removeChannel($channelId) { $this->query("DELETE FROM channels WHERE channel_id = ?", [$channelId]); } public function getAllChannels() { return $this->fetchAll("SELECT * FROM channels ORDER BY added_date DESC"); } public function getRequiredChannels() { return $this->fetchAll("SELECT * FROM channels WHERE is_required = 1"); } } ?>'; // 4. bot.php (کلاس اصلی) $files['bot.php'] = 'db = Database::getInstance(); $this->apiUrl = "https://api.telegram.org/bot" . BOT_TOKEN; } public function checkHealth() { header("Content-Type: application/json"); echo json_encode([ "status" => "active", "bot_version" => BOT_VERSION, "time" => date("Y-m-d H:i:s"), "message" => "ربات با موفقیت راه‌اندازی شده است! ✅" ], JSON_UNESCAPED_UNICODE); } public function processUpdate($update) { try { if (isset($update["message"])) { $this->handleMessage($update["message"]); } elseif (isset($update["callback_query"])) { $this->handleCallback($update["callback_query"]); } elseif (isset($update["pre_checkout_query"])) { $this->answerPreCheckout($update["pre_checkout_query"]["id"]); } } catch (Exception $e) { error_log("Process Error: " . $e->getMessage()); } } private function handleMessage($message) { $chatId = $message["chat"]["id"]; $userId = $message["from"]["id"]; $text = $message["text"] ?? ""; $firstName = $message["from"]["first_name"] ?? "کاربر"; $username = $message["from"]["username"] ?? ""; // بررسی مسدود بودن $user = $this->db->getUser($userId); if ($user && $user["is_banned"]) { $this->sendMessage($chatId, "⛔ حساب شما مسدود شده است.\n📝 دلیل: " . $user["ban_reason"]); return; } // ثبت کاربر $referralBy = null; if (preg_match("/\/start\s+ref_(\d+)/", $text, $matches)) { $referralBy = $matches[1]; } $this->db->addUser($userId, $username, $firstName, $referralBy); $accessLevel = $this->db->getUserAccess($userId); // منوی اصلی if (strpos($text, "/start") === 0) { $this->sendWelcomeMessage($chatId, $firstName, $userId, $accessLevel); } elseif ($text === "🔑 خرید اشتراک") { $this->showPlans($chatId); } elseif ($text === "👤 پروفایل من") { $this->showProfile($chatId, $userId); } elseif ($text === "💰 کیف پول") { $this->showWallet($chatId, $userId); } elseif ($text === "🔗 زیرمجموعه‌گیری") { $this->showReferralLink($chatId, $userId); } elseif ($text === "📊 آمار من") { $this->showUserStats($chatId, $userId); } elseif ($text === "📞 پشتیبانی") { $this->showSupport($chatId); } elseif ($text === "🎛️ پنل مدیریت" && $accessLevel >= 50) { $this->showAdminPanel($chatId, $userId); } else { $this->sendMainMenu($chatId, $accessLevel); } } private function handleCallback($callback) { $callbackId = $callback["id"]; $userId = $callback["from"]["id"]; $data = $callback["data"]; $messageId = $callback["message"]["message_id"] ?? null; $chatId = $callback["message"]["chat"]["id"] ?? null; // پاسخ به کال‌بک $this->answerCallback($callbackId); // پردازش کال‌بک‌ها if (strpos($data, "buy_") === 0) { $planId = str_replace("buy_", "", $data); $this->showPaymentInfo($chatId, $messageId, $planId); } elseif (strpos($data, "pay_card_") === 0) { $planId = str_replace("pay_card_", "", $data); $this->showCardPayment($chatId, $messageId, $planId); } elseif (strpos($data, "paid_") === 0) { $planId = str_replace("paid_", "", $data); $this->processPayment($chatId, $messageId, $userId, $planId); } elseif (strpos($data, "confirm_tx_") === 0) { $txId = str_replace("confirm_tx_", "", $data); $this->confirmTransaction($chatId, $messageId, $userId, $txId); } elseif (strpos($data, "reject_tx_") === 0) { $txId = str_replace("reject_tx_", "", $data); $this->rejectTransaction($chatId, $messageId, $userId, $txId); } elseif (strpos($data, "confirm_withdraw_") === 0) { $wId = str_replace("confirm_withdraw_", "", $data); $this->confirmWithdrawal($chatId, $messageId, $userId, $wId); } elseif ($data === "admin_dashboard") { $this->showDashboard($chatId, $messageId, $userId); } elseif ($data === "admin_transactions") { $this->showPendingTransactions($chatId, $messageId, $userId); } elseif ($data === "admin_staff") { $this->showStaffList($chatId, $messageId, $userId); } elseif ($data === "admin_withdrawals") { $this->showPendingWithdrawals($chatId, $messageId, $userId); } elseif ($data === "admin_back") { $this->editAdminPanel($chatId, $messageId, $userId); } elseif ($data === "back_main" || $data === "admin_exit") { $this->deleteMessage($chatId, $messageId); } } // ========== متدهای ارسال پیام ========== private function sendMessage($chatId, $text, $keyboard = null, $parseMode = "HTML") { $params = [ "chat_id" => $chatId, "text" => $text, "parse_mode" => $parseMode, "disable_web_page_preview" => true ]; if ($keyboard) { $params["reply_markup"] = json_encode($keyboard); } return $this->callAPI("sendMessage", $params); } private function editMessage($chatId, $messageId, $text, $keyboard = null, $parseMode = "HTML") { $params = [ "chat_id" => $chatId, "message_id" => $messageId, "text" => $text, "parse_mode" => $parseMode ]; if ($keyboard) { $params["reply_markup"] = json_encode($keyboard); } return $this->callAPI("editMessageText", $params); } private function deleteMessage($chatId, $messageId) { return $this->callAPI("deleteMessage", [ "chat_id" => $chatId, "message_id" => $messageId ]); } private function answerCallback($callbackId, $text = "", $showAlert = false) { return $this->callAPI("answerCallbackQuery", [ "callback_query_id" => $callbackId, "text" => $text, "show_alert" => $showAlert ]); } private function callAPI($method, $params) { $url = $this->apiUrl . "/" . $method; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, $params); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_TIMEOUT, 10); $response = curl_exec($ch); $error = curl_error($ch); curl_close($ch); if ($error) { error_log("CURL Error: " . $error); } return json_decode($response, true); } // ========== متدهای منو و نمایش ========== private function sendMainMenu($chatId, $accessLevel = 10) { $keyboard = [ "keyboard" => [ ["🔑 خرید اشتراک", "👤 پروفایل من"], ["💰 کیف پول", "🔗 زیرمجموعه‌گیری"], ["📊 آمار من", "📞 پشتیبانی"] ], "resize_keyboard" => true, "one_time_keyboard" => false ]; if ($accessLevel >= 50) { $keyboard["keyboard"][] = ["🎛️ پنل مدیریت"]; } $text = "🎯 منوی اصلی\n\nلطفاً یکی از گزینه‌ها را انتخاب کنید:"; $this->sendMessage($chatId, $text, $keyboard); } private function sendWelcomeMessage($chatId, $firstName, $userId, $accessLevel) { $botUsername = $this->getBotUsername(); $refLink = "https://t.me/{$botUsername}?start=ref_{$userId}"; $text = "🎉 سلام {$firstName} عزیز!\n\n"; $text .= "به ربات ریپورتر حرفه‌ای خوش آمدید! 🚀\n\n"; $text .= "🔹 امکانات ربات:\n"; $text .= "• خرید اشتراک VPN با قیمت مناسب\n"; $text .= "• زیرمجموعه‌گیری و کسب درآمد 💰\n"; $text .= "• پورسانت " . COMMISSION_PERCENT . "٪ از خرید زیرمجموعه\n"; $text .= "• هدیه " . number_format(REFERRAL_BONUS) . " تومانی ثبت‌نام\n\n"; $text .= "🔗 لینک دعوت شما:\n{$refLink}"; $this->sendMessage($chatId, $text); $this->sendMainMenu($chatId, $accessLevel); $this->db->addLog($userId, "", "start_bot", []); } private function showPlans($chatId) { $keyboard = ["inline_keyboard" => []]; foreach ($GLOBALS["plans"] as $planId => $plan) { $keyboard["inline_keyboard"][] = [[ "text" => "📦 {$plan["name"]} - " . number_format($plan["price"]) . " تومان ({$plan["traffic"]})", "callback_data" => "buy_{$planId}" ]]; } $keyboard["inline_keyboard"][] = [["text" => "🔙 بازگشت", "callback_data" => "back_main"]]; $text = "📦 پلن‌های اشتراک\n\n"; $text .= "برای مشاهده جزئیات و خرید، یک پلن انتخاب کنید:\n\n"; foreach ($GLOBALS["plans"] as $planId => $plan) { $text .= "• {$plan["name"]}: " . number_format($plan["price"]) . " تومان | {$plan["traffic"]}\n"; } $this->sendMessage($chatId, $text, $keyboard); } private function showProfile($chatId, $userId) { $user = $this->db->getUser($userId); if (!$user) { $this->sendMessage($chatId, "❌ کاربر یافت نشد!"); return; } // وضعیت اشتراک $subStatus = "❌ غیرفعال"; if ($user["subscription_until"]) { $subDate = new DateTime($user["subscription_until"]); $now = new DateTime(); if ($subDate > $now) { $daysLeft = $now->diff($subDate)->days; $subStatus = "✅ فعال ({$daysLeft} روز باقی‌مانده)"; } else { $subStatus = "⚠️ منقضی شده"; } } $text = "👤 پروفایل کاربری\n\n"; $text .= "🆔 شناسه: {$user["user_id"]}\n"; $text .= "👤 نام: {$user["first_name"]}\n"; $text .= "📱 تلفن: " . ($user["phone"] ?: "ثبت نشده") . "\n\n"; $text .= "💳 وضعیت اشتراک: {$subStatus}\n"; $text .= "📅 عضو از: " . date("Y/m/d", strtotime($user["joined_date"])) . "\n\n"; $text .= "🔗 زیرمجموعه‌ها: {$user["total_referrals"]} نفر\n"; $text .= "💰 درآمد: " . number_format($user["referral_earnings"]) . " تومان\n"; $text .= "🛒 خریدها: {$user["total_purchases"]}"; $this->sendMessage($chatId, $text); } private function showWallet($chatId, $userId) { $user = $this->db->getUser($userId); $earnings = $user ? $user["referral_earnings"] : 0; $keyboard = ["inline_keyboard" => [ [["text" => "💰 برداشت موجودی", "callback_data" => "withdraw_request"]], [["text" => "🔙 بازگشت", "callback_data" => "back_main"]] ]]; $text = "💰 کیف پول شما\n\n"; $text .= "💸 موجودی قابل برداشت: " . number_format($earnings) . " تومان\n\n"; $text .= "📊 پورسانت: " . COMMISSION_PERCENT . "٪ از خرید زیرمجموعه\n"; $text .= "🎁 هدیه ثبت‌نام: " . number_format(REFERRAL_BONUS) . " تومان\n\n"; $text .= "⚠️ حداقل برداشت: " . number_format(MIN_WITHDRAW) . " تومان"; $this->sendMessage($chatId, $text, $keyboard); } private function showReferralLink($chatId, $userId) { $botUsername = $this->getBotUsername(); $refLink = "https://t.me/{$botUsername}?start=ref_{$userId}"; $user = $this->db->getUser($userId); $refCount = $user ? $user["total_referrals"] : 0; $text = "🔗 زیرمجموعه‌گیری\n\n"; $text .= "📱 لینک اختصاصی شما:\n"; $text .= "{$refLink}\n\n"; $text .= "📊 آمار:\n"; $text .= "👥 زیرمجموعه: {$refCount} نفر\n"; $text .= "💰 پورسانت: " . COMMISSION_PERCENT . "٪\n"; $text .= "🎁 هدیه: " . number_format(REFERRAL_BONUS) . " تومان\n\n"; $text .= "💡 لینک را با دوستان خود به اشتراک بگذارید و کسب درآمد کنید!"; $this->sendMessage($chatId, $text); } private function showUserStats($chatId, $userId) { $user = $this->db->getUser($userId); if (!$user) return; $text = "📊 آمار فعالیت شما\n\n"; $text .= "👥 زیرمجموعه: {$user["total_referrals"]} نفر\n"; $text .= "💰 درآمد: " . number_format($user["referral_earnings"]) . " تومان\n"; $text .= "🛒 خریدها: {$user["total_purchases"]}\n"; $text .= "📅 تاریخ عضویت: " . date("Y/m/d", strtotime($user["joined_date"])) . "\n\n"; $text .= "🎯 پورسانت شما: " . COMMISSION_PERCENT . "٪"; $this->sendMessage($chatId, $text); } private function showSupport($chatId) { $text = "📞 پشتیبانی\n\n"; $text .= "👤 ا