Browse Source

Version 0.9.6a:

* Implicit user/group permissions.
* Fixes in prefix/suffix calculation.
* On/off debug info for players.
* EntityType and PlayerType enum's entries are UPPERCASE.
* Linking to the newest rscUtilityLibrary.
master
Stanislav Usenkov 10 years ago
parent
commit
a2c442fe86
  1. 4
      pom.xml
  2. 8
      src/main/java/ru/simsonic/rscPermissions/API/EntityType.java
  3. 34
      src/main/java/ru/simsonic/rscPermissions/API/PlayerType.java
  4. 8
      src/main/java/ru/simsonic/rscPermissions/API/RowInheritance.java
  5. 2
      src/main/java/ru/simsonic/rscPermissions/API/RowPermission.java
  6. 22
      src/main/java/ru/simsonic/rscPermissions/Bukkit/BukkitPermissionManager.java
  7. 46
      src/main/java/ru/simsonic/rscPermissions/Bukkit/Commands/BukkitCommands.java
  8. 2
      src/main/java/ru/simsonic/rscPermissions/Bukkit/PermissionsEx_YAML.java
  9. 2
      src/main/java/ru/simsonic/rscPermissions/Bukkit/RegionUpdateObserver.java
  10. 15
      src/main/java/ru/simsonic/rscPermissions/BukkitPluginMain.java
  11. 49
      src/main/java/ru/simsonic/rscPermissions/Engine/InternalCache.java
  12. 13
      src/main/java/ru/simsonic/rscPermissions/Engine/Phrases.java
  13. 6
      src/main/java/ru/simsonic/rscPermissions/IndependentMain.java
  14. 3
      src/main/resources/languages/english.yml
  15. 3
      src/main/resources/languages/russian.yml

4
pom.xml

@ -4,7 +4,7 @@
<groupId>ru.simsonic</groupId> <groupId>ru.simsonic</groupId>
<artifactId>rscPermissions</artifactId> <artifactId>rscPermissions</artifactId>
<version>0.9.4a</version> <version>0.9.6a</version>
<packaging>jar</packaging> <packaging>jar</packaging>
<name>rscPermissions</name> <name>rscPermissions</name>
@ -66,7 +66,7 @@
<dependency> <dependency>
<groupId>ru.simsonic</groupId> <groupId>ru.simsonic</groupId>
<artifactId>rscUtilityLibrary</artifactId> <artifactId>rscUtilityLibrary</artifactId>
<version>2.0.2</version> <version>2.0.3</version>
<scope>compile</scope> <scope>compile</scope>
<type>jar</type> <type>jar</type>
</dependency> </dependency>

8
src/main/java/ru/simsonic/rscPermissions/API/EntityType.java

@ -2,9 +2,9 @@ package ru.simsonic.rscPermissions.API;
public enum EntityType public enum EntityType
{ {
group(0), GROUP(0),
player(1), PLAYER(1),
unknown(-1); UNKNOWN(-1);
private final int value; private final int value;
private EntityType(int value) private EntityType(int value)
{ {
@ -15,6 +15,6 @@ public enum EntityType
for(EntityType constant : EntityType.values()) for(EntityType constant : EntityType.values())
if(constant.value == value) if(constant.value == value)
return constant; return constant;
return unknown; return UNKNOWN;
} }
} }

34
src/main/java/ru/simsonic/rscPermissions/API/PlayerType.java

@ -4,12 +4,12 @@ import java.util.regex.Pattern;
public enum PlayerType public enum PlayerType
{ {
name(0), // 16 chars max NAME(0), // 16 chars max
hyphenatedUUID(1), // 550e8400-e29b-41d4-a716-446655440000 HYPHENATED_UUID(1), // 550e8400-e29b-41d4-a716-446655440000
dehyphenatedUUID(2), // 550e8400e29b41d4a716446655440000 DEHYPHENATED_UUID(2), // 550e8400e29b41d4a716446655440000
internetWildcard(3), // 192.168.*.* INTERNET_WILDCARD(3), // 192.168.*.*
internetSubnetMask(4), // 192.168.1.0/16 INTERNET_SUBNETMASK(4), // 192.168.1.0/16
inapplicable(-1); INAPPLICABLE(-1);
private final int value; private final int value;
private PlayerType(int value) private PlayerType(int value)
{ {
@ -20,7 +20,7 @@ public enum PlayerType
for(PlayerType constant : PlayerType.values()) for(PlayerType constant : PlayerType.values())
if(constant.value == value) if(constant.value == value)
return constant; return constant;
return inapplicable; return INAPPLICABLE;
} }
private static final Pattern nicknameRegExp = Pattern.compile("^[a-zA-Z0-9_-]{3,16}$"); private static final Pattern nicknameRegExp = Pattern.compile("^[a-zA-Z0-9_-]{3,16}$");
private static final Pattern hyphenatedRegExp = Pattern.compile("^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$"); private static final Pattern hyphenatedRegExp = Pattern.compile("^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$");
@ -39,13 +39,13 @@ public enum PlayerType
public static PlayerType scanPlayerEntity(String entity) public static PlayerType scanPlayerEntity(String entity)
{ {
if(entity == null || "".equals(entity)) if(entity == null || "".equals(entity))
return name; return NAME;
if(nicknameRegExp.matcher(entity).matches()) if(nicknameRegExp.matcher(entity).matches())
return name; return NAME;
if(hyphenatedRegExp.matcher(entity.toLowerCase()).matches()) if(hyphenatedRegExp.matcher(entity.toLowerCase()).matches())
return hyphenatedUUID; return HYPHENATED_UUID;
if(dehyphenatedRegExp.matcher(entity.toLowerCase()).matches()) if(dehyphenatedRegExp.matcher(entity.toLowerCase()).matches())
return dehyphenatedUUID; return DEHYPHENATED_UUID;
/* /*
final Matcher mIP1 = ipWildcardRegExp.matcher(entity); final Matcher mIP1 = ipWildcardRegExp.matcher(entity);
if(mIP1.matches()) if(mIP1.matches())
@ -56,7 +56,7 @@ public enum PlayerType
final String a4 = mIP1.group(4); final String a4 = mIP1.group(4);
// TO DO // TO DO
long address = 0, mask = 0; long address = 0, mask = 0;
return internetWildcard; return INTERNET_WILDCARD;
} }
final Matcher mIP2 = ipSubnetMaskRegExp.matcher(entity); final Matcher mIP2 = ipSubnetMaskRegExp.matcher(entity);
if(mIP2.matches()) if(mIP2.matches())
@ -68,10 +68,10 @@ public enum PlayerType
final String sn = mIP1.group(5); final String sn = mIP1.group(5);
// TO DO // TO DO
long address = 0, mask = 0; long address = 0, mask = 0;
return internetSubnetMask; return INTERNET_SUBNETMASK;
} }
*/ */
return inapplicable; return INAPPLICABLE;
} }
/* /*
public static void getAddressDetails(String entity, RowPermission row) public static void getAddressDetails(String entity, RowPermission row)
@ -109,11 +109,11 @@ public enum PlayerType
return false; return false;
switch(this) switch(this)
{ {
case name: case NAME:
return identifier.equals(entity); return identifier.equals(entity);
case hyphenatedUUID: case HYPHENATED_UUID:
identifier = identifier.replace("-", ""); identifier = identifier.replace("-", "");
case dehyphenatedUUID: case DEHYPHENATED_UUID:
return entity.equalsIgnoreCase(identifier); return entity.equalsIgnoreCase(identifier);
} }
return false; return false;

8
src/main/java/ru/simsonic/rscPermissions/API/RowInheritance.java

@ -46,15 +46,15 @@ public class RowInheritance implements Cloneable, Comparable<RowInheritance>
} }
public boolean isEntityApplicable(String identifier) public boolean isEntityApplicable(String identifier)
{ {
if(EntityType.group.equals(childType)) if(EntityType.GROUP.equals(childType))
return entity.equalsIgnoreCase(identifier); return entity.equalsIgnoreCase(identifier);
switch(playerType) switch(playerType)
{ {
case name: case NAME:
return entity.equals(identifier); return entity.equals(identifier);
case hyphenatedUUID: case HYPHENATED_UUID:
identifier = identifier.replace("-", ""); identifier = identifier.replace("-", "");
case dehyphenatedUUID: case DEHYPHENATED_UUID:
return entity.equals(identifier); return entity.equals(identifier);
} }
// TO DO // TO DO

2
src/main/java/ru/simsonic/rscPermissions/API/RowPermission.java

@ -21,7 +21,7 @@ public class RowPermission implements Cloneable
} }
public boolean isEntityApplicable(String identifier) public boolean isEntityApplicable(String identifier)
{ {
if(EntityType.group.equals(entityType)) if(EntityType.GROUP.equals(entityType))
return entity.equalsIgnoreCase(identifier); return entity.equalsIgnoreCase(identifier);
// TO DO // TO DO
return false; return false;

22
src/main/java/ru/simsonic/rscPermissions/Bukkit/BukkitPermissionManager.java

@ -3,6 +3,7 @@ import java.net.InetSocketAddress;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
import java.util.HashMap; import java.util.HashMap;
import java.util.HashSet;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
@ -21,13 +22,14 @@ public class BukkitPermissionManager extends RestartableThread
{ {
this.rscp = plugin; this.rscp = plugin;
} }
private final LinkedBlockingQueue<Player> updateQueue = new LinkedBlockingQueue<>(); private final LinkedBlockingQueue<Player> updateQueue = new LinkedBlockingQueue<>();
private final Map<Player, PermissionAttachment> attachments = new HashMap<>(); private final Map<Player, PermissionAttachment> attachments = new HashMap<>();
private final Map<Player, Map<String, Boolean>> persistentPermissions = new HashMap<>(); private final Map<Player, Map<String, Boolean>> persistentPermissions = new HashMap<>();
private final Map<Player, Map<String, Boolean>> transientPermissions = new HashMap<>(); private final Map<Player, Map<String, Boolean>> transientPermissions = new HashMap<>();
private final Map<Player, Set<String>> groups = new ConcurrentHashMap<>(); private final Map<Player, Set<String>> groups = new ConcurrentHashMap<>();
private final Map<Player, String> prefixes = new ConcurrentHashMap<>(); private final Map<Player, String> prefixes = new ConcurrentHashMap<>();
private final Map<Player, String> suffixes = new ConcurrentHashMap<>(); private final Map<Player, String> suffixes = new ConcurrentHashMap<>();
private final Set<Player> debug = new HashSet<>();
public void recalculateOnlinePlayers() public void recalculateOnlinePlayers()
{ {
updateQueue.addAll(rscp.getServer().getOnlinePlayers()); updateQueue.addAll(rscp.getServer().getOnlinePlayers());
@ -71,6 +73,7 @@ public class BukkitPermissionManager extends RestartableThread
suffixes.remove(player); suffixes.remove(player);
persistentPermissions.remove(player); persistentPermissions.remove(player);
transientPermissions.remove(player); transientPermissions.remove(player);
debug.remove(player);
} }
@Override @Override
public void run() public void run()
@ -151,4 +154,15 @@ public class BukkitPermissionManager extends RestartableThread
result.add(socketAddress.getAddress().getHostAddress()); result.add(socketAddress.getAddress().getHostAddress());
return result.toArray(new String[result.size()]); return result.toArray(new String[result.size()]);
} }
public boolean isDebugging(Player target)
{
return debug.contains(target);
}
public void setDebugging(Player target, boolean value)
{
if(value)
debug.add(target);
else
debug.remove(target);
}
} }

46
src/main/java/ru/simsonic/rscPermissions/Bukkit/Commands/BukkitCommands.java

@ -4,14 +4,15 @@ import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
import java.util.Map; import java.util.Map;
import java.util.logging.Level; import java.util.logging.Level;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender; import org.bukkit.command.CommandSender;
import org.bukkit.command.ConsoleCommandSender;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import ru.simsonic.rscPermissions.API.Settings; import ru.simsonic.rscPermissions.API.Settings;
import ru.simsonic.rscPermissions.Backends.DatabaseContents; import ru.simsonic.rscPermissions.Backends.DatabaseContents;
import ru.simsonic.rscPermissions.Bukkit.PermissionsEx_YAML; import ru.simsonic.rscPermissions.Bukkit.PermissionsEx_YAML;
import ru.simsonic.rscPermissions.BukkitPluginMain; import ru.simsonic.rscPermissions.BukkitPluginMain;
import ru.simsonic.rscUtilityLibrary.CommandProcessing.CommandAnswerException; import ru.simsonic.rscPermissions.Engine.Phrases;
import ru.simsonic.rscUtilityLibrary.Bukkit.Commands.CommandAnswerException;
import ru.simsonic.rscUtilityLibrary.RestartableThread; import ru.simsonic.rscUtilityLibrary.RestartableThread;
import ru.simsonic.rscUtilityLibrary.TextProcessing.GenericChatCodes; import ru.simsonic.rscUtilityLibrary.TextProcessing.GenericChatCodes;
@ -127,22 +128,13 @@ public class BukkitCommands
threadInsertExampleRows.startDeamon(); threadInsertExampleRows.startDeamon();
return threadInsertExampleRows; return threadInsertExampleRows;
} }
public void onCommand(CommandSender sender, Command cmd, String label, String[] args) throws CommandAnswerException public void onCommandHub(CommandSender sender, String[] args) throws CommandAnswerException
{
switch(cmd.getName().toLowerCase())
{
case "rscp":
onCommandHub(sender, args);
break;
}
}
private void onCommandHub(CommandSender sender, String[] args) throws CommandAnswerException
{ {
final ArrayList<String> help = new ArrayList<>(); final ArrayList<String> help = new ArrayList<>();
if(sender.hasPermission("rscp.admin")) if(sender.hasPermission("rscp.admin"))
help.add("/rscp (user|group) {_LS}-- PermissionsEx-like admin commands"); help.add("/rscp (user|group) {_LS}-- PermissionsEx-like admin commands");
if(sender.hasPermission("rscp.admin.lock")) if(sender.hasPermission("rscp.admin.lock"))
help.add("/rscp (lock|unlock) {_LS}-- maintenance mode control"); help.add("/rscp (lock [mode]|unlock) {_LS}-- maintenance mode control");
if(sender.hasPermission("rscp.admin")) if(sender.hasPermission("rscp.admin"))
{ {
help.add("/rscp (examplerows|import) {_LS}-- possible useful things"); help.add("/rscp (examplerows|import) {_LS}-- possible useful things");
@ -252,8 +244,34 @@ public class BukkitCommands
return; return;
case "debug": case "debug":
/* rscp debug [yes|on|no|off|toggle] */ /* rscp debug [yes|on|no|off|toggle] */
if(sender instanceof ConsoleCommandSender)
throw new CommandAnswerException("{_LR}This command cannot be run from console.");
if(sender.hasPermission("rscp.admin")) if(sender.hasPermission("rscp.admin"))
throw new CommandAnswerException("Not implemented yet."); {
final Player player = (Player)sender;
boolean isDebugging = rscp.permissionManager.isDebugging(player);
if(args.length >= 2)
switch(args[1].toLowerCase())
{
case "yes":
case "on":
isDebugging = true;
break;
case "no":
case "off":
isDebugging = false;
break;
case "toggle":
isDebugging = !isDebugging;
break;
default:
throw new CommandAnswerException(help);
}
else
isDebugging = !isDebugging;
rscp.permissionManager.setDebugging(player, isDebugging);
throw new CommandAnswerException(isDebugging ? Phrases.DEBUG_ON.toString() : Phrases.DEBUG_OFF.toString());
}
return; return;
case "help": case "help":
default: default:

2
src/main/java/ru/simsonic/rscPermissions/Bukkit/PermissionsEx_YAML.java

@ -3,7 +3,7 @@ import java.io.File;
import org.bukkit.configuration.ConfigurationSection; import org.bukkit.configuration.ConfigurationSection;
import org.bukkit.configuration.file.FileConfiguration; import org.bukkit.configuration.file.FileConfiguration;
import org.bukkit.configuration.file.YamlConfiguration; import org.bukkit.configuration.file.YamlConfiguration;
import ru.simsonic.rscUtilityLibrary.CommandProcessing.CommandAnswerException; import ru.simsonic.rscUtilityLibrary.Bukkit.Commands.CommandAnswerException;
public final class PermissionsEx_YAML public final class PermissionsEx_YAML
{ {

2
src/main/java/ru/simsonic/rscPermissions/Bukkit/RegionUpdateObserver.java

@ -1,7 +1,7 @@
package ru.simsonic.rscPermissions.Bukkit; package ru.simsonic.rscPermissions.Bukkit;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import ru.simsonic.rscPermissions.BukkitPluginMain; import ru.simsonic.rscPermissions.BukkitPluginMain;
import ru.simsonic.rscUtilityLibrary.BukkitListeners.MovingPlayersCatcher; import ru.simsonic.rscUtilityLibrary.Bukkit.Listeners.MovingPlayersCatcher;
import ru.simsonic.rscUtilityLibrary.RestartableThread; import ru.simsonic.rscUtilityLibrary.RestartableThread;
public class RegionUpdateObserver extends RestartableThread public class RegionUpdateObserver extends RestartableThread

15
src/main/java/ru/simsonic/rscPermissions/BukkitPluginMain.java

@ -20,7 +20,7 @@ import ru.simsonic.rscPermissions.Bukkit.Commands.BukkitCommands;
import ru.simsonic.rscPermissions.Bukkit.RegionUpdateObserver; import ru.simsonic.rscPermissions.Bukkit.RegionUpdateObserver;
import ru.simsonic.rscPermissions.Engine.InternalCache; import ru.simsonic.rscPermissions.Engine.InternalCache;
import ru.simsonic.rscPermissions.Engine.Phrases; import ru.simsonic.rscPermissions.Engine.Phrases;
import ru.simsonic.rscUtilityLibrary.CommandProcessing.CommandAnswerException; import ru.simsonic.rscUtilityLibrary.Bukkit.Commands.CommandAnswerException;
import ru.simsonic.rscUtilityLibrary.TextProcessing.GenericChatCodes; import ru.simsonic.rscUtilityLibrary.TextProcessing.GenericChatCodes;
public final class BukkitPluginMain extends JavaPlugin public final class BukkitPluginMain extends JavaPlugin
@ -41,7 +41,7 @@ public final class BukkitPluginMain extends JavaPlugin
public void onLoad() public void onLoad()
{ {
settings.onLoad(); settings.onLoad();
consoleLog.log(Level.INFO, "[rscp] This server's ID is '{0}'. You can change it in server.properties.", getServer().getServerId()); consoleLog.log(Level.INFO, "[rscp] This server`s ID is \"{0}\". You can change it in server.properties.", getServer().getServerId());
consoleLog.log(Level.INFO, "[rscp] rscPermissions has been loaded."); consoleLog.log(Level.INFO, "[rscp] rscPermissions has been loaded.");
} }
@Override @Override
@ -66,7 +66,6 @@ public final class BukkitPluginMain extends JavaPlugin
}); });
// Integrate Metrics // Integrate Metrics
if(settings.isUseMetrics()) if(settings.isUseMetrics())
{
try try
{ {
metrics = new MetricsLite(this); metrics = new MetricsLite(this);
@ -75,7 +74,6 @@ public final class BukkitPluginMain extends JavaPlugin
} catch(IOException ex) { } catch(IOException ex) {
consoleLog.log(Level.INFO, "[rscp][Metrics] Exception: {0}", ex); consoleLog.log(Level.INFO, "[rscp][Metrics] Exception: {0}", ex);
} }
}
// Register event's dispatcher // Register event's dispatcher
getServer().getPluginManager().registerEvents(bukkitListener, this); getServer().getPluginManager().registerEvents(bukkitListener, this);
regionUpdateObserver.registerListeners(); regionUpdateObserver.registerListeners();
@ -125,12 +123,15 @@ public final class BukkitPluginMain extends JavaPlugin
{ {
try try
{ {
commandHelper.onCommand(sender, cmd, label, args); switch(cmd.getName().toLowerCase())
{
case "rscp":
commandHelper.onCommandHub(sender, args);
break;
}
} catch(CommandAnswerException ex) { } catch(CommandAnswerException ex) {
for(String answer : ex.getMessageArray()) for(String answer : ex.getMessageArray())
sender.sendMessage(GenericChatCodes.processStringStatic(Settings.chatPrefix + answer)); sender.sendMessage(GenericChatCodes.processStringStatic(Settings.chatPrefix + answer));
} catch(NullPointerException ex) {
// These will never occur! I hope...
} }
return true; return true;
} }

49
src/main/java/ru/simsonic/rscPermissions/Engine/InternalCache.java

@ -21,6 +21,8 @@ public class InternalCache
private final HashMap<String, RowEntity> entities_u = new HashMap<>(); private final HashMap<String, RowEntity> entities_u = new HashMap<>();
private final RowInheritance defaultInheritance = new RowInheritance(); private final RowInheritance defaultInheritance = new RowInheritance();
private boolean alwaysInheritDefaultGroup = false; private boolean alwaysInheritDefaultGroup = false;
private RowEntity implicit_g;
private RowEntity implicit_u;
public void setDefaultGroup(String defaultGroup, boolean alwaysInheritDefaultGroup) public void setDefaultGroup(String defaultGroup, boolean alwaysInheritDefaultGroup)
{ {
defaultInheritance.parent = defaultGroup; defaultInheritance.parent = defaultGroup;
@ -33,13 +35,15 @@ public class InternalCache
importEntities(contents); importEntities(contents);
importPermissions(contents.permissions); importPermissions(contents.permissions);
importInheritance(contents.inheritance); importInheritance(contents.inheritance);
implicit_g = entities_g.get("");
implicit_u = entities_u.get("");
} }
private void importEntities(DatabaseContents contents) private void importEntities(DatabaseContents contents)
{ {
final HashSet<String> names_u = new HashSet<>(); final HashSet<String> names_u = new HashSet<>();
final HashSet<String> names_g = new HashSet<>(); final HashSet<String> names_g = new HashSet<>();
for(RowEntity row : contents.entities) for(RowEntity row : contents.entities)
if(row.entityType == EntityType.group) if(row.entityType == EntityType.GROUP)
{ {
names_g.add(row.entity); names_g.add(row.entity);
entities_g.put(row.entity.toLowerCase(), row); entities_g.put(row.entity.toLowerCase(), row);
@ -48,14 +52,14 @@ public class InternalCache
entities_u.put(row.entity, row); entities_u.put(row.entity, row);
} }
for(RowPermission row : contents.permissions) for(RowPermission row : contents.permissions)
if(row.entityType == EntityType.group) if(row.entityType == EntityType.GROUP)
names_g.add(row.entity); names_g.add(row.entity);
else else
names_u.add(row.entity); names_u.add(row.entity);
for(RowInheritance row : contents.inheritance) for(RowInheritance row : contents.inheritance)
{ {
names_g.add(row.parent); names_g.add(row.parent);
if(row.childType == EntityType.group) if(row.childType == EntityType.GROUP)
names_g.add(row.entity); names_g.add(row.entity);
else else
names_u.add(row.entity); names_u.add(row.entity);
@ -68,7 +72,7 @@ public class InternalCache
{ {
final RowEntity dummy = new RowEntity(); final RowEntity dummy = new RowEntity();
dummy.entity = name; dummy.entity = name;
dummy.entityType = EntityType.group; dummy.entityType = EntityType.GROUP;
entities_g.put(groupInternalName, dummy); entities_g.put(groupInternalName, dummy);
} }
} }
@ -77,7 +81,7 @@ public class InternalCache
{ {
final RowEntity dummy = new RowEntity(); final RowEntity dummy = new RowEntity();
dummy.entity = name; dummy.entity = name;
dummy.entityType = EntityType.player; dummy.entityType = EntityType.PLAYER;
entities_u.put(name, dummy); entities_u.put(name, dummy);
} }
for(RowEntity row : entities_u.values()) for(RowEntity row : entities_u.values())
@ -88,7 +92,7 @@ public class InternalCache
final ArrayList<RowPermission> permissions_p2g = new ArrayList<>(); final ArrayList<RowPermission> permissions_p2g = new ArrayList<>();
final ArrayList<RowPermission> permissions_p2u = new ArrayList<>(); final ArrayList<RowPermission> permissions_p2u = new ArrayList<>();
for(RowPermission row : rows) for(RowPermission row : rows)
if(row.entityType == EntityType.group) if(row.entityType == EntityType.GROUP)
{ {
row.entityObject = entities_g.get(row.entity.toLowerCase()); row.entityObject = entities_g.get(row.entity.toLowerCase());
permissions_p2g.add(row); permissions_p2g.add(row);
@ -118,7 +122,7 @@ public class InternalCache
final ArrayList<RowInheritance> inheritance_g2g = new ArrayList<>(); final ArrayList<RowInheritance> inheritance_g2g = new ArrayList<>();
final ArrayList<RowInheritance> inheritance_g2u = new ArrayList<>(); final ArrayList<RowInheritance> inheritance_g2u = new ArrayList<>();
for(RowInheritance row : rows) for(RowInheritance row : rows)
if(row.childType == EntityType.group) if(row.childType == EntityType.GROUP)
{ {
row.entityChild = entities_g.get(row.entity.toLowerCase()); row.entityChild = entities_g.get(row.entity.toLowerCase());
row.entityParent = entities_g.get(row.parent.toLowerCase()); row.entityParent = entities_g.get(row.parent.toLowerCase());
@ -148,7 +152,7 @@ public class InternalCache
Collections.sort(inheritances); Collections.sort(inheritances);
entry.getValue().inheritance = inheritances.toArray(new RowInheritance[inheritances.size()]); entry.getValue().inheritance = inheritances.toArray(new RowInheritance[inheritances.size()]);
} }
defaultInheritance.childType = EntityType.player; defaultInheritance.childType = EntityType.PLAYER;
defaultInheritance.entityParent = entities_g.get(defaultInheritance.parent.toLowerCase()); defaultInheritance.entityParent = entities_g.get(defaultInheritance.parent.toLowerCase());
} }
public synchronized ResolutionResult resolvePlayer(String player) public synchronized ResolutionResult resolvePlayer(String player)
@ -166,6 +170,8 @@ public class InternalCache
{ {
final ArrayList<RowPermission> applicablePermissions = new ArrayList<>(); final ArrayList<RowPermission> applicablePermissions = new ArrayList<>();
final ArrayList<RowInheritance> applicableInheritance = new ArrayList<>(); final ArrayList<RowInheritance> applicableInheritance = new ArrayList<>();
if(implicit_u != null && implicit_u.permissions != null)
processPermissions(params, Arrays.asList(implicit_u.permissions));
params.groupList = new LinkedHashSet<>(); params.groupList = new LinkedHashSet<>();
params.finalPerms = new HashMap<>(); params.finalPerms = new HashMap<>();
params.instantiator = ""; params.instantiator = "";
@ -199,6 +205,8 @@ public class InternalCache
} }
private ResolutionResult resolveParent(ResolutionParams params) private ResolutionResult resolveParent(ResolutionParams params)
{ {
if(implicit_g != null && implicit_g.permissions != null)
processPermissions(params, Arrays.asList(implicit_g.permissions));
final RowEntity currentParent = params.parentEntity; final RowEntity currentParent = params.parentEntity;
final String instantiator = params.instantiator; final String instantiator = params.instantiator;
final ArrayList<ResolutionResult> intermediateResults = new ArrayList<>(); final ArrayList<ResolutionResult> intermediateResults = new ArrayList<>();
@ -235,21 +243,18 @@ public class InternalCache
result.prefix = "%"; result.prefix = "%";
if(result.suffix == null || "".equals(result.suffix)) if(result.suffix == null || "".equals(result.suffix))
result.suffix = "%"; result.suffix = "%";
if(intermediate.size() > 0) final StringBuilder sbp = new StringBuilder();
final StringBuilder sbs = new StringBuilder();
for(ResolutionResult inherited : intermediate)
{ {
final StringBuilder sbp = new StringBuilder(); if(inherited.prefix != null)
final StringBuilder sbs = new StringBuilder(); sbp.append(inherited.prefix);
for(ResolutionResult inherited : intermediate) if(inherited.suffix != null)
{ sbs.append(inherited.suffix);
if(inherited.prefix != null)
sbp.append(inherited.prefix);
if(inherited.suffix != null)
sbs.append(inherited.suffix);
}
intermediate.clear();
result.prefix = result.prefix.replace(Settings.textInheriter, sbp.toString());
result.suffix = result.suffix.replace(Settings.textInheriter, sbs.toString());
} }
intermediate.clear();
result.prefix = result.prefix.replace(Settings.textInheriter, sbp.toString());
result.suffix = result.suffix.replace(Settings.textInheriter, sbs.toString());
result.prefix = result.prefix.replace(Settings.instantiator, params.instantiator); result.prefix = result.prefix.replace(Settings.instantiator, params.instantiator);
result.suffix = result.suffix.replace(Settings.instantiator, params.instantiator); result.suffix = result.suffix.replace(Settings.instantiator, params.instantiator);
return result; return result;
@ -282,5 +287,7 @@ public class InternalCache
{ {
entities_g.clear(); entities_g.clear();
entities_u.clear(); entities_u.clear();
implicit_g = null;
implicit_u = null;
} }
} }

13
src/main/java/ru/simsonic/rscPermissions/Engine/Phrases.java

@ -20,6 +20,8 @@ public enum Phrases
INTEGRATION_WG_N ("integration.worldguard-no"), INTEGRATION_WG_N ("integration.worldguard-no"),
INTEGRATION_R_Y ("integration.residence-yes"), INTEGRATION_R_Y ("integration.residence-yes"),
INTEGRATION_R_N ("integration.residence-no"), INTEGRATION_R_N ("integration.residence-no"),
DEBUG_ON ("debug.enabled"),
DEBUG_OFF ("debug.disabled"),
MYSQL_FETCHED ("mysql.fetched"), MYSQL_FETCHED ("mysql.fetched"),
; ;
private final String node; private final String node;
@ -48,12 +50,11 @@ public enum Phrases
try try
{ {
final File langFile = new File(workingDir, langName + ".yml"); final File langFile = new File(workingDir, langName + ".yml");
if(!langFile.isFile()) if(langFile.isFile())
{ langFile.delete();
final FileChannel fileChannel = new FileOutputStream(langFile).getChannel(); final FileChannel fileChannel = new FileOutputStream(langFile).getChannel();
final InputStream langStream = BukkitPluginMain.class.getResourceAsStream("/languages/" + langName + ".yml"); final InputStream langStream = BukkitPluginMain.class.getResourceAsStream("/languages/" + langName + ".yml");
fileChannel.transferFrom(Channels.newChannel(langStream), 0, Long.MAX_VALUE); fileChannel.transferFrom(Channels.newChannel(langStream), 0, Long.MAX_VALUE);
}
} catch(IOException ex) { } catch(IOException ex) {
} }
} }

6
src/main/java/ru/simsonic/rscPermissions/IndependentMain.java

@ -36,15 +36,15 @@ public class IndependentMain
System.out.println("Loading permissions from json files."); System.out.println("Loading permissions from json files.");
final DatabaseContents contents = localJsn.retrieveContents(); final DatabaseContents contents = localJsn.retrieveContents();
System.out.println("Filter and calculating permission tree."); System.out.println("Filter and calculating permission tree.");
contents.filterServerId("localtest").filterLifetime(); contents.filterServerId("Primary").filterLifetime();
if(contents.isEmpty()) if(contents.isEmpty())
{ {
System.out.println("Permission database is empty, stopping."); System.out.println("Permission database is empty, stopping.");
return; return;
} }
intCache.setDefaultGroup("Moderators", true); intCache.setDefaultGroup("Default", true);
intCache.fill(contents); intCache.fill(contents);
final ResolutionResult result = intCache.resolvePlayer("rscpTester"); final ResolutionResult result = intCache.resolvePlayer("Reality_SC");
// Sorted output // Sorted output
ArrayList<String> perms = new ArrayList<>(result.permissions.keySet()); ArrayList<String> perms = new ArrayList<>(result.permissions.keySet());
Collections.sort(perms); Collections.sort(perms);

3
src/main/resources/languages/english.yml

@ -10,5 +10,8 @@ integration:
worldguard-no: "{_YL}WorldGuard was not found." worldguard-no: "{_YL}WorldGuard was not found."
residence-yes: "{_LG}Residence was found and integrated." residence-yes: "{_LG}Residence was found and integrated."
residence-no: "{_YL}Residence was not found." residence-no: "{_YL}Residence was not found."
debug:
enable: "{_LS}You will see a lot of debugging information now."
disable: "{_LS}Debugging information is now hidden for you."
mysql: mysql:
fetched: "[rscp] " fetched: "[rscp] "

3
src/main/resources/languages/russian.yml

@ -10,5 +10,8 @@ integration:
worldguard-no: "{_YL}WorldGuard не обнаружен." worldguard-no: "{_YL}WorldGuard не обнаружен."
residence-yes: "{_LG}Residence обнаружён и подключён." residence-yes: "{_LG}Residence обнаружён и подключён."
residence-no: "{_YL}Residence не обнаружен." residence-no: "{_YL}Residence не обнаружен."
debug:
enable: "{_LS}Теперь Вы будете видеть отладочную информацию."
disable: "{_LS}Отладочная информация теперь скрыта от Вас."
mysql: mysql:
fetched: "[rscp] " fetched: "[rscp] "

Loading…
Cancel
Save