diff --git a/src/main/java/ru/simsonic/rscPermissions/Backends/BackendMySQL.java b/src/main/java/ru/simsonic/rscPermissions/Backends/BackendMySQL.java index 2bd9158..cedcd34 100644 --- a/src/main/java/ru/simsonic/rscPermissions/Backends/BackendMySQL.java +++ b/src/main/java/ru/simsonic/rscPermissions/Backends/BackendMySQL.java @@ -1,19 +1,18 @@ package ru.simsonic.rscPermissions.Backends; -import ru.simsonic.utilities.*; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; -import java.util.Arrays; import java.util.logging.Level; import ru.simsonic.rscPermissions.DataTypes.Destination; -import ru.simsonic.rscPermissions.DataTypes.RowEntity; import ru.simsonic.rscPermissions.DataTypes.EntityType; +import ru.simsonic.rscPermissions.DataTypes.RowEntity; import ru.simsonic.rscPermissions.DataTypes.RowInheritance; import ru.simsonic.rscPermissions.DataTypes.RowLadder; import ru.simsonic.rscPermissions.DataTypes.RowPermission; import ru.simsonic.rscPermissions.InternalCache.LocalCacheData; import ru.simsonic.rscPermissions.MainPluginClass; -import ru.simsonic.rscPermissions.Bukkit.BukkitPluginConfiguration; +import ru.simsonic.rscPermissions.Settings; +import ru.simsonic.utilities.*; public class BackendMySQL extends ConnectionMySQL implements Backend { @@ -58,7 +57,7 @@ public class BackendMySQL extends ConnectionMySQL implements Backend return false; if(super.Connect()) { - executeUpdate(loadResourceSQLT("Initialize_main_v1")); + executeUpdateT("Initialize_main_v1"); cleanupTables(); return true; } @@ -80,7 +79,7 @@ public class BackendMySQL extends ConnectionMySQL implements Backend } private void cleanupTables() { - executeUpdate(loadResourceSQLT("Cleanup_tables")); + executeUpdateT("Cleanup_tables"); } @Override public synchronized void fetchIntoCache(LocalCacheData cache) @@ -117,7 +116,7 @@ public class BackendMySQL extends ConnectionMySQL implements Backend } rs.close(); } catch(SQLException ex) { - MainPluginClass.consoleLog.log(Level.WARNING, "[rscp] Exception in rs2e(): {0}", ex.getLocalizedMessage()); + MainPluginClass.consoleLog.log(Level.WARNING, "[rscp] Exception in rs2e(): {0}", ex); } return result.toArray(new RowEntity[result.size()]); } @@ -131,9 +130,9 @@ public class BackendMySQL extends ConnectionMySQL implements Backend { while(rs.next()) { - for(Destination destination : Destination.ParseDestinations(rs.getString("destination"))) + for(Destination destination : Destination.parseDestinations(rs.getString("destination"))) { - if(destination.IsServerIdApplicable(serverId) == false) + if(destination.isServerIdApplicable(serverId) == false) continue; RowPermission row = new RowPermission(); row.id = rs.getInt("id"); @@ -149,7 +148,7 @@ public class BackendMySQL extends ConnectionMySQL implements Backend } rs.close(); } catch(SQLException ex) { - MainPluginClass.consoleLog.log(Level.WARNING, "[rscp] Exception in rs2p(): {0}", ex.getLocalizedMessage()); + MainPluginClass.consoleLog.log(Level.WARNING, "[rscp] Exception in rs2p(): {0}", ex); } return result.toArray(new RowPermission[result.size()]); } @@ -163,9 +162,9 @@ public class BackendMySQL extends ConnectionMySQL implements Backend { while(rs.next()) { - for(Destination destination : Destination.ParseDestinations(rs.getString("destination"))) + for(Destination destination : Destination.parseDestinations(rs.getString("destination"))) { - if(destination.IsServerIdApplicable(serverId) == false) + if(destination.isServerIdApplicable(serverId) == false) continue; RowInheritance row = new RowInheritance(); row.id = rs.getInt("id"); @@ -182,7 +181,7 @@ public class BackendMySQL extends ConnectionMySQL implements Backend } rs.close(); } catch(SQLException ex) { - MainPluginClass.consoleLog.log(Level.WARNING, "[rscp] Exception in rs2i(): {0}", ex.getLocalizedMessage()); + MainPluginClass.consoleLog.log(Level.WARNING, "[rscp] Exception in rs2i(): {0}", ex); } return result.toArray(new RowInheritance[result.size()]); } @@ -202,7 +201,7 @@ public class BackendMySQL extends ConnectionMySQL implements Backend row.climber = null; row.climberType = EntityType.byValue(rs.getInt("climber_type")); row.ladder = rs.getString("ladder"); - String[] breaked = row.ladder.split(BukkitPluginConfiguration.separatorRegExp); + String[] breaked = row.ladder.split(Settings.separatorRegExp); if(breaked.length == 2) { row.ladder = breaked[0]; @@ -213,14 +212,14 @@ public class BackendMySQL extends ConnectionMySQL implements Backend } rs.close(); } catch(SQLException ex) { - MainPluginClass.consoleLog.log(Level.WARNING, "[rscp] Exception in rs2l(): {0}", ex.getLocalizedMessage()); + MainPluginClass.consoleLog.log(Level.WARNING, "[rscp] Exception in rs2l(): {0}", ex); } return result.toArray(new RowLadder[result.size()]); } @Override public synchronized void insertExampleRows() { - executeUpdate(loadResourceSQLT("Insert_example_rows_v1")); + executeUpdateT("Insert_example_rows_v1"); } @Override public synchronized void updateEntityText(String entity, boolean entity_type, String text, boolean isPrefix) @@ -233,7 +232,7 @@ public class BackendMySQL extends ConnectionMySQL implements Backend setupQueryTemplate("{ENTITY_TYPE}", entity_type ? "1" : "0"); setupQueryTemplate("{TEXT_TYPE}", isPrefix ? "prefix" : "suffix"); setupQueryTemplate("{TEXT}", (text != null) ? "'" + text + "'" : "NULL"); - executeUpdate(loadResourceSQLT("Update_entity_text")); + executeUpdateT("Update_entity_text"); } @Override public synchronized void setUserRank(String user, String ladder, int rank) @@ -243,13 +242,13 @@ public class BackendMySQL extends ConnectionMySQL implements Backend setupQueryTemplate("{USER}", user); setupQueryTemplate("{LADDER}", ladder); setupQueryTemplate("{RANK}", Integer.toString(rank)); - executeUpdate(loadResourceSQLT("Set_user_rank")); + executeUpdateT("Set_user_rank"); } @Override public synchronized void dropUserFromLadder(String user, String ladder) { String instance = ""; - String[] breaked = ladder.split(BukkitPluginConfiguration.separatorRegExp); + String[] breaked = ladder.split(Settings.separatorRegExp); if(breaked.length == 2) { ladder = breaked[0]; @@ -260,7 +259,7 @@ public class BackendMySQL extends ConnectionMySQL implements Backend setupQueryTemplate("{USER}", user); setupQueryTemplate("{LADDER}", ladder); setupQueryTemplate("{INSTANCE}", instance); - executeUpdate(loadResourceSQLT("Drop_user_from_ladder")); + executeUpdateT("Drop_user_from_ladder"); } @Override public synchronized void addUserParentGroup(String user, String newGroup) diff --git a/src/main/java/ru/simsonic/rscPermissions/BridgeForBukkitAPI.java b/src/main/java/ru/simsonic/rscPermissions/BridgeForBukkitAPI.java index 35c91e2..c72fe97 100644 --- a/src/main/java/ru/simsonic/rscPermissions/BridgeForBukkitAPI.java +++ b/src/main/java/ru/simsonic/rscPermissions/BridgeForBukkitAPI.java @@ -1,6 +1,6 @@ package ru.simsonic.rscPermissions; -import ru.simsonic.rscPermissions.Frontends.VaultChat; -import ru.simsonic.rscPermissions.Frontends.VaultPermission; +import ru.simsonic.rscPermissions.Bukkit.VaultChat; +import ru.simsonic.rscPermissions.Bukkit.VaultPermission; public class BridgeForBukkitAPI { diff --git a/src/main/java/ru/simsonic/rscPermissions/Bukkit/BukkitPermissions.java b/src/main/java/ru/simsonic/rscPermissions/Bukkit/BukkitPermissions.java new file mode 100644 index 0000000..9f5550b --- /dev/null +++ b/src/main/java/ru/simsonic/rscPermissions/Bukkit/BukkitPermissions.java @@ -0,0 +1,112 @@ +package ru.simsonic.rscPermissions.Bukkit; +import java.util.Arrays; +import java.util.HashMap; +import java.util.concurrent.LinkedBlockingQueue; +import java.util.logging.Level; +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.MainPluginClass; + +public class BukkitPermissions implements Runnable +{ + private final MainPluginClass rscp; + public BukkitPermissions(MainPluginClass plugin) + { + this.rscp = plugin; + } + private Thread thread; + private final LinkedBlockingQueue updateQueue = new LinkedBlockingQueue<>(); + private final HashMap prefixes = new HashMap<>(); + private final HashMap suffixes = new HashMap<>(); + private final HashMap persistentPermissions = new HashMap<>(); + private final HashMap transientPermissions = new HashMap<>(); + public final HashMap attachments = new HashMap<>(); + public void recalculateOnlinePlayers() + { + updateQueue.addAll(Arrays.asList(rscp.getServer().getOnlinePlayers())); + rscp.scheduleAutoUpdate(); + } + public void recalculatePlayer(Player player) + { + try + { + updateQueue.put(player); + } catch(InterruptedException ex) { + } + } + public void start() + { + stop(); + thread = new Thread(this); + thread.start(); + } + public void stop() + { + if(thread != null) + { + if(thread.isAlive()) + { + try + { + thread.interrupt(); + thread.join(); + } catch(InterruptedException ex) { + MainPluginClass.consoleLog.log(Level.SEVERE, "[rscp] Exception in BukkitPermissions: {0}", ex); + } + } + thread = null; + } + } + @Override + public void run() + { + Thread.currentThread().setName("rscp:PermissionManager"); + Thread.currentThread().setPriority(Thread.MIN_PRIORITY); + try + { + for(Player current = updateQueue.take(); current != null; current = updateQueue.take()) + { + final BrandNewCache.ResolutionResult result = rscp.cache2.resolvePlayer(current); + prefixes.put(current, result.prefix); + suffixes.put(current, result.suffix); + persistentPermissions.put(current, result.permissions); + final Player player = current; + rscp.getServer().getScheduler().runTask(rscp, new Runnable() + { + @Override + public void run() + { + // Remove old + final PermissionAttachment previous = attachments.get(player); + if(previous != null) + { + player.removeAttachment(previous); + attachments.remove(player); + } + // Create new + final RowPermission[] pp = persistentPermissions.get(player); + final RowPermission[] tp = transientPermissions.get(player); + if(pp == null && tp == null) + return; + final PermissionAttachment attachment = player.addAttachment(rscp); + attachments.put(player, attachment); + if(pp != null) + for(RowPermission row : pp) + attachment.setPermission(row.permission, row.value); + if(tp != null) + for(RowPermission row : tp) + attachment.setPermission(row.permission, row.value); + // Server operator + final Boolean asterisk = attachment.getPermissions().get("*"); + if(rscp.settings.isAsteriskOP()) + player.setOp((asterisk != null) ? asterisk : false); + } + }); + } + } catch(InterruptedException ex) { + } + updateQueue.clear(); + } +} diff --git a/src/main/java/ru/simsonic/rscPermissions/Bukkit/BukkitPluginConfiguration.java b/src/main/java/ru/simsonic/rscPermissions/Bukkit/BukkitPluginConfiguration.java index a2c1402..112e414 100644 --- a/src/main/java/ru/simsonic/rscPermissions/Bukkit/BukkitPluginConfiguration.java +++ b/src/main/java/ru/simsonic/rscPermissions/Bukkit/BukkitPluginConfiguration.java @@ -23,9 +23,6 @@ public class BukkitPluginConfiguration implements Settings private int nAutoReloadDelayTicks = 20 * 900; private int nRegionFinderGranularity = 1000; public final int CurrentVersion = 3; - public static final String instantiator = "?"; - public static final String separator = "."; - public static final String separatorRegExp = "\\."; public BukkitPluginConfiguration(final MainPluginClass plugin) { this.plugin = plugin; diff --git a/src/main/java/ru/simsonic/rscPermissions/Bukkit/PlayerEventsListener.java b/src/main/java/ru/simsonic/rscPermissions/Bukkit/PlayerEventsListener.java new file mode 100644 index 0000000..9816a48 --- /dev/null +++ b/src/main/java/ru/simsonic/rscPermissions/Bukkit/PlayerEventsListener.java @@ -0,0 +1,70 @@ +package ru.simsonic.rscPermissions.Bukkit; +import java.util.HashMap; +import org.bukkit.entity.Player; +import org.bukkit.event.EventHandler; +import org.bukkit.event.EventPriority; +import org.bukkit.event.Listener; +import org.bukkit.event.player.AsyncPlayerPreLoginEvent; +import org.bukkit.event.player.PlayerExpChangeEvent; +import org.bukkit.event.player.PlayerKickEvent; +import org.bukkit.event.player.PlayerLevelChangeEvent; +import org.bukkit.event.player.PlayerLoginEvent; +import org.bukkit.event.player.PlayerQuitEvent; +import org.bukkit.permissions.PermissionAttachment; +import ru.simsonic.rscPermissions.MainPluginClass; + +public class PlayerEventsListener implements Listener +{ + private final MainPluginClass rscp; + public PlayerEventsListener(MainPluginClass plugin) + { + this.rscp = plugin; + } + @EventHandler + public void onPlayerAsyncPreLogin(AsyncPlayerPreLoginEvent event) + { + rscp.cache2.resolvePlayer(new String[] + { + event.getName(), + event.getUniqueId().toString(), + event.getAddress().getHostAddress(), + }); + } + @EventHandler(priority = EventPriority.LOWEST) + public void onPlayerLogin(PlayerLoginEvent event) + { + final Player player = event.getPlayer(); + String name = event.getPlayer().getName(); + final HashMap pending = rscp.cache.mapPermissions.get(name); + if(pending != null) + { + final PermissionAttachment attachment = player.addAttachment(rscp); + for(String permission : pending.keySet()) + attachment.setPermission(permission, pending.get(permission)); + rscp.permissionManager.attachments.put(player, attachment); + } + rscp.cache.calculatePlayerPermissions(player); + } + @EventHandler + public void onPlayerExp(PlayerLevelChangeEvent event) + { + rscp.cache.calculatePlayerPermissions(event.getPlayer()); + } + @EventHandler + public void onPlayerLevel(PlayerExpChangeEvent event) + { + rscp.cache.calculatePlayerPermissions(event.getPlayer()); + } + @EventHandler + public void onPlayerKick(PlayerKickEvent event) + { + rscp.permissionManager.attachments.remove(event.getPlayer()); + rscp.regionListProvider.removePlayer(event.getPlayer()); + } + @EventHandler + public void onPlayerQuit(PlayerQuitEvent event) + { + rscp.permissionManager.attachments.remove(event.getPlayer()); + rscp.regionListProvider.removePlayer(event.getPlayer()); + } +} diff --git a/src/main/java/ru/simsonic/rscPermissions/Frontends/VaultChat.java b/src/main/java/ru/simsonic/rscPermissions/Bukkit/VaultChat.java similarity index 96% rename from src/main/java/ru/simsonic/rscPermissions/Frontends/VaultChat.java rename to src/main/java/ru/simsonic/rscPermissions/Bukkit/VaultChat.java index d269a4c..93d5afb 100644 --- a/src/main/java/ru/simsonic/rscPermissions/Frontends/VaultChat.java +++ b/src/main/java/ru/simsonic/rscPermissions/Bukkit/VaultChat.java @@ -1,4 +1,4 @@ -package ru.simsonic.rscPermissions.Frontends; +package ru.simsonic.rscPermissions.Bukkit; import net.milkbowl.vault.permission.Permission; import org.bukkit.OfflinePlayer; import org.bukkit.World; diff --git a/src/main/java/ru/simsonic/rscPermissions/Frontends/VaultPermission.java b/src/main/java/ru/simsonic/rscPermissions/Bukkit/VaultPermission.java similarity index 96% rename from src/main/java/ru/simsonic/rscPermissions/Frontends/VaultPermission.java rename to src/main/java/ru/simsonic/rscPermissions/Bukkit/VaultPermission.java index 1bb8aa4..b54af9c 100644 --- a/src/main/java/ru/simsonic/rscPermissions/Frontends/VaultPermission.java +++ b/src/main/java/ru/simsonic/rscPermissions/Bukkit/VaultPermission.java @@ -1,4 +1,4 @@ -package ru.simsonic.rscPermissions.Frontends; +package ru.simsonic.rscPermissions.Bukkit; import org.bukkit.OfflinePlayer; import org.bukkit.World; import org.bukkit.command.CommandSender; diff --git a/src/main/java/ru/simsonic/rscPermissions/CommandHelper.java b/src/main/java/ru/simsonic/rscPermissions/CommandHelper.java index b69f5ee..00009b3 100644 --- a/src/main/java/ru/simsonic/rscPermissions/CommandHelper.java +++ b/src/main/java/ru/simsonic/rscPermissions/CommandHelper.java @@ -210,7 +210,7 @@ public class CommandHelper { case "permissions": list.add("{MAGENTA}Permission list for {_YL}" + player.getName()); - final PermissionAttachment pa = plugin.attachments.get(player); + final PermissionAttachment pa = plugin.permissionManager.attachments.get(player); if(pa == null) break; final Map pv = pa.getPermissions(); diff --git a/src/main/java/ru/simsonic/rscPermissions/ConnectionHelper.java b/src/main/java/ru/simsonic/rscPermissions/ConnectionHelper.java index 6f27fb8..fbfc721 100644 --- a/src/main/java/ru/simsonic/rscPermissions/ConnectionHelper.java +++ b/src/main/java/ru/simsonic/rscPermissions/ConnectionHelper.java @@ -50,7 +50,7 @@ public class ConnectionHelper extends BackendMySQL @Override public synchronized void run() { - plugin.recalculateOnlinePlayers(); + plugin.permissionManager.recalculateOnlinePlayers(); notify(); } }; @@ -60,7 +60,7 @@ public class ConnectionHelper extends BackendMySQL syncTask.wait(); } } catch(InterruptedException ex) { - MainPluginClass.consoleLog.log(Level.SEVERE, "[rscp] Exception in FetchTables(): {0}", ex.getLocalizedMessage()); + MainPluginClass.consoleLog.log(Level.SEVERE, "[rscp] Exception in FetchTables(): {0}", ex); } plugin.cache.calculateStartupPermissions(); } @@ -118,7 +118,7 @@ public class ConnectionHelper extends BackendMySQL } }); } catch(InterruptedException ex) { - MainPluginClass.consoleLog.log(Level.SEVERE, "[rscp] Exception in MigrateFromPExSQL(): {0}", ex.getLocalizedMessage()); + MainPluginClass.consoleLog.log(Level.SEVERE, "[rscp] Exception in MigrateFromPExSQL(): {0}", ex); } } }; diff --git a/src/main/java/ru/simsonic/rscPermissions/DataTypes/ConditionalRow.java b/src/main/java/ru/simsonic/rscPermissions/DataTypes/ConditionalRow.java new file mode 100644 index 0000000..7ccd7d5 --- /dev/null +++ b/src/main/java/ru/simsonic/rscPermissions/DataTypes/ConditionalRow.java @@ -0,0 +1,9 @@ +package ru.simsonic.rscPermissions.DataTypes; +import java.sql.Timestamp; + +public abstract class ConditionalRow extends AbstractRow +{ + public Destination destination; + public int expirience; + public Timestamp lifetime; +} diff --git a/src/main/java/ru/simsonic/rscPermissions/DataTypes/Destination.java b/src/main/java/ru/simsonic/rscPermissions/DataTypes/Destination.java index a5b7988..b949fb2 100644 --- a/src/main/java/ru/simsonic/rscPermissions/DataTypes/Destination.java +++ b/src/main/java/ru/simsonic/rscPermissions/DataTypes/Destination.java @@ -5,7 +5,7 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; import org.bukkit.Location; import org.bukkit.World; -import ru.simsonic.rscPermissions.Bukkit.BukkitPluginConfiguration; +import ru.simsonic.rscPermissions.Settings; import ru.simsonic.utilities.LanguageUtility; public class Destination @@ -25,45 +25,66 @@ public class Destination this.world = world; this.serverId = serverId; } - public boolean IsServerIdApplicable(String serverId) + public boolean isServerIdApplicable(String serverId) { - return wildcardTesting(serverId, this.serverId); + return wildcardTest(serverId, this.serverId); } - public boolean IsLocationApplicable(Location location, Set regions, String instantiator) + public boolean isLocationApplicable(Location location, Set regions, String instantiator) { if(location != null) { if(location.getWorld() != null) - if(IsWorldApplicable(location.getWorld(), instantiator)) - return IsRegionApplicable(regions, instantiator); + if(isWorldApplicable(location.getWorld(), instantiator)) + return isRegionApplicable(regions, instantiator); } else { if(this.world == null) - return IsRegionApplicable(regions, instantiator); + return isRegionApplicable(regions, instantiator); } return false; } - private boolean IsWorldApplicable(World world, String instantiator) + public boolean isWorldApplicable(World world, String instantiator) { if(this.world == null || this.world.isEmpty() || "*".equals(this.world)) return true; final String instantiated = (instantiator != null && !instantiator.isEmpty()) - ? this.world.replace(BukkitPluginConfiguration.instantiator, instantiator) + ? this.world.replace(Settings.instantiator, instantiator) : this.world; - return wildcardTesting(world.getName(), instantiated); + return wildcardTest(world.getName(), instantiated); } - private boolean IsRegionApplicable(Set regions, String instantiator) + public boolean isWorldApplicable(String world, String instantiator) + { + if(this.world == null || this.world.isEmpty() || "*".equals(this.world)) + return true; + final String instantiated = (instantiator != null && !instantiator.isEmpty()) + ? this.world.replace(Settings.instantiator, instantiator) + : this.world; + return wildcardTest(world, instantiated); + } + public boolean isRegionApplicable(Set regions, String instantiator) + { + if(this.region == null || "".equals(this.region) || "*".equals(this.region)) + return true; + final String instantiated = (instantiator != null && !"".equals(instantiator)) + ? this.region.replace(Settings.instantiator, instantiator) + : this.region; + for(String regionId : regions) + if(wildcardTest(regionId, instantiated)) + return true; + return false; + } + public boolean isRegionApplicable(String[] regions, String instantiator) { if(this.region == null || "".equals(this.region) || "*".equals(this.region)) return true; final String instantiated = (instantiator != null && !"".equals(instantiator)) - ? this.region.replace(BukkitPluginConfiguration.instantiator, instantiator) + ? this.region.replace(Settings.instantiator, instantiator) : this.region; for(String regionId : regions) - if(wildcardTesting(regionId, instantiated)) + if(wildcardTest(regionId, instantiated)) return true; return false; } - private static boolean wildcardTesting(String testing, String pattern) + private static boolean wildcardTest(String testing, String pattern) { if(pattern == null || "".equals(pattern)) return true; @@ -73,23 +94,23 @@ public class Destination "" + testing.toLowerCase() + "", "" + pattern.toLowerCase() + ""); } - private static final String destinationSplitting = "\\s*[;,\\r\\n]+\\s*"; - public static Destination[] ParseDestinations(String destinations) + private static final String destinationSplitter = "\\s*[;,\\r\\n]+\\s*"; + public static Destination[] parseDestinations(String destinations) { if(destinations == null || destinations.isEmpty()) return new Destination[] { new Destination() }; - final String[] destinationsList = destinations.split(destinationSplitting); + final String[] destinationsList = destinations.split(destinationSplitter); final ArrayList result = new ArrayList(destinationsList.length); for(String inList : destinationsList) if(inList != null && !inList.isEmpty()) - result.add(ParseDestination(inList)); + result.add(parseDestination(inList)); return result.toArray(new Destination[result.size()]); } - private static final Pattern patternDestination = Pattern.compile( + private static final Pattern destinationPattern = Pattern.compile( "^(?:((?:\\w|\\*|\\?)*):)?((?:\\w|\\*|\\?)*)?(?:@((?:\\w|\\*|\\?)*))?$"); - private static Destination ParseDestination(String destination) + private static Destination parseDestination(String destination) { - final Matcher match = patternDestination.matcher(destination); + final Matcher match = destinationPattern.matcher(destination); if(match.find()) { final String groupR = match.group(1); @@ -102,4 +123,4 @@ public class Destination } return new Destination(); } -} \ No newline at end of file +} diff --git a/src/main/java/ru/simsonic/rscPermissions/DataTypes/RowInheritance.java b/src/main/java/ru/simsonic/rscPermissions/DataTypes/RowInheritance.java index 40f4046..1daad2f 100644 --- a/src/main/java/ru/simsonic/rscPermissions/DataTypes/RowInheritance.java +++ b/src/main/java/ru/simsonic/rscPermissions/DataTypes/RowInheritance.java @@ -1,27 +1,23 @@ package ru.simsonic.rscPermissions.DataTypes; -import java.sql.Timestamp; import java.util.Arrays; -import ru.simsonic.rscPermissions.Bukkit.BukkitPluginConfiguration; +import ru.simsonic.rscPermissions.Settings; import ru.simsonic.utilities.LanguageUtility; -public class RowInheritance extends AbstractRow implements Comparable +public class RowInheritance extends ConditionalRow implements Comparable { public String entity; public String parent; public String instance; public EntityType childType; public int priority; - public Destination destination; - public int expirience; - public Timestamp lifetime; public void deriveInstance() { if(parent != null) { - final String[] splitted = parent.split(BukkitPluginConfiguration.separatorRegExp); + final String[] splitted = parent.split(Settings.separatorRegExp); if(splitted.length > 1) { - parent = LanguageUtility.glue(Arrays.copyOf(splitted, splitted.length - 1), BukkitPluginConfiguration.separator); + parent = LanguageUtility.glue(Arrays.copyOf(splitted, splitted.length - 1), Settings.separator); instance = splitted[splitted.length - 1]; return; } @@ -29,13 +25,13 @@ public class RowInheritance extends AbstractRow implements Comparable intermediateResults = new ArrayList<>(); for(InheritanceLeaf branch : applicableBranches) - intermediateResults.add(resolveBranch(branch, "")); - final ResolutionResult result = processResultColumn(intermediateResults, ""); + if(isInheritanceApplicable(params, branch.node, "")) + intermediateResults.add(resolveBranch(params, branch, "")); + final ResolutionResult result = processResultColumn(params, intermediateResults, ""); intermediateResults.clear(); return result; } - private ResolutionResult resolveBranch(InheritanceLeaf branch, String instantiator) + private ResolutionResult resolveBranch(ResolutionParams params, InheritanceLeaf branch, String instantiator) { final ArrayList intermediateResults = new ArrayList<>(); for(InheritanceLeaf subleaf : branch.subleafs) { final String overloadedInstantiator = (subleaf.instantiator != null && !"".equals(subleaf.instantiator)) ? subleaf.instantiator : instantiator; - intermediateResults.add(resolveBranch(subleaf, overloadedInstantiator)); + if(isInheritanceApplicable(params, subleaf.node, overloadedInstantiator)) + intermediateResults.add(resolveBranch(params, subleaf, overloadedInstantiator)); } - final ResolutionResult result = processResultColumn(intermediateResults, branch.instantiator); + final ResolutionResult result = processResultColumn(params, intermediateResults, branch.instantiator); intermediateResults.clear(); return result; } - private ResolutionResult processResultColumn(ArrayList resultList, String instantiator) + private ResolutionResult processResultColumn(ResolutionParams params, ArrayList resultList, String instantiator) { switch(resultList.size()) { @@ -199,15 +208,33 @@ public class BrandNewCache implements AbstractPermissionsCache result.prefix = result.prefix.replace("%", result.prefix); if(intermediate.suffix != null && !"".equals(intermediate.suffix)) result.suffix = result.suffix.replace("%", result.suffix); - result.prefix = result.prefix.replace(BukkitPluginConfiguration.instantiator, instantiator); - result.suffix = result.suffix.replace(BukkitPluginConfiguration.instantiator, instantiator); + result.prefix = result.prefix.replace(Settings.instantiator, instantiator); + result.suffix = result.suffix.replace(Settings.instantiator, instantiator); // Permissions - permissions.addAll(Arrays.asList(intermediate.permissions)); + for(RowPermission permission : intermediate.permissions) + if(isPermissionApplicable(params, permission, instantiator)) + permissions.add(permission); } result.permissions = permissions.toArray(new RowPermission[permissions.size()]); return result; } } + private boolean isPermissionApplicable(ResolutionParams params, RowPermission row, String instantiator) + { + if(params.expirience < row.expirience) + return false; + return row.destination.isWorldApplicable(params.destWorld, instantiator) + ? row.destination.isRegionApplicable(params.destRegions, instantiator) + : false; + } + private boolean isInheritanceApplicable(ResolutionParams params, RowInheritance row, String instantiator) + { + if(params.expirience < row.expirience) + return false; + return row.destination.isWorldApplicable(params.destWorld, instantiator) + ? row.destination.isRegionApplicable(params.destRegions, instantiator) + : false; + } @Override public synchronized int ImportEntities(RowEntity[] rows) { diff --git a/src/main/java/ru/simsonic/rscPermissions/InternalCache/LocalCacheFunctions.java b/src/main/java/ru/simsonic/rscPermissions/InternalCache/LocalCacheFunctions.java index 0c6a5a6..0d317b6 100644 --- a/src/main/java/ru/simsonic/rscPermissions/InternalCache/LocalCacheFunctions.java +++ b/src/main/java/ru/simsonic/rscPermissions/InternalCache/LocalCacheFunctions.java @@ -8,7 +8,7 @@ import ru.simsonic.rscPermissions.DataTypes.RowInheritance; import ru.simsonic.rscPermissions.DataTypes.RowLadder; import ru.simsonic.rscPermissions.DataTypes.RowPermission; import ru.simsonic.rscPermissions.MainPluginClass; -import ru.simsonic.rscPermissions.Bukkit.BukkitPluginConfiguration; +import ru.simsonic.rscPermissions.Settings; public class LocalCacheFunctions extends LocalCacheTree { @@ -76,7 +76,7 @@ public class LocalCacheFunctions extends LocalCacheTree return null; final ArrayList result = new ArrayList<>(); for(ResolutionLeaf leaf : tree) - result.add(leaf.instance != null ? leaf.group + BukkitPluginConfiguration.separator + leaf.instance : leaf.group); + result.add(leaf.instance != null ? leaf.group + Settings.separator + leaf.instance : leaf.group); return result; } public synchronized Set getAllPossibleGroups() diff --git a/src/main/java/ru/simsonic/rscPermissions/InternalCache/LocalCacheTree.java b/src/main/java/ru/simsonic/rscPermissions/InternalCache/LocalCacheTree.java index ebe162c..e392f30 100644 --- a/src/main/java/ru/simsonic/rscPermissions/InternalCache/LocalCacheTree.java +++ b/src/main/java/ru/simsonic/rscPermissions/InternalCache/LocalCacheTree.java @@ -11,7 +11,7 @@ import ru.simsonic.rscPermissions.DataTypes.RowInheritance; import ru.simsonic.rscPermissions.DataTypes.RowLadder; import ru.simsonic.rscPermissions.DataTypes.RowPermission; import ru.simsonic.rscPermissions.MainPluginClass; -import ru.simsonic.rscPermissions.Bukkit.BukkitPluginConfiguration; +import ru.simsonic.rscPermissions.Settings; import ru.simsonic.utilities.LanguageUtility; public class LocalCacheTree extends LocalCacheData @@ -81,7 +81,7 @@ public class LocalCacheTree extends LocalCacheData public void calculatePlayerPermissions(Player player) { final AsyncPlayerInfo api = new AsyncPlayerInfo(player, plugin.regionListProvider.getPlayerRegions(player)); - plugin.recalculatingPlayers.offer(api); + // plugin.recalculatingPlayers.offer(api); } public synchronized HashMap treeToPermissions(AsyncPlayerInfo p2rc) { @@ -99,8 +99,8 @@ public class LocalCacheTree extends LocalCacheData { String permission = row.permission; // Additional processing - if(permission.contains(BukkitPluginConfiguration.instantiator) && (leaf.instance != null)) - permission = permission.replace(BukkitPluginConfiguration.instantiator, leaf.instance); + 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()); @@ -110,8 +110,8 @@ public class LocalCacheTree extends LocalCacheData prefix = entity.prefix.replace("%", prefix); if(entity.suffix != null && !"".equals(entity.suffix)) suffix = entity.suffix.replace("%", suffix); - prefix = prefix.replace(BukkitPluginConfiguration.instantiator, leaf.instance); - suffix = suffix.replace(BukkitPluginConfiguration.instantiator, leaf.instance); + prefix = prefix.replace(Settings.instantiator, leaf.instance); + suffix = suffix.replace(Settings.instantiator, leaf.instance); } } // User permissions diff --git a/src/main/java/ru/simsonic/rscPermissions/Ladders.java b/src/main/java/ru/simsonic/rscPermissions/Ladders.java index ef89396..132a2b5 100644 --- a/src/main/java/ru/simsonic/rscPermissions/Ladders.java +++ b/src/main/java/ru/simsonic/rscPermissions/Ladders.java @@ -1,5 +1,4 @@ package ru.simsonic.rscPermissions; -import ru.simsonic.rscPermissions.Bukkit.BukkitPluginConfiguration; import java.util.ArrayList; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; @@ -29,7 +28,7 @@ public class Ladders return new String[] { "Player must be online." }; String template = ladder; String instance = ""; - String[] breaked = ladder.split(BukkitPluginConfiguration.separatorRegExp); + String[] breaked = ladder.split(Settings.separatorRegExp); if(breaked.length == 2) { template = breaked[0].toLowerCase(); @@ -78,7 +77,7 @@ public class Ladders if(position.prevNode != null) position = position.prevNode; if(position.instance != null) - if(BukkitPluginConfiguration.instantiator.equals(position.instance)) + if(Settings.instantiator.equals(position.instance)) { if("".equals(instance)) return new String[] { "Operation requires ladder instance (