diff --git a/pom.xml b/pom.xml
index deee3be..7b2fd40 100644
--- a/pom.xml
+++ b/pom.xml
@@ -4,7 +4,7 @@
ru.simsonic
rscPermissions
- 0.9.19b
+ 0.9.20b
jar
rscPermissions
diff --git a/src/main/java/ru/simsonic/rscPermissions/API/PlayerType.java b/src/main/java/ru/simsonic/rscPermissions/API/PlayerType.java
index 1f453eb..f729587 100644
--- a/src/main/java/ru/simsonic/rscPermissions/API/PlayerType.java
+++ b/src/main/java/ru/simsonic/rscPermissions/API/PlayerType.java
@@ -1,83 +1,86 @@
-package ru.simsonic.rscPermissions.API;
-
-import ru.simsonic.rscPermissions.Engine.Matchers;
-
-public enum PlayerType
-{
- NAME(0), // 16 chars [_a-zA-Z0-9] max
- UUID(1), // 550e8400-e29b-41d4-a716-446655440000
- DASHLESS_UUID(2), // 550e8400e29b41d4a716446655440000
- INTERNET_WILDCARD(3), // 192.168.*.*
- INTERNET_SUBNETMASK(4), // 192.168.0.0/16
- INAPPLICABLE(-1);
- private final int value;
- private PlayerType(int value)
- {
- this.value = value;
- }
- public static PlayerType byValue(int value)
- {
- for(PlayerType constant : PlayerType.values())
- if(constant.value == value)
- return constant;
- return INAPPLICABLE;
- }
- public static PlayerType scanPlayerEntity(String entity)
- {
- if(entity == null || "".equals(entity))
- return NAME;
- if(Matchers.isCorrectNickname(entity))
- return NAME;
- if(Matchers.isCorrectUUID(entity))
- return UUID;
- if(Matchers.isCorrectDashlessUUID(entity))
- return DASHLESS_UUID;
- if(Matchers.isCorrectWildcard(entity))
- return INTERNET_WILDCARD;
- if(Matchers.isCorrectSubnetMask(entity))
- return INTERNET_SUBNETMASK;
- return INAPPLICABLE;
- }
- public static String normalize(String entity)
- {
- if(entity == null || "".equals(entity))
- return "";
- if(Matchers.isCorrectDashlessUUID(entity))
- return Matchers.uuidAddDashes(entity);
- return entity;
- }
- public boolean isEntityApplicable(String entity, String identifier)
- {
- if(entity == null || "".equals(entity) || identifier == null || "".equals(identifier))
- return false;
- try
- {
- switch(this)
- {
- case NAME:
- return identifier.equals(entity);
- case DASHLESS_UUID:
- if(Matchers.isCorrectUUID(identifier))
- identifier = Matchers.uuidRemoveDashes(identifier);
- if(Matchers.isCorrectDashlessUUID(identifier))
- return entity.equalsIgnoreCase(identifier);
- break;
- case UUID:
- if(Matchers.isCorrectDashlessUUID(identifier))
- identifier = Matchers.uuidAddDashes(identifier);
- if(Matchers.isCorrectUUID(identifier))
- return entity.equalsIgnoreCase(identifier);
- break;
- case INTERNET_WILDCARD:
- case INTERNET_SUBNETMASK:
- // TO DO HERE
- return false;
- case INAPPLICABLE:
- default:
- break;
- }
- } catch(IllegalArgumentException ex) {
- }
- return false;
- }
-}
+package ru.simsonic.rscPermissions.API;
+
+import ru.simsonic.rscMinecraftLibrary.Bukkit.GenericChatCodes;
+import ru.simsonic.rscPermissions.Engine.Matchers;
+
+public enum PlayerType
+{
+ NAME(0), // 16 chars [_a-zA-Z0-9] max
+ UUID(1), // 550e8400-e29b-41d4-a716-446655440000
+ DASHLESS_UUID(2), // 550e8400e29b41d4a716446655440000
+ INTERNET_WILDCARD(3), // 192.168.*.*
+ INTERNET_SUBNETMASK(4), // 192.168.0.0/16
+ INAPPLICABLE(-1);
+ private final int value;
+ private PlayerType(int value)
+ {
+ this.value = value;
+ }
+ public static PlayerType byValue(int value)
+ {
+ for(PlayerType constant : PlayerType.values())
+ if(constant.value == value)
+ return constant;
+ return INAPPLICABLE;
+ }
+ public static PlayerType scanPlayerEntity(String entity)
+ {
+ if(entity == null || "".equals(entity))
+ return NAME;
+ if(Matchers.isCorrectNickname(entity))
+ return NAME;
+ if(Matchers.isCorrectUUID(entity))
+ return UUID;
+ if(Matchers.isCorrectDashlessUUID(entity))
+ return DASHLESS_UUID;
+ if(Matchers.isCorrectWildcard(entity))
+ return INTERNET_WILDCARD;
+ if(Matchers.isCorrectSubnetMask(entity))
+ return INTERNET_SUBNETMASK;
+ return INAPPLICABLE;
+ }
+ public static String normalize(String entity)
+ {
+ if(entity == null || "".equals(entity))
+ return "";
+ if(Matchers.isCorrectDashlessUUID(entity))
+ return Matchers.uuidAddDashes(entity);
+ return entity;
+ }
+ public boolean isEntityApplicable(String entity, String identifier)
+ {
+ if(entity == null || "".equals(entity) || identifier == null || "".equals(identifier))
+ return false;
+ try
+ {
+ switch(this)
+ {
+ case NAME:
+ return entity.contains("*")
+ ? GenericChatCodes.wildcardMatch(identifier, entity)
+ : identifier.equals(entity);
+ case DASHLESS_UUID:
+ if(Matchers.isCorrectUUID(identifier))
+ identifier = Matchers.uuidRemoveDashes(identifier);
+ if(Matchers.isCorrectDashlessUUID(identifier))
+ return entity.equalsIgnoreCase(identifier);
+ break;
+ case UUID:
+ if(Matchers.isCorrectDashlessUUID(identifier))
+ identifier = Matchers.uuidAddDashes(identifier);
+ if(Matchers.isCorrectUUID(identifier))
+ return entity.equalsIgnoreCase(identifier);
+ break;
+ case INTERNET_WILDCARD:
+ case INTERNET_SUBNETMASK:
+ // TO DO HERE
+ return false;
+ case INAPPLICABLE:
+ default:
+ break;
+ }
+ } catch(IllegalArgumentException ex) {
+ }
+ return false;
+ }
+}
diff --git a/src/main/java/ru/simsonic/rscPermissions/BukkitPluginMain.java b/src/main/java/ru/simsonic/rscPermissions/BukkitPluginMain.java
index d26781b..50614f9 100644
--- a/src/main/java/ru/simsonic/rscPermissions/BukkitPluginMain.java
+++ b/src/main/java/ru/simsonic/rscPermissions/BukkitPluginMain.java
@@ -1,153 +1,152 @@
-package ru.simsonic.rscPermissions;
-
-import java.io.IOException;
-import java.util.logging.Level;
-import java.util.logging.Logger;
-import org.bukkit.Bukkit;
-import org.bukkit.command.Command;
-import org.bukkit.command.CommandSender;
-import org.bukkit.command.ConsoleCommandSender;
-import org.bukkit.plugin.java.JavaPlugin;
-import org.bukkit.scheduler.BukkitScheduler;
-import org.mcstats.MetricsLite;
-import ru.simsonic.rscMinecraftLibrary.Bukkit.CommandAnswerException;
-import ru.simsonic.rscMinecraftLibrary.Bukkit.GenericChatCodes;
-import ru.simsonic.rscPermissions.API.Settings;
-import ru.simsonic.rscPermissions.Bukkit.BukkitEventListener;
-import ru.simsonic.rscPermissions.Bukkit.BukkitPermissionManager;
-import ru.simsonic.rscPermissions.Bukkit.BukkitPluginConfiguration;
-import ru.simsonic.rscPermissions.Bukkit.BukkitRegionProviders;
-import ru.simsonic.rscPermissions.Bukkit.Commands.BukkitCommands;
-import ru.simsonic.rscPermissions.Bukkit.RegionUpdateObserver;
-import ru.simsonic.rscPermissions.Engine.Backends.BackendDatabase;
-import ru.simsonic.rscPermissions.Engine.Backends.BackendJson;
-import ru.simsonic.rscPermissions.Engine.Backends.DatabaseContents;
-import ru.simsonic.rscPermissions.Engine.InternalCache;
-import ru.simsonic.rscPermissions.Engine.Phrases;
-
-public final class BukkitPluginMain extends JavaPlugin
-{
- public static final Logger consoleLog = Bukkit.getLogger();
- public final Settings settings = new BukkitPluginConfiguration(this);
- public final BridgeForBukkitAPI bridgeForBukkit = new BridgeForBukkitAPI(this);
- public final BukkitEventListener bukkitListener = new BukkitEventListener(this);
- public final BackendJson localStorage = new BackendJson(getDataFolder());
- public final BackendDatabase connection = new BackendDatabase(consoleLog);
- public final InternalCache internalCache = new InternalCache();
- public final BukkitPermissionManager permissionManager = new BukkitPermissionManager(this);
- public final BukkitRegionProviders regionListProvider = new BukkitRegionProviders(this);
- private final RegionUpdateObserver regionUpdateObserver = new RegionUpdateObserver(this);
- public final BukkitCommands commandHelper = new BukkitCommands(this);
- private MetricsLite metrics;
- @Override
- public void onLoad()
- {
- Phrases.extractTranslations(getDataFolder());
- settings.onLoad();
- consoleLog.log(Level.INFO, "[rscp] serverId value is set to \"{0}\". You can change it in server.properties.", getServer().getServerId());
- consoleLog.log(Level.INFO, "[rscp] rscPermissions has been loaded.");
- }
- @Override
- public void onEnable()
- {
- // Read settings and setup components
- settings.readSettings();
- bukkitListener.onEnable();
- internalCache.setDefaultGroup(
- settings.getDefaultGroup(),
- settings.isDefaultForever(),
- settings.isUsingAncestorPrefixes());
- Phrases.applyTranslation(settings.getTranslationProvider());
- // Restore temporary cached data from json files
- final DatabaseContents contents = localStorage.retrieveContents();
- contents.filterServerId(getServer().getServerId()).filterLifetime();
- internalCache.fill(contents);
- getServer().getConsoleSender().sendMessage(GenericChatCodes.processStringStatic(
- (Settings.chatPrefix + Phrases.FETCHED_LOCAL_CACHE.toString())
- .replace("{:E}", String.valueOf(contents.entities.length))
- .replace("{:P}", String.valueOf(contents.permissions.length))
- .replace("{:I}", String.valueOf(contents.inheritance.length))));
- // Integrate Metrics
- if(settings.isUseMetrics())
- try
- {
- metrics = new MetricsLite(this);
- metrics.start();
- consoleLog.info(Phrases.PLUGIN_METRICS.toString());
- } catch(IOException ex) {
- consoleLog.log(Level.WARNING, "[rscp][Metrics] Exception: {0}", ex);
- }
- // Register event's dispatcher
- getServer().getPluginManager().registerEvents(bukkitListener, this);
- regionUpdateObserver.registerListeners();
- // Integrate Vault and WEPIF
- bridgeForBukkit.setupVault();
- getServer().getScheduler().runTask(this, new Runnable()
- {
- @Override
- public void run()
- {
- bridgeForBukkit.setupWEPIF();
- }
- });
- // WorldGuard, Residence and other possible region list providers
- regionListProvider.integrate();
- // Start all needed parallel threads as daemons
- permissionManager.startDeamon();
- regionUpdateObserver.startDeamon();
- // Connect to database and initiate data fetching
- connection.initialize(settings.getConnectionParams());
- if(settings.getAutoReloadDelayTicks() > 0)
- commandHelper.threadFetchDatabaseContents.startDeamon();
- // Done
- consoleLog.info(Phrases.PLUGIN_ENABLED.toString());
- }
- @Override
- public void onDisable()
- {
- getServer().getServicesManager().unregisterAll(this);
- regionUpdateObserver.stop();
- permissionManager.stop();
- internalCache.clear();
- connection.disconnect();
- regionListProvider.deintegrate();
- metrics = null;
- consoleLog.info(Phrases.PLUGIN_DISABLED.toString());
- }
- private int nAutoUpdaterTaskId = -1;
- public void scheduleAutoUpdate()
- {
- final BukkitScheduler scheduler = getServer().getScheduler();
- if(nAutoUpdaterTaskId != -1)
- scheduler.cancelTask(nAutoUpdaterTaskId);
- final int delay = settings.getAutoReloadDelayTicks();
- nAutoUpdaterTaskId = delay > 0
- ? scheduler.scheduleSyncDelayedTask(this, new Runnable()
- {
- @Override
- public void run()
- {
- commandHelper.threadFetchDatabaseContents.startDeamon();
- }
- }, delay)
- : -1;
- }
- @Override
- public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args)
- {
- if(sender != null)
- try
- {
- switch(cmd.getName().toLowerCase())
- {
- case "rscp":
- commandHelper.onCommandHub(sender, args);
- break;
- }
- } catch(CommandAnswerException ex) {
- for(String answer : ex.getMessageArray())
- sender.sendMessage(GenericChatCodes.processStringStatic(Settings.chatPrefix + answer));
- }
- return true;
- }
-}
+package ru.simsonic.rscPermissions;
+
+import java.io.IOException;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+import org.bukkit.Bukkit;
+import org.bukkit.command.Command;
+import org.bukkit.command.CommandSender;
+import org.bukkit.plugin.java.JavaPlugin;
+import org.bukkit.scheduler.BukkitScheduler;
+import org.mcstats.MetricsLite;
+import ru.simsonic.rscMinecraftLibrary.Bukkit.CommandAnswerException;
+import ru.simsonic.rscMinecraftLibrary.Bukkit.GenericChatCodes;
+import ru.simsonic.rscPermissions.API.Settings;
+import ru.simsonic.rscPermissions.Bukkit.BukkitEventListener;
+import ru.simsonic.rscPermissions.Bukkit.BukkitPermissionManager;
+import ru.simsonic.rscPermissions.Bukkit.BukkitPluginConfiguration;
+import ru.simsonic.rscPermissions.Bukkit.BukkitRegionProviders;
+import ru.simsonic.rscPermissions.Bukkit.Commands.BukkitCommands;
+import ru.simsonic.rscPermissions.Bukkit.RegionUpdateObserver;
+import ru.simsonic.rscPermissions.Engine.Backends.BackendDatabase;
+import ru.simsonic.rscPermissions.Engine.Backends.BackendJson;
+import ru.simsonic.rscPermissions.Engine.Backends.DatabaseContents;
+import ru.simsonic.rscPermissions.Engine.InternalCache;
+import ru.simsonic.rscPermissions.Engine.Phrases;
+
+public final class BukkitPluginMain extends JavaPlugin
+{
+ public static final Logger consoleLog = Bukkit.getLogger();
+ public final Settings settings = new BukkitPluginConfiguration(this);
+ public final BridgeForBukkitAPI bridgeForBukkit = new BridgeForBukkitAPI(this);
+ public final BukkitEventListener bukkitListener = new BukkitEventListener(this);
+ public final BackendJson localStorage = new BackendJson(getDataFolder());
+ public final BackendDatabase connection = new BackendDatabase(consoleLog);
+ public final InternalCache internalCache = new InternalCache();
+ public final BukkitPermissionManager permissionManager = new BukkitPermissionManager(this);
+ public final BukkitRegionProviders regionListProvider = new BukkitRegionProviders(this);
+ private final RegionUpdateObserver regionUpdateObserver = new RegionUpdateObserver(this);
+ public final BukkitCommands commandHelper = new BukkitCommands(this);
+ private MetricsLite metrics;
+ @Override
+ public void onLoad()
+ {
+ Phrases.extractTranslations(getDataFolder());
+ settings.onLoad();
+ consoleLog.log(Level.INFO, "[rscp] serverId value is set to \"{0}\". You can change it in server.properties.", getServer().getServerId());
+ consoleLog.log(Level.INFO, "[rscp] rscPermissions has been loaded.");
+ }
+ @Override
+ public void onEnable()
+ {
+ // Read settings and setup components
+ settings.readSettings();
+ bukkitListener.onEnable();
+ internalCache.setDefaultGroup(
+ settings.getDefaultGroup(),
+ settings.isDefaultForever(),
+ settings.isUsingAncestorPrefixes());
+ Phrases.applyTranslation(settings.getTranslationProvider());
+ // Restore temporary cached data from json files
+ final DatabaseContents contents = localStorage.retrieveContents();
+ contents.filterServerId(getServer().getServerId()).filterLifetime();
+ internalCache.fill(contents);
+ getServer().getConsoleSender().sendMessage(GenericChatCodes.processStringStatic(
+ (Settings.chatPrefix + Phrases.FETCHED_LOCAL_CACHE.toString())
+ .replace("{:E}", String.valueOf(contents.entities.length))
+ .replace("{:P}", String.valueOf(contents.permissions.length))
+ .replace("{:I}", String.valueOf(contents.inheritance.length))));
+ // Integrate Metrics
+ if(settings.isUseMetrics())
+ try
+ {
+ metrics = new MetricsLite(this);
+ metrics.start();
+ consoleLog.info(Phrases.PLUGIN_METRICS.toString());
+ } catch(IOException ex) {
+ consoleLog.log(Level.WARNING, "[rscp][Metrics] Exception: {0}", ex);
+ }
+ // Register event's dispatcher
+ getServer().getPluginManager().registerEvents(bukkitListener, this);
+ regionUpdateObserver.registerListeners();
+ // Integrate Vault and WEPIF
+ bridgeForBukkit.setupVault();
+ getServer().getScheduler().runTask(this, new Runnable()
+ {
+ @Override
+ public void run()
+ {
+ bridgeForBukkit.setupWEPIF();
+ }
+ });
+ // WorldGuard, Residence and other possible region list providers
+ regionListProvider.integrate();
+ // Start all needed parallel threads as daemons
+ permissionManager.startDeamon();
+ regionUpdateObserver.startDeamon();
+ // Connect to database and initiate data fetching
+ connection.initialize(settings.getConnectionParams());
+ if(settings.getAutoReloadDelayTicks() > 0)
+ commandHelper.threadFetchDatabaseContents.startDeamon();
+ // Done
+ consoleLog.info(Phrases.PLUGIN_ENABLED.toString());
+ }
+ @Override
+ public void onDisable()
+ {
+ getServer().getServicesManager().unregisterAll(this);
+ regionUpdateObserver.stop();
+ permissionManager.stop();
+ internalCache.clear();
+ connection.disconnect();
+ regionListProvider.deintegrate();
+ metrics = null;
+ consoleLog.info(Phrases.PLUGIN_DISABLED.toString());
+ }
+ private int nAutoUpdaterTaskId = -1;
+ public void scheduleAutoUpdate()
+ {
+ final BukkitScheduler scheduler = getServer().getScheduler();
+ if(nAutoUpdaterTaskId != -1)
+ scheduler.cancelTask(nAutoUpdaterTaskId);
+ final int delay = settings.getAutoReloadDelayTicks();
+ nAutoUpdaterTaskId = delay > 0
+ ? scheduler.scheduleSyncDelayedTask(this, new Runnable()
+ {
+ @Override
+ public void run()
+ {
+ commandHelper.threadFetchDatabaseContents.startDeamon();
+ }
+ }, delay)
+ : -1;
+ }
+ @Override
+ public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args)
+ {
+ if(sender != null)
+ try
+ {
+ switch(cmd.getName().toLowerCase())
+ {
+ case "rscp":
+ commandHelper.onCommandHub(sender, args);
+ break;
+ }
+ } catch(CommandAnswerException ex) {
+ for(String answer : ex.getMessageArray())
+ sender.sendMessage(GenericChatCodes.processStringStatic(Settings.chatPrefix + answer));
+ }
+ return true;
+ }
+}
diff --git a/src/main/java/ru/simsonic/rscPermissions/Engine/ResolutionResult.java b/src/main/java/ru/simsonic/rscPermissions/Engine/ResolutionResult.java
index c47206f..5b4c712 100644
--- a/src/main/java/ru/simsonic/rscPermissions/Engine/ResolutionResult.java
+++ b/src/main/java/ru/simsonic/rscPermissions/Engine/ResolutionResult.java
@@ -1,50 +1,50 @@
-package ru.simsonic.rscPermissions.Engine;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-import java.util.Map;
-import ru.simsonic.rscMinecraftLibrary.Bukkit.GenericChatCodes;
-import ru.simsonic.rscPermissions.API.Settings;
-
-public class ResolutionResult
-{
- public String prefix = "";
- public String suffix = "";
- public Map permissions;
- protected List groups;
- public boolean hasPermission(String permission)
- {
- for(Map.Entry entry : permissions.entrySet())
- if(entry.getKey().equals(permission))
- return entry.getValue();
- return false;
- }
- public boolean hasPermissionWC(String permission)
- {
- for(Map.Entry entry : permissions.entrySet())
- {
- final String key = entry.getKey();
- if(key.equals(permission))
- return entry.getValue();
- if(key.contains("*") && GenericChatCodes.wildcardMatch(permission, key))
- return entry.getValue();
- }
- return false;
- }
- public List getOrderedGroups()
- {
- return Collections.unmodifiableList(groups);
- }
- 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()]);
- }
-}
+package ru.simsonic.rscPermissions.Engine;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+import ru.simsonic.rscMinecraftLibrary.Bukkit.GenericChatCodes;
+import ru.simsonic.rscPermissions.API.Settings;
+
+public class ResolutionResult
+{
+ public String prefix = "";
+ public String suffix = "";
+ public Map permissions;
+ protected List groups;
+ public boolean hasPermission(String permission)
+ {
+ for(Map.Entry entry : permissions.entrySet())
+ if(entry.getKey().equals(permission))
+ return entry.getValue();
+ return false;
+ }
+ public boolean hasPermissionWC(String permission)
+ {
+ for(Map.Entry entry : permissions.entrySet())
+ {
+ final String key = entry.getKey();
+ if(key.equals(permission))
+ return entry.getValue();
+ if(key.contains("*") && GenericChatCodes.wildcardMatch(permission, key))
+ return entry.getValue();
+ }
+ return false;
+ }
+ public List getOrderedGroups()
+ {
+ return Collections.unmodifiableList(groups);
+ }
+ 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()]);
+ }
+}