RoleBanCommand.cs 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. using System.Linq;
  2. using System.Text;
  3. using Content.Server.Administration.Managers;
  4. using Content.Shared.Administration;
  5. using Content.Shared.CCVar;
  6. using Content.Shared.Database;
  7. using Content.Shared.Roles;
  8. using Robust.Shared.Configuration;
  9. using Robust.Shared.Console;
  10. using Robust.Shared.Prototypes;
  11. namespace Content.Server.Administration.Commands;
  12. [AdminCommand(AdminFlags.Ban)]
  13. public sealed class RoleBanCommand : IConsoleCommand
  14. {
  15. [Dependency] private readonly IPlayerLocator _locator = default!;
  16. [Dependency] private readonly IBanManager _bans = default!;
  17. [Dependency] private readonly IConfigurationManager _cfg = default!;
  18. [Dependency] private readonly IPrototypeManager _proto = default!;
  19. public string Command => "roleban";
  20. public string Description => Loc.GetString("cmd-roleban-desc");
  21. public string Help => Loc.GetString("cmd-roleban-help");
  22. public async void Execute(IConsoleShell shell, string argStr, string[] args)
  23. {
  24. string target;
  25. string job;
  26. string reason;
  27. uint minutes;
  28. if (!Enum.TryParse(_cfg.GetCVar(CCVars.RoleBanDefaultSeverity), out NoteSeverity severity))
  29. {
  30. Logger.WarningS("admin.role_ban", "Role ban severity could not be parsed from config! Defaulting to medium.");
  31. severity = NoteSeverity.Medium;
  32. }
  33. switch (args.Length)
  34. {
  35. case 3:
  36. target = args[0];
  37. job = args[1];
  38. reason = args[2];
  39. minutes = 0;
  40. break;
  41. case 4:
  42. target = args[0];
  43. job = args[1];
  44. reason = args[2];
  45. if (!uint.TryParse(args[3], out minutes))
  46. {
  47. shell.WriteError(Loc.GetString("cmd-roleban-minutes-parse", ("time", args[3]), ("help", Help)));
  48. return;
  49. }
  50. break;
  51. case 5:
  52. target = args[0];
  53. job = args[1];
  54. reason = args[2];
  55. if (!uint.TryParse(args[3], out minutes))
  56. {
  57. shell.WriteError(Loc.GetString("cmd-roleban-minutes-parse", ("time", args[3]), ("help", Help)));
  58. return;
  59. }
  60. if (!Enum.TryParse(args[4], ignoreCase: true, out severity))
  61. {
  62. shell.WriteLine(Loc.GetString("cmd-roleban-severity-parse", ("severity", args[4]), ("help", Help)));
  63. return;
  64. }
  65. break;
  66. default:
  67. shell.WriteError(Loc.GetString("cmd-roleban-arg-count"));
  68. shell.WriteLine(Help);
  69. return;
  70. }
  71. if (!_proto.HasIndex<JobPrototype>(job))
  72. {
  73. shell.WriteError(Loc.GetString("cmd-roleban-job-parse",("job", job)));
  74. return;
  75. }
  76. var located = await _locator.LookupIdByNameOrIdAsync(target);
  77. if (located == null)
  78. {
  79. shell.WriteError(Loc.GetString("cmd-roleban-name-parse"));
  80. return;
  81. }
  82. var targetUid = located.UserId;
  83. var targetHWid = located.LastHWId;
  84. _bans.CreateRoleBan(targetUid, located.Username, shell.Player?.UserId, null, targetHWid, job, minutes, severity, reason, DateTimeOffset.UtcNow);
  85. }
  86. public CompletionResult GetCompletion(IConsoleShell shell, string[] args)
  87. {
  88. var durOpts = new CompletionOption[]
  89. {
  90. new("0", Loc.GetString("cmd-roleban-hint-duration-1")),
  91. new("1440", Loc.GetString("cmd-roleban-hint-duration-2")),
  92. new("4320", Loc.GetString("cmd-roleban-hint-duration-3")),
  93. new("10080", Loc.GetString("cmd-roleban-hint-duration-4")),
  94. new("20160", Loc.GetString("cmd-roleban-hint-duration-5")),
  95. new("43800", Loc.GetString("cmd-roleban-hint-duration-6")),
  96. };
  97. var severities = new CompletionOption[]
  98. {
  99. new("none", Loc.GetString("admin-note-editor-severity-none")),
  100. new("minor", Loc.GetString("admin-note-editor-severity-low")),
  101. new("medium", Loc.GetString("admin-note-editor-severity-medium")),
  102. new("high", Loc.GetString("admin-note-editor-severity-high")),
  103. };
  104. return args.Length switch
  105. {
  106. 1 => CompletionResult.FromHintOptions(CompletionHelper.SessionNames(),
  107. Loc.GetString("cmd-roleban-hint-1")),
  108. 2 => CompletionResult.FromHintOptions(CompletionHelper.PrototypeIDs<JobPrototype>(),
  109. Loc.GetString("cmd-roleban-hint-2")),
  110. 3 => CompletionResult.FromHint(Loc.GetString("cmd-roleban-hint-3")),
  111. 4 => CompletionResult.FromHintOptions(durOpts, Loc.GetString("cmd-roleban-hint-4")),
  112. 5 => CompletionResult.FromHintOptions(severities, Loc.GetString("cmd-roleban-hint-5")),
  113. _ => CompletionResult.Empty
  114. };
  115. }
  116. }