200) { $messages = array_slice($messages, -200); } file_put_contents($file, json_encode($messages)); } function loadUsers($roomId) { $file = getUsersFile($roomId); if (!file_exists($file)) { return []; } return json_decode(file_get_contents($file), true) ?: []; } function saveUsers($roomId, $users) { $file = getUsersFile($roomId); file_put_contents($file, json_encode($users)); } function respond($data) { echo json_encode($data); exit; } function respondError($message) { respond(['success' => false, 'error' => $message]); } function respondSuccess($data = []) { $data['success'] = true; respond($data); } // ===== ОБРАБОТКА ЗАПРОСОВ ===== $action = $_GET['action'] ?? ''; $roomId = $_GET['room_id'] ?? ''; if (empty($roomId)) { respondError('Не указан ID комнаты'); } $room = loadRoom($roomId); if (!$room) { respondError('Комната не найдена'); } $input = json_decode(file_get_contents('php://input'), true) ?: []; switch ($action) { case 'get_state': respondSuccess([ 'state' => [ 'video_url' => $room['video_url'], 'current_time' => $room['current_time'], 'is_playing' => $room['is_playing'], 'last_update' => $room['last_update'] ] ]); break; case 'update_time': $adminToken = $input['admin_token'] ?? ''; if ($adminToken !== $room['admin_token']) { respondError('Недостаточно прав'); } $room['current_time'] = (float)($input['current_time'] ?? $room['current_time']); $room['is_playing'] = (bool)($input['is_playing'] ?? $room['is_playing']); $room['last_update'] = time(); saveRoom($roomId, $room); respondSuccess([ 'state' => [ 'current_time' => $room['current_time'], 'is_playing' => $room['is_playing'] ] ]); break; case 'video_command': $adminToken = $input['admin_token'] ?? ''; if ($adminToken !== $room['admin_token']) { respondError('Недостаточно прав'); } $command = $input['command'] ?? ''; $value = $input['value'] ?? null; switch ($command) { case 'play': $room['is_playing'] = true; if ($value !== null) { $room['current_time'] = (float)$value; } break; case 'pause': $room['is_playing'] = false; if ($value !== null) { $room['current_time'] = (float)$value; } break; case 'seek': if ($value !== null) { $room['current_time'] = (float)$value; } break; default: respondError('Неизвестная команда'); } $room['last_update'] = time(); saveRoom($roomId, $room); respondSuccess([ 'state' => [ 'current_time' => $room['current_time'], 'is_playing' => $room['is_playing'] ] ]); break; case 'get_chat': $messages = loadChat($roomId); respondSuccess(['messages' => $messages]); break; case 'send_message': $nick = $input['nick'] ?? ''; $text = $input['text'] ?? ''; $isAdmin = (bool)($input['is_admin'] ?? false); if (empty($nick) || empty($text)) { respondError('Пустое сообщение'); } $messages = loadChat($roomId); $messages[] = [ 'nick' => mb_substr($nick, 0, 20), 'text' => mb_substr($text, 0, 500), 'time' => date('H:i'), 'is_admin' => $isAdmin, 'timestamp' => time() ]; saveChat($roomId, $messages); respondSuccess(['message' => end($messages)]); break; case 'register_user': $nick = $input['nick'] ?? ''; if (empty($nick)) { respondError('Пустой ник'); } $users = loadUsers($roomId); $sessionId = bin2hex(random_bytes(8)); $found = false; foreach ($users as &$user) { if ($user['nick'] === $nick) { $user['last_seen'] = time(); $user['session_id'] = $sessionId; $found = true; break; } } if (!$found) { $users[] = [ 'nick' => mb_substr($nick, 0, 20), 'session_id' => $sessionId, 'joined_at' => time(), 'last_seen' => time() ]; } $users = array_filter($users, function($user) { return (time() - $user['last_seen']) < 60; }); saveUsers($roomId, array_values($users)); respondSuccess(['count' => count($users)]); break; case 'get_users': $users = loadUsers($roomId); $activeUsers = array_filter($users, function($user) { return (time() - $user['last_seen']) < 60; }); if (count($activeUsers) !== count($users)) { saveUsers($roomId, array_values($activeUsers)); } respondSuccess([ 'count' => count($activeUsers), 'users' => array_values($activeUsers) ]); break; default: respondError('Неизвестное действие'); } ?>