diff --git a/.gitignore b/.gitignore index b55c258fa..b4d1bc86c 100644 --- a/.gitignore +++ b/.gitignore @@ -10,4 +10,6 @@ /ProjectHelper/nbproject/ /ProjectHelper/target/ /Filetool/nbproject/private/ -/Filetool/build/ \ No newline at end of file +/Filetool/build/ +/PlanPluginBridge/target/ +/MakroS/nbproject/private/ \ No newline at end of file diff --git a/Plan/dependency-reduced-pom.xml b/Plan/dependency-reduced-pom.xml index 1315e729c..d9186c961 100644 --- a/Plan/dependency-reduced-pom.xml +++ b/Plan/dependency-reduced-pom.xml @@ -1,82 +1,176 @@ - 4.0.0 - com.djrapitops - Plan - 2.0.0 - - ${basedir}/src - clean package install - - - . - ${basedir}/src/main/resources - - *.yml - *.html - - - - ${project.name} - - - maven-compiler-plugin - 3.3 - - 1.8 - 1.8 - - - - maven-jar-plugin - 2.6 - - - maven-shade-plugin - 2.3 - - - package - - shade - - - - - - - org.jfree:* - - - - - org.jfree - com.djrapitops.plan.jfree - - - false - - - - - - - org.bukkit - craftbukkit - 1.10.2-R0.1-SNAPSHOT - provided - - - com.djrapitops - plan.lite - 1.6.3 - provided - - - - 1.8 - UTF-8 - 1.8 - + 4.0.0 + com.djrapitops + Plan + 3.4.3 + + ${basedir}/src + clean package install + + + . + ${basedir}/src/main/resources + + *.yml + *.html + + + + ${project.name} + + + maven-compiler-plugin + 3.3 + + 1.8 + 1.8 + + + + maven-shade-plugin + 2.4.3 + + + package + + shade + + + + + + + org.powermock:* + org.javassist:* + com.thoughtworks.xstream:* + xmlpull:* + xpp3:* + org.objenesis:* + cglib:* + org.*:* + org.easymock:* + junit:* + + + + + + maven-jar-plugin + 2.6 + + + **/test/* + **/*/test/* + **/*/test.* + **/test/**/* + + + + + org.pitest + pitest-maven + 1.1.8 + + + main.java.com.djrapitops.plan.* + + + test.java.main.java.com.djrapitops.plan.* + + 1000 + + + + maven-checkstyle-plugin + 2.17 + + **/test/**/* + checkstyle.xml + + + + maven-javadoc-plugin + 2.10.4 + + test.* + + + + + + + org.bukkit + craftbukkit + 1.11.2-R0.1-SNAPSHOT + provided + + + org.powermock + powermock + 1.6.6 + pom + compile + + + org.powermock + powermock-api-mockito + 1.6.6 + compile + + + org.powermock + powermock-module-junit4 + 1.6.6 + compile + + + org.powermock + powermock-module-junit4-rule + 1.6.6 + compile + + + org.powermock + powermock-classloading-xstream + 1.6.6 + compile + + + org.mockito + mockito-core + 1.10.19 + compile + + + org.powermock + powermock-api-easymock + 1.6.6 + compile + + + org.easymock + easymock + 3.4 + compile + + + junit + junit + 4.12 + compile + + + org.hamcrest + hamcrest-core + 1.3 + test + + + + 1.8 + UTF-8 + 1.8 + diff --git a/Plan/pom.xml b/Plan/pom.xml index 381f9c531..281ed7543 100644 --- a/Plan/pom.xml +++ b/Plan/pom.xml @@ -3,18 +3,8 @@ 4.0.0 com.djrapitops Plan - 3.4.2 + 3.4.3 jar - - - - vault-repo - http://nexus.hc.to/content/repositories/pub_releases - - org.bukkit @@ -24,58 +14,16 @@ - com.hm - advanced.achievements - 5.2 - provided + com.djrapitops + BukkitPluginDependency + 1.0.0 + compile - me.edge209 - ontime - 4.1.4 - provided - - - com.earth2me - essentials - 2.0.1 - provided - - - com.massivecraft - factions - 2.10.0 - provided - - - com.gamingmesh - jobs - 3.9.1 - provided - - - com.massivecraft - mcore - 2.10.0 - provided - - - com.gmail.nossr50 - mcmmo - 1.5.07 - provided - - - com.palmergames - towny - 0.91.4.0 - provided - - - net.milkbowl.vault - VaultAPI - 1.6 - provided + com.djrapitops + PlanPluginBridge + 3.4.3 + compile @@ -158,6 +106,35 @@ 1.8 + + org.apache.maven.plugins + maven-shade-plugin + 2.4.3 + + + package + + shade + + + + + + + org.powermock:* + org.javassist:* + com.thoughtworks.xstream:* + xmlpull:* + xpp3:* + org.objenesis:* + cglib:* + org.*:* + org.easymock:* + junit:* + + + + org.apache.maven.plugins maven-jar-plugin diff --git a/Plan/src/main/java/com/djrapitops/plan/Log.java b/Plan/src/main/java/com/djrapitops/plan/Log.java index a25492c31..2ef65a7f2 100644 --- a/Plan/src/main/java/com/djrapitops/plan/Log.java +++ b/Plan/src/main/java/com/djrapitops/plan/Log.java @@ -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 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(); } } diff --git a/Plan/src/main/java/com/djrapitops/plan/Phrase.java b/Plan/src/main/java/com/djrapitops/plan/Phrase.java index dec01fb1d..c5caa4c08 100644 --- a/Plan/src/main/java/com/djrapitops/plan/Phrase.java +++ b/Plan/src/main/java/com/djrapitops/plan/Phrase.java @@ -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."), diff --git a/Plan/src/main/java/com/djrapitops/plan/Plan.java b/Plan/src/main/java/com/djrapitops/plan/Plan.java index 5cac94670..8240d6e69 100644 --- a/Plan/src/main/java/com/djrapitops/plan/Plan.java +++ b/Plan/src/main/java/com/djrapitops/plan/Plan.java @@ -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 { 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(); } } diff --git a/Plan/src/main/java/com/djrapitops/plan/ServerVariableHolder.java b/Plan/src/main/java/com/djrapitops/plan/ServerVariableHolder.java index 2f0f79413..8affe7366 100644 --- a/Plan/src/main/java/com/djrapitops/plan/ServerVariableHolder.java +++ b/Plan/src/main/java/com/djrapitops/plan/ServerVariableHolder.java @@ -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; + } } diff --git a/Plan/src/main/java/com/djrapitops/plan/Settings.java b/Plan/src/main/java/com/djrapitops/plan/Settings.java index 9b51127fd..112284307 100644 --- a/Plan/src/main/java/com/djrapitops/plan/Settings.java +++ b/Plan/src/main/java/com/djrapitops/plan/Settings.java @@ -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"), diff --git a/Plan/src/main/java/com/djrapitops/plan/api/API.java b/Plan/src/main/java/com/djrapitops/plan/api/API.java index f42c1df65..ce14d431e 100644 --- a/Plan/src/main/java/com/djrapitops/plan/api/API.java +++ b/Plan/src/main/java/com/djrapitops/plan/api/API.java @@ -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); } /** diff --git a/Plan/src/main/java/com/djrapitops/plan/command/CommandType.java b/Plan/src/main/java/com/djrapitops/plan/command/CommandType.java deleted file mode 100644 index 925a64178..000000000 --- a/Plan/src/main/java/com/djrapitops/plan/command/CommandType.java +++ /dev/null @@ -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 -} diff --git a/Plan/src/main/java/com/djrapitops/plan/command/PlanCommand.java b/Plan/src/main/java/com/djrapitops/plan/command/PlanCommand.java index 5ad0a3aca..b27c1a458 100644 --- a/Plan/src/main/java/com/djrapitops/plan/command/PlanCommand.java +++ b/Plan/src/main/java/com/djrapitops/plan/command/PlanCommand.java @@ -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 commands; +public class PlanCommand extends TreeCommand 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 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; - } - } diff --git a/Plan/src/main/java/com/djrapitops/plan/command/SubCommand.java b/Plan/src/main/java/com/djrapitops/plan/command/SubCommand.java deleted file mode 100644 index 3aabdacbc..000000000 --- a/Plan/src/main/java/com/djrapitops/plan/command/SubCommand.java +++ /dev/null @@ -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); -} diff --git a/Plan/src/main/java/com/djrapitops/plan/command/commands/AnalyzeCommand.java b/Plan/src/main/java/com/djrapitops/plan/command/commands/AnalyzeCommand.java index c9c926129..ae70ed578 100644 --- a/Plan/src/main/java/com/djrapitops/plan/command/commands/AnalyzeCommand.java +++ b/Plan/src/main/java/com/djrapitops/plan/command/commands/AnalyzeCommand.java @@ -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) { diff --git a/Plan/src/main/java/com/djrapitops/plan/command/commands/HelpCommand.java b/Plan/src/main/java/com/djrapitops/plan/command/commands/HelpCommand.java deleted file mode 100644 index 787f7d941..000000000 --- a/Plan/src/main/java/com/djrapitops/plan/command/commands/HelpCommand.java +++ /dev/null @@ -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; - } -} diff --git a/Plan/src/main/java/com/djrapitops/plan/command/commands/InfoCommand.java b/Plan/src/main/java/com/djrapitops/plan/command/commands/InfoCommand.java index 5791de27f..bbcaaf19d 100644 --- a/Plan/src/main/java/com/djrapitops/plan/command/commands/InfoCommand.java +++ b/Plan/src/main/java/com/djrapitops/plan/command/commands/InfoCommand.java @@ -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 + "" }; diff --git a/Plan/src/main/java/com/djrapitops/plan/command/commands/InspectCommand.java b/Plan/src/main/java/com/djrapitops/plan/command/commands/InspectCommand.java index 5ea81e3c7..57465bc5b 100644 --- a/Plan/src/main/java/com/djrapitops/plan/command/commands/InspectCommand.java +++ b/Plan/src/main/java/com/djrapitops/plan/command/commands/InspectCommand.java @@ -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) { diff --git a/Plan/src/main/java/com/djrapitops/plan/command/commands/ManageCommand.java b/Plan/src/main/java/com/djrapitops/plan/command/commands/ManageCommand.java index b19c650e0..b5f2eb291 100644 --- a/Plan/src/main/java/com/djrapitops/plan/command/commands/ManageCommand.java +++ b/Plan/src/main/java/com/djrapitops/plan/command/commands/ManageCommand.java @@ -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 commands; - private Plan plugin; +public class ManageCommand extends TreeCommand { /** * 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 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; - } - } diff --git a/Plan/src/main/java/com/djrapitops/plan/command/commands/QuickAnalyzeCommand.java b/Plan/src/main/java/com/djrapitops/plan/command/commands/QuickAnalyzeCommand.java index 7fede306c..0afa7db1e 100644 --- a/Plan/src/main/java/com/djrapitops/plan/command/commands/QuickAnalyzeCommand.java +++ b/Plan/src/main/java/com/djrapitops/plan/command/commands/QuickAnalyzeCommand.java @@ -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 + ""); diff --git a/Plan/src/main/java/com/djrapitops/plan/command/commands/QuickInspectCommand.java b/Plan/src/main/java/com/djrapitops/plan/command/commands/QuickInspectCommand.java index a68d2fde6..6f4299a3e 100644 --- a/Plan/src/main/java/com/djrapitops/plan/command/commands/QuickInspectCommand.java +++ b/Plan/src/main/java/com/djrapitops/plan/command/commands/QuickInspectCommand.java @@ -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(); diff --git a/Plan/src/main/java/com/djrapitops/plan/command/commands/ReloadCommand.java b/Plan/src/main/java/com/djrapitops/plan/command/commands/ReloadCommand.java index f98416f7d..ecf950e03 100644 --- a/Plan/src/main/java/com/djrapitops/plan/command/commands/ReloadCommand.java +++ b/Plan/src/main/java/com/djrapitops/plan/command/commands/ReloadCommand.java @@ -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; } diff --git a/Plan/src/main/java/com/djrapitops/plan/command/commands/SearchCommand.java b/Plan/src/main/java/com/djrapitops/plan/command/commands/SearchCommand.java index b59af8657..aead7ff87 100644 --- a/Plan/src/main/java/com/djrapitops/plan/command/commands/SearchCommand.java +++ b/Plan/src/main/java/com/djrapitops/plan/command/commands/SearchCommand.java @@ -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) { diff --git a/Plan/src/main/java/com/djrapitops/plan/command/commands/manage/ManageBackupCommand.java b/Plan/src/main/java/com/djrapitops/plan/command/commands/manage/ManageBackupCommand.java index 43d06639a..c6a317ce4 100644 --- a/Plan/src/main/java/com/djrapitops/plan/command/commands/manage/ManageBackupCommand.java +++ b/Plan/src/main/java/com/djrapitops/plan/command/commands/manage/ManageBackupCommand.java @@ -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, ""); + super("backup", CommandType.CONSOLE, Permissions.MANAGE.getPermission(), Phrase.CMD_USG_MANAGE_BACKUP + "", ""); this.plugin = plugin; } diff --git a/Plan/src/main/java/com/djrapitops/plan/command/commands/manage/ManageCleanCommand.java b/Plan/src/main/java/com/djrapitops/plan/command/commands/manage/ManageCleanCommand.java new file mode 100644 index 000000000..5431089ed --- /dev/null +++ b/Plan/src/main/java/com/djrapitops/plan/command/commands/manage/ManageCleanCommand.java @@ -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 + "", ""); + + 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; + } +} diff --git a/Plan/src/main/java/com/djrapitops/plan/command/commands/manage/ManageClearCommand.java b/Plan/src/main/java/com/djrapitops/plan/command/commands/manage/ManageClearCommand.java index fcf8e13c4..6f6cca4c6 100644 --- a/Plan/src/main/java/com/djrapitops/plan/command/commands/manage/ManageClearCommand.java +++ b/Plan/src/main/java/com/djrapitops/plan/command/commands/manage/ManageClearCommand.java @@ -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, " [-a]"); + super("clear", CommandType.CONSOLE_WITH_ARGUMENTS, Permissions.MANAGE.getPermission(), Phrase.CMD_USG_MANAGE_CLEAR + "", " [-a]"); this.plugin = plugin; } diff --git a/Plan/src/main/java/com/djrapitops/plan/command/commands/manage/ManageHelpCommand.java b/Plan/src/main/java/com/djrapitops/plan/command/commands/manage/ManageHelpCommand.java deleted file mode 100644 index ef7a3ef97..000000000 --- a/Plan/src/main/java/com/djrapitops/plan/command/commands/manage/ManageHelpCommand.java +++ /dev/null @@ -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; - } - -} diff --git a/Plan/src/main/java/com/djrapitops/plan/command/commands/manage/ManageHotswapCommand.java b/Plan/src/main/java/com/djrapitops/plan/command/commands/manage/ManageHotswapCommand.java index d9306673e..f5fc972c1 100644 --- a/Plan/src/main/java/com/djrapitops/plan/command/commands/manage/ManageHotswapCommand.java +++ b/Plan/src/main/java/com/djrapitops/plan/command/commands/manage/ManageHotswapCommand.java @@ -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, ""); + super("hotswap", CommandType.CONSOLE_WITH_ARGUMENTS, Permissions.MANAGE.getPermission(), Phrase.CMD_USG_MANAGE_HOTSWAP + "", ""); this.plugin = plugin; } diff --git a/Plan/src/main/java/com/djrapitops/plan/command/commands/manage/ManageImportCommand.java b/Plan/src/main/java/com/djrapitops/plan/command/commands/manage/ManageImportCommand.java index 503e11b3a..d41edf1a7 100644 --- a/Plan/src/main/java/com/djrapitops/plan/command/commands/manage/ManageImportCommand.java +++ b/Plan/src/main/java/com/djrapitops/plan/command/commands/manage/ManageImportCommand.java @@ -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; } diff --git a/Plan/src/main/java/com/djrapitops/plan/command/commands/manage/ManageMoveCommand.java b/Plan/src/main/java/com/djrapitops/plan/command/commands/manage/ManageMoveCommand.java index 1d165286a..53c516b89 100644 --- a/Plan/src/main/java/com/djrapitops/plan/command/commands/manage/ManageMoveCommand.java +++ b/Plan/src/main/java/com/djrapitops/plan/command/commands/manage/ManageMoveCommand.java @@ -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) { diff --git a/Plan/src/main/java/com/djrapitops/plan/command/commands/manage/ManageRemoveCommand.java b/Plan/src/main/java/com/djrapitops/plan/command/commands/manage/ManageRemoveCommand.java index 220995a77..329d46a27 100644 --- a/Plan/src/main/java/com/djrapitops/plan/command/commands/manage/ManageRemoveCommand.java +++ b/Plan/src/main/java/com/djrapitops/plan/command/commands/manage/ManageRemoveCommand.java @@ -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; } diff --git a/Plan/src/main/java/com/djrapitops/plan/command/commands/manage/ManageRestoreCommand.java b/Plan/src/main/java/com/djrapitops/plan/command/commands/manage/ManageRestoreCommand.java index aa7dad922..67eb155d3 100644 --- a/Plan/src/main/java/com/djrapitops/plan/command/commands/manage/ManageRestoreCommand.java +++ b/Plan/src/main/java/com/djrapitops/plan/command/commands/manage/ManageRestoreCommand.java @@ -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; } diff --git a/Plan/src/main/java/com/djrapitops/plan/command/commands/manage/ManageStatusCommand.java b/Plan/src/main/java/com/djrapitops/plan/command/commands/manage/ManageStatusCommand.java index 1e304be3f..9b1b31ed9 100644 --- a/Plan/src/main/java/com/djrapitops/plan/command/commands/manage/ManageStatusCommand.java +++ b/Plan/src/main/java/com/djrapitops/plan/command/commands/manage/ManageStatusCommand.java @@ -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; } diff --git a/Plan/src/main/java/com/djrapitops/plan/data/additional/AnalysisType.java b/Plan/src/main/java/com/djrapitops/plan/data/additional/AnalysisType.java index dd6cace5c..11d9d04df 100644 --- a/Plan/src/main/java/com/djrapitops/plan/data/additional/AnalysisType.java +++ b/Plan/src/main/java/com/djrapitops/plan/data/additional/AnalysisType.java @@ -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; diff --git a/Plan/src/main/java/com/djrapitops/plan/data/additional/HookHandler.java b/Plan/src/main/java/com/djrapitops/plan/data/additional/HookHandler.java index 8e949a783..34941969c 100644 --- a/Plan/src/main/java/com/djrapitops/plan/data/additional/HookHandler.java +++ b/Plan/src/main/java/com/djrapitops/plan/data/additional/HookHandler.java @@ -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. diff --git a/Plan/src/main/java/com/djrapitops/plan/data/cache/AnalysisCacheHandler.java b/Plan/src/main/java/com/djrapitops/plan/data/cache/AnalysisCacheHandler.java index 3a4567f11..47b9382fd 100644 --- a/Plan/src/main/java/com/djrapitops/plan/data/cache/AnalysisCacheHandler.java +++ b/Plan/src/main/java/com/djrapitops/plan/data/cache/AnalysisCacheHandler.java @@ -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(); + } } diff --git a/Plan/src/main/java/com/djrapitops/plan/data/cache/queue/DataCacheClearQueue.java b/Plan/src/main/java/com/djrapitops/plan/data/cache/queue/DataCacheClearQueue.java index 0cc2683a0..6d5c542f5 100644 --- a/Plan/src/main/java/com/djrapitops/plan/data/cache/queue/DataCacheClearQueue.java +++ b/Plan/src/main/java/com/djrapitops/plan/data/cache/queue/DataCacheClearQueue.java @@ -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{ if (uuids.isEmpty()) { return; } + uuids = uuids.stream().filter(u -> u != null).collect(Collectors.toList()); Log.debug("Scheduling for clear: " + uuids); try { queue.addAll(uuids); diff --git a/Plan/src/main/java/com/djrapitops/plan/data/cache/queue/Setup.java b/Plan/src/main/java/com/djrapitops/plan/data/cache/queue/Setup.java index 5421da2e3..abd55508f 100644 --- a/Plan/src/main/java/com/djrapitops/plan/data/cache/queue/Setup.java +++ b/Plan/src/main/java/com/djrapitops/plan/data/cache/queue/Setup.java @@ -8,7 +8,7 @@ package main.java.com.djrapitops.plan.data.cache.queue; */ public abstract class Setup { - private Consumer[] consumers; + private final Consumer[] consumers; /** * Constructor, defines consumers. diff --git a/Plan/src/main/java/com/djrapitops/plan/data/handling/importing/ImportUtils.java b/Plan/src/main/java/com/djrapitops/plan/data/handling/importing/ImportUtils.java index ee0d948e9..627940c0d 100644 --- a/Plan/src/main/java/com/djrapitops/plan/data/handling/importing/ImportUtils.java +++ b/Plan/src/main/java/com/djrapitops/plan/data/handling/importing/ImportUtils.java @@ -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 getImporters() { Map 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; } } diff --git a/Plan/src/main/java/com/djrapitops/plan/data/listeners/PlanCommandPreprocessListener.java b/Plan/src/main/java/com/djrapitops/plan/data/listeners/PlanCommandPreprocessListener.java index ca45864be..d068e542e 100644 --- a/Plan/src/main/java/com/djrapitops/plan/data/listeners/PlanCommandPreprocessListener.java +++ b/Plan/src/main/java/com/djrapitops/plan/data/listeners/PlanCommandPreprocessListener.java @@ -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()); } } diff --git a/Plan/src/main/java/com/djrapitops/plan/database/Container.java b/Plan/src/main/java/com/djrapitops/plan/database/Container.java new file mode 100644 index 000000000..c4bda27cf --- /dev/null +++ b/Plan/src/main/java/com/djrapitops/plan/database/Container.java @@ -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 + */ +public class Container { + 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; + } +} diff --git a/Plan/src/main/java/com/djrapitops/plan/database/DBUtils.java b/Plan/src/main/java/com/djrapitops/plan/database/DBUtils.java new file mode 100644 index 000000000..12a25e8db --- /dev/null +++ b/Plan/src/main/java/com/djrapitops/plan/database/DBUtils.java @@ -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 List>> splitIntoBatches(Map> objects) { + int batchSize = 2048; + List>> wrappedBatches = new ArrayList<>(); + + int i = 0; + int j = 0; + + for (Entry> 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; + } +} diff --git a/Plan/src/main/java/com/djrapitops/plan/database/databases/SQLDB.java b/Plan/src/main/java/com/djrapitops/plan/database/databases/SQLDB.java index 61cf46be9..eb385f00c 100644 --- a/Plan/src/main/java/com/djrapitops/plan/database/databases/SQLDB.java +++ b/Plan/src/main/java/com/djrapitops/plan/database/databases/SQLDB.java @@ -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); } diff --git a/Plan/src/main/java/com/djrapitops/plan/database/tables/CommandUseTable.java b/Plan/src/main/java/com/djrapitops/plan/database/tables/CommandUseTable.java index 0bf97334b..bb867d73f 100644 --- a/Plan/src/main/java/com/djrapitops/plan/database/tables/CommandUseTable.java +++ b/Plan/src/main/java/com/djrapitops/plan/database/tables/CommandUseTable.java @@ -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 commandUse = getCommandUse(); + removeAllData(); + saveCommandUse(commandUse); + Plan.getInstance().getHandler().getCommandUseFromDb(); + } } diff --git a/Plan/src/main/java/com/djrapitops/plan/database/tables/SessionsTable.java b/Plan/src/main/java/com/djrapitops/plan/database/tables/SessionsTable.java index 10e9ddc23..828149ae7 100644 --- a/Plan/src/main/java/com/djrapitops/plan/database/tables/SessionsTable.java +++ b/Plan/src/main/java/com/djrapitops/plan/database/tables/SessionsTable.java @@ -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> saved = getSessionData(sessions.keySet()); + for (Integer id : sessions.keySet()) { + List sessionList = sessions.get(id); + List s = saved.get(id); + if (s != null) { + sessionList.removeAll(s); + } + if (sessionList.isEmpty()) { + continue; + } + saved.put(id, sessionList); + } + List>> batches = splitIntoBatches(sessions); + for (List> batch : batches) { + saveSessionBatch(batch); + } + Benchmark.stop("Save Sessions multiple " + sessions.size()); + } + + private void saveSessionBatch(List> 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 sessionList = sessions.get(id); - List s = saved.get(id); - if (s != null) { - sessionList.removeAll(s); - } - if (sessionList.isEmpty()) { + for (Container 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 loginTimes = db.getUsersTable().getLoginTimes(); + Map> 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 beforeM = new HashMap<>(); + Map afterM = new HashMap<>(); + for (Integer id : allSessions.keySet()) { + List 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 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 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."); + } } diff --git a/Plan/src/main/java/com/djrapitops/plan/database/tables/Table.java b/Plan/src/main/java/com/djrapitops/plan/database/tables/Table.java index 7f89063e6..1d040a11c 100644 --- a/Plan/src/main/java/com/djrapitops/plan/database/tables/Table.java +++ b/Plan/src/main/java/com/djrapitops/plan/database/tables/Table.java @@ -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 List>> splitIntoBatches(Map> objects) { + return DBUtils.splitIntoBatches(objects); + } } diff --git a/Plan/src/main/java/com/djrapitops/plan/database/tables/UsersTable.java b/Plan/src/main/java/com/djrapitops/plan/database/tables/UsersTable.java index 1843dc459..aa3671305 100644 --- a/Plan/src/main/java/com/djrapitops/plan/database/tables/UsersTable.java +++ b/Plan/src/main/java/com/djrapitops/plan/database/tables/UsersTable.java @@ -330,7 +330,7 @@ public class UsersTable extends Table { List containsBukkitData = getContainsBukkitData(uuids); List datas = new ArrayList<>(); datas.addAll(getUserDataForKnown(containsBukkitData)); - + uuids.removeAll(containsBukkitData); if (!uuids.isEmpty()) { List 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 getLoginTimes() throws SQLException { + Benchmark.start("Get Logintimes"); + PreparedStatement statement = null; + ResultSet set = null; + try { + Map 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 getLoginTimes(Collection uuids) { + //TODO + return new HashMap<>(); + } } diff --git a/Plan/src/main/java/com/djrapitops/plan/ui/graphs/PlayerActivityGraphCreator.java b/Plan/src/main/java/com/djrapitops/plan/ui/graphs/PlayerActivityGraphCreator.java index 88fdd1734..f60c0ca36 100644 --- a/Plan/src/main/java/com/djrapitops/plan/ui/graphs/PlayerActivityGraphCreator.java +++ b/Plan/src/main/java/com/djrapitops/plan/ui/graphs/PlayerActivityGraphCreator.java @@ -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) { diff --git a/Plan/src/main/java/com/djrapitops/plan/ui/graphs/PunchCardGraphCreator.java b/Plan/src/main/java/com/djrapitops/plan/ui/graphs/PunchCardGraphCreator.java index dccdf5973..4b700d415 100644 --- a/Plan/src/main/java/com/djrapitops/plan/ui/graphs/PunchCardGraphCreator.java +++ b/Plan/src/main/java/com/djrapitops/plan/ui/graphs/PunchCardGraphCreator.java @@ -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]; diff --git a/Plan/src/main/java/com/djrapitops/plan/ui/webserver/Response.java b/Plan/src/main/java/com/djrapitops/plan/ui/webserver/Response.java index e384eb118..ca9cb77f0 100644 --- a/Plan/src/main/java/com/djrapitops/plan/ui/webserver/Response.java +++ b/Plan/src/main/java/com/djrapitops/plan/ui/webserver/Response.java @@ -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) { diff --git a/Plan/src/main/java/com/djrapitops/plan/utilities/Benchmark.java b/Plan/src/main/java/com/djrapitops/plan/utilities/Benchmark.java index a766efa96..4b9bb2b17 100644 --- a/Plan/src/main/java/com/djrapitops/plan/utilities/Benchmark.java +++ b/Plan/src/main/java/com/djrapitops/plan/utilities/Benchmark.java @@ -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 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; } } diff --git a/Plan/src/main/java/com/djrapitops/plan/utilities/FormatUtils.java b/Plan/src/main/java/com/djrapitops/plan/utilities/FormatUtils.java index 3ad9b1ca2..ba9a96256 100644 --- a/Plan/src/main/java/com/djrapitops/plan/utilities/FormatUtils.java +++ b/Plan/src/main/java/com/djrapitops/plan/utilities/FormatUtils.java @@ -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); } /** diff --git a/Plan/src/main/java/com/djrapitops/plan/utilities/HtmlUtils.java b/Plan/src/main/java/com/djrapitops/plan/utilities/HtmlUtils.java index 2947a7c63..b4a47587f 100644 --- a/Plan/src/main/java/com/djrapitops/plan/utilities/HtmlUtils.java +++ b/Plan/src/main/java/com/djrapitops/plan/utilities/HtmlUtils.java @@ -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; } diff --git a/Plan/src/main/java/com/djrapitops/plan/utilities/ManageUtils.java b/Plan/src/main/java/com/djrapitops/plan/utilities/ManageUtils.java index 3b6913932..743d7f25b 100644 --- a/Plan/src/main/java/com/djrapitops/plan/utilities/ManageUtils.java +++ b/Plan/src/main/java/com/djrapitops/plan/utilities/ManageUtils.java @@ -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 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 sessions) { + return containsCombinable(sessions, 5000); + } + + private static boolean containsCombinable(List 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 combineSessions(List sessions, Integer loginTimes) { + return combineSessions(sessions, loginTimes, 5000); + } + + private static List combineSessions(List sessions, Integer loginTimes, int threshold) { + if (threshold >= 35000) { + return sessions; + } + List newSessions = new ArrayList<>(); + List removed = new ArrayList<>(); + Iterator iterator = sessions.iterator(); + while (iterator.hasNext()) { + SessionData session = iterator.next(); + if (removed.contains(session)) { + continue; + } + List 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; + } + } } diff --git a/Plan/src/main/java/com/djrapitops/plan/utilities/MiscUtils.java b/Plan/src/main/java/com/djrapitops/plan/utilities/MiscUtils.java index 486586fd7..56bc86fff 100644 --- a/Plan/src/main/java/com/djrapitops/plan/utilities/MiscUtils.java +++ b/Plan/src/main/java/com/djrapitops/plan/utilities/MiscUtils.java @@ -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 diff --git a/Plan/src/main/java/com/djrapitops/plan/utilities/analysis/Analysis.java b/Plan/src/main/java/com/djrapitops/plan/utilities/analysis/Analysis.java index 7512750f7..9c63bac6f 100644 --- a/Plan/src/main/java/com/djrapitops/plan/utilities/analysis/Analysis.java +++ b/Plan/src/main/java/com/djrapitops/plan/utilities/analysis/Analysis.java @@ -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; + } } diff --git a/Plan/src/main/java/com/djrapitops/plan/utilities/analysis/ExportUtility.java b/Plan/src/main/java/com/djrapitops/plan/utilities/analysis/ExportUtility.java index 408b4de54..af2b06475 100644 --- a/Plan/src/main/java/com/djrapitops/plan/utilities/analysis/ExportUtility.java +++ b/Plan/src/main/java/com/djrapitops/plan/utilities/analysis/ExportUtility.java @@ -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(); } diff --git a/Plan/src/main/java/com/djrapitops/plan/utilities/uuid/UUIDFetcher.java b/Plan/src/main/java/com/djrapitops/plan/utilities/uuid/UUIDFetcher.java deleted file mode 100644 index 065121303..000000000 --- a/Plan/src/main/java/com/djrapitops/plan/utilities/uuid/UUIDFetcher.java +++ /dev/null @@ -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> { - - 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 names; - private final boolean rateLimiting; - - /** - * - * @param names - * @param rateLimiting - */ - public UUIDFetcher(List names, boolean rateLimiting) { - this.names = ImmutableList.copyOf(names); - this.rateLimiting = rateLimiting; - } - - /** - * - * @param names - */ - public UUIDFetcher(List names) { - this(names, true); - } - - @Override - public Map call() throws Exception { - Map 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); - } -} diff --git a/Plan/src/main/java/com/djrapitops/plan/utilities/uuid/UUIDUtility.java b/Plan/src/main/java/com/djrapitops/plan/utilities/uuid/UUIDUtility.java index 148d4a362..5fcdfedfa 100644 --- a/Plan/src/main/java/com/djrapitops/plan/utilities/uuid/UUIDUtility.java +++ b/Plan/src/main/java/com/djrapitops/plan/utilities/uuid/UUIDUtility.java @@ -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; diff --git a/Plan/src/main/resources/analysis.html b/Plan/src/main/resources/analysis.html index d2510367f..08eb6f426 100644 --- a/Plan/src/main/resources/analysis.html +++ b/Plan/src/main/resources/analysis.html @@ -282,7 +282,7 @@ header p {
- Player Analytics | Analysis + Player Analytics | Analysis

Player Analytics v.%version%

%servername% | Server Analysis

@@ -498,7 +498,7 @@ header p { -

Unique Playes: %uniquejoinsmonth% | Unique/Day: %avguniquejoinsmonth%

+

Unique Players: %uniquejoinsmonth% | Unique/Day: %avguniquejoinsmonth%

@@ -766,6 +766,9 @@ header p {
- + - +