44 changed files with 3733 additions and 0 deletions
After Width: | Height: | Size: 339 KiB |
Binary file not shown.
After Width: | Height: | Size: 78 KiB |
@ -0,0 +1,18 @@ |
|||||||
|
<?xml version="1.0" encoding="UTF-8"?> |
||||||
|
<project-shared-configuration> |
||||||
|
<!-- |
||||||
|
This file contains additional configuration written by modules in the NetBeans IDE. |
||||||
|
The configuration is intended to be shared among all the users of project and |
||||||
|
therefore it is assumed to be part of version control checkout. |
||||||
|
Without this configuration present, some functionality in the IDE may be limited or fail altogether. |
||||||
|
--> |
||||||
|
<properties xmlns="http://www.netbeans.org/ns/maven-properties-data/1"> |
||||||
|
<!-- |
||||||
|
Properties that influence various parts of the IDE, especially code formatting and the like. |
||||||
|
You can copy and paste the single properties, into the pom.xml file and the IDE will pick them up. |
||||||
|
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. |
||||||
|
--> |
||||||
|
<netbeans.hint.jdkPlatform>______JDK_1.7_Update_51</netbeans.hint.jdkPlatform> |
||||||
|
</properties> |
||||||
|
</project-shared-configuration> |
@ -0,0 +1,46 @@ |
|||||||
|
<?xml version="1.0" encoding="UTF-8"?> |
||||||
|
<actions> |
||||||
|
<action> |
||||||
|
<actionName>run</actionName> |
||||||
|
<packagings> |
||||||
|
<packaging>jar</packaging> |
||||||
|
</packagings> |
||||||
|
<goals> |
||||||
|
<goal>process-classes</goal> |
||||||
|
<goal>org.codehaus.mojo:exec-maven-plugin:1.2.1:exec</goal> |
||||||
|
</goals> |
||||||
|
<properties> |
||||||
|
<exec.args>-classpath %classpath ru.simsonic.rscPermissions.MainPluginClass</exec.args> |
||||||
|
<exec.executable>java</exec.executable> |
||||||
|
</properties> |
||||||
|
</action> |
||||||
|
<action> |
||||||
|
<actionName>debug</actionName> |
||||||
|
<packagings> |
||||||
|
<packaging>jar</packaging> |
||||||
|
</packagings> |
||||||
|
<goals> |
||||||
|
<goal>process-classes</goal> |
||||||
|
<goal>org.codehaus.mojo:exec-maven-plugin:1.2.1:exec</goal> |
||||||
|
</goals> |
||||||
|
<properties> |
||||||
|
<exec.args>-Xdebug -Xrunjdwp:transport=dt_socket,server=n,address=${jpda.address} -classpath %classpath ru.simsonic.rscPermissions.MainPluginClass</exec.args> |
||||||
|
<exec.executable>java</exec.executable> |
||||||
|
<jpda.listen>true</jpda.listen> |
||||||
|
</properties> |
||||||
|
</action> |
||||||
|
<action> |
||||||
|
<actionName>profile</actionName> |
||||||
|
<packagings> |
||||||
|
<packaging>jar</packaging> |
||||||
|
</packagings> |
||||||
|
<goals> |
||||||
|
<goal>process-classes</goal> |
||||||
|
<goal>org.codehaus.mojo:exec-maven-plugin:1.2.1:exec</goal> |
||||||
|
</goals> |
||||||
|
<properties> |
||||||
|
<exec.args>-classpath %classpath ru.simsonic.rscPermissions.MainPluginClass</exec.args> |
||||||
|
<exec.executable>java</exec.executable> |
||||||
|
</properties> |
||||||
|
</action> |
||||||
|
</actions> |
@ -0,0 +1,170 @@ |
|||||||
|
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" |
||||||
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> |
||||||
|
<modelVersion>4.0.0</modelVersion> |
||||||
|
|
||||||
|
<groupId>ru.simsonic</groupId> |
||||||
|
<artifactId>rscPermissions</artifactId> |
||||||
|
<version>0.8.10b</version> |
||||||
|
<packaging>jar</packaging> |
||||||
|
|
||||||
|
<name>rscPermissions</name> |
||||||
|
<url>http://maven.apache.org</url> |
||||||
|
|
||||||
|
<properties> |
||||||
|
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> |
||||||
|
</properties> |
||||||
|
|
||||||
|
<build> |
||||||
|
<finalName>${project.artifactId}_v${project.version}</finalName> |
||||||
|
<plugins> |
||||||
|
<plugin> |
||||||
|
<groupId>org.apache.maven.plugins</groupId> |
||||||
|
<artifactId>maven-compiler-plugin</artifactId> |
||||||
|
<version>3.1</version> |
||||||
|
<configuration> |
||||||
|
<source>1.7</source> |
||||||
|
<target>1.7</target> |
||||||
|
<debug>true</debug> |
||||||
|
<verbose>false</verbose> |
||||||
|
<showDeprecation>true</showDeprecation> |
||||||
|
</configuration> |
||||||
|
</plugin> |
||||||
|
<plugin> |
||||||
|
<groupId>org.apache.maven.plugins</groupId> |
||||||
|
<artifactId>maven-jar-plugin</artifactId> |
||||||
|
<version>2.4</version> |
||||||
|
<configuration> |
||||||
|
<archive> |
||||||
|
<addMavenDescriptor>false</addMavenDescriptor> |
||||||
|
</archive> |
||||||
|
<excludes> |
||||||
|
<exclude>.*</exclude> |
||||||
|
</excludes> |
||||||
|
</configuration> |
||||||
|
</plugin> |
||||||
|
<plugin> |
||||||
|
<groupId>org.apache.maven.plugins</groupId> |
||||||
|
<artifactId>maven-shade-plugin</artifactId> |
||||||
|
<version>2.2</version> |
||||||
|
<executions> |
||||||
|
<execution> |
||||||
|
<phase>package</phase> |
||||||
|
<goals> |
||||||
|
<goal>shade</goal> |
||||||
|
</goals> |
||||||
|
<configuration> |
||||||
|
<minimizeJar>true</minimizeJar> |
||||||
|
<artifactSet> |
||||||
|
<includes> |
||||||
|
<include>ru.simsonic:rscAPI</include> |
||||||
|
</includes> |
||||||
|
</artifactSet> |
||||||
|
<createDependencyReducedPom>false</createDependencyReducedPom> |
||||||
|
</configuration> |
||||||
|
</execution> |
||||||
|
</executions> |
||||||
|
</plugin> |
||||||
|
<!--plugin> |
||||||
|
<groupId>org.apache.maven.plugins</groupId> |
||||||
|
<artifactId>maven-source-plugin</artifactId> |
||||||
|
<version>2.2.1</version> |
||||||
|
<executions> |
||||||
|
<execution> |
||||||
|
<id>attach-sources</id> |
||||||
|
<goals> |
||||||
|
<goal>jar</goal> |
||||||
|
</goals> |
||||||
|
</execution> |
||||||
|
</executions> |
||||||
|
</plugin--> |
||||||
|
<plugin> |
||||||
|
<groupId>org.apache.maven.plugins</groupId> |
||||||
|
<artifactId>maven-javadoc-plugin</artifactId> |
||||||
|
<version>2.9.1</version> |
||||||
|
<executions> |
||||||
|
<execution> |
||||||
|
<id>attach-javadocs</id> |
||||||
|
<goals> |
||||||
|
<goal>jar</goal> |
||||||
|
</goals> |
||||||
|
</execution> |
||||||
|
</executions> |
||||||
|
<configuration> |
||||||
|
<show>public</show> |
||||||
|
<nohelp>true</nohelp> |
||||||
|
</configuration> |
||||||
|
</plugin> |
||||||
|
</plugins> |
||||||
|
<resources> |
||||||
|
<resource> |
||||||
|
<directory>src/main/resources</directory> |
||||||
|
<filtering>true</filtering> |
||||||
|
</resource> |
||||||
|
</resources> |
||||||
|
</build> |
||||||
|
<repositories> |
||||||
|
<!-- Bukkit API --> |
||||||
|
<repository> |
||||||
|
<id>bukkit-repo</id> |
||||||
|
<url>http://repo.bukkit.org/content/groups/public</url> |
||||||
|
</repository> |
||||||
|
<!-- Region list providers: WorldGuard, Residence --> |
||||||
|
<repository> |
||||||
|
<id>sk89q-repo</id> |
||||||
|
<url>http://maven.sk89q.com/repo/</url> |
||||||
|
</repository> |
||||||
|
<repository> |
||||||
|
<id>Residence</id> |
||||||
|
<url>http://ci.drtshock.net/plugin/repository/everything/</url> |
||||||
|
</repository> |
||||||
|
<!-- My own libraries and APIs --> |
||||||
|
<!-- + Vault now builds on ci.voxile.ru --> |
||||||
|
<repository> |
||||||
|
<id>voxile.ru</id> |
||||||
|
<url>http://ci.voxile.ru/plugin/repository/everything/</url> |
||||||
|
</repository> |
||||||
|
</repositories> |
||||||
|
<dependencies> |
||||||
|
<dependency> |
||||||
|
<groupId>mysql</groupId> |
||||||
|
<artifactId>mysql-connector-java</artifactId> |
||||||
|
<version>5.1.30</version> |
||||||
|
<scope>runtime</scope> |
||||||
|
</dependency> |
||||||
|
<dependency> |
||||||
|
<groupId>org.bukkit</groupId> |
||||||
|
<artifactId>bukkit</artifactId> |
||||||
|
<version>1.7.5-R0.1-SNAPSHOT</version> |
||||||
|
<scope>provided</scope> |
||||||
|
<type>jar</type> |
||||||
|
</dependency> |
||||||
|
<dependency> |
||||||
|
<groupId>com.sk89q</groupId> |
||||||
|
<artifactId>worldedit</artifactId> |
||||||
|
<version>5.6</version> |
||||||
|
<scope>compile</scope> |
||||||
|
<type>jar</type> |
||||||
|
</dependency> |
||||||
|
<dependency> |
||||||
|
<groupId>com.sk89q</groupId> |
||||||
|
<artifactId>worldguard</artifactId> |
||||||
|
<version>5.9.1-SNAPSHOT</version> |
||||||
|
<scope>provided</scope> |
||||||
|
<type>jar</type> |
||||||
|
</dependency> |
||||||
|
<dependency> |
||||||
|
<groupId>net.t00thpick1</groupId> |
||||||
|
<artifactId>Residence</artifactId> |
||||||
|
<version>3.0-SNAPSHOT</version> |
||||||
|
<scope>provided</scope> |
||||||
|
<type>jar</type> |
||||||
|
</dependency> |
||||||
|
<dependency> |
||||||
|
<groupId>ru.simsonic</groupId> |
||||||
|
<artifactId>rscAPI</artifactId> |
||||||
|
<version>1.2.0</version> |
||||||
|
<scope>compile</scope> |
||||||
|
<type>jar</type> |
||||||
|
</dependency> |
||||||
|
</dependencies> |
||||||
|
</project> |
@ -0,0 +1,97 @@ |
|||||||
|
package ru.simsonic.rscPermissions; |
||||||
|
import java.util.Set; |
||||||
|
import java.util.UUID; |
||||||
|
import org.bukkit.Location; |
||||||
|
import org.bukkit.entity.Player; |
||||||
|
import ru.simsonic.rscPermissions.DataTypes.RowInheritance; |
||||||
|
import ru.simsonic.rscPermissions.DataTypes.RowPermission; |
||||||
|
import ru.simsonic.rscPermissions.LocalCacheTree.ResolutionLeaf; |
||||||
|
|
||||||
|
public class AsyncPlayerInfo |
||||||
|
{ |
||||||
|
public Player player; |
||||||
|
public String name; |
||||||
|
public UUID uuid; |
||||||
|
public int expirience; |
||||||
|
public Location location; |
||||||
|
public Set<String> regions; |
||||||
|
public AsyncPlayerInfo() |
||||||
|
{ |
||||||
|
} |
||||||
|
public AsyncPlayerInfo(String playerName) |
||||||
|
{ |
||||||
|
this.name = playerName; |
||||||
|
} |
||||||
|
public AsyncPlayerInfo(UUID playerUniqueId) |
||||||
|
{ |
||||||
|
this.uuid = playerUniqueId; |
||||||
|
} |
||||||
|
public AsyncPlayerInfo(Player player, Set<String> regions) |
||||||
|
{ |
||||||
|
if(player != null) |
||||||
|
{ |
||||||
|
this.player = player; |
||||||
|
try |
||||||
|
{ |
||||||
|
// minecraft <= 1.7
|
||||||
|
this.name = player.getName(); |
||||||
|
} catch(RuntimeException | NoSuchMethodError ex) { |
||||||
|
// minecraft >= 1.8
|
||||||
|
} |
||||||
|
try |
||||||
|
{ |
||||||
|
// minecraft >= 1.8
|
||||||
|
this.uuid = player.getUniqueId(); |
||||||
|
} catch(RuntimeException | NoSuchMethodError ex) { |
||||||
|
// minecraft <= 1.7
|
||||||
|
} |
||||||
|
this.expirience = player.getLevel(); |
||||||
|
this.location = player.getLocation(); |
||||||
|
this.regions = regions; |
||||||
|
} |
||||||
|
} |
||||||
|
public boolean isPlayerEntityApplicable(String entity) |
||||||
|
{ |
||||||
|
// Test by UUID (minecraft >= 1.8)
|
||||||
|
try |
||||||
|
{ |
||||||
|
if(this.uuid.compareTo(UUID.fromString(entity)) == 0) |
||||||
|
return true; |
||||||
|
} catch(RuntimeException ex) { |
||||||
|
// Server doesn't support this yet
|
||||||
|
} |
||||||
|
// Test by name (minecraft <= 1.7)
|
||||||
|
try |
||||||
|
{ |
||||||
|
if(this.name.equalsIgnoreCase(entity)) |
||||||
|
return true; |
||||||
|
} catch(RuntimeException ex) { |
||||||
|
// Server already doesn't support this
|
||||||
|
} |
||||||
|
return false; |
||||||
|
} |
||||||
|
public boolean isPlayerPermissionApplicable(RowPermission row) |
||||||
|
{ |
||||||
|
if(isPlayerEntityApplicable(row.entity) || "".equals(row.entity)) |
||||||
|
return (row.destination.IsLocationApplicable(location, regions, null) && row.expirience <= expirience); |
||||||
|
return false; |
||||||
|
} |
||||||
|
public boolean isGroupPermissionApplicable(RowPermission row, ResolutionLeaf leaf) |
||||||
|
{ |
||||||
|
if(row.entity.equalsIgnoreCase(leaf.group) || "".equals(row.entity)) |
||||||
|
return (row.destination.IsLocationApplicable(location, regions, leaf.instance) && row.expirience <= expirience); |
||||||
|
return false; |
||||||
|
} |
||||||
|
public boolean isPlayerInheritanceApplicable(RowInheritance row) |
||||||
|
{ |
||||||
|
if(isPlayerEntityApplicable(row.entity)) |
||||||
|
return (row.destination.IsLocationApplicable(location, regions, row.instance) && row.expirience <= expirience); |
||||||
|
return false; |
||||||
|
} |
||||||
|
public boolean isGroupInheritanceApplicable(RowInheritance row, ResolutionLeaf leaf) |
||||||
|
{ |
||||||
|
if(row.entity.equalsIgnoreCase(leaf.group)) |
||||||
|
return (row.destination.IsLocationApplicable(location, regions, leaf.instance) && row.expirience <= expirience); |
||||||
|
return false; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,26 @@ |
|||||||
|
package ru.simsonic.rscPermissions.Backends; |
||||||
|
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.DataTypes.RowServer; |
||||||
|
import ru.simsonic.rscPermissions.LocalCacheData; |
||||||
|
|
||||||
|
public interface Backend |
||||||
|
{ |
||||||
|
public abstract boolean canRead(); |
||||||
|
public abstract boolean canWrite(); |
||||||
|
|
||||||
|
public abstract void fetchIntoCache(LocalCacheData cache); |
||||||
|
public abstract RowEntity[] fetchEntities(); |
||||||
|
public abstract RowPermission[] fetchPermissions(); |
||||||
|
public abstract RowInheritance[] fetchInheritance(); |
||||||
|
public abstract RowLadder[] fetchLadders(); |
||||||
|
public abstract RowServer[] fetchServers(); |
||||||
|
|
||||||
|
public abstract void insertExampleRows(); |
||||||
|
public abstract void updateEntityText(String entity, boolean entity_type, String text, boolean isPrefix); |
||||||
|
public abstract void setUserRank(String user, String ladder, int rank); |
||||||
|
public abstract void dropUserFromLadder(String user, String ladder); |
||||||
|
public abstract void addUserParentGroup(String user, String newGroup); |
||||||
|
} |
@ -0,0 +1,351 @@ |
|||||||
|
package ru.simsonic.rscPermissions.Backends; |
||||||
|
import ru.simsonic.utilities.*; |
||||||
|
import java.sql.ResultSet; |
||||||
|
import java.sql.SQLException; |
||||||
|
import java.util.ArrayList; |
||||||
|
import java.util.logging.Level; |
||||||
|
import ru.simsonic.rscPermissions.DataTypes.Destination; |
||||||
|
import ru.simsonic.rscPermissions.DataTypes.RowEntity; |
||||||
|
import ru.simsonic.rscPermissions.DataTypes.RowEntity.EntityType; |
||||||
|
import ru.simsonic.rscPermissions.DataTypes.RowInheritance; |
||||||
|
import ru.simsonic.rscPermissions.DataTypes.RowLadder; |
||||||
|
import ru.simsonic.rscPermissions.DataTypes.RowPermission; |
||||||
|
import ru.simsonic.rscPermissions.DataTypes.RowReward; |
||||||
|
import ru.simsonic.rscPermissions.DataTypes.RowServer; |
||||||
|
import ru.simsonic.rscPermissions.LocalCacheData; |
||||||
|
import ru.simsonic.rscPermissions.MainPluginClass; |
||||||
|
import ru.simsonic.rscPermissions.Rewards; |
||||||
|
import ru.simsonic.rscPermissions.Settings; |
||||||
|
|
||||||
|
public class BackendMySQL extends ConnectionMySQL implements Backend |
||||||
|
{ |
||||||
|
protected final MainPluginClass plugin; |
||||||
|
protected static enum WorkMode { read, write, none, } |
||||||
|
protected WorkMode RememberWork; |
||||||
|
public BackendMySQL(MainPluginClass plugin) |
||||||
|
{ |
||||||
|
this.plugin = plugin; |
||||||
|
} |
||||||
|
public synchronized void Initialize(String name, String database, String username, String password, String workmode, String prefixes) |
||||||
|
{ |
||||||
|
super.Initialize(name, database, username, password, prefixes); |
||||||
|
switch(workmode.toLowerCase()) |
||||||
|
{ |
||||||
|
case "fullaccess": |
||||||
|
RememberWork = WorkMode.write; |
||||||
|
break; |
||||||
|
case "readonly": |
||||||
|
RememberWork = WorkMode.read; |
||||||
|
break; |
||||||
|
case "none": |
||||||
|
default: |
||||||
|
RememberWork = WorkMode.none; |
||||||
|
break; |
||||||
|
} |
||||||
|
} |
||||||
|
@Override |
||||||
|
public synchronized boolean canRead() |
||||||
|
{ |
||||||
|
return (RememberWork != WorkMode.none) ? (isConnected() ? true : Connect()) : false; |
||||||
|
} |
||||||
|
@Override |
||||||
|
public synchronized boolean canWrite() |
||||||
|
{ |
||||||
|
return (RememberWork == WorkMode.write) ? (isConnected() ? true : Connect()) : false; |
||||||
|
} |
||||||
|
@Override |
||||||
|
public synchronized boolean Connect() |
||||||
|
{ |
||||||
|
if(RememberWork == WorkMode.none) |
||||||
|
return false; |
||||||
|
if(super.Connect()) |
||||||
|
{ |
||||||
|
createTablesIfNotExist(); |
||||||
|
cleanupTables(); |
||||||
|
updateServerInfo(); |
||||||
|
return true; |
||||||
|
} |
||||||
|
return false; |
||||||
|
} |
||||||
|
@Override |
||||||
|
public synchronized ResultSet executeQuery(String query) |
||||||
|
{ |
||||||
|
if(canRead() == false) |
||||||
|
return null; |
||||||
|
return super.executeQuery(query); |
||||||
|
} |
||||||
|
@Override |
||||||
|
public synchronized boolean executeUpdate(String query) |
||||||
|
{ |
||||||
|
if(canWrite() == false) |
||||||
|
return false; |
||||||
|
return super.executeUpdate(query); |
||||||
|
} |
||||||
|
private void createTablesIfNotExist() |
||||||
|
{ |
||||||
|
executeUpdate(loadResourceSQLT("Initialize_main_v1")); |
||||||
|
if(plugin.settings.isRewardsEnabled()) |
||||||
|
executeUpdate(loadResourceSQLT("Initialize_rewards_v1")); |
||||||
|
} |
||||||
|
private void cleanupTables() |
||||||
|
{ |
||||||
|
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 |
||||||
|
public synchronized void fetchIntoCache(LocalCacheData cache) |
||||||
|
{ |
||||||
|
cleanupTables(); |
||||||
|
MainPluginClass.consoleLog.log(Level.INFO, |
||||||
|
"[rscp] Fetched {0}e, {1}p, {2}i, {3}l, {4}s from \"{5}\".", |
||||||
|
new Object[] |
||||||
|
{ |
||||||
|
Integer.toString(cache.ImportEntities(fetchEntities())), |
||||||
|
Integer.toString(cache.ImportPermissions(fetchPermissions())), |
||||||
|
Integer.toString(cache.ImportInheritance(fetchInheritance())), |
||||||
|
Integer.toString(cache.ImportLadders(fetchLadders())), |
||||||
|
Integer.toString(cache.ImportServers(fetchServers())), |
||||||
|
RememberName, |
||||||
|
}); |
||||||
|
} |
||||||
|
@Override |
||||||
|
public synchronized RowEntity[] fetchEntities() |
||||||
|
{ |
||||||
|
final ArrayList<RowEntity> result = new ArrayList<>(); |
||||||
|
final ResultSet rs = executeQuery("SELECT * FROM `{DATABASE}`.`{PREFIX}entities`;"); |
||||||
|
try |
||||||
|
{ |
||||||
|
while(rs.next()) |
||||||
|
{ |
||||||
|
RowEntity row = new RowEntity(); |
||||||
|
row.id = rs.getInt("id"); |
||||||
|
row.entity = rs.getString("entity"); |
||||||
|
row.entity_type = EntityType.byValue(rs.getInt("entity_type")); |
||||||
|
row.prefix = rs.getString("prefix"); |
||||||
|
row.suffix = rs.getString("suffix"); |
||||||
|
result.add(row); |
||||||
|
} |
||||||
|
rs.close(); |
||||||
|
} catch(SQLException ex) { |
||||||
|
MainPluginClass.consoleLog.log(Level.WARNING, "[rscp] Exception in rs2e(): {0}", ex.getLocalizedMessage()); |
||||||
|
} |
||||||
|
return result.toArray(new RowEntity[result.size()]); |
||||||
|
} |
||||||
|
@Override |
||||||
|
public synchronized RowPermission[] fetchPermissions() |
||||||
|
{ |
||||||
|
final ArrayList<RowPermission> result = new ArrayList<>(); |
||||||
|
final ResultSet rs = executeQuery("SELECT * FROM `{DATABASE}`.`{PREFIX}permissions`;"); |
||||||
|
final String serverId = plugin.getServer().getServerId(); |
||||||
|
try |
||||||
|
{ |
||||||
|
while(rs.next()) |
||||||
|
{ |
||||||
|
for(Destination destination : Destination.ParseDestinations(rs.getString("destination"))) |
||||||
|
{ |
||||||
|
if(destination.IsServerIdApplicable(serverId) == false) |
||||||
|
continue; |
||||||
|
RowPermission row = new RowPermission(); |
||||||
|
row.id = rs.getInt("id"); |
||||||
|
row.entity = rs.getString("entity"); |
||||||
|
row.entity_type = EntityType.byValue(rs.getInt("entity_type")); |
||||||
|
row.permission = rs.getString("permission"); |
||||||
|
row.value = rs.getBoolean("value"); |
||||||
|
row.destination = destination; |
||||||
|
row.expirience = rs.getInt("expirience"); |
||||||
|
row.lifetime = rs.getTimestamp("lifetime"); |
||||||
|
result.add(row); |
||||||
|
} |
||||||
|
} |
||||||
|
rs.close(); |
||||||
|
} catch(SQLException ex) { |
||||||
|
MainPluginClass.consoleLog.log(Level.WARNING, "[rscp] Exception in rs2p(): {0}", ex.getLocalizedMessage()); |
||||||
|
} |
||||||
|
return result.toArray(new RowPermission[result.size()]); |
||||||
|
} |
||||||
|
@Override |
||||||
|
public synchronized RowInheritance[] fetchInheritance() |
||||||
|
{ |
||||||
|
final ArrayList<RowInheritance> result = new ArrayList<>(); |
||||||
|
final ResultSet rs = executeQuery("SELECT * FROM `{DATABASE}`.`{PREFIX}inheritance`;"); |
||||||
|
final String serverId = plugin.getServer().getServerId(); |
||||||
|
try |
||||||
|
{ |
||||||
|
while(rs.next()) |
||||||
|
{ |
||||||
|
for(Destination destination : Destination.ParseDestinations(rs.getString("destination"))) |
||||||
|
{ |
||||||
|
if(destination.IsServerIdApplicable(serverId) == false) |
||||||
|
continue; |
||||||
|
RowInheritance row = new RowInheritance(); |
||||||
|
row.id = rs.getInt("id"); |
||||||
|
row.entity = rs.getString("entity"); |
||||||
|
row.parent = rs.getString("parent"); |
||||||
|
String[] breaked = row.parent.split(Settings.separatorRegExp); |
||||||
|
if(breaked.length == 2) |
||||||
|
{ |
||||||
|
row.parent = breaked[0]; |
||||||
|
row.instance = breaked[1]; |
||||||
|
} |
||||||
|
row.child_type = EntityType.byValue(rs.getInt("inheritance_type")); |
||||||
|
row.priority = rs.getInt("inheritance_priority"); |
||||||
|
row.destination = destination; |
||||||
|
row.expirience = rs.getInt("expirience"); |
||||||
|
row.lifetime = rs.getTimestamp("lifetime"); |
||||||
|
result.add(row); |
||||||
|
} |
||||||
|
} |
||||||
|
rs.close(); |
||||||
|
} catch(SQLException ex) { |
||||||
|
MainPluginClass.consoleLog.log(Level.WARNING, "[rscp] Exception in rs2i(): {0}", ex.getLocalizedMessage()); |
||||||
|
} |
||||||
|
return result.toArray(new RowInheritance[result.size()]); |
||||||
|
} |
||||||
|
@Override |
||||||
|
public synchronized RowLadder[] fetchLadders() |
||||||
|
{ |
||||||
|
final ArrayList<RowLadder> result = new ArrayList<>(); |
||||||
|
final ResultSet rs = executeQuery("SELECT * FROM `{DATABASE}`.`{PREFIX}ladders`;"); |
||||||
|
try |
||||||
|
{ |
||||||
|
while(rs.next()) |
||||||
|
{ |
||||||
|
RowLadder row = new RowLadder(); |
||||||
|
row.id = rs.getInt("id"); |
||||||
|
row.climber = rs.getString("climber"); |
||||||
|
if("".equals(row.climber)) |
||||||
|
row.climber = null; |
||||||
|
row.climber_type = EntityType.byValue(rs.getInt("climber_type")); |
||||||
|
row.ladder = rs.getString("ladder"); |
||||||
|
String[] breaked = row.ladder.split(Settings.separatorRegExp); |
||||||
|
if(breaked.length == 2) |
||||||
|
{ |
||||||
|
row.ladder = breaked[0]; |
||||||
|
row.instance = breaked[1]; |
||||||
|
} |
||||||
|
row.rank = rs.getInt("rank"); |
||||||
|
result.add(row); |
||||||
|
} |
||||||
|
rs.close(); |
||||||
|
} catch(SQLException ex) { |
||||||
|
MainPluginClass.consoleLog.log(Level.WARNING, "[rscp] Exception in rs2l(): {0}", ex.getLocalizedMessage()); |
||||||
|
} |
||||||
|
return result.toArray(new RowLadder[result.size()]); |
||||||
|
} |
||||||
|
@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() |
||||||
|
{ |
||||||
|
executeUpdate(loadResourceSQLT("Insert_example_rows_v1")); |
||||||
|
} |
||||||
|
@Override |
||||||
|
public synchronized void updateEntityText(String entity, boolean entity_type, String text, boolean isPrefix) |
||||||
|
{ |
||||||
|
if("".equals(entity)) |
||||||
|
return; |
||||||
|
if("".equals(text) || "\"\"".equals(text)) |
||||||
|
text = null; |
||||||
|
setupQueryTemplate("{ENTITY}", entity); |
||||||
|
setupQueryTemplate("{ENTITY_TYPE}", entity_type ? "1" : "0"); |
||||||
|
setupQueryTemplate("{TEXT_TYPE}", isPrefix ? "prefix" : "suffix"); |
||||||
|
setupQueryTemplate("{TEXT}", (text != null) ? "'" + text + "'" : "NULL"); |
||||||
|
executeUpdate(loadResourceSQLT("Update_entity_text")); |
||||||
|
} |
||||||
|
@Override |
||||||
|
public synchronized void setUserRank(String user, String ladder, int rank) |
||||||
|
{ |
||||||
|
if("".equals(user) || "".equals(ladder)) |
||||||
|
return; |
||||||
|
setupQueryTemplate("{USER}", user); |
||||||
|
setupQueryTemplate("{LADDER}", ladder); |
||||||
|
setupQueryTemplate("{RANK}", Integer.toString(rank)); |
||||||
|
executeUpdate(loadResourceSQLT("Set_user_rank")); |
||||||
|
} |
||||||
|
@Override |
||||||
|
public synchronized void dropUserFromLadder(String user, String ladder) |
||||||
|
{ |
||||||
|
String instance = ""; |
||||||
|
String[] breaked = ladder.split(Settings.separatorRegExp); |
||||||
|
if(breaked.length == 2) |
||||||
|
{ |
||||||
|
ladder = breaked[0]; |
||||||
|
instance = breaked[1]; |
||||||
|
} |
||||||
|
if("".equals(user) || "".equals(ladder)) |
||||||
|
return; |
||||||
|
setupQueryTemplate("{USER}", user); |
||||||
|
setupQueryTemplate("{LADDER}", ladder); |
||||||
|
setupQueryTemplate("{INSTANCE}", instance); |
||||||
|
executeUpdate(loadResourceSQLT("Drop_user_from_ladder")); |
||||||
|
} |
||||||
|
@Override |
||||||
|
public synchronized void addUserParentGroup(String user, String newGroup) |
||||||
|
{ |
||||||
|
setupQueryTemplate("{USER}", user); |
||||||
|
setupQueryTemplate("{PARENT}", newGroup); |
||||||
|
executeUpdate("INSERT INTO `{DATABASE}`.`{PREFIX}inheritance` (`entity`, `parent`, `inheritance_type`) VALUES ('{USER}', '{PARENT}', b'1');"); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,331 @@ |
|||||||
|
package ru.simsonic.rscPermissions; |
||||||
|
import java.util.ArrayList; |
||||||
|
import java.util.Collections; |
||||||
|
import java.util.Map; |
||||||
|
import org.bukkit.command.Command; |
||||||
|
import org.bukkit.command.CommandSender; |
||||||
|
import org.bukkit.entity.Player; |
||||||
|
import org.bukkit.permissions.PermissionAttachment; |
||||||
|
import ru.simsonic.rscPermissions.Importers.PermissionsEx_YAML; |
||||||
|
|
||||||
|
public class CommandHelper |
||||||
|
{ |
||||||
|
private final MainPluginClass plugin; |
||||||
|
public final Rewards rewardHelper; |
||||||
|
public final Ladders ladderHelper; |
||||||
|
public CommandHelper(final MainPluginClass rscp) |
||||||
|
{ |
||||||
|
this.plugin = rscp; |
||||||
|
rewardHelper = new Rewards(rscp); |
||||||
|
ladderHelper = new Ladders(rscp); |
||||||
|
} |
||||||
|
public void onCommand(CommandSender sender, Command cmd, String label, String[] args) throws CommandHelperAnswerException |
||||||
|
{ |
||||||
|
switch(cmd.getName().toLowerCase()) |
||||||
|
{ |
||||||
|
case "rscp": |
||||||
|
onCommandHub(sender, args); |
||||||
|
return; |
||||||
|
case "promote": |
||||||
|
if(args.length >= 1) |
||||||
|
{ |
||||||
|
ladderHelper.executePromotion(sender, args[0], (args.length >= 2) ? args[1] : null, true); |
||||||
|
return; |
||||||
|
} |
||||||
|
throw new CommandHelperAnswerException("/promote <user> <ladder[.instance]>"); |
||||||
|
case "demote": |
||||||
|
if(args.length >= 1) |
||||||
|
{ |
||||||
|
ladderHelper.executePromotion(sender, args[0], (args.length >= 2) ? args[1] : null, false); |
||||||
|
return; |
||||||
|
} |
||||||
|
throw new CommandHelperAnswerException("/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 |
||||||
|
{ |
||||||
|
final ArrayList<String> help = new ArrayList<>(); |
||||||
|
if(sender.hasPermission("rscp.admin")) |
||||||
|
{ |
||||||
|
help.add("/rscp (user|group|ladder) -- PermissionsEx-like admin commands"); |
||||||
|
help.add("/rscp (promote|demote) -- admin promotion/demotion commands"); |
||||||
|
} |
||||||
|
if(sender.hasPermission("rscp.admin.lock")) |
||||||
|
help.add("/rscp (lock|unlock) -- maintenance mode control"); |
||||||
|
if(sender.hasPermission("rscp.admin")) |
||||||
|
{ |
||||||
|
help.add("/rscp (examplerows|import) -- possible useful things"); |
||||||
|
help.add("/rscp (debug|fetch|reload) -- admin stuff"); |
||||||
|
} |
||||||
|
help.add("/rscp (help) -- show these notes"); |
||||||
|
if(help.size() > 0) |
||||||
|
help.add(0, "{MAGENTA}Usage:"); |
||||||
|
help.add(0, plugin.getDescription().getName() + " v" + plugin.getDescription().getVersion()); |
||||||
|
help.add(1, "Perfect Superperms manager for multiserver environments"); |
||||||
|
if(sender.hasPermission("rscp.admin")) |
||||||
|
help.add(2, "{_DS}Current serverId is \'{_LS}" + plugin.getServer().getServerId() + "{_DS}\' (server.properties)"); |
||||||
|
help.add("{_LG}" + plugin.getDescription().getWebsite()); |
||||||
|
if(args.length == 0) |
||||||
|
throw new CommandHelperAnswerException(help); |
||||||
|
switch(args[0].toLowerCase()) |
||||||
|
{ |
||||||
|
case "user": |
||||||
|
onCommandHubUser(sender, args); |
||||||
|
return; |
||||||
|
case "group": |
||||||
|
onCommandHubGroup(sender, args); |
||||||
|
return; |
||||||
|
case "ladder": |
||||||
|
onCommandHubLadder(sender, args); |
||||||
|
return; |
||||||
|
case "promote": |
||||||
|
/* rscp promote <user> <ladder> */ |
||||||
|
if(args.length < 3) |
||||||
|
throw new CommandHelperAnswerException("/rscp promote <player> <ladder>"); |
||||||
|
ladderHelper.executePromotion(sender, args[1], args[2], true); |
||||||
|
return; |
||||||
|
case "demote": |
||||||
|
/* rscp demote <user> <ladder> */ |
||||||
|
if(args.length < 3) |
||||||
|
throw new CommandHelperAnswerException("/rscp demote <player> <ladder>"); |
||||||
|
ladderHelper.executePromotion(sender, args[1], args[2], false); |
||||||
|
return; |
||||||
|
case "lock": |
||||||
|
/* rscp lock [mMode] */ |
||||||
|
if(sender.hasPermission("rscp.lock")) |
||||||
|
{ |
||||||
|
final String mMode = (args.length >= 2) ? args[1] : "default"; |
||||||
|
String mmon = "Maintenance mode enabled"; |
||||||
|
mmon = plugin.getConfig().getString("language.mModes.locked.default.mmon", mmon); |
||||||
|
mmon = plugin.getConfig().getString("language.mModes.locked." + mMode + ".mmon", mmon); |
||||||
|
plugin.maintenance.setMaintenanceMode(mMode); |
||||||
|
throw new CommandHelperAnswerException(mmon); |
||||||
|
} |
||||||
|
return; |
||||||
|
case "unlock": |
||||||
|
/* rscp unlock */ |
||||||
|
if(sender.hasPermission("rscp.lock")) |
||||||
|
{ |
||||||
|
String mmoff = "Maintenance mode disabled"; |
||||||
|
mmoff = plugin.getConfig().getString("language.mModes.unlocked", mmoff); |
||||||
|
plugin.maintenance.setMaintenanceMode(null); |
||||||
|
throw new CommandHelperAnswerException(mmoff); |
||||||
|
} |
||||||
|
break; |
||||||
|
case "examplerows": |
||||||
|
/* rscp examplerows */ |
||||||
|
if(sender.hasPermission("rscp.admin")) |
||||||
|
{ |
||||||
|
plugin.connectionList.threadInsertExampleRows(sender); |
||||||
|
throw new CommandHelperAnswerException("Example rows have been added into database."); |
||||||
|
} |
||||||
|
return; |
||||||
|
case "import": |
||||||
|
/* rscp import pex <filename.yml> */ |
||||||
|
if(sender.hasPermission("rscp.admin")) |
||||||
|
{ |
||||||
|
if(args.length > 1) |
||||||
|
switch(args[1].toLowerCase()) |
||||||
|
{ |
||||||
|
case "pex-yaml": |
||||||
|
if(args.length == 2) |
||||||
|
break; |
||||||
|
// TO DO HERE
|
||||||
|
PermissionsEx_YAML importer_pex = new PermissionsEx_YAML(plugin, args[2]); |
||||||
|
plugin.connectionList.threadFetchTablesData(); |
||||||
|
throw new CommandHelperAnswerException(new String[] |
||||||
|
{ |
||||||
|
"Data has been imported successfully!", |
||||||
|
"Entities: {MAGENTA}" + Integer.toString(importer_pex.getEntities().length), |
||||||
|
"Permissions: {MAGENTA}" + Integer.toString(importer_pex.getPermissions().length), |
||||||
|
"Inheritance: {MAGENTA}" + Integer.toString(importer_pex.getInheritance().length), |
||||||
|
"Ladders: {MAGENTA}" + Integer.toString(importer_pex.getLadders().length), |
||||||
|
"{_DR}{_B}FAKE :p - all this is undone yet!", |
||||||
|
}); |
||||||
|
case "pex-sql": |
||||||
|
plugin.connectionList.threadMigrateFromPExSQL(sender); |
||||||
|
throw new CommandHelperAnswerException("Trying to import PEX database into rscPermissions..."); |
||||||
|
} |
||||||
|
throw new CommandHelperAnswerException(new String[] |
||||||
|
{ |
||||||
|
"Usage: {GOLD}/rscp import <importer> [options]", |
||||||
|
"Available importers:", |
||||||
|
"{_LR}pex-yaml{_LS} (PermissionsEx)", |
||||||
|
"{_LG}pex-sql{_LS} (PermissionsEx)", |
||||||
|
}); |
||||||
|
} |
||||||
|
return; |
||||||
|
case "fetch": |
||||||
|
/* rscp fetch */ |
||||||
|
if(sender.hasPermission("rscp.admin.reload")) |
||||||
|
{ |
||||||
|
plugin.connectionList.threadFetchTablesData(); |
||||||
|
throw new CommandHelperAnswerException("Tables have been fetched."); |
||||||
|
} |
||||||
|
return; |
||||||
|
case "reload": |
||||||
|
/* rscp reload */ |
||||||
|
if(sender.hasPermission("rscp.admin.reload")) |
||||||
|
{ |
||||||
|
plugin.getServer().getPluginManager().disablePlugin(plugin); |
||||||
|
plugin.getServer().getPluginManager().enablePlugin(plugin); |
||||||
|
throw new CommandHelperAnswerException("Plugin has been reloaded."); |
||||||
|
} |
||||||
|
return; |
||||||
|
case "update": |
||||||
|
/* rscp update */ |
||||||
|
if(sender.hasPermission("rscp.admin")) |
||||||
|
throw new CommandHelperAnswerException(plugin.doUpdate(sender)); |
||||||
|
return; |
||||||
|
case "debug": |
||||||
|
/* rscp debug [yes|on|no|off|toggle] */ |
||||||
|
if(sender.hasPermission("rscp.admin")) |
||||||
|
throw new CommandHelperAnswerException("Not implemented yet."); |
||||||
|
return; |
||||||
|
case "help": |
||||||
|
default: |
||||||
|
throw new CommandHelperAnswerException(help); |
||||||
|
} |
||||||
|
} |
||||||
|
private void onCommandHubUser(CommandSender sender, String[] args) throws CommandHelperAnswerException |
||||||
|
{ |
||||||
|
if(sender.hasPermission("rscp.admin") == false) |
||||||
|
throw new CommandHelperAnswerException("Not enough permissions."); |
||||||
|
final String[] help = new String[] |
||||||
|
{ |
||||||
|
"rscPermissions command hub (user section).", |
||||||
|
"{MAGENTA}Usage:", |
||||||
|
"/rscp user <user> list permissions", |
||||||
|
"/rscp user <user> list groups", |
||||||
|
// "/rscp user <user> list ranks",
|
||||||
|
"/rscp user <user> prefix [prefix]", |
||||||
|
"/rscp user <user> suffix [suffix]", |
||||||
|
}; |
||||||
|
if(args.length < 3) |
||||||
|
throw new CommandHelperAnswerException(help); |
||||||
|
final Player player = plugin.getServer().getPlayerExact(args[1]); |
||||||
|
if(player == null) |
||||||
|
throw new CommandHelperAnswerException("Player should be online"); |
||||||
|
final ArrayList<String> list = new ArrayList<>(); |
||||||
|
switch(args[2].toLowerCase()) |
||||||
|
{ |
||||||
|
case "list": |
||||||
|
if(args.length < 4) |
||||||
|
throw new CommandHelperAnswerException(help); |
||||||
|
switch(args[3].toLowerCase()) |
||||||
|
{ |
||||||
|
case "permissions": |
||||||
|
list.add("{MAGENTA}Permission list for {_YL}" + player.getName()); |
||||||
|
final PermissionAttachment pa = plugin.attachments.get(player); |
||||||
|
if(pa == null) |
||||||
|
break; |
||||||
|
final Map<String, Boolean> pv = pa.getPermissions(); |
||||||
|
if(pv == null) |
||||||
|
break; |
||||||
|
final ArrayList<String> sorted_keys = new ArrayList<>(pv.keySet()); |
||||||
|
Collections.sort(sorted_keys); |
||||||
|
for(String perm : sorted_keys) |
||||||
|
if(pv.containsKey(perm)) |
||||||
|
list.add((pv.get(perm) ? "{_LG}" : "{_LR}") + perm); |
||||||
|
throw new CommandHelperAnswerException(list); |
||||||
|
case "groups": |
||||||
|
list.add("{MAGENTA}Group list for {_YL}" + player.getName() + "{MAGENTA}:"); |
||||||
|
ArrayList<String> groups = plugin.cache.getUserGroups(player.getName()); |
||||||
|
for(String group : groups) |
||||||
|
list.add("{_LG}" + group); |
||||||
|
throw new CommandHelperAnswerException(list); |
||||||
|
/* |
||||||
|
case "ranks": |
||||||
|
list.add("{MAGENTA}Ranks of player {_YL}" + player.getName() + "{MAGENTA}:"); |
||||||
|
throw new CommandHelperAnswerException(list); |
||||||
|
*/ |
||||||
|
} |
||||||
|
throw new CommandHelperAnswerException(list); |
||||||
|
case "prefix": |
||||||
|
if(args.length > 3) |
||||||
|
{ |
||||||
|
plugin.API.setPlayerPrefix(null, player.getName(), args[3]); |
||||||
|
list.add("{MAGENTA}Prefix for user {_YL}" + player.getName() + |
||||||
|
" {MAGENTA}has been set to \"{_R}" + plugin.cache.userGetPrefix(player.getName()) + "{MAGENTA}\"."); |
||||||
|
} else |
||||||
|
list.add("{MAGENTA}Prefix for user {_YL}" + player.getName() + |
||||||
|
" {MAGENTA}is \"{_R}" + plugin.cache.userGetPrefix(player.getName()) + "{MAGENTA}\"."); |
||||||
|
throw new CommandHelperAnswerException(list); |
||||||
|
case "suffix": |
||||||
|
if(args.length > 3) |
||||||
|
{ |
||||||
|
plugin.API.setPlayerSuffix(null, player.getName(), args[3]); |
||||||
|
list.add("{MAGENTA}Suffix for user {_YL}" + player.getName() + |
||||||
|
" {MAGENTA}has been set to \"{_R}" + plugin.cache.userGetSuffix(player.getName()) + "{MAGENTA}\"."); |
||||||
|
} else |
||||||
|
list.add("{MAGENTA}Suffix for user {_YL}" + player.getName() + |
||||||
|
" {MAGENTA}is \"{_R}" + plugin.cache.userGetSuffix(player.getName()) + "{MAGENTA}\"."); |
||||||
|
throw new CommandHelperAnswerException(list); |
||||||
|
} |
||||||
|
} |
||||||
|
private void onCommandHubGroup(CommandSender sender, String[] args) throws CommandHelperAnswerException |
||||||
|
{ |
||||||
|
if(sender.hasPermission("rscp.admin") == false) |
||||||
|
throw new CommandHelperAnswerException("Not enough permissions."); |
||||||
|
final String[] help = new String[] |
||||||
|
{ |
||||||
|
"rscPermissions command hub (group section).", |
||||||
|
"{MAGENTA}Usage:", |
||||||
|
// "/rscp group <group> list permissions",
|
||||||
|
// "/rscp group <group> list ranks",
|
||||||
|
"/rscp group <group> prefix [prefix]", |
||||||
|
"/rscp group <group> suffix [suffix]", |
||||||
|
}; |
||||||
|
if(args.length < 3) |
||||||
|
throw new CommandHelperAnswerException(help); |
||||||
|
final String group = args[1]; |
||||||
|
final ArrayList<String> list = new ArrayList<>(); |
||||||
|
switch(args[2].toLowerCase()) |
||||||
|
{ |
||||||
|
case "prefix": |
||||||
|
if(args.length > 3) |
||||||
|
{ |
||||||
|
plugin.API.setGroupPrefix(null, group, args[3]); |
||||||
|
list.add("{MAGENTA}Prefix for group {_YL}" + group + |
||||||
|
" {MAGENTA}has been set to \"{_R}" + plugin.cache.groupGetPrefix(group) + "{MAGENTA}\"."); |
||||||
|
} else |
||||||
|
list.add("{MAGENTA}Prefix for group {_YL}" + group + |
||||||
|
" {MAGENTA}is \"{_R}" + plugin.cache.groupGetPrefix(group) + "{MAGENTA}\"."); |
||||||
|
throw new CommandHelperAnswerException(list); |
||||||
|
case "suffix": |
||||||
|
if(args.length > 3) |
||||||
|
{ |
||||||
|
plugin.API.setGroupSuffix(null, group, args[3]); |
||||||
|
list.add("{MAGENTA}Suffix for group {_YL}" + group + |
||||||
|
" {MAGENTA}has been set to \"{_R}" + plugin.cache.groupGetSuffix(group) + "{MAGENTA}\"."); |
||||||
|
} else |
||||||
|
list.add("{MAGENTA}Suffix for group {_YL}" + group + |
||||||
|
" {MAGENTA}is \"{_R}" + plugin.cache.groupGetSuffix(group) + "{MAGENTA}\"."); |
||||||
|
throw new CommandHelperAnswerException(list); |
||||||
|
} |
||||||
|
} |
||||||
|
private void onCommandHubLadder(CommandSender sender, String[] args) throws CommandHelperAnswerException |
||||||
|
{ |
||||||
|
if(sender.hasPermission("rscp.admin") == false) |
||||||
|
throw new CommandHelperAnswerException("Not enough permissions."); |
||||||
|
final String[] help = new String[] |
||||||
|
{ |
||||||
|
"rscPermissions command hub (ladder section).", |
||||||
|
"{MAGENTA}Usage:", |
||||||
|
// "/rscp ladder <ladder> list groups",
|
||||||
|
// "/rscp ladder <ladder> list users",
|
||||||
|
}; |
||||||
|
if(args.length < 3) |
||||||
|
throw new CommandHelperAnswerException(help); |
||||||
|
final String ladder = args[1]; |
||||||
|
throw new CommandHelperAnswerException("dummy :p)"); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,23 @@ |
|||||||
|
package ru.simsonic.rscPermissions; |
||||||
|
import java.util.List; |
||||||
|
|
||||||
|
public class CommandHelperAnswerException extends Exception |
||||||
|
{ |
||||||
|
private final String[] message; |
||||||
|
public CommandHelperAnswerException(String message) |
||||||
|
{ |
||||||
|
this.message = new String[]{message}; |
||||||
|
} |
||||||
|
public CommandHelperAnswerException(String[] messages) |
||||||
|
{ |
||||||
|
this.message = messages; |
||||||
|
} |
||||||
|
public CommandHelperAnswerException(List<String> messages) |
||||||
|
{ |
||||||
|
this.message = messages.toArray(new String[messages.size()]); |
||||||
|
} |
||||||
|
public String[] getMessageArray() |
||||||
|
{ |
||||||
|
return message; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,130 @@ |
|||||||
|
package ru.simsonic.rscPermissions; |
||||||
|
import ru.simsonic.utilities.ConnectionMySQL; |
||||||
|
import java.util.logging.Level; |
||||||
|
import org.bukkit.command.CommandSender; |
||||||
|
import org.bukkit.scheduler.BukkitRunnable; |
||||||
|
import ru.simsonic.rscPermissions.Backends.BackendMySQL; |
||||||
|
|
||||||
|
public class ConnectionHelper extends BackendMySQL |
||||||
|
{ |
||||||
|
private ConnectionHelper nextInChain = null; |
||||||
|
public ConnectionHelper(MainPluginClass rscp, ConnectionHelper nextInChain) |
||||||
|
{ |
||||||
|
super(rscp); |
||||||
|
this.nextInChain = nextInChain; |
||||||
|
} |
||||||
|
protected synchronized BackendMySQL findConnectedNode() |
||||||
|
{ |
||||||
|
for(ConnectionHelper result = this; result != null; result = result.nextInChain) |
||||||
|
if(result.isConnected()) |
||||||
|
return (BackendMySQL)result; |
||||||
|
return null; |
||||||
|
} |
||||||
|
@Override |
||||||
|
public void Disconnect() |
||||||
|
{ |
||||||
|
if(nextInChain != null) |
||||||
|
{ |
||||||
|
nextInChain.Disconnect(); |
||||||
|
nextInChain = null; |
||||||
|
} |
||||||
|
super.Disconnect(); |
||||||
|
} |
||||||
|
public Thread threadFetchTablesData() |
||||||
|
{ |
||||||
|
final Thread result = new Thread() |
||||||
|
{ |
||||||
|
@Override |
||||||
|
public void run() |
||||||
|
{ |
||||||
|
// Fetch tables
|
||||||
|
final ConnectionMySQL connection = findConnectedNode(); |
||||||
|
if(connection == null) |
||||||
|
return; |
||||||
|
fetchIntoCache(plugin.cache); |
||||||
|
if(plugin.settings.isRewardsEnabled()) |
||||||
|
fetchRewards(plugin.commandExecutor.rewardHelper); |
||||||
|
// Update permissions for online players
|
||||||
|
try |
||||||
|
{ |
||||||
|
Runnable syncTask = new Runnable() |
||||||
|
{ |
||||||
|
@Override |
||||||
|
public synchronized void run() |
||||||
|
{ |
||||||
|
plugin.recalculateOnlinePlayers(); |
||||||
|
notify(); |
||||||
|
} |
||||||
|
}; |
||||||
|
synchronized(syncTask) |
||||||
|
{ |
||||||
|
plugin.getServer().getScheduler().runTask(plugin, syncTask); |
||||||
|
syncTask.wait(); |
||||||
|
} |
||||||
|
} catch(InterruptedException ex) { |
||||||
|
MainPluginClass.consoleLog.log(Level.SEVERE, "[rscp] Exception in FetchTables(): {0}", ex.getLocalizedMessage()); |
||||||
|
} |
||||||
|
plugin.cache.calculateStartupPermissions(); |
||||||
|
} |
||||||
|
}; |
||||||
|
result.start(); |
||||||
|
return result; |
||||||
|
} |
||||||
|
public Thread threadInsertExampleRows(final CommandSender sender) |
||||||
|
{ |
||||||
|
final Thread result = new Thread() |
||||||
|
{ |
||||||
|
@Override |
||||||
|
public void run() |
||||||
|
{ |
||||||
|
setName("InsertExampleRows"); |
||||||
|
final BackendMySQL backend = findConnectedNode(); |
||||||
|
if(backend == null || !backend.canWrite()) |
||||||
|
return; |
||||||
|
backend.insertExampleRows(); |
||||||
|
plugin.getServer().getScheduler().runTask(plugin, new Runnable() |
||||||
|
{ |
||||||
|
@Override |
||||||
|
public void run() |
||||||
|
{ |
||||||
|
sender.sendMessage("Database tables were filled with example rows."); |
||||||
|
} |
||||||
|
}); |
||||||
|
} |
||||||
|
}; |
||||||
|
result.start(); |
||||||
|
return result; |
||||||
|
} |
||||||
|
public Thread threadMigrateFromPExSQL(final CommandSender sender) |
||||||
|
{ |
||||||
|
final Thread result = new Thread() |
||||||
|
{ |
||||||
|
@Override |
||||||
|
public void run() |
||||||
|
{ |
||||||
|
try |
||||||
|
{ |
||||||
|
setName("MigrateFromPExSQL"); |
||||||
|
final BackendMySQL backend = findConnectedNode(); |
||||||
|
if(backend == null || !backend.canWrite()) |
||||||
|
return; |
||||||
|
backend.executeUpdate(loadResourceSQLT("Migrate_from_PermissionsEx")); |
||||||
|
threadFetchTablesData().join(); |
||||||
|
plugin.getServer().getScheduler().runTask(plugin, new BukkitRunnable() |
||||||
|
{ |
||||||
|
@Override |
||||||
|
public void run() |
||||||
|
{ |
||||||
|
plugin.Message(sender, "Migration from PermissionsEx (MySQL backend) done!"); |
||||||
|
plugin.Message(sender, "Check the latest database row for new data."); |
||||||
|
} |
||||||
|
}); |
||||||
|
} catch(InterruptedException ex) { |
||||||
|
MainPluginClass.consoleLog.log(Level.SEVERE, "[rscp] Exception in MigrateFromPExSQL(): {0}", ex.getLocalizedMessage()); |
||||||
|
} |
||||||
|
} |
||||||
|
}; |
||||||
|
result.start(); |
||||||
|
return result; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,20 @@ |
|||||||
|
package ru.simsonic.rscPermissions.DataTypes; |
||||||
|
import java.util.regex.Pattern; |
||||||
|
|
||||||
|
public abstract class AbstractRow |
||||||
|
{ |
||||||
|
public int id = 0; |
||||||
|
public static enum Table |
||||||
|
{ |
||||||
|
entities, permissions, inheritance, ladders, unknown; |
||||||
|
} |
||||||
|
public abstract Table getTable(); |
||||||
|
private static final Pattern patternUUID = Pattern.compile( |
||||||
|
"<uuid>" + "(?:[a-f\\d]{8}(?:-[a-f\\d]{4}){3}-[a-f\\d]{12})" + "</uuid>"); |
||||||
|
private static boolean isCorrectUUID(String entityName) |
||||||
|
{ |
||||||
|
if(entityName == null) |
||||||
|
return false; |
||||||
|
return patternUUID.matcher("<uuid>" + entityName.toLowerCase() + "</uuid>").find(); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,106 @@ |
|||||||
|
package ru.simsonic.rscPermissions.DataTypes; |
||||||
|
import java.util.ArrayList; |
||||||
|
import java.util.Set; |
||||||
|
import java.util.regex.Matcher; |
||||||
|
import java.util.regex.Pattern; |
||||||
|
import org.bukkit.Location; |
||||||
|
import org.bukkit.World; |
||||||
|
import ru.simsonic.rscPermissions.Settings; |
||||||
|
import ru.simsonic.utilities.LanguageUtility; |
||||||
|
|
||||||
|
public class Destination |
||||||
|
{ |
||||||
|
private final String region; |
||||||
|
private final String world; |
||||||
|
private final String serverId; |
||||||
|
private Destination() |
||||||
|
{ |
||||||
|
this.region = null; |
||||||
|
this.world = null; |
||||||
|
this.serverId = null; |
||||||
|
} |
||||||
|
private Destination(String region, String world, String serverId) |
||||||
|
{ |
||||||
|
this.region = region; |
||||||
|
this.world = world; |
||||||
|
this.serverId = serverId; |
||||||
|
} |
||||||
|
public boolean IsServerIdApplicable(String serverId) |
||||||
|
{ |
||||||
|
return wildcardTesting(serverId, this.serverId); |
||||||
|
} |
||||||
|
public boolean IsLocationApplicable(Location location, Set<String> regions, String instantiator) |
||||||
|
{ |
||||||
|
if(location != null) |
||||||
|
{ |
||||||
|
if(location.getWorld() != null) |
||||||
|
if(IsWorldApplicable(location.getWorld(), instantiator)) |
||||||
|
return IsRegionApplicable(regions, instantiator); |
||||||
|
} else { |
||||||
|
if(this.world == null) |
||||||
|
return IsRegionApplicable(regions, instantiator); |
||||||
|
} |
||||||
|
return false; |
||||||
|
} |
||||||
|
private boolean IsWorldApplicable(World world, String instantiator) |
||||||
|
{ |
||||||
|
if(this.world == null || "".equals(this.world) || "*".equals(this.world)) |
||||||
|
return true; |
||||||
|
final String instantiated = (instantiator != null && !"".equals(instantiator)) ? |
||||||
|
this.world.replaceAll(Settings.instantiatorRegExp, instantiator) : |
||||||
|
this.world; |
||||||
|
return wildcardTesting(world.getName(), instantiated); |
||||||
|
} |
||||||
|
private boolean IsRegionApplicable(Set<String> regions, String instantiator) |
||||||
|
{ |
||||||
|
if(this.region == null || "".equals(this.region) || "*".equals(this.region)) |
||||||
|
return true; |
||||||
|
final String instantiated = (instantiator != null && !"".equals(instantiator)) ? |
||||||
|
this.region.replaceAll(Settings.instantiatorRegExp, instantiator) : |
||||||
|
this.region; |
||||||
|
for(String regionId : regions) |
||||||
|
if(wildcardTesting(regionId, instantiated)) |
||||||
|
return true; |
||||||
|
return false; |
||||||
|
} |
||||||
|
private static boolean wildcardTesting(String testing, String pattern) |
||||||
|
{ |
||||||
|
if(pattern == null || "".equals(pattern)) |
||||||
|
return true; |
||||||
|
if(testing == null || "".equals(testing)) |
||||||
|
return false; |
||||||
|
return LanguageUtility.wildcardMatch( |
||||||
|
"<wildcard>" + testing.toLowerCase() + "</wildcard>", |
||||||
|
"<wildcard>" + pattern.toLowerCase() + "</wildcard>"); |
||||||
|
} |
||||||
|
public static Destination[] ParseDestinations(String destinations) |
||||||
|
{ |
||||||
|
if(destinations == null) |
||||||
|
return new Destination[] { new Destination() }; |
||||||
|
if(destinations.isEmpty()) |
||||||
|
return new Destination[] { new Destination() }; |
||||||
|
final String[] destinationsList = destinations.split("\\s*(?:;|,|\\r|\\n)+\\s*"); |
||||||
|
final ArrayList<Destination> result = new ArrayList(destinationsList.length); |
||||||
|
for(int nDestination = 0; nDestination < destinationsList.length; nDestination += 1) |
||||||
|
if(destinationsList[nDestination].isEmpty() == false) |
||||||
|
result.add(ParseDestination(destinationsList[nDestination])); |
||||||
|
return result.toArray(new Destination[result.size()]); |
||||||
|
} |
||||||
|
private static final Pattern patternDestination = Pattern.compile( |
||||||
|
"<destination>" + "(?:((?:\\w|\\*|\\?)*):)?((?:\\w|\\*|\\?)*)?(?:@((?:\\w|\\*|\\?)*))?" + "</destination>"); |
||||||
|
private static Destination ParseDestination(String destination) |
||||||
|
{ |
||||||
|
Matcher match = patternDestination.matcher("<destination>" + destination + "</destination>"); |
||||||
|
if(match.find()) |
||||||
|
{ |
||||||
|
final String group1 = match.group(1); |
||||||
|
final String group2 = match.group(2); |
||||||
|
final String group3 = match.group(3); |
||||||
|
final String region = (group1 == null || "".equals(group1)) ? "*" : group1; |
||||||
|
final String world = (group2 == null || "".equals(group2)) ? "*" : group2; |
||||||
|
final String serverId = (group3 == null || "".equals(group3)) ? "*" : group3; |
||||||
|
return new Destination(region, world, serverId); |
||||||
|
} |
||||||
|
return new Destination(); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,33 @@ |
|||||||
|
package ru.simsonic.rscPermissions.DataTypes; |
||||||
|
|
||||||
|
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 EntityType entity_type; |
||||||
|
public String prefix; |
||||||
|
public String suffix; |
||||||
|
@Override |
||||||
|
public Table getTable() |
||||||
|
{ |
||||||
|
return Table.entities; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,25 @@ |
|||||||
|
package ru.simsonic.rscPermissions.DataTypes; |
||||||
|
import java.sql.Timestamp; |
||||||
|
import ru.simsonic.rscPermissions.DataTypes.RowEntity.EntityType; |
||||||
|
|
||||||
|
public class RowInheritance extends AbstractRow implements Comparable<RowInheritance> |
||||||
|
{ |
||||||
|
public String entity; |
||||||
|
public String parent; |
||||||
|
public String instance; |
||||||
|
public EntityType child_type; |
||||||
|
public int priority; |
||||||
|
public Destination destination; |
||||||
|
public int expirience; |
||||||
|
public Timestamp lifetime; |
||||||
|
@Override |
||||||
|
public int compareTo(RowInheritance t) |
||||||
|
{ |
||||||
|
return (priority != t.priority) ? priority - t.priority : parent.compareTo(t.parent); |
||||||
|
} |
||||||
|
@Override |
||||||
|
public Table getTable() |
||||||
|
{ |
||||||
|
return Table.inheritance; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,45 @@ |
|||||||
|
package ru.simsonic.rscPermissions.DataTypes; |
||||||
|
import ru.simsonic.rscPermissions.DataTypes.RowEntity.EntityType; |
||||||
|
|
||||||
|
public class RowLadder extends AbstractRow implements Comparable<RowLadder> |
||||||
|
{ |
||||||
|
public String climber; |
||||||
|
public EntityType climber_type; |
||||||
|
public String ladder; |
||||||
|
public String instance; |
||||||
|
public int rank; |
||||||
|
@Override |
||||||
|
public int compareTo(RowLadder t) |
||||||
|
{ |
||||||
|
return rank - t.rank; |
||||||
|
} |
||||||
|
public RowLadder nextNode; |
||||||
|
public RowLadder prevNode; |
||||||
|
public int getLadderTopRank() |
||||||
|
{ |
||||||
|
int result = rank; |
||||||
|
for(RowLadder row = nextNode; row != null; row = nextNode) |
||||||
|
result = row.rank; |
||||||
|
return result; |
||||||
|
} |
||||||
|
public int getLadderBottomRank() |
||||||
|
{ |
||||||
|
int result = rank; |
||||||
|
for(RowLadder row = prevNode; row != null; row = prevNode) |
||||||
|
result = row.rank; |
||||||
|
return result; |
||||||
|
} |
||||||
|
public RowLadder getActualNode(int userRank) |
||||||
|
{ |
||||||
|
RowLadder result = this; |
||||||
|
for(; result.nextNode != null; result = result.nextNode) |
||||||
|
if(result.nextNode.rank > userRank) |
||||||
|
break; |
||||||
|
return result; |
||||||
|
} |
||||||
|
@Override |
||||||
|
public Table getTable() |
||||||
|
{ |
||||||
|
return Table.ladders; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,19 @@ |
|||||||
|
package ru.simsonic.rscPermissions.DataTypes; |
||||||
|
import java.sql.Timestamp; |
||||||
|
import ru.simsonic.rscPermissions.DataTypes.RowEntity.EntityType; |
||||||
|
|
||||||
|
public class RowPermission extends AbstractRow |
||||||
|
{ |
||||||
|
public String entity; |
||||||
|
public EntityType entity_type; |
||||||
|
public String permission; |
||||||
|
public boolean value; |
||||||
|
public Destination destination; |
||||||
|
public int expirience; |
||||||
|
public Timestamp lifetime; |
||||||
|
@Override |
||||||
|
public Table getTable() |
||||||
|
{ |
||||||
|
return Table.permissions; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,17 @@ |
|||||||
|
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; |
||||||
|
} |
@ -0,0 +1,6 @@ |
|||||||
|
package ru.simsonic.rscPermissions.DataTypes; |
||||||
|
|
||||||
|
public class RowServer |
||||||
|
{ |
||||||
|
public String serverId; |
||||||
|
} |
@ -0,0 +1,27 @@ |
|||||||
|
package ru.simsonic.rscPermissions.Importers; |
||||||
|
import java.util.ArrayList; |
||||||
|
import ru.simsonic.rscPermissions.DataTypes.*; |
||||||
|
|
||||||
|
public abstract class BaseImporter |
||||||
|
{ |
||||||
|
protected ArrayList<RowEntity> imported_e = new ArrayList<>(); |
||||||
|
protected ArrayList<RowPermission> imported_p = new ArrayList<>(); |
||||||
|
protected ArrayList<RowInheritance> imported_i = new ArrayList<>(); |
||||||
|
protected ArrayList<RowLadder> imported_l = new ArrayList<>(); |
||||||
|
public RowEntity[] getEntities() |
||||||
|
{ |
||||||
|
return imported_e.toArray(new RowEntity[imported_e.size()]); |
||||||
|
} |
||||||
|
public RowPermission[] getPermissions() |
||||||
|
{ |
||||||
|
return imported_p.toArray(new RowPermission[imported_p.size()]); |
||||||
|
} |
||||||
|
public RowInheritance[] getInheritance() |
||||||
|
{ |
||||||
|
return imported_i.toArray(new RowInheritance[imported_i.size()]); |
||||||
|
} |
||||||
|
public RowLadder[] getLadders() |
||||||
|
{ |
||||||
|
return imported_l.toArray(new RowLadder[imported_l.size()]); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,23 @@ |
|||||||
|
package ru.simsonic.rscPermissions.Importers; |
||||||
|
import java.io.File; |
||||||
|
import org.bukkit.configuration.ConfigurationSection; |
||||||
|
import org.bukkit.configuration.file.FileConfiguration; |
||||||
|
import org.bukkit.configuration.file.YamlConfiguration; |
||||||
|
import org.bukkit.plugin.Plugin; |
||||||
|
|
||||||
|
public final class PermissionsEx_YAML extends BaseImporter |
||||||
|
{ |
||||||
|
public PermissionsEx_YAML(Plugin plugin, String fileName) |
||||||
|
{ |
||||||
|
if(fileName == null || "".equals(fileName)) |
||||||
|
fileName = "permissions.yml"; |
||||||
|
try |
||||||
|
{ |
||||||
|
final FileConfiguration config = YamlConfiguration.loadConfiguration(new File(plugin.getDataFolder(), fileName)); |
||||||
|
final ConfigurationSection csGroups = config.getConfigurationSection("groups"); |
||||||
|
final ConfigurationSection csUsers = config.getConfigurationSection("users"); |
||||||
|
final ConfigurationSection csWorlds = config.getConfigurationSection("worlds"); |
||||||
|
} catch(NullPointerException ex) { |
||||||
|
} |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,120 @@ |
|||||||
|
package ru.simsonic.rscPermissions; |
||||||
|
import java.util.ArrayList; |
||||||
|
import org.bukkit.command.CommandSender; |
||||||
|
import org.bukkit.entity.Player; |
||||||
|
import ru.simsonic.rscPermissions.Backends.BackendMySQL; |
||||||
|
import ru.simsonic.rscPermissions.DataTypes.RowLadder; |
||||||
|
|
||||||
|
public class Ladders |
||||||
|
{ |
||||||
|
private final MainPluginClass plugin; |
||||||
|
public Ladders(MainPluginClass rscp) |
||||||
|
{ |
||||||
|
this.plugin = rscp; |
||||||
|
} |
||||||
|
public String[] executePromotion(CommandSender sender, String user, String ladder, boolean bPromote) |
||||||
|
{ |
||||||
|
if(plugin.connectionList == null) |
||||||
|
return null; |
||||||
|
final BackendMySQL connection = plugin.connectionList.findConnectedNode(); |
||||||
|
if(connection == null || !connection.canWrite()) |
||||||
|
return null; |
||||||
|
if("".equals(user) || (user == null)) |
||||||
|
return new String[] { (bPromote ? "/promote" : "/demote") + " <user> <ladder>" }; |
||||||
|
if("".equals(ladder) || (ladder == null)) |
||||||
|
return new String[] { "You should specify ladder to promote on." }; |
||||||
|
final Player player = plugin.getServer().getPlayerExact(user); |
||||||
|
if(player == null) |
||||||
|
return new String[] { "Player must be online." }; |
||||||
|
String template = ladder; |
||||||
|
String instance = ""; |
||||||
|
String[] breaked = ladder.split(Settings.separatorRegExp); |
||||||
|
if(breaked.length == 2) |
||||||
|
{ |
||||||
|
template = breaked[0].toLowerCase(); |
||||||
|
instance = breaked[1]; |
||||||
|
} |
||||||
|
final String perm_onself = bPromote ? "rscp.promote-self." : "rscp.demote-self."; |
||||||
|
final String perm_sender = bPromote ? "rscp.promote." : "rscp.demote."; |
||||||
|
final String perm_target = bPromote ? "rscp.promotable." : "rscp.demotable."; |
||||||
|
boolean bOS = sender.hasPermission(perm_onself + "*"); |
||||||
|
boolean bSP = sender.hasPermission(perm_sender + "*"); |
||||||
|
boolean bUP = player.hasPermission(perm_target + "*"); |
||||||
|
if(!"".equals(instance)) |
||||||
|
{ |
||||||
|
bOS = bOS || sender.hasPermission(perm_onself + template + ".*"); |
||||||
|
bOS = bOS || sender.hasPermission(perm_onself + template + "." + instance.toLowerCase()); |
||||||
|
bSP = bSP || sender.hasPermission(perm_sender + template + ".*"); |
||||||
|
bSP = bSP || sender.hasPermission(perm_sender + template + "." + instance.toLowerCase()); |
||||||
|
bUP = bUP || player.hasPermission(perm_target + template + ".*"); |
||||||
|
bUP = bUP || player.hasPermission(perm_target + template + "." + instance.toLowerCase()); |
||||||
|
} else { |
||||||
|
bOS = bOS || sender.hasPermission(perm_onself + template); |
||||||
|
bSP = bSP || sender.hasPermission(perm_sender + template); |
||||||
|
bUP = bUP || player.hasPermission(perm_target + template); |
||||||
|
} |
||||||
|
if(sender instanceof Player) |
||||||
|
if(player != (Player)sender) |
||||||
|
bOS = false; |
||||||
|
boolean bPromotionAllowed = bOS || (bSP && bUP) || sender.hasPermission("rscp.admin.promote"); |
||||||
|
if(bPromotionAllowed == false) |
||||||
|
{ |
||||||
|
if(bSP == false) |
||||||
|
return new String[] { "You are not allowed to promote/demote on this ladder." }; |
||||||
|
if(bUP == false) |
||||||
|
return new String[] { "Player is not promotable on this ladder." }; |
||||||
|
} |
||||||
|
int rank = plugin.cache.getUserRank(user, template, instance); |
||||||
|
final ArrayList<RowLadder> ladderArray = plugin.cache.buildLadderTemplate(template); |
||||||
|
if(ladderArray.isEmpty()) |
||||||
|
return new String[] { "There is no such ladder." }; |
||||||
|
RowLadder position = ladderArray.get(0).getActualNode(rank); |
||||||
|
if(bPromote) |
||||||
|
{ |
||||||
|
if(position.nextNode != null) |
||||||
|
position = position.nextNode; |
||||||
|
} else |
||||||
|
if(position.prevNode != null) |
||||||
|
position = position.prevNode; |
||||||
|
if(position.instance != null) |
||||||
|
if(Settings.instantiator.equals(position.instance)) |
||||||
|
{ |
||||||
|
if("".equals(instance)) |
||||||
|
return new String[] { "Operation requires ladder instance (<template>.<instance>)." }; |
||||||
|
} else |
||||||
|
instance = ("".equals(position.instance) ? null : position.instance); |
||||||
|
else |
||||||
|
instance = null; |
||||||
|
ladder = position.ladder + ((instance != null) ? "." + instance : ""); |
||||||
|
connection.dropUserFromLadder(user, ladder); |
||||||
|
connection.setUserRank(user, ladder, position.rank); |
||||||
|
final String parent = position.climber + ((instance != null) ? "." + instance : ""); |
||||||
|
if(position.climber != null) |
||||||
|
connection.addUserParentGroup(user, parent); |
||||||
|
connection.fetchIntoCache(plugin.cache); |
||||||
|
plugin.cache.calculatePlayerPermissions(player); |
||||||
|
final String resultP = "{GOLD}You have been " + |
||||||
|
((position.climber != null) ? |
||||||
|
( |
||||||
|
(bPromote ? "promoted" : "demoted") + " to the group {_LS}" + |
||||||
|
position.climber + ((instance != null) ? " {_DS}(" + instance + ") " : "") + |
||||||
|
"{GOLD}on" |
||||||
|
) : "removed from" |
||||||
|
) + " the ladder {_LG}" + position.ladder + ((instance != null) ? "{_DS}(" + instance + ")" : "") + "{GOLD} by " + |
||||||
|
( |
||||||
|
(sender instanceof Player) ? |
||||||
|
((player == (Player)sender) ? "yourself" : "{_YL}" + sender.getName()) |
||||||
|
: "server" |
||||||
|
) + "{GOLD}."; |
||||||
|
final String resultS = "{GOLD}User {_YL}" + player.getName() + " {GOLD}has been " + |
||||||
|
((position.climber != null) ? |
||||||
|
( |
||||||
|
(bPromote ? "promoted" : "demoted") + " to the group {_LS}" + |
||||||
|
position.climber + ((instance != null) ? "{_DS}(" + instance + ") " : "") + |
||||||
|
"{GOLD}on" |
||||||
|
) : "removed from" |
||||||
|
) + " the ladder {_LG}" + position.ladder + ((instance != null) ? "{_DS}(" + instance + ")" : "") + "{GOLD}."; |
||||||
|
plugin.Message(player, resultP); |
||||||
|
return new String [] { resultS }; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,95 @@ |
|||||||
|
package ru.simsonic.rscPermissions; |
||||||
|
import java.util.ArrayList; |
||||||
|
import java.util.Arrays; |
||||||
|
import java.util.HashMap; |
||||||
|
import java.util.concurrent.ConcurrentHashMap; |
||||||
|
import ru.simsonic.rscPermissions.DataTypes.*; |
||||||
|
import ru.simsonic.rscPermissions.DataTypes.RowEntity.EntityType; |
||||||
|
|
||||||
|
public class LocalCacheData |
||||||
|
{ |
||||||
|
protected final MainPluginClass plugin; |
||||||
|
protected final HashMap<String, RowEntity> entities_g = new HashMap<>(); |
||||||
|
protected final HashMap<String, RowEntity> entities_u = new HashMap<>(); |
||||||
|
protected final ConcurrentHashMap<String, String> prefixes_u = new ConcurrentHashMap<>(); |
||||||
|
protected final ConcurrentHashMap<String, String> suffixes_u = new ConcurrentHashMap<>(); |
||||||
|
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<>(); |
||||||
|
protected final ArrayList<RowServer> servers = new ArrayList<>(); |
||||||
|
protected LocalCacheData(MainPluginClass rscp) |
||||||
|
{ |
||||||
|
this.plugin = rscp; |
||||||
|
} |
||||||
|
public synchronized int ImportEntities(RowEntity[] rows) |
||||||
|
{ |
||||||
|
entities_g.clear(); |
||||||
|
entities_u.clear(); |
||||||
|
if(rows == null) |
||||||
|
return 0; |
||||||
|
for(RowEntity row : rows) |
||||||
|
{ |
||||||
|
if(row.entity_type == EntityType.groupName) |
||||||
|
entities_g.put(row.entity.toLowerCase(), row); |
||||||
|
else |
||||||
|
entities_u.put(row.entity.toLowerCase(), row); |
||||||
|
} |
||||||
|
return entities_g.size() + entities_u.size(); |
||||||
|
} |
||||||
|
public synchronized int ImportPermissions(RowPermission[] rows) |
||||||
|
{ |
||||||
|
permissions_p2g.clear(); |
||||||
|
permissions_p2u.clear(); |
||||||
|
if(rows == null) |
||||||
|
return 0; |
||||||
|
for(RowPermission row : rows) |
||||||
|
{ |
||||||
|
if(row.entity_type == EntityType.groupName) |
||||||
|
permissions_p2g.add(row); |
||||||
|
else |
||||||
|
permissions_p2u.add(row); |
||||||
|
} |
||||||
|
return permissions_p2g.size() + permissions_p2u.size(); |
||||||
|
} |
||||||
|
public synchronized int ImportInheritance(RowInheritance[] rows) |
||||||
|
{ |
||||||
|
inheritance_g2g.clear(); |
||||||
|
inheritance_g2u.clear(); |
||||||
|
if(rows == null) |
||||||
|
return 0; |
||||||
|
for(RowInheritance row : rows) |
||||||
|
{ |
||||||
|
if(row.child_type == EntityType.groupName) |
||||||
|
inheritance_g2g.add(row); |
||||||
|
else |
||||||
|
inheritance_g2u.add(row); |
||||||
|
} |
||||||
|
return inheritance_g2g.size() + inheritance_g2u.size(); |
||||||
|
} |
||||||
|
public synchronized int ImportLadders(RowLadder[] rows) |
||||||
|
{ |
||||||
|
ladders_g.clear(); |
||||||
|
ladders_u.clear(); |
||||||
|
if(rows == null) |
||||||
|
return 0; |
||||||
|
for(RowLadder row : rows) |
||||||
|
{ |
||||||
|
if(row.climber_type == EntityType.groupName) |
||||||
|
ladders_g.add(row); |
||||||
|
else |
||||||
|
ladders_u.add(row); |
||||||
|
} |
||||||
|
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(); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,99 @@ |
|||||||
|
package ru.simsonic.rscPermissions; |
||||||
|
import java.util.ArrayList; |
||||||
|
import java.util.Collections; |
||||||
|
import java.util.HashSet; |
||||||
|
import java.util.Set; |
||||||
|
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 class LocalCacheFunctions extends LocalCacheTree |
||||||
|
{ |
||||||
|
public LocalCacheFunctions(MainPluginClass rscp) |
||||||
|
{ |
||||||
|
super(rscp); |
||||||
|
} |
||||||
|
public String userGetPrefix(String user) |
||||||
|
{ |
||||||
|
return prefixes_u.get(user); |
||||||
|
} |
||||||
|
public String userGetSuffix(String user) |
||||||
|
{ |
||||||
|
return suffixes_u.get(user); |
||||||
|
} |
||||||
|
public synchronized String groupGetPrefix(String group) |
||||||
|
{ |
||||||
|
if(group == null || "".equals(group)) |
||||||
|
return null; |
||||||
|
RowEntity entity = entities_g.get(group.toLowerCase()); |
||||||
|
return (entity != null) ? entity.prefix : null; |
||||||
|
} |
||||||
|
public synchronized String groupGetSuffix(String group) |
||||||
|
{ |
||||||
|
if(group == null || "".equals(group)) |
||||||
|
return null; |
||||||
|
RowEntity entity = entities_g.get(group.toLowerCase()); |
||||||
|
return (entity != null) ? entity.suffix : null; |
||||||
|
} |
||||||
|
public synchronized ArrayList<RowLadder> buildLadderTemplate(String ladder) |
||||||
|
{ |
||||||
|
final ArrayList<RowLadder> result = new ArrayList<>(); |
||||||
|
RowLadder prev = null; |
||||||
|
for(RowLadder row : ladders_g) |
||||||
|
if(row.ladder.equalsIgnoreCase(ladder)) |
||||||
|
{ |
||||||
|
if(prev != null) |
||||||
|
{ |
||||||
|
prev.nextNode = row; |
||||||
|
row.prevNode = prev; |
||||||
|
} |
||||||
|
result.add(row); |
||||||
|
prev = row; |
||||||
|
} |
||||||
|
Collections.sort(result); |
||||||
|
return result; |
||||||
|
} |
||||||
|
public synchronized int getUserRank(String user, String ladder, String instance) |
||||||
|
{ |
||||||
|
for(RowLadder row : ladders_u) |
||||||
|
if(row.climber.equalsIgnoreCase(user) && row.ladder.equalsIgnoreCase(ladder)) |
||||||
|
if(instance == null || "".equals(instance)) |
||||||
|
{ |
||||||
|
if(row.instance == null || "".equals(row.instance)) |
||||||
|
return row.rank; |
||||||
|
} else |
||||||
|
if(instance.equalsIgnoreCase(row.instance)) |
||||||
|
return row.rank; |
||||||
|
return 0; |
||||||
|
} |
||||||
|
public synchronized ArrayList<String> getUserGroups(String player) |
||||||
|
{ |
||||||
|
final ArrayList<ResolutionLeaf> tree = mapTrees.get(player.toLowerCase()); |
||||||
|
if(tree == null) |
||||||
|
return null; |
||||||
|
final ArrayList<String> result = new ArrayList<>(); |
||||||
|
for(ResolutionLeaf leaf : tree) |
||||||
|
result.add(leaf.instance != null ? leaf.group + Settings.separator + leaf.instance : leaf.group); |
||||||
|
return result; |
||||||
|
} |
||||||
|
public synchronized Set<String> getAllPossibleGroups() |
||||||
|
{ |
||||||
|
Set<String> result = new HashSet<>(); |
||||||
|
for(RowEntity row : entities_g.values()) |
||||||
|
result.add(row.entity.toLowerCase()); |
||||||
|
for(RowPermission row : permissions_p2g) |
||||||
|
result.add(row.entity.toLowerCase()); |
||||||
|
for(RowInheritance row : inheritance_g2g) |
||||||
|
{ |
||||||
|
result.add(row.entity.toLowerCase()); |
||||||
|
result.add(row.parent.toLowerCase()); |
||||||
|
} |
||||||
|
for(RowInheritance row : inheritance_g2u) |
||||||
|
result.add(row.parent.toLowerCase()); |
||||||
|
for(RowLadder row : ladders_g) |
||||||
|
if(row.climber != null) |
||||||
|
result.add(row.climber.toLowerCase()); |
||||||
|
return result; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,180 @@ |
|||||||
|
package ru.simsonic.rscPermissions; |
||||||
|
import java.util.ArrayList; |
||||||
|
import java.util.Collections; |
||||||
|
import java.util.HashMap; |
||||||
|
import java.util.HashSet; |
||||||
|
import java.util.UUID; |
||||||
|
import java.util.concurrent.ConcurrentHashMap; |
||||||
|
import org.bukkit.entity.Player; |
||||||
|
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.utilities.LanguageUtility; |
||||||
|
|
||||||
|
public class LocalCacheTree extends LocalCacheData |
||||||
|
{ |
||||||
|
protected static class ResolutionLeaf |
||||||
|
{ |
||||||
|
public String group; |
||||||
|
public String instance; |
||||||
|
public RowInheritance row; |
||||||
|
} |
||||||
|
protected LocalCacheTree(MainPluginClass rscp) |
||||||
|
{ |
||||||
|
super(rscp); |
||||||
|
} |
||||||
|
protected final ConcurrentHashMap<String, ArrayList<ResolutionLeaf>> mapTrees = new ConcurrentHashMap<>(); |
||||||
|
protected final ConcurrentHashMap<String, HashMap<String, Boolean>> mapPermissions = new ConcurrentHashMap<>(); |
||||||
|
protected final RowInheritance defaultInheritance = new RowInheritance(); |
||||||
|
public void updateDefaultInheritance() |
||||||
|
{ |
||||||
|
defaultInheritance.parent = plugin.settings.getDefaultGroup(); |
||||||
|
String[] breaked = defaultInheritance.parent.split(Settings.separatorRegExp); |
||||||
|
if(breaked.length == 2) |
||||||
|
{ |
||||||
|
defaultInheritance.parent = breaked[0]; |
||||||
|
defaultInheritance.instance = breaked[1]; |
||||||
|
} else |
||||||
|
defaultInheritance.instance = null; |
||||||
|
} |
||||||
|
public synchronized void clear() |
||||||
|
{ |
||||||
|
mapTrees.clear(); |
||||||
|
mapPermissions.clear(); |
||||||
|
prefixes_u.clear(); |
||||||
|
suffixes_u.clear(); |
||||||
|
entities_g.clear(); |
||||||
|
entities_u.clear(); |
||||||
|
permissions_p2g.clear(); |
||||||
|
permissions_p2u.clear(); |
||||||
|
inheritance_g2g.clear(); |
||||||
|
inheritance_g2u.clear(); |
||||||
|
ladders_g.clear(); |
||||||
|
ladders_u.clear(); |
||||||
|
} |
||||||
|
public synchronized void calculateStartupPermissions() |
||||||
|
{ |
||||||
|
final HashSet<String> playerEntities = new HashSet<>(); |
||||||
|
// Undefined player
|
||||||
|
playerEntities.add(""); // Зачем я его тут добавил?!?
|
||||||
|
// Defined players (in any table)
|
||||||
|
playerEntities.addAll(entities_u.keySet()); |
||||||
|
for(RowPermission row : permissions_p2u) |
||||||
|
playerEntities.add(row.entity); |
||||||
|
for(RowInheritance row : inheritance_g2u) |
||||||
|
playerEntities.add(row.entity); |
||||||
|
for(RowLadder row : ladders_u) |
||||||
|
playerEntities.add(row.climber); |
||||||
|
// Recalculate
|
||||||
|
for(String entityNameOrUUID : playerEntities) |
||||||
|
calculateBasePermissions(entityNameOrUUID); |
||||||
|
} |
||||||
|
public synchronized void calculateBasePermissions(String playerName) |
||||||
|
{ |
||||||
|
AsyncPlayerInfo p2rc = new AsyncPlayerInfo(playerName); |
||||||
|
HashMap<String, Boolean> list = treeToPermissions(p2rc); |
||||||
|
mapPermissions.put(playerName, list); |
||||||
|
} |
||||||
|
public synchronized void calculateBasePermissions(UUID playerUniqueId) |
||||||
|
{ |
||||||
|
AsyncPlayerInfo p2rc = new AsyncPlayerInfo(playerUniqueId); |
||||||
|
HashMap<String, Boolean> list = treeToPermissions(p2rc); |
||||||
|
mapPermissions.put(playerUniqueId.toString().replace("-", "").toLowerCase(), list); |
||||||
|
} |
||||||
|
public void calculatePlayerPermissions(Player player) |
||||||
|
{ |
||||||
|
final AsyncPlayerInfo api = new AsyncPlayerInfo(player, plugin.regionListProvider.GetRegionList(player)); |
||||||
|
plugin.recalculatingPlayers.offer(api); |
||||||
|
} |
||||||
|
protected synchronized HashMap<String, Boolean> treeToPermissions(AsyncPlayerInfo p2rc) |
||||||
|
{ |
||||||
|
final HashMap<String, Boolean> permissions = new HashMap<>(); |
||||||
|
String prefix = ""; |
||||||
|
String suffix = ""; |
||||||
|
ArrayList<ResolutionLeaf> tree = buildUserTree(p2rc); |
||||||
|
if(p2rc.name != null) |
||||||
|
mapTrees.put(p2rc.name.toLowerCase(), tree); |
||||||
|
// Group permissions
|
||||||
|
for(ResolutionLeaf leaf : tree) |
||||||
|
{ |
||||||
|
for(RowPermission row : permissions_p2g) |
||||||
|
if(p2rc.isGroupPermissionApplicable(row, leaf)) |
||||||
|
{ |
||||||
|
String permission = row.permission; |
||||||
|
// Additional processing
|
||||||
|
if(permission.contains(Settings.instantiator) && (leaf.instance != null)) |
||||||
|
permission = permission.replaceAll(Settings.instantiatorRegExp, leaf.instance); |
||||||
|
permissions.put(permission, row.value); |
||||||
|
} |
||||||
|
RowEntity entity = entities_g.get(leaf.group.toLowerCase()); |
||||||
|
if(entity != null) |
||||||
|
{ |
||||||
|
if(entity.prefix != null && !"".equals(entity.prefix)) |
||||||
|
prefix = entity.prefix.replace("%", prefix); |
||||||
|
if(entity.suffix != null && !"".equals(entity.suffix)) |
||||||
|
suffix = entity.suffix.replace("%", suffix); |
||||||
|
prefix = prefix.replaceAll(Settings.instantiatorRegExp, leaf.instance); |
||||||
|
suffix = suffix.replaceAll(Settings.instantiatorRegExp, leaf.instance); |
||||||
|
} |
||||||
|
} |
||||||
|
// User permissions
|
||||||
|
for(RowPermission row : permissions_p2u) |
||||||
|
if(p2rc.isPlayerPermissionApplicable(row)) |
||||||
|
permissions.put(row.permission, row.value); |
||||||
|
if(p2rc.name != null) |
||||||
|
{ |
||||||
|
RowEntity entity = entities_u.get(p2rc.name.toLowerCase()); |
||||||
|
if(entity != null) |
||||||
|
{ |
||||||
|
if(entity.prefix != null && !"".equals(entity.prefix)) |
||||||
|
prefix = entity.prefix.replace("%", prefix); |
||||||
|
if(entity.suffix != null && !"".equals(entity.suffix)) |
||||||
|
suffix = entity.suffix.replace("%", suffix); |
||||||
|
} |
||||||
|
prefixes_u.put(p2rc.name, LanguageUtility.processStringStatic(prefix)); |
||||||
|
suffixes_u.put(p2rc.name, LanguageUtility.processStringStatic(suffix)); |
||||||
|
} |
||||||
|
return permissions; |
||||||
|
} |
||||||
|
private ArrayList<ResolutionLeaf> buildUserTree(AsyncPlayerInfo p2rc) |
||||||
|
{ |
||||||
|
// User's direct inheritance
|
||||||
|
ArrayList<RowInheritance> parentRows = new ArrayList<>(); |
||||||
|
for(RowInheritance row : inheritance_g2u) |
||||||
|
if(p2rc.isPlayerInheritanceApplicable(row)) |
||||||
|
parentRows.add(row); |
||||||
|
Collections.sort(parentRows); |
||||||
|
// Indirect default group
|
||||||
|
if(parentRows.isEmpty() || plugin.settings.isDefaultForever()) |
||||||
|
parentRows.add(0, defaultInheritance); |
||||||
|
ArrayList<ResolutionLeaf> resultTree = new ArrayList<>(); |
||||||
|
// Parent deep inheritances
|
||||||
|
for(RowInheritance row : parentRows) |
||||||
|
{ |
||||||
|
ResolutionLeaf newleaf = new ResolutionLeaf(); |
||||||
|
newleaf.group = row.parent; |
||||||
|
newleaf.instance = row.instance; |
||||||
|
newleaf.row = row; |
||||||
|
buildGroupTree(p2rc, newleaf, resultTree); |
||||||
|
} |
||||||
|
return resultTree; |
||||||
|
} |
||||||
|
private void buildGroupTree(AsyncPlayerInfo p2rc, ResolutionLeaf findAndOpen, ArrayList<ResolutionLeaf> result) |
||||||
|
{ |
||||||
|
ArrayList<RowInheritance> parentRows = new ArrayList<>(inheritance_g2g.size() >> 2); |
||||||
|
for(RowInheritance row : inheritance_g2g) |
||||||
|
if(p2rc.isGroupInheritanceApplicable(row, findAndOpen)) |
||||||
|
parentRows.add(row); |
||||||
|
Collections.sort(parentRows); |
||||||
|
for(RowInheritance row : parentRows) |
||||||
|
{ |
||||||
|
ResolutionLeaf newleaf = new ResolutionLeaf(); |
||||||
|
newleaf.group = row.parent; |
||||||
|
newleaf.instance = (row.instance != null) ? row.instance : findAndOpen.instance; |
||||||
|
newleaf.row = row; |
||||||
|
buildGroupTree(p2rc, newleaf, result); |
||||||
|
} |
||||||
|
result.add(findAndOpen); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,332 @@ |
|||||||
|
package ru.simsonic.rscPermissions; |
||||||
|
import java.io.IOException; |
||||||
|
import java.util.HashMap; |
||||||
|
import java.util.concurrent.LinkedBlockingQueue; |
||||||
|
import java.util.logging.Level; |
||||||
|
import java.util.logging.Logger; |
||||||
|
import net.gravitydevelopment.updater.Updater; |
||||||
|
import org.bukkit.Bukkit; |
||||||
|
import org.bukkit.command.Command; |
||||||
|
import org.bukkit.command.CommandSender; |
||||||
|
import org.bukkit.command.ConsoleCommandSender; |
||||||
|
import org.bukkit.entity.Player; |
||||||
|
import org.bukkit.event.EventPriority; |
||||||
|
import org.bukkit.event.Listener; |
||||||
|
import org.bukkit.event.player.PlayerExpChangeEvent; |
||||||
|
import org.bukkit.event.player.PlayerJoinEvent; |
||||||
|
import org.bukkit.event.player.PlayerLevelChangeEvent; |
||||||
|
import org.bukkit.event.player.PlayerLoginEvent; |
||||||
|
import org.bukkit.event.player.PlayerQuitEvent; |
||||||
|
import org.bukkit.permissions.PermissionAttachment; |
||||||
|
import org.bukkit.plugin.java.JavaPlugin; |
||||||
|
import org.bukkit.scheduler.BukkitScheduler; |
||||||
|
import org.mcstats.MetricsLite; |
||||||
|
import ru.simsonic.utilities.LanguageUtility; |
||||||
|
import ru.simsonic.utilities.MovingPlayersCatcher; |
||||||
|
|
||||||
|
public final class MainPluginClass extends JavaPlugin implements Listener |
||||||
|
{ |
||||||
|
private static final int projectNumberInDBO = 55450; |
||||||
|
private static final String chatPrefix = "{_YL}[rscp] {GOLD}"; |
||||||
|
public static final Logger consoleLog = Logger.getLogger("Minecraft"); |
||||||
|
public final rscpAPI API = new rscpAPI(this); |
||||||
|
public final Settings settings = new Settings(this); |
||||||
|
public final LocalCacheFunctions cache = new LocalCacheFunctions(this); |
||||||
|
public final CommandHelper commandExecutor = new CommandHelper(this); |
||||||
|
public final MaintenanceMode maintenance = new MaintenanceMode(this); |
||||||
|
public final RegionListProviders regionListProvider = new RegionListProviders(this); |
||||||
|
private final MovingPlayersCatcher movedPlayers = new MovingPlayersCatcher(); |
||||||
|
public ConnectionHelper connectionList; |
||||||
|
public Thread threadPermissions; |
||||||
|
private Updater updater; |
||||||
|
private MetricsLite metrics; |
||||||
|
public final HashMap<Player, PermissionAttachment> attachments = new HashMap<>(); |
||||||
|
public final LinkedBlockingQueue<AsyncPlayerInfo> recalculatingPlayers = new LinkedBlockingQueue<>(); |
||||||
|
// private final HashSet<String> verbosePlayers = new HashSet<>();
|
||||||
|
@Override |
||||||
|
public void onLoad() |
||||||
|
{ |
||||||
|
settings.onLoad(); |
||||||
|
consoleLog.log(Level.INFO, "[rscp] This server\'s ID is \'{0}\'. You can change it in server.properties.", getServer().getServerId()); |
||||||
|
consoleLog.log(Level.INFO, "[rscp] rscPermissions has been loaded."); |
||||||
|
} |
||||||
|
@Override |
||||||
|
public void onEnable() |
||||||
|
{ |
||||||
|
settings.readSettings(); |
||||||
|
connectionList = settings.getConnectionChain(); |
||||||
|
if(connectionList == null) |
||||||
|
{ |
||||||
|
consoleLog.log(Level.WARNING, "[rscp] No MySQL servers were specified in config.yml, disabling..."); |
||||||
|
getServer().getPluginManager().disablePlugin(this); |
||||||
|
return; |
||||||
|
} |
||||||
|
// Register event's dispatcher
|
||||||
|
getServer().getPluginManager().registerEvents(this, this); |
||||||
|
getServer().getPluginManager().registerEvents(maintenance, this); |
||||||
|
getServer().getPluginManager().registerEvents(movedPlayers, this); |
||||||
|
// WorldGuard, Residence and other possible region list providers
|
||||||
|
regionListProvider.integrate(); |
||||||
|
// Start all needed threads
|
||||||
|
cache.updateDefaultInheritance(); |
||||||
|
StartRecalcThread(); |
||||||
|
RegionFinderThreadStart(); |
||||||
|
connectionList.threadFetchTablesData(); |
||||||
|
// Automatic updater
|
||||||
|
if(settings.isUpdatable()) |
||||||
|
{ |
||||||
|
updater = new Updater(this, projectNumberInDBO, this.getFile(), Updater.UpdateType.NO_DOWNLOAD, false); |
||||||
|
if(updater.getResult() == Updater.UpdateResult.UPDATE_AVAILABLE) |
||||||
|
infoAboutUpdate(getServer().getConsoleSender()); |
||||||
|
else |
||||||
|
updater = null; |
||||||
|
} |
||||||
|
// Metrics
|
||||||
|
if(settings.isUseMetrics()) |
||||||
|
{ |
||||||
|
try |
||||||
|
{ |
||||||
|
metrics = new MetricsLite(this); |
||||||
|
metrics.start(); |
||||||
|
consoleLog.info("[rscp] Metrics enabled."); |
||||||
|
} catch(IOException ex) { |
||||||
|
consoleLog.log(Level.INFO, "[rscp][Metrics] Exception: {0}", ex.getLocalizedMessage()); |
||||||
|
} |
||||||
|
} |
||||||
|
consoleLog.info("[rscp] rscPermissions has been successfully enabled."); |
||||||
|
} |
||||||
|
private void infoAboutUpdate(CommandSender sender) |
||||||
|
{ |
||||||
|
if(updater != null) |
||||||
|
{ |
||||||
|
if(sender instanceof ConsoleCommandSender) |
||||||
|
{ |
||||||
|
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."); |
||||||
|
} else if(sender.hasPermission("rscp.admin")) { |
||||||
|
Message(sender, "Update is available: {_LB}" + updater.getLatestName() + "{GOLD}!"); |
||||||
|
Message(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."); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
@Override |
||||||
|
public void onDisable() |
||||||
|
{ |
||||||
|
getServer().getServicesManager().unregisterAll(this); |
||||||
|
RegionFinderThreadStop(); |
||||||
|
StopRecalcThread(); |
||||||
|
cache.clear(); |
||||||
|
connectionList.Disconnect(); |
||||||
|
connectionList = null; |
||||||
|
regionListProvider.deintegrate(); |
||||||
|
metrics = null; |
||||||
|
consoleLog.info("[rscp] rscPermissions has been disabled."); |
||||||
|
} |
||||||
|
public String doUpdate(CommandSender sender) |
||||||
|
{ |
||||||
|
if(updater != null) |
||||||
|
{ |
||||||
|
updater = new Updater(this, projectNumberInDBO, this.getFile(), Updater.UpdateType.DEFAULT, true); |
||||||
|
updater = null; |
||||||
|
return "Plugin will be updated automatically after restart."; |
||||||
|
} |
||||||
|
return "No updates available / waiting for server restart."; |
||||||
|
} |
||||||
|
private Thread hThreadRegionFinder = null; |
||||||
|
private void RegionFinderThreadStart() |
||||||
|
{ |
||||||
|
RegionFinderThreadStop(); |
||||||
|
hThreadRegionFinder = new Thread() |
||||||
|
{ |
||||||
|
@Override |
||||||
|
public void run() |
||||||
|
{ |
||||||
|
this.setName("rscp:RegionFinder"); |
||||||
|
this.setPriority(MIN_PRIORITY); |
||||||
|
long granularity = settings.getRegionFinderGranularity(); |
||||||
|
if(granularity < 20) |
||||||
|
granularity = 20; |
||||||
|
if(granularity > 10000) |
||||||
|
granularity = 10000; |
||||||
|
try |
||||||
|
{ |
||||||
|
for(; !Thread.interrupted(); Thread.sleep(granularity)) |
||||||
|
for(Player player : movedPlayers.getMovedPlayersAsync()) |
||||||
|
if(regionListProvider.IsRegionListChanged(player)) |
||||||
|
cache.calculatePlayerPermissions(player); |
||||||
|
} catch(InterruptedException ex) { |
||||||
|
} |
||||||
|
} |
||||||
|
}; |
||||||
|
hThreadRegionFinder.start(); |
||||||
|
} |
||||||
|
public void RegionFinderThreadStop() |
||||||
|
{ |
||||||
|
if(hThreadRegionFinder == null) |
||||||
|
return; |
||||||
|
try |
||||||
|
{ |
||||||
|
hThreadRegionFinder.interrupt(); |
||||||
|
hThreadRegionFinder.join(); |
||||||
|
hThreadRegionFinder = null; |
||||||
|
} catch(InterruptedException ex) { |
||||||
|
consoleLog.log(Level.SEVERE, "[rscp] Exception in RegionFinderThread(): {0}", ex.getLocalizedMessage()); |
||||||
|
} |
||||||
|
} |
||||||
|
public void StopRecalcThread() |
||||||
|
{ |
||||||
|
if(threadPermissions != null) |
||||||
|
try |
||||||
|
{ |
||||||
|
threadPermissions.interrupt(); |
||||||
|
threadPermissions.join(); |
||||||
|
threadPermissions = null; |
||||||
|
} catch(InterruptedException ex) { |
||||||
|
consoleLog.log(Level.WARNING, "[rscp] Exception in StopRecalcThread: {0}", ex.getLocalizedMessage()); |
||||||
|
} |
||||||
|
} |
||||||
|
public void StartRecalcThread() |
||||||
|
{ |
||||||
|
StopRecalcThread(); |
||||||
|
final MainPluginClass plugin = this; |
||||||
|
threadPermissions = new Thread() |
||||||
|
{ |
||||||
|
@Override |
||||||
|
public void run() |
||||||
|
{ |
||||||
|
setName("rscp:PermCalculator"); |
||||||
|
setPriority(Thread.MIN_PRIORITY); |
||||||
|
try |
||||||
|
{ |
||||||
|
AsyncPlayerInfo p2rc; |
||||||
|
while((p2rc = recalculatingPlayers.take()) != null) |
||||||
|
{ |
||||||
|
// Build inheritance tree and calculate permissions
|
||||||
|
final HashMap<String, Boolean> permissions = cache.treeToPermissions(p2rc); |
||||||
|
// Schedule attachment update
|
||||||
|
final Player player = p2rc.player; |
||||||
|
getServer().getScheduler().runTask(plugin, new Runnable() |
||||||
|
{ |
||||||
|
@Override |
||||||
|
public void run() |
||||||
|
{ |
||||||
|
PermissionAttachment attachment = attachments.get(player); |
||||||
|
if(attachment != null) |
||||||
|
attachment.remove(); |
||||||
|
attachment = player.addAttachment(plugin); |
||||||
|
attachments.put(player, attachment); |
||||||
|
for(String permission : permissions.keySet()) |
||||||
|
attachment.setPermission(permission, permissions.get(permission)); |
||||||
|
if(settings.isAsteriskOP()) |
||||||
|
{ |
||||||
|
final Boolean asteriskValue = permissions.get("*"); |
||||||
|
player.setOp(asteriskValue != null ? asteriskValue : false); |
||||||
|
} |
||||||
|
} |
||||||
|
}); |
||||||
|
} |
||||||
|
} catch(InterruptedException ex) { |
||||||
|
} |
||||||
|
recalculatingPlayers.clear(); |
||||||
|
} |
||||||
|
}; |
||||||
|
threadPermissions.start(); |
||||||
|
} |
||||||
|
public void recalculateOnlinePlayers() |
||||||
|
{ |
||||||
|
for(Player player : Bukkit.getServer().getOnlinePlayers()) |
||||||
|
if(player != null) |
||||||
|
cache.calculatePlayerPermissions(player); |
||||||
|
rescheduleAutoUpdate(); |
||||||
|
} |
||||||
|
private int nAutoUpdaterTaskId = -1; |
||||||
|
private void rescheduleAutoUpdate() |
||||||
|
{ |
||||||
|
final BukkitScheduler scheduler = getServer().getScheduler(); |
||||||
|
if(nAutoUpdaterTaskId != -1) |
||||||
|
scheduler.cancelTask(nAutoUpdaterTaskId); |
||||||
|
final int delay = settings.getAutoReloadDelayTicks(); |
||||||
|
nAutoUpdaterTaskId = scheduler.scheduleSyncDelayedTask(this, new Runnable() |
||||||
|
{ |
||||||
|
@Override |
||||||
|
public void run() |
||||||
|
{ |
||||||
|
connectionList.threadFetchTablesData(); |
||||||
|
} |
||||||
|
}, delay); |
||||||
|
} |
||||||
|
@Override |
||||||
|
public boolean onCommand(CommandSender sender, Command cmd, String label, String[] args) |
||||||
|
{ |
||||||
|
try |
||||||
|
{ |
||||||
|
commandExecutor.onCommand(sender, cmd, label, args); |
||||||
|
} catch(CommandHelperAnswerException ex) { |
||||||
|
for(String answer : ex.getMessageArray()) |
||||||
|
sender.sendMessage(LanguageUtility.processStringStatic(chatPrefix + answer)); |
||||||
|
} catch(NullPointerException ex) { |
||||||
|
// These will never occur! I hope...
|
||||||
|
} |
||||||
|
return true; |
||||||
|
} |
||||||
|
@org.bukkit.event.EventHandler(priority = EventPriority.LOWEST) |
||||||
|
public void onPlayerLogin(PlayerLoginEvent event) |
||||||
|
{ |
||||||
|
final Player player = event.getPlayer(); |
||||||
|
String name = event.getPlayer().getName(); |
||||||
|
final HashMap<String, Boolean> pending = cache.mapPermissions.get(name); |
||||||
|
if(pending != null) |
||||||
|
{ |
||||||
|
final PermissionAttachment attachment = player.addAttachment(this); |
||||||
|
for(String permission : pending.keySet()) |
||||||
|
attachment.setPermission(permission, pending.get(permission)); |
||||||
|
attachments.put(player, attachment); |
||||||
|
} |
||||||
|
cache.calculatePlayerPermissions(player); |
||||||
|
} |
||||||
|
@org.bukkit.event.EventHandler |
||||||
|
public void onPlayerJoin(PlayerJoinEvent event) |
||||||
|
{ |
||||||
|
infoAboutUpdate(event.getPlayer()); |
||||||
|
// Show list of player's rewards
|
||||||
|
if(settings.isRewardsEnabled()) |
||||||
|
commandExecutor.rewardHelper.executeReward(event.getPlayer(), null); |
||||||
|
} |
||||||
|
@org.bukkit.event.EventHandler |
||||||
|
public void onPlayerExp(PlayerLevelChangeEvent event) |
||||||
|
{ |
||||||
|
cache.calculatePlayerPermissions(event.getPlayer()); |
||||||
|
} |
||||||
|
@org.bukkit.event.EventHandler |
||||||
|
public void onPlayerLevel(PlayerExpChangeEvent event) |
||||||
|
{ |
||||||
|
cache.calculatePlayerPermissions(event.getPlayer()); |
||||||
|
} |
||||||
|
@org.bukkit.event.EventHandler |
||||||
|
public void onPlayerKick(PlayerQuitEvent event) |
||||||
|
{ |
||||||
|
attachments.remove(event.getPlayer()); |
||||||
|
regionListProvider.removePlayer(event.getPlayer()); |
||||||
|
} |
||||||
|
@org.bukkit.event.EventHandler |
||||||
|
public void onPlayerQuit(PlayerQuitEvent event) |
||||||
|
{ |
||||||
|
attachments.remove(event.getPlayer()); |
||||||
|
regionListProvider.removePlayer(event.getPlayer()); |
||||||
|
} |
||||||
|
public void Message(CommandSender sender, String message) |
||||||
|
{ |
||||||
|
if(message == null || "".equals(message)) |
||||||
|
return; |
||||||
|
message = LanguageUtility.processStringStatic(chatPrefix + message); |
||||||
|
sender.sendMessage(message); |
||||||
|
} |
||||||
|
@SuppressWarnings({"DeadBranch", "UnusedAssignment"}) |
||||||
|
public static void main(String args[]) |
||||||
|
{ |
||||||
|
System.out.println("rscPermissions - Bukkit superperms plugin © SimSonic"); |
||||||
|
System.out.println("http://dev.bukkit.org/bukkit-plugins/rscpermissions/"); |
||||||
|
// TEST SECTION STARTS BELOW
|
||||||
|
} |
||||||
|
} |
@ -0,0 +1,95 @@ |
|||||||
|
package ru.simsonic.rscPermissions; |
||||||
|
import java.util.HashMap; |
||||||
|
import java.util.UUID; |
||||||
|
import org.bukkit.Bukkit; |
||||||
|
import org.bukkit.entity.Player; |
||||||
|
import org.bukkit.event.Listener; |
||||||
|
import org.bukkit.event.player.AsyncPlayerPreLoginEvent; |
||||||
|
import org.bukkit.event.server.ServerListPingEvent; |
||||||
|
import ru.simsonic.utilities.LanguageUtility; |
||||||
|
|
||||||
|
public class MaintenanceMode implements Listener |
||||||
|
{ |
||||||
|
private final MainPluginClass plugin; |
||||||
|
public MaintenanceMode(MainPluginClass rscp) |
||||||
|
{ |
||||||
|
this.plugin = rscp; |
||||||
|
} |
||||||
|
@org.bukkit.event.EventHandler |
||||||
|
public void onServerPing(ServerListPingEvent event) |
||||||
|
{ |
||||||
|
if(plugin.settings.isInMaintenance()) |
||||||
|
{ |
||||||
|
String motd = "Server is under maintenance"; |
||||||
|
motd = plugin.getConfig().getString("language.mModes.locked.default.motd", motd); |
||||||
|
motd = plugin.getConfig().getString("language.mModes.locked." + plugin.settings.getMaintenanceMode() + ".motd", motd); |
||||||
|
motd = LanguageUtility.processStringStatic(motd); |
||||||
|
if(!"".equals(motd)) |
||||||
|
event.setMotd(motd); |
||||||
|
} |
||||||
|
} |
||||||
|
@org.bukkit.event.EventHandler |
||||||
|
public void onAsyncPlayerPreLogin(AsyncPlayerPreLoginEvent event) |
||||||
|
{ |
||||||
|
if("".equals(plugin.settings.getMaintenanceMode())) |
||||||
|
{ |
||||||
|
event.allow(); |
||||||
|
return; |
||||||
|
} |
||||||
|
final String permissionAll = "rscp.maintenance.*"; |
||||||
|
final String permission_mm = "rscp.maintenance." + (plugin.settings.getMaintenanceMode()); |
||||||
|
final HashMap<String, Boolean> permissions = new HashMap<>(); |
||||||
|
try |
||||||
|
{ |
||||||
|
final String name = event.getName(); |
||||||
|
plugin.cache.calculateBasePermissions(name); |
||||||
|
permissions.putAll(plugin.cache.mapPermissions.get(name)); |
||||||
|
} catch(RuntimeException ex) { |
||||||
|
} |
||||||
|
try |
||||||
|
{ |
||||||
|
final UUID uuid = event.getUniqueId(); |
||||||
|
final String userFriendlyUniqueId = uuid.toString().replace("-", "").toLowerCase(); |
||||||
|
plugin.cache.calculateBasePermissions(uuid); |
||||||
|
permissions.putAll(plugin.cache.mapPermissions.get(userFriendlyUniqueId)); |
||||||
|
} catch(RuntimeException | NoSuchMethodError ex) { |
||||||
|
} |
||||||
|
for(String permission : permissions.keySet()) |
||||||
|
if(permission.equalsIgnoreCase(permission_mm) || permission.equalsIgnoreCase(permissionAll)) |
||||||
|
{ |
||||||
|
event.allow(); |
||||||
|
return; |
||||||
|
} |
||||||
|
String kickMsg = "{_YL}Server is in maintenance mode\nPlease try to connect later..."; |
||||||
|
kickMsg = plugin.getConfig().getString("language.mmodes.locked.default.motd", kickMsg); |
||||||
|
kickMsg = plugin.getConfig().getString("language.mmodes.locked." + plugin.settings.getMaintenanceMode() + ".motd", kickMsg); |
||||||
|
kickMsg = LanguageUtility.processStringStatic(kickMsg); |
||||||
|
event.disallow(AsyncPlayerPreLoginEvent.Result.KICK_WHITELIST, kickMsg); |
||||||
|
} |
||||||
|
public void setMaintenanceMode(String mMode) |
||||||
|
{ |
||||||
|
plugin.settings.setMaintenanceMode(mMode); |
||||||
|
if(!plugin.settings.isInMaintenance()) |
||||||
|
return; |
||||||
|
plugin.getServer().getScheduler().scheduleSyncDelayedTask(plugin, new Runnable() |
||||||
|
{ |
||||||
|
@Override |
||||||
|
public void run() |
||||||
|
{ |
||||||
|
for(Player player : Bukkit.getServer().getOnlinePlayers()) |
||||||
|
if(player != null) |
||||||
|
{ |
||||||
|
if(player.hasPermission("rscp.maintenance.*")) |
||||||
|
continue; |
||||||
|
if(player.hasPermission("rscp.maintenance." + plugin.settings.getMaintenanceMode())) |
||||||
|
continue; |
||||||
|
String kick = "{_YL}Server is going into maintenance mode"; |
||||||
|
kick = plugin.getConfig().getString("language.mModes.locked.default.kick", kick); |
||||||
|
kick = plugin.getConfig().getString("language.mModes.locked." + plugin.settings.getMaintenanceMode() + ".kick", kick); |
||||||
|
kick = LanguageUtility.processStringStatic(kick); |
||||||
|
player.kickPlayer(kick); |
||||||
|
} |
||||||
|
} |
||||||
|
}); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,124 @@ |
|||||||
|
package ru.simsonic.rscPermissions; |
||||||
|
import com.sk89q.worldguard.bukkit.WorldGuardPlugin; |
||||||
|
import com.sk89q.worldguard.protection.ApplicableRegionSet; |
||||||
|
import com.sk89q.worldguard.protection.managers.RegionManager; |
||||||
|
import com.sk89q.worldguard.protection.regions.ProtectedRegion; |
||||||
|
import java.util.Collections; |
||||||
|
import java.util.HashMap; |
||||||
|
import java.util.HashSet; |
||||||
|
import java.util.Map; |
||||||
|
import java.util.Set; |
||||||
|
import net.t00thpick1.residence.Residence; |
||||||
|
import net.t00thpick1.residence.api.ResidenceAPI; |
||||||
|
import net.t00thpick1.residence.api.ResidenceManager; |
||||||
|
import net.t00thpick1.residence.api.areas.ResidenceArea; |
||||||
|
import org.bukkit.Location; |
||||||
|
import org.bukkit.World; |
||||||
|
import org.bukkit.entity.Player; |
||||||
|
import org.bukkit.plugin.Plugin; |
||||||
|
|
||||||
|
public final class RegionListProviders |
||||||
|
{ |
||||||
|
private final MainPluginClass plugin; |
||||||
|
private Plugin worldguard; |
||||||
|
private Plugin residence; |
||||||
|
private final Map<Player, Set<String>> regionsByPlayer = new HashMap<>(); |
||||||
|
private final Map<Player, Integer> playerRegionHashes = new HashMap<>(); |
||||||
|
private final Map<Player, World> playerLastWorld = new HashMap<>(); |
||||||
|
public RegionListProviders(MainPluginClass rscp) |
||||||
|
{ |
||||||
|
this.plugin = rscp; |
||||||
|
} |
||||||
|
public synchronized void integrate() |
||||||
|
{ |
||||||
|
// WorldGuard
|
||||||
|
if(plugin.settings.isUseWorldGuard()) |
||||||
|
{ |
||||||
|
final Plugin pluginWG = plugin.getServer().getPluginManager().getPlugin("WorldGuard"); |
||||||
|
if((pluginWG != null) && (pluginWG instanceof WorldGuardPlugin)) |
||||||
|
{ |
||||||
|
this.worldguard = pluginWG; |
||||||
|
MainPluginClass.consoleLog.info("[rscp] WorldGuard was found and integrated."); |
||||||
|
} else { |
||||||
|
this.worldguard = null; |
||||||
|
MainPluginClass.consoleLog.info("[rscp] WorldGuard was not found."); |
||||||
|
} |
||||||
|
} else |
||||||
|
this.worldguard = null; |
||||||
|
// Residence
|
||||||
|
if(plugin.settings.isUseResidence()) |
||||||
|
{ |
||||||
|
final Plugin pluginR = plugin.getServer().getPluginManager().getPlugin("Residence"); |
||||||
|
if((pluginR != null) && (pluginR instanceof Residence)) |
||||||
|
{ |
||||||
|
this.residence = pluginR; |
||||||
|
MainPluginClass.consoleLog.info("[rscp] Residence was found and integrated."); |
||||||
|
} else { |
||||||
|
this.residence = null; |
||||||
|
MainPluginClass.consoleLog.info("[rscp] Residence was not found."); |
||||||
|
} |
||||||
|
} else |
||||||
|
this.residence = null; |
||||||
|
} |
||||||
|
public synchronized void deintegrate() |
||||||
|
{ |
||||||
|
this.worldguard = null; |
||||||
|
this.residence = null; |
||||||
|
} |
||||||
|
public synchronized boolean IsRegionListChanged(Player player) |
||||||
|
{ |
||||||
|
final Location location = player.getLocation(); |
||||||
|
final World world = location.getWorld(); |
||||||
|
final Set<String> playerRegions = new HashSet<>(); |
||||||
|
// WorldGuard
|
||||||
|
if(worldguard != null && worldguard.isEnabled()) |
||||||
|
try |
||||||
|
{ |
||||||
|
final WorldGuardPlugin pluginWG = (WorldGuardPlugin)worldguard; |
||||||
|
final RegionManager rman = pluginWG.getRegionManager(world); |
||||||
|
if(rman == null) |
||||||
|
return false; |
||||||
|
// Get list
|
||||||
|
final ApplicableRegionSet appregs = rman.getApplicableRegions(location); |
||||||
|
for(ProtectedRegion region : appregs) |
||||||
|
playerRegions.add(region.getId()); |
||||||
|
} catch(RuntimeException ex) { |
||||||
|
} |
||||||
|
// Residence
|
||||||
|
if(residence != null && residence.isEnabled()) |
||||||
|
try |
||||||
|
{ |
||||||
|
// Get list
|
||||||
|
final ResidenceManager residenceManager = ResidenceAPI.getResidenceManager(); |
||||||
|
if(residenceManager != null) |
||||||
|
{ |
||||||
|
final ResidenceArea residenceArea = residenceManager.getByLocation(location); |
||||||
|
if(residenceArea != null) |
||||||
|
playerRegions.add(residenceArea.getFullName()); |
||||||
|
} |
||||||
|
} catch(RuntimeException ex) { |
||||||
|
} |
||||||
|
// Is it changed?
|
||||||
|
int hashcode = playerRegions.hashCode(); |
||||||
|
if(playerLastWorld.containsKey(player)) |
||||||
|
if(playerLastWorld.get(player).equals(world)) |
||||||
|
if(hashcode == playerRegionHashes.get(player)) |
||||||
|
return false; |
||||||
|
// Update
|
||||||
|
playerRegionHashes.put(player, hashcode); |
||||||
|
regionsByPlayer.put(player, playerRegions); |
||||||
|
playerLastWorld.put(player, world); |
||||||
|
return true; |
||||||
|
} |
||||||
|
public synchronized Set<String> GetRegionList(Player player) |
||||||
|
{ |
||||||
|
Set<String> result = regionsByPlayer.get(player); |
||||||
|
return (result != null) ? result : Collections.<String>emptySet(); |
||||||
|
} |
||||||
|
public synchronized void removePlayer(Player player) |
||||||
|
{ |
||||||
|
playerRegionHashes.remove(player); |
||||||
|
regionsByPlayer.remove(player); |
||||||
|
playerLastWorld.remove(player); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,180 @@ |
|||||||
|
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(); |
||||||
|
} |
||||||
|
}); |
||||||
|
} |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,162 @@ |
|||||||
|
package ru.simsonic.rscPermissions; |
||||||
|
import java.util.ArrayList; |
||||||
|
import java.util.Collections; |
||||||
|
import java.util.HashMap; |
||||||
|
import java.util.Iterator; |
||||||
|
import java.util.List; |
||||||
|
import java.util.Map; |
||||||
|
import org.bukkit.configuration.file.FileConfiguration; |
||||||
|
|
||||||
|
public class Settings |
||||||
|
{ |
||||||
|
private final MainPluginClass plugin; |
||||||
|
private String strDefaultGroup = "Default"; |
||||||
|
private String strMaintenanceMode = ""; |
||||||
|
private boolean bAlwaysInheritDefault = false; |
||||||
|
private boolean bTreatAsteriskAsOP = true; |
||||||
|
private boolean bRewardsEnabled = false; |
||||||
|
private boolean bUseMetrics = true; |
||||||
|
private boolean bUseUpdater = true; |
||||||
|
private boolean bUseWorldGuard = true; |
||||||
|
private boolean bUseResidence = true; |
||||||
|
private int nAutoReloadDelayTicks = 20 * 900; |
||||||
|
private int nRegionFinderGranularity = 1000; |
||||||
|
public final int CurrentVersion = 2; |
||||||
|
public static final String separator = "."; |
||||||
|
public static final String separatorRegExp = "\\."; |
||||||
|
public static final String instantiator = "?"; |
||||||
|
public static final String instantiatorRegExp = "\\?"; |
||||||
|
public Settings(final MainPluginClass plugin) |
||||||
|
{ |
||||||
|
this.plugin = plugin; |
||||||
|
} |
||||||
|
public void onLoad() |
||||||
|
{ |
||||||
|
plugin.saveDefaultConfig(); |
||||||
|
final FileConfiguration config = plugin.getConfig(); |
||||||
|
switch(plugin.getConfig().getInt("internal.version", CurrentVersion)) |
||||||
|
{ |
||||||
|
case 1: |
||||||
|
update_v1_to_v2(config); |
||||||
|
MainPluginClass.consoleLog.info("[rscp] Configuration updated from v1 to v2."); |
||||||
|
case CurrentVersion: // Current version
|
||||||
|
plugin.saveConfig(); |
||||||
|
break; |
||||||
|
} |
||||||
|
} |
||||||
|
private void update_v1_to_v2(FileConfiguration config) |
||||||
|
{ |
||||||
|
config.set("settings.enable-bans", null); |
||||||
|
config.set("settings.integration.worldguard", true); |
||||||
|
config.set("settings.integration.residence", true); |
||||||
|
config.set("internal.version", 2); |
||||||
|
} |
||||||
|
public void readSettings() |
||||||
|
{ |
||||||
|
plugin.reloadConfig(); |
||||||
|
final FileConfiguration config = plugin.getConfig(); |
||||||
|
strDefaultGroup = config.getString("settings.default-group", "Default"); |
||||||
|
strMaintenanceMode = config.getString("settings.maintenance-mode", ""); |
||||||
|
bAlwaysInheritDefault = config.getBoolean("always-inherit-default-group", false); |
||||||
|
bTreatAsteriskAsOP = config.getBoolean("settings.treat-asterisk-as-op", true); |
||||||
|
bRewardsEnabled = config.getBoolean("settings.enable-rewards", false); |
||||||
|
bUseMetrics = config.getBoolean("settings.use-metrics", true); |
||||||
|
bUseUpdater = config.getBoolean("settings.auto-update", true); |
||||||
|
bUseWorldGuard = config.getBoolean("settings.integration.worldguard", true); |
||||||
|
bUseResidence = config.getBoolean("settings.integration.residence", true); |
||||||
|
nAutoReloadDelayTicks = 20 * config.getInt("settings.auto-reload-delay-sec", 900); |
||||||
|
nRegionFinderGranularity = config.getInt("settings.region-finder-thread-granularity-msec", 1000); |
||||||
|
} |
||||||
|
public String getDefaultGroup() |
||||||
|
{ |
||||||
|
return strDefaultGroup; |
||||||
|
} |
||||||
|
public boolean isInMaintenance() |
||||||
|
{ |
||||||
|
return !"".equals(strMaintenanceMode); |
||||||
|
} |
||||||
|
public String getMaintenanceMode() |
||||||
|
{ |
||||||
|
return strMaintenanceMode; |
||||||
|
} |
||||||
|
public void setMaintenanceMode(String mMode) |
||||||
|
{ |
||||||
|
strMaintenanceMode = (mMode == null) ? "" : mMode; |
||||||
|
plugin.getConfig().set("settings.maintenance-mode", strMaintenanceMode); |
||||||
|
plugin.saveConfig(); |
||||||
|
} |
||||||
|
public boolean isDefaultForever() |
||||||
|
{ |
||||||
|
return bAlwaysInheritDefault; |
||||||
|
} |
||||||
|
public boolean isAsteriskOP() |
||||||
|
{ |
||||||
|
return bTreatAsteriskAsOP; |
||||||
|
} |
||||||
|
public boolean isRewardsEnabled() |
||||||
|
{ |
||||||
|
return bRewardsEnabled; |
||||||
|
} |
||||||
|
public boolean isUseMetrics() |
||||||
|
{ |
||||||
|
return bUseMetrics; |
||||||
|
} |
||||||
|
public boolean isUpdatable() |
||||||
|
{ |
||||||
|
return bUseUpdater; |
||||||
|
} |
||||||
|
public boolean isUseWorldGuard() |
||||||
|
{ |
||||||
|
return bUseWorldGuard; |
||||||
|
} |
||||||
|
public boolean isUseResidence() |
||||||
|
{ |
||||||
|
return bUseResidence; |
||||||
|
} |
||||||
|
public int getAutoReloadDelayTicks() |
||||||
|
{ |
||||||
|
return nAutoReloadDelayTicks; |
||||||
|
} |
||||||
|
public long getRegionFinderGranularity() |
||||||
|
{ |
||||||
|
return nRegionFinderGranularity; |
||||||
|
} |
||||||
|
public ConnectionHelper getConnectionChain() |
||||||
|
{ |
||||||
|
List<Map<?, ?>> configServers = plugin.getConfig().getMapList("servers"); |
||||||
|
List<HashMap<String, String>> serverlist = new ArrayList<>(); |
||||||
|
for(Iterator<Map<?, ?>> it = configServers.iterator(); it.hasNext();) |
||||||
|
{ |
||||||
|
Map<String, String> server = (Map<String, String>) it.next(); |
||||||
|
HashMap<String, String> nodeinfo = new HashMap<>(); |
||||||
|
String nodename = (String) server.get("nodename"); |
||||||
|
String database = (String) server.get("database"); |
||||||
|
String username = (String) server.get("username"); |
||||||
|
String password = (String) server.get("password"); |
||||||
|
String prefixes = (String) server.get("prefixes"); |
||||||
|
String workmode = (String) server.get("workmode"); |
||||||
|
if(nodename != null && !"".equals(nodename)) |
||||||
|
{ |
||||||
|
nodeinfo.put("nodename", nodename); |
||||||
|
nodeinfo.put("database", (database != null) ? database : "localhost:3306/minecraft"); |
||||||
|
nodeinfo.put("username", (username != null) ? username : "user"); |
||||||
|
nodeinfo.put("password", (password != null) ? password : "pass"); |
||||||
|
nodeinfo.put("prefixes", (prefixes != null) ? prefixes : "rscp_"); |
||||||
|
nodeinfo.put("workmode", (workmode != null) ? workmode : "none"); |
||||||
|
serverlist.add(nodeinfo); |
||||||
|
} |
||||||
|
} |
||||||
|
Collections.reverse(serverlist); |
||||||
|
ConnectionHelper connPrev = null; |
||||||
|
for(HashMap<String, String> server : serverlist) |
||||||
|
{ |
||||||
|
ConnectionHelper conn = new ConnectionHelper(plugin, connPrev); |
||||||
|
conn.Initialize( |
||||||
|
server.get("nodename"), server.get("database"), |
||||||
|
server.get("username"), server.get("password"), |
||||||
|
server.get("workmode"), server.get("prefixes")); |
||||||
|
connPrev = conn; |
||||||
|
} |
||||||
|
return connPrev; |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,374 @@ |
|||||||
|
package ru.simsonic.rscPermissions; |
||||||
|
import java.util.ArrayList; |
||||||
|
import java.util.HashMap; |
||||||
|
import java.util.Set; |
||||||
|
import org.bukkit.entity.Player; |
||||||
|
|
||||||
|
public class rscpAPI |
||||||
|
{ |
||||||
|
private final ru.simsonic.rscPermissions.MainPluginClass plugin; |
||||||
|
protected rscpAPI(MainPluginClass rscp) |
||||||
|
{ |
||||||
|
this.plugin = rscp; |
||||||
|
} |
||||||
|
/** |
||||||
|
* Vault support method. |
||||||
|
* Gets name of permission method |
||||||
|
* |
||||||
|
* @return Name of Permission Method |
||||||
|
*/ |
||||||
|
public String getName() |
||||||
|
{ |
||||||
|
return plugin.getName(); |
||||||
|
} |
||||||
|
/** |
||||||
|
* Vault support method. |
||||||
|
* Checks if method is enabled. |
||||||
|
* |
||||||
|
* @return Success or Failure |
||||||
|
*/ |
||||||
|
public boolean isEnabled() |
||||||
|
{ |
||||||
|
return plugin.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. |
||||||
|
* 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 World name |
||||||
|
* @param player Player name |
||||||
|
* @return Players primary group |
||||||
|
*/ |
||||||
|
public String getPrimaryGroup(String world, String player) |
||||||
|
{ |
||||||
|
return plugin.settings.getDefaultGroup(); |
||||||
|
} |
||||||
|
/** |
||||||
|
* Vault permission support method. |
||||||
|
* 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. |
||||||
|
* |
||||||
|
* This method is known to return unexpected results depending on what permission system is being used. Different |
||||||
|
* permission systems |
||||||
|
* will store the player groups differently, It is HIGHLY suggested you test your code out first. |
||||||
|
* |
||||||
|
* @param world World name |
||||||
|
* @param player Player name |
||||||
|
* @param group Group name |
||||||
|
* @return Success or Failure |
||||||
|
*/ |
||||||
|
public boolean playerInGroup(String world, String player, String group) |
||||||
|
{ |
||||||
|
// TO DO
|
||||||
|
return false; |
||||||
|
} |
||||||
|
/** |
||||||
|
* Vault permission support method. |
||||||
|
* 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 World name |
||||||
|
* @param player Player name |
||||||
|
* @param group Group name |
||||||
|
* @return Success or Failure |
||||||
|
*/ |
||||||
|
public boolean playerAddGroup(String world, String player, String group) |
||||||
|
{ |
||||||
|
// TO DO
|
||||||
|
return false; |
||||||
|
} |
||||||
|
/** |
||||||
|
* Vault permission support method. |
||||||
|
* 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 name |
||||||
|
* @param player Player name |
||||||
|
* @param group Group name |
||||||
|
* @return Success or Failure |
||||||
|
*/ |
||||||
|
public boolean playerRemoveGroup(String world, String player, String group) |
||||||
|
{ |
||||||
|
// TO DO
|
||||||
|
return false; |
||||||
|
} |
||||||
|
/** |
||||||
|
* Vault permission support method. |
||||||
|
* 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 World name |
||||||
|
* @param player Player name |
||||||
|
* @param permission Permission node |
||||||
|
* @return Success or Failure |
||||||
|
*/ |
||||||
|
public boolean playerHas(String world, String player, String permission) |
||||||
|
{ |
||||||
|
Player onlinePlayer = plugin.getServer().getPlayerExact(player); |
||||||
|
if(onlinePlayer != null) |
||||||
|
return onlinePlayer.hasPermission(permission); |
||||||
|
plugin.cache.calculateBasePermissions(player); |
||||||
|
HashMap<String, Boolean> map = plugin.cache.mapPermissions.get(player); |
||||||
|
if(map != null) |
||||||
|
{ |
||||||
|
Boolean value = map.get(permission); |
||||||
|
if(value != null) |
||||||
|
return value; |
||||||
|
} |
||||||
|
return false; |
||||||
|
} |
||||||
|
/** |
||||||
|
* Vault permission support method. |
||||||
|
* 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 World name |
||||||
|
* @param player Player name |
||||||
|
* @param permission Permission node |
||||||
|
* @return Success or Failure |
||||||
|
*/ |
||||||
|
public boolean playerAdd(String world, String player, String permission) |
||||||
|
{ |
||||||
|
// TO DO
|
||||||
|
return false; |
||||||
|
} |
||||||
|
/** |
||||||
|
* Vault permission support method. |
||||||
|
* Remove permission from a player. |
||||||
|
* |
||||||
|
* @param world World name |
||||||
|
* @param player Name of Player |
||||||
|
* @param permission Permission node |
||||||
|
* @return Success or Failure |
||||||
|
*/ |
||||||
|
public boolean playerRemove(String world, String player, String permission) |
||||||
|
{ |
||||||
|
// TO DO
|
||||||
|
return false; |
||||||
|
} |
||||||
|
/** |
||||||
|
* Vault permission support method. |
||||||
|
* 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 name |
||||||
|
* @param group Group name |
||||||
|
* @param permission Permission node |
||||||
|
* @return Success or Failure |
||||||
|
*/ |
||||||
|
public boolean groupHas(String world, String group, String permission) |
||||||
|
{ |
||||||
|
// TO DO
|
||||||
|
return false; |
||||||
|
} |
||||||
|
/** |
||||||
|
* Vault permission support method. |
||||||
|
* 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 name |
||||||
|
* @param group Group name |
||||||
|
* @param permission Permission node |
||||||
|
* @return Success or Failure |
||||||
|
*/ |
||||||
|
public boolean groupAdd(String world, String group, String permission) |
||||||
|
{ |
||||||
|
// TO DO
|
||||||
|
return false; |
||||||
|
} |
||||||
|
/** |
||||||
|
* Vault permission support method. |
||||||
|
* 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 name |
||||||
|
* @param group Group name |
||||||
|
* @param permission Permission node |
||||||
|
* @return Success or Failure |
||||||
|
*/ |
||||||
|
public boolean groupRemove(String world, String group, String permission) |
||||||
|
{ |
||||||
|
// TO DO
|
||||||
|
return false; |
||||||
|
} |
||||||
|
/** |
||||||
|
* Vault permission support method. |
||||||
|
* 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 World name |
||||||
|
* @param player Player name |
||||||
|
* @return Array of groups |
||||||
|
*/ |
||||||
|
public String[] getPlayerGroups(String world, String player) |
||||||
|
{ |
||||||
|
ArrayList<String> list = plugin.cache.getUserGroups(player); |
||||||
|
return list.toArray(new String[list.size()]); |
||||||
|
} |
||||||
|
/** |
||||||
|
* Vault permission support method. |
||||||
|
* Returns a list of all known groups |
||||||
|
* |
||||||
|
* @return an Array of String of all groups |
||||||
|
*/ |
||||||
|
public String[] getGroups() |
||||||
|
{ |
||||||
|
Set<String> groups = plugin.cache.getAllPossibleGroups(); |
||||||
|
return groups.toArray(new String[groups.size()]); |
||||||
|
} |
||||||
|
/** |
||||||
|
* Vault chat support. |
||||||
|
* Get players prefix |
||||||
|
* |
||||||
|
* @param world World name |
||||||
|
* @param player Player name |
||||||
|
* @return Prefix |
||||||
|
*/ |
||||||
|
public String getPlayerPrefix(String world, String player) |
||||||
|
{ |
||||||
|
return plugin.cache.userGetPrefix(player); |
||||||
|
} |
||||||
|
/** |
||||||
|
* Vault chat support. |
||||||
|
* Get players prefix |
||||||
|
* |
||||||
|
* @param world World name |
||||||
|
* @param player Player name |
||||||
|
* @return Prefix |
||||||
|
*/ |
||||||
|
public String getPlayerSuffix(String world, String player) |
||||||
|
{ |
||||||
|
return plugin.cache.userGetSuffix(player); |
||||||
|
} |
||||||
|
/** |
||||||
|
* Vault chat support. |
||||||
|
* Get players prefix |
||||||
|
* |
||||||
|
* @param world World name |
||||||
|
* @param group Group name |
||||||
|
* @return Prefix |
||||||
|
*/ |
||||||
|
public String getGroupPrefix(String world, String group) |
||||||
|
{ |
||||||
|
return plugin.cache.groupGetPrefix(group); |
||||||
|
} |
||||||
|
/** |
||||||
|
* Vault chat support. |
||||||
|
* Get players prefix |
||||||
|
* |
||||||
|
* @param world World name |
||||||
|
* @param group Group name |
||||||
|
* @return Prefix |
||||||
|
*/ |
||||||
|
public String getGroupSuffix(String world, String group) |
||||||
|
{ |
||||||
|
return plugin.cache.groupGetSuffix(group); |
||||||
|
} |
||||||
|
/** |
||||||
|
* Vault chat support. |
||||||
|
* Set players prefix |
||||||
|
* |
||||||
|
* @param world World name |
||||||
|
* @param player Player name |
||||||
|
* @param prefix Prefix |
||||||
|
*/ |
||||||
|
public void setPlayerPrefix(String world, final String player, final String prefix) |
||||||
|
{ |
||||||
|
new Thread() |
||||||
|
{ |
||||||
|
@Override |
||||||
|
public void run() |
||||||
|
{ |
||||||
|
plugin.connectionList.updateEntityText(player, true, prefix, true); |
||||||
|
} |
||||||
|
}.start(); |
||||||
|
} |
||||||
|
/** |
||||||
|
* Vault chat support. |
||||||
|
* Set players prefix |
||||||
|
* |
||||||
|
* @param world World name |
||||||
|
* @param player Player name |
||||||
|
* @param suffix Suffix |
||||||
|
*/ |
||||||
|
public void setPlayerSuffix(String world, final String player, final String suffix) |
||||||
|
{ |
||||||
|
new Thread() |
||||||
|
{ |
||||||
|
@Override |
||||||
|
public void run() |
||||||
|
{ |
||||||
|
plugin.connectionList.updateEntityText(player, true, suffix, false); |
||||||
|
} |
||||||
|
}.start(); |
||||||
|
} |
||||||
|
/** |
||||||
|
* Vault chat support. |
||||||
|
* Set group prefix |
||||||
|
* |
||||||
|
* @param world World name |
||||||
|
* @param group Group name |
||||||
|
* @param prefix Prefix |
||||||
|
*/ |
||||||
|
public void setGroupPrefix(String world, final String group, final String prefix) |
||||||
|
{ |
||||||
|
new Thread() |
||||||
|
{ |
||||||
|
@Override |
||||||
|
public void run() |
||||||
|
{ |
||||||
|
plugin.connectionList.updateEntityText(group, false, prefix, true); |
||||||
|
} |
||||||
|
}.start(); |
||||||
|
} |
||||||
|
/** |
||||||
|
* Vault chat support. |
||||||
|
* Set group prefix |
||||||
|
* |
||||||
|
* @param world World name |
||||||
|
* @param group Group name |
||||||
|
* @param suffix Suffix |
||||||
|
*/ |
||||||
|
public void setGroupSuffix(String world, final String group, final String suffix) |
||||||
|
{ |
||||||
|
new Thread() |
||||||
|
{ |
||||||
|
@Override |
||||||
|
public void run() |
||||||
|
{ |
||||||
|
plugin.connectionList.updateEntityText(group, false, suffix, false); |
||||||
|
} |
||||||
|
}.start(); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,72 @@ |
|||||||
|
# Users Section |
||||||
|
users: |
||||||
|
# Player Name |
||||||
|
t3hk0d3: |
||||||
|
# Player Group(s) Section |
||||||
|
group: |
||||||
|
# Player Group Name |
||||||
|
- default |
||||||
|
# Player Specific Permissions Section |
||||||
|
permissions: |
||||||
|
# Permissions node |
||||||
|
- permissions.* |
||||||
|
# World Specific Permission Section |
||||||
|
worlds: |
||||||
|
# World designator |
||||||
|
world: |
||||||
|
# World Specific Permission Group |
||||||
|
permissions: |
||||||
|
# World Specific Permission |
||||||
|
- test.* |
||||||
|
# World Specific Group Section |
||||||
|
group: |
||||||
|
# World Specific Group |
||||||
|
- testers |
||||||
|
# World Specific Prefix |
||||||
|
prefix: '&5[YARR]&f' |
||||||
|
|
||||||
|
# Group Section |
||||||
|
groups: |
||||||
|
# Group Name |
||||||
|
default: |
||||||
|
# Default Group Setting |
||||||
|
default: true |
||||||
|
# Group Permissions Section |
||||||
|
permissions: |
||||||
|
# Negated Permission Node |
||||||
|
- -modifyworld.blocks.interact.23 |
||||||
|
# Permission Node |
||||||
|
- modifyworld.* |
||||||
|
admins: |
||||||
|
# Group Inheritance Section |
||||||
|
inheritance: |
||||||
|
# Groups To Inherit From |
||||||
|
- default |
||||||
|
permissions: |
||||||
|
- example.permission |
||||||
|
- -punish.noobs |
||||||
|
# Group Options Section |
||||||
|
options: |
||||||
|
# Extra Data |
||||||
|
test.test: '100500' |
||||||
|
# Rank Designator |
||||||
|
rank: '1' |
||||||
|
worlds: |
||||||
|
nether: |
||||||
|
permissions: |
||||||
|
- nocheat.fly |
||||||
|
prefix: '&7[ADMIN FROM HELL]' |
||||||
|
testers: |
||||||
|
inheritance: |
||||||
|
- admins |
||||||
|
options: |
||||||
|
test.test: '9000' |
||||||
|
|
||||||
|
# World Specific Section |
||||||
|
worlds: |
||||||
|
# World Name |
||||||
|
nether: |
||||||
|
# World Inheritance Section |
||||||
|
inheritance: |
||||||
|
# World To Inherit From |
||||||
|
- world |
@ -0,0 +1,41 @@ |
|||||||
|
settings: |
||||||
|
default-group: Default |
||||||
|
always-inherit-default-group: false |
||||||
|
treat-asterisk-as-op: true |
||||||
|
auto-reload-delay-sec: 900 |
||||||
|
enable-rewards: false |
||||||
|
use-metrics: true |
||||||
|
auto-update: true |
||||||
|
language: en_US |
||||||
|
region-finder-thread-granularity-msec: 1000 |
||||||
|
maintenance-mode: '' |
||||||
|
integration: |
||||||
|
worldguard: true |
||||||
|
residence: true |
||||||
|
servers: |
||||||
|
- nodename: db-primary-remote |
||||||
|
database: localhost:3306/minecraft |
||||||
|
username: user1 |
||||||
|
password: pass1 |
||||||
|
prefixes: rscp_ |
||||||
|
workmode: fullaccess |
||||||
|
- nodename: db-secondary-local-replication |
||||||
|
database: other.server:3306/replication |
||||||
|
username: user2 |
||||||
|
password: pass2 |
||||||
|
prefixes: rscp_ |
||||||
|
workmode: none |
||||||
|
language: |
||||||
|
mModes: |
||||||
|
unlocked: '{_YL}Server left the maintenance mode' |
||||||
|
locked: |
||||||
|
default: |
||||||
|
mmon: '{_YL}Server is going into maintenance mode.{_NL}{_YL}All players without permissions will be kicked.' |
||||||
|
kick: '{_YL}Server is in maintenance mode\nPlease try to connect later...' |
||||||
|
motd: '{_DR}Server is under maintenance' |
||||||
|
rollback: |
||||||
|
motd: '{_DR}Rolling back griefing.' |
||||||
|
worldedit: |
||||||
|
motd: '{_DR}We are editing world with WE.' |
||||||
|
internal: |
||||||
|
version: 1 |
@ -0,0 +1,50 @@ |
|||||||
|
name: ${project.artifactId} |
||||||
|
main: ${project.groupId}.${project.artifactId}.MainPluginClass |
||||||
|
version: ${project.version} |
||||||
|
author: SimSonic |
||||||
|
website: http://dev.bukkit.org/server-mods/rscPermissions |
||||||
|
softdepend: |
||||||
|
- Vault |
||||||
|
- WorldEdit |
||||||
|
- WorldGuard |
||||||
|
- Residence |
||||||
|
commands: |
||||||
|
rscp: |
||||||
|
description: rscPermissions command hub |
||||||
|
promote: |
||||||
|
description: Promotes player on ladder |
||||||
|
demote: |
||||||
|
description: Demotes player on ladder |
||||||
|
reward: |
||||||
|
description: Shows available rewards for you and allows to use one of them |
||||||
|
usage: /<command> [reward-code] |
||||||
|
permissions: |
||||||
|
rscp.*: |
||||||
|
description: Gives access to all commands |
||||||
|
default: op |
||||||
|
children: |
||||||
|
rscp.admin: true |
||||||
|
rscp.admin: |
||||||
|
description: Allows you to use all /rscp subcommands |
||||||
|
default: op |
||||||
|
children: |
||||||
|
rscp.admin.promote: true |
||||||
|
rscp.admin.lock: true |
||||||
|
rscp.admin.reload: true |
||||||
|
rscp.maintenance.*: true |
||||||
|
rscp.userewards: true |
||||||
|
rscp.admin.promote: |
||||||
|
description: Allows to promote/demote users on ladders |
||||||
|
default: op |
||||||
|
rscp.admin.lock: |
||||||
|
description: Allows to enable/disable maintenance modes |
||||||
|
default: op |
||||||
|
rscp.admin.reload: |
||||||
|
description: Allows to reload configuration and database |
||||||
|
default: op |
||||||
|
rscp.maintenance.*: |
||||||
|
description: Allows to connect when server in any maintenance mode |
||||||
|
default: op |
||||||
|
rscp.userewards: |
||||||
|
description: Allows to view and use available rewards |
||||||
|
default: op |
@ -0,0 +1,21 @@ |
|||||||
|
DELETE FROM |
||||||
|
`{DATABASE}`.`{PREFIX}entities` |
||||||
|
WHERE |
||||||
|
(`prefix` = '' OR `prefix` IS NULL) |
||||||
|
AND |
||||||
|
(`suffix` = '' OR `suffix` IS NULL); |
||||||
|
|
||||||
|
DELETE FROM |
||||||
|
`{DATABASE}`.`{PREFIX}permissions` |
||||||
|
WHERE |
||||||
|
`lifetime` < CURRENT_TIMESTAMP; |
||||||
|
|
||||||
|
DELETE FROM |
||||||
|
`{DATABASE}`.`{PREFIX}inheritance` |
||||||
|
WHERE |
||||||
|
`lifetime` < CURRENT_TIMESTAMP; |
||||||
|
|
||||||
|
DELETE FROM |
||||||
|
`{DATABASE}`.`{PREFIX}ladders` |
||||||
|
WHERE |
||||||
|
`climber_type` = b'1' AND `rank` = 0; |
@ -0,0 +1,14 @@ |
|||||||
|
DELETE FROM |
||||||
|
`{DATABASE}`.`{PREFIX}inheritance` |
||||||
|
WHERE |
||||||
|
`entity` = '{USER}' AND `inheritance_type` = b'1' |
||||||
|
AND |
||||||
|
`parent` IN ( |
||||||
|
SELECT `climber` |
||||||
|
FROM `{DATABASE}`.`{PREFIX}ladders` |
||||||
|
WHERE `ladder` = '{LADDER}' AND `climber_type` = b'0' |
||||||
|
UNION |
||||||
|
SELECT CONCAT(`climber`, '.', '{INSTANCE}') as `climber` |
||||||
|
FROM `{DATABASE}`.`{PREFIX}ladders` |
||||||
|
WHERE `ladder` = '{LADDER}.?' AND `climber_type` = b'0' |
||||||
|
); |
@ -0,0 +1,89 @@ |
|||||||
|
CREATE TABLE IF NOT EXISTS `{DATABASE}`.`{PREFIX}entities` ( |
||||||
|
`id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, |
||||||
|
`entity` VARCHAR(64) NOT NULL, |
||||||
|
`entity_type` TINYINT(1) NOT NULL, |
||||||
|
`prefix` VARCHAR(48) DEFAULT NULL, |
||||||
|
`suffix` VARCHAR(48) DEFAULT NULL, |
||||||
|
PRIMARY KEY (`id`), |
||||||
|
UNIQUE KEY `id_UNIQUE` (`id`), |
||||||
|
UNIQUE KEY `entity_UNIQUE` (`entity`, `entity_type`) |
||||||
|
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET='utf8' COLLATE 'utf8_general_ci'; |
||||||
|
|
||||||
|
CREATE TABLE IF NOT EXISTS `{DATABASE}`.`{PREFIX}permissions` ( |
||||||
|
`id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, |
||||||
|
`entity` VARCHAR(64) NOT NULL, |
||||||
|
`entity_type` TINYINT(1) NOT NULL, |
||||||
|
`permission` VARCHAR(255) NOT NULL, |
||||||
|
`value` BIT(1) NOT NULL DEFAULT b'1', |
||||||
|
`destination` VARCHAR(255) NOT NULL DEFAULT '', |
||||||
|
`expirience` SMALLINT(6) NOT NULL DEFAULT 0, |
||||||
|
`lifetime` TIMESTAMP NULL DEFAULT NULL, |
||||||
|
PRIMARY KEY (`id`), |
||||||
|
UNIQUE KEY `id_UNIQUE` (`id`), |
||||||
|
UNIQUE KEY `permission_UNIQUE` (`entity`, `entity_type`, `permission`, `destination`, `expirience`) |
||||||
|
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET='utf8' COLLATE 'utf8_general_ci'; |
||||||
|
|
||||||
|
CREATE TABLE IF NOT EXISTS `{DATABASE}`.`{PREFIX}inheritance` ( |
||||||
|
`id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, |
||||||
|
`entity` VARCHAR(64) NOT NULL, |
||||||
|
`parent` VARCHAR(64) NOT NULL, |
||||||
|
`inheritance_type` TINYINT(1) NOT NULL, |
||||||
|
`inheritance_priority` SMALLINT(6) NOT NULL DEFAULT '20', |
||||||
|
`destination` VARCHAR(255) NOT NULL DEFAULT '', |
||||||
|
`expirience` SMALLINT(6) NOT NULL DEFAULT 0, |
||||||
|
`lifetime` TIMESTAMP NULL DEFAULT NULL, |
||||||
|
PRIMARY KEY (`id`, `entity`), |
||||||
|
UNIQUE KEY `id_UNIQUE` (`id`), |
||||||
|
UNIQUE KEY `inheritance_UNIQUE` (`entity`, `parent`, `inheritance_type`, `destination`, `expirience`) |
||||||
|
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET='utf8' COLLATE 'utf8_general_ci'; |
||||||
|
|
||||||
|
CREATE TABLE IF NOT EXISTS `{DATABASE}`.`{PREFIX}ladders` ( |
||||||
|
`id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT, |
||||||
|
`climber` VARCHAR(64) NOT NULL, |
||||||
|
`climber_type` TINYINT(1) NOT NULL DEFAULT b'0', |
||||||
|
`ladder` VARCHAR(32) NOT NULL, |
||||||
|
`rank` SMALLINT(6) NOT NULL, |
||||||
|
PRIMARY KEY (`id`), |
||||||
|
UNIQUE KEY `id_UNIQUE` (`id`), |
||||||
|
UNIQUE KEY `climber_UNIQUE` (`climber`, `climber_type`, `ladder`) |
||||||
|
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET='utf8' COLLATE 'utf8_general_ci'; |
||||||
|
|
||||||
|
CREATE TABLE IF NOT EXISTS `{DATABASE}`.`{PREFIX}servers` ( |
||||||
|
`serverid` VARCHAR(48) NOT NULL, |
||||||
|
`plugin_version` VARCHAR(16) DEFAULT NULL, |
||||||
|
`settings_default-group` VARCHAR(64) NOT NULL DEFAULT 'Default', |
||||||
|
`settings_treat-asterisk-as-op` BIT(1) NOT NULL DEFAULT b'1', |
||||||
|
`settings_auto-reload-delay-sec` INT(10) UNSIGNED NOT NULL DEFAULT '900', |
||||||
|
`settings_maintenance-mode` VARCHAR(64) DEFAULT NULL, |
||||||
|
`settings_enable-rewards` BIT(1) NOT NULL DEFAULT b'0', |
||||||
|
`internal_version` TINYINT(2) UNSIGNED NOT NULL DEFAULT '1', |
||||||
|
PRIMARY KEY (`serverid`), |
||||||
|
UNIQUE KEY `serverid_UNIQUE` (`serverid`) |
||||||
|
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET='utf8' COLLATE 'utf8_general_ci'; |
||||||
|
|
||||||
|
/* Merged updates 0.1a -> 0.5.9b -> 0.6b -> 0.7.5 */ |
||||||
|
|
||||||
|
ALTER IGNORE TABLE `{DATABASE}`.`{PREFIX}entities` |
||||||
|
COLLATE 'utf8_general_ci'; |
||||||
|
|
||||||
|
ALTER IGNORE TABLE `{DATABASE}`.`{PREFIX}permissions` |
||||||
|
CHANGE COLUMN `value` `value` BIT(1) NOT NULL DEFAULT b'1', |
||||||
|
CHANGE COLUMN `permission` `permission` VARCHAR(255) NOT NULL, |
||||||
|
CHANGE COLUMN `destination` `destination` VARCHAR(255) NOT NULL DEFAULT '', |
||||||
|
CHANGE COLUMN `expirience` `expirience` SMALLINT(6) NOT NULL DEFAULT 0, |
||||||
|
COLLATE 'utf8_general_ci'; |
||||||
|
|
||||||
|
ALTER IGNORE TABLE `{DATABASE}`.`{PREFIX}inheritance` |
||||||
|
CHANGE COLUMN `destination` `destination` VARCHAR(255) NOT NULL DEFAULT '', |
||||||
|
CHANGE COLUMN `expirience` `expirience` SMALLINT(6) NOT NULL DEFAULT 0, |
||||||
|
DROP PRIMARY KEY, ADD PRIMARY KEY (`id`), |
||||||
|
COLLATE 'utf8_general_ci'; |
||||||
|
|
||||||
|
ALTER IGNORE TABLE `{DATABASE}`.`{PREFIX}ladders` |
||||||
|
CHANGE COLUMN `climber` `climber` VARCHAR(64) NOT NULL, |
||||||
|
DROP INDEX `climber_UNIQUE`, |
||||||
|
ADD UNIQUE INDEX `climber_UNIQUE` (`climber` ASC, `climber_type` ASC, `ladder` ASC), |
||||||
|
COLLATE 'utf8_general_ci'; |
||||||
|
|
||||||
|
ALTER IGNORE TABLE `{DATABASE}`.`{PREFIX}servers` |
||||||
|
COLLATE 'utf8_general_ci'; |
@ -0,0 +1,19 @@ |
|||||||
|
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'; |
@ -0,0 +1,56 @@ |
|||||||
|
INSERT INTO |
||||||
|
`{DATABASE}`.`{PREFIX}entities` |
||||||
|
(`entity`, `entity_type`, `prefix`, `suffix`) |
||||||
|
VALUES |
||||||
|
('Default', b'0', '§r', '§r'), |
||||||
|
('Donators', b'0', '§r§6[Premium]§e', '§r'), |
||||||
|
('Builders', b'0', '§r§5[Builder]§d', '§r'), |
||||||
|
('Moderators', b'0', '§r§b[Moderator]§6', '§r'), |
||||||
|
('Administrators', b'0', '§r§c[Administrator]§6', '§r'); |
||||||
|
|
||||||
|
INSERT INTO |
||||||
|
`{DATABASE}`.`{PREFIX}permissions` |
||||||
|
(`entity`, `entity_type`, `destination`, `permission`) |
||||||
|
VALUES |
||||||
|
('Administrators', b'0', '', '*'), |
||||||
|
('Builders', b'0', '', 'worldedit.*'), |
||||||
|
('Builders', b'0', '', 'rscp.maintenance.*'), |
||||||
|
('Default', b'0', '', 'herochat.speak.*'), |
||||||
|
('Default', b'0', '@RPG', 'scavenger.level'), |
||||||
|
('rpgLevelLow', b'0', '@RPG', 'some.plugin.perm'), |
||||||
|
('rpgLevelMedium', b'0', '@RPG', 'other.plugin.perm'), |
||||||
|
('rpgLevelHigh', b'0', '@RPG', 'third.plugin.superperm'), |
||||||
|
('Donators', b'0', '', 'scavenger.scavenge'); |
||||||
|
|
||||||
|
INSERT INTO |
||||||
|
`{DATABASE}`.`{PREFIX}inheritance` |
||||||
|
(`entity`, `parent`, `inheritance_type`, `destination`, `expirience`) |
||||||
|
VALUES |
||||||
|
('Moderators', 'Administrators', b'0', '', NULL), |
||||||
|
('Default', 'rpgLevelLow', b'0', '@RPG', '10'), |
||||||
|
('Default', 'rpgLevelMedium', b'0', '@RPG', '100'), |
||||||
|
('Default', 'rpgLevelHigh', b'0', '@RPG', '1000'), |
||||||
|
('rpgOutcasts', 'Default', b'0', '@RPG', NULL), |
||||||
|
('rpgTramps', 'Default', b'0', '@RPG', NULL), |
||||||
|
('rpgCitizens', 'rpgTramps', b'0', '@RPG', NULL), |
||||||
|
('rpgElites', 'rpgCitizens', b'0', '@RPG', NULL), |
||||||
|
('rpgHeads', 'rpgElites', b'0', '@RPG', NULL), |
||||||
|
('testplayer', 'Donators', b'1', '@RPG', NULL); |
||||||
|
|
||||||
|
INSERT INTO |
||||||
|
`{DATABASE}`.`{PREFIX}inheritance` |
||||||
|
(`entity`, `parent`, `inheritance_type`, `destination`, `lifetime`) |
||||||
|
VALUES |
||||||
|
('testplayer', 'rpgTramps', b'1', '@RPG', NULL), |
||||||
|
('testplayer', 'Donators1Month', b'1', '', TIMESTAMPADD(MONTH, 1, NOW())); |
||||||
|
|
||||||
|
INSERT INTO |
||||||
|
`{DATABASE}`.`{PREFIX}ladders` |
||||||
|
(`climber`, `climber_type`, `ladder`, `rank`) |
||||||
|
VALUES |
||||||
|
('rpgOutcasts', b'0', 'City', '0'), |
||||||
|
('rpgTramps', b'0', 'City.?', '200'), |
||||||
|
('rpgCitizens', b'0', 'City.?', '400'), |
||||||
|
('rpgElites', b'0', 'City.?', '600'), |
||||||
|
('rpgHeads', b'0', 'City.?', '800'), |
||||||
|
('testplayer', b'1', 'City.Zion', '200'); |
@ -0,0 +1,57 @@ |
|||||||
|
/* ENTITIES */ |
||||||
|
|
||||||
|
INSERT INTO `{DATABASE}`.`{PREFIX}entities` |
||||||
|
(`entity`, `entity_type`, `prefix`, `suffix`) |
||||||
|
SELECT `name`, `type`, |
||||||
|
NULLIF(`prefix`, '') AS `prefix`, |
||||||
|
NULLIF(`suffix`, '') AS `suffix` |
||||||
|
FROM `{DATABASE}`.`permissions_entity` |
||||||
|
WHERE |
||||||
|
NULLIF(`prefix`, '') IS NOT NULL |
||||||
|
OR |
||||||
|
NULLIF(`suffix`, '') IS NOT NULL |
||||||
|
ON DUPLICATE KEY UPDATE |
||||||
|
`prefix` = VALUES(`prefix`), `suffix` = VALUES(`suffix`); |
||||||
|
|
||||||
|
/* PERMISSIONS */ |
||||||
|
|
||||||
|
INSERT INTO `{DATABASE}`.`{PREFIX}permissions` |
||||||
|
(`entity`, `entity_type`, `permission`, `value`, `destination`) |
||||||
|
SELECT |
||||||
|
`name`, `type`, `permission`, b'1' AS `value`, `world` |
||||||
|
FROM `{DATABASE}`.`permissions` |
||||||
|
WHERE |
||||||
|
`permission` NOT LIKE 'group-%-until' |
||||||
|
AND |
||||||
|
SUBSTRING(`permission`, 1, 1) != '-' |
||||||
|
UNION ALL |
||||||
|
SELECT |
||||||
|
`name`, `type`, SUBSTRING(`permission`, 2) AS `permission`, b'0' AS `value`, `world` |
||||||
|
FROM `{DATABASE}`.`permissions` |
||||||
|
WHERE |
||||||
|
`permission` NOT LIKE 'group-%-until' |
||||||
|
AND |
||||||
|
SUBSTRING(`permission`, 1, 1) = '-' |
||||||
|
ORDER BY `type` ASC, `name` ASC, `permission` ASC |
||||||
|
ON DUPLICATE KEY UPDATE |
||||||
|
`value` = VALUES(`value`); |
||||||
|
|
||||||
|
/* INHERITANCE */ |
||||||
|
|
||||||
|
INSERT IGNORE INTO `{DATABASE}`.`{PREFIX}inheritance` |
||||||
|
(`entity`, `parent`, `inheritance_type`, `destination`) |
||||||
|
SELECT `child`, `parent`, `type`, `world` |
||||||
|
FROM `{DATABASE}`.`permissions_inheritance` |
||||||
|
ORDER BY `type` ASC, `parent` ASC, `child` ASC; |
||||||
|
|
||||||
|
INSERT INTO `{DATABASE}`.`{PREFIX}inheritance` |
||||||
|
(`entity`, `parent`, `inheritance_type`, `destination`, `lifetime`) |
||||||
|
SELECT |
||||||
|
`name`, |
||||||
|
SUBSTRING(TRIM(TRAILING '-until' FROM `permission`), 7) AS `parent`, |
||||||
|
`type`, `world`, FROM_UNIXTIME(`value`) AS `lifetime` |
||||||
|
FROM `{DATABASE}`.`permissions` |
||||||
|
WHERE `permission` LIKE 'group-%-until' |
||||||
|
ORDER BY `type` ASC, `parent` ASC, `name` ASC |
||||||
|
ON DUPLICATE KEY UPDATE |
||||||
|
`lifetime` = VALUES(`lifetime`); |
@ -0,0 +1,7 @@ |
|||||||
|
INSERT INTO |
||||||
|
`{DATABASE}`.`{PREFIX}ladders` |
||||||
|
(`climber`, `climber_type`, `ladder`, `rank`) |
||||||
|
VALUES |
||||||
|
('{USER}', b'1', '{LADDER}', '{RANK}') |
||||||
|
ON DUPLICATE KEY UPDATE |
||||||
|
`rank` = VALUES(`rank`); |
@ -0,0 +1,6 @@ |
|||||||
|
INSERT INTO |
||||||
|
`{DATABASE}`.`{PREFIX}entities`(`entity`, `entity_type`, `{TEXT_TYPE}`) |
||||||
|
VALUES |
||||||
|
('{ENTITY}', b'{ENTITY_TYPE}', {TEXT}) |
||||||
|
ON DUPLICATE KEY UPDATE |
||||||
|
`{TEXT_TYPE}` = VALUES(`{TEXT_TYPE}`); |
@ -0,0 +1,27 @@ |
|||||||
|
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…
Reference in new issue