diff --git a/Content.Server/Administration/ServerAPI.cs b/Content.Server/Administration/ServerAPI.cs deleted file mode 100644 index 27e9a83f47..0000000000 --- a/Content.Server/Administration/ServerAPI.cs +++ /dev/null @@ -1,795 +0,0 @@ -using System.Net; -using System.Net.Http; -using System.Text.Json; -using System.Text.Json.Nodes; -using System.Threading.Tasks; -using Content.Server.Administration.Systems; -using Content.Server.GameTicking; -using Content.Server.GameTicking.Presets; -using Content.Server.GameTicking.Rules.Components; -using Content.Server.Maps; -using Content.Server.RoundEnd; -using Content.Shared.Administration.Managers; -using Content.Shared.CCVar; -using Content.Shared.Prototypes; -using Robust.Server.ServerStatus; -using Robust.Shared.Asynchronous; -using Robust.Shared.Configuration; -using Robust.Shared.Network; -using Robust.Shared.Player; -using Robust.Shared.Prototypes; -using Robust.Shared.Utility; - -namespace Content.Server.Administration; - -public sealed class ServerApi : IPostInjectInit -{ - [Dependency] private readonly IStatusHost _statusHost = default!; - [Dependency] private readonly IConfigurationManager _config = default!; - [Dependency] private readonly ISharedPlayerManager _playerManager = default!; // Players - [Dependency] private readonly ISharedAdminManager _adminManager = default!; // Admins - [Dependency] private readonly IGameMapManager _gameMapManager = default!; // Map name - [Dependency] private readonly IServerNetManager _netManager = default!; // Kick - [Dependency] private readonly IPrototypeManager _prototypeManager = default!; // Game rules - [Dependency] private readonly IComponentFactory _componentFactory = default!; // Needed to circumvent the "IoC has no context on this thread" error until I figure out how to do it properly - [Dependency] private readonly ITaskManager _taskManager = default!; // game explodes when calling stuff from the non-game thread - [Dependency] private readonly EntityManager _entityManager = default!; - - [Dependency] private readonly IEntitySystemManager _entitySystemManager = default!; - - private string _token = default!; - private ISawmill _sawmill = default!; - private string _motd = default!; - - public void PostInject() - { - _sawmill = Logger.GetSawmill("serverApi"); - - // Get - _statusHost.AddHandler(InfoHandler); - _statusHost.AddHandler(GetGameRules); - _statusHost.AddHandler(GetForcePresets); - - // Post - _statusHost.AddHandler(ActionRoundStatus); - _statusHost.AddHandler(ActionKick); - _statusHost.AddHandler(ActionAddGameRule); - _statusHost.AddHandler(ActionEndGameRule); - _statusHost.AddHandler(ActionForcePreset); - _statusHost.AddHandler(ActionForceMotd); - _statusHost.AddHandler(ActionPanicPunker); - - // Bandaid fix for the test fails - // "System.Collections.Generic.KeyNotFoundException : The given key 'server.admin_api_token' was not present in the dictionary." - // TODO: Figure out why this happens - try - { - _config.OnValueChanged(CCVars.AdminApiToken, UpdateToken, true); - _config.OnValueChanged(CCVars.MOTD, UpdateMotd, true); - } - catch (Exception e) - { - _sawmill.Error("Failed to subscribe to config vars: {0}", e); - } - - } - - public void Shutdown() - { - _config.UnsubValueChanged(CCVars.AdminApiToken, UpdateToken); - _config.UnsubValueChanged(CCVars.MOTD, UpdateMotd); - } - - private void UpdateToken(string token) - { - _token = token; - } - - private void UpdateMotd(string motd) - { - _motd = motd; - } - - -#region Actions - - /// - /// Changes the panic bunker settings. - /// - private async Task ActionPanicPunker(IStatusHandlerContext context) - { - if (context.RequestMethod != HttpMethod.Post || context.Url!.AbsolutePath != "/admin/actions/panic_bunker") - { - return false; - } - - if (!CheckAccess(context)) - { - await context.RespondErrorAsync(HttpStatusCode.Unauthorized); - return true; - } - - if (!CheckActor(context, out var actor)) - { - await context.RespondAsync("An actor is required to perform this action.", HttpStatusCode.BadRequest); - return true; - } - - var actionSupplied = context.RequestHeaders.TryGetValue("Action", out var action); - if (!actionSupplied) - { - await context.RespondErrorAsync(HttpStatusCode.BadRequest); - return true; - } - - var valueSupplied = context.RequestHeaders.TryGetValue("Value", out var value); - if (!valueSupplied) - { - await context.RespondErrorAsync(HttpStatusCode.BadRequest); - return true; - } - - switch (action) // TODO: This looks bad, there has to be a better way to do this. - { - case "enabled": - if (!bool.TryParse(value.ToString(), out var enabled)) - { - await context.RespondErrorAsync(HttpStatusCode.BadRequest); - return true; - } - - _taskManager.RunOnMainThread(() => - { - _config.SetCVar(CCVars.PanicBunkerEnabled, enabled); - }); - break; - case "disable_with_admins": - if (!bool.TryParse(value.ToString(), out var disableWithAdmins)) - { - await context.RespondErrorAsync(HttpStatusCode.BadRequest); - return true; - } - - _taskManager.RunOnMainThread(() => - { - _config.SetCVar(CCVars.PanicBunkerDisableWithAdmins, disableWithAdmins); - }); - break; - case "enable_without_admins": - if (!bool.TryParse(value.ToString(), out var enableWithoutAdmins)) - { - await context.RespondErrorAsync(HttpStatusCode.BadRequest); - return true; - } - - _taskManager.RunOnMainThread(() => - { - _config.SetCVar(CCVars.PanicBunkerEnableWithoutAdmins, enableWithoutAdmins); - }); - break; - case "count_deadminned_admins": - if (!bool.TryParse(value.ToString(), out var countDeadminnedAdmins)) - { - await context.RespondErrorAsync(HttpStatusCode.BadRequest); - return true; - } - - _taskManager.RunOnMainThread(() => - { - _config.SetCVar(CCVars.PanicBunkerCountDeadminnedAdmins, countDeadminnedAdmins); - }); - break; - case "show_reason": - if (!bool.TryParse(value.ToString(), out var showReason)) - { - await context.RespondErrorAsync(HttpStatusCode.BadRequest); - return true; - } - - _taskManager.RunOnMainThread(() => - { - _config.SetCVar(CCVars.PanicBunkerShowReason, showReason); - }); - break; - case "min_account_age_hours": - if (!int.TryParse(value.ToString(), out var minAccountAgeHours)) - { - await context.RespondErrorAsync(HttpStatusCode.BadRequest); - return true; - } - - _taskManager.RunOnMainThread(() => - { - _config.SetCVar(CCVars.PanicBunkerMinAccountAge, minAccountAgeHours * 60); - }); - break; - case "min_overall_hours": - if (!int.TryParse(value.ToString(), out var minOverallHours)) - { - await context.RespondErrorAsync(HttpStatusCode.BadRequest); - return true; - } - - _taskManager.RunOnMainThread(() => - { - _config.SetCVar(CCVars.PanicBunkerMinOverallHours, minOverallHours * 60); - }); - break; - } - - _sawmill.Info($"Panic bunker setting {action} changed to {value} by {actor!.Name}({actor!.Guid})."); - await context.RespondAsync("Success", HttpStatusCode.OK); - return true; - } - - /// - /// Sets the current MOTD. - /// - private async Task ActionForceMotd(IStatusHandlerContext context) - { - if (context.RequestMethod != HttpMethod.Post || context.Url!.AbsolutePath != "/admin/actions/set_motd") - { - return false; - } - - if (!CheckAccess(context)) - { - await context.RespondErrorAsync(HttpStatusCode.Unauthorized); - return true; - } - - if (!CheckActor(context, out var actor)) - { - await context.RespondAsync("An actor is required to perform this action.", HttpStatusCode.BadRequest); - return true; - } - - var motdSupplied = context.RequestHeaders.TryGetValue("MOTD", out var motd); - if (!motdSupplied) - { - await context.RespondErrorAsync(HttpStatusCode.BadRequest); - return true; - } - - _sawmill.Info($"MOTD changed to \"{motd}\" by {actor!.Name}({actor!.Guid})."); - - _taskManager.RunOnMainThread(() => _config.SetCVar(CCVars.MOTD, motd.ToString())); - // A hook in the MOTD system sends the changes to each client - await context.RespondAsync("Success", HttpStatusCode.OK); - return true; - } - - /// - /// Forces the next preset- - /// - private async Task ActionForcePreset(IStatusHandlerContext context) - { - if (context.RequestMethod != HttpMethod.Post || context.Url!.AbsolutePath != "/admin/actions/force_preset") - { - return false; - } - - if (!CheckAccess(context)) - { - await context.RespondErrorAsync(HttpStatusCode.Unauthorized); - return true; - } - - if (!CheckActor(context, out var actor)) - { - await context.RespondAsync("An actor is required to perform this action.", HttpStatusCode.BadRequest); - return true; - } - - var ticker = _entitySystemManager.GetEntitySystem(); - - if (ticker.RunLevel != GameRunLevel.PreRoundLobby) - { - _sawmill.Info($"Attempted to force preset {actor!.Name}({actor!.Guid}) while the game was not in the pre-round lobby."); - await context.RespondAsync("This can only be executed while the game is in the pre-round lobby.", HttpStatusCode.BadRequest); - return true; - } - - var presetSupplied = context.RequestHeaders.TryGetValue("PresetId", out var preset); - if (!presetSupplied) - { - await context.RespondErrorAsync(HttpStatusCode.BadRequest); - return true; - } - - var result = await RunOnMainThread(() => ticker.FindGamePreset(preset.ToString())); - if (result == null) - { - await context.RespondAsync($"No preset exists with name {preset}.", HttpStatusCode.NotFound); - return true; - } - - _taskManager.RunOnMainThread(() => - { - ticker.SetGamePreset(result); - }); - _sawmill.Info($"Forced the game to start with preset {preset} by {actor!.Name}({actor!.Guid})."); - await context.RespondAsync("Success", HttpStatusCode.OK); - return true; - } - - /// - /// Ends an active game rule. - /// - private async Task ActionEndGameRule(IStatusHandlerContext context) - { - if (context.RequestMethod != HttpMethod.Post || context.Url!.AbsolutePath != "/admin/actions/end_game_rule") - { - return false; - } - - if (!CheckAccess(context)) - { - await context.RespondErrorAsync(HttpStatusCode.Unauthorized); - return true; - } - - if (!CheckActor(context, out var actor)) - { - await context.RespondAsync("An actor is required to perform this action.", HttpStatusCode.BadRequest); - return true; - } - - var gameRuleSupplied = context.RequestHeaders.TryGetValue("GameRuleId", out var gameRule); - if (!gameRuleSupplied) - { - _sawmill.Info($"Attempted to end game rule without supplying a game rule name by {actor!.Name}({actor!.Guid})."); - await context.RespondErrorAsync(HttpStatusCode.BadRequest); - return true; - } - var ticker = _entitySystemManager.GetEntitySystem(); - var gameRuleEntity = await RunOnMainThread(() => ticker - .GetActiveGameRules() - .FirstOrNull(rule => _entityManager.MetaQuery.GetComponent(rule).EntityPrototype?.ID == gameRule.ToString())); - - if (gameRuleEntity == null) // Game rule not found - { - _sawmill.Info($"Attempted to end game rule {gameRule} by {actor!.Name}({actor!.Guid}), but it was not found."); - await context.RespondAsync("Gamerule not found or not active",HttpStatusCode.NotFound); - return true; - } - - _sawmill.Info($"Ended game rule {gameRule} by {actor!.Name}({actor!.Guid})."); - _taskManager.RunOnMainThread(() => ticker.EndGameRule((EntityUid) gameRuleEntity)); - await context.RespondAsync($"Ended game rule {gameRule}({gameRuleEntity})", HttpStatusCode.OK); - return true; - } - - /// - /// Adds a game rule to the current round. - /// - private async Task ActionAddGameRule(IStatusHandlerContext context) - { - if (context.RequestMethod != HttpMethod.Post || context.Url!.AbsolutePath != "/admin/actions/add_game_rule") - { - return false; - } - - if (!CheckAccess(context)) - { - await context.RespondErrorAsync(HttpStatusCode.Unauthorized); - return true; - } - - if (!CheckActor(context, out var actor)) - { - await context.RespondAsync("An actor is required to perform this action.", HttpStatusCode.BadRequest); - return true; - } - - var gameRuleSupplied = context.RequestHeaders.TryGetValue("GameRuleId", out var gameRule); - if (!gameRuleSupplied) - { - _sawmill.Info($"Attempted to add game rule without supplying a game rule name by {actor!.Name}({actor!.Guid})."); - await context.RespondErrorAsync(HttpStatusCode.BadRequest); - return true; - } - - var ticker = _entitySystemManager.GetEntitySystem(); - - var tsc = new TaskCompletionSource(); - _taskManager.RunOnMainThread(() => - { - var ruleEntity = ticker.AddGameRule(gameRule.ToString()); - _sawmill.Info($"Added game rule {gameRule} by {actor!.Name}({actor!.Guid})."); - if (ticker.RunLevel == GameRunLevel.InRound) - { - ticker.StartGameRule(ruleEntity); - _sawmill.Info($"Started game rule {gameRule} by {actor!.Name}({actor!.Guid})."); - } - tsc.TrySetResult(ruleEntity); - }); - - var ruleEntity = await tsc.Task; - await context.RespondAsync($"Added game rule {ruleEntity}", HttpStatusCode.OK); - return true; - } - - /// - /// Kicks a player. - /// - private async Task ActionKick(IStatusHandlerContext context) - { - if (context.RequestMethod != HttpMethod.Post || context.Url!.AbsolutePath != "/admin/actions/kick") - { - return false; - } - - if (!CheckAccess(context)) - { - await context.RespondErrorAsync(HttpStatusCode.Unauthorized); - return true; - } - - if (!CheckActor(context, out var actor)) - { - await context.RespondAsync("An actor is required to perform this action.", HttpStatusCode.BadRequest); - return true; - } - - var playerSupplied = context.RequestHeaders.TryGetValue("Guid", out var guid); - if (!playerSupplied) - { - _sawmill.Info($"Attempted to kick player without supplying a username by {actor!.Name}({actor!.Guid})."); - await context.RespondErrorAsync(HttpStatusCode.BadRequest); - return true; - } - - var session = await RunOnMainThread(() => - { - // There is no function to get a session by GUID, so we have to iterate over all sessions and check their GUIDs. - foreach (var player in _playerManager.Sessions) - { - if (player.UserId.UserId.ToString() == guid.ToString()) - { - return player; - } - } - return null; - }); - - if (session == null) - { - _sawmill.Info($"Attempted to kick player {guid} by {actor!.Name}({actor!.Guid}), but they were not found."); - await context.RespondAsync("Player not found", HttpStatusCode.NotFound); - return true; - } - - var reasonSupplied = context.RequestHeaders.TryGetValue("Reason", out var reason); - if (!reasonSupplied) - { - reason = "No reason supplied"; - } - - reason += " (kicked by admin)"; - - _taskManager.RunOnMainThread(() => - { - _netManager.DisconnectChannel(session.Channel, reason.ToString()); - }); - await context.RespondAsync("Success", HttpStatusCode.OK); - _sawmill.Info("Kicked player {0} ({1}) for {2} by {3}({4})", session.Name, session.UserId.UserId.ToString(), reason, actor!.Name, actor!.Guid); - return true; - } - - /// - /// Round restart/end - /// - private async Task ActionRoundStatus(IStatusHandlerContext context) - { - if (context.RequestMethod != HttpMethod.Post || context.Url!.AbsolutePath != "/admin/actions/round") - { - return false; - } - - if (!CheckAccess(context)) - { - await context.RespondErrorAsync(HttpStatusCode.Unauthorized); - return true; - } - - if (!CheckActor(context, out var actor)) - { - await context.RespondAsync("An actor is required to perform this action.", HttpStatusCode.BadRequest); - return true; - } - - // Not using body, because that's a stream and I don't want to deal with that - var actionSupplied = context.RequestHeaders.TryGetValue("Action", out var action); - if (!actionSupplied) - { - _sawmill.Info($"Attempted to {action} round without supplying an action by {actor!.Name}({actor!.Guid})."); - await context.RespondErrorAsync(HttpStatusCode.BadRequest); - return true; - } - - var ticker = _entitySystemManager.GetEntitySystem(); - var roundEndSystem = _entitySystemManager.GetEntitySystem(); - switch (action) - { - case "start": - if (ticker.RunLevel != GameRunLevel.PreRoundLobby) - { - await context.RespondAsync("Round already started", HttpStatusCode.BadRequest); - _sawmill.Info("Forced round start failed: round already started"); - return true; - } - _taskManager.RunOnMainThread(() => - { - ticker.StartRound(); - }); - _sawmill.Info("Forced round start"); - break; - case "end": - if (ticker.RunLevel != GameRunLevel.InRound) - { - await context.RespondAsync("Round already ended", HttpStatusCode.BadRequest); - _sawmill.Info("Forced round end failed: round is not in progress"); - return true; - } - _taskManager.RunOnMainThread(() => - { - roundEndSystem.EndRound(); - }); - _sawmill.Info("Forced round end"); - break; - case "restart": - if (ticker.RunLevel != GameRunLevel.InRound) - { - await context.RespondAsync("Round already ended", HttpStatusCode.BadRequest); - _sawmill.Info("Forced round restart failed: round is not in progress"); - return true; - } - _taskManager.RunOnMainThread(() => - { - roundEndSystem.EndRound(); - }); - _sawmill.Info("Forced round restart"); - break; - case "restartnow": // You should restart yourself NOW!!! - _taskManager.RunOnMainThread(() => - { - ticker.RestartRound(); - }); - _sawmill.Info("Forced instant round restart"); - break; - default: - await context.RespondErrorAsync(HttpStatusCode.BadRequest); - return true; - } - - _sawmill.Info($"Round {action} by {actor!.Name}({actor!.Guid})."); - await context.RespondAsync("Success", HttpStatusCode.OK); - return true; - } -#endregion - -#region Fetching - - /// - /// Returns an array containing all presets. - /// - private async Task GetForcePresets(IStatusHandlerContext context) - { - if (context.RequestMethod != HttpMethod.Get || context.Url!.AbsolutePath != "/admin/force_presets") - { - return false; - } - - if (!CheckAccess(context)) - { - await context.RespondErrorAsync(HttpStatusCode.Unauthorized); - return true; - } - - var jObject = new JsonObject(); - var presets = new List(); - foreach (var preset in _prototypeManager.EnumeratePrototypes()) - { - presets.Add(preset.ID); - } - - jObject["presets"] = JsonNode.Parse(JsonSerializer.Serialize(presets)); - await context.RespondAsync(jObject.ToString(), HttpStatusCode.OK); - return true; - } - - /// - /// Returns an array containing all game rules. - /// - private async Task GetGameRules(IStatusHandlerContext context) - { - if (context.RequestMethod != HttpMethod.Get || context.Url!.AbsolutePath != "/admin/game_rules") - { - return false; - } - - if (!CheckAccess(context)) - { - await context.RespondErrorAsync(HttpStatusCode.Unauthorized); - return true; - } - - var jObject = new JsonObject(); - var gameRules = new List(); - foreach (var gameRule in _prototypeManager.EnumeratePrototypes()) - { - if (gameRule.Abstract) - continue; - - if (gameRule.HasComponent(_componentFactory)) - gameRules.Add(gameRule.ID); - } - - jObject["game_rules"] = JsonNode.Parse(JsonSerializer.Serialize(gameRules)); - await context.RespondAsync(jObject.ToString(), HttpStatusCode.OK); - return true; - } - - - /// - /// Handles fetching information. - /// - private async Task InfoHandler(IStatusHandlerContext context) - { - if (context.RequestMethod != HttpMethod.Get || context.Url!.AbsolutePath != "/admin/info" || _token == string.Empty) - { - return false; - // 404 - } - - if (!CheckAccess(context)) - { - await context.RespondErrorAsync(HttpStatusCode.Unauthorized); - return true; - } - - if (!CheckActor(context, out var actor)) - { - await context.RespondAsync("An actor is required to perform this action.", HttpStatusCode.BadRequest); - return true; - } - - /* Information to display - Round number - Connected players - Active admins - Active game rules - Active game preset - Active map - MOTD - Panic bunker status - */ - - var ticker = _entitySystemManager.GetEntitySystem(); - var adminSystem = _entitySystemManager.GetEntitySystem(); - - var jObject = new JsonObject(); - - jObject["round_id"] = await RunOnMainThread(() => ticker.RoundId); - - var players = new List(); - var onlineAdmins = new List(); - var onlineAdminsDeadmined = new List(); - - foreach (var player in _playerManager.Sessions) - { - players.Add(new Player - { - Guid = player.UserId.UserId.ToString(), - Name = player.Name - }); - if (await RunOnMainThread(() => _adminManager.IsAdmin(player))) - { - onlineAdmins.Add(new Player - { - Guid = player.UserId.UserId.ToString(), - Name = player.Name - }); - } - else if (await RunOnMainThread(() => _adminManager.IsAdmin(player, true))) - { - onlineAdminsDeadmined.Add(new Player - { - Guid = player.UserId.UserId.ToString(), - Name = player.Name - }); - } - } - - // The JsonSerializer.Serialize into JsonNode.Parse is a bit of a hack - jObject["players"] = JsonNode.Parse(JsonSerializer.Serialize(players)); - jObject["admins"] = JsonNode.Parse(JsonSerializer.Serialize(onlineAdmins)); - jObject["deadmined"] = JsonNode.Parse(JsonSerializer.Serialize(onlineAdminsDeadmined)); - - var gameRules = new List(); - foreach (var addedGameRule in await RunOnMainThread(() => ticker.GetActiveGameRules())) - { - var meta = _entityManager.MetaQuery.GetComponent(addedGameRule); - gameRules.Add(meta.EntityPrototype?.ID ?? meta.EntityPrototype?.Name ?? "Unknown"); - } - - jObject["game_rules"] = JsonNode.Parse(JsonSerializer.Serialize(gameRules)); - jObject["game_preset"] = ticker.CurrentPreset?.ID; - jObject["map"] = await RunOnMainThread(() => _gameMapManager.GetSelectedMap()?.MapName ?? "Unknown"); - jObject["motd"] = _motd; - jObject["panic_bunker"] = new JsonObject(); - jObject["panic_bunker"]!["enabled"] = adminSystem.PanicBunker.Enabled; - jObject["panic_bunker"]!["disable_with_admins"] = adminSystem.PanicBunker.DisableWithAdmins; - jObject["panic_bunker"]!["enable_without_admins"] = adminSystem.PanicBunker.EnableWithoutAdmins; - jObject["panic_bunker"]!["count_deadminned_admins"] = adminSystem.PanicBunker.CountDeadminnedAdmins; - jObject["panic_bunker"]!["show_reason"] = adminSystem.PanicBunker.ShowReason; - jObject["panic_bunker"]!["min_account_age_hours"] = adminSystem.PanicBunker.MinAccountAgeHours; - jObject["panic_bunker"]!["min_overall_hours"] = adminSystem.PanicBunker.MinOverallHours; - - _sawmill.Info($"Info requested by {actor!.Name}({actor!.Guid})."); - await context.RespondAsync(jObject.ToString(), HttpStatusCode.OK); - return true; - } - -#endregion - - private bool CheckAccess(IStatusHandlerContext context) - { - var auth = context.RequestHeaders.TryGetValue("Authorization", out var authToken); - if (!auth) - { - _sawmill.Info(@"Unauthorized access attempt to admin API. No auth header"); - return false; - } // No auth header, no access - - if (authToken == _token) - return true; - - // Invalid auth header, no access - _sawmill.Info(@"Unauthorized access attempt to admin API. ""{0}""", authToken.ToString()); - return false; - } - - /// - /// Async helper function which runs a task on the main thread and returns the result. - /// - private async Task RunOnMainThread(Func func) - { - var taskCompletionSource = new TaskCompletionSource(); - _taskManager.RunOnMainThread(() => - { - taskCompletionSource.TrySetResult(func()); - }); - - var result = await taskCompletionSource.Task; - return result; - } - - private bool CheckActor(IStatusHandlerContext context, out Player? actor) - { - // We are trusting the header to be correct. - // This is fine because the header is set by the SS14.Admin backend. - var actorSupplied = context.RequestHeaders.TryGetValue("Actor", out var actorHeader); - if (!actorSupplied) - { - actor = null; - return false; - } - - var stringRep = actorHeader.ToString(); - actor = new Player() - { - // GUID_NAME format - Guid = stringRep[..stringRep.IndexOf('_')], - Name = stringRep[(stringRep.IndexOf('_') + 1)..] - }; - return true; - } - - private sealed class Player - { - public string Guid { get; set; } = default!; - public string Name { get; set; } = default!; - } -} diff --git a/Content.Server/Administration/Systems/AdminSystem.cs b/Content.Server/Administration/Systems/AdminSystem.cs index 70d3befbe2..966bff2f71 100644 --- a/Content.Server/Administration/Systems/AdminSystem.cs +++ b/Content.Server/Administration/Systems/AdminSystem.cs @@ -61,7 +61,7 @@ namespace Content.Server.Administration.Systems public IReadOnlySet RoundActivePlayers => _roundActivePlayers; private readonly HashSet _roundActivePlayers = new(); - public readonly PanicBunkerStatus PanicBunker = new(); + private readonly PanicBunkerStatus _panicBunker = new(); public override void Initialize() { @@ -248,7 +248,7 @@ namespace Content.Server.Administration.Systems private void OnPanicBunkerChanged(bool enabled) { - PanicBunker.Enabled = enabled; + _panicBunker.Enabled = enabled; _chat.SendAdminAlert(Loc.GetString(enabled ? "admin-ui-panic-bunker-enabled-admin-alert" : "admin-ui-panic-bunker-disabled-admin-alert" @@ -259,52 +259,52 @@ namespace Content.Server.Administration.Systems private void OnPanicBunkerDisableWithAdminsChanged(bool enabled) { - PanicBunker.DisableWithAdmins = enabled; + _panicBunker.DisableWithAdmins = enabled; UpdatePanicBunker(); } private void OnPanicBunkerEnableWithoutAdminsChanged(bool enabled) { - PanicBunker.EnableWithoutAdmins = enabled; + _panicBunker.EnableWithoutAdmins = enabled; UpdatePanicBunker(); } private void OnPanicBunkerCountDeadminnedAdminsChanged(bool enabled) { - PanicBunker.CountDeadminnedAdmins = enabled; + _panicBunker.CountDeadminnedAdmins = enabled; UpdatePanicBunker(); } private void OnShowReasonChanged(bool enabled) { - PanicBunker.ShowReason = enabled; + _panicBunker.ShowReason = enabled; SendPanicBunkerStatusAll(); } private void OnPanicBunkerMinAccountAgeChanged(int minutes) { - PanicBunker.MinAccountAgeHours = minutes / 60; + _panicBunker.MinAccountAgeHours = minutes / 60; SendPanicBunkerStatusAll(); } private void OnPanicBunkerMinOverallHoursChanged(int hours) { - PanicBunker.MinOverallHours = hours; + _panicBunker.MinOverallHours = hours; SendPanicBunkerStatusAll(); } private void UpdatePanicBunker() { - var admins = PanicBunker.CountDeadminnedAdmins + var admins = _panicBunker.CountDeadminnedAdmins ? _adminManager.AllAdmins : _adminManager.ActiveAdmins; var hasAdmins = admins.Any(); - if (hasAdmins && PanicBunker.DisableWithAdmins) + if (hasAdmins && _panicBunker.DisableWithAdmins) { _config.SetCVar(CCVars.PanicBunkerEnabled, false); } - else if (!hasAdmins && PanicBunker.EnableWithoutAdmins) + else if (!hasAdmins && _panicBunker.EnableWithoutAdmins) { _config.SetCVar(CCVars.PanicBunkerEnabled, true); } @@ -314,7 +314,7 @@ namespace Content.Server.Administration.Systems private void SendPanicBunkerStatusAll() { - var ev = new PanicBunkerChangedEvent(PanicBunker); + var ev = new PanicBunkerChangedEvent(_panicBunker); foreach (var admin in _adminManager.AllAdmins) { RaiseNetworkEvent(ev, admin); diff --git a/Content.Server/IoC/ServerContentIoC.cs b/Content.Server/IoC/ServerContentIoC.cs index 25bb1072a5..2a63ace8e3 100644 --- a/Content.Server/IoC/ServerContentIoC.cs +++ b/Content.Server/IoC/ServerContentIoC.cs @@ -58,7 +58,6 @@ namespace Content.Server.IoC IoCManager.Register(); IoCManager.Register(); IoCManager.Register(); - IoCManager.Register(); } } } diff --git a/Content.Shared/CCVar/CCVars.cs b/Content.Shared/CCVar/CCVars.cs index 2a1a29c044..5a315f7055 100644 --- a/Content.Shared/CCVar/CCVars.cs +++ b/Content.Shared/CCVar/CCVars.cs @@ -29,12 +29,6 @@ namespace Content.Shared.CCVar public static readonly CVarDef RulesHeader = CVarDef.Create("server.rules_header", "ui-rules-header", CVar.REPLICATED | CVar.SERVER); - /// - /// The token used to authenticate with the admin API. Leave empty to disable the admin API. This is a secret! Do not share! - /// - public static readonly CVarDef AdminApiToken = - CVarDef.Create("server.admin_api_token", string.Empty, CVar.SERVERONLY | CVar.CONFIDENTIAL); - /* * Ambience */