diff --git a/pom.xml b/pom.xml index 32eaf42..978129a 100644 --- a/pom.xml +++ b/pom.xml @@ -4,7 +4,7 @@ ru.simsonic rscPermissions - 0.9.11a + 0.9.12a jar rscPermissions diff --git a/src/main/java/ru/simsonic/rscPermissions/BridgeForBukkitAPI.java b/src/main/java/ru/simsonic/rscPermissions/BridgeForBukkitAPI.java index 5fc79e3..0e1057e 100644 --- a/src/main/java/ru/simsonic/rscPermissions/BridgeForBukkitAPI.java +++ b/src/main/java/ru/simsonic/rscPermissions/BridgeForBukkitAPI.java @@ -2,6 +2,7 @@ package ru.simsonic.rscPermissions; import org.bukkit.entity.Player; import org.bukkit.plugin.Plugin; import org.bukkit.plugin.ServicePriority; +import ru.simsonic.rscPermissions.API.Settings; import ru.simsonic.rscPermissions.Bukkit.VaultChat; import ru.simsonic.rscPermissions.Bukkit.VaultPermission; import ru.simsonic.rscPermissions.Engine.Phrases; @@ -69,4 +70,16 @@ public class BridgeForBukkitAPI } else BukkitPluginMain.consoleLog.warning(GenericChatCodes.processStringStatic("[rscp] " + Phrases.INTEGRATION_V_N.toString())); } + public void printDebugStackTrace() + { + if(rscp.permissionManager.isConsoleDebugging()) + { + final StringBuilder sb = new StringBuilder(Settings.chatPrefix); + sb.append("[DEBUG] An API method was invoked from the path:\n"); + for(StackTraceElement ste : Thread.currentThread().getStackTrace()) + if(!ste.getClassName().equals(BridgeForBukkitAPI.class.getName())) + sb.append(ste.toString()).append(System.lineSeparator()); + rscp.getServer().getConsoleSender().sendMessage(GenericChatCodes.processStringStatic(sb.toString())); + } + } } diff --git a/src/main/java/ru/simsonic/rscPermissions/Bukkit/BukkitDatabaseFetcher.java b/src/main/java/ru/simsonic/rscPermissions/Bukkit/BukkitDatabaseFetcher.java index b5aa864..c0e562a 100644 --- a/src/main/java/ru/simsonic/rscPermissions/Bukkit/BukkitDatabaseFetcher.java +++ b/src/main/java/ru/simsonic/rscPermissions/Bukkit/BukkitDatabaseFetcher.java @@ -1,7 +1,7 @@ package ru.simsonic.rscPermissions.Bukkit; import java.util.Set; import java.util.logging.Level; -import org.bukkit.entity.Player; +import org.bukkit.command.CommandSender; import ru.simsonic.rscPermissions.API.Settings; import ru.simsonic.rscPermissions.Backends.DatabaseContents; import ru.simsonic.rscPermissions.BukkitPluginMain; @@ -62,14 +62,14 @@ public class BukkitDatabaseFetcher extends RestartableThread } catch(InterruptedException ex) { } final long queryTime = System.currentTimeMillis() - queryStartTime; - final Set debuggers = rscp.permissionManager.getDebuggers(); + final Set debuggers = rscp.permissionManager.getDebuggers(); if(!debuggers.isEmpty()) rscp.getServer().getScheduler().runTask(rscp, new Runnable() { @Override public void run() { - for(Player debugger : debuggers) + for(CommandSender debugger : debuggers) debugger.sendMessage(GenericChatCodes.processStringStatic(Settings.chatPrefix + "Database has been fetched in " + queryTime + " milliseconds.")); } diff --git a/src/main/java/ru/simsonic/rscPermissions/Bukkit/BukkitPermissionManager.java b/src/main/java/ru/simsonic/rscPermissions/Bukkit/BukkitPermissionManager.java index 8a379bc..969ed95 100644 --- a/src/main/java/ru/simsonic/rscPermissions/Bukkit/BukkitPermissionManager.java +++ b/src/main/java/ru/simsonic/rscPermissions/Bukkit/BukkitPermissionManager.java @@ -9,6 +9,7 @@ import java.util.Set; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.LinkedBlockingQueue; import org.bukkit.OfflinePlayer; +import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import org.bukkit.permissions.PermissionAttachment; import ru.simsonic.rscPermissions.API.Settings; @@ -31,7 +32,7 @@ public class BukkitPermissionManager extends RestartableThread private final Map attachments = new HashMap<>(); private final Map> persistent = new HashMap<>(); private final Map> temporary = new HashMap<>(); - private final Set debug = new HashSet<>(); + private final Set debug = new HashSet<>(); public void recalculateOnlinePlayers() { updateQueue.addAll(Tools.getOnlinePlayers()); @@ -200,21 +201,25 @@ public class BukkitPermissionManager extends RestartableThread result.add(socketAddress.getAddress().getHostAddress()); return result.toArray(new String[result.size()]); } - public Set getDebuggers() + public Set getDebuggers() { synchronized(debug) { return new HashSet<>(debug); } } - public boolean isDebugging(Player target) + public boolean isConsoleDebugging() + { + return isDebugging(rscp.getServer().getConsoleSender()); + } + public boolean isDebugging(CommandSender target) { synchronized(debug) { return debug.contains(target); } } - public void setDebugging(Player target, boolean value) + public void setDebugging(CommandSender target, boolean value) { synchronized(debug) { diff --git a/src/main/java/ru/simsonic/rscPermissions/Bukkit/Commands/CommandDebug.java b/src/main/java/ru/simsonic/rscPermissions/Bukkit/Commands/CommandDebug.java index f28b4b5..bc63f0b 100644 --- a/src/main/java/ru/simsonic/rscPermissions/Bukkit/Commands/CommandDebug.java +++ b/src/main/java/ru/simsonic/rscPermissions/Bukkit/Commands/CommandDebug.java @@ -1,7 +1,5 @@ package ru.simsonic.rscPermissions.Bukkit.Commands; import org.bukkit.command.CommandSender; -import org.bukkit.command.ConsoleCommandSender; -import org.bukkit.entity.Player; import ru.simsonic.rscPermissions.BukkitPluginMain; import ru.simsonic.rscPermissions.Engine.Phrases; import ru.simsonic.rscUtilityLibrary.Bukkit.Commands.CommandAnswerException; @@ -15,12 +13,9 @@ public class CommandDebug } public void execute(CommandSender sender, String args[]) throws CommandAnswerException { - if(sender instanceof ConsoleCommandSender) - throw new CommandAnswerException(Phrases.PLUGIN_PLAYER_ONLY.toString()); if(sender.hasPermission("rscp.admin")) { - final Player player = (Player)sender; - boolean isDebugging = rscp.permissionManager.isDebugging(player); + boolean isDebugging = rscp.permissionManager.isDebugging(sender); if(args.length >= 2) { try @@ -31,7 +26,7 @@ public class CommandDebug } } else isDebugging = !isDebugging; - rscp.permissionManager.setDebugging(player, isDebugging); + rscp.permissionManager.setDebugging(sender, isDebugging); throw new CommandAnswerException(isDebugging ? Phrases.DEBUG_ON.toString() : Phrases.DEBUG_OFF.toString()); } } diff --git a/src/main/java/ru/simsonic/rscPermissions/Bukkit/VaultChat.java b/src/main/java/ru/simsonic/rscPermissions/Bukkit/VaultChat.java index 926bb14..0dd93fe 100644 --- a/src/main/java/ru/simsonic/rscPermissions/Bukkit/VaultChat.java +++ b/src/main/java/ru/simsonic/rscPermissions/Bukkit/VaultChat.java @@ -32,12 +32,14 @@ public final class VaultChat extends VaultDeprecatedChat @Override public String getPlayerPrefix(String world, OfflinePlayer player) { + rscp.bridgeForBukkit.printDebugStackTrace(); final ResolutionResult result = rscp.permissionManager.getResult(player); return result.prefix; } @Override public String getPlayerPrefix(Player player) { + rscp.bridgeForBukkit.printDebugStackTrace(); final ResolutionResult result = rscp.permissionManager.getResult(player); return result.prefix; } @@ -45,6 +47,7 @@ public final class VaultChat extends VaultDeprecatedChat @Deprecated public String getPlayerPrefix(String world, String player) { + rscp.bridgeForBukkit.printDebugStackTrace(); final ResolutionResult result = rscp.permissionManager.getResult(player); return result.prefix; } @@ -52,12 +55,14 @@ public final class VaultChat extends VaultDeprecatedChat @Override public String getPlayerSuffix(String world, OfflinePlayer player) { + rscp.bridgeForBukkit.printDebugStackTrace(); final ResolutionResult result = rscp.permissionManager.getResult(player); return result.suffix; } @Override public String getPlayerSuffix(Player player) { + rscp.bridgeForBukkit.printDebugStackTrace(); final ResolutionResult result = rscp.permissionManager.getResult(player); return result.suffix; } @@ -65,6 +70,7 @@ public final class VaultChat extends VaultDeprecatedChat @Deprecated public String getPlayerSuffix(String world, String player) { + rscp.bridgeForBukkit.printDebugStackTrace(); final ResolutionResult result = rscp.permissionManager.getResult(player); return result.suffix; } @@ -72,78 +78,92 @@ public final class VaultChat extends VaultDeprecatedChat @Override public void setPlayerPrefix(String world, OfflinePlayer player, String prefix) { + rscp.bridgeForBukkit.printDebugStackTrace(); throw new UnsupportedOperationException("This method is unsupported by rscPermissions."); } @Override public void setPlayerPrefix(Player player, String prefix) { + rscp.bridgeForBukkit.printDebugStackTrace(); throw new UnsupportedOperationException("This method is unsupported by rscPermissions."); } @Override @Deprecated public void setPlayerPrefix(String world, String player, String prefix) { + rscp.bridgeForBukkit.printDebugStackTrace(); throw new UnsupportedOperationException("This method is unsupported by rscPermissions."); } // ***** SET PLAYER SUFFIX ***** @Override public void setPlayerSuffix(String world, OfflinePlayer player, String suffix) { + rscp.bridgeForBukkit.printDebugStackTrace(); throw new UnsupportedOperationException("This method is unsupported by rscPermissions."); } @Override public void setPlayerSuffix(Player player, String suffix) { + rscp.bridgeForBukkit.printDebugStackTrace(); throw new UnsupportedOperationException("This method is unsupported by rscPermissions."); } @Override @Deprecated public void setPlayerSuffix(String world, String player, String suffix) { + rscp.bridgeForBukkit.printDebugStackTrace(); throw new UnsupportedOperationException("This method is unsupported by rscPermissions."); } // ***** GET GROUP PREFIX ***** @Override public String getGroupPrefix(String world, String group) { + rscp.bridgeForBukkit.printDebugStackTrace(); return rscp.internalCache.getGroup(group).prefix; } @Override public String getGroupPrefix(World world, String group) { + rscp.bridgeForBukkit.printDebugStackTrace(); return rscp.internalCache.getGroup(group).prefix; } // ***** GET GROUP SUFFIX ***** @Override public String getGroupSuffix(String world, String group) { + rscp.bridgeForBukkit.printDebugStackTrace(); return rscp.internalCache.getGroup(group).suffix; } @Override public String getGroupSuffix(World world, String group) { + rscp.bridgeForBukkit.printDebugStackTrace(); return rscp.internalCache.getGroup(group).suffix; } // ***** SET GROUP PREFIX ***** @Override public void setGroupPrefix(World world, String group, String prefix) { + rscp.bridgeForBukkit.printDebugStackTrace(); throw new UnsupportedOperationException("This method is unsupported by rscPermissions."); } @Override public void setGroupPrefix(String world, String group, String prefix) { + rscp.bridgeForBukkit.printDebugStackTrace(); throw new UnsupportedOperationException("This method is unsupported by rscPermissions."); } // ***** SET GROUP SUFFIX ***** @Override public void setGroupSuffix(String world, String group, String suffix) { + rscp.bridgeForBukkit.printDebugStackTrace(); throw new UnsupportedOperationException("This method is unsupported by rscPermissions."); } @Override public void setGroupSuffix(World world, String group, String suffix) { + rscp.bridgeForBukkit.printDebugStackTrace(); throw new UnsupportedOperationException("This method is unsupported by rscPermissions."); } // ***** DELEGATED TO PERMISSION ***** diff --git a/src/main/java/ru/simsonic/rscPermissions/Bukkit/VaultPermission.java b/src/main/java/ru/simsonic/rscPermissions/Bukkit/VaultPermission.java index 8b66602..f805c4e 100644 --- a/src/main/java/ru/simsonic/rscPermissions/Bukkit/VaultPermission.java +++ b/src/main/java/ru/simsonic/rscPermissions/Bukkit/VaultPermission.java @@ -1,4 +1,5 @@ package ru.simsonic.rscPermissions.Bukkit; +import java.util.Set; import org.bukkit.OfflinePlayer; import org.bukkit.World; import org.bukkit.command.CommandSender; @@ -32,10 +33,9 @@ public final class VaultPermission extends net.milkbowl.vault.permission.Permiss return true; } @Override - @Deprecated - public boolean playerHas(String world, String player, String permission) + public boolean hasGroupSupport() { - throw new UnsupportedOperationException("This method is unsupported by rscPermissions."); + return true; } @Override @Deprecated @@ -77,16 +77,6 @@ public final class VaultPermission extends net.milkbowl.vault.permission.Permiss throw new UnsupportedOperationException("This method is unsupported by rscPermissions."); } @Override - public String[] getGroups() - { - throw new UnsupportedOperationException("This method is unsupported by rscPermissions."); - } - @Override - public boolean hasGroupSupport() - { - throw new UnsupportedOperationException("This method is unsupported by rscPermissions."); - } - @Override public boolean has(CommandSender sender, String permission) { return sender.hasPermission(permission); @@ -94,174 +84,229 @@ public final class VaultPermission extends net.milkbowl.vault.permission.Permiss @Override public boolean has(Player player, String permission) { - return player.hasPermission(permission); + rscp.bridgeForBukkit.printDebugStackTrace(); + return rscp.permissionManager.getResult(player).hasPermission(permission); + } + @Override + @Deprecated + public boolean playerHas(String world, String player, String permission) + { + rscp.bridgeForBukkit.printDebugStackTrace(); + return rscp.permissionManager.getResult(player).hasPermission(permission); } @Override public boolean playerHas(String world, OfflinePlayer player, String permission) { - throw new UnsupportedOperationException("This method is unsupported by rscPermissions."); + rscp.bridgeForBukkit.printDebugStackTrace(); + return rscp.permissionManager.getResult(player).hasPermission(permission); } @Override public boolean playerHas(Player player, String permission) { - throw new UnsupportedOperationException("This method is unsupported by rscPermissions."); + rscp.bridgeForBukkit.printDebugStackTrace(); + return rscp.permissionManager.getResult(player).hasPermission(permission); } @Override public boolean playerAdd(String world, OfflinePlayer player, String permission) { + rscp.bridgeForBukkit.printDebugStackTrace(); throw new UnsupportedOperationException("This method is unsupported by rscPermissions."); } @Override public boolean playerAdd(Player player, String permission) { + rscp.bridgeForBukkit.printDebugStackTrace(); throw new UnsupportedOperationException("This method is unsupported by rscPermissions."); } @Override - public boolean playerAddTransient(OfflinePlayer player, String permission) throws UnsupportedOperationException + public boolean playerAddTransient(OfflinePlayer player, String permission) { + rscp.bridgeForBukkit.printDebugStackTrace(); throw new UnsupportedOperationException("This method is unsupported by rscPermissions."); } @Override public boolean playerAddTransient(Player player, String permission) { + rscp.bridgeForBukkit.printDebugStackTrace(); throw new UnsupportedOperationException("This method is unsupported by rscPermissions."); } @Override public boolean playerAddTransient(String worldName, OfflinePlayer player, String permission) { + rscp.bridgeForBukkit.printDebugStackTrace(); throw new UnsupportedOperationException("This method is unsupported by rscPermissions."); } @Override public boolean playerAddTransient(String worldName, Player player, String permission) { + rscp.bridgeForBukkit.printDebugStackTrace(); throw new UnsupportedOperationException("This method is unsupported by rscPermissions."); } @Override public boolean playerRemoveTransient(String worldName, OfflinePlayer player, String permission) { + rscp.bridgeForBukkit.printDebugStackTrace(); throw new UnsupportedOperationException("This method is unsupported by rscPermissions."); } @Override public boolean playerRemoveTransient(String worldName, Player player, String permission) { + rscp.bridgeForBukkit.printDebugStackTrace(); throw new UnsupportedOperationException("This method is unsupported by rscPermissions."); } @Override public boolean playerRemove(String world, OfflinePlayer player, String permission) { + rscp.bridgeForBukkit.printDebugStackTrace(); throw new UnsupportedOperationException("This method is unsupported by rscPermissions."); } @Override @Deprecated public boolean playerRemove(World world, String player, String permission) { + rscp.bridgeForBukkit.printDebugStackTrace(); throw new UnsupportedOperationException("This method is unsupported by rscPermissions."); } @Override public boolean playerRemove(Player player, String permission) { + rscp.bridgeForBukkit.printDebugStackTrace(); throw new UnsupportedOperationException("This method is unsupported by rscPermissions."); } @Override public boolean playerRemoveTransient(OfflinePlayer player, String permission) { + rscp.bridgeForBukkit.printDebugStackTrace(); throw new UnsupportedOperationException("This method is unsupported by rscPermissions."); } @Override public boolean playerRemoveTransient(Player player, String permission) { + rscp.bridgeForBukkit.printDebugStackTrace(); throw new UnsupportedOperationException("This method is unsupported by rscPermissions."); } @Override public boolean groupHas(World world, String group, String permission) { + rscp.bridgeForBukkit.printDebugStackTrace(); throw new UnsupportedOperationException("This method is unsupported by rscPermissions."); } @Override public boolean groupAdd(World world, String group, String permission) { + rscp.bridgeForBukkit.printDebugStackTrace(); throw new UnsupportedOperationException("This method is unsupported by rscPermissions."); } @Override public boolean groupRemove(World world, String group, String permission) { + rscp.bridgeForBukkit.printDebugStackTrace(); throw new UnsupportedOperationException("This method is unsupported by rscPermissions."); } @Override public boolean playerAddGroup(String world, OfflinePlayer player, String group) { + rscp.bridgeForBukkit.printDebugStackTrace(); throw new UnsupportedOperationException("This method is unsupported by rscPermissions."); } @Override public boolean playerAddGroup(Player player, String group) { + rscp.bridgeForBukkit.printDebugStackTrace(); throw new UnsupportedOperationException("This method is unsupported by rscPermissions."); } @Override public boolean playerRemoveGroup(String world, OfflinePlayer player, String group) { + rscp.bridgeForBukkit.printDebugStackTrace(); throw new UnsupportedOperationException("This method is unsupported by rscPermissions."); } @Override public boolean playerRemoveGroup(Player player, String group) { + rscp.bridgeForBukkit.printDebugStackTrace(); throw new UnsupportedOperationException("This method is unsupported by rscPermissions."); } @Override @Deprecated public boolean playerInGroup(String world, String player, String group) { + rscp.bridgeForBukkit.printDebugStackTrace(); final ResolutionResult result = rscp.permissionManager.getResult(player); - return result.groups.contains(group); + for(String parent : result.getDeorderedGroups()) + if(parent.equalsIgnoreCase(group)) + return true; + return false; } @Override public boolean playerInGroup(String world, OfflinePlayer player, String group) { + rscp.bridgeForBukkit.printDebugStackTrace(); final ResolutionResult result = rscp.permissionManager.getResult(player); - return result.groups.contains(group); + for(String parent : result.getDeorderedGroups()) + if(parent.equalsIgnoreCase(group)) + return true; + return false; } @Override public boolean playerInGroup(Player player, String group) { + rscp.bridgeForBukkit.printDebugStackTrace(); final ResolutionResult result = rscp.permissionManager.getResult(player); - return result.groups.contains(group); + for(String parent : result.getDeorderedGroups()) + if(parent.equalsIgnoreCase(group)) + return true; + return false; } @Override @Deprecated public String[] getPlayerGroups(String world, String player) { + rscp.bridgeForBukkit.printDebugStackTrace(); final ResolutionResult result = rscp.permissionManager.getResult(player); - return result.groups.toArray(new String[result.groups.size()]); + return result.getDeorderedGroups(); } @Override public String[] getPlayerGroups(String world, OfflinePlayer player) { + rscp.bridgeForBukkit.printDebugStackTrace(); final ResolutionResult result = rscp.permissionManager.getResult(player); - return result.groups.toArray(new String[result.groups.size()]); + return result.getDeorderedGroups(); } @Override public String[] getPlayerGroups(Player player) { + rscp.bridgeForBukkit.printDebugStackTrace(); final ResolutionResult result = rscp.permissionManager.getResult(player); - return result.groups.toArray(new String[result.groups.size()]); + return result.getDeorderedGroups(); } @Override @Deprecated public String getPrimaryGroup(String world, String player) { + rscp.bridgeForBukkit.printDebugStackTrace(); final String[] groups = getPlayerGroups(world, player); return groups.length > 0 ? groups[groups.length - 1] : rscp.settings.getDefaultGroup(); } @Override public String getPrimaryGroup(String world, OfflinePlayer player) { + rscp.bridgeForBukkit.printDebugStackTrace(); final String[] groups = getPlayerGroups(world, player); return groups.length > 0 ? groups[groups.length - 1] : rscp.settings.getDefaultGroup(); } @Override public String getPrimaryGroup(Player player) { + rscp.bridgeForBukkit.printDebugStackTrace(); final String[] groups = getPlayerGroups(player); return groups.length > 0 ? groups[groups.length - 1] : rscp.settings.getDefaultGroup(); } + @Override + public String[] getGroups() + { + rscp.bridgeForBukkit.printDebugStackTrace(); + final Set groups = rscp.internalCache.getGroups(); + return groups.toArray(new String[groups.size()]); + } } diff --git a/src/main/java/ru/simsonic/rscPermissions/Engine/ResolutionResult.java b/src/main/java/ru/simsonic/rscPermissions/Engine/ResolutionResult.java index 094fcb7..b6fc833 100644 --- a/src/main/java/ru/simsonic/rscPermissions/Engine/ResolutionResult.java +++ b/src/main/java/ru/simsonic/rscPermissions/Engine/ResolutionResult.java @@ -1,6 +1,8 @@ package ru.simsonic.rscPermissions.Engine; +import java.util.ArrayList; import java.util.Map; import java.util.Set; +import ru.simsonic.rscPermissions.API.Settings; public class ResolutionResult { @@ -15,4 +17,15 @@ public class ResolutionResult return entry.getValue(); return false; } + public String[] getDeorderedGroups() + { + final ArrayList list = new ArrayList(groups.size()); + final String separator = new String(new char[] { Settings.groupLevelTab }); + for(String group : groups) + { + String[] splitted = group.split(separator); + list.add(splitted[splitted.length - 1]); + } + return list.toArray(new String[list.size()]); + } }