Admin notes bugfixes (#18189)

This commit is contained in:
Pieter-Jan Briers
2023-07-21 15:43:47 +02:00
committed by GitHub
parent 703f3d8bc6
commit b4b0fe41db
10 changed files with 51 additions and 52 deletions

View File

@@ -1,4 +1,4 @@
using Content.Shared.Administration.Notes; using Content.Shared.Administration.Notes;
using Content.Shared.Database; using Content.Shared.Database;
using Robust.Client.AutoGenerated; using Robust.Client.AutoGenerated;
using Robust.Client.UserInterface.Controls; using Robust.Client.UserInterface.Controls;
@@ -18,6 +18,7 @@ public sealed partial class AdminNotesLinePopup : Popup
public AdminNotesLinePopup(SharedAdminNote note, string playerName, bool showDelete, bool showEdit) public AdminNotesLinePopup(SharedAdminNote note, string playerName, bool showDelete, bool showEdit)
{ {
IoCManager.InjectDependencies(this);
RobustXamlLoader.Load(this); RobustXamlLoader.Load(this);
NoteId = note.Id; NoteId = note.Id;

View File

@@ -163,7 +163,7 @@ public sealed partial class NoteEdit : FancyWindow
return; return;
if (DeleteResetOn is null) if (DeleteResetOn is null)
{ {
DeleteResetOn = _gameTiming.CurTime.Add(TimeSpan.FromSeconds(3)); DeleteResetOn = _gameTiming.RealTime + TimeSpan.FromSeconds(3);
SubmitButton.Text = Loc.GetString("admin-note-editor-submit-confirm"); SubmitButton.Text = Loc.GetString("admin-note-editor-submit-confirm");
SubmitButton.ModulateSelfOverride = Color.Red; SubmitButton.ModulateSelfOverride = Color.Red;
// Task.Delay(3000).ContinueWith(_ => ResetSubmitButton()); // TODO: fix // Task.Delay(3000).ContinueWith(_ => ResetSubmitButton()); // TODO: fix
@@ -185,7 +185,7 @@ public sealed partial class NoteEdit : FancyWindow
{ {
base.FrameUpdate(args); base.FrameUpdate(args);
// This checks for null for free, do not invert it as null always produces a false value // This checks for null for free, do not invert it as null always produces a false value
if (DeleteResetOn > _gameTiming.CurTime) if (DeleteResetOn < _gameTiming.RealTime)
{ {
ResetSubmitButton(); ResetSubmitButton();
DeleteResetOn = null; DeleteResetOn = null;

View File

@@ -28,10 +28,6 @@ namespace Content.Server.Database.Migrations.Postgres
name: "FK_admin_notes_player_player_user_id", name: "FK_admin_notes_player_player_user_id",
table: "admin_notes"); table: "admin_notes");
migrationBuilder.DropCheckConstraint(
name: "HaveEitherAddressOrUserIdOrHWId",
table: "server_role_ban");
migrationBuilder.DropCheckConstraint( migrationBuilder.DropCheckConstraint(
name: "HaveEitherAddressOrUserIdOrHWId", name: "HaveEitherAddressOrUserIdOrHWId",
table: "server_ban"); table: "server_ban");

View File

@@ -31,6 +31,13 @@ public sealed class BanListEui : BaseEui
_admins.OnPermsChanged += OnPermsChanged; _admins.OnPermsChanged += OnPermsChanged;
} }
public override void Closed()
{
base.Closed();
_admins.OnPermsChanged -= OnPermsChanged;
}
public override EuiStateBase GetNewState() public override EuiStateBase GetNewState()
{ {
return new BanListEuiState(BanListPlayerName, Bans); return new BanListEuiState(BanListPlayerName, Bans);
@@ -42,10 +49,6 @@ public sealed class BanListEui : BaseEui
{ {
Close(); Close();
} }
else
{
StateDirty();
}
} }
private async Task LoadFromDb() private async Task LoadFromDb()

View File

@@ -99,8 +99,6 @@ public sealed class DepartmentBanCommand : IConsoleCommand
{ {
_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);
} }
_banManager.SendRoleBans(located.UserId);
} }
public CompletionResult GetCompletion(IConsoleShell shell, string[] args) public CompletionResult GetCompletion(IConsoleShell shell, string[] args)

View File

@@ -1,4 +1,4 @@
using System.Linq; using System.Linq;
using System.Text; using System.Text;
using Content.Server.Administration.Managers; using Content.Server.Administration.Managers;
using Content.Shared.Administration; using Content.Shared.Administration;
@@ -87,7 +87,6 @@ public sealed class RoleBanCommand : IConsoleCommand
var targetHWid = located.LastHWId; 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);
_bans.SendRoleBans(located.UserId);
} }
public CompletionResult GetCompletion(IConsoleShell shell, string[] args) public CompletionResult GetCompletion(IConsoleShell shell, string[] args)

View File

@@ -40,6 +40,8 @@ public sealed class BanManager : IBanManager, IPostInjectInit
public void Initialize() public void Initialize()
{ {
_playerManager.PlayerStatusChanged += OnPlayerStatusChanged; _playerManager.PlayerStatusChanged += OnPlayerStatusChanged;
_netManager.RegisterNetMessage<MsgRoleBans>();
} }
private async void OnPlayerStatusChanged(object? sender, SessionStatusEventArgs e) private async void OnPlayerStatusChanged(object? sender, SessionStatusEventArgs e)
@@ -212,6 +214,11 @@ public sealed class BanManager : IBanManager, IPostInjectInit
var length = expires == null ? Loc.GetString("cmd-roleban-inf") : Loc.GetString("cmd-roleban-until", ("expires", expires)); var length = expires == null ? Loc.GetString("cmd-roleban-inf") : Loc.GetString("cmd-roleban-until", ("expires", expires));
_chat.SendAdminAlert(Loc.GetString("cmd-roleban-success", ("target", targetUsername ?? "null"), ("role", role), ("reason", reason), ("length", length))); _chat.SendAdminAlert(Loc.GetString("cmd-roleban-success", ("target", targetUsername ?? "null"), ("role", role), ("reason", reason), ("length", length)));
if (target != null)
{
SendRoleBans(target.Value);
}
} }
public HashSet<string>? GetJobBans(NetUserId playerUserId) public HashSet<string>? GetJobBans(NetUserId playerUserId)

View File

@@ -15,7 +15,6 @@
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="JetBrains.Annotations" Version="2022.1.0" PrivateAssets="All" /> <PackageReference Include="JetBrains.Annotations" Version="2022.1.0" PrivateAssets="All" />
<PackageReference Include="System.Linq.Async" Version="6.0.1" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\Content.Packaging\Content.Packaging.csproj" /> <ProjectReference Include="..\Content.Packaging\Content.Packaging.csproj" />

View File

@@ -1304,70 +1304,67 @@ INSERT INTO player_round (players_id, rounds_id) VALUES ({players[player]}, {id}
// You can't group queries, as player will not always exist. When it doesn't, the // You can't group queries, as player will not always exist. When it doesn't, the
// whole query returns nothing // whole query returns nothing
var player = await db.DbContext.Player.SingleOrDefaultAsync(p => p.UserId == user); var player = await db.DbContext.Player.SingleOrDefaultAsync(p => p.UserId == user);
return await (from ban in db.DbContext.Ban var bans = await db.DbContext.Ban
where ban.PlayerUserId == user && .Where(ban => ban.PlayerUserId == user && !ban.Hidden)
!ban.Hidden
select ban)
.Include(ban => ban.Unban) .Include(ban => ban.Unban)
.Include(ban => ban.Round) .Include(ban => ban.Round)
.ThenInclude(r => r!.Server) .ThenInclude(r => r!.Server)
.Include(ban => ban.CreatedBy) .Include(ban => ban.CreatedBy)
.Include(ban => ban.LastEditedBy) .Include(ban => ban.LastEditedBy)
.Include(ban => ban.Unban) .Include(ban => ban.Unban)
.ToAsyncEnumerable() .ToArrayAsync();
.SelectAwait(async ban =>
new ServerBanNote(ban.Id, ban.RoundId, ban.Round, ban.PlayerUserId, player, var banNotes = new List<ServerBanNote>();
ban.PlaytimeAtNote, ban.Reason, ban.Severity, ban.CreatedBy, ban.BanTime, foreach (var ban in bans)
ban.LastEditedBy, ban.LastEditedAt, ban.ExpirationTime, ban.Hidden, {
ban.Unban?.UnbanningAdmin == null var banNote = new ServerBanNote(ban.Id, ban.RoundId, ban.Round, ban.PlayerUserId, player,
? null ban.PlaytimeAtNote, ban.Reason, ban.Severity, ban.CreatedBy, ban.BanTime,
: await db.DbContext.Player.SingleOrDefaultAsync(p => p.UserId == ban.Unban.UnbanningAdmin.Value), ban.LastEditedBy, ban.LastEditedAt, ban.ExpirationTime, ban.Hidden,
ban.Unban?.UnbanTime) ban.Unban?.UnbanningAdmin == null
).ToListAsync(); ? null
: await db.DbContext.Player.SingleOrDefaultAsync(
p => p.UserId == ban.Unban.UnbanningAdmin.Value),
ban.Unban?.UnbanTime);
banNotes.Add(banNote);
}
return banNotes;
} }
protected async Task<List<ServerRoleBanNote>> GetGroupedServerRoleBansAsNotesForUser(DbGuard db, Guid user) protected async Task<List<ServerRoleBanNote>> GetGroupedServerRoleBansAsNotesForUser(DbGuard db, Guid user)
{ {
// Server side query // Server side query
var bansQuery = var bansQuery = await db.DbContext.RoleBan
(from ban in db.DbContext.RoleBan .Where(ban => ban.PlayerUserId == user && !ban.Hidden)
where ban.PlayerUserId == user &&
!ban.Hidden
select ban)
.Include(ban => ban.Unban) .Include(ban => ban.Unban)
.Include(ban => ban.Round) .Include(ban => ban.Round)
.ThenInclude(r => r!.Server) .ThenInclude(r => r!.Server)
.Include(ban => ban.CreatedBy) .Include(ban => ban.CreatedBy)
.Include(ban => ban.LastEditedBy) .Include(ban => ban.LastEditedBy)
.Include(ban => ban.Unban) .Include(ban => ban.Unban)
.ToAsyncEnumerable(); .ToArrayAsync();
// Client side query, as EF can't do groups yet // Client side query, as EF can't do groups yet
var bansEnumerable = var bansEnumerable = bansQuery
(from ban in bansQuery .GroupBy(ban => new { ban.BanTime, ban.CreatedBy, ban.Reason, Unbanned = ban.Unban == null })
group ban by new .Select(banGroup => banGroup)
{ .ToArray();
ban.BanTime,
ban.CreatedBy,
ban.Reason,
Unbanned = ban.Unban == null
}
into banGroup
select banGroup)
.AsAsyncEnumerable();
List<ServerRoleBanNote> bans = new(); List<ServerRoleBanNote> bans = new();
var player = await db.DbContext.Player.SingleOrDefaultAsync(p => p.UserId == user); var player = await db.DbContext.Player.SingleOrDefaultAsync(p => p.UserId == user);
await foreach (var banGroup in bansEnumerable) foreach (var banGroup in bansEnumerable)
{ {
var firstBan = await banGroup.FirstAsync(); var firstBan = banGroup.First();
Player? unbanningAdmin = null; Player? unbanningAdmin = null;
if (firstBan.Unban?.UnbanningAdmin is not null) if (firstBan.Unban?.UnbanningAdmin is not null)
unbanningAdmin = await db.DbContext.Player.SingleOrDefaultAsync(p => p.UserId == firstBan.Unban.UnbanningAdmin.Value); unbanningAdmin = await db.DbContext.Player.SingleOrDefaultAsync(p => p.UserId == firstBan.Unban.UnbanningAdmin.Value);
bans.Add(new ServerRoleBanNote(firstBan.Id, firstBan.RoundId, firstBan.Round, firstBan.PlayerUserId, bans.Add(new ServerRoleBanNote(firstBan.Id, firstBan.RoundId, firstBan.Round, firstBan.PlayerUserId,
player, firstBan.PlaytimeAtNote, firstBan.Reason, firstBan.Severity, firstBan.CreatedBy, player, firstBan.PlaytimeAtNote, firstBan.Reason, firstBan.Severity, firstBan.CreatedBy,
firstBan.BanTime, firstBan.LastEditedBy, firstBan.LastEditedAt, firstBan.ExpirationTime, firstBan.BanTime, firstBan.LastEditedBy, firstBan.LastEditedAt, firstBan.ExpirationTime,
firstBan.Hidden, await banGroup.Select(ban => ban.RoleId.Replace(BanManager.JobPrefix, null)).ToArrayAsync(), firstBan.Hidden, banGroup.Select(ban => ban.RoleId.Replace(BanManager.JobPrefix, null)).ToArray(),
unbanningAdmin, firstBan.Unban?.UnbanTime)); unbanningAdmin, firstBan.Unban?.UnbanTime));
} }

View File

@@ -71,7 +71,6 @@ SERVER_CONTENT_ASSEMBLIES = [
SERVER_EXTRA_ASSEMBLIES = [ SERVER_EXTRA_ASSEMBLIES = [
"Npgsql.", "Npgsql.",
"Microsoft", "Microsoft",
"System.Linq.Async",
] ]
SERVER_NOT_EXTRA_ASSEMBLIES = [ SERVER_NOT_EXTRA_ASSEMBLIES = [