[3.4.3] Merge pull request #133 from Rsl1122/3.4.3

Pull Request for 3.4.3
This commit is contained in:
Risto Lahtela 2017-06-16 16:12:35 +03:00 committed by GitHub
commit faca03755d
108 changed files with 1226 additions and 1267 deletions

4
.gitignore vendored
View File

@ -10,4 +10,6 @@
/ProjectHelper/nbproject/
/ProjectHelper/target/
/Filetool/nbproject/private/
/Filetool/build/
/Filetool/build/
/PlanPluginBridge/target/
/MakroS/nbproject/private/

View File

@ -1,82 +1,176 @@
<?xml version="1.0" encoding="UTF-8"?>
<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/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.djrapitops</groupId>
<artifactId>Plan</artifactId>
<version>2.0.0</version>
<build>
<sourceDirectory>${basedir}/src</sourceDirectory>
<defaultGoal>clean package install</defaultGoal>
<resources>
<resource>
<targetPath>.</targetPath>
<directory>${basedir}/src/main/resources</directory>
<includes>
<include>*.yml</include>
<include>*.html</include>
</includes>
</resource>
</resources>
<finalName>${project.name}</finalName>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.3</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
<plugin>
<artifactId>maven-jar-plugin</artifactId>
<version>2.6</version>
</plugin>
<plugin>
<artifactId>maven-shade-plugin</artifactId>
<version>2.3</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
</execution>
</executions>
<configuration>
<artifactSet>
<includes>
<include>org.jfree:*</include>
</includes>
</artifactSet>
<relocations>
<relocation>
<pattern>org.jfree</pattern>
<shadedPattern>com.djrapitops.plan.jfree</shadedPattern>
</relocation>
</relocations>
<minimizeJar>false</minimizeJar>
</configuration>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>org.bukkit</groupId>
<artifactId>craftbukkit</artifactId>
<version>1.10.2-R0.1-SNAPSHOT</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.djrapitops</groupId>
<artifactId>plan.lite</artifactId>
<version>1.6.3</version>
<scope>provided</scope>
</dependency>
</dependencies>
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<modelVersion>4.0.0</modelVersion>
<groupId>com.djrapitops</groupId>
<artifactId>Plan</artifactId>
<version>3.4.3</version>
<build>
<sourceDirectory>${basedir}/src</sourceDirectory>
<defaultGoal>clean package install</defaultGoal>
<resources>
<resource>
<targetPath>.</targetPath>
<directory>${basedir}/src/main/resources</directory>
<includes>
<include>*.yml</include>
<include>*.html</include>
</includes>
</resource>
</resources>
<finalName>${project.name}</finalName>
<plugins>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.3</version>
<configuration>
<source>1.8</source>
<target>1.8</target>
</configuration>
</plugin>
<plugin>
<artifactId>maven-shade-plugin</artifactId>
<version>2.4.3</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
</execution>
</executions>
<configuration>
<artifactSet>
<excludes>
<exclude>org.powermock:*</exclude>
<exclude>org.javassist:*</exclude>
<exclude>com.thoughtworks.xstream:*</exclude>
<exclude>xmlpull:*</exclude>
<exclude>xpp3:*</exclude>
<exclude>org.objenesis:*</exclude>
<exclude>cglib:*</exclude>
<exclude>org.*:*</exclude>
<exclude>org.easymock:*</exclude>
<exclude>junit:*</exclude>
</excludes>
</artifactSet>
</configuration>
</plugin>
<plugin>
<artifactId>maven-jar-plugin</artifactId>
<version>2.6</version>
<configuration>
<excludes>
<exclude>**/test/*</exclude>
<exclude>**/*/test/*</exclude>
<exclude>**/*/test.*</exclude>
<exclude>**/test/**/*</exclude>
</excludes>
</configuration>
</plugin>
<plugin>
<groupId>org.pitest</groupId>
<artifactId>pitest-maven</artifactId>
<version>1.1.8</version>
<configuration>
<targetClasses>
<param>main.java.com.djrapitops.plan.*</param>
</targetClasses>
<targetTests>
<param>test.java.main.java.com.djrapitops.plan.*</param>
</targetTests>
<timeoutConstant>1000</timeoutConstant>
</configuration>
</plugin>
<plugin>
<artifactId>maven-checkstyle-plugin</artifactId>
<version>2.17</version>
<configuration>
<excludes>**/test/**/*</excludes>
<configLocation>checkstyle.xml</configLocation>
</configuration>
</plugin>
<plugin>
<artifactId>maven-javadoc-plugin</artifactId>
<version>2.10.4</version>
<configuration>
<excludePackageNames>test.*</excludePackageNames>
</configuration>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>org.bukkit</groupId>
<artifactId>craftbukkit</artifactId>
<version>1.11.2-R0.1-SNAPSHOT</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock</artifactId>
<version>1.6.6</version>
<type>pom</type>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-api-mockito</artifactId>
<version>1.6.6</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-module-junit4</artifactId>
<version>1.6.6</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-module-junit4-rule</artifactId>
<version>1.6.6</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-classloading-xstream</artifactId>
<version>1.6.6</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
<version>1.10.19</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.powermock</groupId>
<artifactId>powermock-api-easymock</artifactId>
<version>1.6.6</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.easymock</groupId>
<artifactId>easymock</artifactId>
<version>3.4</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.hamcrest</groupId>
<artifactId>hamcrest-core</artifactId>
<version>1.3</version>
<scope>test</scope>
</dependency>
</dependencies>
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
</project>

View File

@ -3,18 +3,8 @@
<modelVersion>4.0.0</modelVersion>
<groupId>com.djrapitops</groupId>
<artifactId>Plan</artifactId>
<version>3.4.2</version>
<version>3.4.3</version>
<packaging>jar</packaging>
<repositories>
<!-- <repository>
<id>bukkit-repo</id>
<url>https://hub.spigotmc.org/nexus/content/repositories/snapshots/</url>
</repository>-->
<repository>
<id>vault-repo</id>
<url>http://nexus.hc.to/content/repositories/pub_releases</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>org.bukkit</groupId>
@ -24,58 +14,16 @@
</dependency>
<!-- SoftDepended Plugins-->
<dependency>
<groupId>com.hm</groupId>
<artifactId>advanced.achievements</artifactId>
<version>5.2</version>
<scope>provided</scope>
<groupId>com.djrapitops</groupId>
<artifactId>BukkitPluginDependency</artifactId>
<version>1.0.0</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>me.edge209</groupId>
<artifactId>ontime</artifactId>
<version>4.1.4</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.earth2me</groupId>
<artifactId>essentials</artifactId>
<version>2.0.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.massivecraft</groupId>
<artifactId>factions</artifactId>
<version>2.10.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.gamingmesh</groupId>
<artifactId>jobs</artifactId>
<version>3.9.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.massivecraft</groupId>
<artifactId>mcore</artifactId>
<version>2.10.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.gmail.nossr50</groupId>
<artifactId>mcmmo</artifactId>
<version>1.5.07</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.palmergames</groupId>
<artifactId>towny</artifactId>
<version>0.91.4.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>net.milkbowl.vault</groupId>
<artifactId>VaultAPI</artifactId>
<version>1.6</version>
<scope>provided</scope>
<groupId>com.djrapitops</groupId>
<artifactId>PlanPluginBridge</artifactId>
<version>3.4.3</version>
<scope>compile</scope>
</dependency>
<!-- -->
<dependency>
@ -158,6 +106,35 @@
<target>1.8</target>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-shade-plugin</artifactId>
<version>2.4.3</version>
<executions>
<execution>
<phase>package</phase>
<goals>
<goal>shade</goal>
</goals>
</execution>
</executions>
<configuration>
<artifactSet>
<excludes>
<exclude>org.powermock:*</exclude>
<exclude>org.javassist:*</exclude>
<exclude>com.thoughtworks.xstream:*</exclude>
<exclude>xmlpull:*</exclude>
<exclude>xpp3:*</exclude>
<exclude>org.objenesis:*</exclude>
<exclude>cglib:*</exclude>
<exclude>org.*:*</exclude>
<exclude>org.easymock:*</exclude>
<exclude>junit:*</exclude>
</excludes>
</artifactSet>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>

View File

@ -1,13 +1,6 @@
package main.java.com.djrapitops.plan;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Collection;
import main.java.com.djrapitops.plan.utilities.FormatUtils;
import main.java.com.djrapitops.plan.utilities.MiscUtils;
import org.bukkit.command.ConsoleCommandSender;
/**
* This class manages the messages going to the Bukkit's Logger.
@ -17,27 +10,17 @@ import org.bukkit.command.ConsoleCommandSender;
*/
public class Log {
final private static String DEBUG = "DebugLog.txt";
final private static String ERRORS = "Errors.txt";
/**
* Logs the message to the console as INFO.
*
* @param message "Message" will show up as [INFO][Plan]: Message
*/
public static void info(String message) {
Plan instance = Plan.getInstance();
if (instance != null) {
instance.getLogger().info(message);
}
if (!message.contains("[DEBUG]")) {
debug(message);
}
Plan.getInstance().getPluginLogger().info(message);
}
public static void infoColor(String message) {
ConsoleCommandSender consoleSender = Plan.getInstance().getServer().getConsoleSender();
consoleSender.sendMessage(Phrase.PREFIX + message);
Plan.getInstance().getPluginLogger().infoColor(message);
}
/**
@ -46,10 +29,7 @@ public class Log {
* @param message "Message" will show up as [ERROR][Plan]: Message
*/
public static void error(String message) {
Plan instance = Plan.getInstance();
if (instance != null) {
instance.getLogger().severe(message);
}
Plan.getInstance().getPluginLogger().error(message);
}
/**
@ -58,16 +38,7 @@ public class Log {
* @param message "Message" will show up as [INFO][Plan]: [DEBUG] Message
*/
public static void debug(String message) {
String debugMode = Settings.DEBUG.toString().toLowerCase();
boolean both = debugMode.equals("true") || debugMode.equals("both");
boolean logConsole = Settings.DEBUG.isTrue() || both || debugMode.equals("console");
boolean logFile = debugMode.equals("file") || both;
if (logConsole) {
info("[DEBUG] " + message);
}
if (logFile) {
toLog(message, DEBUG);
}
Plan.getInstance().getPluginLogger().debug(message);
}
/**
@ -77,12 +48,7 @@ public class Log {
* @param e Throwable, eg NullPointerException
*/
public static void toLog(String source, Throwable e) {
error(Phrase.ERROR_LOGGED.parse(e.toString()));
toLog(source + " Caught " + e, ERRORS);
for (StackTraceElement x : e.getStackTrace()) {
toLog(" " + x, ERRORS);
}
toLog("", ERRORS);
Plan.getInstance().getPluginLogger().toLog(source, e);
}
/**
@ -92,9 +58,7 @@ public class Log {
* @param e Collection of Throwables, eg NullPointerException
*/
public static void toLog(String source, Collection<Throwable> e) {
for (Throwable ex : e) {
toLog(source, ex);
}
Plan.getInstance().getPluginLogger().toLog(source, e);
}
/**
@ -104,34 +68,10 @@ public class Log {
* @param filename Name of the file to write to.
*/
public static void toLog(String message, String filename) {
if (filename.equals(ERRORS)) {
Log.debug(message);
}
Plan plan = Plan.getInstance();
if (plan == null) {
return;
}
File folder = plan.getDataFolder();
if (!folder.exists()) {
folder.mkdir();
}
File log = new File(folder, filename);
try {
if (!log.exists()) {
log.createNewFile();
}
FileWriter fw = new FileWriter(log, true);
try (PrintWriter pw = new PrintWriter(fw)) {
String timestamp = FormatUtils.formatTimeStampSecond(MiscUtils.getTime());
pw.println("[" + timestamp + "] " + message);
pw.flush();
}
} catch (IOException e) {
Log.error("Failed to create" + filename + "file");
}
Plan.getInstance().getPluginLogger().toLog(message, filename);
}
public static String getErrorsFilename() {
return ERRORS;
return Plan.getInstance().getPluginLogger().getErrorsFilename();
}
}

View File

@ -138,6 +138,7 @@ public enum Phrase {
CMD_USG_MANAGE_COMBINE("Copy data from one database to another & combine values"),
CMD_USG_MANAGE_IMPORT("Import Data from supported plugins to Active Database."),
CMD_USG_MANAGE_CLEAR("Clear data from one database"),
CMD_USG_MANAGE_CLEAN("Clear incorrect data from the database"),
CMD_USG_MANAGE_REMOVE("Remove players's data from the Active Database."),
CMD_USG_MANAGE_STATUS("Check the status of the Active Database."),
CMD_USG_MANAGE_HELP("Show managment help."),

View File

@ -19,6 +19,8 @@
*/
package main.java.com.djrapitops.plan;
import com.djrapitops.javaplugin.ColorScheme;
import com.djrapitops.javaplugin.RslPlugin;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
@ -42,7 +44,6 @@ import main.java.com.djrapitops.plan.utilities.MiscUtils;
import org.bukkit.Bukkit;
import org.bukkit.Server;
import org.bukkit.plugin.PluginManager;
import org.bukkit.plugin.java.JavaPlugin;
import org.bukkit.scheduler.BukkitRunnable;
import org.bukkit.scheduler.BukkitTask;
@ -53,7 +54,7 @@ import org.bukkit.scheduler.BukkitTask;
* @author Rsl1122
* @since 1.0.0
*/
public class Plan extends JavaPlugin {
public class Plan extends RslPlugin<Plan> {
private API api;
private DataCacheHandler handler;
@ -79,19 +80,25 @@ public class Plan extends JavaPlugin {
@Override
public void onEnable() {
setInstance(this);
getDataFolder().mkdirs();
super.setDebugMode(Settings.DEBUG.toString());
super.setColorScheme(new ColorScheme(Phrase.COLOR_MAIN.color(), Phrase.COLOR_SEC.color(), Phrase.COLOR_TER.color()));
super.setLogPrefix("[Plan]");
super.setUpdateCheckUrl("https://raw.githubusercontent.com/Rsl1122/Plan-PlayerAnalytics/master/Plan/src/main/resources/plugin.yml");
super.setUpdateUrl("https://www.spigotmc.org/resources/plan-player-analytics.32536/");
super.onEnableDefaultTasks();
initLocale();
Server server = getServer();
Server server = getServer();
variable = new ServerVariableHolder(server);
Log.debug("-------------------------------------");
Log.debug("Debug log, Server Start: Plan v."+getDescription().getVersion());
Log.debug("Server: "+server.getBukkitVersion());
Log.debug("Version: "+server.getVersion());
Log.debug("Debug log: Plan v." + getDescription().getVersion());
Log.debug("Implements RslPlugin v." + getRslVersion());
Log.debug("Server: " + server.getBukkitVersion());
Log.debug("Version: " + server.getVersion());
Log.debug("-------------------------------------");
databases = new HashSet<>();
databases.add(new MySQLDB(this));
databases.add(new SQLiteDB(this));
@ -100,8 +107,6 @@ public class Plan extends JavaPlugin {
getConfig().options().header(Phrase.CONFIG_HEADER + "");
saveConfig();
Log.info(MiscUtils.checkVersion());
Log.info(Phrase.DB_INIT + "");
if (initDatabase()) {
Log.info(Phrase.DB_ESTABLISHED.parse(db.getConfigName()));
@ -136,13 +141,13 @@ public class Plan extends JavaPlugin {
|| (Settings.USE_ALTERNATIVE_UI.isTrue())) {
Log.infoColor(Phrase.ERROR_NO_DATA_VIEW + "");
}
if (!Settings.SHOW_ALTERNATIVE_IP.isTrue() && server.getIp().isEmpty()) {
if (!Settings.SHOW_ALTERNATIVE_IP.isTrue() && variable.getIp().isEmpty()) {
Log.infoColor(Phrase.NOTIFY_EMPTY_IP + "");
}
hookHandler = new HookHandler();
Log.debug("Verboose debug messages are enabled.");
Log.debug("Verboose debug messages are enabled.");
Log.info(Phrase.ENABLED + "");
}
@ -175,27 +180,27 @@ public class Plan extends JavaPlugin {
pluginManager.registerEvents(new PlanPlayerListener(this), this);
if (Settings.GATHERCHAT.isTrue()) {
pluginManager.registerEvents(new PlanChatListener(this), this);
registerListener(new PlanChatListener(this));
} else {
Log.infoColor(Phrase.NOTIFY_DISABLED_CHATLISTENER + "");
}
if (Settings.GATHERGMTIMES.isTrue()) {
pluginManager.registerEvents(new PlanGamemodeChangeListener(this), this);
registerListener(new PlanGamemodeChangeListener(this));
} else {
Log.infoColor(Phrase.NOTIFY_DISABLED_GMLISTENER + "");
}
if (Settings.GATHERCOMMANDS.isTrue()) {
pluginManager.registerEvents(new PlanCommandPreprocessListener(this), this);
registerListener(new PlanCommandPreprocessListener(this));
} else {
Log.infoColor(Phrase.NOTIFY_DISABLED_COMMANDLISTENER + "");
}
if (Settings.GATHERKILLS.isTrue()) {
pluginManager.registerEvents(new PlanDeathEventListener(this), this);
registerListener(new PlanDeathEventListener(this));
} else {
Log.infoColor(Phrase.NOTIFY_DISABLED_DEATHLISTENER + "");
}
if (Settings.GATHERLOCATIONS.isTrue()) {
pluginManager.registerEvents(new PlanPlayerMoveListener(this), this);
registerListener(new PlanPlayerMoveListener(this));
}
}
@ -400,32 +405,6 @@ public class Plan extends JavaPlugin {
public ServerVariableHolder getVariable() {
return variable;
}
/**
* Used to get the current instance of Plan.
*
* Instance is set on the first line of onEnable method.
*
* @return current instance of Plan, Singleton.
* @throws IllegalStateException If onEnable method has not been called and
* the instance is null.
*/
public static Plan getInstance() {
Plan INSTANCE = PlanHolder.INSTANCE;
if (INSTANCE == null) {
throw new IllegalStateException("Plugin not enabled properly, Singleton instance is null.");
}
return INSTANCE;
}
/**
* Used to set the current instance of Plan.
*
* @param plan The newly enabled Plan instance.
*/
public static void setInstance(Plan plan) {
PlanHolder.INSTANCE = plan;
}
/**
* Used to get the PlanAPI. @see API
@ -435,15 +414,14 @@ public class Plan extends JavaPlugin {
* Plan and the instance is null.
*/
public static API getPlanAPI() throws IllegalStateException {
Plan INSTANCE = PlanHolder.INSTANCE;
Plan INSTANCE = getInstance();
if (INSTANCE == null) {
throw new IllegalStateException("Plugin not enabled properly, Singleton instance is null.");
}
return INSTANCE.api;
}
private static class PlanHolder {
private static Plan INSTANCE = null;
public static Plan getInstance() {
return (Plan) getPluginInstance();
}
}

View File

@ -3,19 +3,27 @@ package main.java.com.djrapitops.plan;
import org.bukkit.Server;
/**
* Class responsible for holding server variable values that do not change
* without a reload.
*
* @author Rsl1122
* @since 3.4.1
*/
public class ServerVariableHolder {
private int maxPlayers;
private String ip;
public ServerVariableHolder(Server server) {
maxPlayers = server.getMaxPlayers();
ip = server.getIp();
}
public int getMaxPlayers() {
return maxPlayers;
}
public String getIp() {
return ip;
}
}

View File

@ -34,6 +34,7 @@ public enum Settings {
ENABLED_ONT("Customization.Plugins.Enabled.OnTime"),
ENABLED_TOW("Customization.Plugins.Enabled.Towny"),
ENABLED_VAU("Customization.Plugins.Enabled.Vault"),
LINK_PROTOCOL("Settings.WebServer.LinkProtocol"),
// Integer
ANALYSIS_MINUTES_FOR_ACTIVE("Settings.Analysis.MinutesPlayedUntilConsidiredActive"),
SAVE_CACHE_MIN("Settings.Cache.DataCache.SaveEveryXMinutes"),
@ -61,6 +62,7 @@ public enum Settings {
//
FORMAT_YEAR("Customization.Formats.TimeAmount.Year"),
FORMAT_YEARS("Customization.Formats.TimeAmount.Years"),
FORMAT_DAY("Customization.Formats.TimeAmount.Day"),
FORMAT_DAYS("Customization.Formats.TimeAmount.Days"),
FORMAT_HOURS("Customization.Formats.TimeAmount.Hours"),
FORMAT_MINUTES("Customization.Formats.TimeAmount.Minutes"),

View File

@ -1,5 +1,6 @@
package main.java.com.djrapitops.plan.api;
import com.djrapitops.javaplugin.utilities.UUIDFetcher;
import java.sql.SQLException;
import java.util.Collection;
import java.util.List;
@ -14,7 +15,6 @@ import main.java.com.djrapitops.plan.data.handling.info.HandlingInfo;
import main.java.com.djrapitops.plan.ui.DataRequestHandler;
import main.java.com.djrapitops.plan.ui.webserver.WebSocketServer;
import main.java.com.djrapitops.plan.utilities.HtmlUtils;
import main.java.com.djrapitops.plan.utilities.uuid.UUIDFetcher;
import static org.bukkit.Bukkit.getOfflinePlayer;
import org.bukkit.OfflinePlayer;
@ -83,7 +83,7 @@ public class API {
* @return ip:port/security/player/Playername
*/
public String getPlayerInspectPageLink(String name) {
return HtmlUtils.getInspectUrl(name);
return HtmlUtils.getInspectUrlWithProtocol(name);
}
/**

View File

@ -1,16 +0,0 @@
package main.java.com.djrapitops.plan.command;
/**
* This enum contains different types of commands.
*
* CONSOLE can be used always, PLAYER can only be used as a player,
* CONSOLE_WITH_ARGUMENTS can be used always, except with arguments on console.
*
* @author Rsl1122
* @since 1.0.0
*/
public enum CommandType {
CONSOLE,
PLAYER,
CONSOLE_WITH_ARGUMENTS
}

View File

@ -1,17 +1,15 @@
package main.java.com.djrapitops.plan.command;
import com.djrapitops.javaplugin.command.CommandType;
import com.djrapitops.javaplugin.command.SubCommand;
import com.djrapitops.javaplugin.command.TreeCommand;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import main.java.com.djrapitops.plan.Log;
import main.java.com.djrapitops.plan.Phrase;
import main.java.com.djrapitops.plan.Plan;
import main.java.com.djrapitops.plan.command.commands.*;
import main.java.com.djrapitops.plan.utilities.FormatUtils;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
/**
* CommandExecutor for the /plan command, and all subcommands.
@ -19,9 +17,7 @@ import org.bukkit.entity.Player;
* @author Rsl1122
* @since 1.0.0
*/
public class PlanCommand implements CommandExecutor {
private final List<SubCommand> commands;
public class PlanCommand extends TreeCommand<Plan> implements CommandExecutor {
/**
* CommandExecutor class Constructor.
@ -31,8 +27,19 @@ public class PlanCommand implements CommandExecutor {
* @param plugin Current instance of Plan
*/
public PlanCommand(Plan plugin) {
commands = new ArrayList<>();
commands.add(new HelpCommand(plugin, this));
super(plugin, new SubCommand("plan", CommandType.CONSOLE, "") {
@Override
public boolean onCommand(CommandSender sender, Command cmd, String commandLabel, String[] args) {
return true;
}
}, "plan");
super.setDefaultCommand("inspect");
// commands.add(new HelpCommand(plugin, this));
}
@Override
public void addCommands() {
commands.add(new InspectCommand(plugin));
commands.add(new QuickInspectCommand(plugin));
commands.add(new AnalyzeCommand(plugin));
@ -42,94 +49,4 @@ public class PlanCommand implements CommandExecutor {
commands.add(new ReloadCommand(plugin));
commands.add(new ManageCommand(plugin));
}
/**
* Used to get the list of all subcommands.
*
* @return Initialized SubCommands
*/
public List<SubCommand> getCommands() {
return this.commands;
}
/**
* Checks SubCommands for matching aliases.
*
* @param name SubCommand in text form that might match alias.
* @return SubCommand, null if no match.
*/
public SubCommand getCommand(String name) {
for (SubCommand command : commands) {
String[] aliases = command.getName().split(",");
for (String alias : aliases) {
if (alias.equalsIgnoreCase(name)) {
return command;
}
}
}
return null;
}
private void sendDefaultCommand(CommandSender sender, Command cmd, String commandLabel, String[] args) {
String command = "inspect";
if (args.length < 1) {
command = "help";
}
onCommand(sender, cmd, commandLabel, FormatUtils.mergeArrays(new String[]{command}, args));
}
/**
* Checks if Sender has rights to run the command and executes matching
* subcommand.
*
* @param sender source of the command.
* @param cmd command.
* @param commandLabel label.
* @param args arguments of the command
* @return true
*/
@Override
public boolean onCommand(CommandSender sender, Command cmd, String commandLabel, String[] args) {
Log.debug("Registered command with arguments: "+Arrays.toString(args));
if (args.length < 1) {
sendDefaultCommand(sender, cmd, commandLabel, args);
return true;
}
SubCommand command = getCommand(args[0]);
if (command == null) {
sendDefaultCommand(sender, cmd, commandLabel, args);
return true;
}
boolean console = !(sender instanceof Player);
if (!command.getPermission().userHasThisPermission(sender)) {
sender.sendMessage("" + Phrase.COMMAND_NO_PERMISSION);
return true;
}
if (console && args.length < 2 && command.getCommandType() == CommandType.CONSOLE_WITH_ARGUMENTS) {
sender.sendMessage("" + Phrase.COMMAND_REQUIRES_ARGUMENTS.parse(Phrase.USE_PLAN + ""));
return true;
}
if (console && command.getCommandType() == CommandType.PLAYER) {
sender.sendMessage("" + Phrase.COMMAND_SENDER_NOT_PLAYER);
return true;
}
String[] realArgs = new String[args.length - 1];
for (int i = 1; i < args.length; i++) {
realArgs[i - 1] = args[i];
}
command.onCommand(sender, cmd, commandLabel, realArgs);
return true;
}
}

View File

@ -1,105 +0,0 @@
package main.java.com.djrapitops.plan.command;
import main.java.com.djrapitops.plan.Permissions;
import org.bukkit.command.Command;
import org.bukkit.command.CommandExecutor;
import org.bukkit.command.CommandSender;
/**
* Abstract subcommand class that stores all the required information of a
* command.
*
* @author Rsl1122
* @since 1.0.0
*/
public abstract class SubCommand {
private final String name;
private final Permissions permission;
private final String usage;
private final CommandType commandType;
private final String arguments;
/**
* Class constructor, called with super(...) in subcommands.
*
* @param name Name(s) (aliases) of the command
* @param permission Required permission
* @param usage Usage information
* @param commandType Type Enum
* @param arguments Additional possible arguments the command requires
*/
public SubCommand(String name, Permissions permission, String usage, CommandType commandType, String arguments) {
this.name = name;
this.permission = permission;
this.usage = usage;
this.commandType = commandType;
this.arguments = arguments;
}
/**
* Used to get a string format of required arguments.
*
* @return Additional possible arguments the command requires
*/
public String getArguments() {
return arguments;
}
/**
* Used to get the first alias.
*
* @return First alias of the command
*/
public String getFirstName() {
return name.split(",")[0];
}
/**
* Used to get all aliases.
*
* @return All aliases separated with ','
*/
public String getName() {
return name;
}
/**
* Used to get the permission required by the command.
*
* @return Required permission
*/
public Permissions getPermission() {
return permission;
}
/**
* Used to get the info about usage of the command.
*
* @return Usage information
*/
public String getUsage() {
return usage;
}
/**
* Used to get the command type.
*
* @return CommandType Enum.
*/
public CommandType getCommandType() {
return commandType;
}
/**
* The Command Execution method.
*
* @param sender Parameter of onCommand in CommandExecutor.
* @param cmd Parameter of onCommand in CommandExecutor.
* @param commandLabel Parameter of onCommand in CommandExecutor.
* @param args Parameter of onCommand in CommandExecutor.
* @return Was the execution successful?
* @see CommandExecutor
*/
public abstract boolean onCommand(CommandSender sender, Command cmd, String commandLabel, String[] args);
}

View File

@ -1,13 +1,13 @@
package main.java.com.djrapitops.plan.command.commands;
import com.djrapitops.javaplugin.command.CommandType;
import com.djrapitops.javaplugin.command.SubCommand;
import main.java.com.djrapitops.plan.Log;
import main.java.com.djrapitops.plan.Permissions;
import main.java.com.djrapitops.plan.Phrase;
import main.java.com.djrapitops.plan.Plan;
import main.java.com.djrapitops.plan.Settings;
import main.java.com.djrapitops.plan.command.CommandType;
import main.java.com.djrapitops.plan.command.CommandUtils;
import main.java.com.djrapitops.plan.command.SubCommand;
import main.java.com.djrapitops.plan.data.cache.AnalysisCacheHandler;
import main.java.com.djrapitops.plan.ui.TextUI;
import main.java.com.djrapitops.plan.utilities.HtmlUtils;
@ -27,8 +27,8 @@ import org.bukkit.scheduler.BukkitTask;
*/
public class AnalyzeCommand extends SubCommand {
private Plan plugin;
private AnalysisCacheHandler analysisCache;
private final Plan plugin;
private final AnalysisCacheHandler analysisCache;
/**
* Subcommand Constructor.
@ -36,7 +36,7 @@ public class AnalyzeCommand extends SubCommand {
* @param plugin Current instance of Plan
*/
public AnalyzeCommand(Plan plugin) {
super("analyze, analyse, analysis", Permissions.ANALYZE, Phrase.CMD_USG_ANALYZE.parse(), CommandType.CONSOLE, "");
super("analyze, analyse, analysis", CommandType.CONSOLE, Permissions.ANALYZE.getPermission(), Phrase.CMD_USG_ANALYZE.parse());
this.plugin = plugin;
analysisCache = plugin.getAnalysisCache();
}
@ -61,7 +61,7 @@ public class AnalyzeCommand extends SubCommand {
@Override
public void run() {
timesrun++;
if (analysisCache.isCached()) {
if (analysisCache.isCached() && !analysisCache.isAnalysisBeingRun()) {
sendAnalysisMessage(sender);
this.cancel();
return;
@ -90,7 +90,7 @@ public class AnalyzeCommand extends SubCommand {
sender.sendMessage(TextUI.getAnalysisMessages());
} else {
// Link
String url = HtmlUtils.getServerAnalysisUrl();
String url = HtmlUtils.getServerAnalysisUrlWithProtocol();
String message = Phrase.CMD_LINK + "";
boolean console = !(sender instanceof Player);
if (console) {

View File

@ -1,55 +0,0 @@
package main.java.com.djrapitops.plan.command.commands;
import main.java.com.djrapitops.plan.Permissions;
import main.java.com.djrapitops.plan.Phrase;
import main.java.com.djrapitops.plan.Plan;
import main.java.com.djrapitops.plan.command.CommandType;
import main.java.com.djrapitops.plan.command.PlanCommand;
import main.java.com.djrapitops.plan.command.SubCommand;
import org.bukkit.ChatColor;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
/**
* This subcommand is used to view the subcommands.
*
* @author Rsl1122
* @since 1.0.0
*/
public class HelpCommand extends SubCommand {
private final Plan plugin;
private final PlanCommand command;
/**
* Subcommand Constructor.
*
* @param plugin Current instance of Plan
* @param command Current instance of PlanCommand
*/
public HelpCommand(Plan plugin, PlanCommand command) {
super("help,?", Permissions.HELP, Phrase.CMD_USG_HELP + "", CommandType.CONSOLE, "");
this.plugin = plugin;
this.command = command;
}
@Override
public boolean onCommand(CommandSender sender, Command comd, String commandLabel, String[] args) {
boolean isConsole = !(sender instanceof Player);
ChatColor oColor = Phrase.COLOR_MAIN.color();
ChatColor tColor = Phrase.COLOR_SEC.color();
sender.sendMessage(Phrase.CMD_HELP_HEADER + "");
this.command.getCommands().stream()
.filter(cmd -> !cmd.getName().equalsIgnoreCase(getName()))
.filter(cmd -> cmd.getPermission().userHasThisPermission(sender))
.filter(cmd -> !(isConsole && cmd.getCommandType() == CommandType.PLAYER))
.map(cmd -> tColor + " " + Phrase.BALL.toString() + oColor + " /plan " + cmd.getFirstName() + " " + cmd.getArguments() + tColor + " - " + cmd.getUsage())
.forEach(msg -> sender.sendMessage(msg));
sender.sendMessage(Phrase.CMD_FOOTER + "");
return true;
}
}

View File

@ -1,11 +1,11 @@
package main.java.com.djrapitops.plan.command.commands;
import com.djrapitops.javaplugin.command.CommandType;
import com.djrapitops.javaplugin.command.SubCommand;
import com.djrapitops.javaplugin.utilities.VersionUtils;
import main.java.com.djrapitops.plan.Permissions;
import main.java.com.djrapitops.plan.Phrase;
import main.java.com.djrapitops.plan.Plan;
import main.java.com.djrapitops.plan.command.CommandType;
import main.java.com.djrapitops.plan.command.SubCommand;
import main.java.com.djrapitops.plan.utilities.MiscUtils;
import org.bukkit.ChatColor;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
@ -18,7 +18,7 @@ import org.bukkit.command.CommandSender;
*/
public class InfoCommand extends SubCommand {
private Plan plugin;
private final Plan plugin;
/**
* Subcommand Constructor.
@ -26,7 +26,7 @@ public class InfoCommand extends SubCommand {
* @param plugin Current instance of Plan
*/
public InfoCommand(Plan plugin) {
super("info", Permissions.INFO, Phrase.CMD_USG_INFO + "", CommandType.CONSOLE, "");
super("info", CommandType.CONSOLE,Permissions.INFO.getPermission(), Phrase.CMD_USG_INFO + "");
this.plugin = plugin;
}
@ -38,7 +38,7 @@ public class InfoCommand extends SubCommand {
String[] messages = {
Phrase.CMD_INFO_HEADER + "",
Phrase.CMD_INFO_VERSION.parse(plugin.getDescription().getVersion()),
Phrase.CMD_BALL.toString() + tColor + " " + MiscUtils.checkVersion(),
Phrase.CMD_BALL.toString() + tColor + " " + VersionUtils.checkVersion(plugin),
Phrase.CMD_MANAGE_STATUS_ACTIVE_DB.parse(plugin.getDB().getConfigName()),
Phrase.CMD_FOOTER + ""
};

View File

@ -1,5 +1,7 @@
package main.java.com.djrapitops.plan.command.commands;
import com.djrapitops.javaplugin.command.CommandType;
import com.djrapitops.javaplugin.command.SubCommand;
import main.java.com.djrapitops.plan.command.CommandUtils;
import java.util.UUID;
import main.java.com.djrapitops.plan.Log;
@ -7,9 +9,7 @@ import main.java.com.djrapitops.plan.Permissions;
import main.java.com.djrapitops.plan.Phrase;
import main.java.com.djrapitops.plan.Plan;
import main.java.com.djrapitops.plan.Settings;
import main.java.com.djrapitops.plan.command.CommandType;
import main.java.com.djrapitops.plan.command.Condition;
import main.java.com.djrapitops.plan.command.SubCommand;
import main.java.com.djrapitops.plan.data.cache.InspectCacheHandler;
import main.java.com.djrapitops.plan.ui.TextUI;
import main.java.com.djrapitops.plan.utilities.HtmlUtils;
@ -30,8 +30,8 @@ import org.bukkit.scheduler.BukkitTask;
*/
public class InspectCommand extends SubCommand {
private Plan plugin;
private InspectCacheHandler inspectCache;
private final Plan plugin;
private final InspectCacheHandler inspectCache;
/**
* Class Constructor.
@ -39,7 +39,7 @@ public class InspectCommand extends SubCommand {
* @param plugin Current instance of Plan
*/
public InspectCommand(Plan plugin) {
super("inspect", Permissions.INSPECT, Phrase.CMD_USG_INSPECT + "", CommandType.CONSOLE_WITH_ARGUMENTS, Phrase.ARG_PLAYER + "");
super("inspect", CommandType.CONSOLE_WITH_ARGUMENTS, Permissions.INSPECT.getPermission(), Phrase.CMD_USG_INSPECT + "", Phrase.ARG_PLAYER + "");
this.plugin = plugin;
inspectCache = plugin.getInspectCache();
@ -75,7 +75,7 @@ public class InspectCommand extends SubCommand {
private int timesrun = 0;
@Override
public void run() {
public void run() {
timesrun++;
if (inspectCache.isCached(uuid)) {
sendInspectMsg(sender, playerName, uuid);
@ -85,7 +85,7 @@ public class InspectCommand extends SubCommand {
if (timesrun > 10) {
Log.debug("Command Timeout Message, Inspect.");
sender.sendMessage(Phrase.COMMAND_TIMEOUT.parse("Inspect"));
this.cancel();
this.cancel();
}
}
@ -101,7 +101,7 @@ public class InspectCommand extends SubCommand {
sender.sendMessage(TextUI.getInspectMessages(uuid));
} else {
// Link
String url = HtmlUtils.getInspectUrl(playerName);
String url = HtmlUtils.getInspectUrlWithProtocol(playerName);
String message = Phrase.CMD_LINK + "";
boolean console = !(sender instanceof Player);
if (console) {

View File

@ -1,17 +1,14 @@
package main.java.com.djrapitops.plan.command.commands;
import java.util.ArrayList;
import java.util.List;
import com.djrapitops.javaplugin.command.CommandType;
import com.djrapitops.javaplugin.command.SubCommand;
import com.djrapitops.javaplugin.command.TreeCommand;
import main.java.com.djrapitops.plan.Permissions;
import main.java.com.djrapitops.plan.Phrase;
import main.java.com.djrapitops.plan.Plan;
import main.java.com.djrapitops.plan.command.CommandType;
import main.java.com.djrapitops.plan.command.SubCommand;
import main.java.com.djrapitops.plan.command.commands.manage.*;
import main.java.com.djrapitops.plan.utilities.FormatUtils;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
/**
* This command is used to manage the database of the plugin.
@ -21,10 +18,7 @@ import org.bukkit.entity.Player;
* @author Rsl1122
* @since 2.3.0
*/
public class ManageCommand extends SubCommand {
private final List<SubCommand> commands;
private Plan plugin;
public class ManageCommand extends TreeCommand<Plan> {
/**
* Subcommand Constructor.
@ -32,10 +26,16 @@ public class ManageCommand extends SubCommand {
* @param plugin Current instance of Plan
*/
public ManageCommand(Plan plugin) {
super("manage, m", Permissions.MANAGE, Phrase.CMD_USG_MANAGE + "", CommandType.CONSOLE, "");
this.plugin = plugin;
commands = new ArrayList<>();
commands.add(new ManageHelpCommand(plugin, this));
super(plugin, new SubCommand("manage,m", CommandType.CONSOLE, Permissions.MANAGE.getPermission(), Phrase.CMD_USG_MANAGE + "") {
@Override
public boolean onCommand(CommandSender sender, Command cmd, String commandLabel, String[] args) {
return true;
}
}, "plan manage");
}
@Override
public void addCommands() {
commands.add(new ManageMoveCommand(plugin));
commands.add(new ManageHotswapCommand(plugin));
commands.add(new ManageBackupCommand(plugin));
@ -43,83 +43,7 @@ public class ManageCommand extends SubCommand {
commands.add(new ManageStatusCommand(plugin));
commands.add(new ManageImportCommand(plugin));
commands.add(new ManageRemoveCommand(plugin));
// commands.add(new ManageCleanCommand(plugin));
commands.add(new ManageClearCommand(plugin));
}
/**
* Used to get the list of manage subcommands.
*
* @return Initialized SubCommands
*/
public List<SubCommand> getCommands() {
return this.commands;
}
/**
* Checks SubCommands for matching aliases.
*
* @param name SubCommand in text form that might match alias.
* @return SubCommand, null if no match.
*/
public SubCommand getCommand(String name) {
for (SubCommand command : commands) {
String[] aliases = command.getName().split(",");
for (String alias : aliases) {
if (alias.equalsIgnoreCase(name)) {
return command;
}
}
}
return null;
}
private void sendDefaultCommand(CommandSender sender, Command cmd, String commandLabel, String[] args) {
String command = "help";
onCommand(sender, cmd, commandLabel, FormatUtils.mergeArrays(new String[]{command}, args));
}
@Override
public boolean onCommand(CommandSender sender, Command cmd, String commandLabel, String[] args) {
if (args.length < 1) {
sendDefaultCommand(sender, cmd, commandLabel, args);
return true;
}
SubCommand command = getCommand(args[0]);
if (command == null) {
sendDefaultCommand(sender, cmd, commandLabel, args);
return true;
}
boolean console = !(sender instanceof Player);
if (!command.getPermission().userHasThisPermission(sender)) {
sender.sendMessage("" + Phrase.COMMAND_NO_PERMISSION);
return true;
}
if (console && args.length < 2 && command.getCommandType() == CommandType.CONSOLE_WITH_ARGUMENTS) {
sender.sendMessage("" + Phrase.COMMAND_REQUIRES_ARGUMENTS.parse(Phrase.USE_MANAGE + ""));
return true;
}
if (console && command.getCommandType() == CommandType.PLAYER) {
sender.sendMessage("" + Phrase.COMMAND_SENDER_NOT_PLAYER);
return true;
}
String[] realArgs = new String[args.length - 1];
for (int i = 1; i < args.length; i++) {
realArgs[i - 1] = args[i];
}
command.onCommand(sender, cmd, commandLabel, realArgs);
return true;
}
}

View File

@ -1,11 +1,11 @@
package main.java.com.djrapitops.plan.command.commands;
import com.djrapitops.javaplugin.command.CommandType;
import com.djrapitops.javaplugin.command.SubCommand;
import main.java.com.djrapitops.plan.Log;
import main.java.com.djrapitops.plan.Permissions;
import main.java.com.djrapitops.plan.Phrase;
import main.java.com.djrapitops.plan.Plan;
import main.java.com.djrapitops.plan.command.CommandType;
import main.java.com.djrapitops.plan.command.SubCommand;
import main.java.com.djrapitops.plan.data.cache.AnalysisCacheHandler;
import main.java.com.djrapitops.plan.ui.TextUI;
import main.java.com.djrapitops.plan.utilities.MiscUtils;
@ -23,8 +23,8 @@ import org.bukkit.scheduler.BukkitTask;
*/
public class QuickAnalyzeCommand extends SubCommand {
private Plan plugin;
private AnalysisCacheHandler analysisCache;
private final Plan plugin;
private final AnalysisCacheHandler analysisCache;
/**
* Subcommand Constructor.
@ -32,7 +32,7 @@ public class QuickAnalyzeCommand extends SubCommand {
* @param plugin Current instance of Plan
*/
public QuickAnalyzeCommand(Plan plugin) {
super("qanalyze, qanalyse, qanalysis", Permissions.QUICK_ANALYZE, Phrase.CMD_USG_QANALYZE.parse(), CommandType.CONSOLE, "");
super("qanalyze, qanalyse, qanalysis", CommandType.CONSOLE, Permissions.QUICK_ANALYZE.getPermission(), Phrase.CMD_USG_QANALYZE.parse());
this.plugin = plugin;
analysisCache = plugin.getAnalysisCache();
}
@ -56,7 +56,7 @@ public class QuickAnalyzeCommand extends SubCommand {
@Override
public void run() {
timesrun++;
if (analysisCache.isCached()) {
if (analysisCache.isCached() && !analysisCache.isAnalysisBeingRun()) {
sender.sendMessage(Phrase.CMD_ANALYZE_HEADER + "");
sender.sendMessage(TextUI.getAnalysisMessages());
sender.sendMessage(Phrase.CMD_FOOTER + "");

View File

@ -1,14 +1,14 @@
package main.java.com.djrapitops.plan.command.commands;
import com.djrapitops.javaplugin.command.CommandType;
import com.djrapitops.javaplugin.command.SubCommand;
import java.util.UUID;
import main.java.com.djrapitops.plan.Log;
import main.java.com.djrapitops.plan.Permissions;
import main.java.com.djrapitops.plan.Phrase;
import main.java.com.djrapitops.plan.Plan;
import main.java.com.djrapitops.plan.command.CommandType;
import main.java.com.djrapitops.plan.command.CommandUtils;
import main.java.com.djrapitops.plan.command.Condition;
import main.java.com.djrapitops.plan.command.SubCommand;
import main.java.com.djrapitops.plan.data.cache.InspectCacheHandler;
import main.java.com.djrapitops.plan.ui.TextUI;
import main.java.com.djrapitops.plan.utilities.MiscUtils;
@ -26,8 +26,8 @@ import org.bukkit.scheduler.BukkitTask;
*/
public class QuickInspectCommand extends SubCommand {
private Plan plugin;
private InspectCacheHandler inspectCache;
private final Plan plugin;
private final InspectCacheHandler inspectCache;
/**
* Class Constructor.
@ -35,7 +35,7 @@ public class QuickInspectCommand extends SubCommand {
* @param plugin Current instance of Plan
*/
public QuickInspectCommand(Plan plugin) {
super("qinspect", Permissions.QUICK_INSPECT, Phrase.CMD_USG_QINSPECT + "", CommandType.CONSOLE_WITH_ARGUMENTS, Phrase.ARG_PLAYER + "");
super("qinspect", CommandType.CONSOLE_WITH_ARGUMENTS, Permissions.QUICK_INSPECT.getPermission(), Phrase.CMD_USG_QINSPECT + "", Phrase.ARG_PLAYER + "");
this.plugin = plugin;
inspectCache = plugin.getInspectCache();

View File

@ -1,10 +1,10 @@
package main.java.com.djrapitops.plan.command.commands;
import com.djrapitops.javaplugin.command.CommandType;
import com.djrapitops.javaplugin.command.SubCommand;
import main.java.com.djrapitops.plan.Permissions;
import main.java.com.djrapitops.plan.Phrase;
import main.java.com.djrapitops.plan.Plan;
import main.java.com.djrapitops.plan.command.CommandType;
import main.java.com.djrapitops.plan.command.SubCommand;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
@ -16,7 +16,7 @@ import org.bukkit.command.CommandSender;
*/
public class ReloadCommand extends SubCommand {
private Plan plugin;
private final Plan plugin;
/**
* Subcommand constructor.
@ -24,7 +24,7 @@ public class ReloadCommand extends SubCommand {
* @param plugin Current instance of Plan
*/
public ReloadCommand(Plan plugin) {
super("reload", Permissions.MANAGE, Phrase.CMD_USG_RELOAD + "", CommandType.CONSOLE, "");
super("reload", CommandType.CONSOLE, Permissions.MANAGE.getPermission(), Phrase.CMD_USG_RELOAD + "");
this.plugin = plugin;
}

View File

@ -1,5 +1,7 @@
package main.java.com.djrapitops.plan.command.commands;
import com.djrapitops.javaplugin.command.CommandType;
import com.djrapitops.javaplugin.command.SubCommand;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;
@ -7,10 +9,8 @@ import java.util.UUID;
import main.java.com.djrapitops.plan.Permissions;
import main.java.com.djrapitops.plan.Phrase;
import main.java.com.djrapitops.plan.Plan;
import main.java.com.djrapitops.plan.command.CommandType;
import main.java.com.djrapitops.plan.command.CommandUtils;
import main.java.com.djrapitops.plan.command.Condition;
import main.java.com.djrapitops.plan.command.SubCommand;
import main.java.com.djrapitops.plan.data.cache.InspectCacheHandler;
import main.java.com.djrapitops.plan.utilities.HtmlUtils;
import main.java.com.djrapitops.plan.utilities.MiscUtils;
@ -39,7 +39,7 @@ public class SearchCommand extends SubCommand {
* @param plugin Current instance of Plan
*/
public SearchCommand(Plan plugin) {
super("search", Permissions.SEARCH, Phrase.CMD_USG_SEARCH + "", CommandType.CONSOLE_WITH_ARGUMENTS, Phrase.ARG_SEARCH + "");
super("search", CommandType.CONSOLE_WITH_ARGUMENTS, Permissions.SEARCH.getPermission(), Phrase.CMD_USG_SEARCH + "", Phrase.ARG_SEARCH + "");
this.plugin = plugin;
inspectCache = plugin.getInspectCache();
}
@ -81,7 +81,7 @@ public class SearchCommand extends SubCommand {
String name = match.getName();
sender.sendMessage(Phrase.CMD_MATCH + name);
// Link
String url = HtmlUtils.getInspectUrl(name);
String url = HtmlUtils.getInspectUrlWithProtocol(name);
String message = Phrase.CMD_LINK + "";
boolean console = !(sender instanceof Player);
if (console) {

View File

@ -1,11 +1,11 @@
package main.java.com.djrapitops.plan.command.commands.manage;
import com.djrapitops.javaplugin.command.CommandType;
import com.djrapitops.javaplugin.command.SubCommand;
import main.java.com.djrapitops.plan.Log;
import main.java.com.djrapitops.plan.Permissions;
import main.java.com.djrapitops.plan.Phrase;
import main.java.com.djrapitops.plan.Plan;
import main.java.com.djrapitops.plan.command.CommandType;
import main.java.com.djrapitops.plan.command.SubCommand;
import main.java.com.djrapitops.plan.database.Database;
import main.java.com.djrapitops.plan.utilities.ManageUtils;
import org.bukkit.command.Command;
@ -28,7 +28,7 @@ public class ManageBackupCommand extends SubCommand {
* @param plugin Current instance of Plan
*/
public ManageBackupCommand(Plan plugin) {
super("backup", Permissions.MANAGE, Phrase.CMD_USG_MANAGE_BACKUP + "", CommandType.CONSOLE, "<DB>");
super("backup", CommandType.CONSOLE, Permissions.MANAGE.getPermission(), Phrase.CMD_USG_MANAGE_BACKUP + "", "<DB>");
this.plugin = plugin;
}

View File

@ -0,0 +1,74 @@
package main.java.com.djrapitops.plan.command.commands.manage;
import com.djrapitops.javaplugin.command.CommandType;
import com.djrapitops.javaplugin.command.SubCommand;
import java.sql.SQLException;
import java.util.Arrays;
import main.java.com.djrapitops.plan.Log;
import main.java.com.djrapitops.plan.Permissions;
import main.java.com.djrapitops.plan.Phrase;
import main.java.com.djrapitops.plan.Plan;
import main.java.com.djrapitops.plan.database.Database;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.scheduler.BukkitRunnable;
/**
* This manage subcommand is used to clear a database of all data.
*
* @author Rsl1122
* @since 2.3.0
*/
public class ManageCleanCommand extends SubCommand {
private final Plan plugin;
/**
* Class Constructor.
*
* @param plugin Current instance of Plan
*/
public ManageCleanCommand(Plan plugin) {
super("clean", CommandType.CONSOLE_WITH_ARGUMENTS, Permissions.MANAGE.getPermission(), Phrase.CMD_USG_MANAGE_CLEAN + "", "<DB>");
this.plugin = plugin;
}
@Override
public boolean onCommand(CommandSender sender, Command cmd, String commandLabel, String[] args) {
if (args.length == 0) {
sender.sendMessage(Phrase.COMMAND_REQUIRES_ARGUMENTS_ONE + "");
return true;
}
String dbToClear = args[0].toLowerCase();
if (!dbToClear.equals("mysql") && !dbToClear.equals("sqlite")) {
sender.sendMessage(Phrase.MANAGE_ERROR_INCORRECT_DB + dbToClear);
return true;
}
Database clearDB = null;
for (Database database : plugin.getDatabases()) {
if (dbToClear.equalsIgnoreCase(database.getConfigName())) {
clearDB = database;
clearDB.init();
}
}
if (clearDB == null) {
sender.sendMessage(Phrase.MANAGE_DATABASE_FAILURE + "");
Log.error(dbToClear + " was null!");
return true;
}
final Database clearThisDB = clearDB;
(new BukkitRunnable() {
@Override
public void run() {
sender.sendMessage(Phrase.MANAGE_PROCESS_START.parse());
clearThisDB.clean();
sender.sendMessage(Phrase.MANAGE_SUCCESS + "");
this.cancel();
}
}).runTaskAsynchronously(plugin);
return true;
}
}

View File

@ -1,13 +1,13 @@
package main.java.com.djrapitops.plan.command.commands.manage;
import com.djrapitops.javaplugin.command.CommandType;
import com.djrapitops.javaplugin.command.SubCommand;
import java.sql.SQLException;
import java.util.Arrays;
import main.java.com.djrapitops.plan.Log;
import main.java.com.djrapitops.plan.Permissions;
import main.java.com.djrapitops.plan.Phrase;
import main.java.com.djrapitops.plan.Plan;
import main.java.com.djrapitops.plan.command.CommandType;
import main.java.com.djrapitops.plan.command.SubCommand;
import main.java.com.djrapitops.plan.database.Database;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
@ -29,7 +29,7 @@ public class ManageClearCommand extends SubCommand {
* @param plugin Current instance of Plan
*/
public ManageClearCommand(Plan plugin) {
super("clear", Permissions.MANAGE, Phrase.CMD_USG_MANAGE_CLEAR + "", CommandType.CONSOLE_WITH_ARGUMENTS, "<DB> [-a]");
super("clear", CommandType.CONSOLE_WITH_ARGUMENTS, Permissions.MANAGE.getPermission(), Phrase.CMD_USG_MANAGE_CLEAR + "", "<DB> [-a]");
this.plugin = plugin;
}

View File

@ -1,69 +0,0 @@
package main.java.com.djrapitops.plan.command.commands.manage;
import main.java.com.djrapitops.plan.Permissions;
import main.java.com.djrapitops.plan.Phrase;
import main.java.com.djrapitops.plan.Plan;
import main.java.com.djrapitops.plan.command.CommandType;
import main.java.com.djrapitops.plan.command.SubCommand;
import main.java.com.djrapitops.plan.command.commands.ManageCommand;
import org.bukkit.ChatColor;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player;
/**
* This manage subcommand is used to view all other manage subcommands.
*
* @author Rsl1122
* @since 2.3.0
*/
public class ManageHelpCommand extends SubCommand {
private final Plan plugin;
private final ManageCommand command;
/**
* Subcommand Constructor.
*
* @param plugin Current instance of Plan
* @param command Current instance of PlanCommand
*/
public ManageHelpCommand(Plan plugin, ManageCommand command) {
super("help,?", Permissions.MANAGE, Phrase.CMD_USG_MANAGE_HELP + "", CommandType.CONSOLE, "");
this.plugin = plugin;
this.command = command;
}
@Override
public boolean onCommand(CommandSender sender, Command c, String commandLabel, String[] args) {
ChatColor oColor = Phrase.COLOR_MAIN.color();
ChatColor tColor = Phrase.COLOR_SEC.color();
ChatColor hColor = Phrase.COLOR_TER.color();
// Header
sender.sendMessage(Phrase.CMD_MANAGE_HELP_HEADER + "");
// Help results
for (SubCommand cmd : this.command.getCommands()) {
if (cmd.getName().equalsIgnoreCase(getName())) {
continue;
}
if (!cmd.getPermission().userHasThisPermission(sender)) {
continue;
}
if (!(sender instanceof Player) && cmd.getCommandType() == CommandType.PLAYER) {
continue;
}
sender.sendMessage(tColor + " " + Phrase.BALL.toString() + oColor
+ " /plan manage " + cmd.getFirstName() + " " + cmd.getArguments() + tColor + " - " + cmd.getUsage());
}
// Footer
sender.sendMessage(hColor + Phrase.ARROWS_RIGHT.toString());
return true;
}
}

View File

@ -1,12 +1,12 @@
package main.java.com.djrapitops.plan.command.commands.manage;
import com.djrapitops.javaplugin.command.CommandType;
import com.djrapitops.javaplugin.command.SubCommand;
import java.sql.SQLException;
import main.java.com.djrapitops.plan.Log;
import main.java.com.djrapitops.plan.Permissions;
import main.java.com.djrapitops.plan.Phrase;
import main.java.com.djrapitops.plan.Plan;
import main.java.com.djrapitops.plan.command.CommandType;
import main.java.com.djrapitops.plan.command.SubCommand;
import main.java.com.djrapitops.plan.database.Database;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
@ -20,7 +20,7 @@ import org.bukkit.command.CommandSender;
*/
public class ManageHotswapCommand extends SubCommand {
private Plan plugin;
private final Plan plugin;
/**
* Class Constructor.
@ -28,7 +28,7 @@ public class ManageHotswapCommand extends SubCommand {
* @param plugin Current instance of Plan
*/
public ManageHotswapCommand(Plan plugin) {
super("hotswap", Permissions.MANAGE, Phrase.CMD_USG_MANAGE_HOTSWAP + "", CommandType.CONSOLE_WITH_ARGUMENTS, "<DB>");
super("hotswap", CommandType.CONSOLE_WITH_ARGUMENTS, Permissions.MANAGE.getPermission(), Phrase.CMD_USG_MANAGE_HOTSWAP + "", "<DB>");
this.plugin = plugin;
}

View File

@ -1,5 +1,7 @@
package main.java.com.djrapitops.plan.command.commands.manage;
import com.djrapitops.javaplugin.command.CommandType;
import com.djrapitops.javaplugin.command.SubCommand;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
@ -8,8 +10,6 @@ import java.util.stream.Collectors;
import main.java.com.djrapitops.plan.Permissions;
import main.java.com.djrapitops.plan.Phrase;
import main.java.com.djrapitops.plan.Plan;
import main.java.com.djrapitops.plan.command.CommandType;
import main.java.com.djrapitops.plan.command.SubCommand;
import main.java.com.djrapitops.plan.data.handling.importing.ImportUtils;
import main.java.com.djrapitops.plan.data.handling.importing.Importer;
import static org.bukkit.Bukkit.getOfflinePlayers;
@ -36,7 +36,7 @@ public class ManageImportCommand extends SubCommand {
* @param plugin Current instance of Plan
*/
public ManageImportCommand(Plan plugin) {
super("import", Permissions.MANAGE, Phrase.CMD_USG_MANAGE_IMPORT + "", CommandType.CONSOLE, Phrase.ARG_IMPORT + "");
super("import", CommandType.CONSOLE, Permissions.MANAGE.getPermission(), Phrase.CMD_USG_MANAGE_IMPORT + "", Phrase.ARG_IMPORT + "");
this.plugin = plugin;
}

View File

@ -1,5 +1,7 @@
package main.java.com.djrapitops.plan.command.commands.manage;
import com.djrapitops.javaplugin.command.CommandType;
import com.djrapitops.javaplugin.command.SubCommand;
import java.util.Arrays;
import java.util.Collection;
import java.util.UUID;
@ -7,8 +9,6 @@ import main.java.com.djrapitops.plan.Log;
import main.java.com.djrapitops.plan.Permissions;
import main.java.com.djrapitops.plan.Phrase;
import main.java.com.djrapitops.plan.Plan;
import main.java.com.djrapitops.plan.command.CommandType;
import main.java.com.djrapitops.plan.command.SubCommand;
import main.java.com.djrapitops.plan.database.Database;
import main.java.com.djrapitops.plan.utilities.ManageUtils;
import org.bukkit.command.Command;
@ -17,9 +17,9 @@ import org.bukkit.scheduler.BukkitRunnable;
/**
* This manage subcommand is used to move all data from one database to another.
*
*
* Destination database will be cleared.
*
*
* @author Rsl1122
* @since 2.3.0
*/
@ -33,11 +33,11 @@ public class ManageMoveCommand extends SubCommand {
* @param plugin Current instance of Plan
*/
public ManageMoveCommand(Plan plugin) {
super("move", Permissions.MANAGE, Phrase.CMD_USG_MANAGE_MOVE + "", CommandType.CONSOLE_WITH_ARGUMENTS, Phrase.ARG_MOVE + "");
super("move", CommandType.CONSOLE_WITH_ARGUMENTS, Permissions.MANAGE.getPermission(), Phrase.CMD_USG_MANAGE_MOVE + "", Phrase.ARG_MOVE + "");
this.plugin = plugin;
}
@Override
public boolean onCommand(CommandSender sender, Command cmd, String commandLabel, String[] args) {
if (args.length < 2) {

View File

@ -1,5 +1,7 @@
package main.java.com.djrapitops.plan.command.commands.manage;
import com.djrapitops.javaplugin.command.CommandType;
import com.djrapitops.javaplugin.command.SubCommand;
import java.sql.SQLException;
import java.util.Arrays;
import java.util.UUID;
@ -7,8 +9,6 @@ import main.java.com.djrapitops.plan.Log;
import main.java.com.djrapitops.plan.Permissions;
import main.java.com.djrapitops.plan.Phrase;
import main.java.com.djrapitops.plan.Plan;
import main.java.com.djrapitops.plan.command.CommandType;
import main.java.com.djrapitops.plan.command.SubCommand;
import main.java.com.djrapitops.plan.utilities.MiscUtils;
import main.java.com.djrapitops.plan.utilities.uuid.UUIDUtility;
import org.bukkit.command.Command;
@ -31,7 +31,7 @@ public class ManageRemoveCommand extends SubCommand {
* @param plugin Current instance of Plan
*/
public ManageRemoveCommand(Plan plugin) {
super("remove", Permissions.MANAGE, Phrase.CMD_USG_MANAGE_REMOVE + "", CommandType.CONSOLE_WITH_ARGUMENTS, Phrase.ARG_PLAYER + " [-a]");
super("remove", CommandType.CONSOLE_WITH_ARGUMENTS, Permissions.MANAGE.getPermission(), Phrase.CMD_USG_MANAGE_REMOVE + "", Phrase.ARG_PLAYER + " [-a]");
this.plugin = plugin;
}

View File

@ -1,5 +1,7 @@
package main.java.com.djrapitops.plan.command.commands.manage;
import com.djrapitops.javaplugin.command.CommandType;
import com.djrapitops.javaplugin.command.SubCommand;
import java.io.File;
import java.util.Arrays;
import java.util.Collection;
@ -8,8 +10,6 @@ import main.java.com.djrapitops.plan.Log;
import main.java.com.djrapitops.plan.Permissions;
import main.java.com.djrapitops.plan.Phrase;
import main.java.com.djrapitops.plan.Plan;
import main.java.com.djrapitops.plan.command.CommandType;
import main.java.com.djrapitops.plan.command.SubCommand;
import main.java.com.djrapitops.plan.database.Database;
import main.java.com.djrapitops.plan.database.databases.SQLiteDB;
import main.java.com.djrapitops.plan.utilities.ManageUtils;
@ -34,7 +34,7 @@ public class ManageRestoreCommand extends SubCommand {
* @param plugin Current instance of Plan
*/
public ManageRestoreCommand(Plan plugin) {
super("restore", Permissions.MANAGE, Phrase.CMD_USG_MANAGE_RESTORE + "", CommandType.CONSOLE, Phrase.ARG_RESTORE + "");
super("restore", CommandType.CONSOLE, Permissions.MANAGE.getPermission(), Phrase.CMD_USG_MANAGE_RESTORE + "", Phrase.ARG_RESTORE + "");
this.plugin = plugin;
}

View File

@ -1,10 +1,10 @@
package main.java.com.djrapitops.plan.command.commands.manage;
import com.djrapitops.javaplugin.command.CommandType;
import com.djrapitops.javaplugin.command.SubCommand;
import main.java.com.djrapitops.plan.Permissions;
import main.java.com.djrapitops.plan.Phrase;
import main.java.com.djrapitops.plan.Plan;
import main.java.com.djrapitops.plan.command.CommandType;
import main.java.com.djrapitops.plan.command.SubCommand;
import org.bukkit.command.Command;
import org.bukkit.command.CommandSender;
@ -23,7 +23,7 @@ public class ManageStatusCommand extends SubCommand {
* @param plugin Current instance of Plan
*/
public ManageStatusCommand(Plan plugin) {
super("status", Permissions.MANAGE, Phrase.CMD_USG_MANAGE_STATUS + "", CommandType.CONSOLE, "");
super("status", CommandType.CONSOLE, Permissions.MANAGE.getPermission(), Phrase.CMD_USG_MANAGE_STATUS + "");
this.plugin = plugin;
}

View File

@ -1,9 +1,5 @@
package main.java.com.djrapitops.plan.data.additional;
import main.java.com.djrapitops.plan.data.additional.advancedachievements.AdvancedAchievementsTable;
import main.java.com.djrapitops.plan.data.additional.factions.FactionsTable;
import main.java.com.djrapitops.plan.data.additional.towny.TownyTable;
/**
* This class contains Enum values for different types of Analysis that can be
* performed on values of PluginData.
@ -102,10 +98,6 @@ public enum AnalysisType {
*
* Can be used to add Tables, Images (for example maps) and other html
* elements.
*
* @see AdvancedAchievementsTable
* @see FactionsTable
* @see TownyTable
*/
HTML;

View File

@ -1,7 +1,6 @@
package main.java.com.djrapitops.plan.data.additional;
import main.java.com.djrapitops.plan.data.additional.essentials.EssentialsHook;
import main.java.com.djrapitops.plan.data.additional.advancedachievements.AdvancedAchievementsHook;
import com.djrapitops.pluginbridge.plan.Bridge;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
@ -10,13 +9,6 @@ import java.util.Map;
import java.util.UUID;
import java.util.stream.Collectors;
import main.java.com.djrapitops.plan.Log;
import main.java.com.djrapitops.plan.Settings;
import main.java.com.djrapitops.plan.data.additional.factions.FactionsHook;
import main.java.com.djrapitops.plan.data.additional.jobs.JobsHook;
import main.java.com.djrapitops.plan.data.additional.mcmmo.McmmoHook;
import main.java.com.djrapitops.plan.data.additional.ontime.OnTimeHook;
import main.java.com.djrapitops.plan.data.additional.towny.TownyHook;
import main.java.com.djrapitops.plan.data.additional.vault.VaultHook;
import main.java.com.djrapitops.plan.utilities.HtmlUtils;
/**
@ -35,7 +27,12 @@ public class HookHandler {
*/
public HookHandler() {
additionalDataSources = new ArrayList<>();
hook();
try {
Bridge.hook(this);
} catch (Throwable e) {
Log.toLog(this.getClass().getName(), e);
Log.error("Plan Plugin Bridge not included in the plugin jar.");
}
}
/**
@ -62,57 +59,6 @@ public class HookHandler {
return additionalDataSources;
}
private void hook() {
try {
if (Settings.ENABLED_AA.isTrue()) {
AdvancedAchievementsHook advancedAchievementsHook = new AdvancedAchievementsHook(this);
}
} catch (NoClassDefFoundError e) {
}
try {
if (Settings.ENABLED_ESS.isTrue()) {
EssentialsHook essentialsHook = new EssentialsHook(this);
}
} catch (NoClassDefFoundError e) {
}
try {
if (Settings.ENABLED_FAC.isTrue()) {
FactionsHook factionsHook = new FactionsHook(this);
}
} catch (NoClassDefFoundError e) {
}
try {
if (Settings.ENABLED_MCM.isTrue()) {
McmmoHook mcMmoHook = new McmmoHook(this);
}
} catch (NoClassDefFoundError e) {
}
try {
if (Settings.ENABLED_JOB.isTrue()) {
JobsHook jobsHook = new JobsHook(this);
}
} catch (NoClassDefFoundError e) {
}
try {
if (Settings.ENABLED_ONT.isTrue()) {
OnTimeHook onTimeHook = new OnTimeHook(this);
}
} catch (NoClassDefFoundError e) {
}
try {
if (Settings.ENABLED_TOW.isTrue()) {
TownyHook townyHook = new TownyHook(this);
}
} catch (NoClassDefFoundError e) {
}
try {
if (Settings.ENABLED_VAU.isTrue()) {
VaultHook vaultHook = new VaultHook(this);
}
} catch (NoClassDefFoundError e) {
}
}
/**
* Used to get the Layout with PluginData placeholders to replace %plugins%
* placeholder on analysis.hmtl.

View File

@ -15,7 +15,7 @@ public class AnalysisCacheHandler {
private final Plan plugin;
private AnalysisData cache;
private Analysis analysis;
private final Analysis analysis;
/**
* Class Constructor.
@ -33,7 +33,6 @@ public class AnalysisCacheHandler {
* Runs analysis, cache method is called after analysis is complete.
*/
public void updateCache() {
cache = null;
analysis.runAnalysis(this);
}
@ -63,4 +62,8 @@ public class AnalysisCacheHandler {
public boolean isCached() {
return (cache != null);
}
public boolean isAnalysisBeingRun() {
return analysis.isAnalysisBeingRun();
}
}

View File

@ -4,6 +4,7 @@ import java.util.Collection;
import java.util.UUID;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
import java.util.stream.Collectors;
import main.java.com.djrapitops.plan.Log;
import main.java.com.djrapitops.plan.Phrase;
import main.java.com.djrapitops.plan.Settings;
@ -47,6 +48,7 @@ public class DataCacheClearQueue extends Queue<UUID>{
if (uuids.isEmpty()) {
return;
}
uuids = uuids.stream().filter(u -> u != null).collect(Collectors.toList());
Log.debug("Scheduling for clear: " + uuids);
try {
queue.addAll(uuids);

View File

@ -8,7 +8,7 @@ package main.java.com.djrapitops.plan.data.cache.queue;
*/
public abstract class Setup<T> {
private Consumer<T>[] consumers;
private final Consumer<T>[] consumers;
/**
* Constructor, defines consumers.

View File

@ -1,7 +1,10 @@
package main.java.com.djrapitops.plan.data.handling.importing;
import com.djrapitops.pluginbridge.plan.Bridge;
import com.djrapitops.pluginbridge.plan.importing.OnTimeImporter;
import java.util.HashMap;
import java.util.Map;
import main.java.com.djrapitops.plan.Log;
import static org.bukkit.Bukkit.getPluginManager;
/**
@ -29,7 +32,13 @@ public class ImportUtils {
*/
public static Map<String, Importer> getImporters() {
Map<String, Importer> importers = new HashMap<>();
importers.put("ontime", new OnTimeImporter());
try {
importers.put("ontime", new OnTimeImporter());
} catch (Throwable e) {
Log.toLog("ImportUtils.getImporters", e);
Log.error("Plan Plugin Bridge not included in the plugin jar.");
}
return importers;
}
}

View File

@ -43,6 +43,6 @@ public class PlanCommandPreprocessListener implements Listener {
Log.debug("Ignored command, player had ignore permission.");
return;
}
handler.handleCommand(event.getMessage().split(" ")[0]);
handler.handleCommand(event.getMessage().split(" ")[0].toLowerCase());
}
}

View File

@ -0,0 +1,30 @@
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package main.java.com.djrapitops.plan.database;
/**
*
* @author Rsl1122
* @since 3.4.3
* @param <T>
*/
public class Container<T> {
private T object;
private int id;
public Container(T object, int id) {
this.object = object;
this.id = id;
}
public T getObject() {
return object;
}
public int getId() {
return id;
}
}

View File

@ -0,0 +1,41 @@
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package main.java.com.djrapitops.plan.database;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
/**
*
* @author Rsl1122
* @since 3.4.3
*/
public class DBUtils {
public static <T> List<List<Container<T>>> splitIntoBatches(Map<Integer, List<T>> objects) {
int batchSize = 2048;
List<List<Container<T>>> wrappedBatches = new ArrayList<>();
int i = 0;
int j = 0;
for (Entry<Integer, List<T>> entry : objects.entrySet()) {
for (T object : entry.getValue()) {
if (wrappedBatches.size() - 1 <= j) {
wrappedBatches.add(new ArrayList<>());
}
wrappedBatches.get(j).add(new Container<>(object, entry.getKey()));
i++;
if (i % batchSize == 0) {
j++;
}
}
}
return wrappedBatches;
}
}

View File

@ -7,6 +7,7 @@ import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
@ -21,6 +22,8 @@ import main.java.com.djrapitops.plan.database.Database;
import main.java.com.djrapitops.plan.database.tables.*;
import main.java.com.djrapitops.plan.utilities.Benchmark;
import main.java.com.djrapitops.plan.utilities.FormatUtils;
import main.java.com.djrapitops.plan.utilities.ManageUtils;
import main.java.com.djrapitops.plan.utilities.analysis.MathUtils;
import org.bukkit.GameMode;
import org.bukkit.Location;
import org.bukkit.scheduler.BukkitRunnable;
@ -465,8 +468,12 @@ public abstract class SQLDB extends Database {
*/
@Override
public void clean() {
Log.info("Cleaning the database.");
try {
checkConnection();
commandUseTable.clean();
sessionsTable.clean();
Log.info("Clean complete.");
} catch (SQLException e) {
Log.toLog(this.getClass().getName(), e);
}

View File

@ -6,6 +6,7 @@ import java.sql.SQLException;
import java.util.HashMap;
import java.util.Map;
import main.java.com.djrapitops.plan.Log;
import main.java.com.djrapitops.plan.Plan;
import main.java.com.djrapitops.plan.database.databases.SQLDB;
import main.java.com.djrapitops.plan.utilities.Benchmark;
@ -61,7 +62,13 @@ public class CommandUseTable extends Table {
statement = prepareStatement("SELECT * FROM " + tableName);
set = statement.executeQuery();
while (set.next()) {
commandUse.put(set.getString(columnCommand), set.getInt(columnTimesUsed));
String cmd = set.getString(columnCommand);
int amountUsed = set.getInt(columnTimesUsed);
Integer get = commandUse.get(cmd);
if (get != null && get > amountUsed) {
continue;
}
commandUse.put(cmd, amountUsed);
}
return commandUse;
} finally {
@ -150,4 +157,11 @@ public class CommandUseTable extends Table {
close(statement);
}
}
public void clean() throws SQLException {
Map<String, Integer> commandUse = getCommandUse();
removeAllData();
saveCommandUse(commandUse);
Plan.getInstance().getHandler().getCommandUseFromDb();
}
}

View File

@ -6,12 +6,17 @@ import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import main.java.com.djrapitops.plan.Log;
import main.java.com.djrapitops.plan.data.SessionData;
import main.java.com.djrapitops.plan.database.Container;
import main.java.com.djrapitops.plan.database.databases.SQLDB;
import main.java.com.djrapitops.plan.utilities.Benchmark;
import main.java.com.djrapitops.plan.utilities.ManageUtils;
import main.java.com.djrapitops.plan.utilities.analysis.MathUtils;
/**
*
@ -200,6 +205,25 @@ public class SessionsTable extends Table {
}
Benchmark.start("Save Sessions multiple " + sessions.size());
Map<Integer, List<SessionData>> saved = getSessionData(sessions.keySet());
for (Integer id : sessions.keySet()) {
List<SessionData> sessionList = sessions.get(id);
List<SessionData> s = saved.get(id);
if (s != null) {
sessionList.removeAll(s);
}
if (sessionList.isEmpty()) {
continue;
}
saved.put(id, sessionList);
}
List<List<Container<SessionData>>> batches = splitIntoBatches(sessions);
for (List<Container<SessionData>> batch : batches) {
saveSessionBatch(batch);
}
Benchmark.stop("Save Sessions multiple " + sessions.size());
}
private void saveSessionBatch(List<Container<SessionData>> batch) throws SQLException {
PreparedStatement statement = null;
try {
statement = prepareStatement("INSERT INTO " + tableName + " ("
@ -210,36 +234,69 @@ public class SessionsTable extends Table {
boolean commitRequired = false;
int i = 0;
for (Integer id : sessions.keySet()) {
List<SessionData> sessionList = sessions.get(id);
List<SessionData> s = saved.get(id);
if (s != null) {
sessionList.removeAll(s);
}
if (sessionList.isEmpty()) {
for (Container<SessionData> data : batch) {
SessionData session = data.getObject();
int id = data.getId();
if (!session.isValid()) {
continue;
}
for (SessionData session : sessionList) {
long end = session.getSessionEnd();
long start = session.getSessionStart();
if (end < start) {
continue;
}
statement.setInt(1, id);
statement.setLong(2, start);
statement.setLong(3, end);
statement.addBatch();
commitRequired = true;
i++;
}
statement.setInt(1, id);
statement.setLong(2, session.getSessionStart());
statement.setLong(3, session.getSessionEnd());
statement.addBatch();
commitRequired = true;
i++;
}
if (commitRequired) {
Log.debug("Executing session batch: "+i);
statement.executeBatch();
Log.debug("Executing session batch: " + i);
statement.executeBatch();
}
Benchmark.stop("Save Sessions multiple " + sessions.size());
} finally {
close(statement);
}
}
public void clean() throws SQLException {
Map<Integer, Integer> loginTimes = db.getUsersTable().getLoginTimes();
Map<Integer, List<SessionData>> allSessions = getSessionData(loginTimes.keySet());
Benchmark.start("Combine Sessions");
int before = MathUtils.sumInt(allSessions.values().stream().map(l -> l.size()));
Log.debug("Sessions before: " + before);
Map<Integer, Integer> beforeM = new HashMap<>();
Map<Integer, Integer> afterM = new HashMap<>();
for (Integer id : allSessions.keySet()) {
List<SessionData> sessions = allSessions.get(id);
beforeM.put(id, sessions.size());
if (sessions.isEmpty()) {
afterM.put(id, 0);
continue;
}
Integer times = loginTimes.get(id);
if (sessions.size() == times) {
afterM.put(id, times);
continue;
}
List<SessionData> combined = ManageUtils.combineSessions(sessions, times);
afterM.put(id, combined.size());
allSessions.put(id, combined);
}
int after = MathUtils.sumInt(allSessions.values().stream().map(l -> l.size()));
Log.debug("Sessions after: " + after);
if (before - after > 50) {
Benchmark.start("Save combined sessions");
Iterator<Integer> iterator = new HashSet<>(allSessions.keySet()).iterator();
while (iterator.hasNext()) {
int id = iterator.next();
if (afterM.get(id) < beforeM.get(id)) {
removeUserSessions(id);
} else {
allSessions.remove(id);
}
}
saveSessionData(allSessions);
Benchmark.stop("Save combined sessions");
}
Benchmark.stop("Combine Sessions");
Log.info("Combined " + (before - after) + " sessions.");
}
}

View File

@ -3,7 +3,11 @@ package main.java.com.djrapitops.plan.database.tables;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.List;
import java.util.Map;
import main.java.com.djrapitops.plan.Log;
import main.java.com.djrapitops.plan.database.Container;
import main.java.com.djrapitops.plan.database.DBUtils;
import main.java.com.djrapitops.plan.database.databases.SQLDB;
/**
@ -123,4 +127,8 @@ public abstract class Table {
return false;
}
}
protected <T> List<List<Container<T>>> splitIntoBatches(Map<Integer, List<T>> objects) {
return DBUtils.splitIntoBatches(objects);
}
}

View File

@ -330,7 +330,7 @@ public class UsersTable extends Table {
List<UUID> containsBukkitData = getContainsBukkitData(uuids);
List<UserData> datas = new ArrayList<>();
datas.addAll(getUserDataForKnown(containsBukkitData));
uuids.removeAll(containsBukkitData);
if (!uuids.isEmpty()) {
List<UserData> noBukkitData = new ArrayList<>();
@ -343,7 +343,7 @@ public class UsersTable extends Table {
addUserInformationToUserData(noBukkitData);
datas.addAll(noBukkitData);
}
Benchmark.stop("Get UserData Multiple " + uuids.size());
return datas;
}
@ -751,7 +751,9 @@ public class UsersTable extends Table {
continue;
}
if (!savedUUIDs.contains(uuid)) {
saveLast.add(uData);
if (!saveLast.contains(uData)) {
saveLast.add(uData);
}
continue;
}
uData.access();
@ -846,6 +848,26 @@ public class UsersTable extends Table {
}
}
public Map<Integer, Integer> getLoginTimes() throws SQLException {
Benchmark.start("Get Logintimes");
PreparedStatement statement = null;
ResultSet set = null;
try {
Map<Integer, Integer> ids = new HashMap<>();
statement = prepareStatement("SELECT " + columnID + ", " + columnLoginTimes + " FROM " + tableName);
set = statement.executeQuery();
while (set.next()) {
Integer id = set.getInt(columnID);
ids.put(id, set.getInt(columnLoginTimes));
}
return ids;
} finally {
close(set);
close(statement);
Benchmark.stop("Get Logintimes");
}
}
/**
*
* @return
@ -872,4 +894,9 @@ public class UsersTable extends Table {
close(statement);
}
}
public Map<Integer, Long> getLoginTimes(Collection<UUID> uuids) {
//TODO
return new HashMap<>();
}
}

View File

@ -71,7 +71,7 @@ public class PlayerActivityGraphCreator {
if (Settings.ANALYSIS_REMOVE_OUTLIERS.isTrue()) {
long average = MathUtils.averageLong(playersOnline.stream());
double standardDiviation = getStandardDiviation(playersOnline, average);
if (standardDiviation > 3) {
if (standardDiviation > 3.5) {
for (int i = 0; i < playersOnline.size(); i++) {
long value = playersOnline.get(i);
if (value - average > 3 * standardDiviation) {

View File

@ -67,7 +67,7 @@ public class PunchCardGraphCreator {
int avg = findAverage(dataArray);
double standardDiviation = getStandardDiviation(dataArray, avg);
Log.debug("Diviation: " + standardDiviation);
if (standardDiviation > 3) {
if (standardDiviation > 3.5) {
for (int i = 0; i < 7; i++) {
for (int j = 0; j < 24; j++) {
int value = dataArray[i][j];

View File

@ -49,13 +49,15 @@ public class Response {
Log.debug("Request: " + requestUri);
String[] requestArgs = requestUri.split("/");
boolean forbidden = false;
String securityCode = "";
String givenCode = "";
String securityCode = Settings.SECURITY_CODE + "";
if (requestArgs.length <= 2) {
forbidden = true;
} else {
securityCode = requestArgs[1];
givenCode = requestArgs[1];
}
if (!securityCode.equals(Settings.SECURITY_CODE + "")) {
if (!givenCode.equals(securityCode)) {
forbidden = true;
}
if (forbidden) {

View File

@ -1,23 +1,20 @@
package main.java.com.djrapitops.plan.utilities;
import java.util.HashMap;
import java.util.Map;
import com.djrapitops.javaplugin.utilities.BenchmarkUtil;
import main.java.com.djrapitops.plan.Log;
/**
*
* @author Risto
* @author Rsl1122
*/
public class Benchmark {
private static Map<String, Long> starts = new HashMap<>();
/**
*
* @param source
*/
public static void start(String source) {
starts.put(source, System.nanoTime());
BenchmarkUtil.start(source);
Log.debug(source);
}
@ -27,13 +24,10 @@ public class Benchmark {
* @return
*/
public static long stop(String source) {
Long s = starts.get(source);
if (s != null) {
long ms = (System.nanoTime() - s) / 1000000;
long ms = BenchmarkUtil.stop(source);
if (ms != -1) {
Log.debug(source + " took " + ms+" ms");
starts.remove(source);
return ms;
}
return -1;
return ms;
}
}

View File

@ -1,7 +1,7 @@
package main.java.com.djrapitops.plan.utilities;
import com.djrapitops.javaplugin.utilities.FormattingUtils;
import java.text.DecimalFormat;
import java.util.Date;
import main.java.com.djrapitops.plan.Settings;
import org.bukkit.Location;
@ -36,30 +36,15 @@ public class FormatUtils {
* @return
*/
public static String formatTimeStamp(long epochMs) {
Date date = new Date(epochMs);
String timeStamp = date.toString();
// "EEE MMM dd HH:mm:ss zzz yyyy"
// "0123456789012345678901234567"
String day = timeStamp.substring(4, 10);
String clock = timeStamp.substring(11, 16);
return day + ", " + clock;
return FormattingUtils.formatTimeStamp(epochMs);
}
public static String formatTimeStampSecond(long epochMs) {
Date date = new Date(epochMs);
String timeStamp = date.toString();
String day = timeStamp.substring(4, 10);
String clock = timeStamp.substring(11, 19);
return day + ", " + clock;
return FormattingUtils.formatTimeStampSecond(epochMs);
}
public static String formatTimeStampYear(long epochMs) {
Date date = new Date(epochMs);
String timeStamp = date.toString();
String year = timeStamp.substring(24);
String day = timeStamp.substring(4, 10);
String clock = timeStamp.substring(11, 16);
return day + " " + year + ", " + clock;
return FormattingUtils.formatTimeStampYear(epochMs);
}
/**
@ -69,7 +54,7 @@ public class FormatUtils {
* @return
*/
public static String removeLetters(String dataPoint) {
return dataPoint.replaceAll("[^\\d.]", "");
return FormattingUtils.removeLetters(dataPoint);
}
/**
@ -78,11 +63,7 @@ public class FormatUtils {
* @return
*/
public static String removeNumbers(String dataPoint) {
for (char c : removeLetters(dataPoint).toCharArray()) {
dataPoint = dataPoint.replace(c + "", "");
}
dataPoint = dataPoint.replace(" ", "");
return dataPoint;
return FormattingUtils.removeNumbers(dataPoint);
}
// Formats long in milliseconds into d:h:m:s string
@ -106,18 +87,34 @@ public class FormatUtils {
}
}
if (days != 0) {
builder.append(Settings.FORMAT_DAYS.toString().replace("%days%", "" + days));
if (days == 1) {
builder.append(Settings.FORMAT_DAY.toString());
} else {
builder.append(Settings.FORMAT_DAYS.toString().replace("%days%", "" + days));
}
}
if (hours != 0) {
builder.append(Settings.FORMAT_HOURS.toString().replace("%hours%", "" + hours));
String h = Settings.FORMAT_HOURS.toString().replace("%hours%", "" + hours);
if (h.contains("%zero%") && (hours + "").length() == 1) {
builder.append('0');
}
builder.append(h);
}
if (minutes != 0) {
builder.append(Settings.FORMAT_MINUTES.toString().replace("%minutes%", "" + minutes));
String m = Settings.FORMAT_MINUTES.toString().replace("%minutes%", "" + minutes);
if (m.contains("%zero%") && (minutes + "").length() == 1) {
builder.append('0');
}
builder.append(m);
}
if (seconds != 0) {
builder.append(Settings.FORMAT_SECONDS.toString().replace("%seconds%", "" + seconds));
String s = Settings.FORMAT_SECONDS.toString().replace("%seconds%", "" + seconds);
if (s.contains("%zero%") && (seconds + "").length() == 1) {
builder.append('0');
}
builder.append(s);
}
String formattedTime = builder.toString();
String formattedTime = builder.toString().replace("%zero%", "");
if (formattedTime.isEmpty()) {
return Settings.FORMAT_SECONDS.toString().replace("%seconds%", "0");
}
@ -132,15 +129,7 @@ public class FormatUtils {
* @throws NumberFormatException When wrong format
*/
public static int parseVersionNumber(String versionString) throws NumberFormatException {
String[] versionArray = versionString.split("\\.");
if (versionArray.length != 3) {
throw new NumberFormatException("Wrong format used");
}
int main = Integer.parseInt(versionArray[0]) * 10000;
int major = Integer.parseInt(versionArray[1]) * 100;
int minor = Integer.parseInt(versionArray[2]);
int versionNumber = main + major + minor;
return versionNumber;
return FormattingUtils.parseVersionNumber(versionString);
}
/**
@ -150,18 +139,7 @@ public class FormatUtils {
* @return One array with contents of the multiple
*/
public static String[] mergeArrays(String[]... arrays) {
int arraySize = 0;
for (String[] array : arrays) {
arraySize += array.length;
}
String[] result = new String[arraySize];
int j = 0;
for (String[] array : arrays) {
for (String string : array) {
result[j++] = string;
}
}
return result;
return FormattingUtils.mergeArrays(arrays);
}
/**
@ -171,7 +149,7 @@ public class FormatUtils {
* @return Readable location format.
*/
public static String formatLocation(Location loc) {
return "x " + loc.getBlockX() + " z " + loc.getBlockZ() + " in " + loc.getWorld();
return FormattingUtils.formatLocation(loc);
}
/**

View File

@ -49,22 +49,30 @@ public class HtmlUtils {
return html;
}
public static String getServerAnalysisUrlWithProtocol() {
return Settings.LINK_PROTOCOL.toString()+":"+getServerAnalysisUrl();
}
/**
*
* @return
*/
public static String getServerAnalysisUrl() {
int port = Settings.WEBSERVER_PORT.getNumber();
String ip = Plan.getInstance().getServer().getIp() + ":" + port;
String ip = Plan.getInstance().getVariable().getIp() + ":" + port;
String securityCode = Settings.SECURITY_CODE.toString();
boolean useAlternativeIP = Settings.SHOW_ALTERNATIVE_IP.isTrue();
if (useAlternativeIP) {
ip = Settings.ALTERNATIVE_IP.toString().replaceAll("%port%", "" + port);
}
String url = "http://" + ip + "/" + securityCode + "/server";
String url = /*"http:*/"//" + ip + "/" + securityCode + "/server";
return url;
}
public static String getInspectUrlWithProtocol(String playerName) {
return Settings.LINK_PROTOCOL.toString()+":"+getInspectUrl(playerName);
}
/**
*
* @param playerName
@ -72,13 +80,13 @@ public class HtmlUtils {
*/
public static String getInspectUrl(String playerName) {
int port = Settings.WEBSERVER_PORT.getNumber();
String ip = Plan.getInstance().getServer().getIp() + ":" + port;
String ip = Plan.getInstance().getVariable().getIp() + ":" + port;
String securityCode = Settings.SECURITY_CODE.toString();
boolean useAlternativeIP = Settings.SHOW_ALTERNATIVE_IP.isTrue();
if (useAlternativeIP) {
ip = Settings.ALTERNATIVE_IP.toString().replaceAll("%port%", "" + port);
}
String url = "http://" + ip + "/" + securityCode + "/player/" + playerName;
String url = /*"http:*/"//" + ip + "/" + securityCode + "/player/" + playerName;
return url;
}

View File

@ -1,17 +1,22 @@
package main.java.com.djrapitops.plan.utilities;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.HashSet;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import java.util.UUID;
import java.util.stream.Collectors;
import main.java.com.djrapitops.plan.Log;
import main.java.com.djrapitops.plan.Plan;
import main.java.com.djrapitops.plan.data.SessionData;
import main.java.com.djrapitops.plan.data.UserData;
import main.java.com.djrapitops.plan.database.Database;
import main.java.com.djrapitops.plan.database.databases.SQLiteDB;
import main.java.com.djrapitops.plan.utilities.analysis.MathUtils;
/**
*
@ -69,11 +74,59 @@ public class ManageUtils {
clearAndCopyToDB.removeAllData();
List<UserData> allUserData = copyFromDB.getUserDataForUUIDS(copyFromDB.getSavedUUIDs());
clearAndCopyToDB.saveMultipleUserData(allUserData);
clearAndCopyToDB.getCommandUseTable().saveCommandUse(copyFromDB.getCommandUseTable().getCommandUse());
clearAndCopyToDB.getCommandUseTable().saveCommandUse(copyFromDB.getCommandUseTable().getCommandUse());
} catch (SQLException | NullPointerException e) {
Log.toLog("ManageUtils.move", e);
return false;
}
return true;
}
public static boolean containsCombinable(List<SessionData> sessions) {
return containsCombinable(sessions, 5000);
}
private static boolean containsCombinable(List<SessionData> sessions, int threshold) {
// Checks if there are starts & ends that are the same, or less than threshold ms away from each other.
return sessions.stream()
.anyMatch(s -> sessions.stream()
.filter(ses -> !ses.equals(s))
.map(ses -> ses.getSessionStart())
.anyMatch((Long start) -> (Math.abs(s.getSessionEnd() - start) < threshold)));
}
public static List<SessionData> combineSessions(List<SessionData> sessions, Integer loginTimes) {
return combineSessions(sessions, loginTimes, 5000);
}
private static List<SessionData> combineSessions(List<SessionData> sessions, Integer loginTimes, int threshold) {
if (threshold >= 35000) {
return sessions;
}
List<SessionData> newSessions = new ArrayList<>();
List<SessionData> removed = new ArrayList<>();
Iterator<SessionData> iterator = sessions.iterator();
while (iterator.hasNext()) {
SessionData session = iterator.next();
if (removed.contains(session)) {
continue;
}
List<SessionData> close = sessions.stream().filter(ses -> Math.abs(session.getSessionEnd() - ses.getSessionStart()) < threshold).collect(Collectors.toList());
if (!close.isEmpty()) {
long big = MathUtils.getBiggestLong(close.stream().map((SessionData ses) -> ses.getSessionEnd()).collect(Collectors.toList()));
session.endSession(big);
removed.addAll(close);
}
newSessions.add(session);
}
if (loginTimes == newSessions.size()) {
return newSessions;
}
boolean containsCombinable = containsCombinable(newSessions, threshold);
if (containsCombinable) {
return combineSessions(newSessions, threshold + 1000);
} else {
return newSessions;
}
}
}

View File

@ -34,54 +34,6 @@ public class MiscUtils {
return System.currentTimeMillis();
}
/**
* Checks the version and returns response String.
*
* @return String informing about status of plugins version.
*/
public static String checkVersion() {
try {
Plan plugin = Plan.getInstance();
String cVersion = plugin.getDescription().getVersion();
String gitVersion = getGitVersion();
if (checkVersion(cVersion, gitVersion)) {
return Phrase.VERSION_NEW_AVAILABLE.parse(gitVersion);
} else {
return Phrase.VERSION_LATEST + "";
}
} catch (IOException | NumberFormatException e) {
Log.error(Phrase.VERSION_CHECK_ERROR + "");
}
return Phrase.VERSION_FAIL + "";
}
private static String getGitVersion() throws IOException {
URL githubUrl = new URL("https://raw.githubusercontent.com/Rsl1122/Plan-PlayerAnalytics/master/Plan/src/main/resources/plugin.yml");
String lineWithVersion = "";
Scanner websiteScanner = new Scanner(githubUrl.openStream());
while (websiteScanner.hasNextLine()) {
String line = websiteScanner.nextLine();
if (line.toLowerCase().contains("version")) {
lineWithVersion = line;
break;
}
}
return lineWithVersion.split(": ")[1];
}
/**
*
* @param currentVersion
* @param gitVersion
* @return
* @throws NumberFormatException
*/
public static boolean checkVersion(String currentVersion, String gitVersion) throws NumberFormatException {
int newestVersionNumber = FormatUtils.parseVersionNumber(gitVersion);
int currentVersionNumber = FormatUtils.parseVersionNumber(currentVersion);
return newestVersionNumber > currentVersionNumber;
}
/**
*
* @param args

View File

@ -1,5 +1,6 @@
package main.java.com.djrapitops.plan.utilities.analysis;
import main.java.com.djrapitops.plan.data.additional.HookHandler;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
@ -17,7 +18,6 @@ import main.java.com.djrapitops.plan.data.RawAnalysisData;
import main.java.com.djrapitops.plan.data.SessionData;
import main.java.com.djrapitops.plan.data.UserData;
import main.java.com.djrapitops.plan.data.additional.AnalysisType;
import main.java.com.djrapitops.plan.data.additional.HookHandler;
import main.java.com.djrapitops.plan.data.additional.PluginData;
import main.java.com.djrapitops.plan.data.cache.AnalysisCacheHandler;
import main.java.com.djrapitops.plan.data.cache.DataCacheHandler;
@ -45,6 +45,7 @@ public class Analysis {
private final Plan plugin;
private final InspectCacheHandler inspectCache;
private int taskId = -1;
/**
* Class Constructor.
@ -66,13 +67,18 @@ public class Analysis {
* @param analysisCache Cache that the data is saved to.
*/
public void runAnalysis(AnalysisCacheHandler analysisCache) {
if (isAnalysisBeingRun()) {
return;
}
Benchmark.start("Analysis");
log(Phrase.ANALYSIS_START + "");
// Async task for Analysis
BukkitTask asyncAnalysisTask = (new BukkitRunnable() {
@Override
public void run() {
taskId = this.getTaskId();
analyze(analysisCache, plugin.getDB());
taskId = -1;
this.cancel();
}
}).runTaskAsynchronously(plugin);
@ -164,7 +170,7 @@ public class Analysis {
analysisCache.cache(analysisData);
long time = Benchmark.stop("Analysis");
if (Settings.ANALYSIS_LOG_FINISHED.isTrue()) {
Log.info(Phrase.ANALYSIS_COMPLETE.parse(time + "", HtmlUtils.getServerAnalysisUrl()));
Log.info(Phrase.ANALYSIS_COMPLETE.parse(time + "", HtmlUtils.getServerAnalysisUrlWithProtocol()));
}
// LocationAnalysis.performAnalysis(analysisData, plugin.getDB());
ExportUtility.export(plugin, analysisData, rawData);
@ -414,4 +420,8 @@ public class Analysis {
Benchmark.stop("Analysis 3rd party");
return replaceMap;
}
public boolean isAnalysisBeingRun() {
return taskId != -1;
}
}

View File

@ -1,8 +1,3 @@
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package main.java.com.djrapitops.plan.utilities.analysis;
import java.io.File;
@ -52,7 +47,7 @@ public class ExportUtility {
Benchmark.start("Exporting Html pages");
try {
File folder = getFolder();
writeAnalysisHtml(analysisData, folder);
writeAnalysisHtml(analysisData, new File(folder, "server"));
File playersFolder = getPlayersFolder(folder);
for (UserData userData : rawData) {
writeInspectHtml(userData, playersFolder);
@ -85,14 +80,14 @@ public class ExportUtility {
Files.write(inspectHtmlFile.toPath(), Arrays.asList(inspectHtml));
}
public static void writeAnalysisHtml(AnalysisData analysisData, File folder) throws FileNotFoundException, IOException {
public static void writeAnalysisHtml(AnalysisData analysisData, File serverFolder) throws FileNotFoundException, IOException {
if (!Settings.ANALYSIS_EXPORT.isTrue()) {
return;
}
String analysisHtml = HtmlUtils.replacePlaceholders(HtmlUtils.getHtmlStringFromResource("analysis.html"),
PlaceholderUtils.getAnalysisReplaceRules(analysisData))
.replace(HtmlUtils.getInspectUrl(""), "./player/");
File analysisHtmlFile = new File(folder, "analysis.html");
File analysisHtmlFile = new File(serverFolder, "index.html");
if (analysisHtmlFile.exists()) {
analysisHtmlFile.delete();
}

View File

@ -1,149 +0,0 @@
/*
* Copyright (c) 2015 Nate Mortensen
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
package main.java.com.djrapitops.plan.utilities.uuid;
import com.google.common.collect.ImmutableList;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.nio.ByteBuffer;
import java.util.*;
import java.util.concurrent.Callable;
import org.json.simple.JSONArray;
import org.json.simple.JSONObject;
import org.json.simple.parser.JSONParser;
/**
*
* @author Rsl1122
*/
public class UUIDFetcher implements Callable<Map<String, UUID>> {
private static final double PROFILES_PER_REQUEST = 100;
private static final String PROFILE_URL = "https://api.mojang.com/profiles/minecraft";
private final JSONParser jsonParser = new JSONParser();
private final List<String> names;
private final boolean rateLimiting;
/**
*
* @param names
* @param rateLimiting
*/
public UUIDFetcher(List<String> names, boolean rateLimiting) {
this.names = ImmutableList.copyOf(names);
this.rateLimiting = rateLimiting;
}
/**
*
* @param names
*/
public UUIDFetcher(List<String> names) {
this(names, true);
}
@Override
public Map<String, UUID> call() throws Exception {
Map<String, UUID> uuidMap = new HashMap<>();
int requests = (int) Math.ceil(names.size() / PROFILES_PER_REQUEST);
for (int i = 0; i < requests; i++) {
HttpURLConnection connection = createConnection();
String body = JSONArray.toJSONString(names.subList(i * 100, Math.min((i + 1) * 100, names.size())));
writeBody(connection, body);
JSONArray array = (JSONArray) jsonParser.parse(new InputStreamReader(connection.getInputStream()));
for (Object profile : array) {
JSONObject jsonProfile = (JSONObject) profile;
String id = (String) jsonProfile.get("id");
String name = (String) jsonProfile.get("name");
UUID uuid = UUIDFetcher.getUUID(id);
uuidMap.put(name, uuid);
}
if (rateLimiting && i != requests - 1) {
Thread.sleep(100L);
}
}
return uuidMap;
}
private static void writeBody(HttpURLConnection connection, String body) throws Exception {
OutputStream stream = connection.getOutputStream();
stream.write(body.getBytes());
stream.flush();
stream.close();
}
private static HttpURLConnection createConnection() throws Exception {
URL url = new URL(PROFILE_URL);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("POST");
connection.setRequestProperty("Content-Type", "application/json");
connection.setUseCaches(false);
connection.setDoInput(true);
connection.setDoOutput(true);
return connection;
}
private static UUID getUUID(String id) {
return UUID.fromString(id.substring(0, 8) + "-" + id.substring(8, 12) + "-" + id.substring(12, 16) + "-" + id.substring(16, 20) + "-" + id.substring(20, 32));
}
/**
*
* @param uuid
* @return
*/
public static byte[] toBytes(UUID uuid) {
ByteBuffer byteBuffer = ByteBuffer.wrap(new byte[16]);
byteBuffer.putLong(uuid.getMostSignificantBits());
byteBuffer.putLong(uuid.getLeastSignificantBits());
return byteBuffer.array();
}
/**
*
* @param array
* @return
*/
public static UUID fromBytes(byte[] array) {
if (array.length != 16) {
throw new IllegalArgumentException("Illegal byte array length: " + array.length);
}
ByteBuffer byteBuffer = ByteBuffer.wrap(array);
long mostSignificant = byteBuffer.getLong();
long leastSignificant = byteBuffer.getLong();
return new UUID(mostSignificant, leastSignificant);
}
/**
*
* @param name
* @return
* @throws Exception
*/
public static UUID getUUIDOf(String name) throws Exception {
return new UUIDFetcher(Arrays.asList(name)).call().get(name);
}
}

View File

@ -5,6 +5,7 @@
*/
package main.java.com.djrapitops.plan.utilities.uuid;
import com.djrapitops.javaplugin.utilities.UUIDFetcher;
import java.sql.SQLException;
import java.util.UUID;
import main.java.com.djrapitops.plan.Log;

View File

@ -282,7 +282,7 @@ header p {
<body onload="countUpTimer()">
<header>
<div class="header-content">
<img src="http://puu.sh/tJZUb/c2e0ab220f.png" alt="Player Analytics | Analysis">
<img src="https://puu.sh/tJZUb/c2e0ab220f.png" alt="Player Analytics | Analysis">
<p>Player Analytics v.%version%</p>
<h1><span id="navbutton" onclick="openNav()">&#9776; </span>%servername% | Server Analysis</h1>
</div>
@ -498,7 +498,7 @@ header p {
</div>
</div>
<canvas id="playerChartMonth" width="1000" height="350" style="width: 95%;"></canvas>
<p><i class="fa fa-user-circle" aria-hidden="true"></i> Unique Playes: %uniquejoinsmonth% | <i class="fa fa-user-circle-o" aria-hidden="true"></i> Unique/Day: %avguniquejoinsmonth%</p>
<p><i class="fa fa-user-circle" aria-hidden="true"></i> Unique Players: %uniquejoinsmonth% | <i class="fa fa-user-circle-o" aria-hidden="true"></i> Unique/Day: %avguniquejoinsmonth%</p>
</div>
</div>
<div class="row">
@ -766,6 +766,9 @@ header p {
</div>
</div>
<script>
var serverTime = new Date(%currenttime%);
var now = new Date();
var timediff = serverTime.getTime()-now.getTime();
function openNav() {
document.getElementById("sidenav").style.width = "100%";
document.getElementById("limiter").style.display = "none";
@ -820,9 +823,6 @@ function openFunc(i) {
x.style.transform = "translate3d("+value+"%,0px,0)";
};
}
var serverTime = new Date(%currenttime%);
var now = new Date();
var timediff = serverTime.getTime()-now.getTime();
function countUpTimer() {
var now = new Date();
var begin = new Date(%refreshlong%-timediff);
@ -857,7 +857,7 @@ function countUpTimer() {
setTimeout('countUpTimer()', 1000);
}
</script>
<script src="http://www.kryogenix.org/code/browser/sorttable/sorttable.js"></script>
<script src="https://www.kryogenix.org/code/browser/sorttable/sorttable.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.5.0/Chart.bundle.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.5.0/Chart.js"></script>
<script>

View File

@ -35,6 +35,7 @@ Settings:
InternalIP: 0.0.0.0
ShowAlternativeServerIP: false
AlternativeIP: your.ip.here:%port%
LinkProtocol: http
Security:
DisplayIPsAndUUIDs: true
AddressSecurityCode: bAkEd
@ -48,6 +49,7 @@ Customization:
TimeAmount:
Year: '1 year, '
Years: '%years% years, '
Day: '1d '
Days: '%days%d '
Hours: '%hours%h '
Minutes: '%minutes%m '

View File

@ -62,9 +62,12 @@ The code & resources can be modified & run if the following conditions apply:
a1: Modifyer was paid to modify part of the software for customization of visual appearance of the software or fix Exceptions & Errors caused
by updates to Minecraft Server software.
4. Usage of part of code in another software
This part (4) of the licence does not include the usage of the API of the plugin,
or adding the compiled code as provided dependency. Such use is allowed.
Usage of a part of code in another software is allowed if following conditions apply:
a. The software falls under this licence
b. This licence is accepted by the person using the code inside their software

View File

@ -319,7 +319,7 @@ table.sortable th:not(.sorttable_sorted):not(.sorttable_sorted_reverse):not(.sor
<body>
<header>
<div class="header-content">
<img style="float: right; padding: 5px" src="http://puu.sh/tJZUb/c2e0ab220f.png" alt="Player Analytics | Analysis">
<img style="float: right; padding: 5px" src="https://puu.sh/tJZUb/c2e0ab220f.png" alt="Player Analytics | Analysis">
<p style="float: right; text-align: right;">Player Analytics v.%version%</p>
<h1><span id="navbutton" onclick="openNav()">&#9776; </span>%servername% | Inspect Player %name%%op%</h1>
</div>
@ -360,7 +360,7 @@ table.sortable th:not(.sorttable_sorted):not(.sorttable_sorted_reverse):not(.sor
</div>
</div>
</div>
<img style="float: right; padding: 5px" alt="%name%" src="http://cravatar.eu/head/%name%/128.png">
<img style="float: right; padding: 5px" alt="%name%" src="https://cravatar.eu/head/%name%/128.png">
<p><i class="fa fa-user" aria-hidden="true"></i> %active% %isonline%%banned%<br/>
<i class="fa fa-address-card-o" aria-hidden="true"></i> Nicknames: %nicknames%<br/>
<i class="fa fa-clock-o" aria-hidden="true"></i> Playtime: %playtime%<br/>
@ -549,6 +549,9 @@ table.sortable th:not(.sorttable_sorted):not(.sorttable_sorted_reverse):not(.sor
</div>
</div>
<script>
var serverTime = new Date(%currenttime%);
var now = new Date();
var timediff = serverTime.getTime()-now.getTime();
function openNav() {
document.getElementById("sidenav").style.width = "100%";
document.getElementById("limiter").style.display = "none";
@ -604,9 +607,6 @@ function openFunc(i) {
};
}
var serverTime = new Date(%currenttime%);
var now = new Date();
var timediff = serverTime.getTime()-now.getTime();
function countUpTimer() {
var now = new Date();
var begin = new Date(%refreshlong%-timediff);
@ -641,7 +641,7 @@ function countUpTimer() {
setTimeout('countUpTimer()', 1000);
}
</script>
<script src="http://www.kryogenix.org/code/browser/sorttable/sorttable.js"></script>
<script src="https://www.kryogenix.org/code/browser/sorttable/sorttable.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.5.0/Chart.bundle.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.5.0/Chart.js"></script>
<script>

View File

@ -1,7 +1,7 @@
name: Plan
author: Rsl1122
main: main.java.com.djrapitops.plan.Plan
version: 3.4.2
version: 3.4.3
softdepend:
- OnTime

View File

@ -134,6 +134,7 @@ public class DataCacheHandlerTest {
* @throws SQLException
* @throws InterruptedException
*/
@Ignore("Scheduler")
@Test
public void testGetUserDataForProcessingCache() throws SQLException, InterruptedException {
// db.init();
@ -174,6 +175,7 @@ public class DataCacheHandlerTest {
/**
*
*/
@Ignore("Scheduler")
@Test
public void testSaveCachedUserData() {
UserData data = new UserData(MockUtils.mockPlayer(), new DemographicsData());
@ -214,6 +216,7 @@ public class DataCacheHandlerTest {
/**
*
*/
@Ignore("Scheduler")
@Test
public void testSaveCommandUse() {
handler.saveCommandUse();
@ -252,6 +255,7 @@ public class DataCacheHandlerTest {
/**
*
*/
@Ignore
@Test
public void testScheludeForClear() {
}
@ -259,6 +263,7 @@ public class DataCacheHandlerTest {
/**
*
*/
@Ignore
@Test
public void testIsDataAccessed() {
}
@ -290,6 +295,7 @@ public class DataCacheHandlerTest {
/**
*
*/
@Ignore("Scheduler")
@Test
public void testGetDataCache() {
assertTrue("Cache was null", handler.getDataCache() != null);
@ -306,6 +312,7 @@ public class DataCacheHandlerTest {
/**
*
*/
@Ignore("Scheduler")
@Test
public void testHandleCommand() {
handler.handleCommand("/plan");

View File

@ -26,6 +26,7 @@ import org.bukkit.plugin.java.JavaPlugin;
import org.junit.After;
import static org.junit.Assert.*;
import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.powermock.core.classloader.annotations.PrepareForTest;
@ -110,6 +111,7 @@ public class DataCacheGetQueueTest {
/**
*
*/
@Ignore("Scheduler")
@Test
public void testScheduleForGet() {
OfflinePlayer op = MockUtils.mockPlayer2();
@ -127,6 +129,7 @@ public class DataCacheGetQueueTest {
/**
*
*/
@Ignore("Scheduler")
@Test
public void testStop() {
DataCacheGetQueue instance = new DataCacheGetQueue(plan);

View File

@ -92,6 +92,7 @@ public class DataCacheProcessQueueTest {
*
* @throws InterruptedException
*/
@Ignore("Scheduler")
@Test
public void testAddToPool_HandlingInfo() throws InterruptedException {
DataCacheProcessQueue q = new DataCacheProcessQueue(handler);
@ -112,6 +113,7 @@ public class DataCacheProcessQueueTest {
*
* @throws InterruptedException
*/
@Ignore("Scheduler")
@Test
public void testAddToPool_Collection() throws InterruptedException {
DataCacheProcessQueue q = new DataCacheProcessQueue(handler);

View File

@ -415,5 +415,5 @@ public class DatabaseTest {
assertTrue("Doesn't contain /tp", commandUse.containsKey("/tp"));
assertTrue("Doesn't contain /pla", commandUse.containsKey("/pla"));
assertTrue("Doesn't contain /help", commandUse.containsKey("/help"));
}
}
}

View File

@ -11,6 +11,7 @@ import main.java.com.djrapitops.plan.utilities.HtmlUtils;
import org.bukkit.plugin.java.JavaPlugin;
import static org.junit.Assert.*;
import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.powermock.core.classloader.annotations.PrepareForTest;
@ -83,7 +84,7 @@ public class HtmlUtilsTest {
*/
@Test
public void testGetServerAnalysisUrl() throws FileNotFoundException {
String result = HtmlUtils.getServerAnalysisUrl();
String result = HtmlUtils.getServerAnalysisUrlWithProtocol();
String exp = "http://0.0.0.0:8804/bAkEd/server";
assertEquals(exp, result);
}
@ -95,7 +96,7 @@ public class HtmlUtilsTest {
public void testGetInspectUrl() {
String playerName = "Test";
String expResult = "http://0.0.0.0:8804/bAkEd/player/Test";
String result = HtmlUtils.getInspectUrl(playerName);
String result = HtmlUtils.getInspectUrlWithProtocol(playerName);
assertEquals(expResult, result);
}

View File

@ -0,0 +1,142 @@
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package test.java.main.java.com.djrapitops.plan.utilities;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import main.java.com.djrapitops.plan.data.SessionData;
import main.java.com.djrapitops.plan.utilities.ManageUtils;
import org.bukkit.plugin.java.JavaPlugin;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
import test.java.utils.TestInit;
/**
*
* @author Risto
*/
@RunWith(PowerMockRunner.class)
@PrepareForTest({JavaPlugin.class})
public class ManageUtilsTest {
private int threshold = 5000;
public ManageUtilsTest() {
}
@Before
public void setUp() throws IOException, Exception {
TestInit t = new TestInit();
assertTrue("Not set up", t.setUp());
}
@Test
public void testContainsCombinable() {
List<SessionData> data = new ArrayList<>();
data.add(new SessionData(0, 100));
data.add(new SessionData(threshold - 100, threshold * 2));
data.add(new SessionData(threshold * 2 + 100, threshold * 3));
assertTrue(ManageUtils.containsCombinable(data));
}
@Test
public void testContainsCombinableFalse() {
List<SessionData> data = new ArrayList<>();
data.add(new SessionData(0, threshold));
data.add(new SessionData(threshold * 3, threshold * 4));
assertTrue(!ManageUtils.containsCombinable(data));
}
@Test
public void testContainsCombinableFalse2() {
List<SessionData> data = new ArrayList<>();
data.add(new SessionData(0, threshold * 2));
data.add(new SessionData(threshold * 3, threshold * 4));
assertTrue(!ManageUtils.containsCombinable(data));
}
@Test
public void testContainsCombinableFalse3() {
List<SessionData> data = new ArrayList<>();
data.add(new SessionData(0, threshold * 2));
data.add(new SessionData(threshold * 3 + 200, threshold * 4));
assertTrue(!ManageUtils.containsCombinable(data));
}
@Test
public void testCombineSessions() {
List<SessionData> data = new ArrayList<>();
data.add(new SessionData(0, 100));
data.add(new SessionData(threshold, threshold * 2));
data.add(new SessionData(threshold * 2 + 100, threshold * 3));
SessionData get = ManageUtils.combineSessions(data, 1).get(0);
SessionData exp = new SessionData(0, threshold * 3);
assertEquals(exp, get);
}
@Test
public void testCombineSessions2() {
List<SessionData> data = new ArrayList<>();
data.add(new SessionData(0, 100));
data.add(new SessionData(threshold, threshold * 2));
data.add(new SessionData(threshold * 2 + 100, threshold * 3));
data.add(new SessionData(threshold * 3 + 200, threshold * 4));
SessionData get = ManageUtils.combineSessions(data, 1).get(0);
SessionData exp = new SessionData(0, threshold * 4);
assertEquals(exp, get);
}
@Test
public void testCombineSessions3() {
List<SessionData> data = new ArrayList<>();
data.add(new SessionData(0, 100));
data.add(new SessionData(threshold, threshold * 2));
data.add(new SessionData(threshold * 3 + 200, threshold * 4));
List<SessionData> result = ManageUtils.combineSessions(data, 2);
SessionData exp = new SessionData(0, threshold * 2);
assertEquals(exp, result.get(0));
SessionData exp2 = new SessionData(threshold * 3 + 200, threshold * 4);
assertEquals(exp2, result.get(1));
}
@Test
public void testCombineSessions4() {
List<SessionData> data = new ArrayList<>();
data.add(new SessionData(0, 100));
data.add(new SessionData(threshold, threshold * 2));
data.add(new SessionData(threshold * 3 + 200, threshold * 4));
data.add(new SessionData(threshold * 5 - 200, threshold * 5));
List<SessionData> result = ManageUtils.combineSessions(data, 2);
SessionData exp = new SessionData(0, threshold * 2);
assertEquals(exp, result.get(0));
SessionData exp2 = new SessionData(threshold * 3 + 200, threshold * 5);
assertEquals(exp2, result.get(1));
}
@Test
public void testCombineSessions5() {
List<SessionData> data = new ArrayList<>();
data.add(new SessionData(0, 100));
data.add(new SessionData(threshold, threshold * 2));
data.add(new SessionData(threshold * 5, threshold * 5 + 100));
data.add(new SessionData(threshold * 8, threshold * 8 + 200));
data.add(new SessionData(threshold * 9 - 200, threshold * 10));
List<SessionData> result = ManageUtils.combineSessions(data, 3);
SessionData exp = new SessionData(0, threshold * 2);
assertEquals(exp, result.get(0));
SessionData exp2 = new SessionData(threshold * 5, threshold * 5 + 100);
assertEquals(exp2, result.get(1));
SessionData exp3 = new SessionData(threshold * 8, threshold * 10);
assertEquals(exp3, result.get(2));
}
}

View File

@ -52,44 +52,6 @@ public class MiscUtilsTest {
PowerMock.replay(Bukkit.class);
}
/**
*
*/
@Test
public void testCheckVersion() {
String versionG = "2.10.9";
assertTrue(MiscUtils.checkVersion("2.0.0", versionG));
}
/**
*
*/
@Test
public void testCheckVersion2() {
assertTrue(!MiscUtils.checkVersion("3.0.0", "2.10.9"));
}
@Test
public void testCheckVersion5() {
assertTrue(MiscUtils.checkVersion("2.10.9", "3.0.0"));
}
/**
*
*/
@Test
public void testCheckVersion3() {
assertTrue(!MiscUtils.checkVersion("2.11.0", "2.10.9"));
}
/**
*
*/
@Test
public void testCheckVersion4() {
assertTrue(!MiscUtils.checkVersion("2.11.0", "2.11.0"));
}
/**
*
*/

View File

@ -5,11 +5,13 @@
*/
package test.java.utils;
import com.djrapitops.javaplugin.utilities.PluginLog;
import java.io.File;
import java.io.FileInputStream;
import java.nio.file.Files;
import java.util.logging.Logger;
import main.java.com.djrapitops.plan.Plan;
import main.java.com.djrapitops.plan.ServerVariableHolder;
import main.java.com.djrapitops.plan.Settings;
import org.bukkit.Server;
import org.bukkit.configuration.file.YamlConfiguration;
@ -63,6 +65,10 @@ public class TestInit {
// Mockito.doReturn("0.0.0.0").when(mockServer).getIp();
when(planMock.getServer()).thenReturn(mockServer);
when(planMock.getLogger()).thenReturn(Logger.getGlobal());
ServerVariableHolder serverVariableHolder = new ServerVariableHolder(mockServer);
when(planMock.getVariable()).thenReturn(serverVariableHolder);
PluginLog<Plan> log = new PluginLog(planMock, "console", "");
when(planMock.getPluginLogger()).thenReturn(log);
Plan.setInstance(planMock);
// Mockito.doReturn("0.0.0.0").when(planMock).getServer().getIp();
Settings.DEBUG.setValue(true);

Binary file not shown.

87
PlanPluginBridge/pom.xml Normal file
View File

@ -0,0 +1,87 @@
<?xml version="1.0" encoding="UTF-8"?>
<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>com.djrapitops</groupId>
<artifactId>PlanPluginBridge</artifactId>
<version>3.4.3</version>
<packaging>jar</packaging>
<repositories>
<repository>
<id>vault-repo</id>
<url>http://nexus.hc.to/content/repositories/pub_releases</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>com.djrapitops</groupId>
<artifactId>Plan</artifactId>
<version>3.4.3</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.bukkit</groupId>
<artifactId>craftbukkit</artifactId>
<version>1.11.2-R0.1-SNAPSHOT</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.hm</groupId>
<artifactId>advanced.achievements</artifactId>
<version>5.2</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>me.edge209</groupId>
<artifactId>ontime</artifactId>
<version>4.1.4</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.earth2me</groupId>
<artifactId>essentials</artifactId>
<version>2.0.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.massivecraft</groupId>
<artifactId>factions</artifactId>
<version>2.10.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.gamingmesh</groupId>
<artifactId>jobs</artifactId>
<version>3.9.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.massivecraft</groupId>
<artifactId>mcore</artifactId>
<version>2.10.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.gmail.nossr50</groupId>
<artifactId>mcmmo</artifactId>
<version>1.5.07</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.palmergames</groupId>
<artifactId>towny</artifactId>
<version>0.91.4.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>net.milkbowl.vault</groupId>
<artifactId>VaultAPI</artifactId>
<version>1.6</version>
<scope>provided</scope>
</dependency>
</dependencies>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
</project>

View File

@ -0,0 +1,75 @@
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package com.djrapitops.pluginbridge.plan;
import com.djrapitops.pluginbridge.plan.advancedachievements.AdvancedAchievementsHook;
import com.djrapitops.pluginbridge.plan.essentials.EssentialsHook;
import com.djrapitops.pluginbridge.plan.factions.FactionsHook;
import com.djrapitops.pluginbridge.plan.jobs.JobsHook;
import com.djrapitops.pluginbridge.plan.mcmmo.McmmoHook;
import com.djrapitops.pluginbridge.plan.ontime.OnTimeHook;
import com.djrapitops.pluginbridge.plan.towny.TownyHook;
import com.djrapitops.pluginbridge.plan.vault.VaultHook;
import main.java.com.djrapitops.plan.Plan;
import main.java.com.djrapitops.plan.Settings;
import main.java.com.djrapitops.plan.data.additional.HookHandler;
/**
*
* @author Risto
*/
public class Bridge {
public static void hook(HookHandler handler) {
try {
if (Settings.ENABLED_AA.isTrue()) {
AdvancedAchievementsHook advancedAchievementsHook = new AdvancedAchievementsHook(handler);
}
} catch (NoClassDefFoundError e) {
}
try {
if (Settings.ENABLED_ESS.isTrue()) {
EssentialsHook essentialsHook = new EssentialsHook(handler);
}
} catch (NoClassDefFoundError e) {
}
try {
if (Settings.ENABLED_FAC.isTrue()) {
FactionsHook factionsHook = new FactionsHook(handler);
}
} catch (NoClassDefFoundError e) {
}
try {
if (Settings.ENABLED_MCM.isTrue()) {
McmmoHook mcMmoHook = new McmmoHook(handler);
}
} catch (NoClassDefFoundError e) {
}
try {
if (Settings.ENABLED_JOB.isTrue()) {
JobsHook jobsHook = new JobsHook(handler);
}
} catch (NoClassDefFoundError e) {
}
try {
if (Settings.ENABLED_ONT.isTrue()) {
OnTimeHook onTimeHook = new OnTimeHook(handler);
}
} catch (NoClassDefFoundError e) {
}
try {
if (Settings.ENABLED_TOW.isTrue()) {
TownyHook townyHook = new TownyHook(handler);
}
} catch (NoClassDefFoundError e) {
}
try {
if (Settings.ENABLED_VAU.isTrue()) {
VaultHook vaultHook = new VaultHook(handler);
}
} catch (NoClassDefFoundError e) {
}
}
}

View File

@ -1,4 +1,4 @@
package main.java.com.djrapitops.plan.data.additional;
package com.djrapitops.pluginbridge.plan;
import org.bukkit.plugin.java.JavaPlugin;
import static org.bukkit.plugin.java.JavaPlugin.getPlugin;

View File

@ -1,4 +1,4 @@
package main.java.com.djrapitops.plan.data.additional.advancedachievements;
package com.djrapitops.pluginbridge.plan.advancedachievements;
import com.hm.achievement.api.AdvancedAchievementsAPI;
import java.io.Serializable;

View File

@ -1,6 +1,6 @@
package main.java.com.djrapitops.plan.data.additional.advancedachievements;
package com.djrapitops.pluginbridge.plan.advancedachievements;
import main.java.com.djrapitops.plan.data.additional.Hook;
import com.djrapitops.pluginbridge.plan.Hook;
import com.hm.achievement.AdvancedAchievements;
import com.hm.achievement.api.AdvancedAchievementsAPI;
import com.hm.achievement.api.AdvancedAchievementsBukkitAPI;
@ -9,8 +9,8 @@ import main.java.com.djrapitops.plan.data.additional.HookHandler;
import static org.bukkit.plugin.java.JavaPlugin.getPlugin;
/**
* A Class responsible for hooking to AdvancedAchievements and registering 2 data
* sources.
* A Class responsible for hooking to AdvancedAchievements and registering 2
* data sources.
*
* @author Rsl1122
* @since 3.1.0

View File

@ -1,4 +1,4 @@
package main.java.com.djrapitops.plan.data.additional.advancedachievements;
package com.djrapitops.pluginbridge.plan.advancedachievements;
import com.hm.achievement.api.AdvancedAchievementsAPI;
import java.io.Serializable;

View File

@ -1,9 +1,9 @@
package main.java.com.djrapitops.plan.data.additional.essentials;
package com.djrapitops.pluginbridge.plan.essentials;
import main.java.com.djrapitops.plan.data.additional.Hook;
import main.java.com.djrapitops.plan.data.additional.HookHandler;
import com.djrapitops.pluginbridge.plan.Hook;
import com.earth2me.essentials.Essentials;
import main.java.com.djrapitops.plan.api.API;
import main.java.com.djrapitops.plan.data.additional.HookHandler;
import static org.bukkit.plugin.java.JavaPlugin.getPlugin;
/**

View File

@ -1,4 +1,4 @@
package main.java.com.djrapitops.plan.data.additional.essentials;
package com.djrapitops.pluginbridge.plan.essentials;
import com.earth2me.essentials.Essentials;
import com.earth2me.essentials.User;

View File

@ -1,4 +1,4 @@
package main.java.com.djrapitops.plan.data.additional.essentials;
package com.djrapitops.pluginbridge.plan.essentials;
import com.earth2me.essentials.Essentials;
import com.earth2me.essentials.User;

View File

@ -1,11 +1,16 @@
package main.java.com.djrapitops.plan.data.additional.essentials;
package com.djrapitops.pluginbridge.plan.essentials;
import com.earth2me.essentials.Essentials;
import com.earth2me.essentials.Warps;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.UUID;
import main.java.com.djrapitops.plan.data.additional.AnalysisType;
import main.java.com.djrapitops.plan.data.additional.PluginData;
import main.java.com.djrapitops.plan.ui.Html;
/**
* PluginData class for Essentials-plugin.
@ -13,14 +18,14 @@ import main.java.com.djrapitops.plan.data.additional.PluginData;
* Registered to the plugin by EssentialsHook
*
* Gives a list of warps as a String value.
*
*
* @author Rsl1122
* @since 3.1.0
* @see EssentialsHook
*/
public class EssentialsWarps extends PluginData {
private Essentials essentials;
private final Essentials essentials;
/**
* Class Constructor, sets the parameters of the PluginData object.
@ -30,17 +35,34 @@ public class EssentialsWarps extends PluginData {
public EssentialsWarps(Essentials essentials) {
super("Essentials", "warps", AnalysisType.HTML);
this.essentials = essentials;
super.setIcon("map-marker");
super.setPrefix("Warps: ");
String warps = Html.FONT_AWESOME_ICON.parse("map-marker") + " Warps";
String command = Html.FONT_AWESOME_ICON.parse("fa-terminal") + " Command";
super.setPrefix(Html.TABLE_START_2.parse(warps, command));
super.setSuffix(Html.TABLE_END.parse());
}
@Override
public String getHtmlReplaceValue(String modifier, UUID uuid) {
Warps warps = essentials.getWarps();
if (!warps.isEmpty()) {
return parseContainer("", warps.getList().toString());
Collection<String> warplist = warps.getList();
return parseContainer("", getTableContents(new ArrayList<>(warplist)));
}
return parseContainer("", "No Warps.");
return parseContainer("", Html.TABLELINE_2.parse("No Warps.", ""));
}
private String getTableContents(List<String> warps) {
Collections.sort(warps);
StringBuilder html = new StringBuilder();
if (warps.isEmpty()) {
html.append(Html.TABLELINE_4.parse(Html.FACTION_NO_FACTIONS.parse(), "", "", ""));
} else {
for (String warp : warps) {
html.append(Html.TABLELINE_2.parse(warp, "/warp " + warp));
}
}
return html.toString();
}
@Override

View File

@ -1,4 +1,4 @@
package main.java.com.djrapitops.plan.data.additional.factions;
package com.djrapitops.pluginbridge.plan.factions;
import com.massivecraft.factions.entity.Faction;
import java.util.Comparator;

View File

@ -1,4 +1,4 @@
package main.java.com.djrapitops.plan.data.additional.factions;
package com.djrapitops.pluginbridge.plan.factions;
import com.massivecraft.factions.entity.MPlayer;
import java.io.Serializable;

View File

@ -1,6 +1,7 @@
package main.java.com.djrapitops.plan.data.additional.factions;
package com.djrapitops.pluginbridge.plan.factions;
import main.java.com.djrapitops.plan.data.additional.Hook;
import main.java.com.djrapitops.plan.data.additional.HookHandler;
import com.djrapitops.pluginbridge.plan.Hook;
import com.massivecraft.factions.entity.Faction;
import com.massivecraft.factions.entity.FactionColl;
import java.util.ArrayList;
@ -9,7 +10,6 @@ import java.util.List;
import java.util.stream.Collectors;
import main.java.com.djrapitops.plan.Settings;
import main.java.com.djrapitops.plan.api.API;
import main.java.com.djrapitops.plan.data.additional.HookHandler;
/**
* A Class responsible for hooking to Factions and registering 4 data sources.

View File

@ -1,4 +1,4 @@
package main.java.com.djrapitops.plan.data.additional.factions;
package com.djrapitops.pluginbridge.plan.factions;
import com.massivecraft.factions.entity.MPlayer;
import java.io.Serializable;

View File

@ -1,4 +1,4 @@
package main.java.com.djrapitops.plan.data.additional.factions;
package com.djrapitops.pluginbridge.plan.factions;
import com.massivecraft.factions.entity.MPlayer;
import java.io.Serializable;

View File

@ -1,4 +1,4 @@
package main.java.com.djrapitops.plan.data.additional.factions;
package com.djrapitops.pluginbridge.plan.factions;
import com.massivecraft.factions.entity.Faction;
import com.massivecraft.factions.entity.MPlayer;

View File

@ -1,7 +1,8 @@
package main.java.com.djrapitops.plan.data.handling.importing;
package com.djrapitops.pluginbridge.plan.importing;
import java.util.UUID;
import main.java.com.djrapitops.plan.data.UserData;
import main.java.com.djrapitops.plan.data.handling.importing.Importer;
import main.java.com.djrapitops.plan.data.handling.info.HandlingInfo;
import main.java.com.djrapitops.plan.data.handling.info.InfoType;
import me.edge209.OnTime.OnTimeAPI;

View File

@ -1,4 +1,4 @@
package main.java.com.djrapitops.plan.data.additional.jobs;
package com.djrapitops.pluginbridge.plan.jobs;
import com.gamingmesh.jobs.Jobs;
import com.gamingmesh.jobs.PlayerManager;

View File

@ -1,8 +1,8 @@
package main.java.com.djrapitops.plan.data.additional.jobs;
package com.djrapitops.pluginbridge.plan.jobs;
import main.java.com.djrapitops.plan.data.additional.Hook;
import main.java.com.djrapitops.plan.api.API;
import main.java.com.djrapitops.plan.data.additional.HookHandler;
import com.djrapitops.pluginbridge.plan.Hook;
import main.java.com.djrapitops.plan.api.API;
/**
* A Class responsible for hooking to Jobs and registering data sources.

View File

@ -1,4 +1,4 @@
package main.java.com.djrapitops.plan.data.additional.jobs;
package com.djrapitops.pluginbridge.plan.jobs;
import com.gamingmesh.jobs.Jobs;
import com.gamingmesh.jobs.PlayerManager;

View File

@ -1,4 +1,4 @@
package main.java.com.djrapitops.plan.data.additional.mcmmo;
package com.djrapitops.pluginbridge.plan.mcmmo;
import com.gmail.nossr50.datatypes.player.PlayerProfile;
import com.gmail.nossr50.datatypes.skills.SkillType;

View File

@ -1,8 +1,8 @@
package main.java.com.djrapitops.plan.data.additional.mcmmo;
package com.djrapitops.pluginbridge.plan.mcmmo;
import main.java.com.djrapitops.plan.data.additional.Hook;
import main.java.com.djrapitops.plan.api.API;
import main.java.com.djrapitops.plan.data.additional.HookHandler;
import com.djrapitops.pluginbridge.plan.Hook;
import main.java.com.djrapitops.plan.api.API;
/**
* A Class responsible for hooking to MCMMO and registering data sources.

View File

@ -3,7 +3,7 @@
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package main.java.com.djrapitops.plan.data.additional.mcmmo;
package com.djrapitops.pluginbridge.plan.mcmmo;
import com.gmail.nossr50.datatypes.player.McMMOPlayer;
import com.gmail.nossr50.datatypes.player.PlayerProfile;

View File

@ -1,8 +1,8 @@
package main.java.com.djrapitops.plan.data.additional.ontime;
package com.djrapitops.pluginbridge.plan.ontime;
import main.java.com.djrapitops.plan.api.API;
import main.java.com.djrapitops.plan.data.additional.Hook;
import main.java.com.djrapitops.plan.data.additional.HookHandler;
import main.java.com.djrapitops.plan.api.API;
import com.djrapitops.pluginbridge.plan.Hook;
/**
* A Class responsible for hooking to OnTime and registering 6 data sources.

View File

@ -1,4 +1,4 @@
package main.java.com.djrapitops.plan.data.additional.ontime;
package com.djrapitops.pluginbridge.plan.ontime;
import java.io.Serializable;
import java.util.UUID;

View File

@ -1,4 +1,4 @@
package main.java.com.djrapitops.plan.data.additional.ontime;
package com.djrapitops.pluginbridge.plan.ontime;
import java.io.Serializable;
import java.util.UUID;

View File

@ -1,4 +1,4 @@
package main.java.com.djrapitops.plan.data.additional.ontime;
package com.djrapitops.pluginbridge.plan.ontime;
import java.io.Serializable;
import java.util.UUID;

View File

@ -1,4 +1,4 @@
package main.java.com.djrapitops.plan.data.additional.ontime;
package com.djrapitops.pluginbridge.plan.ontime;
import java.io.Serializable;
import java.util.UUID;

View File

@ -1,4 +1,4 @@
package main.java.com.djrapitops.plan.data.additional.ontime;
package com.djrapitops.pluginbridge.plan.ontime;
import java.io.Serializable;
import java.util.UUID;

Some files were not shown because too many files have changed in this diff Show More