// --- بررسی ادمین --- $isAdmin = $mysqli->query("SELECT * FROM admins WHERE id=$user_id AND is_active=1")->fetch_assoc(); if($isAdmin){ if($text === '👨‍💼 مدیریت'){ $keyboard = ['keyboard'=>[ [['text'=>'📥 دریافت تیکت‌ها'],['text'=>'👥 مدیریت ادمین‌ها']], [['text'=>'🔓 خروج از پنل']] ],'resize_keyboard'=>true,'one_time_keyboard'=>true]; sendMessage($chat_id,"پنل مدیریت تلگرام:",$keyboard); exit; } // لیست تیکت‌ها if($text === '📥 دریافت تیکت‌ها'){ $res = $mysqli->query("SELECT * FROM tickets ORDER BY created_at DESC LIMIT 20"); while($ticket = $res->fetch_assoc()){ $priority = ['کم','متوسط','زیاد'][$ticket['priority']-1] ?? 'کم'; $msg = "🆔 تیکت: {$ticket['uid']}\nکاربر: {$ticket['user_id']}\nدپارتمان: {$ticket['department']}\nپیام: {$ticket['message']}\nوضعیت: {$ticket['status']}\nاهمیت: $priority"; $kb = ['inline_keyboard'=>[ [['text'=>'✅ پاسخ','callback_data'=>'reply_'.$ticket['uid']]], [['text'=>'❌ بستن','callback_data'=>'close_'.$ticket['uid']]] ]]; api('sendMessage',['chat_id'=>$chat_id,'text'=>$msg,'reply_markup'=>json_encode($kb)]); } exit; } // مدیریت ادمین‌ها if($text === '👥 مدیریت ادمین‌ها'){ $res = $mysqli->query("SELECT * FROM admins ORDER BY created_at DESC"); $msg = "ادمین‌ها:\n"; while($adm = $res->fetch_assoc()){ $status = $adm['is_active'] ? 'فعال' : 'غیرفعال'; $msg .= "{$adm['id']} — {$adm['name']} — $status\n"; } sendMessage($chat_id,$msg); exit; } if($text === '🔓 خروج از پنل'){ sendMessage($chat_id,"از پنل مدیریت خارج شدید."); exit; } } // --- callback پاسخ تیکت --- $callback = $update['callback_query'] ?? null; if($callback && $isAdmin){ $cb_data = $callback['data']; $caller = $callback['from']['id']; api('answerCallbackQuery',['callback_query_id'=>$callback['id']]); if(str_starts_with($cb_data,'reply_')){ $uid = substr($cb_data,6); set_state($mysqli,$caller,'admin_reply',['uid'=>$uid]); sendMessage($caller,"لطفاً متن پاسخ به تیکت $uid را ارسال کنید:"); exit; } if(str_starts_with($cb_data,'close_')){ $uid = substr($cb_data,6); $mysqli->query("UPDATE tickets SET status='closed' WHERE uid='$uid'"); sendMessage($caller,"تیکت $uid بسته شد."); // notify user $ticket = $mysqli->query("SELECT user_id FROM tickets WHERE uid='$uid' LIMIT 1")->fetch_assoc(); if($ticket) sendMessage($ticket['user_id'],"تیکت شما ($uid) توسط پشتیبانی بسته شد."); exit; } } // --- دریافت پیام پاسخ ادمین --- $state = get_state($mysqli,$user_id); if($state && $state['state']=='admin_reply' && !empty($text)){ $uid = $state['meta']['uid']; $stmt = $mysqli->prepare("INSERT INTO messages (ticket_uid,sender,admin_id,text,created_at) VALUES (?,?,?,?,NOW())"); $sender='admin'; $stmt->bind_param('ssis',$uid,$sender,$user_id,$text); $stmt->execute(); // update ticket status $mysqli->query("UPDATE tickets SET status='pending' WHERE uid='$uid'"); // notify user $ticket = $mysqli->query("SELECT user_id FROM tickets WHERE uid='$uid' LIMIT 1")->fetch_assoc(); if($ticket) sendMessage($ticket['user_id'],"پاسخ پشتیبانی به تیکت شما ($uid):\n$text"); sendMessage($user_id,"پاسخ شما ثبت شد."); clear_state($mysqli,$user_id); exit; } /** * bot.php — نسخه نهایی ربات پشتیبانی با چند دپارتمان و چند ادمین * این بخش شامل: تنظیمات، اتصال دیتابیس، توابع پایه و منوی اصلی */ ini_set('display_errors', 0); error_reporting(E_ALL); $config = [ 'TOKEN' => '8276221977:AAEf7cXKqOqFhoHRfndmdJxSh4E-3v4zKDQ', // توکن ربات 'BOT_USERNAME' => 'YourBotUsername', // یوزرنیم ربات 'BOT_NAME' => 'ربات پشتیبانی', 'BASE_URL' => 'https://s22.sec-robot.com/poshtiban', 'DB_HOST' => 's22.sec-robot.com', 'DB_USER' => 'ssecrobo_poshtiban', 'DB_PASS' => '74405375Aa@', 'DB_NAME' => 'ssecrobo_poshtiban', 'UPLOAD_DIR' => __DIR__.'/uploads' ]; // سازگاری با PHP 7.3- if (!function_exists('str_starts_with')) { function str_starts_with($haystack, $needle) { return (string)$needle !== '' && strncmp($haystack, $needle, strlen($needle)) === 0; } } // اتصال دیتابیس $mysqli = new mysqli($config['DB_HOST'], $config['DB_USER'], $config['DB_PASS'], $config['DB_NAME']); if ($mysqli->connect_errno) { http_response_code(200); exit; } $mysqli->set_charset('utf8mb4'); // توابع اصلی function api($method, $params = []) { global $config; $ch = curl_init("https://api.telegram.org/bot{$config['TOKEN']}/$method"); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_POSTFIELDS, $params); $res = curl_exec($ch); curl_close($ch); return json_decode($res, true); } function sendMessage($chat, $text, $keyboard = null) { $params = ['chat_id'=>$chat, 'text'=>$text, 'parse_mode'=>'HTML']; if ($keyboard) $params['reply_markup'] = json_encode($keyboard); return api('sendMessage', $params); } function genUID() { return strtoupper(substr(bin2hex(random_bytes(4)),0,8)); } // حالت کاربر function set_state($mysqli,$uid,$state,$meta=[]) { $meta_json = json_encode($meta, JSON_UNESCAPED_UNICODE); $stmt = $mysqli->prepare("INSERT INTO user_states (user_id,state,meta,updated_at) VALUES(?,?,?,NOW()) ON DUPLICATE KEY UPDATE state=VALUES(state), meta=VALUES(meta), updated_at=NOW()"); $stmt->bind_param('iss',$uid,$state,$meta_json); $stmt->execute(); } function get_state($mysqli,$uid) { $res = $mysqli->query("SELECT state,meta FROM user_states WHERE user_id=$uid LIMIT 1"); if($r=$res->fetch_assoc()) return ['state'=>$r['state'],'meta'=>json_decode($r['meta'],true)]; return null; } function clear_state($mysqli,$uid) { $stmt=$mysqli->prepare("DELETE FROM user_states WHERE user_id=?"); $stmt->bind_param('i',$uid); $stmt->execute(); } // دریافت آپدیت $raw = file_get_contents('php://input'); $update = json_decode($raw,true); if(!$update){ http_response_code(200); exit; } $message = $update['message'] ?? $update['edited_message'] ?? $update['callback_query']['message'] ?? null; $callback = $update['callback_query'] ?? null; $from = $update['message']['from'] ?? $update['callback_query']['from'] ?? null; $chat_id = $message['chat']['id'] ?? null; $user_id = $from['id'] ?? null; $first_name = $from['first_name'] ?? null; $username = $from['username'] ?? null; // ثبت کاربر if($user_id){ $stmt=$mysqli->prepare("INSERT IGNORE INTO users (id,username,first_name) VALUES (?,?,?)"); $stmt->bind_param('iss',$user_id,$username,$first_name); $stmt->execute(); } // کیبورد اصلی function mainMenuKeyboard(){ return ['keyboard'=>[ [['text'=>'🎫 ثبت تیکت'],['text'=>'❓ پیگیری تیکت'],['text'=>'📚 درباره']], [['text'=>'😎 پروفایل'],['text'=>'👨‍💼 مدیریت'],['text'=>'💰 درگاه آنلاین']], [['text'=>'📣 کانال ها'],['text'=>'📝 سوالات متداول'],['text'=>'🖥 ورود به پنل مدیریت']], ],'resize_keyboard'=>true,'one_time_keyboard'=>false]; } // --- Handle /start --- $text = $message['text'] ?? ''; if(str_starts_with($text,'/start')){ sendMessage($chat_id,"سلام ".($first_name?:'')."\nخوش آمدید به {$config['BOT_NAME']}",mainMenuKeyboard()); clear_state($mysqli,$user_id); exit; } // دپارتمان‌ها $departments = ['فنی','پشتیبانی','خرید','ارتباط با مدیریت']; // --- بخش ثبت تیکت --- $state = get_state($mysqli,$user_id); if($text === '🎫 ثبت تیکت'){ $keyboard = ['keyboard'=>array_map(function($d){ return [['text'=>$d]]; },$departments),'resize_keyboard'=>true,'one_time_keyboard'=>true]; sendMessage($chat_id,"لطفاً دپارتمان مورد نظر خود را انتخاب کنید:",$keyboard); set_state($mysqli,$user_id,'select_department'); exit; } if($state && $state['state']=='select_department'){ if(!in_array($text,$departments)){ sendMessage($chat_id,"لطفاً یکی از دپارتمان‌ها را انتخاب کنید."); exit; } $meta = ['department'=>$text]; set_state($mysqli,$user_id,'write_ticket',$meta); sendMessage($chat_id,"لطفاً متن تیکت خود را بنویسید:"); exit; } if($state && $state['state']=='write_ticket'){ $department = $state['meta']['department'] ?? 'عمومی'; $uid = genUID(); $stmt = $mysqli->prepare("INSERT INTO tickets (uid,user_id,department,message,status,created_at) VALUES (?,?,?,?,?,NOW())"); $status = 'open'; $stmt->bind_param('sisss',$uid,$user_id,$department,$text,$status); $stmt->execute(); sendMessage($chat_id,"✅ تیکت شما ثبت شد.\nشناسه پیگیری: $uid"); clear_state($mysqli,$user_id); exit; } // --- پیگیری تیکت --- if($text === '❓ پیگیری تیکت'){ set_state($mysqli,$user_id,'enter_uid'); sendMessage($chat_id,"لطفاً شناسه پیگیری تیکت خود را وارد کنید:"); exit; } if($state && $state['state']=='enter_uid'){ $uid = $text; $res = $mysqli->query("SELECT * FROM tickets WHERE uid='$uid' AND user_id=$user_id LIMIT 1"); if($ticket = $res->fetch_assoc()){ sendMessage($chat_id,"📝 وضعیت تیکت شما:\nدپارتمان: {$ticket['department']}\nپیام: {$ticket['message']}\nوضعیت: {$ticket['status']}"); }else{ sendMessage($chat_id,"تیکتی با این شناسه پیدا نشد."); } clear_state($mysqli,$user_id); exit; }