Merge pull request #592 from Rsl1122/4.3.2

PR for 4.3.2
This commit is contained in:
Rsl1122 2018-05-31 10:13:51 +03:00 committed by GitHub
commit 030995ffcb
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
140 changed files with 1402 additions and 1004 deletions

View File

@ -71,6 +71,20 @@
<exclude>org.apache.logging.*</exclude> <exclude>org.apache.logging.*</exclude>
</excludes> </excludes>
</relocation> </relocation>
<relocation>
<pattern>com.maxmind</pattern>
<shadedPattern>plan.com.maxmind</shadedPattern>
<excludes>
<exclude>org.apache.logging.*</exclude>
</excludes>
</relocation>
<relocation>
<pattern>com.fasterxml</pattern>
<shadedPattern>plan.com.fasterxml</shadedPattern>
<excludes>
<exclude>org.apache.logging.*</exclude>
</excludes>
</relocation>
</relocations> </relocations>
</configuration> </configuration>
</plugin> </plugin>

View File

@ -200,6 +200,20 @@
<exclude>org.apache.logging.*</exclude> <exclude>org.apache.logging.*</exclude>
</excludes> </excludes>
</relocation> </relocation>
<relocation>
<pattern>com.maxmind</pattern>
<shadedPattern>plan.com.maxmind</shadedPattern>
<excludes>
<exclude>org.apache.logging.*</exclude>
</excludes>
</relocation>
<relocation>
<pattern>com.fasterxml</pattern>
<shadedPattern>plan.com.fasterxml</shadedPattern>
<excludes>
<exclude>org.apache.logging.*</exclude>
</excludes>
</relocation>
</relocations> </relocations>
</configuration> </configuration>
</plugin> </plugin>

View File

@ -23,7 +23,7 @@ import org.spongepowered.api.plugin.Plugin;
import java.io.File; import java.io.File;
import java.io.InputStream; import java.io.InputStream;
@Plugin(id = "plan", name = "Plan", version = "4.3.1", description = "Player Analytics Plugin by Rsl1122", authors = {"Rsl1122"}) @Plugin(id = "plan", name = "Plan", version = "4.3.2", description = "Player Analytics Plugin by Rsl1122", authors = {"Rsl1122"})
public class PlanSponge extends SpongePlugin implements PlanPlugin { public class PlanSponge extends SpongePlugin implements PlanPlugin {
@Inject @Inject
@ -114,7 +114,7 @@ public class PlanSponge extends SpongePlugin implements PlanPlugin {
@Override @Override
public String getVersion() { public String getVersion() {
return "4.2.1"; return "4.3.2";
} }
public SpongeSystem getSystem() { public SpongeSystem getSystem() {

View File

@ -13,7 +13,6 @@ import com.djrapitops.plan.system.cache.CacheSystem;
import com.djrapitops.plan.system.cache.DataCache; import com.djrapitops.plan.system.cache.DataCache;
import com.djrapitops.plan.system.cache.SessionCache; import com.djrapitops.plan.system.cache.SessionCache;
import com.djrapitops.plan.system.database.databases.Database; import com.djrapitops.plan.system.database.databases.Database;
import com.djrapitops.plan.utilities.MiscUtils;
import com.djrapitops.plugin.api.utility.log.Log; import com.djrapitops.plugin.api.utility.log.Log;
import java.util.Map; import java.util.Map;
@ -53,7 +52,7 @@ public class ShutdownHook extends Thread {
Database db = null; Database db = null;
try { try {
Map<UUID, Session> activeSessions = SessionCache.getActiveSessions(); Map<UUID, Session> activeSessions = SessionCache.getActiveSessions();
long now = MiscUtils.getTime(); long now = System.currentTimeMillis();
db = Database.getActive(); db = Database.getActive();
saveFirstSessionInformation(db, now); saveFirstSessionInformation(db, now);
saveActiveSessions(db, activeSessions, now); saveActiveSessions(db, activeSessions, now);

View File

@ -4,6 +4,8 @@
*/ */
package com.djrapitops.plan.api.exceptions.connection; package com.djrapitops.plan.api.exceptions.connection;
import com.djrapitops.plan.system.webserver.response.ResponseCode;
/** /**
* Thrown when connection is returned 401 Bad Request. * Thrown when connection is returned 401 Bad Request.
* *
@ -12,6 +14,6 @@ package com.djrapitops.plan.api.exceptions.connection;
public class BadRequestException extends WebException { public class BadRequestException extends WebException {
public BadRequestException(String message) { public BadRequestException(String message) {
super(message); super(message, ResponseCode.BAD_REQUEST);
} }
} }

View File

@ -4,6 +4,8 @@
*/ */
package com.djrapitops.plan.api.exceptions.connection; package com.djrapitops.plan.api.exceptions.connection;
import com.djrapitops.plan.system.webserver.response.ResponseCode;
/** /**
* Thrown when Connection fails to connect to an address. * Thrown when Connection fails to connect to an address.
* *
@ -12,10 +14,10 @@ package com.djrapitops.plan.api.exceptions.connection;
public class ConnectionFailException extends WebException { public class ConnectionFailException extends WebException {
public ConnectionFailException(String message, Throwable cause) { public ConnectionFailException(String message, Throwable cause) {
super(message, cause); super(message, cause, ResponseCode.CONNECTION_REFUSED);
} }
public ConnectionFailException(Throwable cause) { public ConnectionFailException(Throwable cause) {
super(cause); super(cause, ResponseCode.CONNECTION_REFUSED);
} }
} }

View File

@ -4,6 +4,8 @@
*/ */
package com.djrapitops.plan.api.exceptions.connection; package com.djrapitops.plan.api.exceptions.connection;
import com.djrapitops.plan.system.webserver.response.ResponseCode;
/** /**
* Thrown when Connection gets a 403 response. * Thrown when Connection gets a 403 response.
* *
@ -11,6 +13,6 @@ package com.djrapitops.plan.api.exceptions.connection;
*/ */
public class ForbiddenException extends WebFailException { public class ForbiddenException extends WebFailException {
public ForbiddenException(String url) { public ForbiddenException(String url) {
super("Forbidden: " + url); super("Forbidden: " + url, ResponseCode.FORBIDDEN);
} }
} }

View File

@ -4,6 +4,8 @@
*/ */
package com.djrapitops.plan.api.exceptions.connection; package com.djrapitops.plan.api.exceptions.connection;
import com.djrapitops.plan.system.webserver.response.ResponseCode;
/** /**
* Thrown when InfoRequest can not connect to the other server. * Thrown when InfoRequest can not connect to the other server.
* *
@ -12,14 +14,6 @@ package com.djrapitops.plan.api.exceptions.connection;
public class GatewayException extends WebException { public class GatewayException extends WebException {
public GatewayException(String message) { public GatewayException(String message) {
super(message); super(message, ResponseCode.GATEWAY_ERROR);
}
public GatewayException(String message, Throwable cause) {
super(message, cause);
}
public GatewayException(Throwable cause) {
super(cause);
} }
} }

View File

@ -4,6 +4,8 @@
*/ */
package com.djrapitops.plan.api.exceptions.connection; package com.djrapitops.plan.api.exceptions.connection;
import com.djrapitops.plan.system.webserver.response.ResponseCode;
/** /**
* Thrown when Connection returns 500. * Thrown when Connection returns 500.
* *
@ -11,10 +13,10 @@ package com.djrapitops.plan.api.exceptions.connection;
*/ */
public class InternalErrorException extends WebFailException { public class InternalErrorException extends WebFailException {
public InternalErrorException() { public InternalErrorException() {
super("Internal Error occurred on receiving server"); super("Internal Error occurred on receiving server", ResponseCode.INTERNAL_ERROR);
} }
public InternalErrorException(String message, Throwable cause) { public InternalErrorException(String message, Throwable cause) {
super(message, cause); super(message, cause, ResponseCode.INTERNAL_ERROR);
} }
} }

View File

@ -4,6 +4,8 @@
*/ */
package com.djrapitops.plan.api.exceptions.connection; package com.djrapitops.plan.api.exceptions.connection;
import com.djrapitops.plan.system.webserver.response.ResponseCode;
/** /**
* Thrown when Connection returns 404, when page is not found. * Thrown when Connection returns 404, when page is not found.
* *
@ -11,6 +13,6 @@ package com.djrapitops.plan.api.exceptions.connection;
*/ */
public class NotFoundException extends WebFailException { public class NotFoundException extends WebFailException {
public NotFoundException(String message) { public NotFoundException(String message) {
super(message); super(message, ResponseCode.NOT_FOUND);
} }
} }

View File

@ -4,6 +4,8 @@
*/ */
package com.djrapitops.plan.api.exceptions.connection; package com.djrapitops.plan.api.exceptions.connection;
import com.djrapitops.plan.system.webserver.response.ResponseCode;
/** /**
* Thrown when Connection gets a 412 response due to ServerUUID not being in the database. * Thrown when Connection gets a 412 response due to ServerUUID not being in the database.
* *
@ -12,14 +14,14 @@ package com.djrapitops.plan.api.exceptions.connection;
public class UnauthorizedServerException extends WebFailException { public class UnauthorizedServerException extends WebFailException {
public UnauthorizedServerException(String message) { public UnauthorizedServerException(String message) {
super(message); super(message, ResponseCode.PRECONDITION_FAILED);
} }
public UnauthorizedServerException(String message, Throwable cause) { public UnauthorizedServerException(String message, Throwable cause) {
super(message, cause); super(message, cause, ResponseCode.PRECONDITION_FAILED);
} }
public UnauthorizedServerException(Throwable cause) { public UnauthorizedServerException(Throwable cause) {
super(cause); super(cause, ResponseCode.PRECONDITION_FAILED);
} }
} }

View File

@ -4,6 +4,8 @@
*/ */
package com.djrapitops.plan.api.exceptions.connection; package com.djrapitops.plan.api.exceptions.connection;
import com.djrapitops.plan.system.webserver.response.ResponseCode;
/** /**
* Thrown when Connection POST-request fails, general Exception. * Thrown when Connection POST-request fails, general Exception.
* *
@ -11,18 +13,47 @@ package com.djrapitops.plan.api.exceptions.connection;
*/ */
public class WebException extends Exception { public class WebException extends Exception {
private final ResponseCode responseCode;
public WebException() { public WebException() {
responseCode = ResponseCode.NONE;
} }
public WebException(String message) { public WebException(String message) {
super(message); super(message);
responseCode = ResponseCode.NONE;
} }
public WebException(String message, Throwable cause) { public WebException(String message, Throwable cause) {
super(message, cause); super(message, cause);
responseCode = ResponseCode.NONE;
} }
public WebException(Throwable cause) { public WebException(Throwable cause) {
super(cause); super(cause);
responseCode = ResponseCode.NONE;
}
public WebException(ResponseCode responseCode) {
this.responseCode = responseCode;
}
public WebException(String message, ResponseCode responseCode) {
super(message);
this.responseCode = responseCode;
}
public WebException(String message, Throwable cause, ResponseCode responseCode) {
super(message, cause);
this.responseCode = responseCode;
}
public WebException(Throwable cause, ResponseCode responseCode) {
super(cause);
this.responseCode = responseCode;
}
public ResponseCode getResponseCode() {
return responseCode;
} }
} }

View File

@ -4,6 +4,8 @@
*/ */
package com.djrapitops.plan.api.exceptions.connection; package com.djrapitops.plan.api.exceptions.connection;
import com.djrapitops.plan.system.webserver.response.ResponseCode;
/** /**
* Group of WebExceptions that can be considered a failed connection state on some occasions. * Group of WebExceptions that can be considered a failed connection state on some occasions.
* *
@ -11,18 +13,19 @@ package com.djrapitops.plan.api.exceptions.connection;
*/ */
public class WebFailException extends WebException { public class WebFailException extends WebException {
public WebFailException() {
}
public WebFailException(String message) {
super(message);
}
public WebFailException(String message, Throwable cause) { public WebFailException(String message, Throwable cause) {
super(message, cause); super(message, cause);
} }
public WebFailException(Throwable cause) { public WebFailException(String message, ResponseCode responseCode) {
super(cause); super(message, responseCode);
}
public WebFailException(String message, Throwable cause, ResponseCode responseCode) {
super(message, cause, responseCode);
}
public WebFailException(Throwable cause, ResponseCode responseCode) {
super(cause, responseCode);
} }
} }

View File

@ -18,7 +18,6 @@ import com.djrapitops.plugin.command.CommandNode;
import com.djrapitops.plugin.command.CommandType; import com.djrapitops.plugin.command.CommandType;
import com.djrapitops.plugin.command.CommandUtils; import com.djrapitops.plugin.command.CommandUtils;
import com.djrapitops.plugin.command.ISender; import com.djrapitops.plugin.command.ISender;
import org.bukkit.ChatColor;
import java.util.Map; import java.util.Map;
import java.util.Optional; import java.util.Optional;
@ -53,7 +52,7 @@ public class AnalyzeCommand extends CommandNode {
sendWebUserNotificationIfNecessary(sender); sendWebUserNotificationIfNecessary(sender);
sendLink(server, sender); sendLink(server, sender);
} catch (DBException | WebException e) { } catch (DBException | WebException e) {
sender.sendMessage(ChatColor.RED + " Error occurred: " + e.toString()); sender.sendMessage("§cError occurred: " + e.toString());
Log.toLog(this.getClass(), e); Log.toLog(this.getClass(), e);
} }
}); });
@ -80,7 +79,7 @@ public class AnalyzeCommand extends CommandNode {
boolean senderHasWebUser = Database.getActive().check().doesWebUserExists(sender.getName()); boolean senderHasWebUser = Database.getActive().check().doesWebUserExists(sender.getName());
if (!senderHasWebUser) { if (!senderHasWebUser) {
sender.sendMessage(ChatColor.YELLOW + "[Plan] You might not have a web user, use /plan register <password>"); sender.sendMessage("§e[Plan] You might not have a web user, use /plan register <password>");
} }
} }
} }

View File

@ -4,13 +4,12 @@
*/ */
package com.djrapitops.plan.command.commands; package com.djrapitops.plan.command.commands;
import com.djrapitops.plan.system.info.connection.ConnectionSystem;
import com.djrapitops.plan.system.settings.locale.Locale; import com.djrapitops.plan.system.settings.locale.Locale;
import com.djrapitops.plan.system.settings.locale.Msg; 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.CommandNode;
import com.djrapitops.plugin.command.CommandType; import com.djrapitops.plugin.command.CommandType;
import com.djrapitops.plugin.command.ISender; import com.djrapitops.plugin.command.ISender;
import com.djrapitops.plugin.utilities.Verify;
/** /**
* Command used for testing functions that are too difficult to unit test. * Command used for testing functions that are too difficult to unit test.
@ -27,25 +26,8 @@ public class DevCommand extends CommandNode {
@Override @Override
public void 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)) { Verify.isTrue(args.length >= 1, () -> new IllegalArgumentException(Locale.get(Msg.CMD_FAIL_REQ_ONE_ARG).toString()));
return;
} sender.sendMessage("No features currently implemented in the command.");
String feature = args[0];
switch (feature) {
case "connection":
if (!Condition.isTrue(args.length >= 2, Locale.get(Msg.CMD_FAIL_REQ_ONE_ARG).toString(), sender)) {
break;
}
sender.sendMessage("[Plan] No implementation.");
break;
case "web":
ConnectionSystem connectionSystem = ConnectionSystem.getInstance();
String accessAddress = connectionSystem.getMainAddress();
sender.sendMessage((connectionSystem.isServerAvailable())
? "Bungee: " + accessAddress : "Local: " + accessAddress);
break;
default:
break;
}
} }
} }

View File

@ -2,6 +2,7 @@ package com.djrapitops.plan.command.commands;
import com.djrapitops.plan.PlanPlugin; import com.djrapitops.plan.PlanPlugin;
import com.djrapitops.plan.system.database.databases.Database; import com.djrapitops.plan.system.database.databases.Database;
import com.djrapitops.plan.system.info.connection.ConnectionSystem;
import com.djrapitops.plan.system.settings.Permissions; import com.djrapitops.plan.system.settings.Permissions;
import com.djrapitops.plan.system.settings.locale.Locale; import com.djrapitops.plan.system.settings.locale.Locale;
import com.djrapitops.plan.system.settings.locale.Msg; import com.djrapitops.plan.system.settings.locale.Msg;
@ -41,6 +42,7 @@ public class InfoCommand extends CommandNode {
ball + mColor + " Version: " + sColor + plugin.getVersion(), ball + mColor + " Version: " + sColor + plugin.getVersion(),
ball + mColor + " Up to date: " + sColor + upToDate, ball + mColor + " Up to date: " + sColor + upToDate,
ball + mColor + " Active Database: " + tColor + Database.getActive().getConfigName(), ball + mColor + " Active Database: " + tColor + Database.getActive().getConfigName(),
ball + mColor + " Connected to Bungee: " + tColor + (ConnectionSystem.getInstance().isServerAvailable() ? "Yes" : "No"),
Locale.get(Msg.CMD_CONSTANT_FOOTER).toString() Locale.get(Msg.CMD_CONSTANT_FOOTER).toString()
}; };
sender.sendMessage(messages); sender.sendMessage(messages);

View File

@ -9,7 +9,6 @@ import com.djrapitops.plan.system.settings.Permissions;
import com.djrapitops.plan.system.settings.locale.Locale; import com.djrapitops.plan.system.settings.locale.Locale;
import com.djrapitops.plan.system.settings.locale.Msg; import com.djrapitops.plan.system.settings.locale.Msg;
import com.djrapitops.plan.system.webserver.WebServer; import com.djrapitops.plan.system.webserver.WebServer;
import com.djrapitops.plan.utilities.Condition;
import com.djrapitops.plan.utilities.MiscUtils; import com.djrapitops.plan.utilities.MiscUtils;
import com.djrapitops.plan.utilities.uuid.UUIDUtility; import com.djrapitops.plan.utilities.uuid.UUIDUtility;
import com.djrapitops.plugin.api.utility.log.Log; import com.djrapitops.plugin.api.utility.log.Log;
@ -19,8 +18,6 @@ import com.djrapitops.plugin.command.CommandUtils;
import com.djrapitops.plugin.command.ISender; import com.djrapitops.plugin.command.ISender;
import com.djrapitops.plugin.task.AbsRunnable; import com.djrapitops.plugin.task.AbsRunnable;
import com.djrapitops.plugin.task.RunnableFactory; import com.djrapitops.plugin.task.RunnableFactory;
import com.djrapitops.plugin.utilities.Verify;
import org.bukkit.ChatColor;
import java.util.UUID; import java.util.UUID;
@ -51,28 +48,32 @@ public class InspectCommand extends CommandNode {
@Override @Override
public void run() { public void run() {
try { try {
Database activeDB = Database.getActive();
UUID uuid = UUIDUtility.getUUIDOf(playerName); UUID uuid = UUIDUtility.getUUIDOf(playerName);
if (!Condition.isTrue(Verify.notNull(uuid), Locale.get(Msg.CMD_FAIL_USERNAME_NOT_VALID).toString(), sender)) { if (uuid == null) {
sender.sendMessage(Locale.get(Msg.CMD_FAIL_USERNAME_NOT_VALID).toString());
return; return;
} }
if (!Condition.isTrue(activeDB.check().isPlayerRegistered(uuid), Locale.get(Msg.CMD_FAIL_USERNAME_NOT_KNOWN).toString(), sender)) {
Database activeDB = Database.getActive();
if (!activeDB.check().isPlayerRegistered(uuid)) {
sender.sendMessage(Locale.get(Msg.CMD_FAIL_USERNAME_NOT_KNOWN).toString());
return; return;
} }
if (CommandUtils.isPlayer(sender) && WebServer.getInstance().isAuthRequired()) { if (CommandUtils.isPlayer(sender) && WebServer.getInstance().isAuthRequired()) {
boolean senderHasWebUser = activeDB.check().doesWebUserExists(sender.getName()); boolean senderHasWebUser = activeDB.check().doesWebUserExists(sender.getName());
if (!senderHasWebUser) { if (!senderHasWebUser) {
sender.sendMessage(ChatColor.YELLOW + "[Plan] You might not have a web user, use /plan register <password>"); sender.sendMessage("§e[Plan] You might not have a web user, use /plan register <password>");
} }
} }
Processing.submit(new InspectCacheRequestProcessor(uuid, sender, playerName)); Processing.submit(new InspectCacheRequestProcessor(uuid, sender, playerName));
} catch (FatalDBException ex) { } catch (FatalDBException ex) {
Log.toLog(this.getClass(), ex); Log.toLog(this.getClass(), ex);
sender.sendMessage(ChatColor.RED + "Fatal database exception occurred: " + ex.getMessage()); sender.sendMessage("§cFatal database exception occurred: " + ex.getMessage());
} catch (DBException ex) { } catch (DBException ex) {
Log.toLog(this.getClass(), ex); Log.toLog(this.getClass(), ex);
sender.sendMessage(ChatColor.YELLOW + "Non-Fatal database exception occurred: " + ex.getMessage()); sender.sendMessage("§eNon-Fatal database exception occurred: " + ex.getMessage());
} finally { } finally {
this.cancel(); this.cancel();
} }

View File

@ -29,7 +29,7 @@ public class ManageCommand extends TreeCmdNode {
new ManageRestoreCommand(plugin), new ManageRestoreCommand(plugin),
new ManageRemoveCommand(), new ManageRemoveCommand(),
new ManageHotSwapCommand(plugin), new ManageHotSwapCommand(plugin),
new ManageClearCommand(plugin), new ManageClearCommand(),
}, },
new CommandNode[]{ new CommandNode[]{
new ManageSetupCommand(), new ManageSetupCommand(),

View File

@ -8,7 +8,6 @@ import com.djrapitops.plan.system.database.databases.Database;
import com.djrapitops.plan.system.settings.Permissions; import com.djrapitops.plan.system.settings.Permissions;
import com.djrapitops.plan.system.settings.locale.Locale; import com.djrapitops.plan.system.settings.locale.Locale;
import com.djrapitops.plan.system.settings.locale.Msg; import com.djrapitops.plan.system.settings.locale.Msg;
import com.djrapitops.plan.utilities.Condition;
import com.djrapitops.plan.utilities.FormatUtils; import com.djrapitops.plan.utilities.FormatUtils;
import com.djrapitops.plan.utilities.MiscUtils; import com.djrapitops.plan.utilities.MiscUtils;
import com.djrapitops.plan.utilities.uuid.UUIDUtility; import com.djrapitops.plan.utilities.uuid.UUIDUtility;
@ -20,7 +19,6 @@ import com.djrapitops.plugin.settings.ColorScheme;
import com.djrapitops.plugin.settings.DefaultMessages; import com.djrapitops.plugin.settings.DefaultMessages;
import com.djrapitops.plugin.task.AbsRunnable; import com.djrapitops.plugin.task.AbsRunnable;
import com.djrapitops.plugin.task.RunnableFactory; import com.djrapitops.plugin.task.RunnableFactory;
import com.djrapitops.plugin.utilities.Verify;
import java.util.UUID; import java.util.UUID;
@ -61,18 +59,20 @@ public class QInspectCommand extends CommandNode {
public void run() { public void run() {
try { try {
UUID uuid = UUIDUtility.getUUIDOf(playerName); UUID uuid = UUIDUtility.getUUIDOf(playerName);
if (!Condition.isTrue(Verify.notNull(uuid), Locale.get(Msg.CMD_FAIL_USERNAME_NOT_VALID).toString(), sender)) { if (uuid == null) {
sender.sendMessage(Locale.get(Msg.CMD_FAIL_USERNAME_NOT_VALID).toString());
return; return;
} }
Database database = Database.getActive(); Database database = Database.getActive();
if (!Condition.isTrue(database.check().isPlayerRegistered(uuid), Locale.get(Msg.CMD_FAIL_USERNAME_NOT_KNOWN).toString(), sender)) { if (!database.check().isPlayerRegistered(uuid)) {
sender.sendMessage(Locale.get(Msg.CMD_FAIL_USERNAME_NOT_KNOWN).toString());
return; return;
} }
PlayerProfile playerProfile = database.fetch().getPlayerProfile(uuid); PlayerProfile playerProfile = database.fetch().getPlayerProfile(uuid);
sendMsgs(sender, playerProfile); sendMessages(sender, playerProfile);
} catch (DBException ex) { } catch (DBException ex) {
Log.toLog(this.getClass(), ex); Log.toLog(this.getClass(), ex);
} finally { } finally {
@ -82,8 +82,8 @@ public class QInspectCommand extends CommandNode {
}).runTaskAsynchronously(); }).runTaskAsynchronously();
} }
private void sendMsgs(ISender sender, PlayerProfile profile) { private void sendMessages(ISender sender, PlayerProfile profile) {
long now = MiscUtils.getTime(); long now = System.currentTimeMillis();
ColorScheme colorScheme = plugin.getColorScheme(); ColorScheme colorScheme = plugin.getColorScheme();
@ -97,7 +97,7 @@ public class QInspectCommand extends CommandNode {
ActivityIndex activityIndex = profile.getActivityIndex(now); ActivityIndex activityIndex = profile.getActivityIndex(now);
sender.sendMessage(colT + ball + " " + colM + " Activity Index: " + colS + activityIndex.getFormattedValue() + " | " + activityIndex.getColor()); sender.sendMessage(colT + ball + " " + colM + " Activity Index: " + colS + activityIndex.getFormattedValue() + " | " + activityIndex.getGroup());
sender.sendMessage(colT + ball + " " + colM + " Registered: " + colS + FormatUtils.formatTimeStampYear(profile.getRegistered())); sender.sendMessage(colT + ball + " " + colM + " Registered: " + colS + FormatUtils.formatTimeStampYear(profile.getRegistered()));
sender.sendMessage(colT + ball + " " + colM + " Last Seen: " + colS + FormatUtils.formatTimeStampYear(profile.getLastSeen())); sender.sendMessage(colT + ball + " " + colM + " Last Seen: " + colS + FormatUtils.formatTimeStampYear(profile.getLastSeen()));
sender.sendMessage(colT + ball + " " + colM + " Logged in from: " + colS + profile.getMostRecentGeoInfo().getGeolocation()); sender.sendMessage(colT + ball + " " + colM + " Logged in from: " + colS + profile.getMostRecentGeoInfo().getGeolocation());

View File

@ -5,7 +5,6 @@ import com.djrapitops.plan.system.database.databases.Database;
import com.djrapitops.plan.system.settings.Permissions; import com.djrapitops.plan.system.settings.Permissions;
import com.djrapitops.plan.system.settings.locale.Locale; import com.djrapitops.plan.system.settings.locale.Locale;
import com.djrapitops.plan.system.settings.locale.Msg; import com.djrapitops.plan.system.settings.locale.Msg;
import com.djrapitops.plan.utilities.Condition;
import com.djrapitops.plan.utilities.PassEncryptUtil; import com.djrapitops.plan.utilities.PassEncryptUtil;
import com.djrapitops.plugin.api.Check; import com.djrapitops.plugin.api.Check;
import com.djrapitops.plugin.api.utility.log.Log; import com.djrapitops.plugin.api.utility.log.Log;
@ -15,6 +14,7 @@ import com.djrapitops.plugin.command.CommandUtils;
import com.djrapitops.plugin.command.ISender; import com.djrapitops.plugin.command.ISender;
import com.djrapitops.plugin.task.AbsRunnable; import com.djrapitops.plugin.task.AbsRunnable;
import com.djrapitops.plugin.task.RunnableFactory; import com.djrapitops.plugin.task.RunnableFactory;
import com.djrapitops.plugin.utilities.Verify;
import java.util.Arrays; import java.util.Arrays;
@ -31,6 +31,9 @@ import java.util.Arrays;
*/ */
public class RegisterCommand extends CommandNode { public class RegisterCommand extends CommandNode {
private final String notEnoughArgsMsg;
private final String hashErrorMsg;
public RegisterCommand() { public RegisterCommand() {
// No Permission Requirement // No Permission Requirement
super("register", "", CommandType.PLAYER_OR_ARGS); super("register", "", CommandType.PLAYER_OR_ARGS);
@ -40,13 +43,13 @@ public class RegisterCommand extends CommandNode {
if (Check.isBukkitAvailable()) { if (Check.isBukkitAvailable()) {
setupFilter(); setupFilter();
} }
notEnoughArgsMsg = Locale.get(Msg.CMD_FAIL_REQ_ARGS).parse("(3) " + Arrays.toString(getArguments()));
hashErrorMsg = "§cPassword hash error.";
} }
@Override @Override
public void onCommand(ISender sender, String commandLabel, String[] args) { 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 { try {
if (CommandUtils.isPlayer(sender)) { if (CommandUtils.isPlayer(sender)) {
Log.info(sender.getName() + " issued WebUser register command."); Log.info(sender.getName() + " issued WebUser register command.");
@ -58,23 +61,22 @@ public class RegisterCommand extends CommandNode {
Log.toLog(this.getClass().getSimpleName(), e); Log.toLog(this.getClass().getSimpleName(), e);
sender.sendMessage(hashErrorMsg); sender.sendMessage(hashErrorMsg);
} catch (NumberFormatException e) { } catch (NumberFormatException e) {
sender.sendMessage(permLvlErrorMsg + args[2]); throw new NumberFormatException(args[2]);
} catch (Exception e) { } catch (Exception e) {
Log.toLog(this.getClass().getSimpleName(), e); Log.toLog(this.getClass().getSimpleName(), e);
} }
} }
private void consoleRegister(String[] args, ISender sender, String notEnoughArgsMsg) throws PassEncryptUtil.CannotPerformOperationException { private void consoleRegister(String[] args, ISender sender, String notEnoughArgsMsg) throws PassEncryptUtil.CannotPerformOperationException {
if (Condition.isTrue(args.length >= 3, notEnoughArgsMsg, sender)) { Verify.isTrue(args.length >= 3, () -> new IllegalArgumentException(notEnoughArgsMsg));
int permLevel; int permLevel;
permLevel = Integer.parseInt(args[2]); permLevel = Integer.parseInt(args[2]);
String passHash = PassEncryptUtil.createHash(args[0]); String passHash = PassEncryptUtil.createHash(args[0]);
registerUser(new WebUser(args[1], passHash, permLevel), sender); registerUser(new WebUser(args[1], passHash, permLevel), sender);
} }
}
private void playerRegister(String[] args, ISender sender) throws PassEncryptUtil.CannotPerformOperationException { private void playerRegister(String[] args, ISender sender) throws PassEncryptUtil.CannotPerformOperationException {
final String notEnoughArgsMsg = Locale.get(Msg.CMD_FAIL_REQ_ARGS).parse("(1 or 3) " + super.getArguments());
boolean registerSenderAsUser = args.length == 1; boolean registerSenderAsUser = args.length == 1;
if (registerSenderAsUser) { if (registerSenderAsUser) {
String user = sender.getName(); String user = sender.getName();
@ -114,7 +116,8 @@ public class RegisterCommand extends CommandNode {
try { try {
Database database = Database.getActive(); Database database = Database.getActive();
boolean userExists = database.check().doesWebUserExists(userName); boolean userExists = database.check().doesWebUserExists(userName);
if (!Condition.isTrue(!userExists, existsMsg, sender)) { if (userExists) {
sender.sendMessage(existsMsg);
return; return;
} }
database.save().webUser(webUser); database.save().webUser(webUser);

View File

@ -3,7 +3,6 @@ package com.djrapitops.plan.command.commands;
import com.djrapitops.plan.system.settings.Permissions; import com.djrapitops.plan.system.settings.Permissions;
import com.djrapitops.plan.system.settings.locale.Locale; import com.djrapitops.plan.system.settings.locale.Locale;
import com.djrapitops.plan.system.settings.locale.Msg; import com.djrapitops.plan.system.settings.locale.Msg;
import com.djrapitops.plan.utilities.Condition;
import com.djrapitops.plan.utilities.MiscUtils; import com.djrapitops.plan.utilities.MiscUtils;
import com.djrapitops.plugin.command.CommandNode; import com.djrapitops.plugin.command.CommandNode;
import com.djrapitops.plugin.command.CommandType; import com.djrapitops.plugin.command.CommandType;
@ -33,9 +32,8 @@ public class SearchCommand extends CommandNode {
@Override @Override
public void 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)) { Verify.isTrue(args.length >= 1, () -> new IllegalArgumentException(Locale.get(Msg.CMD_FAIL_REQ_ONE_ARG).toString()));
return;
}
sender.sendMessage(Locale.get(Msg.CMD_INFO_SEARCHING).toString()); sender.sendMessage(Locale.get(Msg.CMD_INFO_SEARCHING).toString());
runSearchTask(args, sender); runSearchTask(args, sender);

View File

@ -1,13 +1,14 @@
package com.djrapitops.plan.command.commands.manage; package com.djrapitops.plan.command.commands.manage;
import com.djrapitops.plan.api.exceptions.database.DBException;
import com.djrapitops.plan.api.exceptions.database.DBInitException; import com.djrapitops.plan.api.exceptions.database.DBInitException;
import com.djrapitops.plan.system.database.DBSystem; import com.djrapitops.plan.system.database.DBSystem;
import com.djrapitops.plan.system.database.databases.Database; import com.djrapitops.plan.system.database.databases.Database;
import com.djrapitops.plan.system.database.databases.sql.SQLiteDB;
import com.djrapitops.plan.system.settings.Permissions; import com.djrapitops.plan.system.settings.Permissions;
import com.djrapitops.plan.system.settings.locale.Locale; import com.djrapitops.plan.system.settings.locale.Locale;
import com.djrapitops.plan.system.settings.locale.Msg; import com.djrapitops.plan.system.settings.locale.Msg;
import com.djrapitops.plan.utilities.Condition; import com.djrapitops.plan.utilities.FormatUtils;
import com.djrapitops.plan.utilities.ManageUtils;
import com.djrapitops.plugin.api.utility.log.Log; import com.djrapitops.plugin.api.utility.log.Log;
import com.djrapitops.plugin.command.CommandNode; import com.djrapitops.plugin.command.CommandNode;
import com.djrapitops.plugin.command.CommandType; import com.djrapitops.plugin.command.CommandType;
@ -16,8 +17,13 @@ import com.djrapitops.plugin.task.AbsRunnable;
import com.djrapitops.plugin.task.RunnableFactory; import com.djrapitops.plugin.task.RunnableFactory;
import com.djrapitops.plugin.utilities.Verify; import com.djrapitops.plugin.utilities.Verify;
import java.sql.SQLException;
import java.util.Arrays;
import java.util.Collection;
import java.util.UUID;
/** /**
* This manage subcommand is used to backup a database to a .db file. * This command is used to backup a database to a .db file.
* *
* @author Rsl1122 * @author Rsl1122
* @since 2.3.0 * @since 2.3.0
@ -34,47 +40,69 @@ public class ManageBackupCommand extends CommandNode {
@Override @Override
public void onCommand(ISender sender, String commandLabel, String[] args) { public void onCommand(ISender sender, String commandLabel, String[] args) {
try { try {
Verify.isTrue(args.length >= 1,
() -> new IllegalArgumentException(Locale.get(Msg.CMD_FAIL_REQ_ARGS).parse(Arrays.toString(this.getArguments()))));
if (!Condition.isTrue(args.length >= 1, Locale.get(Msg.CMD_FAIL_REQ_ARGS).parse(this.getArguments()), sender)) {
return;
}
String dbName = args[0].toLowerCase(); 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;
}
final Database database = DBSystem.getActiveDatabaseByName(dbName); boolean isCorrectDB = Verify.equalsOne(dbName, "sqlite", "mysql");
Verify.isTrue(isCorrectDB,
() -> new IllegalArgumentException(Locale.get(Msg.MANAGE_FAIL_INCORRECT_DB) + dbName));
Database database = DBSystem.getActiveDatabaseByName(dbName);
Verify.nullCheck(database, NullPointerException::new);
// 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;
}
Log.debug("Backup", "Start");
runBackupTask(sender, args, database); runBackupTask(sender, args, database);
} catch (DBInitException | NullPointerException e) { } catch (DBInitException | NullPointerException e) {
sender.sendMessage(Locale.get(Msg.MANAGE_FAIL_FAULTY_DB).toString()); sender.sendMessage(Locale.get(Msg.MANAGE_FAIL_FAULTY_DB).toString());
} finally {
Log.logDebug("Backup");
} }
} }
private void runBackupTask(ISender sender, String[] args, final Database database) { private void runBackupTask(ISender sender, String[] args, Database database) {
RunnableFactory.createNew(new AbsRunnable("BackupTask") { RunnableFactory.createNew(new AbsRunnable("BackupTask") {
@Override @Override
public void run() { public void run() {
try { try {
Log.debug("Backup", "Start");
sender.sendMessage(Locale.get(Msg.MANAGE_INFO_START).parse()); sender.sendMessage(Locale.get(Msg.MANAGE_INFO_START).parse());
ManageUtils.backup(args[0], database); createNewBackup(args[0], database);
sender.sendMessage(Locale.get(Msg.MANAGE_INFO_COPY_SUCCESS).toString()); sender.sendMessage(Locale.get(Msg.MANAGE_INFO_COPY_SUCCESS).toString());
} catch (Exception e) { } catch (Exception e) {
Log.toLog(this.getClass(), e); Log.toLog(ManageBackupCommand.class, e);
sender.sendMessage(Locale.get(Msg.MANAGE_INFO_FAIL).toString()); sender.sendMessage(Locale.get(Msg.MANAGE_INFO_FAIL).toString());
} finally { } finally {
Log.logDebug("Backup");
this.cancel(); this.cancel();
} }
} }
}).runTaskAsynchronously(); }).runTaskAsynchronously();
} }
/**
* Creates a new backup sqlite file with the data of given database.
*
* @param dbName Name of database (mysql/sqlite)
* @param copyFromDB Database you want to backup.
*/
private void createNewBackup(String dbName, Database copyFromDB) throws SQLException {
SQLiteDB backupDB = null;
try {
String timeStamp = FormatUtils.formatTimeStampISO8601NoClock(System.currentTimeMillis());
String fileName = dbName + "-backup-" + timeStamp;
backupDB = new SQLiteDB(fileName);
Collection<UUID> uuids = copyFromDB.fetch().getSavedUUIDs();
if (uuids.isEmpty()) {
return;
}
backupDB.init();
copyFromDB.backup().backup(backupDB);
} catch (DBException e) {
Log.toLog(this.getClass(), e);
} finally {
if (backupDB != null) {
backupDB.close();
}
}
}
} }

View File

@ -1,6 +1,5 @@
package com.djrapitops.plan.command.commands.manage; package com.djrapitops.plan.command.commands.manage;
import com.djrapitops.plan.PlanPlugin;
import com.djrapitops.plan.api.exceptions.database.DBException; import com.djrapitops.plan.api.exceptions.database.DBException;
import com.djrapitops.plan.api.exceptions.database.DBInitException; import com.djrapitops.plan.api.exceptions.database.DBInitException;
import com.djrapitops.plan.api.exceptions.database.FatalDBException; import com.djrapitops.plan.api.exceptions.database.FatalDBException;
@ -9,8 +8,6 @@ import com.djrapitops.plan.system.database.databases.Database;
import com.djrapitops.plan.system.settings.Permissions; import com.djrapitops.plan.system.settings.Permissions;
import com.djrapitops.plan.system.settings.locale.Locale; import com.djrapitops.plan.system.settings.locale.Locale;
import com.djrapitops.plan.system.settings.locale.Msg; 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.api.utility.log.Log;
import com.djrapitops.plugin.command.CommandNode; import com.djrapitops.plugin.command.CommandNode;
import com.djrapitops.plugin.command.CommandType; import com.djrapitops.plugin.command.CommandType;
@ -27,31 +24,27 @@ import com.djrapitops.plugin.utilities.Verify;
*/ */
public class ManageClearCommand extends CommandNode { public class ManageClearCommand extends CommandNode {
private final PlanPlugin plugin; public ManageClearCommand() {
public ManageClearCommand(PlanPlugin plugin) {
super("clear", Permissions.MANAGE.getPermission(), CommandType.PLAYER_OR_ARGS); super("clear", Permissions.MANAGE.getPermission(), CommandType.PLAYER_OR_ARGS);
setShortHelp(Locale.get(Msg.CMD_USG_MANAGE_CLEAR).toString()); setShortHelp(Locale.get(Msg.CMD_USG_MANAGE_CLEAR).toString());
setArguments("<DB>", "[-a]"); setArguments("<DB>", "[-a]");
setInDepthHelp(Locale.get(Msg.CMD_HELP_MANAGE_CLEAR).toArray()); setInDepthHelp(Locale.get(Msg.CMD_HELP_MANAGE_CLEAR).toArray());
this.plugin = plugin;
} }
@Override @Override
public void 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)) { Verify.isTrue(args.length >= 1,
return; () -> new IllegalArgumentException(Locale.get(Msg.CMD_FAIL_REQ_ONE_ARG).toString()));
}
String dbName = args[0].toLowerCase(); String dbName = args[0].toLowerCase();
boolean isCorrectDB = "sqlite".equals(dbName) || "mysql".equals(dbName); boolean isCorrectDB = "sqlite".equals(dbName) || "mysql".equals(dbName);
Verify.isTrue(isCorrectDB,
() -> new IllegalArgumentException(Locale.get(Msg.MANAGE_FAIL_INCORRECT_DB) + dbName));
if (!Condition.isTrue(isCorrectDB, Locale.get(Msg.MANAGE_FAIL_INCORRECT_DB) + dbName, sender)) { if (!Verify.contains("-a", args)) {
return; sender.sendMessage(Locale.get(Msg.MANAGE_FAIL_CONFIRM).parse(Locale.get(Msg.MANAGE_NOTIFY_REMOVE).parse(args[0])));
}
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; return;
} }
@ -72,7 +65,6 @@ public class ManageClearCommand extends CommandNode {
database.remove().everything(); database.remove().everything();
long now = MiscUtils.getTime();
sender.sendMessage(Locale.get(Msg.MANAGE_INFO_CLEAR_SUCCESS).toString()); sender.sendMessage(Locale.get(Msg.MANAGE_INFO_CLEAR_SUCCESS).toString());
} catch (FatalDBException e) { } catch (FatalDBException e) {
sender.sendMessage(Locale.get(Msg.MANAGE_INFO_FAIL).toString() sender.sendMessage(Locale.get(Msg.MANAGE_INFO_FAIL).toString()

View File

@ -4,10 +4,12 @@ import com.djrapitops.plan.system.listeners.bukkit.PlayerOnlineListener;
import com.djrapitops.plan.system.settings.Permissions; import com.djrapitops.plan.system.settings.Permissions;
import com.djrapitops.plan.system.settings.locale.Locale; import com.djrapitops.plan.system.settings.locale.Locale;
import com.djrapitops.plan.system.settings.locale.Msg; 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.CommandNode;
import com.djrapitops.plugin.command.CommandType; import com.djrapitops.plugin.command.CommandType;
import com.djrapitops.plugin.command.ISender; import com.djrapitops.plugin.command.ISender;
import com.djrapitops.plugin.utilities.Verify;
import java.util.Arrays;
/** /**
* This manage SubCommand is used to disable some features of the plugin temporarily. * This manage SubCommand is used to disable some features of the plugin temporarily.
@ -27,9 +29,9 @@ public class ManageDisableCommand extends CommandNode {
@Override @Override
public void 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)) { Verify.isTrue(args.length >= 1,
return; () -> new IllegalArgumentException(Locale.get(Msg.CMD_FAIL_REQ_ARGS).parse(Arrays.toString(this.getArguments()))));
}
switch (args[0].toLowerCase()) { switch (args[0].toLowerCase()) {
case "kickcount": case "kickcount":
PlayerOnlineListener.setCountKicks(false); PlayerOnlineListener.setCountKicks(false);

View File

@ -7,7 +7,6 @@ import com.djrapitops.plan.system.settings.Permissions;
import com.djrapitops.plan.system.settings.Settings; import com.djrapitops.plan.system.settings.Settings;
import com.djrapitops.plan.system.settings.locale.Locale; import com.djrapitops.plan.system.settings.locale.Locale;
import com.djrapitops.plan.system.settings.locale.Msg; 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.api.utility.log.Log;
import com.djrapitops.plugin.command.CommandNode; import com.djrapitops.plugin.command.CommandNode;
import com.djrapitops.plugin.command.CommandType; import com.djrapitops.plugin.command.CommandType;
@ -36,32 +35,29 @@ public class ManageHotSwapCommand extends CommandNode {
@Override @Override
public void 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)) { Verify.isTrue(args.length >= 1,
return; () -> new IllegalArgumentException(Locale.get(Msg.CMD_FAIL_REQ_ONE_ARG).toString()));
}
String dbName = args[0].toLowerCase(); 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)) { boolean isCorrectDB = Verify.equalsOne(dbName, "sqlite", "mysql");
return; Verify.isTrue(isCorrectDB,
} () -> new IllegalArgumentException(Locale.get(Msg.MANAGE_FAIL_INCORRECT_DB) + dbName));
if (Condition.isTrue(dbName.equals(Database.getActive().getConfigName()), Locale.get(Msg.MANAGE_FAIL_SAME_DB).toString(), sender)) { Verify.isFalse(dbName.equals(Database.getActive().getConfigName()),
return; () -> new IllegalArgumentException(Locale.get(Msg.MANAGE_FAIL_SAME_DB).toString()));
}
try { try {
final Database database = DBSystem.getActiveDatabaseByName(dbName); final Database database = DBSystem.getActiveDatabaseByName(dbName);
// If DB is null return Verify.nullCheck(database, NullPointerException::new);
if (!Condition.isTrue(Verify.notNull(database), Locale.get(Msg.MANAGE_FAIL_FAULTY_DB).toString(), sender)) {
Log.error(dbName + " was null!");
return;
}
if (!database.isOpen()) { if (!database.isOpen()) {
return; return;
} }
} catch (NullPointerException e) {
sender.sendMessage(Locale.get(Msg.MANAGE_FAIL_FAULTY_DB).toString());
return;
} catch (Exception e) { } catch (Exception e) {
Log.toLog(this.getClass(), e); Log.toLog(this.getClass(), e);
sender.sendMessage(Locale.get(Msg.MANAGE_FAIL_FAULTY_DB).toString()); sender.sendMessage(Locale.get(Msg.MANAGE_FAIL_FAULTY_DB).toString());

View File

@ -5,12 +5,12 @@ import com.djrapitops.plan.system.processing.importing.importers.Importer;
import com.djrapitops.plan.system.settings.Permissions; import com.djrapitops.plan.system.settings.Permissions;
import com.djrapitops.plan.system.settings.locale.Locale; import com.djrapitops.plan.system.settings.locale.Locale;
import com.djrapitops.plan.system.settings.locale.Msg; 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.CommandNode;
import com.djrapitops.plugin.command.CommandType; import com.djrapitops.plugin.command.CommandType;
import com.djrapitops.plugin.command.ISender; import com.djrapitops.plugin.command.ISender;
import com.djrapitops.plugin.task.AbsRunnable; import com.djrapitops.plugin.task.AbsRunnable;
import com.djrapitops.plugin.task.RunnableFactory; import com.djrapitops.plugin.task.RunnableFactory;
import com.djrapitops.plugin.utilities.Verify;
import java.util.Arrays; import java.util.Arrays;
@ -31,9 +31,8 @@ public class ManageImportCommand extends CommandNode {
@Override @Override
public void 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) + " " + Arrays.toString(this.getArguments()), sender)) { Verify.isTrue(args.length >= 1,
return; () -> new IllegalArgumentException(Locale.get(Msg.CMD_FAIL_REQ_ARGS).parse(Arrays.toString(this.getArguments()))));
}
String importArg = args[0]; String importArg = args[0];

View File

@ -5,8 +5,6 @@ import com.djrapitops.plan.system.database.databases.Database;
import com.djrapitops.plan.system.settings.Permissions; import com.djrapitops.plan.system.settings.Permissions;
import com.djrapitops.plan.system.settings.locale.Locale; import com.djrapitops.plan.system.settings.locale.Locale;
import com.djrapitops.plan.system.settings.locale.Msg; 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.api.utility.log.Log;
import com.djrapitops.plugin.command.CommandNode; import com.djrapitops.plugin.command.CommandNode;
import com.djrapitops.plugin.command.CommandType; import com.djrapitops.plugin.command.CommandType;
@ -15,6 +13,8 @@ import com.djrapitops.plugin.task.AbsRunnable;
import com.djrapitops.plugin.task.RunnableFactory; import com.djrapitops.plugin.task.RunnableFactory;
import com.djrapitops.plugin.utilities.Verify; import com.djrapitops.plugin.utilities.Verify;
import java.util.Arrays;
/** /**
* This manage SubCommand is used to move all data from one database to another. * This manage SubCommand is used to move all data from one database to another.
* <p> * <p>
@ -33,29 +33,24 @@ public class ManageMoveCommand extends CommandNode {
@Override @Override
public void 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)) { Verify.isTrue(args.length >= 2,
return; () -> new IllegalArgumentException(Locale.get(Msg.CMD_FAIL_REQ_ARGS).parse(Arrays.toString(this.getArguments()))));
}
String fromDB = args[0].toLowerCase(); String fromDB = args[0].toLowerCase();
boolean isCorrectDB = "sqlite".equals(fromDB) || "mysql".equals(fromDB); boolean isCorrectDB = Verify.equalsOne(fromDB, "sqlite", "mysql");
Verify.isTrue(isCorrectDB,
if (!Condition.isTrue(isCorrectDB, Locale.get(Msg.MANAGE_FAIL_INCORRECT_DB) + fromDB, sender)) { () -> new IllegalArgumentException(Locale.get(Msg.MANAGE_FAIL_INCORRECT_DB) + fromDB));
return;
}
String toDB = args[1].toLowerCase(); String toDB = args[1].toLowerCase();
isCorrectDB = "sqlite".equals(toDB) || "mysql".equals(toDB); isCorrectDB = Verify.equalsOne(toDB, "sqlite", "mysql");
Verify.isTrue(isCorrectDB,
() -> new IllegalArgumentException(Locale.get(Msg.MANAGE_FAIL_INCORRECT_DB) + fromDB));
if (!Condition.isTrue(isCorrectDB, Locale.get(Msg.MANAGE_FAIL_INCORRECT_DB) + toDB, sender)) { Verify.isFalse(fromDB.equalsIgnoreCase(toDB),
return; () -> new IllegalArgumentException(Locale.get(Msg.MANAGE_FAIL_SAME_DB).toString()));
}
if (!Condition.isTrue(!Verify.equalsIgnoreCase(fromDB, toDB), Locale.get(Msg.MANAGE_FAIL_SAME_DB).toString(), sender)) { if (!Verify.contains("-a", args)) {
return; sender.sendMessage(Locale.get(Msg.MANAGE_FAIL_CONFIRM).parse(Locale.get(Msg.MANAGE_NOTIFY_OVERWRITE).parse(args[0])));
}
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; return;
} }
@ -76,10 +71,14 @@ public class ManageMoveCommand extends CommandNode {
try { try {
sender.sendMessage(Locale.get(Msg.MANAGE_INFO_START).parse()); sender.sendMessage(Locale.get(Msg.MANAGE_INFO_START).parse());
ManageUtils.clearAndCopy(toDatabase, fromDatabase); fromDatabase.backup().backup(toDatabase);
sender.sendMessage(Locale.get(Msg.MANAGE_INFO_MOVE_SUCCESS).toString()); sender.sendMessage(Locale.get(Msg.MANAGE_INFO_MOVE_SUCCESS).toString());
boolean movedToCurrentDatabase = Verify.equalsIgnoreCase(toDatabase.getConfigName(), Database.getActive().getConfigName());
Condition.isTrue(!movedToCurrentDatabase, Locale.get(Msg.MANAGE_INFO_CONFIG_REMINDER).toString(), sender); boolean movingToCurrentDB = toDatabase.getConfigName().equalsIgnoreCase(Database.getActive().getConfigName());
if (movingToCurrentDB) {
sender.sendMessage(Locale.get(Msg.MANAGE_INFO_CONFIG_REMINDER).toString());
}
} catch (Exception e) { } catch (Exception e) {
Log.toLog(this.getClass(), e); Log.toLog(this.getClass(), e);
sender.sendMessage(Locale.get(Msg.MANAGE_INFO_FAIL).toString()); sender.sendMessage(Locale.get(Msg.MANAGE_INFO_FAIL).toString());

View File

@ -5,7 +5,6 @@ import com.djrapitops.plan.system.database.databases.Database;
import com.djrapitops.plan.system.settings.Permissions; import com.djrapitops.plan.system.settings.Permissions;
import com.djrapitops.plan.system.settings.locale.Locale; import com.djrapitops.plan.system.settings.locale.Locale;
import com.djrapitops.plan.system.settings.locale.Msg; import com.djrapitops.plan.system.settings.locale.Msg;
import com.djrapitops.plan.utilities.Condition;
import com.djrapitops.plan.utilities.MiscUtils; import com.djrapitops.plan.utilities.MiscUtils;
import com.djrapitops.plan.utilities.uuid.UUIDUtility; import com.djrapitops.plan.utilities.uuid.UUIDUtility;
import com.djrapitops.plugin.api.utility.log.Log; import com.djrapitops.plugin.api.utility.log.Log;
@ -35,9 +34,8 @@ public class ManageRemoveCommand extends CommandNode {
@Override @Override
public void 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)) { Verify.isTrue(args.length >= 1,
return; () -> new IllegalArgumentException(Locale.get(Msg.CMD_FAIL_REQ_ONE_ARG).toString()));
}
String playerName = MiscUtils.getPlayerName(args, sender, Permissions.MANAGE); String playerName = MiscUtils.getPlayerName(args, sender, Permissions.MANAGE);
@ -50,20 +48,20 @@ public class ManageRemoveCommand extends CommandNode {
public void run() { public void run() {
try { try {
UUID uuid = UUIDUtility.getUUIDOf(playerName); UUID uuid = UUIDUtility.getUUIDOf(playerName);
String message = Locale.get(Msg.CMD_FAIL_USERNAME_NOT_VALID).toString();
if (!Condition.isTrue(Verify.notNull(uuid), message, sender)) { if (uuid == null) {
sender.sendMessage(Locale.get(Msg.CMD_FAIL_USERNAME_NOT_VALID).toString());
return; return;
} }
message = Locale.get(Msg.CMD_FAIL_USERNAME_NOT_KNOWN).toString();
Database database = Database.getActive(); Database database = Database.getActive();
if (!Condition.isTrue(database.check().isPlayerRegistered(uuid), message, sender)) { if (!database.check().isPlayerRegistered(uuid)) {
sender.sendMessage(Locale.get(Msg.CMD_FAIL_USERNAME_NOT_KNOWN).toString());
return; return;
} }
message = Locale.get(Msg.MANAGE_FAIL_CONFIRM).parse(Locale.get(Msg.MANAGE_NOTIFY_REMOVE).parse(Database.getActive().getConfigName())); if (!Verify.contains("-a", args)) {
if (!Condition.isTrue(Verify.contains("-a", args), message, sender)) { sender.sendMessage(Locale.get(Msg.MANAGE_FAIL_CONFIRM).parse(Locale.get(Msg.MANAGE_NOTIFY_REMOVE).parse(database.getName())));
return; return;
} }

View File

@ -7,8 +7,6 @@ import com.djrapitops.plan.system.database.databases.sql.SQLiteDB;
import com.djrapitops.plan.system.settings.Permissions; import com.djrapitops.plan.system.settings.Permissions;
import com.djrapitops.plan.system.settings.locale.Locale; import com.djrapitops.plan.system.settings.locale.Locale;
import com.djrapitops.plan.system.settings.locale.Msg; 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.api.utility.log.Log;
import com.djrapitops.plugin.command.CommandNode; import com.djrapitops.plugin.command.CommandNode;
import com.djrapitops.plugin.command.CommandType; import com.djrapitops.plugin.command.CommandType;
@ -40,18 +38,16 @@ public class ManageRestoreCommand extends CommandNode {
@Override @Override
public void 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(Arrays.toString(this.getArguments())), sender)) { Verify.isTrue(args.length >= 2,
return; () -> new IllegalArgumentException(Locale.get(Msg.CMD_FAIL_REQ_ARGS).parse(Arrays.toString(this.getArguments()))));
}
String db = args[1].toLowerCase(); String db = args[1].toLowerCase();
boolean isCorrectDB = "sqlite".equals(db) || "mysql".equals(db); boolean isCorrectDB = Verify.equalsOne(db, "sqlite", "mysql");
Verify.isTrue(isCorrectDB,
() -> new IllegalArgumentException(Locale.get(Msg.MANAGE_FAIL_INCORRECT_DB).toString()));
if (!Condition.isTrue(isCorrectDB, Locale.get(Msg.MANAGE_FAIL_INCORRECT_DB) + db, sender)) { if (!Verify.contains("-a", args)) {
return; sender.sendMessage(Locale.get(Msg.MANAGE_FAIL_CONFIRM).parse(Locale.get(Msg.MANAGE_NOTIFY_REWRITE).parse(args[1])));
}
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; return;
} }
@ -73,7 +69,9 @@ public class ManageRestoreCommand extends CommandNode {
boolean containsDBFileExtension = backupDBName.endsWith(".db"); boolean containsDBFileExtension = backupDBName.endsWith(".db");
File backupDBFile = new File(plugin.getDataFolder(), backupDBName + (containsDBFileExtension ? "" : ".db")); File backupDBFile = new File(plugin.getDataFolder(), backupDBName + (containsDBFileExtension ? "" : ".db"));
if (!Condition.isTrue(Verify.exists(backupDBFile), Locale.get(Msg.MANAGE_FAIL_FILE_NOT_FOUND) + " " + args[0], sender)) {
if (!backupDBFile.exists()) {
sender.sendMessage(Locale.get(Msg.MANAGE_FAIL_FILE_NOT_FOUND) + " " + args[0]);
return; return;
} }
@ -86,7 +84,7 @@ public class ManageRestoreCommand extends CommandNode {
sender.sendMessage(Locale.get(Msg.MANAGE_INFO_START).parse()); sender.sendMessage(Locale.get(Msg.MANAGE_INFO_START).parse());
ManageUtils.clearAndCopy(database, backupDB); database.backup().restore(backupDB);
sender.sendMessage(Locale.get(Msg.MANAGE_INFO_COPY_SUCCESS).toString()); sender.sendMessage(Locale.get(Msg.MANAGE_INFO_COPY_SUCCESS).toString());
} catch (Exception e) { } catch (Exception e) {

View File

@ -8,11 +8,11 @@ import com.djrapitops.plan.system.settings.Settings;
import com.djrapitops.plan.system.settings.locale.Locale; import com.djrapitops.plan.system.settings.locale.Locale;
import com.djrapitops.plan.system.settings.locale.Msg; import com.djrapitops.plan.system.settings.locale.Msg;
import com.djrapitops.plan.system.webserver.WebServerSystem; 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.api.utility.log.Log;
import com.djrapitops.plugin.command.CommandNode; import com.djrapitops.plugin.command.CommandNode;
import com.djrapitops.plugin.command.CommandType; import com.djrapitops.plugin.command.CommandType;
import com.djrapitops.plugin.command.ISender; import com.djrapitops.plugin.command.ISender;
import com.djrapitops.plugin.utilities.Verify;
/** /**
* This manage SubCommand is used to request settings from Bungee so that connection can be established. * This manage SubCommand is used to request settings from Bungee so that connection can be established.
@ -31,9 +31,9 @@ public class ManageSetupCommand extends CommandNode {
@Override @Override
public void 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)) { Verify.isTrue(args.length >= 1,
return; () -> new IllegalArgumentException(Locale.get(Msg.CMD_FAIL_REQ_ONE_ARG).toString()));
}
if (!WebServerSystem.isWebServerEnabled()) { if (!WebServerSystem.isWebServerEnabled()) {
sender.sendMessage("§cWebServer is not enabled on this server! Make sure it enables on boot!"); sender.sendMessage("§cWebServer is not enabled on this server! Make sure it enables on boot!");
return; return;

View File

@ -5,14 +5,15 @@ import com.djrapitops.plan.system.database.databases.Database;
import com.djrapitops.plan.system.settings.Permissions; import com.djrapitops.plan.system.settings.Permissions;
import com.djrapitops.plan.system.settings.locale.Locale; import com.djrapitops.plan.system.settings.locale.Locale;
import com.djrapitops.plan.system.settings.locale.Msg; 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.api.utility.log.Log;
import com.djrapitops.plugin.command.CommandNode; import com.djrapitops.plugin.command.CommandNode;
import com.djrapitops.plugin.command.CommandType; import com.djrapitops.plugin.command.CommandType;
import com.djrapitops.plugin.command.ISender; import com.djrapitops.plugin.command.ISender;
import com.djrapitops.plugin.task.AbsRunnable; import com.djrapitops.plugin.task.AbsRunnable;
import com.djrapitops.plugin.task.RunnableFactory; import com.djrapitops.plugin.task.RunnableFactory;
import org.bukkit.ChatColor; import com.djrapitops.plugin.utilities.Verify;
import java.util.Arrays;
/** /**
* Subcommand for checking WebUser permission level. * Subcommand for checking WebUser permission level.
@ -30,9 +31,9 @@ public class WebCheckCommand extends CommandNode {
@Override @Override
public void 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)) { Verify.isTrue(args.length >= 1,
return; () -> new IllegalArgumentException(Locale.get(Msg.CMD_FAIL_REQ_ARGS).parse(Arrays.toString(this.getArguments()))));
}
Database database = Database.getActive(); Database database = Database.getActive();
String user = args[0]; String user = args[0];
@ -40,7 +41,8 @@ public class WebCheckCommand extends CommandNode {
@Override @Override
public void run() { public void run() {
try { try {
if (!Condition.isTrue(database.check().doesWebUserExists(user), ChatColor.RED + "[Plan] User Doesn't exist.", sender)) { if (!database.check().doesWebUserExists(user)) {
sender.sendMessage("§c[Plan] User Doesn't exist.");
return; return;
} }
WebUser info = database.fetch().getWebUser(user); WebUser info = database.fetch().getWebUser(user);

View File

@ -4,14 +4,15 @@ import com.djrapitops.plan.system.database.databases.Database;
import com.djrapitops.plan.system.settings.Permissions; import com.djrapitops.plan.system.settings.Permissions;
import com.djrapitops.plan.system.settings.locale.Locale; import com.djrapitops.plan.system.settings.locale.Locale;
import com.djrapitops.plan.system.settings.locale.Msg; 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.api.utility.log.Log;
import com.djrapitops.plugin.command.CommandNode; import com.djrapitops.plugin.command.CommandNode;
import com.djrapitops.plugin.command.CommandType; import com.djrapitops.plugin.command.CommandType;
import com.djrapitops.plugin.command.ISender; import com.djrapitops.plugin.command.ISender;
import com.djrapitops.plugin.task.AbsRunnable; import com.djrapitops.plugin.task.AbsRunnable;
import com.djrapitops.plugin.task.RunnableFactory; import com.djrapitops.plugin.task.RunnableFactory;
import net.md_5.bungee.api.ChatColor; import com.djrapitops.plugin.utilities.Verify;
import java.util.Arrays;
/** /**
* Subcommand for deleting a WebUser. * Subcommand for deleting a WebUser.
@ -29,9 +30,9 @@ public class WebDeleteCommand extends CommandNode {
@Override @Override
public void 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)) { Verify.isTrue(args.length >= 1,
return; () -> new IllegalArgumentException(Locale.get(Msg.CMD_FAIL_REQ_ARGS).parse(Arrays.toString(this.getArguments()))));
}
Database database = Database.getActive(); Database database = Database.getActive();
String user = args[0]; String user = args[0];
@ -39,7 +40,8 @@ public class WebDeleteCommand extends CommandNode {
@Override @Override
public void run() { public void run() {
try { try {
if (!Condition.isTrue(database.check().doesWebUserExists(user), ChatColor.RED + "[Plan] User Doesn't exist.", sender)) { if (!database.check().doesWebUserExists(user)) {
sender.sendMessage("§c[Plan] User Doesn't exist.");
return; return;
} }
database.remove().webUser(user); database.remove().webUser(user);

View File

@ -16,8 +16,7 @@ public enum Actions {
FIRST_SESSION(1), FIRST_SESSION(1),
FIRST_LOGOUT(2), FIRST_LOGOUT(2),
NEW_NICKNAME(3), NEW_NICKNAME(3),
KILLED(-2), // Not stored in ActionsTable. KILLED(-2); // Not stored in ActionsTable.
;
private final int id; private final int id;

View File

@ -11,7 +11,6 @@ import com.djrapitops.plan.data.container.PlayerKill;
import com.djrapitops.plan.data.container.Session; import com.djrapitops.plan.data.container.Session;
import com.djrapitops.plan.data.time.WorldTimes; import com.djrapitops.plan.data.time.WorldTimes;
import com.djrapitops.plan.system.info.server.ServerInfo; import com.djrapitops.plan.system.info.server.ServerInfo;
import com.djrapitops.plan.utilities.MiscUtils;
import com.djrapitops.plan.utilities.comparators.ActionComparator; import com.djrapitops.plan.utilities.comparators.ActionComparator;
import com.djrapitops.plan.utilities.comparators.GeoInfoComparator; import com.djrapitops.plan.utilities.comparators.GeoInfoComparator;
@ -177,7 +176,7 @@ public class PlayerProfile {
} }
public long getTotalPlaytime() { public long getTotalPlaytime() {
return getPlaytime(-1, MiscUtils.getTime() + 1L); return getPlaytime(-1, System.currentTimeMillis() + 1L);
} }
public long getPlaytime(long after, long before) { public long getPlaytime(long after, long before) {
@ -189,7 +188,7 @@ public class PlayerProfile {
} }
public long getLongestSession() { public long getLongestSession() {
return getLongestSession(-1, MiscUtils.getTime() + 1L); return getLongestSession(-1, System.currentTimeMillis() + 1L);
} }
public long getLongestSession(int after, long before) { public long getLongestSession(int after, long before) {
@ -201,7 +200,7 @@ public class PlayerProfile {
} }
public long getSessionMedian() { public long getSessionMedian() {
return getSessionMedian(-1, MiscUtils.getTime() + 1L); return getSessionMedian(-1, System.currentTimeMillis() + 1L);
} }
public long getSessionMedian(int after, long before) { public long getSessionMedian(int after, long before) {
@ -215,7 +214,7 @@ public class PlayerProfile {
// Special Getters // Special Getters
public long getSessionAverage() { public long getSessionAverage() {
return getSessionAverage(-1, MiscUtils.getTime() + 1L); return getSessionAverage(-1, System.currentTimeMillis() + 1L);
} }
public long getSessionAverage(int after, long before) { public long getSessionAverage(int after, long before) {
@ -241,7 +240,7 @@ public class PlayerProfile {
public GeoInfo getMostRecentGeoInfo() { public GeoInfo getMostRecentGeoInfo() {
if (geoInformation.isEmpty()) { if (geoInformation.isEmpty()) {
return new GeoInfo("-", "Not Known", MiscUtils.getTime(), ""); return new GeoInfo("-", "Not Known", System.currentTimeMillis(), "");
} }
geoInformation.sort(new GeoInfoComparator()); geoInformation.sort(new GeoInfoComparator());
return geoInformation.get(0); return geoInformation.get(0);

View File

@ -93,7 +93,7 @@ public class AnalysisData extends RawData {
} }
public void analyze(ServerProfile profile) { public void analyze(ServerProfile profile) {
long now = MiscUtils.getTime(); long now = System.currentTimeMillis();
refreshDate = now; refreshDate = now;
long dayAgo = now - TimeAmount.DAY.ms(); long dayAgo = now - TimeAmount.DAY.ms();
long weekAgo = now - TimeAmount.WEEK.ms(); long weekAgo = now - TimeAmount.WEEK.ms();
@ -225,14 +225,19 @@ public class AnalysisData extends RawData {
long newW = value("newW"); long newW = value("newW");
long newM = value("newM"); long newM = value("newM");
long fourDaysAgo = now - TimeAmount.DAY.ms() * 4L;
long twoWeeksAgo = now - TimeAmount.WEEK.ms() * 2L;
List<PlayerProfile> playersStuckPerMonth = newMonth.stream() List<PlayerProfile> playersStuckPerMonth = newMonth.stream()
.filter(p -> p.playedBetween(monthAgo, twoWeeksAgo) && p.playedBetween(twoWeeksAgo, now)) .filter(p -> {
long backLimit = Math.max(monthAgo, p.getRegistered());
long half = backLimit + ((now - backLimit) / 2L);
return p.playedBetween(backLimit, half) && p.playedBetween(half, now);
})
.collect(Collectors.toList()); .collect(Collectors.toList());
List<PlayerProfile> playersStuckPerWeek = newWeek.stream() List<PlayerProfile> playersStuckPerWeek = newWeek.stream()
.filter(p -> p.playedBetween(weekAgo, fourDaysAgo) && p.playedBetween(fourDaysAgo, now)) .filter(p -> {
long backLimit = Math.max(weekAgo, p.getRegistered());
long half = backLimit + ((now - backLimit) / 2L);
return p.playedBetween(backLimit, half) && p.playedBetween(half, now);
})
.collect(Collectors.toList()); .collect(Collectors.toList());
int stuckPerM = playersStuckPerMonth.size(); int stuckPerM = playersStuckPerMonth.size();
@ -240,32 +245,58 @@ public class AnalysisData extends RawData {
got("stuckPerM", stuckPerM); got("stuckPerM", stuckPerM);
got("stuckPerW", stuckPerW); got("stuckPerW", stuckPerW);
stickyMonthData = newMonth.stream().map(StickyData::new).distinct().collect(Collectors.toSet());
addValue("playersStuckMonth", stuckPerM); addValue("playersStuckMonth", stuckPerM);
addValue("playersStuckWeek", stuckPerW); addValue("playersStuckWeek", stuckPerW);
addValue("playersStuckPercMonth", newM != 0 ? FormatUtils.cutDecimals(MathUtils.averageDouble(stuckPerM, newM) * 100.0) + "%" : "-"); addValue("playersStuckPercMonth", newM != 0 ? FormatUtils.cutDecimals(MathUtils.averageDouble(stuckPerM, newM) * 100.0) + "%" : "-");
addValue("playersStuckPercWeek", newW != 0 ? FormatUtils.cutDecimals(MathUtils.averageDouble(stuckPerW, newW) * 100.0) + "%" : "-"); addValue("playersStuckPercWeek", newW != 0 ? FormatUtils.cutDecimals(MathUtils.averageDouble(stuckPerW, newW) * 100.0) + "%" : "-");
stuckPerDay(newDay, newMonth, newD, playersStuckPerMonth, playersStuckPerWeek); stuckPerDay(newDay, newD, monthAgo);
} }
private void stuckPerDay(List<PlayerProfile> newDay, List<PlayerProfile> newMonth, long newD, List<PlayerProfile> playersStuckPerMonth, List<PlayerProfile> playersStuckPerWeek) { private void stuckPerDay(List<PlayerProfile> newDay, long newD, long monthAgo) {
if (newD != 0) { if (newD != 0) {
// New Players List<PlayerProfile> stuckAfterMonth = new ArrayList<>();
stickyMonthData = newMonth.stream().map(StickyData::new).distinct().collect(Collectors.toSet()); List<PlayerProfile> notStuckAfterMonth = new ArrayList<>();
Set<StickyData> stickyW = playersStuckPerMonth.stream().map(StickyData::new).distinct().collect(Collectors.toSet());
// New Players who stayed for (PlayerProfile player : players) {
Set<StickyData> stickyStuckM = newMonth.stream().map(StickyData::new).distinct().collect(Collectors.toSet()); long registered = player.getRegistered();
Set<StickyData> stickyStuckW = playersStuckPerWeek.stream().map(StickyData::new).distinct().collect(Collectors.toSet());
// Discard uncertain data
if (registered > monthAgo) {
continue;
}
long monthAfterRegister = registered + TimeAmount.MONTH.ms();
long half = registered + (TimeAmount.MONTH.ms() / 2L);
if (player.playedBetween(registered, half) && player.playedBetween(half, monthAfterRegister)) {
stuckAfterMonth.add(player);
} else {
notStuckAfterMonth.add(player);
}
}
if (stuckAfterMonth.isEmpty() || notStuckAfterMonth.isEmpty()) {
addValue("playersStuckDay", 0);
addValue("playersStuckPercDay", "Not enough data");
return;
}
List<StickyData> stuck = stuckAfterMonth.stream().map(StickyData::new).collect(Collectors.toList());
List<StickyData> nonStuck = notStuckAfterMonth.stream().map(StickyData::new).collect(Collectors.toList());
StickyData avgStuck = AnalysisUtils.average(stuck);
StickyData avgNonStuck = AnalysisUtils.average(nonStuck);
int stuckPerD = 0; int stuckPerD = 0;
for (PlayerProfile playerProfile : newDay) { for (PlayerProfile player : newDay) {
double probability = AnalysisUtils.calculateProbabilityOfStaying( StickyData stickyData = new StickyData(player);
stickyMonthData, stickyW, stickyStuckM, stickyStuckW, playerProfile if (stickyData.distance(avgStuck) < stickyData.distance(avgNonStuck)) {
);
if (probability >= 0.5) {
stuckPerD++; stuckPerD++;
} }
} }
addValue("playersStuckDay", stuckPerD); addValue("playersStuckDay", stuckPerD);
addValue("playersStuckPercDay", FormatUtils.cutDecimals(MathUtils.averageDouble(stuckPerD, newD) * 100.0) + "%"); addValue("playersStuckPercDay", FormatUtils.cutDecimals(MathUtils.averageDouble(stuckPerD, newD) * 100.0) + "%");
} else { } else {

View File

@ -126,7 +126,7 @@ public class HealthNotes {
} }
private void newPlayerNote() { private void newPlayerNote() {
double avgOnlineOnRegister = MathUtils.averageInt(analysisData.getStickyMonthData().stream().map(StickyData::getOnlineOnJoin)); double avgOnlineOnRegister = MathUtils.averageDouble(analysisData.getStickyMonthData().stream().map(StickyData::getOnlineOnJoin));
if (avgOnlineOnRegister >= 1) { if (avgOnlineOnRegister >= 1) {
notes.add("<p>" + Html.GREEN_THUMB.parse() + " New Players have players to play with when they join (" notes.add("<p>" + Html.GREEN_THUMB.parse() + " New Players have players to play with when they join ("
+ FormatUtils.cutDecimals(avgOnlineOnRegister) + " on average)</p>"); + FormatUtils.cutDecimals(avgOnlineOnRegister) + " on average)</p>");

View File

@ -1,7 +1,6 @@
package com.djrapitops.plan.data.container; package com.djrapitops.plan.data.container;
import com.djrapitops.plan.data.time.WorldTimes; import com.djrapitops.plan.data.time.WorldTimes;
import com.djrapitops.plan.utilities.MiscUtils;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
@ -106,7 +105,7 @@ public class Session {
*/ */
public long getLength() { public long getLength() {
if (sessionEnd == -1) { if (sessionEnd == -1) {
return MiscUtils.getTime() - sessionStart; return System.currentTimeMillis() - sessionStart;
} }
return sessionEnd - sessionStart; return sessionEnd - sessionStart;
} }
@ -173,7 +172,7 @@ public class Session {
* Used to get the ID of the session in the Database. * Used to get the ID of the session in the Database.
* *
* @return ID if present. * @return ID if present.
* @throws NullPointerException if Session was not fetched from DB. Condition using {@code isFetchedFromDB} * @throws NullPointerException if Session was not fetched from DB. Check {@code isFetchedFromDB} first.
*/ */
public int getSessionID() { public int getSessionID() {
return sessionID != null ? sessionID : -1; return sessionID != null ? sessionID : -1;

View File

@ -13,22 +13,28 @@ import java.util.List;
public class StickyData { public class StickyData {
private final double activityIndex; private final double activityIndex;
private Integer messagesSent; private Double messagesSent;
private Integer onlineOnJoin; private Double onlineOnJoin;
public StickyData(PlayerProfile player) { public StickyData(PlayerProfile player) {
activityIndex = player.getActivityIndex(player.getRegistered() + TimeAmount.DAY.ms()).getValue(); activityIndex = player.getActivityIndex(player.getRegistered() + TimeAmount.DAY.ms()).getValue();
loadActionVariables(player.getActions()); loadActionVariables(player.getActions());
} }
public StickyData(double activityIndex, Double messagesSent, Double onlineOnJoin) {
this.activityIndex = activityIndex;
this.messagesSent = messagesSent;
this.onlineOnJoin = onlineOnJoin;
}
private void loadActionVariables(List<Action> actions) { private void loadActionVariables(List<Action> actions) {
for (Action action : actions) { for (Action action : actions) {
try { try {
if (messagesSent == null && action.getDoneAction() == Actions.FIRST_LOGOUT) { if (messagesSent == null && action.getDoneAction() == Actions.FIRST_LOGOUT) {
messagesSent = loadSentMessages(action); messagesSent = (double) loadSentMessages(action);
} }
if (onlineOnJoin == null && action.getDoneAction() == Actions.FIRST_SESSION) { if (onlineOnJoin == null && action.getDoneAction() == Actions.FIRST_SESSION) {
onlineOnJoin = loadOnlineOnJoin(action); onlineOnJoin = (double) loadOnlineOnJoin(action);
} }
} catch (IllegalArgumentException ignore) { } catch (IllegalArgumentException ignore) {
/* continue */ /* continue */
@ -39,10 +45,10 @@ public class StickyData {
private void setDefaultValuesIfNull() { private void setDefaultValuesIfNull() {
if (messagesSent == null) { if (messagesSent == null) {
messagesSent = 0; messagesSent = 0.0;
} }
if (onlineOnJoin == null) { if (onlineOnJoin == null) {
onlineOnJoin = 0; onlineOnJoin = 0.0;
} }
} }
@ -88,7 +94,15 @@ public class StickyData {
return Objects.hashCode(activityIndex, messagesSent, onlineOnJoin); return Objects.hashCode(activityIndex, messagesSent, onlineOnJoin);
} }
public int getOnlineOnJoin() { public double getOnlineOnJoin() {
return onlineOnJoin; return onlineOnJoin;
} }
public double getActivityIndex() {
return activityIndex;
}
public Double getMessagesSent() {
return messagesSent;
}
} }

View File

@ -30,13 +30,13 @@ import java.util.UUID;
*/ */
public final class AnalysisContainer extends InspectContainer { public final class AnalysisContainer extends InspectContainer {
private TreeMap<String, Map<UUID, ? extends Serializable>> playerTableValues; private Map<String, Map<UUID, ? extends Serializable>> playerTableValues;
public AnalysisContainer() { public AnalysisContainer() {
playerTableValues = new TreeMap<>(); playerTableValues = new TreeMap<>();
} }
public TreeMap<String, Map<UUID, ? extends Serializable>> getPlayerTableValues() { public Map<String, Map<UUID, ? extends Serializable>> getPlayerTableValues() {
return playerTableValues; return playerTableValues;
} }

View File

@ -18,7 +18,7 @@ import java.util.List;
*/ */
public class TableContainer { public class TableContainer {
private final String[] header; protected final String[] header;
private List<Serializable[]> values; private List<Serializable[]> values;
private boolean jqueryDatatable; private boolean jqueryDatatable;

View File

@ -1,7 +1,5 @@
package com.djrapitops.plan.data.time; package com.djrapitops.plan.data.time;
import com.djrapitops.plan.utilities.MiscUtils;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
import java.util.Objects; import java.util.Objects;
@ -28,7 +26,7 @@ public class WorldTimes {
worldTimes = new HashMap<>(); worldTimes = new HashMap<>();
currentWorld = startingWorld; currentWorld = startingWorld;
currentGamemode = startingGM; currentGamemode = startingGM;
addWorld(startingWorld, startingGM, MiscUtils.getTime()); addWorld(startingWorld, startingGM, System.currentTimeMillis());
} }
/** /**

View File

@ -30,8 +30,7 @@ import com.djrapitops.plugin.api.utility.log.Log;
public class BukkitSystem extends PlanSystem implements ServerSystem { public class BukkitSystem extends PlanSystem implements ServerSystem {
public BukkitSystem(Plan plugin) { public BukkitSystem(Plan plugin) {
setTestSystem(this);
testSystem = this;
Log.setErrorManager(new PlanErrorManager()); Log.setErrorManager(new PlanErrorManager());

View File

@ -29,7 +29,7 @@ import com.djrapitops.plugin.api.utility.log.Log;
public class BungeeSystem extends PlanSystem { public class BungeeSystem extends PlanSystem {
public BungeeSystem(PlanBungee plugin) { public BungeeSystem(PlanBungee plugin) {
testSystem = this; setTestSystem(this);
Log.setErrorManager(new PlanErrorManager()); Log.setErrorManager(new PlanErrorManager());

View File

@ -196,4 +196,8 @@ public abstract class PlanSystem implements SubSystem {
public Processing getProcessing() { public Processing getProcessing() {
return processing; return processing;
} }
static void setTestSystem(PlanSystem testSystem) {
PlanSystem.testSystem = testSystem;
}
} }

View File

@ -32,7 +32,7 @@ public class SpongeSystem extends PlanSystem implements ServerSystem {
private boolean firstInstall = false; private boolean firstInstall = false;
public SpongeSystem(PlanSponge plugin) { public SpongeSystem(PlanSponge plugin) {
testSystem = this; setTestSystem(this);
Log.setErrorManager(new PlanErrorManager()); Log.setErrorManager(new PlanErrorManager());

View File

@ -6,7 +6,6 @@ import com.djrapitops.plan.system.file.FileSystem;
import com.djrapitops.plan.system.settings.Settings; import com.djrapitops.plan.system.settings.Settings;
import com.djrapitops.plugin.api.utility.log.Log; import com.djrapitops.plugin.api.utility.log.Log;
import com.djrapitops.plugin.utilities.Verify; import com.djrapitops.plugin.utilities.Verify;
import com.google.common.cache.Cache;
import com.maxmind.geoip2.DatabaseReader; import com.maxmind.geoip2.DatabaseReader;
import com.maxmind.geoip2.exception.GeoIp2Exception; import com.maxmind.geoip2.exception.GeoIp2Exception;
import com.maxmind.geoip2.model.CountryResponse; import com.maxmind.geoip2.model.CountryResponse;
@ -28,8 +27,6 @@ import java.util.zip.GZIPInputStream;
* This class contains the geolocation cache. * This class contains the geolocation cache.
* <p> * <p>
* It caches all IPs with their matching country. * It caches all IPs with their matching country.
* <p>
* This cache uses the Google Guava {@link Cache}.
* *
* @author Fuzzlemann * @author Fuzzlemann
* @since 3.5.5 * @since 3.5.5

View File

@ -4,7 +4,6 @@ import com.djrapitops.plan.api.exceptions.database.DBException;
import com.djrapitops.plan.data.container.Session; import com.djrapitops.plan.data.container.Session;
import com.djrapitops.plan.system.PlanSystem; import com.djrapitops.plan.system.PlanSystem;
import com.djrapitops.plan.system.database.databases.Database; import com.djrapitops.plan.system.database.databases.Database;
import com.djrapitops.plan.utilities.MiscUtils;
import com.djrapitops.plugin.api.utility.log.Log; import com.djrapitops.plugin.api.utility.log.Log;
import com.djrapitops.plugin.utilities.Verify; import com.djrapitops.plugin.utilities.Verify;
@ -30,7 +29,7 @@ public class SessionCache {
} }
public static SessionCache getInstance() { public static SessionCache getInstance() {
DataCache dataCache = CacheSystem.getInstance().getDataCache(); SessionCache dataCache = CacheSystem.getInstance().getDataCache();
Verify.nullCheck(dataCache, () -> new IllegalStateException("Data Cache was not initialized.")); Verify.nullCheck(dataCache, () -> new IllegalStateException("Data Cache was not initialized."));
return dataCache; return dataCache;
} }
@ -71,7 +70,7 @@ public class SessionCache {
public static void refreshActiveSessionsState() { public static void refreshActiveSessionsState() {
for (Session session : activeSessions.values()) { for (Session session : activeSessions.values()) {
session.getWorldTimes().updateState(MiscUtils.getTime()); session.getWorldTimes().updateState(System.currentTimeMillis());
} }
} }
@ -99,7 +98,7 @@ public class SessionCache {
} }
/** /**
* Condition if a session is player's first session on the server. * Check if a session is player's first session on the server.
* *
* @param uuid UUID of the player * @param uuid UUID of the player
* @return true / false * @return true / false

View File

@ -3,10 +3,12 @@ package com.djrapitops.plan.system.database.databases.operation;
import com.djrapitops.plan.api.exceptions.database.DBException; import com.djrapitops.plan.api.exceptions.database.DBException;
import com.djrapitops.plan.system.database.databases.Database; import com.djrapitops.plan.system.database.databases.Database;
import java.sql.SQLException;
public interface BackupOperations { public interface BackupOperations {
void backup(Database toDatabase) throws DBException; void backup(Database toDatabase) throws SQLException;
void restore(Database fromDatabase) throws DBException; void restore(Database fromDatabase) throws DBException, SQLException;
} }

View File

@ -65,7 +65,7 @@ public class MySQLDB extends SQLDB {
@Override @Override
public void close() { public void close() {
try { try {
if (dataSource != null && dataSource instanceof BasicDataSource) { if (dataSource instanceof BasicDataSource) {
((BasicDataSource) dataSource).close(); ((BasicDataSource) dataSource).close();
} }
} catch (SQLException e) { } catch (SQLException e) {

View File

@ -139,7 +139,7 @@ public abstract class SQLDB extends Database {
if (newDatabase) { if (newDatabase) {
Log.info("New Database created."); Log.info("New Database created.");
versionTable.setVersion(17); versionTable.setVersion(18);
} }
int version = versionTable.getVersion(); int version = versionTable.getVersion();
@ -187,6 +187,10 @@ public abstract class SQLDB extends Database {
geoInfoTable.alterTableV17(); geoInfoTable.alterTableV17();
versionTable.setVersion(17); versionTable.setVersion(17);
} }
if (version < 18) {
geoInfoTable.alterTableV18();
// version set in the runnable in above method
}
} catch (SQLException e) { } catch (SQLException e) {
throw new DBInitException("Failed to set-up Database", e); throw new DBInitException("Failed to set-up Database", e);
} }
@ -256,6 +260,7 @@ public abstract class SQLDB extends Database {
private void clean() throws SQLException { private void clean() throws SQLException {
tpsTable.clean(); tpsTable.clean();
transferTable.clean(); transferTable.clean();
geoInfoTable.clean();
long now = System.currentTimeMillis(); long now = System.currentTimeMillis();
long keepActiveAfter = now - TimeAmount.DAY.ms() * Settings.KEEP_INACTIVE_PLAYERS_DAYS.getNumber(); long keepActiveAfter = now - TimeAmount.DAY.ms() * Settings.KEEP_INACTIVE_PLAYERS_DAYS.getNumber();
@ -271,7 +276,10 @@ public abstract class SQLDB extends Database {
Log.toLog(this.getClass().getName(), e); Log.toLog(this.getClass().getName(), e);
} }
} }
Log.info("Removed data of " + inactivePlayers.size() + " players."); int removed = inactivePlayers.size();
if (removed > 0) {
Log.info("Removed data of " + removed + " players.");
}
} }
public abstract Connection getConnection() throws SQLException; public abstract Connection getConnection() throws SQLException;
@ -373,7 +381,7 @@ public abstract class SQLDB extends Database {
} }
public boolean isUsingMySQL() { public boolean isUsingMySQL() {
return this instanceof MySQLDB; return usingMySQL;
} }
@Override @Override

View File

@ -6,6 +6,7 @@ import com.djrapitops.plugin.api.utility.log.Log;
import org.spongepowered.api.Sponge; import org.spongepowered.api.Sponge;
import org.spongepowered.api.service.sql.SqlService; import org.spongepowered.api.service.sql.SqlService;
import java.sql.Connection;
import java.sql.SQLException; import java.sql.SQLException;
import java.util.Optional; import java.util.Optional;
@ -44,4 +45,21 @@ public class SpongeMySQLDB extends MySQLDB {
} }
} }
@Override
public Connection getConnection() throws SQLException {
try {
return super.getConnection();
} catch (SQLException e) {
if (e.getMessage().contains("has been closed")) {
try {
setupDataSource();
} catch (DBInitException setupException) {
throw new IllegalStateException("Failed to set up a new datasource after connection failure.", setupException);
}
return super.getConnection();
} else {
throw e;
}
}
}
} }

View File

@ -3,6 +3,9 @@ package com.djrapitops.plan.system.database.databases.sql.operation;
import com.djrapitops.plan.system.database.databases.Database; import com.djrapitops.plan.system.database.databases.Database;
import com.djrapitops.plan.system.database.databases.operation.BackupOperations; import com.djrapitops.plan.system.database.databases.operation.BackupOperations;
import com.djrapitops.plan.system.database.databases.sql.SQLDB; import com.djrapitops.plan.system.database.databases.sql.SQLDB;
import com.djrapitops.plan.system.database.databases.sql.tables.move.BatchOperationTable;
import java.sql.SQLException;
public class SQLBackupOps extends SQLOps implements BackupOperations { public class SQLBackupOps extends SQLOps implements BackupOperations {
@ -11,12 +14,16 @@ public class SQLBackupOps extends SQLOps implements BackupOperations {
} }
@Override @Override
public void backup(Database toDatabase) { public void backup(Database toDatabase) throws SQLException {
// TODO BatchOperationTable toDB = new BatchOperationTable((SQLDB) toDatabase);
BatchOperationTable fromDB = new BatchOperationTable(db);
toDB.removeAllData();
fromDB.copyEverything(toDB);
} }
@Override @Override
public void restore(Database fromDatabase) { public void restore(Database fromDatabase) throws SQLException {
// TODO fromDatabase.backup().backup(db);
} }
} }

View File

@ -8,7 +8,6 @@ import com.djrapitops.plan.data.container.*;
import com.djrapitops.plan.system.database.databases.operation.FetchOperations; import com.djrapitops.plan.system.database.databases.operation.FetchOperations;
import com.djrapitops.plan.system.database.databases.sql.SQLDB; import com.djrapitops.plan.system.database.databases.sql.SQLDB;
import com.djrapitops.plan.system.info.server.Server; import com.djrapitops.plan.system.info.server.Server;
import com.djrapitops.plan.utilities.MiscUtils;
import com.djrapitops.plugin.api.TimeAmount; import com.djrapitops.plugin.api.TimeAmount;
import java.sql.SQLException; import java.sql.SQLException;
@ -32,7 +31,7 @@ public class SQLFetchOps extends SQLOps implements FetchOperations {
profile.setAllTimePeak(peak.getDate()); profile.setAllTimePeak(peak.getDate());
profile.setAllTimePeakPlayers(peak.getPlayers()); profile.setAllTimePeakPlayers(peak.getPlayers());
}); });
Optional<TPS> lastPeak = tpsTable.getPeakPlayerCount(serverUUID, MiscUtils.getTime() - (TimeAmount.DAY.ms() * 2L)); Optional<TPS> lastPeak = tpsTable.getPeakPlayerCount(serverUUID, System.currentTimeMillis() - (TimeAmount.DAY.ms() * 2L));
lastPeak.ifPresent(peak -> { lastPeak.ifPresent(peak -> {
profile.setLastPeakDate(peak.getDate()); profile.setLastPeakDate(peak.getDate());
profile.setLastPeakPlayers(peak.getPlayers()); profile.setLastPeakPlayers(peak.getPlayers());

View File

@ -10,7 +10,9 @@ 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.Select;
import com.djrapitops.plan.system.database.databases.sql.statements.Sql; 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.database.databases.sql.statements.TableSqlParser;
import com.djrapitops.plan.system.database.databases.sql.tables.move.Version18TransferTable;
import com.djrapitops.plan.system.settings.Settings; import com.djrapitops.plan.system.settings.Settings;
import com.djrapitops.plan.utilities.comparators.GeoInfoComparator;
import com.djrapitops.plugin.api.utility.log.Log; import com.djrapitops.plugin.api.utility.log.Log;
import com.djrapitops.plugin.task.AbsRunnable; import com.djrapitops.plugin.task.AbsRunnable;
import com.djrapitops.plugin.task.RunnableFactory; import com.djrapitops.plugin.task.RunnableFactory;
@ -74,8 +76,10 @@ public class GeoInfoTable extends UserIDTable {
public void alterTableV17() { public void alterTableV17() {
addColumns(Col.IP_HASH.get() + " varchar(200) DEFAULT ''"); addColumns(Col.IP_HASH.get() + " varchar(200) DEFAULT ''");
}
RunnableFactory.createNew("DB Version 16->17", new AbsRunnable() { public void alterTableV18() {
RunnableFactory.createNew("DB Version 17->18", new AbsRunnable() {
@Override @Override
public void run() { public void run() {
try { try {
@ -91,6 +95,9 @@ public class GeoInfoTable extends UserIDTable {
for (List<GeoInfo> geoInfos : allGeoInfo.values()) { for (List<GeoInfo> geoInfos : allGeoInfo.values()) {
for (GeoInfo geoInfo : geoInfos) { for (GeoInfo geoInfo : geoInfos) {
try { try {
if (geoInfo.getIp().endsWith(".xx.xx")) {
continue;
}
GeoInfo updatedInfo = new GeoInfo( GeoInfo updatedInfo = new GeoInfo(
geoInfo.getIp(), geoInfo.getIp(),
geoInfo.getGeolocation(), geoInfo.getGeolocation(),
@ -99,6 +106,7 @@ public class GeoInfoTable extends UserIDTable {
statement.setString(1, updatedInfo.getIp()); statement.setString(1, updatedInfo.getIp());
statement.setString(2, updatedInfo.getIpHash()); statement.setString(2, updatedInfo.getIpHash());
statement.setString(3, geoInfo.getIp()); statement.setString(3, geoInfo.getIp());
statement.addBatch();
} catch (UnsupportedEncodingException | NoSuchAlgorithmException e) { } catch (UnsupportedEncodingException | NoSuchAlgorithmException e) {
if (Settings.DEV_MODE.isTrue()) { if (Settings.DEV_MODE.isTrue()) {
Log.toLog(this.getClass(), e); Log.toLog(this.getClass(), e);
@ -108,11 +116,17 @@ public class GeoInfoTable extends UserIDTable {
} }
} }
}); });
} catch (SQLException e) { new Version18TransferTable(db).alterTableV18();
e.printStackTrace(); db.setVersion(18);
} catch (SQLException | DBInitException e) {
Log.toLog(this.getClass(), e);
} }
} }
}); }).runTaskAsynchronously();
}
public void clean() {
} }
public List<GeoInfo> getGeoInfo(UUID uuid) throws SQLException { public List<GeoInfo> getGeoInfo(UUID uuid) throws SQLException {
@ -162,9 +176,10 @@ public class GeoInfoTable extends UserIDTable {
List<GeoInfo> geoInfo = getGeoInfo(uuid); List<GeoInfo> geoInfo = getGeoInfo(uuid);
if (geoInfo.contains(info)) { if (geoInfo.contains(info)) {
updateGeoInfo(uuid, info); updateGeoInfo(uuid, info);
} } else {
insertGeoInfo(uuid, info); insertGeoInfo(uuid, info);
} }
}
private void insertGeoInfo(UUID uuid, GeoInfo info) throws SQLException { private void insertGeoInfo(UUID uuid, GeoInfo info) throws SQLException {
execute(new ExecStatement(insertStatement) { execute(new ExecStatement(insertStatement) {
@ -235,28 +250,19 @@ public class GeoInfoTable extends UserIDTable {
} }
public List<String> getNetworkGeolocations() throws SQLException { public List<String> getNetworkGeolocations() throws SQLException {
String subQuery = "SELECT " +
Col.USER_ID + ", " +
"MAX(" + Col.LAST_USED + ") as max" +
" FROM " + tableName +
" GROUP BY " + Col.USER_ID;
String sql = "SELECT " +
"f." + Col.GEOLOCATION +
" FROM (" + subQuery + ") as x" +
" INNER JOIN " + tableName + " AS f ON f." + Col.USER_ID + "=x." + Col.USER_ID +
" AND f." + Col.LAST_USED + "=x.max";
return query(new QueryAllStatement<List<String>>(sql) {
@Override
public List<String> processResults(ResultSet set) throws SQLException {
List<String> geolocations = new ArrayList<>(); List<String> geolocations = new ArrayList<>();
while (set.next()) {
geolocations.add(set.getString(Col.GEOLOCATION.get())); Map<UUID, List<GeoInfo>> geoInfo = getAllGeoInfo();
for (List<GeoInfo> userGeoInfos : geoInfo.values()) {
if (userGeoInfos.isEmpty()) {
continue;
} }
userGeoInfos.sort(new GeoInfoComparator());
geolocations.add(userGeoInfos.get(0).getGeolocation());
}
return geolocations; return geolocations;
} }
});
}
public void insertAllGeoInfo(Map<UUID, List<GeoInfo>> allIPsAndGeolocations) throws SQLException { public void insertAllGeoInfo(Map<UUID, List<GeoInfo>> allIPsAndGeolocations) throws SQLException {
if (Verify.isEmpty(allIPsAndGeolocations)) { if (Verify.isEmpty(allIPsAndGeolocations)) {

View File

@ -11,7 +11,6 @@ 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.Sql;
import com.djrapitops.plan.system.database.databases.sql.statements.TableSqlParser; import com.djrapitops.plan.system.database.databases.sql.statements.TableSqlParser;
import com.djrapitops.plan.system.info.server.ServerInfo; import com.djrapitops.plan.system.info.server.ServerInfo;
import com.djrapitops.plan.utilities.MiscUtils;
import com.djrapitops.plugin.api.TimeAmount; import com.djrapitops.plugin.api.TimeAmount;
import com.djrapitops.plugin.utilities.Verify; import com.djrapitops.plugin.utilities.Verify;
@ -619,7 +618,7 @@ public class SessionsTable extends UserIDTable {
return query(new QueryStatement<Map<UUID, Map<UUID, List<Session>>>>(sql, 20000) { return query(new QueryStatement<Map<UUID, Map<UUID, List<Session>>>>(sql, 20000) {
@Override @Override
public void prepare(PreparedStatement statement) throws SQLException { public void prepare(PreparedStatement statement) throws SQLException {
statement.setLong(1, MiscUtils.getTime() - TimeAmount.MONTH.ms()); statement.setLong(1, System.currentTimeMillis() - TimeAmount.MONTH.ms());
} }
@Override @Override
@ -722,19 +721,32 @@ public class SessionsTable extends UserIDTable {
* @param savedSessions Sessions of Player in a Server in the db. * @param savedSessions Sessions of Player in a Server in the db.
*/ */
private void matchSessions(List<Session> sessions, List<Session> savedSessions) { private void matchSessions(List<Session> sessions, List<Session> savedSessions) {
Map<Long, Session> sessionsByStart = sessions.stream().collect(Collectors.toMap(Session::getSessionStart, Function.identity())); Map<Long, List<Session>> sessionsByStart = turnToMapByStart(sessions);
Map<Long, Session> savedSessionsByStart = savedSessions.stream().collect(Collectors.toMap(Session::getSessionStart, Function.identity())); Map<Long, List<Session>> savedSessionsByStart = turnToMapByStart(savedSessions);
for (Map.Entry<Long, Session> sessionEntry : sessionsByStart.entrySet()) {
for (Map.Entry<Long, List<Session>> sessionEntry : sessionsByStart.entrySet()) {
long start = sessionEntry.getKey(); long start = sessionEntry.getKey();
Session savedSession = savedSessionsByStart.get(start); if (!savedSessionsByStart.containsKey(start)) {
if (savedSession == null) {
throw new IllegalStateException("Some of the sessions being matched were not saved."); throw new IllegalStateException("Some of the sessions being matched were not saved.");
} }
Session session = sessionEntry.getValue(); Session savedSession = savedSessionsByStart.get(start).get(0);
session.setSessionID(savedSession.getSessionID()); sessionEntry.getValue().forEach(
session -> session.setSessionID(savedSession.getSessionID())
);
} }
} }
private Map<Long, List<Session>> turnToMapByStart(List<Session> sessions) {
Map<Long, List<Session>> sessionsByStart = new HashMap<>();
for (Session session : sessions) {
long start = session.getSessionStart();
List<Session> sorted = sessionsByStart.getOrDefault(start, new ArrayList<>());
sorted.add(session);
sessionsByStart.put(start, sorted);
}
return sessionsByStart;
}
public void alterTableV15() { public void alterTableV15() {
addColumns(Col.AFK_TIME + " bigint NOT NULL DEFAULT 0"); addColumns(Col.AFK_TIME + " bigint NOT NULL DEFAULT 0");
} }
@ -748,7 +760,7 @@ public class SessionsTable extends UserIDTable {
return query(new QueryAllStatement<Map<Integer, Integer>>(sql, 10000) { return query(new QueryAllStatement<Map<Integer, Integer>>(sql, 10000) {
@Override @Override
public Map<Integer, Integer> processResults(ResultSet set) throws SQLException { public Map<Integer, Integer> processResults(ResultSet set) throws SQLException {
HashMap<Integer, Integer> idServerIdMap = new HashMap<>(); Map<Integer, Integer> idServerIdMap = new HashMap<>();
while (set.next()) { while (set.next()) {
idServerIdMap.put(set.getInt(Col.ID.get()), set.getInt(Col.SERVER_ID.get())); idServerIdMap.put(set.getInt(Col.ID.get()), set.getInt(Col.SERVER_ID.get()));
} }

View File

@ -13,7 +13,6 @@ 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.database.databases.sql.statements.TableSqlParser;
import com.djrapitops.plan.system.info.server.Server; import com.djrapitops.plan.system.info.server.Server;
import com.djrapitops.plan.system.info.server.ServerInfo; import com.djrapitops.plan.system.info.server.ServerInfo;
import com.djrapitops.plan.utilities.MiscUtils;
import com.djrapitops.plugin.api.TimeAmount; import com.djrapitops.plugin.api.TimeAmount;
import com.djrapitops.plugin.utilities.Verify; import com.djrapitops.plugin.utilities.Verify;
@ -133,7 +132,7 @@ public class TPSTable extends Table {
statement.setInt(1, pValue); statement.setInt(1, pValue);
// More than 2 Months ago. // More than 2 Months ago.
long fiveWeeks = TimeAmount.MONTH.ms() * 2L; long fiveWeeks = TimeAmount.MONTH.ms() * 2L;
statement.setLong(2, MiscUtils.getTime() - fiveWeeks); statement.setLong(2, System.currentTimeMillis() - fiveWeeks);
} }
}); });
} }

View File

@ -12,7 +12,6 @@ import com.djrapitops.plan.system.database.databases.sql.statements.Column;
import com.djrapitops.plan.system.database.databases.sql.statements.Sql; 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.database.databases.sql.statements.TableSqlParser;
import com.djrapitops.plan.system.info.server.ServerInfo; import com.djrapitops.plan.system.info.server.ServerInfo;
import com.djrapitops.plan.utilities.MiscUtils;
import com.djrapitops.plugin.api.TimeAmount; import com.djrapitops.plugin.api.TimeAmount;
import java.sql.PreparedStatement; import java.sql.PreparedStatement;
@ -84,7 +83,7 @@ public class TransferTable extends Table {
execute(new ExecStatement(sql) { execute(new ExecStatement(sql) {
@Override @Override
public void prepare(PreparedStatement statement) throws SQLException { public void prepare(PreparedStatement statement) throws SQLException {
statement.setLong(1, MiscUtils.getTime()); statement.setLong(1, System.currentTimeMillis());
statement.setString(2, "onlineStatus"); statement.setString(2, "onlineStatus");
} }
}); });
@ -133,7 +132,7 @@ public class TransferTable extends Table {
@Override @Override
public void prepare(PreparedStatement statement) throws SQLException { public void prepare(PreparedStatement statement) throws SQLException {
statement.setString(1, ServerInfo.getServerUUID().toString()); statement.setString(1, ServerInfo.getServerUUID().toString());
statement.setLong(2, MiscUtils.getTime() + TimeAmount.HOUR.ms()); statement.setLong(2, System.currentTimeMillis() + TimeAmount.HOUR.ms());
statement.setString(3, "configSettings"); statement.setString(3, "configSettings");
statement.setString(4, null); statement.setString(4, null);
statement.setString(5, encodedSettingString); statement.setString(5, encodedSettingString);
@ -146,7 +145,7 @@ public class TransferTable extends Table {
@Override @Override
public void prepare(PreparedStatement statement) throws SQLException { public void prepare(PreparedStatement statement) throws SQLException {
statement.setString(1, "configSettings"); statement.setString(1, "configSettings");
statement.setLong(2, MiscUtils.getTime()); statement.setLong(2, System.currentTimeMillis());
} }
@Override @Override

View File

@ -170,16 +170,21 @@ public class UserInfoTable extends UserIDTable {
} }
public List<UserInfo> getServerUserInfo(UUID serverUUID) throws SQLException { public List<UserInfo> getServerUserInfo(UUID serverUUID) throws SQLException {
Optional<Integer> serverID = serverTable.getServerID(serverUUID);
if (!serverID.isPresent()) {
return new ArrayList<>();
}
Map<UUID, String> playerNames = usersTable.getPlayerNames(); Map<UUID, String> playerNames = usersTable.getPlayerNames();
Map<Integer, UUID> uuidsByID = usersTable.getUUIDsByID(); Map<Integer, UUID> uuidsByID = usersTable.getUUIDsByID();
String sql = "SELECT * FROM " + tableName + String sql = "SELECT * FROM " + tableName +
" WHERE " + Col.SERVER_ID + "=" + serverTable.statementSelectServerID; " WHERE " + Col.SERVER_ID + "=?";
return query(new QueryStatement<List<UserInfo>>(sql, 20000) { return query(new QueryStatement<List<UserInfo>>(sql, 20000) {
@Override @Override
public void prepare(PreparedStatement statement) throws SQLException { public void prepare(PreparedStatement statement) throws SQLException {
statement.setString(1, serverUUID.toString()); statement.setInt(1, serverID.get());
} }
@Override @Override
@ -361,8 +366,34 @@ public class UserInfoTable extends UserIDTable {
} }
} }
// TODO improve performance of this method.
public Set<UUID> getSavedUUIDs(UUID serverUUID) throws SQLException { public Set<UUID> getSavedUUIDs(UUID serverUUID) throws SQLException {
return getSavedUUIDs().get(serverUUID); String usersIDColumn = usersTable + "." + UsersTable.Col.ID;
String usersUUIDColumn = usersTable + "." + UsersTable.Col.UUID + " as uuid";
String serverIDColumn = serverTable + "." + ServerTable.Col.SERVER_ID;
String serverUUIDColumn = serverTable + "." + ServerTable.Col.SERVER_UUID + " as s_uuid";
String sql = "SELECT " +
usersUUIDColumn + ", " +
serverUUIDColumn +
" FROM " + tableName +
" INNER JOIN " + usersTable + " on " + usersIDColumn + "=" + Col.USER_ID +
" INNER JOIN " + serverTable + " on " + serverIDColumn + "=" + Col.SERVER_ID +
" WHERE s_uuid=?";
return query(new QueryStatement<Set<UUID>>(sql, 50000) {
@Override
public void prepare(PreparedStatement statement) throws SQLException {
statement.setString(1, serverUUID.toString());
}
@Override
public Set<UUID> processResults(ResultSet set) throws SQLException {
Set<UUID> uuids = new HashSet<>();
while (set.next()) {
UUID uuid = UUID.fromString(set.getString("uuid"));
uuids.add(uuid);
}
return uuids;
}
});
} }
} }

View File

@ -310,7 +310,7 @@ public class WorldTable extends Table {
return query(new QueryAllStatement<Map<Integer, List<Integer>>>(sql, 100) { return query(new QueryAllStatement<Map<Integer, List<Integer>>>(sql, 100) {
@Override @Override
public Map<Integer, List<Integer>> processResults(ResultSet set) throws SQLException { public Map<Integer, List<Integer>> processResults(ResultSet set) throws SQLException {
HashMap<Integer, List<Integer>> map = new HashMap<>(); Map<Integer, List<Integer>> map = new HashMap<>();
while (set.next()) { while (set.next()) {
int serverID = set.getInt(Col.SERVER_ID.get()); int serverID = set.getInt(Col.SERVER_ID.get());

View File

@ -0,0 +1,36 @@
package com.djrapitops.plan.system.database.databases.sql.tables.move;
import com.djrapitops.plan.system.database.databases.sql.SQLDB;
import com.djrapitops.plan.system.database.databases.sql.tables.Table;
import java.sql.SQLException;
/**
* Abstract table used for transferring a whole table to a new table.
*
* @author Rsl1122
*/
public class TransferTable extends Table {
public TransferTable(SQLDB db) {
super("", db);
}
@Override
public void createTable() {
throw new IllegalStateException("Method not supposed to be used on this table.");
}
protected void renameTable(String from, String to) throws SQLException {
String sql = usingMySQL ?
"RENAME TABLE " + from + " TO " + to :
"ALTER TABLE " + from + " RENAME TO " + to;
execute(sql);
}
protected void dropTable(String name) throws SQLException {
String sql = "DROP TABLE " + name;
execute(sql);
}
}

View File

@ -0,0 +1,38 @@
package com.djrapitops.plan.system.database.databases.sql.tables.move;
import com.djrapitops.plan.api.exceptions.database.DBInitException;
import com.djrapitops.plan.system.database.databases.sql.SQLDB;
import java.sql.SQLException;
/**
* DB Schema v17 -> 18 table.
* <p>
* Required due to a bug where duplicate rows were inserted.
*
* @author Rsl1122
*/
public class Version18TransferTable extends TransferTable {
public Version18TransferTable(SQLDB db) throws SQLException {
super(db);
}
public void alterTableV18() throws SQLException, DBInitException {
String tempTableName = "plan_ips_temp";
String ipTableName = "plan_ips";
try {
renameTable(ipTableName, tempTableName);
} catch (SQLException e) {
// Temp table already exists
if (!e.getMessage().contains("plan_ips_temp")) {
throw e;
}
}
db.getGeoInfoTable().createTable();
execute("INSERT INTO plan_ips (" +
"user_id, ip, ip_hash, geolocation, last_used" +
") SELECT user_id, ip, ip_hash, geolocation, MAX(last_used) FROM plan_ips_temp GROUP BY ip_hash, user_id");
dropTable(tempTableName);
}
}

View File

@ -20,12 +20,12 @@ import java.util.Optional;
* *
* @author Rsl1122 * @author Rsl1122
*/ */
public class Version8TransferTable extends Table { public class Version8TransferTable extends TransferTable {
private final int serverID; private final int serverID;
public Version8TransferTable(SQLDB db) throws SQLException { public Version8TransferTable(SQLDB db) throws SQLException {
super("", db); super(db);
Optional<Integer> serverID = db.getServerTable().getServerID(ServerInfo.getServerUUID()); Optional<Integer> serverID = db.getServerTable().getServerID(ServerInfo.getServerUUID());
if (!serverID.isPresent()) { if (!serverID.isPresent()) {
throw new IllegalStateException("Server UUID was not registered, try rebooting the plugin."); throw new IllegalStateException("Server UUID was not registered, try rebooting the plugin.");
@ -33,23 +33,6 @@ public class Version8TransferTable extends Table {
this.serverID = serverID.get(); this.serverID = serverID.get();
} }
@Override
public void createTable() {
throw new IllegalStateException("Method not supposed to be used on this table.");
}
private void renameTable(String from, String to) throws SQLException {
String sql = usingMySQL ?
"RENAME TABLE " + from + " TO " + to :
"ALTER TABLE " + from + " RENAME TO " + to;
execute(sql);
}
private void dropTable(String name) throws SQLException {
String sql = "DROP TABLE " + name;
execute(sql);
}
public void alterTablesToV10() throws SQLException, DBInitException { public void alterTablesToV10() throws SQLException, DBInitException {
Benchmark.start("Schema copy from 8 to 10"); Benchmark.start("Schema copy from 8 to 10");
copyCommandUsage(); copyCommandUsage();

View File

@ -62,11 +62,12 @@ public class FileSystem implements SubSystem {
@Override @Override
public void enable() throws EnableException { public void enable() throws EnableException {
dataFolder.mkdirs(); Verify.isTrue((dataFolder.exists() && dataFolder.isDirectory()) || dataFolder.mkdirs(),
() -> new EnableException("Could not create data folder at " + dataFolder.getAbsolutePath()));
try { try {
if (configFile.exists()) { Verify.isTrue((configFile.exists() && configFile.isFile()) || configFile.createNewFile(),
configFile.createNewFile(); () -> new EnableException("Could not create config file at " + configFile.getAbsolutePath()));
}
RunnableFactory.createNew(new LogsFolderCleanTask(Log.getLogsFolder())) RunnableFactory.createNew(new LogsFolderCleanTask(Log.getLogsFolder()))
.runTaskLaterAsynchronously(TimeAmount.SECOND.ticks() * 30L); .runTaskLaterAsynchronously(TimeAmount.SECOND.ticks() * 30L);
} catch (IOException e) { } catch (IOException e) {

View File

@ -10,7 +10,6 @@ import com.djrapitops.plan.system.database.databases.Database;
import com.djrapitops.plan.system.info.request.*; import com.djrapitops.plan.system.info.request.*;
import com.djrapitops.plan.system.info.server.Server; import com.djrapitops.plan.system.info.server.Server;
import com.djrapitops.plan.system.webserver.WebServerSystem; import com.djrapitops.plan.system.webserver.WebServerSystem;
import com.djrapitops.plan.utilities.MiscUtils;
import com.djrapitops.plugin.api.TimeAmount; import com.djrapitops.plugin.api.TimeAmount;
import com.djrapitops.plugin.api.utility.log.Log; import com.djrapitops.plugin.api.utility.log.Log;
@ -32,10 +31,10 @@ public class BungeeConnectionSystem extends ConnectionSystem {
} }
private void refreshServerMap() { private void refreshServerMap() {
if (latestServerMapRefresh < MiscUtils.getTime() - TimeAmount.SECOND.ms() * 15L) { if (latestServerMapRefresh < System.currentTimeMillis() - TimeAmount.SECOND.ms() * 15L) {
try { try {
bukkitServers = Database.getActive().fetch().getBukkitServers(); bukkitServers = Database.getActive().fetch().getBukkitServers();
latestServerMapRefresh = MiscUtils.getTime(); latestServerMapRefresh = System.currentTimeMillis();
} catch (DBException e) { } catch (DBException e) {
Log.toLog(this.getClass(), e); Log.toLog(this.getClass(), e);
} }

View File

@ -6,7 +6,6 @@ package com.djrapitops.plan.system.info.connection;
import com.djrapitops.plan.system.info.request.InfoRequest; import com.djrapitops.plan.system.info.request.InfoRequest;
import com.djrapitops.plan.system.info.server.Server; import com.djrapitops.plan.system.info.server.Server;
import com.djrapitops.plan.utilities.MiscUtils;
import com.djrapitops.plugin.api.utility.log.Log; import com.djrapitops.plugin.api.utility.log.Log;
import java.util.HashMap; import java.util.HashMap;
@ -49,7 +48,7 @@ public class ConnectionLog {
private static void logConnection(String address, String infoRequestName, int responseCode) { private static void logConnection(String address, String infoRequestName, int responseCode) {
Map<String, Map<String, Entry>> log = getInstance().log; Map<String, Map<String, Entry>> log = getInstance().log;
Map<String, Entry> requestMap = log.getOrDefault(address, new HashMap<>()); Map<String, Entry> requestMap = log.getOrDefault(address, new HashMap<>());
requestMap.put(infoRequestName, new Entry(responseCode, MiscUtils.getTime())); requestMap.put(infoRequestName, new Entry(responseCode, System.currentTimeMillis()));
log.put(address, requestMap); log.put(address, requestMap);
} }
@ -87,7 +86,7 @@ public class ConnectionLog {
*/ */
@Override @Override
public int compareTo(Entry o) { public int compareTo(Entry o) {
return -Long.compare(this.timeSent, o.timeSent); return Long.compare(o.timeSent, this.timeSent);
} }
} }

View File

@ -169,7 +169,7 @@ public class ConnectionOut {
} }
private SSLSocketFactory getRelaxedSocketFactory() throws NoSuchAlgorithmException, KeyManagementException { private SSLSocketFactory getRelaxedSocketFactory() throws NoSuchAlgorithmException, KeyManagementException {
SSLContext sc = SSLContext.getInstance("SSL"); SSLContext sc = SSLContext.getInstance("TLSv1.2");
sc.init(null, trustAllCerts, new java.security.SecureRandom()); sc.init(null, trustAllCerts, new java.security.SecureRandom());
return sc.getSocketFactory(); return sc.getSocketFactory();
} }

View File

@ -4,7 +4,8 @@
*/ */
package com.djrapitops.plan.system.info.connection; package com.djrapitops.plan.system.info.connection;
import com.djrapitops.plan.api.exceptions.connection.*; import com.djrapitops.plan.api.exceptions.connection.NotFoundException;
import com.djrapitops.plan.api.exceptions.connection.WebException;
import com.djrapitops.plan.system.info.request.InfoRequest; import com.djrapitops.plan.system.info.request.InfoRequest;
import com.djrapitops.plan.system.webserver.Request; import com.djrapitops.plan.system.webserver.Request;
import com.djrapitops.plan.system.webserver.pages.PageHandler; import com.djrapitops.plan.system.webserver.pages.PageHandler;
@ -54,22 +55,6 @@ public class InfoRequestPageHandler extends PageHandler {
} }
private int getResponseCodeFor(WebException e) { private int getResponseCodeFor(WebException e) {
if (e instanceof BadRequestException) { return e.getResponseCode().getCode();
return 400;
} else if (e instanceof ForbiddenException) {
return 403;
} else if (e instanceof NotFoundException) {
return 404;
} else if (e instanceof UnauthorizedServerException) {
return 412;
} else if (e instanceof InternalErrorException) {
return 500;
} else if (e instanceof GatewayException) {
return 504;
} else if (e instanceof ConnectionFailException) {
return -1;
} else {
return 0;
}
} }
} }

View File

@ -16,7 +16,6 @@ import com.djrapitops.plan.system.settings.Settings;
import com.djrapitops.plan.system.settings.locale.Locale; import com.djrapitops.plan.system.settings.locale.Locale;
import com.djrapitops.plan.system.settings.locale.Msg; import com.djrapitops.plan.system.settings.locale.Msg;
import com.djrapitops.plan.system.webserver.WebServerSystem; import com.djrapitops.plan.system.webserver.WebServerSystem;
import com.djrapitops.plan.utilities.MiscUtils;
import com.djrapitops.plugin.api.TimeAmount; import com.djrapitops.plugin.api.TimeAmount;
import com.djrapitops.plugin.api.utility.log.Log; import com.djrapitops.plugin.api.utility.log.Log;
@ -40,13 +39,13 @@ public class ServerConnectionSystem extends ConnectionSystem {
private void refreshServerMap() { private void refreshServerMap() {
Processing.submitNonCritical(() -> { Processing.submitNonCritical(() -> {
if (latestServerMapRefresh < MiscUtils.getTime() - TimeAmount.SECOND.ms() * 15L) { if (latestServerMapRefresh < System.currentTimeMillis() - TimeAmount.SECOND.ms() * 15L) {
try { try {
Database database = Database.getActive(); Database database = Database.getActive();
Optional<Server> bungeeInformation = database.fetch().getBungeeInformation(); Optional<Server> bungeeInformation = database.fetch().getBungeeInformation();
bungeeInformation.ifPresent(server -> mainServer = server); bungeeInformation.ifPresent(server -> mainServer = server);
bukkitServers = database.fetch().getBukkitServers(); bukkitServers = database.fetch().getBukkitServers();
latestServerMapRefresh = MiscUtils.getTime(); latestServerMapRefresh = System.currentTimeMillis();
} catch (DBException e) { } catch (DBException e) {
Log.toLog(this.getClass(), e); Log.toLog(this.getClass(), e);
} }

View File

@ -5,6 +5,7 @@
package com.djrapitops.plan.system.info.connection; package com.djrapitops.plan.system.info.connection;
import com.djrapitops.plan.api.exceptions.connection.*; import com.djrapitops.plan.api.exceptions.connection.*;
import com.djrapitops.plan.utilities.java.ThrowingVoidFunction;
import com.djrapitops.plugin.api.utility.log.Log; import com.djrapitops.plugin.api.utility.log.Log;
import java.util.ArrayList; import java.util.ArrayList;
@ -19,9 +20,9 @@ import java.util.Map;
*/ */
public class WebExceptionLogger { public class WebExceptionLogger {
public static void logIfOccurs(Class c, ExceptionLoggingAction action) { public static void logIfOccurs(Class c, ThrowingVoidFunction<WebException> function) {
try { try {
action.performAction(); function.apply();
} catch (ConnectionFailException e) { } catch (ConnectionFailException e) {
if (shouldLog(e)) { if (shouldLog(e)) {
Log.warn(e.getMessage()); Log.warn(e.getMessage());
@ -62,10 +63,4 @@ public class WebExceptionLogger {
return null; return null;
} }
public interface ExceptionLoggingAction {
void performAction() throws WebException;
}
} }

View File

@ -6,6 +6,7 @@ import org.bukkit.Server;
import org.spongepowered.api.Game; import org.spongepowered.api.Game;
import java.net.InetSocketAddress; import java.net.InetSocketAddress;
import java.util.function.Supplier;
/** /**
* Class responsible for holding server variable values that do not change * Class responsible for holding server variable values that do not change
@ -21,10 +22,10 @@ public class ServerProperties {
private final int port; private final int port;
private final String version; private final String version;
private final String implVersion; private final String implVersion;
private final IPWrapper ip; private final Supplier<String> ip;
private final int maxPlayers; private final int maxPlayers;
private final OnlinePlayersWrapper onlinePlayers; private final Supplier<Integer> onlinePlayers;
public ServerProperties(Server server) { public ServerProperties(Server server) {
id = server.getServerId(); id = server.getServerId();
@ -76,7 +77,7 @@ public class ServerProperties {
* @return the ip. * @return the ip.
*/ */
public String getIp() { public String getIp() {
return ip.getIP(); return ip.get();
} }
public String getName() { public String getName() {
@ -104,14 +105,6 @@ public class ServerProperties {
} }
public int getOnlinePlayers() { public int getOnlinePlayers() {
return onlinePlayers.getOnlinePlayers(); return onlinePlayers.get();
}
private interface OnlinePlayersWrapper {
int getOnlinePlayers();
}
private interface IPWrapper {
String getIP();
} }
} }

View File

@ -1,7 +1,6 @@
package com.djrapitops.plan.system.listeners.bukkit; package com.djrapitops.plan.system.listeners.bukkit;
import com.djrapitops.plan.system.afk.AFKTracker; import com.djrapitops.plan.system.afk.AFKTracker;
import com.djrapitops.plan.utilities.MiscUtils;
import com.djrapitops.plugin.api.utility.log.Log; import com.djrapitops.plugin.api.utility.log.Log;
import org.bukkit.event.EventHandler; import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority; import org.bukkit.event.EventPriority;
@ -29,7 +28,7 @@ public class AFKListener implements Listener {
private void event(PlayerEvent event) { private void event(PlayerEvent event) {
try { try {
UUID uuid = event.getPlayer().getUniqueId(); UUID uuid = event.getPlayer().getUniqueId();
long time = MiscUtils.getTime(); long time = System.currentTimeMillis();
AFK_TRACKER.performedAction(uuid, time); AFK_TRACKER.performedAction(uuid, time);
} catch (Exception e) { } catch (Exception e) {

View File

@ -4,7 +4,6 @@ import com.djrapitops.plan.data.container.Session;
import com.djrapitops.plan.system.cache.SessionCache; import com.djrapitops.plan.system.cache.SessionCache;
import com.djrapitops.plan.system.processing.Processing; import com.djrapitops.plan.system.processing.Processing;
import com.djrapitops.plan.system.processing.processors.player.KillProcessor; import com.djrapitops.plan.system.processing.processors.player.KillProcessor;
import com.djrapitops.plan.utilities.MiscUtils;
import com.djrapitops.plugin.api.utility.log.Log; import com.djrapitops.plugin.api.utility.log.Log;
import com.djrapitops.plugin.utilities.Format; import com.djrapitops.plugin.utilities.Format;
import org.bukkit.Material; import org.bukkit.Material;
@ -32,7 +31,7 @@ public class DeathEventListener implements Listener {
@SuppressWarnings("deprecation") @SuppressWarnings("deprecation")
@EventHandler(priority = EventPriority.MONITOR) @EventHandler(priority = EventPriority.MONITOR)
public void onDeath(EntityDeathEvent event) { public void onDeath(EntityDeathEvent event) {
long time = MiscUtils.getTime(); long time = System.currentTimeMillis();
LivingEntity dead = event.getEntity(); LivingEntity dead = event.getEntity();
if (dead instanceof Player) { if (dead instanceof Player) {
@ -59,10 +58,10 @@ public class DeathEventListener implements Listener {
KillProcessor processor = null; KillProcessor processor = null;
if (killerEntity instanceof Player) { if (killerEntity instanceof Player) {
processor = handlePlayerKill(time, dead, (Player) killerEntity); processor = handlePlayerKill(time, dead, (Player) killerEntity);
} else if (killerEntity instanceof Wolf) { } else if (killerEntity instanceof Tameable) {
processor = handleWolfKill(time, dead, (Wolf) killerEntity); processor = handlePetKill(time, dead, (Tameable) killerEntity);
} else if (killerEntity instanceof Arrow) { } else if (killerEntity instanceof Projectile) {
processor = handleArrowKill(time, dead, (Arrow) killerEntity); processor = handleProjectileKill(time, dead, (Projectile) killerEntity);
} }
if (processor != null) { if (processor != null) {
Processing.submit(processor); Processing.submit(processor);
@ -84,28 +83,32 @@ public class DeathEventListener implements Listener {
return new KillProcessor(killer.getUniqueId(), time, dead, normalizeMaterialName(itemInHand)); return new KillProcessor(killer.getUniqueId(), time, dead, normalizeMaterialName(itemInHand));
} }
private KillProcessor handleWolfKill(long time, LivingEntity dead, Wolf wolf) { private KillProcessor handlePetKill(long time, LivingEntity dead, Tameable tameable) {
if (!wolf.isTamed()) { if (!tameable.isTamed()) {
return null; return null;
} }
AnimalTamer owner = wolf.getOwner(); AnimalTamer owner = tameable.getOwner();
if (!(owner instanceof Player)) { if (!(owner instanceof Player)) {
return null; return null;
} }
return new KillProcessor(owner.getUniqueId(), time, dead, "Wolf"); return new KillProcessor(owner.getUniqueId(), time, dead,
new Format(tameable.getType().name()).capitalize().toString()
);
} }
private KillProcessor handleArrowKill(long time, LivingEntity dead, Arrow arrow) { private KillProcessor handleProjectileKill(long time, LivingEntity dead, Projectile projectile) {
ProjectileSource source = arrow.getShooter(); ProjectileSource source = projectile.getShooter();
if (!(source instanceof Player)) { if (!(source instanceof Player)) {
return null; return null;
} }
Player player = (Player) source; Player player = (Player) source;
return new KillProcessor(player.getUniqueId(), time, dead, "Bow"); return new KillProcessor(player.getUniqueId(), time, dead,
new Format(projectile.getType().name()).capitalize().toString()
);
} }
/** /**

View File

@ -3,7 +3,6 @@ package com.djrapitops.plan.system.listeners.bukkit;
import com.djrapitops.plan.data.container.Session; import com.djrapitops.plan.data.container.Session;
import com.djrapitops.plan.system.cache.SessionCache; import com.djrapitops.plan.system.cache.SessionCache;
import com.djrapitops.plan.system.settings.WorldAliasSettings; import com.djrapitops.plan.system.settings.WorldAliasSettings;
import com.djrapitops.plan.utilities.MiscUtils;
import com.djrapitops.plugin.api.utility.log.Log; import com.djrapitops.plugin.api.utility.log.Log;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler; import org.bukkit.event.EventHandler;
@ -41,7 +40,7 @@ public class GamemodeChangeListener implements Listener {
private void actOnEvent(PlayerGameModeChangeEvent event) { private void actOnEvent(PlayerGameModeChangeEvent event) {
Player player = event.getPlayer(); Player player = event.getPlayer();
UUID uuid = player.getUniqueId(); UUID uuid = player.getUniqueId();
long time = MiscUtils.getTime(); long time = System.currentTimeMillis();
String gameMode = event.getNewGameMode().name(); String gameMode = event.getNewGameMode().name();
String worldName = player.getWorld().getName(); String worldName = player.getWorld().getName();

View File

@ -7,7 +7,6 @@ import com.djrapitops.plan.system.processing.processors.info.NetworkPageUpdatePr
import com.djrapitops.plan.system.processing.processors.info.PlayerPageUpdateProcessor; import com.djrapitops.plan.system.processing.processors.info.PlayerPageUpdateProcessor;
import com.djrapitops.plan.system.processing.processors.player.*; import com.djrapitops.plan.system.processing.processors.player.*;
import com.djrapitops.plan.system.tasks.TaskSystem; 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.systems.NotificationCenter;
import com.djrapitops.plugin.api.utility.log.Log; import com.djrapitops.plugin.api.utility.log.Log;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
@ -83,7 +82,7 @@ public class PlayerOnlineListener implements Listener {
NotificationCenter.checkNotifications(player); NotificationCenter.checkNotifications(player);
UUID uuid = player.getUniqueId(); UUID uuid = player.getUniqueId();
long time = MiscUtils.getTime(); long time = System.currentTimeMillis();
AFKListener.AFK_TRACKER.performedAction(uuid, time); AFKListener.AFK_TRACKER.performedAction(uuid, time);
@ -119,7 +118,7 @@ public class PlayerOnlineListener implements Listener {
} }
private void actOnQuitEvent(PlayerQuitEvent event) { private void actOnQuitEvent(PlayerQuitEvent event) {
long time = MiscUtils.getTime(); long time = System.currentTimeMillis();
Player player = event.getPlayer(); Player player = event.getPlayer();
UUID uuid = player.getUniqueId(); UUID uuid = player.getUniqueId();

View File

@ -3,7 +3,6 @@ package com.djrapitops.plan.system.listeners.bukkit;
import com.djrapitops.plan.data.container.Session; import com.djrapitops.plan.data.container.Session;
import com.djrapitops.plan.system.cache.SessionCache; import com.djrapitops.plan.system.cache.SessionCache;
import com.djrapitops.plan.system.settings.WorldAliasSettings; import com.djrapitops.plan.system.settings.WorldAliasSettings;
import com.djrapitops.plan.utilities.MiscUtils;
import com.djrapitops.plugin.api.utility.log.Log; import com.djrapitops.plugin.api.utility.log.Log;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler; import org.bukkit.event.EventHandler;
@ -26,7 +25,7 @@ public class WorldChangeListener implements Listener {
} }
private void actOnEvent(PlayerChangedWorldEvent event) { private void actOnEvent(PlayerChangedWorldEvent event) {
long time = MiscUtils.getTime(); long time = System.currentTimeMillis();
Player player = event.getPlayer(); Player player = event.getPlayer();
UUID uuid = player.getUniqueId(); UUID uuid = player.getUniqueId();

View File

@ -6,7 +6,7 @@ package com.djrapitops.plan.system.listeners.bungee;
import com.djrapitops.plan.system.processing.Processing; import com.djrapitops.plan.system.processing.Processing;
import com.djrapitops.plan.system.processing.processors.player.BungeePlayerRegisterProcessor; import com.djrapitops.plan.system.processing.processors.player.BungeePlayerRegisterProcessor;
import com.djrapitops.plan.utilities.MiscUtils; import com.djrapitops.plan.system.processing.processors.player.IPUpdateProcessor;
import com.djrapitops.plugin.api.utility.log.Log; import com.djrapitops.plugin.api.utility.log.Log;
import net.md_5.bungee.api.connection.ProxiedPlayer; import net.md_5.bungee.api.connection.ProxiedPlayer;
import net.md_5.bungee.api.event.PostLoginEvent; import net.md_5.bungee.api.event.PostLoginEvent;
@ -28,9 +28,12 @@ public class PlayerOnlineListener implements Listener {
ProxiedPlayer player = event.getPlayer(); ProxiedPlayer player = event.getPlayer();
UUID uuid = player.getUniqueId(); UUID uuid = player.getUniqueId();
String name = player.getName(); String name = player.getName();
long now = MiscUtils.getTime(); String ip = player.getAddress().getAddress().getHostAddress();
long now = System.currentTimeMillis();
Processing.submit(new BungeePlayerRegisterProcessor(uuid, name, now)); Processing.submit(new BungeePlayerRegisterProcessor(uuid, name, now,
new IPUpdateProcessor(uuid, ip, now))
);
} catch (Exception e) { } catch (Exception e) {
Log.toLog(this.getClass(), e); Log.toLog(this.getClass(), e);
} }

View File

@ -1,7 +1,6 @@
package com.djrapitops.plan.system.listeners.sponge; package com.djrapitops.plan.system.listeners.sponge;
import com.djrapitops.plan.system.afk.AFKTracker; import com.djrapitops.plan.system.afk.AFKTracker;
import com.djrapitops.plan.utilities.MiscUtils;
import com.djrapitops.plugin.api.utility.log.Log; import com.djrapitops.plugin.api.utility.log.Log;
import org.spongepowered.api.entity.living.player.Player; import org.spongepowered.api.entity.living.player.Player;
import org.spongepowered.api.event.Listener; import org.spongepowered.api.event.Listener;
@ -31,7 +30,7 @@ public class SpongeAFKListener {
private void event(TargetPlayerEvent event) { private void event(TargetPlayerEvent event) {
try { try {
UUID uuid = event.getTargetEntity().getUniqueId(); UUID uuid = event.getTargetEntity().getUniqueId();
long time = MiscUtils.getTime(); long time = System.currentTimeMillis();
AFK_TRACKER.performedAction(uuid, time); AFK_TRACKER.performedAction(uuid, time);
} catch (Exception e) { } catch (Exception e) {
@ -42,21 +41,21 @@ public class SpongeAFKListener {
@Listener(order = Order.POST) @Listener(order = Order.POST)
public void onMove(MoveEntityEvent event, @First Player player) { public void onMove(MoveEntityEvent event, @First Player player) {
UUID uuid = player.getUniqueId(); UUID uuid = player.getUniqueId();
long time = MiscUtils.getTime(); long time = System.currentTimeMillis();
AFK_TRACKER.performedAction(uuid, time); AFK_TRACKER.performedAction(uuid, time);
} }
@Listener(order = Order.POST) @Listener(order = Order.POST)
public void onPlayerChat(MessageChannelEvent.Chat event, @First Player player) { public void onPlayerChat(MessageChannelEvent.Chat event, @First Player player) {
UUID uuid = player.getUniqueId(); UUID uuid = player.getUniqueId();
long time = MiscUtils.getTime(); long time = System.currentTimeMillis();
AFK_TRACKER.performedAction(uuid, time); AFK_TRACKER.performedAction(uuid, time);
} }
@Listener(order = Order.POST) @Listener(order = Order.POST)
public void onPlayerCommand(SendCommandEvent event, @First Player player) { public void onPlayerCommand(SendCommandEvent event, @First Player player) {
UUID uuid = player.getUniqueId(); UUID uuid = player.getUniqueId();
long time = MiscUtils.getTime(); long time = System.currentTimeMillis();
AFK_TRACKER.performedAction(uuid, time); AFK_TRACKER.performedAction(uuid, time);
} }

View File

@ -4,7 +4,6 @@ import com.djrapitops.plan.data.container.Session;
import com.djrapitops.plan.system.cache.SessionCache; import com.djrapitops.plan.system.cache.SessionCache;
import com.djrapitops.plan.system.processing.Processing; import com.djrapitops.plan.system.processing.Processing;
import com.djrapitops.plan.system.processing.processors.player.SpongeKillProcessor; 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.api.utility.log.Log;
import com.djrapitops.plugin.utilities.Format; import com.djrapitops.plugin.utilities.Format;
import org.spongepowered.api.data.key.Keys; import org.spongepowered.api.data.key.Keys;
@ -13,7 +12,7 @@ import org.spongepowered.api.entity.Entity;
import org.spongepowered.api.entity.living.Living; import org.spongepowered.api.entity.living.Living;
import org.spongepowered.api.entity.living.animal.Wolf; import org.spongepowered.api.entity.living.animal.Wolf;
import org.spongepowered.api.entity.living.player.Player; import org.spongepowered.api.entity.living.player.Player;
import org.spongepowered.api.entity.projectile.arrow.Arrow; import org.spongepowered.api.entity.projectile.Projectile;
import org.spongepowered.api.entity.projectile.source.ProjectileSource; import org.spongepowered.api.entity.projectile.source.ProjectileSource;
import org.spongepowered.api.event.Listener; import org.spongepowered.api.event.Listener;
import org.spongepowered.api.event.cause.entity.damage.source.EntityDamageSource; import org.spongepowered.api.event.cause.entity.damage.source.EntityDamageSource;
@ -34,7 +33,7 @@ public class SpongeDeathListener {
@Listener @Listener
public void onEntityDeath(DestructEntityEvent.Death event) { public void onEntityDeath(DestructEntityEvent.Death event) {
long time = MiscUtils.getTime(); long time = System.currentTimeMillis();
Living dead = event.getTargetEntity(); Living dead = event.getTargetEntity();
if (dead instanceof Player) { if (dead instanceof Player) {
@ -60,8 +59,8 @@ public class SpongeDeathListener {
processor = handlePlayerKill(time, dead, (Player) killerEntity); processor = handlePlayerKill(time, dead, (Player) killerEntity);
} else if (killerEntity instanceof Wolf) { } else if (killerEntity instanceof Wolf) {
processor = handleWolfKill(time, dead, (Wolf) killerEntity); processor = handleWolfKill(time, dead, (Wolf) killerEntity);
} else if (killerEntity instanceof Arrow) { } else if (killerEntity instanceof Projectile) {
processor = handleArrowKill(time, dead, (Arrow) killerEntity); processor = handleProjectileKill(time, dead, (Projectile) killerEntity);
} }
if (processor != null) { if (processor != null) {
Processing.submit(processor); Processing.submit(processor);
@ -96,15 +95,17 @@ public class SpongeDeathListener {
).orElse(null); ).orElse(null);
} }
private SpongeKillProcessor handleArrowKill(long time, Living dead, Arrow arrow) { private SpongeKillProcessor handleProjectileKill(long time, Living dead, Projectile projectile) {
ProjectileSource source = arrow.getShooter(); ProjectileSource source = projectile.getShooter();
if (!(source instanceof Player)) { if (!(source instanceof Player)) {
return null; return null;
} }
Player player = (Player) source; Player player = (Player) source;
return new SpongeKillProcessor(player.getUniqueId(), time, getUUID(dead), "Bow"); return new SpongeKillProcessor(player.getUniqueId(), time, getUUID(dead),
new Format(projectile.getType().getName()).capitalize().toString()
);
} }
/** /**

View File

@ -3,7 +3,6 @@ package com.djrapitops.plan.system.listeners.sponge;
import com.djrapitops.plan.data.container.Session; import com.djrapitops.plan.data.container.Session;
import com.djrapitops.plan.system.cache.SessionCache; import com.djrapitops.plan.system.cache.SessionCache;
import com.djrapitops.plan.system.settings.WorldAliasSettings; import com.djrapitops.plan.system.settings.WorldAliasSettings;
import com.djrapitops.plan.utilities.MiscUtils;
import com.djrapitops.plugin.api.utility.log.Log; import com.djrapitops.plugin.api.utility.log.Log;
import org.spongepowered.api.entity.living.player.Player; import org.spongepowered.api.entity.living.player.Player;
import org.spongepowered.api.event.Listener; import org.spongepowered.api.event.Listener;
@ -36,7 +35,7 @@ public class SpongeGMChangeListener {
private void actOnGMChangeEvent(ChangeGameModeEvent.TargetPlayer event) { private void actOnGMChangeEvent(ChangeGameModeEvent.TargetPlayer event) {
Player player = event.getTargetEntity(); Player player = event.getTargetEntity();
UUID uuid = player.getUniqueId(); UUID uuid = player.getUniqueId();
long time = MiscUtils.getTime(); long time = System.currentTimeMillis();
String gameMode = event.getGameMode().getName().toUpperCase(); String gameMode = event.getGameMode().getName().toUpperCase();
String worldName = player.getWorld().getName(); String worldName = player.getWorld().getName();

View File

@ -7,7 +7,6 @@ import com.djrapitops.plan.system.processing.processors.info.NetworkPageUpdatePr
import com.djrapitops.plan.system.processing.processors.info.PlayerPageUpdateProcessor; import com.djrapitops.plan.system.processing.processors.info.PlayerPageUpdateProcessor;
import com.djrapitops.plan.system.processing.processors.player.*; import com.djrapitops.plan.system.processing.processors.player.*;
import com.djrapitops.plan.system.tasks.TaskSystem; 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.systems.NotificationCenter;
import com.djrapitops.plugin.api.utility.log.Log; import com.djrapitops.plugin.api.utility.log.Log;
import org.spongepowered.api.Sponge; import org.spongepowered.api.Sponge;
@ -82,7 +81,7 @@ public class SpongePlayerListener {
NotificationCenter.checkNotifications(player); NotificationCenter.checkNotifications(player);
UUID uuid = player.getUniqueId(); UUID uuid = player.getUniqueId();
long time = MiscUtils.getTime(); long time = System.currentTimeMillis();
SpongeAFKListener.AFK_TRACKER.performedAction(uuid, time); SpongeAFKListener.AFK_TRACKER.performedAction(uuid, time);
@ -122,7 +121,7 @@ public class SpongePlayerListener {
} }
private void actOnQuitEvent(ClientConnectionEvent.Disconnect event) { private void actOnQuitEvent(ClientConnectionEvent.Disconnect event) {
long time = MiscUtils.getTime(); long time = System.currentTimeMillis();
Player player = event.getTargetEntity(); Player player = event.getTargetEntity();
UUID uuid = player.getUniqueId(); UUID uuid = player.getUniqueId();

View File

@ -3,7 +3,6 @@ package com.djrapitops.plan.system.listeners.sponge;
import com.djrapitops.plan.data.container.Session; import com.djrapitops.plan.data.container.Session;
import com.djrapitops.plan.system.cache.SessionCache; import com.djrapitops.plan.system.cache.SessionCache;
import com.djrapitops.plan.system.settings.WorldAliasSettings; import com.djrapitops.plan.system.settings.WorldAliasSettings;
import com.djrapitops.plan.utilities.MiscUtils;
import com.djrapitops.plugin.api.utility.log.Log; import com.djrapitops.plugin.api.utility.log.Log;
import org.spongepowered.api.data.key.Keys; import org.spongepowered.api.data.key.Keys;
import org.spongepowered.api.entity.living.player.Player; import org.spongepowered.api.entity.living.player.Player;
@ -37,7 +36,7 @@ public class SpongeWorldChangeListener {
} }
private void actOnEvent(MoveEntityEvent.Teleport event, Player player) { private void actOnEvent(MoveEntityEvent.Teleport event, Player player) {
long time = MiscUtils.getTime(); long time = System.currentTimeMillis();
UUID uuid = player.getUniqueId(); UUID uuid = player.getUniqueId();

View File

@ -9,10 +9,7 @@ import com.djrapitops.plugin.api.utility.log.Log;
import com.djrapitops.plugin.utilities.Verify; import com.djrapitops.plugin.utilities.Verify;
import java.util.List; import java.util.List;
import java.util.concurrent.Callable; import java.util.concurrent.*;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
public class Processing implements SubSystem { public class Processing implements SubSystem {
@ -22,6 +19,9 @@ public class Processing implements SubSystem {
public Processing() { public Processing() {
nonCriticalExecutor = Executors.newFixedThreadPool(6); nonCriticalExecutor = Executors.newFixedThreadPool(6);
criticalExecutor = Executors.newFixedThreadPool(2); criticalExecutor = Executors.newFixedThreadPool(2);
saveInstance(nonCriticalExecutor);
saveInstance(criticalExecutor);
saveInstance(this);
} }
public static void submit(Runnable runnable) { public static void submit(Runnable runnable) {
@ -38,27 +38,27 @@ public class Processing implements SubSystem {
public static void submitNonCritical(Runnable runnable) { public static void submitNonCritical(Runnable runnable) {
saveInstance(runnable); saveInstance(runnable);
getInstance().nonCriticalExecutor.submit(runnable); CompletableFuture.supplyAsync(() -> runnable, getInstance().nonCriticalExecutor)
.thenAccept(Runnable::run)
.handle(Processing::exceptionHandler);
} }
public static void submitCritical(Runnable runnable) { public static void submitCritical(Runnable runnable) {
saveInstance(runnable); saveInstance(runnable);
getInstance().criticalExecutor.submit(runnable); CompletableFuture.supplyAsync(() -> runnable, getInstance().criticalExecutor)
.thenAccept(Runnable::run)
.handle(Processing::exceptionHandler);
} }
public static void submitNonCritical(Runnable... runnables) { public static void submitNonCritical(Runnable... runnables) {
ExecutorService nonCriticalExecutor = getInstance().nonCriticalExecutor;
for (Runnable runnable : runnables) { for (Runnable runnable : runnables) {
saveInstance(runnable); submitNonCritical(runnable);
nonCriticalExecutor.submit(runnable);
} }
} }
public static void submitCritical(Runnable... runnables) { public static void submitCritical(Runnable... runnables) {
ExecutorService criticalExecutor = getInstance().criticalExecutor;
for (Runnable runnable : runnables) { for (Runnable runnable : runnables) {
saveInstance(runnable); submitCritical(runnable);
criticalExecutor.submit(runnable);
} }
} }
@ -72,12 +72,35 @@ public class Processing implements SubSystem {
public static <T> Future<T> submitNonCritical(Callable<T> task) { public static <T> Future<T> submitNonCritical(Callable<T> task) {
saveInstance(task); saveInstance(task);
return getInstance().nonCriticalExecutor.submit(task); return CompletableFuture.supplyAsync(() -> task, getInstance().nonCriticalExecutor)
.thenApply(tCallable -> {
try {
return tCallable.call();
} catch (Exception e) {
throw new IllegalStateException(e);
}
})
.handle(Processing::exceptionHandler);
}
private static <T> T exceptionHandler(T t, Throwable throwable) {
if (throwable != null) {
Log.toLog(Processing.class, throwable.getCause());
}
return t;
} }
public static <T> Future<T> submitCritical(Callable<T> task) { public static <T> Future<T> submitCritical(Callable<T> task) {
saveInstance(task); saveInstance(task);
return getInstance().criticalExecutor.submit(task); return CompletableFuture.supplyAsync(() -> task, getInstance().criticalExecutor)
.thenApply(tCallable -> {
try {
return tCallable.call();
} catch (Exception e) {
throw new IllegalStateException(e);
}
})
.handle(Processing::exceptionHandler);
} }
public static Processing getInstance() { public static Processing getInstance() {

View File

@ -17,7 +17,6 @@ import com.djrapitops.plan.system.info.server.ServerInfo;
import com.djrapitops.plan.system.processing.importing.ServerImportData; import com.djrapitops.plan.system.processing.importing.ServerImportData;
import com.djrapitops.plan.system.processing.importing.UserImportData; import com.djrapitops.plan.system.processing.importing.UserImportData;
import com.djrapitops.plan.system.processing.importing.UserImportRefiner; import com.djrapitops.plan.system.processing.importing.UserImportRefiner;
import com.djrapitops.plan.utilities.MiscUtils;
import com.djrapitops.plugin.api.Benchmark; import com.djrapitops.plugin.api.Benchmark;
import com.djrapitops.plugin.api.utility.log.Log; import com.djrapitops.plugin.api.utility.log.Log;
import com.djrapitops.plugin.utilities.Verify; import com.djrapitops.plugin.utilities.Verify;
@ -225,7 +224,7 @@ public abstract class Importer {
} }
private List<GeoInfo> convertGeoInfo(UserImportData userImportData) { private List<GeoInfo> convertGeoInfo(UserImportData userImportData) {
long date = MiscUtils.getTime(); long date = System.currentTimeMillis();
return userImportData.getIps().parallelStream() return userImportData.getIps().parallelStream()
.map(ip -> { .map(ip -> {

View File

@ -7,6 +7,7 @@ package com.djrapitops.plan.system.processing.processors.player;
import com.djrapitops.plan.api.exceptions.database.DBException; import com.djrapitops.plan.api.exceptions.database.DBException;
import com.djrapitops.plan.system.database.databases.Database; import com.djrapitops.plan.system.database.databases.Database;
import com.djrapitops.plan.system.processing.CriticalRunnable; import com.djrapitops.plan.system.processing.CriticalRunnable;
import com.djrapitops.plan.system.processing.Processing;
import com.djrapitops.plugin.api.utility.log.Log; import com.djrapitops.plugin.api.utility.log.Log;
import java.util.UUID; import java.util.UUID;
@ -21,11 +22,13 @@ public class BungeePlayerRegisterProcessor implements CriticalRunnable {
private final UUID uuid; private final UUID uuid;
private final String name; private final String name;
private final long registered; private final long registered;
private final Runnable[] afterProcess;
public BungeePlayerRegisterProcessor(UUID uuid, String name, long registered) { public BungeePlayerRegisterProcessor(UUID uuid, String name, long registered, Runnable... afterProcess) {
this.uuid = uuid; this.uuid = uuid;
this.name = name; this.name = name;
this.registered = registered; this.registered = registered;
this.afterProcess = afterProcess;
} }
@Override @Override
@ -38,6 +41,11 @@ public class BungeePlayerRegisterProcessor implements CriticalRunnable {
database.save().registerNewUser(uuid, registered, name); database.save().registerNewUser(uuid, registered, name);
} catch (DBException e) { } catch (DBException e) {
Log.toLog(this.getClass(), e); Log.toLog(this.getClass(), e);
} finally {
for (Runnable process : afterProcess) {
Processing.submit(process);
}
} }
} }
} }

View File

@ -38,7 +38,8 @@ public class IPUpdateProcessor implements CriticalRunnable {
if (Settings.DATA_GEOLOCATIONS.isTrue()) { if (Settings.DATA_GEOLOCATIONS.isTrue()) {
String country = GeolocationCache.getCountry(ip); String country = GeolocationCache.getCountry(ip);
try { try {
Database.getActive().save().geoInfo(uuid, new GeoInfo(ip, country, time)); GeoInfo geoInfo = new GeoInfo(ip, country, time);
Database.getActive().save().geoInfo(uuid, geoInfo);
} catch (DBException | UnsupportedEncodingException | NoSuchAlgorithmException e) { } catch (DBException | UnsupportedEncodingException | NoSuchAlgorithmException e) {
Log.toLog(this.getClass(), e); Log.toLog(this.getClass(), e);
} }

View File

@ -12,7 +12,6 @@ import com.djrapitops.plan.system.database.databases.Database;
import com.djrapitops.plan.system.info.server.ServerInfo; import com.djrapitops.plan.system.info.server.ServerInfo;
import com.djrapitops.plan.system.processing.CriticalRunnable; import com.djrapitops.plan.system.processing.CriticalRunnable;
import com.djrapitops.plan.system.processing.Processing; import com.djrapitops.plan.system.processing.Processing;
import com.djrapitops.plan.utilities.MiscUtils;
import com.djrapitops.plan.utilities.html.HtmlUtils; import com.djrapitops.plan.utilities.html.HtmlUtils;
import com.djrapitops.plugin.api.utility.log.Log; import com.djrapitops.plugin.api.utility.log.Log;
@ -67,7 +66,7 @@ public class NameProcessor implements CriticalRunnable {
return; return;
} }
long time = MiscUtils.getTime(); long time = System.currentTimeMillis();
Processing.submitCritical(() -> { Processing.submitCritical(() -> {
String info = HtmlUtils.removeXSS(displayName); String info = HtmlUtils.removeXSS(displayName);

View File

@ -9,22 +9,22 @@ package com.djrapitops.plan.system.settings;
public enum Permissions { public enum Permissions {
HELP("plan.?"), HELP("plan.?"),
//
INSPECT("plan.inspect"), INSPECT("plan.inspect"),
QUICK_INSPECT("plan.qinspect"), QUICK_INSPECT("plan.qinspect"),
INSPECT_OTHER("plan.inspect.other"), INSPECT_OTHER("plan.inspect.other"),
QUICK_INSPECT_OTHER("plan.qinspect.other"), QUICK_INSPECT_OTHER("plan.qinspect.other"),
//
ANALYZE("plan.analyze"), ANALYZE("plan.analyze"),
QUICK_ANALYZE("plan.qanalyze"), QUICK_ANALYZE("plan.qanalyze"),
//
SEARCH("plan.search"), SEARCH("plan.search"),
//
RELOAD("plan.reload"), RELOAD("plan.reload"),
INFO("plan.info"), INFO("plan.info"),
MANAGE("plan.manage"), MANAGE("plan.manage"),
MANAGE_WEB("plan.webmanage"), MANAGE_WEB("plan.webmanage"),
//
IGNORE_COMMANDUSE("plan.ignore.commanduse"); IGNORE_COMMANDUSE("plan.ignore.commanduse");
private final String permission; private final String permission;

View File

@ -71,9 +71,9 @@ public enum Settings {
WEBSERVER_CERTIFICATE_ALIAS("WebServer.Security.SSL-Certificate.Alias"), WEBSERVER_CERTIFICATE_ALIAS("WebServer.Security.SSL-Certificate.Alias"),
EXTERNAL_WEBSERVER_LINK("WebServer.ExternalWebServerAddress"), EXTERNAL_WEBSERVER_LINK("WebServer.ExternalWebServerAddress"),
PLUGIN_BUYCRAFT_SECRET("Plugins.BuyCraft.Secret"), PLUGIN_BUYCRAFT_SECRET("Plugins.BuyCraft.Secret"),
//
SERVER_NAME("Server.ServerName"), SERVER_NAME("Server.ServerName"),
//
FORMAT_DATE_FULL("Customization.Formatting.Dates.Full"), FORMAT_DATE_FULL("Customization.Formatting.Dates.Full"),
FORMAT_DATE_NO_SECONDS("Customization.Formatting.Dates.NoSeconds"), FORMAT_DATE_NO_SECONDS("Customization.Formatting.Dates.NoSeconds"),
FORMAT_DATE_CLOCK("Customization.Formatting.Dates.JustClock"), FORMAT_DATE_CLOCK("Customization.Formatting.Dates.JustClock"),
@ -89,11 +89,11 @@ public enum Settings {
FORMAT_SECONDS("Customization.Formatting.TimeAmount.Seconds"), FORMAT_SECONDS("Customization.Formatting.TimeAmount.Seconds"),
FORMAT_ZERO_SECONDS("Customization.Formatting.TimeAmount.Zero"), FORMAT_ZERO_SECONDS("Customization.Formatting.TimeAmount.Zero"),
FORMAT_DECIMALS("Customization.Formatting.DecimalPoints"), FORMAT_DECIMALS("Customization.Formatting.DecimalPoints"),
//
COLOR_MAIN("Commands.Colors.Main"), COLOR_MAIN("Commands.Colors.Main"),
COLOR_SEC("Commands.Colors.Secondary"), COLOR_SEC("Commands.Colors.Secondary"),
COLOR_TER("Commands.Colors.Highlight"), COLOR_TER("Commands.Colors.Highlight"),
//
THEME_BASE("Theme.Base"), THEME_BASE("Theme.Base"),
THEME_GRAPH_TPS_THRESHOLD_HIGH("Theme.Graphs.TPS.High-Threshold"), THEME_GRAPH_TPS_THRESHOLD_HIGH("Theme.Graphs.TPS.High-Threshold"),
THEME_GRAPH_TPS_THRESHOLD_MED("Theme.Graphs.TPS.Medium-Threshold"), THEME_GRAPH_TPS_THRESHOLD_MED("Theme.Graphs.TPS.Medium-Threshold"),
@ -103,7 +103,7 @@ public enum Settings {
HIDE_TOWNS("Plugins.Towny.HideTowns"), HIDE_TOWNS("Plugins.Towny.HideTowns"),
// Config section // Config section
WORLD_ALIASES("Customization.WorldAliases"), WORLD_ALIASES("Customization.WorldAliases"),
//
// Bungee // Bungee
BUNGEE_IP("Server.IP"), BUNGEE_IP("Server.IP"),
BUNGEE_NETWORK_NAME("Network.Name"); BUNGEE_NETWORK_NAME("Network.Name");

View File

@ -14,23 +14,23 @@ public enum Msg {
ENABLE_WEBSERVER_INFO("Enable - WebServer Info"), ENABLE_WEBSERVER_INFO("Enable - WebServer Info"),
ENABLE_BOOT_ANALYSIS_INFO("Enable - Boot Analysis 30s Notify"), ENABLE_BOOT_ANALYSIS_INFO("Enable - Boot Analysis 30s Notify"),
ENABLE_BOOT_ANALYSIS_RUN_INFO("Enable - Boot Analysis Notify"), ENABLE_BOOT_ANALYSIS_RUN_INFO("Enable - Boot Analysis Notify"),
//
ENABLE_NOTIFY_EMPTY_IP("Enable Notify-Empty IP"), ENABLE_NOTIFY_EMPTY_IP("Enable Notify-Empty IP"),
ENABLE_NOTIFY_NO_DATA_VIEW("Enable Notify - No data view"), ENABLE_NOTIFY_NO_DATA_VIEW("Enable Notify - No data view"),
ENABLE_NOTIFY_DISABLED_CHATLISTENER("Enable Notify - ChatListener"), ENABLE_NOTIFY_DISABLED_CHATLISTENER("Enable Notify - ChatListener"),
ENABLE_NOTIFY_DISABLED_COMMANDLISTENER("Enable Notify - Disabled CommandListener"), ENABLE_NOTIFY_DISABLED_COMMANDLISTENER("Enable Notify - Disabled CommandListener"),
ENABLE_NOTIFY_DISABLED_DEATHLISTENER("Enable Notify - Disabled DeathListener"), ENABLE_NOTIFY_DISABLED_DEATHLISTENER("Enable Notify - Disabled DeathListener"),
//
ENABLE_FAIL_WRONG_DB("Enable FAIL - Wrong Db Type"), ENABLE_FAIL_WRONG_DB("Enable FAIL - Wrong Db Type"),
ENABLE_FAIL_DB("Enable FAIL-Db"), ENABLE_FAIL_DB("Enable FAIL-Db"),
ENABLE_DB_FAIL_DISABLE_INFO("Enable Db FAIL - Disable Info"), ENABLE_DB_FAIL_DISABLE_INFO("Enable Db FAIL - Disable Info"),
//
RUN_WARN_QUEUE_SIZE("WARN - Too Small Queue Size"), RUN_WARN_QUEUE_SIZE("WARN - Too Small Queue Size"),
//
DISABLED("Disable"), DISABLED("Disable"),
DISABLE_CACHE_SAVE("Disable - Save"), DISABLE_CACHE_SAVE("Disable - Save"),
DISABLE_WEBSERVER("Disable - WebServer"), DISABLE_WEBSERVER("Disable - WebServer"),
//
ANALYSIS_START("Analysis - Start"), ANALYSIS_START("Analysis - Start"),
ANALYSIS_FETCH_UUID("Analysis - Fetch Phase Start"), ANALYSIS_FETCH_UUID("Analysis - Fetch Phase Start"),
ANALYSIS_FETCH("Analysis - Fetch Phase"), ANALYSIS_FETCH("Analysis - Fetch Phase"),
@ -40,7 +40,7 @@ public enum Msg {
ANALYSIS_FAIL_NO_PLAYERS("Analysis FAIL - No Players"), ANALYSIS_FAIL_NO_PLAYERS("Analysis FAIL - No Players"),
ANALYSIS_FAIL_NO_DATA("Analysis FAIL - No Data"), ANALYSIS_FAIL_NO_DATA("Analysis FAIL - No Data"),
ANALYSIS_FAIL_FETCH_EXCEPTION("Analysis FAIL - Fetch Exception"), ANALYSIS_FAIL_FETCH_EXCEPTION("Analysis FAIL - Fetch Exception"),
//
MANAGE_INFO_CONFIG_REMINDER("Manage - Remind Config Change"), MANAGE_INFO_CONFIG_REMINDER("Manage - Remind Config Change"),
MANAGE_INFO_START("Manage - Start"), MANAGE_INFO_START("Manage - Start"),
MANAGE_INFO_IMPORT("Manage - Import"), MANAGE_INFO_IMPORT("Manage - Import"),
@ -50,7 +50,7 @@ public enum Msg {
MANAGE_INFO_MOVE_SUCCESS("Manage - Move Success"), MANAGE_INFO_MOVE_SUCCESS("Manage - Move Success"),
MANAGE_INFO_CLEAR_SUCCESS("Manage - Clear Success"), MANAGE_INFO_CLEAR_SUCCESS("Manage - Clear Success"),
MANAGE_INFO_REMOVE_SUCCESS("Manage - Remove Success"), MANAGE_INFO_REMOVE_SUCCESS("Manage - Remove Success"),
//
MANAGE_FAIL_INCORRECT_PLUGIN("Manage FAIL - Incorrect Plugin"), MANAGE_FAIL_INCORRECT_PLUGIN("Manage FAIL - Incorrect Plugin"),
MANAGE_FAIL_PLUGIN_NOT_ENABLED("Manage FAIL - Unenabled Plugin"), MANAGE_FAIL_PLUGIN_NOT_ENABLED("Manage FAIL - Unenabled Plugin"),
MANAGE_FAIL_SAME_DB("Manage FAIL - Same DB"), MANAGE_FAIL_SAME_DB("Manage FAIL - Same DB"),
@ -58,13 +58,13 @@ public enum Msg {
MANAGE_FAIL_FAULTY_DB("Manage FAIL - Faulty DB Connection"), MANAGE_FAIL_FAULTY_DB("Manage FAIL - Faulty DB Connection"),
MANAGE_FAIL_NO_PLAYERS("Manage FAIL - Empty DB"), MANAGE_FAIL_NO_PLAYERS("Manage FAIL - Empty DB"),
MANAGE_FAIL_FILE_NOT_FOUND("Manage FAIL - Backup File Not Found"), MANAGE_FAIL_FILE_NOT_FOUND("Manage FAIL - Backup File Not Found"),
//
MANAGE_FAIL_CONFIRM("Manage FAIL - Confirm Action"), MANAGE_FAIL_CONFIRM("Manage FAIL - Confirm Action"),
MANAGE_NOTIFY_REWRITE("Manage NOTIFY - Rewrite"), MANAGE_NOTIFY_REWRITE("Manage NOTIFY - Rewrite"),
MANAGE_NOTIFY_OVERWRITE("Manage NOTIFY - Overwrite"), MANAGE_NOTIFY_OVERWRITE("Manage NOTIFY - Overwrite"),
MANAGE_NOTIFY_PARTIAL_OVERWRITE("Manage NOTIFY - Partial Overwrite"), MANAGE_NOTIFY_PARTIAL_OVERWRITE("Manage NOTIFY - Partial Overwrite"),
MANAGE_NOTIFY_REMOVE("Manage NOTIFY - Remove"), MANAGE_NOTIFY_REMOVE("Manage NOTIFY - Remove"),
//
CMD_FAIL_REQ_ARGS("Cmd FAIL - Requires Arguments"), CMD_FAIL_REQ_ARGS("Cmd FAIL - Requires Arguments"),
CMD_FAIL_REQ_ONE_ARG("Cmd FAIL - Require only one Argument"), CMD_FAIL_REQ_ONE_ARG("Cmd FAIL - Require only one Argument"),
CMD_FAIL_NO_PERMISSION("Cmd FAIL - No Permission"), CMD_FAIL_NO_PERMISSION("Cmd FAIL - No Permission"),
@ -73,7 +73,7 @@ public enum Msg {
CMD_FAIL_USERNAME_NOT_KNOWN("Cmd FAIL - Unknown Username"), CMD_FAIL_USERNAME_NOT_KNOWN("Cmd FAIL - Unknown Username"),
CMD_FAIL_TIMEOUT("Cmd FAIL - Timeout"), CMD_FAIL_TIMEOUT("Cmd FAIL - Timeout"),
CMD_FAIL_NO_DATA_VIEW("Cmd FAIL - No Data View"), CMD_FAIL_NO_DATA_VIEW("Cmd FAIL - No Data View"),
//
CMD_INFO_ANALYSIS_TEMP_DISABLE("Analysis NOTIFY - Temporary Disable"), CMD_INFO_ANALYSIS_TEMP_DISABLE("Analysis NOTIFY - Temporary Disable"),
CMD_INFO_CLICK_ME("Cmd - Click Me"), CMD_INFO_CLICK_ME("Cmd - Click Me"),
CMD_INFO_LINK("Cmd - Link"), CMD_INFO_LINK("Cmd - Link"),
@ -82,7 +82,7 @@ public enum Msg {
CMD_INFO_RELOAD_COMPLETE("Cmd - Reload Success"), CMD_INFO_RELOAD_COMPLETE("Cmd - Reload Success"),
CMD_INFO_FETCH_DATA("Cmd - Fetch Data"), CMD_INFO_FETCH_DATA("Cmd - Fetch Data"),
CMD_INFO_SEARCHING("Cmd - Searching"), CMD_INFO_SEARCHING("Cmd - Searching"),
//
CMD_USG_ANALYZE("Cmd - Usage /plan analyze"), CMD_USG_ANALYZE("Cmd - Usage /plan analyze"),
CMD_USG_QANALYZE("Cmd - Usage /plan qanalyze"), CMD_USG_QANALYZE("Cmd - Usage /plan qanalyze"),
CMD_USG_HELP("Cmd - Usage /plan help"), CMD_USG_HELP("Cmd - Usage /plan help"),
@ -107,7 +107,7 @@ public enum Msg {
CMD_USG_WEB_DELETE("Cmd - Usage /plan webuser delete"), CMD_USG_WEB_DELETE("Cmd - Usage /plan webuser delete"),
CMD_USG_WEB_LEVEL("Cmd - Usage /plan webuser level"), CMD_USG_WEB_LEVEL("Cmd - Usage /plan webuser level"),
CMD_USG_WEB_REGISTER("Cmd - Usage /plan webuser register"), CMD_USG_WEB_REGISTER("Cmd - Usage /plan webuser register"),
//
CMD_HELP_ANALYZE("In Depth Help - /plan analyze ?"), CMD_HELP_ANALYZE("In Depth Help - /plan analyze ?"),
CMD_HELP_QANALYZE("In Depth Help - /plan qanalyze ?"), CMD_HELP_QANALYZE("In Depth Help - /plan qanalyze ?"),
CMD_HELP_PLAN("In Depth Help - /plan ?"), CMD_HELP_PLAN("In Depth Help - /plan ?"),
@ -123,15 +123,15 @@ public enum Msg {
CMD_HELP_SEARCH("In Depth Help - /plan search ?"), CMD_HELP_SEARCH("In Depth Help - /plan search ?"),
CMD_HELP_WEB("In Depth Help - /plan webuser ?"), CMD_HELP_WEB("In Depth Help - /plan webuser ?"),
CMD_HELP_WEB_REGISTER("In Depth Help - /plan webuser register ?"), CMD_HELP_WEB_REGISTER("In Depth Help - /plan webuser register ?"),
//
CMD_HEADER_ANALYZE("Cmd Header - Analysis"), CMD_HEADER_ANALYZE("Cmd Header - Analysis"),
CMD_HEADER_INSPECT("Cmd Header - Inspect"), CMD_HEADER_INSPECT("Cmd Header - Inspect"),
CMD_HEADER_INFO("Cmd Header - Info"), CMD_HEADER_INFO("Cmd Header - Info"),
CMD_HEADER_SEARCH("Cmd Header - Search"), CMD_HEADER_SEARCH("Cmd Header - Search"),
//
CMD_CONSTANT_LIST_BALL(">Constant - List Ball"), CMD_CONSTANT_LIST_BALL(">Constant - List Ball"),
CMD_CONSTANT_FOOTER(">Constant - CMD Footer"), CMD_CONSTANT_FOOTER(">Constant - CMD Footer"),
//
HTML_NO_PLUGINS("Html - No Extra Plugins"), HTML_NO_PLUGINS("Html - No Extra Plugins"),
HTML_BANNED("Html - Banned"), HTML_BANNED("Html - Banned"),
HTML_OP("Html - OP"), HTML_OP("Html - OP"),

View File

@ -12,10 +12,10 @@ package com.djrapitops.plan.system.settings.theme;
public enum ThemeVal { public enum ThemeVal {
THEME_DEFAULT("DefaultColor", "light-green"), THEME_DEFAULT("DefaultColor", "light-green"),
//
FONT_STYLESHEET("Font.FontStyleSheet", "https://fonts.googleapis.com/css?family=Roboto:400,700&subset=latin,cyrillic-ext"), FONT_STYLESHEET("Font.FontStyleSheet", "https://fonts.googleapis.com/css?family=Roboto:400,700&subset=latin,cyrillic-ext"),
FONT_FAMILY("Font.FontFamily", "\"Roboto\", sans-serif"), FONT_FAMILY("Font.FontFamily", "\"Roboto\", sans-serif"),
//
RED("Colors.red", "#E91E63"), RED("Colors.red", "#E91E63"),
PINK("Colors.pink", "#F44336"), PINK("Colors.pink", "#F44336"),
PURPLE("Colors.purple", "#9C27B0"), PURPLE("Colors.purple", "#9C27B0"),
@ -37,7 +37,7 @@ public enum ThemeVal {
BLUE_GREY("Colors.blue-grey", "#607D8B"), BLUE_GREY("Colors.blue-grey", "#607D8B"),
BLACK("Colors.black", "#000000"), BLACK("Colors.black", "#000000"),
WHITE("Colors.Extra.White", "#fff"), WHITE("Colors.Extra.White", "#fff"),
//
GRAPH_PUNCHCARD("GraphColors.PunchCard", "#222"), GRAPH_PUNCHCARD("GraphColors.PunchCard", "#222"),
GRAPH_PLAYERS_ONLINE("GraphColors.PlayersOnline", "#1E90FF"), GRAPH_PLAYERS_ONLINE("GraphColors.PlayersOnline", "#1E90FF"),
GRAPH_TPS_HIGH("GraphColors.TPS.High", "#267F00"), GRAPH_TPS_HIGH("GraphColors.TPS.High", "#267F00"),
@ -53,7 +53,7 @@ public enum ThemeVal {
GRAPH_SERVER_PREF_PIE("GraphColors.ServerPreferencePie", "\"#0099C6\", \"#66AA00\", \"#316395\", \"#994499\", \"#22AA99\", \"#AAAA11\", \"#6633CC\", \"#E67300\", \"#329262\", \"#5574A6\""), GRAPH_SERVER_PREF_PIE("GraphColors.ServerPreferencePie", "\"#0099C6\", \"#66AA00\", \"#316395\", \"#994499\", \"#22AA99\", \"#AAAA11\", \"#6633CC\", \"#E67300\", \"#329262\", \"#5574A6\""),
WORLD_MAP_HIGH("GraphColors.WorldMap_High", "#267f00"), WORLD_MAP_HIGH("GraphColors.WorldMap_High", "#267f00"),
WORLD_MAP_LOW("GraphColors.WorldMap_Low", "#EEFFEE"), WORLD_MAP_LOW("GraphColors.WorldMap_Low", "#EEFFEE"),
//
PARSED_SESSION_ACCORDION("ParsedElements.SessionAccordion", "teal"), PARSED_SESSION_ACCORDION("ParsedElements.SessionAccordion", "teal"),
PARSED_SERVER_ACCORDION("ParsedElements.ServerAccordion", "light-green"); PARSED_SERVER_ACCORDION("ParsedElements.ServerAccordion", "light-green");

View File

@ -4,7 +4,6 @@ import com.djrapitops.plan.PlanPlugin;
import com.djrapitops.plan.data.container.TPS; import com.djrapitops.plan.data.container.TPS;
import com.djrapitops.plan.system.processing.Processing; import com.djrapitops.plan.system.processing.Processing;
import com.djrapitops.plan.system.processing.processors.TPSInsertProcessor; import com.djrapitops.plan.system.processing.processors.TPSInsertProcessor;
import com.djrapitops.plan.utilities.MiscUtils;
import com.djrapitops.plugin.api.utility.log.Log; import com.djrapitops.plugin.api.utility.log.Log;
import com.djrapitops.plugin.task.AbsRunnable; import com.djrapitops.plugin.task.AbsRunnable;
@ -33,7 +32,7 @@ public abstract class TPSCountTimer<T extends PlanPlugin> extends AbsRunnable {
public void run() { public void run() {
try { try {
long nanoTime = System.nanoTime(); long nanoTime = System.nanoTime();
long now = MiscUtils.getTime(); long now = System.currentTimeMillis();
addNewTPSEntry(nanoTime, now); addNewTPSEntry(nanoTime, now);

View File

@ -8,12 +8,10 @@ import com.djrapitops.plan.system.tasks.TPSCountTimer;
import com.djrapitops.plan.utilities.analysis.MathUtils; import com.djrapitops.plan.utilities.analysis.MathUtils;
import com.djrapitops.plugin.api.utility.log.Log; import com.djrapitops.plugin.api.utility.log.Log;
import org.spongepowered.api.Sponge; import org.spongepowered.api.Sponge;
import org.spongepowered.api.world.Chunk;
import org.spongepowered.api.world.World; import org.spongepowered.api.world.World;
import java.lang.management.ManagementFactory; import java.lang.management.ManagementFactory;
import java.lang.management.OperatingSystemMXBean; import java.lang.management.OperatingSystemMXBean;
import java.util.Iterator;
public class SpongeTPSCountTimer extends TPSCountTimer<PlanSponge> { public class SpongeTPSCountTimer extends TPSCountTimer<PlanSponge> {
@ -62,7 +60,7 @@ public class SpongeTPSCountTimer extends TPSCountTimer<PlanSponge> {
double tps = Sponge.getGame().getServer().getTicksPerSecond(); double tps = Sponge.getGame().getServer().getTicksPerSecond();
int playersOnline = ServerInfo.getServerProperties().getOnlinePlayers(); int playersOnline = ServerInfo.getServerProperties().getOnlinePlayers();
latestPlayersOnline = playersOnline; latestPlayersOnline = playersOnline;
int loadedChunks = -1; int loadedChunks = -1; // getLoadedChunks();
int entityCount = getEntityCount(); int entityCount = getEntityCount();
return TPSBuilder.get() return TPSBuilder.get()
@ -83,13 +81,9 @@ public class SpongeTPSCountTimer extends TPSCountTimer<PlanSponge> {
*/ */
private int getLoadedChunks() { private int getLoadedChunks() {
// DISABLED // DISABLED
int loaded = 0; int loaded = 0;
for (World world : Sponge.getGame().getServer().getWorlds()) { for (World world : Sponge.getGame().getServer().getWorlds()) {
Iterator<Chunk> iterator = world.getLoadedChunks().iterator(); loaded += world.getLoadedChunks().spliterator().estimateSize();
while (iterator.hasNext()) {
loaded++;
}
} }
return loaded; return loaded;
} }
@ -99,7 +93,7 @@ public class SpongeTPSCountTimer extends TPSCountTimer<PlanSponge> {
* *
* @return amount of entities * @return amount of entities
*/ */
protected int getEntityCount() { private int getEntityCount() {
return Sponge.getGame().getServer().getWorlds().stream().mapToInt(world -> world.getEntities().size()).sum(); return Sponge.getGame().getServer().getWorlds().stream().mapToInt(world -> world.getEntities().size()).sum();
} }
} }

View File

@ -43,7 +43,7 @@ public class ShutdownUpdateHook extends Thread {
downloadNewJar(available, newJar); downloadNewJar(available, newJar);
registerOldJarForDeletion(pluginsFolder, newJar); registerOldJarForDeletion(pluginsFolder, newJar);
} catch (IOException e) { } catch (IOException e) {
e.printStackTrace(); Log.toLog(ShutdownUpdateHook.class, e);
} }
} }
@ -129,6 +129,7 @@ public class ShutdownUpdateHook extends Thread {
try { try {
((URLClassLoader) classLoader).close(); ((URLClassLoader) classLoader).close();
} catch (IOException e) { } catch (IOException e) {
// Loggers may be unavailable.
e.printStackTrace(); e.printStackTrace();
} }
} }

View File

@ -58,6 +58,6 @@ public class VersionInfo implements Comparable<VersionInfo> {
@Override @Override
public int compareTo(VersionInfo o) { public int compareTo(VersionInfo o) {
return -this.version.compareTo(o.version); return o.version.compareTo(this.version);
} }
} }

View File

@ -49,7 +49,7 @@ public class PlayerPageHandler extends PageHandler {
try { try {
if (Database.getActive().check().isPlayerRegistered(uuid)) { if (Database.getActive().check().isPlayerRegistered(uuid)) {
Response response = ResponseCache.loadResponse(PageId.PLAYER.of(uuid)); Response response = ResponseCache.loadResponse(PageId.PLAYER.of(uuid));
if (response == null || !(response instanceof InspectPageResponse)) { if (!(response instanceof InspectPageResponse)) {
InfoSystem.getInstance().generateAndCachePlayerPage(uuid); InfoSystem.getInstance().generateAndCachePlayerPage(uuid);
response = ResponseCache.loadResponse(PageId.PLAYER.of(uuid)); response = ResponseCache.loadResponse(PageId.PLAYER.of(uuid));
} }

View File

@ -77,7 +77,7 @@ public class InspectPage extends Page {
} }
public String parse(PlayerProfile profile, UUID serverUUID, Map<UUID, String> serverNames) throws IOException { public String parse(PlayerProfile profile, UUID serverUUID, Map<UUID, String> serverNames) throws IOException {
long now = MiscUtils.getTime(); long now = System.currentTimeMillis();
addValue("refresh", FormatUtils.formatTimeStampClock(now)); addValue("refresh", FormatUtils.formatTimeStampClock(now));
addValue("version", MiscUtils.getPlanVersion()); addValue("version", MiscUtils.getPlanVersion());

View File

@ -42,7 +42,7 @@ public class NetworkPage extends Page {
public String toHtml() throws ParseException { public String toHtml() throws ParseException {
try { try {
UUID serverUUID = ServerInfo.getServerUUID(); UUID serverUUID = ServerInfo.getServerUUID();
long now = MiscUtils.getTime(); long now = System.currentTimeMillis();
Database database = Database.getActive(); Database database = Database.getActive();
List<TPS> networkOnlineData = database.fetch().getNetworkOnlineData(); List<TPS> networkOnlineData = database.fetch().getNetworkOnlineData();
List<String> geolocations = database.fetch().getNetworkGeolocations(); List<String> geolocations = database.fetch().getNetworkGeolocations();

View File

@ -0,0 +1,29 @@
package com.djrapitops.plan.system.webserver.response;
/**
* Enum for HTTP response codes.
*
* @author Rsl1122
*/
public enum ResponseCode {
NONE(0),
CONNECTION_REFUSED(-1),
SUCCESS(200),
BAD_REQUEST(400),
UNAUTHORIZED(401),
FORBIDDEN(403),
NOT_FOUND(404),
PRECONDITION_FAILED(412),
INTERNAL_ERROR(500),
GATEWAY_ERROR(504);
private final int code;
ResponseCode(int code) {
this.code = code;
}
public int getCode() {
return code;
}
}

View File

@ -16,19 +16,19 @@ public enum PageId {
SERVER("serverPage:"), SERVER("serverPage:"),
PLAYER("playerPage:"), PLAYER("playerPage:"),
PLAYERS("playersPage"), PLAYERS("playersPage"),
//
ERROR("error:"), ERROR("error:"),
FORBIDDEN(ERROR.of("Forbidden")), FORBIDDEN(ERROR.of("Forbidden")),
NOT_FOUND(ERROR.of("Not Found")), NOT_FOUND(ERROR.of("Not Found")),
TRUE("true"), TRUE("true"),
FALSE("false"), FALSE("false"),
//
JS("js:"), JS("js:"),
CSS("css:"), CSS("css:"),
//
FAVICON_REDIRECT("Redirect:Favicon"), FAVICON_REDIRECT("Redirect:Favicon"),
AUTH_PROMPT("PromptAuth"), AUTH_PROMPT("PromptAuth"),
//
PLAYER_PLUGINS_TAB("playerPluginsTab:"), PLAYER_PLUGINS_TAB("playerPluginsTab:"),
NETWORK_CONTENT("networkContent"); NETWORK_CONTENT("networkContent");

View File

@ -4,6 +4,7 @@ import com.djrapitops.plan.system.webserver.response.Response;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
import java.util.function.Supplier;
/** /**
* This class contains the page cache. * This class contains the page cache.
@ -29,23 +30,23 @@ public class ResponseCache {
/** /**
* Loads the response from the response cache. * Loads the response from the response cache.
* <p> * <p>
* If the {@link Response} isn't cached, {@link ResponseLoader#createResponse()} in the {@code loader} * If the {@link Response} isn't cached, {@link Supplier#get()} in the {@code loader}
* is called to create the Response. * is called to create the Response.
* <p> * <p>
* If the Response is created, it's automatically cached. * If the Response is created, it's automatically cached.
* *
* @param identifier The identifier of the page * @param identifier The identifier of the page
* @param loader The {@link ResponseLoader} (How should it load the page if it's not cached) * @param loader The The {@link Response} {@link Supplier} (How should it load the page if it's not cached)
* @return The Response that was cached or created by the {@link ResponseLoader loader} * @return The Response that was cached or created by the the {@link Response} {@link Supplier}
*/ */
public static Response loadResponse(String identifier, ResponseLoader loader) { public static Response loadResponse(String identifier, Supplier<Response> loader) {
Response response = loadResponse(identifier); Response response = loadResponse(identifier);
if (response != null) { if (response != null) {
return response; return response;
} }
response = loader.createResponse(); response = loader.get();
cache.put(identifier, response); cache.put(identifier, response);
@ -68,10 +69,10 @@ public class ResponseCache {
* If the cache already inherits that {@code identifier}, it's renewed. * If the cache already inherits that {@code identifier}, it's renewed.
* *
* @param identifier The identifier of the page * @param identifier The identifier of the page
* @param loader The {@link ResponseLoader} (How it should load the page) * @param loader The {@link Response} {@link Supplier} (How it should load the page)
*/ */
public static void cacheResponse(String identifier, ResponseLoader loader) { public static void cacheResponse(String identifier, Supplier<Response> loader) {
Response response = loader.createResponse(); Response response = loader.get();
cache.put(identifier, response); cache.put(identifier, response);
} }
@ -92,15 +93,4 @@ public class ResponseCache {
cache.clear(); cache.clear();
} }
/**
* This interface is used for providing the method to load the page.
*
* @author Fuzzlemann
* @since 4.2.0
*/
public interface ResponseLoader {
Response createResponse();
}
} }

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