Browse Source

It's a huge start to make new internal engine for the plugin.

It should support some new possibilities:
* Permissions for joining players will be already precalculated.
* VaultAPI 100% support.
* Separated Frontends, Internals and Backends - strong own API.
* Use names, uuids and IP addresses in the entity column with type 1 (player).
* Just be faster.
* etc.
master
Stanislav 11 years ago
parent
commit
36b52cefb0
  1. 2
      nb-configuration.xml
  2. 50
      pom.xml
  3. BIN
      rscp.png
  4. 4
      src/main/java/ru/simsonic/rscPermissions/Backends/Backend.java
  5. 100
      src/main/java/ru/simsonic/rscPermissions/Backends/BackendMySQL.java
  6. 87
      src/main/java/ru/simsonic/rscPermissions/CommandHelper.java
  7. 6
      src/main/java/ru/simsonic/rscPermissions/ConnectionHelper.java
  8. 2
      src/main/java/ru/simsonic/rscPermissions/DataTypes/CommandHelperAnswerException.java
  9. 18
      src/main/java/ru/simsonic/rscPermissions/DataTypes/EntityType.java
  10. 21
      src/main/java/ru/simsonic/rscPermissions/DataTypes/RowEntity.java
  11. 20
      src/main/java/ru/simsonic/rscPermissions/DataTypes/RowInheritance.java
  12. 3
      src/main/java/ru/simsonic/rscPermissions/DataTypes/RowLadder.java
  13. 3
      src/main/java/ru/simsonic/rscPermissions/DataTypes/RowPermission.java
  14. 17
      src/main/java/ru/simsonic/rscPermissions/DataTypes/RowReward.java
  15. 6
      src/main/java/ru/simsonic/rscPermissions/DataTypes/RowServer.java
  16. 367
      src/main/java/ru/simsonic/rscPermissions/Frontends/VaultChat.java
  17. 289
      src/main/java/ru/simsonic/rscPermissions/Frontends/VaultPermission.java
  18. 13
      src/main/java/ru/simsonic/rscPermissions/InternalCache/AbstractPermissionsCache.java
  19. 4
      src/main/java/ru/simsonic/rscPermissions/InternalCache/AsyncPlayerInfo.java
  20. 230
      src/main/java/ru/simsonic/rscPermissions/InternalCache/BrandNewCache.java
  21. 23
      src/main/java/ru/simsonic/rscPermissions/InternalCache/LocalCacheData.java
  22. 4
      src/main/java/ru/simsonic/rscPermissions/InternalCache/LocalCacheFunctions.java
  23. 22
      src/main/java/ru/simsonic/rscPermissions/InternalCache/LocalCacheTree.java
  24. 2
      src/main/java/ru/simsonic/rscPermissions/Ladders.java
  25. 28
      src/main/java/ru/simsonic/rscPermissions/MainPluginClass.java
  26. 180
      src/main/java/ru/simsonic/rscPermissions/Rewards.java
  27. 18
      src/main/java/ru/simsonic/rscPermissions/Settings.java
  28. 510
      src/main/java/ru/simsonic/rscPermissions/rscpAPI.java
  29. 19
      src/main/resources/sqlt/Initialize_rewards_v1.sqlt
  30. 27
      src/main/resources/sqlt/Update_server_info.sqlt

2
nb-configuration.xml

@ -13,6 +13,6 @@ You can copy and paste the single properties, into the pom.xml file and the IDE
That way multiple projects can share the same settings (useful for formatting rules for example). That way multiple projects can share the same settings (useful for formatting rules for example).
Any value defined here will override the pom.xml file value but is only applicable to the current project. Any value defined here will override the pom.xml file value but is only applicable to the current project.
--> -->
<netbeans.hint.jdkPlatform>______JDK_1.7_Update_51</netbeans.hint.jdkPlatform> <netbeans.hint.jdkPlatform>______JDK_1.7_Update_67</netbeans.hint.jdkPlatform>
</properties> </properties>
</project-shared-configuration> </project-shared-configuration>

50
pom.xml

@ -4,7 +4,7 @@
<groupId>ru.simsonic</groupId> <groupId>ru.simsonic</groupId>
<artifactId>rscPermissions</artifactId> <artifactId>rscPermissions</artifactId>
<version>0.8.10b</version> <version>0.9.0b</version>
<packaging>jar</packaging> <packaging>jar</packaging>
<name>rscPermissions</name> <name>rscPermissions</name>
@ -32,7 +32,7 @@
<plugin> <plugin>
<groupId>org.apache.maven.plugins</groupId> <groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId> <artifactId>maven-jar-plugin</artifactId>
<version>2.4</version> <version>2.5</version>
<configuration> <configuration>
<archive> <archive>
<addMavenDescriptor>false</addMavenDescriptor> <addMavenDescriptor>false</addMavenDescriptor>
@ -45,7 +45,7 @@
<plugin> <plugin>
<groupId>org.apache.maven.plugins</groupId> <groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId> <artifactId>maven-shade-plugin</artifactId>
<version>2.2</version> <version>2.3</version>
<executions> <executions>
<execution> <execution>
<phase>package</phase> <phase>package</phase>
@ -108,47 +108,72 @@
<id>bukkit-repo</id> <id>bukkit-repo</id>
<url>http://repo.bukkit.org/content/groups/public</url> <url>http://repo.bukkit.org/content/groups/public</url>
</repository> </repository>
<!-- Vault and VaultAPI -->
<repository>
<id>VaultAPI</id>
<url>http://nexus.theyeticave.net/content/repositories/pub_releases</url>
</repository>
<!-- Region list providers: WorldGuard, Residence --> <!-- Region list providers: WorldGuard, Residence -->
<repository> <repository>
<id>sk89q-repo</id> <id>sk89q-repo</id>
<url>http://maven.sk89q.com/repo/</url> <url>http://maven.sk89q.com/repo/</url>
</repository> </repository>
<repository>
<id>maven.sk89q.com</id>
<url>http://maven.sk89q.com/artifactory/libs-release-local</url>
</repository>
<repository>
<id>maven.sk89q.com-snapshot</id>
<url>http://maven.sk89q.com/artifactory/libs-snapshot-local</url>
</repository>
<repository> <repository>
<id>Residence</id> <id>Residence</id>
<url>http://ci.drtshock.net/plugin/repository/everything/</url> <url>http://ci.drtshock.net/plugin/repository/everything/</url>
</repository> </repository>
<!-- My own libraries and APIs --> <!-- My own libraries and APIs -->
<!-- + Vault now builds on ci.voxile.ru -->
<repository> <repository>
<id>voxile.ru</id> <id>voxile.ru</id>
<url>http://ci.voxile.ru/plugin/repository/everything/</url> <url>http://s9.voxile.ru/plugin/repository/everything/</url>
</repository> </repository>
</repositories> </repositories>
<dependencies> <dependencies>
<dependency> <dependency>
<groupId>mysql</groupId> <groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId> <artifactId>mysql-connector-java</artifactId>
<version>5.1.30</version> <version>5.1.32</version>
<scope>runtime</scope> <scope>runtime</scope>
</dependency> </dependency>
<dependency> <dependency>
<groupId>org.bukkit</groupId> <groupId>org.bukkit</groupId>
<artifactId>bukkit</artifactId> <artifactId>bukkit</artifactId>
<version>1.7.5-R0.1-SNAPSHOT</version> <version>1.7.9-R0.1-SNAPSHOT</version>
<scope>provided</scope> <scope>provided</scope>
<type>jar</type> <type>jar</type>
</dependency> </dependency>
<dependency>
<groupId>ru.simsonic</groupId>
<artifactId>rscAPI</artifactId>
<version>1.2.1</version>
<scope>compile</scope>
<type>jar</type>
</dependency>
<dependency>
<groupId>net.milkbowl.vault</groupId>
<artifactId>VaultAPI</artifactId>
<version>1.4</version>
<scope>provided</scope>
</dependency>
<dependency> <dependency>
<groupId>com.sk89q</groupId> <groupId>com.sk89q</groupId>
<artifactId>worldedit</artifactId> <artifactId>worldedit</artifactId>
<version>5.6</version> <version>5.6.2</version>
<scope>compile</scope> <scope>compile</scope>
<type>jar</type> <type>jar</type>
</dependency> </dependency>
<dependency> <dependency>
<groupId>com.sk89q</groupId> <groupId>com.sk89q</groupId>
<artifactId>worldguard</artifactId> <artifactId>worldguard</artifactId>
<version>5.9.1-SNAPSHOT</version> <version>6.0.0-SNAPSHOT</version>
<scope>provided</scope> <scope>provided</scope>
<type>jar</type> <type>jar</type>
</dependency> </dependency>
@ -159,12 +184,5 @@
<scope>provided</scope> <scope>provided</scope>
<type>jar</type> <type>jar</type>
</dependency> </dependency>
<dependency>
<groupId>ru.simsonic</groupId>
<artifactId>rscAPI</artifactId>
<version>1.2.0</version>
<scope>compile</scope>
<type>jar</type>
</dependency>
</dependencies> </dependencies>
</project> </project>

BIN
rscp.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.3 KiB

4
src/main/java/ru/simsonic/rscPermissions/Backends/Backend.java

@ -3,8 +3,7 @@ import ru.simsonic.rscPermissions.DataTypes.RowEntity;
import ru.simsonic.rscPermissions.DataTypes.RowInheritance; import ru.simsonic.rscPermissions.DataTypes.RowInheritance;
import ru.simsonic.rscPermissions.DataTypes.RowLadder; import ru.simsonic.rscPermissions.DataTypes.RowLadder;
import ru.simsonic.rscPermissions.DataTypes.RowPermission; import ru.simsonic.rscPermissions.DataTypes.RowPermission;
import ru.simsonic.rscPermissions.DataTypes.RowServer; import ru.simsonic.rscPermissions.InternalCache.LocalCacheData;
import ru.simsonic.rscPermissions.LocalCacheData;
public interface Backend public interface Backend
{ {
@ -16,7 +15,6 @@ public interface Backend
public abstract RowPermission[] fetchPermissions(); public abstract RowPermission[] fetchPermissions();
public abstract RowInheritance[] fetchInheritance(); public abstract RowInheritance[] fetchInheritance();
public abstract RowLadder[] fetchLadders(); public abstract RowLadder[] fetchLadders();
public abstract RowServer[] fetchServers();
public abstract void insertExampleRows(); public abstract void insertExampleRows();
public abstract void updateEntityText(String entity, boolean entity_type, String text, boolean isPrefix); public abstract void updateEntityText(String entity, boolean entity_type, String text, boolean isPrefix);

100
src/main/java/ru/simsonic/rscPermissions/Backends/BackendMySQL.java

@ -3,18 +3,16 @@ import ru.simsonic.utilities.*;
import java.sql.ResultSet; import java.sql.ResultSet;
import java.sql.SQLException; import java.sql.SQLException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays;
import java.util.logging.Level; import java.util.logging.Level;
import ru.simsonic.rscPermissions.DataTypes.Destination; import ru.simsonic.rscPermissions.DataTypes.Destination;
import ru.simsonic.rscPermissions.DataTypes.RowEntity; import ru.simsonic.rscPermissions.DataTypes.RowEntity;
import ru.simsonic.rscPermissions.DataTypes.RowEntity.EntityType; import ru.simsonic.rscPermissions.DataTypes.EntityType;
import ru.simsonic.rscPermissions.DataTypes.RowInheritance; import ru.simsonic.rscPermissions.DataTypes.RowInheritance;
import ru.simsonic.rscPermissions.DataTypes.RowLadder; import ru.simsonic.rscPermissions.DataTypes.RowLadder;
import ru.simsonic.rscPermissions.DataTypes.RowPermission; import ru.simsonic.rscPermissions.DataTypes.RowPermission;
import ru.simsonic.rscPermissions.DataTypes.RowReward; import ru.simsonic.rscPermissions.InternalCache.LocalCacheData;
import ru.simsonic.rscPermissions.DataTypes.RowServer;
import ru.simsonic.rscPermissions.LocalCacheData;
import ru.simsonic.rscPermissions.MainPluginClass; import ru.simsonic.rscPermissions.MainPluginClass;
import ru.simsonic.rscPermissions.Rewards;
import ru.simsonic.rscPermissions.Settings; import ru.simsonic.rscPermissions.Settings;
public class BackendMySQL extends ConnectionMySQL implements Backend public class BackendMySQL extends ConnectionMySQL implements Backend
@ -60,9 +58,8 @@ public class BackendMySQL extends ConnectionMySQL implements Backend
return false; return false;
if(super.Connect()) if(super.Connect())
{ {
createTablesIfNotExist(); executeUpdate(loadResourceSQLT("Initialize_main_v1"));
cleanupTables(); cleanupTables();
updateServerInfo();
return true; return true;
} }
return false; return false;
@ -81,42 +78,22 @@ public class BackendMySQL extends ConnectionMySQL implements Backend
return false; return false;
return super.executeUpdate(query); return super.executeUpdate(query);
} }
private void createTablesIfNotExist()
{
executeUpdate(loadResourceSQLT("Initialize_main_v1"));
if(plugin.settings.isRewardsEnabled())
executeUpdate(loadResourceSQLT("Initialize_rewards_v1"));
}
private void cleanupTables() private void cleanupTables()
{ {
executeUpdate(loadResourceSQLT("Cleanup_tables")); executeUpdate(loadResourceSQLT("Cleanup_tables"));
} }
private void updateServerInfo()
{
final String mMode = plugin.settings.getMaintenanceMode();
setupQueryTemplate("{SERVERID}", plugin.getServer().getServerId());
setupQueryTemplate("{PLUGIN_VER}", plugin.getDescription().getVersion());
setupQueryTemplate("{DEFAULT}", plugin.settings.getDefaultGroup());
setupQueryTemplate("{OP}", plugin.settings.isAsteriskOP() ? "1" : "0");
setupQueryTemplate("{DELAY}", Integer.toString(plugin.settings.getAutoReloadDelayTicks() / 20));
setupQueryTemplate("{mMode}", "".equals(mMode) ? "NULL" : "\"" + mMode + "\"");
setupQueryTemplate("{USE_R}", plugin.settings.isRewardsEnabled() ? "1" : "0");
setupQueryTemplate("{CFG_VER}", Integer.toString(plugin.settings.CurrentVersion));
executeUpdate(loadResourceSQLT("Update_server_info"));
}
@Override @Override
public synchronized void fetchIntoCache(LocalCacheData cache) public synchronized void fetchIntoCache(LocalCacheData cache)
{ {
cleanupTables(); cleanupTables();
MainPluginClass.consoleLog.log(Level.INFO, MainPluginClass.consoleLog.log(Level.INFO,
"[rscp] Fetched {0}e, {1}p, {2}i, {3}l, {4}s from \"{5}\".", "[rscp] Fetched {0}e, {1}p, {2}i, {3}l, from \"{4}\".",
new Object[] new Object[]
{ {
Integer.toString(cache.ImportEntities(fetchEntities())), Integer.toString(cache.ImportEntities(fetchEntities())),
Integer.toString(cache.ImportPermissions(fetchPermissions())), Integer.toString(cache.ImportPermissions(fetchPermissions())),
Integer.toString(cache.ImportInheritance(fetchInheritance())), Integer.toString(cache.ImportInheritance(fetchInheritance())),
Integer.toString(cache.ImportLadders(fetchLadders())), Integer.toString(cache.ImportLadders(fetchLadders())),
Integer.toString(cache.ImportServers(fetchServers())),
RememberName, RememberName,
}); });
} }
@ -132,7 +109,7 @@ public class BackendMySQL extends ConnectionMySQL implements Backend
RowEntity row = new RowEntity(); RowEntity row = new RowEntity();
row.id = rs.getInt("id"); row.id = rs.getInt("id");
row.entity = rs.getString("entity"); row.entity = rs.getString("entity");
row.entity_type = EntityType.byValue(rs.getInt("entity_type")); row.entityType = EntityType.byValue(rs.getInt("entity_type"));
row.prefix = rs.getString("prefix"); row.prefix = rs.getString("prefix");
row.suffix = rs.getString("suffix"); row.suffix = rs.getString("suffix");
result.add(row); result.add(row);
@ -160,7 +137,7 @@ public class BackendMySQL extends ConnectionMySQL implements Backend
RowPermission row = new RowPermission(); RowPermission row = new RowPermission();
row.id = rs.getInt("id"); row.id = rs.getInt("id");
row.entity = rs.getString("entity"); row.entity = rs.getString("entity");
row.entity_type = EntityType.byValue(rs.getInt("entity_type")); row.entityType = EntityType.byValue(rs.getInt("entity_type"));
row.permission = rs.getString("permission"); row.permission = rs.getString("permission");
row.value = rs.getBoolean("value"); row.value = rs.getBoolean("value");
row.destination = destination; row.destination = destination;
@ -193,13 +170,8 @@ public class BackendMySQL extends ConnectionMySQL implements Backend
row.id = rs.getInt("id"); row.id = rs.getInt("id");
row.entity = rs.getString("entity"); row.entity = rs.getString("entity");
row.parent = rs.getString("parent"); row.parent = rs.getString("parent");
String[] breaked = row.parent.split(Settings.separatorRegExp); row.deriveInstance();
if(breaked.length == 2) row.childType = EntityType.byValue(rs.getInt("inheritance_type"));
{
row.parent = breaked[0];
row.instance = breaked[1];
}
row.child_type = EntityType.byValue(rs.getInt("inheritance_type"));
row.priority = rs.getInt("inheritance_priority"); row.priority = rs.getInt("inheritance_priority");
row.destination = destination; row.destination = destination;
row.expirience = rs.getInt("expirience"); row.expirience = rs.getInt("expirience");
@ -227,7 +199,7 @@ public class BackendMySQL extends ConnectionMySQL implements Backend
row.climber = rs.getString("climber"); row.climber = rs.getString("climber");
if("".equals(row.climber)) if("".equals(row.climber))
row.climber = null; row.climber = null;
row.climber_type = EntityType.byValue(rs.getInt("climber_type")); row.climberType = EntityType.byValue(rs.getInt("climber_type"));
row.ladder = rs.getString("ladder"); row.ladder = rs.getString("ladder");
String[] breaked = row.ladder.split(Settings.separatorRegExp); String[] breaked = row.ladder.split(Settings.separatorRegExp);
if(breaked.length == 2) if(breaked.length == 2)
@ -245,58 +217,6 @@ public class BackendMySQL extends ConnectionMySQL implements Backend
return result.toArray(new RowLadder[result.size()]); return result.toArray(new RowLadder[result.size()]);
} }
@Override @Override
public synchronized RowServer[] fetchServers()
{
final ArrayList<RowServer> result = new ArrayList<>();
final ResultSet rs = executeQuery("SELECT * FROM `{DATABASE}`.`{PREFIX}servers`;");
try
{
while(rs.next())
{
RowServer row = new RowServer();
row.serverId = rs.getString("serverId");
// PARSE OTHER COLUMNS HERE
result.add(row);
}
rs.close();
} catch(SQLException ex) {
MainPluginClass.consoleLog.log(Level.WARNING, "[rscp] Exception in rs2s(): {0}", ex.getLocalizedMessage());
}
return result.toArray(new RowServer[result.size()]);
}
public synchronized void fetchRewards(Rewards rewardHelper)
{
final ArrayList<RowReward> result = new ArrayList<>();
final ResultSet rs = executeQuery("SELECT * FROM `{DATABASE}`.`{PREFIX}rewards`;");
try
{
while(rs.next())
{
RowReward row = new RowReward();
row.id = rs.getInt("id");
row.user = rs.getString("user").toLowerCase();
row.code = rs.getString("code");
row.activated = rs.getBoolean("activated");
if(row.activated)
continue;
row.activated_timestamp = rs.getTimestamp("activated_timestamp");
row.execute_commands = rs.getString("execute_commands");
row.command_permissions = rs.getString("command_permissions");
row.add_group = rs.getString("add_group");
row.add_group_destination = rs.getString("add_group_destination");
row.add_group_expirience = rs.getInt("add_group_expirience");
row.add_group_interval = rs.getString("add_group_interval");
result.add(row);
}
rs.close();
} catch(SQLException ex) {
MainPluginClass.consoleLog.log(Level.WARNING, "[rscp] Exception in rs2r(): {0}", ex.getLocalizedMessage());
}
MainPluginClass.consoleLog.log(Level.INFO, "[rscp] Fetched {0} unused reward codes.",
Integer.toString(result.size()));
rewardHelper.ImportRewards(result.toArray(new RowReward[result.size()]));
}
@Override
public synchronized void insertExampleRows() public synchronized void insertExampleRows()
{ {
executeUpdate(loadResourceSQLT("Insert_example_rows_v1")); executeUpdate(loadResourceSQLT("Insert_example_rows_v1"));

87
src/main/java/ru/simsonic/rscPermissions/CommandHelper.java

@ -1,4 +1,5 @@
package ru.simsonic.rscPermissions; package ru.simsonic.rscPermissions;
import ru.simsonic.utilities.CommandAnswerException;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
import java.util.Map; import java.util.Map;
@ -11,15 +12,13 @@ import ru.simsonic.rscPermissions.Importers.PermissionsEx_YAML;
public class CommandHelper public class CommandHelper
{ {
private final MainPluginClass plugin; private final MainPluginClass plugin;
public final Rewards rewardHelper;
public final Ladders ladderHelper; public final Ladders ladderHelper;
public CommandHelper(final MainPluginClass rscp) public CommandHelper(final MainPluginClass rscp)
{ {
this.plugin = rscp; this.plugin = rscp;
rewardHelper = new Rewards(rscp);
ladderHelper = new Ladders(rscp); ladderHelper = new Ladders(rscp);
} }
public void onCommand(CommandSender sender, Command cmd, String label, String[] args) throws CommandHelperAnswerException public void onCommand(CommandSender sender, Command cmd, String label, String[] args) throws CommandAnswerException
{ {
switch(cmd.getName().toLowerCase()) switch(cmd.getName().toLowerCase())
{ {
@ -32,25 +31,17 @@ public class CommandHelper
ladderHelper.executePromotion(sender, args[0], (args.length >= 2) ? args[1] : null, true); ladderHelper.executePromotion(sender, args[0], (args.length >= 2) ? args[1] : null, true);
return; return;
} }
throw new CommandHelperAnswerException("/promote <user> <ladder[.instance]>"); throw new CommandAnswerException("/promote <user> <ladder[.instance]>");
case "demote": case "demote":
if(args.length >= 1) if(args.length >= 1)
{ {
ladderHelper.executePromotion(sender, args[0], (args.length >= 2) ? args[1] : null, false); ladderHelper.executePromotion(sender, args[0], (args.length >= 2) ? args[1] : null, false);
return; return;
} }
throw new CommandHelperAnswerException("/demote <user> <ladder[.instance]>"); throw new CommandAnswerException("/demote <user> <ladder[.instance]>");
case "reward":
if(sender instanceof Player)
{
String reward = (args.length >= 1) ? args[0] : null;
rewardHelper.executeReward((Player)sender, reward);
return;
}
throw new CommandHelperAnswerException("This command cannot be run from console.");
} }
} }
private void onCommandHub(CommandSender sender, String[] args) throws CommandHelperAnswerException 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"))
@ -74,7 +65,7 @@ public class CommandHelper
help.add(2, "{_DS}Current serverId is \'{_LS}" + plugin.getServer().getServerId() + "{_DS}\' (server.properties)"); help.add(2, "{_DS}Current serverId is \'{_LS}" + plugin.getServer().getServerId() + "{_DS}\' (server.properties)");
help.add("{_LG}" + plugin.getDescription().getWebsite()); help.add("{_LG}" + plugin.getDescription().getWebsite());
if(args.length == 0) if(args.length == 0)
throw new CommandHelperAnswerException(help); throw new CommandAnswerException(help);
switch(args[0].toLowerCase()) switch(args[0].toLowerCase())
{ {
case "user": case "user":
@ -89,13 +80,13 @@ public class CommandHelper
case "promote": case "promote":
/* rscp promote <user> <ladder> */ /* rscp promote <user> <ladder> */
if(args.length < 3) if(args.length < 3)
throw new CommandHelperAnswerException("/rscp promote <player> <ladder>"); throw new CommandAnswerException("/rscp promote <player> <ladder>");
ladderHelper.executePromotion(sender, args[1], args[2], true); ladderHelper.executePromotion(sender, args[1], args[2], true);
return; return;
case "demote": case "demote":
/* rscp demote <user> <ladder> */ /* rscp demote <user> <ladder> */
if(args.length < 3) if(args.length < 3)
throw new CommandHelperAnswerException("/rscp demote <player> <ladder>"); throw new CommandAnswerException("/rscp demote <player> <ladder>");
ladderHelper.executePromotion(sender, args[1], args[2], false); ladderHelper.executePromotion(sender, args[1], args[2], false);
return; return;
case "lock": case "lock":
@ -107,7 +98,7 @@ public class CommandHelper
mmon = plugin.getConfig().getString("language.mModes.locked.default.mmon", mmon); mmon = plugin.getConfig().getString("language.mModes.locked.default.mmon", mmon);
mmon = plugin.getConfig().getString("language.mModes.locked." + mMode + ".mmon", mmon); mmon = plugin.getConfig().getString("language.mModes.locked." + mMode + ".mmon", mmon);
plugin.maintenance.setMaintenanceMode(mMode); plugin.maintenance.setMaintenanceMode(mMode);
throw new CommandHelperAnswerException(mmon); throw new CommandAnswerException(mmon);
} }
return; return;
case "unlock": case "unlock":
@ -117,7 +108,7 @@ public class CommandHelper
String mmoff = "Maintenance mode disabled"; String mmoff = "Maintenance mode disabled";
mmoff = plugin.getConfig().getString("language.mModes.unlocked", mmoff); mmoff = plugin.getConfig().getString("language.mModes.unlocked", mmoff);
plugin.maintenance.setMaintenanceMode(null); plugin.maintenance.setMaintenanceMode(null);
throw new CommandHelperAnswerException(mmoff); throw new CommandAnswerException(mmoff);
} }
break; break;
case "examplerows": case "examplerows":
@ -125,7 +116,7 @@ public class CommandHelper
if(sender.hasPermission("rscp.admin")) if(sender.hasPermission("rscp.admin"))
{ {
plugin.connectionList.threadInsertExampleRows(sender); plugin.connectionList.threadInsertExampleRows(sender);
throw new CommandHelperAnswerException("Example rows have been added into database."); throw new CommandAnswerException("Example rows have been added into database.");
} }
return; return;
case "import": case "import":
@ -141,7 +132,7 @@ public class CommandHelper
// TO DO HERE // TO DO HERE
PermissionsEx_YAML importer_pex = new PermissionsEx_YAML(plugin, args[2]); PermissionsEx_YAML importer_pex = new PermissionsEx_YAML(plugin, args[2]);
plugin.connectionList.threadFetchTablesData(); plugin.connectionList.threadFetchTablesData();
throw new CommandHelperAnswerException(new String[] throw new CommandAnswerException(new String[]
{ {
"Data has been imported successfully!", "Data has been imported successfully!",
"Entities: {MAGENTA}" + Integer.toString(importer_pex.getEntities().length), "Entities: {MAGENTA}" + Integer.toString(importer_pex.getEntities().length),
@ -152,9 +143,9 @@ public class CommandHelper
}); });
case "pex-sql": case "pex-sql":
plugin.connectionList.threadMigrateFromPExSQL(sender); plugin.connectionList.threadMigrateFromPExSQL(sender);
throw new CommandHelperAnswerException("Trying to import PEX database into rscPermissions..."); throw new CommandAnswerException("Trying to import PEX database into rscPermissions...");
} }
throw new CommandHelperAnswerException(new String[] throw new CommandAnswerException(new String[]
{ {
"Usage: {GOLD}/rscp import <importer> [options]", "Usage: {GOLD}/rscp import <importer> [options]",
"Available importers:", "Available importers:",
@ -168,7 +159,7 @@ public class CommandHelper
if(sender.hasPermission("rscp.admin.reload")) if(sender.hasPermission("rscp.admin.reload"))
{ {
plugin.connectionList.threadFetchTablesData(); plugin.connectionList.threadFetchTablesData();
throw new CommandHelperAnswerException("Tables have been fetched."); throw new CommandAnswerException("Tables have been fetched.");
} }
return; return;
case "reload": case "reload":
@ -177,28 +168,28 @@ public class CommandHelper
{ {
plugin.getServer().getPluginManager().disablePlugin(plugin); plugin.getServer().getPluginManager().disablePlugin(plugin);
plugin.getServer().getPluginManager().enablePlugin(plugin); plugin.getServer().getPluginManager().enablePlugin(plugin);
throw new CommandHelperAnswerException("Plugin has been reloaded."); throw new CommandAnswerException("Plugin has been reloaded.");
} }
return; return;
case "update": case "update":
/* rscp update */ /* rscp update */
if(sender.hasPermission("rscp.admin")) if(sender.hasPermission("rscp.admin"))
throw new CommandHelperAnswerException(plugin.doUpdate(sender)); throw new CommandAnswerException(plugin.doUpdate(sender));
return; return;
case "debug": case "debug":
/* rscp debug [yes|on|no|off|toggle] */ /* rscp debug [yes|on|no|off|toggle] */
if(sender.hasPermission("rscp.admin")) if(sender.hasPermission("rscp.admin"))
throw new CommandHelperAnswerException("Not implemented yet."); throw new CommandAnswerException("Not implemented yet.");
return; return;
case "help": case "help":
default: default:
throw new CommandHelperAnswerException(help); throw new CommandAnswerException(help);
} }
} }
private void onCommandHubUser(CommandSender sender, String[] args) throws CommandHelperAnswerException private void onCommandHubUser(CommandSender sender, String[] args) throws CommandAnswerException
{ {
if(sender.hasPermission("rscp.admin") == false) if(sender.hasPermission("rscp.admin") == false)
throw new CommandHelperAnswerException("Not enough permissions."); throw new CommandAnswerException("Not enough permissions.");
final String[] help = new String[] final String[] help = new String[]
{ {
"rscPermissions command hub (user section).", "rscPermissions command hub (user section).",
@ -210,16 +201,16 @@ public class CommandHelper
"/rscp user <user> suffix [suffix]", "/rscp user <user> suffix [suffix]",
}; };
if(args.length < 3) if(args.length < 3)
throw new CommandHelperAnswerException(help); throw new CommandAnswerException(help);
final Player player = plugin.getServer().getPlayerExact(args[1]); final Player player = plugin.getServer().getPlayerExact(args[1]);
if(player == null) if(player == null)
throw new CommandHelperAnswerException("Player should be online"); throw new CommandAnswerException("Player should be online");
final ArrayList<String> list = new ArrayList<>(); final ArrayList<String> list = new ArrayList<>();
switch(args[2].toLowerCase()) switch(args[2].toLowerCase())
{ {
case "list": case "list":
if(args.length < 4) if(args.length < 4)
throw new CommandHelperAnswerException(help); throw new CommandAnswerException(help);
switch(args[3].toLowerCase()) switch(args[3].toLowerCase())
{ {
case "permissions": case "permissions":
@ -235,20 +226,20 @@ public class CommandHelper
for(String perm : sorted_keys) for(String perm : sorted_keys)
if(pv.containsKey(perm)) if(pv.containsKey(perm))
list.add((pv.get(perm) ? "{_LG}" : "{_LR}") + perm); list.add((pv.get(perm) ? "{_LG}" : "{_LR}") + perm);
throw new CommandHelperAnswerException(list); throw new CommandAnswerException(list);
case "groups": case "groups":
list.add("{MAGENTA}Group list for {_YL}" + player.getName() + "{MAGENTA}:"); list.add("{MAGENTA}Group list for {_YL}" + player.getName() + "{MAGENTA}:");
ArrayList<String> groups = plugin.cache.getUserGroups(player.getName()); ArrayList<String> groups = plugin.cache.getUserGroups(player.getName());
for(String group : groups) for(String group : groups)
list.add("{_LG}" + group); list.add("{_LG}" + group);
throw new CommandHelperAnswerException(list); throw new CommandAnswerException(list);
/* /*
case "ranks": case "ranks":
list.add("{MAGENTA}Ranks of player {_YL}" + player.getName() + "{MAGENTA}:"); list.add("{MAGENTA}Ranks of player {_YL}" + player.getName() + "{MAGENTA}:");
throw new CommandHelperAnswerException(list); throw new CommandAnswerException(list);
*/ */
} }
throw new CommandHelperAnswerException(list); throw new CommandAnswerException(list);
case "prefix": case "prefix":
if(args.length > 3) if(args.length > 3)
{ {
@ -258,7 +249,7 @@ public class CommandHelper
} else } else
list.add("{MAGENTA}Prefix for user {_YL}" + player.getName() + list.add("{MAGENTA}Prefix for user {_YL}" + player.getName() +
" {MAGENTA}is \"{_R}" + plugin.cache.userGetPrefix(player.getName()) + "{MAGENTA}\"."); " {MAGENTA}is \"{_R}" + plugin.cache.userGetPrefix(player.getName()) + "{MAGENTA}\".");
throw new CommandHelperAnswerException(list); throw new CommandAnswerException(list);
case "suffix": case "suffix":
if(args.length > 3) if(args.length > 3)
{ {
@ -268,13 +259,13 @@ public class CommandHelper
} else } else
list.add("{MAGENTA}Suffix for user {_YL}" + player.getName() + list.add("{MAGENTA}Suffix for user {_YL}" + player.getName() +
" {MAGENTA}is \"{_R}" + plugin.cache.userGetSuffix(player.getName()) + "{MAGENTA}\"."); " {MAGENTA}is \"{_R}" + plugin.cache.userGetSuffix(player.getName()) + "{MAGENTA}\".");
throw new CommandHelperAnswerException(list); throw new CommandAnswerException(list);
} }
} }
private void onCommandHubGroup(CommandSender sender, String[] args) throws CommandHelperAnswerException private void onCommandHubGroup(CommandSender sender, String[] args) throws CommandAnswerException
{ {
if(sender.hasPermission("rscp.admin") == false) if(sender.hasPermission("rscp.admin") == false)
throw new CommandHelperAnswerException("Not enough permissions."); throw new CommandAnswerException("Not enough permissions.");
final String[] help = new String[] final String[] help = new String[]
{ {
"rscPermissions command hub (group section).", "rscPermissions command hub (group section).",
@ -285,7 +276,7 @@ public class CommandHelper
"/rscp group <group> suffix [suffix]", "/rscp group <group> suffix [suffix]",
}; };
if(args.length < 3) if(args.length < 3)
throw new CommandHelperAnswerException(help); throw new CommandAnswerException(help);
final String group = args[1]; final String group = args[1];
final ArrayList<String> list = new ArrayList<>(); final ArrayList<String> list = new ArrayList<>();
switch(args[2].toLowerCase()) switch(args[2].toLowerCase())
@ -299,7 +290,7 @@ public class CommandHelper
} else } else
list.add("{MAGENTA}Prefix for group {_YL}" + group + list.add("{MAGENTA}Prefix for group {_YL}" + group +
" {MAGENTA}is \"{_R}" + plugin.cache.groupGetPrefix(group) + "{MAGENTA}\"."); " {MAGENTA}is \"{_R}" + plugin.cache.groupGetPrefix(group) + "{MAGENTA}\".");
throw new CommandHelperAnswerException(list); throw new CommandAnswerException(list);
case "suffix": case "suffix":
if(args.length > 3) if(args.length > 3)
{ {
@ -309,13 +300,13 @@ public class CommandHelper
} else } else
list.add("{MAGENTA}Suffix for group {_YL}" + group + list.add("{MAGENTA}Suffix for group {_YL}" + group +
" {MAGENTA}is \"{_R}" + plugin.cache.groupGetSuffix(group) + "{MAGENTA}\"."); " {MAGENTA}is \"{_R}" + plugin.cache.groupGetSuffix(group) + "{MAGENTA}\".");
throw new CommandHelperAnswerException(list); throw new CommandAnswerException(list);
} }
} }
private void onCommandHubLadder(CommandSender sender, String[] args) throws CommandHelperAnswerException private void onCommandHubLadder(CommandSender sender, String[] args) throws CommandAnswerException
{ {
if(sender.hasPermission("rscp.admin") == false) if(sender.hasPermission("rscp.admin") == false)
throw new CommandHelperAnswerException("Not enough permissions."); throw new CommandAnswerException("Not enough permissions.");
final String[] help = new String[] final String[] help = new String[]
{ {
"rscPermissions command hub (ladder section).", "rscPermissions command hub (ladder section).",
@ -324,8 +315,8 @@ public class CommandHelper
// "/rscp ladder <ladder> list users", // "/rscp ladder <ladder> list users",
}; };
if(args.length < 3) if(args.length < 3)
throw new CommandHelperAnswerException(help); throw new CommandAnswerException(help);
final String ladder = args[1]; final String ladder = args[1];
throw new CommandHelperAnswerException("dummy :p)"); throw new CommandAnswerException("dummy :p)");
} }
} }

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

@ -42,8 +42,6 @@ public class ConnectionHelper extends BackendMySQL
if(connection == null) if(connection == null)
return; return;
fetchIntoCache(plugin.cache); fetchIntoCache(plugin.cache);
if(plugin.settings.isRewardsEnabled())
fetchRewards(plugin.commandExecutor.rewardHelper);
// Update permissions for online players // Update permissions for online players
try try
{ {
@ -115,8 +113,8 @@ public class ConnectionHelper extends BackendMySQL
@Override @Override
public void run() public void run()
{ {
plugin.Message(sender, "Migration from PermissionsEx (MySQL backend) done!"); plugin.formattedMessage(sender, "Migration from PermissionsEx (MySQL backend) done!");
plugin.Message(sender, "Check the latest database row for new data."); plugin.formattedMessage(sender, "Check the latest database row for new data.");
} }
}); });
} catch(InterruptedException ex) { } catch(InterruptedException ex) {

2
src/main/java/ru/simsonic/rscPermissions/CommandHelperAnswerException.java → src/main/java/ru/simsonic/rscPermissions/DataTypes/CommandHelperAnswerException.java

@ -1,4 +1,4 @@
package ru.simsonic.rscPermissions; package ru.simsonic.rscPermissions.DataTypes;
import java.util.List; import java.util.List;
public class CommandHelperAnswerException extends Exception public class CommandHelperAnswerException extends Exception

18
src/main/java/ru/simsonic/rscPermissions/DataTypes/EntityType.java

@ -0,0 +1,18 @@
package ru.simsonic.rscPermissions.DataTypes;
public enum EntityType
{
group(0), player(1), unknown(-1);
private final int value;
private EntityType(int value)
{
this.value = value;
}
public static EntityType byValue(int value)
{
for(EntityType constant : EntityType.values())
if(constant.value == value)
return constant;
return unknown;
}
}

21
src/main/java/ru/simsonic/rscPermissions/DataTypes/RowEntity.java

@ -2,27 +2,8 @@ package ru.simsonic.rscPermissions.DataTypes;
public class RowEntity extends AbstractRow public class RowEntity extends AbstractRow
{ {
public enum EntityType
{
groupName(0),
playerName(1),
playerUniqueId(2),
unknown(-1);
public static EntityType byValue(int value)
{
for(EntityType constant : EntityType.values())
if(constant.value == value)
return constant;
return unknown;
}
private final int value;
private EntityType(int value)
{
this.value = value;
}
}
public String entity; public String entity;
public EntityType entity_type; public EntityType entityType;
public String prefix; public String prefix;
public String suffix; public String suffix;
@Override @Override

20
src/main/java/ru/simsonic/rscPermissions/DataTypes/RowInheritance.java

@ -1,17 +1,33 @@
package ru.simsonic.rscPermissions.DataTypes; package ru.simsonic.rscPermissions.DataTypes;
import java.sql.Timestamp; import java.sql.Timestamp;
import ru.simsonic.rscPermissions.DataTypes.RowEntity.EntityType; import java.util.Arrays;
import ru.simsonic.rscPermissions.Settings;
import ru.simsonic.utilities.LanguageUtility;
public class RowInheritance extends AbstractRow implements Comparable<RowInheritance> public class RowInheritance extends AbstractRow implements Comparable<RowInheritance>
{ {
public String entity; public String entity;
public String parent; public String parent;
public String instance; public String instance;
public EntityType child_type; public EntityType childType;
public int priority; public int priority;
public Destination destination; public Destination destination;
public int expirience; public int expirience;
public Timestamp lifetime; public Timestamp lifetime;
public void deriveInstance()
{
if(parent != null)
{
final String[] splitted = parent.split(Settings.separatorRegExp);
if(splitted.length > 1)
{
parent = LanguageUtility.glue(Arrays.copyOf(splitted, splitted.length - 1), Settings.separator);
instance = splitted[splitted.length - 1];
return;
}
}
instance = null;
}
@Override @Override
public int compareTo(RowInheritance t) public int compareTo(RowInheritance t)
{ {

3
src/main/java/ru/simsonic/rscPermissions/DataTypes/RowLadder.java

@ -1,10 +1,9 @@
package ru.simsonic.rscPermissions.DataTypes; package ru.simsonic.rscPermissions.DataTypes;
import ru.simsonic.rscPermissions.DataTypes.RowEntity.EntityType;
public class RowLadder extends AbstractRow implements Comparable<RowLadder> public class RowLadder extends AbstractRow implements Comparable<RowLadder>
{ {
public String climber; public String climber;
public EntityType climber_type; public EntityType climberType;
public String ladder; public String ladder;
public String instance; public String instance;
public int rank; public int rank;

3
src/main/java/ru/simsonic/rscPermissions/DataTypes/RowPermission.java

@ -1,11 +1,10 @@
package ru.simsonic.rscPermissions.DataTypes; package ru.simsonic.rscPermissions.DataTypes;
import java.sql.Timestamp; import java.sql.Timestamp;
import ru.simsonic.rscPermissions.DataTypes.RowEntity.EntityType;
public class RowPermission extends AbstractRow public class RowPermission extends AbstractRow
{ {
public String entity; public String entity;
public EntityType entity_type; public EntityType entityType;
public String permission; public String permission;
public boolean value; public boolean value;
public Destination destination; public Destination destination;

17
src/main/java/ru/simsonic/rscPermissions/DataTypes/RowReward.java

@ -1,17 +0,0 @@
package ru.simsonic.rscPermissions.DataTypes;
import java.sql.Timestamp;
public class RowReward
{
public int id;
public String user;
public String code;
public boolean activated;
public Timestamp activated_timestamp;
public String execute_commands;
public String command_permissions;
public String add_group;
public String add_group_destination;
public int add_group_expirience;
public String add_group_interval;
}

6
src/main/java/ru/simsonic/rscPermissions/DataTypes/RowServer.java

@ -1,6 +0,0 @@
package ru.simsonic.rscPermissions.DataTypes;
public class RowServer
{
public String serverId;
}

367
src/main/java/ru/simsonic/rscPermissions/Frontends/VaultChat.java

@ -0,0 +1,367 @@
package ru.simsonic.rscPermissions.Frontends;
import net.milkbowl.vault.permission.Permission;
import org.bukkit.OfflinePlayer;
import org.bukkit.World;
import org.bukkit.entity.Player;
import ru.simsonic.rscPermissions.MainPluginClass;
public final class VaultChat extends net.milkbowl.vault.chat.Chat
{
private final MainPluginClass rscp;
public VaultChat(MainPluginClass plugin, Permission perms)
{
super(perms);
this.rscp = plugin;
}
@Override
public String getName()
{
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
@Override
public boolean isEnabled()
{
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
@Override
public String getPlayerPrefix(String world, String player)
{
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
@Override
public void setPlayerPrefix(String world, String player, String prefix)
{
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
@Override
public String getPlayerSuffix(String world, String player)
{
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
@Override
public void setPlayerSuffix(String world, String player, String suffix)
{
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
@Override
public String getGroupPrefix(String world, String group)
{
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
@Override
public void setGroupPrefix(String world, String group, String prefix)
{
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
@Override
public String getGroupSuffix(String world, String group)
{
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
@Override
public void setGroupSuffix(String world, String group, String suffix)
{
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
@Override
public int getPlayerInfoInteger(String world, String player, String node, int defaultValue)
{
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
@Override
public void setPlayerInfoInteger(String world, String player, String node, int value)
{
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
@Override
public int getGroupInfoInteger(String world, String group, String node, int defaultValue)
{
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
@Override
public void setGroupInfoInteger(String world, String group, String node, int value)
{
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
@Override
public double getPlayerInfoDouble(String world, String player, String node, double defaultValue)
{
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
@Override
public void setPlayerInfoDouble(String world, String player, String node, double value)
{
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
@Override
public double getGroupInfoDouble(String world, String group, String node, double defaultValue)
{
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
@Override
public void setGroupInfoDouble(String world, String group, String node, double value)
{
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
@Override
public boolean getPlayerInfoBoolean(String world, String player, String node, boolean defaultValue)
{
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
@Override
public void setPlayerInfoBoolean(String world, String player, String node, boolean value)
{
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
@Override
public boolean getGroupInfoBoolean(String world, String group, String node, boolean defaultValue)
{
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
@Override
public void setGroupInfoBoolean(String world, String group, String node, boolean value)
{
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
@Override
public String getPlayerInfoString(String world, String player, String node, String defaultValue)
{
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
@Override
public void setPlayerInfoString(String world, String player, String node, String value)
{
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
@Override
public String getGroupInfoString(String world, String group, String node, String defaultValue)
{
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
@Override
public void setGroupInfoString(String world, String group, String node, String value)
{
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
@Override
public String getPlayerPrefix(String world, OfflinePlayer player)
{
return getPlayerPrefix(world, player.getName());
}
@Override
public String getPlayerPrefix(Player player)
{
return getPlayerPrefix(player.getWorld().getName(), player);
}
@Override
public void setPlayerPrefix(String world, OfflinePlayer player, String prefix)
{
setPlayerPrefix(world, player.getName(), prefix);
}
@Override
public void setPlayerPrefix(Player player, String prefix)
{
setPlayerPrefix(player.getWorld().getName(), player, prefix);
}
@Override
public String getPlayerSuffix(String world, OfflinePlayer player)
{
return getPlayerSuffix(world, player.getName());
}
@Override
public String getPlayerSuffix(Player player)
{
return getPlayerSuffix(player.getWorld().getName(), player);
}
@Override
public void setPlayerSuffix(String world, OfflinePlayer player, String suffix)
{
setPlayerSuffix(world, player.getName(), suffix);
}
@Override
public void setPlayerSuffix(Player player, String suffix)
{
setPlayerSuffix(player.getWorld().getName(), player, suffix);
}
@Override
public String getGroupPrefix(World world, String group)
{
return getGroupPrefix(world.getName(), group);
}
@Override
public void setGroupPrefix(World world, String group, String prefix)
{
setGroupPrefix(world.getName(), group, prefix);
}
@Override
public String getGroupSuffix(World world, String group)
{
return getGroupSuffix(world.getName(), group);
}
@Override
public void setGroupSuffix(World world, String group, String suffix)
{
setGroupSuffix(world.getName(), group, suffix);
}
@Override
public int getPlayerInfoInteger(String world, OfflinePlayer player, String node, int defaultValue)
{
return getPlayerInfoInteger(world, player.getName(), node, defaultValue);
}
@Override
public int getPlayerInfoInteger(Player player, String node, int defaultValue)
{
return getPlayerInfoInteger(player.getWorld().getName(), player, node, defaultValue);
}
@Override
public void setPlayerInfoInteger(String world, OfflinePlayer player, String node, int value)
{
setPlayerInfoInteger(world, player.getName(), node, value);
}
@Override
public void setPlayerInfoInteger(Player player, String node, int value)
{
setPlayerInfoInteger(player.getWorld().getName(), player, node, value);
}
@Override
public int getGroupInfoInteger(World world, String group, String node, int defaultValue)
{
return getGroupInfoInteger(world.getName(), group, node, defaultValue);
}
@Override
public void setGroupInfoInteger(World world, String group, String node, int value)
{
setGroupInfoInteger(world.getName(), group, node, value);
}
@Override
public double getPlayerInfoDouble(String world, OfflinePlayer player, String node, double defaultValue)
{
return getPlayerInfoDouble(world, player.getName(), node, defaultValue);
}
@Override
public double getPlayerInfoDouble(Player player, String node, double defaultValue)
{
return getPlayerInfoDouble(player.getWorld().getName(), player, node, defaultValue);
}
@Override
public void setPlayerInfoDouble(String world, OfflinePlayer player, String node, double value)
{
setPlayerInfoDouble(world, player.getName(), node, value);
}
@Override
public void setPlayerInfoDouble(Player player, String node, double value)
{
setPlayerInfoDouble(player.getWorld().getName(), player, node, value);
}
@Override
public double getGroupInfoDouble(World world, String group, String node, double defaultValue)
{
return getGroupInfoDouble(world.getName(), group, node, defaultValue);
}
@Override
public void setGroupInfoDouble(World world, String group, String node, double value)
{
setGroupInfoDouble(world.getName(), group, node, value);
}
@Override
public boolean getPlayerInfoBoolean(String world, OfflinePlayer player, String node, boolean defaultValue)
{
return getPlayerInfoBoolean(world, player.getName(), node, defaultValue);
}
@Override
public boolean getPlayerInfoBoolean(Player player, String node, boolean defaultValue)
{
return getPlayerInfoBoolean(player.getWorld().getName(), player, node, defaultValue);
}
@Override
public void setPlayerInfoBoolean(String world, OfflinePlayer player, String node, boolean value)
{
setPlayerInfoBoolean(world, player.getName(), node, value);
}
@Override
public void setPlayerInfoBoolean(Player player, String node, boolean value)
{
setPlayerInfoBoolean(player.getWorld().getName(), player, node, value);
}
@Override
public boolean getGroupInfoBoolean(World world, String group, String node, boolean defaultValue)
{
return getGroupInfoBoolean(world.getName(), group, node, defaultValue);
}
@Override
public void setGroupInfoBoolean(World world, String group, String node, boolean value)
{
setGroupInfoBoolean(world.getName(), group, node, value);
}
@Override
public String getPlayerInfoString(String world, OfflinePlayer player, String node, String defaultValue)
{
return getPlayerInfoString(world, player.getName(), node, defaultValue);
}
@Override
public String getPlayerInfoString(Player player, String node, String defaultValue)
{
return getPlayerInfoString(player.getWorld().getName(), player, node, defaultValue);
}
@Override
public void setPlayerInfoString(String world, OfflinePlayer player, String node, String value)
{
setPlayerInfoString(world, player.getName(), node, value);
}
@Override
public void setPlayerInfoString(Player player, String node, String value)
{
setPlayerInfoString(player.getWorld().getName(), player, node, value);
}
@Override
public String getGroupInfoString(World world, String group, String node, String defaultValue)
{
return getGroupInfoString(world.getName(), group, node, defaultValue);
}
@Override
public void setGroupInfoString(World world, String group, String node, String value)
{
setGroupInfoString(world.getName(), group, node, value);
}
@Override
public boolean playerInGroup(String world, OfflinePlayer player, String group)
{
// return perms.playerInGroup(world, player, group);
return false;
}
@Override
public boolean playerInGroup(Player player, String group)
{
// return playerInGroup(player.getWorld().getName(), player, group);
return false;
}
@Override
public String[] getPlayerGroups(String world, OfflinePlayer player)
{
// return perms.getPlayerGroups(world, player);
return null;
}
@Override
public String[] getPlayerGroups(Player player)
{
// return getPlayerGroups(player.getWorld().getName(), player);
return null;
}
@Override
public String getPrimaryGroup(String world, OfflinePlayer player)
{
// return perms.getPrimaryGroup(world, player);
return "";
}
@Override
public String getPrimaryGroup(Player player)
{
return getPrimaryGroup(player.getWorld().getName(), player);
}
@Override
public String[] getGroups()
{
// return perms.getGroups();
return null;
}
}

289
src/main/java/ru/simsonic/rscPermissions/Frontends/VaultPermission.java

@ -0,0 +1,289 @@
package ru.simsonic.rscPermissions.Frontends;
import org.bukkit.OfflinePlayer;
import org.bukkit.World;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
import org.bukkit.permissions.PermissionAttachment;
import org.bukkit.permissions.PermissionAttachmentInfo;
import ru.simsonic.rscPermissions.MainPluginClass;
public class VaultPermission extends net.milkbowl.vault.permission.Permission
{
private final MainPluginClass rscp;
public VaultPermission(MainPluginClass plugin)
{
this.rscp = plugin;
}
@Override
public String getName()
{
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
@Override
public boolean isEnabled()
{
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
@Override
public boolean hasSuperPermsCompat()
{
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
@Override
public boolean playerHas(String world, String player, String permission)
{
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
@Override
public boolean playerAdd(String world, String player, String permission)
{
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
@Override
public boolean playerRemove(String world, String player, String permission)
{
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
@Override
public boolean groupHas(String world, String group, String permission)
{
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
@Override
public boolean groupAdd(String world, String group, String permission)
{
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
@Override
public boolean groupRemove(String world, String group, String permission)
{
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
@Override
public boolean playerInGroup(String world, String player, String group)
{
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
@Override
public boolean playerAddGroup(String world, String player, String group)
{
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
@Override
public boolean playerRemoveGroup(String world, String player, String group)
{
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
@Override
public String[] getPlayerGroups(String world, String player)
{
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
@Override
public String getPrimaryGroup(String world, String player)
{
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
@Override
public String[] getGroups()
{
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
@Override
public boolean hasGroupSupport()
{
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
@Override
public boolean has(CommandSender sender, String permission)
{
return sender.hasPermission(permission);
}
@Override
public boolean has(Player player, String permission)
{
return player.hasPermission(permission);
}
@Override
public boolean playerHas(String world, OfflinePlayer player, String permission)
{
if(world == null)
return has((String)null, player.getName(), permission);
return has(world, player.getName(), permission);
}
@Override
public boolean playerHas(Player player, String permission)
{
return has(player, permission);
}
@Override
public boolean playerAdd(String world, OfflinePlayer player, String permission)
{
if(world == null)
return playerAdd((String)null, player.getName(), permission);
return playerAdd(world, player.getName(), permission);
}
@Override
public boolean playerAdd(Player player, String permission)
{
return playerAdd(player.getWorld().getName(), player, permission);
}
@Override
public boolean playerAddTransient(OfflinePlayer player, String permission) throws UnsupportedOperationException
{
if(player.isOnline())
return playerAddTransient((Player)player, permission);
throw new UnsupportedOperationException(getName() + " does not support offline player transient permissions!");
}
@Override
public boolean playerAddTransient(Player player, String permission)
{
for(PermissionAttachmentInfo paInfo : player.getEffectivePermissions())
if(paInfo.getAttachment() != null && paInfo.getAttachment().getPlugin().equals(plugin))
{
paInfo.getAttachment().setPermission(permission, true);
return true;
}
PermissionAttachment attach = player.addAttachment(plugin);
attach.setPermission(permission, true);
return true;
}
@Override
public boolean playerAddTransient(String worldName, OfflinePlayer player, String permission)
{
return playerAddTransient(worldName, player.getName(), permission);
}
@Override
public boolean playerAddTransient(String worldName, Player player, String permission)
{
return playerAddTransient(player, permission);
}
@Override
public boolean playerRemoveTransient(String worldName, OfflinePlayer player, String permission)
{
return playerRemoveTransient(worldName, player.getName(), permission);
}
@Override
public boolean playerRemoveTransient(String worldName, Player player, String permission)
{
return playerRemoveTransient(worldName, (OfflinePlayer)player, permission);
}
@Override
public boolean playerRemove(String world, OfflinePlayer player, String permission)
{
if(world == null)
return playerRemove((String)null, player.getName(), permission);
return playerRemove(world, player.getName(), permission);
}
@Deprecated
@Override
public boolean playerRemove(World world, String player, String permission)
{
if(world == null)
return playerRemove((String)null, player, permission);
return playerRemove(world.getName(), player, permission);
}
@Override
public boolean playerRemove(Player player, String permission)
{
return playerRemove(player.getWorld().getName(), player, permission);
}
@Override
public boolean playerRemoveTransient(OfflinePlayer player, String permission)
{
if(player.isOnline())
return playerRemoveTransient((Player)player, permission);
else
return false;
}
@Override
public boolean playerRemoveTransient(Player player, String permission)
{
for(PermissionAttachmentInfo paInfo : player.getEffectivePermissions())
if(paInfo.getAttachment() != null && paInfo.getAttachment().getPlugin().equals(plugin))
{
paInfo.getAttachment().unsetPermission(permission);
return true;
}
return false;
}
@Override
public boolean groupHas(World world, String group, String permission)
{
if(world == null)
return groupHas((String)null, group, permission);
return groupHas(world.getName(), group, permission);
}
@Override
public boolean groupAdd(World world, String group, String permission)
{
if(world == null)
return groupAdd((String)null, group, permission);
return groupAdd(world.getName(), group, permission);
}
@Override
public boolean groupRemove(World world, String group, String permission)
{
if(world == null)
return groupRemove((String)null, group, permission);
return groupRemove(world.getName(), group, permission);
}
@Override
public boolean playerInGroup(String world, OfflinePlayer player, String group)
{
if(world == null)
return playerInGroup((String)null, player.getName(), group);
return playerInGroup(world, player.getName(), group);
}
@Override
public boolean playerInGroup(Player player, String group)
{
return playerInGroup(player.getWorld().getName(), player, group);
}
@Override
public boolean playerAddGroup(String world, OfflinePlayer player, String group)
{
if(world == null)
return playerAddGroup((String)null, player.getName(), group);
return playerAddGroup(world, player.getName(), group);
}
@Override
public boolean playerAddGroup(Player player, String group)
{
return playerAddGroup(player.getWorld().getName(), player, group);
}
@Override
public boolean playerRemoveGroup(String world, OfflinePlayer player, String group)
{
if(world == null)
return playerRemoveGroup((String)null, player.getName(), group);
return playerRemoveGroup(world, player.getName(), group);
}
@Override
public boolean playerRemoveGroup(Player player, String group)
{
return playerRemoveGroup(player.getWorld().getName(), player, group);
}
@Override
public String[] getPlayerGroups(String world, OfflinePlayer player)
{
return getPlayerGroups(world, player.getName());
}
@Override
public String[] getPlayerGroups(Player player)
{
return getPlayerGroups(player.getWorld().getName(), player);
}
@Override
public String getPrimaryGroup(String world, OfflinePlayer player)
{
return getPrimaryGroup(world, player.getName());
}
@Override
public String getPrimaryGroup(Player player)
{
return getPrimaryGroup(player.getWorld().getName(), player);
}
}

13
src/main/java/ru/simsonic/rscPermissions/InternalCache/AbstractPermissionsCache.java

@ -0,0 +1,13 @@
package ru.simsonic.rscPermissions.InternalCache;
import ru.simsonic.rscPermissions.DataTypes.RowEntity;
import ru.simsonic.rscPermissions.DataTypes.RowInheritance;
import ru.simsonic.rscPermissions.DataTypes.RowLadder;
import ru.simsonic.rscPermissions.DataTypes.RowPermission;
public interface AbstractPermissionsCache
{
public int ImportEntities(RowEntity[] rows);
public int ImportPermissions(RowPermission[] rows);
public int ImportInheritance(RowInheritance[] rows);
public int ImportLadders(RowLadder[] rows);
}

4
src/main/java/ru/simsonic/rscPermissions/AsyncPlayerInfo.java → src/main/java/ru/simsonic/rscPermissions/InternalCache/AsyncPlayerInfo.java

@ -1,11 +1,11 @@
package ru.simsonic.rscPermissions; package ru.simsonic.rscPermissions.InternalCache;
import java.util.Set; import java.util.Set;
import java.util.UUID; import java.util.UUID;
import org.bukkit.Location; import org.bukkit.Location;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import ru.simsonic.rscPermissions.DataTypes.RowInheritance; import ru.simsonic.rscPermissions.DataTypes.RowInheritance;
import ru.simsonic.rscPermissions.DataTypes.RowPermission; import ru.simsonic.rscPermissions.DataTypes.RowPermission;
import ru.simsonic.rscPermissions.LocalCacheTree.ResolutionLeaf; import ru.simsonic.rscPermissions.InternalCache.LocalCacheTree.ResolutionLeaf;
public class AsyncPlayerInfo public class AsyncPlayerInfo
{ {

230
src/main/java/ru/simsonic/rscPermissions/InternalCache/BrandNewCache.java

@ -0,0 +1,230 @@
package ru.simsonic.rscPermissions.InternalCache;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Set;
import org.bukkit.entity.Player;
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.MainPluginClass;
public class BrandNewCache implements AbstractPermissionsCache
{
protected final MainPluginClass plugin;
protected BrandNewCache(MainPluginClass rscp)
{
this.plugin = rscp;
}
protected final RowInheritance defaultInheritance = new RowInheritance();
public void setDefaultGroup(String defaultGroup)
{
defaultInheritance.parent = defaultGroup;
defaultInheritance.deriveInstance();
}
protected final HashMap<String, RowEntity> entities_g = new HashMap<>();
protected final HashMap<String, RowEntity> entities_u = new HashMap<>();
protected final ArrayList<RowPermission> permissions_p2g = new ArrayList<>();
protected final ArrayList<RowPermission> permissions_p2u = new ArrayList<>();
protected final ArrayList<RowInheritance> inheritance_g2g = new ArrayList<>();
protected final ArrayList<RowInheritance> inheritance_g2u = new ArrayList<>();
protected final ArrayList<RowLadder> ladders_g = new ArrayList<>();
protected final ArrayList<RowLadder> ladders_u = new ArrayList<>();
public static class InheritanceLeaf implements Comparable<InheritanceLeaf>
{
public RowInheritance node;
public String instantiator;
public InheritanceLeaf[] subleafs;
public String resolvedPrefix;
public String resolvedSuffix;
@Override
public int compareTo(InheritanceLeaf other)
{
return (other.node != null && node != null) ? other.node.compareTo(node) : 0;
}
}
public static class ResolutionParams
{
public String[] applicableIdentifiers;
public String[] destRegions;
public String destWorld;
public String destServerId;
}
public static class ResolutionResult
{
public String prefix;
public String suffix;
public RowPermission[] permissions;
}
final HashMap<String, InheritanceLeaf> entityTrees = new HashMap<>();
// Права по сущностям
final HashMap<String, RowPermission[]> groupPermissions = new HashMap<>();
final HashMap<String, RowPermission[]> playerPermissions = new HashMap<>();
private void buildEntityTree()
{
final HashSet<String> entitiesWhichInherits = new HashSet<>();
for(RowInheritance row : inheritance_g2u)
entitiesWhichInherits.add(row.entity);
for(String inheritingEntity : entitiesWhichInherits)
{
final ArrayList<RowInheritance> entityDirectParents = new ArrayList<>();
for(RowInheritance row : inheritance_g2u)
if(row.entity.equalsIgnoreCase(inheritingEntity))
entityDirectParents.add(row);
Collections.sort(entityDirectParents);
for(RowInheritance row : entityDirectParents)
this.entityTrees.put(inheritingEntity, buildBranch(row));
}
}
private InheritanceLeaf buildBranch(RowInheritance source)
{
final InheritanceLeaf result = new InheritanceLeaf();
result.node = source;
result.instantiator = source.instance;
final String entityName = source.entity.toLowerCase();
if(entities_g.containsKey(entityName))
{
result.resolvedPrefix = entities_g.get(entityName).prefix;
result.resolvedSuffix = entities_g.get(entityName).suffix;
}
final ArrayList<RowInheritance> parents = new ArrayList<>();
for(RowInheritance row : inheritance_g2g)
if(row.parent.equalsIgnoreCase(source.entity))
parents.add(row);
Collections.sort(parents);
final ArrayList<InheritanceLeaf> subleafs = new ArrayList<>();
for(RowInheritance row : parents)
subleafs.add(buildBranch(row));
result.subleafs = subleafs.toArray(new InheritanceLeaf[subleafs.size()]);
return result;
}
private static String[] getPlayerIdentifiers(Player player)
{
final ArrayList<String> result = new ArrayList<>();
// For old servers Player's name can be used as entity name
try
{
// minecraft <= 1.7.x
result.add(player.getName());
} catch(RuntimeException | NoSuchMethodError ex) {
// minecraft >= 1.8
}
// For newest servers Player's UUID is used as entity name
try
{
// minecraft >= 1.8
result.add(player.getUniqueId().toString().toLowerCase());
} catch(RuntimeException | NoSuchMethodError ex) {
// minecraft <= 1.7.x
}
// IP address of a Player can be used as entity name too
result.add(player.getAddress().getAddress().getHostAddress());
return result.toArray(new String[result.size()]);
}
public void resolvePlayer(Player player)
{
final ResolutionParams params = new ResolutionParams();
params.applicableIdentifiers = getPlayerIdentifiers(player);
if(plugin.regionListProvider != null)
{
Set<String> regionSet = plugin.regionListProvider.GetRegionList(player);
params.destRegions = regionSet.toArray(new String[regionSet.size()]);
} else
params.destRegions = new String[] {};
params.destWorld = player.getLocation().getWorld().getName();
params.destServerId = plugin.getServer().getServerId();
// TO DO
}
public void resolvePlayer(String player)
{
final ResolutionParams params = new ResolutionParams();
params.applicableIdentifiers = new String[] { player };
params.destRegions = new String[] {};
params.destWorld = "";
params.destServerId = plugin.getServer().getServerId();
// TO DO
}
private void resolvePlayer(ResolutionParams params)
{
final ArrayList<InheritanceLeaf> leafs = new ArrayList<>();
for(String identifier : params.applicableIdentifiers)
for(String tree : entityTrees.keySet())
if(tree.equals(identifier))
leafs.add(entityTrees.get(tree));
Collections.sort(leafs);
final InheritanceLeaf root = new InheritanceLeaf();
}
public void recoursion(ResolutionParams params, InheritanceLeaf branch)
{
for(InheritanceLeaf leaf : branch.subleafs)
{
}
}
@Override
public synchronized int ImportEntities(RowEntity[] rows)
{
entities_g.clear();
entities_u.clear();
if(rows == null)
return 0;
for(RowEntity row : rows)
{
if(row.entityType == EntityType.group)
entities_g.put(row.entity.toLowerCase(), row);
else
entities_u.put(row.entity.toLowerCase(), row);
}
return entities_g.size() + entities_u.size();
}
@Override
public synchronized int ImportPermissions(RowPermission[] rows)
{
permissions_p2g.clear();
permissions_p2u.clear();
if(rows == null)
return 0;
for(RowPermission row : rows)
{
if(row.entityType == EntityType.group)
permissions_p2g.add(row);
else
permissions_p2u.add(row);
}
return permissions_p2g.size() + permissions_p2u.size();
}
@Override
public synchronized int ImportInheritance(RowInheritance[] rows)
{
inheritance_g2g.clear();
inheritance_g2u.clear();
if(rows == null)
return 0;
for(RowInheritance row : rows)
{
if(row.childType == EntityType.group)
inheritance_g2g.add(row);
else
inheritance_g2u.add(row);
}
return inheritance_g2g.size() + inheritance_g2u.size();
}
@Override
public synchronized int ImportLadders(RowLadder[] rows)
{
ladders_g.clear();
ladders_u.clear();
if(rows == null)
return 0;
for(RowLadder row : rows)
{
if(row.climberType == EntityType.group)
ladders_g.add(row);
else
ladders_u.add(row);
}
return ladders_g.size() + ladders_u.size();
}
}

23
src/main/java/ru/simsonic/rscPermissions/LocalCacheData.java → src/main/java/ru/simsonic/rscPermissions/InternalCache/LocalCacheData.java

@ -1,10 +1,10 @@
package ru.simsonic.rscPermissions; package ru.simsonic.rscPermissions.InternalCache;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap; import java.util.HashMap;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
import ru.simsonic.rscPermissions.DataTypes.*; import ru.simsonic.rscPermissions.DataTypes.*;
import ru.simsonic.rscPermissions.DataTypes.RowEntity.EntityType; import ru.simsonic.rscPermissions.DataTypes.EntityType;
import ru.simsonic.rscPermissions.MainPluginClass;
public class LocalCacheData public class LocalCacheData
{ {
@ -19,7 +19,6 @@ public class LocalCacheData
protected final ArrayList<RowInheritance> inheritance_g2u = new ArrayList<>(); protected final ArrayList<RowInheritance> inheritance_g2u = new ArrayList<>();
protected final ArrayList<RowLadder> ladders_g = new ArrayList<>(); protected final ArrayList<RowLadder> ladders_g = new ArrayList<>();
protected final ArrayList<RowLadder> ladders_u = new ArrayList<>(); protected final ArrayList<RowLadder> ladders_u = new ArrayList<>();
protected final ArrayList<RowServer> servers = new ArrayList<>();
protected LocalCacheData(MainPluginClass rscp) protected LocalCacheData(MainPluginClass rscp)
{ {
this.plugin = rscp; this.plugin = rscp;
@ -32,7 +31,7 @@ public class LocalCacheData
return 0; return 0;
for(RowEntity row : rows) for(RowEntity row : rows)
{ {
if(row.entity_type == EntityType.groupName) if(row.entityType == EntityType.group)
entities_g.put(row.entity.toLowerCase(), row); entities_g.put(row.entity.toLowerCase(), row);
else else
entities_u.put(row.entity.toLowerCase(), row); entities_u.put(row.entity.toLowerCase(), row);
@ -47,7 +46,7 @@ public class LocalCacheData
return 0; return 0;
for(RowPermission row : rows) for(RowPermission row : rows)
{ {
if(row.entity_type == EntityType.groupName) if(row.entityType == EntityType.group)
permissions_p2g.add(row); permissions_p2g.add(row);
else else
permissions_p2u.add(row); permissions_p2u.add(row);
@ -62,7 +61,7 @@ public class LocalCacheData
return 0; return 0;
for(RowInheritance row : rows) for(RowInheritance row : rows)
{ {
if(row.child_type == EntityType.groupName) if(row.childType == EntityType.group)
inheritance_g2g.add(row); inheritance_g2g.add(row);
else else
inheritance_g2u.add(row); inheritance_g2u.add(row);
@ -77,19 +76,11 @@ public class LocalCacheData
return 0; return 0;
for(RowLadder row : rows) for(RowLadder row : rows)
{ {
if(row.climber_type == EntityType.groupName) if(row.climberType == EntityType.group)
ladders_g.add(row); ladders_g.add(row);
else else
ladders_u.add(row); ladders_u.add(row);
} }
return ladders_g.size() + ladders_u.size(); return ladders_g.size() + ladders_u.size();
} }
public synchronized int ImportServers(RowServer[] rows)
{
servers.clear();
if(rows == null)
return 0;
servers.addAll(Arrays.asList(rows));
return servers.size();
}
} }

4
src/main/java/ru/simsonic/rscPermissions/LocalCacheFunctions.java → src/main/java/ru/simsonic/rscPermissions/InternalCache/LocalCacheFunctions.java

@ -1,4 +1,4 @@
package ru.simsonic.rscPermissions; package ru.simsonic.rscPermissions.InternalCache;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
import java.util.HashSet; import java.util.HashSet;
@ -7,6 +7,8 @@ import ru.simsonic.rscPermissions.DataTypes.RowEntity;
import ru.simsonic.rscPermissions.DataTypes.RowInheritance; import ru.simsonic.rscPermissions.DataTypes.RowInheritance;
import ru.simsonic.rscPermissions.DataTypes.RowLadder; import ru.simsonic.rscPermissions.DataTypes.RowLadder;
import ru.simsonic.rscPermissions.DataTypes.RowPermission; import ru.simsonic.rscPermissions.DataTypes.RowPermission;
import ru.simsonic.rscPermissions.MainPluginClass;
import ru.simsonic.rscPermissions.Settings;
public class LocalCacheFunctions extends LocalCacheTree public class LocalCacheFunctions extends LocalCacheTree
{ {

22
src/main/java/ru/simsonic/rscPermissions/LocalCacheTree.java → src/main/java/ru/simsonic/rscPermissions/InternalCache/LocalCacheTree.java

@ -1,4 +1,4 @@
package ru.simsonic.rscPermissions; package ru.simsonic.rscPermissions.InternalCache;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
import java.util.HashMap; import java.util.HashMap;
@ -10,6 +10,8 @@ import ru.simsonic.rscPermissions.DataTypes.RowEntity;
import ru.simsonic.rscPermissions.DataTypes.RowInheritance; import ru.simsonic.rscPermissions.DataTypes.RowInheritance;
import ru.simsonic.rscPermissions.DataTypes.RowLadder; import ru.simsonic.rscPermissions.DataTypes.RowLadder;
import ru.simsonic.rscPermissions.DataTypes.RowPermission; import ru.simsonic.rscPermissions.DataTypes.RowPermission;
import ru.simsonic.rscPermissions.MainPluginClass;
import ru.simsonic.rscPermissions.Settings;
import ru.simsonic.utilities.LanguageUtility; import ru.simsonic.utilities.LanguageUtility;
public class LocalCacheTree extends LocalCacheData public class LocalCacheTree extends LocalCacheData
@ -24,19 +26,13 @@ public class LocalCacheTree extends LocalCacheData
{ {
super(rscp); super(rscp);
} }
protected final ConcurrentHashMap<String, ArrayList<ResolutionLeaf>> mapTrees = new ConcurrentHashMap<>(); public final ConcurrentHashMap<String, ArrayList<ResolutionLeaf>> mapTrees = new ConcurrentHashMap<>();
protected final ConcurrentHashMap<String, HashMap<String, Boolean>> mapPermissions = new ConcurrentHashMap<>(); public final ConcurrentHashMap<String, HashMap<String, Boolean>> mapPermissions = new ConcurrentHashMap<>();
protected final RowInheritance defaultInheritance = new RowInheritance(); protected final RowInheritance defaultInheritance = new RowInheritance();
public void updateDefaultInheritance() public void setDefaultGroup(String defaultGroup)
{ {
defaultInheritance.parent = plugin.settings.getDefaultGroup(); defaultInheritance.parent = defaultGroup;
String[] breaked = defaultInheritance.parent.split(Settings.separatorRegExp); defaultInheritance.deriveInstance();
if(breaked.length == 2)
{
defaultInheritance.parent = breaked[0];
defaultInheritance.instance = breaked[1];
} else
defaultInheritance.instance = null;
} }
public synchronized void clear() public synchronized void clear()
{ {
@ -87,7 +83,7 @@ public class LocalCacheTree extends LocalCacheData
final AsyncPlayerInfo api = new AsyncPlayerInfo(player, plugin.regionListProvider.GetRegionList(player)); final AsyncPlayerInfo api = new AsyncPlayerInfo(player, plugin.regionListProvider.GetRegionList(player));
plugin.recalculatingPlayers.offer(api); plugin.recalculatingPlayers.offer(api);
} }
protected synchronized HashMap<String, Boolean> treeToPermissions(AsyncPlayerInfo p2rc) public synchronized HashMap<String, Boolean> treeToPermissions(AsyncPlayerInfo p2rc)
{ {
final HashMap<String, Boolean> permissions = new HashMap<>(); final HashMap<String, Boolean> permissions = new HashMap<>();
String prefix = ""; String prefix = "";

2
src/main/java/ru/simsonic/rscPermissions/Ladders.java

@ -114,7 +114,7 @@ public class Ladders
"{GOLD}on" "{GOLD}on"
) : "removed from" ) : "removed from"
) + " the ladder {_LG}" + position.ladder + ((instance != null) ? "{_DS}(" + instance + ")" : "") + "{GOLD}."; ) + " the ladder {_LG}" + position.ladder + ((instance != null) ? "{_DS}(" + instance + ")" : "") + "{GOLD}.";
plugin.Message(player, resultP); plugin.formattedMessage(player, resultP);
return new String [] { resultS }; return new String [] { resultS };
} }
} }

28
src/main/java/ru/simsonic/rscPermissions/MainPluginClass.java

@ -1,4 +1,6 @@
package ru.simsonic.rscPermissions; package ru.simsonic.rscPermissions;
import ru.simsonic.rscPermissions.InternalCache.LocalCacheFunctions;
import ru.simsonic.rscPermissions.InternalCache.AsyncPlayerInfo;
import java.io.IOException; import java.io.IOException;
import java.util.HashMap; import java.util.HashMap;
import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.LinkedBlockingQueue;
@ -21,6 +23,9 @@ import org.bukkit.permissions.PermissionAttachment;
import org.bukkit.plugin.java.JavaPlugin; import org.bukkit.plugin.java.JavaPlugin;
import org.bukkit.scheduler.BukkitScheduler; import org.bukkit.scheduler.BukkitScheduler;
import org.mcstats.MetricsLite; import org.mcstats.MetricsLite;
import ru.simsonic.rscPermissions.Frontends.VaultChat;
import ru.simsonic.rscPermissions.Frontends.VaultPermission;
import ru.simsonic.utilities.CommandAnswerException;
import ru.simsonic.utilities.LanguageUtility; import ru.simsonic.utilities.LanguageUtility;
import ru.simsonic.utilities.MovingPlayersCatcher; import ru.simsonic.utilities.MovingPlayersCatcher;
@ -43,6 +48,8 @@ public final class MainPluginClass extends JavaPlugin implements Listener
public final HashMap<Player, PermissionAttachment> attachments = new HashMap<>(); public final HashMap<Player, PermissionAttachment> attachments = new HashMap<>();
public final LinkedBlockingQueue<AsyncPlayerInfo> recalculatingPlayers = new LinkedBlockingQueue<>(); public final LinkedBlockingQueue<AsyncPlayerInfo> recalculatingPlayers = new LinkedBlockingQueue<>();
// private final HashSet<String> verbosePlayers = new HashSet<>(); // private final HashSet<String> verbosePlayers = new HashSet<>();
private final VaultPermission vaultP = new VaultPermission(this);
private final VaultChat vaultC = new VaultChat(this, vaultP);
@Override @Override
public void onLoad() public void onLoad()
{ {
@ -68,7 +75,7 @@ public final class MainPluginClass extends JavaPlugin implements Listener
// WorldGuard, Residence and other possible region list providers // WorldGuard, Residence and other possible region list providers
regionListProvider.integrate(); regionListProvider.integrate();
// Start all needed threads // Start all needed threads
cache.updateDefaultInheritance(); cache.setDefaultGroup(settings.getDefaultGroup());
StartRecalcThread(); StartRecalcThread();
RegionFinderThreadStart(); RegionFinderThreadStart();
connectionList.threadFetchTablesData(); connectionList.threadFetchTablesData();
@ -77,7 +84,7 @@ public final class MainPluginClass extends JavaPlugin implements Listener
{ {
updater = new Updater(this, projectNumberInDBO, this.getFile(), Updater.UpdateType.NO_DOWNLOAD, false); updater = new Updater(this, projectNumberInDBO, this.getFile(), Updater.UpdateType.NO_DOWNLOAD, false);
if(updater.getResult() == Updater.UpdateResult.UPDATE_AVAILABLE) if(updater.getResult() == Updater.UpdateResult.UPDATE_AVAILABLE)
infoAboutUpdate(getServer().getConsoleSender()); showAdminUpdateInfo(getServer().getConsoleSender());
else else
updater = null; updater = null;
} }
@ -95,7 +102,7 @@ public final class MainPluginClass extends JavaPlugin implements Listener
} }
consoleLog.info("[rscp] rscPermissions has been successfully enabled."); consoleLog.info("[rscp] rscPermissions has been successfully enabled.");
} }
private void infoAboutUpdate(CommandSender sender) private void showAdminUpdateInfo(CommandSender sender)
{ {
if(updater != null) if(updater != null)
{ {
@ -104,9 +111,9 @@ public final class MainPluginClass extends JavaPlugin implements Listener
consoleLog.info("[rscp] Update is available! Enter /rscp update to update plugin now."); consoleLog.info("[rscp] Update is available! Enter /rscp update to update plugin now.");
consoleLog.info("[rscp] Please be noted that after restart updated file will have name including old version."); consoleLog.info("[rscp] Please be noted that after restart updated file will have name including old version.");
} else if(sender.hasPermission("rscp.admin")) { } else if(sender.hasPermission("rscp.admin")) {
Message(sender, "Update is available: {_LB}" + updater.getLatestName() + "{GOLD}!"); formattedMessage(sender, "Update is available: {_LB}" + updater.getLatestName() + "{GOLD}!");
Message(sender, "Enter {_LG}/rscp update{GOLD} to update plugin now."); formattedMessage(sender, "Enter {_LG}/rscp update{GOLD} to update plugin now.");
Message(sender, "Please be noted that after restart updated file will have name including old version."); formattedMessage(sender, "Please be noted that after restart updated file will have name including old version.");
} }
} }
} }
@ -262,7 +269,7 @@ public final class MainPluginClass extends JavaPlugin implements Listener
try try
{ {
commandExecutor.onCommand(sender, cmd, label, args); commandExecutor.onCommand(sender, cmd, label, args);
} catch(CommandHelperAnswerException ex) { } catch(CommandAnswerException ex) {
for(String answer : ex.getMessageArray()) for(String answer : ex.getMessageArray())
sender.sendMessage(LanguageUtility.processStringStatic(chatPrefix + answer)); sender.sendMessage(LanguageUtility.processStringStatic(chatPrefix + answer));
} catch(NullPointerException ex) { } catch(NullPointerException ex) {
@ -288,10 +295,7 @@ public final class MainPluginClass extends JavaPlugin implements Listener
@org.bukkit.event.EventHandler @org.bukkit.event.EventHandler
public void onPlayerJoin(PlayerJoinEvent event) public void onPlayerJoin(PlayerJoinEvent event)
{ {
infoAboutUpdate(event.getPlayer()); showAdminUpdateInfo(event.getPlayer());
// Show list of player's rewards
if(settings.isRewardsEnabled())
commandExecutor.rewardHelper.executeReward(event.getPlayer(), null);
} }
@org.bukkit.event.EventHandler @org.bukkit.event.EventHandler
public void onPlayerExp(PlayerLevelChangeEvent event) public void onPlayerExp(PlayerLevelChangeEvent event)
@ -315,7 +319,7 @@ public final class MainPluginClass extends JavaPlugin implements Listener
attachments.remove(event.getPlayer()); attachments.remove(event.getPlayer());
regionListProvider.removePlayer(event.getPlayer()); regionListProvider.removePlayer(event.getPlayer());
} }
public void Message(CommandSender sender, String message) public void formattedMessage(CommandSender sender, String message)
{ {
if(message == null || "".equals(message)) if(message == null || "".equals(message))
return; return;

180
src/main/java/ru/simsonic/rscPermissions/Rewards.java

@ -1,180 +0,0 @@
package ru.simsonic.rscPermissions;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.logging.Level;
import org.bukkit.entity.Player;
import org.bukkit.permissions.PermissionAttachment;
import ru.simsonic.rscPermissions.DataTypes.RowReward;
import ru.simsonic.utilities.TimeIntervalParser;
public class Rewards
{
private static final String strCommandExecutorPlayer = "player:";
private static final String strCommandExecutorConsole = "console:";
private final MainPluginClass plugin;
public Rewards(MainPluginClass rscp)
{
this.plugin = rscp;
}
protected final HashMap<String, ArrayList<RowReward>> rewards = new HashMap<>();
public synchronized int ImportRewards(RowReward[] rows)
{
rewards.clear();
if(rows == null)
return 0;
int total_rewards = 0;
for(RowReward row : rows)
{
ArrayList<RowReward> userRewards = rewards.get(row.user.toLowerCase());
if(userRewards == null)
{
userRewards = new ArrayList<>();
rewards.put(row.user.toLowerCase(), userRewards);
}
userRewards.add(row);
total_rewards += 1;
}
return total_rewards;
}
public synchronized HashMap<String, Integer> getAvailableRewards(String user)
{
final HashMap<String, Integer> result = new HashMap<>();
ArrayList<RowReward> user_rewards = rewards.get(user.toLowerCase());
if(user_rewards != null)
for(RowReward reward : user_rewards)
result.put(reward.code, result.get(reward.code) + 1);
return result;
}
public synchronized RowReward getRewardDetails(String user, String code)
{
if((user == null) || (code == null))
return null;
if("".equals(user) || "".equals(code))
return null;
ArrayList<RowReward> user_rewards = rewards.get(user.toLowerCase());
for(RowReward row : user_rewards)
if(row.code.equalsIgnoreCase(code))
return row;
return null;
}
public void executeReward(final Player player, String reward)
{
if(plugin.settings.isRewardsEnabled() == false)
{
plugin.Message(player, "Rewards support has been disabled by administrator.");
return;
}
final HashMap<String, Integer> reward_list = getAvailableRewards(player.getName());
if(reward == null)
{
if(reward_list.isEmpty() == false)
{
String text = "";
for(String code : reward_list.keySet())
{
Integer count = reward_list.get(code);
text += ((count > 1) ? code + " (" + count.toString() + "), " : code + ", ");
}
plugin.Message(player, "Available rewards: {_R}" + text.substring(0, text.length() - 2) + ".");
}
else
plugin.Message(player, "No rewards available.");
return;
}
for(String code : reward_list.keySet())
if(code.equalsIgnoreCase(reward))
reward = code;
final String correctFinalReward = reward;
Integer count = reward_list.get(reward);
if(count != null)
{
Thread rewardExecutor = new Thread()
{
@Override
public void run()
{
Thread.currentThread().setName("rscp:Rewarder");
Thread.currentThread().setPriority(Thread.MIN_PRIORITY);
try
{
plugin.connectionList.threadFetchTablesData().join();
final RowReward details = getRewardDetails(player.getName(), correctFinalReward);
threadApplyReward(player, details);
plugin.connectionList.threadFetchTablesData().join();
} catch(InterruptedException ex) {
}
plugin.Message(player, "You have received reward \"" + correctFinalReward + "\"!");
}
};
rewardExecutor.start();
}
else
plugin.Message(player, "No such reward available for you.");
}
public void threadApplyReward(final Player player, final RowReward reward)
{
if((reward == null) || (player == null))
return;
if(reward.add_group != null)
{
if(reward.add_group_destination != null)
{
}
if(reward.add_group_expirience != 0)
{
}
if(reward.add_group_interval != null)
{
int seconds = TimeIntervalParser.parseTimeInterval(reward.add_group_interval);
}
}
if(reward.execute_commands != null)
{
final String[] commands = reward.execute_commands.split("[\r\n]+");
plugin.getServer().getScheduler().runTask(plugin, new Runnable()
{
@Override
public void run()
{
PermissionAttachment temporary = player.addAttachment(plugin);
if(reward.command_permissions != null)
{
String[] permissions = reward.command_permissions.split("[\r\n]+");
for(String permission : permissions)
{
MainPluginClass.consoleLog.log(Level.INFO, "[rscp] + temp perm: \"{0}\"", permission);
temporary.setPermission(permission, true);
}
}
player.recalculatePermissions();
for(String command : commands)
{
boolean bConsole = false;
if(command.toLowerCase().startsWith(strCommandExecutorConsole))
{
command = command.substring(strCommandExecutorConsole.length());
bConsole = true;
}
if(command.toLowerCase().startsWith(strCommandExecutorPlayer))
{
command = command.substring(strCommandExecutorPlayer.length());
bConsole = false;
}
MainPluginClass.consoleLog.log(Level.INFO,
"[rscp] Reward \"{0}\" for user \"{1}\" executes command:\n{2} /{3}", new Object[]
{
reward.code,
player.getName(),
bConsole ? strCommandExecutorConsole : strCommandExecutorPlayer,
command,
});
plugin.getServer().dispatchCommand(bConsole ? plugin.getServer().getConsoleSender() : player, command);
player.sendMessage("You've received reward \"" + reward.code + "\".");
}
player.removeAttachment(temporary);
player.recalculatePermissions();
}
});
}
}
}

18
src/main/java/ru/simsonic/rscPermissions/Settings.java

@ -14,14 +14,13 @@ public class Settings
private String strMaintenanceMode = ""; private String strMaintenanceMode = "";
private boolean bAlwaysInheritDefault = false; private boolean bAlwaysInheritDefault = false;
private boolean bTreatAsteriskAsOP = true; private boolean bTreatAsteriskAsOP = true;
private boolean bRewardsEnabled = false;
private boolean bUseMetrics = true; private boolean bUseMetrics = true;
private boolean bUseUpdater = true; private boolean bUseUpdater = true;
private boolean bUseWorldGuard = true; private boolean bUseWorldGuard = true;
private boolean bUseResidence = true; private boolean bUseResidence = true;
private int nAutoReloadDelayTicks = 20 * 900; private int nAutoReloadDelayTicks = 20 * 900;
private int nRegionFinderGranularity = 1000; private int nRegionFinderGranularity = 1000;
public final int CurrentVersion = 2; public final int CurrentVersion = 3;
public static final String separator = "."; public static final String separator = ".";
public static final String separatorRegExp = "\\."; public static final String separatorRegExp = "\\.";
public static final String instantiator = "?"; public static final String instantiator = "?";
@ -39,6 +38,9 @@ public class Settings
case 1: case 1:
update_v1_to_v2(config); update_v1_to_v2(config);
MainPluginClass.consoleLog.info("[rscp] Configuration updated from v1 to v2."); MainPluginClass.consoleLog.info("[rscp] Configuration updated from v1 to v2.");
case 2:
update_v2_to_v3(config);
MainPluginClass.consoleLog.info("[rscp] Configuration updated from v2 to v3.");
case CurrentVersion: // Current version case CurrentVersion: // Current version
plugin.saveConfig(); plugin.saveConfig();
break; break;
@ -51,6 +53,11 @@ public class Settings
config.set("settings.integration.residence", true); config.set("settings.integration.residence", true);
config.set("internal.version", 2); config.set("internal.version", 2);
} }
private void update_v2_to_v3(FileConfiguration config)
{
config.set("settings.enable-rewards", null);
config.set("internal.version", 3);
}
public void readSettings() public void readSettings()
{ {
plugin.reloadConfig(); plugin.reloadConfig();
@ -59,12 +66,11 @@ public class Settings
strMaintenanceMode = config.getString ("settings.maintenance-mode", ""); strMaintenanceMode = config.getString ("settings.maintenance-mode", "");
bAlwaysInheritDefault = config.getBoolean("always-inherit-default-group", false); bAlwaysInheritDefault = config.getBoolean("always-inherit-default-group", false);
bTreatAsteriskAsOP = config.getBoolean("settings.treat-asterisk-as-op", true); bTreatAsteriskAsOP = config.getBoolean("settings.treat-asterisk-as-op", true);
bRewardsEnabled = config.getBoolean("settings.enable-rewards", false);
bUseMetrics = config.getBoolean("settings.use-metrics", true); bUseMetrics = config.getBoolean("settings.use-metrics", true);
bUseUpdater = config.getBoolean("settings.auto-update", true); bUseUpdater = config.getBoolean("settings.auto-update", true);
bUseWorldGuard = config.getBoolean("settings.integration.worldguard", true); bUseWorldGuard = config.getBoolean("settings.integration.worldguard", true);
bUseResidence = config.getBoolean("settings.integration.residence", true); bUseResidence = config.getBoolean("settings.integration.residence", true);
nAutoReloadDelayTicks = 20 * config.getInt("settings.auto-reload-delay-sec", 900); nAutoReloadDelayTicks = config.getInt ("settings.auto-reload-delay-sec", 900) * 20;
nRegionFinderGranularity = config.getInt ("settings.region-finder-thread-granularity-msec", 1000); nRegionFinderGranularity = config.getInt ("settings.region-finder-thread-granularity-msec", 1000);
} }
public String getDefaultGroup() public String getDefaultGroup()
@ -93,10 +99,6 @@ public class Settings
{ {
return bTreatAsteriskAsOP; return bTreatAsteriskAsOP;
} }
public boolean isRewardsEnabled()
{
return bRewardsEnabled;
}
public boolean isUseMetrics() public boolean isUseMetrics()
{ {
return bUseMetrics; return bUseMetrics;

510
src/main/java/ru/simsonic/rscPermissions/rscpAPI.java

@ -2,24 +2,19 @@ package ru.simsonic.rscPermissions;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
import java.util.Set; import java.util.Set;
import org.bukkit.OfflinePlayer;
import org.bukkit.World;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.permissions.PermissionAttachment;
import org.bukkit.permissions.PermissionAttachmentInfo;
public class rscpAPI public class rscpAPI
{ {
private final ru.simsonic.rscPermissions.MainPluginClass plugin; private final ru.simsonic.rscPermissions.MainPluginClass rscp;
protected rscpAPI(MainPluginClass rscp) protected rscpAPI(MainPluginClass plugin)
{ {
this.plugin = rscp; this.rscp = plugin;
}
/**
* Vault support method.
* Gets name of permission method
*
* @return Name of Permission Method
*/
public String getName()
{
return plugin.getName();
} }
/** /**
* Vault support method. * Vault support method.
@ -29,27 +24,7 @@ public class rscpAPI
*/ */
public boolean isEnabled() public boolean isEnabled()
{ {
return plugin.isEnabled(); return rscp.isEnabled();
}
/**
* Vault support method.
* Returns if the permission system is or attempts to be compatible with super-perms.
*
* @return True if this permission implementation works with super-perms
*/
public boolean hasSuperPermsCompat()
{
return true;
}
/**
* Vault permission support method.
* Returns true if the given implementation supports groups.
*
* @return true if the implementation supports groups
*/
public boolean hasGroupSupport()
{
return true;
} }
/** /**
* Vault permission support method. * Vault permission support method.
@ -63,7 +38,7 @@ public class rscpAPI
*/ */
public String getPrimaryGroup(String world, String player) public String getPrimaryGroup(String world, String player)
{ {
return plugin.settings.getDefaultGroup(); return rscp.settings.getDefaultGroup();
} }
/** /**
* Vault permission support method. * Vault permission support method.
@ -130,11 +105,11 @@ public class rscpAPI
*/ */
public boolean playerHas(String world, String player, String permission) public boolean playerHas(String world, String player, String permission)
{ {
Player onlinePlayer = plugin.getServer().getPlayerExact(player); Player onlinePlayer = rscp.getServer().getPlayerExact(player);
if(onlinePlayer != null) if(onlinePlayer != null)
return onlinePlayer.hasPermission(permission); return onlinePlayer.hasPermission(permission);
plugin.cache.calculateBasePermissions(player); rscp.cache.calculateBasePermissions(player);
HashMap<String, Boolean> map = plugin.cache.mapPermissions.get(player); HashMap<String, Boolean> map = rscp.cache.mapPermissions.get(player);
if(map != null) if(map != null)
{ {
Boolean value = map.get(permission); Boolean value = map.get(permission);
@ -233,7 +208,7 @@ public class rscpAPI
*/ */
public String[] getPlayerGroups(String world, String player) public String[] getPlayerGroups(String world, String player)
{ {
ArrayList<String> list = plugin.cache.getUserGroups(player); ArrayList<String> list = rscp.cache.getUserGroups(player);
return list.toArray(new String[list.size()]); return list.toArray(new String[list.size()]);
} }
/** /**
@ -244,12 +219,12 @@ public class rscpAPI
*/ */
public String[] getGroups() public String[] getGroups()
{ {
Set<String> groups = plugin.cache.getAllPossibleGroups(); Set<String> groups = rscp.cache.getAllPossibleGroups();
return groups.toArray(new String[groups.size()]); return groups.toArray(new String[groups.size()]);
} }
/** /**
* Vault chat support. * Vault chat support.
* Get players prefix * Get player's prefix
* *
* @param world World name * @param world World name
* @param player Player name * @param player Player name
@ -257,7 +232,7 @@ public class rscpAPI
*/ */
public String getPlayerPrefix(String world, String player) public String getPlayerPrefix(String world, String player)
{ {
return plugin.cache.userGetPrefix(player); return rscp.cache.userGetPrefix(player);
} }
/** /**
* Vault chat support. * Vault chat support.
@ -269,11 +244,11 @@ public class rscpAPI
*/ */
public String getPlayerSuffix(String world, String player) public String getPlayerSuffix(String world, String player)
{ {
return plugin.cache.userGetSuffix(player); return rscp.cache.userGetSuffix(player);
} }
/** /**
* Vault chat support. * Vault chat support.
* Get players prefix * Get player's prefix
* *
* @param world World name * @param world World name
* @param group Group name * @param group Group name
@ -281,7 +256,7 @@ public class rscpAPI
*/ */
public String getGroupPrefix(String world, String group) public String getGroupPrefix(String world, String group)
{ {
return plugin.cache.groupGetPrefix(group); return rscp.cache.groupGetPrefix(group);
} }
/** /**
* Vault chat support. * Vault chat support.
@ -293,11 +268,11 @@ public class rscpAPI
*/ */
public String getGroupSuffix(String world, String group) public String getGroupSuffix(String world, String group)
{ {
return plugin.cache.groupGetSuffix(group); return rscp.cache.groupGetSuffix(group);
} }
/** /**
* Vault chat support. * Vault chat support.
* Set players prefix * Set player's prefix
* *
* @param world World name * @param world World name
* @param player Player name * @param player Player name
@ -310,13 +285,13 @@ public class rscpAPI
@Override @Override
public void run() public void run()
{ {
plugin.connectionList.updateEntityText(player, true, prefix, true); rscp.connectionList.updateEntityText(player, true, prefix, true);
} }
}.start(); }.start();
} }
/** /**
* Vault chat support. * Vault chat support.
* Set players prefix * Set player's prefix
* *
* @param world World name * @param world World name
* @param player Player name * @param player Player name
@ -329,7 +304,7 @@ public class rscpAPI
@Override @Override
public void run() public void run()
{ {
plugin.connectionList.updateEntityText(player, true, suffix, false); rscp.connectionList.updateEntityText(player, true, suffix, false);
} }
}.start(); }.start();
} }
@ -348,7 +323,7 @@ public class rscpAPI
@Override @Override
public void run() public void run()
{ {
plugin.connectionList.updateEntityText(group, false, prefix, true); rscp.connectionList.updateEntityText(group, false, prefix, true);
} }
}.start(); }.start();
} }
@ -367,8 +342,439 @@ public class rscpAPI
@Override @Override
public void run() public void run()
{ {
plugin.connectionList.updateEntityText(group, false, suffix, false); rscp.connectionList.updateEntityText(group, false, suffix, false);
} }
}.start(); }.start();
} }
/**
* Checks if a CommandSender has a permission node. This will return the result of bukkits, generic .hasPermission()
* method and is identical in all cases. This method will explicitly fail if the registered permission system does
* not register permissions in bukkit.
*
* For easy checking of a commandsender
*
* @param sender to check permissions on
* @param permission to check for
* @return true if the sender has the permission
*/
public boolean has(CommandSender sender, String permission)
{
return sender.hasPermission(permission);
}
/**
* Checks if player has a permission node. (Short for playerHas(...)
*
* @param player Player Object
* @param permission Permission node
* @return Success or Failure
*/
public boolean has(Player player, String permission)
{
return player.hasPermission(permission);
}
/**
* Checks if player has a permission node. Supports NULL value for World if the permission system registered supports
* global permissions. But May return odd values if the servers registered permission system does not have a global
* permission store.
*
* @param world String world name
* @param player to check
* @param permission Permission node
* @return Success or Failure
*/
public boolean playerHas(String world, OfflinePlayer player, String permission)
{
// SHOULD BE UPDATED
return playerHas(world, player.getName(), permission);
}
/**
* Checks if player has a permission node. Defaults to world-specific permission check if the permission system
* supports it. See {@link #playerHas(String, OfflinePlayer, String)} for explicit global or world checks.
*
* @param player Player Object
* @param permission Permission node
* @return Success or Failure
*/
public boolean playerHas(Player player, String permission)
{
return has(player, permission);
}
/**
* Add permission to a player. Supports NULL value for World if the permission system registered supports global
* permissions. But May return odd values if the servers registered permission system does not have a global
* permission store.
*
* @param world String world name
* @param player to add to
* @param permission Permission node
* @return Success or Failure
*/
public boolean playerAdd(String world, OfflinePlayer player, String permission)
{
if(world == null)
return playerAdd((String)null, player.getName(), permission);
return playerAdd(world, player.getName(), permission);
}
/**
* Add permission to a player ONLY for the world the player is currently on. This is a world-specific operation, if
* you want to add global permission you must explicitly use NULL for the world. See
* {@link #playerAdd(String, OfflinePlayer, String)} for global permission use.
*
* @param player Player Object
* @param permission Permission node
* @return Success or Failure
*/
public boolean playerAdd(Player player, String permission)
{
return playerAdd(player.getWorld().getName(), player, permission);
}
/**
* Add transient permission to a player. This implementation can be used by any subclass which implements a "pure"
* superperms plugin, i.e. one that only needs the built-in Bukkit API to add transient permissions to a player.
*
* @param player to add to
* @param permission Permission node
* @return Success or Failure
*/
public boolean playerAddTransient(OfflinePlayer player, String permission) throws UnsupportedOperationException
{
if(player.isOnline())
return playerAddTransient((Player)player, permission);
throw new UnsupportedOperationException("rscPermissions does not support offline player transient permissions!");
}
/**
* Add transient permission to a player. This operation adds a permission onto the player object in bukkit via
* Bukkit's permission interface.
*
* @param player Player Object
* @param permission Permission node
* @return Success or Failure
*/
public boolean playerAddTransient(Player player, String permission)
{
for(PermissionAttachmentInfo paInfo : player.getEffectivePermissions())
if(paInfo.getAttachment() != null && paInfo.getAttachment().getPlugin().equals(rscp))
{
paInfo.getAttachment().setPermission(permission, true);
return true;
}
PermissionAttachment attach = player.addAttachment(rscp);
attach.setPermission(permission, true);
return true;
}
/**
* Adds a world specific transient permission to the player, may only work with some permission managers. Defaults to
* GLOBAL permissions for any permission system that does not support world-specific transient permissions!
*
* @param worldName to check on
* @param player to add to
* @param permission to test
* @return Success or Failure
*/
public boolean playerAddTransient(String worldName, OfflinePlayer player, String permission)
{
return false;
// return playerAddTransient(worldName, player.getName(), permission);
}
/**
* Adds a world specific transient permission to the player, may only work with some permission managers. Defaults to
* GLOBAL permissions for any permission system that does not support world-specific transient permissions!
*
* @param worldName to check on
* @param player to check
* @param permission to check for
* @return Success or Failure
*/
public boolean playerAddTransient(String worldName, Player player, String permission)
{
return playerAddTransient(player, permission);
}
/**
* Removes a world specific transient permission from the player, may only work with some permission managers.
* Defaults to GLOBAL permissions for any permission system that does not support world-specific transient
* permissions!
*
* @param worldName to remove for
* @param player to remove for
* @param permission to remove
* @return Success or Failure
*/
public boolean playerRemoveTransient(String worldName, OfflinePlayer player, String permission)
{
return false;
// return playerRemoveTransient(worldName, player.getName(), permission);
}
/**
* Removes a world specific transient permission from the player, may only work with some permission managers.
* Defaults to GLOBAL permissions for any permission system that does not support world-specific transient
* permissions!
*
* @param worldName to check on
* @param player to check
* @param permission to check for
* @return Success or Failure
*/
public boolean playerRemoveTransient(String worldName, Player player, String permission)
{
return playerRemoveTransient(worldName, (OfflinePlayer)player, permission);
}
/**
* Remove permission from a player. Will attempt to remove permission from the player on the player's current world.
* This is NOT a global operation.
*
* @param player Player Object
* @param permission Permission node
* @return Success or Failure
*/
public boolean playerRemove(Player player, String permission)
{
return false;
// return playerRemove(player.getWorld().getName(), player, permission);
}
/**
* Remove transient permission from a player. This implementation can be used by any subclass which implements a
* "pure" superperms plugin, i.e. one that only needs the built-in Bukkit API to remove transient permissions from a
* player. Any subclass implementing a plugin which provides its own API for this needs to override this method.
*
* @param player OfflinePlayer
* @param permission Permission node
* @return Success or Failure
*/
public boolean playerRemoveTransient(OfflinePlayer player, String permission)
{
if(player.isOnline())
return playerRemoveTransient((Player)player, permission);
else
return false;
}
/**
* Remove transient permission from a player.
*
* @param player Player Object
* @param permission Permission node
* @return Success or Failure
*/
public boolean playerRemoveTransient(Player player, String permission)
{
for(PermissionAttachmentInfo paInfo : player.getEffectivePermissions())
if(paInfo.getAttachment() != null && paInfo.getAttachment().getPlugin().equals(rscp))
{
paInfo.getAttachment().unsetPermission(permission);
return true;
}
return false;
}
/**
* Checks if group has a permission node. Supports NULL value for World if the permission system registered supports
* global permissions. But May return odd values if the servers registered permission system does not have a global
* permission store.
*
* @param world World Object
* @param group Group name
* @param permission Permission node
* @return Success or Failure
*/
public boolean groupHas(World world, String group, String permission)
{
if(world == null)
return groupHas((String)null, group, permission);
return groupHas(world.getName(), group, permission);
}
/**
* Add permission to a group. Supports NULL value for World if the permission system registered supports global
* permissions. But May return odd values if the servers registered permission system does not have a global
* permission store.
*
* @param world World Object
* @param group Group name
* @param permission Permission node
* @return Success or Failure
*/
public boolean groupAdd(World world, String group, String permission)
{
if(world == null)
return groupAdd((String)null, group, permission);
return groupAdd(world.getName(), group, permission);
}
/**
* Remove permission from a group. Supports NULL value for World if the permission system registered supports global
* permissions. But May return odd values if the servers registered permission system does not have a global
* permission store.
*
* @param world World Object
* @param group Group name
* @param permission Permission node
* @return Success or Failure
*/
public boolean groupRemove(World world, String group, String permission)
{
if(world == null)
return groupRemove((String)null, group, permission);
return groupRemove(world.getName(), group, permission);
}
/**
* Check if player is member of a group. Supports NULL value for World if the permission system registered supports
* global permissions. But May return odd values if the servers registered permission system does not have a global
* permission store.
*
* @param world World Object
* @param player to check
* @param group Group name
* @return Success or Failure
*/
public boolean playerInGroup(String world, OfflinePlayer player, String group)
{
if(world == null)
return playerInGroup((String)null, player.getName(), group);
return playerInGroup(world, player.getName(), group);
}
/**
* Check if player is member of a group. This method will ONLY check groups for which the player is in that are
* defined for the current world. This may result in odd return behaviour depending on what permission system has
* been registered.
*
* @param player Player Object
* @param group Group name
* @return Success or Failure
*/
public boolean playerInGroup(Player player, String group)
{
return playerInGroup(player.getWorld().getName(), player, group);
}
/**
* Add player to a group. Supports NULL value for World if the permission system registered supports global
* permissions. But May return odd values if the servers registered permission system does not have a global
* permission store.
*
* @param world String world name
* @param player to add
* @param group Group name
* @return Success or Failure
*/
public boolean playerAddGroup(String world, OfflinePlayer player, String group)
{
if(world == null)
return playerAddGroup((String)null, player.getName(), group);
return playerAddGroup(world, player.getName(), group);
}
/**
* Add player to a group. This will add a player to the group on the current World. This may return odd results if
* the permission system being used on the server does not support world-specific groups, or if the group being added
* to is a global group.
*
* @param player Player Object
* @param group Group name
* @return Success or Failure
*/
public boolean playerAddGroup(Player player, String group)
{
return playerAddGroup(player.getWorld().getName(), player, group);
}
/**
* Remove player from a group. Supports NULL value for World if the permission system registered supports global
* permissions. But May return odd values if the servers registered permission system does not have a global
* permission store.
*
* @param world World Object
* @param player to remove
* @param group Group name
* @return Success or Failure
*/
public boolean playerRemoveGroup(String world, OfflinePlayer player, String group)
{
if(world == null)
return playerRemoveGroup((String)null, player.getName(), group);
return playerRemoveGroup(world, player.getName(), group);
}
/**
* Remove player from a group. This will add a player to the group on the current World. This may return odd results
* if the permission system being used on the server does not support world-specific groups, or if the group being
* added to is a global group.
*
* @param player Player Object
* @param group Group name
* @return Success or Failure
*/
public boolean playerRemoveGroup(Player player, String group)
{
return playerRemoveGroup(player.getWorld().getName(), player, group);
}
/**
* Gets the list of groups that this player has Supports NULL value for World if the permission system registered
* supports global permissions. But May return odd values if the servers registered permission system does not have a
* global permission store.
*
* @param world String world name
* @param player OfflinePlayer
* @return Array of groups
*/
public String[] getPlayerGroups(String world, OfflinePlayer player)
{
return getPlayerGroups(world, player.getName());
}
/**
* Returns a list of world-specific groups that this player is currently in. May return unexpected results if you are
* looking for global groups, or if the registered permission system does not support world-specific groups. See
* {@link #getPlayerGroups(String, OfflinePlayer)} for better control of World-specific or global groups.
*
* @param player Player Object
* @return Array of groups
*/
public String[] getPlayerGroups(Player player)
{
return getPlayerGroups(player.getWorld().getName(), player);
}
/**
* Gets players primary group Supports NULL value for World if the permission system registered supports global
* permissions. But May return odd values if the servers registered permission system does not have a global
* permission store.
*
* @param world String world name
* @param player to get from
* @return Players primary group
*/
public String getPrimaryGroup(String world, OfflinePlayer player)
{
return getPrimaryGroup(world, player.getName());
}
/**
* Get players primary group. Defaults to the players current world, so may return only world-specific groups. In
* most cases {@link #getPrimaryGroup(String, OfflinePlayer)} is preferable.
*
* @param player Player Object
* @return Players primary group
*/
public String getPrimaryGroup(Player player)
{
return getPrimaryGroup(player.getWorld().getName(), player);
}
} }

19
src/main/resources/sqlt/Initialize_rewards_v1.sqlt

@ -1,19 +0,0 @@
CREATE TABLE IF NOT EXISTS `{DATABASE}`.`{PREFIX}rewards` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`user` varchar(64) NOT NULL,
`code` varchar(16) NOT NULL,
`activated` bit(1) NOT NULL DEFAULT b'0',
`activated_timestamp` timestamp NULL DEFAULT NULL,
`execute_commands` varchar(1024) DEFAULT NULL,
`command_permissions` varchar(1024) DEFAULT NULL,
`add_group` varchar(64) DEFAULT NULL,
`add_group_destination` varchar(256) DEFAULT NULL,
`add_group_expirience` smallint(6) DEFAULT NULL,
`add_group_interval` varchar(64) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `id_UNIQUE` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET='utf8' COLLATE 'utf8_general_ci';
/* Update from 0.5.9b -> 0.6b */
ALTER TABLE `{DATABASE}`.`{PREFIX}rewards` COLLATE 'utf8_general_ci';

27
src/main/resources/sqlt/Update_server_info.sqlt

@ -1,27 +0,0 @@
INSERT INTO `{DATABASE}`.`{PREFIX}servers` (
`serverid`,
`plugin_version`,
`settings_default-group`,
`settings_treat-asterisk-as-op`,
`settings_auto-reload-delay-sec`,
`settings_maintenance-mode`,
`settings_enable-rewards`,
`internal_version`
) VALUES (
'{SERVERID}',
'v{PLUGIN_VER}',
'{DEFAULT}',
b'{OP}',
'{DELAY}',
{mMode},
b'{USE_R}',
'{CFG_VER}'
) ON DUPLICATE KEY UPDATE
`serverid` = VALUES(`serverid`),
`plugin_version` = VALUES(`plugin_version`),
`settings_default-group` = VALUES(`settings_default-group`),
`settings_treat-asterisk-as-op` = VALUES(`settings_treat-asterisk-as-op`),
`settings_auto-reload-delay-sec` = VALUES(`settings_auto-reload-delay-sec`),
`settings_maintenance-mode` = VALUES(`settings_maintenance-mode`),
`settings_enable-rewards` = VALUES(`settings_enable-rewards`),
`internal_version` = VALUES(`internal_version`);
Loading…
Cancel
Save