| 2353 | } |
| 2354 | |
| 2355 | bool MpLevelHandler::ProcessCommand(const Peer& peer, StringView line, bool isAdmin) |
| 2356 | { |
| 2357 | char infoBuffer[256]; |
| 2358 | |
| 2359 | if (line == "/endpoints"_s) { |
| 2360 | if (isAdmin) { |
| 2361 | auto endpoints = _networkManager->GetServerEndpoints(); |
| 2362 | for (const auto& endpoint : endpoints) { |
| 2363 | SendMessage(peer, UI::MessageLevel::Confirm, endpoint); |
| 2364 | } |
| 2365 | auto& serverConfig = _networkManager->GetServerConfiguration(); |
| 2366 | StringView address; std::uint16_t port; |
| 2367 | if (NetworkManagerBase::TrySplitAddressAndPort(serverConfig.ServerAddressOverride, address, port)) { |
| 2368 | if (port == 0) { |
| 2369 | port = serverConfig.ServerPort; |
| 2370 | } |
| 2371 | std::size_t length = formatInto(infoBuffer, "{}:{} (Override)", address, port); |
| 2372 | SendMessage(peer, UI::MessageLevel::Confirm, { infoBuffer, length }); |
| 2373 | } |
| 2374 | return true; |
| 2375 | } |
| 2376 | } else if (line == "/info"_s) { |
| 2377 | auto& serverConfig = _networkManager->GetServerConfiguration(); |
| 2378 | |
| 2379 | std::size_t length = formatInto(infoBuffer, "Server: {}{}", serverConfig.ServerName, serverConfig.IsPrivate ? " (Private)" : ""); |
| 2380 | SendMessage(peer, UI::MessageLevel::Confirm, { infoBuffer, length }); |
| 2381 | length = formatInto(infoBuffer, "Current level: \"{}\" ({}{}{})", |
| 2382 | _levelName, NetworkManager::GameModeToString(serverConfig.GameMode), |
| 2383 | serverConfig.Elimination ? "/Elimination" : "", _isReforged ? "/Reforged" : ""); |
| 2384 | SendMessage(peer, UI::MessageLevel::Confirm, { infoBuffer, length }); |
| 2385 | length = formatInto(infoBuffer, "Players: {}/{}", |
| 2386 | (std::uint32_t)_networkManager->GetPeerCount(), serverConfig.MaxPlayerCount); |
| 2387 | SendMessage(peer, UI::MessageLevel::Confirm, { infoBuffer, length }); |
| 2388 | if (!_players.empty()) { |
| 2389 | length = formatInto(infoBuffer, "Server load: {:.1f} ms ({:.1f})", |
| 2390 | (theApplication().GetFrameTimer().GetLastFrameDuration() * 1000.0f), theApplication().GetFrameTimer().GetAverageFps()); |
| 2391 | } else { |
| 2392 | length = formatInto(infoBuffer, "Server load: - ms"); |
| 2393 | } |
| 2394 | SendMessage(peer, UI::MessageLevel::Confirm, { infoBuffer, length }); |
| 2395 | |
| 2396 | auto uptimeSecs = (DateTime::UtcNow().ToUnixMilliseconds() / 1000) - (std::int64_t)serverConfig.StartUnixTimestamp; |
| 2397 | auto hours = (std::int32_t)(uptimeSecs / 3600); |
| 2398 | auto minutes = (std::int32_t)(uptimeSecs % 3600) / 60; |
| 2399 | auto seconds = (std::int32_t)(uptimeSecs % 60); |
| 2400 | length = formatInto(infoBuffer, "Uptime: {}:{:.2}:{:.2}", hours, minutes, seconds); |
| 2401 | SendMessage(peer, UI::MessageLevel::Confirm, { infoBuffer, length }); |
| 2402 | |
| 2403 | if (isAdmin) { |
| 2404 | length = formatInto(infoBuffer, "Config Path: \"{}\"", serverConfig.FilePath); |
| 2405 | SendMessage(peer, UI::MessageLevel::Confirm, { infoBuffer, length }); |
| 2406 | } |
| 2407 | |
| 2408 | if (!serverConfig.Playlist.empty()) { |
| 2409 | length = formatInto(infoBuffer, "Playlist: {}/{}{}", |
| 2410 | (std::uint32_t)(serverConfig.PlaylistIndex + 1), (std::uint32_t)serverConfig.Playlist.size(), serverConfig.RandomizePlaylist ? " (Random)" : ""); |
| 2411 | SendMessage(peer, UI::MessageLevel::Confirm, { infoBuffer, length }); |
| 2412 | } |
no test coverage detected