TagCommand.cs 3.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. using System.Linq;
  2. using Content.Shared.Administration;
  3. using Content.Shared.Tag;
  4. using Robust.Shared.Prototypes;
  5. using Robust.Shared.Toolshed;
  6. using Robust.Shared.Toolshed.Syntax;
  7. using Robust.Shared.Toolshed.TypeParsers;
  8. namespace Content.Server.Administration.Toolshed;
  9. [ToolshedCommand, AdminCommand(AdminFlags.Debug)]
  10. public sealed class TagCommand : ToolshedCommand
  11. {
  12. private TagSystem? _tag;
  13. [CommandImplementation("list")]
  14. public IEnumerable<ProtoId<TagPrototype>> List([PipedArgument] IEnumerable<EntityUid> ent)
  15. {
  16. return ent.SelectMany(x =>
  17. {
  18. if (TryComp<TagComponent>(x, out var tags))
  19. // Note: Cast is required for C# to figure out the type signature.
  20. return (IEnumerable<ProtoId<TagPrototype>>)tags.Tags;
  21. return Array.Empty<ProtoId<TagPrototype>>();
  22. });
  23. }
  24. [CommandImplementation("with")]
  25. public IEnumerable<EntityUid> With(
  26. [CommandInvocationContext] IInvocationContext ctx,
  27. [PipedArgument] IEnumerable<EntityUid> entities,
  28. [CommandArgument] ValueRef<string, Prototype<TagPrototype>> tag)
  29. {
  30. _tag ??= GetSys<TagSystem>();
  31. return entities.Where(e => _tag.HasTag(e, tag.Evaluate(ctx)!));
  32. }
  33. [CommandImplementation("add")]
  34. public EntityUid Add([PipedArgument] EntityUid input, ProtoId<TagPrototype> tag)
  35. {
  36. _tag ??= GetSys<TagSystem>();
  37. _tag.AddTag(input, tag);
  38. return input;
  39. }
  40. [CommandImplementation("add")]
  41. public IEnumerable<EntityUid> Add([PipedArgument] IEnumerable<EntityUid> input, ProtoId<TagPrototype> tag)
  42. => input.Select(x => Add(x, tag));
  43. [CommandImplementation("rm")]
  44. public EntityUid Rm([PipedArgument] EntityUid input, ProtoId<TagPrototype> tag)
  45. {
  46. _tag ??= GetSys<TagSystem>();
  47. _tag.RemoveTag(input, tag);
  48. return input;
  49. }
  50. [CommandImplementation("rm")]
  51. public IEnumerable<EntityUid> Rm([PipedArgument] IEnumerable<EntityUid> input, ProtoId<TagPrototype> tag)
  52. => input.Select(x => Rm(x, tag));
  53. [CommandImplementation("addmany")]
  54. public EntityUid AddMany([PipedArgument] EntityUid input, IEnumerable<ProtoId<TagPrototype>> tags)
  55. {
  56. _tag ??= GetSys<TagSystem>();
  57. _tag.AddTags(input, tags);
  58. return input;
  59. }
  60. [CommandImplementation("addmany")]
  61. public IEnumerable<EntityUid> AddMany([PipedArgument] IEnumerable<EntityUid> input, IEnumerable<ProtoId<TagPrototype>> tags)
  62. => input.Select(x => AddMany(x, tags.ToArray()));
  63. [CommandImplementation("rmmany")]
  64. public EntityUid RmMany([PipedArgument] EntityUid input, IEnumerable<ProtoId<TagPrototype>> tags)
  65. {
  66. _tag ??= GetSys<TagSystem>();
  67. _tag.RemoveTags(input, tags);
  68. return input;
  69. }
  70. [CommandImplementation("rmmany")]
  71. public IEnumerable<EntityUid> RmMany([PipedArgument] IEnumerable<EntityUid> input, IEnumerable<ProtoId<TagPrototype>> tags)
  72. => input.Select(x => RmMany(x, tags.ToArray()));
  73. }