Merge pull request #579 from Rsl1122/4.3.0

PR for 4.3.0
This commit is contained in:
Rsl1122 2018-05-24 16:58:53 +03:00 committed by GitHub
commit 07bea8d800
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
123 changed files with 2748 additions and 853 deletions

View File

@ -5,7 +5,7 @@ before_install:
- pwd
- cd PlanPluginBridge
- ls
- mvn install:install-file -Dfile=/home/travis/build/Rsl1122/Plan-PlayerAnalytics/PlanPluginBridge/PlanPluginBridge-4.2.0.jar -DpomFile=/home/travis/build/Rsl1122/Plan-PlayerAnalytics/PlanPluginBridge/pom.xml
- mvn install:install-file -Dfile=/home/travis/build/Rsl1122/Plan-PlayerAnalytics/PlanPluginBridge/PlanPluginBridge-4.3.0.jar -DpomFile=/home/travis/build/Rsl1122/Plan-PlayerAnalytics/PlanPluginBridge/pom.xml
- cd ../Plan
- ls
install:

View File

@ -3,7 +3,7 @@
<modelVersion>4.0.0</modelVersion>
<groupId>com.djrapitops</groupId>
<artifactId>Plan</artifactId>
<version>4.2.0-SNAPSHOT</version>
<version>4.3.0-SNAPSHOT</version>
<build>
<sourceDirectory>${basedir}/src/main/java</sourceDirectory>
<testSourceDirectory>${basedir}/src/test/java</testSourceDirectory>
@ -19,6 +19,7 @@
<include>**/*.html</include>
<include>**/*.js</include>
<include>**/*.css</include>
<include>locale/*.txt</include>
</includes>
<excludes>
<exclude>licence.yml</exclude>
@ -62,6 +63,15 @@
<exclude>junit:*</exclude>
</excludes>
</artifactSet>
<relocations>
<relocation>
<pattern>org.apache</pattern>
<shadedPattern>plan.org.apache</shadedPattern>
<excludes>
<exclude>org.apache.logging.*</exclude>
</excludes>
</relocation>
</relocations>
</configuration>
</plugin>
<plugin>
@ -164,7 +174,11 @@
<groupId>org.slf4j</groupId>
</exclusion>
<exclusion>
<artifactId>asm-all</artifactId>
<artifactId>asm</artifactId>
<groupId>org.ow2.asm</groupId>
</exclusion>
<exclusion>
<artifactId>asm-commons</artifactId>
<groupId>org.ow2.asm</groupId>
</exclusion>
</exclusions>
@ -260,7 +274,7 @@
<dependency>
<groupId>org.spongepowered</groupId>
<artifactId>spongeapi</artifactId>
<version>7.0.0</version>
<version>LATEST</version>
<scope>provided</scope>
<exclusions>
<exclusion>
@ -303,10 +317,6 @@
<artifactId>flow-noise</artifactId>
<groupId>com.flowpowered</groupId>
</exclusion>
<exclusion>
<artifactId>asm</artifactId>
<groupId>org.ow2.asm</groupId>
</exclusion>
<exclusion>
<artifactId>slf4j-api</artifactId>
<groupId>org.slf4j</groupId>
@ -315,6 +325,10 @@
<artifactId>jsr305</artifactId>
<groupId>com.google.code.findbugs</groupId>
</exclusion>
<exclusion>
<artifactId>asm</artifactId>
<groupId>org.ow2.asm</groupId>
</exclusion>
<exclusion>
<artifactId>gson</artifactId>
<groupId>com.google.code.gson</groupId>

View File

@ -4,7 +4,7 @@
<modelVersion>4.0.0</modelVersion>
<groupId>com.djrapitops</groupId>
<artifactId>Plan</artifactId>
<version>4.2.0-SNAPSHOT</version>
<version>4.3.0-SNAPSHOT</version>
<packaging>jar</packaging>
<repositories>
<repository>
@ -29,13 +29,13 @@
<dependency>
<groupId>com.djrapitops</groupId>
<artifactId>AbstractPluginFramework</artifactId>
<version>3.1.1</version>
<version>3.2.0</version>
</dependency>
<!-- SoftDepended Plugins -->
<dependency>
<groupId>com.djrapitops</groupId>
<artifactId>PlanPluginBridge</artifactId>
<version>4.2.0-SNAPSHOT</version>
<version>4.3.0-SNAPSHOT</version>
</dependency>
<!-- Paper API -->
<dependency>
@ -70,15 +70,14 @@
<dependency>
<groupId>org.spongepowered</groupId>
<artifactId>spongeapi</artifactId>
<version>7.0.0</version>
<version>LATEST</version>
<type>jar</type>
<scope>provided</scope>
</dependency>
<!-- StringUtils lang3 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.6</version>
<artifactId>commons-text</artifactId>
<version>1.3</version>
</dependency>
<!-- Geo IP -->
<dependency>
@ -149,6 +148,7 @@
<include>**/*.html</include>
<include>**/*.js</include>
<include>**/*.css</include>
<include>locale/*.txt</include>
</includes>
<excludes>
<exclude>licence.yml</exclude>
@ -192,6 +192,15 @@
<exclude>junit:*</exclude>
</excludes>
</artifactSet>
<relocations>
<relocation>
<pattern>org.apache</pattern>
<shadedPattern>plan.org.apache</shadedPattern>
<excludes>
<exclude>org.apache.logging.*</exclude>
</excludes>
</relocation>
</relocations>
</configuration>
</plugin>
<plugin>

View File

@ -1,6 +1,7 @@
package com.djrapitops.plan;
import com.djrapitops.plan.api.exceptions.EnableException;
import com.djrapitops.plan.command.PlanCommand;
import com.djrapitops.plan.system.SpongeSystem;
import com.djrapitops.plan.system.settings.locale.Locale;
import com.djrapitops.plan.system.settings.locale.Msg;
@ -22,7 +23,7 @@ import org.spongepowered.api.plugin.Plugin;
import java.io.File;
import java.io.InputStream;
@Plugin(id = "plan", name = "Plan", version = "4.2.0")
@Plugin(id = "plan", name = "Plan", version = "4.3.0", description = "Player Analytics Plugin by Rsl1122", authors = {"Rsl1122"})
public class PlanSponge extends SpongePlugin implements PlanPlugin {
@Inject
@ -67,6 +68,7 @@ public class PlanSponge extends SpongePlugin implements PlanPlugin {
Log.error("This error should be reported at https://github.com/Rsl1122/Plan-PlayerAnalytics/issues");
onDisable();
}
registerCommand("plan", new PlanCommand(this));
}
@Override
@ -90,7 +92,6 @@ public class PlanSponge extends SpongePlugin implements PlanPlugin {
return PlanColorScheme.create();
}
@Override
public void onReload() {
@ -102,29 +103,8 @@ public class PlanSponge extends SpongePlugin implements PlanPlugin {
}
@Override
public void log(String level, String msg) {
switch (level.toUpperCase()) {
case "INFO_COLOR":
case "INFO":
case "I":
logger.info(msg);
break;
case "W":
case "WARN":
case "WARNING":
logger.warn(msg);
break;
case "E":
case "ERR":
case "ERROR":
case "SEVERE":
logger.error(msg);
break;
default:
logger.info(msg);
break;
}
public Logger getLogger() {
return logger;
}
@Override
@ -134,7 +114,7 @@ public class PlanSponge extends SpongePlugin implements PlanPlugin {
@Override
public String getVersion() {
return "4.2.0";
return "4.2.1";
}
public SpongeSystem getSystem() {

View File

@ -6,8 +6,9 @@ import com.djrapitops.plan.command.commands.manage.ManageConDebugCommand;
import com.djrapitops.plan.system.settings.Permissions;
import com.djrapitops.plan.system.settings.locale.Locale;
import com.djrapitops.plan.system.settings.locale.Msg;
import com.djrapitops.plugin.command.CommandNode;
import com.djrapitops.plugin.command.CommandType;
import com.djrapitops.plugin.command.TreeCommand;
import com.djrapitops.plugin.command.TreeCmdNode;
import com.djrapitops.plugin.command.defaultcmds.StatusCommand;
/**
@ -18,7 +19,7 @@ import com.djrapitops.plugin.command.defaultcmds.StatusCommand;
* @author Rsl1122
* @since 1.0.0
*/
public class PlanBungeeCommand extends TreeCommand<PlanBungee> {
public class PlanBungeeCommand extends TreeCmdNode {
/**
* CommandExecutor class Constructor.
@ -28,31 +29,28 @@ public class PlanBungeeCommand extends TreeCommand<PlanBungee> {
* @param plugin Current instance of Plan
*/
public PlanBungeeCommand(PlanBungee plugin) {
super(plugin, "planbungee", CommandType.CONSOLE, Permissions.MANAGE.getPermission(), "", "planbungee");
super.setDefaultCommand("help");
super("planbungee", Permissions.MANAGE.getPermission(), CommandType.CONSOLE, null);
super.setColorScheme(plugin.getColorScheme());
}
setInDepthHelp(Locale.get(Msg.CMD_HELP_PLAN).toArray());
@Override
public String[] addHelp() {
return Locale.get(Msg.CMD_HELP_PLAN).toArray();
}
@Override
public void addCommands() {
add(
new ReloadCommand(plugin),
new StatusCommand<>(plugin, Permissions.MANAGE.getPermission(), plugin.getColorScheme()),
new ListCommand(),
new BungeeSetupToggleCommand()
);
RegisterCommand registerCommand = new RegisterCommand();
add(
registerCommand,
new WebUserCommand(plugin, registerCommand),
new NetworkCommand(),
new ListServersCommand(plugin),
new ManageConDebugCommand()
setNodeGroups(
new CommandNode[]{
new NetworkCommand(),
new ListServersCommand(plugin),
new ListCommand(),
},
new CommandNode[]{
registerCommand,
new WebUserCommand(plugin, registerCommand, this),
},
new CommandNode[]{
new ManageConDebugCommand(),
new BungeeSetupToggleCommand(),
new ReloadCommand(plugin),
new StatusCommand<>(plugin, Permissions.MANAGE.getPermission(), plugin.getColorScheme()),
// (Settings.ALLOW_UPDATE.isTrue() ? new UpdateCommand() : null)
}
);
}
}

View File

@ -1,13 +1,14 @@
package com.djrapitops.plan.command;
import com.djrapitops.plan.Plan;
import com.djrapitops.plan.PlanPlugin;
import com.djrapitops.plan.command.commands.*;
import com.djrapitops.plan.system.settings.Permissions;
import com.djrapitops.plan.system.settings.Settings;
import com.djrapitops.plan.system.settings.locale.Locale;
import com.djrapitops.plan.system.settings.locale.Msg;
import com.djrapitops.plugin.command.CommandNode;
import com.djrapitops.plugin.command.CommandType;
import com.djrapitops.plugin.command.TreeCommand;
import com.djrapitops.plugin.command.TreeCmdNode;
import com.djrapitops.plugin.command.defaultcmds.StatusCommand;
/**
@ -18,41 +19,37 @@ import com.djrapitops.plugin.command.defaultcmds.StatusCommand;
* @author Rsl1122
* @since 1.0.0
*/
public class PlanCommand extends TreeCommand<Plan> {
public class PlanCommand extends TreeCmdNode {
public PlanCommand(Plan plugin) {
super(plugin, "plan", CommandType.CONSOLE, "", "", "plan");
public PlanCommand(PlanPlugin plugin) {
super("plan", "", CommandType.CONSOLE, null);
super.setDefaultCommand("inspect");
super.setColorScheme(plugin.getColorScheme());
}
setInDepthHelp(Locale.get(Msg.CMD_HELP_PLAN).toArray());
@Override
public String[] addHelp() {
return Locale.get(Msg.CMD_HELP_PLAN).toArray();
}
@Override
public void addCommands() {
add(
new InspectCommand(),
new QInspectCommand(plugin),
new AnalyzeCommand(),
new SearchCommand(),
new InfoCommand(plugin),
new ReloadCommand(plugin),
new ManageCommand(plugin),
new StatusCommand<>(plugin, Permissions.MANAGE.getPermission(), plugin.getColorScheme()),
new ListCommand()
);
RegisterCommand registerCommand = new RegisterCommand();
add(
registerCommand,
new WebUserCommand(plugin, registerCommand),
new NetworkCommand(),
new ListServersCommand(plugin));
if (Settings.DEV_MODE.isTrue()) {
add(new DevCommand());
}
setNodeGroups(
new CommandNode[]{
new InspectCommand(),
new QInspectCommand(plugin),
new SearchCommand(),
new ListCommand(),
new AnalyzeCommand(),
new NetworkCommand(),
new ListServersCommand(plugin)
},
new CommandNode[]{
new WebUserCommand(plugin, registerCommand, this),
registerCommand
},
new CommandNode[]{
new InfoCommand(plugin),
new ReloadCommand(plugin),
new ManageCommand(plugin, this),
new StatusCommand<>(plugin, Permissions.MANAGE.getPermission(), plugin.getColorScheme()),
(Settings.DEV_MODE.isTrue() ? new DevCommand() : null),
// (Settings.ALLOW_UPDATE.isTrue() ? new UpdateCommand() : null)
}
);
}
}

View File

@ -14,10 +14,10 @@ import com.djrapitops.plan.system.settings.locale.Msg;
import com.djrapitops.plan.system.webserver.WebServerSystem;
import com.djrapitops.plan.utilities.analysis.Analysis;
import com.djrapitops.plugin.api.utility.log.Log;
import com.djrapitops.plugin.command.CommandNode;
import com.djrapitops.plugin.command.CommandType;
import com.djrapitops.plugin.command.CommandUtils;
import com.djrapitops.plugin.command.ISender;
import com.djrapitops.plugin.command.SubCommand;
import org.bukkit.ChatColor;
import java.util.Map;
@ -30,23 +30,17 @@ import java.util.UUID;
* @author Rsl1122
* @since 2.0.0
*/
public class AnalyzeCommand extends SubCommand {
public class AnalyzeCommand extends CommandNode {
public AnalyzeCommand() {
super("analyze, analyse, analysis, a",
CommandType.CONSOLE,
Permissions.ANALYZE.getPermission(),
Locale.get(Msg.CMD_USG_ANALYZE).parse(),
"[ServerName or ID]");
super("analyze|analyse|analysis|a", Permissions.ANALYZE.getPermission(), CommandType.CONSOLE);
setShortHelp(Locale.get(Msg.CMD_USG_ANALYZE).parse());
setInDepthHelp(Locale.get(Msg.CMD_HELP_ANALYZE).toArray());
setArguments("[server/id]");
}
@Override
public String[] addHelp() {
return Locale.get(Msg.CMD_HELP_ANALYZE).toArray();
}
@Override
public boolean onCommand(ISender sender, String commandLabel, String[] args) {
public void onCommand(ISender sender, String commandLabel, String[] args) {
sender.sendMessage(Locale.get(Msg.CMD_INFO_FETCH_DATA).toString());
Processing.submitNonCritical(() -> {
@ -63,7 +57,6 @@ public class AnalyzeCommand extends SubCommand {
Log.toLog(this.getClass(), e);
}
});
return true;
}
private void sendLink(Server server, ISender sender) {

View File

@ -6,25 +6,26 @@ package com.djrapitops.plan.command.commands;
import com.djrapitops.plan.system.info.connection.ConnectionSystem;
import com.djrapitops.plan.system.settings.Permissions;
import com.djrapitops.plugin.command.CommandNode;
import com.djrapitops.plugin.command.CommandType;
import com.djrapitops.plugin.command.ISender;
import com.djrapitops.plugin.command.SubCommand;
/**
* Command for Toggling whether or not BungeeCord accepts set up requests.
*
* <p>
* This was added as a security measure against unwanted MySQL snooping.
*
* @author Rsl1122
*/
public class BungeeSetupToggleCommand extends SubCommand {
public class BungeeSetupToggleCommand extends CommandNode {
public BungeeSetupToggleCommand() {
super("setup", CommandType.ALL, Permissions.MANAGE.getPermission(), "Toggle Setup mode for Bungee");
super("setup", Permissions.MANAGE.getPermission(), CommandType.ALL);
setShortHelp("Toggle Setup mode for Bungee");
}
@Override
public boolean onCommand(ISender sender, String s, String[] strings) {
public void onCommand(ISender sender, String s, String[] strings) {
boolean setupAllowed = ConnectionSystem.isSetupAllowed();
ConnectionSystem connectionSystem = ConnectionSystem.getInstance();
@ -35,6 +36,5 @@ public class BungeeSetupToggleCommand extends SubCommand {
}
String msg = !setupAllowed ? "§aSet-up is now Allowed" : "§cSet-up is now Forbidden";
sender.sendMessage(msg);
return true;
}
}

View File

@ -8,25 +8,27 @@ import com.djrapitops.plan.system.info.connection.ConnectionSystem;
import com.djrapitops.plan.system.settings.locale.Locale;
import com.djrapitops.plan.system.settings.locale.Msg;
import com.djrapitops.plan.utilities.Condition;
import com.djrapitops.plugin.command.CommandNode;
import com.djrapitops.plugin.command.CommandType;
import com.djrapitops.plugin.command.ISender;
import com.djrapitops.plugin.command.SubCommand;
/**
* Command used for testing functions that are too difficult to unit test.
*
* @author Rsl1122
*/
public class DevCommand extends SubCommand {
public class DevCommand extends CommandNode {
public DevCommand() {
super("dev", CommandType.PLAYER_OR_ARGS, "plan.*", "Test Plugin functions not testable with unit tests.", "<feature to test>");
super("dev", "plan.*", CommandType.PLAYER_OR_ARGS);
setShortHelp("Test Plugin functions not testable with unit tests.");
setArguments("<feature>");
}
@Override
public boolean onCommand(ISender sender, String cmd, String[] args) {
public void onCommand(ISender sender, String cmd, String[] args) {
if (!Condition.isTrue(args.length >= 1, Locale.get(Msg.CMD_FAIL_REQ_ONE_ARG).toString(), sender)) {
return true;
return;
}
String feature = args[0];
switch (feature) {
@ -45,6 +47,5 @@ public class DevCommand extends SubCommand {
default:
break;
}
return true;
}
}

View File

@ -1,14 +1,14 @@
package com.djrapitops.plan.command.commands;
import com.djrapitops.plan.Plan;
import com.djrapitops.plan.PlanPlugin;
import com.djrapitops.plan.system.database.databases.Database;
import com.djrapitops.plan.system.settings.Permissions;
import com.djrapitops.plan.system.settings.locale.Locale;
import com.djrapitops.plan.system.settings.locale.Msg;
import com.djrapitops.plan.system.update.VersionCheckSystem;
import com.djrapitops.plugin.command.CommandNode;
import com.djrapitops.plugin.command.CommandType;
import com.djrapitops.plugin.command.ISender;
import com.djrapitops.plugin.command.SubCommand;
import com.djrapitops.plugin.settings.ColorScheme;
/**
@ -17,21 +17,18 @@ import com.djrapitops.plugin.settings.ColorScheme;
* @author Rsl1122
* @since 2.0.0
*/
public class InfoCommand extends SubCommand {
public class InfoCommand extends CommandNode {
private final Plan plugin;
public InfoCommand(Plan plugin) {
super("info",
CommandType.CONSOLE,
Permissions.INFO.getPermission(),
Locale.get(Msg.CMD_USG_INFO).toString());
private final PlanPlugin plugin;
public InfoCommand(PlanPlugin plugin) {
super("info", Permissions.INFO.getPermission(), CommandType.CONSOLE);
setShortHelp(Locale.get(Msg.CMD_USG_INFO).toString());
this.plugin = plugin;
}
@Override
public boolean onCommand(ISender sender, String commandLabel, String[] args) {
public void onCommand(ISender sender, String commandLabel, String[] args) {
ColorScheme cs = plugin.getColorScheme();
String mColor = cs.getMainColor();
String sColor = cs.getSecondaryColor();
@ -41,13 +38,12 @@ public class InfoCommand extends SubCommand {
String upToDate = VersionCheckSystem.isNewVersionAvailable() ? "Update Available" : "Up to date";
String[] messages = {
Locale.get(Msg.CMD_HEADER_INFO).toString(),
ball + mColor + " Version: " + sColor + plugin.getDescription().getVersion(),
ball + mColor + " Version: " + sColor + plugin.getVersion(),
ball + mColor + " Up to date: " + sColor + upToDate,
ball + mColor + " Active Database: " + tColor + Database.getActive().getConfigName(),
Locale.get(Msg.CMD_CONSTANT_FOOTER).toString()
};
sender.sendMessage(messages);
return true;
}
}

View File

@ -13,10 +13,10 @@ import com.djrapitops.plan.utilities.Condition;
import com.djrapitops.plan.utilities.MiscUtils;
import com.djrapitops.plan.utilities.uuid.UUIDUtility;
import com.djrapitops.plugin.api.utility.log.Log;
import com.djrapitops.plugin.command.CommandNode;
import com.djrapitops.plugin.command.CommandType;
import com.djrapitops.plugin.command.CommandUtils;
import com.djrapitops.plugin.command.ISender;
import com.djrapitops.plugin.command.SubCommand;
import com.djrapitops.plugin.task.AbsRunnable;
import com.djrapitops.plugin.task.RunnableFactory;
import com.djrapitops.plugin.utilities.Verify;
@ -30,27 +30,20 @@ import java.util.UUID;
* @author Rsl1122
* @since 1.0.0
*/
public class InspectCommand extends SubCommand {
public class InspectCommand extends CommandNode {
public InspectCommand() {
super("inspect",
CommandType.PLAYER_OR_ARGS,
Permissions.INSPECT.getPermission(),
Locale.get(Msg.CMD_USG_INSPECT).toString(),
"<player>");
super("inspect", Permissions.INSPECT.getPermission(), CommandType.PLAYER_OR_ARGS);
setArguments("<player>");
setShortHelp(Locale.get(Msg.CMD_USG_INSPECT).toString());
setInDepthHelp(Locale.get(Msg.CMD_HELP_INSPECT).toArray());
}
@Override
public String[] addHelp() {
return Locale.get(Msg.CMD_HELP_INSPECT).toArray();
}
@Override
public boolean onCommand(ISender sender, String commandLabel, String[] args) {
public void onCommand(ISender sender, String commandLabel, String[] args) {
String playerName = MiscUtils.getPlayerName(args, sender);
runInspectTask(playerName, sender);
return true;
}
private void runInspectTask(String playerName, ISender sender) {

View File

@ -4,10 +4,10 @@ import com.djrapitops.plan.system.info.connection.ConnectionSystem;
import com.djrapitops.plan.system.settings.Permissions;
import com.djrapitops.plan.system.settings.locale.Locale;
import com.djrapitops.plan.system.settings.locale.Msg;
import com.djrapitops.plugin.command.CommandNode;
import com.djrapitops.plugin.command.CommandType;
import com.djrapitops.plugin.command.CommandUtils;
import com.djrapitops.plugin.command.ISender;
import com.djrapitops.plugin.command.SubCommand;
/**
* Command used to display url to the player list page.
@ -15,22 +15,17 @@ import com.djrapitops.plugin.command.SubCommand;
* @author Rsl1122
* @since 3.5.2
*/
public class ListCommand extends SubCommand {
public class ListCommand extends CommandNode {
public ListCommand() {
super("list, pl, playerlist, players", CommandType.CONSOLE, Permissions.INSPECT_OTHER.getPermission(), Locale.get(Msg.CMD_USG_LIST).toString(), "");
super("players|pl|playerlist|list", Permissions.INSPECT_OTHER.getPermission(), CommandType.CONSOLE);
setShortHelp(Locale.get(Msg.CMD_USG_LIST).toString());
setInDepthHelp(Locale.get(Msg.CMD_HELP_LIST).toArray());
}
@Override
public String[] addHelp() {
return Locale.get(Msg.CMD_HELP_LIST).toArray();
}
@Override
public boolean onCommand(ISender sender, String commandLabel, String[] args) {
public void onCommand(ISender sender, String commandLabel, String[] args) {
sendListMsg(sender);
return true;
}
private void sendListMsg(ISender sender) {

View File

@ -8,9 +8,9 @@ import com.djrapitops.plan.system.settings.Permissions;
import com.djrapitops.plan.system.settings.locale.Locale;
import com.djrapitops.plan.system.settings.locale.Msg;
import com.djrapitops.plugin.api.utility.log.Log;
import com.djrapitops.plugin.command.CommandNode;
import com.djrapitops.plugin.command.CommandType;
import com.djrapitops.plugin.command.ISender;
import com.djrapitops.plugin.command.SubCommand;
import com.djrapitops.plugin.settings.ColorScheme;
import java.util.List;
@ -20,21 +20,19 @@ import java.util.List;
*
* @author Rsl1122
*/
public class ListServersCommand extends SubCommand {
public class ListServersCommand extends CommandNode {
private final PlanPlugin plugin;
public ListServersCommand(PlanPlugin plugin) {
super("servers, serverlist, listservers, sl",
CommandType.CONSOLE,
Permissions.MANAGE.getPermission(),
"List servers in the network");
super("servers|serverlist|listservers|sl|ls", Permissions.MANAGE.getPermission(), CommandType.CONSOLE);
setShortHelp("List servers in the network");
this.plugin = plugin;
}
@Override
public boolean onCommand(ISender sender, String commandLabel, String[] args) {
public void onCommand(ISender sender, String commandLabel, String[] args) {
ColorScheme colorScheme = plugin.getColorScheme();
String mCol = colorScheme.getMainColor();
String sCol = colorScheme.getSecondaryColor();
@ -50,7 +48,6 @@ public class ListServersCommand extends SubCommand {
sender.sendMessage("§cDatabase Exception occurred.");
Log.toLog(this.getClass(), e);
}
return true;
}
}

View File

@ -1,12 +1,13 @@
package com.djrapitops.plan.command.commands;
import com.djrapitops.plan.Plan;
import com.djrapitops.plan.PlanPlugin;
import com.djrapitops.plan.command.commands.manage.*;
import com.djrapitops.plan.system.settings.Permissions;
import com.djrapitops.plan.system.settings.locale.Locale;
import com.djrapitops.plan.system.settings.locale.Msg;
import com.djrapitops.plugin.command.CommandNode;
import com.djrapitops.plugin.command.CommandType;
import com.djrapitops.plugin.command.TreeCommand;
import com.djrapitops.plugin.command.TreeCmdNode;
/**
* This SubCommand is used to manage the the plugin's database and components.
@ -14,31 +15,28 @@ import com.djrapitops.plugin.command.TreeCommand;
* @author Rsl1122
* @since 2.3.0
*/
public class ManageCommand extends TreeCommand<Plan> {
public class ManageCommand extends TreeCmdNode {
public ManageCommand(Plan plugin) {
super(plugin, "manage,m", CommandType.CONSOLE, Permissions.MANAGE.getPermission(), Locale.get(Msg.CMD_USG_MANAGE).toString(), "plan m");
public ManageCommand(PlanPlugin plugin, CommandNode parent) {
super("manage|m", Permissions.MANAGE.getPermission(), CommandType.CONSOLE, parent);
setShortHelp(Locale.get(Msg.CMD_USG_MANAGE).toString());
setInDepthHelp(Locale.get(Msg.CMD_HELP_MANAGE).toArray());
super.setColorScheme(plugin.getColorScheme());
}
@Override
public String[] addHelp() {
return Locale.get(Msg.CMD_HELP_MANAGE).toArray();
}
@Override
public void addCommands() {
add(
new ManageMoveCommand(),
new ManageHotswapCommand(plugin),
new ManageBackupCommand(),
new ManageRestoreCommand(plugin),
new ManageImportCommand(),
new ManageRemoveCommand(),
new ManageClearCommand(plugin),
new ManageSetupCommand(),
new ManageDisableCommand(),
new ManageConDebugCommand()
setNodeGroups(
new CommandNode[]{
new ManageMoveCommand(),
new ManageBackupCommand(),
new ManageRestoreCommand(plugin),
new ManageRemoveCommand(),
new ManageHotSwapCommand(plugin),
new ManageClearCommand(plugin),
},
new CommandNode[]{
new ManageSetupCommand(),
new ManageConDebugCommand(),
new ManageImportCommand(),
new ManageDisableCommand()
}
);
}
}

View File

@ -4,29 +4,26 @@ import com.djrapitops.plan.system.info.connection.ConnectionSystem;
import com.djrapitops.plan.system.settings.Permissions;
import com.djrapitops.plan.system.settings.locale.Locale;
import com.djrapitops.plan.system.settings.locale.Msg;
import com.djrapitops.plugin.command.CommandNode;
import com.djrapitops.plugin.command.CommandType;
import com.djrapitops.plugin.command.CommandUtils;
import com.djrapitops.plugin.command.ISender;
import com.djrapitops.plugin.command.SubCommand;
/**
* Command used to display url to the network page.
*
* @author Rsl1122
*/
public class NetworkCommand extends SubCommand {
public class NetworkCommand extends CommandNode {
public NetworkCommand() {
super("network, n, netw",
CommandType.CONSOLE,
Permissions.ANALYZE.getPermission(),
"Get the link to the network page");
super("network|n|netw", Permissions.ANALYZE.getPermission(), CommandType.CONSOLE);
setShortHelp("View the network page");
}
@Override
public boolean onCommand(ISender sender, String commandLabel, String[] args) {
public void onCommand(ISender sender, String commandLabel, String[] args) {
sendNetworkMsg(sender);
return true;
}
private void sendNetworkMsg(ISender sender) {

View File

@ -13,9 +13,9 @@ import com.djrapitops.plan.utilities.FormatUtils;
import com.djrapitops.plan.utilities.MiscUtils;
import com.djrapitops.plan.utilities.uuid.UUIDUtility;
import com.djrapitops.plugin.api.utility.log.Log;
import com.djrapitops.plugin.command.CommandNode;
import com.djrapitops.plugin.command.CommandType;
import com.djrapitops.plugin.command.ISender;
import com.djrapitops.plugin.command.SubCommand;
import com.djrapitops.plugin.settings.ColorScheme;
import com.djrapitops.plugin.settings.DefaultMessages;
import com.djrapitops.plugin.task.AbsRunnable;
@ -30,7 +30,7 @@ import java.util.UUID;
* @author Rsl1122
* @since 1.0.0
*/
public class QInspectCommand extends SubCommand {
public class QInspectCommand extends CommandNode {
private final PlanPlugin plugin;
@ -40,27 +40,19 @@ public class QInspectCommand extends SubCommand {
* @param plugin Current instance of Plan
*/
public QInspectCommand(PlanPlugin plugin) {
super("qinspect",
CommandType.PLAYER_OR_ARGS,
Permissions.QUICK_INSPECT.getPermission(),
Locale.get(Msg.CMD_USG_QINSPECT).toString(),
"<player>");
super("qinspect", Permissions.QUICK_INSPECT.getPermission(), CommandType.PLAYER_OR_ARGS);
setArguments("<player>");
setShortHelp(Locale.get(Msg.CMD_USG_QINSPECT).toString());
setInDepthHelp(Locale.get(Msg.CMD_HELP_QINSPECT).toArray());
this.plugin = plugin;
}
@Override
public String[] addHelp() {
return Locale.get(Msg.CMD_HELP_QINSPECT).toArray();
}
@Override
public boolean onCommand(ISender sender, String commandLabel, String[] args) {
public void onCommand(ISender sender, String commandLabel, String[] args) {
String playerName = MiscUtils.getPlayerName(args, sender, Permissions.QUICK_INSPECT_OTHER);
runInspectTask(playerName, sender);
return true;
}
private void runInspectTask(String playerName, ISender sender) {

View File

@ -9,13 +9,15 @@ import com.djrapitops.plan.utilities.Condition;
import com.djrapitops.plan.utilities.PassEncryptUtil;
import com.djrapitops.plugin.api.Check;
import com.djrapitops.plugin.api.utility.log.Log;
import com.djrapitops.plugin.command.CommandNode;
import com.djrapitops.plugin.command.CommandType;
import com.djrapitops.plugin.command.CommandUtils;
import com.djrapitops.plugin.command.ISender;
import com.djrapitops.plugin.command.SubCommand;
import com.djrapitops.plugin.task.AbsRunnable;
import com.djrapitops.plugin.task.RunnableFactory;
import java.util.Arrays;
/**
* Command for registering web users.
* <p>
@ -27,27 +29,22 @@ import com.djrapitops.plugin.task.RunnableFactory;
* @author Rsl1122
* @since 3.5.2
*/
public class RegisterCommand extends SubCommand {
public class RegisterCommand extends CommandNode {
public RegisterCommand() {
super("register",
CommandType.PLAYER_OR_ARGS,
"", // No Permission Requirement
Locale.get(Msg.CMD_USG_WEB_REGISTER).toString(),
"<password> [name] [access lvl]");
// No Permission Requirement
super("register", "", CommandType.PLAYER_OR_ARGS);
setShortHelp(Locale.get(Msg.CMD_USG_WEB_REGISTER).toString());
setArguments("<password>", "[name]", "[lvl]");
setInDepthHelp(Locale.get(Msg.CMD_HELP_WEB_REGISTER).toArray());
if (Check.isBukkitAvailable()) {
setupFilter();
}
}
@Override
public String[] addHelp() {
return Locale.get(Msg.CMD_HELP_WEB_REGISTER).toArray();
}
@Override
public boolean onCommand(ISender sender, String commandLabel, String[] args) {
String notEnoughArgsMsg = Locale.get(Msg.CMD_FAIL_REQ_ARGS).parse("(3) " + super.getArguments());
public void onCommand(ISender sender, String commandLabel, String[] args) {
String notEnoughArgsMsg = Locale.get(Msg.CMD_FAIL_REQ_ARGS).parse("(3) " + Arrays.toString(getArguments()));
String hashErrorMsg = "§cPassword hash error.";
String permLvlErrorMsg = "§cIncorrect perm level, not a number: ";
try {
@ -65,7 +62,6 @@ public class RegisterCommand extends SubCommand {
} catch (Exception e) {
Log.toLog(this.getClass().getSimpleName(), e);
}
return true;
}
private void consoleRegister(String[] args, ISender sender, String notEnoughArgsMsg) throws PassEncryptUtil.CannotPerformOperationException {

View File

@ -5,9 +5,9 @@ import com.djrapitops.plan.system.settings.Permissions;
import com.djrapitops.plan.system.settings.locale.Locale;
import com.djrapitops.plan.system.settings.locale.Msg;
import com.djrapitops.plugin.api.utility.log.Log;
import com.djrapitops.plugin.command.CommandNode;
import com.djrapitops.plugin.command.CommandType;
import com.djrapitops.plugin.command.ISender;
import com.djrapitops.plugin.command.SubCommand;
/**
* This SubCommand is used to reload the plugin.
@ -15,21 +15,18 @@ import com.djrapitops.plugin.command.SubCommand;
* @author Rsl1122
* @since 2.0.0
*/
public class ReloadCommand extends SubCommand {
public class ReloadCommand extends CommandNode {
private final PlanPlugin plugin;
public ReloadCommand(PlanPlugin plugin) {
super("reload",
CommandType.CONSOLE,
Permissions.MANAGE.getPermission(),
Locale.get(Msg.CMD_USG_RELOAD).toString());
super("reload", Permissions.MANAGE.getPermission(), CommandType.CONSOLE);
setShortHelp(Locale.get(Msg.CMD_USG_RELOAD).toString());
this.plugin = plugin;
}
@Override
public boolean onCommand(ISender sender, String commandLabel, String[] args) {
public void onCommand(ISender sender, String commandLabel, String[] args) {
try {
plugin.reloadPlugin(true);
} catch (Exception e) {
@ -37,7 +34,5 @@ public class ReloadCommand extends SubCommand {
sender.sendMessage("§cSomething went wrong during reload of the plugin, a restart is recommended.");
}
sender.sendMessage(Locale.get(Msg.CMD_INFO_RELOAD_COMPLETE).toString());
return true;
}
}

View File

@ -5,9 +5,9 @@ import com.djrapitops.plan.system.settings.locale.Locale;
import com.djrapitops.plan.system.settings.locale.Msg;
import com.djrapitops.plan.utilities.Condition;
import com.djrapitops.plan.utilities.MiscUtils;
import com.djrapitops.plugin.command.CommandNode;
import com.djrapitops.plugin.command.CommandType;
import com.djrapitops.plugin.command.ISender;
import com.djrapitops.plugin.command.SubCommand;
import com.djrapitops.plugin.task.AbsRunnable;
import com.djrapitops.plugin.task.RunnableFactory;
import com.djrapitops.plugin.utilities.FormatUtils;
@ -22,31 +22,23 @@ import java.util.List;
* @author Rsl1122
* @since 2.0.0
*/
public class SearchCommand extends SubCommand {
public class SearchCommand extends CommandNode {
public SearchCommand() {
super("search",
CommandType.PLAYER_OR_ARGS,
Permissions.SEARCH.getPermission(),
Locale.get(Msg.CMD_USG_SEARCH).toString(),
"<part of playername>");
super("search", Permissions.SEARCH.getPermission(), CommandType.PLAYER_OR_ARGS);
setShortHelp(Locale.get(Msg.CMD_USG_SEARCH).toString());
setArguments("<text>");
setInDepthHelp(Locale.get(Msg.CMD_HELP_SEARCH).toArray());
}
@Override
public String[] addHelp() {
return Locale.get(Msg.CMD_HELP_SEARCH).toArray();
}
@Override
public boolean onCommand(ISender sender, String commandLabel, String[] args) {
public void onCommand(ISender sender, String commandLabel, String[] args) {
if (!Condition.isTrue(args.length >= 1, Locale.get(Msg.CMD_FAIL_REQ_ONE_ARG).toString(), sender)) {
return true;
return;
}
sender.sendMessage(Locale.get(Msg.CMD_INFO_SEARCHING).toString());
runSearchTask(args, sender);
return true;
}
private void runSearchTask(String[] args, ISender sender) {

View File

@ -0,0 +1,237 @@
package com.djrapitops.plan.command.commands;
import com.djrapitops.plan.api.exceptions.connection.*;
import com.djrapitops.plan.api.exceptions.database.DBException;
import com.djrapitops.plan.command.commands.manage.ManageConDebugCommand;
import com.djrapitops.plan.system.database.databases.Database;
import com.djrapitops.plan.system.database.databases.operation.FetchOperations;
import com.djrapitops.plan.system.info.InfoSystem;
import com.djrapitops.plan.system.info.request.UpdateCancelRequest;
import com.djrapitops.plan.system.info.request.UpdateRequest;
import com.djrapitops.plan.system.info.server.Server;
import com.djrapitops.plan.system.settings.Permissions;
import com.djrapitops.plan.system.settings.locale.Locale;
import com.djrapitops.plan.system.settings.locale.Msg;
import com.djrapitops.plan.system.update.VersionCheckSystem;
import com.djrapitops.plan.system.update.VersionInfo;
import com.djrapitops.plan.system.webserver.WebServerSystem;
import com.djrapitops.plugin.api.utility.log.Log;
import com.djrapitops.plugin.command.CommandNode;
import com.djrapitops.plugin.command.CommandType;
import com.djrapitops.plugin.command.CommandUtils;
import com.djrapitops.plugin.command.ISender;
import com.djrapitops.plugin.task.AbsRunnable;
import com.djrapitops.plugin.task.RunnableFactory;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.UUID;
/**
* Command that updates all servers in the network
*
* @author Rsl1122
*/
public class UpdateCommand extends CommandNode {
public UpdateCommand() {
super("update", Permissions.MANAGE.getPermission(), CommandType.ALL);
setArguments("[-u]/[cancel]");
setShortHelp("Get change log link or update plugin.");
setInDepthHelp(
"/plan update",
" Used to update the plugin on the next shutdown\n",
" /plan update - get change log link",
" /plan update -u - Schedule update to happen on all network servers that are online next time they reboot.",
" /plan update cancel - Cancel scheduled update on servers that haven't rebooted yet."
);
}
@Override
public void onCommand(ISender sender, String commandLabel, String[] args) {
if (!VersionCheckSystem.isNewVersionAvailable()) {
sender.sendMessage("§aYou're running the latest version of Plan.");
return;
}
VersionInfo available = VersionCheckSystem.getInstance().getNewVersionAvailable();
String downloadUrl = available.getDownloadUrl();
if (!available.isTrusted()) {
sender.sendMessage("§cVersion download url did not start with " +
"https://github.com/Rsl1122/Plan-PlayerAnalytics/releases/ " +
"and might not be trusted. You can download this version manually here (Direct download):");
sender.sendLink(downloadUrl, downloadUrl);
return;
}
if (args.length == 0) {
String message = "Change Log v" + available.getVersion().toString() + ": ";
String url = available.getChangeLogUrl();
if (CommandUtils.isConsole(sender)) {
sender.sendMessage(message + url);
} else {
sender.sendMessage(message);
sender.sendLink(" ", Locale.get(Msg.CMD_INFO_CLICK_ME).toString(), url);
}
return;
}
String firstArgument = args[0];
RunnableFactory.createNew("Update Command Task", new AbsRunnable() {
@Override
public void run() {
try {
if ("-u".equals(firstArgument)) {
handleUpdate(sender, args);
} else if ("cancel".equals(firstArgument)) {
handleCancel(sender);
} else {
throw new IllegalArgumentException("Unknown argument, use '-u' or 'cancel'");
}
} finally {
cancel();
}
}
}).runTaskAsynchronously();
}
private void handleCancel(ISender sender) {
try {
cancel(sender, Database.getActive().fetch().getServers());
sender.sendMessage("§aCancel operation performed.");
} catch (DBException e) {
sender.sendMessage("§cDatabase error occurred, cancel could not be performed.");
Log.toLog(this.getClass().getName(), e);
}
}
private void handleUpdate(ISender sender, String[] args) {
sender.sendMessage("§aYou can cancel the update on servers that haven't rebooted yet with /plan update cancel.");
sender.sendMessage("Checking that all servers are online..");
if (!checkNetworkStatus(sender)) {
sender.sendMessage("§cNot all servers were online or accessible, you can still update available servers using /plan -update -force");
// If -force, continue, otherwise return.
if (args.length < 2 || !"-force".equals(args[1])) {
return;
}
}
try {
List<Server> servers = Database.getActive().fetch().getServers();
update(sender, servers, args);
} catch (DBException e) {
Log.toLog(this.getClass().getName(), e);
}
}
private void update(ISender sender, List<Server> servers, String[] args) {
for (Server server : servers) {
if (update(sender, server)) {
sender.sendMessage("§a" + server.getName() + " scheduled for update.");
} else {
if (args.length > 1 && "-force".equals(args[1])) {
sender.sendMessage("§e" + server.getName() + " failed to update, -force specified, continuing update.");
continue;
}
sender.sendMessage("§cUpdate failed on a server, cancelling update on all servers..");
cancel(sender, servers);
sender.sendMessage("§cUpdate cancelled.");
break;
}
}
}
private void cancel(ISender sender, List<Server> servers) {
for (Server server : servers) {
cancel(sender, server);
}
}
private void cancel(ISender sender, Server server) {
try {
InfoSystem.getInstance().getConnectionSystem().sendInfoRequest(new UpdateCancelRequest(), server);
} catch (ForbiddenException | GatewayException | InternalErrorException e) {
sender.sendMessage("§cCancel failed on " + server.getName() + ": Odd Exception: " + e.getClass().getSimpleName());
} catch (UnauthorizedServerException e) {
sender.sendMessage("§cCancel failed on " + server.getName() + ": Unauthorized. " + server.getName() + " might be using different database.");
} catch (ConnectionFailException e) {
sender.sendMessage("§cCancel failed on " + server.getName() + ": " + e.getCause().getClass().getSimpleName() + " " + e.getCause().getMessage());
String address = server.getWebAddress();
boolean local = address.contains("localhost")
|| address.startsWith("https://:") // IP empty = Localhost
|| address.startsWith("http://:") // IP empty = Localhost
|| address.contains("127.0.0.1");
if (!local) {
sender.sendMessage("§cNon-local address, check that port is open");
}
} catch (NotFoundException e) {
/* Ignored, older version */
} catch (WebException e) {
sender.sendMessage("§cCancel failed on " + server.getName() + ": Odd Exception:" + e.getClass().getSimpleName());
}
}
private boolean update(ISender sender, Server server) {
try {
InfoSystem.getInstance().getConnectionSystem().sendInfoRequest(new UpdateRequest(), server);
return true;
} catch (BadRequestException e) {
sender.sendMessage("§c" + server.getName() + " has Allow-Update set to false, aborting update.");
return false;
} catch (ForbiddenException | GatewayException | InternalErrorException | NoServersException e) {
sender.sendMessage("§c" + server.getName() + ": Odd Exception: " + e.getClass().getSimpleName());
return false;
} catch (UnauthorizedServerException e) {
sender.sendMessage("§cFail reason: Unauthorized. " + server.getName() + " might be using different database.");
return false;
} catch (ConnectionFailException e) {
sender.sendMessage("§cFail reason: " + e.getCause().getClass().getSimpleName() + " " + e.getCause().getMessage());
String address = server.getWebAddress();
boolean local = address.contains("localhost")
|| address.startsWith("https://:") // IP empty = Localhost
|| address.startsWith("http://:") // IP empty = Localhost
|| address.contains("127.0.0.1");
if (!local) {
sender.sendMessage("§cNon-local address, check that port is open");
}
return false;
} catch (NotFoundException e) {
sender.sendMessage("§e" + server.getName() + " is using older version and can not be scheduled for update. " +
"You can update it manually, update will proceed.");
return true;
} catch (WebException e) {
sender.sendMessage("§eOdd Exception: " + e.getClass().getSimpleName());
return false;
}
}
private boolean checkNetworkStatus(ISender sender) {
try {
FetchOperations fetch = Database.getActive().fetch();
Optional<Server> bungeeInformation = fetch.getBungeeInformation();
if (!bungeeInformation.isPresent()) {
sender.sendMessage("Bungee address not found in the database, assuming this is not a network.");
return true;
}
Map<UUID, Server> bukkitServers = fetch.getBukkitServers();
String accessAddress = WebServerSystem.getInstance().getWebServer().getAccessAddress();
boolean success = true;
for (Server server : bukkitServers.values()) {
if (!ManageConDebugCommand.testServer(sender, accessAddress, server)) {
success = false;
}
}
Server bungee = bungeeInformation.get();
if (!ManageConDebugCommand.testServer(sender, accessAddress, bungee)) {
success = false;
}
return success;
} catch (DBException e) {
sender.sendMessage("§cDatabase error occurred, update has been cancelled.");
Log.toLog(this.getClass().getName(), e);
return false;
}
}
}

View File

@ -1,7 +1,5 @@
package com.djrapitops.plan.command.commands;
import com.djrapitops.plan.Plan;
import com.djrapitops.plan.PlanBungee;
import com.djrapitops.plan.PlanPlugin;
import com.djrapitops.plan.command.commands.webuser.WebCheckCommand;
import com.djrapitops.plan.command.commands.webuser.WebDeleteCommand;
@ -10,8 +8,9 @@ import com.djrapitops.plan.command.commands.webuser.WebListUsersCommand;
import com.djrapitops.plan.system.settings.Permissions;
import com.djrapitops.plan.system.settings.locale.Locale;
import com.djrapitops.plan.system.settings.locale.Msg;
import com.djrapitops.plugin.command.CommandNode;
import com.djrapitops.plugin.command.CommandType;
import com.djrapitops.plugin.command.TreeCommand;
import com.djrapitops.plugin.command.TreeCmdNode;
/**
* Web subcommand used to manage Web users.
@ -19,39 +18,21 @@ import com.djrapitops.plugin.command.TreeCommand;
* @author Rsl1122
* @since 3.5.2
*/
public class WebUserCommand extends TreeCommand<PlanPlugin> {
public class WebUserCommand extends TreeCmdNode {
public WebUserCommand(Plan plugin, RegisterCommand register) {
super(plugin, "webuser, web",
CommandType.CONSOLE,
Permissions.MANAGE_WEB.getPerm(),
Locale.get(Msg.CMD_USG_WEB).toString(),
"plan web");
public WebUserCommand(PlanPlugin plugin, RegisterCommand register, CommandNode parent) {
super("webuser|web", Permissions.MANAGE_WEB.getPerm(), CommandType.CONSOLE, parent);
setShortHelp(Locale.get(Msg.CMD_USG_WEB).toString());
super.setColorScheme(plugin.getColorScheme());
add(register);
}
public WebUserCommand(PlanBungee plugin, RegisterCommand register) {
super(plugin, "webuser, web",
CommandType.CONSOLE,
Permissions.MANAGE_WEB.getPerm(),
Locale.get(Msg.CMD_USG_WEB).toString(),
"planbungee web");
add(register);
}
@Override
public String[] addHelp() {
return Locale.get(Msg.CMD_HELP_WEB).toArray();
}
@Override
public void addCommands() {
add(
new WebLevelCommand(plugin),
new WebListUsersCommand(plugin),
new WebCheckCommand(),
new WebDeleteCommand()
setInDepthHelp(Locale.get(Msg.CMD_HELP_WEB).toArray());
setNodeGroups(
new CommandNode[]{
register,
new WebLevelCommand(plugin),
new WebListUsersCommand(plugin),
new WebCheckCommand(),
new WebDeleteCommand()
}
);
}
}

View File

@ -9,9 +9,9 @@ import com.djrapitops.plan.system.settings.locale.Msg;
import com.djrapitops.plan.utilities.Condition;
import com.djrapitops.plan.utilities.ManageUtils;
import com.djrapitops.plugin.api.utility.log.Log;
import com.djrapitops.plugin.command.CommandNode;
import com.djrapitops.plugin.command.CommandType;
import com.djrapitops.plugin.command.ISender;
import com.djrapitops.plugin.command.SubCommand;
import com.djrapitops.plugin.task.AbsRunnable;
import com.djrapitops.plugin.task.RunnableFactory;
import com.djrapitops.plugin.utilities.Verify;
@ -22,28 +22,26 @@ import com.djrapitops.plugin.utilities.Verify;
* @author Rsl1122
* @since 2.3.0
*/
public class ManageBackupCommand extends SubCommand {
public class ManageBackupCommand extends CommandNode {
public ManageBackupCommand() {
super("backup",
CommandType.CONSOLE,
Permissions.MANAGE.getPermission(),
Locale.get(Msg.CMD_USG_MANAGE_BACKUP).toString(),
"<DB>");
super("backup", Permissions.MANAGE.getPermission(), CommandType.CONSOLE);
setShortHelp(Locale.get(Msg.CMD_USG_MANAGE_BACKUP).toString());
setArguments("<DB>");
}
@Override
public boolean onCommand(ISender sender, String commandLabel, String[] args) {
public void onCommand(ISender sender, String commandLabel, String[] args) {
try {
if (!Condition.isTrue(args.length >= 1, Locale.get(Msg.CMD_FAIL_REQ_ARGS).parse(this.getArguments()), sender)) {
return true;
return;
}
String dbName = args[0].toLowerCase();
boolean isCorrectDB = "sqlite".equals(dbName) || "mysql".equals(dbName);
if (!Condition.isTrue(isCorrectDB, Locale.get(Msg.MANAGE_FAIL_INCORRECT_DB) + dbName, sender)) {
return true;
return;
}
final Database database = DBSystem.getActiveDatabaseByName(dbName);
@ -51,7 +49,7 @@ public class ManageBackupCommand extends SubCommand {
// If DB is null return
if (!Condition.isTrue(Verify.notNull(database), Locale.get(Msg.MANAGE_FAIL_FAULTY_DB).toString(), sender)) {
Log.error(dbName + " was null!");
return true;
return;
}
Log.debug("Backup", "Start");
runBackupTask(sender, args, database);
@ -60,7 +58,6 @@ public class ManageBackupCommand extends SubCommand {
} finally {
Log.logDebug("Backup");
}
return true;
}
private void runBackupTask(ISender sender, String[] args, final Database database) {

View File

@ -1,11 +1,9 @@
package com.djrapitops.plan.command.commands.manage;
import com.djrapitops.plan.Plan;
import com.djrapitops.plan.PlanPlugin;
import com.djrapitops.plan.api.exceptions.database.DBException;
import com.djrapitops.plan.api.exceptions.database.DBInitException;
import com.djrapitops.plan.api.exceptions.database.FatalDBException;
import com.djrapitops.plan.data.container.Session;
import com.djrapitops.plan.system.cache.SessionCache;
import com.djrapitops.plan.system.database.DBSystem;
import com.djrapitops.plan.system.database.databases.Database;
import com.djrapitops.plan.system.settings.Permissions;
@ -14,9 +12,9 @@ import com.djrapitops.plan.system.settings.locale.Msg;
import com.djrapitops.plan.utilities.Condition;
import com.djrapitops.plan.utilities.MiscUtils;
import com.djrapitops.plugin.api.utility.log.Log;
import com.djrapitops.plugin.command.CommandNode;
import com.djrapitops.plugin.command.CommandType;
import com.djrapitops.plugin.command.ISender;
import com.djrapitops.plugin.command.SubCommand;
import com.djrapitops.plugin.task.AbsRunnable;
import com.djrapitops.plugin.task.RunnableFactory;
import com.djrapitops.plugin.utilities.Verify;
@ -27,41 +25,34 @@ import com.djrapitops.plugin.utilities.Verify;
* @author Rsl1122
* @since 2.3.0
*/
public class ManageClearCommand extends SubCommand {
public class ManageClearCommand extends CommandNode {
private final Plan plugin;
public ManageClearCommand(Plan plugin) {
super("clear",
CommandType.PLAYER_OR_ARGS,
Permissions.MANAGE.getPermission(),
Locale.get(Msg.CMD_USG_MANAGE_CLEAR).toString(),
"<DB> [-a]");
private final PlanPlugin plugin;
public ManageClearCommand(PlanPlugin plugin) {
super("clear", Permissions.MANAGE.getPermission(), CommandType.PLAYER_OR_ARGS);
setShortHelp(Locale.get(Msg.CMD_USG_MANAGE_CLEAR).toString());
setArguments("<DB>", "[-a]");
setInDepthHelp(Locale.get(Msg.CMD_HELP_MANAGE_CLEAR).toArray());
this.plugin = plugin;
}
@Override
public String[] addHelp() {
return Locale.get(Msg.CMD_HELP_MANAGE_CLEAR).toArray();
}
@Override
public boolean onCommand(ISender sender, String commandLabel, String[] args) {
public void onCommand(ISender sender, String commandLabel, String[] args) {
if (!Condition.isTrue(args.length >= 1, Locale.get(Msg.CMD_FAIL_REQ_ONE_ARG).toString(), sender)) {
return true;
return;
}
String dbName = args[0].toLowerCase();
boolean isCorrectDB = "sqlite".equals(dbName) || "mysql".equals(dbName);
if (!Condition.isTrue(isCorrectDB, Locale.get(Msg.MANAGE_FAIL_INCORRECT_DB) + dbName, sender)) {
return true;
return;
}
if (!Condition.isTrue(Verify.contains("-a", args), Locale.get(Msg.MANAGE_FAIL_CONFIRM).parse(Locale.get(Msg.MANAGE_NOTIFY_REMOVE).parse(args[0])), sender)) {
return true;
return;
}
try {
@ -70,7 +61,6 @@ public class ManageClearCommand extends SubCommand {
} catch (DBInitException e) {
sender.sendMessage(Locale.get(Msg.MANAGE_FAIL_FAULTY_DB).toString());
}
return true;
}
private void runClearTask(ISender sender, Database database) {
@ -83,11 +73,6 @@ public class ManageClearCommand extends SubCommand {
database.remove().everything();
long now = MiscUtils.getTime();
SessionCache.clear();
plugin.getServer().getOnlinePlayers().forEach(
player -> SessionCache.getInstance().cacheSession(player.getUniqueId(),
new Session(now, player.getWorld().getName(), player.getGameMode().name()))
);
sender.sendMessage(Locale.get(Msg.MANAGE_INFO_CLEAR_SUCCESS).toString());
} catch (FatalDBException e) {
sender.sendMessage(Locale.get(Msg.MANAGE_INFO_FAIL).toString()

View File

@ -10,13 +10,11 @@ import com.djrapitops.plan.system.info.server.Server;
import com.djrapitops.plan.system.info.server.ServerInfo;
import com.djrapitops.plan.system.processing.Processing;
import com.djrapitops.plan.system.settings.Permissions;
import com.djrapitops.plan.system.settings.locale.Locale;
import com.djrapitops.plan.system.settings.locale.Msg;
import com.djrapitops.plan.system.webserver.WebServerSystem;
import com.djrapitops.plugin.api.utility.log.Log;
import com.djrapitops.plugin.command.CommandNode;
import com.djrapitops.plugin.command.CommandType;
import com.djrapitops.plugin.command.ISender;
import com.djrapitops.plugin.command.SubCommand;
import com.djrapitops.plugin.settings.ColorScheme;
import java.util.List;
@ -28,41 +26,31 @@ import java.util.UUID;
* @author Rsl1122
* @since 2.3.0
*/
public class ManageConDebugCommand extends SubCommand {
private final ColorScheme cs;
public class ManageConDebugCommand extends CommandNode {
public ManageConDebugCommand() {
super("con",
CommandType.ALL,
Permissions.MANAGE.getPermission(),
"Debug Bukkit-Bungee Connections",
"");
cs = PlanPlugin.getInstance().getColorScheme();
super("con", Permissions.MANAGE.getPermission(), CommandType.ALL);
setShortHelp("Debug Bukkit-Bungee Connections");
}
@Override
public String[] addHelp() {
return Locale.get(Msg.CMD_HELP_MANAGE_HOTSWAP).toArray();
}
@Override
public boolean onCommand(ISender sender, String commandLabel, String[] args) {
public void onCommand(ISender sender, String commandLabel, String[] args) {
if (!WebServerSystem.isWebServerEnabled()) {
sender.sendMessage("§cWebServer is not enabled on this server.");
return true;
return;
}
Processing.submitNonCritical(() -> testServers(sender));
return true;
}
private void testServers(ISender sender) {
try {
List<Server> servers = Database.getActive().fetch().getServers();
if (servers.isEmpty()) {
sender.sendMessage("§cNo Servers found in the database.");
}
String accessAddress = WebServerSystem.getInstance().getWebServer().getAccessAddress();
UUID thisServer = ServerInfo.getServerUUID();
for (Server server : servers) {
@ -77,18 +65,19 @@ public class ManageConDebugCommand extends SubCommand {
}
}
private void testServer(ISender sender, String accessAddress, Server server) {
public static boolean testServer(ISender sender, String accessAddress, Server server) {
String address = server.getWebAddress().toLowerCase();
boolean usingHttps = address.startsWith("https");
boolean local = address.contains("localhost")
|| address.startsWith("https://:")
|| address.startsWith("http://:")
|| address.startsWith("https://:") // IP empty = Localhost
|| address.startsWith("http://:") // IP empty = Localhost
|| address.contains("127.0.0.1");
try {
InfoSystem.getInstance().getConnectionSystem().sendInfoRequest(new CheckConnectionRequest(accessAddress), server);
sender.sendMessage(getMsgFor(address, usingHttps, local, true, true));
return true;
} catch (ForbiddenException | BadRequestException | InternalErrorException e) {
sender.sendMessage(getMsgFor(address, usingHttps, local, false, false));
@ -111,9 +100,11 @@ public class ManageConDebugCommand extends SubCommand {
sender.sendMessage(getMsgFor(address, usingHttps, local, false, false));
sender.sendMessage("§eOdd Exception: " + e.getClass().getSimpleName());
}
return false;
}
private String getMsgFor(String address, boolean usingHttps, boolean local, boolean successTo, boolean successFrom) {
private static String getMsgFor(String address, boolean usingHttps, boolean local, boolean successTo, boolean successFrom) {
ColorScheme cs = PlanPlugin.getInstance().getColorScheme();
String tCol = cs.getTertiaryColor();
String sCol = cs.getSecondaryColor();
return tCol + address + sCol + ": "

View File

@ -5,9 +5,9 @@ import com.djrapitops.plan.system.settings.Permissions;
import com.djrapitops.plan.system.settings.locale.Locale;
import com.djrapitops.plan.system.settings.locale.Msg;
import com.djrapitops.plan.utilities.Condition;
import com.djrapitops.plugin.command.CommandNode;
import com.djrapitops.plugin.command.CommandType;
import com.djrapitops.plugin.command.ISender;
import com.djrapitops.plugin.command.SubCommand;
/**
* This manage SubCommand is used to disable some features of the plugin temporarily.
@ -15,22 +15,20 @@ import com.djrapitops.plugin.command.SubCommand;
* @author Rsl1122
* @since 4.0.4
*/
public class ManageDisableCommand extends SubCommand {
public class ManageDisableCommand extends CommandNode {
/**
* Class Constructor.
*/
public ManageDisableCommand() {
super("disable",
CommandType.PLAYER_OR_ARGS,
Permissions.MANAGE.getPermission(),
"Used to disable some features of the Plugin temporarily",
"<feature>");
super("disable", Permissions.MANAGE.getPermission(), CommandType.PLAYER_OR_ARGS);
setShortHelp("Disable a feature temporarily");
setArguments("<feature>");
}
@Override
public boolean onCommand(ISender sender, String commandLabel, String[] args) {
public void onCommand(ISender sender, String commandLabel, String[] args) {
if (!Condition.isTrue(args.length >= 1, Locale.get(Msg.CMD_FAIL_REQ_ARGS).parse(this.getArguments()), sender)) {
return true;
return;
}
switch (args[0].toLowerCase()) {
case "kickcount":
@ -40,6 +38,5 @@ public class ManageDisableCommand extends SubCommand {
default:
sender.sendMessage("§eDefine a feature to disable! (currently supports only kickCount)");
}
return true;
}
}

View File

@ -1,6 +1,6 @@
package com.djrapitops.plan.command.commands.manage;
import com.djrapitops.plan.Plan;
import com.djrapitops.plan.PlanPlugin;
import com.djrapitops.plan.system.database.DBSystem;
import com.djrapitops.plan.system.database.databases.Database;
import com.djrapitops.plan.system.settings.Permissions;
@ -9,9 +9,9 @@ import com.djrapitops.plan.system.settings.locale.Locale;
import com.djrapitops.plan.system.settings.locale.Msg;
import com.djrapitops.plan.utilities.Condition;
import com.djrapitops.plugin.api.utility.log.Log;
import com.djrapitops.plugin.command.CommandNode;
import com.djrapitops.plugin.command.CommandType;
import com.djrapitops.plugin.command.ISender;
import com.djrapitops.plugin.command.SubCommand;
import com.djrapitops.plugin.utilities.Verify;
/**
@ -21,40 +21,33 @@ import com.djrapitops.plugin.utilities.Verify;
* @author Rsl1122
* @since 2.3.0
*/
public class ManageHotswapCommand extends SubCommand {
public class ManageHotSwapCommand extends CommandNode {
private final Plan plugin;
public ManageHotswapCommand(Plan plugin) {
super("hotswap",
CommandType.PLAYER_OR_ARGS,
Permissions.MANAGE.getPermission(),
Locale.get(Msg.CMD_USG_MANAGE_HOTSWAP).toString(),
"<DB>");
private final PlanPlugin plugin;
public ManageHotSwapCommand(PlanPlugin plugin) {
super("hotswap", Permissions.MANAGE.getPermission(), CommandType.PLAYER_OR_ARGS);
setShortHelp(Locale.get(Msg.CMD_USG_MANAGE_HOTSWAP).toString());
setArguments("<DB>");
setInDepthHelp(Locale.get(Msg.CMD_HELP_MANAGE_HOTSWAP).toArray());
this.plugin = plugin;
}
@Override
public String[] addHelp() {
return Locale.get(Msg.CMD_HELP_MANAGE_HOTSWAP).toArray();
}
@Override
public boolean onCommand(ISender sender, String commandLabel, String[] args) {
public void onCommand(ISender sender, String commandLabel, String[] args) {
if (!Condition.isTrue(args.length >= 1, Locale.get(Msg.CMD_FAIL_REQ_ONE_ARG).toString(), sender)) {
return true;
return;
}
String dbName = args[0].toLowerCase();
boolean isCorrectDB = "sqlite".equals(dbName) || "mysql".equals(dbName);
if (!Condition.isTrue(isCorrectDB, Locale.get(Msg.MANAGE_FAIL_INCORRECT_DB) + dbName, sender)) {
return true;
return;
}
if (Condition.isTrue(dbName.equals(Database.getActive().getConfigName()), Locale.get(Msg.MANAGE_FAIL_SAME_DB).toString(), sender)) {
return true;
return;
}
try {
@ -63,22 +56,21 @@ public class ManageHotswapCommand extends SubCommand {
// If DB is null return
if (!Condition.isTrue(Verify.notNull(database), Locale.get(Msg.MANAGE_FAIL_FAULTY_DB).toString(), sender)) {
Log.error(dbName + " was null!");
return true;
return;
}
if (!database.isOpen()) {
return true;
return;
}
} catch (Exception e) {
Log.toLog(this.getClass(), e);
sender.sendMessage(Locale.get(Msg.MANAGE_FAIL_FAULTY_DB).toString());
return true;
return;
}
Settings.DB_TYPE.set(dbName);
Settings.save();
plugin.reloadPlugin(true);
return true;
}
}

View File

@ -6,37 +6,33 @@ import com.djrapitops.plan.system.settings.Permissions;
import com.djrapitops.plan.system.settings.locale.Locale;
import com.djrapitops.plan.system.settings.locale.Msg;
import com.djrapitops.plan.utilities.Condition;
import com.djrapitops.plugin.command.CommandNode;
import com.djrapitops.plugin.command.CommandType;
import com.djrapitops.plugin.command.ISender;
import com.djrapitops.plugin.command.SubCommand;
import com.djrapitops.plugin.task.AbsRunnable;
import com.djrapitops.plugin.task.RunnableFactory;
import java.util.Arrays;
/**
* This manage SubCommand is used to import data from 3rd party plugins.
*
* @author Rsl1122
* @since 2.3.0
*/
public class ManageImportCommand extends SubCommand {
public class ManageImportCommand extends CommandNode {
public ManageImportCommand() {
super("import",
CommandType.CONSOLE,
Permissions.MANAGE.getPermission(),
Locale.get(Msg.CMD_USG_MANAGE_IMPORT).toString(),
"<plugin>/list [import args]");
super("import", Permissions.MANAGE.getPermission(), CommandType.CONSOLE);
setShortHelp(Locale.get(Msg.CMD_USG_MANAGE_IMPORT).toString());
setArguments("<plugin>/list", "[import args]");
setInDepthHelp(Locale.get(Msg.CMD_HELP_MANAGE_IMPORT).toArray());
}
@Override
public String[] addHelp() {
return Locale.get(Msg.CMD_HELP_MANAGE_IMPORT).toArray();
}
@Override
public boolean onCommand(ISender sender, String commandLabel, String[] args) {
if (!Condition.isTrue(args.length >= 1, Locale.get(Msg.CMD_FAIL_REQ_ONE_ARG) + " " + this.getArguments(), sender)) {
return true;
public void onCommand(ISender sender, String commandLabel, String[] args) {
if (!Condition.isTrue(args.length >= 1, Locale.get(Msg.CMD_FAIL_REQ_ONE_ARG) + " " + Arrays.toString(this.getArguments()), sender)) {
return;
}
String importArg = args[0];
@ -47,13 +43,13 @@ public class ManageImportCommand extends SubCommand {
.map(Importer::getNames)
.map(list -> list.get(0))
.forEach(name -> sender.sendMessage("- " + name));
return true;
return;
}
Importer importer = ImporterManager.getImporter(importArg);
if (importer == null) {
sender.sendMessage("§eImporter '" + importArg + "' doesn't exist");
return true;
return;
}
RunnableFactory.createNew("Import:" + importArg, new AbsRunnable() {
@ -66,6 +62,5 @@ public class ManageImportCommand extends SubCommand {
}
}
}).runTaskAsynchronously();
return true;
}
}

View File

@ -8,9 +8,9 @@ import com.djrapitops.plan.system.settings.locale.Msg;
import com.djrapitops.plan.utilities.Condition;
import com.djrapitops.plan.utilities.ManageUtils;
import com.djrapitops.plugin.api.utility.log.Log;
import com.djrapitops.plugin.command.CommandNode;
import com.djrapitops.plugin.command.CommandType;
import com.djrapitops.plugin.command.ISender;
import com.djrapitops.plugin.command.SubCommand;
import com.djrapitops.plugin.task.AbsRunnable;
import com.djrapitops.plugin.task.RunnableFactory;
import com.djrapitops.plugin.utilities.Verify;
@ -23,42 +23,40 @@ import com.djrapitops.plugin.utilities.Verify;
* @author Rsl1122
* @since 2.3.0
*/
public class ManageMoveCommand extends SubCommand {
public class ManageMoveCommand extends CommandNode {
public ManageMoveCommand() {
super("move",
CommandType.PLAYER_OR_ARGS,
Permissions.MANAGE.getPermission(),
Locale.get(Msg.CMD_USG_MANAGE_MOVE).toString(),
"<fromDB> <toDB> [-a]");
super("move", Permissions.MANAGE.getPermission(), CommandType.PLAYER_OR_ARGS);
setShortHelp(Locale.get(Msg.CMD_USG_MANAGE_MOVE).toString());
setArguments("<fromDB>", "<toDB>", "[-a]");
}
@Override
public boolean onCommand(ISender sender, String commandLabel, String[] args) {
public void onCommand(ISender sender, String commandLabel, String[] args) {
if (!Condition.isTrue(args.length >= 2, Locale.get(Msg.CMD_FAIL_REQ_ARGS).parse(this.getArguments()), sender)) {
return true;
return;
}
String fromDB = args[0].toLowerCase();
boolean isCorrectDB = "sqlite".equals(fromDB) || "mysql".equals(fromDB);
if (!Condition.isTrue(isCorrectDB, Locale.get(Msg.MANAGE_FAIL_INCORRECT_DB) + fromDB, sender)) {
return true;
return;
}
String toDB = args[1].toLowerCase();
isCorrectDB = "sqlite".equals(toDB) || "mysql".equals(toDB);
if (!Condition.isTrue(isCorrectDB, Locale.get(Msg.MANAGE_FAIL_INCORRECT_DB) + toDB, sender)) {
return true;
return;
}
if (!Condition.isTrue(!Verify.equalsIgnoreCase(fromDB, toDB), Locale.get(Msg.MANAGE_FAIL_SAME_DB).toString(), sender)) {
return true;
return;
}
if (!Condition.isTrue(Verify.contains("-a", args), Locale.get(Msg.MANAGE_FAIL_CONFIRM).parse(Locale.get(Msg.MANAGE_NOTIFY_REMOVE).parse(args[1])), sender)) {
return true;
return;
}
try {
@ -69,7 +67,6 @@ public class ManageMoveCommand extends SubCommand {
} catch (Exception e) {
sender.sendMessage(Locale.get(Msg.MANAGE_FAIL_FAULTY_DB).toString());
}
return true;
}
private void runMoveTask(final Database fromDatabase, final Database toDatabase, ISender sender) {

View File

@ -1,8 +1,6 @@
package com.djrapitops.plan.command.commands.manage;
import com.djrapitops.plan.api.exceptions.database.DBException;
import com.djrapitops.plan.data.container.Session;
import com.djrapitops.plan.system.cache.SessionCache;
import com.djrapitops.plan.system.database.databases.Database;
import com.djrapitops.plan.system.settings.Permissions;
import com.djrapitops.plan.system.settings.locale.Locale;
@ -11,49 +9,39 @@ import com.djrapitops.plan.utilities.Condition;
import com.djrapitops.plan.utilities.MiscUtils;
import com.djrapitops.plan.utilities.uuid.UUIDUtility;
import com.djrapitops.plugin.api.utility.log.Log;
import com.djrapitops.plugin.command.CommandNode;
import com.djrapitops.plugin.command.CommandType;
import com.djrapitops.plugin.command.ISender;
import com.djrapitops.plugin.command.SubCommand;
import com.djrapitops.plugin.task.AbsRunnable;
import com.djrapitops.plugin.task.RunnableFactory;
import com.djrapitops.plugin.utilities.Verify;
import org.bukkit.entity.Player;
import java.util.UUID;
import static org.bukkit.Bukkit.getPlayer;
/**
* This manage subcommand is used to remove a single player's data from the
* database.
*
* @author Rsl1122
*/
public class ManageRemoveCommand extends SubCommand {
public class ManageRemoveCommand extends CommandNode {
public ManageRemoveCommand() {
super("remove",
CommandType.PLAYER_OR_ARGS,
Permissions.MANAGE.getPermission(),
Locale.get(Msg.CMD_USG_MANAGE_REMOVE).toString(),
"<player> [-a]");
super("remove|delete", Permissions.MANAGE.getPermission(), CommandType.PLAYER_OR_ARGS);
setShortHelp(Locale.get(Msg.CMD_USG_MANAGE_REMOVE).toString());
setArguments("<player>", "[-a]");
setInDepthHelp(Locale.get(Msg.CMD_HELP_MANAGE_REMOVE).toArray());
}
@Override
public String[] addHelp() {
return Locale.get(Msg.CMD_HELP_MANAGE_REMOVE).toArray();
}
@Override
public boolean onCommand(ISender sender, String commandLabel, String[] args) {
public void onCommand(ISender sender, String commandLabel, String[] args) {
if (!Condition.isTrue(args.length >= 1, Locale.get(Msg.CMD_FAIL_REQ_ONE_ARG).toString(), sender)) {
return true;
return;
}
String playerName = MiscUtils.getPlayerName(args, sender, Permissions.MANAGE);
runRemoveTask(playerName, sender, args);
return true;
}
private void runRemoveTask(String playerName, ISender sender, String[] args) {
@ -83,11 +71,6 @@ public class ManageRemoveCommand extends SubCommand {
database.remove().player(uuid);
Player player = getPlayer(uuid);
if (player != null) {
SessionCache.getActiveSessions().remove(uuid);
SessionCache.getInstance().cacheSession(uuid, new Session(MiscUtils.getTime(), player.getWorld().getName(), player.getGameMode().name()));
}
sender.sendMessage(Locale.get(Msg.MANAGE_INFO_REMOVE_SUCCESS).parse(playerName, Database.getActive().getConfigName()));
} catch (DBException e) {
Log.toLog(this.getClass(), e);

View File

@ -1,6 +1,6 @@
package com.djrapitops.plan.command.commands.manage;
import com.djrapitops.plan.Plan;
import com.djrapitops.plan.PlanPlugin;
import com.djrapitops.plan.system.database.DBSystem;
import com.djrapitops.plan.system.database.databases.Database;
import com.djrapitops.plan.system.database.databases.sql.SQLiteDB;
@ -10,14 +10,15 @@ import com.djrapitops.plan.system.settings.locale.Msg;
import com.djrapitops.plan.utilities.Condition;
import com.djrapitops.plan.utilities.ManageUtils;
import com.djrapitops.plugin.api.utility.log.Log;
import com.djrapitops.plugin.command.CommandNode;
import com.djrapitops.plugin.command.CommandType;
import com.djrapitops.plugin.command.ISender;
import com.djrapitops.plugin.command.SubCommand;
import com.djrapitops.plugin.task.AbsRunnable;
import com.djrapitops.plugin.task.RunnableFactory;
import com.djrapitops.plugin.utilities.Verify;
import java.io.File;
import java.util.Arrays;
/**
* This manage SubCommand is used to restore a backup.db file in the
@ -25,35 +26,33 @@ import java.io.File;
*
* @author Rsl1122
*/
public class ManageRestoreCommand extends SubCommand {
public class ManageRestoreCommand extends CommandNode {
private final Plan plugin;
private final PlanPlugin plugin;
public ManageRestoreCommand(Plan plugin) {
super("restore",
CommandType.CONSOLE,
Permissions.MANAGE.getPermission(),
Locale.get(Msg.CMD_USG_MANAGE_RESTORE).toString(),
"<Filename.db> <dbTo> [-a]");
public ManageRestoreCommand(PlanPlugin plugin) {
super("restore", Permissions.MANAGE.getPermission(), CommandType.CONSOLE);
setShortHelp(Locale.get(Msg.CMD_USG_MANAGE_RESTORE).toString());
setArguments("<Filename.db>", "<dbTo>", "[-a]");
this.plugin = plugin;
}
@Override
public boolean onCommand(ISender sender, String commandLabel, String[] args) {
if (!Condition.isTrue(args.length >= 2, Locale.get(Msg.CMD_FAIL_REQ_ARGS).parse(this.getArguments()), sender)) {
return true;
public void onCommand(ISender sender, String commandLabel, String[] args) {
if (!Condition.isTrue(args.length >= 2, Locale.get(Msg.CMD_FAIL_REQ_ARGS).parse(Arrays.toString(this.getArguments())), sender)) {
return;
}
String db = args[1].toLowerCase();
boolean isCorrectDB = "sqlite".equals(db) || "mysql".equals(db);
if (!Condition.isTrue(isCorrectDB, Locale.get(Msg.MANAGE_FAIL_INCORRECT_DB) + db, sender)) {
return true;
return;
}
if (!Condition.isTrue(Verify.contains("-a", args), Locale.get(Msg.MANAGE_FAIL_CONFIRM).parse(Locale.get(Msg.MANAGE_NOTIFY_REWRITE).parse(args[1])), sender)) {
return true;
return;
}
try {
@ -63,7 +62,6 @@ public class ManageRestoreCommand extends SubCommand {
} catch (Exception e) {
sender.sendMessage(Locale.get(Msg.MANAGE_FAIL_FAULTY_DB).toString());
}
return true;
}
private void runRestoreTask(String[] args, ISender sender, final Database database) {

View File

@ -10,9 +10,9 @@ import com.djrapitops.plan.system.settings.locale.Msg;
import com.djrapitops.plan.system.webserver.WebServerSystem;
import com.djrapitops.plan.utilities.Condition;
import com.djrapitops.plugin.api.utility.log.Log;
import com.djrapitops.plugin.command.CommandNode;
import com.djrapitops.plugin.command.CommandType;
import com.djrapitops.plugin.command.ISender;
import com.djrapitops.plugin.command.SubCommand;
/**
* This manage SubCommand is used to request settings from Bungee so that connection can be established.
@ -20,42 +20,34 @@ import com.djrapitops.plugin.command.SubCommand;
* @author Rsl1122
* @since 2.3.0
*/
public class ManageSetupCommand extends SubCommand {
public class ManageSetupCommand extends CommandNode {
public ManageSetupCommand() {
super("setup",
CommandType.PLAYER_OR_ARGS,
Permissions.MANAGE.getPermission(),
"Set-Up Bungee WebServer connection",
"<Bungee WebServer address>");
super("setup", Permissions.MANAGE.getPermission(), CommandType.PLAYER_OR_ARGS);
setShortHelp("Set-Up Bungee connection");
setArguments("<BungeeAddress>");
setInDepthHelp(Locale.get(Msg.CMD_HELP_MANAGE_HOTSWAP).toArray());
}
@Override
public String[] addHelp() {
return Locale.get(Msg.CMD_HELP_MANAGE_HOTSWAP).toArray();
}
@Override
public boolean onCommand(ISender sender, String commandLabel, String[] args) {
public void onCommand(ISender sender, String commandLabel, String[] args) {
if (!Condition.isTrue(args.length >= 1, Locale.get(Msg.CMD_FAIL_REQ_ONE_ARG).toString(), sender)) {
return true;
return;
}
if (!WebServerSystem.isWebServerEnabled()) {
sender.sendMessage("§cWebServer is not enabled on this server! Make sure it enables on boot!");
return true;
return;
}
String address = args[0].toLowerCase();
if (!address.startsWith("http") || address.endsWith("://")) {
sender.sendMessage("§cMake sure you're using the full address (Starts with http:// or https://) - Check Bungee enable log for the full address.");
return true;
return;
}
if (address.endsWith("/")) {
address = address.substring(0, address.length() - 1);
}
requestSetup(sender, address);
return true;
}
private void requestSetup(ISender sender, String address) {

View File

@ -7,9 +7,9 @@ import com.djrapitops.plan.system.settings.locale.Locale;
import com.djrapitops.plan.system.settings.locale.Msg;
import com.djrapitops.plan.utilities.Condition;
import com.djrapitops.plugin.api.utility.log.Log;
import com.djrapitops.plugin.command.CommandNode;
import com.djrapitops.plugin.command.CommandType;
import com.djrapitops.plugin.command.ISender;
import com.djrapitops.plugin.command.SubCommand;
import com.djrapitops.plugin.task.AbsRunnable;
import com.djrapitops.plugin.task.RunnableFactory;
import org.bukkit.ChatColor;
@ -20,20 +20,18 @@ import org.bukkit.ChatColor;
* @author Rsl1122
* @since 3.5.2
*/
public class WebCheckCommand extends SubCommand {
public class WebCheckCommand extends CommandNode {
public WebCheckCommand() {
super("check",
CommandType.PLAYER_OR_ARGS,
Permissions.MANAGE_WEB.getPerm(),
Locale.get(Msg.CMD_USG_WEB_CHECK).toString(),
"<username>");
super("check", Permissions.MANAGE_WEB.getPerm(), CommandType.PLAYER_OR_ARGS);
setShortHelp(Locale.get(Msg.CMD_USG_WEB_CHECK).toString());
setArguments("<username>");
}
@Override
public boolean onCommand(ISender sender, String commandLabel, String[] args) {
public void onCommand(ISender sender, String commandLabel, String[] args) {
if (!Condition.isTrue(args.length >= 1, Locale.get(Msg.CMD_FAIL_REQ_ONE_ARG).parse() + " <username>", sender)) {
return true;
return;
}
Database database = Database.getActive();
String user = args[0];
@ -55,7 +53,6 @@ public class WebCheckCommand extends SubCommand {
}
}
}).runTaskAsynchronously();
return true;
}
}

View File

@ -6,9 +6,9 @@ import com.djrapitops.plan.system.settings.locale.Locale;
import com.djrapitops.plan.system.settings.locale.Msg;
import com.djrapitops.plan.utilities.Condition;
import com.djrapitops.plugin.api.utility.log.Log;
import com.djrapitops.plugin.command.CommandNode;
import com.djrapitops.plugin.command.CommandType;
import com.djrapitops.plugin.command.ISender;
import com.djrapitops.plugin.command.SubCommand;
import com.djrapitops.plugin.task.AbsRunnable;
import com.djrapitops.plugin.task.RunnableFactory;
import net.md_5.bungee.api.ChatColor;
@ -19,20 +19,18 @@ import net.md_5.bungee.api.ChatColor;
* @author Rsl1122
* @since 3.5.2
*/
public class WebDeleteCommand extends SubCommand {
public class WebDeleteCommand extends CommandNode {
public WebDeleteCommand() {
super("delete, remove",
CommandType.PLAYER_OR_ARGS,
Permissions.MANAGE_WEB.getPerm(),
Locale.get(Msg.CMD_USG_WEB_DELETE).toString(),
"<username>");
super("delete|remove", Permissions.MANAGE_WEB.getPerm(), CommandType.PLAYER_OR_ARGS);
setShortHelp(Locale.get(Msg.CMD_USG_WEB_DELETE).toString());
setArguments("<username>");
}
@Override
public boolean onCommand(ISender sender, String commandLabel, String[] args) {
public void onCommand(ISender sender, String commandLabel, String[] args) {
if (!Condition.isTrue(args.length >= 1, Locale.get(Msg.CMD_FAIL_REQ_ONE_ARG).parse() + " <username>", sender)) {
return true;
return;
}
Database database = Database.getActive();
String user = args[0];
@ -54,7 +52,6 @@ public class WebDeleteCommand extends SubCommand {
}
}
}).runTaskAsynchronously();
return true;
}
}

View File

@ -4,9 +4,9 @@ import com.djrapitops.plan.PlanPlugin;
import com.djrapitops.plan.system.settings.Permissions;
import com.djrapitops.plan.system.settings.locale.Locale;
import com.djrapitops.plan.system.settings.locale.Msg;
import com.djrapitops.plugin.command.CommandNode;
import com.djrapitops.plugin.command.CommandType;
import com.djrapitops.plugin.command.ISender;
import com.djrapitops.plugin.command.SubCommand;
import com.djrapitops.plugin.settings.ColorScheme;
/**
@ -15,20 +15,18 @@ import com.djrapitops.plugin.settings.ColorScheme;
* @author Rsl1122
* @since 3.5.2
*/
public class WebLevelCommand extends SubCommand {
public class WebLevelCommand extends CommandNode {
private final PlanPlugin plugin;
public WebLevelCommand(PlanPlugin plugin) {
super("level",
CommandType.CONSOLE,
Permissions.MANAGE_WEB.getPerm(),
Locale.get(Msg.CMD_USG_WEB_LEVEL).toString());
super("level", Permissions.MANAGE_WEB.getPerm(), CommandType.CONSOLE);
setShortHelp(Locale.get(Msg.CMD_USG_WEB_LEVEL).toString());
this.plugin = plugin;
}
@Override
public boolean onCommand(ISender sender, String commandLabel, String[] args) {
public void onCommand(ISender sender, String commandLabel, String[] args) {
ColorScheme cs = plugin.getColorScheme();
String sCol = cs.getSecondaryColor();
String cmdBall = Locale.get(Msg.CMD_CONSTANT_LIST_BALL).parse();
@ -44,7 +42,6 @@ public class WebLevelCommand extends SubCommand {
};
sender.sendMessage(messages);
return true;
}
}

View File

@ -8,9 +8,9 @@ import com.djrapitops.plan.system.settings.locale.Locale;
import com.djrapitops.plan.system.settings.locale.Msg;
import com.djrapitops.plan.utilities.comparators.WebUserComparator;
import com.djrapitops.plugin.api.utility.log.Log;
import com.djrapitops.plugin.command.CommandNode;
import com.djrapitops.plugin.command.CommandType;
import com.djrapitops.plugin.command.ISender;
import com.djrapitops.plugin.command.SubCommand;
import com.djrapitops.plugin.settings.ColorScheme;
import com.djrapitops.plugin.task.AbsRunnable;
import com.djrapitops.plugin.task.RunnableFactory;
@ -23,17 +23,18 @@ import java.util.List;
* @author Rsl1122
* @since 3.5.2
*/
public class WebListUsersCommand extends SubCommand {
public class WebListUsersCommand extends CommandNode {
private final PlanPlugin plugin;
public WebListUsersCommand(PlanPlugin plugin) {
super("list", CommandType.CONSOLE, Permissions.MANAGE_WEB.getPerm(), "List registered web users & permission levels.");
super("list", Permissions.MANAGE_WEB.getPerm(), CommandType.CONSOLE);
setShortHelp("List registered web users & permission levels.");
this.plugin = plugin;
}
@Override
public boolean onCommand(ISender sender, String commandLabel, String[] args) {
public void onCommand(ISender sender, String commandLabel, String[] args) {
RunnableFactory.createNew(new AbsRunnable("Webuser List Task") {
@Override
public void run() {
@ -55,7 +56,6 @@ public class WebListUsersCommand extends SubCommand {
}
}
}).runTaskAsynchronously();
return true;
}
}

View File

@ -4,7 +4,7 @@
*/
package com.djrapitops.plan.data;
import org.apache.commons.lang3.text.WordUtils;
import org.apache.commons.text.WordUtils;
/**
* IDs of various actions

View File

@ -241,7 +241,7 @@ public class PlayerProfile {
public GeoInfo getMostRecentGeoInfo() {
if (geoInformation.isEmpty()) {
return new GeoInfo("-", "Not Known", MiscUtils.getTime());
return new GeoInfo("-", "Not Known", MiscUtils.getTime(), "");
}
geoInformation.sort(new GeoInfoComparator());
return geoInformation.get(0);

View File

@ -4,8 +4,13 @@
*/
package com.djrapitops.plan.data.container;
import com.djrapitops.plan.utilities.FormatUtils;
import com.djrapitops.plan.utilities.SHA256Hash;
import com.google.common.base.Objects;
import java.io.UnsupportedEncodingException;
import java.security.NoSuchAlgorithmException;
/**
* Data class that contains information about IP and Geolocation.
*
@ -15,12 +20,19 @@ public class GeoInfo {
private final String ip;
private final String geolocation;
private final String ipHash;
private final long lastUsed;
public GeoInfo(String ip, String geolocation, long lastUsed) {
public GeoInfo(String ip, String geolocation, long lastUsed)
throws UnsupportedEncodingException, NoSuchAlgorithmException {
this(FormatUtils.formatIP(ip), geolocation, lastUsed, new SHA256Hash(ip).create());
}
public GeoInfo(String ip, String geolocation, long lastUsed, String ipHash) {
this.ip = ip;
this.geolocation = geolocation;
this.lastUsed = lastUsed;
this.ipHash = ipHash;
}
public String getIp() {
@ -35,6 +47,10 @@ public class GeoInfo {
return lastUsed;
}
public String getIpHash() {
return ipHash;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;

View File

@ -9,13 +9,13 @@ import com.djrapitops.plan.ShutdownHook;
import com.djrapitops.plan.api.ServerAPI;
import com.djrapitops.plan.api.exceptions.EnableException;
import com.djrapitops.plan.data.plugin.HookHandler;
import com.djrapitops.plan.system.database.BukkitDBSystem;
import com.djrapitops.plan.system.database.ServerDBSystem;
import com.djrapitops.plan.system.file.FileSystem;
import com.djrapitops.plan.system.info.BukkitInfoSystem;
import com.djrapitops.plan.system.info.ServerInfoSystem;
import com.djrapitops.plan.system.info.server.BukkitServerInfo;
import com.djrapitops.plan.system.listeners.BukkitListenerSystem;
import com.djrapitops.plan.system.settings.PlanErrorManager;
import com.djrapitops.plan.system.settings.config.BukkitConfigSystem;
import com.djrapitops.plan.system.settings.config.ServerConfigSystem;
import com.djrapitops.plan.system.settings.network.NetworkSettings;
import com.djrapitops.plan.system.tasks.BukkitTaskSystem;
import com.djrapitops.plan.system.update.VersionCheckSystem;
@ -37,12 +37,12 @@ public class BukkitSystem extends PlanSystem implements ServerSystem {
versionCheckSystem = new VersionCheckSystem(plugin.getVersion());
fileSystem = new FileSystem(plugin);
configSystem = new BukkitConfigSystem();
databaseSystem = new BukkitDBSystem();
configSystem = new ServerConfigSystem();
databaseSystem = new ServerDBSystem();
listenerSystem = new BukkitListenerSystem(plugin);
taskSystem = new BukkitTaskSystem(plugin);
infoSystem = new BukkitInfoSystem();
infoSystem = new ServerInfoSystem();
serverInfo = new BukkitServerInfo(plugin);
hookHandler = new HookHandler();

View File

@ -81,9 +81,9 @@ public abstract class PlanSystem implements SubSystem {
checkSubSystemInitialization();
SubSystem[] systems = new SubSystem[]{
versionCheckSystem,
fileSystem,
configSystem,
versionCheckSystem,
databaseSystem,
webServerSystem,
processing,

View File

@ -9,13 +9,13 @@ import com.djrapitops.plan.ShutdownHook;
import com.djrapitops.plan.api.ServerAPI;
import com.djrapitops.plan.api.exceptions.EnableException;
import com.djrapitops.plan.data.plugin.HookHandler;
import com.djrapitops.plan.system.database.BukkitDBSystem;
import com.djrapitops.plan.system.database.ServerDBSystem;
import com.djrapitops.plan.system.file.FileSystem;
import com.djrapitops.plan.system.info.BukkitInfoSystem;
import com.djrapitops.plan.system.info.ServerInfoSystem;
import com.djrapitops.plan.system.info.server.SpongeServerInfo;
import com.djrapitops.plan.system.listeners.SpongeListenerSystem;
import com.djrapitops.plan.system.settings.PlanErrorManager;
import com.djrapitops.plan.system.settings.config.BukkitConfigSystem;
import com.djrapitops.plan.system.settings.config.SpongeConfigSystem;
import com.djrapitops.plan.system.settings.network.NetworkSettings;
import com.djrapitops.plan.system.tasks.SpongeTaskSystem;
import com.djrapitops.plan.system.update.VersionCheckSystem;
@ -29,6 +29,8 @@ import com.djrapitops.plugin.api.utility.log.Log;
*/
public class SpongeSystem extends PlanSystem implements ServerSystem {
private boolean firstInstall = false;
public SpongeSystem(PlanSponge plugin) {
testSystem = this;
@ -36,12 +38,12 @@ public class SpongeSystem extends PlanSystem implements ServerSystem {
versionCheckSystem = new VersionCheckSystem(plugin.getVersion());
fileSystem = new FileSystem(plugin);
configSystem = new BukkitConfigSystem();
databaseSystem = new BukkitDBSystem();
listenerSystem = new SpongeListenerSystem();
taskSystem = new SpongeTaskSystem();
configSystem = new SpongeConfigSystem();
databaseSystem = new ServerDBSystem();
listenerSystem = new SpongeListenerSystem(plugin);
taskSystem = new SpongeTaskSystem(plugin);
infoSystem = new BukkitInfoSystem();
infoSystem = new ServerInfoSystem();
serverInfo = new SpongeServerInfo();
hookHandler = new HookHandler();

View File

@ -3,6 +3,7 @@ package com.djrapitops.plan.system.cache;
import com.djrapitops.plan.api.exceptions.EnableException;
import com.djrapitops.plan.system.SubSystem;
import com.djrapitops.plan.system.file.FileSystem;
import com.djrapitops.plan.system.settings.Settings;
import com.djrapitops.plugin.api.utility.log.Log;
import com.djrapitops.plugin.utilities.Verify;
import com.google.common.cache.Cache;
@ -45,12 +46,14 @@ public class GeolocationCache implements SubSystem {
@Override
public void enable() throws EnableException {
geolocationDB = new File(FileSystem.getDataFolder(), "GeoIP.dat");
try {
GeolocationCache.checkDB();
} catch (UnknownHostException e) {
Log.error("Plan Requires internet access on first run to download GeoLite2 Geolocation database.");
} catch (IOException e) {
throw new EnableException("Something went wrong saving the downloaded GeoLite2 Geolocation database", e);
if (Settings.DATA_GEOLOCATIONS.isTrue()) {
try {
GeolocationCache.checkDB();
} catch (UnknownHostException e) {
Log.error("Plan Requires internet access on first run to download GeoLite2 Geolocation database.");
} catch (IOException e) {
throw new EnableException("Something went wrong saving the downloaded GeoLite2 Geolocation database", e);
}
}
}

View File

@ -50,7 +50,8 @@ public abstract class DBSystem implements SubSystem {
Benchmark.stop("Enable", "Init Database");
} catch (DBInitException e) {
Throwable cause = e.getCause();
throw new EnableException(db.getName() + " init failure: " + cause.getMessage(), cause);
String message = cause == null ? e.getMessage() : cause.getMessage();
throw new EnableException((db != null ? db.getName() : "Database") + " init failure: " + message, cause);
}
}

View File

@ -7,18 +7,20 @@ package com.djrapitops.plan.system.database;
import com.djrapitops.plan.api.exceptions.database.DBInitException;
import com.djrapitops.plan.system.database.databases.sql.MySQLDB;
import com.djrapitops.plan.system.database.databases.sql.SQLiteDB;
import com.djrapitops.plan.system.database.databases.sql.SpongeMySQLDB;
import com.djrapitops.plan.system.settings.Settings;
import com.djrapitops.plugin.api.Check;
/**
* Bukkit Database system that initializes SQLite and MySQL database objects.
*
* @author Rsl1122
*/
public class BukkitDBSystem extends DBSystem {
public class ServerDBSystem extends DBSystem {
@Override
protected void initDatabase() throws DBInitException {
databases.add(new MySQLDB());
databases.add(Check.isSpongeAvailable() ? new SpongeMySQLDB() : new MySQLDB());
databases.add(new SQLiteDB());
String dbType = Settings.DB_TYPE.toString().toLowerCase().trim();

View File

@ -1,9 +1,11 @@
package com.djrapitops.plan.system.database.databases.sql;
import com.djrapitops.plan.api.exceptions.database.DBInitException;
import com.djrapitops.plan.system.settings.Settings;
import com.djrapitops.plugin.api.utility.log.Log;
import org.apache.commons.dbcp2.BasicDataSource;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.SQLException;
@ -12,7 +14,7 @@ import java.sql.SQLException;
*/
public class MySQLDB extends SQLDB {
private BasicDataSource dataSource;
protected DataSource dataSource;
public MySQLDB() {
}
@ -21,8 +23,9 @@ public class MySQLDB extends SQLDB {
* Setups the {@link BasicDataSource}
*/
@Override
public void setupDataSource() {
dataSource = new BasicDataSource();
public void setupDataSource() throws DBInitException {
BasicDataSource dataSource = new BasicDataSource();
this.dataSource = dataSource;
dataSource.setDriverClassName("com.mysql.jdbc.Driver");
String host = Settings.DB_HOST.toString();
@ -62,7 +65,9 @@ public class MySQLDB extends SQLDB {
@Override
public void close() {
try {
dataSource.close();
if (dataSource != null && dataSource instanceof BasicDataSource) {
((BasicDataSource) dataSource).close();
}
} catch (SQLException e) {
Log.toLog(this.getClass(), e);
}

View File

@ -1,11 +1,13 @@
package com.djrapitops.plan.system.database.databases.sql;
import com.djrapitops.plan.api.exceptions.database.DBException;
import com.djrapitops.plan.api.exceptions.database.DBInitException;
import com.djrapitops.plan.system.database.databases.Database;
import com.djrapitops.plan.system.database.databases.operation.*;
import com.djrapitops.plan.system.database.databases.sql.operation.*;
import com.djrapitops.plan.system.database.databases.sql.tables.*;
import com.djrapitops.plan.system.database.databases.sql.tables.move.Version8TransferTable;
import com.djrapitops.plan.system.settings.Settings;
import com.djrapitops.plugin.api.TimeAmount;
import com.djrapitops.plugin.api.utility.log.Log;
import com.djrapitops.plugin.task.AbsRunnable;
@ -15,6 +17,10 @@ import org.apache.commons.dbcp2.BasicDataSource;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import java.util.stream.Collectors;
/**
* Class containing main logic for different data related save and load functionality.
@ -133,7 +139,7 @@ public abstract class SQLDB extends Database {
if (newDatabase) {
Log.info("New Database created.");
versionTable.setVersion(16);
versionTable.setVersion(17);
}
int version = versionTable.getVersion();
@ -177,6 +183,10 @@ public abstract class SQLDB extends Database {
worldTimesTable.alterTableV16();
versionTable.setVersion(16);
}
if (version < 17) {
geoInfoTable.alterTableV17();
versionTable.setVersion(17);
}
} catch (SQLException e) {
throw new DBInitException("Failed to set-up Database", e);
}
@ -246,6 +256,22 @@ public abstract class SQLDB extends Database {
private void clean() throws SQLException {
tpsTable.clean();
transferTable.clean();
long now = System.currentTimeMillis();
long keepActiveAfter = now - TimeAmount.DAY.ms() * Settings.KEEP_INACTIVE_PLAYERS_DAYS.getNumber();
List<UUID> inactivePlayers = sessionsTable.getLastSeenForAllPlayers().entrySet().stream()
.filter(entry -> entry.getValue() > keepActiveAfter)
.map(Map.Entry::getKey)
.collect(Collectors.toList());
for (UUID uuid : inactivePlayers) {
try {
removeOps.player(uuid);
} catch (DBException e) {
Log.toLog(this.getClass().getName(), e);
}
}
Log.info("Removed data of " + inactivePlayers.size() + " players.");
}
public abstract Connection getConnection() throws SQLException;

View File

@ -0,0 +1,47 @@
package com.djrapitops.plan.system.database.databases.sql;
import com.djrapitops.plan.api.exceptions.database.DBInitException;
import com.djrapitops.plan.system.settings.Settings;
import com.djrapitops.plugin.api.utility.log.Log;
import org.spongepowered.api.Sponge;
import org.spongepowered.api.service.sql.SqlService;
import java.sql.SQLException;
import java.util.Optional;
/**
* MySQLDB implementation for Sponge since default driver is not available.
*
* @author Rsl1122
*/
public class SpongeMySQLDB extends MySQLDB {
@Override
public void setupDataSource() throws DBInitException {
Optional<SqlService> sqlServiceProvider = Sponge.getServiceManager().provide(SqlService.class);
if (!sqlServiceProvider.isPresent()) {
return;
}
String host = Settings.DB_HOST.toString();
String port = Integer.toString(Settings.DB_PORT.getNumber());
String database = Settings.DB_DATABASE.toString();
String launchOptions = Settings.DB_LAUNCH_OPTIONS.toString();
if (launchOptions.isEmpty() || !launchOptions.startsWith("?") || launchOptions.endsWith("&")) {
Log.error("Launch Options were faulty, using default (?rewriteBatchedStatements=true&useSSL=false)");
launchOptions = "?rewriteBatchedStatements=true&useSSL=false";
}
String url = host + ":" + port + "/" + database + launchOptions;
String username = Settings.DB_USER.toString();
String password = Settings.DB_PASS.toString();
try {
this.dataSource = sqlServiceProvider.get().getDataSource(
"jdbc:mysql://" + username + ":" + password + "@" + url
);
} catch (SQLException e) {
throw new DBInitException(e);
}
}
}

View File

@ -10,8 +10,14 @@ import com.djrapitops.plan.system.database.databases.sql.statements.Column;
import com.djrapitops.plan.system.database.databases.sql.statements.Select;
import com.djrapitops.plan.system.database.databases.sql.statements.Sql;
import com.djrapitops.plan.system.database.databases.sql.statements.TableSqlParser;
import com.djrapitops.plan.system.settings.Settings;
import com.djrapitops.plugin.api.utility.log.Log;
import com.djrapitops.plugin.task.AbsRunnable;
import com.djrapitops.plugin.task.RunnableFactory;
import com.djrapitops.plugin.utilities.Verify;
import java.io.UnsupportedEncodingException;
import java.security.NoSuchAlgorithmException;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
@ -33,11 +39,12 @@ public class GeoInfoTable extends UserIDTable {
insertStatement = "INSERT INTO " + tableName + " ("
+ Col.USER_ID + ", "
+ Col.IP + ", "
+ Col.IP_HASH + ", "
+ Col.GEOLOCATION + ", "
+ Col.LAST_USED
+ ") VALUES ("
+ usersTable.statementSelectID + ", "
+ "?, ?, ?)";
+ "?, ?, ?, ?)";
}
private String insertStatement;
@ -48,6 +55,7 @@ public class GeoInfoTable extends UserIDTable {
.column(Col.USER_ID, Sql.INT).notNull()
.column(Col.IP, Sql.varchar(39)).notNull()
.column(Col.GEOLOCATION, Sql.varchar(50)).notNull()
.column(Col.IP_HASH, Sql.varchar(200))
.column(Col.LAST_USED, Sql.LONG).notNull().defaultValue("0")
.foreignKey(Col.USER_ID, usersTable.getTableName(), UsersTable.Col.ID)
.toString()
@ -64,6 +72,49 @@ public class GeoInfoTable extends UserIDTable {
addColumns(Col.LAST_USED + " bigint NOT NULL DEFAULT 0");
}
public void alterTableV17() {
addColumns(Col.IP_HASH.get() + " varchar(200) DEFAULT ''");
RunnableFactory.createNew("DB Version 16->17", new AbsRunnable() {
@Override
public void run() {
try {
Map<UUID, List<GeoInfo>> allGeoInfo = getAllGeoInfo();
String sql = "UPDATE " + tableName + " SET " +
Col.IP + "=?, " +
Col.IP_HASH + "=? " +
"WHERE " + Col.IP + "=?";
executeBatch(new ExecStatement(sql) {
@Override
public void prepare(PreparedStatement statement) throws SQLException {
for (List<GeoInfo> geoInfos : allGeoInfo.values()) {
for (GeoInfo geoInfo : geoInfos) {
try {
GeoInfo updatedInfo = new GeoInfo(
geoInfo.getIp(),
geoInfo.getGeolocation(),
geoInfo.getLastUsed()
);
statement.setString(1, updatedInfo.getIp());
statement.setString(2, updatedInfo.getIpHash());
statement.setString(3, geoInfo.getIp());
} catch (UnsupportedEncodingException | NoSuchAlgorithmException e) {
if (Settings.DEV_MODE.isTrue()) {
Log.toLog(this.getClass(), e);
}
}
}
}
}
});
} catch (SQLException e) {
e.printStackTrace();
}
}
});
}
public List<GeoInfo> getGeoInfo(UUID uuid) throws SQLException {
String sql = "SELECT DISTINCT * FROM " + tableName +
" WHERE " + Col.USER_ID + "=" + usersTable.statementSelectID;
@ -80,8 +131,9 @@ public class GeoInfoTable extends UserIDTable {
while (set.next()) {
String ip = set.getString(Col.IP.get());
String geolocation = set.getString(Col.GEOLOCATION.get());
String ipHash = set.getString(Col.IP_HASH.get());
long lastUsed = set.getLong(Col.LAST_USED.get());
geoInfo.add(new GeoInfo(ip, geolocation, lastUsed));
geoInfo.add(new GeoInfo(ip, geolocation, lastUsed, ipHash));
}
return geoInfo;
}
@ -92,7 +144,7 @@ public class GeoInfoTable extends UserIDTable {
String sql = "UPDATE " + tableName + " SET "
+ Col.LAST_USED + "=?" +
" WHERE " + Col.USER_ID + "=" + usersTable.statementSelectID +
" AND " + Col.IP + "=?" +
" AND " + Col.IP_HASH + "=?" +
" AND " + Col.GEOLOCATION + "=?";
execute(new ExecStatement(sql) {
@ -100,7 +152,7 @@ public class GeoInfoTable extends UserIDTable {
public void prepare(PreparedStatement statement) throws SQLException {
statement.setLong(1, info.getLastUsed());
statement.setString(2, uuid.toString());
statement.setString(3, info.getIp());
statement.setString(3, info.getIpHash());
statement.setString(4, info.getGeolocation());
}
});
@ -120,8 +172,9 @@ public class GeoInfoTable extends UserIDTable {
public void prepare(PreparedStatement statement) throws SQLException {
statement.setString(1, uuid.toString());
statement.setString(2, info.getIp());
statement.setString(3, info.getGeolocation());
statement.setLong(4, info.getLastUsed());
statement.setString(3, info.getIpHash());
statement.setString(4, info.getGeolocation());
statement.setLong(5, info.getLastUsed());
}
});
}
@ -154,6 +207,7 @@ public class GeoInfoTable extends UserIDTable {
Col.IP + ", " +
Col.GEOLOCATION + ", " +
Col.LAST_USED + ", " +
Col.IP_HASH + ", " +
usersUUIDColumn +
" FROM " + tableName +
" INNER JOIN " + usersTable + " on " + usersIDColumn + "=" + Col.USER_ID;
@ -169,8 +223,9 @@ public class GeoInfoTable extends UserIDTable {
String ip = set.getString(Col.IP.get());
String geolocation = set.getString(Col.GEOLOCATION.get());
String ipHash = set.getString(Col.IP_HASH.get());
long lastUsed = set.getLong(Col.LAST_USED.get());
userGeoInfo.add(new GeoInfo(ip, geolocation, lastUsed));
userGeoInfo.add(new GeoInfo(ip, geolocation, lastUsed, ipHash));
geoLocations.put(uuid, userGeoInfo);
}
@ -203,9 +258,40 @@ public class GeoInfoTable extends UserIDTable {
});
}
public void insertAllGeoInfo(Map<UUID, List<GeoInfo>> allIPsAndGeolocations) throws SQLException {
if (Verify.isEmpty(allIPsAndGeolocations)) {
return;
}
executeBatch(new ExecStatement(insertStatement) {
@Override
public void prepare(PreparedStatement statement) throws SQLException {
// Every User
for (UUID uuid : allIPsAndGeolocations.keySet()) {
// Every GeoInfo
for (GeoInfo info : allIPsAndGeolocations.get(uuid)) {
String ip = info.getIp();
String ipHash = info.getIpHash();
String geoLocation = info.getGeolocation();
long lastUsed = info.getLastUsed();
statement.setString(1, uuid.toString());
statement.setString(2, ip);
statement.setString(3, ipHash);
statement.setString(4, geoLocation);
statement.setLong(5, lastUsed);
statement.addBatch();
}
}
}
});
}
public enum Col implements Column {
USER_ID(UserIDTable.Col.USER_ID.get()),
IP("ip"),
IP_HASH("ip_hash"),
GEOLOCATION("geolocation"),
LAST_USED("last_used");
@ -225,32 +311,4 @@ public class GeoInfoTable extends UserIDTable {
return column;
}
}
public void insertAllGeoInfo(Map<UUID, List<GeoInfo>> allIPsAndGeolocations) throws SQLException {
if (Verify.isEmpty(allIPsAndGeolocations)) {
return;
}
executeBatch(new ExecStatement(insertStatement) {
@Override
public void prepare(PreparedStatement statement) throws SQLException {
// Every User
for (UUID uuid : allIPsAndGeolocations.keySet()) {
// Every GeoInfo
for (GeoInfo info : allIPsAndGeolocations.get(uuid)) {
String ip = info.getIp();
String geoLocation = info.getGeolocation();
long lastUsed = info.getLastUsed();
statement.setString(1, uuid.toString());
statement.setString(2, ip);
statement.setString(3, geoLocation);
statement.setLong(4, lastUsed);
statement.addBatch();
}
}
}
});
}
}

View File

@ -8,7 +8,11 @@ import com.djrapitops.plan.PlanPlugin;
import com.djrapitops.plan.api.exceptions.EnableException;
import com.djrapitops.plan.system.PlanSystem;
import com.djrapitops.plan.system.SubSystem;
import com.djrapitops.plan.system.tasks.LogsFolderCleanTask;
import com.djrapitops.plan.utilities.file.FileUtil;
import com.djrapitops.plugin.api.TimeAmount;
import com.djrapitops.plugin.api.utility.log.Log;
import com.djrapitops.plugin.task.RunnableFactory;
import com.djrapitops.plugin.utilities.Verify;
import java.io.File;
@ -63,10 +67,11 @@ public class FileSystem implements SubSystem {
if (configFile.exists()) {
configFile.createNewFile();
}
RunnableFactory.createNew(new LogsFolderCleanTask(Log.getLogsFolder()))
.runTaskLaterAsynchronously(TimeAmount.SECOND.ticks() * 30L);
} catch (IOException e) {
throw new EnableException("Failed to create config.yml", e);
}
}
@Override

View File

@ -6,7 +6,7 @@ package com.djrapitops.plan.system.info;
import com.djrapitops.plan.api.exceptions.connection.NoServersException;
import com.djrapitops.plan.api.exceptions.connection.WebException;
import com.djrapitops.plan.system.info.connection.BukkitConnectionSystem;
import com.djrapitops.plan.system.info.connection.ServerConnectionSystem;
import com.djrapitops.plan.system.info.request.CacheNetworkPageContentRequest;
import com.djrapitops.plan.system.info.request.InfoRequest;
import com.djrapitops.plan.system.info.request.SetupRequest;
@ -19,10 +19,10 @@ import com.djrapitops.plugin.api.utility.log.Log;
*
* @author Rsl1122
*/
public class BukkitInfoSystem extends InfoSystem {
public class ServerInfoSystem extends InfoSystem {
public BukkitInfoSystem() {
super(new BukkitConnectionSystem());
public ServerInfoSystem() {
super(new ServerConnectionSystem());
}
@Override

View File

@ -125,6 +125,9 @@ public abstract class ConnectionSystem implements SubSystem {
putRequest(requests, SaveDBSettingsRequest.createHandler());
putRequest(requests, SendDBSettingsRequest.createHandler());
putRequest(requests, CheckConnectionRequest.createHandler());
// putRequest(requests, UpdateRequest.createHandler());
// putRequest(requests, UpdateCancelRequest.createHandler());
return requests;
}

View File

@ -28,13 +28,13 @@ import java.util.UUID;
*
* @author Rsl1122
*/
public class BukkitConnectionSystem extends ConnectionSystem {
public class ServerConnectionSystem extends ConnectionSystem {
private long latestServerMapRefresh;
private Server mainServer;
public BukkitConnectionSystem() {
public ServerConnectionSystem() {
latestServerMapRefresh = 0;
}

View File

@ -17,7 +17,7 @@ import com.djrapitops.plan.system.webserver.response.pages.InspectPageResponse;
import com.djrapitops.plan.utilities.Base64Util;
import com.djrapitops.plan.utilities.file.export.HtmlExport;
import com.djrapitops.plugin.utilities.Verify;
import org.apache.commons.lang3.text.StrSubstitutor;
import org.apache.commons.text.StringSubstitutor;
import java.util.Collections;
import java.util.Map;
@ -63,7 +63,7 @@ public class CacheInspectPageRequest extends InfoRequestWithVariables implements
Map<String, String> replace = Collections.singletonMap("networkName", ServerInfo.getServerName());
boolean export = Settings.ANALYSIS_EXPORT.isTrue();
cache(export, uuid, StrSubstitutor.replace(Base64Util.decode(html), replace));
cache(export, uuid, StringSubstitutor.replace(Base64Util.decode(html), replace));
return DefaultResponses.SUCCESS.get();
}

View File

@ -4,7 +4,7 @@
*/
package com.djrapitops.plan.system.info.request;
import com.djrapitops.plan.Plan;
import com.djrapitops.plan.PlanPlugin;
import com.djrapitops.plan.api.exceptions.connection.BadRequestException;
import com.djrapitops.plan.api.exceptions.connection.WebException;
import com.djrapitops.plan.system.settings.Settings;
@ -64,7 +64,7 @@ public class SaveDBSettingsRequest extends InfoRequestWithVariables implements S
Log.info("----------------------------------");
return DefaultResponses.SUCCESS.get();
} finally {
Plan.getInstance().reloadPlugin(true);
PlanPlugin.getInstance().reloadPlugin(true);
}
}

View File

@ -0,0 +1,37 @@
/*
* Licence is provided in the jar as license.yml also here:
* https://github.com/Rsl1122/Plan-PlayerAnalytics/blob/master/Plan/src/main/resources/license.yml
*/
package com.djrapitops.plan.system.info.request;
import com.djrapitops.plan.system.update.ShutdownUpdateHook;
import com.djrapitops.plan.system.webserver.response.DefaultResponses;
import com.djrapitops.plan.system.webserver.response.Response;
import java.util.Map;
/**
* InfoRequest used for Updating the plugin on a network.
*
* @author Rsl1122
*/
public class UpdateCancelRequest implements InfoRequest {
public UpdateCancelRequest() {
}
public static UpdateCancelRequest createHandler() {
return new UpdateCancelRequest();
}
@Override
public void runLocally() {
ShutdownUpdateHook.deActivate();
}
@Override
public Response handleRequest(Map<String, String> variables) {
ShutdownUpdateHook.deActivate();
return DefaultResponses.SUCCESS.get();
}
}

View File

@ -0,0 +1,43 @@
/*
* Licence is provided in the jar as license.yml also here:
* https://github.com/Rsl1122/Plan-PlayerAnalytics/blob/master/Plan/src/main/resources/license.yml
*/
package com.djrapitops.plan.system.info.request;
import com.djrapitops.plan.system.settings.Settings;
import com.djrapitops.plan.system.update.ShutdownUpdateHook;
import com.djrapitops.plan.system.webserver.response.DefaultResponses;
import com.djrapitops.plan.system.webserver.response.Response;
import com.djrapitops.plan.system.webserver.response.api.BadRequestResponse;
import java.util.Map;
/**
* InfoRequest used for Updating the plugin on a network.
*
* @author Rsl1122
*/
public class UpdateRequest implements InfoRequest {
public UpdateRequest() {
}
public static UpdateRequest createHandler() {
return new UpdateRequest();
}
@Override
public void runLocally() {
new ShutdownUpdateHook().register();
}
@Override
public Response handleRequest(Map<String, String> variables) {
if (Settings.ALLOW_UPDATE.isTrue()) {
new ShutdownUpdateHook().register();
return DefaultResponses.SUCCESS.get();
} else {
return new BadRequestResponse("Update not allowed on this server");
}
}
}

View File

@ -1,14 +1,32 @@
package com.djrapitops.plan.system.listeners;
import com.djrapitops.plan.PlanSponge;
import com.djrapitops.plan.system.listeners.sponge.*;
import org.spongepowered.api.Sponge;
public class SpongeListenerSystem extends ListenerSystem {
private final PlanSponge plugin;
public SpongeListenerSystem(PlanSponge plugin) {
this.plugin = plugin;
}
@Override
protected void registerListeners() {
plugin.registerListener(
new SpongeAFKListener(),
new SpongeChatListener(),
new SpongeCommandListener(),
new SpongeDeathListener(),
new SpongeGMChangeListener(),
new SpongePlayerListener(),
new SpongeWorldChangeListener()
);
}
@Override
protected void unregisterListeners() {
Sponge.getEventManager().unregisterPluginListeners(plugin);
}
}

View File

@ -31,19 +31,23 @@ public class ChatListener implements Listener {
}
try {
Player p = event.getPlayer();
UUID uuid = p.getUniqueId();
String name = p.getName();
String displayName = p.getDisplayName();
SessionCache sessionCache = SessionCache.getInstance();
if (sessionCache.isFirstSession(uuid)) {
sessionCache.firstSessionMessageSent(uuid);
}
Processing.submit(new NameProcessor(uuid, name, displayName));
actOnChatEvent(event);
} catch (Exception e) {
Log.toLog(this.getClass(), e);
}
}
private void actOnChatEvent(AsyncPlayerChatEvent event) {
Player p = event.getPlayer();
UUID uuid = p.getUniqueId();
String name = p.getName();
String displayName = p.getDisplayName();
SessionCache sessionCache = SessionCache.getInstance();
if (sessionCache.isFirstSession(uuid)) {
sessionCache.firstSessionMessageSent(uuid);
}
Processing.submit(new NameProcessor(uuid, name, displayName));
}
}

View File

@ -43,27 +43,31 @@ public class CommandPreprocessListener implements Listener {
}
try {
String commandName = event.getMessage().substring(1).split(" ")[0].toLowerCase();
boolean logUnknownCommands = Settings.LOG_UNKNOWN_COMMANDS.isTrue();
boolean combineCommandAliases = Settings.COMBINE_COMMAND_ALIASES.isTrue();
if (!logUnknownCommands || combineCommandAliases) {
Command command = getBukkitCommand(commandName);
if (command == null) {
if (!logUnknownCommands) {
return;
}
} else if (combineCommandAliases) {
commandName = command.getName();
}
}
Processing.submit(new CommandProcessor(commandName));
actOnCommandEvent(event);
} catch (Exception e) {
Log.toLog(this.getClass(), e);
}
}
private void actOnCommandEvent(PlayerCommandPreprocessEvent event) {
String commandName = event.getMessage().substring(1).split(" ")[0].toLowerCase();
boolean logUnknownCommands = Settings.LOG_UNKNOWN_COMMANDS.isTrue();
boolean combineCommandAliases = Settings.COMBINE_COMMAND_ALIASES.isTrue();
if (!logUnknownCommands || combineCommandAliases) {
Command command = getBukkitCommand(commandName);
if (command == null) {
if (!logUnknownCommands) {
return;
}
} else if (combineCommandAliases) {
commandName = command.getName();
}
}
Processing.submit(new CommandProcessor(commandName));
}
private Command getBukkitCommand(String commandName) {
Command command = plugin.getServer().getPluginCommand(commandName);
if (command == null) {

View File

@ -72,61 +72,69 @@ public class PlayerOnlineListener implements Listener {
@EventHandler(priority = EventPriority.MONITOR)
public void onPlayerJoin(PlayerJoinEvent event) {
try {
Player player = event.getPlayer();
NotificationCenter.checkNotifications(player);
UUID uuid = player.getUniqueId();
long time = MiscUtils.getTime();
AFKListener.AFK_TRACKER.performedAction(uuid, time);
String world = player.getWorld().getName();
String gm = player.getGameMode().name();
String ip = player.getAddress().getAddress().getHostAddress();
String playerName = player.getName();
String displayName = player.getDisplayName();
int playersOnline = TaskSystem.getInstance().getTpsCountTimer().getLatestPlayersOnline();
SessionCache.getInstance().cacheSession(uuid, new Session(time, world, gm));
Processing.submit(
new RegisterProcessor(uuid, player.getFirstPlayed(), time, playerName, playersOnline,
new IPUpdateProcessor(uuid, ip, time),
new NameProcessor(uuid, playerName, displayName),
new PlayerPageUpdateProcessor(uuid)
)
);
Processing.submit(new NetworkPageUpdateProcessor());
actOnJoinEvent(event);
} catch (Exception e) {
Log.toLog(this.getClass(), e);
}
}
private void actOnJoinEvent(PlayerJoinEvent event) {
Player player = event.getPlayer();
NotificationCenter.checkNotifications(player);
UUID uuid = player.getUniqueId();
long time = MiscUtils.getTime();
AFKListener.AFK_TRACKER.performedAction(uuid, time);
String world = player.getWorld().getName();
String gm = player.getGameMode().name();
String ip = player.getAddress().getAddress().getHostAddress();
String playerName = player.getName();
String displayName = player.getDisplayName();
int playersOnline = TaskSystem.getInstance().getTpsCountTimer().getLatestPlayersOnline();
SessionCache.getInstance().cacheSession(uuid, new Session(time, world, gm));
Processing.submit(
new RegisterProcessor(uuid, player.getFirstPlayed(), time, playerName, playersOnline,
new IPUpdateProcessor(uuid, ip, time),
new NameProcessor(uuid, playerName, displayName),
new PlayerPageUpdateProcessor(uuid)
)
);
Processing.submit(new NetworkPageUpdateProcessor());
}
@EventHandler(priority = EventPriority.MONITOR)
public void onPlayerQuit(PlayerQuitEvent event) {
try {
long time = MiscUtils.getTime();
Player player = event.getPlayer();
UUID uuid = player.getUniqueId();
AFKListener.AFK_TRACKER.loggedOut(uuid, time);
Processing.submit(new BanAndOpProcessor(uuid, player.isBanned(), player.isOp()));
Processing.submit(new EndSessionProcessor(uuid, time));
Processing.submit(new NetworkPageUpdateProcessor());
SessionCache sessionCache = SessionCache.getInstance();
if (sessionCache.isFirstSession(uuid)) {
int messagesSent = sessionCache.getFirstSessionMsgCount(uuid);
Processing.submit(new FirstLeaveProcessor(uuid, time, messagesSent));
}
Processing.submit(new PlayerPageUpdateProcessor(uuid));
actOnQuitEvent(event);
} catch (Exception e) {
Log.toLog(this.getClass(), e);
}
}
private void actOnQuitEvent(PlayerQuitEvent event) {
long time = MiscUtils.getTime();
Player player = event.getPlayer();
UUID uuid = player.getUniqueId();
AFKListener.AFK_TRACKER.loggedOut(uuid, time);
Processing.submit(new BanAndOpProcessor(uuid, player.isBanned(), player.isOp()));
Processing.submit(new EndSessionProcessor(uuid, time));
Processing.submit(new NetworkPageUpdateProcessor());
SessionCache sessionCache = SessionCache.getInstance();
if (sessionCache.isFirstSession(uuid)) {
int messagesSent = sessionCache.getFirstSessionMsgCount(uuid);
Processing.submit(new FirstLeaveProcessor(uuid, time, messagesSent));
}
Processing.submit(new PlayerPageUpdateProcessor(uuid));
}
}

View File

@ -0,0 +1,68 @@
package com.djrapitops.plan.system.listeners.sponge;
import com.djrapitops.plan.system.afk.AFKTracker;
import com.djrapitops.plan.utilities.MiscUtils;
import com.djrapitops.plugin.api.utility.log.Log;
import org.spongepowered.api.entity.living.player.Player;
import org.spongepowered.api.event.Listener;
import org.spongepowered.api.event.Order;
import org.spongepowered.api.event.command.SendCommandEvent;
import org.spongepowered.api.event.entity.MoveEntityEvent;
import org.spongepowered.api.event.entity.living.humanoid.player.PlayerChangeClientSettingsEvent;
import org.spongepowered.api.event.entity.living.humanoid.player.TargetPlayerEvent;
import org.spongepowered.api.event.filter.cause.First;
import org.spongepowered.api.event.message.MessageChannelEvent;
import java.util.UUID;
/**
* Listener that keeps track of actions that are not considered being AFK.
* <p>
* Additional Listener calls in SpongePlayerListener to avoid having HIGHEST priority listeners.
*
* @author Rsl1122
* @see SpongePlayerListener
*/
public class SpongeAFKListener {
// Static so that /reload does not cause afk tracking to fail.
public static final AFKTracker AFK_TRACKER = new AFKTracker();
private void event(TargetPlayerEvent event) {
try {
UUID uuid = event.getTargetEntity().getUniqueId();
long time = MiscUtils.getTime();
AFK_TRACKER.performedAction(uuid, time);
} catch (Exception e) {
Log.toLog(this.getClass(), e);
}
}
@Listener(order = Order.POST)
public void onMove(MoveEntityEvent event, @First Player player) {
UUID uuid = player.getUniqueId();
long time = MiscUtils.getTime();
AFK_TRACKER.performedAction(uuid, time);
}
@Listener(order = Order.POST)
public void onPlayerChat(MessageChannelEvent.Chat event, @First Player player) {
UUID uuid = player.getUniqueId();
long time = MiscUtils.getTime();
AFK_TRACKER.performedAction(uuid, time);
}
@Listener(order = Order.POST)
public void onPlayerCommand(SendCommandEvent event, @First Player player) {
UUID uuid = player.getUniqueId();
long time = MiscUtils.getTime();
AFK_TRACKER.performedAction(uuid, time);
}
@Listener(order = Order.POST)
public void onSettingsChange(PlayerChangeClientSettingsEvent event) {
event(event);
}
}

View File

@ -0,0 +1,48 @@
package com.djrapitops.plan.system.listeners.sponge;
import com.djrapitops.plan.system.cache.SessionCache;
import com.djrapitops.plan.system.processing.Processing;
import com.djrapitops.plan.system.processing.processors.player.NameProcessor;
import com.djrapitops.plugin.api.utility.log.Log;
import org.spongepowered.api.entity.living.player.Player;
import org.spongepowered.api.event.Listener;
import org.spongepowered.api.event.Order;
import org.spongepowered.api.event.filter.cause.First;
import org.spongepowered.api.event.message.MessageChannelEvent;
import java.util.UUID;
/**
* Listener that keeps track of player display name.
*
* @author Rsl1122
*/
public class SpongeChatListener {
@Listener(order = Order.POST)
public void onPlayerChat(MessageChannelEvent.Chat event, @First Player player) {
if (event.isCancelled()) {
return;
}
try {
actOnChatEvent(player);
} catch (Exception e) {
Log.toLog(this.getClass(), e);
}
}
private void actOnChatEvent(@First Player player) {
UUID uuid = player.getUniqueId();
String name = player.getName();
String displayName = player.getDisplayNameData().displayName().get().toPlain();
SessionCache sessionCache = SessionCache.getInstance();
if (sessionCache.isFirstSession(uuid)) {
sessionCache.firstSessionMessageSent(uuid);
}
Processing.submit(new NameProcessor(uuid, name, displayName));
}
}

View File

@ -0,0 +1,57 @@
package com.djrapitops.plan.system.listeners.sponge;
import com.djrapitops.plan.system.processing.Processing;
import com.djrapitops.plan.system.processing.processors.CommandProcessor;
import com.djrapitops.plan.system.settings.Permissions;
import com.djrapitops.plan.system.settings.Settings;
import com.djrapitops.plugin.api.utility.log.Log;
import org.spongepowered.api.Sponge;
import org.spongepowered.api.command.CommandMapping;
import org.spongepowered.api.entity.living.player.Player;
import org.spongepowered.api.event.Listener;
import org.spongepowered.api.event.Order;
import org.spongepowered.api.event.command.SendCommandEvent;
import org.spongepowered.api.event.filter.cause.First;
import java.util.Optional;
/**
* Listener that keeps track of used commands.
*
* @author Rsl1122
*/
public class SpongeCommandListener {
@Listener(order = Order.POST)
public void onPlayerCommand(SendCommandEvent event, @First Player player) {
boolean hasIgnorePermission = player.hasPermission(Permissions.IGNORE_COMMANDUSE.getPermission());
if (event.isCancelled() || hasIgnorePermission) {
return;
}
try {
actOnCommandEvent(event);
} catch (Exception e) {
Log.toLog(this.getClass(), e);
}
}
private void actOnCommandEvent(SendCommandEvent event) {
String commandName = event.getCommand();
boolean logUnknownCommands = Settings.LOG_UNKNOWN_COMMANDS.isTrue();
boolean combineCommandAliases = Settings.COMBINE_COMMAND_ALIASES.isTrue();
if (!logUnknownCommands || combineCommandAliases) {
Optional<? extends CommandMapping> existingCommand = Sponge.getCommandManager().get(commandName);
if (!existingCommand.isPresent()) {
if (!logUnknownCommands) {
return;
}
} else if (combineCommandAliases) {
commandName = existingCommand.get().getPrimaryAlias();
}
}
Processing.submit(new CommandProcessor(commandName));
}
}

View File

@ -0,0 +1,131 @@
package com.djrapitops.plan.system.listeners.sponge;
import com.djrapitops.plan.data.container.Session;
import com.djrapitops.plan.system.cache.SessionCache;
import com.djrapitops.plan.system.processing.Processing;
import com.djrapitops.plan.system.processing.processors.player.SpongeKillProcessor;
import com.djrapitops.plan.utilities.MiscUtils;
import com.djrapitops.plugin.api.utility.log.Log;
import com.djrapitops.plugin.utilities.Format;
import org.spongepowered.api.data.key.Keys;
import org.spongepowered.api.data.type.HandTypes;
import org.spongepowered.api.entity.Entity;
import org.spongepowered.api.entity.living.Living;
import org.spongepowered.api.entity.living.animal.Wolf;
import org.spongepowered.api.entity.living.player.Player;
import org.spongepowered.api.entity.projectile.arrow.Arrow;
import org.spongepowered.api.entity.projectile.source.ProjectileSource;
import org.spongepowered.api.event.Listener;
import org.spongepowered.api.event.cause.entity.damage.source.EntityDamageSource;
import org.spongepowered.api.event.entity.DestructEntityEvent;
import org.spongepowered.api.item.ItemType;
import org.spongepowered.api.item.ItemTypes;
import org.spongepowered.api.item.inventory.ItemStack;
import java.util.Optional;
import java.util.UUID;
/**
* Listener for Deaths and Kills on Sponge.
*
* @author Rsl1122
*/
public class SpongeDeathListener {
@Listener
public void onEntityDeath(DestructEntityEvent.Death event) {
long time = MiscUtils.getTime();
Living dead = event.getTargetEntity();
if (dead instanceof Player) {
// Process Death
Processing.submitCritical(() -> SessionCache.getCachedSession(dead.getUniqueId()).ifPresent(Session::died));
}
try {
Optional<EntityDamageSource> optDamageSource = event.getCause().first(EntityDamageSource.class);
if (optDamageSource.isPresent()) {
EntityDamageSource damageSource = optDamageSource.get();
Entity killerEntity = damageSource.getSource();
handleKill(time, dead, killerEntity);
}
} catch (Exception e) {
Log.toLog(this.getClass(), e);
}
}
private void handleKill(long time, Living dead, Entity killerEntity) {
SpongeKillProcessor processor = null;
if (killerEntity instanceof Player) {
processor = handlePlayerKill(time, dead, (Player) killerEntity);
} else if (killerEntity instanceof Wolf) {
processor = handleWolfKill(time, dead, (Wolf) killerEntity);
} else if (killerEntity instanceof Arrow) {
processor = handleArrowKill(time, dead, (Arrow) killerEntity);
}
if (processor != null) {
Processing.submit(processor);
}
}
private SpongeKillProcessor handlePlayerKill(long time, Living dead, Player killer) {
Optional<ItemStack> inMainHand = killer.getItemInHand(HandTypes.MAIN_HAND);
ItemStack inHand = inMainHand.orElse(killer.getItemInHand(HandTypes.OFF_HAND).orElse(ItemStack.empty()));
ItemType type = inHand.isEmpty() ? ItemTypes.AIR : inHand.getType();
return new SpongeKillProcessor(killer.getUniqueId(), time, getUUID(dead), normalizeItemName(type));
}
private UUID getUUID(Living dead) {
if (dead instanceof Player) {
return dead.getUniqueId();
}
return null;
}
private SpongeKillProcessor handleWolfKill(long time, Living dead, Wolf wolf) {
Optional<Optional<UUID>> owner = wolf.get(Keys.TAMED_OWNER);
if (!owner.isPresent()) {
return null;
}
return owner.get().map(
uuid -> new SpongeKillProcessor(uuid, time, getUUID(dead), "Wolf")
).orElse(null);
}
private SpongeKillProcessor handleArrowKill(long time, Living dead, Arrow arrow) {
ProjectileSource source = arrow.getShooter();
if (!(source instanceof Player)) {
return null;
}
Player player = (Player) source;
return new SpongeKillProcessor(player.getUniqueId(), time, getUUID(dead), "Bow");
}
/**
* Normalizes an item name
*
* @param type The type of the item
* @return The normalized item name
*/
private String normalizeItemName(ItemType type) {
String[] parts = type.getName().split("_");
StringBuilder builder = new StringBuilder();
for (int i = 0; i < parts.length; i++) {
String part = new Format(parts[i]).capitalize().toString();
builder.append(part);
if (i < parts.length - 1) {
builder.append(" ");
}
}
return builder.toString();
}
}

View File

@ -0,0 +1,50 @@
package com.djrapitops.plan.system.listeners.sponge;
import com.djrapitops.plan.data.container.Session;
import com.djrapitops.plan.system.cache.SessionCache;
import com.djrapitops.plan.system.settings.WorldAliasSettings;
import com.djrapitops.plan.utilities.MiscUtils;
import com.djrapitops.plugin.api.utility.log.Log;
import org.spongepowered.api.entity.living.player.Player;
import org.spongepowered.api.event.Listener;
import org.spongepowered.api.event.Order;
import org.spongepowered.api.event.entity.living.humanoid.ChangeGameModeEvent;
import java.util.Optional;
import java.util.UUID;
/**
* Listener for GameMode change on Sponge.
*
* @author Rsl1122
*/
public class SpongeGMChangeListener {
@Listener(order = Order.POST)
public void onGMChange(ChangeGameModeEvent.TargetPlayer event) {
if (event.isCancelled()) {
return;
}
try {
actOnGMChangeEvent(event);
} catch (Exception e) {
Log.toLog(this.getClass(), e);
}
}
private void actOnGMChangeEvent(ChangeGameModeEvent.TargetPlayer event) {
Player player = event.getTargetEntity();
UUID uuid = player.getUniqueId();
long time = MiscUtils.getTime();
String gameMode = event.getGameMode().getName().toUpperCase();
String worldName = player.getWorld().getName();
WorldAliasSettings.addWorld(worldName);
Optional<Session> cachedSession = SessionCache.getCachedSession(uuid);
cachedSession.ifPresent(session -> session.changeState(worldName, gameMode, time));
}
}

View File

@ -0,0 +1,143 @@
package com.djrapitops.plan.system.listeners.sponge;
import com.djrapitops.plan.data.container.Session;
import com.djrapitops.plan.system.cache.SessionCache;
import com.djrapitops.plan.system.processing.Processing;
import com.djrapitops.plan.system.processing.processors.info.NetworkPageUpdateProcessor;
import com.djrapitops.plan.system.processing.processors.info.PlayerPageUpdateProcessor;
import com.djrapitops.plan.system.processing.processors.player.*;
import com.djrapitops.plan.system.tasks.TaskSystem;
import com.djrapitops.plan.utilities.MiscUtils;
import com.djrapitops.plugin.api.systems.NotificationCenter;
import com.djrapitops.plugin.api.utility.log.Log;
import org.spongepowered.api.Sponge;
import org.spongepowered.api.data.key.Keys;
import org.spongepowered.api.entity.living.player.Player;
import org.spongepowered.api.entity.living.player.gamemode.GameMode;
import org.spongepowered.api.event.Listener;
import org.spongepowered.api.event.Order;
import org.spongepowered.api.event.entity.living.humanoid.player.KickPlayerEvent;
import org.spongepowered.api.event.network.ClientConnectionEvent;
import org.spongepowered.api.profile.GameProfile;
import org.spongepowered.api.service.ProviderRegistration;
import org.spongepowered.api.service.ban.BanService;
import java.util.Optional;
import java.util.UUID;
/**
* Listener for Player Join/Leave on Sponge.
*
* @author Rsl1122
*/
public class SpongePlayerListener {
@Listener(order = Order.POST)
public void onLogin(ClientConnectionEvent.Login event) {
try {
actOnLoginEvent(event);
} catch (Exception e) {
Log.toLog(this.getClass(), e);
}
}
private void actOnLoginEvent(ClientConnectionEvent.Login event) {
GameProfile profile = event.getProfile();
UUID uuid = profile.getUniqueId();
boolean banned = isBanned(profile);
Processing.submit(new BanAndOpProcessor(uuid, banned, false));
}
@Listener(order = Order.POST)
public void onKick(KickPlayerEvent event) {
try {
UUID uuid = event.getTargetEntity().getUniqueId();
Processing.submit(new KickProcessor(uuid));
} catch (Exception e) {
Log.toLog(this.getClass(), e);
}
}
private boolean isBanned(GameProfile profile) {
Optional<ProviderRegistration<BanService>> banService = Sponge.getServiceManager().getRegistration(BanService.class);
boolean banned = false;
if (banService.isPresent()) {
banned = banService.get().getProvider().isBanned(profile);
}
return banned;
}
@Listener(order = Order.POST)
public void onJoin(ClientConnectionEvent.Join event) {
try {
actOnJoinEvent(event);
} catch (Exception e) {
Log.toLog(this.getClass(), e);
}
}
private void actOnJoinEvent(ClientConnectionEvent.Join event) {
Player player = event.getTargetEntity();
NotificationCenter.checkNotifications(player);
UUID uuid = player.getUniqueId();
long time = MiscUtils.getTime();
SpongeAFKListener.AFK_TRACKER.performedAction(uuid, time);
String world = player.getWorld().getName();
Optional<GameMode> gameMode = player.getGameModeData().get(Keys.GAME_MODE);
String gm = "ADVENTURE";
if (gameMode.isPresent()) {
gm = gameMode.get().getName().toUpperCase();
}
String ip = player.getConnection().getAddress().getAddress().getHostAddress();
String playerName = player.getName();
String displayName = player.getDisplayNameData().displayName().get().toPlain();
int playersOnline = TaskSystem.getInstance().getTpsCountTimer().getLatestPlayersOnline();
SessionCache.getInstance().cacheSession(uuid, new Session(time, world, gm));
Processing.submit(
new RegisterProcessor(uuid, time, time, playerName, playersOnline,
new IPUpdateProcessor(uuid, ip, time),
new NameProcessor(uuid, playerName, displayName),
new PlayerPageUpdateProcessor(uuid)
)
);
Processing.submit(new NetworkPageUpdateProcessor());
}
@Listener(order = Order.POST)
public void onQuit(ClientConnectionEvent.Disconnect event) {
try {
actOnQuitEvent(event);
} catch (Exception e) {
Log.toLog(this.getClass(), e);
}
}
private void actOnQuitEvent(ClientConnectionEvent.Disconnect event) {
long time = MiscUtils.getTime();
Player player = event.getTargetEntity();
UUID uuid = player.getUniqueId();
SpongeAFKListener.AFK_TRACKER.loggedOut(uuid, time);
Processing.submit(new BanAndOpProcessor(uuid, isBanned(player.getProfile()), false));
Processing.submit(new EndSessionProcessor(uuid, time));
Processing.submit(new NetworkPageUpdateProcessor());
SessionCache sessionCache = SessionCache.getInstance();
if (sessionCache.isFirstSession(uuid)) {
int messagesSent = sessionCache.getFirstSessionMsgCount(uuid);
Processing.submit(new FirstLeaveProcessor(uuid, time, messagesSent));
}
Processing.submit(new PlayerPageUpdateProcessor(uuid));
}
}

View File

@ -0,0 +1,58 @@
package com.djrapitops.plan.system.listeners.sponge;
import com.djrapitops.plan.data.container.Session;
import com.djrapitops.plan.system.cache.SessionCache;
import com.djrapitops.plan.system.settings.WorldAliasSettings;
import com.djrapitops.plan.utilities.MiscUtils;
import com.djrapitops.plugin.api.utility.log.Log;
import org.spongepowered.api.data.key.Keys;
import org.spongepowered.api.entity.living.player.Player;
import org.spongepowered.api.entity.living.player.gamemode.GameMode;
import org.spongepowered.api.event.Listener;
import org.spongepowered.api.event.Order;
import org.spongepowered.api.event.entity.MoveEntityEvent;
import org.spongepowered.api.event.filter.cause.First;
import java.util.Optional;
import java.util.UUID;
/**
* Listener for World change on Sponge.
*
* @author Rsl1122
*/
public class SpongeWorldChangeListener {
@Listener(order = Order.POST)
public void onWorldChange(MoveEntityEvent.Teleport event, @First Player player) {
if (event.isCancelled()) {
return;
}
try {
actOnEvent(event, player);
} catch (Exception e) {
Log.toLog(this.getClass(), e);
}
}
private void actOnEvent(MoveEntityEvent.Teleport event, Player player) {
long time = MiscUtils.getTime();
UUID uuid = player.getUniqueId();
String worldName = event.getToTransform().getExtent().getName();
String gameMode = getGameMode(player);
WorldAliasSettings.addWorld(worldName);
Optional<Session> cachedSession = SessionCache.getCachedSession(uuid);
cachedSession.ifPresent(session -> session.changeState(worldName, gameMode, time));
}
private String getGameMode(Player player) {
Optional<GameMode> gameMode = player.getGameModeData().get(Keys.GAME_MODE);
return gameMode.map(gm -> gm.getName().toUpperCase()).orElse("ADVENTURE");
}
}

View File

@ -23,6 +23,8 @@ import com.djrapitops.plugin.api.utility.log.Log;
import com.djrapitops.plugin.utilities.Verify;
import com.google.common.collect.ImmutableMap;
import java.io.UnsupportedEncodingException;
import java.security.NoSuchAlgorithmException;
import java.util.*;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
@ -228,7 +230,11 @@ public abstract class Importer {
return userImportData.getIps().parallelStream()
.map(ip -> {
String geoLoc = GeolocationCache.getCountry(ip);
return new GeoInfo(ip, geoLoc, date);
try {
return new GeoInfo(ip, geoLoc, date);
} catch (UnsupportedEncodingException | NoSuchAlgorithmException e) {
throw new IllegalArgumentException(e);
}
}).collect(Collectors.toList());
}

View File

@ -2,6 +2,9 @@ package com.djrapitops.plan.system.processing.processors.info;
import com.djrapitops.plan.system.info.InfoSystem;
import com.djrapitops.plan.system.info.connection.WebExceptionLogger;
import com.djrapitops.plugin.api.TimeAmount;
import com.djrapitops.plugin.task.AbsRunnable;
import com.djrapitops.plugin.task.RunnableFactory;
import java.util.UUID;
@ -15,8 +18,17 @@ public class PlayerPageUpdateProcessor implements Runnable {
@Override
public void run() {
WebExceptionLogger.logIfOccurs(this.getClass(),
() -> InfoSystem.getInstance().generateAndCachePlayerPage(uuid)
);
RunnableFactory.createNew("Generate Inspect page: " + uuid, new AbsRunnable() {
@Override
public void run() {
try {
WebExceptionLogger.logIfOccurs(PlayerPageUpdateProcessor.class,
() -> InfoSystem.getInstance().generateAndCachePlayerPage(uuid)
);
} finally {
cancel();
}
}
}).runTaskLaterAsynchronously(TimeAmount.SECOND.ticks() * 20);
}
}

View File

@ -9,8 +9,11 @@ import com.djrapitops.plan.data.container.GeoInfo;
import com.djrapitops.plan.system.cache.GeolocationCache;
import com.djrapitops.plan.system.database.databases.Database;
import com.djrapitops.plan.system.processing.CriticalRunnable;
import com.djrapitops.plan.system.settings.Settings;
import com.djrapitops.plugin.api.utility.log.Log;
import java.io.UnsupportedEncodingException;
import java.security.NoSuchAlgorithmException;
import java.util.UUID;
/**
@ -32,11 +35,13 @@ public class IPUpdateProcessor implements CriticalRunnable {
@Override
public void run() {
String country = GeolocationCache.getCountry(ip);
try {
Database.getActive().save().geoInfo(uuid, new GeoInfo(ip, country, time));
} catch (DBException e) {
Log.toLog(this.getClass(), e);
if (Settings.DATA_GEOLOCATIONS.isTrue()) {
String country = GeolocationCache.getCountry(ip);
try {
Database.getActive().save().geoInfo(uuid, new GeoInfo(ip, country, time));
} catch (DBException | UnsupportedEncodingException | NoSuchAlgorithmException e) {
Log.toLog(this.getClass(), e);
}
}
}
}

View File

@ -0,0 +1,56 @@
package com.djrapitops.plan.system.processing.processors.player;
import com.djrapitops.plan.data.container.PlayerKill;
import com.djrapitops.plan.data.container.Session;
import com.djrapitops.plan.system.cache.SessionCache;
import com.djrapitops.plan.system.processing.CriticalRunnable;
import java.util.Optional;
import java.util.UUID;
/**
* Processor Class for KillEvent information when the killer is a
* player.
* <p>
* Adds PlayerKill or a Mob kill to the active Session.
*
* @author Rsl1122
* @since 4.3.0
*/
public class SpongeKillProcessor implements CriticalRunnable {
private final UUID uuid;
private final UUID deadUUID;
private final String weaponName;
private final long time;
/**
* Constructor.
*
* @param uuid UUID of the killer.
* @param time Epoch ms the event occurred.
* @param deadUUID Dead entity (Mob or Player)
* @param weaponName Weapon used.
*/
public SpongeKillProcessor(UUID uuid, long time, UUID deadUUID, String weaponName) {
this.uuid = uuid;
this.time = time;
this.deadUUID = deadUUID;
this.weaponName = weaponName;
}
@Override
public void run() {
Optional<Session> cachedSession = SessionCache.getCachedSession(uuid);
if (!cachedSession.isPresent()) {
return;
}
Session session = cachedSession.get();
if (deadUUID != null) {
session.playerKilled(new PlayerKill(deadUUID, weaponName, time));
} else {
session.mobKilled();
}
}
}

View File

@ -20,7 +20,7 @@ import java.util.logging.Logger;
*
* @author Rsl1122
*/
public class PlanErrorManager extends ErrorManager {
public class PlanErrorManager implements ErrorManager {
@Override
public void toLog(String source, Throwable e, Class callingPlugin) {

View File

@ -36,6 +36,9 @@ public enum Settings {
FORMAT_DATE_RECENT_DAYS("Customization.Formatting.Dates.RecentDays"),
DISPLAY_PLAYER_IPS("Customization.Display.PlayerIPs"),
DISPLAY_GAPS_IN_GRAPH_DATA("Customization.Display.GapsInGraphData"),
DATA_GEOLOCATIONS("Data.Geolocations"),
ALLOW_UPDATE("Plugin.Allow-Update-Command"),
NOTIFY_ABOUT_DEV_RELEASES("Plugin.Notify-About-DEV-Releases"),
// Integer
WEBSERVER_PORT("WebServer.Port"),
@ -47,6 +50,8 @@ public enum Settings {
MAX_PLAYERS("Customization.Display.MaxPlayers"),
MAX_PLAYERS_PLAYERS_PAGE("Customization.Display.MaxPlayersPlayersPage"),
AFK_THRESHOLD_MINUTES("Data.AFKThresholdMinutes"),
KEEP_LOGS_DAYS("Plugin.KeepLogsForXDays"),
KEEP_INACTIVE_PLAYERS_DAYS("Data.KeepInactivePlayerDataForDays"),
// String
DEBUG("Plugin.Debug"),

View File

@ -15,7 +15,7 @@ import java.io.IOException;
*
* @author Rsl1122
*/
public class BukkitConfigSystem extends ConfigSystem {
public class ServerConfigSystem extends ConfigSystem {
@Override
protected void copyDefaults() throws IOException {

View File

@ -0,0 +1,37 @@
package com.djrapitops.plan.system.settings.config;
import com.djrapitops.plan.api.exceptions.EnableException;
import com.djrapitops.plan.system.file.FileSystem;
import com.djrapitops.plan.system.settings.Settings;
import com.djrapitops.plugin.api.utility.log.Log;
import java.io.IOException;
/**
* Sponge ConfigSystem that disables WebServer and Geolocations on first enable.
*
* @author Rsl1122
*/
public class SpongeConfigSystem extends ServerConfigSystem {
private boolean firstInstall;
@Override
public void enable() throws EnableException {
firstInstall = !FileSystem.getConfigFile().exists();
super.enable();
}
@Override
protected void copyDefaults() throws IOException {
super.copyDefaults();
if (firstInstall) {
Log.info("§eWebServer and Geolocations disabled by default on Sponge servers. You can enable them in the config:");
Log.info("§e " + Settings.WEBSERVER_DISABLED.getPath());
Log.info("§e " + Settings.DATA_GEOLOCATIONS.getPath());
Settings.WEBSERVER_DISABLED.set(true);
Settings.DATA_GEOLOCATIONS.set(false);
Settings.save();
}
}
}

View File

@ -71,7 +71,7 @@ public class Locale {
} else if (locale.equals("DEFAULT")) {
Log.info("Using Locale: Default (EN)");
} else {
loadFromResource("locale_" + locale + ".txt");
loadFromResource("locale/locale_" + locale + ".txt");
}
} catch (IOException e) {
Log.toLog(this.getClass(), e);
@ -203,35 +203,33 @@ public class Locale {
add(Msg.CMD_USG_QANALYZE, "View the Server Analysis as Text");
add(Msg.CMD_USG_HELP, "Show command list.");
add(Msg.CMD_USG_INFO, "Check the version of Plan");
add(Msg.CMD_USG_INSPECT, "Inspect Player's Data");
add(Msg.CMD_USG_QINSPECT, "Inspect Player's Data as Text");
add(Msg.CMD_USG_INSPECT, "Inspect player's data");
add(Msg.CMD_USG_QINSPECT, "Inspect player's data in game");
add(Msg.CMD_USG_LIST, "List to all cached players");
add(Msg.CMD_USG_MANAGE, "Database management command");
add(Msg.CMD_USG_MANAGE_BACKUP, "Backup a database to .db file");
add(Msg.CMD_USG_MANAGE_CLEAN, "Clear old data from the database");
add(Msg.CMD_USG_MANAGE_CLEAR, "Clear ALL data from the database");
add(Msg.CMD_USG_MANAGE_DUMP, "Create a Hastebin log for Dev for easier Issue reporting.");
add(Msg.CMD_USG_MANAGE_HOTSWAP, "Hotswap to another database & restart the plugin");
add(Msg.CMD_USG_MANAGE_IMPORT, "Import Data from supported plugins to Active Database.");
add(Msg.CMD_USG_MANAGE_MOVE, "Copy data from one database to another & overwrite values");
add(Msg.CMD_USG_MANAGE_HOTSWAP, "Hotswap database & restart the plugin");
add(Msg.CMD_USG_MANAGE_IMPORT, "Import Data from plugins");
add(Msg.CMD_USG_MANAGE_MOVE, "Move data between databases");
add(Msg.CMD_USG_MANAGE_REMOVE, "Remove players's data from the Active Database.");
add(Msg.CMD_USG_MANAGE_RESTORE, "Restore a database from a backup file");
add(Msg.CMD_USG_MANAGE_RESTORE, "Restore a database");
add(Msg.CMD_USG_RELOAD, "Restart the Plugin (Reloads config)");
add(Msg.CMD_USG_SEARCH, "Search for player");
add(Msg.CMD_USG_WEB, "Manage Webusers");
add(Msg.CMD_USG_WEB_CHECK, "Check a webuser and their permission level.");
add(Msg.CMD_USG_WEB_DELETE, "Delete a webuser");
add(Msg.CMD_USG_WEB, "Manage Web users");
add(Msg.CMD_USG_WEB_CHECK, "Check a web user's permission level.");
add(Msg.CMD_USG_WEB_DELETE, "Delete a web user");
add(Msg.CMD_USG_WEB_LEVEL, "Info about permission levels.");
add(Msg.CMD_USG_WEB_REGISTER, "Register a user for the webserver");
add(Msg.CMD_USG_WEB_REGISTER, "Register a web user");
add(Msg.CMD_HELP_ANALYZE, mCol + "Analysis Command"
+ "\\" + tCol + " Used to Refresh analysis cache & Access the result page"
+ "\\" + sCol + " /plan status can be used to check status of analysis while it is running."
+ "\\" + sCol + " Aliases: analyze, analyse, analysis, a");
+ "\\" + sCol + " /plan status can be used to check status of analysis while it is running.");
add(Msg.CMD_HELP_QANALYZE, mCol + "Quick Analysis command"
+ "\\" + tCol + " Used to get in game info about analysis."
+ "\\" + sCol + " Has less info than full Analysis web page."
+ "\\" + sCol + " Aliases: qanalyze, ganalyse, qanalysis, qa");
+ "\\" + sCol + " Has less info than full Analysis web page.");
add(Msg.CMD_HELP_PLAN, mCol + "/plan - Main Command"
+ "\\" + tCol + " Used to access all SubCommands & help"
+ "\\" + sCol + " /plan - List subcommands"
@ -242,21 +240,17 @@ public class Locale {
+ "\\" + sCol + " Alias: /plan <name>");
add(Msg.CMD_HELP_QINSPECT, mCol + "Quick Inspect command"
+ "\\" + tCol + " Used to get some inspect info in game."
+ "\\" + sCol + " Has less info than full Inspect web page."
+ "\\" + sCol + " Alias: /plan qi");
+ "\\" + sCol + " Has less info than full Inspect web page.");
add(Msg.CMD_HELP_LIST, mCol + "List command"
+ "\\" + tCol + " Used to get a link to players page."
+ "\\" + sCol + " Players page contains links to all cached inspect pages."
+ "\\" + sCol + " Alias: /plan pl");
+ "\\" + sCol + " Players page contains links to all cached inspect pages.");
add(Msg.CMD_HELP_MANAGE, mCol + "Manage command\\"
+ tCol + " Used to Manage Database of the plugin."
+ "\\" + sCol + " Alias: /plan m"
+ "\\" + sCol + " /plan m - List subcommands"
+ "\\" + sCol + " /plan m <subcommand> ? - in depth help");
add(Msg.CMD_HELP_MANAGE_CLEAR, mCol + "Manage Clear command"
+ "\\" + tCol + " Used to delete ALL data in the active database."
+ "\\" + sCol + " Plugin should be reloaded after successful clear."
+ "\\" + sCol + " Alias: /plan pl");
+ "\\" + sCol + " Plugin should be reloaded after successful clear.");
add(Msg.CMD_HELP_MANAGE_DUMP, mCol + "Manage Dump command"
+ "\\" + tCol + " Used to dump important data for bug reporting to hastebin.");
add(Msg.CMD_HELP_MANAGE_HOTSWAP, mCol + "Manage Hotswap command"
@ -275,8 +269,7 @@ public class Locale {
+ "\\" + sCol + " Users have a permission level:"
+ "\\" + tCol + " 0 - Access to all pages"
+ "\\" + tCol + " 1 - Access to /players & all inspect pages"
+ "\\" + tCol + " 2 - Access to own inspect page"
+ "\\" + sCol + " Alias: /plan web");
+ "\\" + tCol + " 2 - Access to own inspect page");
add(Msg.CMD_HELP_WEB_REGISTER, mCol + "Web Register command"
+ "\\" + tCol + " Used to register a new user for the webserver."
+ "\\" + sCol + " Registering a user for another player requires " + Permissions.MANAGE_WEB.getPerm() + " permission."

View File

@ -1,7 +1,7 @@
package com.djrapitops.plan.system.settings.locale;
import com.djrapitops.plugin.utilities.Verify;
import org.apache.commons.lang3.text.StrSubstitutor;
import org.apache.commons.text.StringSubstitutor;
import java.io.Serializable;
import java.util.HashMap;
@ -30,7 +30,7 @@ public class Message {
replaceMap.put(String.valueOf(i), p[i].toString());
}
StrSubstitutor sub = new StrSubstitutor(replaceMap);
StringSubstitutor sub = new StringSubstitutor(replaceMap);
return sub.replace(content);
}

View File

@ -21,6 +21,8 @@ import java.util.Map;
import java.util.Optional;
import java.util.UUID;
import static com.djrapitops.plan.system.settings.Settings.*;
/**
* Class for managing Config setting transfer from Bungee to Bukkit servers.
*
@ -36,7 +38,7 @@ public class NetworkSettings {
return;
}
if (Settings.BUNGEE_OVERRIDE_STANDALONE_MODE.isTrue() || Settings.BUNGEE_COPY_CONFIG.isFalse()) {
if (BUNGEE_OVERRIDE_STANDALONE_MODE.isTrue() || BUNGEE_COPY_CONFIG.isFalse()) {
return;
}
@ -134,26 +136,51 @@ public class NetworkSettings {
private Map<String, Object> getConfigValues() throws DBException {
Log.debug("NetworkSettings: Loading Config Values..");
Map<String, Object> configValues = new HashMap<>();
addConfigValue(configValues, Settings.DB_TYPE, "mysql");
addConfigValue(configValues, DB_TYPE, "mysql");
Settings[] sameStrings = new Settings[]{
Settings.DB_HOST, Settings.DB_USER, Settings.DB_PASS,
Settings.DB_DATABASE, Settings.DB_LAUNCH_OPTIONS,
Settings.FORMAT_DECIMALS, Settings.FORMAT_SECONDS,
Settings.FORMAT_DAY, Settings.FORMAT_DAYS, Settings.FORMAT_HOURS,
Settings.FORMAT_MINUTES, Settings.FORMAT_MONTHS, Settings.FORMAT_MONTH,
Settings.FORMAT_YEAR, Settings.FORMAT_YEARS, Settings.FORMAT_ZERO_SECONDS,
Settings.USE_SERVER_TIME, Settings.DISPLAY_SESSIONS_AS_TABLE, Settings.APPEND_WORLD_PERC,
Settings.ORDER_WORLD_PIE_BY_PERC, Settings.MAX_SESSIONS, Settings.MAX_PLAYERS,
Settings.MAX_PLAYERS_PLAYERS_PAGE, Settings.PLAYERTABLE_FOOTER, Settings.FORMAT_DATE_RECENT_DAYS,
Settings.FORMAT_DATE_RECENT_DAYS_PATTERN, Settings.FORMAT_DATE_CLOCK, Settings.FORMAT_DATE_NO_SECONDS,
Settings.FORMAT_DATE_FULL, Settings.DISPLAY_PLAYER_IPS, Settings.ACTIVE_LOGIN_THRESHOLD,
Settings.ACTIVE_PLAY_THRESHOLD, Settings.DISPLAY_GAPS_IN_GRAPH_DATA, Settings.AFK_THRESHOLD_MINUTES
DB_HOST,
DB_USER,
DB_PASS,
DB_DATABASE,
DB_LAUNCH_OPTIONS,
FORMAT_DECIMALS,
FORMAT_SECONDS,
FORMAT_DAY,
FORMAT_DAYS,
FORMAT_HOURS,
FORMAT_MINUTES,
FORMAT_MONTHS,
FORMAT_MONTH,
FORMAT_YEAR,
FORMAT_YEARS,
FORMAT_ZERO_SECONDS,
USE_SERVER_TIME,
DISPLAY_SESSIONS_AS_TABLE,
APPEND_WORLD_PERC,
ORDER_WORLD_PIE_BY_PERC,
MAX_SESSIONS,
MAX_PLAYERS,
MAX_PLAYERS_PLAYERS_PAGE,
PLAYERTABLE_FOOTER,
FORMAT_DATE_RECENT_DAYS,
FORMAT_DATE_RECENT_DAYS_PATTERN,
FORMAT_DATE_CLOCK,
FORMAT_DATE_NO_SECONDS,
FORMAT_DATE_FULL,
DISPLAY_PLAYER_IPS,
ACTIVE_LOGIN_THRESHOLD,
ACTIVE_PLAY_THRESHOLD,
DISPLAY_GAPS_IN_GRAPH_DATA,
AFK_THRESHOLD_MINUTES,
DATA_GEOLOCATIONS,
KEEP_LOGS_DAYS,
KEEP_INACTIVE_PLAYERS_DAYS
};
Log.debug("NetworkSettings: Adding Config Values..");
for (Settings setting : sameStrings) {
addConfigValue(configValues, setting, setting.toString());
}
addConfigValue(configValues, Settings.DB_PORT, Settings.DB_PORT.getNumber());
addConfigValue(configValues, DB_PORT, DB_PORT.getNumber());
addServerSpecificValues(configValues);
return configValues;
}
@ -175,18 +202,18 @@ public class NetworkSettings {
ServerSpecificSettings settings = Settings.serverSpecific();
for (UUID serverUUID : Database.getActive().fetch().getServerUUIDs()) {
String theme = settings.getString(serverUUID, Settings.THEME_BASE);
Integer port = settings.getInt(serverUUID, Settings.WEBSERVER_PORT);
String name = settings.getString(serverUUID, Settings.SERVER_NAME);
String theme = settings.getString(serverUUID, THEME_BASE);
Integer port = settings.getInt(serverUUID, WEBSERVER_PORT);
String name = settings.getString(serverUUID, SERVER_NAME);
if (!Verify.isEmpty(theme)) {
addConfigValue(configValues, serverUUID, Settings.THEME_BASE, theme);
addConfigValue(configValues, serverUUID, THEME_BASE, theme);
}
if (port != null && port != 0) {
addConfigValue(configValues, serverUUID, Settings.WEBSERVER_PORT, port);
addConfigValue(configValues, serverUUID, WEBSERVER_PORT, port);
}
if (!Verify.isEmpty(name)) {
addConfigValue(configValues, serverUUID, Settings.SERVER_NAME, name);
addConfigValue(configValues, serverUUID, SERVER_NAME, name);
}
}
}

View File

@ -5,17 +5,9 @@
package com.djrapitops.plan.system.tasks;
import com.djrapitops.plan.Plan;
import com.djrapitops.plan.system.settings.Settings;
import com.djrapitops.plan.system.settings.locale.Locale;
import com.djrapitops.plan.system.settings.locale.Msg;
import com.djrapitops.plan.system.tasks.bukkit.*;
import com.djrapitops.plan.utilities.file.export.HtmlExport;
import com.djrapitops.plugin.api.Benchmark;
import com.djrapitops.plan.system.tasks.server.BukkitTPSCountTimer;
import com.djrapitops.plan.system.tasks.server.PaperTPSCountTimer;
import com.djrapitops.plugin.api.Check;
import com.djrapitops.plugin.api.TimeAmount;
import com.djrapitops.plugin.api.utility.log.Log;
import com.djrapitops.plugin.task.ITask;
import com.djrapitops.plugin.task.RunnableFactory;
import org.bukkit.Bukkit;
/**
@ -23,62 +15,18 @@ import org.bukkit.Bukkit;
*
* @author Rsl1122
*/
public class BukkitTaskSystem extends TaskSystem {
private ITask bootAnalysisTask;
private final Plan plugin;
public class BukkitTaskSystem extends ServerTaskSystem {
public BukkitTaskSystem(Plan plugin) {
super(plugin);
tpsCountTimer = Check.isPaperAvailable()
? new PaperTPSCountTimer(plugin)
: new BukkitTPSCountTimer(plugin);
this.plugin = plugin;
}
@Override
public void enable() {
registerTasks();
}
@Override
public void disable() {
super.disable();
Bukkit.getScheduler().cancelTasks(plugin);
}
private void registerTasks() {
Benchmark.start("Task Registration");
// Analysis refresh settings
int analysisRefreshMinutes = Settings.ANALYSIS_AUTO_REFRESH.getNumber();
boolean analysisRefreshTaskIsEnabled = analysisRefreshMinutes > 0;
long analysisPeriod = analysisRefreshMinutes * TimeAmount.MINUTE.ticks();
Log.info(Locale.get(Msg.ENABLE_BOOT_ANALYSIS_INFO).toString());
registerTask(tpsCountTimer).runTaskTimer(1000, TimeAmount.SECOND.ticks());
registerTask(new NetworkPageRefreshTask()).runTaskTimerAsynchronously(20L, 5L * TimeAmount.MINUTE.ticks());
bootAnalysisTask = registerTask(new BootAnalysisTask()).runTaskLaterAsynchronously(30L * TimeAmount.SECOND.ticks());
if (analysisRefreshTaskIsEnabled) {
registerTask(new PeriodicAnalysisTask()).runTaskTimerAsynchronously(analysisPeriod, analysisPeriod);
}
if (Settings.ANALYSIS_EXPORT.isTrue()) {
RunnableFactory.createNew(new HtmlExport(plugin)).runTaskAsynchronously();
}
Benchmark.stop("Enable", "Task Registration");
}
public void cancelBootAnalysis() {
try {
if (bootAnalysisTask != null) {
bootAnalysisTask.cancel();
bootAnalysisTask = null;
}
} catch (Exception ignored) {
/* Ignored */
}
Bukkit.getScheduler().cancelTasks((Plan) plugin);
}
}

View File

@ -6,9 +6,9 @@ package com.djrapitops.plan.system.tasks;
import com.djrapitops.plan.PlanBungee;
import com.djrapitops.plan.system.settings.Settings;
import com.djrapitops.plan.system.tasks.bukkit.NetworkPageRefreshTask;
import com.djrapitops.plan.system.tasks.bungee.BungeeTPSCountTimer;
import com.djrapitops.plan.system.tasks.bungee.EnableConnectionTask;
import com.djrapitops.plan.system.tasks.server.NetworkPageRefreshTask;
import com.djrapitops.plan.utilities.file.export.HtmlExport;
import com.djrapitops.plugin.api.TimeAmount;

View File

@ -0,0 +1,54 @@
package com.djrapitops.plan.system.tasks;
import com.djrapitops.plan.system.settings.Settings;
import com.djrapitops.plugin.api.TimeAmount;
import com.djrapitops.plugin.api.utility.log.Log;
import com.djrapitops.plugin.task.AbsRunnable;
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import java.util.Objects;
/**
* Task in charge of removing old log files
*
* @author Rsl1122
*/
public class LogsFolderCleanTask extends AbsRunnable {
private final File folder;
public LogsFolderCleanTask(File folder) {
super(LogsFolderCleanTask.class.getSimpleName());
this.folder = folder;
}
@Override
public void run() {
try {
if (!folder.exists() || folder.isFile()) {
return;
}
cleanFolder();
} catch (NullPointerException ignore) {
/* Ignored - not supposed to occur. */
} finally {
cancel();
}
}
private void cleanFolder() {
long now = System.currentTimeMillis();
for (File file : Objects.requireNonNull(folder.listFiles())) {
long forDaysMs = Settings.KEEP_LOGS_DAYS.getNumber() * TimeAmount.DAY.ms();
if (now - file.lastModified() > (forDaysMs > 0 ? forDaysMs : TimeAmount.DAY.ms())) {
try {
Files.delete(file.toPath());
} catch (IOException e) {
Log.warn("Could not delete log file at: " + file.getAbsolutePath() + ", " + e.getMessage());
}
}
}
}
}

View File

@ -0,0 +1,69 @@
package com.djrapitops.plan.system.tasks;
import com.djrapitops.plan.PlanPlugin;
import com.djrapitops.plan.system.settings.Settings;
import com.djrapitops.plan.system.settings.locale.Locale;
import com.djrapitops.plan.system.settings.locale.Msg;
import com.djrapitops.plan.system.tasks.server.BootAnalysisTask;
import com.djrapitops.plan.system.tasks.server.NetworkPageRefreshTask;
import com.djrapitops.plan.system.tasks.server.PeriodicAnalysisTask;
import com.djrapitops.plan.utilities.file.export.HtmlExport;
import com.djrapitops.plugin.api.Benchmark;
import com.djrapitops.plugin.api.TimeAmount;
import com.djrapitops.plugin.api.utility.log.Log;
import com.djrapitops.plugin.task.ITask;
import com.djrapitops.plugin.task.RunnableFactory;
/**
* Abstracted TaskSystem implementation for both Bukkit and Sponge.
*
* @author Rsl1122
*/
public class ServerTaskSystem extends TaskSystem {
protected final PlanPlugin plugin;
protected ITask bootAnalysisTask;
public ServerTaskSystem(PlanPlugin plugin) {
this.plugin = plugin;
}
@Override
public void enable() {
registerTasks();
}
private void registerTasks() {
Benchmark.start("Task Registration");
// Analysis refresh settings
int analysisRefreshMinutes = Settings.ANALYSIS_AUTO_REFRESH.getNumber();
boolean analysisRefreshTaskIsEnabled = analysisRefreshMinutes > 0;
long analysisPeriod = analysisRefreshMinutes * TimeAmount.MINUTE.ticks();
Log.info(Locale.get(Msg.ENABLE_BOOT_ANALYSIS_INFO).toString());
registerTask(tpsCountTimer).runTaskTimer(1000, TimeAmount.SECOND.ticks());
registerTask(new NetworkPageRefreshTask()).runTaskTimerAsynchronously(20L, 5L * TimeAmount.MINUTE.ticks());
bootAnalysisTask = registerTask(new BootAnalysisTask()).runTaskLaterAsynchronously(30L * TimeAmount.SECOND.ticks());
if (analysisRefreshTaskIsEnabled) {
registerTask(new PeriodicAnalysisTask()).runTaskTimerAsynchronously(analysisPeriod, analysisPeriod);
}
if (Settings.ANALYSIS_EXPORT.isTrue()) {
RunnableFactory.createNew(new HtmlExport(plugin)).runTaskAsynchronously();
}
Benchmark.stop("Enable", "Task Registration");
}
public void cancelBootAnalysis() {
try {
if (bootAnalysisTask != null) {
bootAnalysisTask.cancel();
bootAnalysisTask = null;
}
} catch (Exception ignored) {
/* Ignored */
}
}
}

View File

@ -1,9 +1,22 @@
package com.djrapitops.plan.system.tasks;
public class SpongeTaskSystem extends TaskSystem {
import com.djrapitops.plan.PlanSponge;
import com.djrapitops.plan.system.tasks.server.SpongeTPSCountTimer;
import org.spongepowered.api.Sponge;
import org.spongepowered.api.scheduler.Task;
public class SpongeTaskSystem extends ServerTaskSystem {
public SpongeTaskSystem(PlanSponge plugin) {
super(plugin);
tpsCountTimer = new SpongeTPSCountTimer(plugin);
}
@Override
public void enable() {
public void disable() {
super.disable();
for (Task task : Sponge.getScheduler().getScheduledTasks(plugin)) {
task.cancel();
}
}
}

View File

@ -1,4 +1,4 @@
package com.djrapitops.plan.system.tasks.bukkit;
package com.djrapitops.plan.system.tasks.server;
import com.djrapitops.plan.PlanPlugin;
import com.djrapitops.plan.system.info.InfoSystem;

View File

@ -1,4 +1,4 @@
package com.djrapitops.plan.system.tasks.bukkit;
package com.djrapitops.plan.system.tasks.server;
import com.djrapitops.plan.Plan;
import com.djrapitops.plan.data.container.TPS;

View File

@ -1,4 +1,4 @@
package com.djrapitops.plan.system.tasks.bukkit;
package com.djrapitops.plan.system.tasks.server;
import com.djrapitops.plan.system.info.InfoSystem;
import com.djrapitops.plan.system.info.connection.WebExceptionLogger;

View File

@ -1,4 +1,4 @@
package com.djrapitops.plan.system.tasks.bukkit;
package com.djrapitops.plan.system.tasks.server;
import com.djrapitops.plan.Plan;
import com.djrapitops.plan.data.container.TPS;

View File

@ -1,4 +1,4 @@
package com.djrapitops.plan.system.tasks.bukkit;
package com.djrapitops.plan.system.tasks.server;
import com.djrapitops.plan.PlanPlugin;
import com.djrapitops.plan.system.info.InfoSystem;

View File

@ -0,0 +1,105 @@
package com.djrapitops.plan.system.tasks.server;
import com.djrapitops.plan.PlanSponge;
import com.djrapitops.plan.data.container.TPS;
import com.djrapitops.plan.data.container.builders.TPSBuilder;
import com.djrapitops.plan.system.info.server.ServerInfo;
import com.djrapitops.plan.system.tasks.TPSCountTimer;
import com.djrapitops.plan.utilities.analysis.MathUtils;
import com.djrapitops.plugin.api.utility.log.Log;
import org.spongepowered.api.Sponge;
import org.spongepowered.api.world.Chunk;
import org.spongepowered.api.world.World;
import java.lang.management.ManagementFactory;
import java.lang.management.OperatingSystemMXBean;
import java.util.Iterator;
public class SpongeTPSCountTimer extends TPSCountTimer<PlanSponge> {
private long lastCheckNano;
public SpongeTPSCountTimer(PlanSponge plugin) {
super(plugin);
lastCheckNano = -1;
}
@Override
public void addNewTPSEntry(long nanoTime, long now) {
long diff = nanoTime - lastCheckNano;
lastCheckNano = nanoTime;
if (diff > nanoTime) { // First run's diff = nanoTime + 1, no calc possible.
Log.debug("First run of TPSCountTimer Task.");
return;
}
history.add(calculateTPS(diff, now));
}
/**
* Calculates the TPS
*
* @param diff The time difference between the last run and the new run
* @param now The time right now
* @return the TPS
*/
private TPS calculateTPS(long diff, long now) {
OperatingSystemMXBean operatingSystemMXBean = ManagementFactory.getOperatingSystemMXBean();
int availableProcessors = operatingSystemMXBean.getAvailableProcessors();
double averageCPUUsage = MathUtils.round(operatingSystemMXBean.getSystemLoadAverage() / availableProcessors * 100.0);
if (averageCPUUsage < 0) { // If unavailable, getSystemLoadAverage() returns -1
averageCPUUsage = -1;
}
Runtime runtime = Runtime.getRuntime();
long totalMemory = runtime.totalMemory();
long usedMemory = (totalMemory - runtime.freeMemory()) / 1000000;
double tps = Sponge.getGame().getServer().getTicksPerSecond();
int playersOnline = ServerInfo.getServerProperties().getOnlinePlayers();
latestPlayersOnline = playersOnline;
int loadedChunks = -1;
int entityCount = getEntityCount();
return TPSBuilder.get()
.date(now)
.tps(tps)
.playersOnline(playersOnline)
.usedCPU(averageCPUUsage)
.usedMemory(usedMemory)
.entities(entityCount)
.chunksLoaded(loadedChunks)
.toTPS();
}
/**
* Gets the amount of loaded chunks
*
* @return amount of loaded chunks
*/
private int getLoadedChunks() {
// DISABLED
int loaded = 0;
for (World world : Sponge.getGame().getServer().getWorlds()) {
Iterator<Chunk> iterator = world.getLoadedChunks().iterator();
while (iterator.hasNext()) {
loaded++;
}
}
return loaded;
}
/**
* Gets the amount of entities on the server
*
* @return amount of entities
*/
protected int getEntityCount() {
return Sponge.getGame().getServer().getWorlds().stream().mapToInt(world -> world.getEntities().size()).sum();
}
}

View File

@ -0,0 +1,139 @@
package com.djrapitops.plan.system.update;
import com.djrapitops.plan.PlanPlugin;
import com.djrapitops.plugin.api.Check;
import com.djrapitops.plugin.api.utility.Version;
import com.djrapitops.plugin.api.utility.log.Log;
import java.io.*;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.HashSet;
import java.util.Set;
/**
* Shutdown hook that updates the plugin on server shutdown.
* <p>
* Does not perform update on force close.
*
* @author Rsl1122
*/
public class ShutdownUpdateHook extends Thread {
private static boolean activated = false;
private static File newJar;
private static Set<File> toDelete = new HashSet<>();
private static boolean isActivated() {
return activated;
}
public static void activate() {
activated = true;
VersionInfo available = VersionCheckSystem.getInstance().getNewVersionAvailable();
if (!Version.isNewVersionAvailable(new Version(VersionCheckSystem.getCurrentVersion()), available.getVersion())) {
return;
}
try {
File pluginsFolder = getPluginsFolder();
newJar = new File(pluginsFolder, "Plan-" + available.getVersion() + ".jar");
downloadNewJar(available, newJar);
registerOldJarForDeletion(pluginsFolder, newJar);
} catch (IOException e) {
e.printStackTrace();
}
}
private static File getPluginsFolder() throws FileNotFoundException {
File dataFolder = PlanPlugin.getInstance().getDataFolder();
File pluginsFolder = Check.isSpongeAvailable()
? new File(dataFolder.getParentFile().getParentFile().getPath(), "mods")
: new File(dataFolder.getParentFile().getPath());
if (!pluginsFolder.isDirectory()) {
throw new FileNotFoundException("Could not get plugin folder for Plan.");
}
return pluginsFolder;
}
public static void deActivate() {
activated = false;
Log.infoColor("§aUpdate has been cancelled.");
if (newJar != null && newJar.exists()) {
if (!newJar.delete()) {
newJar.deleteOnExit();
}
}
toDelete.clear();
}
public static void registerOldJarForDeletion(File pluginsFolder, File newFileLocation) throws FileNotFoundException {
File[] files = pluginsFolder.listFiles();
if (files == null) {
throw new FileNotFoundException("Could not delete old jar.");
}
for (File file : files) {
String fileName = file.getName();
boolean isPlanJar = (fileName.startsWith("Plan-") && fileName.endsWith(".jar"))
|| fileName.equals("Plan.jar");
boolean isNewJar = fileName.equals(newFileLocation.getName());
if (isPlanJar && !isNewJar) {
toDelete.add(file);
}
}
}
public static void downloadNewJar(VersionInfo available, File newFileLocation) throws IOException {
URL downloadFrom = new URL(available.getDownloadUrl());
try (
BufferedInputStream in = new BufferedInputStream(downloadFrom.openStream());
FileOutputStream fout = new FileOutputStream(newFileLocation)
) {
final byte data[] = new byte[1024];
int count;
while ((count = in.read(data, 0, 1024)) != -1) {
fout.write(data, 0, count);
}
}
}
public void register() {
if (isActivated()) {
return;
}
Log.infoColor("§aUpdate has been scheduled, Downloading new jar.. Restart server to take effect.");
activate();
Runtime.getRuntime().addShutdownHook(this);
}
@Override
public void run() {
if (!(Check.isBukkitAvailable() && Check.isSpongeAvailable() && Check.isBungeeAvailable())) {
unloadJar();
}
for (File f : toDelete) {
if (!f.delete()) {
f.deleteOnExit();
}
}
}
private void unloadJar() {
ClassLoader classLoader = PlanPlugin.class.getClassLoader();
if (classLoader instanceof URLClassLoader) {
try {
((URLClassLoader) classLoader).close();
} catch (IOException e) {
e.printStackTrace();
}
}
System.gc();
}
}

View File

@ -6,6 +6,7 @@ package com.djrapitops.plan.system.update;
import com.djrapitops.plan.system.PlanSystem;
import com.djrapitops.plan.system.SubSystem;
import com.djrapitops.plan.system.settings.Settings;
import com.djrapitops.plugin.api.Priority;
import com.djrapitops.plugin.api.systems.NotificationCenter;
import com.djrapitops.plugin.api.utility.Version;
@ -13,6 +14,8 @@ import com.djrapitops.plugin.api.utility.log.Log;
import com.djrapitops.plugin.utilities.Verify;
import java.io.IOException;
import java.util.List;
import java.util.stream.Collectors;
/**
* System for checking if new Version is available when the System initializes.
@ -22,7 +25,7 @@ import java.io.IOException;
public class VersionCheckSystem implements SubSystem {
private final String currentVersion;
private boolean newVersionAvailable = false;
private VersionInfo newVersionAvailable;
public VersionCheckSystem(String currentVersion) {
this.currentVersion = currentVersion;
@ -35,7 +38,7 @@ public class VersionCheckSystem implements SubSystem {
}
public static boolean isNewVersionAvailable() {
return getInstance().newVersionAvailable;
return getInstance().newVersionAvailable != null;
}
public static String getCurrentVersion() {
@ -44,14 +47,40 @@ public class VersionCheckSystem implements SubSystem {
@Override
public void enable() {
checkForNewVersion();
if (Settings.ALLOW_UPDATE.isTrue()) {
try {
List<VersionInfo> versions = VersionInfoLoader.load();
if (Settings.NOTIFY_ABOUT_DEV_RELEASES.isFalse()) {
versions = versions.stream().filter(VersionInfo::isRelease).collect(Collectors.toList());
}
VersionInfo newestVersion = versions.get(0);
if (Version.isNewVersionAvailable(new Version(currentVersion), newestVersion.getVersion())) {
newVersionAvailable = newestVersion;
String notification =
"New Release (" + newestVersion.getVersion().toString() + ") is available " +
// "and can be updated to using update subcommand." +
newestVersion.getChangeLogUrl() +
(newestVersion.isRelease() ? "" : " This is a DEV release.");
Log.infoColor("§a----------------------------------------");
Log.infoColor("§a" + notification);
Log.infoColor("§a----------------------------------------");
NotificationCenter.addNotification(newestVersion.isRelease() ? Priority.HIGH : Priority.MEDIUM, notification);
} else {
Log.info("You're using the latest version.");
}
} catch (IOException e) {
Log.error("Version information could not be loaded from Github/versions.txt");
}
} else {
checkForNewVersion();
}
}
private void checkForNewVersion() {
String githubVersionUrl = "https://raw.githubusercontent.com/Rsl1122/Plan-PlayerAnalytics/master/Plan/src/main/resources/plugin.yml";
String spigotUrl = "https://www.spigotmc.org/resources/plan-player-analytics.32536/";
try {
newVersionAvailable = Version.checkVersion(currentVersion, githubVersionUrl);
boolean newVersionAvailable = Version.checkVersion(currentVersion, githubVersionUrl);
if (!newVersionAvailable) {
try {
newVersionAvailable = Version.checkVersion(currentVersion, spigotUrl);
@ -77,4 +106,8 @@ public class VersionCheckSystem implements SubSystem {
public void disable() {
/* Does not need to be closed */
}
public VersionInfo getNewVersionAvailable() {
return newVersionAvailable;
}
}

View File

@ -0,0 +1,63 @@
package com.djrapitops.plan.system.update;
import com.djrapitops.plugin.api.utility.Version;
import com.google.common.base.Objects;
/**
* Data class for reading version.txt in https://github.com/Rsl1122/Plan-PlayerAnalytics.
*
* @author Rsl1122
*/
public class VersionInfo implements Comparable<VersionInfo> {
private final boolean release;
private final Version version;
private final String downloadUrl;
private final String changeLogUrl;
public VersionInfo(boolean release, Version version, String downloadUrl, String changeLogUrl) {
this.release = release;
this.version = version;
this.downloadUrl = downloadUrl;
this.changeLogUrl = changeLogUrl;
}
public boolean isRelease() {
return release;
}
public Version getVersion() {
return version;
}
public String getDownloadUrl() {
return downloadUrl;
}
public String getChangeLogUrl() {
return changeLogUrl;
}
public boolean isTrusted() {
return downloadUrl.startsWith("https://github.com/Rsl1122/Plan-PlayerAnalytics/releases/download/");
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
VersionInfo that = (VersionInfo) o;
return release == that.release &&
Objects.equal(version, that.version);
}
@Override
public int hashCode() {
return Objects.hashCode(release, version);
}
@Override
public int compareTo(VersionInfo o) {
return -this.version.compareTo(o.version);
}
}

View File

@ -0,0 +1,57 @@
package com.djrapitops.plan.system.update;
import com.djrapitops.plugin.api.utility.Version;
import java.io.IOException;
import java.net.URL;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Scanner;
/**
* Utility for loading version information from github.
*
* @author Rsl1122
*/
public class VersionInfoLoader {
private static final String VERSION_TXT_URL =
"https://raw.githubusercontent.com/Rsl1122/Plan-PlayerAnalytics/master/versions.txt";
/**
* Loads version information from github.
*
* @return List of VersionInfo, newest version first.
* @throws IOException If site can not be accessed.
* @throws java.net.MalformedURLException If VERSION_TXT_URL is not valid.
*/
public static List<VersionInfo> load() throws IOException {
URL url = new URL(VERSION_TXT_URL);
List<VersionInfo> versionInfo = new ArrayList<>();
try (Scanner websiteScanner = new Scanner(url.openStream())) {
while (websiteScanner.hasNextLine()) {
String line = websiteScanner.nextLine();
if (!line.startsWith("REL") && !line.startsWith("DEV")) {
continue;
}
String[] parts = line.split("\\|");
if (parts.length < 4) {
continue;
}
boolean release = parts[0].equals("REL");
Version version = new Version(parts[1]);
String downloadUrl = parts[2];
String changeLogUrl = parts[3];
versionInfo.add(new VersionInfo(release, version, downloadUrl, changeLogUrl));
}
}
Collections.sort(versionInfo);
return versionInfo;
}
}

View File

@ -45,7 +45,7 @@ public class RequestHandler implements HttpHandler {
Response response = responseHandler.getResponse(request);
responseCode = response.getCode();
if (response instanceof PromptAuthorizationResponse) {
responseHeaders.set("WWW-Authenticate", "Basic realm=\"/\";");
responseHeaders.set("WWW-Authenticate", "Basic realm=\"/\"");
}
response.setResponseHeaders(responseHeaders);

View File

@ -2,7 +2,7 @@ package com.djrapitops.plan.system.webserver.response;
import com.djrapitops.plan.system.settings.theme.Theme;
import com.djrapitops.plan.system.settings.theme.ThemeVal;
import org.apache.commons.lang3.text.StrSubstitutor;
import org.apache.commons.text.StringSubstitutor;
import java.util.HashMap;
import java.util.Map;
@ -18,6 +18,6 @@ public class JavaScriptResponse extends FileResponse {
super.setType(ResponseType.JAVASCRIPT);
Map<String, String> replace = new HashMap<>();
replace.put("defaultTheme", Theme.getValue(ThemeVal.THEME_DEFAULT));
setContent(StrSubstitutor.replace(Theme.replaceColors(getContent()), replace));
setContent(StringSubstitutor.replace(Theme.replaceColors(getContent()), replace));
}
}

View File

@ -9,7 +9,7 @@ import com.djrapitops.plan.system.webserver.response.Response;
import com.djrapitops.plan.utilities.MiscUtils;
import com.djrapitops.plan.utilities.file.FileUtil;
import com.djrapitops.plugin.api.utility.log.Log;
import org.apache.commons.lang3.text.StrSubstitutor;
import org.apache.commons.text.StringSubstitutor;
import java.io.IOException;
import java.util.HashMap;
@ -41,7 +41,7 @@ public class ErrorResponse extends Response {
placeHolders.put("paragraph", paragraph);
placeHolders.put("version", MiscUtils.getPlanVersion());
setContent(StrSubstitutor.replace(getContent(), placeHolders));
setContent(StringSubstitutor.replace(getContent(), placeHolders));
}
public void setTitle(String title) {

View File

@ -6,7 +6,7 @@ import com.djrapitops.plan.system.webserver.response.cache.PageId;
import com.djrapitops.plan.system.webserver.response.cache.ResponseCache;
import com.djrapitops.plan.system.webserver.response.errors.ErrorResponse;
import com.djrapitops.plan.system.webserver.response.pages.parts.InspectPagePluginsContent;
import org.apache.commons.lang3.text.StrSubstitutor;
import org.apache.commons.text.StringSubstitutor;
import java.util.HashMap;
import java.util.Map;
@ -35,7 +35,7 @@ public class InspectPageResponse extends Response {
replaceMap.put("navPluginsTabs", inspectPagePluginsTab[0]);
replaceMap.put("pluginsTabs", inspectPagePluginsTab[1]);
return StrSubstitutor.replace(super.getContent(), replaceMap);
return StringSubstitutor.replace(super.getContent(), replaceMap);
}
private String[] getCalculating() {

View File

@ -20,7 +20,7 @@ import com.djrapitops.plan.utilities.file.FileUtil;
import com.djrapitops.plan.utilities.html.Html;
import com.djrapitops.plugin.api.Check;
import com.djrapitops.plugin.api.utility.log.Log;
import org.apache.commons.lang3.text.StrSubstitutor;
import org.apache.commons.text.StringSubstitutor;
import java.io.IOException;
import java.util.*;
@ -47,7 +47,7 @@ public class PlayersPageResponse extends Response {
}
replace.put("playersTable", buildPlayersTable(db));
replace.put("version", plugin.getVersion());
super.setContent(Theme.replaceColors(StrSubstitutor.replace(FileUtil.getStringFromResource("web/players.html"), replace)));
super.setContent(Theme.replaceColors(StringSubstitutor.replace(FileUtil.getStringFromResource("web/players.html"), replace)));
} catch (DBException | IOException e) {
Log.toLog(this.getClass(), e);
setContent(new InternalErrorResponse("/players", e).getContent());

View File

@ -276,10 +276,13 @@ public class FormatUtils {
}
public static String formatIP(String ip) {
if ("localhost".equals(ip)) {
return ip;
}
StringBuilder b = new StringBuilder();
int i = 0;
for (String part : ip.split("\\.")) {
if (i >= 3) {
if (i >= 2) {
break;
}
@ -288,7 +291,7 @@ public class FormatUtils {
i++;
}
return b.append("xx").toString();
return b.append("xx.xx").toString();
}
/**

View File

@ -1,14 +1,12 @@
package com.djrapitops.plan.utilities;
import com.djrapitops.plan.Plan;
import com.djrapitops.plan.PlanBungee;
import com.djrapitops.plan.PlanPlugin;
import com.djrapitops.plan.api.exceptions.database.DBException;
import com.djrapitops.plan.system.database.databases.Database;
import com.djrapitops.plan.system.settings.Permissions;
import com.djrapitops.plan.system.settings.Settings;
import com.djrapitops.plan.system.settings.locale.Locale;
import com.djrapitops.plan.system.settings.locale.Msg;
import com.djrapitops.plugin.api.Check;
import com.djrapitops.plugin.api.TimeAmount;
import com.djrapitops.plugin.api.utility.log.Log;
import com.djrapitops.plugin.command.CommandUtils;
@ -142,10 +140,6 @@ public class MiscUtils {
}
public static String getPlanVersion() {
if (Check.isBukkitAvailable()) {
return Plan.getInstance().getDescription().getVersion();
} else {
return PlanBungee.getInstance().getDescription().getVersion();
}
return PlanPlugin.getInstance().getVersion();
}
}

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