* Add admin logging, models, migrations * Add logging damage changes * Add Log admin flag, LogFilter, Logs admin menu tab, message Refactor admin logging API * Change admin log get method names * Fix the name again * Minute amount of reorganization * Reset Postgres db snapshot * Reset Sqlite db snapshot * Make AdminLog have a composite primary key of round, id * Minute cleanup * Change admin system to do a type check instead of index check * Make admin logs use C# 10 interpolated string handlers * Implement UI on its own window Custom controls Searching Add admin log converters * Implement limits into the query * Change logs to be put into an OutputPanel instead for text wrapping * Add log <-> player m2m relationship back * UI improvements, make text wrap, add separators * Remove entity prefix from damaged log * Add explicit m2m model, fix any players filter * Add debug command to test bulk adding logs * Admin logs now just kinda go * Add histogram for database update time * Make admin log system update run every 5 seconds * Add a cap to the log queue and a metric for how many times it has been reached * Add metric for logs sent in a round * Make cvars out of admin logs queue send delay and cap * Merge fixes * Reset some changes * Add test for adding and getting a single log * Add tests for bulk adding logs * Add test for querying logs * Add CallerArgumentExpression to LogStringHandler methods and test * Improve UI, fix SQLite, add searching by round * Add entities to admin logs * Move distinct after orderby * Add migrations * ef core eat my ass * Add cvar for client logs batch size * Sort logs from newest to oldest by default * Merge fixes * Reorganize tests and add one for date ordering * Add note to log types to not change their numeric values * Add impacts to logs, better UI filtering * Make log add callable from shared for convenience * Get current round id directly from game ticker * Revert namespace change for DamageableSystem
143 lines
4.9 KiB
C#
143 lines
4.9 KiB
C#
using System.Collections.Generic;
|
|
using Content.Client.Administration.UI.CustomControls;
|
|
using Content.Shared.Administration;
|
|
using Robust.Client.AutoGenerated;
|
|
using Robust.Client.Graphics;
|
|
using Robust.Client.Player;
|
|
using Robust.Client.UserInterface;
|
|
using Robust.Client.UserInterface.Controls;
|
|
using Robust.Client.UserInterface.XAML;
|
|
using Robust.Shared.GameObjects;
|
|
using Robust.Shared.IoC;
|
|
using Robust.Shared.Maths;
|
|
using static Robust.Client.UserInterface.Controls.BoxContainer;
|
|
|
|
namespace Content.Client.Administration.UI.Tabs
|
|
{
|
|
[GenerateTypedNameReferences]
|
|
public partial class PlayerTab : Control
|
|
{
|
|
private readonly AdminSystem _adminSystem;
|
|
|
|
public PlayerTab()
|
|
{
|
|
_adminSystem = EntitySystem.Get<AdminSystem>();
|
|
RobustXamlLoader.Load(this);
|
|
RefreshPlayerList(_adminSystem.PlayerList);
|
|
_adminSystem.PlayerListChanged += RefreshPlayerList;
|
|
OverlayButtonOn.OnPressed += _adminSystem.AdminOverlayOn;
|
|
OverlayButtonOff.OnPressed += _adminSystem.AdminOverlayOff;
|
|
}
|
|
|
|
protected override void Dispose(bool disposing)
|
|
{
|
|
base.Dispose(disposing);
|
|
|
|
_adminSystem.PlayerListChanged -= RefreshPlayerList;
|
|
OverlayButtonOn.OnPressed -= _adminSystem.AdminOverlayOn;
|
|
OverlayButtonOff.OnPressed -= _adminSystem.AdminOverlayOff;
|
|
}
|
|
|
|
private void RefreshPlayerList(IReadOnlyList<PlayerInfo> players)
|
|
{
|
|
PlayerList.RemoveAllChildren();
|
|
var playerManager = IoCManager.Resolve<IPlayerManager>();
|
|
PlayerCount.Text = $"Players: {playerManager.PlayerCount}";
|
|
|
|
var altColor = Color.FromHex("#292B38");
|
|
var defaultColor = Color.FromHex("#2F2F3B");
|
|
|
|
var header = new BoxContainer
|
|
{
|
|
Orientation = LayoutOrientation.Horizontal,
|
|
HorizontalExpand = true,
|
|
SeparationOverride = 4,
|
|
Children =
|
|
{
|
|
new Label
|
|
{
|
|
Text = "Username",
|
|
SizeFlagsStretchRatio = 2f,
|
|
HorizontalExpand = true
|
|
},
|
|
new VSeparator(),
|
|
new Label
|
|
{
|
|
Text = "Character",
|
|
SizeFlagsStretchRatio = 2f,
|
|
HorizontalExpand = true
|
|
},
|
|
new VSeparator(),
|
|
new Label()
|
|
{
|
|
Text = "Antagonist",
|
|
SizeFlagsStretchRatio = 2f,
|
|
HorizontalExpand = true,
|
|
}
|
|
}
|
|
};
|
|
PlayerList.AddChild(new PanelContainer
|
|
{
|
|
PanelOverride = new StyleBoxFlat
|
|
{
|
|
BackgroundColor = altColor,
|
|
},
|
|
Children =
|
|
{
|
|
header
|
|
}
|
|
});
|
|
PlayerList.AddChild(new HSeparator());
|
|
|
|
var useAltColor = false;
|
|
foreach (var player in players)
|
|
{
|
|
var hBox = new BoxContainer
|
|
{
|
|
Orientation = LayoutOrientation.Horizontal,
|
|
HorizontalExpand = true,
|
|
SeparationOverride = 4,
|
|
Children =
|
|
{
|
|
new Label
|
|
{
|
|
Text = player.Username,
|
|
SizeFlagsStretchRatio = 2f,
|
|
HorizontalExpand = true,
|
|
ClipText = true
|
|
},
|
|
new VSeparator(),
|
|
new Label
|
|
{
|
|
Text = player.CharacterName,
|
|
SizeFlagsStretchRatio = 2f,
|
|
HorizontalExpand = true,
|
|
ClipText = true
|
|
},
|
|
new VSeparator(),
|
|
new Label()
|
|
{
|
|
Text = player.Antag ? "YES" : "NO",
|
|
SizeFlagsStretchRatio = 2f,
|
|
HorizontalExpand = true,
|
|
ClipText = true,
|
|
}
|
|
}
|
|
};
|
|
PlayerList.AddChild(new PanelContainer
|
|
{
|
|
PanelOverride = new StyleBoxFlat
|
|
{
|
|
BackgroundColor = useAltColor ? altColor : defaultColor,
|
|
},
|
|
Children =
|
|
{
|
|
hBox
|
|
}
|
|
});
|
|
useAltColor ^= true;
|
|
}
|
|
}
|
|
}
|
|
}
|