using Content.Server.Chemistry.Containers.EntitySystems; using Content.Shared.Administration; using Content.Shared.Chemistry.Components; using Content.Shared.Chemistry.Reagent; using Content.Shared.FixedPoint; using Robust.Shared.Toolshed; using Robust.Shared.Toolshed.Syntax; using Robust.Shared.Toolshed.TypeParsers; using System.Linq; namespace Content.Server.Administration.Toolshed; [ToolshedCommand, AdminCommand(AdminFlags.Debug)] public sealed class SolutionCommand : ToolshedCommand { private SolutionContainerSystem? _solutionContainer; [CommandImplementation("get")] public SolutionRef? Get( [CommandInvocationContext] IInvocationContext ctx, [PipedArgument] EntityUid input, [CommandArgument] ValueRef name ) { _solutionContainer ??= GetSys(); if (_solutionContainer.TryGetSolution(input, name.Evaluate(ctx)!, out var solution)) return new SolutionRef(solution.Value); return null; } [CommandImplementation("get")] public IEnumerable Get( [CommandInvocationContext] IInvocationContext ctx, [PipedArgument] IEnumerable input, [CommandArgument] ValueRef name ) { return input.Select(x => Get(ctx, x, name)).Where(x => x is not null).Cast(); } [CommandImplementation("adjreagent")] public SolutionRef AdjReagent( [CommandInvocationContext] IInvocationContext ctx, [PipedArgument] SolutionRef input, [CommandArgument] Prototype name, [CommandArgument] ValueRef amountRef ) { _solutionContainer ??= GetSys(); var amount = amountRef.Evaluate(ctx); if (amount > 0) { _solutionContainer.TryAddReagent(input.Solution, name.Value.ID, amount, out _); } else if (amount < 0) { _solutionContainer.RemoveReagent(input.Solution, name.Value.ID, -amount); } return input; } [CommandImplementation("adjreagent")] public IEnumerable AdjReagent( [CommandInvocationContext] IInvocationContext ctx, [PipedArgument] IEnumerable input, [CommandArgument] Prototype name, [CommandArgument] ValueRef amountRef ) => input.Select(x => AdjReagent(ctx, x, name, amountRef)); } public readonly record struct SolutionRef(Entity Solution) { public override string ToString() { return $"{Solution.Owner} {Solution.Comp.Solution}"; } }