diff --git a/Plan/src/main/java/com/djrapitops/plan/Plan.java b/Plan/src/main/java/com/djrapitops/plan/Plan.java index 9dac999a0..ece736f89 100644 --- a/Plan/src/main/java/com/djrapitops/plan/Plan.java +++ b/Plan/src/main/java/com/djrapitops/plan/Plan.java @@ -172,7 +172,7 @@ public class Plan extends BukkitPlugin implements IPlan { webServer.initServer(); if (!webServer.isEnabled()) { - Log.error("WebServer was not successfully initialized."); + Log.error("WebServer was not successfully initialized. Is the port (" + Settings.WEBSERVER_PORT.getNumber() + ") in use?"); } Benchmark.stop("Enable", "WebServer Initialization"); @@ -189,8 +189,7 @@ public class Plan extends BukkitPlugin implements IPlan { Log.infoColor(Locale.get(Msg.ENABLE_NOTIFY_EMPTY_IP).toString()); } if (usingBungeeWebServer && usingAlternativeIP) { - // TODO Move to Locale - Log.info("Make sure that the alternative IP points to Bungee Server: " + Settings.ALTERNATIVE_IP.toString()); + Log.info("Make sure that the alternative IP points to the Bukkit Server: " + Settings.ALTERNATIVE_IP.toString()); } registerCommand(new PlanCommand(this)); diff --git a/Plan/src/main/java/com/djrapitops/plan/Settings.java b/Plan/src/main/java/com/djrapitops/plan/Settings.java index 644e14930..43538d57d 100644 --- a/Plan/src/main/java/com/djrapitops/plan/Settings.java +++ b/Plan/src/main/java/com/djrapitops/plan/Settings.java @@ -24,6 +24,7 @@ public enum Settings { COMBINE_COMMAND_ALIASES("Data.Commands.CombineCommandAliases"), WRITE_NEW_LOCALE("Plugin.WriteNewLocaleFileOnStart"), DEV_MODE("Plugin.Dev"), + USE_SERVER_TIME("Customization.UseServerTime"), // Integer WEBSERVER_PORT("WebServer.Port"), diff --git a/Plan/src/main/java/com/djrapitops/plan/api/API.java b/Plan/src/main/java/com/djrapitops/plan/api/API.java index 5c83b97d8..9dac148fc 100644 --- a/Plan/src/main/java/com/djrapitops/plan/api/API.java +++ b/Plan/src/main/java/com/djrapitops/plan/api/API.java @@ -81,7 +81,8 @@ public class API { * @return ./player/PlayerName */ public String getPlayerInspectPageLink(String name) { - return "../player/" + name; + String link = "../player/" + name; + return link.replace(" ", "%20").replace(".", "%2E"); } /** @@ -154,6 +155,7 @@ public class API { * Check if the data is cached to AnalysisCache before calling this. * * @return server.html with all placeholders replaced. + * @throws NullPointerException if AnalysisData has not been cached. */ public String getAnalysisHtmlAsString() { return plugin.getInfoManager().getAnalysisHtml(); diff --git a/Plan/src/main/java/com/djrapitops/plan/command/commands/manage/ManageSetupCommand.java b/Plan/src/main/java/com/djrapitops/plan/command/commands/manage/ManageSetupCommand.java index 2cdc6acfa..9a331e597 100644 --- a/Plan/src/main/java/com/djrapitops/plan/command/commands/manage/ManageSetupCommand.java +++ b/Plan/src/main/java/com/djrapitops/plan/command/commands/manage/ManageSetupCommand.java @@ -50,11 +50,18 @@ public class ManageSetupCommand extends SubCommand { if (!Check.isTrue(args.length >= 1, Locale.get(Msg.CMD_FAIL_REQ_ONE_ARG).toString(), sender)) { return true; } + if (plugin.getWebServer().isEnabled()) { + sender.sendMessage("§cWebServer is not enabled on this server! Make sure it enables on boot!"); + return true; + } String address = args[0].toLowerCase(); + if (address.endsWith("/")) { + address = address.substring(0, address.length() - 1); + } try { plugin.getWebServer().getWebAPI().getAPI(PingWebAPI.class).sendRequest(address); plugin.getWebServer().getWebAPI().getAPI(RequestSetupWebAPI.class).sendRequest(address); - sender.sendMessage("§aConnection successful, Plan may restart in a few seconds."); + sender.sendMessage("§eConnection successful, Plan may restart in a few seconds, if it doesn't something has gone wrong."); } catch (WebAPIException e) { Log.toLog(this.getClass().getName(), e); sender.sendMessage("§cConnection to Bungee WebServer failed: More info on console"); diff --git a/Plan/src/main/java/com/djrapitops/plan/data/analysis/ActivityPart.java b/Plan/src/main/java/com/djrapitops/plan/data/analysis/ActivityPart.java index 308936e9d..c19fbe86f 100644 --- a/Plan/src/main/java/com/djrapitops/plan/data/analysis/ActivityPart.java +++ b/Plan/src/main/java/com/djrapitops/plan/data/analysis/ActivityPart.java @@ -144,7 +144,7 @@ public class ActivityPart extends RawData { } public Map getPlayersOnline() { - return tpsPart.getTpsData().stream().collect(Collectors.toMap(TPS::getDate, TPS::getPlayers)); + return tpsPart.getTpsData().stream().distinct().collect(Collectors.toMap(TPS::getDate, TPS::getPlayers)); } public List getRecentPlayers() { diff --git a/Plan/src/main/java/com/djrapitops/plan/database/tables/UserInfoTable.java b/Plan/src/main/java/com/djrapitops/plan/database/tables/UserInfoTable.java index 1bb54e51e..607d67fb1 100644 --- a/Plan/src/main/java/com/djrapitops/plan/database/tables/UserInfoTable.java +++ b/Plan/src/main/java/com/djrapitops/plan/database/tables/UserInfoTable.java @@ -84,12 +84,15 @@ public class UserInfoTable extends UserIDTable { PreparedStatement statement = null; ResultSet set = null; try (Connection connection = getConnection()) { - statement = connection.prepareStatement(Select.from(tableName, columnUserID) + statement = connection.prepareStatement(Select.from(tableName, "COUNT(" + columnUserID + ") as c") .where(columnUserID + "=" + usersTable.statementSelectID) .toString()); statement.setString(1, uuid.toString()); set = statement.executeQuery(); - return set.next(); + if (set.next()) { + return set.getInt("c") >= 1; + } + return false; } finally { close(set, statement); } @@ -161,7 +164,7 @@ public class UserInfoTable extends UserIDTable { public List getServerUserInfo(UUID serverUUID) throws SQLException { PreparedStatement statement = null; ResultSet set = null; - try (Connection connection = getConnection()){ + try (Connection connection = getConnection()) { List userInfo = new ArrayList<>(); String usersIDColumn = usersTable + "." + usersTable.getColumnID(); String usersUUIDColumn = usersTable + "." + usersTable.getColumnUUID() + " as uuid"; @@ -199,7 +202,7 @@ public class UserInfoTable extends UserIDTable { public Map> getAllUserInfo() throws SQLException { PreparedStatement statement = null; ResultSet set = null; - try (Connection connection = getConnection()){ + try (Connection connection = getConnection()) { String usersIDColumn = usersTable + "." + usersTable.getColumnID(); String usersUUIDColumn = usersTable + "." + usersTable.getColumnUUID() + " as uuid"; String serverIDColumn = serverTable + "." + serverTable.getColumnID(); @@ -242,7 +245,7 @@ public class UserInfoTable extends UserIDTable { return; } PreparedStatement statement = null; - try (Connection connection = getConnection()){ + try (Connection connection = getConnection()) { statement = connection.prepareStatement("INSERT INTO " + tableName + " (" + columnUserID + ", " + columnRegistered + ", " + @@ -278,7 +281,7 @@ public class UserInfoTable extends UserIDTable { public Map> getSavedUUIDs() throws SQLException { PreparedStatement statement = null; ResultSet set = null; - try (Connection connection = getConnection()){ + try (Connection connection = getConnection()) { String usersIDColumn = usersTable + "." + usersTable.getColumnID(); String usersUUIDColumn = usersTable + "." + usersTable.getColumnUUID() + " as uuid"; String serverIDColumn = serverTable + "." + serverTable.getColumnID(); diff --git a/Plan/src/main/java/com/djrapitops/plan/database/tables/UsersTable.java b/Plan/src/main/java/com/djrapitops/plan/database/tables/UsersTable.java index 233fe4561..d9ac2bb53 100644 --- a/Plan/src/main/java/com/djrapitops/plan/database/tables/UsersTable.java +++ b/Plan/src/main/java/com/djrapitops/plan/database/tables/UsersTable.java @@ -180,12 +180,15 @@ public class UsersTable extends UserIDTable { PreparedStatement statement = null; ResultSet set = null; try (Connection connection = getConnection()) { - statement = connection.prepareStatement(Select.from(tableName, columnID) + statement = connection.prepareStatement(Select.from(tableName, "COUNT(" + columnID + ") as c") .where(columnUUID + "=?") .toString()); statement.setString(1, uuid.toString()); set = statement.executeQuery(); - return set.next(); + if (set.next()) { + return set.getInt("c") >= 1; + } + return false; } finally { close(set, statement); } @@ -423,7 +426,7 @@ public class UsersTable extends UserIDTable { public int getPlayerCount() throws SQLException { PreparedStatement statement = null; ResultSet set = null; - try (Connection connection = getConnection()){ + try (Connection connection = getConnection()) { statement = connection.prepareStatement("SELECT COUNT(*) AS player_count FROM " + tableName); statement.setFetchSize(5000); @@ -436,4 +439,20 @@ public class UsersTable extends UserIDTable { close(set, statement); } } + + public Optional getRegisterDate(UUID uuid) throws SQLException { + PreparedStatement statement = null; + ResultSet set = null; + try (Connection connection = getConnection()) { + statement = connection.prepareStatement(Select.from(tableName, columnRegistered).where(columnUUID + "=?").toString()); + statement.setString(1, uuid.toString()); + set = statement.executeQuery(); + if (set.next()) { + Optional.of(set.getLong(columnRegistered)); + } + return Optional.empty(); + } finally { + close(set, statement); + } + } } diff --git a/Plan/src/main/java/com/djrapitops/plan/systems/info/BukkitInformationManager.java b/Plan/src/main/java/com/djrapitops/plan/systems/info/BukkitInformationManager.java index df182e15d..90be5a21e 100644 --- a/Plan/src/main/java/com/djrapitops/plan/systems/info/BukkitInformationManager.java +++ b/Plan/src/main/java/com/djrapitops/plan/systems/info/BukkitInformationManager.java @@ -173,6 +173,9 @@ public class BukkitInformationManager extends InformationManager { @Override public boolean isAnalysisCached(UUID serverUUID) { + if (Plan.getServerUUID().equals(serverUUID)) { + return analysisData != null; + } if (usingAnotherWebServer) { try { return getWebAPI().getAPI(IsCachedWebAPI.class).isAnalysisCached(webServerAddress, serverUUID); @@ -188,8 +191,17 @@ public class BukkitInformationManager extends InformationManager { return plugin.getWebServer().getWebAPI(); } + /** + * Get the HTML for analysis page of this server. + * + * @return Html for Analysis page + * @throws NullPointerException if AnalysisData has not been cached. + */ @Override public String getAnalysisHtml() { + if (analysisData == null) { + throw new NullPointerException("Analysis Data has not been cached."); + } try { return Theme.replaceColors(new AnalysisPageParser(analysisData, plugin).parse()); } catch (ParseException e) { @@ -229,15 +241,19 @@ public class BukkitInformationManager extends InformationManager { } private void cacheAnalysisHtml() { + cacheAnalysisHtml(getAnalysisHtml()); + } + + public void cacheAnalysisHtml(String html) { if (usingAnotherWebServer) { try { - getWebAPI().getAPI(PostHtmlWebAPI.class).sendAnalysisHtml(webServerAddress, getAnalysisHtml()); + getWebAPI().getAPI(PostHtmlWebAPI.class).sendAnalysisHtml(webServerAddress, html); } catch (WebAPIException e) { attemptConnection(); cacheAnalysisHtml(); } } else { - PageCache.cachePage("analysisPage:" + Plan.getServerUUID(), () -> new AnalysisPageResponse(this)); + PageCache.cachePage("analysisPage:" + Plan.getServerUUID(), () -> new AnalysisPageResponse(html)); } } diff --git a/Plan/src/main/java/com/djrapitops/plan/systems/info/parsing/InspectPageParser.java b/Plan/src/main/java/com/djrapitops/plan/systems/info/parsing/InspectPageParser.java index 840582cce..3956dc46a 100644 --- a/Plan/src/main/java/com/djrapitops/plan/systems/info/parsing/InspectPageParser.java +++ b/Plan/src/main/java/com/djrapitops/plan/systems/info/parsing/InspectPageParser.java @@ -15,6 +15,7 @@ import main.java.com.djrapitops.plan.data.Session; import main.java.com.djrapitops.plan.data.UserInfo; import main.java.com.djrapitops.plan.database.Database; import main.java.com.djrapitops.plan.database.tables.SessionsTable; +import main.java.com.djrapitops.plan.database.tables.UsersTable; import main.java.com.djrapitops.plan.utilities.Benchmark; import main.java.com.djrapitops.plan.utilities.FormatUtils; import main.java.com.djrapitops.plan.utilities.MiscUtils; @@ -30,10 +31,7 @@ import main.java.com.djrapitops.plan.utilities.html.graphs.ServerPreferencePieCr import main.java.com.djrapitops.plan.utilities.html.graphs.WorldPieCreator; import main.java.com.djrapitops.plan.utilities.html.tables.ActionsTableCreator; -import java.util.Collection; -import java.util.List; -import java.util.Map; -import java.util.UUID; +import java.util.*; import java.util.stream.Collectors; /** @@ -60,18 +58,21 @@ public class InspectPageParser extends PageParser { SessionsTable sessionsTable = db.getSessionsTable(); UserInfo userInfo = db.getUserInfoTable().getUserInfo(uuid); - int timesKicked = db.getUsersTable().getTimesKicked(uuid); + UsersTable usersTable = db.getUsersTable(); + String playerName = usersTable.getPlayerName(uuid); + Optional registerDate = usersTable.getRegisterDate(uuid); + if (registerDate.isPresent()) { + addValue("registered", FormatUtils.formatTimeStampYear(registerDate.get())); + } else { + addValue("registered", "-"); + } + + addValue("playerName", playerName); + int timesKicked = usersTable.getTimesKicked(uuid); addValue("version", MiscUtils.getPlanVersion()); addValue("timeZone", MiscUtils.getTimeZoneOffsetHours()); - if (userInfo != null) { - addValue("playerName", userInfo.getName()); - addValue("registered", FormatUtils.formatTimeStampYear(userInfo.getRegistered())); - } else { - addValue("playerName", "Error occurred."); - addValue("registered", "Error occurred."); - } long lastSeen = sessionsTable.getLastSeen(uuid); if (lastSeen != 0) { addValue("lastSeen", FormatUtils.formatTimeStampYear(lastSeen)); @@ -177,7 +178,13 @@ public class InspectPageParser extends PageParser { addValue("mobKillCount", mobKillCount); addValue("deathCount", deathCount); - playerClassification(userInfo, lastSeen, playTime, sessionCount); + boolean isActive = AnalysisUtils.isActive(MiscUtils.getTime(), lastSeen, playTime, sessionCount); + String active = isActive ? "Active" : "Inactive"; + if (userInfo != null) { + playerClassification(userInfo, active); + } else { + addValue("playerClassification", active); + } return HtmlUtils.replacePlaceholders(FileUtil.getStringFromResource("player.html"), placeHolders); } catch (Exception e) { @@ -186,12 +193,10 @@ public class InspectPageParser extends PageParser { } } - private void playerClassification(UserInfo userInfo, long lastPlayed, long playTime, int loginTimes) { + private void playerClassification(UserInfo userInfo, String active) { boolean isBanned = userInfo.isBanned(); boolean isOP = userInfo.isOpped(); - boolean isActive = AnalysisUtils.isActive(MiscUtils.getTime(), lastPlayed, playTime, loginTimes); - String active = isActive ? "Active" : "Inactive"; String banned = isBanned ? "Banned" : ""; String op = isOP ? "Operator (OP)" : ""; diff --git a/Plan/src/main/java/com/djrapitops/plan/systems/info/server/BungeeServerInfoManager.java b/Plan/src/main/java/com/djrapitops/plan/systems/info/server/BungeeServerInfoManager.java index 00377188b..7a016d98c 100644 --- a/Plan/src/main/java/com/djrapitops/plan/systems/info/server/BungeeServerInfoManager.java +++ b/Plan/src/main/java/com/djrapitops/plan/systems/info/server/BungeeServerInfoManager.java @@ -98,6 +98,7 @@ public class BungeeServerInfoManager { connectedToServer(server); return true; } catch (WebAPIException e) { + Log.debug(e.toString()); serverHasGoneOffline(server.getUuid()); return false; } diff --git a/Plan/src/main/java/com/djrapitops/plan/systems/listeners/PlanCommandPreprocessListener.java b/Plan/src/main/java/com/djrapitops/plan/systems/listeners/PlanCommandPreprocessListener.java index 36c3fc382..11bc8fd64 100644 --- a/Plan/src/main/java/com/djrapitops/plan/systems/listeners/PlanCommandPreprocessListener.java +++ b/Plan/src/main/java/com/djrapitops/plan/systems/listeners/PlanCommandPreprocessListener.java @@ -52,7 +52,11 @@ public class PlanCommandPreprocessListener implements Listener { if (!logUnknownCommands || combineCommandAliases) { Command command = plugin.getServer().getPluginCommand(commandName); if (command == null) { - command = plugin.getServer().getCommandMap().getCommand(commandName); + try { + command = plugin.getServer().getCommandMap().getCommand(commandName); + } catch (NoSuchMethodError ignored) { + /* Ignored, Bukkit 1.8 has no such method */ + } } if (command == null) { if (!logUnknownCommands) { diff --git a/Plan/src/main/java/com/djrapitops/plan/systems/queue/Consumer.java b/Plan/src/main/java/com/djrapitops/plan/systems/queue/Consumer.java index ed61ea773..9638d306f 100644 --- a/Plan/src/main/java/com/djrapitops/plan/systems/queue/Consumer.java +++ b/Plan/src/main/java/com/djrapitops/plan/systems/queue/Consumer.java @@ -42,7 +42,11 @@ public abstract class Consumer extends AbsRunnable { protected void stop() { run = false; - super.cancel(); + try { + super.cancel(); + } catch (NullPointerException ignore) { + /*ignored*/ + } } protected abstract void clearVariables(); diff --git a/Plan/src/main/java/com/djrapitops/plan/systems/webserver/ResponseHandler.java b/Plan/src/main/java/com/djrapitops/plan/systems/webserver/ResponseHandler.java index dc1ba14e8..8cc7dffed 100644 --- a/Plan/src/main/java/com/djrapitops/plan/systems/webserver/ResponseHandler.java +++ b/Plan/src/main/java/com/djrapitops/plan/systems/webserver/ResponseHandler.java @@ -191,11 +191,6 @@ public class ResponseHandler extends APIResponseHandler { } private Response serverResponse(UUID serverUUID) { - if (!plugin.getInfoManager().isAnalysisCached(serverUUID)) { - String error = "Analysis Data was not cached.
Use /plan analyze to cache the Data."; - PageCache.loadPage("notFound: " + error, () -> new NotFoundResponse(error)); - } - return PageCache.loadPage("analysisPage:" + serverUUID, () -> new AnalysisPageResponse(plugin.getInfoManager())); } diff --git a/Plan/src/main/java/com/djrapitops/plan/systems/webserver/WebServer.java b/Plan/src/main/java/com/djrapitops/plan/systems/webserver/WebServer.java index 0f439286b..da586d960 100644 --- a/Plan/src/main/java/com/djrapitops/plan/systems/webserver/WebServer.java +++ b/Plan/src/main/java/com/djrapitops/plan/systems/webserver/WebServer.java @@ -187,6 +187,7 @@ public class WebServer { if (server != null) { server.stop(0); } + enabled = false; } public String getProtocol() { diff --git a/Plan/src/main/java/com/djrapitops/plan/systems/webserver/response/AnalysisPageResponse.java b/Plan/src/main/java/com/djrapitops/plan/systems/webserver/response/AnalysisPageResponse.java index 62e63f3ce..4bf724549 100644 --- a/Plan/src/main/java/com/djrapitops/plan/systems/webserver/response/AnalysisPageResponse.java +++ b/Plan/src/main/java/com/djrapitops/plan/systems/webserver/response/AnalysisPageResponse.java @@ -1,7 +1,10 @@ package main.java.com.djrapitops.plan.systems.webserver.response; +import com.djrapitops.plugin.task.AbsRunnable; +import main.java.com.djrapitops.plan.Plan; +import main.java.com.djrapitops.plan.data.AnalysisData; +import main.java.com.djrapitops.plan.systems.info.BukkitInformationManager; import main.java.com.djrapitops.plan.systems.info.InformationManager; -import main.java.com.djrapitops.plan.systems.webserver.theme.Theme; /** * @author Rsl1122 @@ -9,13 +12,37 @@ import main.java.com.djrapitops.plan.systems.webserver.theme.Theme; */ public class AnalysisPageResponse extends Response { + /** + * @param informationManager + * @throws NullPointerException if AnalysisData has not been cached after 1 second. + */ public AnalysisPageResponse(InformationManager informationManager) { super.setHeader("HTTP/1.1 200 OK"); + + if (informationManager instanceof BukkitInformationManager) { + AnalysisData analysisData = ((BukkitInformationManager) informationManager).getAnalysisData(); + if (analysisData == null) { + Plan.getInstance().getRunnableFactory().createNew("OnRequestAnalysisRefreshTask", new AbsRunnable() { + @Override + public void run() { + informationManager.refreshAnalysis(Plan.getServerUUID()); + } + }).runTaskAsynchronously(); + + ErrorResponse analysisRefreshPage = new ErrorResponse(); + analysisRefreshPage.setTitle("Analysis is being refreshed.."); + analysisRefreshPage.setParagraph(" Analysis is being run, refresh the page after a few seconds.. (F5)"); + analysisRefreshPage.replacePlaceholders(); + super.setContent(analysisRefreshPage.getContent()); + + return; + } + } super.setContent(informationManager.getAnalysisHtml()); } public AnalysisPageResponse(String html) { super.setHeader("HTTP/1.1 200 OK"); - super.setContent(Theme.replaceColors(html)); + super.setContent(html); } } diff --git a/Plan/src/main/java/com/djrapitops/plan/systems/webserver/response/ErrorResponse.java b/Plan/src/main/java/com/djrapitops/plan/systems/webserver/response/ErrorResponse.java index ce42b63e2..c9712e638 100644 --- a/Plan/src/main/java/com/djrapitops/plan/systems/webserver/response/ErrorResponse.java +++ b/Plan/src/main/java/com/djrapitops/plan/systems/webserver/response/ErrorResponse.java @@ -32,7 +32,7 @@ public class ErrorResponse extends Response { } } - protected void replacePlaceholders() { + public void replacePlaceholders() { Map placeHolders = new HashMap<>(); placeHolders.put("title", title); placeHolders.put("paragraph", paragraph); diff --git a/Plan/src/main/java/com/djrapitops/plan/systems/webserver/response/PlayersPageResponse.java b/Plan/src/main/java/com/djrapitops/plan/systems/webserver/response/PlayersPageResponse.java index 9c2b034fe..5d640685b 100644 --- a/Plan/src/main/java/com/djrapitops/plan/systems/webserver/response/PlayersPageResponse.java +++ b/Plan/src/main/java/com/djrapitops/plan/systems/webserver/response/PlayersPageResponse.java @@ -1,12 +1,12 @@ package main.java.com.djrapitops.plan.systems.webserver.response; import main.java.com.djrapitops.plan.Log; +import main.java.com.djrapitops.plan.Plan; import main.java.com.djrapitops.plan.api.IPlan; import main.java.com.djrapitops.plan.systems.webserver.theme.Theme; import main.java.com.djrapitops.plan.utilities.MiscUtils; import main.java.com.djrapitops.plan.utilities.file.FileUtil; import main.java.com.djrapitops.plan.utilities.html.Html; -import main.java.com.djrapitops.plan.utilities.html.HtmlUtils; import org.apache.commons.lang3.text.StrSubstitutor; import java.io.FileNotFoundException; @@ -43,7 +43,7 @@ public class PlayersPageResponse extends Response { int i = 1; for (String name : names) { - String link = Html.LINK.parse(HtmlUtils.getRelativeInspectUrl(name), name); + String link = Html.LINK.parse(Plan.getPlanAPI().getPlayerInspectPageLink(name), name); html.append("").append(link).append(""); diff --git a/Plan/src/main/java/com/djrapitops/plan/utilities/MiscUtils.java b/Plan/src/main/java/com/djrapitops/plan/utilities/MiscUtils.java index 4bc448050..5bc7e1196 100644 --- a/Plan/src/main/java/com/djrapitops/plan/utilities/MiscUtils.java +++ b/Plan/src/main/java/com/djrapitops/plan/utilities/MiscUtils.java @@ -4,10 +4,7 @@ import com.djrapitops.plugin.api.TimeAmount; import com.djrapitops.plugin.command.CommandUtils; import com.djrapitops.plugin.command.ISender; import com.djrapitops.plugin.utilities.Compatibility; -import main.java.com.djrapitops.plan.Log; -import main.java.com.djrapitops.plan.Permissions; -import main.java.com.djrapitops.plan.Plan; -import main.java.com.djrapitops.plan.PlanBungee; +import main.java.com.djrapitops.plan.*; import main.java.com.djrapitops.plan.api.IPlan; import main.java.com.djrapitops.plan.database.Database; import main.java.com.djrapitops.plan.locale.Locale; @@ -44,7 +41,10 @@ public class MiscUtils { } public static int getTimeZoneOffsetHours() { - return TimeZone.getDefault().getOffset(MiscUtils.getTime()) / (int) TimeAmount.HOUR.ms(); + if (Settings.USE_SERVER_TIME.isTrue()) { + return -TimeZone.getDefault().getOffset(MiscUtils.getTime()) / (int) TimeAmount.HOUR.ms(); + } + return 0; } /** diff --git a/Plan/src/main/java/com/djrapitops/plan/utilities/analysis/Analysis.java b/Plan/src/main/java/com/djrapitops/plan/utilities/analysis/Analysis.java index d41ddc765..df980f33b 100644 --- a/Plan/src/main/java/com/djrapitops/plan/utilities/analysis/Analysis.java +++ b/Plan/src/main/java/com/djrapitops/plan/utilities/analysis/Analysis.java @@ -17,6 +17,8 @@ import main.java.com.djrapitops.plan.locale.Locale; import main.java.com.djrapitops.plan.locale.Msg; import main.java.com.djrapitops.plan.systems.info.BukkitInformationManager; import main.java.com.djrapitops.plan.systems.info.InformationManager; +import main.java.com.djrapitops.plan.systems.webserver.response.ErrorResponse; +import main.java.com.djrapitops.plan.systems.webserver.response.InternalErrorResponse; import main.java.com.djrapitops.plan.utilities.Benchmark; import main.java.com.djrapitops.plan.utilities.MiscUtils; import main.java.com.djrapitops.plan.utilities.comparators.UserInfoLastPlayedComparator; @@ -63,6 +65,11 @@ public class Analysis { plugin.getRunnableFactory().createNew(new AbsRunnable("AnalysisTask") { @Override public void run() { + ErrorResponse analysisRefreshPage = new ErrorResponse(); + analysisRefreshPage.setTitle("Analysis is being refreshed.."); + analysisRefreshPage.setParagraph(" Analysis is being run, refresh the page after a few seconds.. (F5)"); + analysisRefreshPage.replacePlaceholders(); + ((BukkitInformationManager) plugin.getInfoManager()).cacheAnalysisHtml(analysisRefreshPage.getContent()); taskId = this.getTaskId(); analyze(infoManager, plugin.getDB()); taskId = -1; @@ -127,6 +134,7 @@ public class Analysis { // ExportUtility.export(analysisData, rawData); } catch (Exception e) { Log.toLog(this.getClass().getName(), e); + ((BukkitInformationManager) plugin.getInfoManager()).cacheAnalysisHtml(new InternalErrorResponse(e, "Analysis").getContent()); Log.debug("Analysis", "Error: " + e); Log.logDebug("Analysis"); return false; @@ -238,7 +246,7 @@ public class Analysis { tpsPart.addTpsData(tpsData); Log.debug("Analysis", "TPS Data Size: " + tpsData.size()); - List userInfo = db.getUserInfoTable().getServerUserInfo(); + List userInfo = db.getUserInfoTable().getServerUserInfo().stream().distinct().collect(Collectors.toList()); for (UserInfo user : userInfo) { if (user.isBanned()) { diff --git a/Plan/src/main/java/com/djrapitops/plan/utilities/html/HtmlStructure.java b/Plan/src/main/java/com/djrapitops/plan/utilities/html/HtmlStructure.java index 1e25d7c6f..7acdb8b46 100644 --- a/Plan/src/main/java/com/djrapitops/plan/utilities/html/HtmlStructure.java +++ b/Plan/src/main/java/com/djrapitops/plan/utilities/html/HtmlStructure.java @@ -62,8 +62,8 @@ public class HtmlStructure { public static String createServerOverviewColumn(Map> sessions) { StringBuilder builder = new StringBuilder("
"); if (Verify.isEmpty(sessions)) { - return "

No Sessions

" + - "

No sessions to calculate server specific playtime.

"; + return "

No Sessions

" + + "

No sessions to calculate server specific playtime.

"; } for (Map.Entry> entry : sessions.entrySet()) { String serverName = entry.getKey(); @@ -409,7 +409,6 @@ public class HtmlStructure { int online = plugin.getServer().getOnlinePlayers().size(); Optional analysisRefreshDate = ((BukkitInformationManager) plugin.getInfoManager()).getAnalysisRefreshDate(); String refresh = analysisRefreshDate.map(FormatUtils::formatTimeStamp).orElse("-"); - boolean analysisIsAvailable = analysisRefreshDate.isPresent(); String serverName = plugin.getServerInfoManager().getServerName(); String address = "../server/" + serverName; @@ -427,14 +426,9 @@ public class HtmlStructure { // Footer b.append("

Last Refresh: ").append(refresh).append("

"); - if (analysisIsAvailable) { - b.append("Analysis"); - } else { - b.append("Analysis"); - } + b.append("Analysis"); - b.append("
") - .append("
"); + b.append("").append(""); return b.toString(); } diff --git a/Plan/src/main/java/com/djrapitops/plan/utilities/html/HtmlUtils.java b/Plan/src/main/java/com/djrapitops/plan/utilities/html/HtmlUtils.java index 19a2973bb..405963961 100644 --- a/Plan/src/main/java/com/djrapitops/plan/utilities/html/HtmlUtils.java +++ b/Plan/src/main/java/com/djrapitops/plan/utilities/html/HtmlUtils.java @@ -4,7 +4,6 @@ import main.java.com.djrapitops.plan.Plan; import main.java.com.djrapitops.plan.Settings; import main.java.com.djrapitops.plan.systems.webserver.WebServer; import main.java.com.djrapitops.plan.utilities.MiscUtils; -import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.text.StrSubstitutor; import java.io.Serializable; @@ -60,7 +59,7 @@ public class HtmlUtils { } public static String getRelativeInspectUrl(UUID uuid) { - return getRelativeInspectUrl(Plan.getInstance().getDataCache().getName(uuid)); + return Plan.getPlanAPI().getPlayerInspectPageLink(Plan.getInstance().getDataCache().getName(uuid)); } /** @@ -68,7 +67,7 @@ public class HtmlUtils { * @return */ public static String removeXSS(String string) { - return StringUtils.removeAll(string, "()|()"); + return string.replace("", "").replace("", ""); } /** @@ -89,7 +88,7 @@ public class HtmlUtils { string = Html.SPAN.parse(string); } - return StringUtils.remove(string, "§r"); + return string.replace("§r", ""); } public static String separateWithQuotes(String... strings) { diff --git a/Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/WorldPieCreator.java b/Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/WorldPieCreator.java index c2c3e9ed2..69be40d59 100644 --- a/Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/WorldPieCreator.java +++ b/Plan/src/main/java/com/djrapitops/plan/utilities/html/graphs/WorldPieCreator.java @@ -21,6 +21,7 @@ public class WorldPieCreator { public static String[] createSeriesData(WorldTimes worldTimes) { StringBuilder seriesBuilder = new StringBuilder("["); int i = 0; + // WorldTimes Map (GMTimes.getTotal) Map playtimePerWorld = worldTimes.getWorldTimes().entrySet().stream() .collect(Collectors.toMap(Map.Entry::getKey, entry -> entry.getValue().getTotal())); diff --git a/Plan/src/main/java/com/djrapitops/plan/utilities/html/tables/KillsTableCreator.java b/Plan/src/main/java/com/djrapitops/plan/utilities/html/tables/KillsTableCreator.java index 3bab60937..ad7572ce6 100644 --- a/Plan/src/main/java/com/djrapitops/plan/utilities/html/tables/KillsTableCreator.java +++ b/Plan/src/main/java/com/djrapitops/plan/utilities/html/tables/KillsTableCreator.java @@ -7,7 +7,6 @@ import main.java.com.djrapitops.plan.locale.Msg; import main.java.com.djrapitops.plan.utilities.FormatUtils; import main.java.com.djrapitops.plan.utilities.comparators.KillDataComparator; import main.java.com.djrapitops.plan.utilities.html.Html; -import main.java.com.djrapitops.plan.utilities.html.HtmlUtils; import java.util.Collections; import java.util.List; @@ -48,7 +47,7 @@ public class KillsTableCreator { String name = Plan.getInstance().getDataCache().getName(kill.getVictim()); html.append(Html.TABLELINE_3_CUSTOMKEY_1.parse( String.valueOf(date), FormatUtils.formatTimeStamp(date), - Html.LINK.parse(HtmlUtils.getRelativeInspectUrl(name), name), + Html.LINK.parse(Plan.getPlanAPI().getPlayerInspectPageLink(name), name), kill.getWeapon() )); diff --git a/Plan/src/main/java/com/djrapitops/plan/utilities/html/tables/PlayersTableCreator.java b/Plan/src/main/java/com/djrapitops/plan/utilities/html/tables/PlayersTableCreator.java index 8b64711c2..0ad298c85 100644 --- a/Plan/src/main/java/com/djrapitops/plan/utilities/html/tables/PlayersTableCreator.java +++ b/Plan/src/main/java/com/djrapitops/plan/utilities/html/tables/PlayersTableCreator.java @@ -1,5 +1,6 @@ package main.java.com.djrapitops.plan.utilities.html.tables; +import main.java.com.djrapitops.plan.Plan; import main.java.com.djrapitops.plan.data.Session; import main.java.com.djrapitops.plan.data.UserInfo; import main.java.com.djrapitops.plan.data.analysis.GeolocationPart; @@ -8,7 +9,6 @@ import main.java.com.djrapitops.plan.utilities.FormatUtils; import main.java.com.djrapitops.plan.utilities.MiscUtils; import main.java.com.djrapitops.plan.utilities.analysis.AnalysisUtils; import main.java.com.djrapitops.plan.utilities.html.Html; -import main.java.com.djrapitops.plan.utilities.html.HtmlUtils; import java.util.List; import java.util.Map; @@ -69,7 +69,7 @@ public class PlayersTableCreator { geoLocation = "Not Known"; } html.append(Html.TABLELINE_PLAYERS.parse( - Html.LINK.parse(HtmlUtils.getRelativeInspectUrl(user.getName()), user.getName()), + Html.LINK.parse(Plan.getPlanAPI().getPlayerInspectPageLink(user.getName()), user.getName()), activityString, String.valueOf(playtime), FormatUtils.formatTimeAmount(playtime), String.valueOf(loginTimes), diff --git a/Plan/src/main/java/com/djrapitops/plan/utilities/html/tables/SessionsTableCreator.java b/Plan/src/main/java/com/djrapitops/plan/utilities/html/tables/SessionsTableCreator.java index 5f3209609..d29b6b4aa 100644 --- a/Plan/src/main/java/com/djrapitops/plan/utilities/html/tables/SessionsTableCreator.java +++ b/Plan/src/main/java/com/djrapitops/plan/utilities/html/tables/SessionsTableCreator.java @@ -13,7 +13,6 @@ import main.java.com.djrapitops.plan.systems.cache.DataCache; import main.java.com.djrapitops.plan.utilities.FormatUtils; import main.java.com.djrapitops.plan.utilities.comparators.SessionStartComparator; import main.java.com.djrapitops.plan.utilities.html.Html; -import main.java.com.djrapitops.plan.utilities.html.HtmlUtils; import java.util.*; @@ -72,7 +71,7 @@ public class SessionsTableCreator { String length = session.getSessionEnd() != -1 ? FormatUtils.formatTimeAmount(session.getLength()) : "Online"; String world = getLongestWorldPlayed(session); - String inspectUrl = HtmlUtils.getRelativeInspectUrl(name); + String inspectUrl = Plan.getPlanAPI().getPlayerInspectPageLink(name); sessionTableBuilder.append(Html.TABLELINE_4.parse( Html.LINK.parse(inspectUrl, name), start, diff --git a/Plan/src/main/resources/bungee.yml b/Plan/src/main/resources/bungee.yml index b1fc297da..cb8929831 100644 --- a/Plan/src/main/resources/bungee.yml +++ b/Plan/src/main/resources/bungee.yml @@ -1,4 +1,4 @@ name: Plan author: Rsl1122 main: main.java.com.djrapitops.plan.PlanBungee -version: 4.0.0 \ No newline at end of file +version: 4.0.1 \ No newline at end of file diff --git a/Plan/src/main/resources/config.yml b/Plan/src/main/resources/config.yml index 0faaa7431..7249d792a 100644 --- a/Plan/src/main/resources/config.yml +++ b/Plan/src/main/resources/config.yml @@ -50,6 +50,7 @@ Data: CombineCommandAliases: true Customization: + UseServerTime: true Formatting: DecimalPoints: '#.##' TimeAmount: diff --git a/Plan/src/main/resources/plugin.yml b/Plan/src/main/resources/plugin.yml index 153ce3dba..1e0956e43 100644 --- a/Plan/src/main/resources/plugin.yml +++ b/Plan/src/main/resources/plugin.yml @@ -1,7 +1,7 @@ name: Plan author: Rsl1122 main: main.java.com.djrapitops.plan.Plan -version: 4.0.0 +version: 4.0.1 softdepend: - OnTime - EssentialsX diff --git a/Plan/test/main/java/com/djrapitops/plan/database/DatabaseTest.java b/Plan/test/main/java/com/djrapitops/plan/database/DatabaseTest.java index cdb4fb159..be14a4597 100644 --- a/Plan/test/main/java/com/djrapitops/plan/database/DatabaseTest.java +++ b/Plan/test/main/java/com/djrapitops/plan/database/DatabaseTest.java @@ -14,7 +14,9 @@ import main.java.com.djrapitops.plan.database.databases.MySQLDB; import main.java.com.djrapitops.plan.database.databases.SQLDB; import main.java.com.djrapitops.plan.database.databases.SQLiteDB; import main.java.com.djrapitops.plan.database.tables.*; +import main.java.com.djrapitops.plan.systems.cache.DataCache; import main.java.com.djrapitops.plan.systems.info.server.ServerInfo; +import main.java.com.djrapitops.plan.systems.processing.player.RegisterProcessor; import main.java.com.djrapitops.plan.utilities.ManageUtils; import main.java.com.djrapitops.plan.utilities.MiscUtils; import main.java.com.djrapitops.plan.utilities.analysis.MathUtils; @@ -38,6 +40,7 @@ import java.sql.SQLException; import java.util.*; import static org.junit.Assert.*; +import static org.powermock.api.mockito.PowerMockito.when; /** * @author Rsl1122 @@ -62,6 +65,14 @@ public class DatabaseTest { db = new SQLiteDB(plan, "debug" + MiscUtils.getTime()); db.init(); + when(plan.getDB()).thenReturn(db); + DataCache dataCache = new DataCache(plan) { + @Override + public void markFirstSession(UUID uuid) { + } + }; + when(plan.getDataCache()).thenReturn(dataCache); + db.getServerTable().saveCurrentServerInfo(new ServerInfo(-1, TestInit.getServerUUID(), "ServerName", "", 20)); File f = new File(plan.getDataFolder(), "Errors.txt"); @@ -849,4 +860,13 @@ public class DatabaseTest { assertEquals(worldTimes, allSessions.get(serverUUID).get(uuid).get(0).getWorldTimes()); } + + @Test + public void testRegisterProcessorRegisterException() throws SQLException { + for (int i = 0; i < 200; i++) { + new RegisterProcessor(uuid, 500L, 1000L, "name", 4).process(); + } + assertTrue(db.getUsersTable().isRegistered(uuid)); + assertTrue(db.getUserInfoTable().isRegistered(uuid)); + } } diff --git a/PlanPluginBridge/src/main/java/com/djrapitops/pluginbridge/plan/advancedachievements/AdvancedAchievementsTable.java b/PlanPluginBridge/src/main/java/com/djrapitops/pluginbridge/plan/advancedachievements/AdvancedAchievementsTable.java index a7a4aab6d..2830f8ce4 100644 --- a/PlanPluginBridge/src/main/java/com/djrapitops/pluginbridge/plan/advancedachievements/AdvancedAchievementsTable.java +++ b/PlanPluginBridge/src/main/java/com/djrapitops/pluginbridge/plan/advancedachievements/AdvancedAchievementsTable.java @@ -5,7 +5,6 @@ import main.java.com.djrapitops.plan.Plan; import main.java.com.djrapitops.plan.data.additional.AnalysisType; import main.java.com.djrapitops.plan.data.additional.PluginData; import main.java.com.djrapitops.plan.utilities.html.Html; -import main.java.com.djrapitops.plan.utilities.html.HtmlUtils; import java.io.Serializable; import java.util.Map; @@ -62,7 +61,7 @@ public class AdvancedAchievementsTable extends PluginData { private void appendTableLinesForLessThanV520(Set users, StringBuilder html) { users.forEach(uuid -> { String name = super.getNameOf(uuid); - String inspectUrl = HtmlUtils.getRelativeInspectUrl(name); + String inspectUrl = Plan.getPlanAPI().getPlayerInspectPageLink(name); int achievements = aaAPI.getPlayerTotalAchievements(uuid); html.append(Html.TABLELINE_2.parse(Html.LINK.parse(inspectUrl, name), achievements)); }); @@ -74,7 +73,7 @@ public class AdvancedAchievementsTable extends PluginData { UUID uuid = entry.getKey(); int achievements = entry.getValue(); String name = getNameOf(uuid); - String inspectUrl = HtmlUtils.getRelativeInspectUrl(name); + String inspectUrl = Plan.getPlanAPI().getPlayerInspectPageLink(name); html.append(Html.TABLELINE_2.parse(Html.LINK.parse(inspectUrl, name), achievements)); } } diff --git a/PlanPluginBridge/src/main/java/com/djrapitops/pluginbridge/plan/factions/FactionsTable.java b/PlanPluginBridge/src/main/java/com/djrapitops/pluginbridge/plan/factions/FactionsTable.java index 5b98752b7..23979963c 100644 --- a/PlanPluginBridge/src/main/java/com/djrapitops/pluginbridge/plan/factions/FactionsTable.java +++ b/PlanPluginBridge/src/main/java/com/djrapitops/pluginbridge/plan/factions/FactionsTable.java @@ -3,12 +3,12 @@ package com.djrapitops.pluginbridge.plan.factions; import com.massivecraft.factions.entity.Faction; import com.massivecraft.factions.entity.FactionColl; import com.massivecraft.factions.entity.MPlayer; +import main.java.com.djrapitops.plan.Plan; import main.java.com.djrapitops.plan.Settings; import main.java.com.djrapitops.plan.data.additional.AnalysisType; import main.java.com.djrapitops.plan.data.additional.PluginData; import main.java.com.djrapitops.plan.utilities.FormatUtils; import main.java.com.djrapitops.plan.utilities.html.Html; -import main.java.com.djrapitops.plan.utilities.html.HtmlUtils; import java.io.Serializable; import java.util.ArrayList; @@ -73,7 +73,7 @@ public class FactionsTable extends PluginData { if (f != null) { MPlayer fLeader = f.getLeader(); String leader = fLeader != null ? fLeader.getNameAndSomething("", "") : "No Leader"; - String leaderPage = Html.LINK.parse(HtmlUtils.getRelativeInspectUrl(leader), leader); + String leaderPage = Html.LINK.parse(Plan.getPlanAPI().getPlayerInspectPageLink(leader), leader); html.append(Html.TABLELINE_4.parse( f.getName(), FormatUtils.cutDecimals(f.getPower()), diff --git a/PlanPluginBridge/src/main/java/com/djrapitops/pluginbridge/plan/litebans/LiteBansBansTable.java b/PlanPluginBridge/src/main/java/com/djrapitops/pluginbridge/plan/litebans/LiteBansBansTable.java index 63fddaff4..e83944a85 100644 --- a/PlanPluginBridge/src/main/java/com/djrapitops/pluginbridge/plan/litebans/LiteBansBansTable.java +++ b/PlanPluginBridge/src/main/java/com/djrapitops/pluginbridge/plan/litebans/LiteBansBansTable.java @@ -1,10 +1,10 @@ package com.djrapitops.pluginbridge.plan.litebans; +import main.java.com.djrapitops.plan.Plan; import main.java.com.djrapitops.plan.data.additional.AnalysisType; import main.java.com.djrapitops.plan.data.additional.PluginData; import main.java.com.djrapitops.plan.utilities.FormatUtils; import main.java.com.djrapitops.plan.utilities.html.Html; -import main.java.com.djrapitops.plan.utilities.html.HtmlUtils; import java.io.Serializable; import java.sql.SQLException; @@ -58,8 +58,8 @@ public class LiteBansBansTable extends PluginData { long expiry = ban.getExpiry(); String expires = expiry <= 0 ? "Never" : FormatUtils.formatTimeStampSecond(expiry); html.append(tableLine - .replace("REPLACE0", Html.LINK.parse(HtmlUtils.getRelativeInspectUrl(name), name)) - .replace("REPLACE1", Html.LINK.parse(HtmlUtils.getRelativeInspectUrl(ban.getBannedBy()), ban.getBannedBy())) + .replace("REPLACE0", Html.LINK.parse(Plan.getPlanAPI().getPlayerInspectPageLink(name), name)) + .replace("REPLACE1", Html.LINK.parse(Plan.getPlanAPI().getPlayerInspectPageLink(ban.getBannedBy()), ban.getBannedBy())) .replace("REPLACE2", ban.getReason()) .replace("REPLACE3", expiry <= 0 ? "0" : Long.toString(expiry)) .replace("REPLACE4", expires diff --git a/PlanPluginBridge/src/main/java/com/djrapitops/pluginbridge/plan/litebans/LiteBansInspectBansTable.java b/PlanPluginBridge/src/main/java/com/djrapitops/pluginbridge/plan/litebans/LiteBansInspectBansTable.java index 639dcf6fc..843c65422 100644 --- a/PlanPluginBridge/src/main/java/com/djrapitops/pluginbridge/plan/litebans/LiteBansInspectBansTable.java +++ b/PlanPluginBridge/src/main/java/com/djrapitops/pluginbridge/plan/litebans/LiteBansInspectBansTable.java @@ -1,9 +1,9 @@ package com.djrapitops.pluginbridge.plan.litebans; +import main.java.com.djrapitops.plan.Plan; import main.java.com.djrapitops.plan.data.additional.PluginData; import main.java.com.djrapitops.plan.utilities.FormatUtils; import main.java.com.djrapitops.plan.utilities.html.Html; -import main.java.com.djrapitops.plan.utilities.html.HtmlUtils; import java.io.Serializable; import java.sql.SQLException; @@ -58,7 +58,7 @@ public class LiteBansInspectBansTable extends PluginData { html.append(Html.TABLELINE_3_CUSTOMKEY_1.parse( expiry <= 0 ? "0" : Long.toString(expiry), expires, - Html.LINK.parse("." + HtmlUtils.getRelativeInspectUrl(ban.getBannedBy()), ban.getBannedBy()), + Html.LINK.parse(Plan.getPlanAPI().getPlayerInspectPageLink(ban.getBannedBy()), ban.getBannedBy()), ban.getReason()) ); } diff --git a/PlanPluginBridge/src/main/java/com/djrapitops/pluginbridge/plan/superbvote/SuperbVoteVotesTable.java b/PlanPluginBridge/src/main/java/com/djrapitops/pluginbridge/plan/superbvote/SuperbVoteVotesTable.java index 7289aa42a..52ff1a01d 100644 --- a/PlanPluginBridge/src/main/java/com/djrapitops/pluginbridge/plan/superbvote/SuperbVoteVotesTable.java +++ b/PlanPluginBridge/src/main/java/com/djrapitops/pluginbridge/plan/superbvote/SuperbVoteVotesTable.java @@ -6,11 +6,11 @@ package com.djrapitops.pluginbridge.plan.superbvote; import io.minimum.minecraft.superbvote.storage.VoteStorage; +import main.java.com.djrapitops.plan.Plan; import main.java.com.djrapitops.plan.data.additional.AnalysisType; import main.java.com.djrapitops.plan.data.additional.PluginData; import main.java.com.djrapitops.plan.utilities.FormatUtils; import main.java.com.djrapitops.plan.utilities.html.Html; -import main.java.com.djrapitops.plan.utilities.html.HtmlUtils; import java.io.Serializable; import java.util.UUID; @@ -50,7 +50,7 @@ public class SuperbVoteVotesTable extends PluginData { getUUIDsBeingAnalyzed() .forEach(uuid -> { String name = getNameOf(uuid); - String link = Html.LINK.parse(HtmlUtils.getRelativeInspectUrl(name), name); + String link = Html.LINK.parse(Plan.getPlanAPI().getPlayerInspectPageLink(name), name); String bal = FormatUtils.cutDecimals(store.getVotes(uuid)); html.append(Html.TABLELINE_2.parse(link, bal)); }); diff --git a/PlanPluginBridge/src/main/java/com/djrapitops/pluginbridge/plan/towny/TownyTable.java b/PlanPluginBridge/src/main/java/com/djrapitops/pluginbridge/plan/towny/TownyTable.java index 429bee167..f0997551e 100644 --- a/PlanPluginBridge/src/main/java/com/djrapitops/pluginbridge/plan/towny/TownyTable.java +++ b/PlanPluginBridge/src/main/java/com/djrapitops/pluginbridge/plan/towny/TownyTable.java @@ -4,11 +4,11 @@ import com.massivecraft.factions.entity.MPlayer; import com.palmergames.bukkit.towny.object.Resident; import com.palmergames.bukkit.towny.object.Town; import com.palmergames.bukkit.towny.object.TownyUniverse; +import main.java.com.djrapitops.plan.Plan; import main.java.com.djrapitops.plan.Settings; import main.java.com.djrapitops.plan.data.additional.AnalysisType; import main.java.com.djrapitops.plan.data.additional.PluginData; import main.java.com.djrapitops.plan.utilities.html.Html; -import main.java.com.djrapitops.plan.utilities.html.HtmlUtils; import java.io.Serializable; import java.util.List; @@ -61,7 +61,7 @@ public class TownyTable extends PluginData { } int residents = t.getNumResidents(); int land = t.getPurchasedBlocks(); - String leaderPage = Html.LINK.parse(HtmlUtils.getRelativeInspectUrl(mayor), mayor); + String leaderPage = Html.LINK.parse(Plan.getPlanAPI().getPlayerInspectPageLink(mayor), mayor); html.append(Html.TABLELINE_4.parse(name, residents, land, leaderPage)); } } diff --git a/PlanPluginBridge/src/main/java/com/djrapitops/pluginbridge/plan/vault/EconomyBalanceTable.java b/PlanPluginBridge/src/main/java/com/djrapitops/pluginbridge/plan/vault/EconomyBalanceTable.java index b318bcd4a..7da9303f7 100644 --- a/PlanPluginBridge/src/main/java/com/djrapitops/pluginbridge/plan/vault/EconomyBalanceTable.java +++ b/PlanPluginBridge/src/main/java/com/djrapitops/pluginbridge/plan/vault/EconomyBalanceTable.java @@ -6,11 +6,11 @@ package com.djrapitops.pluginbridge.plan.vault; import com.djrapitops.pluginbridge.plan.FakeOfflinePlayer; +import main.java.com.djrapitops.plan.Plan; import main.java.com.djrapitops.plan.data.additional.AnalysisType; import main.java.com.djrapitops.plan.data.additional.PluginData; import main.java.com.djrapitops.plan.utilities.FormatUtils; import main.java.com.djrapitops.plan.utilities.html.Html; -import main.java.com.djrapitops.plan.utilities.html.HtmlUtils; import net.milkbowl.vault.economy.Economy; import java.io.Serializable; @@ -50,7 +50,7 @@ public class EconomyBalanceTable extends PluginData { StringBuilder html = new StringBuilder(); getUUIDsBeingAnalyzed().forEach(uuid -> { String name = getNameOf(uuid); - String link = Html.LINK.parse(HtmlUtils.getRelativeInspectUrl(name), name); + String link = Html.LINK.parse(Plan.getPlanAPI().getPlayerInspectPageLink(name), name); String bal = FormatUtils.cutDecimals(econ.getBalance(new FakeOfflinePlayer(uuid, name))); html.append(Html.TABLELINE_2.parse(link, bal)); }); diff --git a/PlanPluginBridge/src/main/java/com/djrapitops/pluginbridge/plan/vault/PermGroupTable.java b/PlanPluginBridge/src/main/java/com/djrapitops/pluginbridge/plan/vault/PermGroupTable.java index 539e9efa6..e6cc0b86a 100644 --- a/PlanPluginBridge/src/main/java/com/djrapitops/pluginbridge/plan/vault/PermGroupTable.java +++ b/PlanPluginBridge/src/main/java/com/djrapitops/pluginbridge/plan/vault/PermGroupTable.java @@ -6,6 +6,7 @@ package com.djrapitops.pluginbridge.plan.vault; import com.djrapitops.plugin.utilities.Format; +import com.djrapitops.plugin.utilities.Verify; import com.djrapitops.pluginbridge.plan.FakeOfflinePlayer; import main.java.com.djrapitops.plan.data.additional.AnalysisType; import main.java.com.djrapitops.plan.data.additional.PluginData; @@ -56,6 +57,9 @@ public class PermGroupTable extends PluginData { .map(uuid -> new FakeOfflinePlayer(uuid, getNameOf(uuid))).collect(Collectors.toList()); for (OfflinePlayer p : userData) { String group = permSys.getPrimaryGroup(null, p); + if (Verify.isEmpty(group)) { + continue; + } if (!groups.containsKey(group)) { groups.put(group, 0); }