using System; using System.Collections.Generic; using Content.Shared.Corvax.Lobby; using Robust.Shared.Timing; namespace Content.Client.Corvax.Lobby.Systems; /// /// Requests hub status through the connected game server because sandboxed /// content clients cannot make arbitrary HTTP requests. /// public sealed partial class LobbyServerHubSystem : EntitySystem { private static readonly TimeSpan RefreshInterval = TimeSpan.FromSeconds(30); [Dependency] private IGameTiming _timing = default!; private readonly Dictionary _statuses = new(StringComparer.OrdinalIgnoreCase); private TimeSpan _nextRequest; public int Revision { get; private set; } public string CurrentServerAddress { get; private set; } = string.Empty; public override void Initialize() { base.Initialize(); SubscribeNetworkEvent(OnStatusResponse); } public void RequestUpdate(string[] addresses) { if (_timing.RealTime < _nextRequest) return; _nextRequest = _timing.RealTime + RefreshInterval; RaiseNetworkEvent(new LobbyServerHubStatusRequestEvent(addresses)); } public bool TryGetStatus(string address, out LobbyServerHubStatus status) { return _statuses.TryGetValue(address, out status!); } public bool IsCurrentServer(string address) { if (string.IsNullOrWhiteSpace(CurrentServerAddress)) return false; return string.Equals( NormalizeAddress(address), NormalizeAddress(CurrentServerAddress), StringComparison.OrdinalIgnoreCase); } private void OnStatusResponse(LobbyServerHubStatusResponseEvent response) { CurrentServerAddress = response.CurrentServerAddress; _statuses.Clear(); foreach (var status in response.Statuses) _statuses[status.Address] = status; Revision++; } private static string NormalizeAddress(string address) { return address.Trim().TrimEnd('/'); } }