1
0

BanCommand.cs 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. using System.Linq;
  2. using Content.Server.Administration.Managers;
  3. using Content.Shared.Administration;
  4. using Content.Shared.CCVar;
  5. using Content.Shared.Database;
  6. using Robust.Server.Player;
  7. using Robust.Shared.Configuration;
  8. using Robust.Shared.Console;
  9. namespace Content.Server.Administration.Commands;
  10. [AdminCommand(AdminFlags.Ban)]
  11. public sealed class BanCommand : LocalizedCommands
  12. {
  13. [Dependency] private readonly IPlayerLocator _locator = default!;
  14. [Dependency] private readonly IBanManager _bans = default!;
  15. [Dependency] private readonly IConfigurationManager _cfg = default!;
  16. [Dependency] private readonly IPlayerManager _playerManager = default!;
  17. [Dependency] private readonly ILogManager _logManager = default!;
  18. public override string Command => "ban";
  19. public override async void Execute(IConsoleShell shell, string argStr, string[] args)
  20. {
  21. string target;
  22. string reason;
  23. uint minutes;
  24. if (!Enum.TryParse(_cfg.GetCVar(CCVars.ServerBanDefaultSeverity), out NoteSeverity severity))
  25. {
  26. _logManager.GetSawmill("admin.server_ban")
  27. .Warning("Server ban severity could not be parsed from config! Defaulting to high.");
  28. severity = NoteSeverity.High;
  29. }
  30. switch (args.Length)
  31. {
  32. case 2:
  33. target = args[0];
  34. reason = args[1];
  35. minutes = 0;
  36. break;
  37. case 3:
  38. target = args[0];
  39. reason = args[1];
  40. if (!uint.TryParse(args[2], out minutes))
  41. {
  42. shell.WriteLine(Loc.GetString("cmd-ban-invalid-minutes", ("minutes", args[2])));
  43. shell.WriteLine(Help);
  44. return;
  45. }
  46. break;
  47. case 4:
  48. target = args[0];
  49. reason = args[1];
  50. if (!uint.TryParse(args[2], out minutes))
  51. {
  52. shell.WriteLine(Loc.GetString("cmd-ban-invalid-minutes", ("minutes", args[2])));
  53. shell.WriteLine(Help);
  54. return;
  55. }
  56. if (!Enum.TryParse(args[3], ignoreCase: true, out severity))
  57. {
  58. shell.WriteLine(Loc.GetString("cmd-ban-invalid-severity", ("severity", args[3])));
  59. shell.WriteLine(Help);
  60. return;
  61. }
  62. break;
  63. default:
  64. shell.WriteLine(Loc.GetString("cmd-ban-invalid-arguments"));
  65. shell.WriteLine(Help);
  66. return;
  67. }
  68. var located = await _locator.LookupIdByNameOrIdAsync(target);
  69. var player = shell.Player;
  70. if (located == null)
  71. {
  72. shell.WriteError(Loc.GetString("cmd-ban-player"));
  73. return;
  74. }
  75. var targetUid = located.UserId;
  76. var targetHWid = located.LastHWId;
  77. _bans.CreateServerBan(targetUid, target, player?.UserId, null, targetHWid, minutes, severity, reason);
  78. }
  79. public override CompletionResult GetCompletion(IConsoleShell shell, string[] args)
  80. {
  81. if (args.Length == 1)
  82. {
  83. var options = _playerManager.Sessions.Select(c => c.Name).OrderBy(c => c).ToArray();
  84. return CompletionResult.FromHintOptions(options, LocalizationManager.GetString("cmd-ban-hint"));
  85. }
  86. if (args.Length == 2)
  87. return CompletionResult.FromHint(LocalizationManager.GetString("cmd-ban-hint-reason"));
  88. if (args.Length == 3)
  89. {
  90. var durations = new CompletionOption[]
  91. {
  92. new("0", LocalizationManager.GetString("cmd-ban-hint-duration-1")),
  93. new("1440", LocalizationManager.GetString("cmd-ban-hint-duration-2")),
  94. new("4320", LocalizationManager.GetString("cmd-ban-hint-duration-3")),
  95. new("10080", LocalizationManager.GetString("cmd-ban-hint-duration-4")),
  96. new("20160", LocalizationManager.GetString("cmd-ban-hint-duration-5")),
  97. new("43800", LocalizationManager.GetString("cmd-ban-hint-duration-6")),
  98. };
  99. return CompletionResult.FromHintOptions(durations, LocalizationManager.GetString("cmd-ban-hint-duration"));
  100. }
  101. if (args.Length == 4)
  102. {
  103. var severities = new CompletionOption[]
  104. {
  105. new("none", Loc.GetString("admin-note-editor-severity-none")),
  106. new("minor", Loc.GetString("admin-note-editor-severity-low")),
  107. new("medium", Loc.GetString("admin-note-editor-severity-medium")),
  108. new("high", Loc.GetString("admin-note-editor-severity-high")),
  109. };
  110. return CompletionResult.FromHintOptions(severities, Loc.GetString("cmd-ban-hint-severity"));
  111. }
  112. return CompletionResult.Empty;
  113. }
  114. }