From 8ce8db5f30133ad73d49697211cf93ac4e0ba63f Mon Sep 17 00:00:00 2001 From: RaidMax Date: Wed, 29 Nov 2017 18:35:50 -0600 Subject: [PATCH] More EF Changes. Added DB importer --- Admin/Server.cs | 218 +++++++++++------- Admin/WebService.cs | 45 ++-- Admin/lib/SharedLibrary.dll | Bin 136704 -> 143360 bytes Plugins/Tests/Plugin.cs | 128 +++++++++- SharedLibrary/Commands/NativeCommands.cs | 32 ++- ...nDatabaseContext.cs => DatabaseContext.cs} | 35 ++- SharedLibrary/Database/Importer.cs | 165 +++++++++++++ SharedLibrary/Database/Initializer.cs | 20 +- SharedLibrary/Database/Models/EFAlias.cs | 12 +- SharedLibrary/Database/Models/EFAliasLink.cs | 4 + SharedLibrary/Database/Models/EFClient.cs | 27 ++- SharedLibrary/Objects/Player.cs | 20 +- SharedLibrary/Services/AliasService.cs | 41 ++-- SharedLibrary/Services/ClientService.cs | 171 ++++++++++---- SharedLibrary/Services/PenaltyService.cs | 55 +++-- SharedLibrary/SharedLibrary.csproj | 3 +- SharedLibrary/Utilities.cs | 15 +- 17 files changed, 753 insertions(+), 238 deletions(-) rename SharedLibrary/Database/{IW4MAdminDatabaseContext.cs => DatabaseContext.cs} (54%) create mode 100644 SharedLibrary/Database/Importer.cs diff --git a/Admin/Server.cs b/Admin/Server.cs index c30ced944..33bf53f0b 100644 --- a/Admin/Server.cs +++ b/Admin/Server.cs @@ -38,7 +38,7 @@ namespace IW4MAdmin try { Player player = null; - var client = (await Manager.GetClientService().GetUnique(polledPlayer.NetworkId)); + var client = await Manager.GetClientService().GetUnique(polledPlayer.NetworkId); // first time client is connecting to server if (client == null) @@ -52,28 +52,21 @@ namespace IW4MAdmin { client.Connections += 1; bool aliasExists = client.AliasLink.Children - .FirstOrDefault(a => a.Name == polledPlayer.Name && a.IP == polledPlayer.IPAddress) != null; + .FirstOrDefault(a => a.Name == polledPlayer.Name && a.IPAddress == polledPlayer.IPAddress) != null; if (!aliasExists) { Logger.WriteDebug($"Client {polledPlayer} has connected previously under a different alias"); - await Manager.GetAliasService().Create(new SharedLibrary.Database.Models.EFAlias() + client.CurrentAlias = new SharedLibrary.Database.Models.EFAlias() { - Active = true, - IP = polledPlayer.IPAddress, + IPAddress = polledPlayer.IPAddress, Name = polledPlayer.Name, - DateAdded = DateTime.UtcNow, - Link = client.AliasLink, - }); + }; + await Manager.GetClientService().Update(client); } - - client.Name = polledPlayer.Name; - client.IPAddress = polledPlayer.IPAddress; player = client.AsPlayer(); } - - /*var Admins = Manager.GetDatabase().GetPrivilegedClients(); if (Admins.Where(x => x.Name == polledPlayer.Name).Count() > 0) { @@ -81,6 +74,10 @@ namespace IW4MAdmin await this.ExecuteCommandAsync("clientkick " + polledPlayer.ClientNumber + " \"Please do not impersonate an admin^7\""); }*/ player.CurrentServer = this; +#if DEBUG + player.ClientNumber = polledPlayer.ClientNumber; + Players[player.ClientNumber] = player; +#endif var ban = (await Manager.GetPenaltyService().Find(p => p.LinkId == player.AliasLink.AliasLinkId && p.Expires > DateTime.UtcNow)).FirstOrDefault(); @@ -92,12 +89,12 @@ namespace IW4MAdmin autoKickClient.CurrentServer = this; if (ban.Type == Penalty.PenaltyType.TempBan) - await this.ExecuteCommandAsync($"clientkick {player.ClientNumber} \"You are temporarily banned. ({(ban.Expires - DateTime.Now).TimeSpanText()} left)\""); + await this.ExecuteCommandAsync($"clientkick {player.ClientNumber} \"You are temporarily banned. ({(ban.Expires - DateTime.UtcNow).TimeSpanText()} left)\""); else - await player.Kick($"previously banned for {ban.Offense}", autoKickClient); + await player.Kick($"Previously banned for {ban.Offense}", autoKickClient); if (player.Level != Player.Permission.Banned && ban.Type == Penalty.PenaltyType.Ban) - await player.Ban($"previously banned for {ban.Offense}", autoKickClient); + await player.Ban($"Previously banned for {ban.Offense}", autoKickClient); return true; } @@ -106,8 +103,7 @@ namespace IW4MAdmin // Do the player specific stuff player.ClientNumber = polledPlayer.ClientNumber; Players[player.ClientNumber] = player; - await Manager.GetClientService().Update(player); - Logger.WriteInfo($"Client {player} connecting..."); // they're clean + Logger.WriteInfo($"Client {player} connecting..."); await ExecuteEvent(new Event(Event.GType.Connect, "", player, null, this)); @@ -128,7 +124,7 @@ namespace IW4MAdmin //Remove player by CLIENT NUMBER override public async Task RemovePlayer(int cNum) { - if (cNum >= 0) + if (cNum >= 0 && Players[cNum] != null) { Player Leaving = Players[cNum]; Leaving.TotalConnectionTime += (int)(DateTime.UtcNow - Leaving.ConnectionTime).TotalSeconds; @@ -217,6 +213,7 @@ namespace IW4MAdmin E.Target = found.AsPlayer(); E.Target.CurrentServer = this as IW4MServer; E.Owner = this as IW4MServer; + E.Data = String.Join(" ", Args.Skip(1)); } } @@ -242,7 +239,7 @@ namespace IW4MAdmin else if (matchingPlayers.Count == 1) { E.Target = matchingPlayers.First(); - E.Data = Regex.Replace(E.Data, $"\"{E.Target.Name}\"", "", RegexOptions.IgnoreCase).Trim(); + E.Data = Regex.Replace(E.Data, $"\"{E.Target.Name}\"", "", RegexOptions.IgnoreCase).Trim(); } } @@ -642,53 +639,114 @@ namespace IW4MAdmin public override async Task Warn(String Reason, Player Target, Player Origin) { - if (Target.Warnings >= 4) - await Target.Kick("Too many warnings!", (await Manager.GetClientService().Get(1)).AsPlayer()); + // ensure player gets warned if command not performed on them in game + if (Target.ClientNumber < 0) + { + Player ingameClient = null; + + ingameClient = Manager.GetServers() + .Select(s => s.GetPlayersAsList()) + .FirstOrDefault(l => l.FirstOrDefault(c => c.ClientId == Target.ClientId) != null) + ?.First(c => c.ClientId == Target.ClientId); + + if (ingameClient != null) + { + await Warn(Reason, ingameClient, Origin); + return; + } + } + else { - Penalty newPenalty = new Penalty() - { - Type = Penalty.PenaltyType.Warning, - Expires = DateTime.UtcNow, - Offender = Target, - Offense = Reason, - Punisher = Origin, - Active = true, - When = DateTime.UtcNow, - Link = Target.AliasLink - }; + if (Target.Warnings >= 4) + await Target.Kick("Too many warnings!", (await Manager.GetClientService().Get(1)).AsPlayer()); - await Manager.GetPenaltyService().Create(newPenalty); Target.Warnings++; - String Message = String.Format("^1WARNING ^7[^3{0}^7]: ^3{1}^7, {2}", Target.Warnings, Target.Name, Reason); - await Broadcast(Message); + await Target.CurrentServer.Broadcast(Message); } + + Penalty newPenalty = new Penalty() + { + Type = Penalty.PenaltyType.Warning, + Expires = DateTime.UtcNow, + Offender = Target, + Offense = Reason, + Punisher = Origin, + Active = true, + When = DateTime.UtcNow, + Link = Target.AliasLink + }; + + await Manager.GetPenaltyService().Create(newPenalty); } public override async Task Kick(String Reason, Player Target, Player Origin) { - if (Target.ClientNumber > -1) + // ensure player gets kicked if command not performed on them in game + if (Target.ClientNumber < 0) { - String Message = "^1Player Kicked: ^5" + Reason; - await Manager.GetPenaltyService().Create(new Penalty() + Player ingameClient = null; + + ingameClient = Manager.GetServers() + .Select(s => s.GetPlayersAsList()) + .FirstOrDefault(l => l.FirstOrDefault(c => c.ClientId == Target.ClientId) != null) + ?.First(c => c.ClientId == Target.ClientId); + + if (ingameClient != null) { - Type = Penalty.PenaltyType.Kick, - Expires = DateTime.UtcNow, - Offender = Target, - Offense = Reason, - Punisher = Origin, - Active = true, - When = DateTime.UtcNow, - Link = Target.AliasLink - }); - await this.ExecuteCommandAsync($"clientkick {Target.ClientNumber} \"{Message}^7\""); + await Kick(Reason, ingameClient, Origin); + return; + } } + else + await Target.CurrentServer.ExecuteCommandAsync($"clientkick {Target.ClientNumber} \"Player Kicked: ^5{Reason}^7\""); + +#if DEBUG + await Target.CurrentServer.RemovePlayer(Target.ClientNumber); +#endif + + var newPenalty = new Penalty() + { + Type = Penalty.PenaltyType.Kick, + Expires = DateTime.UtcNow, + Offender = Target, + Offense = Reason, + Punisher = Origin, + Active = true, + When = DateTime.UtcNow, + Link = Target.AliasLink + }; + + await Manager.GetPenaltyService().Create(newPenalty); } public override async Task TempBan(String Reason, TimeSpan length, Player Target, Player Origin) { - await this.ExecuteCommandAsync($"clientkick {Target.ClientNumber } \"^1Player Temporarily Banned: ^5{ Reason }\""); + // ensure player gets banned if command not performed on them in game + if (Target.ClientNumber < 0) + { + Player ingameClient = null; + + ingameClient = Manager.GetServers() + .Select(s => s.GetPlayersAsList()) + .FirstOrDefault(l => l.FirstOrDefault(c => c.ClientId == Target.ClientId) != null) + ?.First(c => c.ClientId == Target.ClientId); + + if (ingameClient != null) + { + await TempBan(Reason, length, ingameClient, Origin); + return; + } + } + + else + await Target.CurrentServer.ExecuteCommandAsync($"clientkick {Target.ClientNumber } \"^1Player Temporarily Banned: ^5{ Reason }\""); + +#if DEBUG + await Target.CurrentServer.RemovePlayer(Target.ClientNumber); +#endif + Penalty newPenalty = new Penalty() { Type = Penalty.PenaltyType.TempBan, @@ -706,6 +764,33 @@ namespace IW4MAdmin override public async Task Ban(String Message, Player Target, Player Origin) { + // ensure player gets banned if command not performed on them in game + if (Target.ClientNumber < 0) + { + Player ingameClient = null; + + ingameClient = Manager.GetServers() + .Select(s => s.GetPlayersAsList()) + .FirstOrDefault(l => l.FirstOrDefault(c => c.ClientId == Target.ClientId) != null) + ?.First(c => c.ClientId == Target.ClientId); + + if (ingameClient != null) + { + await Ban(Message, ingameClient, Origin); + return; + } + } + + else + { + // this is set only because they're still in the server. + Target.Level = Player.Permission.Banned; + await Target.CurrentServer.ExecuteCommandAsync($"clientkick {Target.ClientNumber} \"Player Banned: ^5{Message} ^7(appeal at {Website}) ^7\""); +#if DEBUG + await Target.CurrentServer.RemovePlayer(Target.ClientNumber); +#endif + } + Penalty newPenalty = new Penalty() { Type = Penalty.PenaltyType.Ban, @@ -717,39 +802,8 @@ namespace IW4MAdmin When = DateTime.UtcNow, Link = Target.AliasLink }; + await Manager.GetPenaltyService().Create(newPenalty); - Target.Level = Player.Permission.Banned; - await Manager.GetClientService().Update(Target); - - lock (Reports) // threading seems to do something weird here - { - List toRemove = new List(); - foreach (Report R in Reports) - { - if (R.Target.NetworkId == Target.NetworkId) - toRemove.Add(R); - } - - foreach (Report R in toRemove) - { - Reports.Remove(R); - Logger.WriteInfo("Removing report for banned GUID - " + R.Origin.NetworkId); - } - } - - // banned from all servers if active - foreach (var server in Manager.GetServers()) - { - if (server.GetPlayersAsList().Count > 0) - { - var activeClient = server.GetPlayersAsList().SingleOrDefault(x => x.NetworkId == Target.NetworkId); - if (activeClient != null) - { - await server.ExecuteCommandAsync($"clientkick {activeClient.ClientNumber} \"Player Banned: ^5{Message} ^7(appeal at {Website}) ^7\""); - break; - } - } - } } override public async Task Unban(Player Target) diff --git a/Admin/WebService.cs b/Admin/WebService.cs index 73d376c09..036c0bfca 100644 --- a/Admin/WebService.cs +++ b/Admin/WebService.cs @@ -227,16 +227,17 @@ namespace IW4MAdmin PlayerHistory = S.PlayerHistory.ToArray() }; - bool authed = (await (ApplicationManager.GetInstance().GetClientService() as ClientService).GetPrivilegedClients()) + bool authed = querySet["IP"] == "127.0.0.1" + || (await (ApplicationManager.GetInstance().GetClientService() as ClientService).GetPrivilegedClients()) .Where(x => x.IPAddress == querySet["IP"]) - .Where(x => x.Level > Player.Permission.Trusted).Count() > 0 - || querySet["IP"] == "127.0.0.1"; + .Where(x => x.Level > Player.Permission.Trusted).Count() > 0; + foreach (Player P in S.GetPlayersAsList()) { PlayerInfo pInfo = new PlayerInfo() { - playerID = P.ClientNumber, + playerID = P.ClientId, playerName = P.Name, playerLevel = authed ? P.Level.ToString() : Player.Permission.User.ToString() }; @@ -381,10 +382,10 @@ namespace IW4MAdmin { // fixme Func predicate = c => c.IPAddress == querySet["IP"]; - Player admin = (await ApplicationManager.GetInstance().GetClientService().Find(predicate)).First()?.AsPlayer(); + Player admin = (await ApplicationManager.GetInstance().GetClientService().Find(predicate)).FirstOrDefault()?.AsPlayer(); if (admin == null) - admin = new Player() { Name = "RestUser", Level = Player.Permission.User }; + admin = new Player() { Name = "RestUser"}; Event remoteEvent = new Event(Event.GType.Say, querySet["command"], admin, null, S) { @@ -465,7 +466,7 @@ namespace IW4MAdmin penaltyType = penalty.Type.ToString(), playerName = penalty.Offender.Name, playerID = penalty.Offender.ClientId, - Expires = penalty.Expires > DateTime.Now ? (penalty.Expires - DateTime.Now).TimeSpanText() : "" + Expires = penalty.Expires > DateTime.UtcNow ? (penalty.Expires - DateTime.UtcNow).TimeSpanText() : "" }; info.Add(pInfo); } @@ -613,13 +614,19 @@ namespace IW4MAdmin public async Task GetPage(System.Collections.Specialized.NameValueCollection querySet, IDictionary headers) { - var Admins = (await (ApplicationManager.GetInstance().GetClientService() as ClientService) + var Admins = (await ApplicationManager.GetInstance().GetClientService() .GetPrivilegedClients()) - .OrderByDescending(a => a.Level).ToList(); + .OrderByDescending(a => a.Level); + HttpResponse resp = new HttpResponse() { contentType = GetContentType(), - content = Newtonsoft.Json.JsonConvert.SerializeObject(Admins, Newtonsoft.Json.Formatting.Indented), + content = Admins.Select(a => new + { + ClientId = a.ClientId, + Level = a.Level, + Name = a.Name + }), additionalHeaders = new Dictionary() }; return resp; @@ -795,15 +802,23 @@ namespace IW4MAdmin playerIPs = new List() }; - if (!recent && individual && authed) + if (!recent) { + eachPlayer.playerAliases = pp.AliasLink.Children + .OrderBy(a => a.Name) + .Select(a => a.Name) + .Distinct() + .ToList(); - eachPlayer.playerAliases = pp.AliasLink.Children.OrderBy(a => a.Name).Select(a => a.Name).ToList(); - eachPlayer.playerIPs = pp.AliasLink.Children.Select(a => a.IP).ToList(); + if (authed) + eachPlayer.playerIPs = pp.AliasLink.Children + .Select(a => a.IPAddress) + .Distinct() + .ToList(); } - eachPlayer.playerAliases = eachPlayer.playerAliases.Distinct().ToList(); - eachPlayer.playerIPs = eachPlayer.playerIPs.Distinct().ToList(); + //eachPlayer.playerAliases = eachPlayer.playerAliases.Distinct().ToList(); + // eachPlayer.playerIPs = eachPlayer.playerIPs.Distinct().ToList(); eachPlayer.playerConnections = pp.Connections; eachPlayer.lastSeen = Utilities.GetTimePassed(pp.LastConnection); diff --git a/Admin/lib/SharedLibrary.dll b/Admin/lib/SharedLibrary.dll index c6107f87fa9615f6d30c04a756a70b6fe8bd8383..884bd955f54b0edd6248d34ec18491899906275e 100644 GIT binary patch literal 143360 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 R!vnS6Ys1OTjf;0Z;rE*?De9#{m5vWdG~ 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 _RT#(ps5y)@|NW@(fBtVA!XU*z{?q&YnlX*I zha9AZ!_w+e{J4J!_{`#!Jv#vv zw)o~Qj1nD3If5^Q;L9qO^sSC)$A5X5^C3G2If64g+%czEzZv-VnpVtv3}f;2SbS;J za*S^7#ZBSc%CH|4JjeS~W4jvH2c*vs=)sp_@H;~Kx~?1b(-qrmHevX9&=2rgmw);9 I{~rea54lvZ;Q#;t diff --git a/Plugins/Tests/Plugin.cs b/Plugins/Tests/Plugin.cs index f920433af..1df1e95ce 100644 --- a/Plugins/Tests/Plugin.cs +++ b/Plugins/Tests/Plugin.cs @@ -4,11 +4,13 @@ using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; +using System.IO; using SharedLibrary; using SharedLibrary.Interfaces; using SharedLibrary.Helpers; using SharedLibrary.Objects; +using System.Text.RegularExpressions; namespace IW4MAdmin.Plugins { @@ -57,22 +59,140 @@ namespace IW4MAdmin.Plugins public async Task OnLoadAsync(IManager manager) { Interval = DateTime.Now; + #region CLIENTS + if (File.Exists("import_clients.csv")) + { + var clients = new List(); + manager.GetLogger().WriteInfo("Beginning import of existing clients"); + + var lines = File.ReadAllLines("import_clients.csv").Skip(1); + foreach (string line in lines) + { + string[] fields = Regex.Replace(line, "\".*\"", "").Split(','); + fields.All(f => + { + f = f.StripColors().Trim(); + return true; + }); + + if (fields.Length != 11) + { + manager.GetLogger().WriteError("Invalid client import file... aborting import"); + return; + } + + if (fields[1].Contains("0110") || fields[0] == string.Empty || fields[1] == string.Empty || fields[6] == string.Empty) + continue; + + if (!Regex.Match(fields[6], @"^\d+\.\d+\.\d+.\d+$").Success) + continue; + + var client = new Player() + { + Name = fields[0], + NetworkId = fields[1], + IPAddress = fields[6], + Level = (Player.Permission)Convert.ToInt32(fields[3]), + Connections = Convert.ToInt32(fields[5]), + LastConnection = DateTime.Parse(fields[7]), + }; + + clients.Add(client); + } + + clients = clients + .GroupBy(c => c.NetworkId, (key, c) => c.FirstOrDefault()) + .ToList(); + + clients = clients + .GroupBy(c => new { c.Name, c.IPAddress }) + .Select(c => c.FirstOrDefault()) + .ToList(); + + manager.GetLogger().WriteInfo($"Read {clients.Count} clients for import"); + + try + { + SharedLibrary.Database.Importer.ImportClients(clients); + } + + catch(Exception e) + { + manager.GetLogger().WriteError("Saving imported clients failed"); + } + } + #endregion + #region PENALTIES + if (File.Exists("import_penalties.csv")) + { + int importedPenalties = 0; + var penalties = new List(); + manager.GetLogger().WriteInfo("Beginning import of existing penalties"); + foreach (string line in File.ReadAllLines("import_penalties.csv").Skip(1)) + { + string comma = Regex.Match(line, "\".*,.*\"").Value.Replace(",", ""); + string[] fields = Regex.Replace(line, "\".*,.*\"", comma).Split(','); + + fields.All(f => + { + f = f.StripColors().Trim(); + return true; + }); + + if (fields.Length != 7) + { + manager.GetLogger().WriteError("Invalid penalty import file... aborting import"); + return; + } + + if (fields[2].Contains("0110") || fields[2].Contains("0000000") || fields.Any(p => p == string.Empty)) + continue; + try + { + + var expires = DateTime.Parse(fields[6]); + var when = DateTime.Parse(fields[5]); + + var penalty = new Penalty() + { + Type = (Penalty.PenaltyType)Int32.Parse(fields[0]), + Expires = expires == DateTime.MinValue ? when : expires, + Punisher = new SharedLibrary.Database.Models.EFClient() { NetworkId = fields[3]}, + Offender = new SharedLibrary.Database.Models.EFClient() { NetworkId = fields[2]}, + Offense = fields[1], + Active = true, + When = when, + }; + + + penalties.Add(penalty); + } + + catch (Exception e) + { + manager.GetLogger().WriteWarning($"Could not import client with line {line}"); + } + } + SharedLibrary.Database.Importer.ImportPenalties(penalties); + manager.GetLogger().WriteInfo($"Imported {penalties.Count} clients"); + } + #endregion } public async Task OnTickAsync(Server S) { + return; if ((DateTime.Now - Interval).TotalSeconds > 5) { var rand = new Random(); int index = rand.Next(0, 17); var p = new Player() { - Name = $"Test{index}", - NetworkId = $"_test{index}", + Name = $"Test_{index}", + NetworkId = $"_test_{index}", ClientNumber = index, - Level = Player.Permission.User, Ping = 1, - IPAddress = "127.0.0.1" + IPAddress = $"127.0.0.{index}" }; if (S.Players.ElementAt(index) != null) diff --git a/SharedLibrary/Commands/NativeCommands.cs b/SharedLibrary/Commands/NativeCommands.cs index 1a80af5b9..abb49836a 100644 --- a/SharedLibrary/Commands/NativeCommands.cs +++ b/SharedLibrary/Commands/NativeCommands.cs @@ -65,7 +65,7 @@ namespace SharedLibrary.Commands if (E.Origin.Level <= E.Target.Level) await E.Origin.Tell($"You do not have the required privileges to warn {E.Target.Name}"); else - await E.Target.Warn(E.Data.RemoveWords(1), E.Origin); + await E.Target.Warn(E.Data, E.Origin); } } @@ -113,7 +113,7 @@ namespace SharedLibrary.Commands if (E.Origin.Level > E.Target.Level) { await E.Owner.ExecuteEvent(new Event(Event.GType.Kick, E.Data, E.Origin, E.Target, E.Owner)); - await E.Target.Kick(E.Data.RemoveWords(1), E.Origin); + await E.Target.Kick(E.Data, E.Origin); await E.Origin.Tell($"^5{E.Target} ^7has been kicked"); } else @@ -165,11 +165,8 @@ namespace SharedLibrary.Commands public override async Task ExecuteAsync(Event E) { - String Message = Utilities.RemoveWords(E.Data, 1); - var length = Message.ParseTimespan(); - - if (length.TotalHours != 1) - Message = Utilities.RemoveWords(Message, 1); + String Message = Utilities.RemoveWords(E.Data, 1).Trim(); + var length = E.Data.Split(' ')[0].ParseTimespan(); if (E.Origin.Level > E.Target.Level) { @@ -402,7 +399,7 @@ namespace SharedLibrary.Commands return; } - Player.Permission newPerm = Utilities.MatchPermission(Utilities.RemoveWords(E.Data, 1)); + Player.Permission newPerm = Utilities.MatchPermission(E.Data); if (newPerm == Player.Permission.Owner && E.Origin.Level != Player.Permission.Console) newPerm = Player.Permission.Banned; @@ -566,7 +563,8 @@ namespace SharedLibrary.Commands return; } - var db_aliases = await E.Owner.Manager.GetAliasService().Find(a => a.Name.Contains(E.Data)); + var db_aliases = await E.Owner.Manager.GetAliasService() + .Find(a => a.Name.ToLower().Contains(E.Data.ToLower())); if (db_aliases.Count == 0) { @@ -575,9 +573,7 @@ namespace SharedLibrary.Commands } foreach (var P in db_aliases) - { await E.Origin.Tell($"^4{P.Name} ^7now goes by ^5{P.Link.Children.OrderByDescending(a => a.DateAdded).First().Name}"); - } } } @@ -630,7 +626,6 @@ namespace SharedLibrary.Commands public override async Task ExecuteAsync(Event E) { - E.Data = Utilities.RemoveWords(E.Data, 1); await E.Target.Tell("^1" + E.Origin.Name + " ^3[PM]^7 - " + E.Data); await E.Origin.Tell(String.Format("To ^3{0} ^7-> {1}", E.Target.Name, E.Data)); } @@ -680,13 +675,12 @@ namespace SharedLibrary.Commands if (E.Target.Level == Player.Permission.Flagged) { E.Target.Level = Player.Permission.User; - //E.Owner.Manager.GetClientPenalties().RemovePenalty(new Penalty(Penalty.PenaltyType.Flag, "", E.Target.NetworkId, "", DateTime.Now, "", DateTime.Now)); + await E.Owner.Manager.GetClientService().Update(E.Target); await E.Origin.Tell("You have ^5unflagged ^7" + E.Target.Name); } else { - E.Data = Utilities.RemoveWords(E.Data, 1); E.Target.Level = Player.Permission.Flagged; Penalty newPenalty = new Penalty() @@ -697,7 +691,8 @@ namespace SharedLibrary.Commands Offense = E.Data, Punisher = E.Origin, Active = true, - When = DateTime.UtcNow + When = DateTime.UtcNow, + Link = E.Target.AliasLink }; await E.Owner.Manager.GetPenaltyService().Create(newPenalty); @@ -705,7 +700,6 @@ namespace SharedLibrary.Commands await E.Origin.Tell("You have ^5flagged ^7" + E.Target.Name); } - await E.Owner.Manager.GetClientService().Update(E.Target); } } @@ -792,7 +786,7 @@ namespace SharedLibrary.Commands public class CMask : Command { public CMask() : - base("mask", "hide your online presence from online admin list", "hide", Player.Permission.Administrator, false) + base("mask", "hide your presence as an administrator", "hide", Player.Permission.Moderator, false) { } public override async Task ExecuteAsync(Event E) @@ -837,7 +831,7 @@ namespace SharedLibrary.Commands return; } - await E.Origin.Tell(String.Format("^1{0} ^7was banned by ^5{1} ^7for: {2} {3}", E.Target.Name, penalty.Punisher.Name, penalty.Offense, penalty.Type == Penalty.PenaltyType.TempBan ? $"({(penalty.Expires - DateTime.Now).TimeSpanText()} remaining)" : "")); + await E.Origin.Tell(String.Format("^1{0} ^7was banned by ^5{1} ^7for: {2} {3}", E.Target.Name, penalty.Punisher.Name, penalty.Offense, penalty.Type == Penalty.PenaltyType.TempBan ? $"({(penalty.Expires - DateTime.UtcNow).TimeSpanText()} remaining)" : "")); } } @@ -858,7 +852,7 @@ namespace SharedLibrary.Commands { StringBuilder message = new StringBuilder(); var names = new List(E.Target.AliasLink.Children.Select(a => a.Name)); - var IPs = new List(E.Target.AliasLink.Children.Select(a => a.IP)); + var IPs = new List(E.Target.AliasLink.Children.Select(a => a.IPAddress).Distinct()); await E.Target.Tell($"[^3{E.Target}^7]"); diff --git a/SharedLibrary/Database/IW4MAdminDatabaseContext.cs b/SharedLibrary/Database/DatabaseContext.cs similarity index 54% rename from SharedLibrary/Database/IW4MAdminDatabaseContext.cs rename to SharedLibrary/Database/DatabaseContext.cs index 9ad8d5918..568ed44bf 100644 --- a/SharedLibrary/Database/IW4MAdminDatabaseContext.cs +++ b/SharedLibrary/Database/DatabaseContext.cs @@ -6,34 +6,37 @@ using System.Text; using System.Threading.Tasks; using SharedLibrary.Database.Models; using System.Data.SqlServerCe; +using System.Data.Entity.ModelConfiguration.Conventions; namespace SharedLibrary.Database { - public class IW4MAdminDatabaseContext : DbContext + public class DatabaseContext : DbContext { public DbSet Clients { get; set; } public DbSet Aliases { get; set; } public DbSet AliasLinks { get; set; } public DbSet Penalties { get; set; } - public IW4MAdminDatabaseContext() : base("DefaultConnection") + public DatabaseContext() : base("DefaultConnection") { System.Data.Entity.Database.SetInitializer(new Initializer()); + Configuration.LazyLoadingEnabled = false; } protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.Entity() - .HasRequired(p => p.Punisher) - .WithMany(c => c.AdministeredPenalties) - .HasForeignKey(c => c.PunisherId) - .WillCascadeOnDelete(false); + .HasRequired(p => p.Offender) + .WithMany(c => c.ReceivedPenalties) + .HasForeignKey(c => c.OffenderId) + .WillCascadeOnDelete(false); + modelBuilder.Entity() - .HasRequired(p => p.Offender) - .WithMany(c => c.ReceivedPenalties) - .HasForeignKey(c => c.OffenderId) - .WillCascadeOnDelete(false); + .HasRequired(p => p.Punisher) + .WithMany(c => c.AdministeredPenalties) + .HasForeignKey(c => c.PunisherId) + .WillCascadeOnDelete(false); modelBuilder.Entity() .HasMany(e => e.Children) @@ -41,7 +44,17 @@ namespace SharedLibrary.Database .HasForeignKey(a => a.LinkId) .WillCascadeOnDelete(true); - // todo custom load DBSets from plugins + /* modelBuilder.Entity() + .HasIndex(a => new { a.IP, a.Name }) + .IsUnique(); + + modelBuilder.Entity() + .HasIndex(p => new { p.Name, p.IPAddress }).IsUnique();*/ + + + modelBuilder.Conventions.Remove(); + + // todo: custom load DBSets from plugins // https://aleemkhan.wordpress.com/2013/02/28/dynamically-adding-dbset-properties-in-dbcontext-for-entity-framework-code-first/ base.OnModelCreating(modelBuilder); } diff --git a/SharedLibrary/Database/Importer.cs b/SharedLibrary/Database/Importer.cs new file mode 100644 index 000000000..c55650721 --- /dev/null +++ b/SharedLibrary/Database/Importer.cs @@ -0,0 +1,165 @@ +using SharedLibrary.Database.Models; +using SharedLibrary.Objects; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace SharedLibrary.Database +{ + //https://stackoverflow.com/questions/5940225/fastest-way-of-inserting-in-entity-framework + public static class Importer + { + public static void ImportClients(IList clients) + { + DatabaseContext context = null; + + try + { + context = new DatabaseContext(); + context.Configuration.AutoDetectChangesEnabled = false; + + int count = 0; + foreach (var entityToInsert in clients) + { + ++count; + + var link = new EFAliasLink() { Active = true }; + + var alias = new EFAlias() + { + Active = true, + DateAdded = entityToInsert.LastConnection, + IPAddress = entityToInsert.IPAddress, + Link = link, + Name = entityToInsert.Name, + }; + + var client = new EFClient() + { + Active = true, + AliasLink = link, + Connections = entityToInsert.Connections, + CurrentAlias = alias, + FirstConnection = entityToInsert.LastConnection, + Level = entityToInsert.Level, + LastConnection = entityToInsert.LastConnection, + TotalConnectionTime = entityToInsert.TotalConnectionTime, + Masked = entityToInsert.Masked, + NetworkId = entityToInsert.NetworkId + }; + + context = AddClient(context, client, count, 100, true); + } + + context.SaveChanges(); + } + finally + { + if (context != null) + context.Dispose(); + } + } + + private static DatabaseContext AddClient(DatabaseContext context, EFClient client, int count, int commitCount, bool recreateContext) + { + context.Clients.Add(client); + if (count % commitCount == 0) + { + try + { + context.SaveChanges(); + } + + catch (Exception e) + { + var a = 1; + } + + if (recreateContext) + { + context.Dispose(); + context = new DatabaseContext(); + context.Configuration.AutoDetectChangesEnabled = false; + } + } + + return context; + } + + public static void ImportPenalties(IList penalties) + { + DatabaseContext context = null; + + try + { + context = new DatabaseContext(); + context.Configuration.AutoDetectChangesEnabled = false; + + int count = 0; + foreach (var entityToInsert in penalties) + { + ++count; + var punisher = entityToInsert.Offender.NetworkId == entityToInsert.Punisher.NetworkId ? + context.Clients.SingleOrDefault(c => c.ClientId == 1) : + context.Clients.SingleOrDefault(c => c.NetworkId == entityToInsert.Punisher.NetworkId); + if (punisher == null) + continue; + var offender = context.Clients.Include("AliasLink").SingleOrDefault(c => c.NetworkId == entityToInsert.Offender.NetworkId); + + if (offender == null) + continue; + + + var penalty = new EFPenalty() + { + Active = true, + Expires = entityToInsert.Expires.Year == 9999 ? DateTime.Parse(System.Data.SqlTypes.SqlDateTime.MinValue.ToString()) : entityToInsert.Expires, + Offender = offender, + Punisher = punisher, + Offense = entityToInsert.Offense, + Type = entityToInsert.Type, + When = entityToInsert.When == DateTime.MinValue ? DateTime.UtcNow : entityToInsert.When, + Link = offender.AliasLink + }; + + context = AddPenalty(context, penalty, count, 100, true); + } + + context.SaveChanges(); + } + finally + { + if (context != null) + context.Dispose(); + } + } + + private static DatabaseContext AddPenalty(DatabaseContext context, EFPenalty penalty, int count, int commitCount, bool recreateContext) + { + context.Penalties.Add(penalty); + if (count % commitCount == 0) + { + try + { + context.SaveChanges(); + } + + catch (Exception e) + { + var a = 1; + } + + if (recreateContext) + { + context.Dispose(); + context = new DatabaseContext(); + context.Configuration.AutoDetectChangesEnabled = false; + } + } + + return context; + } + } +} diff --git a/SharedLibrary/Database/Initializer.cs b/SharedLibrary/Database/Initializer.cs index a15e6af29..afffe33cc 100644 --- a/SharedLibrary/Database/Initializer.cs +++ b/SharedLibrary/Database/Initializer.cs @@ -7,22 +7,32 @@ using System.Threading.Tasks; namespace SharedLibrary.Database { - public class Initializer : DropCreateDatabaseIfModelChanges + public class Initializer : DropCreateDatabaseIfModelChanges { - protected override void Seed(IW4MAdminDatabaseContext context) + protected override void Seed(DatabaseContext context) { + var aliasLink = new Models.EFAliasLink(); + + var currentAlias = new Models.EFAlias() + { + Active = true, + DateAdded = DateTime.UtcNow, + IPAddress = "0.0.0.0", + Name = "IW4MAdmin", + Link = aliasLink + }; + context.Clients.Add(new Models.EFClient() { Active = false, Connections = 0, - AliasLink = new Models.EFAliasLink(), FirstConnection = DateTime.UtcNow, - IPAddress = "127.0.0.1", LastConnection = DateTime.UtcNow, Level = Objects.Player.Permission.Console, - Name = "IW4MAdmin", Masked = true, NetworkId = "0000000000000000", + AliasLink = aliasLink, + CurrentAlias = currentAlias }); base.Seed(context); diff --git a/SharedLibrary/Database/Models/EFAlias.cs b/SharedLibrary/Database/Models/EFAlias.cs index 49d035b67..adcea7341 100644 --- a/SharedLibrary/Database/Models/EFAlias.cs +++ b/SharedLibrary/Database/Models/EFAlias.cs @@ -1,10 +1,6 @@ using System; -using System.Collections.Generic; using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; -using System.Linq; -using System.Text; -using System.Threading.Tasks; namespace SharedLibrary.Database.Models { @@ -16,10 +12,12 @@ namespace SharedLibrary.Database.Models public int LinkId { get; set; } [ForeignKey("LinkId")] public virtual EFAliasLink Link { get; set; } - [Required] + // [Index("IX_IPandName", 0, IsUnique = true)] + //[MaxLength(24)] public string Name { get; set; } - [Required] - public string IP { get; set; } + // [Index("IX_IPandName", 1, IsUnique = true)] + // [MaxLength(24)] + public string IPAddress { get; set; } [Required] public DateTime DateAdded { get; set; } } diff --git a/SharedLibrary/Database/Models/EFAliasLink.cs b/SharedLibrary/Database/Models/EFAliasLink.cs index fcbc1f838..05d869a37 100644 --- a/SharedLibrary/Database/Models/EFAliasLink.cs +++ b/SharedLibrary/Database/Models/EFAliasLink.cs @@ -1,5 +1,7 @@ using System.Collections.Generic; using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; +using System.Linq; namespace SharedLibrary.Database.Models { @@ -8,10 +10,12 @@ namespace SharedLibrary.Database.Models [Key] public int AliasLinkId { get; set; } public virtual ICollection Children { get; set; } + public virtual ICollection ReceivedPenalties { get; set; } public EFAliasLink() { Children = new List(); + ReceivedPenalties = new List(); } } } diff --git a/SharedLibrary/Database/Models/EFClient.cs b/SharedLibrary/Database/Models/EFClient.cs index d8cfbfa24..1cb058017 100644 --- a/SharedLibrary/Database/Models/EFClient.cs +++ b/SharedLibrary/Database/Models/EFClient.cs @@ -15,17 +15,11 @@ namespace SharedLibrary.Database.Models [Index(IsUnique = true)] public string NetworkId { get; set; } - [Required] - public string Name { get; set; } - [Required] - public Objects.Player.Permission Level { get; set; } [Required] public int Connections { get; set; } [Required] public int TotalConnectionTime { get; set; } [Required] - public string IPAddress { get; set; } - [Required] public DateTime FirstConnection { get; set; } [Required] public DateTime LastConnection { get; set; } @@ -34,6 +28,27 @@ namespace SharedLibrary.Database.Models public int AliasLinkId { get; set; } [ForeignKey("AliasLinkId")] public virtual EFAliasLink AliasLink { get; set; } + [Required] + public Objects.Player.Permission Level { get; set; } + + [Required] + public int CurrentAliasId { get; set; } + [ForeignKey("CurrentAliasId")] + public virtual EFAlias CurrentAlias { get; set; } + + [NotMapped] + public virtual string Name + { + get { return CurrentAlias.Name; } + set { } + } + [NotMapped] + public virtual string IPAddress + { + get { return CurrentAlias.IPAddress; } + set { } + } + public virtual ICollection ReceivedPenalties { get; set; } public virtual ICollection AdministeredPenalties { get; set; } diff --git a/SharedLibrary/Objects/Player.cs b/SharedLibrary/Objects/Player.cs index a642b9bb9..d6edb3bd7 100644 --- a/SharedLibrary/Objects/Player.cs +++ b/SharedLibrary/Objects/Player.cs @@ -5,7 +5,7 @@ using System.Linq; using System.Threading.Tasks; namespace SharedLibrary.Objects -{ +{ public class Player : Database.Models.EFClient { public enum Permission @@ -25,8 +25,9 @@ namespace SharedLibrary.Objects public Player() { ConnectionTime = DateTime.UtcNow; + ClientNumber = -1; } - + public override string ToString() { return $"{Name}::{NetworkId}"; @@ -63,7 +64,7 @@ namespace SharedLibrary.Objects } [NotMapped] - public int ClientNumber { get; set; } + public int ClientNumber { get; set; } [NotMapped] public int Ping { get; set; } [NotMapped] @@ -72,5 +73,18 @@ namespace SharedLibrary.Objects public DateTime ConnectionTime { get; set; } [NotMapped] public Server CurrentServer { get; set; } + + private string _ipaddress; + public override string IPAddress + { + get { return _ipaddress; } + set { _ipaddress = value; } + } + private string _name; + public override string Name + { + get { return _name; } + set { _name = value; } + } } } diff --git a/SharedLibrary/Services/AliasService.cs b/SharedLibrary/Services/AliasService.cs index a19c17fe9..97f6e184e 100644 --- a/SharedLibrary/Services/AliasService.cs +++ b/SharedLibrary/Services/AliasService.cs @@ -16,12 +16,22 @@ namespace SharedLibrary.Services { public async Task Create(EFAlias entity) { - using (var context = new IW4MAdminDatabaseContext()) + throw new Exception(); + using (var context = new DatabaseContext()) { - entity.Link = await context.AliasLinks.FirstAsync(a => a.AliasLinkId == entity.Link.AliasLinkId); - var addedEntity = context.Aliases.Add(entity); + var alias = new EFAlias() + { + Active = true, + DateAdded = DateTime.UtcNow, + IPAddress = entity.IPAddress, + Name = entity.Name + }; + + entity.Link = await context.AliasLinks + .FirstAsync(a => a.AliasLinkId == entity.Link.AliasLinkId); + context.Aliases.Add(entity); await context.SaveChangesAsync(); - return addedEntity; + return entity; } } @@ -32,11 +42,11 @@ namespace SharedLibrary.Services public async Task Delete(EFAlias entity) { - using (var context = new IW4MAdminDatabaseContext()) + using (var context = new DatabaseContext()) { - entity = context.Aliases.Single(e => e.AliasId == entity.AliasId); - entity.Active = false; - context.Entry(entity).State = EntityState.Modified; + var alias = context.Aliases + .Single(e => e.AliasId == entity.AliasId); + alias.Active = false; await context.SaveChangesAsync(); return entity; } @@ -44,14 +54,18 @@ namespace SharedLibrary.Services public async Task> Find(Func expression) { - using (var context = new IW4MAdminDatabaseContext()) - return await Task.Run(() => context.Aliases.Where(expression).ToList()); + using (var context = new DatabaseContext()) + return await Task.Run(() => context.Aliases + .AsNoTracking() + .Include(a => a.Link.Children) + .Where(expression).ToList()); } public async Task Get(int entityID) { - using (var context = new IW4MAdminDatabaseContext()) + using (var context = new DatabaseContext()) return await context.Aliases + .AsNoTracking() .SingleOrDefaultAsync(e => e.AliasId == entityID); } @@ -62,7 +76,8 @@ namespace SharedLibrary.Services public async Task Update(EFAlias entity) { - using (var context = new IW4MAdminDatabaseContext()) + throw new Exception(); + using (var context = new DatabaseContext()) { entity = context.Aliases.Attach(entity); context.Entry(entity).State = EntityState.Modified; @@ -73,7 +88,7 @@ namespace SharedLibrary.Services public async Task CreateLink(EFAliasLink link) { - using (var context = new IW4MAdminDatabaseContext()) + using (var context = new DatabaseContext()) { context.AliasLinks.Add(link); await context.SaveChangesAsync(); diff --git a/SharedLibrary/Services/ClientService.cs b/SharedLibrary/Services/ClientService.cs index 214fe9c99..60eba54dc 100644 --- a/SharedLibrary/Services/ClientService.cs +++ b/SharedLibrary/Services/ClientService.cs @@ -11,46 +11,61 @@ using System.Linq.Expressions; namespace SharedLibrary.Services { + public class ClientService : Interfaces.IEntityService { - private Dictionary _context; - - public ClientService() - { - _context = new Dictionary(); - } public async Task Create(EFClient entity) { - using (var context = new IW4MAdminDatabaseContext()) + using (var context = new DatabaseContext()) { - + bool hasExistingAlias = false; // get all aliases by IP - var alias = await context.Aliases.FirstOrDefaultAsync(a => a.IP == entity.IPAddress); - EFAliasLink link = alias?.Link; + var aliases = await context.Aliases + .Include(a => a.Link) + .Where(a => a.IPAddress == entity.IPAddress) + .ToListAsync(); + + // see if they have a matching IP + Name but new NetworkId + var existingAlias = aliases.SingleOrDefault(a => a.Name == entity.Name); + // if existing alias matches link them + EFAliasLink aliasLink = existingAlias?.Link; + // if no exact matches find the first IP that matches + aliasLink = aliasLink ?? aliases.FirstOrDefault()?.Link; + // if no exact or IP matches, create new link + aliasLink = aliasLink ?? new EFAliasLink() + { + Active = true, + }; + + // this has to be set here because we can't evalute it properly later + hasExistingAlias = existingAlias != null; + + // if no existing alias create new alias + existingAlias = existingAlias ?? new EFAlias() + { + Active = true, + DateAdded = DateTime.UtcNow, + IPAddress = entity.IPAddress, + Link = aliasLink, + Name = entity.Name, + }; var client = new EFClient() { Active = true, - Name = entity.Name, + // set the level to the level of the existing client if they have the same IP + Name but new NetworkId + Level = hasExistingAlias ? + context.Clients.First(c => c.CurrentAliasId == existingAlias.AliasId).Level : + Objects.Player.Permission.User, FirstConnection = DateTime.UtcNow, Connections = 1, - IPAddress = entity.IPAddress, LastConnection = DateTime.UtcNow, - Level = Objects.Player.Permission.User, Masked = false, NetworkId = entity.NetworkId, - AliasLink = link ?? new EFAliasLink() { Active = true } + AliasLink = aliasLink, + CurrentAlias = existingAlias }; - client.AliasLink.Children.Add(new EFAlias() - { - Active = true, - DateAdded = DateTime.UtcNow, - IP = entity.IPAddress, - Link = client.AliasLink, - Name = entity.Name - }); - context.Clients.Add(client); await context.SaveChangesAsync(); @@ -60,11 +75,11 @@ namespace SharedLibrary.Services public async Task Delete(EFClient entity) { - using (var context = new IW4MAdminDatabaseContext()) + using (var context = new DatabaseContext()) { - entity = context.Clients.Single(e => e.ClientId == entity.ClientId); + var client = context.Clients + .Single(e => e.ClientId == entity.ClientId); entity.Active = false; - entity.Level = Objects.Player.Permission.User; context.Entry(entity).State = EntityState.Modified; await context.SaveChangesAsync(); return entity; @@ -73,25 +88,31 @@ namespace SharedLibrary.Services public async Task> Find(Func e) { - using (var context = new IW4MAdminDatabaseContext()) + using (var context = new DatabaseContext()) return await Task.Run(() => context.Clients + .AsNoTracking() + .Include(c => c.CurrentAlias) .Include(c => c.AliasLink.Children) .Where(e).ToList()); } public async Task Get(int entityID) { - using (var context = new IW4MAdminDatabaseContext()) - return await new IW4MAdminDatabaseContext().Clients + using (var context = new DatabaseContext()) + return await new DatabaseContext().Clients + .AsNoTracking() + .Include(c => c.CurrentAlias) .Include(c => c.AliasLink.Children) .SingleOrDefaultAsync(e => e.ClientId == entityID); } public async Task GetUnique(string entityAttribute) { - using (var context = new IW4MAdminDatabaseContext()) + using (var context = new DatabaseContext()) { return await context.Clients + .AsNoTracking() + .Include(c => c.CurrentAlias) .Include(c => c.AliasLink.Children) .SingleOrDefaultAsync(c => c.NetworkId == entityAttribute); } @@ -99,42 +120,97 @@ namespace SharedLibrary.Services public async Task Update(EFClient entity) { - using (var context = new IW4MAdminDatabaseContext()) + using (var context = new DatabaseContext()) { - entity = context.Clients.Attach(entity); - context.Entry(entity).State = EntityState.Modified; + // grab the context version of the entity + var client = context.Clients + .Include(c => c.AliasLink) + .Include(c=> c.CurrentAlias) + .Single(e => e.ClientId == entity.ClientId); + + // if their level has been changed + if (entity.Level != client.Level) + { + // get all clients that use the same aliasId + var matchingClients = await context.Clients + .Where(c => c.CurrentAliasId == client.CurrentAliasId) + .ToListAsync(); + + // update all related clients level + matchingClients.ForEach(c => c.Level = (client.Level == Objects.Player.Permission.Banned) ? + client.Level : entity.Level); + } + + // their alias has been updated and not yet saved + if (entity.CurrentAlias.AliasId == 0) + { + client.CurrentAlias = new EFAlias() + { + Active = true, + DateAdded = DateTime.UtcNow, + IPAddress = entity.CurrentAlias.IPAddress, + Name = entity.CurrentAlias.Name, + Link = client.AliasLink + }; + } + + // set remaining non-navigation properties that may have been updated + client.Level = entity.Level; + client.LastConnection = entity.LastConnection; + client.Connections = entity.Connections; + client.FirstConnection = entity.FirstConnection; + client.Masked = entity.Masked; + client.TotalConnectionTime = entity.TotalConnectionTime; + + // update in database await context.SaveChangesAsync(); - return entity; + + // this is set so future updates don't trigger a new alias add + if (entity.CurrentAlias.AliasId == 0) + entity.CurrentAlias.AliasId = client.CurrentAlias.AliasId; + return client; } } - #region ServiceSpecific +#region ServiceSpecific public async Task> GetOwners() { - using (var context = new IW4MAdminDatabaseContext()) - return await context.Clients.Where(c => c.Level == Objects.Player.Permission.Owner).ToListAsync(); + using (var context = new DatabaseContext()) + return await context.Clients + .Where(c => c.Level == Objects.Player.Permission.Owner) + .ToListAsync(); } public async Task> GetPrivilegedClients() { - using (var context = new IW4MAdminDatabaseContext()) - return await new IW4MAdminDatabaseContext().Clients - .Where(c => c.Level >= Objects.Player.Permission.Trusted) - .ToListAsync(); + using (var context = new DatabaseContext()) + return await new DatabaseContext().Clients + .AsNoTracking() + .Include(c => c.CurrentAlias) + .Where(c => c.Level >= Objects.Player.Permission.Trusted) + .ToListAsync(); } public async Task> GetRecentClients(int offset, int count) { - using (var context = new IW4MAdminDatabaseContext()) - return await context.Clients.OrderByDescending(p => p.ClientId).Skip(offset).Take(count).ToListAsync(); + using (var context = new DatabaseContext()) + return await context.Clients + .AsNoTracking() + .Include(c => c.CurrentAlias) + .Include(p => p.AliasLink) + .OrderByDescending(p => p.ClientId) + .Skip(offset) + .Take(count) + .ToListAsync(); } public async Task> PruneInactivePrivilegedClients(int inactiveDays) { - using (var context = new IW4MAdminDatabaseContext()) + using (var context = new DatabaseContext()) { var inactive = await context.Clients.Where(c => c.Level > Objects.Player.Permission.Flagged) + .AsNoTracking() .Where(c => (DateTime.UtcNow - c.LastConnection).TotalDays >= inactiveDays) .ToListAsync(); inactive.ForEach(c => c.Level = Objects.Player.Permission.User); @@ -145,14 +221,15 @@ namespace SharedLibrary.Services public async Task GetTotalClientsAsync() { - using (var context = new IW4MAdminDatabaseContext()) - return await context.Clients.CountAsync(); + using (var context = new DatabaseContext()) + return await context.Clients + .CountAsync(); } public Task CreateProxy() { throw new NotImplementedException(); } - #endregion +#endregion } } diff --git a/SharedLibrary/Services/PenaltyService.cs b/SharedLibrary/Services/PenaltyService.cs index d2237b36b..b29b90965 100644 --- a/SharedLibrary/Services/PenaltyService.cs +++ b/SharedLibrary/Services/PenaltyService.cs @@ -15,13 +15,29 @@ namespace SharedLibrary.Services { public async Task Create(EFPenalty entity) { - using (var context = new IW4MAdminDatabaseContext()) + using (var context = new DatabaseContext()) { entity.Offender = context.Clients.First(e => e.ClientId == entity.Offender.ClientId); entity.Punisher = context.Clients.First(e => e.ClientId == entity.Punisher.ClientId); entity.Link = context.AliasLinks.First(l => l.AliasLinkId == entity.Link.AliasLinkId); - if (entity.Expires == DateTime.MinValue) + + // make bans propogate to all aliases + if (entity.Type == Objects.Penalty.PenaltyType.Ban) + { entity.Expires = DateTime.Parse(System.Data.SqlTypes.SqlDateTime.MaxValue.ToString()); + await context.Clients + .Where(c => c.AliasLinkId == entity.Link.AliasLinkId) + .ForEachAsync(c => c.Level = Objects.Player.Permission.Banned); + } + + // make flags propogate to all aliases + else if (entity.Type == Objects.Penalty.PenaltyType.Flag) + { + await context.Clients + .Where(c => c.AliasLinkId == entity.Link.AliasLinkId) + .ForEachAsync(c => c.Level = Objects.Player.Permission.Flagged); + } + context.Penalties.Add(entity); await context.SaveChangesAsync(); return entity; @@ -40,7 +56,7 @@ namespace SharedLibrary.Services public async Task> Find(Func expression) { - using (var context = new IW4MAdminDatabaseContext()) + using (var context = new DatabaseContext()) { return await Task.Run(() => context.Penalties .Include(p => p.Offender) @@ -68,11 +84,12 @@ namespace SharedLibrary.Services public async Task> GetRecentPenalties(int count, int offset) { - using (var context = new IW4MAdminDatabaseContext()) + using (var context = new DatabaseContext()) return await context.Penalties - .Include(p => p.Offender) - .Include(p => p.Punisher) - .Where(p => p.Active) + .AsNoTracking() + .Include(p => p.Offender.CurrentAlias) + .Include(p => p.Punisher.CurrentAlias) + .Where(p => p.Active) .OrderByDescending(p => p.When) .Skip(offset) .Take(count) @@ -81,18 +98,19 @@ namespace SharedLibrary.Services public async Task> GetClientPenaltiesAsync(int clientId) { - using (var context = new IW4MAdminDatabaseContext()) + using (var context = new DatabaseContext()) return await context.Penalties - .Where(p => p.OffenderId == clientId) - .Where(p => p.Active) - .Include(p => p.Offender) - .Include(p => p.Punisher) - .ToListAsync(); + .AsNoTracking() + .Where(p => p.OffenderId == clientId) + .Where(p => p.Active) + .Include(p => p.Offender.CurrentAlias) + .Include(p => p.Punisher.CurrentAlias) + .ToListAsync(); } public async Task RemoveActivePenalties(int aliasLinkId) { - using (var context = new IW4MAdminDatabaseContext()) + using (var context = new DatabaseContext()) { var now = DateTime.UtcNow; var penalties = await context.Penalties @@ -104,10 +122,11 @@ namespace SharedLibrary.Services penalties.ForEach(async p => { p.Active = false; - var clients = await context.Clients.Where(cl => cl.AliasLinkId == p.LinkId).ToListAsync(); - foreach (var c in clients) - if (c.Level == Objects.Player.Permission.Banned) - c.Level = Objects.Player.Permission.User; + // reset the player levels + if (p.Type == Objects.Penalty.PenaltyType.Ban) + await context.Clients + .Where(c => c.AliasLinkId == p.LinkId) + .ForEachAsync(c => c.Level = Objects.Player.Permission.User); }); await context.SaveChangesAsync(); diff --git a/SharedLibrary/SharedLibrary.csproj b/SharedLibrary/SharedLibrary.csproj index 51b5e1f02..0ba366054 100644 --- a/SharedLibrary/SharedLibrary.csproj +++ b/SharedLibrary/SharedLibrary.csproj @@ -94,8 +94,9 @@ + - + diff --git a/SharedLibrary/Utilities.cs b/SharedLibrary/Utilities.cs index 9dddeb6c4..8fd17f04c 100644 --- a/SharedLibrary/Utilities.cs +++ b/SharedLibrary/Utilities.cs @@ -90,7 +90,7 @@ namespace SharedLibrary { if (str == null) return ""; - return Regex.Replace(str, @"\^([0-9]|\:)", ""); + return Regex.Replace(str, @"(\^+((?![a-z]|[A-Z]).){0,1})+", ""); } /// @@ -207,7 +207,7 @@ namespace SharedLibrary public static String GetTimePassed(DateTime start, bool includeAgo) { - TimeSpan Elapsed = DateTime.Now - start; + TimeSpan Elapsed = DateTime.UtcNow - start; string ago = includeAgo ? " ago" : ""; if (Elapsed.TotalSeconds < 30 && includeAgo) @@ -305,19 +305,20 @@ namespace SharedLibrary return client == null ? null : new Player() { Active = client.Active, - AliasLink =client.AliasLink, + AliasLink = client.AliasLink, AliasLinkId = client.AliasLinkId, ClientId = client.ClientId, ClientNumber = 0, FirstConnection = client.FirstConnection, Connections = client.Connections, - IPAddress = client.IPAddress, NetworkId = client.NetworkId, - Name = client.Name, - Level = client.Level, TotalConnectionTime = client.TotalConnectionTime, Masked = client.Masked, - LastConnection = DateTime.UtcNow + Name = client.CurrentAlias.Name, + IPAddress = client.CurrentAlias.IPAddress, + Level = client.Level, + LastConnection = DateTime.UtcNow, + CurrentAlias = client.CurrentAlias }; } }