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