diff --git a/README.md b/README.md index 2e956ac..d38e3d2 100644 --- a/README.md +++ b/README.md @@ -2,10 +2,13 @@ Reports live match state to [simpleadmin-web](../../go/simpleadmin-web) over RCON: the hostname, map, team scores, warmup state, and each connected player's userid, name, SteamID64, team, -kills, deaths and ping. It changes nothing in the game. +kills, deaths and ping. Admins hidden with CS2-SimpleAdmin's `css_hide` are left out entirely, as if +they weren't connected, so the panel never lists or counts them. It changes nothing in the game. -Built for CounterStrikeSharp **1.0.375** (`net10.0`) on Metamod:Source 2.0.0.1469. No other -dependencies. +Built for CounterStrikeSharp **1.0.376** (`net10.0`) on Metamod:Source 2.0.0.1469. It uses +CS2-SimpleAdmin's shared API (`CS2-SimpleAdminApi`) to spot hidden admins. `lib/CS2-SimpleAdminApi.dll` +is a compile-time copy of the server's `shared/` one and isn't shipped. Without SimpleAdmin loaded, +everyone is listed. ## The command diff --git a/WebPanelBridge.cs b/WebPanelBridge.cs index b9e8086..ad5263b 100644 --- a/WebPanelBridge.cs +++ b/WebPanelBridge.cs @@ -3,19 +3,22 @@ using System.Text.Json.Serialization; using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Core.Attributes.Registration; +using CounterStrikeSharp.API.Core.Capabilities; using CounterStrikeSharp.API.Modules.Commands; using CounterStrikeSharp.API.Modules.Cvars; using CounterStrikeSharp.API.Modules.Utils; +using CS2_SimpleAdminApi; namespace WebPanelBridge; // Reports live match state to simpleadmin-web over RCON. The server console command prints one // JSON object per line, each prefixed with "wpb ", so the web panel can pick them out of whatever -// else lands in the RCON response. Nothing here changes game state. +// else lands in the RCON response. Admins hidden with CS2-SimpleAdmin's css_hide are left out, as if +// they weren't connected. Nothing here changes game state. public class WebPanelBridge : BasePlugin { public override string ModuleName => "WebPanelBridge"; - public override string ModuleVersion => "0.1.0"; + public override string ModuleVersion => "0.2.0"; public override string ModuleAuthor => "astra"; public override string ModuleDescription => "Live server status for simpleadmin-web, over RCON"; @@ -27,6 +30,8 @@ public class WebPanelBridge : BasePlugin DefaultIgnoreCondition = JsonIgnoreCondition.Never, }; + private static readonly PluginCapability SimpleAdminCapability = new("simpleadmin:api"); + private record ServerLine(int V, string Hostname, string Map, int MaxPlayers, int ScoreT, int ScoreCt, bool Warmup); private record PlayerLine(int Userid, string Name, string Steamid, int Team, int Kills, int Deaths, uint Ping, bool Bot); @@ -56,10 +61,22 @@ public class WebPanelBridge : BasePlugin scoreT, scoreCt, warmup); command.ReplyToCommand(Prefix + JsonSerializer.Serialize(server, JsonOptions)); + // Fetched on every call, so reloading SimpleAdmin doesn't leave a stale instance here. + ICS2_SimpleAdminApi? simpleAdmin = null; + try + { + simpleAdmin = SimpleAdminCapability.Get(); + } + catch (KeyNotFoundException) + { + } + foreach (var player in Utilities.GetPlayers()) { if (player is not { IsValid: true, IsHLTV: false } || player.Connected != PlayerConnectedState.Connected) continue; + if (!player.IsBot && simpleAdmin?.IsAdminSilent(player) == true) + continue; var stats = player.ActionTrackingServices?.MatchStats; var line = new PlayerLine( diff --git a/WebPanelBridge.csproj b/WebPanelBridge.csproj index d68d986..c3864b1 100644 --- a/WebPanelBridge.csproj +++ b/WebPanelBridge.csproj @@ -8,10 +8,15 @@ - + none runtime compile; build; native; contentfiles; analyzers; buildtransitive + + + lib/CS2-SimpleAdminApi.dll + false + diff --git a/lib/CS2-SimpleAdminApi.dll b/lib/CS2-SimpleAdminApi.dll new file mode 100644 index 0000000..3b594c7 Binary files /dev/null and b/lib/CS2-SimpleAdminApi.dll differ