[3.3.0] Optimizations & Customization settings

Fix #101
Add #104 #99 #103 #100
This commit is contained in:
Rsl1122 2017-05-30 15:36:16 +03:00
parent 1cfb86c293
commit c5d35b4445
43 changed files with 767 additions and 155 deletions

4
.gitignore vendored
View File

@ -8,4 +8,6 @@
/PlanDebugger/
/ProjectHelper/nbproject/private/
/ProjectHelper/nbproject/
/ProjectHelper/target/
/ProjectHelper/target/
/Filetool/nbproject/private/
/Filetool/build/

View File

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

View File

@ -385,7 +385,7 @@ public class Plan extends JavaPlugin {
}
return INSTANCE;
}
/**
* Used to set the current instance of Plan.
*

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -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()">&#9776; </span>Plan | Server Analysis</h1>
<h1><span id="navbutton" onclick="openNav()">&#9776; </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)";

View File

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

View File

@ -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()">&#9776; </span>Plan | Inspect Player %name%%op%</h1>
<h1><span id="navbutton" onclick="openNav()">&#9776; </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)";

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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