diff --git a/Application/RConParsers/BaseRConParser.cs b/Application/RConParsers/BaseRConParser.cs index cf773dd1..ba238e6e 100644 --- a/Application/RConParsers/BaseRConParser.cs +++ b/Application/RConParsers/BaseRConParser.cs @@ -175,6 +175,7 @@ namespace IW4MAdmin.Application.RConParsers return new StatusResponse { + RawResponse = response, Clients = ClientsFromStatus(response).ToArray(), Map = GetValueFromStatus(response, ParserRegex.GroupType.RConStatusMap, Configuration.MapStatus), GameType = GetValueFromStatus(response, ParserRegex.GroupType.RConStatusGametype, Configuration.GametypeStatus), diff --git a/Application/RConParsers/StatusResponse.cs b/Application/RConParsers/StatusResponse.cs index bd0a52b9..fdf21521 100644 --- a/Application/RConParsers/StatusResponse.cs +++ b/Application/RConParsers/StatusResponse.cs @@ -6,10 +6,11 @@ namespace IW4MAdmin.Application.RConParsers /// public class StatusResponse : IStatusResponse { - public string Map { get; set; } - public string GameType { get; set; } - public string Hostname { get; set; } - public int? MaxClients { get; set; } - public EFClient[] Clients { get; set; } + public string Map { get; init; } + public string GameType { get; init; } + public string Hostname { get; init; } + public int? MaxClients { get; init; } + public EFClient[] Clients { get; init; } + public string[] RawResponse { get; set; } } -} \ No newline at end of file +} diff --git a/SharedLibraryCore/Events/Server/ServerStatusReceiveEvent.cs b/SharedLibraryCore/Events/Server/ServerStatusReceiveEvent.cs new file mode 100644 index 00000000..977b38a1 --- /dev/null +++ b/SharedLibraryCore/Events/Server/ServerStatusReceiveEvent.cs @@ -0,0 +1,9 @@ +using SharedLibraryCore.Interfaces; + +namespace SharedLibraryCore.Events.Server; + +public class ServerStatusReceiveEvent : GameServerEvent +{ + public IStatusResponse Response { get; set; } + public string RawData { get; set; } +} diff --git a/SharedLibraryCore/Interfaces/Events/IGameServerEventSubscriptions.cs b/SharedLibraryCore/Interfaces/Events/IGameServerEventSubscriptions.cs index d2b72a33..3ceabea8 100644 --- a/SharedLibraryCore/Interfaces/Events/IGameServerEventSubscriptions.cs +++ b/SharedLibraryCore/Interfaces/Events/IGameServerEventSubscriptions.cs @@ -73,6 +73,11 @@ public interface IGameServerEventSubscriptions /// static event Func ServerValueSetCompleted; + /// + /// Raised when a server's status response is received + /// + static event Func ServerStatusReceived; + static Task InvokeEventAsync(CoreEvent coreEvent, CancellationToken token) { return coreEvent switch @@ -88,6 +93,7 @@ public interface IGameServerEventSubscriptions ServerValueReceiveEvent serverValueReceiveEvent => ServerValueReceived?.InvokeAsync(serverValueReceiveEvent, token) ?? Task.CompletedTask, ServerValueSetRequestEvent serverValueSetRequestEvent => ServerValueSetRequested?.InvokeAsync(serverValueSetRequestEvent, token) ?? Task.CompletedTask, ServerValueSetCompleteEvent serverValueSetCompleteEvent => ServerValueSetCompleted?.InvokeAsync(serverValueSetCompleteEvent, token) ?? Task.CompletedTask, + ServerStatusReceiveEvent serverStatusReceiveEvent => ServerStatusReceived?.InvokeAsync(serverStatusReceiveEvent, token) ?? Task.CompletedTask, _ => Task.CompletedTask }; } diff --git a/SharedLibraryCore/Interfaces/IStatusResponse.cs b/SharedLibraryCore/Interfaces/IStatusResponse.cs index 6f53b2ff..800b68b1 100644 --- a/SharedLibraryCore/Interfaces/IStatusResponse.cs +++ b/SharedLibraryCore/Interfaces/IStatusResponse.cs @@ -31,5 +31,10 @@ namespace SharedLibraryCore.Interfaces /// active clients /// EFClient[] Clients { get; } + + /// + /// raw text data from the game server + /// + string[] RawResponse { get; } } -} \ No newline at end of file +} diff --git a/SharedLibraryCore/Utilities.cs b/SharedLibraryCore/Utilities.cs index 6995f270..9ef0681b 100644 --- a/SharedLibraryCore/Utilities.cs +++ b/SharedLibraryCore/Utilities.cs @@ -868,7 +868,14 @@ namespace SharedLibraryCore { try { - return await server.RconParser.GetStatusAsync(server.RemoteConnection, token); + var response = await server.RconParser.GetStatusAsync(server.RemoteConnection, token); + + server.Manager.QueueEvent(new ServerStatusReceiveEvent + { + Response = response + }); + + return response; } catch (TaskCanceledException)