Merge pull request #182 from Fuzzlemann/master

Some more modifications & bugfixes
This commit is contained in:
Rsl1122 2017-07-25 07:54:12 +03:00 committed by GitHub
commit 4c570520b8
57 changed files with 469 additions and 464 deletions

View File

@ -5,7 +5,7 @@ import java.util.Collection;
/** /**
* This class manages the messages going to the Console Logger. * This class manages the messages going to the Console Logger.
* *
* Methods of Abtract Plugin Framework log utility are used. * Methods of Abstract Plugin Framework log utility are used.
* *
* @author Rsl1122 * @author Rsl1122
* @since 3.0.0 * @since 3.0.0
@ -22,7 +22,7 @@ public class Log {
} }
/** /**
* Sends a message to the console with the chatcolors. * Sends a message to the console with the ChatColors.
* *
* @param message Message to send. * @param message Message to send.
*/ */

View File

@ -25,26 +25,17 @@ import com.djrapitops.plugin.settings.ColorScheme;
import com.djrapitops.plugin.task.AbsRunnable; import com.djrapitops.plugin.task.AbsRunnable;
import com.djrapitops.plugin.task.ITask; import com.djrapitops.plugin.task.ITask;
import com.djrapitops.plugin.utilities.Verify; import com.djrapitops.plugin.utilities.Verify;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.URL;
import java.util.HashSet;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import main.java.com.djrapitops.plan.api.API; import main.java.com.djrapitops.plan.api.API;
import main.java.com.djrapitops.plan.command.PlanCommand; import main.java.com.djrapitops.plan.command.PlanCommand;
import main.java.com.djrapitops.plan.command.commands.RegisterCommandFilter; import main.java.com.djrapitops.plan.command.commands.RegisterCommandFilter;
import main.java.com.djrapitops.plan.data.additional.HookHandler; import main.java.com.djrapitops.plan.data.additional.HookHandler;
import main.java.com.djrapitops.plan.data.cache.*; import main.java.com.djrapitops.plan.data.cache.AnalysisCacheHandler;
import main.java.com.djrapitops.plan.data.cache.DataCacheHandler;
import main.java.com.djrapitops.plan.data.cache.InspectCacheHandler;
import main.java.com.djrapitops.plan.data.listeners.*; import main.java.com.djrapitops.plan.data.listeners.*;
import main.java.com.djrapitops.plan.database.Database; import main.java.com.djrapitops.plan.database.Database;
import main.java.com.djrapitops.plan.database.databases.*; import main.java.com.djrapitops.plan.database.databases.MySQLDB;
import main.java.com.djrapitops.plan.database.databases.SQLiteDB;
import main.java.com.djrapitops.plan.ui.html.Html; import main.java.com.djrapitops.plan.ui.html.Html;
import main.java.com.djrapitops.plan.ui.webserver.WebSocketServer; import main.java.com.djrapitops.plan.ui.webserver.WebSocketServer;
import main.java.com.djrapitops.plan.utilities.Benchmark; import main.java.com.djrapitops.plan.utilities.Benchmark;
@ -52,6 +43,12 @@ import main.java.com.djrapitops.plan.utilities.Check;
import main.java.com.djrapitops.plan.utilities.MiscUtils; import main.java.com.djrapitops.plan.utilities.MiscUtils;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import java.io.*;
import java.net.URL;
import java.util.HashSet;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
/** /**
* Main class for Bukkit that manages the plugin. * Main class for Bukkit that manages the plugin.
* *
@ -335,7 +332,7 @@ public class Plan extends BukkitPlugin<Plan> {
URL localeURL = new URL("https://raw.githubusercontent.com/Rsl1122/Plan-PlayerAnalytics/master/Plan/localization/locale_" + locale + ".txt"); URL localeURL = new URL("https://raw.githubusercontent.com/Rsl1122/Plan-PlayerAnalytics/master/Plan/localization/locale_" + locale + ".txt");
InputStream inputStream = localeURL.openStream(); InputStream inputStream = localeURL.openStream();
OutputStream outputStream = new FileOutputStream(localeFile); OutputStream outputStream = new FileOutputStream(localeFile);
int read = 0; int read;
byte[] bytes = new byte[1024]; byte[] bytes = new byte[1024];
while ((read = inputStream.read(bytes)) != -1) { while ((read = inputStream.read(bytes)) != -1) {
outputStream.write(bytes, 0, read); outputStream.write(bytes, 0, read);

View File

@ -23,6 +23,7 @@ public enum Settings {
GATHERKILLS("Settings.Data.GatherKillData"), GATHERKILLS("Settings.Data.GatherKillData"),
GATHERGMTIMES("Settings.Data.GamemodeChangeListener"), GATHERGMTIMES("Settings.Data.GamemodeChangeListener"),
GATHERCOMMANDS("Settings.Data.GatherCommandUsage"), GATHERCOMMANDS("Settings.Data.GatherCommandUsage"),
DO_NOT_LOG_UNKNOWN_COMMANDS("Customization.Data.DoNotLogUnknownCommands"),
SECURITY_IP_UUID("Settings.WebServer.Security.DisplayIPsAndUUIDs"), SECURITY_IP_UUID("Settings.WebServer.Security.DisplayIPsAndUUIDs"),
GRAPH_PLAYERS_USEMAXPLAYERS_SCALE("Customization.Graphs.PlayersOnlineGraph.UseMaxPlayersAsScale"), GRAPH_PLAYERS_USEMAXPLAYERS_SCALE("Customization.Graphs.PlayersOnlineGraph.UseMaxPlayersAsScale"),
PLAYERLIST_SHOW_IMAGES("Customization.SmallHeadImagesOnAnalysisPlayerlist"), PLAYERLIST_SHOW_IMAGES("Customization.SmallHeadImagesOnAnalysisPlayerlist"),

View File

@ -4,13 +4,6 @@ import com.djrapitops.plugin.utilities.Verify;
import com.djrapitops.plugin.utilities.player.Fetch; import com.djrapitops.plugin.utilities.player.Fetch;
import com.djrapitops.plugin.utilities.player.IOfflinePlayer; import com.djrapitops.plugin.utilities.player.IOfflinePlayer;
import com.djrapitops.plugin.utilities.player.UUIDFetcher; import com.djrapitops.plugin.utilities.player.UUIDFetcher;
import java.sql.SQLException;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import java.util.function.Function;
import java.util.stream.Collectors;
import main.java.com.djrapitops.plan.Plan; import main.java.com.djrapitops.plan.Plan;
import main.java.com.djrapitops.plan.data.AnalysisData; import main.java.com.djrapitops.plan.data.AnalysisData;
import main.java.com.djrapitops.plan.data.UserData; import main.java.com.djrapitops.plan.data.UserData;
@ -22,15 +15,23 @@ import main.java.com.djrapitops.plan.ui.html.DataRequestHandler;
import main.java.com.djrapitops.plan.ui.webserver.WebSocketServer; import main.java.com.djrapitops.plan.ui.webserver.WebSocketServer;
import main.java.com.djrapitops.plan.utilities.HtmlUtils; import main.java.com.djrapitops.plan.utilities.HtmlUtils;
import java.sql.SQLException;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import java.util.function.Function;
import java.util.stream.Collectors;
/** /**
* This class contains the API methods. * This class contains the API methods.
* *
* Methods can be called from Asyncronous task and are thread safe unless * Methods can be called from Asynchronous task and are thread safe unless
* otherwise stated. * otherwise stated.
* *
* Use Plan.getPlanAPI() to get the API. * Use Plan.getPlanAPI() to get the API.
* *
* More information about API methods can be found on Github. * More information about API methods can be found on GitHub.
* *
* @author Rsl1122 * @author Rsl1122
* @since 2.0.0 * @since 2.0.0
@ -44,7 +45,7 @@ public class API {
private final Plan plugin; private final Plan plugin;
/** /**
* Class Construcor. * Class Constructor.
* *
* @param plugin Current instance of Plan * @param plugin Current instance of Plan
*/ */
@ -65,7 +66,7 @@ public class API {
* Add a source of plugin data to the Plugins tab on Analysis and/or Inspect * Add a source of plugin data to the Plugins tab on Analysis and/or Inspect
* page. * page.
* *
* Refer to documentation on github or Javadoc of PluginData to set-up a * Refer to documentation on GitHub or Javadoc of PluginData to set-up a
* data source that extends PluginData correctly. * data source that extends PluginData correctly.
* *
* @param dataSource an object that extends PluginData-object, thus allowing * @param dataSource an object that extends PluginData-object, thus allowing
@ -102,7 +103,7 @@ public class API {
* *
* @param uuid UUID of the player. * @param uuid UUID of the player.
* @param processor Object implementing DBCallableProcessor, which * @param processor Object implementing DBCallableProcessor, which
* process(UserData data) method will be called. * process (UserData data) method will be called.
*/ */
public void scheduleForGet(UUID uuid, DBCallableProcessor processor) { public void scheduleForGet(UUID uuid, DBCallableProcessor processor) {
plugin.getHandler().getUserDataForProcessing(processor, uuid, false); plugin.getHandler().getUserDataForProcessing(processor, uuid, false);
@ -135,7 +136,7 @@ public class API {
/** /**
* Used to save the cached data to the database. * Used to save the cached data to the database.
* *
* Should be only called from an Asyncronous thread. * Should be only called from an Asynchronous thread.
*/ */
public void saveCachedData() { public void saveCachedData() {
plugin.getHandler().saveCachedUserData(); plugin.getHandler().saveCachedUserData();
@ -154,7 +155,7 @@ public class API {
/** /**
* Cache the UserData to InspectCache. * Cache the UserData to InspectCache.
* *
* Uses cache if data is cached or database if not. Call from an Asyncronous * Uses cache if data is cached or database if not. Call from an Asynchronous
* thread. * thread.
* *
* @param uuid UUID of the player. * @param uuid UUID of the player.
@ -193,14 +194,14 @@ public class API {
* Run's the analysis with the current data in the cache and fetches rest * Run's the analysis with the current data in the cache and fetches rest
* from the database. * from the database.
* *
* Starts a new Asyncronous task to run the analysis. * Starts a new Asynchronous task to run the analysis.
*/ */
public void updateAnalysisCache() { public void updateAnalysisCache() {
plugin.getAnalysisCache().updateCache(); plugin.getAnalysisCache().updateCache();
} }
/** /**
* Used to get the full Html of the Analysis page as a string. * Used to get the full HTML of the Analysis page as a string.
* *
* Check if the data is cached to AnalysisCache before calling this. * Check if the data is cached to AnalysisCache before calling this.
* *

View File

@ -89,17 +89,17 @@ public class AnalyzeCommand extends SubCommand {
private void runMessageSenderTask(ISender sender) { private void runMessageSenderTask(ISender sender) {
plugin.getRunnableFactory().createNew("AnalysisMessageSenderTask", new AbsRunnable() { plugin.getRunnableFactory().createNew("AnalysisMessageSenderTask", new AbsRunnable() {
private int timesrun = 0; private int timesRun = 0;
@Override @Override
public void run() { public void run() {
timesrun++; timesRun++;
if (analysisCache.isCached() && (!analysisCache.isAnalysisBeingRun() || !analysisCache.isAnalysisEnabled())) { if (analysisCache.isCached() && (!analysisCache.isAnalysisBeingRun() || !analysisCache.isAnalysisEnabled())) {
sendAnalysisMessage(sender); sendAnalysisMessage(sender);
this.cancel(); this.cancel();
return; return;
} }
if (timesrun > 10) { if (timesRun > 10) {
Log.debug("Command Timeout Message, Analysis."); Log.debug("Command Timeout Message, Analysis.");
sender.sendMessage(Phrase.COMMAND_TIMEOUT.parse("Analysis")); sender.sendMessage(Phrase.COMMAND_TIMEOUT.parse("Analysis"));
this.cancel(); this.cancel();

View File

@ -66,18 +66,18 @@ public class QuickAnalyzeCommand extends SubCommand {
private void runMessageSenderTask(ISender sender) { private void runMessageSenderTask(ISender sender) {
plugin.getRunnableFactory().createNew(new AbsRunnable("QanalysisMessageSenderTask") { plugin.getRunnableFactory().createNew(new AbsRunnable("QanalysisMessageSenderTask") {
private int timesrun = 0; private int timesRun = 0;
@Override @Override
public void run() { public void run() {
timesrun++; timesRun++;
if (analysisCache.isCached() && (!analysisCache.isAnalysisBeingRun() || !analysisCache.isAnalysisEnabled())) { if (analysisCache.isCached() && (!analysisCache.isAnalysisBeingRun() || !analysisCache.isAnalysisEnabled())) {
sender.sendMessage(Phrase.CMD_ANALYZE_HEADER + ""); sender.sendMessage(Phrase.CMD_ANALYZE_HEADER + "");
sender.sendMessage(TextUI.getAnalysisMessages()); sender.sendMessage(TextUI.getAnalysisMessages());
sender.sendMessage(Phrase.CMD_FOOTER + ""); sender.sendMessage(Phrase.CMD_FOOTER + "");
this.cancel(); this.cancel();
} }
if (timesrun > 10) { if (timesRun > 10) {
Log.debug("Command Timeout Message, QuickAnalyze."); Log.debug("Command Timeout Message, QuickAnalyze.");
sender.sendMessage(Phrase.COMMAND_TIMEOUT.parse("Analysis")); sender.sendMessage(Phrase.COMMAND_TIMEOUT.parse("Analysis"));
this.cancel(); this.cancel();

View File

@ -43,7 +43,7 @@ public class RegisterCommand extends SubCommand {
String permLvlErrorMsg = ChatColor.RED + "Incorrect perm level, not a number: "; String permLvlErrorMsg = ChatColor.RED + "Incorrect 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.");
playerRegister(args, sender); playerRegister(args, sender);
} else { } else {
consoleRegister(args, sender, notEnoughArgsMsg); consoleRegister(args, sender, notEnoughArgsMsg);
@ -74,11 +74,6 @@ public class RegisterCommand extends SubCommand {
if (registerSenderAsUser) { if (registerSenderAsUser) {
String user = sender.getName(); String user = sender.getName();
String pass = PassEncryptUtil.createHash(args[0]); String pass = PassEncryptUtil.createHash(args[0]);
if (!Check.isTrue(pass != null, ChatColor.RED + "Password hash error.", sender)) {
return;
}
int permLvl = getPermissionLevel(sender); int permLvl = getPermissionLevel(sender);
registerUser(new WebUser(user, pass, permLvl), sender); registerUser(new WebUser(user, pass, permLvl), sender);
} else if (sender.hasPermission(Permissions.MANAGE_WEB.getPermission())) { } else if (sender.hasPermission(Permissions.MANAGE_WEB.getPermission())) {
@ -119,7 +114,7 @@ public class RegisterCommand extends SubCommand {
} }
securityTable.addNewUser(webUser); securityTable.addNewUser(webUser);
sender.sendMessage(successMsg); sender.sendMessage(successMsg);
Log.info("Registered new user: "+userName+" Perm level: "+webUser.getPermLevel()); Log.info("Registered new user: " + userName + " Perm level: " + webUser.getPermLevel());
} catch (Exception e) { } catch (Exception e) {
Log.toLog(this.getClass().getName(), e); Log.toLog(this.getClass().getName(), e);
} finally { } finally {

View File

@ -90,7 +90,7 @@ public class ManageImportCommand extends SubCommand {
private void list(Map<String, Importer> importers, ISender sender) { private void list(Map<String, Importer> importers, ISender sender) {
sender.sendMessage(Phrase.CMD_FOOTER.parse()); sender.sendMessage(Phrase.CMD_FOOTER.parse());
importers.entrySet().stream().forEach(e -> sender.sendMessage(Phrase.CMD_BALL + " " + e.getKey() + ": " + e.getValue().getInfo())); importers.forEach((string, importer) -> sender.sendMessage(Phrase.CMD_BALL + " " + string + ": " + importer.getInfo()));
sender.sendMessage(Phrase.CMD_FOOTER.parse()); sender.sendMessage(Phrase.CMD_FOOTER.parse());
} }
} }

View File

@ -28,7 +28,7 @@ public class WebLevelCommand extends SubCommand {
ColorScheme cs = plugin.getColorScheme(); ColorScheme cs = plugin.getColorScheme();
String sCol = cs.getSecondaryColor(); String sCol = cs.getSecondaryColor();
String cmdBall = Phrase.CMD_BALL.parse(); String cmdBall = Phrase.CMD_BALL.parse();
String[] msgs = new String[]{ String[] messages = new String[]{
Phrase.CMD_FOOTER.parse(), Phrase.CMD_FOOTER.parse(),
cmdBall + sCol + "0: Access all pages", cmdBall + sCol + "0: Access all pages",
cmdBall + sCol + "1: Access '/players' and all inspect pages", cmdBall + sCol + "1: Access '/players' and all inspect pages",
@ -36,7 +36,7 @@ public class WebLevelCommand extends SubCommand {
cmdBall + sCol + "3+: No permissions", cmdBall + sCol + "3+: No permissions",
Phrase.CMD_FOOTER.parse() Phrase.CMD_FOOTER.parse()
}; };
sender.sendMessage(msgs); sender.sendMessage(messages);
return true; return true;
} }

View File

@ -1,24 +1,16 @@
package main.java.com.djrapitops.plan.data; package main.java.com.djrapitops.plan.data;
import com.djrapitops.plugin.utilities.Verify; import com.djrapitops.plugin.utilities.Verify;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
import main.java.com.djrapitops.plan.Log; import main.java.com.djrapitops.plan.Log;
import main.java.com.djrapitops.plan.data.analysis.ActivityPart; import main.java.com.djrapitops.plan.data.analysis.*;
import main.java.com.djrapitops.plan.data.analysis.CommandUsagePart;
import main.java.com.djrapitops.plan.data.analysis.GamemodePart;
import main.java.com.djrapitops.plan.data.analysis.GeolocationPart;
import main.java.com.djrapitops.plan.data.analysis.JoinInfoPart;
import main.java.com.djrapitops.plan.data.analysis.KillPart;
import main.java.com.djrapitops.plan.data.analysis.PlayerCountPart;
import main.java.com.djrapitops.plan.data.analysis.PlaytimePart;
import main.java.com.djrapitops.plan.data.analysis.RawData;
import main.java.com.djrapitops.plan.data.analysis.TPSPart;
import main.java.com.djrapitops.plan.utilities.Benchmark; import main.java.com.djrapitops.plan.utilities.Benchmark;
import main.java.com.djrapitops.plan.utilities.HtmlUtils; import main.java.com.djrapitops.plan.utilities.HtmlUtils;
import main.java.com.djrapitops.plan.utilities.MiscUtils; import main.java.com.djrapitops.plan.utilities.MiscUtils;
import java.util.Arrays;
import java.util.List;
import java.util.Map;
/** /**
* Big container object for Data. * Big container object for Data.
* *
@ -151,7 +143,7 @@ public class AnalysisData extends RawData<AnalysisData> {
addValue("version", planVersion); addValue("version", planVersion);
final List<RawData> parts = getAllParts(); final List<RawData> parts = getAllParts();
parts.stream().forEach((part) -> { parts.forEach((part) -> {
try { try {
Benchmark.start("Analysis Phase: " + part.getClass().getSimpleName()); Benchmark.start("Analysis Phase: " + part.getClass().getSimpleName());
part.analyseData(); part.analyseData();

View File

@ -22,7 +22,7 @@ public class KillData {
* @param victim UUID of the victim. * @param victim UUID of the victim.
* @param victimID ID of the victim, get from the database. * @param victimID ID of the victim, get from the database.
* @param weapon Weapon used. * @param weapon Weapon used.
* @param date Epoch millisecond at which the kill occurrred. * @param date Epoch millisecond at which the kill occurred.
*/ */
public KillData(UUID victim, int victimID, String weapon, long date) { public KillData(UUID victim, int victimID, String weapon, long date) {
this.victim = victim; this.victim = victim;
@ -84,10 +84,9 @@ public class KillData {
return false; return false;
} }
final KillData other = (KillData) obj; final KillData other = (KillData) obj;
if (this.date != other.date) { return this.date == other.date
return false; && Objects.equals(this.weapon, other.weapon)
} && Objects.equals(this.victim, other.victim);
return Objects.equals(this.weapon, other.weapon) && Objects.equals(this.victim, other.victim);
} }
@Override @Override

View File

@ -78,10 +78,9 @@ public class TPS {
return false; return false;
} }
final TPS other = (TPS) obj; final TPS other = (TPS) obj;
if (this.date != other.date) { return this.date == other.date
return false; && Double.doubleToLongBits(this.tps) == Double.doubleToLongBits(other.tps)
} && this.players == other.players;
return Double.doubleToLongBits(this.tps) == Double.doubleToLongBits(other.tps) && this.players == other.players;
} }
@Override @Override

View File

@ -3,19 +3,12 @@ package main.java.com.djrapitops.plan.data;
import com.djrapitops.plugin.utilities.Verify; import com.djrapitops.plugin.utilities.Verify;
import com.djrapitops.plugin.utilities.player.IOfflinePlayer; import com.djrapitops.plugin.utilities.player.IOfflinePlayer;
import com.djrapitops.plugin.utilities.player.IPlayer; import com.djrapitops.plugin.utilities.player.IPlayer;
import java.net.InetAddress;
import java.util.ArrayList;
import java.util.Collection;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Set;
import java.util.UUID;
import java.util.stream.Collectors;
import main.java.com.djrapitops.plan.Log; import main.java.com.djrapitops.plan.Log;
import java.net.InetAddress;
import java.util.*;
import java.util.stream.Collectors;
/** /**
* This class is used for storing information about a player during runtime. * This class is used for storing information about a player during runtime.
* *
@ -64,7 +57,7 @@ public class UserData {
* All Collections are left empty: locations, nicknames, ips, sessions, * All Collections are left empty: locations, nicknames, ips, sessions,
* playerKills. Because nicknames is empty, lastNick is an empty string. * playerKills. Because nicknames is empty, lastNick is an empty string.
* *
* gmTimes Hashmap will contain 4 '0L' values: SURVIVAL, CREATIVE, * gmTimes HashMap will contain 4 '0L' values: SURVIVAL, CREATIVE,
* ADVENTURE, SPECTATOR * ADVENTURE, SPECTATOR
* *
* @param uuid UUID of the player * @param uuid UUID of the player
@ -106,7 +99,7 @@ public class UserData {
* All Collections are left empty: locations, nicknames, ips, sessions, * All Collections are left empty: locations, nicknames, ips, sessions,
* playerKills. Because nicknames is empty, lastNick is an empty string. * playerKills. Because nicknames is empty, lastNick is an empty string.
* *
* gmTimes Hashmap will contain 4 '0L' values: SURVIVAL, CREATIVE, * gmTimes HashMap will contain 4 '0L' values: SURVIVAL, CREATIVE,
* ADVENTURE, SPECTATOR * ADVENTURE, SPECTATOR
* *
* @param player IPlayer object. * @param player IPlayer object.
@ -135,7 +128,7 @@ public class UserData {
* All Collections are left empty: locations, nicknames, ips, sessions, * All Collections are left empty: locations, nicknames, ips, sessions,
* playerKills. Because nicknames is empty, lastNick is an empty string. * playerKills. Because nicknames is empty, lastNick is an empty string.
* *
* gmTimes Hashmap will contain 4 '0L' values: SURVIVAL, CREATIVE, * gmTimes HashMap will contain 4 '0L' values: SURVIVAL, CREATIVE,
* ADVENTURE, SPECTATOR * ADVENTURE, SPECTATOR
* *
* lastGM will be set as SURVIVAL * lastGM will be set as SURVIVAL
@ -760,57 +753,32 @@ public class UserData {
if (getClass() != obj.getClass()) { if (getClass() != obj.getClass()) {
return false; return false;
} }
final UserData other = (UserData) obj; final UserData other = (UserData) obj;
if (this.registered != other.registered) {
return false;
}
// if (this.lastPlayed != other.lastPlayed) { // if (this.lastPlayed != other.lastPlayed) {
// return false; // return false;
// } // }
if (this.playTime != other.playTime) {
return false; return this.registered == other.registered
} && this.playTime == other.playTime
if (this.loginTimes != other.loginTimes) { && this.loginTimes == other.loginTimes
return false; && this.timesKicked == other.timesKicked
} && this.lastGmSwapTime == other.lastGmSwapTime
if (this.timesKicked != other.timesKicked) { && this.mobKills == other.mobKills
return false; && this.deaths == other.deaths
} && Objects.equals(this.lastNick, other.lastNick)
if (this.lastGmSwapTime != other.lastGmSwapTime) { && Objects.equals(this.name, other.name)
return false; && Objects.equals(this.uuid, other.uuid)
} && Objects.equals(this.ips, other.ips)
if (this.mobKills != other.mobKills) { && Objects.equals(this.nicknames, other.nicknames)
return false; && Objects.equals(this.lastGamemode, other.lastGamemode)
} && Objects.equals(this.gmTimes, other.gmTimes)
if (this.deaths != other.deaths) { && Objects.equals(this.playerKills, other.playerKills)
return false; && Objects.equals(this.sessions, other.sessions);
}
if (!Objects.equals(this.lastNick, other.lastNick)) {
return false;
}
if (!Objects.equals(this.name, other.name)) {
return false;
}
if (!Objects.equals(this.uuid, other.uuid)) {
return false;
}
if (!Objects.equals(this.ips, other.ips)) {
return false;
}
if (!Objects.equals(this.nicknames, other.nicknames)) {
return false;
}
if (!Objects.equals(this.lastGamemode, other.lastGamemode)) {
return false;
}
if (!Objects.equals(this.gmTimes, other.gmTimes)) {
return false;
}
return Objects.equals(this.playerKills, other.playerKills) && Objects.equals(this.sessions, other.sessions);
} }
/** /**
* Check wether or not the object should be cleared from cache after it has * Check whether or not the object should be cleared from cache after it has
* been saved. * been saved.
* *
* @return true/false * @return true/false
@ -820,7 +788,7 @@ public class UserData {
} }
/** /**
* Set wether or not the object should be cleared from cache after it has * Set whether or not the object should be cleared from cache after it has
* been saved. * been saved.
* *
* @param clearAfterSave true/false * @param clearAfterSave true/false

View File

@ -7,7 +7,7 @@ package main.java.com.djrapitops.plan.data.additional;
* The enum determines what should be done to the return value of * The enum determines what should be done to the return value of
* PluginData.getValue() method when the analysis is run. * PluginData.getValue() method when the analysis is run.
* *
* Refer to the documentation on github for additional information. * Refer to the documentation on GitHub for additional information.
* *
* @author Rsl1122 * @author Rsl1122
* @since 3.1.0 * @since 3.1.0

View File

@ -1,17 +1,13 @@
package main.java.com.djrapitops.plan.data.additional; package main.java.com.djrapitops.plan.data.additional;
import com.djrapitops.pluginbridge.plan.Bridge; import com.djrapitops.pluginbridge.plan.Bridge;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import java.util.stream.Collectors;
import main.java.com.djrapitops.plan.Log; import main.java.com.djrapitops.plan.Log;
import main.java.com.djrapitops.plan.Plan; import main.java.com.djrapitops.plan.Plan;
import main.java.com.djrapitops.plan.utilities.HtmlUtils; import main.java.com.djrapitops.plan.utilities.HtmlUtils;
import java.util.*;
import java.util.stream.Collectors;
/** /**
* Class responsible for hooking to other plugins and managing the %plugins% * Class responsible for hooking to other plugins and managing the %plugins%
* placeholder on Analysis and Inspect pages. * placeholder on Analysis and Inspect pages.
@ -46,7 +42,7 @@ public class HookHandler {
* The plugin data will appear on Analysis and/or Inspect pages depending on * The plugin data will appear on Analysis and/or Inspect pages depending on
* how the extending object is set up. * how the extending object is set up.
* *
* Refer to documentation on github for more information. * Refer to documentation on GitHub for more information.
* *
* @param dataSource an object extending the PluginData class. * @param dataSource an object extending the PluginData class.
*/ */
@ -76,7 +72,7 @@ public class HookHandler {
/** /**
* Used to get the Layout with PluginData placeholders to replace %plugins% * Used to get the Layout with PluginData placeholders to replace %plugins%
* placeholder on analysis.hmtl. * placeholder on analysis.html.
* *
* @return html, getPluginsTabLayout-method * @return html, getPluginsTabLayout-method
* @see HtmlUtils * @see HtmlUtils
@ -89,7 +85,7 @@ public class HookHandler {
/** /**
* Used to get the Layout with PluginData placeholders to replace %plugins% * Used to get the Layout with PluginData placeholders to replace %plugins%
* placeholder on player.hmtl. * placeholder on player.html.
* *
* @return html, getPluginsTabLayout-method * @return html, getPluginsTabLayout-method
* @see HtmlUtils * @see HtmlUtils

View File

@ -31,7 +31,7 @@ public abstract class PluginData {
/** /**
* Name of the plugin the data is coming from. * Name of the plugin the data is coming from.
* *
* All datasources with the same sourcePlugin will be placed in the same * All sources of data with the same sourcePlugin will be placed in the same
* "box" in the "Plugins" tab. * "box" in the "Plugins" tab.
* *
* A box has a max height of 600px, and higher than that will add a * A box has a max height of 600px, and higher than that will add a
@ -277,7 +277,7 @@ public abstract class PluginData {
/** /**
* If a PluginData object has same placeholder, sourcePlugin and * If a PluginData object has same placeholder, sourcePlugin and
* analysisTypes, it is considired equal. * analysisTypes, it is considered equal.
* *
* @param obj Another Object. * @param obj Another Object.
* @return Is current object equal to given object. * @return Is current object equal to given object.
@ -294,13 +294,10 @@ public abstract class PluginData {
return false; return false;
} }
final PluginData other = (PluginData) obj; final PluginData other = (PluginData) obj;
if (this.analysisOnly != other.analysisOnly) { return this.analysisOnly == other.analysisOnly
return false; && Objects.equals(this.placeholder, other.placeholder)
} && Objects.equals(this.sourcePlugin, other.sourcePlugin)
if (!Objects.equals(this.placeholder, other.placeholder)) { && Objects.equals(this.analysisTypes, other.analysisTypes);
return false;
}
return Objects.equals(this.sourcePlugin, other.sourcePlugin) && Objects.equals(this.analysisTypes, other.analysisTypes);
} }
@Override @Override

View File

@ -73,10 +73,7 @@ public class GeolocationPart extends RawData<GeolocationPart> {
} }
public void addGeoloc(String country) { public void addGeoloc(String country) {
if (geolocations.get(country) == null) { geolocations.computeIfPresent(country, (computedCountry, amount) -> amount + 1);
return;
}
geolocations.replace(country, geolocations.get(country) + 1);
} }
} }

View File

@ -1,20 +1,17 @@
package main.java.com.djrapitops.plan.data.cache; package main.java.com.djrapitops.plan.data.cache;
import com.djrapitops.plugin.task.AbsRunnable; import com.djrapitops.plugin.task.AbsRunnable;
import com.djrapitops.plugin.task.ITask;
import com.djrapitops.plugin.utilities.player.IPlayer; import com.djrapitops.plugin.utilities.player.IPlayer;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import main.java.com.djrapitops.plan.Log; import main.java.com.djrapitops.plan.Log;
import main.java.com.djrapitops.plan.Phrase; import main.java.com.djrapitops.plan.Phrase;
import main.java.com.djrapitops.plan.Plan; import main.java.com.djrapitops.plan.Plan;
import main.java.com.djrapitops.plan.Settings; import main.java.com.djrapitops.plan.Settings;
import main.java.com.djrapitops.plan.data.*; import main.java.com.djrapitops.plan.data.TPS;
import main.java.com.djrapitops.plan.data.cache.queue.*; import main.java.com.djrapitops.plan.data.UserData;
import main.java.com.djrapitops.plan.data.cache.queue.DataCacheClearQueue;
import main.java.com.djrapitops.plan.data.cache.queue.DataCacheGetQueue;
import main.java.com.djrapitops.plan.data.cache.queue.DataCacheProcessQueue;
import main.java.com.djrapitops.plan.data.cache.queue.DataCacheSaveQueue;
import main.java.com.djrapitops.plan.data.handling.info.HandlingInfo; import main.java.com.djrapitops.plan.data.handling.info.HandlingInfo;
import main.java.com.djrapitops.plan.data.handling.info.LogoutInfo; import main.java.com.djrapitops.plan.data.handling.info.LogoutInfo;
import main.java.com.djrapitops.plan.data.handling.info.ReloadInfo; import main.java.com.djrapitops.plan.data.handling.info.ReloadInfo;
@ -25,16 +22,19 @@ import main.java.com.djrapitops.plan.utilities.NewPlayerCreator;
import main.java.com.djrapitops.plan.utilities.analysis.MathUtils; import main.java.com.djrapitops.plan.utilities.analysis.MathUtils;
import main.java.com.djrapitops.plan.utilities.comparators.HandlingInfoTimeComparator; import main.java.com.djrapitops.plan.utilities.comparators.HandlingInfoTimeComparator;
import java.sql.SQLException;
import java.util.*;
/** /**
* This Class contains the Cache. * This Class contains the Cache.
* *
* This class is the main processing class that initialises Save, Clear, Process * This class is the main processing class that initialises Save, Clear, Process
* and Get queue and Starts the asyncronous save task. * and Get queue and Starts the asynchronous save task.
* *
* It is used to store command use, locations, active sessions and UserData * It is used to store command use, locations, active sessions and UserData
* objects in memory. * objects in memory.
* *
* It's methods can be used to access all the data it stores and to clear them. * Its methods can be used to access all the data it stores and to clear them.
* *
* @author Rsl1122 * @author Rsl1122
* @since 2.0.0 * @since 2.0.0
@ -63,7 +63,7 @@ public class DataCacheHandler extends SessionCache {
* Class Constructor. * Class Constructor.
* *
* Gets the Database from the plugin. Starts the queues. Registers * Gets the Database from the plugin. Starts the queues. Registers
* Asyncronous Periodic Save Task * Asynchronous Periodic Save Task
* *
* @param plugin Current instance of Plan * @param plugin Current instance of Plan
*/ */
@ -112,7 +112,7 @@ public class DataCacheHandler extends SessionCache {
} }
/** /**
* Used to start the Asyncronous Save Task. * Used to start the Asynchronous Save Task.
* *
* @throws IllegalArgumentException BukkitRunnable was given wrong * @throws IllegalArgumentException BukkitRunnable was given wrong
* parameters. * parameters.
@ -131,7 +131,7 @@ public class DataCacheHandler extends SessionCache {
clearAfterXsaves = configValue; clearAfterXsaves = configValue;
} }
DataCacheHandler handler = this; DataCacheHandler handler = this;
ITask asyncPeriodicCacheSaveTask = plugin.getRunnableFactory().createNew(new AbsRunnable("PeriodicCacheSaveTask") { plugin.getRunnableFactory().createNew(new AbsRunnable("PeriodicCacheSaveTask") {
private int timesSaved = 0; private int timesSaved = 0;
@Override @Override
@ -223,7 +223,7 @@ public class DataCacheHandler extends SessionCache {
* Should only be called from Async thread * Should only be called from Async thread
*/ */
public void saveCachedUserData() { public void saveCachedUserData() {
List<UserData> data = new ArrayList<>(); Set<UserData> data = new HashSet<>();
data.addAll(dataCache.values()); data.addAll(dataCache.values());
try { try {
db.saveMultipleUserData(data); db.saveMultipleUserData(data);
@ -335,7 +335,7 @@ public class DataCacheHandler extends SessionCache {
/** /**
* Saves the cached CommandUse. * Saves the cached CommandUse.
* *
* Should be only called from an Asyncronous Thread. * Should be only called from an Asynchronous Thread.
*/ */
public void saveCommandUse() { public void saveCommandUse() {
try { try {
@ -364,10 +364,10 @@ public class DataCacheHandler extends SessionCache {
} }
List<List<TPS>> copy = new ArrayList<>(unsavedTPSHistory); List<List<TPS>> copy = new ArrayList<>(unsavedTPSHistory);
for (List<TPS> history : copy) { for (List<TPS> history : copy) {
final long lastdate = history.get(history.size() - 1).getDate(); final long lastDate = history.get(history.size() - 1).getDate();
final double averageTPS = MathUtils.averageDouble(history.stream().map(TPS::getTps)); final double averageTPS = MathUtils.averageDouble(history.stream().map(TPS::getTps));
final int averagePlayersOnline = (int) MathUtils.averageInt(history.stream().map(TPS::getPlayers)); final int averagePlayersOnline = (int) MathUtils.averageInt(history.stream().map(TPS::getPlayers));
averages.add(new TPS(lastdate, averageTPS, averagePlayersOnline)); averages.add(new TPS(lastDate, averageTPS, averagePlayersOnline));
} }
unsavedTPSHistory.removeAll(copy); unsavedTPSHistory.removeAll(copy);
return averages; return averages;
@ -378,7 +378,7 @@ public class DataCacheHandler extends SessionCache {
*/ */
public void saveHandlerDataToCache() { public void saveHandlerDataToCache() {
final List<IPlayer> onlinePlayers = plugin.fetch().getOnlinePlayers(); final List<IPlayer> onlinePlayers = plugin.fetch().getOnlinePlayers();
onlinePlayers.stream().forEach((p) -> saveHandlerDataToCache(p, false)); onlinePlayers.forEach((p) -> saveHandlerDataToCache(p, false));
} }
private void saveHandlerDataToCache(IPlayer player, boolean pool) { private void saveHandlerDataToCache(IPlayer player, boolean pool) {
@ -426,7 +426,7 @@ public class DataCacheHandler extends SessionCache {
* *
* @param uuid Player's UUID. * @param uuid Player's UUID.
*/ */
public void scheludeForClear(UUID uuid) { public void scheduldeForClear(UUID uuid) {
clearTask.scheduleForClear(uuid); clearTask.scheduleForClear(uuid);
} }
@ -492,7 +492,7 @@ public class DataCacheHandler extends SessionCache {
* Calls all the methods that are ran when PlayerJoinEvent is fired * Calls all the methods that are ran when PlayerJoinEvent is fired
*/ */
public void handleReload() { public void handleReload() {
ITask asyncReloadCacheUpdateTask = plugin.getRunnableFactory().createNew(new AbsRunnable("ReloadCacheUpdateTask") { plugin.getRunnableFactory().createNew(new AbsRunnable("ReloadCacheUpdateTask") {
@Override @Override
public void run() { public void run() {
final List<IPlayer> onlinePlayers = plugin.fetch().getOnlinePlayers(); final List<IPlayer> onlinePlayers = plugin.fetch().getOnlinePlayers();

View File

@ -0,0 +1,93 @@
package main.java.com.djrapitops.plan.data.cache;
import com.google.common.cache.Cache;
import com.google.common.cache.CacheBuilder;
import main.java.com.djrapitops.plan.Log;
import main.java.com.djrapitops.plan.Phrase;
import main.java.com.djrapitops.plan.utilities.Benchmark;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.URL;
import java.util.Map;
/**
* This class contains the geolocation cache.
* <p>
* It caches all IPs with their matching country.
* <p>
* This cache uses the Google Guava {@link Cache} and has a capacity of 10.000 entries.
*
* @author Fuzzlemann
*/
public class GeolocationCacheHandler {
private static final Cache<String, String> geolocationCache = CacheBuilder.newBuilder()
.maximumSize(10000)
.build();
/**
* Retrieves the country in full length (e.g. United States) from the IP Address.
* <p>
* This method uses the {@code geolocationCache}, every first access is getting cached and then retrieved later.
*
* @param ipAddress The IP Address from which the country is retrieved
* @return The name of the country in full length.
* <p>
* An exception from that rule is when the country is unknown or the retrieval of the country failed in any way,
* if that happens, the phrase for unknown country set in the config will be returned.
* @see #getUncachedCountry(String)
*/
public static String getCountry(String ipAddress) {
Log.debug("Started country retrieval from IP Address " + ipAddress);
Map<String, String> geolocationMap = geolocationCache.asMap();
String country = geolocationMap.get(ipAddress);
Log.debug("Got country from " + ipAddress + " out of cache: " + country + " (if null, country wasn't cached)");
if (country != null) {
return country;
} else {
country = getUncachedCountry(ipAddress);
geolocationCache.put(ipAddress, country);
Log.debug("Got uncached country from IP Address " + ipAddress + ": " + country);
return country;
}
}
/**
* Retrieves the country in full length (e.g. United States) from the IP Address.
* <p>
* This method uses the free service of freegeoip.net. The maximum amount of requests is 15.000 per hour.
*
* @param ipAddress The IP Address from which the country is retrieved
* @return The name of the country in full length.
* <p>
* An exception from that rule is when the country is unknown or the retrieval of the country failed in any way,
* if that happens, the phrase for unknown country set in the config will be returned.
* @see <a href="http://freegeoip.net">http://freegeoip.net</a>
* @see #getCountry(String)
*/
private static String getUncachedCountry(String ipAddress) {
try {
Benchmark.start("getUncachedCountry");
URL url = new URL("http://freegeoip.net/csv/" + ipAddress);
BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream()));
String resultLine = in.readLine();
in.close();
String[] results = resultLine.split(",");
String result = results[2];
String country = result.isEmpty() ? Phrase.DEM_UNKNOWN.toString() : result;
Benchmark.stop("getUncachedCountry");
return country;
} catch (Exception exc) {
return Phrase.DEM_UNKNOWN.toString();
}
}
}

View File

@ -1,18 +1,19 @@
package main.java.com.djrapitops.plan.data.cache.queue; package main.java.com.djrapitops.plan.data.cache.queue;
import main.java.com.djrapitops.plan.Log;
import main.java.com.djrapitops.plan.Phrase;
import main.java.com.djrapitops.plan.Settings;
import main.java.com.djrapitops.plan.data.cache.DataCacheHandler;
import java.util.Collection; import java.util.Collection;
import java.util.Objects; import java.util.Objects;
import java.util.UUID; import java.util.UUID;
import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue; import java.util.concurrent.BlockingQueue;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import main.java.com.djrapitops.plan.Log;
import main.java.com.djrapitops.plan.Phrase;
import main.java.com.djrapitops.plan.Settings;
import main.java.com.djrapitops.plan.data.cache.DataCacheHandler;
/** /**
* This Class strats the Clear Queue Thread, that clears data from DataCache. * This Class contains the Clear Queue Thread, which is clearing data from the DataCache.
* *
* @author Rsl1122 * @author Rsl1122
* @since 3.0.0 * @since 3.0.0
@ -22,7 +23,7 @@ public class DataCacheClearQueue extends Queue<UUID> {
/** /**
* Class constructor, starts the new Thread for clearing. * Class constructor, starts the new Thread for clearing.
* *
* @param handler current instance of DataCachehandler. * @param handler current instance of DataCacheHandler.
*/ */
public DataCacheClearQueue(DataCacheHandler handler) { public DataCacheClearQueue(DataCacheHandler handler) {
super(new ArrayBlockingQueue(Settings.PROCESS_CLEAR_LIMIT.getNumber())); super(new ArrayBlockingQueue(Settings.PROCESS_CLEAR_LIMIT.getNumber()));

View File

@ -1,14 +1,5 @@
package main.java.com.djrapitops.plan.data.cache.queue; package main.java.com.djrapitops.plan.data.cache.queue;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
import main.java.com.djrapitops.plan.Log; import main.java.com.djrapitops.plan.Log;
import main.java.com.djrapitops.plan.Phrase; import main.java.com.djrapitops.plan.Phrase;
import main.java.com.djrapitops.plan.Plan; import main.java.com.djrapitops.plan.Plan;
@ -16,6 +7,11 @@ import main.java.com.djrapitops.plan.Settings;
import main.java.com.djrapitops.plan.data.cache.DBCallableProcessor; import main.java.com.djrapitops.plan.data.cache.DBCallableProcessor;
import main.java.com.djrapitops.plan.database.Database; import main.java.com.djrapitops.plan.database.Database;
import java.sql.SQLException;
import java.util.*;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
/** /**
* This Class is starts the Get Queue Thread, that fetches data from DataCache. * This Class is starts the Get Queue Thread, that fetches data from DataCache.
* *
@ -36,7 +32,7 @@ public class DataCacheGetQueue extends Queue<Map<UUID, List<DBCallableProcessor>
} }
/** /**
* Schedules UserData objects to be get for the given proecssors. * Schedules UserData objects to be get for the given processors.
* *
* @param uuid UUID of the player whose UserData object is fetched. * @param uuid UUID of the player whose UserData object is fetched.
* @param processors Processors which process-method will be called after * @param processors Processors which process-method will be called after

View File

@ -1,15 +1,16 @@
package main.java.com.djrapitops.plan.data.cache.queue; package main.java.com.djrapitops.plan.data.cache.queue;
import main.java.com.djrapitops.plan.Log;
import main.java.com.djrapitops.plan.data.UserData;
import main.java.com.djrapitops.plan.data.cache.DBCallableProcessor;
import main.java.com.djrapitops.plan.data.cache.DataCacheHandler;
import main.java.com.djrapitops.plan.data.handling.info.HandlingInfo;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
import java.util.UUID; import java.util.UUID;
import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue; import java.util.concurrent.BlockingQueue;
import main.java.com.djrapitops.plan.Log;
import main.java.com.djrapitops.plan.data.UserData;
import main.java.com.djrapitops.plan.data.cache.DBCallableProcessor;
import main.java.com.djrapitops.plan.data.cache.DataCacheHandler;
import main.java.com.djrapitops.plan.data.handling.info.HandlingInfo;
/** /**
* This Class is starts the Process Queue Thread, that processes HandlingInfo * This Class is starts the Process Queue Thread, that processes HandlingInfo
@ -23,7 +24,7 @@ public class DataCacheProcessQueue extends Queue<HandlingInfo> {
/** /**
* Class constructor, starts the new Thread for processing. * Class constructor, starts the new Thread for processing.
* *
* @param handler current instance of DataCachehandler. * @param handler current instance of DataCacheHandler.
*/ */
public DataCacheProcessQueue(DataCacheHandler handler) { public DataCacheProcessQueue(DataCacheHandler handler) {
super(new ArrayBlockingQueue(20000)); super(new ArrayBlockingQueue(20000));

View File

@ -1,12 +1,5 @@
package main.java.com.djrapitops.plan.data.cache.queue; package main.java.com.djrapitops.plan.data.cache.queue;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.UUID;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
import java.util.stream.Collectors;
import main.java.com.djrapitops.plan.Log; import main.java.com.djrapitops.plan.Log;
import main.java.com.djrapitops.plan.Phrase; import main.java.com.djrapitops.plan.Phrase;
import main.java.com.djrapitops.plan.Plan; import main.java.com.djrapitops.plan.Plan;
@ -15,8 +8,16 @@ import main.java.com.djrapitops.plan.data.UserData;
import main.java.com.djrapitops.plan.data.cache.DataCacheHandler; import main.java.com.djrapitops.plan.data.cache.DataCacheHandler;
import main.java.com.djrapitops.plan.database.Database; import main.java.com.djrapitops.plan.database.Database;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.UUID;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
import java.util.stream.Collectors;
/** /**
* This Class is starts the Save Queue Thread, that saves data to the Databse. * This Class is starts the Save Queue Thread, that saves data to the Database.
* *
* @author Rsl1122 * @author Rsl1122
* @since 3.0.0 * @since 3.0.0

View File

@ -16,7 +16,7 @@ public abstract class Queue<T> {
Setup<T> setup; Setup<T> setup;
/** /**
* Consturctor, defines queue. * Constructor, defines queue.
* *
* @param queue BlockingQueue to use for this queue. * @param queue BlockingQueue to use for this queue.
*/ */

View File

@ -1,9 +1,10 @@
package main.java.com.djrapitops.plan.data.handling; package main.java.com.djrapitops.plan.data.handling;
import com.djrapitops.plugin.utilities.player.Gamemode; import com.djrapitops.plugin.utilities.player.Gamemode;
import java.util.Map;
import main.java.com.djrapitops.plan.data.UserData; import main.java.com.djrapitops.plan.data.UserData;
import java.util.Map;
/** /**
* Class containing static methods for processing information contained in a * Class containing static methods for processing information contained in a
* GamemodeChangeEvent. * GamemodeChangeEvent.
@ -33,10 +34,7 @@ public class GamemodeHandling {
} }
lastGamemode = data.getLastGamemode(); lastGamemode = data.getLastGamemode();
Map<String, Long> times = data.getGmTimes(); Map<String, Long> times = data.getGmTimes();
Long currentGMTime = times.get(lastGamemode); long currentGMTime = times.getOrDefault(lastGamemode, 0L);
if (currentGMTime == null) {
currentGMTime = 0L;
}
data.setPlayTime(data.getPlayTime() + (time - data.getLastPlayed())); data.setPlayTime(data.getPlayTime() + (time - data.getLastPlayed()));
data.setLastPlayed(time); data.setLastPlayed(time);
long lastSwap = data.getLastGmSwapTime(); long lastSwap = data.getLastGmSwapTime();

View File

@ -1,12 +1,9 @@
package main.java.com.djrapitops.plan.data.handling; package main.java.com.djrapitops.plan.data.handling;
import main.java.com.djrapitops.plan.Phrase;
import main.java.com.djrapitops.plan.data.UserData; import main.java.com.djrapitops.plan.data.UserData;
import main.java.com.djrapitops.plan.data.cache.GeolocationCacheHandler;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.InetAddress; import java.net.InetAddress;
import java.net.URL;
/** /**
* Class containing static methods for processing information contained in a * Class containing static methods for processing information contained in a
@ -40,29 +37,15 @@ public class LoginHandling {
/** /**
* Updates the geolocation of the player. * Updates the geolocation of the player.
* *
* Uses free service of freegeoip.net. 10000 requests can be sent per hour. * Uses free service of freegeoip.net. 15000 requests can be sent per hour.
* *
* @param ip InetAddress used for location. * @param ip InetAddress used for location.
* @param data UserData of the player. * @param data UserData of the player.
* @see GeolocationCacheHandler
*/ */
public static void updateGeolocation(InetAddress ip, UserData data) { public static void updateGeolocation(InetAddress ip, UserData data) {
try { String geoLocation = GeolocationCacheHandler.getCountry(ip.getHostAddress());
StringBuilder result = new StringBuilder();
URL url = new URL("http://freegeoip.net/csv/" + ip.getHostAddress());
BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream()));
String resultline; data.setGeolocation(geoLocation);
while ((resultline = in.readLine()) != null) {
result.append(resultline).append(",");
}
in.close();
String[] results = result.toString().split(",");
if (!results[2].isEmpty()) {
data.setGeolocation(results[2]);
}
} catch (Exception e) {
data.setGeolocation(Phrase.DEM_UNKNOWN + "");
}
} }
} }

View File

@ -3,12 +3,14 @@ package main.java.com.djrapitops.plan.data.listeners;
import main.java.com.djrapitops.plan.Log; import main.java.com.djrapitops.plan.Log;
import main.java.com.djrapitops.plan.Permissions; import main.java.com.djrapitops.plan.Permissions;
import main.java.com.djrapitops.plan.Plan; import main.java.com.djrapitops.plan.Plan;
import main.java.com.djrapitops.plan.Settings;
import main.java.com.djrapitops.plan.data.cache.DataCacheHandler; import main.java.com.djrapitops.plan.data.cache.DataCacheHandler;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler; import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority; import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener; import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerCommandPreprocessEvent; import org.bukkit.event.player.PlayerCommandPreprocessEvent;
import org.bukkit.help.HelpMap;
/** /**
* Event Listener for PlayerCommandPreprocessEvents. * Event Listener for PlayerCommandPreprocessEvents.
@ -40,12 +42,23 @@ public class PlanCommandPreprocessListener implements Listener {
if (event.isCancelled()) { if (event.isCancelled()) {
return; return;
} }
String cmd = event.getMessage().split(" ")[0].toLowerCase();
if (Settings.DO_NOT_LOG_UNKNOWN_COMMANDS.isTrue()) {
HelpMap helpMap = plugin.getServer().getHelpMap();
if (helpMap.getHelpTopic(cmd) == null) {
Log.debug("Ignored command, command is unknown");
return;
}
}
Player player = event.getPlayer(); Player player = event.getPlayer();
if (player.hasPermission(Permissions.IGNORE_COMMANDUSE.getPermission())) { if (player.hasPermission(Permissions.IGNORE_COMMANDUSE.getPermission())) {
Log.debug("Ignored command, player had ignore permission."); Log.debug("Ignored command, player had ignore permission.");
return; return;
} }
handler.handleCommand(event.getMessage().split(" ")[0].toLowerCase()); handler.handleCommand(cmd);
} }
} }

View File

@ -1,10 +1,8 @@
package main.java.com.djrapitops.plan.data.listeners; package main.java.com.djrapitops.plan.data.listeners;
import com.djrapitops.plugin.task.AbsRunnable; import com.djrapitops.plugin.task.AbsRunnable;
import com.djrapitops.plugin.task.ITask;
import com.djrapitops.plugin.utilities.player.Gamemode; import com.djrapitops.plugin.utilities.player.Gamemode;
import com.djrapitops.plugin.utilities.player.bukkit.BukkitPlayer; import com.djrapitops.plugin.utilities.player.bukkit.BukkitPlayer;
import java.util.UUID;
import main.java.com.djrapitops.plan.Log; import main.java.com.djrapitops.plan.Log;
import main.java.com.djrapitops.plan.Plan; import main.java.com.djrapitops.plan.Plan;
import main.java.com.djrapitops.plan.data.UserData; import main.java.com.djrapitops.plan.data.UserData;
@ -22,6 +20,8 @@ import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.event.player.PlayerKickEvent; import org.bukkit.event.player.PlayerKickEvent;
import org.bukkit.event.player.PlayerQuitEvent; import org.bukkit.event.player.PlayerQuitEvent;
import java.util.UUID;
/** /**
* Event Listener for PlayerJoin, PlayerQuit and PlayerKickEvents. * Event Listener for PlayerJoin, PlayerQuit and PlayerKickEvents.
* *
@ -59,7 +59,7 @@ public class PlanPlayerListener implements Listener {
UUID uuid = player.getUniqueId(); UUID uuid = player.getUniqueId();
handler.startSession(uuid); handler.startSession(uuid);
Log.debug(uuid + ": PlayerJoinEvent"); Log.debug(uuid + ": PlayerJoinEvent");
ITask asyncNewPlayerCheckTask = plugin.getRunnableFactory().createNew(new AbsRunnable("NewPlayerCheckTask") { plugin.getRunnableFactory().createNew(new AbsRunnable("NewPlayerCheckTask") {
@Override @Override
public void run() { public void run() {
LoginInfo loginInfo = new LoginInfo(uuid, MiscUtils.getTime(), player.getAddress().getAddress(), player.isBanned(), player.getDisplayName(), Gamemode.wrap(player.getGameMode()), 1); LoginInfo loginInfo = new LoginInfo(uuid, MiscUtils.getTime(), player.getAddress().getAddress(), player.isBanned(), player.getDisplayName(), Gamemode.wrap(player.getGameMode()), 1);
@ -112,8 +112,10 @@ public class PlanPlayerListener implements Listener {
Player player = event.getPlayer(); Player player = event.getPlayer();
UUID uuid = player.getUniqueId(); UUID uuid = player.getUniqueId();
handler.endSession(uuid); handler.endSession(uuid);
Log.debug(uuid + ": PlayerKickEvent");
handler.addToPool(new LogoutInfo(uuid, MiscUtils.getTime(), player.isBanned(), Gamemode.wrap(player.getGameMode()), handler.getSession(uuid))); handler.addToPool(new LogoutInfo(uuid, MiscUtils.getTime(), player.isBanned(), Gamemode.wrap(player.getGameMode()), handler.getSession(uuid)));
handler.addToPool(new KickInfo(uuid)); handler.addToPool(new KickInfo(uuid));
handler.saveCachedData(uuid); handler.saveCachedData(uuid);
Log.debug(uuid + ": PlayerKickEvent_END");
} }
} }

View File

@ -2,14 +2,15 @@ package main.java.com.djrapitops.plan.data.listeners;
import com.djrapitops.plugin.api.TimeAmount; import com.djrapitops.plugin.api.TimeAmount;
import com.djrapitops.plugin.task.AbsRunnable; import com.djrapitops.plugin.task.AbsRunnable;
import java.util.ArrayList;
import java.util.List;
import main.java.com.djrapitops.plan.Log; import main.java.com.djrapitops.plan.Log;
import main.java.com.djrapitops.plan.Plan; import main.java.com.djrapitops.plan.Plan;
import main.java.com.djrapitops.plan.data.TPS; import main.java.com.djrapitops.plan.data.TPS;
import main.java.com.djrapitops.plan.data.cache.DataCacheHandler; import main.java.com.djrapitops.plan.data.cache.DataCacheHandler;
import main.java.com.djrapitops.plan.utilities.MiscUtils; import main.java.com.djrapitops.plan.utilities.MiscUtils;
import java.util.ArrayList;
import java.util.List;
/** /**
* Class responsible for calculating TPS every second. * Class responsible for calculating TPS every second.
* *
@ -32,15 +33,15 @@ public class TPSCountTimer extends AbsRunnable {
@Override @Override
public void run() { public void run() {
long nanotime = System.nanoTime(); long nanoTime = System.nanoTime();
long now = MiscUtils.getTime(); long now = MiscUtils.getTime();
long diff = nanotime - lastCheckNano; long diff = nanoTime - lastCheckNano;
lastCheckNano = nanotime; lastCheckNano = nanoTime;
if (diff > nanotime) { // First run's diff = nanotime + 1, no calc possible. if (diff > nanoTime) { // First run's diff = nanoTime + 1, no calc possible.
Log.debug("First run of TPSCountTimer Task."); Log.debug("First run of TPSCountTimer Task.");
return; return;
} }
diff -= TimeAmount.MILLISECOND.ns() * 40L; // 40ms Removed because the run appears to take 40-50ms, scewing the tps. diff -= TimeAmount.MILLISECOND.ns() * 40L; // 40ms removed because the run appears to take 40-50ms, screwing the tps.
TPS tps = calculateTPS(diff, now); TPS tps = calculateTPS(diff, now);
history.add(tps); history.add(tps);
if (history.size() >= 60) { if (history.size() >= 60) {

View File

@ -1,26 +1,17 @@
package main.java.com.djrapitops.plan.database; package main.java.com.djrapitops.plan.database;
import java.sql.SQLException;
import java.util.*;
import main.java.com.djrapitops.plan.Plan; import main.java.com.djrapitops.plan.Plan;
import main.java.com.djrapitops.plan.data.UserData; import main.java.com.djrapitops.plan.data.UserData;
import main.java.com.djrapitops.plan.data.cache.DBCallableProcessor; import main.java.com.djrapitops.plan.data.cache.DBCallableProcessor;
import main.java.com.djrapitops.plan.database.tables.CommandUseTable; import main.java.com.djrapitops.plan.database.tables.*;
import main.java.com.djrapitops.plan.database.tables.GMTimesTable;
import main.java.com.djrapitops.plan.database.tables.IPsTable; import java.sql.SQLException;
import main.java.com.djrapitops.plan.database.tables.KillsTable; import java.util.*;
import main.java.com.djrapitops.plan.database.tables.LocationsTable;
import main.java.com.djrapitops.plan.database.tables.NicknamesTable;
import main.java.com.djrapitops.plan.database.tables.SecurityTable;
import main.java.com.djrapitops.plan.database.tables.SessionsTable;
import main.java.com.djrapitops.plan.database.tables.TPSTable;
import main.java.com.djrapitops.plan.database.tables.UsersTable;
import main.java.com.djrapitops.plan.database.tables.VersionTable;
/** /**
* Abstract class representing a Database. * Abstract class representing a Database.
* *
* All methods should be only called from an asyncronous thread, unless stated * All methods should be only called from an asynchronous thread, unless stated
* otherwise. * otherwise.
* *
* @author Rsl1122 * @author Rsl1122

View File

@ -1,20 +1,23 @@
package main.java.com.djrapitops.plan.database.databases; package main.java.com.djrapitops.plan.database.databases;
import com.djrapitops.plugin.task.AbsRunnable; import com.djrapitops.plugin.task.AbsRunnable;
import main.java.com.djrapitops.plan.Log;
import main.java.com.djrapitops.plan.Plan;
import main.java.com.djrapitops.plan.data.KillData;
import main.java.com.djrapitops.plan.data.SessionData;
import main.java.com.djrapitops.plan.data.UserData;
import main.java.com.djrapitops.plan.data.cache.DBCallableProcessor;
import main.java.com.djrapitops.plan.database.Database;
import main.java.com.djrapitops.plan.database.tables.*;
import main.java.com.djrapitops.plan.utilities.Benchmark;
import main.java.com.djrapitops.plan.utilities.FormatUtils;
import java.net.InetAddress; import java.net.InetAddress;
import java.sql.Connection; import java.sql.Connection;
import java.sql.SQLException; import java.sql.SQLException;
import java.util.*; import java.util.*;
import java.util.function.Function; import java.util.function.Function;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import main.java.com.djrapitops.plan.Log;
import main.java.com.djrapitops.plan.Plan;
import main.java.com.djrapitops.plan.data.*;
import main.java.com.djrapitops.plan.data.cache.DBCallableProcessor;
import main.java.com.djrapitops.plan.database.Database;
import main.java.com.djrapitops.plan.database.tables.*;
import main.java.com.djrapitops.plan.utilities.Benchmark;
import main.java.com.djrapitops.plan.utilities.FormatUtils;
/** /**
* *
@ -52,8 +55,6 @@ public abstract class SQLDB extends Database {
} }
/** /**
*
* @param plugin
* @throws IllegalArgumentException * @throws IllegalArgumentException
* @throws IllegalStateException * @throws IllegalStateException
*/ */
@ -318,7 +319,7 @@ public abstract class SQLDB extends Database {
List<SessionData> sessions = sessionsTable.getSessionData(userId); List<SessionData> sessions = sessionsTable.getSessionData(userId);
data.addSessions(sessions); data.addSessions(sessions);
data.setPlayerKills(killsTable.getPlayerKills(userId)); data.setPlayerKills(killsTable.getPlayerKills(userId));
processors.stream().forEach((processor) -> processor.process(data)); processors.forEach((processor) -> processor.process(data));
Benchmark.stop("Database: Give userdata to processors"); Benchmark.stop("Database: Give userdata to processors");
setAvailable(); setAvailable();
} }

View File

@ -1,16 +1,13 @@
package main.java.com.djrapitops.plan.database.tables; package main.java.com.djrapitops.plan.database.tables;
import main.java.com.djrapitops.plan.Log;
import main.java.com.djrapitops.plan.database.databases.SQLDB;
import main.java.com.djrapitops.plan.utilities.Benchmark;
import java.sql.PreparedStatement; import java.sql.PreparedStatement;
import java.sql.ResultSet; import java.sql.ResultSet;
import java.sql.SQLException; import java.sql.SQLException;
import java.util.Collection; import java.util.*;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import main.java.com.djrapitops.plan.Log;
import main.java.com.djrapitops.plan.database.databases.SQLDB;
import main.java.com.djrapitops.plan.utilities.Benchmark;
/** /**
* *
@ -151,7 +148,7 @@ public class GMTimesTable extends Table {
} }
PreparedStatement statement = null; PreparedStatement statement = null;
String[] gms = getGMKeyArray(); String[] gms = getGMKeyArray();
int update = 0; int update;
try { try {
statement = prepareStatement( statement = prepareStatement(
"UPDATE " + tableName + " SET " "UPDATE " + tableName + " SET "

View File

@ -246,9 +246,6 @@ public class UsersTable extends Table {
set = statement.executeQuery(); set = statement.executeQuery();
while (set.next()) { while (set.next()) {
UUID uuid = UUID.fromString(set.getString(columnUUID)); UUID uuid = UUID.fromString(set.getString(columnUUID));
if (uuid == null) {
continue;
}
uuids.add(uuid); uuids.add(uuid);
} }
return uuids; return uuids;

View File

@ -1,8 +1,9 @@
package main.java.com.djrapitops.plan.ui.html; package main.java.com.djrapitops.plan.ui.html;
import java.util.List;
import main.java.com.djrapitops.plan.utilities.HtmlUtils; import main.java.com.djrapitops.plan.utilities.HtmlUtils;
import java.util.List;
/** /**
* *
* @author Rsl1122 * @author Rsl1122
@ -12,8 +13,8 @@ public class RecentPlayersButtonsCreator {
/** /**
* Creates recent players buttons inside a p-tag. * Creates recent players buttons inside a p-tag.
* *
* @param names Playernames sorted by last playtime. * @param names The name of players sorted by last playtime.
* @param limit How many playes will be shown * @param limit How many players will be shown
* @return html p-tag list of recent logins. * @return html p-tag list of recent logins.
*/ */
public static String createRecentLoginsButtons(List<String> names, int limit) { public static String createRecentLoginsButtons(List<String> names, int limit) {

View File

@ -1,15 +1,5 @@
package main.java.com.djrapitops.plan.ui.html.graphs; package main.java.com.djrapitops.plan.ui.html.graphs;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.function.Function;
import java.util.stream.Collectors;
import main.java.com.djrapitops.plan.Plan; import main.java.com.djrapitops.plan.Plan;
import main.java.com.djrapitops.plan.Settings; import main.java.com.djrapitops.plan.Settings;
import main.java.com.djrapitops.plan.data.SessionData; import main.java.com.djrapitops.plan.data.SessionData;
@ -19,6 +9,11 @@ import main.java.com.djrapitops.plan.utilities.MiscUtils;
import main.java.com.djrapitops.plan.utilities.analysis.MathUtils; import main.java.com.djrapitops.plan.utilities.analysis.MathUtils;
import main.java.com.djrapitops.plan.utilities.analysis.Point; import main.java.com.djrapitops.plan.utilities.analysis.Point;
import java.io.Serializable;
import java.util.*;
import java.util.function.Function;
import java.util.stream.Collectors;
/** /**
* *
* @author Rsl1122 * @author Rsl1122
@ -84,11 +79,11 @@ public class PlayerActivityGraphCreator {
} }
if (Settings.ANALYSIS_REMOVE_OUTLIERS.isTrue()) { if (Settings.ANALYSIS_REMOVE_OUTLIERS.isTrue()) {
long average = MathUtils.averageLong(playersOnline.stream()); long average = MathUtils.averageLong(playersOnline.stream());
double standardDiviation = getStandardDiviation(playersOnline, average); double standardDeviation = getStandardDeviation(playersOnline, average);
if (standardDiviation > 3.5) { if (standardDeviation > 3.5) {
for (int i = 0; i < playersOnline.size(); i++) { for (int i = 0; i < playersOnline.size(); i++) {
long value = playersOnline.get(i); long value = playersOnline.get(i);
if (value - average > 3 * standardDiviation) { if (value - average > 3 * standardDeviation) {
playersOnline.set(i, (long) Plan.getInstance().getVariable().getMaxPlayers() + 10); playersOnline.set(i, (long) Plan.getInstance().getVariable().getMaxPlayers() + 10);
} }
} }
@ -97,7 +92,7 @@ public class PlayerActivityGraphCreator {
return new String[]{playersOnline.toString(), labels.toString()}; return new String[]{playersOnline.toString(), labels.toString()};
} }
private static double getStandardDiviation(List<Long> players, long avg) { private static double getStandardDeviation(List<Long> players, long avg) {
List<Double> valueMinusAvg = players.stream() List<Double> valueMinusAvg = players.stream()
.map(p -> Math.pow(Math.abs(p - avg), 2)) .map(p -> Math.pow(Math.abs(p - avg), 2))
.collect(Collectors.toList()); .collect(Collectors.toList());
@ -112,7 +107,7 @@ public class PlayerActivityGraphCreator {
Set<Long> keys = new HashSet<>(starts.keySet()); Set<Long> keys = new HashSet<>(starts.keySet());
keys.addAll(ends.keySet()); keys.addAll(ends.keySet());
Map<Long, Integer> change = new HashMap<>(); Map<Long, Integer> change = new HashMap<>();
keys.stream().forEach((key) -> { keys.forEach((key) -> {
int value = 0; int value = 0;
if (starts.containsKey(key)) { if (starts.containsKey(key)) {
value += starts.get(key); value += starts.get(key);

View File

@ -67,13 +67,13 @@ public class PunchCardGraphCreator {
} }
if (Settings.ANALYSIS_REMOVE_OUTLIERS.isTrue()) { if (Settings.ANALYSIS_REMOVE_OUTLIERS.isTrue()) {
int avg = findAverage(dataArray); int avg = findAverage(dataArray);
double standardDiviation = getStandardDiviation(dataArray, avg); double standardDeviation = getStandardDeviation(dataArray, avg);
Log.debug("Diviation: " + standardDiviation); Log.debug("Deviation: " + standardDeviation);
if (standardDiviation > 3.5) { if (standardDeviation > 3.5) {
for (int i = 0; i < 7; i++) { for (int i = 0; i < 7; i++) {
for (int j = 0; j < 24; j++) { for (int j = 0; j < 24; j++) {
int value = dataArray[i][j]; int value = dataArray[i][j];
if (value - avg > 3 * standardDiviation) { if (value - avg > 3 * standardDeviation) {
dataArray[i][j] = avg; dataArray[i][j] = avg;
} }
} }
@ -83,7 +83,7 @@ public class PunchCardGraphCreator {
return dataArray; return dataArray;
} }
private static double getStandardDiviation(int[][] array, int avg) { private static double getStandardDeviation(int[][] array, int avg) {
int[][] valueMinusAvg = new int[7][24]; int[][] valueMinusAvg = new int[7][24];
for (int i = 0; i < 7; i++) { for (int i = 0; i < 7; i++) {
for (int j = 0; j < 24; j++) { for (int j = 0; j < 24; j++) {

View File

@ -1,13 +1,14 @@
package main.java.com.djrapitops.plan.ui.html.tables; package main.java.com.djrapitops.plan.ui.html.tables;
import java.util.Collections;
import java.util.List;
import java.util.Map;
import main.java.com.djrapitops.plan.Log; import main.java.com.djrapitops.plan.Log;
import main.java.com.djrapitops.plan.ui.html.Html; import main.java.com.djrapitops.plan.ui.html.Html;
import main.java.com.djrapitops.plan.utilities.Benchmark; import main.java.com.djrapitops.plan.utilities.Benchmark;
import main.java.com.djrapitops.plan.utilities.comparators.MapComparator; import main.java.com.djrapitops.plan.utilities.comparators.MapComparator;
import java.util.Collections;
import java.util.List;
import java.util.Map;
/** /**
* *
* @author Rsl1122 * @author Rsl1122
@ -38,6 +39,7 @@ public class CommandUseTableCreator {
Log.toLog("SortableCommandUseTableCreator", e); Log.toLog("SortableCommandUseTableCreator", e);
Log.toLog("Cause: " + values[0] + " " + values[1], Log.getErrorsFilename()); Log.toLog("Cause: " + values[0] + " " + values[1], Log.getErrorsFilename());
} }
i++;
} }
} }
Benchmark.stop("Create commanduse table"); Benchmark.stop("Create commanduse table");

View File

@ -127,7 +127,7 @@ public class Request implements Closeable {
/** /**
* Closes the Request. * Closes the Request.
* *
* Closes the inputstream. * Closes the InputStream.
* *
* @throws IOException if the stream can not be closed. * @throws IOException if the stream can not be closed.
*/ */

View File

@ -2,6 +2,20 @@ package main.java.com.djrapitops.plan.ui.webserver;
import com.djrapitops.plugin.task.AbsRunnable; import com.djrapitops.plugin.task.AbsRunnable;
import com.djrapitops.plugin.utilities.Verify; import com.djrapitops.plugin.utilities.Verify;
import main.java.com.djrapitops.plan.Log;
import main.java.com.djrapitops.plan.Phrase;
import main.java.com.djrapitops.plan.Plan;
import main.java.com.djrapitops.plan.Settings;
import main.java.com.djrapitops.plan.data.WebUser;
import main.java.com.djrapitops.plan.database.tables.SecurityTable;
import main.java.com.djrapitops.plan.ui.html.DataRequestHandler;
import main.java.com.djrapitops.plan.ui.webserver.response.*;
import main.java.com.djrapitops.plan.utilities.Benchmark;
import main.java.com.djrapitops.plan.utilities.HtmlUtils;
import main.java.com.djrapitops.plan.utilities.MiscUtils;
import main.java.com.djrapitops.plan.utilities.PassEncryptUtil;
import main.java.com.djrapitops.plan.utilities.uuid.UUIDUtility;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
import java.io.OutputStream; import java.io.OutputStream;
@ -12,26 +26,6 @@ import java.sql.SQLException;
import java.util.Base64; import java.util.Base64;
import java.util.UUID; import java.util.UUID;
import main.java.com.djrapitops.plan.Log;
import main.java.com.djrapitops.plan.Phrase;
import main.java.com.djrapitops.plan.Plan;
import main.java.com.djrapitops.plan.Settings;
import main.java.com.djrapitops.plan.data.WebUser;
import main.java.com.djrapitops.plan.database.tables.SecurityTable;
import main.java.com.djrapitops.plan.ui.html.DataRequestHandler;
import main.java.com.djrapitops.plan.ui.webserver.response.AnalysisPageResponse;
import main.java.com.djrapitops.plan.ui.webserver.response.InspectPageResponse;
import main.java.com.djrapitops.plan.ui.webserver.response.InternalErrorResponse;
import main.java.com.djrapitops.plan.ui.webserver.response.NotFoundResponse;
import main.java.com.djrapitops.plan.ui.webserver.response.PlayersPageResponse;
import main.java.com.djrapitops.plan.ui.webserver.response.RedirectResponse;
import main.java.com.djrapitops.plan.ui.webserver.response.Response;
import main.java.com.djrapitops.plan.utilities.Benchmark;
import main.java.com.djrapitops.plan.utilities.HtmlUtils;
import main.java.com.djrapitops.plan.utilities.MiscUtils;
import main.java.com.djrapitops.plan.utilities.PassEncryptUtil;
import main.java.com.djrapitops.plan.utilities.uuid.UUIDUtility;
/** /**
* *
* @author Rsl1122 * @author Rsl1122
@ -63,7 +57,7 @@ public class WebSocketServer {
} }
/** /**
* Starts up the Webserver in a Asyncronous thread. * Starts up the Webserver in a Asynchronous thread.
*/ */
public void initServer() { public void initServer() {
//Server is already enabled stop code //Server is already enabled stop code

View File

@ -1,13 +1,14 @@
package main.java.com.djrapitops.plan.ui.webserver.response; package main.java.com.djrapitops.plan.ui.webserver.response;
import java.io.OutputStream;
import java.util.List;
import main.java.com.djrapitops.plan.Plan; import main.java.com.djrapitops.plan.Plan;
import main.java.com.djrapitops.plan.data.UserData; import main.java.com.djrapitops.plan.data.UserData;
import main.java.com.djrapitops.plan.ui.html.Html; import main.java.com.djrapitops.plan.ui.html.Html;
import main.java.com.djrapitops.plan.utilities.HtmlUtils; import main.java.com.djrapitops.plan.utilities.HtmlUtils;
import main.java.com.djrapitops.plan.utilities.comparators.UserDataNameComparator; import main.java.com.djrapitops.plan.utilities.comparators.UserDataNameComparator;
import java.io.OutputStream;
import java.util.List;
/** /**
* *
* @author Rsl1122 * @author Rsl1122
@ -21,7 +22,7 @@ public class PlayersPageResponse extends Response {
super.setContent(buildContent(plugin.getInspectCache().getCachedUserData())); super.setContent(buildContent(plugin.getInspectCache().getCachedUserData()));
} }
public static final String buildContent(List<UserData> cached) { public static String buildContent(List<UserData> cached) {
StringBuilder html = new StringBuilder(); StringBuilder html = new StringBuilder();
int size = cached.size(); int size = cached.size();
html.append("<h1>Cached Players</h1><p>") html.append("<h1>Cached Players</h1><p>")

View File

@ -18,14 +18,14 @@ public abstract class Response {
/** /**
* Class Constructor. * Class Constructor.
* *
* @param output Website outputstream to write the response to. * @param output Website OutputStream to write the response to.
*/ */
public Response(OutputStream output) { public Response(OutputStream output) {
this.output = output; this.output = output;
} }
/** /**
* Wrties the HTML to the Outputstream according to the requested page. * Writes the HTML to the OutputStream according to the requested page.
* *
* @throws IOException * @throws IOException
*/ */

View File

@ -36,6 +36,7 @@ public class HtmlUtils {
resourceStream = plugin.getResource(fileName); resourceStream = plugin.getResource(fileName);
scanner = new Scanner(resourceStream); scanner = new Scanner(resourceStream);
} }
StringBuilder html = new StringBuilder(); StringBuilder html = new StringBuilder();
while (scanner.hasNextLine()) { while (scanner.hasNextLine()) {
String line = scanner.nextLine(); String line = scanner.nextLine();
@ -77,7 +78,7 @@ public class HtmlUtils {
String ip = Plan.getInstance().getVariable().getIp() + ":" + port; String ip = Plan.getInstance().getVariable().getIp() + ":" + port;
boolean useAlternativeIP = Settings.SHOW_ALTERNATIVE_IP.isTrue(); boolean useAlternativeIP = Settings.SHOW_ALTERNATIVE_IP.isTrue();
if (useAlternativeIP) { if (useAlternativeIP) {
ip = Settings.ALTERNATIVE_IP.toString().replaceAll("%port%", "" + port); ip = Settings.ALTERNATIVE_IP.toString().replace("%port%", "" + port);
} }
return "//" + ip + "/server"; return "//" + ip + "/server";
} }
@ -101,7 +102,7 @@ public class HtmlUtils {
String ip = Plan.getInstance().getVariable().getIp() + ":" + port; String ip = Plan.getInstance().getVariable().getIp() + ":" + port;
boolean useAlternativeIP = Settings.SHOW_ALTERNATIVE_IP.isTrue(); boolean useAlternativeIP = Settings.SHOW_ALTERNATIVE_IP.isTrue();
if (useAlternativeIP) { if (useAlternativeIP) {
ip = Settings.ALTERNATIVE_IP.toString().replaceAll("%port%", "" + port); ip = Settings.ALTERNATIVE_IP.toString().replace("%port%", "" + port);
} }
return "//" + ip + "/player/" + playerName; return "//" + ip + "/player/" + playerName;
} }
@ -163,7 +164,7 @@ public class HtmlUtils {
StringBuilder html = new StringBuilder(); StringBuilder html = new StringBuilder();
html.append(Html.HEADER.parse(name)); html.append(Html.HEADER.parse(name));
html.append(Html.PLUGIN_CONTAINER_START.parse()); html.append(Html.PLUGIN_CONTAINER_START.parse());
placeholders.stream().forEach(html::append); placeholders.forEach(html::append);
html.append("</div>"); html.append("</div>");
return html.toString(); return html.toString();
} }
@ -179,13 +180,13 @@ public class HtmlUtils {
Html.COLOR_a, Html.COLOR_b, Html.COLOR_c, Html.COLOR_d, Html.COLOR_e, Html.COLOR_f}; Html.COLOR_a, Html.COLOR_b, Html.COLOR_c, Html.COLOR_d, Html.COLOR_e, Html.COLOR_f};
for (Html html : replacer) { for (Html html : replacer) {
string = string.replaceAll("§" + html.name().charAt(6), html.parse()); string = string.replace("§" + html.name().charAt(6), html.parse());
} }
int spans = string.split("<span").length - 1; int spans = string.split("<span").length - 1;
for (int i = 0; i < spans; i++) { for (int i = 0; i < spans; i++) {
string = Html.SPAN.parse(string); string = Html.SPAN.parse(string);
} }
return string.replaceAll("§r", ""); return string.replace("§r", "");
} }
public static String separateWithQuotes(String... strings) { public static String separateWithQuotes(String... strings) {

View File

@ -29,7 +29,7 @@ public class ManageUtils {
*/ */
public static boolean backup(String dbName, Database copyFromDB) throws SQLException { public static boolean backup(String dbName, Database copyFromDB) throws SQLException {
Plan plugin = Plan.getInstance(); Plan plugin = Plan.getInstance();
String timeStamp = new Date().toString().substring(4, 10).replaceAll(" ", "-").replaceAll(":", "-"); String timeStamp = new Date().toString().substring(4, 10).replace(" ", "-");
String fileName = dbName + "-backup-" + timeStamp; String fileName = dbName + "-backup-" + timeStamp;
SQLiteDB backupDB = new SQLiteDB(plugin, fileName); SQLiteDB backupDB = new SQLiteDB(plugin, fileName);
Collection<UUID> uuids = ManageUtils.getUUIDS(copyFromDB); Collection<UUID> uuids = ManageUtils.getUUIDS(copyFromDB);
@ -95,7 +95,7 @@ public class ManageUtils {
.anyMatch(s -> sessions.stream() .anyMatch(s -> sessions.stream()
.filter(ses -> !ses.equals(s)) .filter(ses -> !ses.equals(s))
.map(SessionData::getSessionStart) .map(SessionData::getSessionStart)
.anyMatch((Long start) -> (Math.abs(s.getSessionEnd() - start) < threshold))); .anyMatch(start -> Math.abs(s.getSessionEnd() - start) < threshold));
} }
/** /**

View File

@ -1,11 +1,11 @@
package main.java.com.djrapitops.plan.utilities; package main.java.com.djrapitops.plan.utilities;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.security.spec.InvalidKeySpecException;
import javax.crypto.SecretKeyFactory; import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.PBEKeySpec; import javax.crypto.spec.PBEKeySpec;
import javax.xml.bind.DatatypeConverter; import javax.xml.bind.DatatypeConverter;
import java.security.NoSuchAlgorithmException;
import java.security.SecureRandom;
import java.security.spec.InvalidKeySpecException;
/** /**
* Password Encryption utility. * Password Encryption utility.
@ -98,7 +98,7 @@ public class PassEncryptUtil {
); );
} }
int iterations = 0; int iterations;
try { try {
iterations = Integer.parseInt(params[ITERATION_INDEX]); iterations = Integer.parseInt(params[ITERATION_INDEX]);
} catch (NumberFormatException ex) { } catch (NumberFormatException ex) {
@ -113,7 +113,7 @@ public class PassEncryptUtil {
); );
} }
byte[] salt = null; byte[] salt;
try { try {
salt = fromBase64(params[SALT_INDEX]); salt = fromBase64(params[SALT_INDEX]);
} catch (IllegalArgumentException ex) { } catch (IllegalArgumentException ex) {
@ -122,7 +122,7 @@ public class PassEncryptUtil {
); );
} }
byte[] hash = null; byte[] hash;
try { try {
hash = fromBase64(params[PBKDF2_INDEX]); hash = fromBase64(params[PBKDF2_INDEX]);
} catch (IllegalArgumentException ex) { } catch (IllegalArgumentException ex) {
@ -131,7 +131,7 @@ public class PassEncryptUtil {
); );
} }
int storedHashSize = 0; int storedHashSize;
try { try {
storedHashSize = Integer.parseInt(params[HASH_SIZE_INDEX]); storedHashSize = Integer.parseInt(params[HASH_SIZE_INDEX]);
} catch (NumberFormatException ex) { } catch (NumberFormatException ex) {

View File

@ -1,33 +1,16 @@
package main.java.com.djrapitops.plan.utilities.analysis; package main.java.com.djrapitops.plan.utilities.analysis;
import com.djrapitops.plugin.task.AbsRunnable; import com.djrapitops.plugin.task.AbsRunnable;
import com.djrapitops.plugin.task.ITask;
import com.djrapitops.plugin.utilities.Verify; import com.djrapitops.plugin.utilities.Verify;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import java.util.stream.Collectors;
import main.java.com.djrapitops.plan.Log; import main.java.com.djrapitops.plan.Log;
import main.java.com.djrapitops.plan.Phrase; import main.java.com.djrapitops.plan.Phrase;
import main.java.com.djrapitops.plan.Plan; import main.java.com.djrapitops.plan.Plan;
import main.java.com.djrapitops.plan.Settings; import main.java.com.djrapitops.plan.Settings;
import main.java.com.djrapitops.plan.data.AnalysisData; import main.java.com.djrapitops.plan.data.*;
import main.java.com.djrapitops.plan.data.KillData;
import main.java.com.djrapitops.plan.data.SessionData;
import main.java.com.djrapitops.plan.data.TPS;
import main.java.com.djrapitops.plan.data.UserData;
import main.java.com.djrapitops.plan.data.additional.AnalysisType; import main.java.com.djrapitops.plan.data.additional.AnalysisType;
import main.java.com.djrapitops.plan.data.additional.HookHandler; import main.java.com.djrapitops.plan.data.additional.HookHandler;
import main.java.com.djrapitops.plan.data.additional.PluginData; import main.java.com.djrapitops.plan.data.additional.PluginData;
import main.java.com.djrapitops.plan.data.analysis.ActivityPart; import main.java.com.djrapitops.plan.data.analysis.*;
import main.java.com.djrapitops.plan.data.analysis.GamemodePart;
import main.java.com.djrapitops.plan.data.analysis.GeolocationPart;
import main.java.com.djrapitops.plan.data.analysis.JoinInfoPart;
import main.java.com.djrapitops.plan.data.analysis.KillPart;
import main.java.com.djrapitops.plan.data.analysis.PlayerCountPart;
import main.java.com.djrapitops.plan.data.analysis.PlaytimePart;
import main.java.com.djrapitops.plan.data.cache.AnalysisCacheHandler; import main.java.com.djrapitops.plan.data.cache.AnalysisCacheHandler;
import main.java.com.djrapitops.plan.data.cache.DataCacheHandler; import main.java.com.djrapitops.plan.data.cache.DataCacheHandler;
import main.java.com.djrapitops.plan.data.cache.InspectCacheHandler; import main.java.com.djrapitops.plan.data.cache.InspectCacheHandler;
@ -38,6 +21,9 @@ import main.java.com.djrapitops.plan.utilities.HtmlUtils;
import main.java.com.djrapitops.plan.utilities.MiscUtils; import main.java.com.djrapitops.plan.utilities.MiscUtils;
import main.java.com.djrapitops.plan.utilities.comparators.UserDataLastPlayedComparator; import main.java.com.djrapitops.plan.utilities.comparators.UserDataLastPlayedComparator;
import java.util.*;
import java.util.stream.Collectors;
/** /**
* *
* @author Rsl1122 * @author Rsl1122
@ -59,10 +45,10 @@ public class Analysis {
} }
/** /**
* Analyzes the data of all offlineplayers on the server. * Analyzes the data of all offline players on the server.
* *
* First retrieves all Offlineplayers and checks those that are in the * First retrieves all offline players and checks those that are in the
* database. Then Runs a new Analysis Task Asyncronously. Saves AnalysisData * database. Then Runs a new Analysis Task Asynchronously. Saves AnalysisData
* to the provided Cache. Saves all UserData to InspectCache for 15 minutes. * to the provided Cache. Saves all UserData to InspectCache for 15 minutes.
* *
* @param analysisCache Cache that the data is saved to. * @param analysisCache Cache that the data is saved to.
@ -74,7 +60,7 @@ public class Analysis {
plugin.processStatus().startExecution("Analysis"); plugin.processStatus().startExecution("Analysis");
log(Phrase.ANALYSIS_START + ""); log(Phrase.ANALYSIS_START + "");
// Async task for Analysis // Async task for Analysis
ITask asyncAnalysisTask = plugin.getRunnableFactory().createNew(new AbsRunnable("AnalysisTask") { plugin.getRunnableFactory().createNew(new AbsRunnable("AnalysisTask") {
@Override @Override
public void run() { public void run() {
taskId = this.getTaskId(); taskId = this.getTaskId();
@ -264,7 +250,7 @@ public class Analysis {
long now = MiscUtils.getTime(); long now = MiscUtils.getTime();
Benchmark.start("Analysis: Fill Dataset"); Benchmark.start("Analysis: Fill Dataset");
rawData.stream().forEach((uData) -> { rawData.forEach((uData) -> {
uData.access(); uData.access();
Map<String, Long> gmTimes = uData.getGmTimes(); Map<String, Long> gmTimes = uData.getGmTimes();
String[] gms = new String[]{"SURVIVAL", "CREATIVE", "ADVENTURE", "SPECTATOR"}; String[] gms = new String[]{"SURVIVAL", "CREATIVE", "ADVENTURE", "SPECTATOR"};

View File

@ -1,9 +1,5 @@
package main.java.com.djrapitops.plan.utilities.analysis; package main.java.com.djrapitops.plan.utilities.analysis;
import java.io.Serializable;
import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import main.java.com.djrapitops.plan.Log; import main.java.com.djrapitops.plan.Log;
import main.java.com.djrapitops.plan.Settings; import main.java.com.djrapitops.plan.Settings;
import main.java.com.djrapitops.plan.data.SessionData; import main.java.com.djrapitops.plan.data.SessionData;
@ -12,6 +8,11 @@ import main.java.com.djrapitops.plan.data.additional.PluginData;
import main.java.com.djrapitops.plan.utilities.FormatUtils; import main.java.com.djrapitops.plan.utilities.FormatUtils;
import main.java.com.djrapitops.plan.utilities.MiscUtils; import main.java.com.djrapitops.plan.utilities.MiscUtils;
import java.io.Serializable;
import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.Stream;
/** /**
* *
* @author Rsl1122 * @author Rsl1122
@ -216,7 +217,7 @@ public class AnalysisUtils {
long now = MiscUtils.getTime(); long now = MiscUtils.getTime();
long nowMinusScale = now - scale; long nowMinusScale = now - scale;
Set<UUID> uniqueJoins = new HashSet<>(); Set<UUID> uniqueJoins = new HashSet<>();
sessions.keySet().stream().forEach((uuid) -> { sessions.keySet().forEach((uuid) -> {
List<SessionData> s = sessions.get(uuid); List<SessionData> s = sessions.get(uuid);
for (SessionData session : s) { for (SessionData session : s) {
if (session.getSessionStart() < nowMinusScale) { if (session.getSessionStart() < nowMinusScale) {
@ -238,7 +239,7 @@ public class AnalysisUtils {
Map<Integer, Set<UUID>> uniqueJoins = new HashMap<>(); Map<Integer, Set<UUID>> uniqueJoins = new HashMap<>();
long now = MiscUtils.getTime(); long now = MiscUtils.getTime();
long nowMinusScale = now - scale; long nowMinusScale = now - scale;
sessions.keySet().stream().forEach((uuid) -> { sessions.keySet().forEach((uuid) -> {
List<SessionData> s = sessions.get(uuid); List<SessionData> s = sessions.get(uuid);
for (SessionData session : s) { for (SessionData session : s) {
if (scale != -1) { if (scale != -1) {

View File

@ -25,7 +25,8 @@ public class ExportUtility {
/** /**
* *
* @return @throws IOException * @return
* @throws IOException
*/ */
public static File getFolder() throws IOException { public static File getFolder() throws IOException {
String path = Settings.ANALYSIS_EXPORT_PATH.toString(); String path = Settings.ANALYSIS_EXPORT_PATH.toString();
@ -91,7 +92,7 @@ public class ExportUtility {
* @throws FileNotFoundException * @throws FileNotFoundException
* @throws IOException * @throws IOException
*/ */
public static void writeInspectHtml(UserData userData, File playersFolder) throws FileNotFoundException, IOException { public static void writeInspectHtml(UserData userData, File playersFolder) throws IOException {
if (!Settings.ANALYSIS_EXPORT.isTrue()) { if (!Settings.ANALYSIS_EXPORT.isTrue()) {
return; return;
} }
@ -100,9 +101,7 @@ public class ExportUtility {
File playerFolder = new File(playersFolder, userData.getName()); File playerFolder = new File(playersFolder, userData.getName());
playerFolder.mkdir(); playerFolder.mkdir();
File inspectHtmlFile = new File(playerFolder, "index.html"); File inspectHtmlFile = new File(playerFolder, "index.html");
if (inspectHtmlFile.exists()) { inspectHtmlFile.delete();
inspectHtmlFile.delete();
}
Files.write(inspectHtmlFile.toPath(), Collections.singletonList(inspectHtml)); Files.write(inspectHtmlFile.toPath(), Collections.singletonList(inspectHtml));
} }
@ -113,7 +112,7 @@ public class ExportUtility {
* @throws FileNotFoundException * @throws FileNotFoundException
* @throws IOException * @throws IOException
*/ */
public static void writeAnalysisHtml(AnalysisData analysisData, File serverFolder) throws FileNotFoundException, IOException { public static void writeAnalysisHtml(AnalysisData analysisData, File serverFolder) throws IOException {
if (!Settings.ANALYSIS_EXPORT.isTrue()) { if (!Settings.ANALYSIS_EXPORT.isTrue()) {
return; return;
} }
@ -121,16 +120,15 @@ public class ExportUtility {
PlaceholderUtils.getAnalysisReplaceRules(analysisData)) PlaceholderUtils.getAnalysisReplaceRules(analysisData))
.replace(HtmlUtils.getInspectUrl(""), "../player/"); .replace(HtmlUtils.getInspectUrl(""), "../player/");
File analysisHtmlFile = new File(serverFolder, "index.html"); File analysisHtmlFile = new File(serverFolder, "index.html");
if (analysisHtmlFile.exists()) { analysisHtmlFile.delete();
analysisHtmlFile.delete();
}
Files.write(analysisHtmlFile.toPath(), Collections.singletonList(analysisHtml)); Files.write(analysisHtmlFile.toPath(), Collections.singletonList(analysisHtml));
} }
private static void writePlayersPageHtml(List<UserData> rawData, File playersfolder) throws IOException { private static void writePlayersPageHtml(List<UserData> rawData, File playersFolder) throws IOException {
String playersHtml = PlayersPageResponse.buildContent(rawData); String playersHtml = PlayersPageResponse.buildContent(rawData);
playersfolder.mkdirs(); playersFolder.mkdirs();
File playersHtmlFile = new File(playersfolder, "index.html"); File playersHtmlFile = new File(playersFolder, "index.html");
Files.write(playersHtmlFile.toPath(), Collections.singletonList(playersHtml)); Files.write(playersHtmlFile.toPath(), Collections.singletonList(playersHtml));
} }

View File

@ -3,6 +3,8 @@ package main.java.com.djrapitops.plan.utilities.analysis;
import java.io.Serializable; import java.io.Serializable;
import java.util.Collection; import java.util.Collection;
import java.util.OptionalDouble; import java.util.OptionalDouble;
import java.util.OptionalInt;
import java.util.OptionalLong;
import java.util.stream.Stream; import java.util.stream.Stream;
/** /**
@ -124,13 +126,13 @@ public class MathUtils {
* @return * @return
*/ */
public static int getBiggest(Collection<Integer> values) { public static int getBiggest(Collection<Integer> values) {
int biggest = 1; OptionalInt biggest = values.stream().mapToInt(i -> i).max();
for (Integer value : values) {
if (value > biggest) { if (biggest.isPresent()) {
biggest = value; return biggest.getAsInt();
} } else {
return 1;
} }
return biggest;
} }
/** /**
@ -139,12 +141,12 @@ public class MathUtils {
* @return * @return
*/ */
public static long getBiggestLong(Collection<Long> values) { public static long getBiggestLong(Collection<Long> values) {
long biggest = 1; OptionalLong biggest = values.stream().mapToLong(i -> i).max();
for (Long value : values) {
if (value > biggest) { if (biggest.isPresent()) {
biggest = value; return biggest.getAsLong();
} } else {
return 1;
} }
return biggest;
} }
} }

View File

@ -20,7 +20,7 @@ public class MapComparator {
*/ */
public static List<String[]> sortByValue(Map<String, Integer> hashMap) { public static List<String[]> sortByValue(Map<String, Integer> hashMap) {
List<String[]> sortedList = new ArrayList<>(); List<String[]> sortedList = new ArrayList<>();
hashMap.keySet().stream().forEach((key) -> sortedList.add(new String[]{"" + hashMap.get(key), key})); hashMap.keySet().forEach((key) -> sortedList.add(new String[]{"" + hashMap.get(key), key}));
sortedList.sort(Comparator.comparingInt(strings -> Integer.parseInt(strings[0]))); sortedList.sort(Comparator.comparingInt(strings -> Integer.parseInt(strings[0])));
return sortedList; return sortedList;
} }
@ -32,7 +32,7 @@ public class MapComparator {
*/ */
public static List<String[]> sortByValueLong(Map<String, Long> hashMap) { public static List<String[]> sortByValueLong(Map<String, Long> hashMap) {
List<String[]> sortedList = new ArrayList<>(); List<String[]> sortedList = new ArrayList<>();
hashMap.keySet().stream().forEach((key) -> sortedList.add(new String[]{"" + hashMap.get(key), key})); hashMap.keySet().forEach((key) -> sortedList.add(new String[]{"" + hashMap.get(key), key}));
sortedList.sort(Comparator.comparing(strings -> Long.valueOf(strings[0]))); sortedList.sort(Comparator.comparing(strings -> Long.valueOf(strings[0])));
return sortedList; return sortedList;
} }

View File

@ -41,6 +41,8 @@ Settings:
Customization: Customization:
ServerName: 'Plan' ServerName: 'Plan'
SmallHeadImagesOnAnalysisPlayerlist: true SmallHeadImagesOnAnalysisPlayerlist: true
Data:
DoNotLogUnknownCommands: false
Graphs: Graphs:
PlayersOnlineGraph: PlayersOnlineGraph:
UseMaxPlayersAsScale: true UseMaxPlayersAsScale: true

View File

@ -1,14 +1,6 @@
package test.java.main.java.com.djrapitops.plan.data; package test.java.main.java.com.djrapitops.plan.data;
import com.djrapitops.plugin.utilities.player.IOfflinePlayer; import com.djrapitops.plugin.utilities.player.IOfflinePlayer;
import java.io.IOException;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import main.java.com.djrapitops.plan.Plan; import main.java.com.djrapitops.plan.Plan;
import main.java.com.djrapitops.plan.data.SessionData; import main.java.com.djrapitops.plan.data.SessionData;
import main.java.com.djrapitops.plan.data.UserData; import main.java.com.djrapitops.plan.data.UserData;
@ -19,9 +11,15 @@ import org.junit.runner.RunWith;
import org.powermock.core.classloader.annotations.PrepareForTest; import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner; import org.powermock.modules.junit4.PowerMockRunner;
import test.java.utils.MockUtils; import test.java.utils.MockUtils;
import test.java.utils.TestInit;
import java.io.IOException;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.*;
import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue; import static org.junit.Assert.assertTrue;
import test.java.utils.TestInit;
/** /**
* *
@ -348,7 +346,7 @@ public class UserDataTest {
* @throws IOException * @throws IOException
*/ */
@Test @Test
public void testPlayerConstructorBrokenBanned() throws IOException, Exception { public void testPlayerConstructorBrokenBanned() throws Exception {
TestInit.init(); TestInit.init();
test = new UserData(MockUtils.mockBrokenPlayer()); test = new UserData(MockUtils.mockBrokenPlayer());
UserData expected = new UserData(UUID.fromString("45b0dfdb-f71d-4cf3-8c21-27c9d4c651db"), 1234567L, true, "SURVIVAL", "TestName", true); UserData expected = new UserData(UUID.fromString("45b0dfdb-f71d-4cf3-8c21-27c9d4c651db"), 1234567L, true, "SURVIVAL", "TestName", true);
@ -372,7 +370,7 @@ public class UserDataTest {
* @throws IOException * @throws IOException
*/ */
@Test @Test
public void testOfflinePlayerConstructorBrokenBanned() throws IOException, Exception { public void testOfflinePlayerConstructorBrokenBanned() throws Exception {
TestInit.init(); TestInit.init();
test = new UserData((IOfflinePlayer) MockUtils.mockBrokenPlayer()); test = new UserData((IOfflinePlayer) MockUtils.mockBrokenPlayer());
UserData expected = new UserData(UUID.fromString("45b0dfdb-f71d-4cf3-8c21-27c9d4c651db"), 1234567L, true, "SURVIVAL", "TestName", true); UserData expected = new UserData(UUID.fromString("45b0dfdb-f71d-4cf3-8c21-27c9d4c651db"), 1234567L, true, "SURVIVAL", "TestName", true);

View File

@ -5,13 +5,6 @@
*/ */
package test.java.main.java.com.djrapitops.plan.data.cache.queue; package test.java.main.java.com.djrapitops.plan.data.cache.queue;
import java.io.File;
import java.io.IOException;
import java.nio.charset.Charset;
import java.nio.file.Files;
import java.sql.SQLException;
import java.util.UUID;
import java.util.stream.Collectors;
import main.java.com.djrapitops.plan.Plan; import main.java.com.djrapitops.plan.Plan;
import main.java.com.djrapitops.plan.data.UserData; import main.java.com.djrapitops.plan.data.UserData;
import main.java.com.djrapitops.plan.data.cache.DBCallableProcessor; import main.java.com.djrapitops.plan.data.cache.DBCallableProcessor;
@ -22,7 +15,6 @@ import main.java.com.djrapitops.plan.utilities.MiscUtils;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.plugin.java.JavaPlugin; import org.bukkit.plugin.java.JavaPlugin;
import org.junit.After; import org.junit.After;
import static org.junit.Assert.*;
import org.junit.Before; import org.junit.Before;
import org.junit.Ignore; import org.junit.Ignore;
import org.junit.Test; import org.junit.Test;
@ -32,6 +24,17 @@ import org.powermock.modules.junit4.PowerMockRunner;
import test.java.utils.MockUtils; import test.java.utils.MockUtils;
import test.java.utils.TestInit; import test.java.utils.TestInit;
import java.io.File;
import java.io.IOException;
import java.nio.charset.Charset;
import java.nio.file.Files;
import java.sql.SQLException;
import java.util.UUID;
import java.util.stream.Collectors;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
/** /**
* *
* @author Rsl1122 * @author Rsl1122
@ -56,7 +59,7 @@ public class DataCacheGetQueueTest {
* @throws Exception * @throws Exception
*/ */
@Before @Before
public void setUp() throws IOException, Exception { public void setUp() throws Exception {
TestInit t = TestInit.init(); TestInit t = TestInit.init();
assertTrue("Not set up", t.setUp()); assertTrue("Not set up", t.setUp());
plan = t.getPlanMock(); plan = t.getPlanMock();

View File

@ -5,22 +5,6 @@
*/ */
package test.java.main.java.com.djrapitops.plan.database; package test.java.main.java.com.djrapitops.plan.database;
import java.io.File;
import java.io.IOException;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.nio.charset.Charset;
import java.nio.file.Files;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Random;
import java.util.Set;
import java.util.UUID;
import java.util.stream.Collectors;
import main.java.com.djrapitops.plan.Plan; import main.java.com.djrapitops.plan.Plan;
import main.java.com.djrapitops.plan.data.KillData; import main.java.com.djrapitops.plan.data.KillData;
import main.java.com.djrapitops.plan.data.SessionData; import main.java.com.djrapitops.plan.data.SessionData;
@ -35,7 +19,8 @@ import main.java.com.djrapitops.plan.utilities.ManageUtils;
import main.java.com.djrapitops.plan.utilities.MiscUtils; import main.java.com.djrapitops.plan.utilities.MiscUtils;
import org.bukkit.Bukkit; import org.bukkit.Bukkit;
import org.bukkit.plugin.java.JavaPlugin; import org.bukkit.plugin.java.JavaPlugin;
import org.bukkit.scheduler.*; import org.bukkit.scheduler.BukkitRunnable;
import org.bukkit.scheduler.BukkitScheduler;
import org.junit.After; import org.junit.After;
import org.junit.Before; import org.junit.Before;
import org.junit.Ignore; import org.junit.Ignore;
@ -44,9 +29,20 @@ import org.junit.runner.RunWith;
import org.powermock.core.classloader.annotations.PrepareForTest; import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner; import org.powermock.modules.junit4.PowerMockRunner;
import test.java.utils.MockUtils; import test.java.utils.MockUtils;
import test.java.utils.TestInit;
import java.io.File;
import java.io.IOException;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.nio.charset.Charset;
import java.nio.file.Files;
import java.sql.SQLException;
import java.util.*;
import java.util.stream.Collectors;
import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue; import static org.junit.Assert.assertTrue;
import test.java.utils.TestInit;
/** /**
* *
@ -73,7 +69,7 @@ public class DatabaseTest {
* @throws Exception * @throws Exception
*/ */
@Before @Before
public void setUp() throws IOException, Exception { public void setUp() throws Exception {
TestInit t = TestInit.init(); TestInit t = TestInit.init();
plan = t.getPlanMock(); plan = t.getPlanMock();
db = new SQLiteDB(plan, "debug" + MiscUtils.getTime()) { db = new SQLiteDB(plan, "debug" + MiscUtils.getTime()) {

View File

@ -5,11 +5,8 @@
*/ */
package test.java.main.java.com.djrapitops.plan.utilities; package test.java.main.java.com.djrapitops.plan.utilities;
import java.io.FileNotFoundException;
import java.util.HashMap;
import main.java.com.djrapitops.plan.utilities.HtmlUtils; import main.java.com.djrapitops.plan.utilities.HtmlUtils;
import org.bukkit.plugin.java.JavaPlugin; import org.bukkit.plugin.java.JavaPlugin;
import static org.junit.Assert.*;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
@ -17,6 +14,12 @@ import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner; import org.powermock.modules.junit4.PowerMockRunner;
import test.java.utils.TestInit; import test.java.utils.TestInit;
import java.io.FileNotFoundException;
import java.util.HashMap;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue;
/** /**
* *
* @author Rsl1122 * @author Rsl1122
@ -81,7 +84,7 @@ public class HtmlUtilsTest {
* @throws FileNotFoundException * @throws FileNotFoundException
*/ */
@Test @Test
public void testGetServerAnalysisUrl() throws FileNotFoundException, Exception { public void testGetServerAnalysisUrl() throws Exception {
TestInit.init(); TestInit.init();
String result = HtmlUtils.getServerAnalysisUrlWithProtocol(); String result = HtmlUtils.getServerAnalysisUrlWithProtocol();
String exp = "http://0.0.0.0:8804/server"; String exp = "http://0.0.0.0:8804/server";

View File

@ -5,9 +5,6 @@
*/ */
package test.java.main.java.com.djrapitops.plan.utilities; package test.java.main.java.com.djrapitops.plan.utilities;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import main.java.com.djrapitops.plan.data.SessionData; import main.java.com.djrapitops.plan.data.SessionData;
import main.java.com.djrapitops.plan.utilities.ManageUtils; import main.java.com.djrapitops.plan.utilities.ManageUtils;
import org.bukkit.plugin.java.JavaPlugin; import org.bukkit.plugin.java.JavaPlugin;
@ -16,9 +13,14 @@ import org.junit.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
import org.powermock.core.classloader.annotations.PrepareForTest; import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner; import org.powermock.modules.junit4.PowerMockRunner;
import test.java.utils.TestInit;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue; import static org.junit.Assert.assertTrue;
import test.java.utils.TestInit;
/** /**
* *
@ -42,7 +44,7 @@ public class ManageUtilsTest {
* @throws Exception * @throws Exception
*/ */
@Before @Before
public void setUp() throws IOException, Exception { public void setUp() throws Exception {
TestInit t = TestInit.init(); TestInit t = TestInit.init();
assertTrue("Not set up", t.setUp()); assertTrue("Not set up", t.setUp());
} }
@ -173,5 +175,4 @@ public class ManageUtilsTest {
SessionData exp3 = new SessionData(threshold * 8, threshold * 10); SessionData exp3 = new SessionData(threshold * 8, threshold * 10);
assertEquals(exp3, result.get(2)); assertEquals(exp3, result.get(2));
} }
} }

View File

@ -2,8 +2,6 @@ package test.java.utils;
import com.djrapitops.plugin.utilities.player.Fetch; import com.djrapitops.plugin.utilities.player.Fetch;
import com.djrapitops.plugin.utilities.player.IPlayer; import com.djrapitops.plugin.utilities.player.IPlayer;
import java.net.InetAddress;
import java.util.UUID;
import main.java.com.djrapitops.plan.data.KillData; import main.java.com.djrapitops.plan.data.KillData;
import main.java.com.djrapitops.plan.data.SessionData; import main.java.com.djrapitops.plan.data.SessionData;
import main.java.com.djrapitops.plan.data.UserData; import main.java.com.djrapitops.plan.data.UserData;
@ -15,6 +13,10 @@ import org.bukkit.command.CommandSender;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.mockito.Mockito; import org.mockito.Mockito;
import org.powermock.api.mockito.PowerMockito; import org.powermock.api.mockito.PowerMockito;
import java.net.InetAddress;
import java.util.UUID;
import static org.powermock.api.mockito.PowerMockito.when; import static org.powermock.api.mockito.PowerMockito.when;
/** /**
@ -37,7 +39,7 @@ public class MockUtils {
return NewPlayerCreator.createNewPlayer(mockIPlayer()); return NewPlayerCreator.createNewPlayer(mockIPlayer());
} }
public static UserData mockUserWithmoreData() throws Exception { public static UserData mockUserWithMoreData() throws Exception {
UserData mock = mockUser(); UserData mock = mockUser();
mock.addIpAddress(InetAddress.getByName("247.183.163.155")); mock.addIpAddress(InetAddress.getByName("247.183.163.155"));
mock.addNickname("MoreNicks"); mock.addNickname("MoreNicks");

View File

@ -5,11 +5,6 @@ import com.djrapitops.plugin.utilities.BenchUtil;
import com.djrapitops.plugin.utilities.log.BukkitLog; import com.djrapitops.plugin.utilities.log.BukkitLog;
import com.djrapitops.plugin.utilities.player.Fetch; import com.djrapitops.plugin.utilities.player.Fetch;
import com.djrapitops.plugin.utilities.status.ProcessStatus; import com.djrapitops.plugin.utilities.status.ProcessStatus;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.nio.file.Files;
import java.util.logging.Logger;
import main.java.com.djrapitops.plan.Plan; import main.java.com.djrapitops.plan.Plan;
import main.java.com.djrapitops.plan.ServerVariableHolder; import main.java.com.djrapitops.plan.ServerVariableHolder;
import main.java.com.djrapitops.plan.Settings; import main.java.com.djrapitops.plan.Settings;
@ -18,6 +13,13 @@ import org.bukkit.Server;
import org.bukkit.configuration.InvalidConfigurationException; import org.bukkit.configuration.InvalidConfigurationException;
import org.bukkit.configuration.file.YamlConfiguration; import org.bukkit.configuration.file.YamlConfiguration;
import org.powermock.api.mockito.PowerMockito; import org.powermock.api.mockito.PowerMockito;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.nio.file.Files;
import java.util.logging.Logger;
import static org.junit.Assert.assertTrue; import static org.junit.Assert.assertTrue;
import static org.powermock.api.mockito.PowerMockito.when; import static org.powermock.api.mockito.PowerMockito.when;
@ -50,7 +52,7 @@ public class TestInit {
YamlConfiguration config = mockConfig(); YamlConfiguration config = mockConfig();
when(planMock.getConfig()).thenReturn(config); when(planMock.getConfig()).thenReturn(config);
File testFolder = getEmptyTestfolder(); File testFolder = getEmptyTestFolder();
when(planMock.getDataFolder()).thenReturn(testFolder); when(planMock.getDataFolder()).thenReturn(testFolder);
// Html Files // Html Files
@ -91,7 +93,7 @@ public class TestInit {
return mockServer; return mockServer;
} }
private File getEmptyTestfolder() throws IOException { private File getEmptyTestFolder() throws IOException {
File testFolder = new File("temporaryTestFolder"); File testFolder = new File("temporaryTestFolder");
if (testFolder.exists()) { if (testFolder.exists()) {
for (File f : testFolder.listFiles()) { for (File f : testFolder.listFiles()) {