using System.Diagnostics; using System.Linq; using Content.Server.Administration; using Content.Server.Cargo.Systems; using Content.Server.Station.Systems; using Content.Shared.Administration; using Content.Shared.Station; using Content.Shared.Station.Components; using Robust.Shared.Toolshed; using Robust.Shared.Toolshed.Errors; using Robust.Shared.Utility; namespace Content.Server.Station.Commands; [ToolshedCommand, AdminCommand(AdminFlags.Admin)] public sealed class StationsCommand : ToolshedCommand { private StationSystem? _station; private CargoSystem? _cargo; [CommandImplementation("list")] public IEnumerable List() { _station ??= GetSys(); return _station.GetStationsSet(); } [CommandImplementation("get")] public EntityUid Get(IInvocationContext ctx) { _station ??= GetSys(); var set = _station.GetStationsSet(); if (set.Count > 1 || set.Count == 0) ctx.ReportError(new OnlyOneStationsError()); return set.FirstOrDefault(); } [CommandImplementation("getowningstation")] public IEnumerable GetOwningStation([PipedArgument] IEnumerable input) => input.Select(GetOwningStation); [CommandImplementation("getowningstation")] public EntityUid? GetOwningStation([PipedArgument] EntityUid input) { _station ??= GetSys(); return _station.GetOwningStation(input); } [CommandImplementation("largestgrid")] public EntityUid? LargestGrid([PipedArgument] EntityUid input) { _station ??= GetSys(); return _station.GetLargestGrid(input); } [CommandImplementation("largestgrid")] public IEnumerable LargestGrid([PipedArgument] IEnumerable input) => input.Select(LargestGrid); [CommandImplementation("grids")] public IEnumerable Grids([PipedArgument] EntityUid input) => Comp(input).Grids; [CommandImplementation("grids")] public IEnumerable Grids([PipedArgument] IEnumerable input) => input.SelectMany(Grids); [CommandImplementation("config")] public StationConfig? Config([PipedArgument] EntityUid input) => Comp(input).StationConfig; [CommandImplementation("config")] public IEnumerable Config([PipedArgument] IEnumerable input) => input.Select(Config); [CommandImplementation("addgrid")] public void AddGrid([PipedArgument] EntityUid input, EntityUid grid) { _station ??= GetSys(); _station.AddGridToStation(input, grid); } [CommandImplementation("rmgrid")] public void RmGrid([PipedArgument] EntityUid input, EntityUid grid) { _station ??= GetSys(); _station.RemoveGridFromStation(input, grid); } [CommandImplementation("rename")] public void Rename([PipedArgument] EntityUid input, string name) { _station ??= GetSys(); _station.RenameStation(input, name); } [CommandImplementation("rerollBounties")] public void RerollBounties([PipedArgument] EntityUid input) { _cargo ??= GetSys(); _cargo.RerollBountyDatabase(input); } } public record struct OnlyOneStationsError : IConError { public FormattedMessage DescribeInner() { return FormattedMessage.FromMarkupOrThrow("This command doesn't function if there is more than one or no stations, explicitly specify a station with the ent command or similar."); } public string? Expression { get; set; } public Vector2i? IssueSpan { get; set; } public StackTrace? Trace { get; set; } }