Add department bans (#11085)

* Add department bans

Also localised some stuff while I was there.

* loc
This commit is contained in:
metalgearsloth
2022-09-09 08:06:21 +10:00
committed by GitHub
parent 6f5e22a999
commit 72bc05e3ac
4 changed files with 107 additions and 12 deletions

View File

@@ -0,0 +1,85 @@
using Content.Server.Administration.Managers;
using Content.Shared.Administration;
using Content.Shared.Roles;
using Robust.Shared.Console;
using Robust.Shared.Prototypes;
namespace Content.Server.Administration.Commands;
[AdminCommand(AdminFlags.Ban)]
public sealed class DepartmentBanCommand : IConsoleCommand
{
public string Command => "departmentban";
public string Description => Loc.GetString("cmd-departmentban-desc");
public string Help => Loc.GetString("cmd-departmentban-help");
public async void Execute(IConsoleShell shell, string argStr, string[] args)
{
string target;
string department;
string reason;
uint minutes;
switch (args.Length)
{
case 3:
target = args[0];
department = args[1];
reason = args[2];
minutes = 0;
break;
case 4:
target = args[0];
department = args[1];
reason = args[2];
if (!uint.TryParse(args[3], out minutes))
{
shell.WriteError(Loc.GetString("cmd-roleban-minutes-parse", ("time", args[3]), ("help", Help)));
return;
}
break;
default:
shell.WriteError(Loc.GetString("cmd-roleban-arg-count"));
shell.WriteLine(Help);
return;
}
var protoManager = IoCManager.Resolve<IPrototypeManager>();
if (!protoManager.TryIndex<DepartmentPrototype>(department, out var departmentProto))
{
return;
}
var banManager = IoCManager.Resolve<RoleBanManager>();
foreach (var job in departmentProto.Roles)
{
banManager.CreateJobBan(shell, target, job, reason, minutes);
}
}
public CompletionResult GetCompletion(IConsoleShell shell, string[] args)
{
var durOpts = new CompletionOption[]
{
new("0", Loc.GetString("cmd-roleban-hint-duration-1")),
new("1440", Loc.GetString("cmd-roleban-hint-duration-2")),
new("10080", Loc.GetString("cmd-roleban-hint-duration-3")),
};
return args.Length switch
{
1 => CompletionResult.FromHintOptions(CompletionHelper.SessionNames(),
Loc.GetString("cmd-roleban-hint-1")),
2 => CompletionResult.FromHintOptions(CompletionHelper.PrototypeIDs<DepartmentPrototype>(),
Loc.GetString("cmd-roleban-hint-2")),
3 => CompletionResult.FromHint(Loc.GetString("cmd-roleban-hint-3")),
4 => CompletionResult.FromHintOptions(durOpts, Loc.GetString("cmd-roleban-hint-4")),
_ => CompletionResult.Empty
};
}
}

View File

@@ -38,13 +38,13 @@ public sealed class RoleBanCommand : IConsoleCommand
if (!uint.TryParse(args[3], out minutes))
{
shell.WriteLine($"{args[3]} is not a valid amount of minutes.\n{Help}");
shell.WriteError(Loc.GetString("cmd-roleban-minutes-parse", ("time", args[3]), ("help", Help)));
return;
}
break;
default:
shell.WriteLine($"Invalid amount of arguments.");
shell.WriteError(Loc.GetString("cmd-roleban-arg-count"));
shell.WriteLine(Help);
return;
}

View File

@@ -102,7 +102,7 @@ public sealed class RoleBanManager
{
if (!_prototypeManager.TryIndex(job, out JobPrototype? _))
{
shell.WriteLine($"Job {job} does not exist.");
shell.WriteError(Loc.GetString("cmd-roleban-job-parse", ("job", job)));
return;
}
@@ -127,7 +127,7 @@ public sealed class RoleBanManager
var located = await _playerLocator.LookupIdByNameOrIdAsync(target);
if (located == null)
{
shell.WriteError("Unable to find a player with that name.");
shell.WriteError(Loc.GetString("cmd-roleban-name-parse"));
return;
}
@@ -167,17 +167,12 @@ public sealed class RoleBanManager
if (!await AddRoleBan(banDef))
{
shell.WriteLine($"{target} already has a role ban for {role}");
shell.WriteLine(Loc.GetString("cmd-roleban-existing", ("target", target), ("role", role)));
return;
}
var response = new StringBuilder($"Role banned {target} with reason \"{reason}\"");
response.Append(expires == null ?
" permanently."
: $" until {expires}");
shell.WriteLine(response.ToString());
var length = expires == null ? Loc.GetString("cmd-roleban-inf") : Loc.GetString("cmd-roleban-until", ("expires", expires));
shell.WriteLine(Loc.GetString("cmd-roleban-success", ("target", target), ("role", role), ("reason", reason), ("length", length)));
}
#endregion
}

View File

@@ -31,3 +31,18 @@ cmd-rolebanlist-help = Usage: <name or user ID> [include unbanned]
## Completion result hints
cmd-rolebanlist-hint-1 = <name or user ID>
cmd-rolebanlist-hint-2 = [include unbanned]
cmd-roleban-minutes-parse = {$time} is not a valid amount of minutes.\n{$help}
cmd-roleban-arg-count = Invalid amount of arguments.
cmd-roleban-job-parse = Job {$job} does not exist.
cmd-roleban-name-parse = Unable to find a player with that name.
cmd-roleban-existing = {$target} already has a role ban for {$role}.
cmd-roleban-success = Role banned {$target} from {$role} with reason {$reason} {$length}.
cmd-roleban-inf = permanently
cmd-roleban-until = until {$expires}
# Department bans
cmd-departmentban-desc = Bans a player from the roles comprising a department
cmd-departmentban-help = Usage: departmentban <name or user ID> <department> <reason> [duration in minutes, leave out or 0 for permanent ban]