From 8d52d7ddc5eef67f0c9dcf9d3d2024c0b8575a0a Mon Sep 17 00:00:00 2001 From: RaidMax Date: Wed, 27 Sep 2017 15:07:43 -0500 Subject: [PATCH] -added back player history graphs (past 12 hours every 15 minutes) -fixed issue with configurationmanager files and threading -servers on webfront listed in descending player count -fixed resolution of tempban times from console feedback -Added tests plugin to simulate functionality --- Admin/Application.csproj | 5 +- Admin/Kayak.cs | 5 +- Admin/Manager.cs | 14 ++- Admin/Server.cs | 13 ++- Admin/WebService.cs | 76 ++++++++++-- Admin/lib/SharedLibrary.dll | Bin 98816 -> 107520 bytes Admin/version.txt | 9 +- Admin/webfront/graph.html | 58 ---------- Admin/webfront/header.html | 1 + Admin/webfront/main.css | 14 ++- Admin/webfront/main.html | 108 +++++++++++++++--- Admin/webfront/penalties.html | 2 + IW4MAdmin.sln | 35 ++++++ Plugins/Tests/Plugin.cs | 78 +++++++++++++ Plugins/Tests/Properties/AssemblyInfo.cs | 36 ++++++ Plugins/Tests/Tests.csproj | 56 +++++++++ SharedLibrary/Helpers/ConfigurationManager.cs | 19 +-- SharedLibrary/Helpers/PlayerHistory.cs | 43 ++++++- SharedLibrary/Interfaces/IManager.cs | 1 + SharedLibrary/RCON.cs | 2 +- SharedLibrary/Utilities.cs | 22 ++-- 21 files changed, 470 insertions(+), 127 deletions(-) delete mode 100644 Admin/webfront/graph.html create mode 100644 Plugins/Tests/Plugin.cs create mode 100644 Plugins/Tests/Properties/AssemblyInfo.cs create mode 100644 Plugins/Tests/Tests.csproj diff --git a/Admin/Application.csproj b/Admin/Application.csproj index a33717bfa..e8822e813 100644 --- a/Admin/Application.csproj +++ b/Admin/Application.csproj @@ -174,9 +174,6 @@ PreserveNewest - - PreserveNewest - PreserveNewest @@ -187,7 +184,7 @@ PreserveNewest - PreserveNewest + Always PreserveNewest diff --git a/Admin/Kayak.cs b/Admin/Kayak.cs index 12dc5213a..94ecdfdd4 100644 --- a/Admin/Kayak.cs +++ b/Admin/Kayak.cs @@ -69,7 +69,10 @@ namespace IW4MAdmin catch (Exception e) { - ApplicationManager.GetInstance().Logger.WriteError($"Webfront error during request: {e.Message}"); + ApplicationManager.GetInstance().Logger.WriteError($"Webfront error during request"); + ApplicationManager.GetInstance().Logger.WriteDebug($"Message: {e.Message}"); + ApplicationManager.GetInstance().Logger.WriteDebug($"Stack Trace: {e.StackTrace}"); + response.OnResponse(new HttpResponseHead() { Status = "500 Internal Server Error", diff --git a/Admin/Manager.cs b/Admin/Manager.cs index 7a90b3b77..cd310d233 100644 --- a/Admin/Manager.cs +++ b/Admin/Manager.cs @@ -28,6 +28,7 @@ namespace IW4MAdmin List MessageTokens; Kayak.IScheduler webServiceTask; Thread WebThread; + List PrivilegedClients; #if FTP_LOG const int UPDATE_FREQUENCY = 15000; #else @@ -179,11 +180,17 @@ namespace IW4MAdmin WebThread.Start(); #endregion + #region ADMINS + PrivilegedClients = GetClientDatabase().GetAdmins(); + #endregion + + Running = true; } public void Start() { + var a = Utilities.DateTimeSQLite(DateTime.MinValue); while (Running) { for (int i = 0; i < TaskStatuses.Count; i++) @@ -197,7 +204,7 @@ namespace IW4MAdmin } } - Thread.Sleep(300); + Thread.Sleep(UPDATE_FREQUENCY); } #if !DEBUG foreach (var S in Servers) @@ -277,6 +284,11 @@ namespace IW4MAdmin return allAliases; } + public IList GetPrivilegedClients() + { + return PrivilegedClients; + } + private void GetAliases(List returnAliases, Aliases currentAlias) { foreach (String IP in currentAlias.IPS) diff --git a/Admin/Server.cs b/Admin/Server.cs index 92f3324ec..bb5345c7c 100644 --- a/Admin/Server.cs +++ b/Admin/Server.cs @@ -291,6 +291,9 @@ namespace IW4MAdmin async Task PollPlayersAsync() { +#if DEBUG + return Players.Where(p => p != null).Count(); +#endif var CurrentPlayers = await this.GetStatusAsync(); for (int i = 0; i < Players.Count; i++) @@ -357,15 +360,15 @@ namespace IW4MAdmin tickTime = DateTime.Now; } - if ((lastCount - playerCountStart).TotalMinutes > 4) + if ((lastCount - playerCountStart).TotalMinutes >= 15) { - while (PlayerHistory.Count > 144) // 12 times a minute for 12 hours + while (PlayerHistory.Count > 48) // 4 times a hour for 12 hours PlayerHistory.Dequeue(); - PlayerHistory.Enqueue(new SharedLibrary.Helpers.PlayerHistory(lastCount, ClientNum)); + PlayerHistory.Enqueue(new SharedLibrary.Helpers.PlayerHistory(ClientNum)); playerCountStart = DateTime.Now; } - if (LastMessage.TotalSeconds > MessageTime && BroadcastMessages.Count > 0 /*&& ClientNum > 0*/) + if (LastMessage.TotalSeconds > MessageTime && BroadcastMessages.Count > 0 && ClientNum > 0) { await Broadcast(Utilities.ProcessMessageToken(Manager.GetMessageTokens(), BroadcastMessages[NextMessage])); NextMessage = NextMessage == (BroadcastMessages.Count - 1) ? 0 : NextMessage + 1; @@ -489,7 +492,7 @@ namespace IW4MAdmin } #if DEBUG basepath.Value = (GameName == Game.IW4) ? - @"\\tsclient\K\MW2" : + @"\\tsclient\J\WIN7_10.25\MW2" : @"\\tsclient\G\Program Files (x86)\Steam\SteamApps\common\Call of Duty 4"; #endif string mainPath = (GameName == Game.IW4) ? "userraw" : "main"; diff --git a/Admin/WebService.cs b/Admin/WebService.cs index 2e31c1c94..25d7a80ce 100644 --- a/Admin/WebService.cs +++ b/Admin/WebService.cs @@ -22,6 +22,7 @@ namespace IW4MAdmin SharedLibrary.WebService.PageList.Add(new Pages()); SharedLibrary.WebService.PageList.Add(new Homepage()); SharedLibrary.WebService.PageList.Add(new ServersJSON()); + SharedLibrary.WebService.PageList.Add(new PlayerHistoryJSON()); SharedLibrary.WebService.PageList.Add(new Penalties()); SharedLibrary.WebService.PageList.Add(new PenaltiesJSON()); SharedLibrary.WebService.PageList.Add(new Players()); @@ -57,7 +58,7 @@ namespace IW4MAdmin catch (Exception e) { - ApplicationManager.GetInstance().Logger.WriteError($"Unable to start webservice ( port is probably in use ): {e.Message}"); + ApplicationManager.GetInstance().Logger.WriteError($"Unable to start webservice ( port is probably in use ): {e.Message}"); } } @@ -196,6 +197,7 @@ namespace IW4MAdmin { var info = new List(); + int i = 0; foreach (Server S in ApplicationManager.GetInstance().Servers) { ServerInfo eachServer = new ServerInfo() @@ -207,10 +209,16 @@ namespace IW4MAdmin gameType = Utilities.GetLocalizedGametype(S.Gametype), currentPlayers = S.GetPlayersAsList().Count, chatHistory = S.ChatHistory, - players = new List() + players = new List(), + ID = i }; - bool authed = ApplicationManager.GetInstance().GetClientDatabase().GetAdmins().FindAll(x => x.IP == querySet["IP"] && x.Level > Player.Permission.Trusted).Count > 0 - || querySet["IP"] == "127.0.0.1"; + + i++; + + bool authed = ApplicationManager.GetInstance().GetPrivilegedClients() + .Where(x => x.IP == querySet["IP"]) + .Where(x => x.Level > Player.Permission.Trusted).Count() > 0 + || querySet["IP"] == "127.0.0.1"; foreach (Player P in S.GetPlayersAsList()) { @@ -226,7 +234,6 @@ namespace IW4MAdmin info.Add(eachServer); } - HttpResponse resp = new HttpResponse() { contentType = GetContentType(), @@ -247,6 +254,54 @@ namespace IW4MAdmin } } + + class PlayerHistoryJSON : IPage + { + public string GetName() + { + return "Player History"; + } + + public string GetPath() + { + return "/_playerhistory"; + } + + public HttpResponse GetPage(System.Collections.Specialized.NameValueCollection querySet, IDictionary headers) + { + + var history = new SharedLibrary.Helpers.PlayerHistory[0]; + try + { + int id = Int32.Parse(querySet["server"]); + history = ApplicationManager.GetInstance().GetServers()[id].PlayerHistory.ToArray(); + } + + catch (Exception) + { + + } + + HttpResponse resp = new HttpResponse() + { + contentType = GetContentType(), + content = Newtonsoft.Json.JsonConvert.SerializeObject(history), + additionalHeaders = new Dictionary() + }; + return resp; + } + + public string GetContentType() + { + return "application/json"; + } + + public bool Visible() + { + return false; + } + } + class Info : IPage { public string GetName() @@ -412,7 +467,8 @@ namespace IW4MAdmin penaltyTime = Utilities.GetTimePassed(p.When), penaltyType = p.BType.ToString(), playerName = penalized.Name, - playerID = penalized.DatabaseID + playerID = penalized.DatabaseID, + Expires = p.Expires > DateTime.Now ? (p.Expires - DateTime.Now).TimeSpanText() : "" }; if (admin.NetworkID == penalized.NetworkID) @@ -644,7 +700,7 @@ namespace IW4MAdmin PageInfo pi = new PageInfo() { - pagePath = p.GetPath(), + pagePath = p.GetPath(), pageName = p.GetName(), visible = p.Visible() }; @@ -670,7 +726,7 @@ namespace IW4MAdmin return false; } } - + class GetPlayer : IPage { public string GetContentType() @@ -718,7 +774,7 @@ namespace IW4MAdmin else if (querySet["recent"] != null) { - matchedPlayers = ApplicationManager.GetInstance().GetClientDatabase().GetRecentPlayers(); + matchedPlayers = ApplicationManager.GetInstance().GetClientDatabase().GetRecentPlayers(); recent = true; } @@ -780,6 +836,7 @@ namespace IW4MAdmin public int maxPlayers; public List chatHistory; public List players; + public int ID; } [Serializable] @@ -825,6 +882,7 @@ namespace IW4MAdmin public string penaltyType; public string penaltyReason; public string penaltyTime; + public string Expires; } [Serializable] diff --git a/Admin/lib/SharedLibrary.dll b/Admin/lib/SharedLibrary.dll index b819a852d69b1ba1aa6ce4c970542c6897aabe11..52329072abf79ffeaa43e44b189be1bb01c79ad4 100644 GIT binary patch literal 107520 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
=4}JzmUMF~y;BA6; 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 bgWpt6_t=3SwiJ)$@5h%6e*5?TKMDLVR$%m_ diff --git a/Admin/version.txt b/Admin/version.txt index 9a0030d4d..dca5454e6 100644 --- a/Admin/version.txt +++ b/Admin/version.txt @@ -1,4 +1,11 @@ -VERSION 1.4 +Versino 1.5 +CHANGELOG: +-added back player history graphs (past 12 hours every 15 minutes) +-fixed issue with configurationmanager files and threading +-servers on webfront listed in descending player count +-fixed resolution of tempban times from console feedback + +VERSION 1.4 CHANGELOG: -works: with COD, WaW, MW3, BO1 (preliminary without extensive testing) -fixed the issue with webfront chat history diff --git a/Admin/webfront/graph.html b/Admin/webfront/graph.html deleted file mode 100644 index a1d26a701..000000000 --- a/Admin/webfront/graph.html +++ /dev/null @@ -1,58 +0,0 @@ - - -{{GRAPH}} diff --git a/Admin/webfront/header.html b/Admin/webfront/header.html index 989efcc04..aca2ff546 100644 --- a/Admin/webfront/header.html +++ b/Admin/webfront/header.html @@ -8,6 +8,7 @@ + diff --git a/Admin/webfront/main.css b/Admin/webfront/main.css index 111990e20..1020dbed8 100644 --- a/Admin/webfront/main.css +++ b/Admin/webfront/main.css @@ -15,7 +15,7 @@ div#header #navContainer .navEntry a { padding: 1.2vw; width: 4vw; } div#header #navContainer .navEntry:hover { background-color: rgb(34, 34, 34); } div#content { margin: 3em 10%; } -div#content .serverContainer { background-color: #191919; margin: 2em 0; font-size: 1.25vw; } +div#content .serverContainer { background-color: #191919; margin-top 0; margin-bottom: 0; font-size: 1.25vw; padding-bottom: 100px; } div#content hr { border-width: 0; height: 0.25em; background-color: #007ACC; } div#content .serverInfo { width: 100%; } div#content .serverInfo .tableCell { padding: 0 0.5em; } @@ -31,13 +31,15 @@ div#content .chatPlayerName { font-weight: bold; font-size: 1.1vw; color:#fff; p div#content .chatPlayerMessage {font-size: 1.1vw; color: #fff; opacity: 1; } div#content .playerPenalty, div#content .playerInfo { margin: 0 auto; padding: 1em 10px; background-color: #181818; width: calc(100% - 20px); } -div#content .penaltyName { width: 14.28%; } +div#content .penaltyName { width: 15%; } div#content .penaltyName a:link, div#content .penaltyName a:visited, div#content .playerInfo a:link, div#content .playerInfo a:visited { color: rgb(0, 122, 204) !important; } div#content .penaltyName a:hover, div#content .playerInfo a:hover { color: rgb(255, 255, 255) !important; opacity: 0.75; } -div#content .penaltyTime { text-align: right; width: 12.5%; } +div#content .penaltyTime { text-align: left; width:8%; } +div#content .penaltyOrigin {width: 12%;} +div#content .penaltyRemaining { text-align: right; width: 10%:} div#content .playerPenalty .penaltyTime { opacity: 0.5; } -div#content .penaltyType { width: 12.5%; } -div#content .penaltyReason { width: 50%; } +div#content .penaltyType { width: 10%; } +div#content .penaltyReason { width: 45%; } div#content .playerPenalty .tableCell { } div#content .penaltyHeader, div#content .contentHeader { width: calc(100% - 20px); background-color: #007ACC; font-size: 15pt; padding: 0.5em 10px; } div#content .alternate_1 { background-color: rgb(34, 34, 34); } @@ -199,3 +201,5 @@ div#footer { position: fixed; bottom: 0.5em; right: 0.5em; opacity: 0.5; } .admin-name a { font-size: 14pt; color: #007ACC !important; } .admin-name a:hover { color: #fff !important; } .clients { margin: 0.5em; } +.canvasjs-chart-credit { display: none; } +.player-history { margin-top: -100px; height: 100px; } \ No newline at end of file diff --git a/Admin/webfront/main.html b/Admin/webfront/main.html index d17cdf0ae..cc58c003b 100644 --- a/Admin/webfront/main.html +++ b/Admin/webfront/main.html @@ -1,31 +1,101 @@

diff --git a/Admin/webfront/penalties.html b/Admin/webfront/penalties.html index ffcedb978..4a7ffa75f 100644 --- a/Admin/webfront/penalties.html +++ b/Admin/webfront/penalties.html @@ -34,6 +34,7 @@ function getPenalties(from)
"+ penalty['penaltyReason'] + "
\
"+ getColorForLevel(penalty['adminLevel'], penalty['adminName']) + "
\
"+ penalty['penaltyTime'] + "
\ +
" + penalty['Expires'] + "
\ " ) }); @@ -51,6 +52,7 @@ $( document ).ready(function() {
Reason
Admin
Time
+
Remaining
diff --git a/IW4MAdmin.sln b/IW4MAdmin.sln index 16ba56c85..70259908c 100644 --- a/IW4MAdmin.sln +++ b/IW4MAdmin.sln @@ -39,6 +39,8 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution README.md = README.md EndProjectSection EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Tests", "Plugins\Tests\Tests.csproj", "{B8C2A759-8663-4F6F-9BA4-19595F5E12C1}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -303,6 +305,38 @@ Global {1479DE87-ACB5-4046-81C8-A0BA5041227D}.Release-Stable|x64.Build.0 = Release|Any CPU {1479DE87-ACB5-4046-81C8-A0BA5041227D}.Release-Stable|x86.ActiveCfg = Release|Any CPU {1479DE87-ACB5-4046-81C8-A0BA5041227D}.Release-Stable|x86.Build.0 = Release|Any CPU + {B8C2A759-8663-4F6F-9BA4-19595F5E12C1}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B8C2A759-8663-4F6F-9BA4-19595F5E12C1}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B8C2A759-8663-4F6F-9BA4-19595F5E12C1}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {B8C2A759-8663-4F6F-9BA4-19595F5E12C1}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {B8C2A759-8663-4F6F-9BA4-19595F5E12C1}.Debug|x64.ActiveCfg = Debug|Any CPU + {B8C2A759-8663-4F6F-9BA4-19595F5E12C1}.Debug|x64.Build.0 = Debug|Any CPU + {B8C2A759-8663-4F6F-9BA4-19595F5E12C1}.Debug|x86.ActiveCfg = Debug|Any CPU + {B8C2A759-8663-4F6F-9BA4-19595F5E12C1}.Debug|x86.Build.0 = Debug|Any CPU + {B8C2A759-8663-4F6F-9BA4-19595F5E12C1}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B8C2A759-8663-4F6F-9BA4-19595F5E12C1}.Release|Any CPU.Build.0 = Release|Any CPU + {B8C2A759-8663-4F6F-9BA4-19595F5E12C1}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {B8C2A759-8663-4F6F-9BA4-19595F5E12C1}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {B8C2A759-8663-4F6F-9BA4-19595F5E12C1}.Release|x64.ActiveCfg = Release|Any CPU + {B8C2A759-8663-4F6F-9BA4-19595F5E12C1}.Release|x64.Build.0 = Release|Any CPU + {B8C2A759-8663-4F6F-9BA4-19595F5E12C1}.Release|x86.ActiveCfg = Release|Any CPU + {B8C2A759-8663-4F6F-9BA4-19595F5E12C1}.Release|x86.Build.0 = Release|Any CPU + {B8C2A759-8663-4F6F-9BA4-19595F5E12C1}.Release-Nightly|Any CPU.ActiveCfg = Release|Any CPU + {B8C2A759-8663-4F6F-9BA4-19595F5E12C1}.Release-Nightly|Any CPU.Build.0 = Release|Any CPU + {B8C2A759-8663-4F6F-9BA4-19595F5E12C1}.Release-Nightly|Mixed Platforms.ActiveCfg = Release|Any CPU + {B8C2A759-8663-4F6F-9BA4-19595F5E12C1}.Release-Nightly|Mixed Platforms.Build.0 = Release|Any CPU + {B8C2A759-8663-4F6F-9BA4-19595F5E12C1}.Release-Nightly|x64.ActiveCfg = Release|Any CPU + {B8C2A759-8663-4F6F-9BA4-19595F5E12C1}.Release-Nightly|x64.Build.0 = Release|Any CPU + {B8C2A759-8663-4F6F-9BA4-19595F5E12C1}.Release-Nightly|x86.ActiveCfg = Release|Any CPU + {B8C2A759-8663-4F6F-9BA4-19595F5E12C1}.Release-Nightly|x86.Build.0 = Release|Any CPU + {B8C2A759-8663-4F6F-9BA4-19595F5E12C1}.Release-Stable|Any CPU.ActiveCfg = Release|Any CPU + {B8C2A759-8663-4F6F-9BA4-19595F5E12C1}.Release-Stable|Any CPU.Build.0 = Release|Any CPU + {B8C2A759-8663-4F6F-9BA4-19595F5E12C1}.Release-Stable|Mixed Platforms.ActiveCfg = Release|Any CPU + {B8C2A759-8663-4F6F-9BA4-19595F5E12C1}.Release-Stable|Mixed Platforms.Build.0 = Release|Any CPU + {B8C2A759-8663-4F6F-9BA4-19595F5E12C1}.Release-Stable|x64.ActiveCfg = Release|Any CPU + {B8C2A759-8663-4F6F-9BA4-19595F5E12C1}.Release-Stable|x64.Build.0 = Release|Any CPU + {B8C2A759-8663-4F6F-9BA4-19595F5E12C1}.Release-Stable|x86.ActiveCfg = Release|Any CPU + {B8C2A759-8663-4F6F-9BA4-19595F5E12C1}.Release-Stable|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -314,5 +348,6 @@ Global {E46C85BD-A99C-484E-BCCE-0F1831C5925E} = {26E8B310-269E-46D4-A612-24601F16065F} {C9E821BF-23AD-4CB5-B7F9-B3B99B606650} = {26E8B310-269E-46D4-A612-24601F16065F} {1479DE87-ACB5-4046-81C8-A0BA5041227D} = {26E8B310-269E-46D4-A612-24601F16065F} + {B8C2A759-8663-4F6F-9BA4-19595F5E12C1} = {26E8B310-269E-46D4-A612-24601F16065F} EndGlobalSection EndGlobal diff --git a/Plugins/Tests/Plugin.cs b/Plugins/Tests/Plugin.cs new file mode 100644 index 000000000..2585566d7 --- /dev/null +++ b/Plugins/Tests/Plugin.cs @@ -0,0 +1,78 @@ +#if DEBUG +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; +using SharedLibrary; +using SharedLibrary.Interfaces; +using SharedLibrary.Helpers; + +namespace IW4MAdmin.Plugins +{ + public class Tests : IPlugin + { + public string Name => "Dev Tests"; + + public float Version => 0.1f; + + public string Author => "RaidMax"; + + private static DateTime Interval; + + public async Task OnEventAsync(Event E, Server S) + { + if (E.Type == Event.GType.Start) + { + #region PLAYER_HISTORY + var rand = new Random(GetHashCode()); + var time = DateTime.UtcNow; + + await Task.Run(() => + { + if (S.PlayerHistory.Count > 0) + return; + + while (S.PlayerHistory.Count < 48) + { + S.PlayerHistory.Enqueue(new PlayerHistory(time, rand.Next(7, 18))); + time = time.AddMinutes(15); + } + }); + #endregion + } + } + + public async Task OnLoadAsync() + { + Interval = DateTime.Now; + } + + public async Task OnTickAsync(Server S) + { + if ((DateTime.Now - Interval).TotalSeconds > 5) + { + var rand = new Random(); + int index = rand.Next(0, 17); + var p = new Player($"Test_{index}", "_test", index, (int)Player.Permission.User) + { + Ping = 1 + }; + + p.SetIP("127.0.0.1"); + + if (S.Players.ElementAt(index) != null) + await S.RemovePlayer(index); + await S.AddPlayer(p); + + Interval = DateTime.Now; + } + } + + public async Task OnUnloadAsync() + { + + } + } +} +#endif \ No newline at end of file diff --git a/Plugins/Tests/Properties/AssemblyInfo.cs b/Plugins/Tests/Properties/AssemblyInfo.cs new file mode 100644 index 000000000..1d901a309 --- /dev/null +++ b/Plugins/Tests/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("Tests")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("Tests")] +[assembly: AssemblyCopyright("Copyright © 2017")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("b8c2a759-8663-4f6f-9ba4-19595f5e12c1")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/Plugins/Tests/Tests.csproj b/Plugins/Tests/Tests.csproj new file mode 100644 index 000000000..3d11308fb --- /dev/null +++ b/Plugins/Tests/Tests.csproj @@ -0,0 +1,56 @@ + + + + + Debug + AnyCPU + {B8C2A759-8663-4F6F-9BA4-19595F5E12C1} + Library + Properties + Tests + Tests + v4.5 + 512 + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + + + + + + + + + + + + + + + {d51eeceb-438a-47da-870f-7d7b41bc24d6} + SharedLibrary + + + + + copy /Y "$(TargetDir)$(TargetName).dll" "$(SolutionDir)BUILD\plugins\" + + \ No newline at end of file diff --git a/SharedLibrary/Helpers/ConfigurationManager.cs b/SharedLibrary/Helpers/ConfigurationManager.cs index 60c1500d8..fa111d1ec 100644 --- a/SharedLibrary/Helpers/ConfigurationManager.cs +++ b/SharedLibrary/Helpers/ConfigurationManager.cs @@ -1,35 +1,38 @@ using System; +using System.Collections.Concurrent; using System.Collections.Generic; namespace SharedLibrary.Helpers { public class ConfigurationManager { - Dictionary> ConfigurationSet; + ConcurrentDictionary> ConfigurationSet; Type PluginType; public ConfigurationManager(Type PluginType) { - ConfigurationSet = new Dictionary>(); + ConfigurationSet = new ConcurrentDictionary>(); this.PluginType = PluginType; } public void AddConfiguration(Server S) { + /* if (ConfigurationSet.ContainsKey(S.ToString())) + { + S.Logger.WriteWarning($"not adding server configuration for {S} as it already exists"); + return; + }*/ + try { var Config = Interfaces.Serialize>.Read($"config/{PluginType.ToString()}_{S.ToString()}.cfg"); - lock (ConfigurationSet) - { - ConfigurationSet.Add(S.ToString(), Config); - } + ConfigurationSet.TryAdd(S.ToString(), Config); } catch (Exceptions.SerializeException) { - ConfigurationSet.Add(S.ToString(), new Dictionary()); + ConfigurationSet.TryAdd(S.ToString(), new Dictionary()); } - } public void AddProperty(Server S, KeyValuePair Property) diff --git a/SharedLibrary/Helpers/PlayerHistory.cs b/SharedLibrary/Helpers/PlayerHistory.cs index 427f4a119..7a5da5f19 100644 --- a/SharedLibrary/Helpers/PlayerHistory.cs +++ b/SharedLibrary/Helpers/PlayerHistory.cs @@ -4,12 +4,45 @@ namespace SharedLibrary.Helpers { public class PlayerHistory { - public PlayerHistory(DateTime w, int cNum) + public PlayerHistory(int cNum) { - When = w; - Players = cNum; + DateTime t = DateTime.UtcNow; + When = new DateTime(t.Year, t.Month, t.Day, t.Hour, 5 * (int)Math.Round(t.Minute / 5.0), 0); + PlayerCount = cNum; + } + +#if DEBUG + public PlayerHistory(DateTime t, int cNum) + { + When = new DateTime(t.Year, t.Month, t.Day, t.Hour, 15 * (int)Math.Round(t.Minute / 15.0), 0); + PlayerCount = cNum; + } +#endif + + private DateTime When; + private int PlayerCount; + + /// + /// Used by CanvasJS as a point on the x axis + /// + public double x + { + get + { + return (When - DateTime.MinValue).TotalSeconds; + } + } + + + /// + /// Used by CanvasJS as a point on the y axis + /// + public int y + { + get + { + return PlayerCount; + } } - public DateTime When { get; private set; } - public int Players { get; private set; } } } diff --git a/SharedLibrary/Interfaces/IManager.cs b/SharedLibrary/Interfaces/IManager.cs index 99913c335..ad359af8f 100644 --- a/SharedLibrary/Interfaces/IManager.cs +++ b/SharedLibrary/Interfaces/IManager.cs @@ -17,5 +17,6 @@ namespace SharedLibrary.Interfaces IList GetActiveClients(); IList GetAliasClients(Player player); IList GetAliases(Player player); + IList GetPrivilegedClients(); } } diff --git a/SharedLibrary/RCON.cs b/SharedLibrary/RCON.cs index b47e1480e..4abf57987 100644 --- a/SharedLibrary/RCON.cs +++ b/SharedLibrary/RCON.cs @@ -98,7 +98,7 @@ namespace SharedLibrary.Network if (LineSplit.Length != 3) { - var e = new Exceptions.DvarException("DVAR does not exist"); + var e = new Exceptions.DvarException($"DVAR \"{dvarName}\" does not exist"); e.Data["dvar_name"] = dvarName; throw e; } diff --git a/SharedLibrary/Utilities.cs b/SharedLibrary/Utilities.cs index 7048a55d7..c57ffcd58 100644 --- a/SharedLibrary/Utilities.cs +++ b/SharedLibrary/Utilities.cs @@ -293,16 +293,18 @@ namespace SharedLibrary public static string TimeSpanText(this TimeSpan span) { - if (span.TotalMinutes < 6) - return $"{span.Minutes} minutes"; - else if (span.TotalHours < 24) - return $"{span.Hours} hours"; - else if (span.TotalDays < 7) - return $"{span.Days} days"; - else if (span.TotalDays > 7 && span.TotalDays < 365) - return $"{Math.Ceiling(span.Days / 7.0)} weeks"; - else if (span.TotalDays >= 365) - return $"{Math.Ceiling(span.Days / 365.0)} years"; + if (span.TotalMinutes < 60) + return $"{span.Minutes} minute(s)"; + else if (span.Hours >= 1 && span.TotalHours < 24) + return $"{span.Hours} hour(s)"; + else if (span.TotalDays >= 1 && span.TotalDays < 7) + return $"{span.Days} day(s)"; + else if (span.TotalDays >= 7 && span.TotalDays < 365) + return $"{Math.Ceiling(span.Days / 7.0)} week(s)"; + else if (span.TotalDays >= 365 && span.TotalDays < 36500) + return $"{Math.Ceiling(span.Days / 365.0)} year(s)"; + else if (span.TotalDays >= 36500) + return "Forever"; return "1 hour"; }