diff --git a/src/main/java/ru/simsonic/rscPermissions/BridgeForBukkitAPI.java b/src/main/java/ru/simsonic/rscPermissions/BridgeForBukkitAPI.java index f641f88..09e78ee 100644 --- a/src/main/java/ru/simsonic/rscPermissions/BridgeForBukkitAPI.java +++ b/src/main/java/ru/simsonic/rscPermissions/BridgeForBukkitAPI.java @@ -7,12 +7,18 @@ public class BridgeForBukkitAPI private final BukkitPluginMain rscp; private final VaultPermission vaultPermission; private final VaultChat vaultChat; + private static BridgeForBukkitAPI instance; protected BridgeForBukkitAPI(BukkitPluginMain plugin) { + BridgeForBukkitAPI.instance = BridgeForBukkitAPI.this; this.rscp = plugin; this.vaultPermission = new VaultPermission(this); this.vaultChat = new VaultChat(this, vaultPermission); } + public static BridgeForBukkitAPI getInstance() + { + return instance; + } public org.bukkit.plugin.java.JavaPlugin getPlugin() { return this.rscp; diff --git a/src/main/java/ru/simsonic/rscPermissions/Bukkit/BukkitMaintenance.java b/src/main/java/ru/simsonic/rscPermissions/Bukkit/BukkitMaintenance.java index b943a1d..a34d58b 100644 --- a/src/main/java/ru/simsonic/rscPermissions/Bukkit/BukkitMaintenance.java +++ b/src/main/java/ru/simsonic/rscPermissions/Bukkit/BukkitMaintenance.java @@ -43,7 +43,7 @@ public class BukkitMaintenance implements Listener try { final String name = event.getName(); - plugin.cache2.resolvePlayer(name); + plugin.internalCache.resolvePlayer(name); // permissions.putAll(plugin.cache.mapPermissions.get(name)); } catch(RuntimeException ex) { } @@ -51,7 +51,7 @@ public class BukkitMaintenance implements Listener { final UUID uuid = event.getUniqueId(); final String userFriendlyUniqueId = uuid.toString().replace("-", "").toLowerCase(); - plugin.cache2.resolvePlayer(userFriendlyUniqueId); + plugin.internalCache.resolvePlayer(userFriendlyUniqueId); // permissions.putAll(plugin.cache.mapPermissions.get(userFriendlyUniqueId)); } catch(RuntimeException | NoSuchMethodError ex) { } diff --git a/src/main/java/ru/simsonic/rscPermissions/Bukkit/BukkitPermissions.java b/src/main/java/ru/simsonic/rscPermissions/Bukkit/BukkitPermissions.java index f7c6edf..ed249fc 100644 --- a/src/main/java/ru/simsonic/rscPermissions/Bukkit/BukkitPermissions.java +++ b/src/main/java/ru/simsonic/rscPermissions/Bukkit/BukkitPermissions.java @@ -1,11 +1,13 @@ package ru.simsonic.rscPermissions.Bukkit; +import java.util.ArrayList; import java.util.HashMap; +import java.util.Set; import java.util.concurrent.LinkedBlockingQueue; import org.bukkit.entity.Player; import org.bukkit.permissions.PermissionAttachment; import ru.simsonic.rscPermissions.DataTypes.RowPermission; -import ru.simsonic.rscPermissions.InternalCache.BrandNewCache; import ru.simsonic.rscPermissions.BukkitPluginMain; +import ru.simsonic.rscPermissions.InternalCache.ResolutionParams; import ru.simsonic.rscPermissions.InternalCache.ResolutionResult; import ru.simsonic.rscUtilityLibrary.RestartableThread; @@ -44,7 +46,7 @@ public class BukkitPermissions extends RestartableThread { for(Player current = updateQueue.take(); current != null; current = updateQueue.take()) { - final ResolutionResult result = rscp.cache2.resolvePlayer(current); + final ResolutionResult result = rscp.permissionManager.resolvePlayer(current); prefixes.put(current, result.prefix); suffixes.put(current, result.suffix); persistentPermissions.put(current, result.permissions); @@ -85,4 +87,42 @@ public class BukkitPermissions extends RestartableThread } updateQueue.clear(); } + public synchronized ResolutionResult resolvePlayer(Player player) + { + final ResolutionParams params = new ResolutionParams(); + params.applicableIdentifiers = getPlayerIdentifiers(player); + if(rscp.regionListProvider != null) + { + Set regionSet = rscp.regionListProvider.getPlayerRegions(player); + params.destRegions = regionSet.toArray(new String[regionSet.size()]); + } else + params.destRegions = new String[] {}; + params.destWorld = player.getLocation().getWorld().getName(); + params.destServerId = rscp.getServer().getServerId(); + params.expirience = player.getLevel(); + return rscp.internalCache.resolvePlayer(params); + } + private static String[] getPlayerIdentifiers(Player player) + { + final ArrayList result = new ArrayList<>(); + // For old servers Player's name can be used as entity name + try + { + // minecraft <= 1.7.x + result.add(player.getName()); + } catch(RuntimeException | NoSuchMethodError ex) { + // minecraft >= 1.8 + } + // For newest servers Player's UUID is used as entity name + try + { + // minecraft >= 1.8 + result.add(player.getUniqueId().toString().toLowerCase()); + } catch(RuntimeException | NoSuchMethodError ex) { + // minecraft <= 1.7.x + } + // IP address of a Player can be used as entity name too + result.add(player.getAddress().getAddress().getHostAddress()); + return result.toArray(new String[result.size()]); + } } diff --git a/src/main/java/ru/simsonic/rscPermissions/Bukkit/PlayerEventsListener.java b/src/main/java/ru/simsonic/rscPermissions/Bukkit/PlayerEventsListener.java index 7a1f24e..164ec00 100644 --- a/src/main/java/ru/simsonic/rscPermissions/Bukkit/PlayerEventsListener.java +++ b/src/main/java/ru/simsonic/rscPermissions/Bukkit/PlayerEventsListener.java @@ -20,7 +20,7 @@ public class PlayerEventsListener implements Listener @EventHandler public void onPlayerAsyncPreLogin(AsyncPlayerPreLoginEvent event) { - rscp.cache2.resolvePlayer(new String[] + rscp.internalCache.resolvePlayer(new String[] { event.getName(), event.getUniqueId().toString(), @@ -30,17 +30,17 @@ public class PlayerEventsListener implements Listener @EventHandler(priority = EventPriority.LOWEST) public void onPlayerLogin(PlayerLoginEvent event) { - rscp.cache2.resolvePlayer(event.getPlayer()); + rscp.permissionManager.resolvePlayer(event.getPlayer()); } @EventHandler public void onPlayerExp(PlayerLevelChangeEvent event) { - rscp.cache2.resolvePlayer(event.getPlayer()); + rscp.permissionManager.resolvePlayer(event.getPlayer()); } @EventHandler public void onPlayerLevel(PlayerExpChangeEvent event) { - rscp.cache2.resolvePlayer(event.getPlayer()); + rscp.permissionManager.resolvePlayer(event.getPlayer()); } @EventHandler public void onPlayerKick(PlayerKickEvent event) diff --git a/src/main/java/ru/simsonic/rscPermissions/BukkitPluginMain.java b/src/main/java/ru/simsonic/rscPermissions/BukkitPluginMain.java index ad44894..c53b560 100644 --- a/src/main/java/ru/simsonic/rscPermissions/BukkitPluginMain.java +++ b/src/main/java/ru/simsonic/rscPermissions/BukkitPluginMain.java @@ -12,7 +12,7 @@ import org.mcstats.MetricsLite; import ru.simsonic.rscPermissions.Bukkit.BukkitPermissions; import ru.simsonic.rscPermissions.Bukkit.BukkitPluginConfiguration; import ru.simsonic.rscPermissions.Bukkit.PlayerEventsListener; -import ru.simsonic.rscPermissions.InternalCache.BrandNewCache; +import ru.simsonic.rscPermissions.InternalCache.InternalCache; import ru.simsonic.rscUtilityLibrary.CommandProcessing.CommandAnswerException; import ru.simsonic.rscUtilityLibrary.TextProcessing.GenericChatCodes; @@ -21,9 +21,9 @@ public final class BukkitPluginMain extends JavaPlugin private static final String chatPrefix = "{_YL}[rscp] {GOLD}"; public static final Logger consoleLog = Logger.getLogger("Minecraft"); public final Settings settings = new BukkitPluginConfiguration(this); - private final BridgeForBukkitAPI api = new BridgeForBukkitAPI(this); + private final BridgeForBukkitAPI bridgeForBukkit = new BridgeForBukkitAPI(this); public final PlayerEventsListener listener = new PlayerEventsListener(this); - public final BrandNewCache cache2 = new BrandNewCache(this); + public final InternalCache internalCache = new InternalCache(this); public final BukkitPermissions permissionManager = new BukkitPermissions(this); public final RegionListProviders regionListProvider = new RegionListProviders(this); private final RegionUpdateObserver regionUpdateObserver = new RegionUpdateObserver(this); @@ -55,7 +55,7 @@ public final class BukkitPluginMain extends JavaPlugin // WorldGuard, Residence and other possible region list providers regionListProvider.integrate(); // Start all needed threads - cache2.setDefaultGroup(settings.getDefaultGroup()); + internalCache.setDefaultGroup(settings.getDefaultGroup()); permissionManager.start(); regionUpdateObserver.start(); connectionList.threadFetchTablesData(); diff --git a/src/main/java/ru/simsonic/rscPermissions/ConnectionHelper.java b/src/main/java/ru/simsonic/rscPermissions/ConnectionHelper.java index dcbc687..2bbb15d 100644 --- a/src/main/java/ru/simsonic/rscPermissions/ConnectionHelper.java +++ b/src/main/java/ru/simsonic/rscPermissions/ConnectionHelper.java @@ -41,7 +41,7 @@ public class ConnectionHelper extends BackendMySQL final ConnectionMySQL connection = findConnectedNode(); if(connection == null) return; - fetchIntoCache(rscp.cache2); + fetchIntoCache(rscp.internalCache); // Update permissions for online players try { diff --git a/src/main/java/ru/simsonic/rscPermissions/InternalCache/AsyncPlayerInfo.java b/src/main/java/ru/simsonic/rscPermissions/InternalCache/AsyncPlayerInfo.java deleted file mode 100644 index 94f5077..0000000 --- a/src/main/java/ru/simsonic/rscPermissions/InternalCache/AsyncPlayerInfo.java +++ /dev/null @@ -1,97 +0,0 @@ -package ru.simsonic.rscPermissions.InternalCache; -import java.util.Set; -import java.util.UUID; -import org.bukkit.Location; -import org.bukkit.entity.Player; -import ru.simsonic.rscPermissions.DataTypes.RowInheritance; -import ru.simsonic.rscPermissions.DataTypes.RowPermission; -import ru.simsonic.rscPermissions.InternalCache.LocalCacheTree.ResolutionLeaf; - -public class AsyncPlayerInfo -{ - public Player player; - public String name; - public UUID uuid; - public int expirience; - public Location location; - public Set regions; - public AsyncPlayerInfo() - { - } - public AsyncPlayerInfo(String playerName) - { - this.name = playerName; - } - public AsyncPlayerInfo(UUID playerUniqueId) - { - this.uuid = playerUniqueId; - } - public AsyncPlayerInfo(Player player, Set regions) - { - if(player != null) - { - this.player = player; - try - { - // minecraft <= 1.7 - this.name = player.getName(); - } catch(RuntimeException | NoSuchMethodError ex) { - // minecraft >= 1.8 - } - try - { - // minecraft >= 1.8 - this.uuid = player.getUniqueId(); - } catch(RuntimeException | NoSuchMethodError ex) { - // minecraft <= 1.7 - } - this.expirience = player.getLevel(); - this.location = player.getLocation(); - this.regions = regions; - } - } - public boolean isPlayerEntityApplicable(String entity) - { - // Test by UUID (minecraft >= 1.8) - try - { - if(this.uuid.compareTo(UUID.fromString(entity)) == 0) - return true; - } catch(RuntimeException ex) { - // Server doesn't support this yet - } - // Test by name (minecraft <= 1.7) - try - { - if(this.name.equalsIgnoreCase(entity)) - return true; - } catch(RuntimeException ex) { - // Server already doesn't support this - } - return false; - } - public boolean isPlayerPermissionApplicable(RowPermission row) - { - if(isPlayerEntityApplicable(row.entity) || "".equals(row.entity)) - return (row.destination.isLocationApplicable(location, regions, null) && row.expirience <= expirience); - return false; - } - public boolean isGroupPermissionApplicable(RowPermission row, ResolutionLeaf leaf) - { - if(row.entity.equalsIgnoreCase(leaf.group) || "".equals(row.entity)) - return (row.destination.isLocationApplicable(location, regions, leaf.instance) && row.expirience <= expirience); - return false; - } - public boolean isPlayerInheritanceApplicable(RowInheritance row) - { - if(isPlayerEntityApplicable(row.entity)) - return (row.destination.isLocationApplicable(location, regions, row.instance) && row.expirience <= expirience); - return false; - } - public boolean isGroupInheritanceApplicable(RowInheritance row, ResolutionLeaf leaf) - { - if(row.entity.equalsIgnoreCase(leaf.group)) - return (row.destination.isLocationApplicable(location, regions, leaf.instance) && row.expirience <= expirience); - return false; - } -} diff --git a/src/main/java/ru/simsonic/rscPermissions/InternalCache/BrandNewCache.java b/src/main/java/ru/simsonic/rscPermissions/InternalCache/InternalCache.java similarity index 81% rename from src/main/java/ru/simsonic/rscPermissions/InternalCache/BrandNewCache.java rename to src/main/java/ru/simsonic/rscPermissions/InternalCache/InternalCache.java index 69c5fd8..739756a 100644 --- a/src/main/java/ru/simsonic/rscPermissions/InternalCache/BrandNewCache.java +++ b/src/main/java/ru/simsonic/rscPermissions/InternalCache/InternalCache.java @@ -3,8 +3,6 @@ import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; -import java.util.Set; -import org.bukkit.entity.Player; import ru.simsonic.rscPermissions.DataTypes.EntityType; import ru.simsonic.rscPermissions.DataTypes.RowEntity; import ru.simsonic.rscPermissions.DataTypes.RowInheritance; @@ -12,10 +10,10 @@ import ru.simsonic.rscPermissions.DataTypes.RowPermission; import ru.simsonic.rscPermissions.BukkitPluginMain; import ru.simsonic.rscPermissions.API.Settings; -public class BrandNewCache implements AbstractPermissionsCache +public class InternalCache implements AbstractPermissionsCache { protected final BukkitPluginMain plugin; - public BrandNewCache(BukkitPluginMain rscp) + public InternalCache(BukkitPluginMain rscp) { this.plugin = rscp; } @@ -86,21 +84,6 @@ public class BrandNewCache implements AbstractPermissionsCache result.subleafs = subleafs.toArray(new InheritanceLeaf[subleafs.size()]); return result; } - public synchronized ResolutionResult resolvePlayer(Player player) - { - final ResolutionParams params = new ResolutionParams(); - params.applicableIdentifiers = getPlayerIdentifiers(player); - if(plugin.regionListProvider != null) - { - Set regionSet = plugin.regionListProvider.getPlayerRegions(player); - params.destRegions = regionSet.toArray(new String[regionSet.size()]); - } else - params.destRegions = new String[] {}; - params.destWorld = player.getLocation().getWorld().getName(); - params.destServerId = plugin.getServer().getServerId(); - params.expirience = player.getLevel(); - return resolvePlayer(params); - } public synchronized ResolutionResult resolvePlayer(String player) { return resolvePlayer(new String[] { player }); @@ -115,30 +98,7 @@ public class BrandNewCache implements AbstractPermissionsCache // params.expirience = 0; return resolvePlayer(params); } - private static String[] getPlayerIdentifiers(Player player) - { - final ArrayList result = new ArrayList<>(); - // For old servers Player's name can be used as entity name - try - { - // minecraft <= 1.7.x - result.add(player.getName()); - } catch(RuntimeException | NoSuchMethodError ex) { - // minecraft >= 1.8 - } - // For newest servers Player's UUID is used as entity name - try - { - // minecraft >= 1.8 - result.add(player.getUniqueId().toString().toLowerCase()); - } catch(RuntimeException | NoSuchMethodError ex) { - // minecraft <= 1.7.x - } - // IP address of a Player can be used as entity name too - result.add(player.getAddress().getAddress().getHostAddress()); - return result.toArray(new String[result.size()]); - } - private ResolutionResult resolvePlayer(ResolutionParams params) + public synchronized ResolutionResult resolvePlayer(ResolutionParams params) { final ArrayList applicableBranches = new ArrayList<>(); // Grab all inheritance rows applicable to this player diff --git a/src/main/java/ru/simsonic/rscPermissions/InternalCache/LocalCacheData.java b/src/main/java/ru/simsonic/rscPermissions/InternalCache/LocalCacheData.java deleted file mode 100644 index 58c4940..0000000 --- a/src/main/java/ru/simsonic/rscPermissions/InternalCache/LocalCacheData.java +++ /dev/null @@ -1,71 +0,0 @@ -package ru.simsonic.rscPermissions.InternalCache; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.concurrent.ConcurrentHashMap; -import ru.simsonic.rscPermissions.DataTypes.EntityType; -import ru.simsonic.rscPermissions.DataTypes.RowEntity; -import ru.simsonic.rscPermissions.DataTypes.RowInheritance; -import ru.simsonic.rscPermissions.DataTypes.RowPermission; -import ru.simsonic.rscPermissions.BukkitPluginMain; - -public class LocalCacheData -{ - protected final BukkitPluginMain plugin; - protected final HashMap entities_g = new HashMap<>(); - protected final HashMap entities_u = new HashMap<>(); - protected final ConcurrentHashMap prefixes_u = new ConcurrentHashMap<>(); - protected final ConcurrentHashMap suffixes_u = new ConcurrentHashMap<>(); - protected final ArrayList permissions_p2g = new ArrayList<>(); - protected final ArrayList permissions_p2u = new ArrayList<>(); - protected final ArrayList inheritance_g2g = new ArrayList<>(); - protected final ArrayList inheritance_g2u = new ArrayList<>(); - protected LocalCacheData(BukkitPluginMain rscp) - { - this.plugin = rscp; - } - public synchronized int ImportEntities(RowEntity[] rows) - { - entities_g.clear(); - entities_u.clear(); - if(rows == null) - return 0; - for(RowEntity row : rows) - { - if(row.entityType == EntityType.group) - entities_g.put(row.entity.toLowerCase(), row); - else - entities_u.put(row.entity.toLowerCase(), row); - } - return entities_g.size() + entities_u.size(); - } - public synchronized int ImportPermissions(RowPermission[] rows) - { - permissions_p2g.clear(); - permissions_p2u.clear(); - if(rows == null) - return 0; - for(RowPermission row : rows) - { - if(row.entityType == EntityType.group) - permissions_p2g.add(row); - else - permissions_p2u.add(row); - } - return permissions_p2g.size() + permissions_p2u.size(); - } - public synchronized int ImportInheritance(RowInheritance[] rows) - { - inheritance_g2g.clear(); - inheritance_g2u.clear(); - if(rows == null) - return 0; - for(RowInheritance row : rows) - { - if(row.childType == EntityType.group) - inheritance_g2g.add(row); - else - inheritance_g2u.add(row); - } - return inheritance_g2g.size() + inheritance_g2u.size(); - } -} diff --git a/src/main/java/ru/simsonic/rscPermissions/InternalCache/LocalCacheFunctions.java b/src/main/java/ru/simsonic/rscPermissions/InternalCache/LocalCacheFunctions.java deleted file mode 100644 index 18203d9..0000000 --- a/src/main/java/ru/simsonic/rscPermissions/InternalCache/LocalCacheFunctions.java +++ /dev/null @@ -1,65 +0,0 @@ -package ru.simsonic.rscPermissions.InternalCache; -import java.util.ArrayList; -import java.util.HashSet; -import java.util.Set; -import ru.simsonic.rscPermissions.DataTypes.RowEntity; -import ru.simsonic.rscPermissions.DataTypes.RowInheritance; -import ru.simsonic.rscPermissions.DataTypes.RowPermission; -import ru.simsonic.rscPermissions.BukkitPluginMain; -import ru.simsonic.rscPermissions.API.Settings; - -public class LocalCacheFunctions extends LocalCacheTree -{ - public LocalCacheFunctions(BukkitPluginMain rscp) - { - super(rscp); - } - public String userGetPrefix(String user) - { - return prefixes_u.get(user); - } - public String userGetSuffix(String user) - { - return suffixes_u.get(user); - } - public synchronized String groupGetPrefix(String group) - { - if(group == null || "".equals(group)) - return null; - RowEntity entity = entities_g.get(group.toLowerCase()); - return (entity != null) ? entity.prefix : null; - } - public synchronized String groupGetSuffix(String group) - { - if(group == null || "".equals(group)) - return null; - RowEntity entity = entities_g.get(group.toLowerCase()); - return (entity != null) ? entity.suffix : null; - } - public synchronized ArrayList getUserGroups(String player) - { - final ArrayList tree = mapTrees.get(player.toLowerCase()); - if(tree == null) - return null; - final ArrayList result = new ArrayList<>(); - for(ResolutionLeaf leaf : tree) - result.add(leaf.instance != null ? leaf.group + Settings.separator + leaf.instance : leaf.group); - return result; - } - public synchronized Set getAllPossibleGroups() - { - Set result = new HashSet<>(); - for(RowEntity row : entities_g.values()) - result.add(row.entity.toLowerCase()); - for(RowPermission row : permissions_p2g) - result.add(row.entity.toLowerCase()); - for(RowInheritance row : inheritance_g2g) - { - result.add(row.entity.toLowerCase()); - result.add(row.parent.toLowerCase()); - } - for(RowInheritance row : inheritance_g2u) - result.add(row.parent.toLowerCase()); - return result; - } -} diff --git a/src/main/java/ru/simsonic/rscPermissions/InternalCache/LocalCacheTree.java b/src/main/java/ru/simsonic/rscPermissions/InternalCache/LocalCacheTree.java deleted file mode 100644 index 92f3901..0000000 --- a/src/main/java/ru/simsonic/rscPermissions/InternalCache/LocalCacheTree.java +++ /dev/null @@ -1,171 +0,0 @@ -package ru.simsonic.rscPermissions.InternalCache; -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashMap; -import java.util.HashSet; -import java.util.UUID; -import java.util.concurrent.ConcurrentHashMap; -import org.bukkit.entity.Player; -import ru.simsonic.rscPermissions.DataTypes.RowEntity; -import ru.simsonic.rscPermissions.DataTypes.RowInheritance; -import ru.simsonic.rscPermissions.DataTypes.RowPermission; -import ru.simsonic.rscPermissions.BukkitPluginMain; -import ru.simsonic.rscPermissions.API.Settings; -import ru.simsonic.rscUtilityLibrary.TextProcessing.GenericChatCodes; - -public class LocalCacheTree extends LocalCacheData -{ - protected static class ResolutionLeaf - { - public String group; - public String instance; - public RowInheritance row; - } - protected LocalCacheTree(BukkitPluginMain rscp) - { - super(rscp); - } - public final ConcurrentHashMap> mapTrees = new ConcurrentHashMap<>(); - public final ConcurrentHashMap> mapPermissions = new ConcurrentHashMap<>(); - protected final RowInheritance defaultInheritance = new RowInheritance(); - public void setDefaultGroup(String defaultGroup) - { - defaultInheritance.parent = defaultGroup; - defaultInheritance.deriveInstance(); - } - public synchronized void clear() - { - mapTrees.clear(); - mapPermissions.clear(); - prefixes_u.clear(); - suffixes_u.clear(); - entities_g.clear(); - entities_u.clear(); - permissions_p2g.clear(); - permissions_p2u.clear(); - inheritance_g2g.clear(); - inheritance_g2u.clear(); - } - public synchronized void calculateStartupPermissions() - { - final HashSet playerEntities = new HashSet<>(); - // Undefined player - playerEntities.add(""); // Зачем я его тут добавил?!? - // Defined players (in any table) - playerEntities.addAll(entities_u.keySet()); - for(RowPermission row : permissions_p2u) - playerEntities.add(row.entity); - for(RowInheritance row : inheritance_g2u) - playerEntities.add(row.entity); - // Recalculate - for(String entityNameOrUUID : playerEntities) - calculateBasePermissions(entityNameOrUUID); - } - public synchronized void calculateBasePermissions(String playerName) - { - AsyncPlayerInfo p2rc = new AsyncPlayerInfo(playerName); - HashMap list = treeToPermissions(p2rc); - mapPermissions.put(playerName, list); - } - public synchronized void calculateBasePermissions(UUID playerUniqueId) - { - AsyncPlayerInfo p2rc = new AsyncPlayerInfo(playerUniqueId); - HashMap list = treeToPermissions(p2rc); - mapPermissions.put(playerUniqueId.toString().replace("-", "").toLowerCase(), list); - } - public void calculatePlayerPermissions(Player player) - { - final AsyncPlayerInfo api = new AsyncPlayerInfo(player, plugin.regionListProvider.getPlayerRegions(player)); - // plugin.recalculatingPlayers.offer(api); - } - public synchronized HashMap treeToPermissions(AsyncPlayerInfo p2rc) - { - final HashMap permissions = new HashMap<>(); - String prefix = ""; - String suffix = ""; - ArrayList tree = buildUserTree(p2rc); - if(p2rc.name != null) - mapTrees.put(p2rc.name.toLowerCase(), tree); - // Group permissions - for(ResolutionLeaf leaf : tree) - { - for(RowPermission row : permissions_p2g) - if(p2rc.isGroupPermissionApplicable(row, leaf)) - { - String permission = row.permission; - // Additional processing - if(permission.contains(Settings.instantiator) && (leaf.instance != null)) - permission = permission.replace(Settings.instantiator, leaf.instance); - permissions.put(permission, row.value); - } - RowEntity entity = entities_g.get(leaf.group.toLowerCase()); - if(entity != null) - { - if(entity.prefix != null && !"".equals(entity.prefix)) - prefix = entity.prefix.replace("%", prefix); - if(entity.suffix != null && !"".equals(entity.suffix)) - suffix = entity.suffix.replace("%", suffix); - prefix = prefix.replace(Settings.instantiator, leaf.instance); - suffix = suffix.replace(Settings.instantiator, leaf.instance); - } - } - // User permissions - for(RowPermission row : permissions_p2u) - if(p2rc.isPlayerPermissionApplicable(row)) - permissions.put(row.permission, row.value); - if(p2rc.name != null) - { - RowEntity entity = entities_u.get(p2rc.name.toLowerCase()); - if(entity != null) - { - if(entity.prefix != null && !"".equals(entity.prefix)) - prefix = entity.prefix.replace("%", prefix); - if(entity.suffix != null && !"".equals(entity.suffix)) - suffix = entity.suffix.replace("%", suffix); - } - prefixes_u.put(p2rc.name, GenericChatCodes.processStringStatic(prefix)); - suffixes_u.put(p2rc.name, GenericChatCodes.processStringStatic(suffix)); - } - return permissions; - } - private ArrayList buildUserTree(AsyncPlayerInfo p2rc) - { - // User's direct inheritance - ArrayList parentRows = new ArrayList<>(); - for(RowInheritance row : inheritance_g2u) - if(p2rc.isPlayerInheritanceApplicable(row)) - parentRows.add(row); - Collections.sort(parentRows); - // Indirect default group - if(parentRows.isEmpty() || plugin.settings.isDefaultForever()) - parentRows.add(0, defaultInheritance); - ArrayList resultTree = new ArrayList<>(); - // Parent deep inheritances - for(RowInheritance row : parentRows) - { - ResolutionLeaf newleaf = new ResolutionLeaf(); - newleaf.group = row.parent; - newleaf.instance = row.instance; - newleaf.row = row; - buildGroupTree(p2rc, newleaf, resultTree); - } - return resultTree; - } - private void buildGroupTree(AsyncPlayerInfo p2rc, ResolutionLeaf findAndOpen, ArrayList result) - { - ArrayList parentRows = new ArrayList<>(inheritance_g2g.size() >> 2); - for(RowInheritance row : inheritance_g2g) - if(p2rc.isGroupInheritanceApplicable(row, findAndOpen)) - parentRows.add(row); - Collections.sort(parentRows); - for(RowInheritance row : parentRows) - { - ResolutionLeaf newleaf = new ResolutionLeaf(); - newleaf.group = row.parent; - newleaf.instance = (row.instance != null) ? row.instance : findAndOpen.instance; - newleaf.row = row; - buildGroupTree(p2rc, newleaf, result); - } - result.add(findAndOpen); - } -} \ No newline at end of file diff --git a/src/main/java/ru/simsonic/rscPermissions/RegionUpdateObserver.java b/src/main/java/ru/simsonic/rscPermissions/RegionUpdateObserver.java index 9c88f28..1aebcbf 100644 --- a/src/main/java/ru/simsonic/rscPermissions/RegionUpdateObserver.java +++ b/src/main/java/ru/simsonic/rscPermissions/RegionUpdateObserver.java @@ -32,7 +32,7 @@ public class RegionUpdateObserver extends RestartableThread for(; !Thread.interrupted(); Thread.sleep(granularity)) for(Player player : movedPlayers.getMovedPlayersAsync()) if(rscp.regionListProvider.isRegionListChanged(player)) - rscp.cache2.resolvePlayer(player); + rscp.permissionManager.resolvePlayer(player); } catch(InterruptedException ex) { } }