diff --git a/Content.Server/AlertLevel/Commands/SetAlertLevelCommand.cs b/Content.Server/AlertLevel/Commands/SetAlertLevelCommand.cs index a1594c9612..c377059bea 100644 --- a/Content.Server/AlertLevel/Commands/SetAlertLevelCommand.cs +++ b/Content.Server/AlertLevel/Commands/SetAlertLevelCommand.cs @@ -1,6 +1,5 @@ -using Content.Server.Administration; -using Content.Server.AlertLevel; -using Content.Server.Players; +using System.Linq; +using Content.Server.Administration; using Content.Server.Station.Systems; using Content.Shared.Administration; using JetBrains.Annotations; @@ -14,47 +13,82 @@ namespace Content.Server.AlertLevel.Commands public sealed class SetAlertLevelCommand : IConsoleCommand { public string Command => "setalertlevel"; - public string Description => "Set current station alert level."; - public string Help => "setalertlevel [locked]"; + public string Description => Loc.GetString("cmd-setalertlevel-desc"); + public string Help => Loc.GetString("cmd-setalertlevel-help"); + + public CompletionResult GetCompletion(IConsoleShell shell, string[] args) + { + var levelNames = new string[] {}; + var player = shell.Player as IPlayerSession; + if (player?.AttachedEntity != null) + { + var stationUid = EntitySystem.Get().GetOwningStation(player.AttachedEntity.Value); + if (stationUid != null) + { + levelNames = GetStationLevelNames(stationUid.Value); + } + } + + return args.Length switch + { + 1 => CompletionResult.FromHintOptions(levelNames, + Loc.GetString("cmd-setalertlevel-hint-1")), + 2 => CompletionResult.FromHintOptions(CompletionHelper.Booleans, + Loc.GetString("cmd-setalertlevel-hint-2")), + _ => CompletionResult.Empty, + }; + } public void Execute(IConsoleShell shell, string argStr, string[] args) { if (args.Length < 1) { - shell.WriteError("Incorrect number of arguments. " + Help); + shell.WriteError(Loc.GetString("shell-wrong-arguments-number")); return; } var locked = false; if (args.Length > 1 && !bool.TryParse(args[1], out locked)) { - shell.WriteLine("Invalid boolean flag"); + shell.WriteLine(Loc.GetString("shell-argument-must-be-boolean")); return; } var player = shell.Player as IPlayerSession; - if (player == null) + if (player?.AttachedEntity == null) { - shell.WriteLine("You cannot run this from the server or without an attached entity."); + shell.WriteLine(Loc.GetString("shell-only-players-can-run-this-command")); return; } - var playerEntityUid = player.AttachedEntity; - if (playerEntityUid == null) - { - shell.WriteLine("You cannot run this from the server or without an attached entity."); - return; - } - - var stationUid = EntitySystem.Get().GetOwningStation(playerEntityUid.Value); + var stationUid = EntitySystem.Get().GetOwningStation(player.AttachedEntity.Value); if (stationUid == null) { - shell.WriteLine("You must be on grid of station code that you are going to change."); + shell.WriteLine(Loc.GetString("cmd-setalertlevel-invalid-grid")); return; } var level = args[0]; + var levelNames = GetStationLevelNames(stationUid.Value); + if (!levelNames.Contains(level)) + { + shell.WriteLine(Loc.GetString("cmd-setalertlevel-invalid-level")); + return; + } + EntitySystem.Get().SetLevel(stationUid.Value, level, true, true, true, locked); } + + private string[] GetStationLevelNames(EntityUid station) + { + var entityManager = IoCManager.Resolve(); + if (!entityManager.TryGetComponent(station, out var alertLevelComp)) + return new string[]{}; + + if (alertLevelComp.AlertLevels == null) + return new string[]{}; + + return alertLevelComp.AlertLevels.Levels.Keys.ToArray(); + } } } diff --git a/Resources/Locale/en-US/alert-levels/alert-level-command.ftl b/Resources/Locale/en-US/alert-levels/alert-level-command.ftl new file mode 100644 index 0000000000..dda4c0cbc6 --- /dev/null +++ b/Resources/Locale/en-US/alert-levels/alert-level-command.ftl @@ -0,0 +1,7 @@ +cmd-setalertlevel-desc = Set current station alert level for grid on which the player is standing. +cmd-setalertlevel-help = Usage: setalertlevel [locked] +cmd-setalertlevel-invalid-grid = You must be on grid of station code that you are going to change. +cmd-setalertlevel-invalid-level = Specified alert level does not exist on that grid. + +cmd-setalertlevel-hint-1 = +cmd-setalertlevel-hint-2 = [locked] diff --git a/Resources/Locale/en-US/shell.ftl b/Resources/Locale/en-US/shell.ftl index 1b8ba88814..a5d0dd2be4 100644 --- a/Resources/Locale/en-US/shell.ftl +++ b/Resources/Locale/en-US/shell.ftl @@ -14,6 +14,7 @@ shell-only-players-can-run-this-command = Only players can run this command. shell-need-exactly-one-argument = Need exactly one argument. shell-wrong-arguments-number-need-specific = Need {$properAmount} arguments, there were {$currentAmount}. shell-argument-must-be-number = Argument must be a number. +shell-argument-must-be-boolean = Argument must be a boolean. shell-wrong-arguments-number = Wrong number of arguments. shell-need-between-arguments = Need {$lower} to {$upper} arguments!