[feat] Разделение банов по серверам.

# Conflicts:
#	Content.Client/Administration/UI/BanList/BanListLine.xaml.cs
#	Content.Client/Administration/UI/BanList/Bans/BanListHeader.xaml
#	Content.Client/Administration/UI/BanList/Bans/BanListLine.xaml
#	Content.Client/Administration/UI/Tabs/AdminTab/BanWindow.xaml
#	Content.Client/Administration/UI/Tabs/AdminTab/BanWindow.xaml.cs
#	Content.IntegrationTests/Tests/Commands/PardonCommand.cs
#	Content.Server/Administration/Commands/BanCommand.cs
#	Content.Server/Administration/Commands/DepartmentBanCommand.cs
#	Content.Server/Administration/Commands/RoleBanCommand.cs
#	Content.Server/Administration/Managers/RoleBanManager.cs
#	Content.Server/Database/ServerDbManager.cs
#	Content.Server/Database/ServerDbPostgres.cs
#	Content.Server/Database/ServerDbSqlite.cs
This commit is contained in:
rhailrake
2023-04-30 14:27:27 +06:00
committed by Remuchi
parent 8bd6754472
commit 977e075086
42 changed files with 5825 additions and 328 deletions

View File

@@ -78,7 +78,8 @@ public sealed class BanListEui : BaseEui
ban.BanningAdmin == null
? null
: (await _playerLocator.LookupIdAsync(ban.BanningAdmin.Value))?.Username,
unban
unban,
ban.ServerName
));
}
}
@@ -110,7 +111,8 @@ public sealed class BanListEui : BaseEui
? null
: (await _playerLocator.LookupIdAsync(ban.BanningAdmin.Value))?.Username,
unban,
ban.Role
ban.Role,
ban.ServerName ?? "unknown"
));
}
}

View File

@@ -52,7 +52,7 @@ public sealed class BanPanelEui : BaseEui
switch (msg)
{
case BanPanelEuiStateMsg.CreateBanRequest r:
BanPlayer(r.Player, r.IpAddress, r.UseLastIp, r.Hwid?.ToImmutableArray(), r.UseLastHwid, r.Minutes, r.Severity, r.Reason, r.Roles, r.Erase);
BanPlayer(r.Player, r.IpAddress, r.UseLastIp, r.Hwid?.ToImmutableArray(), r.UseLastHwid, r.Minutes, r.Severity, r.Reason, r.Erase, r.IsGlobalBan);
break;
case BanPanelEuiStateMsg.GetPlayerInfoRequest r:
ChangePlayer(r.PlayerUsername);
@@ -60,13 +60,14 @@ public sealed class BanPanelEui : BaseEui
}
}
private async void BanPlayer(string? target, string? ipAddressString, bool useLastIp, ImmutableArray<byte>? hwid, bool useLastHwid, uint minutes, NoteSeverity severity, string reason, IReadOnlyCollection<string>? roles, bool erase)
private async void BanPlayer(string? target, string? ipAddressString, bool useLastIp, ImmutableArray<byte>? hwid, bool useLastHwid, uint minutes, NoteSeverity severity, string reason, bool erase, bool isGlobalBan)
{
if (!_admins.HasAdminFlag(Player, AdminFlags.Ban))
{
_sawmill.Warning($"{Player.Name} ({Player.UserId}) tried to create a ban with no ban flag");
return;
}
if (target == null && string.IsNullOrWhiteSpace(ipAddressString) && hwid == null)
{
_chat.DispatchServerMessage(Player, Loc.GetString("ban-panel-no-data"));
@@ -119,21 +120,7 @@ public sealed class BanPanelEui : BaseEui
targetHWid = useLastHwid ? located.LastHWId : hwid;
}
if (roles?.Count > 0)
{
var now = DateTimeOffset.UtcNow;
foreach (var role in roles)
{
_banManager.CreateRoleBan(targetUid, target, Player.UserId, addressRange, targetHWid, role, minutes, severity, reason, now);
}
Close();
return;
}
if (erase &&
targetUid != null &&
_playerManager.TryGetSessionById(targetUid.Value, out var targetPlayer))
if (erase && targetUid != null && _playerManager.TryGetSessionById(targetUid.Value, out var targetPlayer))
{
try
{
@@ -146,7 +133,7 @@ public sealed class BanPanelEui : BaseEui
}
}
_banManager.CreateServerBan(targetUid, target, Player.UserId, addressRange, targetHWid, minutes, severity, reason);
_banManager.CreateServerBan(targetUid, target, Player.UserId, addressRange, targetHWid, minutes, severity, reason, isGlobalBan);
Close();
}

View File

@@ -7,13 +7,11 @@ using Robust.Server.Player;
using Robust.Shared.Configuration;
using Robust.Shared.Console;
namespace Content.Server.Administration.Commands;
[AdminCommand(AdminFlags.Ban)]
public sealed class BanCommand : LocalizedCommands
{
[Dependency] private readonly IPlayerLocator _locator = default!;
[Dependency] private readonly IBanManager _bans = default!;
[Dependency] private readonly IConfigurationManager _cfg = default!;
@@ -23,26 +21,24 @@ public sealed class BanCommand : LocalizedCommands
public override async void Execute(IConsoleShell shell, string argStr, string[] args)
{
string target;
string reason;
uint minutes;
var target = args[0];
var reason = args[1];
var minutes = 0u;
var isGlobalBan = false;
if (!Enum.TryParse(_cfg.GetCVar(CCVars.ServerBanDefaultSeverity), out NoteSeverity severity))
{
Logger.WarningS("admin.server_ban", "Server ban severity could not be parsed from config! Defaulting to high.");
Logger.WarningS("admin.server_ban",
"Server ban severity could not be parsed from config! Defaulting to high.");
severity = NoteSeverity.High;
}
switch (args.Length)
{
case 2:
target = args[0];
reason = args[1];
minutes = 0;
break;
case 3:
target = args[0];
reason = args[1];
if (!uint.TryParse(args[2], out minutes))
{
shell.WriteLine(Loc.GetString("cmd-ban-invalid-minutes", ("minutes", args[2])));
@@ -52,8 +48,6 @@ public sealed class BanCommand : LocalizedCommands
break;
case 4:
target = args[0];
reason = args[1];
if (!uint.TryParse(args[2], out minutes))
{
@@ -69,6 +63,29 @@ public sealed class BanCommand : LocalizedCommands
return;
}
break;
case 5:
if (!uint.TryParse(args[2], out minutes))
{
shell.WriteLine(Loc.GetString("cmd-ban-invalid-minutes", ("minutes", args[2])));
shell.WriteLine(Help);
return;
}
if (!Enum.TryParse(args[3], ignoreCase: true, out severity))
{
shell.WriteLine(Loc.GetString("cmd-ban-invalid-severity", ("severity", args[3])));
shell.WriteLine(Help);
return;
}
if (!bool.TryParse(args[4], out isGlobalBan))
{
shell.WriteLine(Loc.GetString($"{args[4]} should be True or False.\n{Help}"));
shell.WriteLine(Help);
return;
}
break;
default:
shell.WriteLine(Loc.GetString("cmd-ban-invalid-arguments"));
@@ -88,48 +105,38 @@ public sealed class BanCommand : LocalizedCommands
var targetUid = located.UserId;
var targetHWid = located.LastHWId;
_bans.CreateServerBan(targetUid, target, player?.UserId, null, targetHWid, minutes, severity, reason);
_bans.CreateServerBan(targetUid, target, player?.UserId, null, targetHWid, minutes, severity, reason, isGlobalBan);
}
public override CompletionResult GetCompletion(IConsoleShell shell, string[] args)
{
if (args.Length == 1)
var durations = new CompletionOption[]
{
var options = _playerManager.Sessions.Select(c => c.Name).OrderBy(c => c).ToArray();
return CompletionResult.FromHintOptions(options, LocalizationManager.GetString("cmd-ban-hint"));
}
new("0", LocalizationManager.GetString("cmd-ban-hint-duration-1")),
new("1440", LocalizationManager.GetString("cmd-ban-hint-duration-2")),
new("4320", LocalizationManager.GetString("cmd-ban-hint-duration-3")),
new("10080", LocalizationManager.GetString("cmd-ban-hint-duration-4")),
new("20160", LocalizationManager.GetString("cmd-ban-hint-duration-5")),
new("43800", LocalizationManager.GetString("cmd-ban-hint-duration-6")),
};
if (args.Length == 2)
return CompletionResult.FromHint(LocalizationManager.GetString("cmd-ban-hint-reason"));
if (args.Length == 3)
var severities = new CompletionOption[]
{
var durations = new CompletionOption[]
{
new("0", LocalizationManager.GetString("cmd-ban-hint-duration-1")),
new("1440", LocalizationManager.GetString("cmd-ban-hint-duration-2")),
new("4320", LocalizationManager.GetString("cmd-ban-hint-duration-3")),
new("10080", LocalizationManager.GetString("cmd-ban-hint-duration-4")),
new("20160", LocalizationManager.GetString("cmd-ban-hint-duration-5")),
new("43800", LocalizationManager.GetString("cmd-ban-hint-duration-6")),
};
new("none", Loc.GetString("admin-note-editor-severity-none")),
new("minor", Loc.GetString("admin-note-editor-severity-low")),
new("medium", Loc.GetString("admin-note-editor-severity-medium")),
new("high", Loc.GetString("admin-note-editor-severity-high")),
};
return CompletionResult.FromHintOptions(durations, LocalizationManager.GetString("cmd-ban-hint-duration"));
}
if (args.Length == 4)
return args.Length switch
{
var severities = new CompletionOption[]
{
new("none", Loc.GetString("admin-note-editor-severity-none")),
new("minor", Loc.GetString("admin-note-editor-severity-low")),
new("medium", Loc.GetString("admin-note-editor-severity-medium")),
new("high", Loc.GetString("admin-note-editor-severity-high")),
};
return CompletionResult.FromHintOptions(severities, Loc.GetString("cmd-ban-hint-severity"));
}
return CompletionResult.Empty;
1 => CompletionResult.FromHintOptions(CompletionHelper.SessionNames(),
LocalizationManager.GetString("cmd-ban-hint")),
2 => CompletionResult.FromHint(LocalizationManager.GetString("cmd-ban-hint-reason")),
3 => CompletionResult.FromHintOptions(durations, LocalizationManager.GetString("cmd-ban-hint-duration")),
4 => CompletionResult.FromHintOptions(severities, Loc.GetString("cmd-ban-hint-severity")),
_ => args.Length == 5 ? CompletionResult.FromHint("<server>") : CompletionResult.Empty
};
}
}

View File

@@ -3,7 +3,9 @@ using Content.Server.Administration.BanList;
using Content.Server.Database;
using Content.Server.EUI;
using Content.Shared.Administration;
using Content.Shared.CCVar;
using Robust.Server.Player;
using Robust.Shared.Configuration;
using Robust.Shared.Console;
namespace Content.Server.Administration.Commands;
@@ -17,11 +19,13 @@ public sealed class BanListCommand : LocalizedCommands
[Dependency] private readonly IServerDbManager _dbManager = default!;
[Dependency] private readonly EuiManager _eui = default!;
[Dependency] private readonly IPlayerLocator _locator = default!;
[Dependency] private readonly IConfigurationManager _cfg = default!;
public override string Command => "banlist";
public override async void Execute(IConsoleShell shell, string argStr, string[] args)
{
var serverName = _cfg.GetCVar(CCVars.AdminLogsServerName);
if (args.Length != 1)
{
shell.WriteError(Help);
@@ -38,7 +42,7 @@ public sealed class BanListCommand : LocalizedCommands
if (shell.Player is not { } player)
{
var bans = await _dbManager.GetServerBansAsync(data.LastAddress, data.UserId, data.LastHWId, false);
var bans = await _dbManager.GetServerBansAsync(data.LastAddress, data.UserId, data.LastHWId, false, serverName);
if (bans.Count == 0)
{
@@ -48,7 +52,7 @@ public sealed class BanListCommand : LocalizedCommands
foreach (var ban in bans)
{
var msg = $"{ban.Id}: {ban.Reason}";
var msg = $"{ban.Id}: {ban.Reason} ({ban.ServerName})";
shell.WriteLine(msg);
}

View File

@@ -23,10 +23,12 @@ public sealed class DepartmentBanCommand : IConsoleCommand
public async void Execute(IConsoleShell shell, string argStr, string[] args)
{
string target;
string department;
string reason;
uint minutes;
var target = args[0];
var department = args[1];
var reason = args[2];
var minutes = 0u;
var isGlobalBan = false;
if (!Enum.TryParse(_cfg.GetCVar(CCVars.DepartmentBanDefaultSeverity), out NoteSeverity severity))
{
Logger.WarningS("admin.department_ban", "Department ban severity could not be parsed from config! Defaulting to medium.");
@@ -36,28 +38,28 @@ public sealed class DepartmentBanCommand : IConsoleCommand
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;
case 5:
if (!uint.TryParse(args[3], out minutes))
{
shell.WriteError(Loc.GetString("cmd-roleban-minutes-parse", ("time", args[3]), ("help", Help)));
return;
}
if (!Enum.TryParse(args[4], ignoreCase: true, out severity))
{
shell.WriteLine(Loc.GetString("cmd-roleban-severity-parse", ("severity", args[4]), ("help", Help)));
return;
}
break;
case 5:
target = args[0];
department = args[1];
reason = args[2];
case 6:
if (!uint.TryParse(args[3], out minutes))
{
shell.WriteError(Loc.GetString("cmd-roleban-minutes-parse", ("time", args[3]), ("help", Help)));
@@ -70,6 +72,11 @@ public sealed class DepartmentBanCommand : IConsoleCommand
return;
}
if (!bool.TryParse(args[5], out isGlobalBan))
{
shell.WriteLine($"{args[5]} should be True or False.\n{Help}");
return;
}
break;
default:
shell.WriteError(Loc.GetString("cmd-roleban-arg-count"));
@@ -97,7 +104,7 @@ public sealed class DepartmentBanCommand : IConsoleCommand
var now = DateTimeOffset.UtcNow;
foreach (var job in departmentProto.Roles)
{
_banManager.CreateRoleBan(targetUid, located.Username, shell.Player?.UserId, null, targetHWid, job, minutes, severity, reason, now);
_banManager.CreateRoleBan(targetUid, located.Username, shell.Player?.UserId, null, targetHWid, job, minutes, severity, reason, now, isGlobalBan);
}
}
@@ -130,6 +137,7 @@ public sealed class DepartmentBanCommand : IConsoleCommand
3 => CompletionResult.FromHint(Loc.GetString("cmd-roleban-hint-3")),
4 => CompletionResult.FromHintOptions(durOpts, Loc.GetString("cmd-roleban-hint-4")),
5 => CompletionResult.FromHintOptions(severities, Loc.GetString("cmd-roleban-hint-5")),
6 => CompletionResult.FromHint("<server>"),
_ => CompletionResult.Empty
};
}

View File

@@ -1,12 +1,11 @@
using System.Linq;
using System.Text;
using Content.Server.Administration.Managers;
using Content.Server.Administration.Managers;
using Content.Shared.Administration;
using Content.Shared.CCVar;
using Content.Shared.Database;
using Content.Shared.Roles;
using Robust.Shared.Configuration;
using Robust.Shared.Console;
namespace Content.Server.Administration.Commands;
[AdminCommand(AdminFlags.Ban)]
@@ -22,10 +21,11 @@ public sealed class RoleBanCommand : IConsoleCommand
public async void Execute(IConsoleShell shell, string argStr, string[] args)
{
string target;
string job;
string reason;
uint minutes;
var target = args[0];
var job = args[1];
var reason = args[2];
var minutes = 0u;
var isGlobalBan = false;
if (!Enum.TryParse(_cfg.GetCVar(CCVars.RoleBanDefaultSeverity), out NoteSeverity severity))
{
Logger.WarningS("admin.role_ban", "Role ban severity could not be parsed from config! Defaulting to medium.");
@@ -35,16 +35,8 @@ public sealed class RoleBanCommand : IConsoleCommand
switch (args.Length)
{
case 3:
target = args[0];
job = args[1];
reason = args[2];
minutes = 0;
break;
case 4:
target = args[0];
job = 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)));
@@ -53,22 +45,33 @@ public sealed class RoleBanCommand : IConsoleCommand
break;
case 5:
target = args[0];
job = 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;
}
if (!Enum.TryParse(args[4], ignoreCase: true, out severity))
{
shell.WriteLine(Loc.GetString("cmd-roleban-severity-parse", ("severity", args[4]), ("help", Help)));
return;
}
break;
case 6:
if (!uint.TryParse(args[3], out minutes))
{
shell.WriteError(Loc.GetString("cmd-roleban-minutes-parse", ("time", args[3]), ("help", Help)));
return;
}
if (!Enum.TryParse(args[4], ignoreCase: true, out severity))
{
shell.WriteLine(Loc.GetString("cmd-roleban-severity-parse", ("severity", args[4]), ("help", Help)));
return;
}
if (!bool.TryParse(args[5], out isGlobalBan))
{
shell.WriteLine($"{args[5]} should be True or False.\n{Help}");
return;
}
break;
default:
shell.WriteError(Loc.GetString("cmd-roleban-arg-count"));
@@ -85,8 +88,7 @@ public sealed class RoleBanCommand : IConsoleCommand
var targetUid = located.UserId;
var targetHWid = located.LastHWId;
_bans.CreateRoleBan(targetUid, located.Username, shell.Player?.UserId, null, targetHWid, job, minutes, severity, reason, DateTimeOffset.UtcNow);
_bans.CreateRoleBan(targetUid, located.Username, shell.Player?.UserId, null, targetHWid, job, minutes, severity, reason, DateTimeOffset.UtcNow, isGlobalBan);
}
public CompletionResult GetCompletion(IConsoleShell shell, string[] args)
@@ -118,6 +120,7 @@ public sealed class RoleBanCommand : IConsoleCommand
3 => CompletionResult.FromHint(Loc.GetString("cmd-roleban-hint-3")),
4 => CompletionResult.FromHintOptions(durOpts, Loc.GetString("cmd-roleban-hint-4")),
5 => CompletionResult.FromHintOptions(severities, Loc.GetString("cmd-roleban-hint-5")),
6 => CompletionResult.FromHint("<server>"),
_ => CompletionResult.Empty
};
}

View File

@@ -374,6 +374,15 @@ namespace Content.Server.Administration.Managers
Flags = flags
};
var currentServerName = _cfg.GetCVar(CCVars.AdminLogsServerName);
// я ебался в зад, поймите
if (!data.HasFlag(AdminFlags.Permissions) && !data.HasFlag(AdminFlags.Host) &&
dbData.AdminServer != null && dbData.AdminServer != "unknown" && currentServerName != "unknown"
&& currentServerName != dbData.AdminServer)
{
return null;
}
if (dbData.Title != null)
{
data.Title = dbData.Title;

View File

@@ -37,6 +37,7 @@ public sealed class BanManager : IBanManager, IPostInjectInit
public const string SawmillId = "admin.bans";
public const string JobPrefix = "Job:";
public const string UnknownServer = "unknown";
private readonly Dictionary<NetUserId, HashSet<ServerRoleBanDef>> _cachedRoleBans = new();
@@ -52,7 +53,7 @@ public sealed class BanManager : IBanManager, IPostInjectInit
if (e.NewStatus != SessionStatus.Connected || _cachedRoleBans.ContainsKey(e.Session.UserId))
return;
var netChannel = e.Session.ConnectedClient;
var netChannel = e.Session.Channel;
ImmutableArray<byte>? hwId = netChannel.UserData.HWId.Length == 0 ? null : netChannel.UserData.HWId;
await CacheDbRoleBans(e.Session.UserId, netChannel.RemoteEndPoint.Address, hwId);
@@ -112,7 +113,7 @@ public sealed class BanManager : IBanManager, IPostInjectInit
}
#region Server Bans
public async void CreateServerBan(NetUserId? target, string? targetUsername, NetUserId? banningAdmin, (IPAddress, int)? addressRange, ImmutableArray<byte>? hwid, uint? minutes, NoteSeverity severity, string reason)
public async void CreateServerBan(NetUserId? target, string? targetUsername, NetUserId? banningAdmin, (IPAddress, int)? addressRange, ImmutableArray<byte>? hwid, uint? minutes, NoteSeverity severity, string reason, bool isGlobalBan)
{
DateTimeOffset? expires = null;
if (minutes > 0)
@@ -120,6 +121,13 @@ public sealed class BanManager : IBanManager, IPostInjectInit
expires = DateTimeOffset.Now + TimeSpan.FromMinutes(minutes.Value);
}
var serverName = _cfg.GetCVar(CCVars.AdminLogsServerName);
if (isGlobalBan)
{
serverName = UnknownServer;
}
_systems.TryGetEntitySystem<GameTicker>(out var ticker);
int? roundId = ticker == null || ticker.RoundId == 0 ? null : ticker.RoundId;
var playtime = target == null ? TimeSpan.Zero : (await _db.GetPlayTimes(target.Value)).Find(p => p.Tracker == PlayTimeTrackingShared.TrackerOverall)?.TimeSpent ?? TimeSpan.Zero;
@@ -136,7 +144,8 @@ public sealed class BanManager : IBanManager, IPostInjectInit
reason,
severity,
banningAdmin,
null);
null,
serverName);
await _db.AddServerBanAsync(banDef);
var adminName = banningAdmin == null
@@ -175,14 +184,14 @@ public sealed class BanManager : IBanManager, IPostInjectInit
return;
// If they are, kick them
var message = banDef.FormatBanMessage(_cfg, _localizationManager);
targetPlayer.ConnectedClient.Disconnect(message);
targetPlayer.Channel.Disconnect(message);
}
#endregion
#region Job Bans
// If you are trying to remove timeOfBan, please don't. It's there because the note system groups role bans by time, reason and banning admin.
// Removing it will clutter the note list. Please also make sure that department bans are applied to roles with the same DateTimeOffset.
public async void CreateRoleBan(NetUserId? target, string? targetUsername, NetUserId? banningAdmin, (IPAddress, int)? addressRange, ImmutableArray<byte>? hwid, string role, uint? minutes, NoteSeverity severity, string reason, DateTimeOffset timeOfBan)
public async void CreateRoleBan(NetUserId? target, string? targetUsername, NetUserId? banningAdmin, (IPAddress, int)? addressRange, ImmutableArray<byte>? hwid, string role, uint? minutes, NoteSeverity severity, string reason, DateTimeOffset timeOfBan, bool isGlobalBan)
{
if (!_prototypeManager.TryIndex(role, out JobPrototype? _))
{
@@ -196,6 +205,13 @@ public sealed class BanManager : IBanManager, IPostInjectInit
expires = DateTimeOffset.Now + TimeSpan.FromMinutes(minutes.Value);
}
var serverName = _cfg.GetCVar(CCVars.AdminLogsServerName);
if (isGlobalBan)
{
serverName = UnknownServer;
}
_systems.TryGetEntitySystem(out GameTicker? ticker);
int? roundId = ticker == null || ticker.RoundId == 0 ? null : ticker.RoundId;
var playtime = target == null ? TimeSpan.Zero : (await _db.GetPlayTimes(target.Value)).Find(p => p.Tracker == PlayTimeTrackingShared.TrackerOverall)?.TimeSpent ?? TimeSpan.Zero;
@@ -213,7 +229,8 @@ public sealed class BanManager : IBanManager, IPostInjectInit
severity,
banningAdmin,
null,
role);
role,
serverName);
if (!await AddRoleBan(banDef))
{
@@ -293,7 +310,7 @@ public sealed class BanManager : IBanManager, IPostInjectInit
};
_sawmill.Debug($"Sent rolebans to {pSession.Name}");
_netManager.ServerSendMessage(bans, pSession.ConnectedClient);
_netManager.ServerSendMessage(bans, pSession.Channel);
}
public void PostInject()

View File

@@ -22,7 +22,7 @@ public interface IBanManager
/// <param name="minutes">Number of minutes to ban for. 0 and null mean permanent</param>
/// <param name="severity">Severity of the resulting ban note</param>
/// <param name="reason">Reason for the ban</param>
public void CreateServerBan(NetUserId? target, string? targetUsername, NetUserId? banningAdmin, (IPAddress, int)? addressRange, ImmutableArray<byte>? hwid, uint? minutes, NoteSeverity severity, string reason);
public void CreateServerBan(NetUserId? target, string? targetUsername, NetUserId? banningAdmin, (IPAddress, int)? addressRange, ImmutableArray<byte>? hwid, uint? minutes, NoteSeverity severity, string reason, bool isGlobalBan);
public HashSet<string>? GetRoleBans(NetUserId playerUserId);
public HashSet<string>? GetJobBans(NetUserId playerUserId);
@@ -35,7 +35,7 @@ public interface IBanManager
/// <param name="reason">Reason for the ban</param>
/// <param name="minutes">Number of minutes to ban for. 0 and null mean permanent</param>
/// <param name="timeOfBan">Time when the ban was applied, used for grouping role bans</param>
public void CreateRoleBan(NetUserId? target, string? targetUsername, NetUserId? banningAdmin, (IPAddress, int)? addressRange, ImmutableArray<byte>? hwid, string role, uint? minutes, NoteSeverity severity, string reason, DateTimeOffset timeOfBan);
public void CreateRoleBan(NetUserId? target, string? targetUsername, NetUserId? banningAdmin, (IPAddress, int)? addressRange, ImmutableArray<byte>? hwid, string role, uint? minutes, NoteSeverity severity, string reason, DateTimeOffset timeOfBan, bool isGlobalBan);
/// <summary>
/// Pardons a role ban for the specified target, username or GUID

View File

@@ -73,7 +73,8 @@ namespace Content.Server.Administration.UI
Title = p.a.Title,
RankId = p.a.AdminRankId,
UserId = new NetUserId(p.a.UserId),
UserName = p.lastUserName
UserName = p.lastUserName,
AdminServer = p.a.AdminServer
}).ToArray(),
AdminRanks = _adminRanks.ToDictionary(a => a.Id, a => new PermissionsEuiState.AdminRankData
@@ -251,6 +252,7 @@ namespace Content.Server.Administration.UI
admin.Title = ua.Title;
admin.AdminRankId = ua.RankId;
admin.AdminServer = ua.AdminServer;
admin.Flags = GenAdminFlagList(ua.PosFlags, ua.NegFlags);
await _db.UpdateAdminAsync(admin);
@@ -265,8 +267,9 @@ namespace Content.Server.Administration.UI
var name = playerRecord?.LastSeenUserName ?? ua.UserId.ToString();
var title = ua.Title ?? "<no title>";
var flags = AdminFlagsHelper.PosNegFlagsText(ua.PosFlags, ua.NegFlags);
var server = ua.AdminServer ?? "<all servers>";
Logger.InfoS("admin.perms", $"{Player} updated admin {name} to {title}/{rankName}/{flags}");
Logger.InfoS("admin.perms", $"{Player} updated admin {name} to {title}/{rankName}/{flags}/{server}");
if (_playerManager.TryGetSessionById(ua.UserId, out var player))
{
@@ -333,15 +336,17 @@ namespace Content.Server.Administration.UI
Flags = GenAdminFlagList(ca.PosFlags, ca.NegFlags),
AdminRankId = ca.RankId,
UserId = userId.UserId,
Title = ca.Title
Title = ca.Title,
AdminServer = ca.AdminServer
};
await _db.AddAdminAsync(admin);
var title = ca.Title ?? "<no title>";
var flags = AdminFlagsHelper.PosNegFlagsText(ca.PosFlags, ca.NegFlags);
var server = ca.AdminServer ?? "<all servers>";
Logger.InfoS("admin.perms", $"{Player} added admin {name} as {title}/{rankName}/{flags}");
Logger.InfoS("admin.perms", $"{Player} added admin {name} as {title}/{rankName}/{flags}/{server}");
if (_playerManager.TryGetSessionById(userId, out var player))
{