[3.3.0] Optimizations & Customization settings
Fix #101 Add #104 #99 #103 #100
This commit is contained in:
parent
1cfb86c293
commit
c5d35b4445
|
@ -8,4 +8,6 @@
|
||||||
/PlanDebugger/
|
/PlanDebugger/
|
||||||
/ProjectHelper/nbproject/private/
|
/ProjectHelper/nbproject/private/
|
||||||
/ProjectHelper/nbproject/
|
/ProjectHelper/nbproject/
|
||||||
/ProjectHelper/target/
|
/ProjectHelper/target/
|
||||||
|
/Filetool/nbproject/private/
|
||||||
|
/Filetool/build/
|
|
@ -84,6 +84,7 @@ public class Log {
|
||||||
* @param message Message to log to Errors.txt [timestamp] Message
|
* @param message Message to log to Errors.txt [timestamp] Message
|
||||||
*/
|
*/
|
||||||
public static void toLog(String message) {
|
public static void toLog(String message) {
|
||||||
|
Log.debug(message);
|
||||||
Plan plan = Plan.getInstance();
|
Plan plan = Plan.getInstance();
|
||||||
if (plan == null) {
|
if (plan == null) {
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -385,7 +385,7 @@ public class Plan extends JavaPlugin {
|
||||||
}
|
}
|
||||||
return INSTANCE;
|
return INSTANCE;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Used to set the current instance of Plan.
|
* Used to set the current instance of Plan.
|
||||||
*
|
*
|
||||||
|
|
|
@ -20,6 +20,14 @@ public enum Settings {
|
||||||
USE_ALTERNATIVE_UI("Settings.UseTextUI"),
|
USE_ALTERNATIVE_UI("Settings.UseTextUI"),
|
||||||
GATHERLOCATIONS("Settings.Data.GatherLocations"),
|
GATHERLOCATIONS("Settings.Data.GatherLocations"),
|
||||||
SECURITY_IP_UUID("Settings.WebServer.Security.DisplayIPsAndUUIDs"),
|
SECURITY_IP_UUID("Settings.WebServer.Security.DisplayIPsAndUUIDs"),
|
||||||
|
ENABLED_AA("Customization.Plugins.Enabled.AdvancedAchievements"),
|
||||||
|
ENABLED_ESS("Customization.Plugins.Enabled.Essentials"),
|
||||||
|
ENABLED_FAC("Customization.Plugins.Enabled.Factions"),
|
||||||
|
ENABLED_JOB("Customization.Plugins.Enabled.Jobs"),
|
||||||
|
ENABLED_MCM("Customization.Plugins.Enabled.McMMO"),
|
||||||
|
ENABLED_ONT("Customization.Plugins.Enabled.OnTime"),
|
||||||
|
ENABLED_TOW("Customization.Plugins.Enabled.Towny"),
|
||||||
|
ENABLED_VAU("Customization.Plugins.Enabled.Vault"),
|
||||||
// Integer
|
// Integer
|
||||||
ANALYSIS_MINUTES_FOR_ACTIVE("Settings.Analysis.MinutesPlayedUntilConsidiredActive"),
|
ANALYSIS_MINUTES_FOR_ACTIVE("Settings.Analysis.MinutesPlayedUntilConsidiredActive"),
|
||||||
SAVE_CACHE_MIN("Settings.Cache.DataCache.SaveEveryXMinutes"),
|
SAVE_CACHE_MIN("Settings.Cache.DataCache.SaveEveryXMinutes"),
|
||||||
|
@ -41,6 +49,14 @@ public enum Settings {
|
||||||
WEBSERVER_IP("Settings.WebServer.InternalIP"),
|
WEBSERVER_IP("Settings.WebServer.InternalIP"),
|
||||||
SECURITY_CODE("Settings.WebServer.Security.AddressSecurityCode"),
|
SECURITY_CODE("Settings.WebServer.Security.AddressSecurityCode"),
|
||||||
//
|
//
|
||||||
|
SERVER_NAME("Customization.ServerName"),
|
||||||
|
//
|
||||||
|
FORMAT_DAYS("Customization.Formats.TimeAmount.Days"),
|
||||||
|
FORMAT_HOURS("Customization.Formats.TimeAmount.Hours"),
|
||||||
|
FORMAT_MINUTES("Customization.Formats.TimeAmount.Minutes"),
|
||||||
|
FORMAT_SECONDS("Customization.Formats.TimeAmount.Seconds"),
|
||||||
|
FORMAT_DECIMALS("Customization.Formats.DecimalPoints"),
|
||||||
|
//
|
||||||
COLOR_MAIN("Customization.Colors.Commands.Main"),
|
COLOR_MAIN("Customization.Colors.Commands.Main"),
|
||||||
COLOR_SEC("Customization.Colors.Commands.Secondary"),
|
COLOR_SEC("Customization.Colors.Commands.Secondary"),
|
||||||
COLOR_TER("Customization.Colors.Commands.Highlight"),
|
COLOR_TER("Customization.Colors.Commands.Highlight"),
|
||||||
|
|
|
@ -229,6 +229,9 @@ public class UserData {
|
||||||
* @param addIps a Collection of InetAddresses the player has logged from.
|
* @param addIps a Collection of InetAddresses the player has logged from.
|
||||||
*/
|
*/
|
||||||
public void addIpAddresses(Collection<InetAddress> addIps) {
|
public void addIpAddresses(Collection<InetAddress> addIps) {
|
||||||
|
if (addIps.isEmpty()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
ips.addAll(addIps.stream().filter(ip -> ip != null).collect(Collectors.toList()));
|
ips.addAll(addIps.stream().filter(ip -> ip != null).collect(Collectors.toList()));
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -940,4 +943,12 @@ public class UserData {
|
||||||
public void setClearAfterSave(boolean clearAfterSave) {
|
public void setClearAfterSave(boolean clearAfterSave) {
|
||||||
this.clearAfterSave = clearAfterSave;
|
this.clearAfterSave = clearAfterSave;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
public void setBanned(boolean isBanned) {
|
||||||
|
this.isBanned = isBanned;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setOnline(boolean isOnline) {
|
||||||
|
this.isOnline = isOnline;
|
||||||
|
}
|
||||||
|
}
|
|
@ -10,6 +10,7 @@ import java.util.Map;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
import java.util.stream.Collectors;
|
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.Settings;
|
||||||
import main.java.com.djrapitops.plan.data.additional.factions.FactionsHook;
|
import main.java.com.djrapitops.plan.data.additional.factions.FactionsHook;
|
||||||
import main.java.com.djrapitops.plan.data.additional.jobs.JobsHook;
|
import main.java.com.djrapitops.plan.data.additional.jobs.JobsHook;
|
||||||
import main.java.com.djrapitops.plan.data.additional.mcmmo.McmmoHook;
|
import main.java.com.djrapitops.plan.data.additional.mcmmo.McmmoHook;
|
||||||
|
@ -63,35 +64,51 @@ public class HookHandler {
|
||||||
|
|
||||||
private void hook() {
|
private void hook() {
|
||||||
try {
|
try {
|
||||||
AdvancedAchievementsHook advancedAchievementsHook = new AdvancedAchievementsHook(this);
|
if (Settings.ENABLED_AA.isTrue()) {
|
||||||
|
AdvancedAchievementsHook advancedAchievementsHook = new AdvancedAchievementsHook(this);
|
||||||
|
}
|
||||||
} catch (NoClassDefFoundError e) {
|
} catch (NoClassDefFoundError e) {
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
EssentialsHook essentialsHook = new EssentialsHook(this);
|
if (Settings.ENABLED_ESS.isTrue()) {
|
||||||
|
EssentialsHook essentialsHook = new EssentialsHook(this);
|
||||||
|
}
|
||||||
} catch (NoClassDefFoundError e) {
|
} catch (NoClassDefFoundError e) {
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
FactionsHook factionsHook = new FactionsHook(this);
|
if (Settings.ENABLED_FAC.isTrue()) {
|
||||||
|
FactionsHook factionsHook = new FactionsHook(this);
|
||||||
|
}
|
||||||
} catch (NoClassDefFoundError e) {
|
} catch (NoClassDefFoundError e) {
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
McmmoHook mcMmoHook = new McmmoHook(this);
|
if (Settings.ENABLED_MCM.isTrue()) {
|
||||||
|
McmmoHook mcMmoHook = new McmmoHook(this);
|
||||||
|
}
|
||||||
} catch (NoClassDefFoundError e) {
|
} catch (NoClassDefFoundError e) {
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
JobsHook jobsHook = new JobsHook(this);
|
if (Settings.ENABLED_JOB.isTrue()) {
|
||||||
|
JobsHook jobsHook = new JobsHook(this);
|
||||||
|
}
|
||||||
} catch (NoClassDefFoundError e) {
|
} catch (NoClassDefFoundError e) {
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
OnTimeHook onTimeHook = new OnTimeHook(this);
|
if (Settings.ENABLED_ONT.isTrue()) {
|
||||||
|
OnTimeHook onTimeHook = new OnTimeHook(this);
|
||||||
|
}
|
||||||
} catch (NoClassDefFoundError e) {
|
} catch (NoClassDefFoundError e) {
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
TownyHook townyHook = new TownyHook(this);
|
if (Settings.ENABLED_TOW.isTrue()) {
|
||||||
|
TownyHook townyHook = new TownyHook(this);
|
||||||
|
}
|
||||||
} catch (NoClassDefFoundError e) {
|
} catch (NoClassDefFoundError e) {
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
VaultHook vaultHook = new VaultHook(this);
|
if (Settings.ENABLED_VAU.isTrue()) {
|
||||||
|
VaultHook vaultHook = new VaultHook(this);
|
||||||
|
}
|
||||||
} catch (NoClassDefFoundError e) {
|
} catch (NoClassDefFoundError e) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,6 +6,7 @@ import com.gmail.nossr50.util.player.UserManager;
|
||||||
import java.io.Serializable;
|
import java.io.Serializable;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
|
import java.util.Collection;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
@ -15,7 +16,8 @@ import main.java.com.djrapitops.plan.ui.Html;
|
||||||
import main.java.com.djrapitops.plan.utilities.FormatUtils;
|
import main.java.com.djrapitops.plan.utilities.FormatUtils;
|
||||||
import main.java.com.djrapitops.plan.utilities.MathUtils;
|
import main.java.com.djrapitops.plan.utilities.MathUtils;
|
||||||
import org.apache.commons.lang.StringUtils;
|
import org.apache.commons.lang.StringUtils;
|
||||||
import static org.bukkit.Bukkit.getOfflinePlayers;
|
import static org.bukkit.Bukkit.getOnlinePlayers;
|
||||||
|
import org.bukkit.entity.Player;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* PluginData class for McMMO-plugin.
|
* PluginData class for McMMO-plugin.
|
||||||
|
@ -40,7 +42,7 @@ public class McmmoAnalysisSkillTable extends PluginData {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getHtmlReplaceValue(String modifierPrefix, UUID uuid) {
|
public String getHtmlReplaceValue(String modifierPrefix, UUID uuid) {
|
||||||
List<PlayerProfile> profiles = Arrays.stream(getOfflinePlayers())
|
List<PlayerProfile> profiles = getOnlinePlayers().stream()
|
||||||
.filter(p -> p != null)
|
.filter(p -> p != null)
|
||||||
.map(p -> UserManager.getOfflinePlayer(p))
|
.map(p -> UserManager.getOfflinePlayer(p))
|
||||||
.filter(u -> u != null)
|
.filter(u -> u != null)
|
||||||
|
|
|
@ -15,6 +15,7 @@ import java.util.Arrays;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
import main.java.com.djrapitops.plan.Plan;
|
||||||
import main.java.com.djrapitops.plan.data.additional.PluginData;
|
import main.java.com.djrapitops.plan.data.additional.PluginData;
|
||||||
import main.java.com.djrapitops.plan.ui.Html;
|
import main.java.com.djrapitops.plan.ui.Html;
|
||||||
import org.apache.commons.lang.StringUtils;
|
import org.apache.commons.lang.StringUtils;
|
||||||
|
@ -43,6 +44,9 @@ public class McmmoInspectSkillTable extends PluginData {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String getHtmlReplaceValue(String modifierPrefix, UUID uuid) {
|
public String getHtmlReplaceValue(String modifierPrefix, UUID uuid) {
|
||||||
|
if (!Plan.getInstance().getHandler().getDataCache().containsKey(uuid)) {
|
||||||
|
return parseContainer("", Html.TABLELINE_2.parse("User not known/online", ""));
|
||||||
|
}
|
||||||
McMMOPlayer user = UserManager.getOfflinePlayer(getOfflinePlayer(uuid));
|
McMMOPlayer user = UserManager.getOfflinePlayer(getOfflinePlayer(uuid));
|
||||||
if (user == null) {
|
if (user == null) {
|
||||||
return parseContainer("", Html.TABLELINE_2.parse("User not known/online", ""));
|
return parseContainer("", Html.TABLELINE_2.parse("User not known/online", ""));
|
||||||
|
|
|
@ -21,6 +21,7 @@ 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;
|
||||||
import main.java.com.djrapitops.plan.database.Database;
|
import main.java.com.djrapitops.plan.database.Database;
|
||||||
|
import main.java.com.djrapitops.plan.utilities.Benchmark;
|
||||||
import main.java.com.djrapitops.plan.utilities.MiscUtils;
|
import main.java.com.djrapitops.plan.utilities.MiscUtils;
|
||||||
import main.java.com.djrapitops.plan.utilities.NewPlayerCreator;
|
import main.java.com.djrapitops.plan.utilities.NewPlayerCreator;
|
||||||
import main.java.com.djrapitops.plan.utilities.comparators.HandlingInfoTimeComparator;
|
import main.java.com.djrapitops.plan.utilities.comparators.HandlingInfoTimeComparator;
|
||||||
|
@ -30,6 +31,7 @@ import org.bukkit.entity.Player;
|
||||||
import org.bukkit.scheduler.BukkitRunnable;
|
import org.bukkit.scheduler.BukkitRunnable;
|
||||||
import org.bukkit.scheduler.BukkitTask;
|
import org.bukkit.scheduler.BukkitTask;
|
||||||
import static org.bukkit.Bukkit.getOfflinePlayer;
|
import static org.bukkit.Bukkit.getOfflinePlayer;
|
||||||
|
import static org.bukkit.Bukkit.getOfflinePlayer;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This Class contains the Cache.
|
* This Class contains the Cache.
|
||||||
|
@ -191,6 +193,7 @@ public class DataCacheHandler extends LocationCache {
|
||||||
* @param data UserData object with the UUID inside used as key.
|
* @param data UserData object with the UUID inside used as key.
|
||||||
*/
|
*/
|
||||||
public void cache(UserData data) {
|
public void cache(UserData data) {
|
||||||
|
data.setOnline(true);
|
||||||
dataCache.put(data.getUuid(), data);
|
dataCache.put(data.getUuid(), data);
|
||||||
Log.info(Phrase.CACHE_ADD.parse(data.getUuid().toString()));
|
Log.info(Phrase.CACHE_ADD.parse(data.getUuid().toString()));
|
||||||
}
|
}
|
||||||
|
@ -246,11 +249,13 @@ public class DataCacheHandler extends LocationCache {
|
||||||
*/
|
*/
|
||||||
public void saveCacheOnDisable() {
|
public void saveCacheOnDisable() {
|
||||||
long time = MiscUtils.getTime();
|
long time = MiscUtils.getTime();
|
||||||
Log.debug("SaveCacheOnDisable! " + time);
|
Benchmark.start("SaveCacheOnDisable");
|
||||||
|
Log.debug("SaveCacheOnDisable!");
|
||||||
saveTask.stop();
|
saveTask.stop();
|
||||||
getTask.stop();
|
getTask.stop();
|
||||||
clearTask.stop();
|
clearTask.stop();
|
||||||
List<HandlingInfo> toProcess = processTask.stop();
|
List<HandlingInfo> toProcess = processTask.stop();
|
||||||
|
Benchmark.start("ProcessOnlineHandlingInfo");
|
||||||
Log.debug("ToProcess size: " + toProcess.size() + " DataCache size: " + dataCache.keySet().size());
|
Log.debug("ToProcess size: " + toProcess.size() + " DataCache size: " + dataCache.keySet().size());
|
||||||
Collection<? extends Player> onlinePlayers = Bukkit.getOnlinePlayers();
|
Collection<? extends Player> onlinePlayers = Bukkit.getOnlinePlayers();
|
||||||
Log.debug("Online: " + onlinePlayers.size());
|
Log.debug("Online: " + onlinePlayers.size());
|
||||||
|
@ -265,6 +270,7 @@ public class DataCacheHandler extends LocationCache {
|
||||||
Log.debug("ToProcess size_AFTER: " + toProcess.size() + " DataCache size: " + dataCache.keySet().size());
|
Log.debug("ToProcess size_AFTER: " + toProcess.size() + " DataCache size: " + dataCache.keySet().size());
|
||||||
Collections.sort(toProcess, new HandlingInfoTimeComparator());
|
Collections.sort(toProcess, new HandlingInfoTimeComparator());
|
||||||
processUnprocessedHandlingInfo(toProcess);
|
processUnprocessedHandlingInfo(toProcess);
|
||||||
|
Benchmark.stop("ProcessOnlineHandlingInfo");
|
||||||
List<UserData> data = new ArrayList<>();
|
List<UserData> data = new ArrayList<>();
|
||||||
data.addAll(dataCache.values());
|
data.addAll(dataCache.values());
|
||||||
Log.debug("SAVING, DataCache size: " + dataCache.keySet().size());
|
Log.debug("SAVING, DataCache size: " + dataCache.keySet().size());
|
||||||
|
@ -283,6 +289,7 @@ public class DataCacheHandler extends LocationCache {
|
||||||
} catch (SQLException e) {
|
} catch (SQLException e) {
|
||||||
Log.toLog(this.getClass().getName(), e);
|
Log.toLog(this.getClass().getName(), e);
|
||||||
}
|
}
|
||||||
|
Benchmark.stop("SaveCacheOnDisable");
|
||||||
Log.debug("SaveCacheOnDisable_END");
|
Log.debug("SaveCacheOnDisable_END");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -12,6 +12,7 @@ import org.bukkit.Bukkit;
|
||||||
import static org.bukkit.Bukkit.getOfflinePlayer;
|
import static org.bukkit.Bukkit.getOfflinePlayer;
|
||||||
import org.bukkit.GameMode;
|
import org.bukkit.GameMode;
|
||||||
import org.bukkit.OfflinePlayer;
|
import org.bukkit.OfflinePlayer;
|
||||||
|
import static org.bukkit.Bukkit.getOfflinePlayer;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
|
|
|
@ -19,10 +19,11 @@ import main.java.com.djrapitops.plan.data.*;
|
||||||
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 main.java.com.djrapitops.plan.database.tables.*;
|
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 org.bukkit.GameMode;
|
import org.bukkit.GameMode;
|
||||||
import org.bukkit.Location;
|
import org.bukkit.Location;
|
||||||
import org.bukkit.scheduler.BukkitRunnable;
|
import org.bukkit.scheduler.BukkitRunnable;
|
||||||
import static org.bukkit.Bukkit.getOfflinePlayer;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
|
@ -89,11 +90,18 @@ public abstract class SQLDB extends Database {
|
||||||
@Override
|
@Override
|
||||||
public boolean init() {
|
public boolean init() {
|
||||||
super.init();
|
super.init();
|
||||||
|
Benchmark.start("Database Init " + getConfigName());
|
||||||
try {
|
try {
|
||||||
return checkConnection();
|
if (!checkConnection()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
convertBukkitDataToDB();
|
||||||
|
return true;
|
||||||
} catch (SQLException e) {
|
} catch (SQLException e) {
|
||||||
Log.toLog(this.getClass().getName(), e);
|
Log.toLog(this.getClass().getName(), e);
|
||||||
return false;
|
return false;
|
||||||
|
} finally {
|
||||||
|
Benchmark.stop("Database Init " + getConfigName());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -121,21 +129,49 @@ public abstract class SQLDB extends Database {
|
||||||
}
|
}
|
||||||
if (newDatabase) {
|
if (newDatabase) {
|
||||||
Log.info("New Database created.");
|
Log.info("New Database created.");
|
||||||
setVersion(3);
|
setVersion(4);
|
||||||
}
|
}
|
||||||
|
Benchmark.start("Database create tables");
|
||||||
for (Table table : getAllTables()) {
|
for (Table table : getAllTables()) {
|
||||||
if (!table.createTable()) {
|
if (!table.createTable()) {
|
||||||
Log.error("Failed to create table: " + table.getTableName());
|
Log.error("Failed to create table: " + table.getTableName());
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!newDatabase && getVersion() < 3) {
|
Benchmark.stop("Database create tables");
|
||||||
setVersion(3);
|
if (!newDatabase && getVersion() < 4) {
|
||||||
|
setVersion(4);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void convertBukkitDataToDB() {
|
||||||
|
new BukkitRunnable() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
try {
|
||||||
|
Benchmark.start("Convert Bukkitdata to DB data");
|
||||||
|
Set<UUID> uuids = usersTable.getSavedUUIDs();
|
||||||
|
uuids.removeAll(usersTable.getContainsBukkitData(uuids));
|
||||||
|
if (uuids.isEmpty()) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
Log.info("Beginning Bukkit Data -> DB Conversion for " + uuids.size() + " players");
|
||||||
|
int id = plugin.getBootAnalysisTaskID();
|
||||||
|
if (id != -1) {
|
||||||
|
Log.info("Analysis | Cancelled Boot Analysis Due to conversion.");
|
||||||
|
plugin.getServer().getScheduler().cancelTask(id);
|
||||||
|
}
|
||||||
|
saveMultipleUserData(getUserDataForUUIDS(uuids));
|
||||||
|
Log.info("Conversion complete, took: " + FormatUtils.formatTimeAmount(Benchmark.stop("Convert Bukkitdata to DB data")) + " ms");
|
||||||
|
} catch (SQLException ex) {
|
||||||
|
Log.toLog(this.getClass().getName(), ex);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}.runTaskAsynchronously(plugin);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* @return
|
* @return
|
||||||
|
@ -212,22 +248,27 @@ public abstract class SQLDB extends Database {
|
||||||
@Override
|
@Override
|
||||||
public boolean removeAccount(String uuid) throws SQLException {
|
public boolean removeAccount(String uuid) throws SQLException {
|
||||||
try {
|
try {
|
||||||
checkConnection();
|
Benchmark.start("Database remove Account " + uuid);
|
||||||
} catch (Exception e) {
|
try {
|
||||||
Log.toLog(this.getClass().getName(), e);
|
checkConnection();
|
||||||
return false;
|
} catch (Exception e) {
|
||||||
|
Log.toLog(this.getClass().getName(), e);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
int userId = usersTable.getUserId(uuid);
|
||||||
|
if (userId == -1) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return locationsTable.removeUserLocations(userId)
|
||||||
|
&& ipsTable.removeUserIps(userId)
|
||||||
|
&& nicknamesTable.removeUserNicknames(userId)
|
||||||
|
&& gmTimesTable.removeUserGMTimes(userId)
|
||||||
|
&& sessionsTable.removeUserSessions(userId)
|
||||||
|
&& killsTable.removeUserKillsAndVictims(userId)
|
||||||
|
&& usersTable.removeUser(uuid);
|
||||||
|
} finally {
|
||||||
|
Benchmark.stop("Database remove Account " + uuid);
|
||||||
}
|
}
|
||||||
int userId = usersTable.getUserId(uuid);
|
|
||||||
if (userId == -1) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
return locationsTable.removeUserLocations(userId)
|
|
||||||
&& ipsTable.removeUserIps(userId)
|
|
||||||
&& nicknamesTable.removeUserNicknames(userId)
|
|
||||||
&& gmTimesTable.removeUserGMTimes(userId)
|
|
||||||
&& sessionsTable.removeUserSessions(userId)
|
|
||||||
&& killsTable.removeUserKillsAndVictims(userId)
|
|
||||||
&& usersTable.removeUser(uuid);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -238,6 +279,7 @@ public abstract class SQLDB extends Database {
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public void giveUserDataToProcessors(UUID uuid, Collection<DBCallableProcessor> processors) throws SQLException {
|
public void giveUserDataToProcessors(UUID uuid, Collection<DBCallableProcessor> processors) throws SQLException {
|
||||||
|
Benchmark.start("DB Give userdata to processors");
|
||||||
try {
|
try {
|
||||||
checkConnection();
|
checkConnection();
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
|
@ -250,8 +292,7 @@ public abstract class SQLDB extends Database {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
// Get the data
|
// Get the data
|
||||||
UserData data = new UserData(getOfflinePlayer(uuid), new DemographicsData());
|
UserData data = usersTable.getUserData(uuid);
|
||||||
usersTable.addUserInformationToUserData(data);
|
|
||||||
|
|
||||||
int userId = usersTable.getUserId(uuid);
|
int userId = usersTable.getUserId(uuid);
|
||||||
|
|
||||||
|
@ -272,34 +313,40 @@ public abstract class SQLDB extends Database {
|
||||||
for (DBCallableProcessor processor : processors) {
|
for (DBCallableProcessor processor : processors) {
|
||||||
processor.process(data);
|
processor.process(data);
|
||||||
}
|
}
|
||||||
|
Benchmark.stop("DB Give userdata to processors");
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public List<UserData> getUserDataForUUIDS(Collection<UUID> uuids) throws SQLException {
|
public List<UserData> getUserDataForUUIDS(Collection<UUID> uuidsCol) throws SQLException {
|
||||||
if (uuids == null || uuids.isEmpty()) {
|
if (uuidsCol == null || uuidsCol.isEmpty()) {
|
||||||
return new ArrayList<>();
|
return new ArrayList<>();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Benchmark.start("DB get UserData for " + uuidsCol.size());
|
||||||
Map<UUID, Integer> userIds = usersTable.getAllUserIds();
|
Map<UUID, Integer> userIds = usersTable.getAllUserIds();
|
||||||
List<UserData> data = new ArrayList<>();
|
Set<UUID> remove = new HashSet<>();
|
||||||
for (UUID uuid : uuids) {
|
for (UUID uuid : uuidsCol) {
|
||||||
if (!userIds.keySet().contains(uuid)) {
|
if (!userIds.containsKey(uuid)) {
|
||||||
continue;
|
remove.add(uuid);
|
||||||
}
|
}
|
||||||
UserData uData = new UserData(getOfflinePlayer(uuid), new DemographicsData());
|
|
||||||
data.add(uData);
|
|
||||||
}
|
}
|
||||||
|
List<UUID> uuids = new ArrayList<>(uuidsCol);
|
||||||
|
Log.debug("Data not found for: " + remove.size());
|
||||||
|
uuids.removeAll(remove);
|
||||||
|
Benchmark.start("Create UserData objects for " + userIds.size());
|
||||||
|
List<UserData> data = usersTable.getUserData(new ArrayList<>(uuids));
|
||||||
|
Benchmark.stop("Create UserData objects for " + userIds.size());
|
||||||
if (data.isEmpty()) {
|
if (data.isEmpty()) {
|
||||||
return data;
|
return data;
|
||||||
}
|
}
|
||||||
usersTable.addUserInformationToUserData(data);
|
|
||||||
Map<Integer, UUID> idUuidRel = userIds.entrySet().stream().collect(Collectors.toMap(Map.Entry::getValue, Map.Entry::getKey));
|
Map<Integer, UUID> idUuidRel = userIds.entrySet().stream().collect(Collectors.toMap(Map.Entry::getValue, Map.Entry::getKey));
|
||||||
List<Integer> ids = userIds.entrySet().stream().filter(e -> uuids.contains(e.getKey())).map(e -> e.getValue()).collect(Collectors.toList());
|
List<Integer> ids = userIds.entrySet().stream().filter(e -> uuids.contains(e.getKey())).map(e -> e.getValue()).collect(Collectors.toList());
|
||||||
Log.debug("Ids: "+ids);
|
Log.debug("Ids: " + ids.size());
|
||||||
Map<Integer, List<String>> nicknames = nicknamesTable.getNicknames(ids);
|
Map<Integer, List<String>> nicknames = nicknamesTable.getNicknames(ids);
|
||||||
Map<Integer, Set<InetAddress>> ipList = ipsTable.getIPList(ids);
|
Map<Integer, Set<InetAddress>> ipList = ipsTable.getIPList(ids);
|
||||||
Map<Integer, List<KillData>> playerKills = killsTable.getPlayerKills(ids, idUuidRel);
|
Map<Integer, List<KillData>> playerKills = killsTable.getPlayerKills(ids, idUuidRel);
|
||||||
Map<Integer, List<SessionData>> sessionData = sessionsTable.getSessionData(ids);
|
Map<Integer, List<SessionData>> sessionData = sessionsTable.getSessionData(ids);
|
||||||
Log.debug("Sizes: U:"+uuids.size()+" D:"+data.size()+" I:"+userIds.size()+" N:"+nicknames.size()+" I:"+ipList.size()+" K:"+playerKills.size()+" S:"+sessionData.size());
|
Log.debug("Sizes: UUID:" + uuids.size() + " DATA:" + data.size() + " ID:" + userIds.size() + " N:" + nicknames.size() + " I:" + ipList.size() + " K:" + playerKills.size() + " S:" + sessionData.size());
|
||||||
for (UserData uData : data) {
|
for (UserData uData : data) {
|
||||||
UUID uuid = uData.getUuid();
|
UUID uuid = uData.getUuid();
|
||||||
Integer id = userIds.get(uuid);
|
Integer id = userIds.get(uuid);
|
||||||
|
@ -309,6 +356,7 @@ public abstract class SQLDB extends Database {
|
||||||
uData.setPlayerKills(playerKills.get(id));
|
uData.setPlayerKills(playerKills.get(id));
|
||||||
uData.setGmTimes(gmTimesTable.getGMTimes(id));
|
uData.setGmTimes(gmTimesTable.getGMTimes(id));
|
||||||
}
|
}
|
||||||
|
Benchmark.stop("DB get UserData for " + uuidsCol.size());
|
||||||
return data;
|
return data;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -319,6 +367,7 @@ public abstract class SQLDB extends Database {
|
||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public void saveMultipleUserData(Collection<UserData> data) throws SQLException {
|
public void saveMultipleUserData(Collection<UserData> data) throws SQLException {
|
||||||
|
Benchmark.start("DB Save multiple Userdata");
|
||||||
checkConnection();
|
checkConnection();
|
||||||
if (data.isEmpty()) {
|
if (data.isEmpty()) {
|
||||||
return;
|
return;
|
||||||
|
@ -345,7 +394,7 @@ public abstract class SQLDB extends Database {
|
||||||
UserData uData = userDatas.get(uuid);
|
UserData uData = userDatas.get(uuid);
|
||||||
if (id == -1) {
|
if (id == -1) {
|
||||||
saveLast.add(uData);
|
saveLast.add(uData);
|
||||||
Log.debug("User not seen before, saving last: "+uuid);
|
Log.debug("User not seen before, saving last: " + uuid);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
uData.access();
|
uData.access();
|
||||||
|
@ -363,9 +412,11 @@ public abstract class SQLDB extends Database {
|
||||||
ipsTable.saveIPList(ips);
|
ipsTable.saveIPList(ips);
|
||||||
killsTable.savePlayerKills(kills, uuids);
|
killsTable.savePlayerKills(kills, uuids);
|
||||||
sessionsTable.saveSessionData(sessions);
|
sessionsTable.saveSessionData(sessions);
|
||||||
|
Benchmark.start("Save GMTimes");
|
||||||
for (Integer id : gmTimes.keySet()) {
|
for (Integer id : gmTimes.keySet()) {
|
||||||
gmTimesTable.saveGMTimes(id, gmTimes.get(id));
|
gmTimesTable.saveGMTimes(id, gmTimes.get(id));
|
||||||
}
|
}
|
||||||
|
Benchmark.stop("Save GMTimes");
|
||||||
for (Integer id : locations.keySet()) {
|
for (Integer id : locations.keySet()) {
|
||||||
UUID uuid = uuids.get(id);
|
UUID uuid = uuids.get(id);
|
||||||
if (uuid != null) {
|
if (uuid != null) {
|
||||||
|
@ -387,6 +438,7 @@ public abstract class SQLDB extends Database {
|
||||||
Log.error("SEVERE: MULTIPLE ERRORS OCCURRED: " + exceptions.size());
|
Log.error("SEVERE: MULTIPLE ERRORS OCCURRED: " + exceptions.size());
|
||||||
Log.toLog(this.getClass().getName(), exceptions);
|
Log.toLog(this.getClass().getName(), exceptions);
|
||||||
}
|
}
|
||||||
|
Benchmark.stop("DB Save multiple Userdata");
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -7,6 +7,7 @@ import java.util.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import main.java.com.djrapitops.plan.Log;
|
import main.java.com.djrapitops.plan.Log;
|
||||||
import main.java.com.djrapitops.plan.database.databases.SQLDB;
|
import main.java.com.djrapitops.plan.database.databases.SQLDB;
|
||||||
|
import main.java.com.djrapitops.plan.utilities.Benchmark;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
|
@ -52,6 +53,7 @@ public class CommandUseTable extends Table {
|
||||||
* @return @throws SQLException
|
* @return @throws SQLException
|
||||||
*/
|
*/
|
||||||
public Map<String, Integer> getCommandUse() throws SQLException {
|
public Map<String, Integer> getCommandUse() throws SQLException {
|
||||||
|
Benchmark.start("Get CommandUse");
|
||||||
Map<String, Integer> commandUse = new HashMap<>();
|
Map<String, Integer> commandUse = new HashMap<>();
|
||||||
PreparedStatement statement = null;
|
PreparedStatement statement = null;
|
||||||
ResultSet set = null;
|
ResultSet set = null;
|
||||||
|
@ -65,6 +67,7 @@ public class CommandUseTable extends Table {
|
||||||
} finally {
|
} finally {
|
||||||
close(set);
|
close(set);
|
||||||
close(statement);
|
close(statement);
|
||||||
|
Benchmark.stop("Get CommandUse");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -78,6 +81,7 @@ public class CommandUseTable extends Table {
|
||||||
if (data.isEmpty()) {
|
if (data.isEmpty()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
Benchmark.start("Save Commanduse");
|
||||||
PreparedStatement statement = null;
|
PreparedStatement statement = null;
|
||||||
try {
|
try {
|
||||||
if (!removeAllData()) {
|
if (!removeAllData()) {
|
||||||
|
@ -105,6 +109,7 @@ public class CommandUseTable extends Table {
|
||||||
}
|
}
|
||||||
} finally {
|
} finally {
|
||||||
close(statement);
|
close(statement);
|
||||||
|
Benchmark.stop("Save Commanduse");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -7,6 +7,7 @@ import java.util.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import main.java.com.djrapitops.plan.Log;
|
import main.java.com.djrapitops.plan.Log;
|
||||||
import main.java.com.djrapitops.plan.database.databases.SQLDB;
|
import main.java.com.djrapitops.plan.database.databases.SQLDB;
|
||||||
|
import main.java.com.djrapitops.plan.utilities.Benchmark;
|
||||||
import org.bukkit.GameMode;
|
import org.bukkit.GameMode;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -119,6 +120,7 @@ public class GMTimesTable extends Table {
|
||||||
if (gamemodeTimes == null || gamemodeTimes.isEmpty()) {
|
if (gamemodeTimes == null || gamemodeTimes.isEmpty()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
PreparedStatement statement = null;
|
PreparedStatement statement = null;
|
||||||
GameMode[] gms = new GameMode[]{GameMode.SURVIVAL, GameMode.CREATIVE, GameMode.ADVENTURE, GameMode.SPECTATOR};
|
GameMode[] gms = new GameMode[]{GameMode.SURVIVAL, GameMode.CREATIVE, GameMode.ADVENTURE, GameMode.SPECTATOR};
|
||||||
int update = 0;
|
int update = 0;
|
||||||
|
@ -145,11 +147,12 @@ public class GMTimesTable extends Table {
|
||||||
}
|
}
|
||||||
update = statement.executeUpdate();
|
update = statement.executeUpdate();
|
||||||
} finally {
|
} finally {
|
||||||
close(statement);
|
close(statement);
|
||||||
}
|
}
|
||||||
if (update == 0) {
|
if (update == 0) {
|
||||||
addNewGMTimesRow(userId, gamemodeTimes);
|
addNewGMTimesRow(userId, gamemodeTimes);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void addNewGMTimesRow(int userId, Map<GameMode, Long> gamemodeTimes) throws SQLException {
|
private void addNewGMTimesRow(int userId, Map<GameMode, Long> gamemodeTimes) throws SQLException {
|
||||||
|
|
|
@ -14,13 +14,14 @@ import java.util.Map;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import main.java.com.djrapitops.plan.Log;
|
import main.java.com.djrapitops.plan.Log;
|
||||||
import main.java.com.djrapitops.plan.database.databases.SQLDB;
|
import main.java.com.djrapitops.plan.database.databases.SQLDB;
|
||||||
|
import main.java.com.djrapitops.plan.utilities.Benchmark;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* @author Rsl1122
|
* @author Rsl1122
|
||||||
*/
|
*/
|
||||||
public class IPsTable extends Table {
|
public class IPsTable extends Table {
|
||||||
|
|
||||||
private final String columnUserID;
|
private final String columnUserID;
|
||||||
private final String columnIP;
|
private final String columnIP;
|
||||||
|
|
||||||
|
@ -83,6 +84,7 @@ public class IPsTable extends Table {
|
||||||
* @throws SQLException
|
* @throws SQLException
|
||||||
*/
|
*/
|
||||||
public List<InetAddress> getIPAddresses(int userId) throws SQLException {
|
public List<InetAddress> getIPAddresses(int userId) throws SQLException {
|
||||||
|
Benchmark.start("Get Ips");
|
||||||
PreparedStatement statement = null;
|
PreparedStatement statement = null;
|
||||||
ResultSet set = null;
|
ResultSet set = null;
|
||||||
try {
|
try {
|
||||||
|
@ -100,6 +102,7 @@ public class IPsTable extends Table {
|
||||||
} finally {
|
} finally {
|
||||||
close(set);
|
close(set);
|
||||||
close(statement);
|
close(statement);
|
||||||
|
Benchmark.stop("Get Ips");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -113,6 +116,7 @@ public class IPsTable extends Table {
|
||||||
if (ips == null) {
|
if (ips == null) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
Benchmark.start("Save Ips");
|
||||||
ips.removeAll(getIPAddresses(userId));
|
ips.removeAll(getIPAddresses(userId));
|
||||||
if (ips.isEmpty()) {
|
if (ips.isEmpty()) {
|
||||||
return;
|
return;
|
||||||
|
@ -138,13 +142,15 @@ public class IPsTable extends Table {
|
||||||
}
|
}
|
||||||
} finally {
|
} finally {
|
||||||
close(statement);
|
close(statement);
|
||||||
|
Benchmark.stop("Save Ips");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public Map<Integer, Set<InetAddress>> getIPList(Collection<Integer> ids) throws SQLException {
|
public Map<Integer, Set<InetAddress>> getIPList(Collection<Integer> ids) throws SQLException {
|
||||||
if (ids == null || ids.isEmpty()) {
|
if (ids == null || ids.isEmpty()) {
|
||||||
return new HashMap<>();
|
return new HashMap<>();
|
||||||
}
|
}
|
||||||
|
Benchmark.start("Get Ips Multiple " + ids.size());
|
||||||
PreparedStatement statement = null;
|
PreparedStatement statement = null;
|
||||||
ResultSet set = null;
|
ResultSet set = null;
|
||||||
try {
|
try {
|
||||||
|
@ -157,7 +163,6 @@ public class IPsTable extends Table {
|
||||||
while (set.next()) {
|
while (set.next()) {
|
||||||
Integer id = set.getInt(columnUserID);
|
Integer id = set.getInt(columnUserID);
|
||||||
if (!ids.contains(id)) {
|
if (!ids.contains(id)) {
|
||||||
Log.debug("Ips-Ids did not contain: " + id);
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
|
@ -169,13 +174,15 @@ public class IPsTable extends Table {
|
||||||
} finally {
|
} finally {
|
||||||
close(set);
|
close(set);
|
||||||
close(statement);
|
close(statement);
|
||||||
|
Benchmark.stop("Get Ips Multiple " + ids.size());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void saveIPList(Map<Integer, Set<InetAddress>> ips) throws SQLException {
|
public void saveIPList(Map<Integer, Set<InetAddress>> ips) throws SQLException {
|
||||||
if (ips == null || ips.isEmpty()) {
|
if (ips == null || ips.isEmpty()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
Benchmark.start("Save Ips Multiple " + ips.size());
|
||||||
Map<Integer, Set<InetAddress>> saved = getIPList(ips.keySet());
|
Map<Integer, Set<InetAddress>> saved = getIPList(ips.keySet());
|
||||||
PreparedStatement statement = null;
|
PreparedStatement statement = null;
|
||||||
try {
|
try {
|
||||||
|
@ -208,6 +215,7 @@ public class IPsTable extends Table {
|
||||||
}
|
}
|
||||||
} finally {
|
} finally {
|
||||||
close(statement);
|
close(statement);
|
||||||
|
Benchmark.stop("Get Ips Multiple " + ips.size());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -12,6 +12,7 @@ import java.util.UUID;
|
||||||
import main.java.com.djrapitops.plan.Log;
|
import main.java.com.djrapitops.plan.Log;
|
||||||
import main.java.com.djrapitops.plan.data.KillData;
|
import main.java.com.djrapitops.plan.data.KillData;
|
||||||
import main.java.com.djrapitops.plan.database.databases.SQLDB;
|
import main.java.com.djrapitops.plan.database.databases.SQLDB;
|
||||||
|
import main.java.com.djrapitops.plan.utilities.Benchmark;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
|
@ -89,6 +90,7 @@ public class KillsTable extends Table {
|
||||||
* @throws SQLException
|
* @throws SQLException
|
||||||
*/
|
*/
|
||||||
public List<KillData> getPlayerKills(int userId) throws SQLException {
|
public List<KillData> getPlayerKills(int userId) throws SQLException {
|
||||||
|
Benchmark.start("Get Kills");
|
||||||
UsersTable usersTable = db.getUsersTable();
|
UsersTable usersTable = db.getUsersTable();
|
||||||
PreparedStatement statement = null;
|
PreparedStatement statement = null;
|
||||||
ResultSet set = null;
|
ResultSet set = null;
|
||||||
|
@ -106,6 +108,7 @@ public class KillsTable extends Table {
|
||||||
} finally {
|
} finally {
|
||||||
close(set);
|
close(set);
|
||||||
close(statement);
|
close(statement);
|
||||||
|
Benchmark.stop("Get Kills");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -119,6 +122,7 @@ public class KillsTable extends Table {
|
||||||
if (kills == null) {
|
if (kills == null) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
Benchmark.start("Save Kills");
|
||||||
kills.removeAll(getPlayerKills(userId));
|
kills.removeAll(getPlayerKills(userId));
|
||||||
if (kills.isEmpty()) {
|
if (kills.isEmpty()) {
|
||||||
return;
|
return;
|
||||||
|
@ -148,6 +152,7 @@ public class KillsTable extends Table {
|
||||||
}
|
}
|
||||||
} finally {
|
} finally {
|
||||||
close(statement);
|
close(statement);
|
||||||
|
Benchmark.stop("Save Kills");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -155,7 +160,7 @@ public class KillsTable extends Table {
|
||||||
if (ids == null || ids.isEmpty()) {
|
if (ids == null || ids.isEmpty()) {
|
||||||
return new HashMap<>();
|
return new HashMap<>();
|
||||||
}
|
}
|
||||||
|
Benchmark.start("Get Kills multiple "+ids.size());
|
||||||
PreparedStatement statement = null;
|
PreparedStatement statement = null;
|
||||||
ResultSet set = null;
|
ResultSet set = null;
|
||||||
try {
|
try {
|
||||||
|
@ -169,7 +174,6 @@ public class KillsTable extends Table {
|
||||||
int killerID = set.getInt(columnKillerUserID);
|
int killerID = set.getInt(columnKillerUserID);
|
||||||
int victimID = set.getInt(columnVictimUserID);
|
int victimID = set.getInt(columnVictimUserID);
|
||||||
if (!ids.contains(killerID)) {
|
if (!ids.contains(killerID)) {
|
||||||
Log.debug("Kills-Ids did not contain: " + killerID);
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
UUID victimUUID = uuids.get(victimID);
|
UUID victimUUID = uuids.get(victimID);
|
||||||
|
@ -179,14 +183,15 @@ public class KillsTable extends Table {
|
||||||
} finally {
|
} finally {
|
||||||
close(set);
|
close(set);
|
||||||
close(statement);
|
close(statement);
|
||||||
|
Benchmark.stop("Get Kills multiple "+ids.size());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void savePlayerKills(Map<Integer, List<KillData>> kills, Map<Integer, UUID> uuids) throws SQLException {
|
public void savePlayerKills(Map<Integer, List<KillData>> kills, Map<Integer, UUID> uuids) throws SQLException {
|
||||||
if (kills == null || kills.isEmpty()) {
|
if (kills == null || kills.isEmpty()) {
|
||||||
Log.debug("Save multiple - Kills was empty.");
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
Benchmark.start("Save Kills multiple "+kills.size());
|
||||||
Map<Integer, List<KillData>> saved = getPlayerKills(kills.keySet(), uuids);
|
Map<Integer, List<KillData>> saved = getPlayerKills(kills.keySet(), uuids);
|
||||||
|
|
||||||
PreparedStatement statement = null;
|
PreparedStatement statement = null;
|
||||||
|
@ -201,7 +206,6 @@ public class KillsTable extends Table {
|
||||||
for (Integer id : kills.keySet()) {
|
for (Integer id : kills.keySet()) {
|
||||||
List<KillData> playerKills = kills.get(id);
|
List<KillData> playerKills = kills.get(id);
|
||||||
List<KillData> s = saved.get(id);
|
List<KillData> s = saved.get(id);
|
||||||
Log.debug("Saving:" + playerKills + " Saved: " + s);
|
|
||||||
if (s != null) {
|
if (s != null) {
|
||||||
playerKills.removeAll(s);
|
playerKills.removeAll(s);
|
||||||
}
|
}
|
||||||
|
@ -222,6 +226,7 @@ public class KillsTable extends Table {
|
||||||
}
|
}
|
||||||
} finally {
|
} finally {
|
||||||
close(statement);
|
close(statement);
|
||||||
|
Benchmark.stop("Save Kills multiple "+kills.size());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -9,6 +9,7 @@ import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import main.java.com.djrapitops.plan.Log;
|
import main.java.com.djrapitops.plan.Log;
|
||||||
import main.java.com.djrapitops.plan.database.databases.SQLDB;
|
import main.java.com.djrapitops.plan.database.databases.SQLDB;
|
||||||
|
import main.java.com.djrapitops.plan.utilities.Benchmark;
|
||||||
import org.bukkit.Location;
|
import org.bukkit.Location;
|
||||||
import org.bukkit.World;
|
import org.bukkit.World;
|
||||||
|
|
||||||
|
@ -91,6 +92,7 @@ public class LocationsTable extends Table {
|
||||||
* @throws SQLException
|
* @throws SQLException
|
||||||
*/
|
*/
|
||||||
public List<Location> getLocations(int userId, HashMap<String, World> worlds) throws SQLException {
|
public List<Location> getLocations(int userId, HashMap<String, World> worlds) throws SQLException {
|
||||||
|
Benchmark.start("Get Locations");
|
||||||
PreparedStatement statement = null;
|
PreparedStatement statement = null;
|
||||||
ResultSet set = null;
|
ResultSet set = null;
|
||||||
try {
|
try {
|
||||||
|
@ -105,6 +107,7 @@ public class LocationsTable extends Table {
|
||||||
} finally {
|
} finally {
|
||||||
close(set);
|
close(set);
|
||||||
close(statement);
|
close(statement);
|
||||||
|
Benchmark.stop("Get Locations");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -118,6 +121,7 @@ public class LocationsTable extends Table {
|
||||||
if (locations == null || locations.isEmpty()) {
|
if (locations == null || locations.isEmpty()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
Benchmark.start("Save Locations "+locations.size());
|
||||||
List<Location> newLocations = new ArrayList<>();
|
List<Location> newLocations = new ArrayList<>();
|
||||||
newLocations.addAll(locations);
|
newLocations.addAll(locations);
|
||||||
PreparedStatement statement = null;
|
PreparedStatement statement = null;
|
||||||
|
@ -149,6 +153,7 @@ public class LocationsTable extends Table {
|
||||||
}
|
}
|
||||||
} finally {
|
} finally {
|
||||||
close(statement);
|
close(statement);
|
||||||
|
Benchmark.stop("Save Locations "+locations.size());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -156,6 +161,7 @@ public class LocationsTable extends Table {
|
||||||
if (locations == null || locations.isEmpty()) {
|
if (locations == null || locations.isEmpty()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
Benchmark.start("Save Locations Multiple "+locations.size());
|
||||||
PreparedStatement statement = null;
|
PreparedStatement statement = null;
|
||||||
try {
|
try {
|
||||||
statement = prepareStatement("INSERT INTO " + tableName + " ("
|
statement = prepareStatement("INSERT INTO " + tableName + " ("
|
||||||
|
@ -188,6 +194,7 @@ public class LocationsTable extends Table {
|
||||||
}
|
}
|
||||||
} finally {
|
} finally {
|
||||||
close(statement);
|
close(statement);
|
||||||
|
Benchmark.stop("Save Locations Multiple "+locations.size());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -11,6 +11,7 @@ import java.util.Map;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import main.java.com.djrapitops.plan.Log;
|
import main.java.com.djrapitops.plan.Log;
|
||||||
import main.java.com.djrapitops.plan.database.databases.SQLDB;
|
import main.java.com.djrapitops.plan.database.databases.SQLDB;
|
||||||
|
import main.java.com.djrapitops.plan.utilities.Benchmark;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
|
@ -100,6 +101,7 @@ public class NicknamesTable extends Table {
|
||||||
* @throws SQLException
|
* @throws SQLException
|
||||||
*/
|
*/
|
||||||
public List<String> getNicknames(int userId) throws SQLException {
|
public List<String> getNicknames(int userId) throws SQLException {
|
||||||
|
Benchmark.start("Get Nicknames");
|
||||||
PreparedStatement statement = null;
|
PreparedStatement statement = null;
|
||||||
ResultSet set = null;
|
ResultSet set = null;
|
||||||
try {
|
try {
|
||||||
|
@ -126,6 +128,7 @@ public class NicknamesTable extends Table {
|
||||||
} finally {
|
} finally {
|
||||||
close(set);
|
close(set);
|
||||||
close(statement);
|
close(statement);
|
||||||
|
Benchmark.stop("Get Nicknames");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -140,6 +143,7 @@ public class NicknamesTable extends Table {
|
||||||
if (names == null || names.isEmpty()) {
|
if (names == null || names.isEmpty()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
Benchmark.start("Save Nicknames");
|
||||||
names.removeAll(getNicknames(userId));
|
names.removeAll(getNicknames(userId));
|
||||||
if (names.isEmpty()) {
|
if (names.isEmpty()) {
|
||||||
return;
|
return;
|
||||||
|
@ -165,6 +169,7 @@ public class NicknamesTable extends Table {
|
||||||
}
|
}
|
||||||
} finally {
|
} finally {
|
||||||
close(statement);
|
close(statement);
|
||||||
|
Benchmark.stop("Save Nicknames");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -172,7 +177,7 @@ public class NicknamesTable extends Table {
|
||||||
if (ids == null || ids.isEmpty()) {
|
if (ids == null || ids.isEmpty()) {
|
||||||
return new HashMap<>();
|
return new HashMap<>();
|
||||||
}
|
}
|
||||||
|
Benchmark.start("Get Nicknames Multiple "+ids.size());
|
||||||
PreparedStatement statement = null;
|
PreparedStatement statement = null;
|
||||||
ResultSet set = null;
|
ResultSet set = null;
|
||||||
try {
|
try {
|
||||||
|
@ -187,7 +192,6 @@ public class NicknamesTable extends Table {
|
||||||
|
|
||||||
Integer id = set.getInt(columnUserID);
|
Integer id = set.getInt(columnUserID);
|
||||||
if (!ids.contains(id)) {
|
if (!ids.contains(id)) {
|
||||||
Log.debug("Nicknames-Ids did not contain: " + id);
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
String nickname = set.getString(columnNick);
|
String nickname = set.getString(columnNick);
|
||||||
|
@ -210,6 +214,7 @@ public class NicknamesTable extends Table {
|
||||||
} finally {
|
} finally {
|
||||||
close(set);
|
close(set);
|
||||||
close(statement);
|
close(statement);
|
||||||
|
Benchmark.stop("Get Nicknames Multiple "+ids.size());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -217,6 +222,7 @@ public class NicknamesTable extends Table {
|
||||||
if (nicknames == null || nicknames.isEmpty()) {
|
if (nicknames == null || nicknames.isEmpty()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
Benchmark.start("Save Nicknames Multiple "+nicknames.size());
|
||||||
Map<Integer, List<String>> saved = getNicknames(nicknames.keySet());
|
Map<Integer, List<String>> saved = getNicknames(nicknames.keySet());
|
||||||
PreparedStatement statement = null;
|
PreparedStatement statement = null;
|
||||||
try {
|
try {
|
||||||
|
@ -249,6 +255,7 @@ public class NicknamesTable extends Table {
|
||||||
}
|
}
|
||||||
} finally {
|
} finally {
|
||||||
close(statement);
|
close(statement);
|
||||||
|
Benchmark.stop("Save Nicknames Multiple "+nicknames.size());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -11,6 +11,7 @@ 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.SessionData;
|
import main.java.com.djrapitops.plan.data.SessionData;
|
||||||
import main.java.com.djrapitops.plan.database.databases.SQLDB;
|
import main.java.com.djrapitops.plan.database.databases.SQLDB;
|
||||||
|
import main.java.com.djrapitops.plan.utilities.Benchmark;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
|
@ -63,6 +64,7 @@ public class SessionsTable extends Table {
|
||||||
* @throws SQLException
|
* @throws SQLException
|
||||||
*/
|
*/
|
||||||
public List<SessionData> getSessionData(int userId) throws SQLException {
|
public List<SessionData> getSessionData(int userId) throws SQLException {
|
||||||
|
Benchmark.start("Get Sessions");
|
||||||
PreparedStatement statement = null;
|
PreparedStatement statement = null;
|
||||||
ResultSet set = null;
|
ResultSet set = null;
|
||||||
try {
|
try {
|
||||||
|
@ -79,6 +81,7 @@ public class SessionsTable extends Table {
|
||||||
} finally {
|
} finally {
|
||||||
close(set);
|
close(set);
|
||||||
close(statement);
|
close(statement);
|
||||||
|
Benchmark.stop("Get Sessions");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -112,6 +115,7 @@ public class SessionsTable extends Table {
|
||||||
if (sessions == null) {
|
if (sessions == null) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
Benchmark.start("Save Sessions");
|
||||||
sessions.removeAll(getSessionData(userId));
|
sessions.removeAll(getSessionData(userId));
|
||||||
if (sessions.isEmpty()) {
|
if (sessions.isEmpty()) {
|
||||||
return;
|
return;
|
||||||
|
@ -143,6 +147,7 @@ public class SessionsTable extends Table {
|
||||||
}
|
}
|
||||||
} finally {
|
} finally {
|
||||||
close(statement);
|
close(statement);
|
||||||
|
Benchmark.stop("Save Sessions");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -150,6 +155,7 @@ public class SessionsTable extends Table {
|
||||||
if (ids == null || ids.isEmpty()) {
|
if (ids == null || ids.isEmpty()) {
|
||||||
return new HashMap<>();
|
return new HashMap<>();
|
||||||
}
|
}
|
||||||
|
Benchmark.start("Get Sessions multiple "+ids.size());
|
||||||
PreparedStatement statement = null;
|
PreparedStatement statement = null;
|
||||||
ResultSet set = null;
|
ResultSet set = null;
|
||||||
try {
|
try {
|
||||||
|
@ -162,7 +168,6 @@ public class SessionsTable extends Table {
|
||||||
while (set.next()) {
|
while (set.next()) {
|
||||||
Integer id = set.getInt(columnUserID);
|
Integer id = set.getInt(columnUserID);
|
||||||
if (!ids.contains(id)) {
|
if (!ids.contains(id)) {
|
||||||
Log.debug("Session-Ids did not contain: " + id);
|
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
sessions.get(id).add(new SessionData(set.getLong(columnSessionStart), set.getLong(columnSessionEnd)));
|
sessions.get(id).add(new SessionData(set.getLong(columnSessionStart), set.getLong(columnSessionEnd)));
|
||||||
|
@ -174,6 +179,7 @@ public class SessionsTable extends Table {
|
||||||
} finally {
|
} finally {
|
||||||
close(set);
|
close(set);
|
||||||
close(statement);
|
close(statement);
|
||||||
|
Benchmark.stop("Get Sessions multiple "+ids.size());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -181,6 +187,7 @@ public class SessionsTable extends Table {
|
||||||
if (sessions == null || sessions.isEmpty()) {
|
if (sessions == null || sessions.isEmpty()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
Benchmark.start("Save Sessions multiple "+sessions.size());
|
||||||
Map<Integer, List<SessionData>> saved = getSessionData(sessions.keySet());
|
Map<Integer, List<SessionData>> saved = getSessionData(sessions.keySet());
|
||||||
PreparedStatement statement = null;
|
PreparedStatement statement = null;
|
||||||
try {
|
try {
|
||||||
|
@ -218,6 +225,7 @@ public class SessionsTable extends Table {
|
||||||
}
|
}
|
||||||
} finally {
|
} finally {
|
||||||
close(statement);
|
close(statement);
|
||||||
|
Benchmark.start("Save Sessions multiple "+sessions.size());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,6 +4,7 @@ import java.sql.PreparedStatement;
|
||||||
import java.sql.ResultSet;
|
import java.sql.ResultSet;
|
||||||
import java.sql.SQLException;
|
import java.sql.SQLException;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
import java.util.Arrays;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
|
@ -15,11 +16,16 @@ 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.Log;
|
||||||
import main.java.com.djrapitops.plan.api.Gender;
|
import main.java.com.djrapitops.plan.api.Gender;
|
||||||
|
import main.java.com.djrapitops.plan.data.DemographicsData;
|
||||||
import main.java.com.djrapitops.plan.data.UserData;
|
import main.java.com.djrapitops.plan.data.UserData;
|
||||||
import main.java.com.djrapitops.plan.database.databases.SQLDB;
|
import main.java.com.djrapitops.plan.database.databases.SQLDB;
|
||||||
|
import main.java.com.djrapitops.plan.utilities.Benchmark;
|
||||||
import main.java.com.djrapitops.plan.utilities.UUIDFetcher;
|
import main.java.com.djrapitops.plan.utilities.UUIDFetcher;
|
||||||
import me.edge209.OnTime.OnTimeAPI.data;
|
import static org.bukkit.Bukkit.getOfflinePlayer;
|
||||||
|
import static org.bukkit.Bukkit.getOfflinePlayers;
|
||||||
import org.bukkit.GameMode;
|
import org.bukkit.GameMode;
|
||||||
|
import org.bukkit.OfflinePlayer;
|
||||||
|
import static org.bukkit.Bukkit.getOfflinePlayer;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
|
@ -40,6 +46,11 @@ public class UsersTable extends Table {
|
||||||
private final String columnPlayerKills;
|
private final String columnPlayerKills;
|
||||||
private final String columnDeaths;
|
private final String columnDeaths;
|
||||||
private final String columnMobKills;
|
private final String columnMobKills;
|
||||||
|
private final String columnRegistered;
|
||||||
|
private final String columnOP;
|
||||||
|
private final String columnName;
|
||||||
|
private final String columnBanned;
|
||||||
|
private final String columnContainsBukkitData;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
|
@ -61,6 +72,12 @@ public class UsersTable extends Table {
|
||||||
columnMobKills = "mob_kills";
|
columnMobKills = "mob_kills";
|
||||||
columnPlayerKills = "player_kills"; // Removed in 2.7.0
|
columnPlayerKills = "player_kills"; // Removed in 2.7.0
|
||||||
columnDeaths = "deaths";
|
columnDeaths = "deaths";
|
||||||
|
// Added in 3.3.0
|
||||||
|
columnRegistered = "registered";
|
||||||
|
columnOP = "opped";
|
||||||
|
columnName = "name";
|
||||||
|
columnBanned = "banned";
|
||||||
|
columnContainsBukkitData = "contains_bukkit_data";
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -82,13 +99,22 @@ public class UsersTable extends Table {
|
||||||
+ columnLoginTimes + " integer NOT NULL, "
|
+ columnLoginTimes + " integer NOT NULL, "
|
||||||
+ columnLastPlayed + " bigint NOT NULL, "
|
+ columnLastPlayed + " bigint NOT NULL, "
|
||||||
+ columnDeaths + " int NOT NULL, "
|
+ columnDeaths + " int NOT NULL, "
|
||||||
+ columnMobKills + " int NOT NULL"
|
+ columnMobKills + " int NOT NULL, "
|
||||||
|
+ columnRegistered + " bigint NOT NULL, "
|
||||||
|
+ columnOP + " boolean NOT NULL DEFAULT 0, "
|
||||||
|
+ columnName + " varchar(16) NOT NULL, "
|
||||||
|
+ columnBanned + " boolean NOT NULL DEFAULT 0, "
|
||||||
|
+ columnContainsBukkitData + " boolean NOT NULL DEFAULT 0"
|
||||||
+ (usingMySQL ? ", PRIMARY KEY (" + columnID + ")" : "")
|
+ (usingMySQL ? ", PRIMARY KEY (" + columnID + ")" : "")
|
||||||
+ ")"
|
+ ")"
|
||||||
);
|
);
|
||||||
if (getVersion() < 3) {
|
int version = getVersion();
|
||||||
|
if (version < 3) {
|
||||||
alterTablesV3();
|
alterTablesV3();
|
||||||
}
|
}
|
||||||
|
if (version < 4) {
|
||||||
|
alterTablesV4();
|
||||||
|
}
|
||||||
return true;
|
return true;
|
||||||
} catch (SQLException ex) {
|
} catch (SQLException ex) {
|
||||||
Log.toLog(this.getClass().getName(), ex);
|
Log.toLog(this.getClass().getName(), ex);
|
||||||
|
@ -96,6 +122,33 @@ public class UsersTable extends Table {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void alterTablesV4() {
|
||||||
|
String[] queries;
|
||||||
|
if (usingMySQL) {
|
||||||
|
queries = new String[]{
|
||||||
|
"ALTER TABLE " + tableName + " ADD " + columnContainsBukkitData + " boolean NOT NULL DEFAULT 0",
|
||||||
|
"ALTER TABLE " + tableName + " ADD " + columnOP + " boolean NOT NULL DEFAULT 0",
|
||||||
|
"ALTER TABLE " + tableName + " ADD " + columnBanned + " boolean NOT NULL DEFAULT 0",
|
||||||
|
"ALTER TABLE " + tableName + " ADD " + columnName + " varchar(16) NOT NULL DEFAULT \'Unknown\'",
|
||||||
|
"ALTER TABLE " + tableName + " ADD " + columnRegistered + " bigint NOT NULL DEFAULT 0"
|
||||||
|
};
|
||||||
|
} else {
|
||||||
|
queries = new String[]{
|
||||||
|
"ALTER TABLE " + tableName + " ADD COLUMN " + columnContainsBukkitData + " boolean NOT NULL DEFAULT 0",
|
||||||
|
"ALTER TABLE " + tableName + " ADD COLUMN " + columnOP + " boolean NOT NULL DEFAULT 0",
|
||||||
|
"ALTER TABLE " + tableName + " ADD COLUMN " + columnBanned + " boolean NOT NULL DEFAULT 0",
|
||||||
|
"ALTER TABLE " + tableName + " ADD COLUMN " + columnName + " varchar(16) NOT NULL DEFAULT \'Unknown\'",
|
||||||
|
"ALTER TABLE " + tableName + " ADD COLUMN " + columnRegistered + " bigint NOT NULL DEFAULT 0"
|
||||||
|
};
|
||||||
|
}
|
||||||
|
for (String query : queries) {
|
||||||
|
try {
|
||||||
|
execute(query);
|
||||||
|
} catch (Exception e) {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private void alterTablesV3() {
|
private void alterTablesV3() {
|
||||||
String[] queries;
|
String[] queries;
|
||||||
if (usingMySQL) {
|
if (usingMySQL) {
|
||||||
|
@ -181,6 +234,7 @@ public class UsersTable extends Table {
|
||||||
* @return @throws SQLException
|
* @return @throws SQLException
|
||||||
*/
|
*/
|
||||||
public Set<UUID> getSavedUUIDs() throws SQLException {
|
public Set<UUID> getSavedUUIDs() throws SQLException {
|
||||||
|
Benchmark.start("Get Saved UUIDS");
|
||||||
PreparedStatement statement = null;
|
PreparedStatement statement = null;
|
||||||
ResultSet set = null;
|
ResultSet set = null;
|
||||||
try {
|
try {
|
||||||
|
@ -198,6 +252,7 @@ public class UsersTable extends Table {
|
||||||
} finally {
|
} finally {
|
||||||
close(set);
|
close(set);
|
||||||
close(statement);
|
close(statement);
|
||||||
|
Benchmark.stop("Get Saved UUIDS");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -229,12 +284,170 @@ public class UsersTable extends Table {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public UserData getUserData(UUID uuid) throws SQLException {
|
||||||
|
Benchmark.start(uuid + " Get UserData");
|
||||||
|
boolean containsBukkitData = getContainsBukkitData(uuid);
|
||||||
|
UserData data = null;
|
||||||
|
if (containsBukkitData) {
|
||||||
|
data = getUserDataForKnown(uuid);
|
||||||
|
}
|
||||||
|
if (data == null) {
|
||||||
|
data = new UserData(getOfflinePlayer(uuid), new DemographicsData());
|
||||||
|
addUserInformationToUserData(data);
|
||||||
|
}
|
||||||
|
Benchmark.stop(uuid + " Get UserData");
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
|
||||||
|
private boolean getContainsBukkitData(UUID uuid) throws SQLException {
|
||||||
|
PreparedStatement statement = null;
|
||||||
|
ResultSet set = null;
|
||||||
|
boolean containsBukkitData = false;
|
||||||
|
try {
|
||||||
|
statement = prepareStatement("SELECT " + columnContainsBukkitData + " FROM " + tableName + " WHERE (" + columnUUID + "=?)");
|
||||||
|
statement.setString(1, uuid.toString());
|
||||||
|
set = statement.executeQuery();
|
||||||
|
while (set.next()) {
|
||||||
|
containsBukkitData = set.getBoolean(columnContainsBukkitData);
|
||||||
|
}
|
||||||
|
} finally {
|
||||||
|
close(statement);
|
||||||
|
close(set);
|
||||||
|
}
|
||||||
|
return containsBukkitData;
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<UserData> getUserData(Collection<UUID> uuids) throws SQLException {
|
||||||
|
Benchmark.start("Get UserData Multiple " + uuids.size());
|
||||||
|
List<UUID> containsBukkitData = getContainsBukkitData(uuids);
|
||||||
|
List<UserData> datas = new ArrayList<>();
|
||||||
|
datas.addAll(getUserDataForKnown(containsBukkitData));
|
||||||
|
uuids.removeAll(containsBukkitData);
|
||||||
|
|
||||||
|
List<UserData> noBukkitData = new ArrayList<>();
|
||||||
|
Benchmark.start("Create UserData objects for No BukkitData players " + uuids.size());
|
||||||
|
for (UUID uuid : uuids) {
|
||||||
|
UserData uData = new UserData(getOfflinePlayer(uuid), new DemographicsData());
|
||||||
|
noBukkitData.add(uData);
|
||||||
|
}
|
||||||
|
Benchmark.stop("Create UserData objects for No BukkitData players " + uuids.size());
|
||||||
|
addUserInformationToUserData(noBukkitData);
|
||||||
|
datas.addAll(noBukkitData);
|
||||||
|
Benchmark.stop("Get UserData Multiple " + uuids.size());
|
||||||
|
return datas;
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<UUID> getContainsBukkitData(Collection<UUID> uuids) throws SQLException {
|
||||||
|
PreparedStatement statement = null;
|
||||||
|
ResultSet set = null;
|
||||||
|
List<UUID> containsBukkitData = new ArrayList<>();
|
||||||
|
try {
|
||||||
|
statement = prepareStatement("SELECT " + columnContainsBukkitData + ", " + columnUUID + " FROM " + tableName);
|
||||||
|
set = statement.executeQuery();
|
||||||
|
while (set.next()) {
|
||||||
|
String uuidS = set.getString(columnUUID);
|
||||||
|
UUID uuid = UUID.fromString(uuidS);
|
||||||
|
if (!uuids.contains(uuid)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
boolean contains = set.getBoolean(columnContainsBukkitData);
|
||||||
|
if (contains) {
|
||||||
|
containsBukkitData.add(uuid);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} finally {
|
||||||
|
close(statement);
|
||||||
|
close(set);
|
||||||
|
}
|
||||||
|
return containsBukkitData;
|
||||||
|
}
|
||||||
|
|
||||||
|
private UserData getUserDataForKnown(UUID uuid) throws SQLException {
|
||||||
|
Benchmark.start("getUserDataForKnown UserData");
|
||||||
|
PreparedStatement statement = null;
|
||||||
|
ResultSet set = null;
|
||||||
|
try {
|
||||||
|
statement = prepareStatement("SELECT * FROM " + tableName + " WHERE (" + columnUUID + "=?)");
|
||||||
|
statement.setString(1, uuid.toString());
|
||||||
|
set = statement.executeQuery();
|
||||||
|
while (set.next()) {
|
||||||
|
DemographicsData demData = new DemographicsData();
|
||||||
|
demData.setAge(set.getInt(columnDemAge));
|
||||||
|
demData.setGender(Gender.parse(set.getString(columnDemGender)));
|
||||||
|
demData.setGeoLocation(set.getString(columnDemGeoLocation));
|
||||||
|
GameMode gm = GameMode.valueOf(set.getString(columnLastGM));
|
||||||
|
boolean op = set.getBoolean(columnOP);
|
||||||
|
boolean banned = set.getBoolean(columnBanned);
|
||||||
|
String name = set.getString(columnName);
|
||||||
|
long registered = set.getLong(columnRegistered);
|
||||||
|
UserData data = new UserData(uuid, registered, null, op, gm, demData, name, false);
|
||||||
|
data.setBanned(banned);
|
||||||
|
data.setLastGamemode(gm);
|
||||||
|
data.setLastGmSwapTime(set.getLong(columnLastGMSwapTime));
|
||||||
|
data.setPlayTime(set.getLong(columnPlayTime));
|
||||||
|
data.setLoginTimes(set.getInt(columnLoginTimes));
|
||||||
|
data.setLastPlayed(set.getLong(columnLastPlayed));
|
||||||
|
data.setDeaths(set.getInt(columnDeaths));
|
||||||
|
data.setMobKills(set.getInt(columnMobKills));
|
||||||
|
return data;
|
||||||
|
}
|
||||||
|
} finally {
|
||||||
|
close(set);
|
||||||
|
close(statement);
|
||||||
|
Benchmark.stop("getUserDataForKnown UserData");
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
private List<UserData> getUserDataForKnown(Collection<UUID> uuids) throws SQLException {
|
||||||
|
Benchmark.start("getUserDataForKnown Multiple " + uuids.size());
|
||||||
|
PreparedStatement statement = null;
|
||||||
|
ResultSet set = null;
|
||||||
|
List<UserData> datas = new ArrayList<>();
|
||||||
|
try {
|
||||||
|
statement = prepareStatement("SELECT * FROM " + tableName);
|
||||||
|
set = statement.executeQuery();
|
||||||
|
while (set.next()) {
|
||||||
|
String uuidS = set.getString(columnUUID);
|
||||||
|
UUID uuid = UUID.fromString(uuidS);
|
||||||
|
if (!uuids.contains(uuid)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
DemographicsData demData = new DemographicsData();
|
||||||
|
demData.setAge(set.getInt(columnDemAge));
|
||||||
|
demData.setGender(Gender.parse(set.getString(columnDemGender)));
|
||||||
|
demData.setGeoLocation(set.getString(columnDemGeoLocation));
|
||||||
|
GameMode gm = GameMode.valueOf(set.getString(columnLastGM));
|
||||||
|
boolean op = set.getBoolean(columnOP);
|
||||||
|
boolean banned = set.getBoolean(columnBanned);
|
||||||
|
String name = set.getString(columnName);
|
||||||
|
long registered = set.getLong(columnRegistered);
|
||||||
|
UserData data = new UserData(uuid, registered, null, op, gm, demData, name, false);
|
||||||
|
data.setBanned(banned);
|
||||||
|
data.setLastGamemode(gm);
|
||||||
|
data.setLastGmSwapTime(set.getLong(columnLastGMSwapTime));
|
||||||
|
data.setPlayTime(set.getLong(columnPlayTime));
|
||||||
|
data.setLoginTimes(set.getInt(columnLoginTimes));
|
||||||
|
data.setLastPlayed(set.getLong(columnLastPlayed));
|
||||||
|
data.setDeaths(set.getInt(columnDeaths));
|
||||||
|
data.setMobKills(set.getInt(columnMobKills));
|
||||||
|
datas.add(data);
|
||||||
|
}
|
||||||
|
} finally {
|
||||||
|
close(set);
|
||||||
|
close(statement);
|
||||||
|
Benchmark.stop("getUserDataForKnown Multiple " + uuids.size());
|
||||||
|
}
|
||||||
|
return datas;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* @param data
|
* @param data
|
||||||
* @throws SQLException
|
* @throws SQLException
|
||||||
*/
|
*/
|
||||||
public void addUserInformationToUserData(UserData data) throws SQLException {
|
public void addUserInformationToUserData(UserData data) throws SQLException {
|
||||||
|
Benchmark.start("addUserInformationToUserData UserData");
|
||||||
PreparedStatement statement = null;
|
PreparedStatement statement = null;
|
||||||
ResultSet set = null;
|
ResultSet set = null;
|
||||||
try {
|
try {
|
||||||
|
@ -256,10 +469,12 @@ public class UsersTable extends Table {
|
||||||
} finally {
|
} finally {
|
||||||
close(set);
|
close(set);
|
||||||
close(statement);
|
close(statement);
|
||||||
|
Benchmark.stop("addUserInformationToUserData UserData");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public void addUserInformationToUserData(List<UserData> data) throws SQLException {
|
public void addUserInformationToUserData(List<UserData> data) throws SQLException {
|
||||||
|
Benchmark.start("addUserInformationToUserData Multiple " + data.size());
|
||||||
PreparedStatement statement = null;
|
PreparedStatement statement = null;
|
||||||
ResultSet set = null;
|
ResultSet set = null;
|
||||||
try {
|
try {
|
||||||
|
@ -287,6 +502,7 @@ public class UsersTable extends Table {
|
||||||
} finally {
|
} finally {
|
||||||
close(set);
|
close(set);
|
||||||
close(statement);
|
close(statement);
|
||||||
|
Benchmark.stop("addUserInformationToUserData Multiple " + data.size());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -296,6 +512,7 @@ public class UsersTable extends Table {
|
||||||
* @throws SQLException
|
* @throws SQLException
|
||||||
*/
|
*/
|
||||||
public void saveUserDataInformation(UserData data) throws SQLException {
|
public void saveUserDataInformation(UserData data) throws SQLException {
|
||||||
|
Benchmark.start("Save UserInfo");
|
||||||
PreparedStatement statement = null;
|
PreparedStatement statement = null;
|
||||||
try {
|
try {
|
||||||
UUID uuid = data.getUuid();
|
UUID uuid = data.getUuid();
|
||||||
|
@ -312,7 +529,12 @@ public class UsersTable extends Table {
|
||||||
+ columnLoginTimes + "=?, "
|
+ columnLoginTimes + "=?, "
|
||||||
+ columnLastPlayed + "=?, "
|
+ columnLastPlayed + "=?, "
|
||||||
+ columnDeaths + "=?, "
|
+ columnDeaths + "=?, "
|
||||||
+ columnMobKills + "=? "
|
+ columnMobKills + "=?, "
|
||||||
|
+ columnContainsBukkitData + "=?, "
|
||||||
|
+ columnOP + "=?, "
|
||||||
|
+ columnBanned + "=?, "
|
||||||
|
+ columnName + "=?, "
|
||||||
|
+ columnRegistered + "=? "
|
||||||
+ "WHERE UPPER(" + columnUUID + ") LIKE UPPER(?)";
|
+ "WHERE UPPER(" + columnUUID + ") LIKE UPPER(?)";
|
||||||
|
|
||||||
statement = prepareStatement(sql);
|
statement = prepareStatement(sql);
|
||||||
|
@ -331,7 +553,12 @@ public class UsersTable extends Table {
|
||||||
statement.setLong(8, data.getLastPlayed());
|
statement.setLong(8, data.getLastPlayed());
|
||||||
statement.setInt(9, data.getDeaths());
|
statement.setInt(9, data.getDeaths());
|
||||||
statement.setInt(10, data.getMobKills());
|
statement.setInt(10, data.getMobKills());
|
||||||
statement.setString(11, uuid.toString());
|
statement.setBoolean(11, data.getName() != null);
|
||||||
|
statement.setBoolean(12, data.isOp());
|
||||||
|
statement.setBoolean(13, data.isBanned());
|
||||||
|
statement.setString(14, data.getName());
|
||||||
|
statement.setLong(15, data.getRegistered());
|
||||||
|
statement.setString(16, uuid.toString());
|
||||||
update = statement.executeUpdate();
|
update = statement.executeUpdate();
|
||||||
}
|
}
|
||||||
if (update == 0) {
|
if (update == 0) {
|
||||||
|
@ -347,8 +574,13 @@ public class UsersTable extends Table {
|
||||||
+ columnLoginTimes + ", "
|
+ columnLoginTimes + ", "
|
||||||
+ columnLastPlayed + ", "
|
+ columnLastPlayed + ", "
|
||||||
+ columnDeaths + ", "
|
+ columnDeaths + ", "
|
||||||
+ columnMobKills
|
+ columnMobKills + ", "
|
||||||
+ ") VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)");
|
+ columnContainsBukkitData + ", "
|
||||||
|
+ columnOP + ", "
|
||||||
|
+ columnBanned + ", "
|
||||||
|
+ columnName + ", "
|
||||||
|
+ columnRegistered
|
||||||
|
+ ") VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)");
|
||||||
|
|
||||||
statement.setString(1, uuid.toString());
|
statement.setString(1, uuid.toString());
|
||||||
statement.setInt(2, data.getDemData().getAge());
|
statement.setInt(2, data.getDemData().getAge());
|
||||||
|
@ -366,10 +598,16 @@ public class UsersTable extends Table {
|
||||||
statement.setLong(9, data.getLastPlayed());
|
statement.setLong(9, data.getLastPlayed());
|
||||||
statement.setInt(10, data.getDeaths());
|
statement.setInt(10, data.getDeaths());
|
||||||
statement.setInt(11, data.getMobKills());
|
statement.setInt(11, data.getMobKills());
|
||||||
|
statement.setBoolean(12, data.getName() != null);
|
||||||
|
statement.setBoolean(13, data.isOp());
|
||||||
|
statement.setBoolean(14, data.isBanned());
|
||||||
|
statement.setString(15, data.getName());
|
||||||
|
statement.setLong(16, data.getRegistered());
|
||||||
statement.execute();
|
statement.execute();
|
||||||
}
|
}
|
||||||
} finally {
|
} finally {
|
||||||
close(statement);
|
close(statement);
|
||||||
|
Benchmark.stop("Save UserInfo");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -380,6 +618,7 @@ public class UsersTable extends Table {
|
||||||
* @throws SQLException
|
* @throws SQLException
|
||||||
*/
|
*/
|
||||||
public List<UserData> saveUserDataInformationBatch(Collection<UserData> data) throws SQLException {
|
public List<UserData> saveUserDataInformationBatch(Collection<UserData> data) throws SQLException {
|
||||||
|
Benchmark.start("Save UserInfo multiple " + data.size());
|
||||||
PreparedStatement statement = null;
|
PreparedStatement statement = null;
|
||||||
try {
|
try {
|
||||||
List<UserData> saveLast = new ArrayList<>();
|
List<UserData> saveLast = new ArrayList<>();
|
||||||
|
@ -393,7 +632,12 @@ public class UsersTable extends Table {
|
||||||
+ columnLoginTimes + "=?, "
|
+ columnLoginTimes + "=?, "
|
||||||
+ columnLastPlayed + "=?, "
|
+ columnLastPlayed + "=?, "
|
||||||
+ columnDeaths + "=?, "
|
+ columnDeaths + "=?, "
|
||||||
+ columnMobKills + "=? "
|
+ columnMobKills + "=?, "
|
||||||
|
+ columnContainsBukkitData + "=?, "
|
||||||
|
+ columnOP + "=?, "
|
||||||
|
+ columnBanned + "=?, "
|
||||||
|
+ columnName + "=?, "
|
||||||
|
+ columnRegistered + "=? "
|
||||||
+ "WHERE " + columnUUID + "=?";
|
+ "WHERE " + columnUUID + "=?";
|
||||||
statement = prepareStatement(uSQL);
|
statement = prepareStatement(uSQL);
|
||||||
boolean commitRequired = false;
|
boolean commitRequired = false;
|
||||||
|
@ -435,7 +679,12 @@ public class UsersTable extends Table {
|
||||||
statement.setLong(8, uData.getLastPlayed());
|
statement.setLong(8, uData.getLastPlayed());
|
||||||
statement.setInt(9, uData.getDeaths());
|
statement.setInt(9, uData.getDeaths());
|
||||||
statement.setInt(10, uData.getMobKills());
|
statement.setInt(10, uData.getMobKills());
|
||||||
statement.setString(11, uData.getUuid().toString());
|
statement.setBoolean(11, uData.getName() != null);
|
||||||
|
statement.setBoolean(12, uData.isOp());
|
||||||
|
statement.setBoolean(13, uData.isBanned());
|
||||||
|
statement.setString(14, uData.getName());
|
||||||
|
statement.setLong(15, uData.getRegistered());
|
||||||
|
statement.setString(16, uuid.toString());
|
||||||
statement.addBatch();
|
statement.addBatch();
|
||||||
} catch (SQLException | NullPointerException e) {
|
} catch (SQLException | NullPointerException e) {
|
||||||
saveLast.add(uData);
|
saveLast.add(uData);
|
||||||
|
@ -451,10 +700,12 @@ public class UsersTable extends Table {
|
||||||
return saveLast;
|
return saveLast;
|
||||||
} finally {
|
} finally {
|
||||||
close(statement);
|
close(statement);
|
||||||
|
Benchmark.stop("Save UserInfo multiple " + data.size());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public Map<UUID, Integer> getUserIds(Collection<UUID> uuids) throws SQLException {
|
public Map<UUID, Integer> getUserIds(Collection<UUID> uuids) throws SQLException {
|
||||||
|
Benchmark.start("Get User IDS " + uuids.size());
|
||||||
PreparedStatement statement = null;
|
PreparedStatement statement = null;
|
||||||
ResultSet set = null;
|
ResultSet set = null;
|
||||||
try {
|
try {
|
||||||
|
@ -473,10 +724,12 @@ public class UsersTable extends Table {
|
||||||
} finally {
|
} finally {
|
||||||
close(set);
|
close(set);
|
||||||
close(statement);
|
close(statement);
|
||||||
|
Benchmark.stop("Get User IDS " + uuids.size());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public Map<UUID, Integer> getAllUserIds() throws SQLException {
|
public Map<UUID, Integer> getAllUserIds() throws SQLException {
|
||||||
|
Benchmark.start("Get User IDS ALL");
|
||||||
PreparedStatement statement = null;
|
PreparedStatement statement = null;
|
||||||
ResultSet set = null;
|
ResultSet set = null;
|
||||||
try {
|
try {
|
||||||
|
@ -492,6 +745,7 @@ public class UsersTable extends Table {
|
||||||
} finally {
|
} finally {
|
||||||
close(set);
|
close(set);
|
||||||
close(statement);
|
close(statement);
|
||||||
|
Benchmark.stop("Get User IDS ALL");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,10 +1,17 @@
|
||||||
package main.java.com.djrapitops.plan.ui.graphs;
|
package main.java.com.djrapitops.plan.ui.graphs;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collections;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.HashSet;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Set;
|
||||||
|
import java.util.function.Function;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
import main.java.com.djrapitops.plan.data.SessionData;
|
import main.java.com.djrapitops.plan.data.SessionData;
|
||||||
|
import main.java.com.djrapitops.plan.utilities.Benchmark;
|
||||||
import main.java.com.djrapitops.plan.utilities.FormatUtils;
|
import main.java.com.djrapitops.plan.utilities.FormatUtils;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -21,42 +28,73 @@ public class PlayerActivityGraphCreator {
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
public static String[] generateDataArray(List<SessionData> sessionData, long scale, int maxPlayers) {
|
public static String[] generateDataArray(List<SessionData> sessionData, long scale, int maxPlayers) {
|
||||||
|
Benchmark.start("Generate Player Activity Graph " + sessionData.size() + " " + scale + " |");
|
||||||
long now = new Date().toInstant().getEpochSecond() * (long) 1000;
|
long now = new Date().toInstant().getEpochSecond() * (long) 1000;
|
||||||
long nowMinusScale = now - scale;
|
long nowMinusScale = now - scale;
|
||||||
List<List<Long>> s = filterAndTransformSessions(sessionData, nowMinusScale);
|
List<List<Long>> s = filterAndTransformSessions(sessionData, nowMinusScale);
|
||||||
List<Long> sessionStarts = s.get(0);
|
List<Long> sessionStarts = s.get(0);
|
||||||
List<Long> sessionEnds = s.get(1);
|
List<Long> sessionEnds = s.get(1);
|
||||||
List<Long> playersOnline = new ArrayList<>();
|
|
||||||
List<String> labels = new ArrayList<>();
|
|
||||||
|
|
||||||
|
Benchmark.start("Player Activity Graph Before Addition");
|
||||||
int amount = (int) sessionStarts.stream().filter(start -> start < nowMinusScale).count();
|
int amount = (int) sessionStarts.stream().filter(start -> start < nowMinusScale).count();
|
||||||
for (int i = amount; i > 0; i--) {
|
for (int i = amount; i > 0; i--) {
|
||||||
sessionStarts.add(nowMinusScale);
|
sessionStarts.add(nowMinusScale);
|
||||||
}
|
}
|
||||||
|
Benchmark.stop("Player Activity Graph Before Addition");
|
||||||
|
Benchmark.start("Player Activity Graph Amount Calculation");
|
||||||
|
|
||||||
|
Map<Long, Integer> change = transformIntoChangeMap(sessionStarts, sessionEnds);
|
||||||
|
|
||||||
long lastPValue = 0;
|
long lastPValue = 0;
|
||||||
long lastSavedPValue = -1;
|
long lastSavedPValue = -1;
|
||||||
long lastSaveI = 0;
|
long lastSaveIndex = 0;
|
||||||
for (long i = nowMinusScale; i <= now; i += 1000) {
|
List<Long> playersOnline = new ArrayList<>();
|
||||||
if (sessionStarts.contains(i)) {
|
List<String> labels = new ArrayList<>();
|
||||||
lastPValue += getCount(sessionStarts, i);
|
for (long i = nowMinusScale / 1000; i <= now / 1000; i += 1) {
|
||||||
|
long index = i * 1000;
|
||||||
|
boolean contains = change.containsKey(index);
|
||||||
|
boolean isBelowMinimumScaleThreshold = index - lastSaveIndex > (scale / (long) 75);
|
||||||
|
if (!(contains || isBelowMinimumScaleThreshold)) {
|
||||||
|
continue;
|
||||||
}
|
}
|
||||||
if (sessionEnds.contains(i)) {
|
if (contains) {
|
||||||
lastPValue -= getCount(sessionEnds, i);
|
lastPValue += change.get(index);
|
||||||
}
|
}
|
||||||
|
if (isBelowMinimumScaleThreshold || lastSavedPValue != lastPValue) {
|
||||||
if (lastSavedPValue != lastPValue || i - lastSaveI > (scale / (long) 75)) {
|
lastSaveIndex = index;
|
||||||
lastSaveI = i;
|
labels.add("\"" + FormatUtils.formatTimeStamp(index) + "\"");
|
||||||
labels.add("\"" + FormatUtils.formatTimeStamp(i) + "\"");
|
|
||||||
lastSavedPValue = lastPValue;
|
lastSavedPValue = lastPValue;
|
||||||
playersOnline.add(lastPValue);
|
playersOnline.add(lastPValue);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Benchmark.stop("Player Activity Graph Amount Calculation");
|
||||||
playersOnline.add(0L);
|
playersOnline.add(0L);
|
||||||
playersOnline.add((long) maxPlayers);
|
playersOnline.add((long) maxPlayers);
|
||||||
|
Benchmark.stop("Generate Player Activity Graph " + sessionData.size() + " " + scale + " |");
|
||||||
return new String[]{playersOnline.toString(), labels.toString()};
|
return new String[]{playersOnline.toString(), labels.toString()};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static Map<Long, Integer> transformIntoChangeMap(List<Long> sessionStarts, List<Long> sessionEnds) {
|
||||||
|
Benchmark.start("Player Activity Graph Calc. Change");
|
||||||
|
Map<Long, Integer> starts = sessionStarts.stream().distinct().collect(Collectors.toMap(Function.identity(), start -> Collections.frequency(sessionStarts, start)));
|
||||||
|
Map<Long, Integer> ends = sessionEnds.stream().distinct().collect(Collectors.toMap(Function.identity(), end -> Collections.frequency(sessionEnds, end)));
|
||||||
|
Set<Long> keys = new HashSet<>(starts.keySet());
|
||||||
|
keys.addAll(ends.keySet());
|
||||||
|
Map<Long, Integer> change = new HashMap<>();
|
||||||
|
keys.stream().forEach((key) -> {
|
||||||
|
int value = 0;
|
||||||
|
if (starts.containsKey(key)) {
|
||||||
|
value += starts.get(key);
|
||||||
|
}
|
||||||
|
if (ends.containsKey(key)) {
|
||||||
|
value -= ends.get(key);
|
||||||
|
}
|
||||||
|
change.put(key, value);
|
||||||
|
});
|
||||||
|
Benchmark.stop("Player Activity Graph Calc. Change");
|
||||||
|
return change;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* @param values
|
* @param values
|
||||||
|
@ -64,9 +102,10 @@ public class PlayerActivityGraphCreator {
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
public static long getCount(List<Long> values, long lookFor) {
|
public static long getCount(List<Long> values, long lookFor) {
|
||||||
return values.stream()
|
return Collections.frequency(values, lookFor);
|
||||||
.filter((start) -> (start == lookFor))
|
// values.stream()
|
||||||
.count();
|
// .filter((start) -> (start == lookFor))
|
||||||
|
// .count();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -75,7 +114,8 @@ public class PlayerActivityGraphCreator {
|
||||||
* @param nowMinusScale
|
* @param nowMinusScale
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
public static List<List<Long>> filterAndTransformSessions(List<SessionData> sessionData, long nowMinusScale) {
|
public static List<List<Long>> filterAndTransformSessions(List<SessionData> sessionData, long nowMinusScale) {
|
||||||
|
Benchmark.start("Player Activity Graph Transform " + sessionData.size() + " " + nowMinusScale);
|
||||||
List<Long[]> values = sessionData.parallelStream()
|
List<Long[]> values = sessionData.parallelStream()
|
||||||
.filter(session -> (session != null))
|
.filter(session -> (session != null))
|
||||||
.filter(session -> session.isValid())
|
.filter(session -> session.isValid())
|
||||||
|
@ -91,9 +131,10 @@ public class PlayerActivityGraphCreator {
|
||||||
List<List<Long>> r = new ArrayList<>();
|
List<List<Long>> r = new ArrayList<>();
|
||||||
r.add(sessionStarts);
|
r.add(sessionStarts);
|
||||||
r.add(sessionEnds);
|
r.add(sessionEnds);
|
||||||
|
Benchmark.stop("Player Activity Graph Transform " + sessionData.size() + " " + nowMinusScale);
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* @param ms
|
* @param ms
|
||||||
|
|
|
@ -77,7 +77,7 @@ public class SessionLengthDistributionGraphCreator {
|
||||||
List<Long> unused = new ArrayList<>(lengths);
|
List<Long> unused = new ArrayList<>(lengths);
|
||||||
Map<Long, Integer> values = new HashMap<>();
|
Map<Long, Integer> values = new HashMap<>();
|
||||||
long lengthInMinutes = 5;
|
long lengthInMinutes = 5;
|
||||||
while (!unused.isEmpty()) {
|
while (!unused.isEmpty() && lengthInMinutes < 120) {
|
||||||
long length = lengthInMinutes * 60 * 1000;
|
long length = lengthInMinutes * 60 * 1000;
|
||||||
List<Long> lessThan = unused.stream().filter(l -> l < length).collect(Collectors.toList());
|
List<Long> lessThan = unused.stream().filter(l -> l < length).collect(Collectors.toList());
|
||||||
values.put(lengthInMinutes, lessThan.size());
|
values.put(lengthInMinutes, lessThan.size());
|
||||||
|
|
|
@ -5,6 +5,7 @@ import java.util.List;
|
||||||
import java.util.Map;
|
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;
|
import main.java.com.djrapitops.plan.ui.Html;
|
||||||
|
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;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -19,21 +20,23 @@ public class SortableCommandUseTableCreator {
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
public static String createSortedCommandUseTable(Map<String, Integer> commandUse) {
|
public static String createSortedCommandUseTable(Map<String, Integer> commandUse) {
|
||||||
|
Benchmark.start("Create commanduse table");
|
||||||
List<String[]> sorted = MapComparator.sortByValue(commandUse);
|
List<String[]> sorted = MapComparator.sortByValue(commandUse);
|
||||||
String html = "";
|
StringBuilder html = new StringBuilder();
|
||||||
if (sorted.isEmpty()) {
|
if (sorted.isEmpty()) {
|
||||||
html = Html.ERROR_TABLE_2.parse();
|
html.append(Html.ERROR_TABLE_2.parse());
|
||||||
return html;
|
} else {
|
||||||
}
|
Collections.reverse(sorted);
|
||||||
Collections.reverse(sorted);
|
for (String[] values : sorted) {
|
||||||
for (String[] values : sorted) {
|
try {
|
||||||
try {
|
html.append(Html.TABLELINE_2.parse(values[1], values[0]));
|
||||||
html += Html.TABLELINE_2.parse(values[1], values[0]);
|
} catch (IllegalArgumentException e) {
|
||||||
} catch (IllegalArgumentException e) {
|
Log.toLog("SortableCommandUseTableCreator", e);
|
||||||
Log.toLog("SortableCommandUseTableCreator", e);
|
Log.toLog("Cause: " + values[0] + " " + values[1]);
|
||||||
Log.toLog("Cause: " + values[0] + " " + values[1]);
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return html;
|
Benchmark.stop("Create commanduse table");
|
||||||
|
return html.toString();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -4,6 +4,7 @@ import java.util.Collection;
|
||||||
import main.java.com.djrapitops.plan.data.UserData;
|
import main.java.com.djrapitops.plan.data.UserData;
|
||||||
import main.java.com.djrapitops.plan.ui.Html;
|
import main.java.com.djrapitops.plan.ui.Html;
|
||||||
import main.java.com.djrapitops.plan.utilities.AnalysisUtils;
|
import main.java.com.djrapitops.plan.utilities.AnalysisUtils;
|
||||||
|
import main.java.com.djrapitops.plan.utilities.Benchmark;
|
||||||
import main.java.com.djrapitops.plan.utilities.FormatUtils;
|
import main.java.com.djrapitops.plan.utilities.FormatUtils;
|
||||||
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;
|
||||||
|
@ -20,6 +21,7 @@ public class SortablePlayersTableCreator {
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
public static String createSortablePlayersTable(Collection<UserData> data) {
|
public static String createSortablePlayersTable(Collection<UserData> data) {
|
||||||
|
Benchmark.start("Create Players table "+data.size());
|
||||||
String html = "";
|
String html = "";
|
||||||
long now = MiscUtils.getTime();
|
long now = MiscUtils.getTime();
|
||||||
for (UserData uData : data) {
|
for (UserData uData : data) {
|
||||||
|
@ -41,6 +43,7 @@ public class SortablePlayersTableCreator {
|
||||||
} catch (NullPointerException e) {
|
} catch (NullPointerException e) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Benchmark.stop("Create Players table "+data.size());
|
||||||
return html;
|
return html;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,11 +1,9 @@
|
||||||
package main.java.com.djrapitops.plan.utilities;
|
package main.java.com.djrapitops.plan.utilities;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Set;
|
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
import main.java.com.djrapitops.plan.Log;
|
import main.java.com.djrapitops.plan.Log;
|
||||||
|
@ -35,7 +33,6 @@ import main.java.com.djrapitops.plan.ui.tables.SortablePlayersTableCreator;
|
||||||
import org.bukkit.GameMode;
|
import org.bukkit.GameMode;
|
||||||
import org.bukkit.scheduler.BukkitRunnable;
|
import org.bukkit.scheduler.BukkitRunnable;
|
||||||
import org.bukkit.scheduler.BukkitTask;
|
import org.bukkit.scheduler.BukkitTask;
|
||||||
import static org.bukkit.Bukkit.getOfflinePlayer;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
|
@ -66,6 +63,7 @@ public class Analysis {
|
||||||
* @param analysisCache Cache that the data is saved to.
|
* @param analysisCache Cache that the data is saved to.
|
||||||
*/
|
*/
|
||||||
public void runAnalysis(AnalysisCacheHandler analysisCache) {
|
public void runAnalysis(AnalysisCacheHandler analysisCache) {
|
||||||
|
Benchmark.start("Analysis");
|
||||||
log(Phrase.ANALYSIS_START + "");
|
log(Phrase.ANALYSIS_START + "");
|
||||||
// Async task for Analysis
|
// Async task for Analysis
|
||||||
BukkitTask asyncAnalysisTask = (new BukkitRunnable() {
|
BukkitTask asyncAnalysisTask = (new BukkitRunnable() {
|
||||||
|
@ -77,21 +75,6 @@ public class Analysis {
|
||||||
}).runTaskAsynchronously(plugin);
|
}).runTaskAsynchronously(plugin);
|
||||||
}
|
}
|
||||||
|
|
||||||
private List<UUID> fetchPlayersInDB(Database db) {
|
|
||||||
try {
|
|
||||||
log(Phrase.ANALYSIS_FETCH_PLAYERS + "");
|
|
||||||
Set<UUID> savedUUIDs = db.getSavedUUIDs();
|
|
||||||
List<UUID> uuids = savedUUIDs.parallelStream()
|
|
||||||
.filter(uuid -> uuid != null)
|
|
||||||
.filter((uuid) -> (getOfflinePlayer(uuid).hasPlayedBefore()))
|
|
||||||
.collect(Collectors.toList());
|
|
||||||
return uuids;
|
|
||||||
} catch (Exception e) {
|
|
||||||
Log.toLog(this.getClass().getName(), e);
|
|
||||||
}
|
|
||||||
return new ArrayList<>();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Caches analyzed data of db to the provided cache analysisCache.
|
* Caches analyzed data of db to the provided cache analysisCache.
|
||||||
*
|
*
|
||||||
|
@ -102,6 +85,7 @@ public class Analysis {
|
||||||
*/
|
*/
|
||||||
public boolean analyze(AnalysisCacheHandler analysisCache, Database db) {
|
public boolean analyze(AnalysisCacheHandler analysisCache, Database db) {
|
||||||
log(Phrase.ANALYSIS_FETCH_DATA + "");
|
log(Phrase.ANALYSIS_FETCH_DATA + "");
|
||||||
|
Benchmark.start("Analysis Fetch Phase");
|
||||||
try {
|
try {
|
||||||
inspectCache.cacheAllUserData(db);
|
inspectCache.cacheAllUserData(db);
|
||||||
} catch (Exception ex) {
|
} catch (Exception ex) {
|
||||||
|
@ -113,6 +97,7 @@ public class Analysis {
|
||||||
Log.info(Phrase.ANALYSIS_FAIL_NO_DATA + "");
|
Log.info(Phrase.ANALYSIS_FAIL_NO_DATA + "");
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
Benchmark.stop("Analysis Fetch Phase");
|
||||||
return analyzeData(rawData, analysisCache);
|
return analyzeData(rawData, analysisCache);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -123,19 +108,22 @@ public class Analysis {
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
public boolean analyzeData(List<UserData> rawData, AnalysisCacheHandler analysisCache) {
|
public boolean analyzeData(List<UserData> rawData, AnalysisCacheHandler analysisCache) {
|
||||||
|
Benchmark.start("Analysis UUID transform");
|
||||||
|
Benchmark.start("Analysis Phase");
|
||||||
List<UUID> uuids = rawData.stream().map(d -> d.getUuid()).collect(Collectors.toList());
|
List<UUID> uuids = rawData.stream().map(d -> d.getUuid()).collect(Collectors.toList());
|
||||||
// Create empty Dataset
|
Benchmark.stop("Analysis UUID transform");
|
||||||
|
Benchmark.start("Analysis Create Empty dataset");
|
||||||
long now = MiscUtils.getTime();
|
long now = MiscUtils.getTime();
|
||||||
final RawAnalysisData sorted = new RawAnalysisData();
|
final RawAnalysisData sorted = new RawAnalysisData();
|
||||||
sorted.setCommandUse(plugin.getHandler().getCommandUse());
|
sorted.setCommandUse(plugin.getHandler().getCommandUse());
|
||||||
log(Phrase.ANALYSIS_BEGIN_ANALYSIS + "");
|
|
||||||
AnalysisData analysisData = new AnalysisData();
|
AnalysisData analysisData = new AnalysisData();
|
||||||
|
Benchmark.stop("Analysis Create Empty dataset");
|
||||||
|
log(Phrase.ANALYSIS_BEGIN_ANALYSIS + "");
|
||||||
String playersTable = SortablePlayersTableCreator.createSortablePlayersTable(rawData);
|
String playersTable = SortablePlayersTableCreator.createSortablePlayersTable(rawData);
|
||||||
analysisData.setSortablePlayersTable(playersTable);
|
analysisData.setSortablePlayersTable(playersTable);
|
||||||
sorted.fillGeolocations();
|
sorted.fillGeolocations();
|
||||||
// Fill Dataset with userdata.
|
Benchmark.start("Analysis Fill Dataset");
|
||||||
rawData.stream().forEach((uData) -> {
|
rawData.stream().forEach((uData) -> {
|
||||||
// try {
|
|
||||||
Map<GameMode, Long> gmTimes = uData.getGmTimes();
|
Map<GameMode, Long> gmTimes = uData.getGmTimes();
|
||||||
if (gmTimes != null) {
|
if (gmTimes != null) {
|
||||||
Long survival = gmTimes.get(GameMode.SURVIVAL);
|
Long survival = gmTimes.get(GameMode.SURVIVAL);
|
||||||
|
@ -214,11 +202,8 @@ public class Analysis {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
//} catch (NullPointerException e) {
|
|
||||||
// plugin.logError(Phrase.DATA_CORRUPTION_WARN.parse(uData.getUuid() + ""));
|
|
||||||
// plugin.toLog(this.getClass().getName(), e);
|
|
||||||
// }
|
|
||||||
});
|
});
|
||||||
|
Benchmark.stop("Analysis Fill Dataset");
|
||||||
createCloroplethMap(analysisData, sorted.getGeolocations(), sorted.getGeocodes());
|
createCloroplethMap(analysisData, sorted.getGeolocations(), sorted.getGeocodes());
|
||||||
// Analyze & Save RawAnalysisData to AnalysisData
|
// Analyze & Save RawAnalysisData to AnalysisData
|
||||||
createPlayerActivityGraphs(analysisData, sorted.getSessiondata(), sorted.getRegistered());
|
createPlayerActivityGraphs(analysisData, sorted.getSessiondata(), sorted.getRegistered());
|
||||||
|
@ -243,6 +228,7 @@ public class Analysis {
|
||||||
analysisData.setPlaytimeDistributionData(SessionLengthDistributionGraphCreator.generateDataArray(sorted.getPlaytimes().values()));
|
analysisData.setPlaytimeDistributionData(SessionLengthDistributionGraphCreator.generateDataArray(sorted.getPlaytimes().values()));
|
||||||
analysisData.setAdditionalDataReplaceMap(analyzeAdditionalPluginData(uuids));
|
analysisData.setAdditionalDataReplaceMap(analyzeAdditionalPluginData(uuids));
|
||||||
analysisCache.cache(analysisData);
|
analysisCache.cache(analysisData);
|
||||||
|
Benchmark.stop("Analysis");
|
||||||
if (Settings.ANALYSIS_LOG_FINISHED.isTrue()) {
|
if (Settings.ANALYSIS_LOG_FINISHED.isTrue()) {
|
||||||
Log.info(Phrase.ANALYSIS_COMPLETE + "");
|
Log.info(Phrase.ANALYSIS_COMPLETE + "");
|
||||||
}
|
}
|
||||||
|
@ -250,6 +236,7 @@ public class Analysis {
|
||||||
}
|
}
|
||||||
|
|
||||||
private void createCommandUseTable(final RawAnalysisData raw, AnalysisData data) {
|
private void createCommandUseTable(final RawAnalysisData raw, AnalysisData data) {
|
||||||
|
|
||||||
Map<String, Integer> commandUse = raw.getCommandUse();
|
Map<String, Integer> commandUse = raw.getCommandUse();
|
||||||
if (!commandUse.isEmpty()) {
|
if (!commandUse.isEmpty()) {
|
||||||
String tableHtml = SortableCommandUseTableCreator.createSortedCommandUseTable(commandUse);
|
String tableHtml = SortableCommandUseTableCreator.createSortedCommandUseTable(commandUse);
|
||||||
|
@ -262,13 +249,16 @@ public class Analysis {
|
||||||
}
|
}
|
||||||
|
|
||||||
private void createActivityVisalization(int total, int totalBanned, int active, int inactive, int joinleaver, AnalysisData data) {
|
private void createActivityVisalization(int total, int totalBanned, int active, int inactive, int joinleaver, AnalysisData data) {
|
||||||
|
Benchmark.start("Analysis Activity Visualization");
|
||||||
data.setActive(active);
|
data.setActive(active);
|
||||||
data.setInactive(inactive);
|
data.setInactive(inactive);
|
||||||
data.setBanned(totalBanned);
|
data.setBanned(totalBanned);
|
||||||
data.setJoinleaver(joinleaver);
|
data.setJoinleaver(joinleaver);
|
||||||
data.setTotal(total);
|
data.setTotal(total);
|
||||||
|
Benchmark.stop("Analysis Activity Visualization");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO Refactor
|
||||||
private void analyzeAverageAge(List<Integer> ages, AnalysisData data) {
|
private void analyzeAverageAge(List<Integer> ages, AnalysisData data) {
|
||||||
int totalAge = 0;
|
int totalAge = 0;
|
||||||
for (int age : ages) {
|
for (int age : ages) {
|
||||||
|
@ -284,6 +274,7 @@ public class Analysis {
|
||||||
}
|
}
|
||||||
|
|
||||||
private void createGamemodeUsageVisualization(long gmZero, long gmOne, long gmTwo, long gmThree, AnalysisData data) {
|
private void createGamemodeUsageVisualization(long gmZero, long gmOne, long gmTwo, long gmThree, AnalysisData data) {
|
||||||
|
Benchmark.start("Analysis GMVisualization");
|
||||||
long gmTotal = gmZero + gmOne + gmTwo + gmThree;
|
long gmTotal = gmZero + gmOne + gmTwo + gmThree;
|
||||||
HashMap<GameMode, Long> totalGmTimes = new HashMap<>();
|
HashMap<GameMode, Long> totalGmTimes = new HashMap<>();
|
||||||
totalGmTimes.put(GameMode.SURVIVAL, gmZero);
|
totalGmTimes.put(GameMode.SURVIVAL, gmZero);
|
||||||
|
@ -297,6 +288,7 @@ public class Analysis {
|
||||||
data.setGm1Perc((gmOne * 1.0 / gmTotal));
|
data.setGm1Perc((gmOne * 1.0 / gmTotal));
|
||||||
data.setGm2Perc((gmTwo * 1.0 / gmTotal));
|
data.setGm2Perc((gmTwo * 1.0 / gmTotal));
|
||||||
data.setGm3Perc((gmThree * 1.0 / gmTotal));
|
data.setGm3Perc((gmThree * 1.0 / gmTotal));
|
||||||
|
Benchmark.stop("Analysis GMVisualization");
|
||||||
}
|
}
|
||||||
|
|
||||||
private void createPlayerActivityGraphs(AnalysisData data, List<SessionData> sData, List<Long> registered) {
|
private void createPlayerActivityGraphs(AnalysisData data, List<SessionData> sData, List<Long> registered) {
|
||||||
|
@ -311,9 +303,15 @@ public class Analysis {
|
||||||
data.setNewPlayersWeek(AnalysisUtils.getNewPlayers(registered, scaleWeek, now));
|
data.setNewPlayersWeek(AnalysisUtils.getNewPlayers(registered, scaleWeek, now));
|
||||||
data.setNewPlayersMonth(AnalysisUtils.getNewPlayers(registered, scaleMonth, now));
|
data.setNewPlayersMonth(AnalysisUtils.getNewPlayers(registered, scaleMonth, now));
|
||||||
|
|
||||||
String[] dayArray = PlayerActivityGraphCreator.generateDataArray(sData, scaleDay, maxPlayers);
|
List<SessionData> sessions = sData.stream()
|
||||||
String[] weekArray = PlayerActivityGraphCreator.generateDataArray(sData, scaleWeek, maxPlayers);
|
.filter(session -> (session != null))
|
||||||
String[] monthArray = PlayerActivityGraphCreator.generateDataArray(sData, scaleMonth, maxPlayers);
|
.filter(session -> session.isValid())
|
||||||
|
.filter((session) -> (session.getSessionStart() >= now-scaleMonth || session.getSessionEnd() >= now-scaleMonth))
|
||||||
|
.collect(Collectors.toList());
|
||||||
|
|
||||||
|
String[] dayArray = PlayerActivityGraphCreator.generateDataArray(sessions, scaleDay, maxPlayers);
|
||||||
|
String[] weekArray = PlayerActivityGraphCreator.generateDataArray(sessions, scaleWeek, maxPlayers);
|
||||||
|
String[] monthArray = PlayerActivityGraphCreator.generateDataArray(sessions, scaleMonth, maxPlayers);
|
||||||
|
|
||||||
data.setPlayersDataArray(new String[]{dayArray[0], dayArray[1], weekArray[0], weekArray[1], monthArray[0], monthArray[1]});
|
data.setPlayersDataArray(new String[]{dayArray[0], dayArray[1], weekArray[0], weekArray[1], monthArray[0], monthArray[1]});
|
||||||
}
|
}
|
||||||
|
@ -325,6 +323,7 @@ public class Analysis {
|
||||||
}
|
}
|
||||||
|
|
||||||
private void createCloroplethMap(AnalysisData aData, Map<String, Integer> geolocations, Map<String, String> geocodes) {
|
private void createCloroplethMap(AnalysisData aData, Map<String, Integer> geolocations, Map<String, String> geocodes) {
|
||||||
|
Benchmark.start("Analysis Chloropleth map");
|
||||||
String locations = "[";
|
String locations = "[";
|
||||||
String z = "[";
|
String z = "[";
|
||||||
String text = "[";
|
String text = "[";
|
||||||
|
@ -344,6 +343,7 @@ public class Analysis {
|
||||||
aData.setGeomapCountries(locations.replace(",]", "]"));
|
aData.setGeomapCountries(locations.replace(",]", "]"));
|
||||||
aData.setGeomapZ(z.replace(",]", "]"));
|
aData.setGeomapZ(z.replace(",]", "]"));
|
||||||
aData.setGeomapCodes(text.replace(",]", "]"));
|
aData.setGeomapCodes(text.replace(",]", "]"));
|
||||||
|
Benchmark.stop("Analysis Chloropleth map");
|
||||||
}
|
}
|
||||||
|
|
||||||
private Map<String, String> analyzeAdditionalPluginData(List<UUID> uuids) {
|
private Map<String, String> analyzeAdditionalPluginData(List<UUID> uuids) {
|
||||||
|
@ -358,8 +358,9 @@ public class Analysis {
|
||||||
};
|
};
|
||||||
final AnalysisType bool = AnalysisType.BOOLEAN_PERCENTAGE;
|
final AnalysisType bool = AnalysisType.BOOLEAN_PERCENTAGE;
|
||||||
final AnalysisType boolTot = AnalysisType.BOOLEAN_TOTAL;
|
final AnalysisType boolTot = AnalysisType.BOOLEAN_TOTAL;
|
||||||
|
Log.debug("Analyzing additional sources: " + sources.size());
|
||||||
sources.parallelStream().forEach(source -> {
|
sources.parallelStream().forEach(source -> {
|
||||||
Log.debug("Analyzing source: " + source.getPlaceholder("").replace("%", ""));
|
Benchmark.start("Source " + source.getPlaceholder("").replace("%", ""));
|
||||||
try {
|
try {
|
||||||
final List<AnalysisType> analysisTypes = source.getAnalysisTypes();
|
final List<AnalysisType> analysisTypes = source.getAnalysisTypes();
|
||||||
if (analysisTypes.isEmpty()) {
|
if (analysisTypes.isEmpty()) {
|
||||||
|
@ -388,6 +389,8 @@ public class Analysis {
|
||||||
} catch (Throwable e) {
|
} catch (Throwable e) {
|
||||||
Log.error("A PluginData-source caused an exception: " + source.getPlaceholder("").replace("%", ""));
|
Log.error("A PluginData-source caused an exception: " + source.getPlaceholder("").replace("%", ""));
|
||||||
Log.toLog(this.getClass().getName(), e);
|
Log.toLog(this.getClass().getName(), e);
|
||||||
|
} finally {
|
||||||
|
Benchmark.stop("Source " + source.getPlaceholder("").replace("%", ""));
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
return replaceMap;
|
return replaceMap;
|
||||||
|
|
|
@ -54,6 +54,7 @@ public class AnalysisUtils {
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
public static int getNewPlayers(List<Long> registered, long scale, long now) {
|
public static int getNewPlayers(List<Long> registered, long scale, long now) {
|
||||||
|
Benchmark.start("Get new players for "+registered.size()+" "+scale+" | ");
|
||||||
int newPlayers = 0;
|
int newPlayers = 0;
|
||||||
if (!registered.isEmpty()) {
|
if (!registered.isEmpty()) {
|
||||||
newPlayers = registered.stream()
|
newPlayers = registered.stream()
|
||||||
|
@ -62,7 +63,7 @@ public class AnalysisUtils {
|
||||||
.map((_item) -> 1).reduce(newPlayers, Integer::sum);
|
.map((_item) -> 1).reduce(newPlayers, Integer::sum);
|
||||||
}
|
}
|
||||||
// Filters out register dates before scale
|
// Filters out register dates before scale
|
||||||
|
Benchmark.stop("Get new players for "+registered.size()+" "+scale+" | ");
|
||||||
return newPlayers;
|
return newPlayers;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,30 @@
|
||||||
|
package main.java.com.djrapitops.plan.utilities;
|
||||||
|
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
import main.java.com.djrapitops.plan.Log;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author Risto
|
||||||
|
*/
|
||||||
|
public class Benchmark {
|
||||||
|
|
||||||
|
private static Map<String, Long> starts = new HashMap<>();
|
||||||
|
|
||||||
|
public static void start(String source) {
|
||||||
|
starts.put(source, System.nanoTime());
|
||||||
|
Log.debug(source);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static long stop(String source) {
|
||||||
|
Long s = starts.get(source);
|
||||||
|
if (s != null) {
|
||||||
|
long ms = (System.nanoTime() - s) / 1000000;
|
||||||
|
Log.debug(source + " took " + ms+" ms");
|
||||||
|
starts.remove(source);
|
||||||
|
return ms;
|
||||||
|
}
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
|
@ -2,6 +2,7 @@ package main.java.com.djrapitops.plan.utilities;
|
||||||
|
|
||||||
import java.text.DecimalFormat;
|
import java.text.DecimalFormat;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
|
import main.java.com.djrapitops.plan.Settings;
|
||||||
import org.bukkit.Location;
|
import org.bukkit.Location;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -58,20 +59,20 @@ public class FormatUtils {
|
||||||
x /= 24;
|
x /= 24;
|
||||||
long days = x;
|
long days = x;
|
||||||
if (days != 0) {
|
if (days != 0) {
|
||||||
builder.append(days).append("d ");
|
builder.append(Settings.FORMAT_DAYS.toString().replace("%days%", ""+days));
|
||||||
}
|
}
|
||||||
if (hours != 0) {
|
if (hours != 0) {
|
||||||
builder.append(hours).append("h ");
|
builder.append(Settings.FORMAT_HOURS.toString().replace("%hours%", ""+hours));
|
||||||
}
|
}
|
||||||
if (minutes != 0) {
|
if (minutes != 0) {
|
||||||
builder.append(minutes).append("m ");
|
builder.append(Settings.FORMAT_MINUTES.toString().replace("%minutes%", ""+minutes));
|
||||||
}
|
}
|
||||||
if (seconds != 0) {
|
if (seconds != 0) {
|
||||||
builder.append(seconds).append("s");
|
builder.append(Settings.FORMAT_SECONDS.toString().replace("%seconds%", ""+seconds));
|
||||||
}
|
}
|
||||||
String formattedTime = builder.toString();
|
String formattedTime = builder.toString();
|
||||||
if (formattedTime.isEmpty()) {
|
if (formattedTime.isEmpty()) {
|
||||||
return "0s";
|
return Settings.FORMAT_SECONDS.toString().replace("%seconds%", "0");
|
||||||
}
|
}
|
||||||
return formattedTime;
|
return formattedTime;
|
||||||
}
|
}
|
||||||
|
@ -132,7 +133,7 @@ public class FormatUtils {
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
public static String cutDecimals(double d) {
|
public static String cutDecimals(double d) {
|
||||||
DecimalFormat df = new DecimalFormat("#.##");
|
DecimalFormat df = new DecimalFormat(Settings.FORMAT_DECIMALS.toString());
|
||||||
// df.setRoundingMode(RoundingMode.CEILING);
|
// df.setRoundingMode(RoundingMode.CEILING);
|
||||||
return df.format(d);
|
return df.format(d);
|
||||||
}
|
}
|
||||||
|
|
|
@ -109,7 +109,6 @@ public class HtmlUtils {
|
||||||
Log.debug("Html parsing for:" + pluginNames + ", " + (evenSize));
|
Log.debug("Html parsing for:" + pluginNames + ", " + (evenSize));
|
||||||
for (int i = 0; i < evenSize; i++) {
|
for (int i = 0; i < evenSize; i++) {
|
||||||
String name = pluginNames.get(i);
|
String name = pluginNames.get(i);
|
||||||
Log.debug("Html parsing: " + name);
|
|
||||||
if (i % 2 == 0) {
|
if (i % 2 == 0) {
|
||||||
temp = Html.COLUMN_DIV_WRAPPER.parse(getContent(name, placeholders.get(name)));
|
temp = Html.COLUMN_DIV_WRAPPER.parse(getContent(name, placeholders.get(name)));
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -31,6 +31,7 @@ public class PlaceholderUtils {
|
||||||
* @return HashMap that contains string for each placeholder.
|
* @return HashMap that contains string for each placeholder.
|
||||||
*/
|
*/
|
||||||
public static Map<String, String> getAnalysisReplaceRules(AnalysisData data) {
|
public static Map<String, String> getAnalysisReplaceRules(AnalysisData data) {
|
||||||
|
Benchmark.start("Replace Placeholders Anaysis");
|
||||||
HashMap<String, String> replaceMap = new HashMap<>();
|
HashMap<String, String> replaceMap = new HashMap<>();
|
||||||
replaceMap.put("%gm0%", (int) (data.getGm0Perc() * 100) + "%");
|
replaceMap.put("%gm0%", (int) (data.getGm0Perc() * 100) + "%");
|
||||||
replaceMap.put("%gm1%", (int) (data.getGm1Perc() * 100) + "%");
|
replaceMap.put("%gm1%", (int) (data.getGm1Perc() * 100) + "%");
|
||||||
|
@ -127,6 +128,8 @@ public class PlaceholderUtils {
|
||||||
replaceMap.put("#" + defaultCols[i], "#" + colors[i]);
|
replaceMap.put("#" + defaultCols[i], "#" + colors[i]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
replaceMap.put("%servername%", Settings.SERVER_NAME.toString());
|
||||||
|
Benchmark.stop("Replace Placeholders Anaysis");
|
||||||
return replaceMap;
|
return replaceMap;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -138,6 +141,7 @@ public class PlaceholderUtils {
|
||||||
* @throws java.io.FileNotFoundException if planliteplayer.html is not found
|
* @throws java.io.FileNotFoundException if planliteplayer.html is not found
|
||||||
*/
|
*/
|
||||||
public static Map<String, String> getInspectReplaceRules(UserData data) throws FileNotFoundException {
|
public static Map<String, String> getInspectReplaceRules(UserData data) throws FileNotFoundException {
|
||||||
|
Benchmark.start("Replace Placeholders Inspect");
|
||||||
HashMap<String, String> replaceMap = new HashMap<>();
|
HashMap<String, String> replaceMap = new HashMap<>();
|
||||||
boolean showIPandUUID = Settings.SECURITY_IP_UUID.isTrue();
|
boolean showIPandUUID = Settings.SECURITY_IP_UUID.isTrue();
|
||||||
UUID uuid = data.getUuid();
|
UUID uuid = data.getUuid();
|
||||||
|
@ -211,10 +215,19 @@ public class PlaceholderUtils {
|
||||||
replaceMap.put("%datasessiondistribution%", distribution[0]);
|
replaceMap.put("%datasessiondistribution%", distribution[0]);
|
||||||
replaceMap.put("%labelssessiondistribution%", distribution[1]);
|
replaceMap.put("%labelssessiondistribution%", distribution[1]);
|
||||||
replaceMap.put("%inaccuratedatawarning%", (now - data.getRegistered() < 180000) ? Html.WARN_INACCURATE.parse() : "");
|
replaceMap.put("%inaccuratedatawarning%", (now - data.getRegistered() < 180000) ? Html.WARN_INACCURATE.parse() : "");
|
||||||
|
String[] colors = new String[]{Settings.HCOLOR_MAIN.toString(), Settings.HCOLOR_MAIN_DARK.toString(), Settings.HCOLOR_SEC.toString(), Settings.HCOLOR_TER.toString(), Settings.HCOLOR_TER_DARK.toString()};
|
||||||
|
String[] defaultCols = new String[]{"348e0f", "267F00", "5cb239", "89c471", "5da341"};
|
||||||
|
for (int i = 0; i < colors.length; i++) {
|
||||||
|
if (!defaultCols[i].equals(colors[i])) {
|
||||||
|
replaceMap.put("#" + defaultCols[i], "#" + colors[i]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
replaceMap.put("%servername%", Settings.SERVER_NAME.toString());
|
||||||
String pluginsTabHtml = plugin.getHookHandler().getPluginsTabLayoutForInspect();
|
String pluginsTabHtml = plugin.getHookHandler().getPluginsTabLayoutForInspect();
|
||||||
Map<String, String> additionalReplaceRules = plugin.getHookHandler().getAdditionalInspectReplaceRules(uuid);
|
Map<String, String> additionalReplaceRules = plugin.getHookHandler().getAdditionalInspectReplaceRules(uuid);
|
||||||
String replacedOnce = HtmlUtils.replacePlaceholders(pluginsTabHtml, additionalReplaceRules);
|
String replacedOnce = HtmlUtils.replacePlaceholders(pluginsTabHtml, additionalReplaceRules);
|
||||||
replaceMap.put("%plugins%", HtmlUtils.replacePlaceholders(replacedOnce, additionalReplaceRules));
|
replaceMap.put("%plugins%", HtmlUtils.replacePlaceholders(replacedOnce, additionalReplaceRules));
|
||||||
|
Benchmark.stop("Replace Placeholders Inspect");
|
||||||
return replaceMap;
|
return replaceMap;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -284,7 +284,7 @@ header p {
|
||||||
<div class="header-content">
|
<div class="header-content">
|
||||||
<img src="http://puu.sh/tJZUb/c2e0ab220f.png" alt="Player Analytics | Analysis">
|
<img src="http://puu.sh/tJZUb/c2e0ab220f.png" alt="Player Analytics | Analysis">
|
||||||
<p>Player Analytics v.%version%</p>
|
<p>Player Analytics v.%version%</p>
|
||||||
<h1><span id="navbutton" onclick="openNav()">☰ </span>Plan | Server Analysis</h1>
|
<h1><span id="navbutton" onclick="openNav()">☰ </span>%servername% | Server Analysis</h1>
|
||||||
</div>
|
</div>
|
||||||
</header>
|
</header>
|
||||||
<div id="content" class="content">
|
<div id="content" class="content">
|
||||||
|
@ -808,7 +808,10 @@ function closeNav() {
|
||||||
}
|
}
|
||||||
var navButtons = document.getElementsByClassName("nav-button");
|
var navButtons = document.getElementsByClassName("nav-button");
|
||||||
var tabs = document.getElementsByClassName("tab");
|
var tabs = document.getElementsByClassName("tab");
|
||||||
var slideIndex = 0;
|
var slideIndex = window.localStorage.getItem("AnalysisSlideIndex");
|
||||||
|
if (slideIndex == null) {
|
||||||
|
slideIndex = 0;
|
||||||
|
}
|
||||||
var x = document.getElementById("main");
|
var x = document.getElementById("main");
|
||||||
|
|
||||||
x.style.transform = "translate3d(0px,0px,0)";
|
x.style.transform = "translate3d(0px,0px,0)";
|
||||||
|
@ -819,7 +822,7 @@ for (i=0; i < navButtons.length; i++) {
|
||||||
tabs[i].style.width = ""+100/navButtons.length+"%";
|
tabs[i].style.width = ""+100/navButtons.length+"%";
|
||||||
}
|
}
|
||||||
x.style.opacity = "1";
|
x.style.opacity = "1";
|
||||||
openFunc(0);
|
openFunc(slideIndex)();
|
||||||
|
|
||||||
function openFunc(i) {
|
function openFunc(i) {
|
||||||
return function() {
|
return function() {
|
||||||
|
@ -827,11 +830,20 @@ function openFunc(i) {
|
||||||
closeNav();
|
closeNav();
|
||||||
}
|
}
|
||||||
var max = navButtons.length;
|
var max = navButtons.length;
|
||||||
|
for (var j = 0; j < max; j++) {
|
||||||
|
if (j == i) {
|
||||||
|
navButtons[j].classList.add('active');
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (navButtons[j].classList.contains('active')) {
|
||||||
|
navButtons[j].classList.remove('active');
|
||||||
|
}
|
||||||
|
}
|
||||||
var perc = -100 / navButtons.length;
|
var perc = -100 / navButtons.length;
|
||||||
slideIndex = i;
|
slideIndex = i;
|
||||||
if (slideIndex>max) {slideIndex=0};
|
if (slideIndex>max) {slideIndex=0};
|
||||||
if (slideIndex<0) {slideIndex=max};
|
if (slideIndex<0) {slideIndex=max};
|
||||||
|
window.localStorage.setItem("AnalysisSlideIndex", slideIndex);
|
||||||
var value = slideIndex*perc;
|
var value = slideIndex*perc;
|
||||||
x.style.transition = "0.5s";
|
x.style.transition = "0.5s";
|
||||||
x.style.transform = "translate3d("+value+"%,0px,0)";
|
x.style.transform = "translate3d("+value+"%,0px,0)";
|
||||||
|
|
|
@ -32,6 +32,14 @@ Settings:
|
||||||
AddressSecurityCode: bAkEd
|
AddressSecurityCode: bAkEd
|
||||||
|
|
||||||
Customization:
|
Customization:
|
||||||
|
ServerName: 'Plan'
|
||||||
|
Formats:
|
||||||
|
TimeAmount:
|
||||||
|
Days: '%days%d '
|
||||||
|
Hours: '%hours%h '
|
||||||
|
Minutes: '%minutes%m '
|
||||||
|
Seconds: '%seconds%s'
|
||||||
|
DecimalPoints: '#.##'
|
||||||
Colors:
|
Colors:
|
||||||
Commands:
|
Commands:
|
||||||
Main: '&2'
|
Main: '&2'
|
||||||
|
@ -68,6 +76,15 @@ Customization:
|
||||||
Male: 'male, boy, man, boe, sir, mr, guy, he, männlich, maskulin, junge, mann'
|
Male: 'male, boy, man, boe, sir, mr, guy, he, männlich, maskulin, junge, mann'
|
||||||
IgnoreWhen: 'sure, think, with, are, you, din'
|
IgnoreWhen: 'sure, think, with, are, you, din'
|
||||||
Plugins:
|
Plugins:
|
||||||
|
Enabled:
|
||||||
|
AdvancedAchievements: true
|
||||||
|
Essentials: true
|
||||||
|
Factions: true
|
||||||
|
Jobs: true
|
||||||
|
McMMO: true
|
||||||
|
OnTime: true
|
||||||
|
Towny: true
|
||||||
|
Vault: true
|
||||||
Factions:
|
Factions:
|
||||||
HideFactions:
|
HideFactions:
|
||||||
- ExampleFaction
|
- ExampleFaction
|
||||||
|
|
|
@ -321,7 +321,7 @@ table.sortable th:not(.sorttable_sorted):not(.sorttable_sorted_reverse):not(.sor
|
||||||
<div class="header-content">
|
<div class="header-content">
|
||||||
<img style="float: right; padding: 5px" src="http://puu.sh/tJZUb/c2e0ab220f.png" alt="Player Analytics | Analysis">
|
<img style="float: right; padding: 5px" src="http://puu.sh/tJZUb/c2e0ab220f.png" alt="Player Analytics | Analysis">
|
||||||
<p style="float: right; text-align: right;">Player Analytics v.%version%</p>
|
<p style="float: right; text-align: right;">Player Analytics v.%version%</p>
|
||||||
<h1><span id="navbutton" onclick="openNav()">☰ </span>Plan | Inspect Player %name%%op%</h1>
|
<h1><span id="navbutton" onclick="openNav()">☰ </span>%servername% | Inspect Player %name%%op%</h1>
|
||||||
</div>
|
</div>
|
||||||
</header>
|
</header>
|
||||||
<div id="content" class="content">
|
<div id="content" class="content">
|
||||||
|
@ -559,7 +559,10 @@ function closeNav() {
|
||||||
}
|
}
|
||||||
var navButtons = document.getElementsByClassName("nav-button");
|
var navButtons = document.getElementsByClassName("nav-button");
|
||||||
var tabs = document.getElementsByClassName("tab");
|
var tabs = document.getElementsByClassName("tab");
|
||||||
var slideIndex = 0;
|
var slideIndex = window.localStorage.getItem("InspectSlideIndex");
|
||||||
|
if (slideIndex == null) {
|
||||||
|
slideIndex = 0;
|
||||||
|
}
|
||||||
var x = document.getElementById("main");
|
var x = document.getElementById("main");
|
||||||
|
|
||||||
x.style.transform = "translate3d(0px,0px,0)";
|
x.style.transform = "translate3d(0px,0px,0)";
|
||||||
|
@ -570,7 +573,7 @@ for (i=0; i < navButtons.length; i++) {
|
||||||
tabs[i].style.width = ""+100/navButtons.length+"%";
|
tabs[i].style.width = ""+100/navButtons.length+"%";
|
||||||
}
|
}
|
||||||
x.style.opacity = "1";
|
x.style.opacity = "1";
|
||||||
openFunc(0);
|
openFunc(slideIndex)();
|
||||||
|
|
||||||
function openFunc(i) {
|
function openFunc(i) {
|
||||||
return function() {
|
return function() {
|
||||||
|
@ -578,11 +581,20 @@ function openFunc(i) {
|
||||||
closeNav();
|
closeNav();
|
||||||
}
|
}
|
||||||
var max = navButtons.length;
|
var max = navButtons.length;
|
||||||
|
for (var j = 0; j < max; j++) {
|
||||||
|
if (j == i) {
|
||||||
|
navButtons[j].classList.add('active');
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (navButtons[j].classList.contains('active')) {
|
||||||
|
navButtons[j].classList.remove('active');
|
||||||
|
}
|
||||||
|
}
|
||||||
var perc = -100 / navButtons.length;
|
var perc = -100 / navButtons.length;
|
||||||
slideIndex = i;
|
slideIndex = i;
|
||||||
if (slideIndex>max) {slideIndex=0};
|
if (slideIndex>max) {slideIndex=0};
|
||||||
if (slideIndex<0) {slideIndex=max};
|
if (slideIndex<0) {slideIndex=max};
|
||||||
|
window.localStorage.setItem("InspectSlideIndex", slideIndex);
|
||||||
var value = slideIndex*perc;
|
var value = slideIndex*perc;
|
||||||
x.style.transition = "0.5s";
|
x.style.transition = "0.5s";
|
||||||
x.style.transform = "translate3d("+value+"%,0px,0)";
|
x.style.transform = "translate3d("+value+"%,0px,0)";
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
name: Plan
|
name: Plan
|
||||||
author: Rsl1122
|
author: Rsl1122
|
||||||
main: main.java.com.djrapitops.plan.Plan
|
main: main.java.com.djrapitops.plan.Plan
|
||||||
version: 3.2.1
|
version: 3.3.0
|
||||||
|
|
||||||
softdepend:
|
softdepend:
|
||||||
- OnTime
|
- OnTime
|
||||||
|
|
|
@ -31,6 +31,8 @@ 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 test.java.utils.TestInit;
|
||||||
|
import static org.junit.Assert.assertEquals;
|
||||||
|
import static org.junit.Assert.assertTrue;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
|
|
|
@ -8,7 +8,6 @@ package test.java.main.java.com.djrapitops.plan.data.cache;
|
||||||
import java.sql.SQLException;
|
import java.sql.SQLException;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.List;
|
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
import main.java.com.djrapitops.plan.Plan;
|
import main.java.com.djrapitops.plan.Plan;
|
||||||
|
@ -69,6 +68,11 @@ public class DataCacheHandlerTest {
|
||||||
@Override
|
@Override
|
||||||
public void startConnectionPingTask(Plan plugin) {
|
public void startConnectionPingTask(Plan plugin) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void convertBukkitDataToDB() {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -19,6 +19,7 @@ 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 test.java.utils.TestInit;
|
||||||
|
import static org.junit.Assert.assertTrue;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
|
|
|
@ -29,6 +29,9 @@ import test.java.utils.TestInit;
|
||||||
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 static org.powermock.api.mockito.PowerMockito.when;
|
import static org.powermock.api.mockito.PowerMockito.when;
|
||||||
|
import static org.junit.Assert.assertEquals;
|
||||||
|
import static org.junit.Assert.assertTrue;
|
||||||
|
import static org.powermock.api.mockito.PowerMockito.when;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
|
|
|
@ -26,6 +26,7 @@ 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 static org.powermock.api.mockito.PowerMockito.when;
|
import static org.powermock.api.mockito.PowerMockito.when;
|
||||||
|
import static org.powermock.api.mockito.PowerMockito.when;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
|
|
|
@ -47,6 +47,8 @@ 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 test.java.utils.TestInit;
|
||||||
|
import static org.junit.Assert.assertEquals;
|
||||||
|
import static org.junit.Assert.assertTrue;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
|
@ -82,6 +84,11 @@ public class DatabaseTest {
|
||||||
public void startConnectionPingTask(Plan plugin) {
|
public void startConnectionPingTask(Plan plugin) {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void convertBukkitDataToDB() {
|
||||||
|
|
||||||
|
}
|
||||||
};
|
};
|
||||||
File f = new File(plan.getDataFolder(), "Errors.txt");
|
File f = new File(plan.getDataFolder(), "Errors.txt");
|
||||||
rows = 0;
|
rows = 0;
|
||||||
|
@ -98,11 +105,15 @@ public class DatabaseTest {
|
||||||
EasyMock.expect(Bukkit.getOfflinePlayer(UUID.fromString("45b0dfdb-f71d-4cf3-8c21-27c9d4c651db"))).andReturn(op);
|
EasyMock.expect(Bukkit.getOfflinePlayer(UUID.fromString("45b0dfdb-f71d-4cf3-8c21-27c9d4c651db"))).andReturn(op);
|
||||||
EasyMock.expect(Bukkit.getOfflinePlayer(UUID.fromString("45b0dfdb-f71d-4cf3-8c21-27c9d4c651db"))).andReturn(op);
|
EasyMock.expect(Bukkit.getOfflinePlayer(UUID.fromString("45b0dfdb-f71d-4cf3-8c21-27c9d4c651db"))).andReturn(op);
|
||||||
EasyMock.expect(Bukkit.getOfflinePlayer(UUID.fromString("45b0dfdb-f71d-4cf3-8c21-27c9d4c651db"))).andReturn(op);
|
EasyMock.expect(Bukkit.getOfflinePlayer(UUID.fromString("45b0dfdb-f71d-4cf3-8c21-27c9d4c651db"))).andReturn(op);
|
||||||
op = MockUtils.mockPlayer2();
|
OfflinePlayer op2 = MockUtils.mockPlayer2();
|
||||||
EasyMock.expect(Bukkit.getOfflinePlayer(UUID.fromString("ec94a954-1fa1-445b-b09b-9b698519af80"))).andReturn(op);
|
EasyMock.expect(Bukkit.getOfflinePlayer(UUID.fromString("ec94a954-1fa1-445b-b09b-9b698519af80"))).andReturn(op2);
|
||||||
EasyMock.expect(Bukkit.getOfflinePlayer(UUID.fromString("ec94a954-1fa1-445b-b09b-9b698519af80"))).andReturn(op);
|
EasyMock.expect(Bukkit.getOfflinePlayer(UUID.fromString("ec94a954-1fa1-445b-b09b-9b698519af80"))).andReturn(op2);
|
||||||
EasyMock.expect(Bukkit.getOfflinePlayer(UUID.fromString("ec94a954-1fa1-445b-b09b-9b698519af80"))).andReturn(op);
|
EasyMock.expect(Bukkit.getOfflinePlayer(UUID.fromString("ec94a954-1fa1-445b-b09b-9b698519af80"))).andReturn(op2);
|
||||||
EasyMock.expect(Bukkit.getOfflinePlayer(UUID.fromString("ec94a954-1fa1-445b-b09b-9b698519af80"))).andReturn(op);
|
EasyMock.expect(Bukkit.getOfflinePlayer(UUID.fromString("ec94a954-1fa1-445b-b09b-9b698519af80"))).andReturn(op2);
|
||||||
|
EasyMock.expect(Bukkit.getOfflinePlayers()).andReturn(new OfflinePlayer[]{op, op2});
|
||||||
|
EasyMock.expect(Bukkit.getOfflinePlayers()).andReturn(new OfflinePlayer[]{op, op2});
|
||||||
|
EasyMock.expect(Bukkit.getOfflinePlayers()).andReturn(new OfflinePlayer[]{op, op2});
|
||||||
|
EasyMock.expect(Bukkit.getOfflinePlayers()).andReturn(new OfflinePlayer[]{op, op2});
|
||||||
PowerMock.replay(Bukkit.class);
|
PowerMock.replay(Bukkit.class);
|
||||||
// BukkitScheduler mockScheduler = Mockito.mock(BukkitScheduler.class);
|
// BukkitScheduler mockScheduler = Mockito.mock(BukkitScheduler.class);
|
||||||
// EasyMock.expect(Bukkit.getScheduler()).andReturn(mockScheduler);
|
// EasyMock.expect(Bukkit.getScheduler()).andReturn(mockScheduler);
|
||||||
|
@ -164,6 +175,10 @@ public class DatabaseTest {
|
||||||
@Override
|
@Override
|
||||||
public void startConnectionPingTask(Plan plugin) {
|
public void startConnectionPingTask(Plan plugin) {
|
||||||
|
|
||||||
|
}
|
||||||
|
@Override
|
||||||
|
public void convertBukkitDataToDB() {
|
||||||
|
|
||||||
}
|
}
|
||||||
}.getConfigName());
|
}.getConfigName());
|
||||||
}
|
}
|
||||||
|
@ -177,6 +192,10 @@ public class DatabaseTest {
|
||||||
@Override
|
@Override
|
||||||
public void startConnectionPingTask(Plan plugin) {
|
public void startConnectionPingTask(Plan plugin) {
|
||||||
|
|
||||||
|
}
|
||||||
|
@Override
|
||||||
|
public void convertBukkitDataToDB() {
|
||||||
|
|
||||||
}
|
}
|
||||||
}.getName());
|
}.getName());
|
||||||
}
|
}
|
||||||
|
@ -340,6 +359,10 @@ public class DatabaseTest {
|
||||||
@Override
|
@Override
|
||||||
public void startConnectionPingTask(Plan plugin) {
|
public void startConnectionPingTask(Plan plugin) {
|
||||||
|
|
||||||
|
}
|
||||||
|
@Override
|
||||||
|
public void convertBukkitDataToDB() {
|
||||||
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
backup.init();
|
backup.init();
|
||||||
|
@ -373,6 +396,10 @@ public class DatabaseTest {
|
||||||
@Override
|
@Override
|
||||||
public void startConnectionPingTask(Plan plugin) {
|
public void startConnectionPingTask(Plan plugin) {
|
||||||
|
|
||||||
|
}
|
||||||
|
@Override
|
||||||
|
public void convertBukkitDataToDB() {
|
||||||
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
backup.init();
|
backup.init();
|
||||||
|
|
|
@ -6,15 +6,29 @@ import java.util.List;
|
||||||
import java.util.Random;
|
import java.util.Random;
|
||||||
import main.java.com.djrapitops.plan.data.SessionData;
|
import main.java.com.djrapitops.plan.data.SessionData;
|
||||||
import main.java.com.djrapitops.plan.ui.graphs.PlayerActivityGraphCreator;
|
import main.java.com.djrapitops.plan.ui.graphs.PlayerActivityGraphCreator;
|
||||||
|
import org.bukkit.plugin.java.JavaPlugin;
|
||||||
import static org.junit.Assert.*;
|
import static org.junit.Assert.*;
|
||||||
|
import org.junit.Before;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
|
import org.junit.runner.RunWith;
|
||||||
|
import org.powermock.core.classloader.annotations.PrepareForTest;
|
||||||
|
import org.powermock.modules.junit4.PowerMockRunner;
|
||||||
|
import test.java.utils.TestInit;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* @author Rsl1122
|
* @author Rsl1122
|
||||||
*/
|
*/
|
||||||
|
@RunWith(PowerMockRunner.class)
|
||||||
|
@PrepareForTest(JavaPlugin.class)
|
||||||
public class PlayerActivityGraphCreatorTest {
|
public class PlayerActivityGraphCreatorTest {
|
||||||
|
|
||||||
|
@Before
|
||||||
|
public void setUp() {
|
||||||
|
TestInit t = new TestInit();
|
||||||
|
assertTrue(t.setUp());
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -9,16 +9,29 @@ import java.util.Date;
|
||||||
import main.java.com.djrapitops.plan.utilities.FormatUtils;
|
import main.java.com.djrapitops.plan.utilities.FormatUtils;
|
||||||
import org.bukkit.Location;
|
import org.bukkit.Location;
|
||||||
import org.bukkit.World;
|
import org.bukkit.World;
|
||||||
|
import org.bukkit.plugin.java.JavaPlugin;
|
||||||
import static org.junit.Assert.*;
|
import static org.junit.Assert.*;
|
||||||
|
import org.junit.Before;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
|
import org.junit.runner.RunWith;
|
||||||
|
import org.powermock.core.classloader.annotations.PrepareForTest;
|
||||||
|
import org.powermock.modules.junit4.PowerMockRunner;
|
||||||
import test.java.utils.*;
|
import test.java.utils.*;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* @author Rsl1122
|
* @author Rsl1122
|
||||||
*/
|
*/
|
||||||
|
@RunWith(PowerMockRunner.class)
|
||||||
|
@PrepareForTest(JavaPlugin.class)
|
||||||
public class FormatUtilsTest {
|
public class FormatUtilsTest {
|
||||||
|
|
||||||
|
@Before
|
||||||
|
public void setUp() {
|
||||||
|
TestInit t = new TestInit();
|
||||||
|
assertTrue(t.setUp());
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -22,6 +22,7 @@ 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 test.java.utils.TestInit;
|
||||||
|
import static org.junit.Assert.assertTrue;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
|
|
|
@ -11,6 +11,7 @@ import java.nio.file.Files;
|
||||||
import java.util.logging.Logger;
|
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.Settings;
|
import main.java.com.djrapitops.plan.Settings;
|
||||||
|
import main.java.com.djrapitops.plan.utilities.Benchmark;
|
||||||
import org.bukkit.Server;
|
import org.bukkit.Server;
|
||||||
import org.bukkit.configuration.file.YamlConfiguration;
|
import org.bukkit.configuration.file.YamlConfiguration;
|
||||||
import org.powermock.api.mockito.PowerMockito;
|
import org.powermock.api.mockito.PowerMockito;
|
||||||
|
|
Loading…
Reference in New Issue