diff --git a/Application/Application.csproj b/Application/Application.csproj index 55733d0c6..6c97a4e45 100644 --- a/Application/Application.csproj +++ b/Application/Application.csproj @@ -6,7 +6,7 @@ 2.2.2 false RaidMax.IW4MAdmin.Application - 2.2.7.5 + 2.2.7.6 RaidMax Forever None IW4MAdmin @@ -32,8 +32,8 @@ true true - 2.2.7.5 - 2.2.7.5 + 2.2.7.6 + 2.2.7.6 7.1 diff --git a/Application/IW4MServer.cs b/Application/IW4MServer.cs index d3ed94064..93ddc1f6a 100644 --- a/Application/IW4MServer.cs +++ b/Application/IW4MServer.cs @@ -84,18 +84,18 @@ namespace IW4MAdmin if (client.ClientNumber >= 0) { #endif - Logger.WriteInfo($"Client {client} [{client.State.ToString().ToLower()}] disconnecting..."); - Clients[client.ClientNumber] = null; - await client.OnDisconnect(); + Logger.WriteInfo($"Client {client} [{client.State.ToString().ToLower()}] disconnecting..."); + Clients[client.ClientNumber] = null; + await client.OnDisconnect(); - var e = new GameEvent() - { - Origin = client, - Owner = this, - Type = GameEvent.EventType.Disconnect - }; + var e = new GameEvent() + { + Origin = client, + Owner = this, + Type = GameEvent.EventType.Disconnect + }; - Manager.GetEventHandler().AddEvent(e); + Manager.GetEventHandler().AddEvent(e); #if DEBUG == true } #endif @@ -571,22 +571,9 @@ namespace IW4MAdmin { try { -#region SHUTDOWN + #region SHUTDOWN if (Manager.CancellationToken.IsCancellationRequested) { - foreach (var client in GetClientsAsList()) - { - var e = new GameEvent() - { - Type = GameEvent.EventType.PreDisconnect, - Origin = client, - Owner = this, - }; - - Manager.GetEventHandler().AddEvent(e); - await e.WaitAsync(Utilities.DefaultCommandTimeout, Manager.CancellationToken); - } - foreach (var plugin in SharedLibraryCore.Plugins.PluginImporter.ActivePlugins) { await plugin.OnUnloadAsync(); @@ -594,7 +581,7 @@ namespace IW4MAdmin return true; } -#endregion + #endregion try { @@ -705,14 +692,14 @@ namespace IW4MAdmin lastCount = DateTime.Now; // update the player history - if ((lastCount - playerCountStart).TotalMinutes >= SharedLibraryCore.Helpers.PlayerHistory.UpdateInterval) + if ((lastCount - playerCountStart).TotalMinutes >= PlayerHistory.UpdateInterval) { - while (ClientHistory.Count > ((60 / SharedLibraryCore.Helpers.PlayerHistory.UpdateInterval) * 12)) // 12 times a hour for 12 hours + while (ClientHistory.Count > ((60 / PlayerHistory.UpdateInterval) * 12)) // 12 times a hour for 12 hours { ClientHistory.Dequeue(); } - ClientHistory.Enqueue(new SharedLibraryCore.Helpers.PlayerHistory(ClientNum)); + ClientHistory.Enqueue(new PlayerHistory(ClientNum)); playerCountStart = DateTime.Now; } @@ -1017,13 +1004,20 @@ namespace IW4MAdmin else { #if !DEBUG - string formattedString = String.Format(RconParser.Configuration.CommandPrefixes.Kick, targetClient.ClientNumber, $"{loc["SERVER_BAN_TEXT"]} - ^5{reason} ^7{loc["SERVER_BAN_APPEAL"].FormatExt(Website)}^7"); + string formattedString = string.Format(RconParser.Configuration.CommandPrefixes.Kick, targetClient.ClientNumber, $"{loc["SERVER_BAN_TEXT"]} - ^5{reason} ^7{loc["SERVER_BAN_APPEAL"].FormatExt(Website)}^7"); await targetClient.CurrentServer.ExecuteCommandAsync(formattedString); #else await targetClient.CurrentServer.OnClientDisconnected(targetClient); #endif } + // this should link evading clients + if (isEvade) + { + Logger.WriteInfo($"updating alias for banned client {targetClient}"); + await Manager.GetClientService().UpdateAlias(targetClient); + } + EFPenalty newPenalty = new EFPenalty() { Type = EFPenalty.PenaltyType.Ban, @@ -1061,10 +1055,10 @@ namespace IW4MAdmin override public void InitializeTokens() { - Manager.GetMessageTokens().Add(new SharedLibraryCore.Helpers.MessageToken("TOTALPLAYERS", (Server s) => Task.Run(async () => (await Manager.GetClientService().GetTotalClientsAsync()).ToString()))); - Manager.GetMessageTokens().Add(new SharedLibraryCore.Helpers.MessageToken("VERSION", (Server s) => Task.FromResult(Application.Program.Version.ToString()))); - Manager.GetMessageTokens().Add(new SharedLibraryCore.Helpers.MessageToken("NEXTMAP", (Server s) => SharedLibraryCore.Commands.CNextMap.GetNextMap(s))); - Manager.GetMessageTokens().Add(new SharedLibraryCore.Helpers.MessageToken("ADMINS", (Server s) => Task.FromResult(SharedLibraryCore.Commands.CListAdmins.OnlineAdmins(s)))); + Manager.GetMessageTokens().Add(new MessageToken("TOTALPLAYERS", (Server s) => Task.Run(async () => (await Manager.GetClientService().GetTotalClientsAsync()).ToString()))); + Manager.GetMessageTokens().Add(new MessageToken("VERSION", (Server s) => Task.FromResult(Application.Program.Version.ToString()))); + Manager.GetMessageTokens().Add(new MessageToken("NEXTMAP", (Server s) => SharedLibraryCore.Commands.CNextMap.GetNextMap(s))); + Manager.GetMessageTokens().Add(new MessageToken("ADMINS", (Server s) => Task.FromResult(SharedLibraryCore.Commands.CListAdmins.OnlineAdmins(s)))); } } } diff --git a/Plugins/ScriptPlugins/ParserCoD4x.js b/Plugins/ScriptPlugins/ParserCoD4x.js index ff6c5caa4..4e81fd901 100644 --- a/Plugins/ScriptPlugins/ParserCoD4x.js +++ b/Plugins/ScriptPlugins/ParserCoD4x.js @@ -3,7 +3,7 @@ var eventParser; var plugin = { author: 'FrenchFry, RaidMax', - version: 0.3, + version: 0.4, name: 'CoD4x Parser', isParser: true, @@ -14,7 +14,7 @@ var plugin = { rconParser = manager.GenerateDynamicRConParser(); eventParser = manager.GenerateDynamicEventParser(); - rconParser.Configuration.Status.Pattern = '^ *([0-9]+) +-?([0-9]+) +((?:[A-Z]+|[0-9]+)) +((?:[a-z]|[0-9]){16}|(?:[a-z]|[0-9]){32}|bot[0-9]+|(?:[0-9]+)) *(.{0,32}) +([0-9]+) +(\\d+\\.\\d+\\.\\d+.\\d+\\:-*\\d{1,5}|0+.0+:-*\\d{1,5}|loopback) +(-*[0-9]+) +([0-9]+) *$' + rconParser.Configuration.Status.Pattern = '^ *([0-9]+) +-?([0-9]+) +((?:[A-Z]+|[0-9]+)) +((?:[a-z]|[0-9]){16,32}|(?:[a-z]|[0-9]){32}|bot[0-9]+) ([0-9+]) *(.{0,32}) +([0-9]+) +(\\d+\\.\\d+\\.\\d+.\\d+\\:-*\\d{1,5}|0+.0+:-*\\d{1,5}|loopback) +(-*[0-9]+) +([0-9]+) *$' rconParser.Configuration.Status.AddMapping(104, 6); // RConName rconParser.Configuration.Status.AddMapping(105, 8); // RConIPAddress diff --git a/Plugins/Stats/Commands/MostPlayed.cs b/Plugins/Stats/Commands/MostPlayed.cs index 98776da2e..ccb8872ce 100644 --- a/Plugins/Stats/Commands/MostPlayed.cs +++ b/Plugins/Stats/Commands/MostPlayed.cs @@ -23,7 +23,7 @@ namespace IW4MAdmin.Plugins.Stats.Commands $"^5--{Utilities.CurrentLocalization.LocalizationIndex["PLUGINS_STATS_COMMANDS_MOSTPLAYED_TEXT"]}--" }; - using (var db = new DatabaseContext()) + using (var db = new DatabaseContext(true)) { db.ChangeTracker.AutoDetectChangesEnabled = false; db.ChangeTracker.QueryTrackingBehavior = QueryTrackingBehavior.NoTracking; diff --git a/Plugins/Tests/ClientTests.cs b/Plugins/Tests/ClientTests.cs index f1935c8d4..efcea2b0e 100644 --- a/Plugins/Tests/ClientTests.cs +++ b/Plugins/Tests/ClientTests.cs @@ -249,7 +249,7 @@ namespace Tests unbanCommand.ExecuteAsync(new GameEvent() { Origin = new EFClient() { ClientId = 1, Level = EFClient.Permission.Console, CurrentServer = client.CurrentServer }, - Target = Manager.GetClientService().Find(c => c.NetworkId == client.NetworkId).Result.First(), + //Target = Manager.GetClientService().Find(c => c.NetworkId == client.NetworkId).Result.First(), Data = "test unban", Type = GameEvent.EventType.Command, Owner = client.CurrentServer diff --git a/SharedLibraryCore/Commands/NativeCommands.cs b/SharedLibraryCore/Commands/NativeCommands.cs index bb712d1a1..98f205dc8 100644 --- a/SharedLibraryCore/Commands/NativeCommands.cs +++ b/SharedLibraryCore/Commands/NativeCommands.cs @@ -1115,7 +1115,7 @@ namespace SharedLibraryCore.Commands .Where(c => c.Level > EFClient.Permission.Flagged && c.Level <= EFClient.Permission.Moderator) .Where(c => c.LastConnection < lastActive) .ToListAsync(); - inactiveUsers.ForEach(c => c.SetLevel(EFClient.Permission.User, E.Origin)); + inactiveUsers.ForEach(c => c.SetLevel(Permission.User, E.Origin)); await context.SaveChangesAsync(); } E.Origin.Tell(Utilities.CurrentLocalization.LocalizationIndex["COMMANDS_PRUNE_SUCCESS"].FormatExt(inactiveUsers.Count)); diff --git a/SharedLibraryCore/Services/ClientService.cs b/SharedLibraryCore/Services/ClientService.cs index da224181b..9e319b727 100644 --- a/SharedLibraryCore/Services/ClientService.cs +++ b/SharedLibraryCore/Services/ClientService.cs @@ -48,7 +48,7 @@ namespace SharedLibraryCore.Services }; context.Clients.Add(client); - + // they're just using a new GUID if (aliasId.HasValue) { @@ -272,18 +272,9 @@ namespace SharedLibraryCore.Services } } - public async Task> Find(Func e) + public Task> Find(Func e) { - return await Task.Run(() => - { - using (var context = new DatabaseContext(true)) - { - return context.Clients - .Include(c => c.CurrentAlias) - .Include(c => c.AliasLink.Children) - .Where(e).ToList(); - } - }); + throw new NotImplementedException(); } public async Task Get(int entityID) @@ -369,6 +360,11 @@ namespace SharedLibraryCore.Services { using (var context = new DatabaseContext()) { + if (temporalClient.LastConnection == DateTime.MinValue || temporalClient.Connections == 0 || temporalClient.TotalConnectionTime == 0) + { + throw new InvalidOperationException($"client {temporalClient} trying to update but parameters are invalid"); + } + // grab the context version of the entity var entity = context.Clients .First(client => client.ClientId == temporalClient.ClientId); @@ -407,7 +403,7 @@ namespace SharedLibraryCore.Services { using (var ctx = new DatabaseContext(true)) { - return await ctx.Clients.AsNoTracking() + return await ctx.Clients .CountAsync(_client => _client.Level == Permission.Owner); } } @@ -489,7 +485,7 @@ namespace SharedLibraryCore.Services { iqClients = iqClients.Where(_client => linkIds.Contains(_client.AliasLinkId)); } - + // we want to project our results var iqClientProjection = iqClients.OrderByDescending(_client => _client.LastConnection) .Select(_client => new PlayerInfo() @@ -503,7 +499,7 @@ namespace SharedLibraryCore.Services var iqClientsSql = iqClients.ToSql(); #endif var clients = await iqClientProjection.ToListAsync(); - + // this is so we don't try to evaluate this in the linq to entities query foreach (var client in clients) {