$chat_id, "text" => $text, "reply_markup" => $keyboard, "reply_to_message_id" => $reply_to, "parse_mode" => "Markdown" ]); } function forwardMessage($chat_id, $from_chat_id, $message_id) { return TelegramRequest("forwardMessage", [ "chat_id" => $chat_id, "from_chat_id" => $from_chat_id, "message_id" => $message_id ]); } function editMessage($chat_id, $message_id, $text, $keyboard = null) { return TelegramRequest("editMessageText", [ "chat_id" => $chat_id, "message_id" => $message_id, "text" => $text, "reply_markup" => $keyboard, "parse_mode" => "Markdown" ]); } function deleteMessage($chat_id, $message_id) { return TelegramRequest("deleteMessage", [ "chat_id" => $chat_id, "message_id" => $message_id ]); } function editMessageReplyMarkup($chat_id, $message_id, $keyboard) { return TelegramRequest("editMessageReplyMarkup", [ "chat_id" => $chat_id, "message_id" => $message_id, "reply_markup" => $keyboard ]); } function answerCallback($callback_id, $text = null, $showAlert = false) { $params = [ "callback_query_id" => $callback_id ]; if ($text !== null) { $params["text"] = $text; } if ($showAlert) { $params["show_alert"] = true; } return TelegramRequest("answerCallbackQuery", $params); } function setStep($chat_id, $step) { global $pdo; $query = "UPDATE `users` SET `step` = ? WHERE `telegram_id` = ?"; $stmt = $pdo->prepare($query); $stmt->execute([$step, $chat_id]); } function generateTrackingId() { return "WD-" . random_int(1000000, 9999999); } function getUsdtIrtPrice() { $url = 'https://api.bitpin.org/v4/mkt/prices/'; $response = file_get_contents($url); if ($response === false) { return null; } $data = json_decode($response, true); if (!is_array($data)) { return null; } foreach ($data as $item) { if (isset($item['code']) && $item['code'] === 'USDT_IRT') { return $item['price']; } } return null; } function getUserWalletAddress($telegram_id, $coin = "USDT ") { $token = getSetting("uwallet_api_key"); $url = "https://api.uwallet.biz/v1/wallet/alias"; $payload = json_encode([ "coin" => $coin ]); $ch = curl_init(); curl_setopt_array($ch, [ CURLOPT_URL => $url, CURLOPT_RETURNTRANSFER => true, CURLOPT_POST => true, CURLOPT_POSTFIELDS => $payload, CURLOPT_HTTPHEADER => [ "Authorization: $token", "Content-Type: application/json", "Accept: application/json" ] ]); $response = curl_exec($ch); $error = curl_error($ch); curl_close($ch); if ($error) { return (object) [ "success" => false, "error" => "CURL ERROR: $error", "address" => null, "raw" => null ]; } $data = json_decode($response); if (!$data) { return (object) [ "success" => false, "error" => "INVALID JSON RESPONSE", "address" => null, "raw" => $response ]; } if (isset($data->data->address) && !empty($data->data->address)) { return (object) [ "success" => true, "address" => $data->data->address, "raw" => $data ]; } return (object) [ "success" => false, "error" => "خطا در ساخت آدرس", "address" => null, "raw" => $data ]; } function getSetting($key) { global $pdo; $stmt = $pdo->prepare("SELECT `value_` FROM `settings` WHERE `key_` = ? LIMIT 1"); $stmt->execute([$key]); $row = $stmt->fetch(); return $row ? $row->value_ : null; } function isAdmin($username) { global $pdo; $query = " SELECT `id` FROM `accounts` WHERE `username` = ? AND `is_admin` = 1 LIMIT 1 "; $stmt = $pdo->prepare($query); $stmt->execute([$username]); return $stmt->fetch() ? true : false; } function adminDashboard($chat_id) { global $pdo; // --- تعداد کل کاربران --- $qUsers = $pdo->query("SELECT COUNT(*) AS total FROM `accounts`"); $totalUsers = (int) $qUsers->fetch()->total; // --- تعداد کل تراکنش‌های فروش --- $qSell = $pdo->query(" SELECT SUM(CASE WHEN status = 'pending' THEN 1 ELSE 0 END) AS pending, SUM(CASE WHEN status = 'done' THEN 1 ELSE 0 END) AS done, SUM(CASE WHEN status = 'rejected' THEN 1 ELSE 0 END) AS rejected FROM `transactions` "); $sell = $qSell->fetch(); // --- تعداد برداشت‌ها --- $qWithdraw = $pdo->query(" SELECT SUM(CASE WHEN status = 'pending' THEN 1 ELSE 0 END) AS pending, SUM(CASE WHEN status = 'sent' THEN 1 ELSE 0 END) AS sent, SUM(CASE WHEN status = 'done' THEN 1 ELSE 0 END) AS done, SUM(CASE WHEN status = 'rejected' THEN 1 ELSE 0 END) AS rejected FROM `withdrawals` "); $wd = $qWithdraw->fetch(); // --- موجودی کل کاربران --- $qBalance = $pdo->query("SELECT SUM(balance) AS total FROM `accounts`"); $totalBalance = number_format((int) $qBalance->fetch()->total); // --- آخرین ۵ تراکنش فروش --- $stmtLastSell = $pdo->query(" SELECT username, amount_usdt, status, order_id FROM `transactions` ORDER BY id DESC LIMIT 5 "); $lastSell = $stmtLastSell->fetchAll(); // --- آخرین ۵ تراکنش برداشت --- $stmtLastWd = $pdo->query(" SELECT username, amount_irt, status, withdraw_id FROM `withdrawals` ORDER BY id DESC LIMIT 5 "); $lastWd = $stmtLastWd->fetchAll(); // --- ساخت متن --- $msg = "📊 *داشبورد مدیریتی*\n\n" . "👥 *تعداد کاربران:* {$totalUsers} نفر\n" . "💰 *مجموع موجودی کاربران:* {$totalBalance} تومان\n\n" . "💸 *تراکنش‌های فروش:*\n" . "⏳ در انتظار: {$sell->pending}\n" . "✅ تایید شده: {$sell->done}\n" . "❌ رد شده: {$sell->rejected}\n\n" . "🏧 *برداشت‌ها:*\n" . "⏳ در انتظار: {$wd->pending}\n" . "🚚 ارسال به بانک: {$wd->sent}\n" . "✅ تسویه شده: {$wd->done}\n" . "❌ رد شده: {$wd->rejected}\n\n" . "📝 *آخرین تراکنش‌های فروش:*\n"; foreach ($lastSell as $s) { $msg .= "👤 {$s->username}\n" . "💰 مقدار: {$s->amount_usdt} USDT\n" . "📌 وضعیت: {$s->status}\n" . "🆔 سفارش: {$s->order_id}\n" . "———————\n"; } $msg .= "\n🏧 *آخرین برداشت‌ها:*\n"; foreach ($lastWd as $w) { $msg .= "👤 {$w->username}\n" . "💵 مبلغ: " . number_format($w->amount_irt) . " تومان\n" . "📌 وضعیت: {$w->status}\n" . "🔖 شناسه: {$w->withdraw_id}\n" . "———————\n"; } sendMessage($chat_id, $msg); }