DepartmentBanCommand.cs 5.2 KB

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