diff --git a/pom.xml b/pom.xml
index b7e8775..6184b6b 100644
--- a/pom.xml
+++ b/pom.xml
@@ -12,13 +12,13 @@
-
+
- spigot-repo
+ spigotmc-repo
https://hub.spigotmc.org/nexus/content/groups/public/
@@ -27,9 +27,13 @@
http://repo.mcstats.org/content/repositories/public/
-
+
+
+ scarsz-repo
+ https://dl.bintray.com/scarsz/maven
@@ -48,6 +52,13 @@
+
+
mysql
@@ -69,13 +80,6 @@
1.10.2-R0.1-SNAPSHOT
provided
-
-
- org.spongepowered
- spongeapi
- 6.0.0-SNAPSHOT
- provided
-
ru.simsonic
@@ -98,9 +102,10 @@
- net.milkbowl.vault
+
+ com.scarsz
VaultAPI
- 1.6
+ 1.5
compile
diff --git a/src/main/java/ru/simsonic/rscPermissions/Bukkit/BukkitPermissionManager.java b/src/main/java/ru/simsonic/rscPermissions/Bukkit/BukkitPermissionManager.java
index 2d8034c..b7dd76f 100644
--- a/src/main/java/ru/simsonic/rscPermissions/Bukkit/BukkitPermissionManager.java
+++ b/src/main/java/ru/simsonic/rscPermissions/Bukkit/BukkitPermissionManager.java
@@ -48,21 +48,21 @@ public class BukkitPermissionManager extends RestartableThread
}
public ResolutionResult getResult(String playerIdentifier)
{
- return (resolutions.containsKey(playerIdentifier))
+ return resolutions.containsKey(playerIdentifier)
? resolutions.get(playerIdentifier)
: resolvePlayerIdentifier(playerIdentifier);
}
public ResolutionResult getResult(OfflinePlayer offline)
{
final String key = offline.toString();
- return (resolutions.containsKey(key))
+ return resolutions.containsKey(key)
? resolutions.get(key)
: resolveOfflinePlayer(offline);
}
public ResolutionResult getResult(Player player)
{
final String key = player.toString();
- return (resolutions.containsKey(key))
+ return resolutions.containsKey(key)
? resolutions.get(key)
: resolvePlayer(player);
}
diff --git a/src/main/java/ru/simsonic/rscPermissions/Bukkit/Commands/BukkitCommands.java b/src/main/java/ru/simsonic/rscPermissions/Bukkit/Commands/BukkitCommands.java
index 9c6e25f..f2e62ec 100644
--- a/src/main/java/ru/simsonic/rscPermissions/Bukkit/Commands/BukkitCommands.java
+++ b/src/main/java/ru/simsonic/rscPermissions/Bukkit/Commands/BukkitCommands.java
@@ -111,8 +111,8 @@ public class BukkitCommands
}
if(sender.hasPermission("rscp.admin"))
{
- help.add("{_YL}/rscp examplerows {_LS}-- insert some fake rows into database");
- help.add("{_YL}/rscp import pex-sql {_LS}-- import data from pex's database (in the same schema)");
+ help.add("{_YL}/rscp {_LR}examplerows {_LS}-- insert some fake rows into database");
+ help.add("{_YL}/rscp {_LR}import pex-sql {_LS}-- import data from pex's database (in the same schema)");
help.add(Phrases.HELP_CMD_DEBUG.toString());
help.add(Phrases.HELP_CMD_FETCH.toString());
help.add(Phrases.HELP_CMD_RELOAD.toString());
@@ -120,12 +120,22 @@ public class BukkitCommands
help.add(Phrases.HELP_CMD_HELP.toString());
switch(args[0].toLowerCase())
{
- case "user":
- case "player":
- cmdEntity.onEntityCommandHub(sender, true, args);
+ case "listgroups":
+ case "groups":
+ case "lg":
+ cmdEntity.listGroups(sender);
return;
case "group":
- cmdEntity.onEntityCommandHub(sender, false, args);
+ case "g":
+ cmdEntity.onEntityCommandHub(sender, CommandEntity.TargetType.GROUP, args);
+ return;
+ case "user":
+ case "u":
+ cmdEntity.onEntityCommandHub(sender, CommandEntity.TargetType.USER, args);
+ return;
+ case "player":
+ case "p":
+ cmdEntity.onEntityCommandHub(sender, CommandEntity.TargetType.PLAYER, args);
return;
case "lock":
cmdLock.executeLock(sender, args);
@@ -160,19 +170,21 @@ public class BukkitCommands
/* DEPRECATED: rscp import pex-sql*/
if(sender.hasPermission("rscp.admin"))
{
- if(args.length > 1)
- switch(args[1].toLowerCase())
+ if(args.length <= 1)
+ throw new CommandAnswerException(new String[]
{
- case "pex-sql":
- threadMigrateFromPExSQL(sender);
- throw new CommandAnswerException("Trying to import PEX database into rscPermissions...");
- }
- throw new CommandAnswerException(new String[]
+ "Usage: {_YL}/rscp import [options]",
+ "Available importers:",
+ "{_LG}pex-sql {_LS}-- (PermissionsEx's SQL backend)",
+ });
+ switch(args[1].toLowerCase())
{
- "Usage: {_YL}/rscp import [options]",
- "Available importers:",
- "{_LG}pex-sql {_LS}-- (PermissionsEx SQL Backend)",
- });
+ case "pex-sql":
+ threadMigrateFromPExSQL(sender);
+ throw new CommandAnswerException("Trying to import PEX database into rscPermissions...");
+ default:
+ break;
+ }
}
return;
case "help":
diff --git a/src/main/java/ru/simsonic/rscPermissions/Bukkit/Commands/CommandEntity.java b/src/main/java/ru/simsonic/rscPermissions/Bukkit/Commands/CommandEntity.java
index 1c97b57..065d270 100644
--- a/src/main/java/ru/simsonic/rscPermissions/Bukkit/Commands/CommandEntity.java
+++ b/src/main/java/ru/simsonic/rscPermissions/Bukkit/Commands/CommandEntity.java
@@ -1,16 +1,19 @@
package ru.simsonic.rscPermissions.Bukkit.Commands;
+import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Map;
+import java.util.Set;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import ru.simsonic.rscMinecraftLibrary.Bukkit.CommandAnswerException;
import ru.simsonic.rscPermissions.API.EntityType;
import ru.simsonic.rscPermissions.API.RowEntity;
+import ru.simsonic.rscPermissions.API.RowInheritance;
+import ru.simsonic.rscPermissions.API.RowPermission;
import ru.simsonic.rscPermissions.Bukkit.BukkitUtilities;
import ru.simsonic.rscPermissions.BukkitPluginMain;
-import ru.simsonic.rscPermissions.Engine.Backends.DatabaseEditor;
import ru.simsonic.rscPermissions.Engine.Matchers;
import ru.simsonic.rscPermissions.Engine.ResolutionResult;
@@ -21,50 +24,82 @@ public class CommandEntity
{
this.rscp = plugin;
}
- public void onEntityCommandHub(CommandSender sender, boolean type, String[] args) throws CommandAnswerException
+ public static enum TargetType
{
- if(sender.hasPermission("rscp.admin"))
+ GROUP,
+ USER,
+ PLAYER,
+ }
+ public void onEntityCommandHub(CommandSender sender, TargetType type, String[] args) throws CommandAnswerException
+ {
+ if(sender.hasPermission("rscp.admin") == false)
throw new CommandAnswerException("Not enough permissions.");
args = Arrays.copyOfRange(args, 1, args.length);
- if(args.length == 0)
+ if(args.length <= 1)
throw new CommandAnswerException("Read help.");
- RowEntity entity = null;
- Player player = null;
- if(type)
+ RowEntity entity = null;
+ ResolutionResult result = null;
+ switch(type)
{
- player = BukkitUtilities.findOnlinePlayer(args[0]);
- if(player != null)
- args[1] = player.getName();
- } else
- entity = rscp.internalCache.findGroupEntity(args[0]);
- final ResolutionResult result = (player != null)
- ? rscp.permissionManager.getResult(player)
- : rscp.permissionManager.getResult(args[0]);
- if(player == null && entity == null)
- throw new CommandAnswerException("I don't know him.");
+ case PLAYER:
+ final Player player = BukkitUtilities.findOnlinePlayer(args[0]);
+ if(player != null)
+ {
+ args[0] = player.getName();
+ result = rscp.permissionManager.getResult(player);
+ break;
+ }
+ result = rscp.permissionManager.getResult(args[0]);
+ break;
+ case USER:
+ entity = rscp.internalCache.findUserEntity(args[0]);
+ break;
+ case GROUP:
+ entity = rscp.internalCache.findGroupEntity(args[0]);
+ break;
+ }
+ if(entity == null && result == null)
+ throw new CommandAnswerException("{_LR}I don't know such name!");
+ if(args[1] == null)
+ args[1] = "";
switch(args[1].toLowerCase())
{
+ case "":
+ case "info":
+ case "i":
+ // INFO ?
+ throw new CommandAnswerException("Subcommand isn't implemented.");
case "prefix":
case "p":
- if(player != null)
+ if(result != null)
viewCalculatedPrefix(result, args[1]);
else
viewEntityPrefix(entity);
break;
case "suffix":
case "s":
- if(player != null)
+ if(result != null)
viewCalculatedSuffix(result, args[1]);
else
viewEntitySuffix(entity);
break;
case "listpermissions":
+ case "permissions":
case "lp":
- listFinalPlayerPermissions(result, args[1]);
+ if(result != null)
+ listFinalPlayerPermissions(result, args[0]);
+ else
+ showEntityPermissions(entity);
break;
+ case "listparents":
case "listgroups":
+ case "parents":
+ case "groups":
case "lg":
- listUserGroupsTree(result, args[1]);
+ if(result != null)
+ listUserGroupsTree(result, args[1]);
+ else
+ showEntityParents(entity);
break;
case "addparent":
case "addgroup":
@@ -84,6 +119,19 @@ public class CommandEntity
break;
}
}
+ public void listGroups(CommandSender sender) throws CommandAnswerException
+ {
+ final ArrayList answer = new ArrayList<>(16);
+ final Set groups = rscp.internalCache.getKnownGroups();
+ answer.add("There are following known groups in database:");
+ for(String group : groups)
+ {
+ if("".equals(group))
+ group = "{_LS}";
+ answer.add("{_WH}" + group);
+ }
+ throw new CommandAnswerException(answer);
+ }
private void viewEntityPrefix(RowEntity entity) throws CommandAnswerException
{
final ArrayList answer = new ArrayList<>();
@@ -118,6 +166,41 @@ public class CommandEntity
answer.add("{_R}\"" + result.getSuffix() + "{_R}\"");
throw new CommandAnswerException(answer);
}
+ private void showEntityPermissions(RowEntity entity) throws CommandAnswerException
+ {
+ final ArrayList answer = new ArrayList<>();
+ final String typeName = entity.entityType.name().toLowerCase();
+ answer.add("Explicit permissions for " + typeName + " {_YL}" + entity.entity + "{_LS}:");
+ for(RowPermission permission : entity.permissions)
+ {
+ final StringBuilder sb = new StringBuilder();
+ sb.append("{_WH}").append(permission.splittedId);
+ sb.append(permission.value ? " {_LG}" : " {_LR}").append(permission.permission);
+ if(permission.destination != null)
+ {
+ final String destination = permission.destination.toString();
+ if(!"".equals(destination))
+ sb.append("{_R} {_LC}{_U}").append(destination);
+ }
+ if(permission.expirience > 0)
+ sb.append("{_R} {_LB}").append(permission.expirience).append(" LVLs");
+ if(permission.lifetime != null)
+ {
+ final String lifetime = permission.lifetime.toLocalDateTime().format(DateTimeFormatter.ISO_LOCAL_DATE_TIME).replace("T", " ");
+ sb.append("{_R} {_YL}").append(lifetime);
+ }
+ answer.add(sb.toString());
+ }
+ throw new CommandAnswerException(answer);
+ }
+ private void showEntityParents(RowEntity entity) throws CommandAnswerException
+ {
+ final ArrayList answer = new ArrayList<>();
+ answer.add("Parent groups for " + entity.entityType.name().toLowerCase() + " {_YL}" + entity.entity + "{_LS}:");
+ for(RowInheritance parent : entity.inheritance)
+ answer.add("{_WH}" + parent.splittedId + " {_LG}" + parent.parent);
+ throw new CommandAnswerException(answer);
+ }
private void listFinalPlayerPermissions(ResolutionResult result, String user) throws CommandAnswerException
{
if(Matchers.isCorrectDashlessUUID(user))
diff --git a/src/main/java/ru/simsonic/rscPermissions/Engine/IntermediateResult.java b/src/main/java/ru/simsonic/rscPermissions/Engine/IntermediateResult.java
index ff91cd3..811d366 100644
--- a/src/main/java/ru/simsonic/rscPermissions/Engine/IntermediateResult.java
+++ b/src/main/java/ru/simsonic/rscPermissions/Engine/IntermediateResult.java
@@ -2,10 +2,12 @@ package ru.simsonic.rscPermissions.Engine;
import java.util.List;
import java.util.Map;
+import ru.simsonic.rscPermissions.API.RowEntity;
class IntermediateResult
{
ResolutionParams params;
+ List entities;
String prefix = "";
String suffix = "";
List groups;
diff --git a/src/main/java/ru/simsonic/rscPermissions/Engine/InternalCache.java b/src/main/java/ru/simsonic/rscPermissions/Engine/InternalCache.java
index bca06da..da89ce8 100644
--- a/src/main/java/ru/simsonic/rscPermissions/Engine/InternalCache.java
+++ b/src/main/java/ru/simsonic/rscPermissions/Engine/InternalCache.java
@@ -33,6 +33,13 @@ public class InternalCache extends InternalStorage
result.add(row.entity);
return result;
}
+ public synchronized Set getKnownUsers()
+ {
+ final Set result = new TreeSet<>();
+ for(RowEntity row : entities_u.values())
+ result.add(row.entity);
+ return result;
+ }
public synchronized ResolutionResult resolvePlayer(String player)
{
return resolvePlayer(new String[] { player });
@@ -46,15 +53,17 @@ public class InternalCache extends InternalStorage
}
public synchronized ResolutionResult resolvePlayer(ResolutionParams params)
{
- final ArrayList applicableEntities = new ArrayList<>();
- final ArrayList applicablePermissions = new ArrayList<>();
- final ArrayList applicableInheritance = new ArrayList<>();
- if(implicit_u != null && implicit_u.permissions != null)
- processPermissions(params, Arrays.asList(implicit_u.permissions));
params.groupList = new LinkedList<>();
params.finalPerms = new TreeMap<>();
params.instantiator = "";
params.depth = 0;
+ if(implicit_u != null && implicit_u.permissions != null)
+ {
+ processPermissions(params, Arrays.asList(implicit_u.permissions));
+ }
+ final ArrayList applicableEntities = new ArrayList<>();
+ final ArrayList applicablePermissions = new ArrayList<>();
+ final ArrayList applicableInheritance = new ArrayList<>();
for(RowEntity row : entities_u.values())
for(String identifier : params.applicableIdentifiers)
if(row.playerType.isEntityApplicable(row.entity, identifier))
@@ -89,8 +98,11 @@ public class InternalCache extends InternalStorage
params.parentEntity = row;
result = processPrefixesAndSuffixes(params, Arrays.asList(new ResolutionResult[] { result }));
}
- result.prefix = GenericChatCodes.processStringStatic(result.prefix);
- result.suffix = GenericChatCodes.processStringStatic(result.suffix);
+ if(implicit_u != null)
+ applicableEntities.add(0, implicit_u);
+ result.entities = applicableEntities;
+ result.prefix = GenericChatCodes.processStringStatic(result.prefix);
+ result.suffix = GenericChatCodes.processStringStatic(result.suffix);
processPermissions(params, applicablePermissions);
result.permissions = params.finalPerms;
result.groups = params.groupList;
diff --git a/src/main/java/ru/simsonic/rscPermissions/Engine/ResolutionResult.java b/src/main/java/ru/simsonic/rscPermissions/Engine/ResolutionResult.java
index 19747c0..13969d7 100644
--- a/src/main/java/ru/simsonic/rscPermissions/Engine/ResolutionResult.java
+++ b/src/main/java/ru/simsonic/rscPermissions/Engine/ResolutionResult.java
@@ -6,6 +6,7 @@ import java.util.List;
import java.util.Map;
import java.util.regex.Pattern;
import ru.simsonic.rscMinecraftLibrary.Bukkit.GenericChatCodes;
+import ru.simsonic.rscPermissions.API.RowEntity;
import ru.simsonic.rscPermissions.API.Settings;
public class ResolutionResult extends IntermediateResult
@@ -56,4 +57,8 @@ public class ResolutionResult extends IntermediateResult
}
return list.toArray(new String[list.size()]);
}
+ public RowEntity[] getApplicableRows()
+ {
+ return null;
+ }
}