Browse Source

* Json backend reading .jsons.

* Maintenance moved to Bukkit impl.
* Removed a little bit of code which is now reused from rscUtilityLibrary.
* Started localization coding (en/ru).
* Other things.
master
Stanislav Usenkov 10 years ago
parent
commit
489deac611
  1. 42
      pom.xml
  2. 2
      src/main/java/ru/simsonic/rscPermissions/API/Settings.java
  3. 27
      src/main/java/ru/simsonic/rscPermissions/Backends/BackendJson.java
  4. 7
      src/main/java/ru/simsonic/rscPermissions/Bukkit/BukkitMaintenance.java
  5. 33
      src/main/java/ru/simsonic/rscPermissions/Bukkit/BukkitPermissions.java
  6. 3
      src/main/java/ru/simsonic/rscPermissions/BukkitPluginMain.java
  7. 2
      src/main/java/ru/simsonic/rscPermissions/DataTypes/AbstractRow.java
  8. 23
      src/main/java/ru/simsonic/rscPermissions/DataTypes/CommandHelperAnswerException.java
  9. 51
      src/main/java/ru/simsonic/rscPermissions/Phrases.java
  10. 30
      src/main/java/ru/simsonic/rscPermissions/RegionUpdateObserver.java
  11. 14
      src/main/resources/config.yml
  12. 0
      src/main/resources/languages/english.yml
  13. 0
      src/main/resources/languages/russian.yml
  14. 4
      src/main/resources/plugin.yml

42
pom.xml

@ -4,21 +4,21 @@
<groupId>ru.simsonic</groupId> <groupId>ru.simsonic</groupId>
<artifactId>rscPermissions</artifactId> <artifactId>rscPermissions</artifactId>
<version>0.9.1a</version> <version>0.9.2a</version>
<packaging>jar</packaging> <packaging>jar</packaging>
<name>rscPermissions</name> <name>rscPermissions</name>
<url>https://github.com/SimSonic/rscPermissions</url> <url>https://github.com/SimSonic/rscPermissions/</url>
<repositories> <repositories>
<!-- Bukkit / Spigot / Sponge --> <!-- Bukkit / Spigot / Sponge -->
<repository> <repository>
<id>sponge-repo</id> <id>sponge-repo</id>
<url>http://repo.spongepowered.org/Sponge/maven</url> <url>http://repo.spongepowered.org/Sponge/maven/</url>
</repository> </repository>
<repository> <repository>
<id>bukkit-repo</id> <id>bukkit-repo</id>
<url>http://repo.bukkit.org/content/groups/public</url> <url>http://repo.bukkit.org/content/groups/public/</url>
</repository> </repository>
<repository> <repository>
<id>spigot-repo</id> <id>spigot-repo</id>
@ -32,7 +32,7 @@
<!-- VaultAPI --> <!-- VaultAPI -->
<repository> <repository>
<id>vault-repo</id> <id>vault-repo</id>
<url>http://nexus.theyeticave.net/content/repositories/pub_releases</url> <url>http://nexus.theyeticave.net/content/repositories/pub_releases/</url>
</repository> </repository>
<!-- Region list providers: WorldGuard, Residence --> <!-- Region list providers: WorldGuard, Residence -->
<repository> <repository>
@ -58,21 +58,21 @@
<groupId>com.google.code.gson</groupId> <groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId> <artifactId>gson</artifactId>
<version>2.3.1</version> <version>2.3.1</version>
<scope>provided</scope> <scope>compile</scope>
</dependency> </dependency>
<!-- В первую очередь плагин создан под платформу Bukkit (Spigot) --> <!-- В первую очередь плагин создан под платформу Bukkit (Spigot) -->
<dependency> <dependency>
<groupId>org.bukkit</groupId> <groupId>org.bukkit</groupId>
<artifactId>bukkit</artifactId> <artifactId>bukkit</artifactId>
<version>1.7.9-R0.2</version> <version>1.8-R0.1-SNAPSHOT</version>
<scope>provided</scope> <scope>provided</scope>
</dependency> </dependency>
<!-- В связи с появлением Sponge API, разработка будет вестись и под него -->
<dependency> <dependency>
<groupId>org.spongepowered</groupId> <groupId>ru.simsonic</groupId>
<artifactId>spongeapi</artifactId> <artifactId>rscUtilityLibrary</artifactId>
<version>1.0</version> <version>2.0.1</version>
<scope>provided</scope> <scope>compile</scope>
<type>jar</type>
</dependency> </dependency>
<!-- Статистика использование плагинов --> <!-- Статистика использование плагинов -->
<dependency> <dependency>
@ -107,13 +107,12 @@
<version>3.0-SNAPSHOT</version> <version>3.0-SNAPSHOT</version>
<scope>provided</scope> <scope>provided</scope>
</dependency> </dependency>
<!-- Какие-то временные изыски Reality_SC, в будущем уберуться --> <!-- В связи с появлением Sponge API, разработка будет вестись и под него -->
<dependency> <dependency>
<groupId>ru.simsonic</groupId> <groupId>org.spongepowered</groupId>
<artifactId>rscUtilityLibrary</artifactId> <artifactId>spongeapi</artifactId>
<version>2.0.0</version> <version>1.0</version>
<scope>compile</scope> <scope>provided</scope>
<type>jar</type>
</dependency> </dependency>
</dependencies> </dependencies>
@ -164,14 +163,19 @@
<createDependencyReducedPom>false</createDependencyReducedPom> <createDependencyReducedPom>false</createDependencyReducedPom>
<artifactSet> <artifactSet>
<includes> <includes>
<include>com.google.code.gson:gson</include>
<include>ru.simsonic:rscUtilityLibrary</include> <include>ru.simsonic:rscUtilityLibrary</include>
<include>org.mcstats.bukkit:metrics-lite</include> <include>org.mcstats.bukkit:metrics-lite</include>
</includes> </includes>
</artifactSet> </artifactSet>
<relocations> <relocations>
<relocation>
<pattern>com.google.gson</pattern>
<shadedPattern>${project.groupId}.${project.artifactId}.com-google-gson-shaded</shadedPattern>
</relocation>
<relocation> <relocation>
<pattern>ru.simsonic.rscUtilityLibrary</pattern> <pattern>ru.simsonic.rscUtilityLibrary</pattern>
<shadedPattern>ru.simsonic.rscPermissions.rscUtilityLibraryShaded</shadedPattern> <shadedPattern>${project.groupId}.${project.artifactId}.ru-simsonic-rscUtilityLibrary-shaded</shadedPattern>
</relocation> </relocation>
</relocations> </relocations>
</configuration> </configuration>

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

@ -17,7 +17,7 @@ public interface Settings
public boolean isUseResidence(); public boolean isUseResidence();
public boolean isUseWorldGuard(); public boolean isUseWorldGuard();
public long getRegionFinderGranularity(); public long getRegionFinderGranularity();
public ConnectionHelper getConnectionChain();
public int getAutoReloadDelayTicks(); public int getAutoReloadDelayTicks();
public boolean isUseMetrics(); public boolean isUseMetrics();
public ConnectionHelper getConnectionChain();
} }

27
src/main/java/ru/simsonic/rscPermissions/Backends/BackendJson.java

@ -1,5 +1,11 @@
package ru.simsonic.rscPermissions.Backends; package ru.simsonic.rscPermissions.Backends;
import com.google.gson.Gson; import com.google.gson.Gson;
import com.google.gson.stream.JsonReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStreamReader;
import java.nio.charset.Charset;
import ru.simsonic.rscPermissions.DataTypes.RowEntity; import ru.simsonic.rscPermissions.DataTypes.RowEntity;
import ru.simsonic.rscPermissions.DataTypes.RowInheritance; import ru.simsonic.rscPermissions.DataTypes.RowInheritance;
import ru.simsonic.rscPermissions.DataTypes.RowPermission; import ru.simsonic.rscPermissions.DataTypes.RowPermission;
@ -12,16 +18,37 @@ public class BackendJson
public RowEntity[] fetchEntities() public RowEntity[] fetchEntities()
{ {
final Gson gson = new Gson(); final Gson gson = new Gson();
try
{
JsonReader jr = new JsonReader(new InputStreamReader(new FileInputStream(
new File(localEntitiesFile)), Charset.forName("UTF-8")));
return gson.fromJson(jr, RowEntity[].class);
} catch(FileNotFoundException ex) {
}
return null; return null;
} }
public RowPermission[] fetchPermissions() public RowPermission[] fetchPermissions()
{ {
final Gson gson = new Gson(); final Gson gson = new Gson();
try
{
JsonReader jr = new JsonReader(new InputStreamReader(new FileInputStream(
new File(localEntitiesFile)), Charset.forName("UTF-8")));
return gson.fromJson(jr, RowPermission[].class);
} catch(FileNotFoundException ex) {
}
return null; return null;
} }
public RowInheritance[] fetchInheritance() public RowInheritance[] fetchInheritance()
{ {
final Gson gson = new Gson(); final Gson gson = new Gson();
try
{
JsonReader jr = new JsonReader(new InputStreamReader(new FileInputStream(
new File(localEntitiesFile)), Charset.forName("UTF-8")));
return gson.fromJson(jr, RowInheritance[].class);
} catch(FileNotFoundException ex) {
}
return null; return null;
} }
} }

7
src/main/java/ru/simsonic/rscPermissions/MaintenanceMode.java → src/main/java/ru/simsonic/rscPermissions/Bukkit/BukkitMaintenance.java

@ -1,4 +1,4 @@
package ru.simsonic.rscPermissions; package ru.simsonic.rscPermissions.Bukkit;
import java.util.HashMap; import java.util.HashMap;
import java.util.UUID; import java.util.UUID;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
@ -6,12 +6,13 @@ import org.bukkit.entity.Player;
import org.bukkit.event.Listener; import org.bukkit.event.Listener;
import org.bukkit.event.player.AsyncPlayerPreLoginEvent; import org.bukkit.event.player.AsyncPlayerPreLoginEvent;
import org.bukkit.event.server.ServerListPingEvent; import org.bukkit.event.server.ServerListPingEvent;
import ru.simsonic.rscPermissions.BukkitPluginMain;
import ru.simsonic.rscUtilityLibrary.TextProcessing.GenericChatCodes; import ru.simsonic.rscUtilityLibrary.TextProcessing.GenericChatCodes;
public class MaintenanceMode implements Listener public class BukkitMaintenance implements Listener
{ {
private final BukkitPluginMain plugin; private final BukkitPluginMain plugin;
public MaintenanceMode(BukkitPluginMain rscp) public BukkitMaintenance(BukkitPluginMain rscp)
{ {
this.plugin = rscp; this.plugin = rscp;
} }

33
src/main/java/ru/simsonic/rscPermissions/Bukkit/BukkitPermissions.java

@ -1,22 +1,20 @@
package ru.simsonic.rscPermissions.Bukkit; package ru.simsonic.rscPermissions.Bukkit;
import java.util.Arrays;
import java.util.HashMap; import java.util.HashMap;
import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.LinkedBlockingQueue;
import java.util.logging.Level;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.permissions.PermissionAttachment; import org.bukkit.permissions.PermissionAttachment;
import ru.simsonic.rscPermissions.DataTypes.RowPermission; import ru.simsonic.rscPermissions.DataTypes.RowPermission;
import ru.simsonic.rscPermissions.InternalCache.BrandNewCache; import ru.simsonic.rscPermissions.InternalCache.BrandNewCache;
import ru.simsonic.rscPermissions.BukkitPluginMain; import ru.simsonic.rscPermissions.BukkitPluginMain;
import ru.simsonic.rscUtilityLibrary.RestartableThread;
public class BukkitPermissions implements Runnable public class BukkitPermissions extends RestartableThread
{ {
private final BukkitPluginMain rscp; private final BukkitPluginMain rscp;
public BukkitPermissions(BukkitPluginMain plugin) public BukkitPermissions(BukkitPluginMain plugin)
{ {
this.rscp = plugin; this.rscp = plugin;
} }
private Thread thread;
private final LinkedBlockingQueue<Player> updateQueue = new LinkedBlockingQueue<>(); private final LinkedBlockingQueue<Player> updateQueue = new LinkedBlockingQueue<>();
private final HashMap<Player, String> prefixes = new HashMap<>(); private final HashMap<Player, String> prefixes = new HashMap<>();
private final HashMap<Player, String> suffixes = new HashMap<>(); private final HashMap<Player, String> suffixes = new HashMap<>();
@ -25,7 +23,7 @@ public class BukkitPermissions implements Runnable
public final HashMap<Player, PermissionAttachment> attachments = new HashMap<>(); public final HashMap<Player, PermissionAttachment> attachments = new HashMap<>();
public void recalculateOnlinePlayers() public void recalculateOnlinePlayers()
{ {
updateQueue.addAll(Arrays.asList(rscp.getServer().getOnlinePlayers())); updateQueue.addAll(rscp.getServer().getOnlinePlayers());
rscp.scheduleAutoUpdate(); rscp.scheduleAutoUpdate();
} }
public void recalculatePlayer(Player player) public void recalculatePlayer(Player player)
@ -36,33 +34,10 @@ public class BukkitPermissions implements Runnable
} catch(InterruptedException ex) { } catch(InterruptedException ex) {
} }
} }
public void start()
{
stop();
thread = new Thread(this);
thread.start();
}
public void stop()
{
if(thread != null)
{
if(thread.isAlive())
{
try
{
thread.interrupt();
thread.join();
} catch(InterruptedException ex) {
BukkitPluginMain.consoleLog.log(Level.SEVERE, "[rscp] Exception in BukkitPermissions: {0}", ex);
}
}
thread = null;
}
}
@Override @Override
public void run() public void run()
{ {
Thread.currentThread().setName("rscp:PermissionManager"); Thread.currentThread().setName("rscp:" + this.getClass().getSimpleName());
Thread.currentThread().setPriority(Thread.MIN_PRIORITY); Thread.currentThread().setPriority(Thread.MIN_PRIORITY);
try try
{ {

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

@ -1,4 +1,5 @@
package ru.simsonic.rscPermissions; package ru.simsonic.rscPermissions;
import ru.simsonic.rscPermissions.Bukkit.BukkitMaintenance;
import ru.simsonic.rscPermissions.API.Settings; import ru.simsonic.rscPermissions.API.Settings;
import java.io.IOException; import java.io.IOException;
import java.util.logging.Level; import java.util.logging.Level;
@ -27,7 +28,7 @@ public final class BukkitPluginMain extends JavaPlugin
public final RegionListProviders regionListProvider = new RegionListProviders(this); public final RegionListProviders regionListProvider = new RegionListProviders(this);
private final RegionUpdateObserver regionUpdateObserver = new RegionUpdateObserver(this); private final RegionUpdateObserver regionUpdateObserver = new RegionUpdateObserver(this);
public final CommandHelper commandHelper = new CommandHelper(this); public final CommandHelper commandHelper = new CommandHelper(this);
public final MaintenanceMode maintenance = new MaintenanceMode(this); public final BukkitMaintenance maintenance = new BukkitMaintenance(this);
public ConnectionHelper connectionList; public ConnectionHelper connectionList;
private MetricsLite metrics; private MetricsLite metrics;
@Override @Override

2
src/main/java/ru/simsonic/rscPermissions/DataTypes/AbstractRow.java

@ -6,7 +6,7 @@ public abstract class AbstractRow
public int id = 0; public int id = 0;
public static enum Table public static enum Table
{ {
entities, permissions, inheritance, ladders, unknown; entities, permissions, inheritance, unknown;
} }
public abstract Table getTable(); public abstract Table getTable();
private static final Pattern patternUUID = Pattern.compile( private static final Pattern patternUUID = Pattern.compile(

23
src/main/java/ru/simsonic/rscPermissions/DataTypes/CommandHelperAnswerException.java

@ -1,23 +0,0 @@
package ru.simsonic.rscPermissions.DataTypes;
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;
}
}

51
src/main/java/ru/simsonic/rscPermissions/Phrases.java

@ -0,0 +1,51 @@
package ru.simsonic.rscPermissions;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.logging.Level;
import org.bukkit.configuration.file.YamlConfiguration;
public enum Phrases
{
PLUGIN_ENABLED ("generic.enabled"),
PLUGIN_DISABLED ("generic.disabled"),
PLUGIN_METRICS ("generic.metrics"),
PLUGIN_RELOADED ("generic.reloaded"),
FETCHED ("generic.fetched");
private final String node;
private String phrase;
private Phrases(String node)
{
this.node = node;
}
@Override
public String toString()
{
return phrase;
}
public static void fill(BukkitPluginMain plugin, String langName)
{
final File langFile = new File(plugin.getDataFolder(), langName + ".yml");
final YamlConfiguration langConfig = YamlConfiguration.loadConfiguration(langFile);
for(Phrases value : Phrases.values())
value.phrase = langConfig.getString(value.node, value.node);
}
public static void extract(BukkitPluginMain plugin, String langName)
{
try
{
final File langFile = new File(plugin.getDataFolder(), langName + ".yml");
if(!langFile.isFile())
{
final YamlConfiguration langConfig = YamlConfiguration.loadConfiguration(langFile);
final InputStream langStream = BukkitPluginMain.class.getResourceAsStream("/languages/" + langName + ".yml");
YamlConfiguration langSource = YamlConfiguration.loadConfiguration(new InputStreamReader(langStream));
langConfig.setDefaults(langSource);
langConfig.save(langFile);
}
} catch(IOException ex) {
BukkitPluginMain.consoleLog.log(Level.WARNING, "Cannot extract language: {0}", langName);
}
}
}

30
src/main/java/ru/simsonic/rscPermissions/RegionUpdateObserver.java

@ -1,15 +1,14 @@
package ru.simsonic.rscPermissions; package ru.simsonic.rscPermissions;
import java.util.logging.Level;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import ru.simsonic.rscUtilityLibrary.BukkitListeners.MovingPlayersCatcher; import ru.simsonic.rscUtilityLibrary.BukkitListeners.MovingPlayersCatcher;
import ru.simsonic.rscUtilityLibrary.RestartableThread;
public class RegionUpdateObserver implements Runnable public class RegionUpdateObserver extends RestartableThread
{ {
private static final long granularityMin = 20; private static final long granularityMin = 20;
private static final long granularityMax = 10000; private static final long granularityMax = 10000;
private final BukkitPluginMain rscp; private final BukkitPluginMain rscp;
private final MovingPlayersCatcher movedPlayers = new MovingPlayersCatcher(); private final MovingPlayersCatcher movedPlayers = new MovingPlayersCatcher();
private Thread thread;
RegionUpdateObserver(BukkitPluginMain rscp) RegionUpdateObserver(BukkitPluginMain rscp)
{ {
this.rscp = rscp; this.rscp = rscp;
@ -18,35 +17,12 @@ public class RegionUpdateObserver implements Runnable
{ {
rscp.getServer().getPluginManager().registerEvents(movedPlayers, rscp); rscp.getServer().getPluginManager().registerEvents(movedPlayers, rscp);
} }
public void start()
{
stop();
thread = new Thread(this);
thread.start();
}
public void stop()
{
if(thread != null)
{
if(thread.isAlive())
{
try
{
thread.interrupt();
thread.join();
} catch(InterruptedException ex) {
BukkitPluginMain.consoleLog.log(Level.SEVERE, "[rscp] Exception in RegionUpdateObserver: {0}", ex);
}
}
thread = null;
}
}
@Override @Override
public void run() public void run()
{ {
try try
{ {
Thread.currentThread().setName("rscp:RegionUpdateObserver"); Thread.currentThread().setName("rscp:" + this.getClass().getSimpleName());
Thread.currentThread().setPriority(Thread.MIN_PRIORITY); Thread.currentThread().setPriority(Thread.MIN_PRIORITY);
long granularity = rscp.settings.getRegionFinderGranularity(); long granularity = rscp.settings.getRegionFinderGranularity();
if(granularity < granularityMin) if(granularity < granularityMin)

14
src/main/resources/config.yml

@ -4,7 +4,7 @@ settings:
treat-asterisk-as-op: true treat-asterisk-as-op: true
auto-reload-delay-sec: 900 auto-reload-delay-sec: 900
use-metrics: true use-metrics: true
language: en_US language: english
maintenance-mode: '' maintenance-mode: ''
region-finder-thread-granularity-msec: 1000 region-finder-thread-granularity-msec: 1000
integration: integration:
@ -23,17 +23,5 @@ servers:
password: pass2 password: pass2
prefixes: rscp_ prefixes: rscp_
workmode: none workmode: none
language:
maintenance:
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: internal:
version: 1 version: 1

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

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

4
src/main/resources/plugin.yml

@ -1,8 +1,8 @@
name: ${project.artifactId} name: ${project.artifactId}
version: ${project.version} version: ${project.version}
website: ${project.url}
main: ${project.groupId}.${project.artifactId}.BukkitPluginMain main: ${project.groupId}.${project.artifactId}.BukkitPluginMain
author: SimSonic author: SimSonic
website: ${project.url}
softdepend: softdepend:
- Vault - Vault
- WorldEdit - WorldEdit
@ -31,5 +31,5 @@ permissions:
description: Allows to reload configuration and database description: Allows to reload configuration and database
default: op default: op
rscp.maintenance.*: rscp.maintenance.*:
description: Allows to connect when server in any maintenance mode description: Allows to connect when server is in any maintenance mode
default: op default: op

Loading…
Cancel
Save