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