From 1cdd33a78a9aa9c4a0e5ad71590878652937d289 Mon Sep 17 00:00:00 2001 From: Jordan Coulam Date: Mon, 17 Jul 2017 03:56:56 +0100 Subject: [PATCH] Added ignoreVersion and loaded plugin list to StatTracking for issue #1444 (#1445) --- TShockAPI/StatTracker.cs | 117 ++++++++++++++++++++++++++------------- 1 file changed, 79 insertions(+), 38 deletions(-) diff --git a/TShockAPI/StatTracker.cs b/TShockAPI/StatTracker.cs index 78aa10f5..d1c01c1c 100644 --- a/TShockAPI/StatTracker.cs +++ b/TShockAPI/StatTracker.cs @@ -22,11 +22,13 @@ using System.Threading; using System.Web; using TerrariaApi.Server; using System.Diagnostics; +using System.Linq; using System.Runtime.InteropServices; using System.Net.Http; using System.Threading.Tasks; using TShockAPI.Extensions; + namespace TShockAPI { /// @@ -52,10 +54,11 @@ namespace TShockAPI /// public bool OptOut = false; + private PluginItem[] plugins; + private long totalMem = 0; private string serverId = ""; private HttpClient _client; - private const string TrackerUrl = "http://stats.tshock.co/submit/{0}"; /// @@ -103,11 +106,9 @@ namespace TShockAPI private async Task SendUpdateAsync() { JsonData data = PrepareJsonData(); - var serialized = Newtonsoft.Json.JsonConvert.SerializeObject(data); var encoded = HttpUtility.UrlEncode(serialized); - var uri = String.Format(TrackerUrl, encoded); - + var uri = string.Format(TrackerUrl, encoded); try { HttpResponseMessage msg = await _client.GetAsync(uri); @@ -139,49 +140,81 @@ namespace TShockAPI private JsonData PrepareJsonData() { - if (ServerApi.RunningMono) - { - if (totalMem == 0) - { - //Only do this if we haven't already cached the total physicaly memory - var pc = new PerformanceCounter("Mono Memory", "Total Physical Memory"); - totalMem = (pc.RawValue / 1024 / 1024 / 1024); - } - - return new JsonData - { - port = Terraria.Netplay.ListenPort, - currentPlayers = TShock.Utils.ActivePlayers(), - maxPlayers = TShock.Config.MaxSlots, - systemRam = totalMem, - version = TShock.VersionNum.ToString(), - terrariaVersion = Terraria.Main.versionNumber2, - providerId = ProviderToken, - serverId = serverId, - mono = true - }; - } - - if (totalMem == 0) - { - //Again, only call this if it hasn't previously been cached - GetPhysicallyInstalledSystemMemory(out totalMem); - totalMem = (totalMem / 1024 / 1024); // Super hardcore maths to convert to Gb from Kb - } - - return new JsonData + return new JsonData() { port = Terraria.Netplay.ListenPort, currentPlayers = TShock.Utils.ActivePlayers(), maxPlayers = TShock.Config.MaxSlots, - systemRam = totalMem, + systemRam = GetTotalSystemRam(ServerApi.RunningMono), version = TShock.VersionNum.ToString(), terrariaVersion = Terraria.Main.versionNumber2, providerId = ProviderToken, serverId = serverId, - mono = false + mono = ServerApi.RunningMono, + ignorePluginVersion = ServerApi.IgnoreVersion, + loadedPlugins = GetLoadedPlugins() }; } + + private PluginItem[] GetLoadedPlugins() + { + if (plugins != null) + { + return plugins;//Return early + } + + plugins = new PluginItem[ServerApi.Plugins.Count];//Initialize with enough room to store the ammount of plugins loaded. + for (var i = 0; i < ServerApi.Plugins.Count; i++) + { + var pluginItem = new PluginItem(); + var apiAttribute = (ApiVersionAttribute)ServerApi.Plugins[i].Plugin.GetType().GetCustomAttributes(typeof(ApiVersionAttribute), false).FirstOrDefault(); + //The current implementation of loading plugins doesn't allow for a plugin to be loaded without an ApiVersion, the UNKNOWN is there incase a change is made to allow it + pluginItem.apiVersion = apiAttribute?.ApiVersion.ToString() ?? "UNKNOWN"; + pluginItem.name = ServerApi.Plugins[i].Plugin.Name; + pluginItem.version = ServerApi.Plugins[i].Plugin.Version.ToString(); + plugins[i] = pluginItem; + } + return plugins; + } + + private long GetTotalSystemRam(bool isMono) + { + if (totalMem != 0) + { + return totalMem;//Return early + } + + if (isMono)//Set totalMem so it can be returned later + { + var pc = new PerformanceCounter("Mono Memory", "Total Physical Memory"); + totalMem = (pc.RawValue / 1024 / 1024 / 1024); + } + else + { + GetPhysicallyInstalledSystemMemory(out totalMem); + totalMem = (totalMem / 1024 / 1024); // Super hardcore maths to convert to Gb from Kb + } + + return totalMem; + } + } + /// + /// Holding information regarding loaded plugins + /// + public struct PluginItem + { + /// + /// Plugin name + /// + public string name; + /// + /// Assembly version + /// + public string version; + /// + /// Api version or UNKNOWN if attribute is missing, which is currently impossible + /// + public string apiVersion; } /// @@ -210,6 +243,14 @@ namespace TShockAPI /// public string version; /// + /// Whether or not server was started with --ignoreversion + /// + public bool ignorePluginVersion; + /// + /// List of loaded plugins and version name: + /// + public PluginItem[] loadedPlugins; + /// /// The Terraria version supported by the server /// public string terrariaVersion; @@ -226,4 +267,4 @@ namespace TShockAPI /// public bool mono; } -} +} \ No newline at end of file