Merge pull request #314 from Rsl1122/4.0.1

4.0.1
This commit is contained in:
Rsl1122 2017-10-02 19:04:56 +03:00 committed by GitHub
commit 2b6b27b1e3
37 changed files with 197 additions and 89 deletions

View File

@ -172,7 +172,7 @@ public class Plan extends BukkitPlugin<Plan> 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<Plan> 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));

View File

@ -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"),

View File

@ -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();

View File

@ -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");

View File

@ -144,7 +144,7 @@ public class ActivityPart extends RawData {
}
public Map<Long, Integer> 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<String> getRecentPlayers() {

View File

@ -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<UserInfo> getServerUserInfo(UUID serverUUID) throws SQLException {
PreparedStatement statement = null;
ResultSet set = null;
try (Connection connection = getConnection()){
try (Connection connection = getConnection()) {
List<UserInfo> 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<UUID, List<UserInfo>> 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<UUID, Set<UUID>> 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();

View File

@ -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<Long> 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);
}
}
}

View File

@ -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));
}
}

View File

@ -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<Long> 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)" : "";

View File

@ -98,6 +98,7 @@ public class BungeeServerInfoManager {
connectedToServer(server);
return true;
} catch (WebAPIException e) {
Log.debug(e.toString());
serverHasGoneOffline(server.getUuid());
return false;
}

View File

@ -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) {

View File

@ -42,7 +42,11 @@ public abstract class Consumer<T> extends AbsRunnable {
protected void stop() {
run = false;
super.cancel();
try {
super.cancel();
} catch (NullPointerException ignore) {
/*ignored*/
}
}
protected abstract void clearVariables();

View File

@ -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.<br>Use /plan analyze to cache the Data.";
PageCache.loadPage("notFound: " + error, () -> new NotFoundResponse(error));
}
return PageCache.loadPage("analysisPage:" + serverUUID, () -> new AnalysisPageResponse(plugin.getInfoManager()));
}

View File

@ -187,6 +187,7 @@ public class WebServer {
if (server != null) {
server.stop(0);
}
enabled = false;
}
public String getProtocol() {

View File

@ -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("<i class=\"fa fa-refresh fa-spin\" aria-hidden=\"true\"></i> 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);
}
}

View File

@ -32,7 +32,7 @@ public class ErrorResponse extends Response {
}
}
protected void replacePlaceholders() {
public void replacePlaceholders() {
Map<String, String> placeHolders = new HashMap<>();
placeHolders.put("title", title);
placeHolders.put("paragraph", paragraph);

View File

@ -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("<td>").append(link).append("</td>");

View File

@ -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;
}
/**

View File

@ -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("<meta http-equiv=\"refresh\" content=\"25\" /><i class=\"fa fa-refresh fa-spin\" aria-hidden=\"true\"></i> 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> userInfo = db.getUserInfoTable().getServerUserInfo();
List<UserInfo> userInfo = db.getUserInfoTable().getServerUserInfo().stream().distinct().collect(Collectors.toList());
for (UserInfo user : userInfo) {
if (user.isBanned()) {

View File

@ -62,8 +62,8 @@ public class HtmlStructure {
public static String createServerOverviewColumn(Map<String, List<Session>> sessions) {
StringBuilder builder = new StringBuilder("<div class=\"column\">");
if (Verify.isEmpty(sessions)) {
return "<div class=\"box-header\"><h2><i class=\"fa fa-server\" aria-hidden=\"true\"></i> No Sessions</h2> </div>" +
"<div class=\"box\" style=\"margin-bottom: 5px;\"><p>No sessions to calculate server specific playtime.</p></div>";
return "<div class=\"column\"><div class=\"box-header\"><h2><i class=\"fa fa-server\" aria-hidden=\"true\"></i> No Sessions</h2> </div>" +
"<div class=\"box\" style=\"margin-bottom: 5px;\"><p>No sessions to calculate server specific playtime.</p></div></div>";
}
for (Map.Entry<String, List<Session>> entry : sessions.entrySet()) {
String serverName = entry.getKey();
@ -409,7 +409,6 @@ public class HtmlStructure {
int online = plugin.getServer().getOnlinePlayers().size();
Optional<Long> 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("<div class=\"box-footer\"><p>Last Refresh: ").append(refresh).append("</p>");
if (analysisIsAvailable) {
b.append("<a href=\"").append(address).append("\" class=\"button right\">Analysis</a>");
} else {
b.append("<a class=\"button disabled right\">Analysis</a>");
}
b.append("<a href=\"").append(address).append("\" class=\"button right\">Analysis</a>");
b.append("</div>")
.append("</div>");
b.append("</div>").append("</div>");
return b.toString();
}

View File

@ -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, "(<!--)|(-->)|(</?script>)");
return string.replace("<!--", "").replace("-->", "").replace("</script>", "");
}
/**
@ -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) {

View File

@ -21,6 +21,7 @@ public class WorldPieCreator {
public static String[] createSeriesData(WorldTimes worldTimes) {
StringBuilder seriesBuilder = new StringBuilder("[");
int i = 0;
// WorldTimes Map<String, GMTimes> (GMTimes.getTotal)
Map<String, Long> playtimePerWorld = worldTimes.getWorldTimes().entrySet().stream()
.collect(Collectors.toMap(Map.Entry::getKey, entry -> entry.getValue().getTotal()));

View File

@ -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()
));

View File

@ -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),

View File

@ -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,

View File

@ -1,4 +1,4 @@
name: Plan
author: Rsl1122
main: main.java.com.djrapitops.plan.PlanBungee
version: 4.0.0
version: 4.0.1

View File

@ -50,6 +50,7 @@ Data:
CombineCommandAliases: true
Customization:
UseServerTime: true
Formatting:
DecimalPoints: '#.##'
TimeAmount:

View File

@ -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

View File

@ -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));
}
}

View File

@ -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<UUID> 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));
}
}

View File

@ -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()),

View File

@ -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

View File

@ -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())
);
}

View File

@ -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));
});

View File

@ -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));
}
}

View File

@ -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));
});

View File

@ -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);
}