more changes to the event management.

bots ip adjusted
This commit is contained in:
RaidMax 2018-07-01 19:30:38 -05:00
parent af6361144e
commit 87541c4a5a
5 changed files with 69 additions and 42 deletions

View File

@ -51,24 +51,8 @@ namespace IW4MAdmin.Application
public GameEvent GetNextEvent()
{
if (EventQueue.Count > 0)
{
#if DEBUG
Manager.GetLogger().WriteDebug("Getting next event to be processed");
#endif
if (!EventQueue.TryDequeue(out GameEvent newEvent))
{
Manager.GetLogger().WriteWarning("Could not dequeue event for processing");
}
else
{
return newEvent;
}
}
if (DelayedEventQueue.Count > 0 &&
(DateTime.Now - LastDelayedEvent).TotalMilliseconds > DelayAmount)
(DateTime.Now - LastDelayedEvent).TotalMilliseconds > DelayAmount)
{
LastDelayedEvent = DateTime.Now;
#if DEBUG
@ -85,6 +69,22 @@ namespace IW4MAdmin.Application
}
}
if (EventQueue.Count > 0)
{
#if DEBUG
Manager.GetLogger().WriteDebug("Getting next event to be processed");
#endif
if (!EventQueue.TryDequeue(out GameEvent newEvent))
{
Manager.GetLogger().WriteWarning("Could not dequeue event for processing");
}
else
{
return newEvent;
}
}
return null;
}
}

View File

@ -79,16 +79,29 @@ namespace IW4MAdmin.Application
return Instance ?? (Instance = new ApplicationManager());
}
public async Task UpdateStatus(object state)
public async Task UpdateServerStates()
{
var taskList = new List<Task>();
// store the server hash code and task for it
var runningUpdateTasks = new Dictionary<int, Task>();
while (Running)
{
taskList.Clear();
foreach (var server in Servers)
// select the server ids that have completed the update task
var serverTasksToRemove = runningUpdateTasks
.Where(ut => ut.Value.Status != TaskStatus.Running)
.Select(ut => ut.Key)
.ToList();
// remove the update tasks as they have completd
foreach (int serverId in serverTasksToRemove)
{
taskList.Add(Task.Run(async () =>
runningUpdateTasks.Remove(serverId);
}
// select the servers where the tasks have completed
foreach (var server in Servers.Where(s => serverTasksToRemove.Count == 0 ? true : serverTasksToRemove.Contains(GetHashCode())))
{
runningUpdateTasks.Add(server.GetHashCode(), Task.Run(async () =>
{
try
{
@ -104,13 +117,11 @@ namespace IW4MAdmin.Application
}));
}
#if DEBUG
Logger.WriteDebug($"{taskList.Count} servers queued for stats updates");
Logger.WriteDebug($"{runningUpdateTasks.Count} servers queued for stats updates");
ThreadPool.GetMaxThreads(out int workerThreads, out int n);
ThreadPool.GetAvailableThreads(out int availableThreads, out int m);
Logger.WriteDebug($"There are {workerThreads - availableThreads} active threading tasks");
#endif
await Task.WhenAny(taskList);
await Task.Delay(ConfigHandler.Configuration().RConPollRate);
}
}
@ -380,7 +391,7 @@ namespace IW4MAdmin.Application
// start heartbeat
Task.Run(() => SendHeartbeat(new HeartbeatState()));
#endif
Task.Run(() => UpdateStatus(null));
Task.Run(() => UpdateServerStates());
#pragma warning restore CS4014 // Because this call is not awaited, execution of the current method continues before the call is completed
var eventList = new List<Task>();
@ -446,12 +457,6 @@ namespace IW4MAdmin.Application
await processEvent(queuedEvent);
}
if (taskList.Count > 0)
{
// this should allow parallel processing of events
await Task.WhenAny(taskList);
}
// signal that all events have been processed
OnEvent.Reset();
}
@ -462,7 +467,6 @@ namespace IW4MAdmin.Application
_servers.Clear();
}
public void Stop()
{
Running = false;

View File

@ -119,7 +119,8 @@ namespace Application.RconParsers
if (P.IsBot)
{
P.IPAddress = P.ClientNumber + 1;
// set it to 127.0.0.2
P.IPAddress = 33554559;
}
StatusPlayers.Add(P);

View File

@ -56,9 +56,11 @@ namespace IW4MAdmin
public async Task OnPlayerJoined(Player logClient)
{
Logger.WriteDebug($"Log detected {logClient} joining");
if (Players[logClient.ClientNumber] == null || Players[logClient.ClientNumber].NetworkId != logClient.NetworkId)
if (Players[logClient.ClientNumber] == null ||
Players[logClient.ClientNumber].NetworkId != logClient.NetworkId)
{
Logger.WriteDebug($"Log detected {logClient} joining");
Players[logClient.ClientNumber] = logClient;
}
@ -78,13 +80,27 @@ namespace IW4MAdmin
if (Players[polledPlayer.ClientNumber] != null &&
Players[polledPlayer.ClientNumber].NetworkId == polledPlayer.NetworkId &&
// only update if they're unauthenticated
Players[polledPlayer.ClientNumber].IsAuthenticated)
Players[polledPlayer.ClientNumber].IsAuthenticated &&
Players[polledPlayer.ClientNumber].State == Player.ClientState.Connected)
{
// update their ping & score
Players[polledPlayer.ClientNumber].Ping = polledPlayer.Ping;
Players[polledPlayer.ClientNumber].Score = polledPlayer.Score;
return true;
}
if (Players[polledPlayer.ClientNumber] != null &&
Players[polledPlayer.ClientNumber].State == Player.ClientState.Connected)
{
return true;
}
if (Players[polledPlayer.ClientNumber] == null)
{
//prevent duplicates from being added
polledPlayer.State = Player.ClientState.Connecting;
Players[polledPlayer.ClientNumber] = polledPlayer;
}
#if !DEBUG
if (polledPlayer.Name.Length < 3)
{
@ -260,7 +276,7 @@ namespace IW4MAdmin
Leaving.TotalConnectionTime += (int)(DateTime.UtcNow - Leaving.ConnectionTime).TotalSeconds;
Leaving.LastConnection = DateTime.UtcNow;
await Manager.GetClientService().Update(Leaving);
Players.RemoveAt(cNum);
Players[cNum] = null;
}
}
}
@ -372,7 +388,10 @@ namespace IW4MAdmin
Owner = this
};
e.Origin.State = Player.ClientState.Disconnecting;
if (e.Origin != null)
{
e.Origin.State = Player.ClientState.Disconnecting;
}
Manager.GetEventHandler().AddEvent(e);
}
@ -530,7 +549,10 @@ namespace IW4MAdmin
// all polled players should be authenticated
foreach (var client in AuthQueue.GetAuthenticatedClients())
{
await AddPlayer(client);
if (Players[client.ClientNumber] == null || Players[client.ClientNumber].State == Player.ClientState.Connecting)
{
await AddPlayer(client);
}
}
return CurrentPlayers.Count;
@ -549,7 +571,7 @@ namespace IW4MAdmin
{
// todo: fix up disconnect
//for (int i = 0; i < Players.Count; i++)
// await RemovePlayer(i);
// await RemovePlayer(i);
foreach (var plugin in SharedLibraryCore.Plugins.PluginImporter.ActivePlugins)
await plugin.OnUnloadAsync();

View File

@ -187,7 +187,7 @@ namespace SharedLibraryCore
return id;
var bot = Regex.Match(str, @"bot[0-9]+").Value;
if (!string.IsNullOrEmpty(bot))
return -Convert.ToInt64(bot.Substring(3)) + 1;
return -1;//Convert.ToInt64(bot.Substring(3)) + 1;
return 0;
}