setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $db->exec("CREATE TABLE IF NOT EXISTS admins (admin_id INTEGER PRIMARY KEY, online INTEGER DEFAULT 0, last_assigned TEXT)"); $db->exec("CREATE TABLE IF NOT EXISTS messages (id INTEGER PRIMARY KEY AUTOINCREMENT, user_id INTEGER, name TEXT, issue TEXT, assigned_admin INTEGER, timestamp TEXT)"); $db->exec("CREATE TABLE IF NOT EXISTS chat_history (id INTEGER PRIMARY KEY AUTOINCREMENT, customer_id INTEGER, sender_type TEXT, message_content TEXT, timestamp TEXT)"); $db->exec("CREATE TABLE IF NOT EXISTS system_state (key TEXT PRIMARY KEY, value TEXT)"); } catch (Exception $e) { exit; } // ইনিশিয়াল অ্যাডমিন ও ওনার সেটাপ foreach (array_merge($ownerIds, $initialAdmins) as $uId) { $stmt = $db->prepare("INSERT OR IGNORE INTO admins (admin_id, online, last_assigned) VALUES (?, 0, ?)"); $stmt->execute([$uId, date('Y-m-d H:i:s')]); } // ------------------------- // TELEGRAM INCOMING DATA // ------------------------- $update = json_decode(file_get_contents("php://input"), true); if (!$update) exit; $message = isset($update['message']) ? $update['message'] : null; $callbackQuery = isset($update['callback_query']) ? $update['callback_query'] : null; // ------------------------- // MEMORY MAPS & STATE PERSISTENCE FUNCTIONS // ------------------------- function getSystemState($key, $default = []) { global $db; $stmt = $db->prepare("SELECT value FROM system_state WHERE key = ?"); $stmt->execute([$key]); $row = $stmt->fetch(PDO::FETCH_ASSOC); return $row ? json_decode($row['value'], true) : $default; } function saveSystemState($key, $value) { global $db; $stmt = $db->prepare("REPLACE INTO system_state (key, value) VALUES (?, ?)"); $stmt->execute([$key, json_encode($value)]); } // STATE LOADING $activeChats = getSystemState('active_chats', []); // customer_id => admin_id $reverseChats = getSystemState('reverse_chats', []); // admin_id => customer_id $waitingQueue = getSystemState('waiting_queue', []); // অপেক্ষমাণ কিউ $userData = getSystemState('user_data', []); // কাস্টমার ট্র্যাকিং ডাটা $adminData = getSystemState('admin_data', []); // admin_id => ['state' => '...'] $lastAdminReply = getSystemState('last_admin_reply', []); // customer_id => timestamp $supportSystemEnabled = getSystemState('support_enabled', true); // সাপোর্ট সিস্টেম অন/অফ স্ট্যাটাস // অ্যাডমিন তালিকা $stmt = $db->query("SELECT admin_id FROM admins"); $fetchAdmins = $stmt->fetchAll(PDO::FETCH_COLUMN); $allAdmins = !empty($fetchAdmins) ? array_map('intval', $fetchAdmins) : array_map('intval', $ownerIds); // ------------------------- // HELPER FUNCTIONS // ------------------------- function sendRequest($method, $params = []) { global $apiUrl; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $apiUrl . "/" . $method); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $params); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); $response = curl_exec($ch); curl_close($ch); return json_decode($response, true); } function getAllActiveStaff() { global $db, $ownerIds; $stmt = $db->query("SELECT admin_id FROM admins WHERE online = 1"); $fetchOnline = $stmt->fetchAll(PDO::FETCH_COLUMN); $onlineStaff = !empty($fetchOnline) ? array_map('intval', $fetchOnline) : []; return array_unique(array_merge($onlineStaff, $ownerIds)); } function notifyWaitingCustomers($adminId) { global $db, $reverseChats, $waitingQueue, $userData; $stmt = $db->prepare("SELECT online FROM admins WHERE admin_id = ?"); $stmt->execute([$adminId]); $onlineRow = $stmt->fetchColumn(); if ($onlineRow == 0 || isset($reverseChats[$adminId])) return; if (!empty($waitingQueue)) { $userId = $waitingQueue[0]; $name = isset($userData[$userId]['name']) ? $userData[$userId]['name'] : "Client"; $issue = isset($userData[$userId]['issue']) ? $userData[$userId]['issue'] : "No details provided"; $alertPayload = "📥 *NEW LIVE SUPPORT REQUEST (FROM QUEUE)*\n━━━━━━━━━━━━━━━━━━━━━━\n👤 *Client Name:* $name\n📝 *Issue Details:* $issue\n🆔 *Client ID:* `$userId`\n━━━━━━━━━━━━━━━━━━━━━━\n⚡ _সেশনটি ওয়ান-টু-ওয়ান লক করতে নিচের বাটনে চাপুন।_"; $claimKeyboard = json_encode([ "inline_keyboard" => [ [["text" => "✅ সেশন লক করুন", "callback_data" => "claim_" . $userId]] ] ]); sendRequest("sendMessage", ["chat_id" => $adminId, "text" => $alertPayload, "parse_mode" => "Markdown", "reply_markup" => $claimKeyboard]); } } function logMessage($userId, $name, $issue, $admin) { global $db; $stmt = $db->prepare("INSERT INTO messages (user_id, name, issue, assigned_admin, timestamp) VALUES (?, ?, ?, ?, ?)"); $stmt->execute([$userId, $name, $issue, $admin, date('Y-m-d H:i:s')]); } function getAdminKeyboard($isOwner) { global $supportSystemEnabled; $toggleBtnText = $supportSystemEnabled ? "🔴 সাপোর্ট বন্ধ করুন" : "🟢 সাপোর্ট চালু করুন"; $buttons = [ [["text" => "🟢 স্ট্যাটাস / Online"], ["text" => $toggleBtnText]], [["text" => "❌ চ্যাট শেষ করুন"], ["text" => "📊 REPORT"]], [["text" => "📜 হিস্টরি"], ["text" => "🔄 চ্যাট ট্রান্সফার"]], [["text" => "📢 BR"]] ]; if ($isOwner) { $buttons[] = [["text" => "📋 অ্যাডমিন তালিকা"], ["text" => "🗑️ ইউজার ডাটা রিমুভ"]]; $buttons[] = [["text" => "➕ অ্যাডমিন যোগ"], ["text" => "➖ অ্যাডমিন সরাও"]]; } return json_encode(["keyboard" => $buttons, "resize_keyboard" => true]); } // ইউজার ক্যাটাগরির জন্য ইনলাইন কিবোর্ড - (১ লাইনে ১টি বাটন করে সুন্দরভাবে সাজানো হয়েছে) function getUserCategoryInlineKeyboard() { $keyboard = [ [["text" => "👤 একাউন্ট সমস্যা", "callback_data" => "cat_account"]], [["text" => "💰 ব্যালেন্স এড হয় না", "callback_data" => "cat_balance"]], [["text" => "🛒 অর্ডার সমস্যা", "callback_data" => "cat_order"]], [["text" => "👨‍💻 কাস্টমার প্রতিনিধি", "callback_data" => "cat_agent"]] ]; return json_encode(["inline_keyboard" => $keyboard]); } function isSupportAvailable() { global $supportSystemEnabled; return (bool)$supportSystemEnabled; } function getOfflineNotice() { return "🔴 *[সাপোর্ট টিম অফলাইন]*\n━━━━━━━━━━━━━━━━━━━━━━\n⚠️ প্রিয় গ্রাহক, দুঃখিত! আমাদের অফিশিয়াল লাইভ সাপোর্ট সেশন এই মুহূর্তে বন্ধ রয়েছে। \n\n⏰ **আমাদের অফিসিয়াল সময়:** প্রতিদিন সকাল ০৯:০০ টা থেকে রাত ১১:০০ টা পর্যন্ত।\n\n📌 অনুগ্রহ করে আমাদের অফিসিয়াল টাইমে পুনরায় যোগাযোগ করুন। আপনার যেকোনো সমস্যা সমাধানে আমরা সর্বদা প্রস্তুত। ধন্যবাদ! 🙏"; } function logChatMessage($customerId, $senderType, $content) { global $db; $stmt = $db->prepare("INSERT INTO chat_history (customer_id, sender_type, message_content, timestamp) VALUES (?, ?, ?, ?)"); $stmt->execute([$customerId, $senderType, $content, date('Y-m-d H:i:s')]); } // ------------------------- // GLOBAL AUTO-TIMEOUT CLEANER (5 MINS) // ------------------------- if (!empty($lastAdminReply) && is_array($lastAdminReply)) { foreach ($lastAdminReply as $cId => $lastTime) { if ((time() - (int)$lastTime) > 300) { if (isset($activeChats[$cId])) { $aId = $activeChats[$cId]; unset($reverseChats[$aId]); unset($activeChats[$cId]); unset($lastAdminReply[$cId]); saveSystemState('active_chats', $activeChats); saveSystemState('reverse_chats', $reverseChats); saveSystemState('last_admin_reply', $lastAdminReply); logChatMessage($cId, 'system', "Chat auto-terminated due to user inactivity (5 mins)"); $timeoutNotice = "⏰ *[SESSION TIMEOUT]*\n━━━━━━━━━━━━━━━━━━━━━━\n⚠️ প্রিয় গ্রাহক, আপনার পক্ষ থেকে দীর্ঘ ৫ মিনিট কোনো সাড়া না পাওয়ায় আমাদের সিকিউর চ্যাট সেশনটি স্বয়ংক্রিয়ভাবে বন্ধ করা হয়েছে।\n\n🤝 *Cyber Sentinel Bangladesh*-এর সাথে থাকার জন্য ধন্যবাদ। পুনরায় সহায়তার প্রয়োজন হলে যেকোনো সময় আবার `/start` লিখুন।"; sendRequest("sendMessage", ["chat_id" => $cId, "text" => $timeoutNotice, "parse_mode" => "Markdown", "reply_markup" => json_encode(["remove_keyboard" => true])]); sendRequest("sendMessage", ["chat_id" => $aId, "text" => "⚠️ *ইউজার নিষ্ক্রিয়তা অ্যালার্ট!*\n\nগ্রাহক থেকে ৫ মিনিট কোনো রেসপন্স না পাওয়ায় সেশনটি স্বয়ংক্রিয়ভাবে বন্ধ করা হয়েছে।\n🆔 *Client ID:* `$cId`", "parse_mode" => "Markdown", "reply_markup" => getAdminKeyboard(in_array($aId, $ownerIds))]); notifyWaitingCustomers($aId); } } } } // ------------------------- // CALLBACK QUERY HANDLER // ------------------------- if ($callbackQuery) { $fromId = intval($callbackQuery['from']['id']); $data = $callbackQuery['data']; $msgId = $callbackQuery['message']['message_id']; // --- অ্যাডমিন হ্যান্ডলার কুরি --- if (in_array($fromId, $allAdmins)) { if ($data == "go_online") { $stmt = $db->prepare("UPDATE admins SET online = 1 WHERE admin_id = ?"); $stmt->execute([$fromId]); sendRequest("answerCallbackQuery", ["callback_query_id" => $callbackQuery['id'], "text" => "ডিউটি স্ট্যাটাস: অনলাইন ✔"]); sendRequest("editMessageText", ["chat_id" => $fromId, "message_id" => $msgId, "text" => "⚡ স্ট্যাটাস: 🟢 **ACTIVE / ONLINE**", "parse_mode" => "Markdown"]); notifyWaitingCustomers($fromId); exit; } elseif ($data == "go_offline") { if (isset($reverseChats[$fromId])) { sendRequest("answerCallbackQuery", ["callback_query_id" => $callbackQuery['id'], "text" => "❌ চলমান চ্যাট সেশন আগে শেষ করুন।", "show_alert" => true]); exit; } $stmt = $db->prepare("UPDATE admins SET online = 0 WHERE admin_id = ?"); $stmt->execute([$fromId]); sendRequest("answerCallbackQuery", ["callback_query_id" => $callbackQuery['id'], "text" => "ডিউটি স্ট্যাটাস: অফলাইন ❌"]); sendRequest("editMessageText", ["chat_id" => $fromId, "message_id" => $msgId, "text" => "⚡ স্ট্যাটাস: 🔴 **INACTIVE / OFFLINE**", "parse_mode" => "Markdown"]); exit; } elseif (str_starts_with($data, "claim_")) { $customerId = intval(substr($data, 6)); if (isset($reverseChats[$fromId])) { sendRequest("answerCallbackQuery", ["callback_query_id" => $callbackQuery['id'], "text" => "❌ আপনি ইতিমধ্যে একটি সক্রিয় চ্যাটে আছেন। আগে সেটি শেষ করুন।", "show_alert" => true]); exit; } if (isset($activeChats[$customerId])) { sendRequest("answerCallbackQuery", ["callback_query_id" => $callbackQuery['id'], "text" => "❌ দুঃখিত! এই কাস্টমার সেশনটি অন্য এডমিন ইতিমধ্যে লক করে নিয়েছেন।", "show_alert" => true]); sendRequest("editMessageText", ["chat_id" => $fromId, "message_id" => $msgId, "text" => "❌ চ্যাটটি ইতিমধ্যে অন্য এডমিন দ্বারা লকড।\n🆔 UID: `$customerId`", "parse_mode" => "Markdown"]); exit; } if (($key = array_search($customerId, $waitingQueue)) !== false) { unset($waitingQueue[$key]); $waitingQueue = array_values($waitingQueue); saveSystemState('waiting_queue', $waitingQueue); } $activeChats[$customerId] = $fromId; $reverseChats[$fromId] = $customerId; $lastAdminReply[$customerId] = time(); saveSystemState('active_chats', $activeChats); saveSystemState('reverse_chats', $reverseChats); saveSystemState('last_admin_reply', $lastAdminReply); $name = isset($userData[$customerId]['name']) ? $userData[$customerId]['name'] : "Client"; $issue = isset($userData[$customerId]['issue']) ? $userData[$customerId]['issue'] : "Live Support Request"; logChatMessage($customerId, 'system', "Chat officially claimed by Admin $fromId"); logMessage($customerId, $name, $issue, $fromId); sendRequest("answerCallbackQuery", ["callback_query_id" => $callbackQuery['id'], "text" => "✅ সেশন সফলভাবে লক করা হয়েছে!"]); sendRequest("editMessageText", [ "chat_id" => $fromId, "message_id" => $msgId, "text" => "✅ *সেশন কানেক্টেড!*\n━━━━━━━━━━━━━━━━━━━━━━\n👤 *Client Name:* $name\n🆔 *Client ID:* `$customerId`\n━━━━━━━━━━━━━━━━━━━━━━\n💬 _চ্যাট ওয়ান-টু-ওয়ান লকড হয়েছে। আপনার পাঠানো মেসেজ সরাসরি কাস্টমার পাবে।_", "parse_mode" => "Markdown" ]); // অ্যাডমিনের নাম বের করে ইউজারকে নোটিফিকেশন পাঠানো হচ্ছে $adminName = isset($callbackQuery['from']['first_name']) ? $callbackQuery['from']['first_name'] : "প্রতিনিধি"; sendRequest("sendMessage", [ "chat_id" => $customerId, "text" => "✅ *আমাদের টেকনিক্যাল প্রতিনিধি (👨‍💻 $adminName) এখন আপনার সাথে সরাসরি সংযুক্ত হয়েছেন।*\n━━━━━━━━━━━━━━━━━━━━━━\n📨 আপনার সেশনটি ওয়ান-টু-ওয়ান লক করা হয়েছে।\n💬 অনুগ্রহ করে আপনার সমস্যাটি বিস্তারিত বলুন।", "parse_mode" => "Markdown" ]); foreach (getAllActiveStaff() as $staffId) { if ($staffId != $fromId) { sendRequest("sendMessage", [ "chat_id" => $staffId, "text" => "📢 *SYSTEM NOTIFICATION*\n━━━━━━━━━━━━━━━━━━━━━━\nগ্রাহক (UID: `$customerId`) সফলভাবে অ্যাডমিন `$fromId` এর সাথে লকড সেশনে সংযুক্ত হয়েছেন। আপনি আর এই চ্যাটে ঢুকতে পারবেন না।", "parse_mode" => "Markdown" ]); } } exit; } elseif (str_starts_with($data, "tr_")) { $targetAdminId = intval(substr($data, 3)); if (!isset($reverseChats[$fromId])) { sendRequest("answerCallbackQuery", ["callback_query_id" => $callbackQuery['id'], "text" => "❌ আপনি কোনো সক্রিয় সেশনে নেই।"]); exit; } $customerId = $reverseChats[$fromId]; if (!in_array($targetAdminId, $allAdmins)) { sendRequest("answerCallbackQuery", ["callback_query_id" => $callbackQuery['id'], "text" => "❌ অ্যাডমিন তালিকাভুক্ত নয়।"]); exit; } $stmt = $db->prepare("SELECT online FROM admins WHERE admin_id = ?"); $stmt->execute([$targetAdminId]); $targetOnline = $stmt->fetchColumn(); if ($targetOnline == 0 || isset($reverseChats[$targetAdminId])) { sendRequest("answerCallbackQuery", ["callback_query_id" => $callbackQuery['id'], "text" => "❌ অ্যাডমিন অফলাইন অথবা অন্য চ্যাটে ব্যস্ত আছেন!"]); exit; } unset($reverseChats[$fromId]); if (isset($activeChats[$customerId])) unset($activeChats[$customerId]); $activeChats[$customerId] = $targetAdminId; $reverseChats[$targetAdminId] = $customerId; $lastAdminReply[$customerId] = time(); saveSystemState('active_chats', $activeChats); saveSystemState('reverse_chats', $reverseChats); saveSystemState('last_admin_reply', $lastAdminReply); sendRequest("answerCallbackQuery", ["callback_query_id" => $callbackQuery['id'], "text" => "✅ চ্যাট হস্তান্তর করা হয়েছে।"]); sendRequest("editMessageText", ["chat_id" => $fromId, "message_id" => $msgId, "text" => "✅ *চ্যাট হস্তান্তর সম্পন্ন!*\n\nUID: `$customerId`-এর সেশনটি সফলভাবে অ্যাডমিন `$targetAdminId`-এর নিকট হস্তান্তর করা হয়েছে।", "parse_mode" => "Markdown"]); sendRequest("sendMessage", [ "chat_id" => $targetAdminId, "text" => "📢 *[SESSION TRANSFERRED]*\n━━━━━━━━━━━━━━━━━━━━━━\nঅ্যাডমিন `$fromId` আপনার নিকট UID: `$customerId`-এর লাইভ চ্যাটটি হস্তান্তর করেছেন।", "parse_mode" => "Markdown", "reply_markup" => getAdminKeyboard(in_array($targetAdminId, $ownerIds)) ]); sendRequest("sendMessage", [ "chat_id" => $customerId, "text" => "🔄 *আপনার সাপোর্ট সেশনটি আমাদের অন্য একজন প্রতিনিধির নিকট স্থানান্তর করা হয়েছে।*\n\nআপনার সেবা স্বাভাবিকভাবেই ওয়ান-টু-ওয়ান লকড অবস্থায় চলমান থাকবে।", "parse_mode" => "Markdown" ]); logChatMessage($customerId, 'system', "Chat transferred from Admin $fromId to $targetAdminId"); exit; } } // --- কাস্টমার ইনলাইন বাটন হ্যান্ডলার --- $chatId = $fromId; if (!isSupportAvailable()) { sendRequest("answerCallbackQuery", ["callback_query_id" => $callbackQuery['id'], "text" => "🔴 সাপোর্ট অফলাইন"]); sendRequest("sendMessage", ["chat_id" => $chatId, "text" => getOfflineNotice(), "parse_mode" => "Markdown"]); exit; } if (isset($userData[$chatId]) && isset($userData[$chatId]['step']) && $userData[$chatId]['step'] == 'select_category') { sendRequest("answerCallbackQuery", ["callback_query_id" => $callbackQuery['id']]); if ($data == "cat_account") { $userData[$chatId]['category'] = "একাউন্ট সমস্যা"; $userData[$chatId]['step'] = 'acc_issue'; saveSystemState('user_data', $userData); sendRequest("editMessageText", ["chat_id" => $chatId, "message_id" => $msgId, "text" => "📌 *ক্যাটাগরি:* একাউন্ট সমস্যা\n━━━━━━━━━━━━━━━━━━━━━━\n📝 আপনার একাউন্টে কী সমস্যা হচ্ছে তা বিস্তারিত লিখে পাঠান:", "parse_mode" => "Markdown"]); } elseif ($data == "cat_balance") { $userData[$chatId]['category'] = "ব্যালেন্স এড হয় না"; $userData[$chatId]['step'] = 'bal_amount'; saveSystemState('user_data', $userData); sendRequest("editMessageText", ["chat_id" => $chatId, "message_id" => $msgId, "text" => "📌 *ক্যাটাগরি:* ব্যালেন্স এড হয় না\n━━━━━━━━━━━━━━━━━━━━━━\n💰 আপনি কত টাকা পাঠিয়েছেন (পরিমাণ) তা লিখুন:", "parse_mode" => "Markdown"]); } elseif ($data == "cat_order") { $userData[$chatId]['category'] = "অর্ডার সমস্যা"; $userData[$chatId]['step'] = 'ord_id'; saveSystemState('user_data', $userData); sendRequest("editMessageText", ["chat_id" => $chatId, "message_id" => $msgId, "text" => "📌 *ক্যাটাগরি:* অর্ডার সমস্যা\n━━━━━━━━━━━━━━━━━━━━━━\n🆔 আপনার অর্ডার আইডি নাম্বারটি লিখুন:", "parse_mode" => "Markdown"]); } elseif ($data == "cat_agent") { $userData[$chatId]['category'] = "কাস্টমার প্রতিনিধি সার্ভিস"; $stmt = $db->query("SELECT COUNT(*) FROM admins WHERE online = 1"); if ((int)$stmt->fetchColumn() === 0) { sendRequest("editMessageText", ["chat_id" => $chatId, "message_id" => $msgId, "text" => "🔴 দুঃখিত! এই মুহূর্তে আমাদের সকল সাপোর্ট প্রতিনিধি অফলাইনে আছেন।\n\n⏰ অনুগ্রহ করে পরবর্তীতে আবার চেষ্টা করুন। ধন্যবাদ।"]); unset($userData[$chatId]); saveSystemState('user_data', $userData); exit; } $userData[$chatId]['issue'] = "কাস্টমার প্রতিনিধি লাইভ সাপোর্ট আবেদন"; unset($userData[$chatId]['step']); saveSystemState('user_data', $userData); if (!in_array($chatId, $waitingQueue)) { $waitingQueue[] = $chatId; saveSystemState('waiting_queue', $waitingQueue); } $name = $userData[$chatId]['name']; $activeStaffs = getAllActiveStaff(); $alertPayload = "📥 *NEW LIVE SUPPORT REQUEST*\n━━━━━━━━━━━━━━━━━━━━━━\n👤 *Client Name:* $name\n📝 *Category:* কাস্টমার প্রতিনিধি সার্ভিস\n🆔 *Client ID:* `$chatId`\n━━━━━━━━━━━━━━━━━━━━━━\n⚡ _চ্যাটটি ওয়ান-টু-ওয়ান লক করতে নিচের বাটনে ক্লিক করুন।_"; $claimKeyboard = json_encode(["inline_keyboard" => [[["text" => "✅ সেশন লক করুন", "callback_data" => "claim_" . $chatId]]]]); foreach ($activeStaffs as $staffId) { sendRequest("sendMessage", ["chat_id" => $staffId, "text" => $alertPayload, "parse_mode" => "Markdown", "reply_markup" => $claimKeyboard]); } $holdNotice = "⏳ *আপনার অনুরোধটি লাইভ কিউতে যুক্ত করা হয়েছে।*\n\n👨‍💻 আমাদের একজন টেকনিক্যাল প্রতিনিধি খুব শীঘ্রই ওয়ান-টু-ওয়ান মোডে আপনার সাথে সংযুক্ত হবেন।\n\nধৈর্য ধরে অপেক্ষা করার জন্য ধন্যবাদ।"; sendRequest("editMessageText", ["chat_id" => $chatId, "message_id" => $msgId, "text" => $holdNotice, "parse_mode" => "Markdown"]); } } exit; } // ------------------------- // MESSAGE HANDLER // ------------------------- if ($message) { $chatId = intval($message['chat']['id']); $text = isset($message['text']) ? trim($message['text']) : ''; $isPhoto = isset($message['photo']); $captionText = isset($message['caption']) ? $message['caption'] : $text; $COMMAND_MAP = [ "🟢 স্ট্যাটাস / Online" => 'panel', "🔴 সাপোর্ট বন্ধ করুন" => 'toggle_support_off', "🟢 সাপোর্ট চালু করুন" => 'toggle_support_on', "❌ চ্যাট শেষ করুন" => 'end', "📊 REPORT" => 'report', "📜 হিস্টরি" => 'history_start', "🔄 চ্যাট ট্রান্সফার" => 'transfer_start', "📢 ব্রডকাস্ট" => 'broadcast_start', "📢 BR" => 'broadcast_start', "📋 অ্যাডমিন তালিকা" => 'admins', "🗑️ ইউজার ডাটা রিমুভ" => 'removeuser_start', "➕ অ্যাডমিন যোগ" => 'addadmin_start', "➖ অ্যাডমিন সরাও" => 'removeadmin_start', ]; // --- START STATE CLEANER --- if ($text == "/start") { if (in_array($chatId, $allAdmins)) { if (isset($adminData[$chatId])) { $adminData[$chatId]['state'] = null; saveSystemState('admin_data', $adminData); } if (isset($reverseChats[$chatId])) { $oldCustomer = $reverseChats[$chatId]; unset($activeChats[$oldCustomer]); unset($reverseChats[$chatId]); if (isset($lastAdminReply[$oldCustomer])) unset($lastAdminReply[$oldCustomer]); } } else { if (isset($activeChats[$chatId])) { $oldAdmin = $activeChats[$chatId]; unset($reverseChats[$oldAdmin]); unset($activeChats[$chatId]); } if (isset($userData[$chatId])) { unset($userData[$chatId]); } } saveSystemState('active_chats', $activeChats); saveSystemState('reverse_chats', $reverseChats); saveSystemState('user_data', $userData); saveSystemState('last_admin_reply', $lastAdminReply); } // --- OWNER/ADMIN COMMAND HANDLERS --- if (in_array($chatId, $allAdmins) && array_key_exists($text, $COMMAND_MAP)) { $command = $COMMAND_MAP[$text]; $isOwner = in_array($chatId, $ownerIds); if ($command == 'panel') { $inlineKeyboard = json_encode(["inline_keyboard" => [[["text" => "🟢 Online", "callback_data" => "go_online"], ["text" => "🔴 Offline", "callback_data" => "go_offline"]]]]); sendRequest("sendMessage", ["chat_id" => $chatId, "text" => "⚡ *আপনার ডিউটি স্ট্যাটাস কনফিগার করুন:*", "parse_mode" => "Markdown", "reply_markup" => $inlineKeyboard]); } elseif ($command == 'toggle_support_off') { $supportSystemEnabled = false; saveSystemState('support_enabled', false); sendRequest("sendMessage", [ "chat_id" => $chatId, "text" => "🔴 *সাপোর্ট সিস্টেম সফলভাবে বন্ধ করা হয়েছে!*\n\nএখন থেকে ইউজাররা /start দিলে সাপোর্ট অফলাইন নোটিশ দেখতে পাবে।", "parse_mode" => "Markdown", "reply_markup" => getAdminKeyboard($isOwner) ]); } elseif ($command == 'toggle_support_on') { $supportSystemEnabled = true; saveSystemState('support_enabled', true); sendRequest("sendMessage", [ "chat_id" => $chatId, "text" => "🟢 *সাপোর্ট সিস্টেম সফলভাবে চালু করা হয়েছে!*\n\nইউজাররা এখন থেকে স্বাভাবিক নিয়মে সাপোর্ট সেবা গ্রহণ করতে পারবে।", "parse_mode" => "Markdown", "reply_markup" => getAdminKeyboard($isOwner) ]); } elseif ($command == 'end') { if (!isset($reverseChats[$chatId])) { sendRequest("sendMessage", ["chat_id" => $chatId, "text" => "❌ আপনি বর্তমানে কোনো কাস্টমারের সাথে সক্রিয় চ্যাটে যুক্ত নন।", "reply_markup" => getAdminKeyboard($isOwner)]); exit; } $customerId = $reverseChats[$chatId]; sendRequest("sendMessage", ["chat_id" => $chatId, "text" => "✅ *সেশন ক্লোজড!*", "parse_mode" => "Markdown", "reply_markup" => getAdminKeyboard($isOwner)]); sendRequest("sendMessage", ["chat_id" => $customerId, "text" => "🤝 *আপনার লাইভ সাপোর্ট সেশনটি সফলভাবে সমাপ্ত করা হয়েছে।*\n\nভবিষ্যতে পুনরায় সহায়তার প্রয়োজন হলে যেকোনো সময় আবার `/start` কমান্ড ব্যবহার করতে পারেন।\n\n💙 *Cyber Sentinel Bangladesh* টিম সর্বদা আপনার পাশে আছে।", "parse_mode" => "Markdown", "reply_markup" => json_encode(["remove_keyboard" => true])]); unset($reverseChats[$chatId]); if (isset($activeChats[$customerId])) unset($activeChats[$customerId]); if (isset($lastAdminReply[$customerId])) unset($lastAdminReply[$customerId]); if (($key = array_search($customerId, $waitingQueue)) !== false) { unset($waitingQueue[$key]); $waitingQueue = array_values($waitingQueue); saveSystemState('waiting_queue', $waitingQueue); } saveSystemState('active_chats', $activeChats); saveSystemState('reverse_chats', $reverseChats); saveSystemState('last_admin_reply', $lastAdminReply); logChatMessage($customerId, 'system', "Chat ended by Admin $chatId"); notifyWaitingCustomers($chatId); } elseif ($command == 'report') { $stmt = $db->query("SELECT COUNT(*) FROM admins WHERE online=1"); $onlineAdminsCount = (int)$stmt->fetchColumn(); $activeChatsCount = count($activeChats); $freeAdminsCount = max(0, $onlineAdminsCount - $activeChatsCount); $waitingQueueCount = count($waitingQueue); $queueCustomersList = !empty($waitingQueue) ? implode(", ", $waitingQueue) : "খালি"; $systemStatusText = $supportSystemEnabled ? "🟢 চালু (ONLINE)" : "🔴 বন্ধ (OFFLINE)"; $reportText = "📈 *সাপোর্ট স্ট্যাটাস লাইভ রিপোর্ট*\n━━━━━━━━━━━━━━━━━━━━━━\n"; $reportText .= "⚙️ সিস্টেম স্ট্যাটাস: *" . $systemStatusText . "*\n"; $reportText .= "🟢 অনলাইন অ্যাডমিন: `" . $onlineAdminsCount . "` জন\n"; $reportText .= "✅ ফ্রি অ্যাডমিন: `" . $freeAdminsCount . "` জন\n"; $reportText .= "💬 সক্রিয় সেশন (ব্যস্ত অ্যাডমিন): `" . $activeChatsCount . "` টি\n"; $reportText .= "⏳ অপেক্ষমাণ কিউ: `" . $waitingQueueCount . "` জন\n"; $reportText .= "━━━━━━━━━━━━━━━━━━━━━━\n"; $reportText .= "📌 *কাস্টমার কিউ লিস্ট:* " . $queueCustomersList; sendRequest("sendMessage", ["chat_id" => $chatId, "text" => $reportText, "parse_mode" => "Markdown", "reply_markup" => getAdminKeyboard($isOwner)]); } elseif ($command == 'broadcast_start') { $adminData[$chatId] = ['state' => 'wait_broadcast_msg']; saveSystemState('admin_data', $adminData); sendRequest("sendMessage", ["chat_id" => $chatId, "text" => "📢 সকল ইউজারকে পাঠানোর জন্য আপনার ব্রডকাস্ট মেসেজটি (লেখা অথবা ক্যাপশনসহ ছবি) টাইপ করে পাঠান:", "reply_markup" => getAdminKeyboard($isOwner)]); } elseif ($command == 'admins') { if (!$isOwner) exit; $stmt = $db->query("SELECT admin_id, online FROM admins"); $output = "📋 *[OFFICIAL ADMIN DIRECTORY]*\n━━━━━━━━━━━━━━━━━━━━━━\n"; while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) { $status = $row['online'] == 1 ? "🟢 ONLINE" : "🔴 OFFLINE"; $output .= "🆔 ID: `{$row['admin_id']}` | $status\n"; } sendRequest("sendMessage", ["chat_id" => $chatId, "text" => $output, "parse_mode" => "Markdown", "reply_markup" => getAdminKeyboard($isOwner)]); } elseif ($command == 'removeuser_start') { if (!$isOwner) { sendRequest("sendMessage", ["chat_id" => $chatId, "text" => "🚫 Access Denied", "reply_markup" => getAdminKeyboard($isOwner)]); exit; } $adminData[$chatId] = ['state' => 'wait_removeuser_id']; saveSystemState('admin_data', $adminData); sendRequest("sendMessage", ["chat_id" => $chatId, "text" => "🗑️ *ইউজার ডাটা রিমুভ*\n\nডাটাবেজ থেকে সম্পূর্ণ মুছে ফেলার জন্য ক্লায়েন্ট ID দিন:", "parse_mode" => "Markdown", "reply_markup" => getAdminKeyboard($isOwner)]); } elseif ($command == 'addadmin_start') { if (!$isOwner) { sendRequest("sendMessage", ["chat_id" => $chatId, "text" => "🚫 Access Denied", "reply_markup" => getAdminKeyboard($isOwner)]); exit; } $adminData[$chatId] = ['state' => 'wait_addadmin_id']; saveSystemState('admin_data', $adminData); sendRequest("sendMessage", ["chat_id" => $chatId, "text" => "➕ *নতুন অ্যাডমিন যোগ*\n\nঅ্যাডমিন হিসেবে এক্সেস দিতে সংশ্লিষ্ট ইউজারের Telegram ID দিন:", "parse_mode" => "Markdown", "reply_markup" => getAdminKeyboard($isOwner)]); } elseif ($command == 'removeadmin_start') { if (!$isOwner) { sendRequest("sendMessage", ["chat_id" => $chatId, "text" => "🚫 Access Denied", "reply_markup" => getAdminKeyboard($isOwner)]); exit; } $adminData[$chatId] = ['state' => 'wait_removeadmin_id']; saveSystemState('admin_data', $adminData); sendRequest("sendMessage", ["chat_id" => $chatId, "text" => "➖ *অ্যাডমিন অপসারণ*\n\nঅ্যাডমিন তালিকা থেকে রিমুভ করতে সংশ্লিষ্ট আইডিটি দিন:", "parse_mode" => "Markdown", "reply_markup" => getAdminKeyboard($isOwner)]); } elseif ($command == 'transfer_start') { if (!isset($reverseChats[$chatId])) { sendRequest("sendMessage", ["chat_id" => $chatId, "text" => "❌ আপনি কোনো সক্রিয় চ্যাট সেশনে যুক্ত নন।", "reply_markup" => getAdminKeyboard($isOwner)]); exit; } $stmt = $db->prepare("SELECT admin_id FROM admins WHERE online = 1 AND admin_id != ?"); $stmt->execute([$chatId]); $fetchAvail = $stmt->fetchAll(PDO::FETCH_COLUMN); $availAdmins = !empty($fetchAvail) ? array_map('intval', $fetchAvail) : []; $inlineButtons = []; foreach ($availAdmins as $availId) { if (!isset($reverseChats[$availId])) { $inlineButtons[] = [["text" => "👨‍💻 Admin: " . $availId, "callback_data" => "tr_" . $availId]]; } } if (empty($inlineButtons)) { sendRequest("sendMessage", ["chat_id" => $chatId, "text" => "❌ এই মুহূর্তে কোনো ফ্রি অনলাইন অ্যাডমিন পাওয়া যায়নি।", "reply_markup" => getAdminKeyboard($isOwner)]); } else { $inlineKeyboard = json_encode(["inline_keyboard" => $inlineButtons]); sendRequest("sendMessage", ["chat_id" => $chatId, "text" => "🔄 চ্যাট ট্রান্সফার করতে নিচে থেকে অনলাইন আইডি সিলেক্ট করুন:", "reply_markup" => $inlineKeyboard]); } } elseif ($command == 'history_start') { $adminData[$chatId] = ['state' => 'wait_history_id']; saveSystemState('admin_data', $adminData); sendRequest("sendMessage", ["chat_id" => $chatId, "text" => "📜 আর্কাইভ হিস্টরি দেখতে ক্লায়েন্ট ID দিন:", "reply_markup" => getAdminKeyboard($isOwner)]); } exit; } // --- PROCESS MULTI-STEP ADMIN TEXT/MEDIA INPUT --- if (in_array($chatId, $allAdmins) && isset($adminData[$chatId]) && is_array($adminData[$chatId]) && !empty($adminData[$chatId]['state']) && $text != "/start") { $state = $adminData[$chatId]['state']; $isOwner = in_array($chatId, $ownerIds); if ($state == 'wait_broadcast_msg') { $adminData[$chatId]['state'] = null; saveSystemState('admin_data', $adminData); $stmtUsers = $db->query("SELECT DISTINCT user_id FROM messages"); $fetchUsers = $stmtUsers->fetchAll(PDO::FETCH_COLUMN); $allUsers = !empty($fetchUsers) ? array_map('intval', $fetchUsers) : []; $broadcastTargets = array_unique(array_merge($allUsers, $allAdmins)); $broadcastHeader = "📢 *[OFFICIAL ANNOUNCEMENT]*\n━━━━━━━━━━━━━━━━━━━━━━\n\n"; $broadcastFooter = "\n\n━━━━━━━━━━━━━━━━━━━━━━\n💙 @CyberSentinelBangladesh | Live Support"; $successCount = 0; foreach ($broadcastTargets as $targetId) { if ($isPhoto) { $photoId = $message['photo'][count($message['photo'])-1]['file_id']; $caption = $broadcastHeader . ($message['caption'] ?? '') . $broadcastFooter; $res = sendRequest("sendPhoto", ["chat_id" => $targetId, "photo" => $photoId, "caption" => $caption, "parse_mode" => "Markdown"]); } else { $formattedText = $broadcastHeader . $text . $broadcastFooter; $res = sendRequest("sendMessage", ["chat_id" => $targetId, "text" => $formattedText, "parse_mode" => "Markdown"]); } if (isset($res['ok']) && $res['ok'] == true) $successCount++; } sendRequest("sendMessage", ["chat_id" => $chatId, "text" => "📢 *ব্রডকাস্ট সম্পন্ন!*\n\nসর্বমোট `$successCount` জন ইউজারের কাছে মেসেজটি সফলভাবে পাঠানো হয়েছে।", "parse_mode" => "Markdown", "reply_markup" => getAdminKeyboard($isOwner)]); exit; } $targetId = intval($text); if ($targetId == 0) { $adminData[$chatId]['state'] = null; saveSystemState('admin_data', $adminData); sendRequest("sendMessage", ["chat_id" => $chatId, "text" => "❌ ভুল আইডি ফরম্যাট। অপারেশন বাতিল করা হয়েছে।", "reply_markup" => getAdminKeyboard($isOwner)]); exit; } $adminData[$chatId]['state'] = null; saveSystemState('admin_data', $adminData); if ($state == 'wait_removeuser_id') { if (isset($activeChats[$targetId])) { $assignedAdmin = $activeChats[$targetId]; unset($reverseChats[$assignedAdmin]); unset($activeChats[$targetId]); } if (($key = array_search($targetId, $waitingQueue)) !== false) { unset($waitingQueue[$key]); $waitingQueue = array_values($waitingQueue); } if (isset($lastAdminReply[$targetId])) unset($lastAdminReply[$targetId]); saveSystemState('active_chats', $activeChats); saveSystemState('reverse_chats', $reverseChats); saveSystemState('waiting_queue', $waitingQueue); saveSystemState('last_admin_reply', $lastAdminReply); if (isset($userData[$targetId])) { unset($userData[$targetId]); saveSystemState('user_data', $userData); } $stmt1 = $db->prepare("DELETE FROM chat_history WHERE customer_id = ?"); $stmt1->execute([$targetId]); $stmt2 = $db->prepare("DELETE FROM messages WHERE user_id = ?"); $stmt2->execute([$targetId]); sendRequest("sendMessage", ["chat_id" => $chatId, "text" => "🗑️ ইউজার ডাটা সম্পূর্ণ রিমুভ করা হয়েছে!", "reply_markup" => getAdminKeyboard($isOwner)]); } elseif ($state == 'wait_addadmin_id') { if (in_array($targetId, $allAdmins)) { sendRequest("sendMessage", ["chat_id" => $chatId, "text" => "❌ এই আইডি ইতিমধ্যে অ্যাডমিন তালিকায় অন্তর্ভুক্ত আছে।", "reply_markup" => getAdminKeyboard($isOwner)]); exit; } $stmt = $db->prepare("INSERT OR IGNORE INTO admins (admin_id) VALUES (?)"); $stmt->execute([$targetId]); $addNotice = "⚙️ *MANAGEMENT NOTIFICATION*\n━━━━━━━━━━━━━━━━━━━━━━\n🎉 অভিনন্দন! আপনাকে **CSB LIVE SUPPORT TEAM**-এর অফিশিয়াল অ্যাডমিন প্যানেলে যুক্ত করা হয়েছে।\n\n🆔 *অ্যাডমিন আইডি:* `$targetId` \n👤 *অনুমোদিত করেছেন:* ওনার (`$chatId`)\n━━━━━━━━━━━━━━━━━━━━━━\n⚡ এখন থেকে আপনি গ্রাহকদের সাপোর্ট রিকোয়েস্ট রিসিভ করতে পারবেন। সচল করতে অনুগ্রহ করে একবার `/start` চাপুন।"; sendRequest("sendMessage", ["chat_id" => $targetId, "text" => $addNotice, "parse_mode" => "Markdown"]); sendRequest("sendMessage", ["chat_id" => $chatId, "text" => "✅ সফলভাবে অ্যাডমিন এক্সেস দেওয়া হয়েছে এবং সংশ্লিষ্ট আইডিতে অফিশিয়াল নোটিফিকেশন পাঠানো হয়েছে।", "reply_markup" => getAdminKeyboard($isOwner)]); } elseif ($state == 'wait_removeadmin_id') { if (in_array($targetId, $ownerIds)) { sendRequest("sendMessage", ["chat_id" => $chatId, "text" => "❌ ওনার রিমুভ করা সম্ভব নয়।", "reply_markup" => getAdminKeyboard($isOwner)]); exit; } if (!in_array($targetId, $allAdmins)) { sendRequest("sendMessage", ["chat_id" => $chatId, "text" => "❌ এই আইডিটি অ্যাডমিন তালিকায় খুঁজে পাওয়া যায়নি।", "reply_markup" => getAdminKeyboard($isOwner)]); exit; } $stmt = $db->prepare("DELETE FROM admins WHERE admin_id = ?"); $stmt->execute([$targetId]); $removeNotice = "⚠️ *MANAGEMENT NOTIFICATION*\n━━━━━━━━━━━━━━━━━━━━━━\n📢 আপনাকে জানানো যাচ্ছে যে, ম্যানেজমেন্টের সিদ্ধান্ত অনুযায়ী **CSB LIVE SUPPORT TEAM** থেকে আপনার অ্যাডমিন অ্যাক্সেস সাময়িকভাবে স্থগিত/বাতিল করা হয়েছে।\n\n🆔 *অ্যাডমিন আইডি:* `$targetId` \n👤 *অপসারণ করেছেন:* ওনার (`$chatId`)\n━━━━━━━━━━━━━━━━━━━━━━\nℹ️ এখন থেকে আপনার অ্যাডমিন কিবোর্ড প্যানেল আর কাজ করবেবিধা নেই।"; sendRequest("sendMessage", ["chat_id" => $targetId, "text" => $removeNotice, "parse_mode" => "Markdown", "reply_markup" => json_encode(["remove_keyboard" => true])]); sendRequest("sendMessage", ["chat_id" => $chatId, "text" => "✅ অ্যাডমিন এক্সেস সফলভাবে বাতিল করা হয়েছে।", "reply_markup" => getAdminKeyboard($isOwner)]); } elseif ($state == 'wait_history_id') { $stmt = $db->prepare("SELECT sender_type, message_content, timestamp FROM chat_history WHERE customer_id = ? ORDER BY timestamp ASC"); $stmt->execute([$targetId]); $history = $stmt->fetchAll(PDO::FETCH_ASSOC); if (!$history) { sendRequest("sendMessage", ["chat_id" => $chatId, "text" => "❌ এই আইডির কোনো পূর্ববর্তী চ্যাট হিস্টরি পাওয়া যায়নি।", "reply_markup" => getAdminKeyboard($isOwner)]); exit; } $transcript = "📜 *[ARCHIVE LOGS FOR UID: $targetId]*\n━━━━━━━━━━━━━━━━━━━━━━\n\n"; foreach ($history as $h) { $transcript .= "▫️ *[" . strtoupper($h['sender_type']) . "]:* {$h['message_content']}\n"; } sendRequest("sendMessage", ["chat_id" => $chatId, "text" => substr($transcript, 0, 4000), "parse_mode" => "Markdown", "reply_markup" => getAdminKeyboard($isOwner)]); } exit; } // --- LIVE CHAT (FORWARD: ADMIN TO CUSTOMER) --- if (in_array($chatId, $allAdmins) && $text != "/start") { $isOwner = in_array($chatId, $ownerIds); if (isset($reverseChats[$chatId])) { $customerId = $reverseChats[$chatId]; $lastAdminReply[$customerId] = time(); saveSystemState('last_admin_reply', $lastAdminReply); logChatMessage($customerId, 'admin', $captionText ? $captionText : "[Media]"); if ($isPhoto) { sendRequest("sendPhoto", ["chat_id" => $customerId, "photo" => $message['photo'][count($message['photo'])-1]['file_id'], "caption" => "👨‍💻 *CSB LIVE SUPPORT:*\n" . ($message['caption'] ?? ''), "parse_mode" => "Markdown"]); sendRequest("sendMessage", ["chat_id" => $chatId, "text" => "✅ মিডিয়া ফাইল সফলভাবে প্রেরণ করা হয়েছে।", "reply_markup" => getAdminKeyboard($isOwner)]); } else { sendRequest("sendMessage", ["chat_id" => $customerId, "text" => "👨‍💻 *CSB LIVE SUPPORT:*\n\n" . $text, "parse_mode" => "Markdown"]); sendRequest("sendMessage", ["chat_id" => $chatId, "text" => "✅ বার্তাটি সফলভাবে পাঠানো হয়েছে।", "reply_markup" => getAdminKeyboard($isOwner)]); } exit; } else { sendRequest("sendMessage", ["chat_id" => $chatId, "text" => "ℹ️ আপনি বর্তমানে কোনো সক্রিয় চ্যাট সেশনে যুক্ত নেই। নতুন গ্রাহক রিসিভ করতে নোটিফিকেশনের ইনলাইন বাটনটি ব্যবহার করুন।", "reply_markup" => getAdminKeyboard($isOwner)]); exit; } } // ------------------------- // CUSTOMER WORKFLOW WITH CATEGORIES // ------------------------- if ($text == "/start") { if (!isSupportAvailable()) { sendRequest("sendMessage", ["chat_id" => $chatId, "text" => getOfflineNotice(), "parse_mode" => "Markdown"]); exit; } $welcome = "♨️ *CYBER SENTINEL BANGLADESH*\n━━━━━━━━━━━━━━━━━━━━━━\n👋 আমাদের অফিশিয়াল লাইভ সাপোর্ট সিস্টেমে আপনাকে স্বাগতম।\n\n📌 আপনার যেকোনো সমস্যা, প্রশ্ন বা সহযোগিতার জন্য আমাদের সাপোর্ট টিম সর্বদা প্রস্তুত।\n\n⚡ দ্রুত ও নির্ভরযোগ্য সেবা প্রদানের জন্য অনুগ্রহ করে সঠিক তথ্য প্রদান করুন।"; sendRequest("sendMessage", ["chat_id" => $chatId, "text" => $welcome, "parse_mode" => "Markdown"]); sendRequest("sendMessage", ["chat_id" => $chatId, "text" => "👤 অনুগ্রহ করে আপনার সম্পূর্ণ নাম লিখুন:"]); $userData[$chatId] = ['step' => 'get_name']; saveSystemState('user_data', $userData); exit; } if (isset($userData[$chatId]) && is_array($userData[$chatId]) && isset($userData[$chatId]['step'])) { $step = $userData[$chatId]['step']; // সাপোর্ট অফলাইন চেক if (!isSupportAvailable()) { sendRequest("sendMessage", ["chat_id" => $chatId, "text" => getOfflineNotice(), "parse_mode" => "Markdown"]); unset($userData[$chatId]); saveSystemState('user_data', $userData); exit; } // ১. নাম নেওয়া if ($step == 'get_name') { if ($isPhoto || $text == "") { sendRequest("sendMessage", ["chat_id" => $chatId, "text" => "❌ অনুগ্রহ করে টেক্সট আকারে আপনার সঠিক নাম লিখুন:"]); exit; } $userData[$chatId]['name'] = $text; $userData[$chatId]['step'] = 'select_category'; saveSystemState('user_data', $userData); $menuText = "📌 *আপনার সমস্যার বিষয়টি নিচের মেনু থেকে নির্বাচন করুন:*"; sendRequest("sendMessage", ["chat_id" => $chatId, "text" => $menuText, "parse_mode" => "Markdown", "reply_markup" => getUserCategoryInlineKeyboard()]); exit; } // --- ৩.১: একাউন্ট সমস্যা সাবমিশন --- if ($step == 'acc_issue') { if ($isPhoto || $text == "") { sendRequest("sendMessage", ["chat_id" => $chatId, "text" => "❌ অনুগ্রহ করে সমস্যাটির বিবরণ টেক্সট আকারে লিখুন:"]); exit; } $name = $userData[$chatId]['name']; $details = $text; $adminTicket = "📥 *NEW SUPPORT TICKET [একাউন্ট সমস্যা]*\n━━━━━━━━━━━━━━━━━━━━━━\n👤 *Client Name:* $name\n🆔 *Client ID:* `$chatId`\n📝 *Issue Description:* $details\n━━━━━━━━━━━━━━━━━━━━━━"; foreach (getAllActiveStaff() as $staffId) { sendRequest("sendMessage", ["chat_id" => $staffId, "text" => $adminTicket, "parse_mode" => "Markdown"]); } logMessage($chatId, $name, "Account Issue: $details", 0); $userConfirm = "✅ *আপনার একাউন্ট সংক্রান্ত সমস্যাটি সফলভাবে গ্রহণ করা হয়েছে!*\n\nআমাদের টেকনিক্যাল টিম এটি যাচাই করে খুব দ্রুত আপনার সমস্যাটি সমাধান করে দেবে।\n\n💙 **Cyber Sentinel Bangladesh**-এর সাথেই থাকুন।"; sendRequest("sendMessage", ["chat_id" => $chatId, "text" => $userConfirm, "parse_mode" => "Markdown"]); unset($userData[$chatId]); saveSystemState('user_data', $userData); exit; } // --- ৩.২: ব্যালেন্স এড সমস্যা সাবমিশন --- if ($step == 'bal_amount') { if ($isPhoto || $text == "") { sendRequest("sendMessage", ["chat_id" => $chatId, "text" => "❌ অনুগ্রহ করে টাকার পরিমাণটি টেক্সটে লিখুন:"]); exit; } $userData[$chatId]['bal_amount'] = $text; $userData[$chatId]['step'] = 'bal_trx'; saveSystemState('user_data', $userData); sendRequest("sendMessage", ["chat_id" => $chatId, "text" => "💳 লেনদেনের **Transaction ID (TrxID)** টি লিখুন:"]); exit; } if ($step == 'bal_trx') { if ($isPhoto || $text == "") { sendRequest("sendMessage", ["chat_id" => $chatId, "text" => "❌ অনুগ্রহ করে ট্রানজেকশন আইডিটি টেক্সটে লিখুন:"]); exit; } $userData[$chatId]['bal_trx'] = $text; $userData[$chatId]['step'] = 'bal_ss'; saveSystemState('user_data', $userData); sendRequest("sendMessage", ["chat_id" => $chatId, "text" => "📸 পেমেন্টের **Payment Screenshot** টি ছবি আকারে পাঠান:"]); exit; } if ($step == 'bal_ss') { if (!$isPhoto) { sendRequest("sendMessage", ["chat_id" => $chatId, "text" => "❌ অনুগ্রহ করে স্ক্রিনশটটির একটি 'ছবি (Photo)' পাঠান:"]); exit; } $photoId = $message['photo'][count($message['photo'])-1]['file_id']; $name = $userData[$chatId]['name']; $amount = $userData[$chatId]['bal_amount']; $trx = $userData[$chatId]['bal_trx']; $adminTicket = "📥 *NEW SUPPORT TICKET [ব্যালেন্স সমস্যা]*\n━━━━━━━━━━━━━━━━━━━━━━\n👤 *Client Name:* $name\n🆔 *Telegram ID:* `$chatId`\n💵 *Amount:* $amount BDT\n💳 *TrxID:* `$trx`\n━━━━━━━━━━━━━━━━━━━━━━"; foreach (getAllActiveStaff() as $staffId) { sendRequest("sendPhoto", ["chat_id" => $staffId, "photo" => $photoId, "caption" => $adminTicket, "parse_mode" => "Markdown"]); } logMessage($chatId, $name, "Balance Add Issue: $amount BDT | Trx: $trx", 0); $userConfirm = "✅ *আপনার ব্যালেন্স সংক্রান্ত তথ্যসমূহ গ্রহণ করা হয়েছে!*\n\nআমাদের ফাইন্যান্স টিম ট্রানজেকশনটি ভেরিফাই করে আপনার একাউন্টে দ্রুত ব্যালেন্স এড করে দেবে।\n\n💙 **Cyber Sentinel Bangladesh**-এর সাথে থাকার জন্য ধন্যবাদ।"; sendRequest("sendMessage", ["chat_id" => $chatId, "text" => $userConfirm, "parse_mode" => "Markdown"]); unset($userData[$chatId]); saveSystemState('user_data', $userData); exit; } // --- ৩.৩: অর্ডার সমস্যা সাবমিশন --- if ($step == 'ord_id') { if ($isPhoto || $text == "") { sendRequest("sendMessage", ["chat_id" => $chatId, "text" => "❌ অনুগ্রহ করে আপনার অর্ডার আইডিটি টেক্সটে লিখুন:"]); exit; } $userData[$chatId]['ord_id'] = $text; $userData[$chatId]['step'] = 'ord_service'; saveSystemState('user_data', $userData); sendRequest("sendMessage", ["chat_id" => $chatId, "text" => "📦 আপনি যে সার্ভিসটির অর্ডার করেছিলেন তার নাম লিখুন:"]); exit; } if ($step == 'ord_service') { if ($isPhoto || $text == "") { sendRequest("sendMessage", ["chat_id" => $chatId, "text" => "❌ অনুগ্রহ করে সার্ভিসটির নাম লিখুন:"]); exit; } $name = $userData[$chatId]['name']; $ordId = $userData[$chatId]['ord_id']; $service = $text; $adminTicket = "📥 *NEW SUPPORT TICKET [অর্ডার সমস্যা]*\n━━━━━━━━━━━━━━━━━━━━━━\n👤 *Client Name:* $name\n🆔 *Telegram ID:* `$chatId`\n🛒 *Order ID:* `$ordId`\n📦 *Service Name:* $service\n━━━━━━━━━━━━━━━━━━━━━━"; foreach (getAllActiveStaff() as $staffId) { sendRequest("sendMessage", ["chat_id" => $staffId, "text" => $adminTicket, "parse_mode" => "Markdown"]); } logMessage($chatId, $name, "Order Issue ID: $ordId | Service: $service", 0); $userConfirm = "✅ *আপনার অর্ডার সংক্রান্ত আবেদনটি গ্রহণ করা হয়েছে!*\n\nআমাদের সাপোর্ট টিম আপনার অর্ডার ট্র্যাকিং করে অতি দ্রুত সমস্যাটি সমাধান করে দেবে।\n\n💙 **Cyber Sentinel Bangladesh**-এর সাথেই থাকুন।"; sendRequest("sendMessage", ["chat_id" => $chatId, "text" => $userConfirm, "parse_mode" => "Markdown"]); unset($userData[$chatId]); saveSystemState('user_data', $userData); exit; } } // --- LIVE CHAT: FORWARD (CUSTOMER TO ADMIN) --- if (isset($activeChats[$chatId])) { $adminId = $activeChats[$chatId]; $lastAdminReply[$chatId] = time(); saveSystemState('last_admin_reply', $lastAdminReply); $customerName = isset($userData[$chatId]['name']) ? $userData[$chatId]['name'] : "Client"; logChatMessage($chatId, 'customer', $captionText ? $captionText : "[Media]"); if ($isPhoto) { sendRequest("sendPhoto", ["chat_id" => $adminId, "photo" => $message['photo'][count($message['photo'])-1]['file_id'], "caption" => "💬 *[$customerName]:* " . ($message['caption'] ?? ''), "parse_mode" => "Markdown", "reply_markup" => getAdminKeyboard(in_array($adminId, $ownerIds))]); } else { sendRequest("sendMessage", ["chat_id" => $adminId, "text" => "💬 *[$customerName]:* " . $text, "parse_mode" => "Markdown", "reply_markup" => getAdminKeyboard(in_array($adminId, $ownerIds))]); } exit; } if (in_array($chatId, $waitingQueue)) { sendRequest("sendMessage", ["chat_id" => $chatId, "text" => "✨ অতিরিক্ত তথ্যটি অ্যাডমিন ডেস্কে পাঠানো হয়েছে। অনুগ্রহ করে লাইভ সাপোর্ট প্রতিনিধি যুক্ত হওয়া পর্যন্ত অপেক্ষা করুন।"]); exit; } }