4 changed files with 289 additions and 287 deletions
@ -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; |
||||
} |
||||
} |
||||
|
@ -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; |
||||
} |
||||
} |
||||
|
@ -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<String, Boolean> permissions; |
||||
protected List<String> groups; |
||||
public boolean hasPermission(String permission) |
||||
{ |
||||
for(Map.Entry<String, Boolean> entry : permissions.entrySet()) |
||||
if(entry.getKey().equals(permission)) |
||||
return entry.getValue(); |
||||
return false; |
||||
} |
||||
public boolean hasPermissionWC(String permission) |
||||
{ |
||||
for(Map.Entry<String, Boolean> 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<String> getOrderedGroups() |
||||
{ |
||||
return Collections.unmodifiableList(groups); |
||||
} |
||||
public String[] getDeorderedGroups() |
||||
{ |
||||
final ArrayList<String> 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<String, Boolean> permissions; |
||||
protected List<String> groups; |
||||
public boolean hasPermission(String permission) |
||||
{ |
||||
for(Map.Entry<String, Boolean> entry : permissions.entrySet()) |
||||
if(entry.getKey().equals(permission)) |
||||
return entry.getValue(); |
||||
return false; |
||||
} |
||||
public boolean hasPermissionWC(String permission) |
||||
{ |
||||
for(Map.Entry<String, Boolean> 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<String> getOrderedGroups() |
||||
{ |
||||
return Collections.unmodifiableList(groups); |
||||
} |
||||
public String[] getDeorderedGroups() |
||||
{ |
||||
final ArrayList<String> 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()]); |
||||
} |
||||
} |
||||
|
Loading…
Reference in new issue