1
0

GameTicker.StatusShell.cs 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. using System.Linq;
  2. using System.Text.Json.Nodes;
  3. using Content.Shared.CCVar;
  4. using Content.Shared.GameTicking;
  5. using Robust.Server.ServerStatus;
  6. using Robust.Shared.Collections;
  7. using Robust.Shared.Configuration;
  8. namespace Content.Server.GameTicking
  9. {
  10. public sealed partial class GameTicker
  11. {
  12. /// <summary>
  13. /// Used for thread safety, given <see cref="IStatusHost.OnStatusRequest"/> is called from another thread.
  14. /// </summary>
  15. private readonly object _statusShellLock = new();
  16. /// <summary>
  17. /// Round start time in UTC, for status shell purposes.
  18. /// </summary>
  19. [ViewVariables]
  20. private DateTime _roundStartDateTime;
  21. /// <summary>
  22. /// For access to CVars in status responses.
  23. /// </summary>
  24. [Dependency] private readonly IConfigurationManager _cfg = default!;
  25. /// <summary>
  26. /// For access to the round ID in status responses.
  27. /// </summary>
  28. [Dependency] private readonly SharedGameTicker _gameTicker = default!;
  29. private void InitializeStatusShell()
  30. {
  31. IoCManager.Resolve<IStatusHost>().OnStatusRequest += GetStatusResponse;
  32. }
  33. private void GetStatusResponse(JsonNode jObject)
  34. {
  35. var preset = CurrentPreset ?? Preset;
  36. var _parsedPlayerList = new ValueList<JsonNode>();
  37. foreach (var player in _playerManager.Sessions)
  38. {
  39. _parsedPlayerList.Add(JsonValue.Create(player.Name.ToString())!);
  40. }
  41. // This method is raised from another thread, so this better be thread safe!
  42. lock (_statusShellLock)
  43. {
  44. jObject["name"] = _baseServer.ServerName;
  45. jObject["map"] = _gameMapManager.GetSelectedMap()?.MapName;
  46. jObject["round_id"] = _gameTicker.RoundId;
  47. jObject["players"] = _cfg.GetCVar(CCVars.AdminsCountInReportedPlayerCount)
  48. ? _playerManager.PlayerCount
  49. : _playerManager.PlayerCount - _adminManager.ActiveAdmins.Count();
  50. jObject["soft_max_players"] = _cfg.GetCVar(CCVars.SoftMaxPlayers);
  51. jObject["panic_bunker"] = _cfg.GetCVar(CCVars.PanicBunkerEnabled);
  52. jObject["run_level"] = (int)_runLevel;
  53. if (preset != null)
  54. jObject["preset"] = Loc.GetString(preset.ModeTitle);
  55. if (_runLevel >= GameRunLevel.InRound)
  56. {
  57. jObject["round_start_time"] = _roundStartDateTime.ToString("o");
  58. }
  59. jObject["playerlist"] = new JsonArray(_parsedPlayerList.ToArray());
  60. }
  61. }
  62. }
  63. }