update mapname from status query

This commit is contained in:
RaidMax 2019-11-18 14:02:35 -06:00
parent 0ac1a4f861
commit 56008e80c7
7 changed files with 54 additions and 14 deletions

View File

@ -498,7 +498,7 @@ namespace IW4MAdmin
Hostname = dict["hostname"]; Hostname = dict["hostname"];
string mapname = dict["mapname"] ?? CurrentMap.Name; string mapname = dict["mapname"] ?? CurrentMap.Name;
CurrentMap = Maps.Find(m => m.Name == mapname) ?? new Map() { Alias = mapname, Name = mapname }; UpdateMap(mapname);
} }
} }
@ -510,11 +510,7 @@ namespace IW4MAdmin
MaxClients = int.Parse(dict["sv_maxclients"]); MaxClients = int.Parse(dict["sv_maxclients"]);
string mapname = dict["mapname"]; string mapname = dict["mapname"];
CurrentMap = Maps.Find(m => m.Name == mapname) ?? new Map() UpdateMap(mapname);
{
Alias = mapname,
Name = mapname
};
} }
} }
@ -598,7 +594,8 @@ namespace IW4MAdmin
var now = DateTime.Now; var now = DateTime.Now;
#endif #endif
var currentClients = GetClientsAsList(); var currentClients = GetClientsAsList();
var polledClients = (await this.GetStatusAsync()).AsEnumerable(); var statusResponse = (await this.GetStatusAsync());
var polledClients = statusResponse.Item1.AsEnumerable();
if (Manager.GetApplicationSettings().Configuration().IgnoreBots) if (Manager.GetApplicationSettings().Configuration().IgnoreBots)
{ {
@ -611,6 +608,8 @@ namespace IW4MAdmin
var connectingClients = polledClients.Except(currentClients); var connectingClients = polledClients.Except(currentClients);
var updatedClients = polledClients.Except(connectingClients).Except(disconnectingClients); var updatedClients = polledClients.Except(connectingClients).Except(disconnectingClients);
UpdateMap(statusResponse.Item2);
return new List<EFClient>[] return new List<EFClient>[]
{ {
connectingClients.ToList(), connectingClients.ToList(),
@ -619,6 +618,18 @@ namespace IW4MAdmin
}; };
} }
private void UpdateMap(string mapname)
{
if (!string.IsNullOrEmpty(mapname))
{
CurrentMap = Maps.Find(m => m.Name == mapname) ?? new Map()
{
Alias = mapname,
Name = mapname
};
}
}
private async Task ShutdownInternal() private async Task ShutdownInternal()
{ {
foreach (var client in GetClientsAsList()) foreach (var client in GetClientsAsList())
@ -887,11 +898,11 @@ namespace IW4MAdmin
InitializeMaps(); InitializeMaps();
this.Hostname = hostname; this.Hostname = hostname;
this.CurrentMap = Maps.Find(m => m.Name == mapname) ?? new Map() { Alias = mapname, Name = mapname };
this.MaxClients = maxplayers; this.MaxClients = maxplayers;
this.FSGame = game; this.FSGame = game;
this.Gametype = gametype; this.Gametype = gametype;
this.IP = ip.Value == "localhost" ? ServerConfig.IPAddress : ip.Value ?? ServerConfig.IPAddress; this.IP = ip.Value == "localhost" ? ServerConfig.IPAddress : ip.Value ?? ServerConfig.IPAddress;
UpdateMap(mapname);
if (RconParser.CanGenerateLogPath) if (RconParser.CanGenerateLogPath)
{ {

View File

@ -52,6 +52,9 @@ namespace IW4MAdmin.Application.RconParsers
Configuration.Dvar.AddMapping(ParserRegex.GroupType.RConDvarDefaultValue, 3); Configuration.Dvar.AddMapping(ParserRegex.GroupType.RConDvarDefaultValue, 3);
Configuration.Dvar.AddMapping(ParserRegex.GroupType.RConDvarLatchedValue, 4); Configuration.Dvar.AddMapping(ParserRegex.GroupType.RConDvarLatchedValue, 4);
Configuration.Dvar.AddMapping(ParserRegex.GroupType.RConDvarDomain, 5); Configuration.Dvar.AddMapping(ParserRegex.GroupType.RConDvarDomain, 5);
Configuration.MapStatus.Pattern = @"map: (([a-z]|_|\d)+)";
Configuration.MapStatus.AddMapping(ParserRegex.GroupType.RConStatusMap, 1);
} }
public IRConParserConfiguration Configuration { get; set; } public IRConParserConfiguration Configuration { get; set; }
@ -100,7 +103,7 @@ namespace IW4MAdmin.Application.RconParsers
}; };
} }
public virtual async Task<List<EFClient>> GetStatusAsync(Connection connection) public virtual async Task<(List<EFClient>, string)> GetStatusAsync(Connection connection)
{ {
string[] response = await connection.SendQueryAsync(StaticHelpers.QueryType.COMMAND_STATUS); string[] response = await connection.SendQueryAsync(StaticHelpers.QueryType.COMMAND_STATUS);
#if DEBUG #if DEBUG
@ -109,7 +112,22 @@ namespace IW4MAdmin.Application.RconParsers
Console.WriteLine(line); Console.WriteLine(line);
} }
#endif #endif
return ClientsFromStatus(response); return (ClientsFromStatus(response), MapFromStatus(response));
}
private string MapFromStatus(string[] response)
{
string map = null;
foreach (var line in response)
{
var regex = Regex.Match(line, Configuration.MapStatus.Pattern);
if (regex.Success)
{
map = regex.Groups[Configuration.MapStatus.GroupMapping[ParserRegex.GroupType.RConStatusMap]].ToString();
}
}
return map;
} }
public async Task<bool> SetDvarAsync(Connection connection, string dvarName, object dvarValue) public async Task<bool> SetDvarAsync(Connection connection, string dvarName, object dvarValue)
@ -195,4 +213,5 @@ namespace IW4MAdmin.Application.RconParsers
return StatusPlayers; return StatusPlayers;
} }
}} }
}

View File

@ -12,6 +12,7 @@ namespace IW4MAdmin.Application.RconParsers
{ {
public CommandPrefix CommandPrefixes { get; set; } public CommandPrefix CommandPrefixes { get; set; }
public ParserRegex Status { get; set; } = new ParserRegex(); public ParserRegex Status { get; set; } = new ParserRegex();
public ParserRegex MapStatus { get; set; } = new ParserRegex();
public ParserRegex Dvar { get; set; } = new ParserRegex(); public ParserRegex Dvar { get; set; } = new ParserRegex();
public bool WaitForResponse { get; set; } = true; public bool WaitForResponse { get; set; } = true;
} }

View File

@ -37,6 +37,7 @@ namespace SharedLibraryCore.Interfaces
RConDvarDefaultValue = 108, RConDvarDefaultValue = 108,
RConDvarLatchedValue = 109, RConDvarLatchedValue = 109,
RConDvarDomain = 110, RConDvarDomain = 110,
RConStatusMap = 111,
AdditionalGroup = 200 AdditionalGroup = 200
} }

View File

@ -38,8 +38,8 @@ namespace SharedLibraryCore.Interfaces
/// get the list of connected clients from status response /// get the list of connected clients from status response
/// </summary> /// </summary>
/// <param name="connection">RCon connection to use</param> /// <param name="connection">RCon connection to use</param>
/// <returns></returns> /// <returns>list of clients, and current map</returns>
Task<List<EFClient>> GetStatusAsync(Connection connection); Task<(List<EFClient>, string)> GetStatusAsync(Connection connection);
/// <summary> /// <summary>
/// stores the RCon configuration /// stores the RCon configuration

View File

@ -8,14 +8,22 @@ namespace SharedLibraryCore.Interfaces
/// stores the command format for console commands /// stores the command format for console commands
/// </summary> /// </summary>
CommandPrefix CommandPrefixes { get; set; } CommandPrefix CommandPrefixes { get; set; }
/// <summary> /// <summary>
/// stores the regex info for parsing get status response /// stores the regex info for parsing get status response
/// </summary> /// </summary>
ParserRegex Status { get; set; } ParserRegex Status { get; set; }
/// <summary>
/// stores regex info for parsing the map line from rcon status response
/// </summary>
ParserRegex MapStatus { get; set; }
/// <summary> /// <summary>
/// stores the regex info for parsing get DVAR responses /// stores the regex info for parsing get DVAR responses
/// </summary> /// </summary>
ParserRegex Dvar { get; set; } ParserRegex Dvar { get; set; }
/// <summary> /// <summary>
/// indicates if the application should wait for response from server /// indicates if the application should wait for response from server
/// when executing a command /// when executing a command

View File

@ -718,7 +718,7 @@ namespace SharedLibraryCore
return await server.RconParser.ExecuteCommandAsync(server.RemoteConnection, commandName); return await server.RconParser.ExecuteCommandAsync(server.RemoteConnection, commandName);
} }
public static Task<List<EFClient>> GetStatusAsync(this Server server) public static Task<(List<EFClient>, string)> GetStatusAsync(this Server server)
{ {
return server.RconParser.GetStatusAsync(server.RemoteConnection); return server.RconParser.GetStatusAsync(server.RemoteConnection);
} }