From 1cdd33a78a9aa9c4a0e5ad71590878652937d289 Mon Sep 17 00:00:00 2001 From: Jordan Coulam Date: Mon, 17 Jul 2017 03:56:56 +0100 Subject: [PATCH 1/5] 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 From 79f66f554febef5efa2167a13eec544a79f43413 Mon Sep 17 00:00:00 2001 From: Ruby Rose Date: Tue, 11 Jul 2017 10:37:17 +0300 Subject: [PATCH 2/5] Turn the player hooks into a tristate --- TShockAPI/DB/ItemManager.cs | 5 +- TShockAPI/DB/ProjectileManager.cs | 5 +- TShockAPI/DB/TileManager.cs | 5 +- TShockAPI/Hooks/PlayerHooks.cs | 89 +++++++++++++++++++++++++------ TShockAPI/TSPlayer.cs | 6 ++- 5 files changed, 85 insertions(+), 25 deletions(-) diff --git a/TShockAPI/DB/ItemManager.cs b/TShockAPI/DB/ItemManager.cs index 0ff89b40..54ae8ee5 100644 --- a/TShockAPI/DB/ItemManager.cs +++ b/TShockAPI/DB/ItemManager.cs @@ -201,8 +201,9 @@ namespace TShockAPI.DB if (ply.HasPermission(Permissions.usebanneditem)) return true; - if (PlayerHooks.OnPlayerItembanPermission(ply, this)) - return true; + PermissionResult hookResult = PlayerHooks.OnPlayerItembanPermission(ply, this); + if (hookResult != PermissionResult.Inconclusive) + return hookResult == PermissionResult.Granted; var cur = ply.Group; var traversed = new List(); diff --git a/TShockAPI/DB/ProjectileManager.cs b/TShockAPI/DB/ProjectileManager.cs index 79bf9a37..234d3cca 100644 --- a/TShockAPI/DB/ProjectileManager.cs +++ b/TShockAPI/DB/ProjectileManager.cs @@ -206,8 +206,9 @@ namespace TShockAPI.DB if (ply.HasPermission(Permissions.canusebannedprojectiles)) return true; - if (PlayerHooks.OnPlayerProjbanPermission(ply, this)) - return true; + PermissionResult hookResult = PlayerHooks.OnPlayerProjbanPermission(ply, this); + if (hookResult != PermissionResult.Inconclusive) + return hookResult == PermissionResult.Granted; var cur = ply.Group; var traversed = new List(); diff --git a/TShockAPI/DB/TileManager.cs b/TShockAPI/DB/TileManager.cs index 90a235f8..83b079ab 100644 --- a/TShockAPI/DB/TileManager.cs +++ b/TShockAPI/DB/TileManager.cs @@ -206,8 +206,9 @@ namespace TShockAPI.DB if (ply.HasPermission(Permissions.canusebannedtiles)) return true; - if (PlayerHooks.OnPlayerTilebanPermission(ply, this)) - return true; + PermissionResult hookResult = PlayerHooks.OnPlayerTilebanPermission(ply, this); + if (hookResult != PermissionResult.Inconclusive) + return hookResult == PermissionResult.Granted; var cur = ply.Group; var traversed = new List(); diff --git a/TShockAPI/Hooks/PlayerHooks.cs b/TShockAPI/Hooks/PlayerHooks.cs index 062a78b8..7f2e8601 100644 --- a/TShockAPI/Hooks/PlayerHooks.cs +++ b/TShockAPI/Hooks/PlayerHooks.cs @@ -155,6 +155,11 @@ namespace TShockAPI.Hooks /// public string Permission { get; set; } + /// + /// of the hook. + /// + public PermissionResult Result { get; set; } + /// /// Initializes a new instance of the PlayerPermissionEventArgs class. /// @@ -164,6 +169,7 @@ namespace TShockAPI.Hooks { Player = player; Permission = permission; + Result = PermissionResult.Inconclusive; } } @@ -182,15 +188,21 @@ namespace TShockAPI.Hooks /// public ItemBan BannedItem { get; set; } + /// + /// of the hook. + /// + public PermissionResult Result { get; set; } + /// /// Initializes a new instance of the PlayerItembanPermissionEventArgs class. /// /// The player who fired the event. - /// The permission being checked. + /// The banned item being checked. public PlayerItembanPermissionEventArgs(TSPlayer player, ItemBan bannedItem) { Player = player; BannedItem = bannedItem; + Result = PermissionResult.Inconclusive; } } @@ -209,6 +221,11 @@ namespace TShockAPI.Hooks /// public ProjectileBan BannedProjectile { get; set; } + /// + /// of the hook. + /// + public PermissionResult Result { get; set; } + /// /// Initializes a new instance of the PlayerProjbanPermissionEventArgs class. /// @@ -218,6 +235,7 @@ namespace TShockAPI.Hooks { Player = player; BannedProjectile = checkedProjectile; + Result = PermissionResult.Inconclusive; } } @@ -236,6 +254,11 @@ namespace TShockAPI.Hooks /// public TileBan BannedTile { get; set; } + /// + /// of the hook. + /// + public PermissionResult Result { get; set; } + /// /// Initializes a new instance of the PlayerTilebanPermissionEventArgs class. /// @@ -245,6 +268,7 @@ namespace TShockAPI.Hooks { Player = player; BannedTile = checkedTile; + Result = PermissionResult.Inconclusive; } } @@ -439,60 +463,91 @@ namespace TShockAPI.Hooks /// Fires the event. /// /// The player firing the event. - /// True if the event has been handled. - public static bool OnPlayerPermission(TSPlayer player, string permission) + /// Event result if the event has been handled, otherwise . + public static PermissionResult OnPlayerPermission(TSPlayer player, string permission) { if (PlayerPermission == null) - return false; + return PermissionResult.Inconclusive; var args = new PlayerPermissionEventArgs(player, permission); PlayerPermission(args); - return args.Handled; + + if (args.Handled) + return args.Result; + else + return PermissionResult.Inconclusive; } /// /// Fires the event. /// /// The player firing the event. - /// True if the event has been handled. - public static bool OnPlayerItembanPermission(TSPlayer player, ItemBan bannedItem) + /// Event result if the event has been handled, otherwise . + public static PermissionResult OnPlayerItembanPermission(TSPlayer player, ItemBan bannedItem) { if (PlayerItembanPermission == null) - return false; + return PermissionResult.Inconclusive; var args = new PlayerItembanPermissionEventArgs(player, bannedItem); PlayerItembanPermission(args); - return args.Handled; + + if (args.Handled) + return args.Result; + else + return PermissionResult.Inconclusive; } /// /// Fires the event. /// /// The player firing the event. - /// True if the event has been handled. - public static bool OnPlayerProjbanPermission(TSPlayer player, ProjectileBan bannedProj) + /// Event result if the event has been handled, otherwise . + public static PermissionResult OnPlayerProjbanPermission(TSPlayer player, ProjectileBan bannedProj) { if (PlayerProjbanPermission == null) - return false; + return PermissionResult.Inconclusive; var args = new PlayerProjbanPermissionEventArgs(player, bannedProj); PlayerProjbanPermission(args); - return args.Handled; + + if (args.Handled) + return args.Result; + else + return PermissionResult.Inconclusive; } /// /// Fires the event. /// /// The player firing the event. - /// True if the event has been handled. - public static bool OnPlayerTilebanPermission(TSPlayer player, TileBan bannedTile) + /// Event result if the event has been handled, otherwise . + public static PermissionResult OnPlayerTilebanPermission(TSPlayer player, TileBan bannedTile) { if (PlayerTilebanPermission == null) - return false; + return PermissionResult.Inconclusive; var args = new PlayerTilebanPermissionEventArgs(player, bannedTile); PlayerTilebanPermission(args); - return args.Handled; + + if (args.Handled) + return args.Result; + else + return PermissionResult.Inconclusive; } + } + + /// + /// Defines the possible outcomes of handlers. + /// + public enum PermissionResult + { + /// Hook doesn't return a result on the permission check. + Inconclusive, + /// Permission is explicitly denied by a hook. + Denied, + /// Permission is explicitly granted by a hook. + Granted + } + } diff --git a/TShockAPI/TSPlayer.cs b/TShockAPI/TSPlayer.cs index 8d0819bf..930c587b 100644 --- a/TShockAPI/TSPlayer.cs +++ b/TShockAPI/TSPlayer.cs @@ -1265,8 +1265,10 @@ namespace TShockAPI /// True if the player has that permission. public bool HasPermission(string permission) { - if (PlayerHooks.OnPlayerPermission(this, permission)) - return true; + PermissionResult hookResult = PlayerHooks.OnPlayerPermission(this, permission); + + if (hookResult != PermissionResult.Inconclusive) + return hookResult == PermissionResult.Granted; if (tempGroup != null) return tempGroup.HasPermission(permission); From 3764527d3d390091c4e12f14481cad54b2b0a63d Mon Sep 17 00:00:00 2001 From: Ruby Rose Date: Tue, 11 Jul 2017 16:29:48 +0300 Subject: [PATCH 3/5] don't inherit handled event args for them --- TShockAPI/Hooks/PlayerHooks.cs | 28 ++++++++-------------------- 1 file changed, 8 insertions(+), 20 deletions(-) diff --git a/TShockAPI/Hooks/PlayerHooks.cs b/TShockAPI/Hooks/PlayerHooks.cs index 7f2e8601..6e3db3d5 100644 --- a/TShockAPI/Hooks/PlayerHooks.cs +++ b/TShockAPI/Hooks/PlayerHooks.cs @@ -143,7 +143,7 @@ namespace TShockAPI.Hooks /// /// EventArgs used for the event. /// - public class PlayerPermissionEventArgs : HandledEventArgs + public class PlayerPermissionEventArgs { /// /// The player who fired the event. @@ -176,7 +176,7 @@ namespace TShockAPI.Hooks /// /// EventArgs used for the event. /// - public class PlayerItembanPermissionEventArgs : HandledEventArgs + public class PlayerItembanPermissionEventArgs { /// /// The player who fired the event. @@ -209,7 +209,7 @@ namespace TShockAPI.Hooks /// /// EventArgs used for the event. /// - public class PlayerProjbanPermissionEventArgs : HandledEventArgs + public class PlayerProjbanPermissionEventArgs { /// /// The player who fired the event. @@ -242,7 +242,7 @@ namespace TShockAPI.Hooks /// /// EventArgs used for the event. /// - public class PlayerTilebanPermissionEventArgs : HandledEventArgs + public class PlayerTilebanPermissionEventArgs { /// /// The player who fired the event. @@ -472,10 +472,7 @@ namespace TShockAPI.Hooks var args = new PlayerPermissionEventArgs(player, permission); PlayerPermission(args); - if (args.Handled) - return args.Result; - else - return PermissionResult.Inconclusive; + return args.Result; } /// @@ -491,10 +488,7 @@ namespace TShockAPI.Hooks var args = new PlayerItembanPermissionEventArgs(player, bannedItem); PlayerItembanPermission(args); - if (args.Handled) - return args.Result; - else - return PermissionResult.Inconclusive; + return args.Result; } /// @@ -510,10 +504,7 @@ namespace TShockAPI.Hooks var args = new PlayerProjbanPermissionEventArgs(player, bannedProj); PlayerProjbanPermission(args); - if (args.Handled) - return args.Result; - else - return PermissionResult.Inconclusive; + return args.Result; } /// @@ -529,10 +520,7 @@ namespace TShockAPI.Hooks var args = new PlayerTilebanPermissionEventArgs(player, bannedTile); PlayerTilebanPermission(args); - if (args.Handled) - return args.Result; - else - return PermissionResult.Inconclusive; + return args.Result; } } From 685d9964f0be1e36ace592e655f69cf416abaf66 Mon Sep 17 00:00:00 2001 From: Ruby Rose Date: Wed, 12 Jul 2017 08:47:27 +0300 Subject: [PATCH 4/5] Change enum names for clarity --- TShockAPI/DB/ItemManager.cs | 6 ++-- TShockAPI/DB/ProjectileManager.cs | 6 ++-- TShockAPI/DB/TileManager.cs | 6 ++-- TShockAPI/Hooks/PlayerHooks.cs | 52 +++++++++++++++---------------- TShockAPI/TSPlayer.cs | 6 ++-- 5 files changed, 38 insertions(+), 38 deletions(-) diff --git a/TShockAPI/DB/ItemManager.cs b/TShockAPI/DB/ItemManager.cs index 54ae8ee5..c3d92840 100644 --- a/TShockAPI/DB/ItemManager.cs +++ b/TShockAPI/DB/ItemManager.cs @@ -201,9 +201,9 @@ namespace TShockAPI.DB if (ply.HasPermission(Permissions.usebanneditem)) return true; - PermissionResult hookResult = PlayerHooks.OnPlayerItembanPermission(ply, this); - if (hookResult != PermissionResult.Inconclusive) - return hookResult == PermissionResult.Granted; + PermissionHookResult hookResult = PlayerHooks.OnPlayerItembanPermission(ply, this); + if (hookResult != PermissionHookResult.Unhandled) + return hookResult == PermissionHookResult.Granted; var cur = ply.Group; var traversed = new List(); diff --git a/TShockAPI/DB/ProjectileManager.cs b/TShockAPI/DB/ProjectileManager.cs index 234d3cca..4214fce6 100644 --- a/TShockAPI/DB/ProjectileManager.cs +++ b/TShockAPI/DB/ProjectileManager.cs @@ -206,9 +206,9 @@ namespace TShockAPI.DB if (ply.HasPermission(Permissions.canusebannedprojectiles)) return true; - PermissionResult hookResult = PlayerHooks.OnPlayerProjbanPermission(ply, this); - if (hookResult != PermissionResult.Inconclusive) - return hookResult == PermissionResult.Granted; + PermissionHookResult hookResult = PlayerHooks.OnPlayerProjbanPermission(ply, this); + if (hookResult != PermissionHookResult.Unhandled) + return hookResult == PermissionHookResult.Granted; var cur = ply.Group; var traversed = new List(); diff --git a/TShockAPI/DB/TileManager.cs b/TShockAPI/DB/TileManager.cs index 83b079ab..c291b21a 100644 --- a/TShockAPI/DB/TileManager.cs +++ b/TShockAPI/DB/TileManager.cs @@ -206,9 +206,9 @@ namespace TShockAPI.DB if (ply.HasPermission(Permissions.canusebannedtiles)) return true; - PermissionResult hookResult = PlayerHooks.OnPlayerTilebanPermission(ply, this); - if (hookResult != PermissionResult.Inconclusive) - return hookResult == PermissionResult.Granted; + PermissionHookResult hookResult = PlayerHooks.OnPlayerTilebanPermission(ply, this); + if (hookResult != PermissionHookResult.Unhandled) + return hookResult == PermissionHookResult.Granted; var cur = ply.Group; var traversed = new List(); diff --git a/TShockAPI/Hooks/PlayerHooks.cs b/TShockAPI/Hooks/PlayerHooks.cs index 6e3db3d5..91f9612c 100644 --- a/TShockAPI/Hooks/PlayerHooks.cs +++ b/TShockAPI/Hooks/PlayerHooks.cs @@ -156,9 +156,9 @@ namespace TShockAPI.Hooks public string Permission { get; set; } /// - /// of the hook. + /// of the hook. /// - public PermissionResult Result { get; set; } + public PermissionHookResult Result { get; set; } /// /// Initializes a new instance of the PlayerPermissionEventArgs class. @@ -169,7 +169,7 @@ namespace TShockAPI.Hooks { Player = player; Permission = permission; - Result = PermissionResult.Inconclusive; + Result = PermissionHookResult.Unhandled; } } @@ -189,9 +189,9 @@ namespace TShockAPI.Hooks public ItemBan BannedItem { get; set; } /// - /// of the hook. + /// of the hook. /// - public PermissionResult Result { get; set; } + public PermissionHookResult Result { get; set; } /// /// Initializes a new instance of the PlayerItembanPermissionEventArgs class. @@ -202,7 +202,7 @@ namespace TShockAPI.Hooks { Player = player; BannedItem = bannedItem; - Result = PermissionResult.Inconclusive; + Result = PermissionHookResult.Unhandled; } } @@ -222,9 +222,9 @@ namespace TShockAPI.Hooks public ProjectileBan BannedProjectile { get; set; } /// - /// of the hook. + /// of the hook. /// - public PermissionResult Result { get; set; } + public PermissionHookResult Result { get; set; } /// /// Initializes a new instance of the PlayerProjbanPermissionEventArgs class. @@ -235,7 +235,7 @@ namespace TShockAPI.Hooks { Player = player; BannedProjectile = checkedProjectile; - Result = PermissionResult.Inconclusive; + Result = PermissionHookResult.Unhandled; } } @@ -255,9 +255,9 @@ namespace TShockAPI.Hooks public TileBan BannedTile { get; set; } /// - /// of the hook. + /// of the hook. /// - public PermissionResult Result { get; set; } + public PermissionHookResult Result { get; set; } /// /// Initializes a new instance of the PlayerTilebanPermissionEventArgs class. @@ -268,7 +268,7 @@ namespace TShockAPI.Hooks { Player = player; BannedTile = checkedTile; - Result = PermissionResult.Inconclusive; + Result = PermissionHookResult.Unhandled; } } @@ -463,11 +463,11 @@ namespace TShockAPI.Hooks /// Fires the event. /// /// The player firing the event. - /// Event result if the event has been handled, otherwise . - public static PermissionResult OnPlayerPermission(TSPlayer player, string permission) + /// Event result if the event has been handled, otherwise . + public static PermissionHookResult OnPlayerPermission(TSPlayer player, string permission) { if (PlayerPermission == null) - return PermissionResult.Inconclusive; + return PermissionHookResult.Unhandled; var args = new PlayerPermissionEventArgs(player, permission); PlayerPermission(args); @@ -479,11 +479,11 @@ namespace TShockAPI.Hooks /// Fires the event. /// /// The player firing the event. - /// Event result if the event has been handled, otherwise . - public static PermissionResult OnPlayerItembanPermission(TSPlayer player, ItemBan bannedItem) + /// Event result if the event has been handled, otherwise . + public static PermissionHookResult OnPlayerItembanPermission(TSPlayer player, ItemBan bannedItem) { if (PlayerItembanPermission == null) - return PermissionResult.Inconclusive; + return PermissionHookResult.Unhandled; var args = new PlayerItembanPermissionEventArgs(player, bannedItem); PlayerItembanPermission(args); @@ -495,11 +495,11 @@ namespace TShockAPI.Hooks /// Fires the event. /// /// The player firing the event. - /// Event result if the event has been handled, otherwise . - public static PermissionResult OnPlayerProjbanPermission(TSPlayer player, ProjectileBan bannedProj) + /// Event result if the event has been handled, otherwise . + public static PermissionHookResult OnPlayerProjbanPermission(TSPlayer player, ProjectileBan bannedProj) { if (PlayerProjbanPermission == null) - return PermissionResult.Inconclusive; + return PermissionHookResult.Unhandled; var args = new PlayerProjbanPermissionEventArgs(player, bannedProj); PlayerProjbanPermission(args); @@ -511,11 +511,11 @@ namespace TShockAPI.Hooks /// Fires the event. /// /// The player firing the event. - /// Event result if the event has been handled, otherwise . - public static PermissionResult OnPlayerTilebanPermission(TSPlayer player, TileBan bannedTile) + /// Event result if the event has been handled, otherwise . + public static PermissionHookResult OnPlayerTilebanPermission(TSPlayer player, TileBan bannedTile) { if (PlayerTilebanPermission == null) - return PermissionResult.Inconclusive; + return PermissionHookResult.Unhandled; var args = new PlayerTilebanPermissionEventArgs(player, bannedTile); PlayerTilebanPermission(args); @@ -528,10 +528,10 @@ namespace TShockAPI.Hooks /// /// Defines the possible outcomes of handlers. /// - public enum PermissionResult + public enum PermissionHookResult { /// Hook doesn't return a result on the permission check. - Inconclusive, + Unhandled, /// Permission is explicitly denied by a hook. Denied, /// Permission is explicitly granted by a hook. diff --git a/TShockAPI/TSPlayer.cs b/TShockAPI/TSPlayer.cs index 930c587b..8f7b831e 100644 --- a/TShockAPI/TSPlayer.cs +++ b/TShockAPI/TSPlayer.cs @@ -1265,10 +1265,10 @@ namespace TShockAPI /// True if the player has that permission. public bool HasPermission(string permission) { - PermissionResult hookResult = PlayerHooks.OnPlayerPermission(this, permission); + PermissionHookResult hookResult = PlayerHooks.OnPlayerPermission(this, permission); - if (hookResult != PermissionResult.Inconclusive) - return hookResult == PermissionResult.Granted; + if (hookResult != PermissionHookResult.Unhandled) + return hookResult == PermissionHookResult.Granted; if (tempGroup != null) return tempGroup.HasPermission(permission); From 7f68053d3a8bee0a555d89353510f07bab7ce230 Mon Sep 17 00:00:00 2001 From: Ruby Rose Date: Tue, 11 Jul 2017 16:33:59 +0300 Subject: [PATCH 5/5] Update CHANGELOG.md --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index aa42a2aa..f0d0f29c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -4,6 +4,7 @@ This is the rolling changelog for TShock for Terraria. Use past tense when addin ## Upcoming Changes +* API: Changed `PlayerHooks` permission hook mechanisms to allow negation from hooks (@deadsurgeon42) * Updated OpenTerraria API to 1.3.5.3 (@DeathCradle) * Updated Terraria Server API to 1.3.5.3 (@WhiteXZ, @hakusaro) * Updated TShock core components to 1.3.5.3 (@hakusaro)