Merge branch '4.0.0-BungeeCord-Support' of https://github.com/Rsl1122/Plan-PlayerAnalytics

# Conflicts:
#	Plan/src/main/java/com/djrapitops/plan/Plan.java
#	Plan/src/main/java/com/djrapitops/plan/data/listeners/PlanDeathEventListener.java
This commit is contained in:
Fuzzlemann 2017-08-22 16:37:06 +02:00
commit 2f8e881519
76 changed files with 1225 additions and 1221 deletions

View File

@ -14,10 +14,26 @@
<directory>${basedir}/src/main/resources</directory> <directory>${basedir}/src/main/resources</directory>
<includes> <includes>
<include>*.keystore</include> <include>*.keystore</include>
<include>*.js</include> <include>*.css</include>
<include>*.yml</include> <include>*.yml</include>
<include>*.html</include> <include>*.html</include>
<include>*.txt</include> </includes>
<excludes>
<exclude>licence.yml</exclude>
</excludes>
</resource>
<resource>
<targetPath>.</targetPath>
<directory>${basedir}/src/main/resources/html</directory>
<includes>
<include>*.html</include>
</includes>
</resource>
<resource>
<targetPath>.</targetPath>
<directory>${basedir}/src/main/resources/js</directory>
<includes>
<include>*.js</include>
</includes> </includes>
</resource> </resource>
</resources> </resources>

View File

@ -53,6 +53,7 @@ import org.bukkit.ChatColor;
import java.util.HashSet; import java.util.HashSet;
import java.util.Set; import java.util.Set;
import java.util.UUID;
import java.util.concurrent.Executors; import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.ScheduledExecutorService;
@ -70,7 +71,7 @@ public class Plan extends BukkitPlugin<Plan> {
private API api; private API api;
private ProcessingQueue processingQueue; private ProcessingQueue processingQueue;
private DataCache handler; private DataCache dataCache;
private InspectCacheHandler inspectCache; private InspectCacheHandler inspectCache;
private AnalysisCacheHandler analysisCache; private AnalysisCacheHandler analysisCache;
private HookHandler hookHandler; // Manages 3rd party data sources private HookHandler hookHandler; // Manages 3rd party data sources
@ -83,6 +84,7 @@ public class Plan extends BukkitPlugin<Plan> {
private ServerInfoManager serverInfoManager; private ServerInfoManager serverInfoManager;
private ServerVariableHolder serverVariableHolder; private ServerVariableHolder serverVariableHolder;
private TPSCountTimer tpsCountTimer;
private int bootAnalysisTaskID = -1; private int bootAnalysisTaskID = -1;
/** /**
@ -157,12 +159,13 @@ public class Plan extends BukkitPlugin<Plan> {
Benchmark.stop("Enable", "Init Database"); Benchmark.stop("Enable", "Init Database");
Benchmark.start("Init DataCache"); Benchmark.start("Init DataCache");
this.handler = new DataCache(this); this.dataCache = new DataCache(this);
this.inspectCache = new InspectCacheHandler(this); this.inspectCache = new InspectCacheHandler(this);
this.analysisCache = new AnalysisCacheHandler(this); this.analysisCache = new AnalysisCacheHandler(this);
Benchmark.stop("Enable", "Init DataCache"); Benchmark.stop("Enable", "Init DataCache");
super.getRunnableFactory().createNew(new TPSCountTimer(this)).runTaskTimer(1000, TimeAmount.SECOND.ticks()); tpsCountTimer = new TPSCountTimer(this);
super.getRunnableFactory().createNew(tpsCountTimer).runTaskTimer(1000, TimeAmount.SECOND.ticks());
registerListeners(); registerListeners();
this.api = new API(this); this.api = new API(this);
@ -190,9 +193,10 @@ public class Plan extends BukkitPlugin<Plan> {
Log.error("WebServer was not successfully initialized."); Log.error("WebServer was not successfully initialized.");
} }
Benchmark.start("ServerInfo Registration"); //TODO Re-Enable after DB ServerTable has been initialized properly.
serverInfoManager = new ServerInfoManager(this); // Benchmark.start("ServerInfo Registration");
Benchmark.stop("Enable", "ServerInfo Registration"); // serverInfoManager = new ServerInfoManager(this);
// Benchmark.stop("Enable", "ServerInfo Registration");
setupFilter(); // TODO Move to RegisterCommand Constructor setupFilter(); // TODO Move to RegisterCommand Constructor
@ -258,14 +262,14 @@ public class Plan extends BukkitPlugin<Plan> {
getServer().getScheduler().cancelTasks(this); getServer().getScheduler().cancelTasks(this);
if (Verify.notNull(handler, db)) { if (Verify.notNull(dataCache, db)) {
Benchmark.start("Disable: DataCache Save"); Benchmark.start("Disable: DataCache Save");
// Saves the DataCache to the database without Bukkit's Schedulers. // Saves the DataCache to the database without Bukkit's Schedulers.
Log.info(Locale.get(Msg.DISABLE_CACHE_SAVE).toString()); Log.info(Locale.get(Msg.DISABLE_CACHE_SAVE).toString());
ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor(); ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor();
scheduler.execute(() -> { scheduler.execute(() -> {
handler.saveCacheOnDisable(); dataCache.saveCacheOnDisable();
taskStatus().cancelAllKnownTasks(); taskStatus().cancelAllKnownTasks();
Benchmark.stop("Disable: DataCache Save"); Benchmark.stop("Disable: DataCache Save");
}); });
@ -396,8 +400,8 @@ public class Plan extends BukkitPlugin<Plan> {
* *
* @return Current instance of the DataCache * @return Current instance of the DataCache
*/ */
public DataCache getHandler() { public DataCache getDataCache() {
return handler; return dataCache;
} }
/** /**
@ -472,7 +476,17 @@ public class Plan extends BukkitPlugin<Plan> {
return processingQueue; return processingQueue;
} }
public void addToProcessQueue(Processor processor) { public TPSCountTimer getTpsCountTimer() {
processingQueue.addToQueue(processor); return tpsCountTimer;
}
public void addToProcessQueue(Processor... processors) {
for (Processor processor : processors) {
processingQueue.addToQueue(processor);
}
}
public static UUID getServerUUID() {
return getInstance().serverInfoManager.getServerUUID();
} }
} }

View File

@ -9,7 +9,6 @@ import main.java.com.djrapitops.plan.data.UserData;
import main.java.com.djrapitops.plan.data.additional.AnalysisType; import main.java.com.djrapitops.plan.data.additional.AnalysisType;
import main.java.com.djrapitops.plan.data.additional.PluginData; import main.java.com.djrapitops.plan.data.additional.PluginData;
import main.java.com.djrapitops.plan.data.cache.DBCallableProcessor; import main.java.com.djrapitops.plan.data.cache.DBCallableProcessor;
import main.java.com.djrapitops.plan.data.handling.info.HandlingInfo;
import main.java.com.djrapitops.plan.ui.html.DataRequestHandler; import main.java.com.djrapitops.plan.ui.html.DataRequestHandler;
import main.java.com.djrapitops.plan.ui.webserver.WebServer; import main.java.com.djrapitops.plan.ui.webserver.WebServer;
import main.java.com.djrapitops.plan.utilities.HtmlUtils; import main.java.com.djrapitops.plan.utilities.HtmlUtils;
@ -37,7 +36,6 @@ import java.util.stream.Collectors;
* @see PluginData * @see PluginData
* @see AnalysisType * @see AnalysisType
* @see DBCallableProcessor * @see DBCallableProcessor
* @see HandlingInfo
* @since 2.0.0 * @since 2.0.0
*/ */
public class API { public class API {

View File

@ -104,7 +104,7 @@ public class ManageRestoreCommand extends SubCommand {
if (ManageUtils.clearAndCopy(database, backupDB)) { if (ManageUtils.clearAndCopy(database, backupDB)) {
if (database.getConfigName().equals(plugin.getDB().getConfigName())) { if (database.getConfigName().equals(plugin.getDB().getConfigName())) {
plugin.getHandler().getCommandUseFromDb(); plugin.getDataCache().getCommandUseFromDb();
} }
sender.sendMessage(Locale.get(Msg.MANAGE_INFO_COPY_SUCCESS).toString()); sender.sendMessage(Locale.get(Msg.MANAGE_INFO_COPY_SUCCESS).toString());

View File

@ -0,0 +1,60 @@
/*
* Licence is provided in the jar as license.yml also here:
* https://github.com/Rsl1122/Plan-PlayerAnalytics/blob/master/Plan/src/main/resources/license.yml
*/
package main.java.com.djrapitops.plan.data;
import main.java.com.djrapitops.plan.database.tables.Actions;
import main.java.com.djrapitops.plan.ui.html.Html;
import main.java.com.djrapitops.plan.utilities.FormatUtils;
/**
* Class that represents an action made by a player.
*
* @author Rsl1122
*/
public class Action {
private final long date;
private final Actions doneAction;
private final String additionalInfo;
private int serverID;
public Action(long date, Actions doneAction, String additionalInfo) {
this.date = date;
this.doneAction = doneAction;
this.additionalInfo = additionalInfo;
}
public Action(long date, Actions doneAction, String additionalInfo, int serverID) {
this.date = date;
this.doneAction = doneAction;
this.additionalInfo = additionalInfo;
this.serverID = serverID;
}
public long getDate() {
return date;
}
public Actions getDoneAction() {
return doneAction;
}
public String getAdditionalInfo() {
return additionalInfo;
}
/**
* Can only be used on Action classes returned by the ActionsTable.
*
* @return ID of the server the action occurred on.
*/
public int getServerID() {
return serverID;
}
@Override
public String toString() {
return Html.TABLELINE_3.parse(FormatUtils.formatTimeStampYear(date), doneAction.toString(), additionalInfo);
}
}

View File

@ -1,5 +1,7 @@
package main.java.com.djrapitops.plan.data; package main.java.com.djrapitops.plan.data;
import main.java.com.djrapitops.plan.database.tables.Actions;
import java.util.Objects; import java.util.Objects;
import java.util.UUID; import java.util.UUID;
@ -12,23 +14,20 @@ import java.util.UUID;
public class KillData { public class KillData {
private final UUID victim; private final UUID victim;
private int victimUserID; private final long time;
private final long date;
private final String weapon; private final String weapon;
/** /**
* Creates a KillData object with given parameters. * Creates a KillData object with given parameters.
* *
* @param victim UUID of the victim. * @param victim UUID of the victim.
* @param victimID ID of the victim, get from the database. * @param weapon Weapon used.
* @param weapon Weapon used. * @param time Epoch millisecond at which the kill occurred.
* @param date Epoch millisecond at which the kill occurred.
*/ */
public KillData(UUID victim, int victimID, String weapon, long date) { public KillData(UUID victim, String weapon, long time) {
this.victim = victim; this.victim = victim;
this.weapon = weapon; this.weapon = weapon;
victimUserID = victimID; this.time = time;
this.date = date;
} }
/** /**
@ -45,8 +44,8 @@ public class KillData {
* *
* @return long in ms. * @return long in ms.
*/ */
public long getDate() { public long getTime() {
return date; return time;
} }
/** /**
@ -58,18 +57,10 @@ public class KillData {
return weapon; return weapon;
} }
/**
* Get the UserID of the victim, found from the database.
*
* @return For example: 6
*/
public int getVictimUserID() {
return victimUserID;
}
@Override @Override
public String toString() { public String toString() {
return "{victim:" + victim + "|victimUserID:" + victimUserID + "|date:" + date + "|weapon:" + weapon + '}'; return "{victim:" + victim + "|time:" + time + "|weapon:" + weapon + '}';
} }
@Override @Override
@ -84,7 +75,7 @@ public class KillData {
return false; return false;
} }
final KillData other = (KillData) obj; final KillData other = (KillData) obj;
return this.date == other.date return this.time == other.time
&& Objects.equals(this.weapon, other.weapon) && Objects.equals(this.weapon, other.weapon)
&& Objects.equals(this.victim, other.victim); && Objects.equals(this.victim, other.victim);
} }
@ -93,12 +84,12 @@ public class KillData {
public int hashCode() { public int hashCode() {
int hash = 3; int hash = 3;
hash = 89 * hash + Objects.hashCode(this.victim); hash = 89 * hash + Objects.hashCode(this.victim);
hash = 89 * hash + (int) (this.date ^ (this.date >>> 32)); hash = 89 * hash + (int) (this.time ^ (this.time >>> 32));
hash = 89 * hash + Objects.hashCode(this.weapon); hash = 89 * hash + Objects.hashCode(this.weapon);
return hash; return hash;
} }
public void setVictimUserID(int victimUserID) { public Action convertToAction() {
this.victimUserID = victimUserID; return new Action(time, Actions.KILLED, "name with " + weapon); // TODO Name Cache.
} }
} }

View File

@ -6,34 +6,39 @@ import java.util.ArrayList;
import java.util.List; import java.util.List;
/** /**
* This class is used for storing start and end of a play session inside UserData * Object for storing various information about a player's play session.
* object. * <p>
* Includes:
* <ul>
* <li>World & GameMode playtimes</li>
* <li>Player & Mob kills</li>
* <li>Deaths</li>
* </ul>
* <p>
* Following data can be derived from Sessions in the database (Between any time span):
* <ul>
* <li>Playtime</li>
* <li>LoginTimes</li>
* </ul>
* *
* @author Rsl1122 * @author Rsl1122
*/ */
public class SessionData { public class Session {
private final WorldTimes worldTimes; // TODO add World Times to SessionData private Long sessionID;
private WorldTimes worldTimes;
private final long sessionStart; private final long sessionStart;
private long sessionEnd; private long sessionEnd;
private final List<KillData> playerKills; private List<KillData> playerKills;
private int mobKills; private int mobKills;
private int deaths; private int deaths;
@Deprecated // TODO Remove
public SessionData(long sessionStart) {
worldTimes = null;
this.sessionStart = 0;
playerKills = null;
}
/** /**
* Creates a new session with given start and end of -1. * Creates a new session with given start and end of -1.
* *
* @param sessionStart Epoch millisecond the session was started. * @param sessionStart Epoch millisecond the session was started.
*/ */
public SessionData(long sessionStart, String world, String gm) { public Session(long sessionStart, String world, String gm) {
this.worldTimes = new WorldTimes(world, gm); this.worldTimes = new WorldTimes(world, gm);
this.sessionStart = sessionStart; this.sessionStart = sessionStart;
this.sessionEnd = -1; this.sessionEnd = -1;
@ -48,7 +53,8 @@ public class SessionData {
* @param sessionStart Epoch millisecond the session was started. * @param sessionStart Epoch millisecond the session was started.
* @param sessionEnd Epoch millisecond the session ended. * @param sessionEnd Epoch millisecond the session ended.
*/ */
public SessionData(long sessionStart, long sessionEnd, WorldTimes worldTimes, List<KillData> playerKills, int mobKills, int deaths) { public Session(long id, long sessionStart, long sessionEnd, int mobKills, int deaths) {
this.sessionID = id;
this.sessionStart = sessionStart; this.sessionStart = sessionStart;
this.sessionEnd = sessionEnd; this.sessionEnd = sessionEnd;
this.worldTimes = worldTimes; this.worldTimes = worldTimes;
@ -69,6 +75,29 @@ public class SessionData {
worldTimes.updateState(endOfSession); worldTimes.updateState(endOfSession);
} }
/**
* Updates WorldTimes state.
*
* @param world World Name the player has moved to
* @param gm GameMode the player is in.
* @param time Epoch ms of the event.
*/
public void changeState(String world, String gm, long time) {
worldTimes.updateState(world, gm, time);
}
public void playerKilled(KillData kill) {
playerKills.add(kill);
}
public void mobKilled() {
mobKills++;
}
public void died() {
deaths++;
}
/** /**
* Get the length of the session in milliseconds. * Get the length of the session in milliseconds.
* *
@ -96,14 +125,20 @@ public class SessionData {
return sessionEnd; return sessionEnd;
} }
/** public WorldTimes getWorldTimes() {
* Check if the session start was before the end. return worldTimes;
* }
* @return Is the length positive?
*/ public List<KillData> getPlayerKills() {
@Deprecated // TODO Remove return playerKills;
public boolean isValid() { }
return sessionStart <= sessionEnd;
public int getMobKills() {
return mobKills;
}
public int getDeaths() {
return deaths;
} }
@Override @Override
@ -117,7 +152,7 @@ public class SessionData {
if (getClass() != obj.getClass()) { if (getClass() != obj.getClass()) {
return false; return false;
} }
final SessionData other = (SessionData) obj; final Session other = (Session) obj;
return this.sessionStart == other.sessionStart && this.sessionEnd == other.sessionEnd; return this.sessionStart == other.sessionStart && this.sessionEnd == other.sessionEnd;
} }
@ -128,4 +163,38 @@ public class SessionData {
hash = 97 * hash + (int) (this.sessionEnd ^ (this.sessionEnd >>> 32)); hash = 97 * hash + (int) (this.sessionEnd ^ (this.sessionEnd >>> 32));
return hash; return hash;
} }
/**
* Starts a new Session.
*
* @param time Time the session started.
* @param world World the session started in.
* @param gm GameMode the session started in.
* @return a new Session object.
*/
public static Session start(long time, String world, String gm) {
return new Session(time, world, gm);
}
public boolean isFetchedFromDB() {
return sessionID != null;
}
public void setWorldTimes(WorldTimes worldTimes) {
this.worldTimes = worldTimes;
}
public void setPlayerKills(List<KillData> playerKills) {
this.playerKills = playerKills;
}
/**
* Used to get the ID of the session in the Database.
*
* @return ID if present.
* @throws NullPointerException if Session was not fetched from DB. Check using {@code isFetchedFromDB}
*/
public long getSessionID() {
return sessionID;
}
} }

View File

@ -11,7 +11,7 @@ import java.util.*;
// TODO Change to be only used for DB User Get Query responses. // TODO Change to be only used for DB User Get Query responses.
public class UserData { public class UserData {
private final List<SessionData> sessions; private final List<Session> sessions;
private int accessing; private int accessing;
private boolean clearAfterSave; private boolean clearAfterSave;
private UUID uuid; private UUID uuid;
@ -31,8 +31,6 @@ public class UserData {
@Deprecated @Deprecated
private boolean isBanned; //TODO DB Update code to JoinListener private boolean isBanned; //TODO DB Update code to JoinListener
@Deprecated @Deprecated
private boolean isOnline; //TODO New Class for getting online status of players
@Deprecated
private long registered; //TODO DB Update code to JoinListener (When registering) private long registered; //TODO DB Update code to JoinListener (When registering)
@Deprecated @Deprecated
private long lastPlayed; //TODO DB Update code to Join, Refresh, QuitListener private long lastPlayed; //TODO DB Update code to Join, Refresh, QuitListener
@ -173,9 +171,9 @@ public class UserData {
/** /**
* Get the sessions of a player. * Get the sessions of a player.
* *
* @return a list of SessionData. * @return a list of Session.
*/ */
public List<SessionData> getSessions() { public List<Session> getSessions() {
return sessions; return sessions;
} }

View File

@ -2,7 +2,7 @@ package main.java.com.djrapitops.plan.data.analysis;
import com.djrapitops.plugin.api.TimeAmount; import com.djrapitops.plugin.api.TimeAmount;
import com.djrapitops.plugin.utilities.Verify; import com.djrapitops.plugin.utilities.Verify;
import main.java.com.djrapitops.plan.data.SessionData; import main.java.com.djrapitops.plan.data.Session;
import main.java.com.djrapitops.plan.data.TPS; import main.java.com.djrapitops.plan.data.TPS;
import main.java.com.djrapitops.plan.ui.html.graphs.PlayerActivityGraphCreator; import main.java.com.djrapitops.plan.ui.html.graphs.PlayerActivityGraphCreator;
import main.java.com.djrapitops.plan.ui.html.graphs.PunchCardGraphCreator; import main.java.com.djrapitops.plan.ui.html.graphs.PunchCardGraphCreator;
@ -72,13 +72,13 @@ public class ActivityPart extends RawData {
playerActivityGraphs(); playerActivityGraphs();
final List<SessionData> sessions = joins.getAllSessions(); final List<Session> sessions = joins.getAllSessions();
List<Long> lengths = AnalysisUtils.transformSessionDataToLengths(sessions); List<Long> lengths = AnalysisUtils.transformSessionDataToLengths(sessions);
long averageLength = MathUtils.averageLong(lengths); long averageLength = MathUtils.averageLong(lengths);
addValue("sessionAverage", FormatUtils.formatTimeAmount(averageLength)); addValue("sessionAverage", FormatUtils.formatTimeAmount(averageLength));
List<SessionData> sessionsMonth = sessions.stream() List<Session> sessionsMonth = sessions.stream()
.filter(s -> s.getSessionStart() > MiscUtils.getTime() - TimeAmount.MONTH.ms()) .filter(s -> s.getSessionStart() > MiscUtils.getTime() - TimeAmount.MONTH.ms())
.collect(Collectors.toList()); .collect(Collectors.toList());
addValue("punchCardSeries", PunchCardGraphCreator.createDataSeries(sessionsMonth)); addValue("punchCardSeries", PunchCardGraphCreator.createDataSeries(sessionsMonth));

View File

@ -2,7 +2,7 @@ package main.java.com.djrapitops.plan.data.analysis;
import com.djrapitops.plugin.api.TimeAmount; import com.djrapitops.plugin.api.TimeAmount;
import com.djrapitops.plugin.utilities.Verify; import com.djrapitops.plugin.utilities.Verify;
import main.java.com.djrapitops.plan.data.SessionData; import main.java.com.djrapitops.plan.data.Session;
import main.java.com.djrapitops.plan.utilities.MiscUtils; import main.java.com.djrapitops.plan.utilities.MiscUtils;
import main.java.com.djrapitops.plan.utilities.analysis.AnalysisUtils; import main.java.com.djrapitops.plan.utilities.analysis.AnalysisUtils;
@ -10,7 +10,7 @@ import java.util.*;
import java.util.stream.Collectors; import java.util.stream.Collectors;
/** /**
* Part responsible for all Player login related analysis. * Part responsible for all Player player related analysis.
* <p> * <p>
* Placeholder values can be retrieved using the get method. * Placeholder values can be retrieved using the get method.
* <p> * <p>
@ -36,7 +36,7 @@ import java.util.stream.Collectors;
*/ */
public class JoinInfoPart extends RawData { public class JoinInfoPart extends RawData {
private final Map<UUID, List<SessionData>> sessions; private final Map<UUID, List<Session>> sessions;
private final List<Long> registered; private final List<Long> registered;
private long loginTimes; private long loginTimes;
@ -108,11 +108,11 @@ public class JoinInfoPart extends RawData {
return loginTimes; return loginTimes;
} }
public Map<UUID, List<SessionData>> getSessions() { public Map<UUID, List<Session>> getSessions() {
return sessions; return sessions;
} }
public List<SessionData> getAllSessions() { public List<Session> getAllSessions() {
return MiscUtils.flatMap(sessions.values()); return MiscUtils.flatMap(sessions.values());
} }
@ -124,7 +124,7 @@ public class JoinInfoPart extends RawData {
return registered; return registered;
} }
public void addSessions(UUID uuid, List<SessionData> sessions) { public void addSessions(UUID uuid, List<Session> sessions) {
Verify.nullCheck(uuid); Verify.nullCheck(uuid);
Verify.nullCheck(sessions); Verify.nullCheck(sessions);
this.sessions.put(uuid, sessions.stream().distinct().collect(Collectors.toList())); this.sessions.put(uuid, sessions.stream().distinct().collect(Collectors.toList()));

View File

@ -91,7 +91,7 @@ public class DataCache extends SessionCache {
* @throws IllegalStateException BukkitScheduler is in a wrong state. * @throws IllegalStateException BukkitScheduler is in a wrong state.
*/ */
public void startAsyncPeriodicSaveTask() { public void startAsyncPeriodicSaveTask() {
DataCache handler = this; DataCache dataCache = this;
plugin.getRunnableFactory().createNew(new AbsRunnable("PeriodicCacheSaveTask") { plugin.getRunnableFactory().createNew(new AbsRunnable("PeriodicCacheSaveTask") {
private int timesSaved = 0; private int timesSaved = 0;
@ -134,7 +134,6 @@ public class DataCache extends SessionCache {
endSession(uuid); endSession(uuid);
String worldName = ((Player) p.getWrappedPlayerClass()).getWorld().getName(); String worldName = ((Player) p.getWrappedPlayerClass()).getWorld().getName();
} }
// toProcess.sort(new HandlingInfoTimeComparator());
Benchmark.stop("Cache: ProcessOnlineHandlingInfo"); Benchmark.stop("Cache: ProcessOnlineHandlingInfo");
try { try {
db.saveCommandUse(commandUse); db.saveCommandUse(commandUse);

View File

@ -69,7 +69,7 @@ public class GeolocationCacheHandler {
* @see <a href="http://freegeoip.net">http://freegeoip.net</a> * @see <a href="http://freegeoip.net">http://freegeoip.net</a>
* @see #getCountry(String) * @see #getCountry(String)
*/ */
public static String getUncachedCountry(String ipAddress) { private static String getUncachedCountry(String ipAddress) {
URL url; URL url;
String urlString = "http://freegeoip.net/csv/" + ipAddress; String urlString = "http://freegeoip.net/csv/" + ipAddress;
@ -101,7 +101,7 @@ public class GeolocationCacheHandler {
* @param ipAddress The IP Address which is retrieved out of the cache * @param ipAddress The IP Address which is retrieved out of the cache
* @return The cached country, {@code null} if the country is not cached * @return The cached country, {@code null} if the country is not cached
*/ */
public static String getCachedCountry(String ipAddress) { private static String getCachedCountry(String ipAddress) {
return geolocationCache.getIfPresent(ipAddress); return geolocationCache.getIfPresent(ipAddress);
} }
@ -114,4 +114,8 @@ public class GeolocationCacheHandler {
public static boolean isCached(String ipAddress) { public static boolean isCached(String ipAddress) {
return geolocationCache.asMap().containsKey(ipAddress); return geolocationCache.asMap().containsKey(ipAddress);
} }
public static void clearCache() {
geolocationCache.invalidateAll();
}
} }

View File

@ -23,7 +23,7 @@ import java.util.*;
@Deprecated @Deprecated
public class InspectCacheHandler { public class InspectCacheHandler {
private final DataCache handler; private final DataCache dataCache;
private final Map<UUID, UserData> cache; private final Map<UUID, UserData> cache;
private final Map<UUID, Long> cacheTimes; private final Map<UUID, Long> cacheTimes;
@ -33,7 +33,7 @@ public class InspectCacheHandler {
* @param plugin Current instance of Plan.class * @param plugin Current instance of Plan.class
*/ */
public InspectCacheHandler(Plan plugin) { public InspectCacheHandler(Plan plugin) {
this.handler = plugin.getHandler(); this.dataCache = plugin.getDataCache();
this.cache = new HashMap<>(); this.cache = new HashMap<>();
cacheTimes = new HashMap<>(); cacheTimes = new HashMap<>();
} }

View File

@ -1,9 +1,10 @@
package main.java.com.djrapitops.plan.data.cache; package main.java.com.djrapitops.plan.data.cache;
import main.java.com.djrapitops.plan.data.SessionData; import main.java.com.djrapitops.plan.data.Session;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
import java.util.Optional;
import java.util.UUID; import java.util.UUID;
/** /**
@ -14,7 +15,7 @@ import java.util.UUID;
*/ */
public class SessionCache { public class SessionCache {
private static final Map<UUID, SessionData> activeSessions = new HashMap<>(); private static final Map<UUID, Session> activeSessions = new HashMap<>();
/** /**
* Class Constructor. * Class Constructor.
@ -22,17 +23,17 @@ public class SessionCache {
public SessionCache() { public SessionCache() {
} }
public void cacheSession(UUID uuid, SessionData session) { public void cacheSession(UUID uuid, Session session) {
activeSessions.put(uuid, session); activeSessions.put(uuid, session);
} }
public void endSession(UUID uuid, long time) { public void endSession(UUID uuid, long time) {
SessionData session = activeSessions.get(uuid); Session session = activeSessions.get(uuid);
if (session == null) { if (session == null) {
return; return;
} }
session.endSession(time); session.endSession(time);
// TODO DB Save the session.
} }
/** /**
@ -54,14 +55,17 @@ public class SessionCache {
} }
/** /**
* Used to get the SessionData of the player in the sessionCache. * Used to get the Session of the player in the sessionCache.
* *
* @param uuid UUID of the player. * @param uuid UUID of the player.
* @return SessionData or null if not cached. * @return Session or null if not cached.
*/ */
@Deprecated public Optional<Session> getCachedSession(UUID uuid) {
public SessionData getSession(UUID uuid) { Session session = activeSessions.get(uuid);
return activeSessions.get(uuid); if (session != null) {
return Optional.of(session);
}
return Optional.empty();
} }
/** /**
@ -69,10 +73,10 @@ public class SessionCache {
* <p> * <p>
* Used for testing. * Used for testing.
* *
* @return key:value UUID:SessionData * @return key:value UUID:Session
*/ */
@Deprecated @Deprecated
public Map<UUID, SessionData> getActiveSessions() { public Map<UUID, Session> getActiveSessions() {
return activeSessions; return activeSessions;
} }
} }

View File

@ -0,0 +1,32 @@
/*
* Licence is provided in the jar as license.yml also here:
* https://github.com/Rsl1122/Plan-PlayerAnalytics/blob/master/Plan/src/main/resources/license.yml
*/
package main.java.com.djrapitops.plan.data.handling;
import main.java.com.djrapitops.plan.Log;
import main.java.com.djrapitops.plan.database.Database;
import main.java.com.djrapitops.plan.queue.processing.Processor;
import java.sql.SQLException;
/**
* Processor for queueing a Database Commit after changes.
*
* @author Rsl1122
*/
public class DBCommitProcessor extends Processor<Database> {
public DBCommitProcessor(Database object) {
super(object);
}
@Override
public void process() {
// TODO Prevent Commit during batch operations.
try {
object.commit();
} catch (SQLException e) {
Log.toLog(this.getClass().getName(), e);
}
}
}

View File

@ -3,8 +3,6 @@ package main.java.com.djrapitops.plan.data.handling;
import main.java.com.djrapitops.plan.Log; import main.java.com.djrapitops.plan.Log;
import main.java.com.djrapitops.plan.Plan; import main.java.com.djrapitops.plan.Plan;
import main.java.com.djrapitops.plan.data.UserData; import main.java.com.djrapitops.plan.data.UserData;
import org.apache.commons.lang3.text.WordUtils;
import org.bukkit.Material;
import org.bukkit.entity.LivingEntity; import org.bukkit.entity.LivingEntity;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
@ -56,13 +54,4 @@ public class KillHandling {
} }
} }
/**
* Normalizes a material name
*
* @param material The material
* @return The normalized material name
*/
public static String normalizeMaterialName(Material material) {
return WordUtils.capitalizeFully(material.name(), '_').replace('_', ' ');
}
} }

View File

@ -1,33 +0,0 @@
package main.java.com.djrapitops.plan.data.handling.info;
import main.java.com.djrapitops.plan.data.UserData;
import java.util.UUID;
/**
* HandlingInfo Class for ChatEvent information.
*
* @author Rsl1122
* @since 3.0.0
*/
@Deprecated // TODO Update Straight to db
public class ChatInfo extends HandlingInfo {
private final String nickname;
/**
* Constructor.
*
* @param uuid UUID of the player.
* @param nickname Nickname of the player.
*/
public ChatInfo(UUID uuid, String nickname) {
super(uuid, InfoType.CHAT, 0L);
this.nickname = nickname;
}
@Override
public void process(UserData uData) {
}
}

View File

@ -1,31 +0,0 @@
package main.java.com.djrapitops.plan.data.handling.info;
import main.java.com.djrapitops.plan.data.UserData;
import java.util.UUID;
/**
* HandlingInfo Class for DeathEvent information.
*
* @author Rsl1122
* @since 3.0.0
*/
public class DeathInfo extends HandlingInfo {
/**
* Constructor.
*
* @param uuid UUID of the dead player.
*/
public DeathInfo(UUID uuid) {
super(uuid, InfoType.DEATH, 0L);
}
@Override
public void process(UserData uData) {
if (!uData.getUuid().equals(uuid)) {
return;
}
//TODO uData.setDeaths(uData.getDeaths() + 1);
}
}

View File

@ -1,77 +0,0 @@
package main.java.com.djrapitops.plan.data.handling.info;
import main.java.com.djrapitops.plan.data.UserData;
import main.java.com.djrapitops.plan.data.cache.DBCallableProcessor;
import main.java.com.djrapitops.plan.queue.processing.Processor;
import java.util.UUID;
/**
* An abstract class for processing information about events and modifying
* UserData objects associated with the events.
*
* @author Rsl1122
* @since 3.0.0
*/
// TODO Rewrite all HandlingInfo objects to only extend Processor
public abstract class HandlingInfo extends Processor<UUID> implements DBCallableProcessor {
final UUID uuid;
final InfoType type;
final long time;
/**
* Super Constructor.
*
* @param uuid UUID of the player
* @param type InfoType enum of the event. Only used for debugging different
* types.
* @param time Epoch ms of the event.
*/
public HandlingInfo(UUID uuid, InfoType type, long time) {
super(uuid);
this.uuid = object;
this.type = type;
this.time = time;
}
/**
* Get the UUID.
*
* @return UUID of the player associated with the event.
*/
public UUID getUuid() {
return uuid;
}
/**
* Get the InfoType.
*
* @return InfoType enum.
*/
public InfoType getType() {
return type;
}
/**
* Get the epoch ms the event occurred.
*
* @return long in ms.
*/
public long getTime() {
return time;
}
public void process() {
}
/**
* Process the info and modify the UserData object accordingly.
* <p>
* If the UUIDs don't match no change should occur.
*
* @param uData UserData object to modify.
* @return UUID of the UserData object and HandlingInfo match.
*/
public abstract void process(UserData uData);
}

View File

@ -1,54 +0,0 @@
package main.java.com.djrapitops.plan.data.handling.info;
/**
* Enum class for the types of HandlingInfo to be processed.
* <p>
* Type is only used for debugging.
* <p>
* OTHER should be used when
*
* @author Rsl1122
* @since 3.0.0
*/
public enum InfoType {
/**
*
*/
CHAT,
/**
*
*/
DEATH,
/**
*
*/
KILL,
/**
*
*/
GM,
/**
*
*/
LOGIN,
/**
*
*/
LOGOUT,
/**
*
*/
KICK,
/**
*
*/
RELOAD,
/**
* Used for events registered with the API.
*
* @since 3.1.1
*/
WORLD,
OTHER
}

View File

@ -1,29 +0,0 @@
package main.java.com.djrapitops.plan.data.handling.info;
import main.java.com.djrapitops.plan.data.UserData;
import java.util.UUID;
/**
* HandlingInfo Class for KickEvent information.
*
* @author Rsl1122
* @since 3.0.0
*/
@Deprecated //TODO Update Straight to db
public class KickInfo extends HandlingInfo {
/**
* Constructor.
*
* @param uuid UUID of the kicked player.
*/
public KickInfo(UUID uuid) {
super(uuid, InfoType.KICK, 0L);
}
@Override
public void process(UserData uData) {
}
}

View File

@ -1,42 +0,0 @@
package main.java.com.djrapitops.plan.data.handling.info;
import main.java.com.djrapitops.plan.data.UserData;
import main.java.com.djrapitops.plan.data.handling.KillHandling;
import org.bukkit.entity.LivingEntity;
import java.util.UUID;
/**
* HandlingInfo Class for DeathEvent information when the dead entity is a
* player.
*
* @author Rsl1122
* @since 3.0.0
*/
public class KillInfo extends HandlingInfo {
private final LivingEntity dead;
private final String weaponName;
/**
* Constructor.
*
* @param uuid UUID of the killer.
* @param time Epoch ms the event occurred.
* @param dead Dead entity (Mob or Player)
* @param weaponName Weapon used.
*/
public KillInfo(UUID uuid, long time, LivingEntity dead, String weaponName) {
super(uuid, InfoType.KILL, time);
this.dead = dead;
this.weaponName = weaponName;
}
@Override
public void process(UserData uData) {
if (!uData.getUuid().equals(uuid)) {
return;
}
KillHandling.processKillInfo(uData, time, dead, weaponName);
}
}

View File

@ -1,67 +0,0 @@
package main.java.com.djrapitops.plan.data.handling.info;
import main.java.com.djrapitops.plan.data.UserData;
import java.net.InetAddress;
import java.util.UUID;
/**
* HandlingInfo Class for JoinEvent information.
*
* @author Rsl1122
* @since 3.0.0
*/
@Deprecated // TODO Update in listener to db
public class LoginInfo extends HandlingInfo {
private final InetAddress ip;
private final boolean banned;
private final String nickname;
private final PlaytimeDependentInfo playtimeDependentInfo;
private final int loginTimes;
/**
* Constructor.
*
* @param uuid UUID of the player.
* @param time Epoch ms of the event.
* @param ip IP of the player
* @param banned Is the player banned?
* @param nickname Nickname of the player
* @param gm current gamemode of the player
* @param loginTimes number the loginTimes should be incremented with.
*/
public LoginInfo(UUID uuid, long time, InetAddress ip, boolean banned, String nickname, String gm, int loginTimes, String worldName) {
super(uuid, InfoType.LOGIN, time);
this.ip = ip;
this.banned = banned;
this.nickname = nickname;
this.playtimeDependentInfo = new PlaytimeDependentInfo(uuid, InfoType.OTHER, time, gm, worldName);
this.loginTimes = loginTimes;
}
/**
* Constructor for not incrementing the loginTimes.
* <p>
* This constructor is used only by ReloadInfo
*
* @param uuid UUID of the player.
* @param time Epoch ms of the event.
* @param ip IP of the player
* @param banned Is the player banned?
* @param nickname Nickname of the player
* @param gm current gamemode of the player
*/
public LoginInfo(UUID uuid, long time, InetAddress ip, boolean banned, String nickname, String gm, String worldName) {
super(uuid, InfoType.RELOAD, time);
this.ip = ip;
this.banned = banned;
this.nickname = nickname;
this.playtimeDependentInfo = new PlaytimeDependentInfo(uuid, InfoType.OTHER, time, gm, worldName);
this.loginTimes = 0;
}
@Override
public void process(UserData uData) {
}
}

View File

@ -1,37 +0,0 @@
package main.java.com.djrapitops.plan.data.handling.info;
import main.java.com.djrapitops.plan.data.UserData;
import java.util.UUID;
/**
* HandlingInfo Class for QuitEvent information.
*
* @author Rsl1122
* @since 3.0.0
*/
@Deprecated //TODO Update straight to db
public class LogoutInfo extends HandlingInfo {
private final boolean banned;
private final PlaytimeDependentInfo playtimeDependentInfo;
/**
* Constructor.
*
* @param uuid UUID of the player.
* @param time Epoch ms of the event.
* @param banned Is the player banned
* @param gm current gamemode of the player
*/
public LogoutInfo(UUID uuid, long time, boolean banned, String gm, String worldName) {
super(uuid, InfoType.LOGOUT, time);
this.banned = banned;
this.playtimeDependentInfo = new PlaytimeDependentInfo(uuid, InfoType.OTHER, time, gm, worldName);
}
@Override
public void process(UserData uData) {
}
}

View File

@ -1,25 +0,0 @@
package main.java.com.djrapitops.plan.data.handling.info;
import main.java.com.djrapitops.plan.data.UserData;
import java.util.UUID;
@Deprecated //Sessions will take care of the stuff in the future.
public class PlaytimeDependentInfo extends HandlingInfo {
private final String gamemode;
private final String worldName;
public PlaytimeDependentInfo(UUID uuid, InfoType type, long time, String gm, String worldName) {
super(uuid, type, time);
this.worldName = worldName;
this.gamemode = gm;
}
@Override
public void process(UserData uData) {
if (!uuid.equals(uData.getUuid())) {
return;
}
}
}

View File

@ -1,27 +0,0 @@
package main.java.com.djrapitops.plan.data.handling.info;
import java.net.InetAddress;
import java.util.UUID;
/**
* HandlingInfo Class for refreshing data in the cache for online players.
*
* @author Rsl1122
* @since 3.0.0
*/
public class ReloadInfo extends LoginInfo {
/**
* Constructor.
*
* @param uuid UUID of the player.
* @param time Epoch ms of the event.
* @param ip IP of the player
* @param banned Is the player banned?
* @param nickname Nickname of the player
* @param gm current gamemode of the player
*/
public ReloadInfo(UUID uuid, long time, InetAddress ip, boolean banned, String nickname, String gm, String worldName) {
super(uuid, time, ip, banned, nickname, gm, worldName);
}
}

View File

@ -0,0 +1,28 @@
/*
* Licence is provided in the jar as license.yml also here:
* https://github.com/Rsl1122/Plan-PlayerAnalytics/blob/master/Plan/src/main/resources/license.yml
*/
package main.java.com.djrapitops.plan.data.handling.player;
import java.util.UUID;
/**
* //TODO Class Javadoc Comment
*
* @author Rsl1122
*/
public class BanProcessor extends PlayerProcessor {
private final boolean banned;
public BanProcessor(UUID uuid, boolean banned) {
super(uuid);
this.banned = banned;
}
@Override
public void process() {
UUID uuid = getUUID();
// TODO DB Update Ban status
}
}

View File

@ -0,0 +1,27 @@
package main.java.com.djrapitops.plan.data.handling.player;
import java.util.UUID;
/**
* // TODO Write Javadoc Class Description
*
* @author Rsl1122
* @since 4.0.0
*/
public class DeathProcessor extends PlayerProcessor {
/**
* Constructor.
*
* @param uuid UUID of the dead player.
*/
public DeathProcessor(UUID uuid) {
super(uuid);
}
@Override
public void process() {
UUID uuid = getUUID();
// TODO DB Update Deaths +1
}
}

View File

@ -0,0 +1,30 @@
/*
* Licence is provided in the jar as license.yml also here:
* https://github.com/Rsl1122/Plan-PlayerAnalytics/blob/master/Plan/src/main/resources/license.yml
*/
package main.java.com.djrapitops.plan.data.handling.player;
import main.java.com.djrapitops.plan.Plan;
import java.util.UUID;
/**
* //TODO Class Javadoc Comment
*
* @author Rsl1122
*/
public class EndSessionProcessor extends PlayerProcessor {
private final long time;
public EndSessionProcessor(UUID uuid, long time) {
super(uuid);
this.time = time;
}
@Override
public void process() {
UUID uuid = getUUID();
Plan.getInstance().getDataCache().endSession(uuid, time);
}
}

View File

@ -0,0 +1,31 @@
/*
* Licence is provided in the jar as license.yml also here:
* https://github.com/Rsl1122/Plan-PlayerAnalytics/blob/master/Plan/src/main/resources/license.yml
*/
package main.java.com.djrapitops.plan.data.handling.player;
import main.java.com.djrapitops.plan.data.cache.GeolocationCacheHandler;
import java.util.UUID;
/**
* //TODO Class Javadoc Comment
*
* @author Rsl1122
*/
public class IPUpdateProcessor extends PlayerProcessor {
private final String ip;
public IPUpdateProcessor(UUID uuid, String ip) {
super(uuid);
this.ip = ip;
}
@Override
public void process() {
UUID uuid = getUUID();
String country = GeolocationCacheHandler.getCountry(ip);
// TODO DB Update IP & Geolocation
}
}

View File

@ -0,0 +1,24 @@
/*
* Licence is provided in the jar as license.yml also here:
* https://github.com/Rsl1122/Plan-PlayerAnalytics/blob/master/Plan/src/main/resources/license.yml
*/
package main.java.com.djrapitops.plan.data.handling.player;
import java.util.UUID;
/**
* //TODO Class Javadoc Comment
*
* @author Rsl1122
*/
public class KickProcessor extends PlayerProcessor {
public KickProcessor(UUID uuid) {
super(uuid);
}
@Override
public void process() {
UUID uuid = getUUID();
// TODO Update DB Kick +1
}
}

View File

@ -0,0 +1,61 @@
package main.java.com.djrapitops.plan.data.handling.player;
import main.java.com.djrapitops.plan.Plan;
import main.java.com.djrapitops.plan.data.KillData;
import main.java.com.djrapitops.plan.data.Session;
import org.bukkit.entity.LivingEntity;
import org.bukkit.entity.Player;
import java.util.Optional;
import java.util.UUID;
/**
* Processor Class for KillEvent information when the killer is a
* player.
* <p>
* Adds KillData or a Mob kill to the active Session.
*
* @author Rsl1122
* @since 4.0.0
*/
public class KillProcessor extends PlayerProcessor {
private final LivingEntity dead;
private final String weaponName;
private final long time;
/**
* Constructor.
*
* @param uuid UUID of the killer.
* @param time Epoch ms the event occurred.
* @param dead Dead entity (Mob or Player)
* @param weaponName Weapon used.
*/
public KillProcessor(UUID uuid, long time, LivingEntity dead, String weaponName) {
super(uuid);
this.time = time;
this.dead = dead;
this.weaponName = weaponName;
}
@Override
public void process() {
UUID uuid = getUUID();
Plan plugin = Plan.getInstance();
Optional<Session> cachedSession = plugin.getDataCache().getCachedSession(uuid);
if (!cachedSession.isPresent()) {
return;
}
Session session = cachedSession.get();
if (dead instanceof Player) {
Player deadPlayer = (Player) dead;
session.playerKilled(new KillData(deadPlayer.getUniqueId(), weaponName, time));
} else {
session.mobKilled();
}
}
}

View File

@ -0,0 +1,30 @@
/*
* Licence is provided in the jar as license.yml also here:
* https://github.com/Rsl1122/Plan-PlayerAnalytics/blob/master/Plan/src/main/resources/license.yml
*/
package main.java.com.djrapitops.plan.data.handling.player;
import java.util.UUID;
/**
* //TODO Class Javadoc Comment
*
* @author Rsl1122
*/
public class NameProcessor extends PlayerProcessor {
private final String playerName;
private final String displayName;
public NameProcessor(UUID uuid, String playerName, String displayName) {
super(uuid);
this.playerName = playerName;
this.displayName = displayName;
}
@Override
public void process() {
UUID uuid = getUUID();
// TODO DB Update Name & Nicknames.
}
}

View File

@ -0,0 +1,30 @@
/*
* Licence is provided in the jar as license.yml also here:
* https://github.com/Rsl1122/Plan-PlayerAnalytics/blob/master/Plan/src/main/resources/license.yml
*/
package main.java.com.djrapitops.plan.data.handling.player;
import main.java.com.djrapitops.plan.queue.processing.Processor;
import java.util.UUID;
/**
* Abstract Processor that takes UUID as a parameter.
* <p>
* Created to allow extending processors to use Generics.
*
* @author Rsl1122
*/
public abstract class PlayerProcessor extends Processor<UUID> {
public PlayerProcessor(UUID uuid) {
super(uuid);
}
protected UUID getUUID() {
return object;
}
@Override
public abstract void process();
}

View File

@ -0,0 +1,35 @@
/*
* Licence is provided in the jar as license.yml also here:
* https://github.com/Rsl1122/Plan-PlayerAnalytics/blob/master/Plan/src/main/resources/license.yml
*/
package main.java.com.djrapitops.plan.data.handling.player;
import main.java.com.djrapitops.plan.Plan;
import java.util.UUID;
/**
* //TODO Class Javadoc Comment
*
* @author Rsl1122
*/
public class RegisterProcessor extends PlayerProcessor {
private final long time;
private final int playersOnline;
public RegisterProcessor(UUID uuid, long time, int playersOnline) {
super(uuid);
this.time = time;
this.playersOnline = playersOnline;
}
@Override
public void process() {
UUID uuid = getUUID();
if (Plan.getInstance().getDB().wasSeenBefore(uuid)) {
return;
}
// TODO DB Register
}
}

View File

@ -0,0 +1,35 @@
/*
* Licence is provided in the jar as license.yml also here:
* https://github.com/Rsl1122/Plan-PlayerAnalytics/blob/master/Plan/src/main/resources/license.yml
*/
package main.java.com.djrapitops.plan.data.listeners;
import com.djrapitops.plugin.task.AbsRunnable;
import main.java.com.djrapitops.plan.Plan;
import main.java.com.djrapitops.plan.data.handling.DBCommitProcessor;
import main.java.com.djrapitops.plan.database.Database;
/**
* Periodically commits changes to the SQLite Database.
*
* @author Rsl1122
*/
public class PeriodicDBCommitTask extends AbsRunnable {
private Plan plugin;
public PeriodicDBCommitTask(Plan plugin) {
super("PeriodicDBCommitTask");
this.plugin = plugin;
}
@Override
public void run() {
Database db = plugin.getDB();
if ("mysql".equals(db.getConfigName())) {
this.cancel();
return;
}
plugin.addToProcessQueue(new DBCommitProcessor(db));
}
}

View File

@ -1,7 +1,7 @@
package main.java.com.djrapitops.plan.data.listeners; package main.java.com.djrapitops.plan.data.listeners;
import main.java.com.djrapitops.plan.Plan; import main.java.com.djrapitops.plan.Plan;
import main.java.com.djrapitops.plan.data.handling.info.ChatInfo; import main.java.com.djrapitops.plan.data.handling.player.NameProcessor;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler; import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority; import org.bukkit.event.EventPriority;
@ -38,6 +38,6 @@ public class PlanChatListener implements Listener {
} }
Player p = event.getPlayer(); Player p = event.getPlayer();
plugin.addToProcessQueue(new ChatInfo(p.getUniqueId(), p.getDisplayName())); plugin.addToProcessQueue(new NameProcessor(p.getUniqueId(), p.getName(), p.getDisplayName()));
} }
} }

View File

@ -1,6 +1,5 @@
package main.java.com.djrapitops.plan.data.listeners; package main.java.com.djrapitops.plan.data.listeners;
import main.java.com.djrapitops.plan.Log;
import main.java.com.djrapitops.plan.Permissions; import main.java.com.djrapitops.plan.Permissions;
import main.java.com.djrapitops.plan.Plan; import main.java.com.djrapitops.plan.Plan;
import main.java.com.djrapitops.plan.Settings; import main.java.com.djrapitops.plan.Settings;
@ -20,7 +19,7 @@ import org.bukkit.event.player.PlayerCommandPreprocessEvent;
public class PlanCommandPreprocessListener implements Listener { public class PlanCommandPreprocessListener implements Listener {
private final Plan plugin; private final Plan plugin;
private final DataCache handler; private final DataCache dataCache;
/** /**
* Class Constructor. * Class Constructor.
@ -29,7 +28,7 @@ public class PlanCommandPreprocessListener implements Listener {
*/ */
public PlanCommandPreprocessListener(Plan plugin) { public PlanCommandPreprocessListener(Plan plugin) {
this.plugin = plugin; this.plugin = plugin;
handler = plugin.getHandler(); dataCache = plugin.getDataCache();
} }
/** /**
@ -42,6 +41,10 @@ public class PlanCommandPreprocessListener implements Listener {
if (event.isCancelled()) { if (event.isCancelled()) {
return; return;
} }
Player player = event.getPlayer();
if (player.hasPermission(Permissions.IGNORE_COMMANDUSE.getPermission())) {
return;
}
String commandName = event.getMessage().substring(1).split(" ")[0].toLowerCase(); String commandName = event.getMessage().substring(1).split(" ")[0].toLowerCase();
@ -52,21 +55,13 @@ public class PlanCommandPreprocessListener implements Listener {
Command command = plugin.getServer().getPluginCommand(commandName); Command command = plugin.getServer().getPluginCommand(commandName);
if (command == null) { if (command == null) {
if (doNotLogUnknownCommands) { if (doNotLogUnknownCommands) {
Log.debug("Ignored command, command is unknown");
return; return;
} }
} else if (combineCommandAliasesToMainCommand) { } else if (combineCommandAliasesToMainCommand) {
commandName = command.getName(); commandName = command.getName();
} }
} }
// TODO Command Usage -> DB Save Processor
Player player = event.getPlayer(); dataCache.handleCommand(commandName);
if (player.hasPermission(Permissions.IGNORE_COMMANDUSE.getPermission())) {
Log.debug("Ignored command, player had ignore permission.");
return;
}
handler.handleCommand(commandName);
} }
} }

View File

@ -1,8 +1,7 @@
package main.java.com.djrapitops.plan.data.listeners; package main.java.com.djrapitops.plan.data.listeners;
import main.java.com.djrapitops.plan.Plan; import main.java.com.djrapitops.plan.Plan;
import main.java.com.djrapitops.plan.data.handling.info.InfoType; import main.java.com.djrapitops.plan.data.Session;
import main.java.com.djrapitops.plan.data.handling.info.PlaytimeDependentInfo;
import main.java.com.djrapitops.plan.utilities.MiscUtils; import main.java.com.djrapitops.plan.utilities.MiscUtils;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler; import org.bukkit.event.EventHandler;
@ -10,6 +9,7 @@ import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener; import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerGameModeChangeEvent; import org.bukkit.event.player.PlayerGameModeChangeEvent;
import java.util.Optional;
import java.util.UUID; import java.util.UUID;
/** /**
@ -40,13 +40,16 @@ public class PlanGamemodeChangeListener implements Listener {
if (event.isCancelled()) { if (event.isCancelled()) {
return; return;
} }
Player p = event.getPlayer(); Player p = event.getPlayer();
UUID uuid = p.getUniqueId(); UUID uuid = p.getUniqueId();
long time = MiscUtils.getTime(); long time = MiscUtils.getTime();
String gameMode = event.getNewGameMode().name(); String gameMode = event.getNewGameMode().name();
String worldName = p.getWorld().getName(); String worldName = p.getWorld().getName();
plugin.addToProcessQueue(new PlaytimeDependentInfo(uuid, InfoType.GM, time, gameMode, worldName)); Optional<Session> cachedSession = plugin.getDataCache().getCachedSession(uuid);
if (cachedSession.isPresent()) {
Session session = cachedSession.get();
session.changeState(worldName, gameMode, time);
}
} }
} }

View File

@ -1,26 +1,21 @@
package main.java.com.djrapitops.plan.data.listeners; package main.java.com.djrapitops.plan.data.listeners;
import com.djrapitops.plugin.task.AbsRunnable;
import com.djrapitops.plugin.utilities.player.Fetch; import com.djrapitops.plugin.utilities.player.Fetch;
import com.djrapitops.plugin.utilities.player.Gamemode;
import com.djrapitops.plugin.utilities.player.IPlayer;
import main.java.com.djrapitops.plan.Plan; import main.java.com.djrapitops.plan.Plan;
import main.java.com.djrapitops.plan.data.UserData; import main.java.com.djrapitops.plan.data.Session;
import main.java.com.djrapitops.plan.data.cache.DataCache; import main.java.com.djrapitops.plan.data.cache.DataCache;
import main.java.com.djrapitops.plan.data.handling.info.KickInfo; import main.java.com.djrapitops.plan.data.handling.DBCommitProcessor;
import main.java.com.djrapitops.plan.data.handling.info.LoginInfo; import main.java.com.djrapitops.plan.data.handling.player.*;
import main.java.com.djrapitops.plan.data.handling.info.LogoutInfo;
import main.java.com.djrapitops.plan.utilities.MiscUtils; import main.java.com.djrapitops.plan.utilities.MiscUtils;
import main.java.com.djrapitops.plan.utilities.NewPlayerCreator;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler; import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority; import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener; import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerJoinEvent; import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.event.player.PlayerKickEvent; import org.bukkit.event.player.PlayerKickEvent;
import org.bukkit.event.player.PlayerLoginEvent;
import org.bukkit.event.player.PlayerQuitEvent; import org.bukkit.event.player.PlayerQuitEvent;
import java.net.InetAddress;
import java.util.UUID; import java.util.UUID;
/** /**
@ -32,89 +27,34 @@ import java.util.UUID;
public class PlanPlayerListener implements Listener { public class PlanPlayerListener implements Listener {
private final Plan plugin; private final Plan plugin;
private final DataCache handler; private final DataCache cache;
/** /**
* Class Constructor. * Class Constructor.
* <p>
* Copies the references to multiple handlers from Current instance of handler.
* *
* @param plugin Current instance of Plan * @param plugin Current instance of Plan
*/ */
public PlanPlayerListener(Plan plugin) { public PlanPlayerListener(Plan plugin) {
this.plugin = plugin; this.plugin = plugin;
handler = plugin.getHandler(); cache = plugin.getDataCache();
} }
/**
* PlayerJoinEvent Listener.
* <p>
* If player is a new player, creates new data for the player.
* <p>
* Adds a LoginInfo to the processingQueue if the user is not new.
*
* @param event The Fired event.
*/
@EventHandler(priority = EventPriority.MONITOR) @EventHandler(priority = EventPriority.MONITOR)
public void onPlayerLogin(PlayerJoinEvent event) { public void onPlayerLogin(PlayerLoginEvent event) {
Player player = event.getPlayer(); PlayerLoginEvent.Result result = event.getResult();
UUID uuid = event.getPlayer().getUniqueId();
IPlayer iPlayer = Fetch.wrapBukkit(player); if (result == PlayerLoginEvent.Result.KICK_BANNED) {
plugin.getNotificationCenter().checkNotifications(iPlayer); plugin.addToProcessQueue(new BanProcessor(uuid, true));
} else {
UUID uuid = player.getUniqueId(); plugin.addToProcessQueue(new BanProcessor(uuid, false));
handler.startSession(uuid); }
plugin.getRunnableFactory().createNew(new AbsRunnable("NewPlayerCheckTask") {
@Override
public void run() {
long time = MiscUtils.getTime();
InetAddress ip = player.getAddress().getAddress();
boolean banned = player.isBanned();
String displayName = player.getDisplayName();
String gm = player.getGameMode().name();
String worldName = player.getWorld().getName();
LoginInfo loginInfo = new LoginInfo(uuid, time, ip, banned, displayName, gm, 1, worldName);
boolean isNewPlayer = !plugin.getDB().wasSeenBefore(uuid);
if (isNewPlayer) {
UserData newUserData = NewPlayerCreator.createNewPlayer(iPlayer);
loginInfo.process(newUserData);
// TODO Rewrite Register & Login system handler.newPlayer(newUserData);
} else {
// handler.addToPool(loginInfo);
}
this.cancel();
}
}).runTaskAsynchronously();
}
/**
* PlayerQuitEvent Listener.
* <p>
* Adds a LogoutInfo to the processing Queue.
*
* @param event Fired event
*/
@EventHandler(priority = EventPriority.MONITOR)
public void onPlayerQuit(PlayerQuitEvent event) {
// TODO Rewrite Logout system
Player player = event.getPlayer();
UUID uuid = player.getUniqueId();
handler.endSession(uuid);
long time = MiscUtils.getTime();
boolean banned = player.isBanned();
Gamemode gm = Gamemode.wrap(player.getGameMode());
String worldName = player.getWorld().getName();
plugin.addToProcessQueue(new LogoutInfo(uuid, time, banned, gm.name(), worldName));
} }
/** /**
* PlayerKickEvent Listener. * PlayerKickEvent Listener.
* <p> * <p>
* Adds a KickInfo & LogoutInfo to the processing Queue. * Adds processing information to the ProcessingQueue.
* After KickEvent, the QuitEvent is automatically called.
* *
* @param event Fired event * @param event Fired event
*/ */
@ -123,18 +63,62 @@ public class PlanPlayerListener implements Listener {
if (event.isCancelled()) { if (event.isCancelled()) {
return; return;
} }
UUID uuid = event.getPlayer().getUniqueId();
plugin.addToProcessQueue(new KickProcessor(uuid));
}
/**
* PlayerJoinEvent Listener.
* <p>
* Adds processing information to the ProcessingQueue.
*
* @param event The Fired event.
*/
@EventHandler(priority = EventPriority.MONITOR)
public void onPlayerJoin(PlayerJoinEvent event) {
Player player = event.getPlayer();
plugin.getNotificationCenter().checkNotifications(Fetch.wrapBukkit(player));
UUID uuid = player.getUniqueId();
long time = MiscUtils.getTime();
String world = player.getWorld().getName();
String gm = player.getGameMode().name();
String ip = player.getAddress().getAddress().toString();
String playerName = player.getName();
String displayName = player.getDisplayName();
int playersOnline = plugin.getTpsCountTimer().getLatestPlayersOnline();
cache.cacheSession(uuid, Session.start(time, world, gm));
plugin.addToProcessQueue(
new RegisterProcessor(uuid, time, playersOnline), //TODO Add required variables after UsersTable is done.
new IPUpdateProcessor(uuid, ip),
new NameProcessor(uuid, playerName, displayName),
new DBCommitProcessor(plugin.getDB())
);
}
/**
* PlayerQuitEvent Listener.
* <p>
* Adds processing information to the ProcessingQueue.
*
* @param event Fired event
*/
@EventHandler(priority = EventPriority.MONITOR)
public void onPlayerQuit(PlayerQuitEvent event) {
long time = MiscUtils.getTime();
Player player = event.getPlayer(); Player player = event.getPlayer();
UUID uuid = player.getUniqueId(); UUID uuid = player.getUniqueId();
handler.endSession(uuid); plugin.addToProcessQueue(
new BanProcessor(uuid, player.isBanned()),
long time = MiscUtils.getTime(); new EndSessionProcessor(uuid, time)
boolean banned = player.isBanned(); );
Gamemode gm = Gamemode.wrap(player.getGameMode());
String worldName = player.getWorld().getName();
//TODO String geoLocation = GeolocationCacheHandler.getCountry(ip.getHostAddress());
plugin.addToProcessQueue(new LogoutInfo(uuid, time, banned, gm.name(), worldName));
plugin.addToProcessQueue(new KickInfo(uuid));
} }
} }

View File

@ -1,8 +1,7 @@
package main.java.com.djrapitops.plan.data.listeners; package main.java.com.djrapitops.plan.data.listeners;
import main.java.com.djrapitops.plan.Plan; import main.java.com.djrapitops.plan.Plan;
import main.java.com.djrapitops.plan.data.handling.info.InfoType; import main.java.com.djrapitops.plan.data.Session;
import main.java.com.djrapitops.plan.data.handling.info.PlaytimeDependentInfo;
import main.java.com.djrapitops.plan.utilities.MiscUtils; import main.java.com.djrapitops.plan.utilities.MiscUtils;
import org.bukkit.entity.Player; import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler; import org.bukkit.event.EventHandler;
@ -10,6 +9,7 @@ import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener; import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerChangedWorldEvent; import org.bukkit.event.player.PlayerChangedWorldEvent;
import java.util.Optional;
import java.util.UUID; import java.util.UUID;
public class PlanWorldChangeListener implements Listener { public class PlanWorldChangeListener implements Listener {
@ -22,17 +22,16 @@ public class PlanWorldChangeListener implements Listener {
@EventHandler(priority = EventPriority.MONITOR) @EventHandler(priority = EventPriority.MONITOR)
public void onWorldChange(PlayerChangedWorldEvent event) { public void onWorldChange(PlayerChangedWorldEvent event) {
Player p = event.getPlayer(); Player p = event.getPlayer();
String previousWorld = event.getFrom().getName();
String worldName = p.getWorld().getName(); String worldName = p.getWorld().getName();
if (previousWorld.equals(worldName)) {
return;
}
UUID uuid = p.getUniqueId(); UUID uuid = p.getUniqueId();
String gameMode = p.getGameMode().name(); String gameMode = p.getGameMode().name();
long time = MiscUtils.getTime(); long time = MiscUtils.getTime();
plugin.addToProcessQueue(new PlaytimeDependentInfo(uuid, InfoType.WORLD, time, gameMode, worldName)); Optional<Session> cachedSession = plugin.getDataCache().getCachedSession(uuid);
if (cachedSession.isPresent()) {
Session session = cachedSession.get();
session.changeState(worldName, gameMode, time);
}
} }
} }

View File

@ -23,14 +23,16 @@ import java.util.List;
public class TPSCountTimer extends AbsRunnable { public class TPSCountTimer extends AbsRunnable {
private final Plan plugin; private final Plan plugin;
private final DataCache handler; private final DataCache dataCache;
private final List<TPS> history; private final List<TPS> history;
private long lastCheckNano; private long lastCheckNano;
private int latestPlayersOnline = 0;
public TPSCountTimer(Plan plugin) { public TPSCountTimer(Plan plugin) {
super("TPSCountTimer"); super("TPSCountTimer");
lastCheckNano = -1; lastCheckNano = -1;
this.handler = plugin.getHandler(); this.dataCache = plugin.getDataCache();
this.plugin = plugin; this.plugin = plugin;
history = new ArrayList<>(); history = new ArrayList<>();
} }
@ -52,7 +54,8 @@ public class TPSCountTimer extends AbsRunnable {
history.add(tps); history.add(tps);
if (history.size() >= 60) { if (history.size() >= 60) {
handler.addTPSLastMinute(history); // TODO Process & Save to DB with a new Processor.
dataCache.addTPSLastMinute(history);
history.clear(); history.clear();
} }
} }
@ -79,6 +82,7 @@ public class TPSCountTimer extends AbsRunnable {
long usedMemory = (totalMemory - runtime.freeMemory()) / 1000000; long usedMemory = (totalMemory - runtime.freeMemory()) / 1000000;
int playersOnline = plugin.getServer().getOnlinePlayers().size(); int playersOnline = plugin.getServer().getOnlinePlayers().size();
latestPlayersOnline = playersOnline;
int loadedChunks = getLoadedChunks(); int loadedChunks = getLoadedChunks();
int entityCount; int entityCount;
@ -167,4 +171,8 @@ public class TPSCountTimer extends AbsRunnable {
private int getEntityCountPaper() { private int getEntityCountPaper() {
return plugin.getServer().getWorlds().stream().mapToInt(World::getEntityCount).sum(); return plugin.getServer().getWorlds().stream().mapToInt(World::getEntityCount).sum();
} }
public int getLatestPlayersOnline() {
return latestPlayersOnline;
}
} }

View File

@ -321,4 +321,6 @@ public abstract class Database {
public ServerTable getServerTable() { public ServerTable getServerTable() {
return serverTable; return serverTable;
} }
public abstract void commit() throws SQLException;
} }

View File

@ -4,7 +4,7 @@ import com.djrapitops.plugin.task.AbsRunnable;
import main.java.com.djrapitops.plan.Log; import main.java.com.djrapitops.plan.Log;
import main.java.com.djrapitops.plan.Plan; import main.java.com.djrapitops.plan.Plan;
import main.java.com.djrapitops.plan.data.KillData; import main.java.com.djrapitops.plan.data.KillData;
import main.java.com.djrapitops.plan.data.SessionData; import main.java.com.djrapitops.plan.data.Session;
import main.java.com.djrapitops.plan.data.UserData; import main.java.com.djrapitops.plan.data.UserData;
import main.java.com.djrapitops.plan.database.Database; import main.java.com.djrapitops.plan.database.Database;
import main.java.com.djrapitops.plan.database.tables.*; import main.java.com.djrapitops.plan.database.tables.*;
@ -363,7 +363,7 @@ public abstract class SQLDB extends Database {
Map<Integer, List<String>> nicknames = nicknamesTable.getNicknames(ids); Map<Integer, List<String>> nicknames = nicknamesTable.getNicknames(ids);
Map<Integer, Set<InetAddress>> ipList = ipsTable.getIPList(ids); Map<Integer, Set<InetAddress>> ipList = ipsTable.getIPList(ids);
Map<Integer, List<KillData>> playerKills = killsTable.getPlayerKills(ids, idUuidRel); Map<Integer, List<KillData>> playerKills = killsTable.getPlayerKills(ids, idUuidRel);
Map<Integer, List<SessionData>> sessionData = sessionsTable.getSessionData(ids); Map<Integer, List<Session>> sessionData = sessionsTable.getSessionData(ids);
Map<Integer, Map<String, Long>> worldTimes = worldTimesTable.getWorldTimes(ids); Map<Integer, Map<String, Long>> worldTimes = worldTimesTable.getWorldTimes(ids);
Log.debug("Database", Log.debug("Database",

View File

@ -0,0 +1,45 @@
/*
* Licence is provided in the jar as license.yml also here:
* https://github.com/Rsl1122/Plan-PlayerAnalytics/blob/master/Plan/src/main/resources/license.yml
*/
package main.java.com.djrapitops.plan.database.tables;
import org.apache.commons.lang3.text.WordUtils;
/**
* IDs of various actions
*
* @author Rsl1122
*/
public enum Actions {
UNKNOWN(-1),
REGISTERED(1),
FIRST_LOGOUT(2),
CHANGED_NAME(3),
KILLED(-2), // Not stored in ActionsTable.
;
private final int id;
Actions(int id) {
this.id = id;
}
public int getId() {
return id;
}
public static Actions getById(int id) {
for (Actions a : values()) {
if (a.getId() == id) {
return a;
}
}
return UNKNOWN;
}
@Override
public String toString() {
return WordUtils.capitalizeFully(name(), '_').replace('_', ' ');
}
}

View File

@ -4,12 +4,120 @@
*/ */
package main.java.com.djrapitops.plan.database.tables; package main.java.com.djrapitops.plan.database.tables;
import main.java.com.djrapitops.plan.Log;
import main.java.com.djrapitops.plan.Plan;
import main.java.com.djrapitops.plan.data.Action;
import main.java.com.djrapitops.plan.database.databases.SQLDB;
import main.java.com.djrapitops.plan.database.sql.Select;
import main.java.com.djrapitops.plan.database.sql.Sql;
import main.java.com.djrapitops.plan.database.sql.TableSqlParser;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
/** /**
* //TODO Class Javadoc Comment * Table that is in charge of storing actions.
* <p>
* plan_actions contains columns:
* <ul>
* <li>user_id (plan_users: id)</li>
* <li>server_id (plan_servers: id)</li>
* <li>action_id</li>
* <li>date</li>
* <li>additional_info</li>
* </ul>
* *
* @author Rsl1122 * @author Rsl1122
*/ */
public class ActionsTable { public class ActionsTable extends UserIDTable {
// TODO Actions table
// time, action, additional info private final String columnServerID = "server_id";
private final String columnDate = "date";
private final String columnActionID = "action_id";
private final String columnAdditionalInfo = "additional_info";
public ActionsTable(String name, SQLDB db, boolean usingMySQL) {
super(name, db, usingMySQL);
}
@Override
public boolean createTable() {
ServerTable serverTable = db.getServerTable();
try {
execute(TableSqlParser.createTable(tableName)
.column(columnUserID, Sql.INT).notNull()
.column(columnServerID, Sql.INT).notNull()
.column(columnDate, Sql.LONG).notNull()
.column(columnActionID, Sql.INT).notNull()
.column(columnAdditionalInfo, Sql.varchar(100))
.foreignKey(columnUserID, usersTable.toString(), usersTable.getColumnID())
.foreignKey(columnServerID, serverTable.toString(), serverTable.getColumnID())
.toString());
return true;
} catch (SQLException ex) {
Log.toLog(this.getClass().getName(), ex);
return false;
}
}
public void insertAction(UUID uuid, Action action) throws SQLException {
PreparedStatement statement = null;
try {
ServerTable serverTable = db.getServerTable();
statement = prepareStatement("INSERT INTO " + tableName + " ("
+ columnUserID + ", "
+ columnServerID + ", "
+ columnActionID + ", "
+ columnDate + ", "
+ columnAdditionalInfo
+ ") VALUES ("
+ usersTable.statementSelectID + ", "
+ serverTable.statementSelectServerID + ", "
+ "?, ?, ?)"
);
statement.setString(1, uuid.toString());
statement.setString(2, Plan.getServerUUID().toString());
statement.setInt(3, action.getDoneAction().getId());
statement.setLong(4, action.getDate());
statement.setString(5, action.getAdditionalInfo());
statement.execute();
} finally {
close(statement);
}
}
/**
* Used to get all Actions done by a user on this server.
*
* @param uuid
* @return
* @throws SQLException
*/
public List<Action> getActions(UUID uuid) throws SQLException {
List<Action> actions = new ArrayList<>();
PreparedStatement statement = null;
ResultSet set = null;
try {
ServerTable serverTable = db.getServerTable();
statement = prepareStatement(Select.from(tableName, "*")
.where(columnUserID + "=" + usersTable.statementSelectID)
.toString());
set = statement.executeQuery();
while (set.next()) {
int serverID = set.getInt(columnServerID);
long date = set.getLong(columnDate);
Actions doneAction = Actions.getById(set.getInt(columnActionID));
String additionalInfo = set.getString(columnAdditionalInfo);
actions.add(new Action(date, doneAction, additionalInfo, serverID));
}
return actions;
} finally {
close(set, statement);
}
}
} }

View File

@ -2,7 +2,9 @@ package main.java.com.djrapitops.plan.database.tables;
import com.djrapitops.plugin.utilities.Verify; import com.djrapitops.plugin.utilities.Verify;
import main.java.com.djrapitops.plan.Log; import main.java.com.djrapitops.plan.Log;
import main.java.com.djrapitops.plan.Plan;
import main.java.com.djrapitops.plan.database.databases.SQLDB; import main.java.com.djrapitops.plan.database.databases.SQLDB;
import main.java.com.djrapitops.plan.database.sql.Select;
import main.java.com.djrapitops.plan.database.sql.Sql; import main.java.com.djrapitops.plan.database.sql.Sql;
import main.java.com.djrapitops.plan.database.sql.TableSqlParser; import main.java.com.djrapitops.plan.database.sql.TableSqlParser;
import main.java.com.djrapitops.plan.utilities.Benchmark; import main.java.com.djrapitops.plan.utilities.Benchmark;
@ -12,15 +14,19 @@ import java.sql.ResultSet;
import java.sql.SQLException; import java.sql.SQLException;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
import java.util.Optional;
import java.util.UUID;
/** /**
* @author Rsl1122 * @author Rsl1122
*/ */
public class CommandUseTable extends Table { public class CommandUseTable extends Table {
private final String columnCommand; private final String columnCommandId = "id";
private final String columnTimesUsed; private final String columnCommand = "command";
private final String columnServerID; //TODO private final String columnTimesUsed = "times_used";
private final String columnServerID = "server_id";
private ServerTable serverTable;
/** /**
* @param db * @param db
@ -28,9 +34,7 @@ public class CommandUseTable extends Table {
*/ */
public CommandUseTable(SQLDB db, boolean usingMySQL) { public CommandUseTable(SQLDB db, boolean usingMySQL) {
super("plan_commandusages", db, usingMySQL); super("plan_commandusages", db, usingMySQL);
columnCommand = "command"; serverTable = db.getServerTable();
columnTimesUsed = "times_used";
columnServerID = "server_id";
} }
/** /**
@ -38,10 +42,15 @@ public class CommandUseTable extends Table {
*/ */
@Override @Override
public boolean createTable() { public boolean createTable() {
ServerTable serverTable = db.getServerTable();
try { try {
execute(TableSqlParser.createTable(tableName) execute(TableSqlParser.createTable(tableName)
.primaryKeyIDColumn(usingMySQL, columnCommandId, Sql.INT)
.column(columnCommand, Sql.varchar(20)).notNull() .column(columnCommand, Sql.varchar(20)).notNull()
.column(columnTimesUsed, Sql.INT).notNull() .column(columnTimesUsed, Sql.INT).notNull()
.column(columnServerID, Sql.INT).notNull()
.primaryKey(usingMySQL, columnCommandId)
.foreignKey(columnServerID, serverTable.toString(), serverTable.getColumnID())
.toString() .toString()
); );
return true; return true;
@ -52,15 +61,34 @@ public class CommandUseTable extends Table {
} }
/** /**
* @return @throws SQLException * Used to get all commands used in this server.
*
* @return command - times used Map
* @throws SQLException
*/ */
public Map<String, Integer> getCommandUse() throws SQLException { public Map<String, Integer> getCommandUse() throws SQLException {
return getCommandUse(Plan.getServerUUID());
}
/**
* Used to get all commands used in a server.
*
* @param serverUUID UUID of the server.
* @return command - times used Map
* @throws SQLException
*/
public Map<String, Integer> getCommandUse(UUID serverUUID) throws SQLException {
ServerTable serverTable = db.getServerTable();
Benchmark.start("Get CommandUse"); Benchmark.start("Get CommandUse");
Map<String, Integer> commandUse = new HashMap<>(); Map<String, Integer> commandUse = new HashMap<>();
PreparedStatement statement = null; PreparedStatement statement = null;
ResultSet set = null; ResultSet set = null;
try { try {
statement = prepareStatement("SELECT * FROM " + tableName); statement = prepareStatement(Select.from(tableName,
columnCommand, columnTimesUsed)
.where(columnServerID + "=" + serverTable.statementSelectServerID)
.toString());
statement.setString(1, serverUUID.toString());
set = statement.executeQuery(); set = statement.executeQuery();
while (set.next()) { while (set.next()) {
String cmd = set.getString(columnCommand).toLowerCase(); String cmd = set.getString(columnCommand).toLowerCase();
@ -102,7 +130,6 @@ public class CommandUseTable extends Table {
String cmd = savedEntry.getKey(); String cmd = savedEntry.getKey();
// IMPORTANT - not using saved as value // IMPORTANT - not using saved as value
Integer toSave = updateData.get(cmd); Integer toSave = updateData.get(cmd);
if (toSave != null && toSave <= savedEntry.getValue()) { if (toSave != null && toSave <= savedEntry.getValue()) {
updateData.remove(cmd); updateData.remove(cmd);
} }
@ -117,7 +144,10 @@ public class CommandUseTable extends Table {
private void updateCommands(Map<String, Integer> data) throws SQLException { private void updateCommands(Map<String, Integer> data) throws SQLException {
PreparedStatement statement = null; PreparedStatement statement = null;
try { try {
String updateStatement = "UPDATE " + tableName + " SET " + columnTimesUsed + "=? WHERE (" + columnCommand + "=?)"; String updateStatement = "UPDATE " + tableName + " SET " +
columnTimesUsed + "=? " +
"WHERE (" + columnCommand + "=?) AND (" +
columnServerID + "=" + serverTable.statementSelectServerID + ")";
statement = prepareStatement(updateStatement); statement = prepareStatement(updateStatement);
boolean commitRequired = false; boolean commitRequired = false;
for (Map.Entry<String, Integer> entrySet : data.entrySet()) { for (Map.Entry<String, Integer> entrySet : data.entrySet()) {
@ -130,6 +160,7 @@ public class CommandUseTable extends Table {
statement.setInt(1, amount); statement.setInt(1, amount);
statement.setString(2, key); statement.setString(2, key);
statement.setString(3, Plan.getServerUUID().toString());
statement.addBatch(); statement.addBatch();
commitRequired = true; commitRequired = true;
} }
@ -147,10 +178,11 @@ public class CommandUseTable extends Table {
try { try {
String insertStatement = "INSERT INTO " + tableName + " (" String insertStatement = "INSERT INTO " + tableName + " ("
+ columnCommand + ", " + columnCommand + ", "
+ columnTimesUsed + columnTimesUsed + ", "
+ ") VALUES (?, ?)"; + columnServerID
+ ") VALUES (?, ?, " + serverTable.statementSelectServerID + ")";
statement = prepareStatement(insertStatement); statement = prepareStatement(insertStatement);
boolean commitRequired = false; boolean addedRows = false;
for (Map.Entry<String, Integer> entrySet : data.entrySet()) { for (Map.Entry<String, Integer> entrySet : data.entrySet()) {
String key = entrySet.getKey(); String key = entrySet.getKey();
Integer amount = entrySet.getValue(); Integer amount = entrySet.getValue();
@ -161,15 +193,48 @@ public class CommandUseTable extends Table {
statement.setString(1, key); statement.setString(1, key);
statement.setInt(2, amount); statement.setInt(2, amount);
statement.setString(3, Plan.getServerUUID().toString());
statement.addBatch(); statement.addBatch();
commitRequired = true; addedRows = true;
} }
if (commitRequired) { if (addedRows) {
statement.executeBatch(); statement.executeBatch();
} }
} finally { } finally {
close(statement); close(statement);
} }
} }
public Optional<String> getCommandByID(int id) throws SQLException {
PreparedStatement statement = null;
ResultSet set = null;
try {
statement = prepareStatement(Select.from(tableName, columnCommand).where(columnCommandId + "=?").toString());
statement.setInt(1, id);
set = statement.executeQuery();
if (set.next()) {
return Optional.of(set.getString(columnCommand));
}
return Optional.empty();
} finally {
close(statement);
}
}
public Optional<Integer> getCommandID(String command) throws SQLException {
PreparedStatement statement = null;
ResultSet set = null;
try {
statement = prepareStatement(Select.from(tableName, columnCommandId).where(columnCommand + "=?").toString());
statement.setString(1, command);
set = statement.executeQuery();
if (set.next()) {
return Optional.of(set.getInt(columnCommandId));
}
return Optional.empty();
} finally {
close(statement);
}
}
} }

View File

@ -1,26 +1,28 @@
package main.java.com.djrapitops.plan.database.tables; package main.java.com.djrapitops.plan.database.tables;
import com.djrapitops.plugin.utilities.Verify;
import main.java.com.djrapitops.plan.Log; import main.java.com.djrapitops.plan.Log;
import main.java.com.djrapitops.plan.database.databases.SQLDB; import main.java.com.djrapitops.plan.database.databases.SQLDB;
import main.java.com.djrapitops.plan.database.sql.Select;
import main.java.com.djrapitops.plan.database.sql.Sql; import main.java.com.djrapitops.plan.database.sql.Sql;
import main.java.com.djrapitops.plan.database.sql.TableSqlParser; import main.java.com.djrapitops.plan.database.sql.TableSqlParser;
import main.java.com.djrapitops.plan.utilities.Benchmark;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.sql.PreparedStatement; import java.sql.PreparedStatement;
import java.sql.ResultSet; import java.sql.ResultSet;
import java.sql.SQLException; import java.sql.SQLException;
import java.util.*; import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import java.util.UUID;
/** /**
* @author Rsl1122 * @author Rsl1122
*/ */
public class IPsTable extends UserIDTable { public class IPsTable extends UserIDTable {
private final String columnIP; // TODO Write tests
private final String columnGeolocation; // TODO
private final String columnIP = "ip";
private final String columnGeolocation = "geolocation";
/** /**
* @param db The database * @param db The database
@ -28,9 +30,6 @@ public class IPsTable extends UserIDTable {
*/ */
public IPsTable(SQLDB db, boolean usingMySQL) { public IPsTable(SQLDB db, boolean usingMySQL) {
super("plan_ips", db, usingMySQL); super("plan_ips", db, usingMySQL);
columnUserID = "user_id";
columnIP = "ip";
columnGeolocation = "geolocation";
} }
/** /**
@ -43,6 +42,7 @@ public class IPsTable extends UserIDTable {
execute(TableSqlParser.createTable(tableName) execute(TableSqlParser.createTable(tableName)
.column(columnUserID, Sql.INT).notNull() .column(columnUserID, Sql.INT).notNull()
.column(columnIP, Sql.varchar(20)).notNull() .column(columnIP, Sql.varchar(20)).notNull()
.column(columnGeolocation, Sql.varchar(50)).notNull()
.foreignKey(columnUserID, usersTable.getTableName(), usersTable.getColumnID()) .foreignKey(columnUserID, usersTable.getTableName(), usersTable.getColumnID())
.toString() .toString()
); );
@ -62,176 +62,81 @@ public class IPsTable extends UserIDTable {
} }
/** /**
* @param userId The User ID from which the IPs should be retrieved from * @param uuid UUID of the user.
* @return The retrieved IPs * @return Users's Login Geolocations.
* @throws SQLException when an error at retrieval happens * @throws SQLException when an error at retrieval happens
*/ */
public List<InetAddress> getIPAddresses(int userId) throws SQLException { public List<String> getGeolocations(UUID uuid) throws SQLException {
return getStringList(uuid, columnGeolocation);
}
public List<String> getIps(UUID uuid) throws SQLException {
return getStringList(uuid, columnIP);
}
private List<String> getStringList(UUID uuid, String column) throws SQLException {
PreparedStatement statement = null; PreparedStatement statement = null;
ResultSet set = null; ResultSet set = null;
try { try {
List<InetAddress> ips = new ArrayList<>(); List<String> stringList = new ArrayList<>();
statement = prepareStatement("SELECT * FROM " + tableName + " WHERE UPPER(" + columnUserID + ") LIKE UPPER(?)"); statement = prepareStatement(Select.from(tableName, column)
statement.setInt(1, userId); .where(columnUserID + "=" + usersTable.statementSelectID)
.toString());
statement.setString(1, uuid.toString());
set = statement.executeQuery(); set = statement.executeQuery();
while (set.next()) { while (set.next()) {
String ipAddressName = set.getString(columnIP); stringList.add(set.getString(column));
try {
ips.add(InetAddress.getByName(ipAddressName));
} catch (UnknownHostException e) {
Log.error("Host not found at getIPAddresses: " + ipAddressName); //Shouldn't ever happen
}
} }
return ips; return stringList;
} finally { } finally {
close(set, statement); close(set, statement);
} }
} }
/** public void updateIP(UUID uuid, String ip, String geolocation) throws SQLException {
* @param userId The User ID for which the IPs should be saved for List<String> ips = getIps(uuid);
* @param ips The IPs if (ips.contains(ip)) {
* @throws SQLException when an error at saving happens
*/
public void saveIPList(int userId, Set<InetAddress> ips) throws SQLException {
if (ips == null) {
return;
}
ips.removeAll(getIPAddresses(userId));
if (ips.isEmpty()) {
return; return;
} }
insertIp(uuid, ip, geolocation);
}
private void insertIp(UUID uuid, String ip, String geolocation) throws SQLException {
PreparedStatement statement = null; PreparedStatement statement = null;
try { try {
statement = prepareStatement("INSERT INTO " + tableName + " (" statement = prepareStatement("INSERT INTO " + tableName + " ("
+ columnUserID + ", " + columnUserID + ", "
+ columnIP + columnIP + ", "
+ ") VALUES (?, ?)"); + columnGeolocation
boolean commitRequired = false; + ") VALUES ("
+ usersTable.statementSelectID + ", "
for (InetAddress ip : ips) { + "?, ?)");
if (ip == null) { statement.setString(1, uuid.toString());
continue; statement.setString(2, ip);
} statement.setString(3, geolocation);
statement.execute();
statement.setInt(1, userId);
statement.setString(2, ip.getHostAddress());
statement.addBatch();
commitRequired = true;
}
if (commitRequired) {
statement.executeBatch();
}
} finally { } finally {
close(statement); close(statement);
} }
} }
/** public Optional<String> getGeolocation(String ip) throws SQLException {
* @param ids The User IDs for which the IPs should be retrieved for
* @return The User IDs corresponding with their used IPs
* @throws SQLException when an error at retrieval happens
*/
public Map<Integer, Set<InetAddress>> getIPList(Collection<Integer> ids) throws SQLException {
if (Verify.isEmpty(ids)) {
return new HashMap<>();
}
Benchmark.start("Get Ips Multiple");
PreparedStatement statement = null; PreparedStatement statement = null;
ResultSet set = null; ResultSet set = null;
try { try {
statement = prepareStatement("SELECT * FROM " + tableName); statement = prepareStatement(Select.from(tableName, columnGeolocation)
.where(columnIP + "=?")
.toString());
statement.setString(1, ip);
set = statement.executeQuery(); set = statement.executeQuery();
Map<Integer, Set<InetAddress>> ips = new HashMap<>(); if (set.next()) {
return Optional.of(set.getString(columnGeolocation));
for (Integer id : ids) {
ips.put(id, new HashSet<>());
} }
return Optional.empty();
while (set.next()) {
Integer id = set.getInt(columnUserID);
if (!ids.contains(id)) {
continue;
}
String ipAddressName = set.getString(columnIP);
try {
ips.get(id).add(InetAddress.getByName(ipAddressName));
} catch (UnknownHostException e) {
Log.error("Host not found at getIPAddresses: " + ipAddressName); //Shouldn't ever happen
}
}
return ips;
} finally { } finally {
close(set, statement); close(set, statement);
Benchmark.stop("Database", "Get Ips Multiple");
}
}
/**
* @param ips The User IDs corresponding to their IPs used
* @throws SQLException when an error at saving happens
*/
public void saveIPList(Map<Integer, Set<InetAddress>> ips) throws SQLException {
if (Verify.isEmpty(ips)) {
return;
}
Benchmark.start("Save Ips Multiple");
Map<Integer, Set<InetAddress>> saved = getIPList(ips.keySet());
PreparedStatement statement = null;
try {
statement = prepareStatement("INSERT INTO " + tableName + " ("
+ columnUserID + ", "
+ columnIP
+ ") VALUES (?, ?)");
boolean commitRequired = false;
for (Map.Entry<Integer, Set<InetAddress>> entrySet : ips.entrySet()) {
Integer id = entrySet.getKey();
Set<InetAddress> ipAddresses = entrySet.getValue();
Set<InetAddress> s = saved.get(id);
if (s != null) {
ipAddresses.removeAll(s);
}
if (ipAddresses.isEmpty()) {
continue;
}
for (InetAddress ip : ipAddresses) {
if (ip == null) {
continue;
}
statement.setInt(1, id);
statement.setString(2, ip.getHostAddress());
statement.addBatch();
commitRequired = true;
}
}
if (commitRequired) {
statement.executeBatch();
}
} finally {
close(statement);
Benchmark.stop("Database", "Save Ips Multiple");
} }
} }
} }

View File

@ -18,12 +18,12 @@ import java.util.*;
*/ */
public class KillsTable extends Table { public class KillsTable extends Table {
private final String columnKillerUserID; private final String columnKillerUserID = "killer_id";
private final String columnVictimUserID; private final String columnVictimUserID = "victim_id";
private final String columnWeapon; private final String columnWeapon = "weapon";
private final String columnDate; private final String columnDate = "date";
private final String columnServerID; //TODO private final String columnServerID = "server_id"; //TODO
private final String columnSessionID; //TODO private final String columnSessionID = "session_id"; //TODO
/** /**
* @param db * @param db
@ -31,12 +31,6 @@ public class KillsTable extends Table {
*/ */
public KillsTable(SQLDB db, boolean usingMySQL) { public KillsTable(SQLDB db, boolean usingMySQL) {
super("plan_kills", db, usingMySQL); super("plan_kills", db, usingMySQL);
columnWeapon = "weapon";
columnDate = "date";
columnKillerUserID = "killer_id";
columnVictimUserID = "victim_id";
columnServerID = "server_id";
columnSessionID = "session_id";
} }
/** /**
@ -97,9 +91,8 @@ public class KillsTable extends Table {
set = statement.executeQuery(); set = statement.executeQuery();
List<KillData> killData = new ArrayList<>(); List<KillData> killData = new ArrayList<>();
while (set.next()) { while (set.next()) {
int victimID = set.getInt(columnVictimUserID); UUID victimUUID = null; // TODO Victim UUID Retrieval
UUID victimUUID = usersTable.getUserUUID(String.valueOf(victimID)); killData.add(new KillData(victimUUID, set.getString(columnWeapon), set.getLong(columnDate)));
killData.add(new KillData(victimUUID, victimID, set.getString(columnWeapon), set.getLong(columnDate)));
} }
return killData; return killData;
} finally { } finally {
@ -128,26 +121,14 @@ public class KillsTable extends Table {
+ columnDate + columnDate
+ ") VALUES (?, ?, ?, ?)"); + ") VALUES (?, ?, ?, ?)");
boolean commitRequired = false; boolean commitRequired = false;
kills.stream().filter(Objects::nonNull).forEach(killData -> {
int victimUserID = killData.getVictimUserID();
if (victimUserID == -1) {
try {
int newVictimID = db.getUsersTable().getUserId(killData.getVictim());
killData.setVictimUserID(newVictimID);
} catch (SQLException e) {
Log.toLog(this.getClass().getName(), e);
return;
}
}
});
for (KillData kill : kills) { for (KillData kill : kills) {
if (kill == null || kill.getVictimUserID() == -1) { if (kill == null) {
continue; continue;
} }
statement.setInt(1, userId); statement.setInt(1, userId);
statement.setInt(2, kill.getVictimUserID()); statement.setInt(2, -1); // TODO Victim ID Retrieval
statement.setString(3, kill.getWeapon()); statement.setString(3, kill.getWeapon());
statement.setLong(4, kill.getDate()); statement.setLong(4, kill.getTime());
statement.addBatch(); statement.addBatch();
commitRequired = true; commitRequired = true;
} }
@ -183,12 +164,11 @@ public class KillsTable extends Table {
} }
while (set.next()) { while (set.next()) {
int killerID = set.getInt(columnKillerUserID); int killerID = set.getInt(columnKillerUserID);
int victimID = set.getInt(columnVictimUserID);
if (!ids.contains(killerID)) { if (!ids.contains(killerID)) {
continue; continue;
} }
UUID victimUUID = uuids.get(victimID); UUID victimUUID = null; // TODO Victim UUID Retrieval
kills.get(killerID).add(new KillData(victimUUID, victimID, set.getString(columnWeapon), set.getLong(columnDate))); kills.get(killerID).add(new KillData(victimUUID, set.getString(columnWeapon), set.getLong(columnDate)));
} }
return kills; return kills;
} finally { } finally {
@ -230,16 +210,11 @@ public class KillsTable extends Table {
playerKills.removeAll(s); playerKills.removeAll(s);
} }
findMissingIDs(playerKills);
for (KillData kill : playerKills) { for (KillData kill : playerKills) {
if (kill.getVictimUserID() == -1) {
continue;
}
statement.setInt(1, id); statement.setInt(1, id);
statement.setInt(2, kill.getVictimUserID()); statement.setInt(2, -1); // TODO Victim ID Retrieval
statement.setString(3, kill.getWeapon()); statement.setString(3, kill.getWeapon());
statement.setLong(4, kill.getDate()); statement.setLong(4, kill.getTime());
statement.addBatch(); statement.addBatch();
commitRequired = true; commitRequired = true;
} }
@ -254,13 +229,7 @@ public class KillsTable extends Table {
} }
} }
private void findMissingIDs(List<KillData> playerKills) throws SQLException { public void savePlayerKills(UUID uuid, List<KillData> playerKills) {
for (KillData killData : playerKills) { // TODO savePlayerKills
int victimUserID = killData.getVictimUserID();
if (victimUserID == -1) {
int newVictimID = db.getUsersTable().getUserId(killData.getVictim());
killData.setVictimUserID(newVictimID);
}
}
} }
} }

View File

@ -17,9 +17,9 @@ import java.util.*;
*/ */
public class NicknamesTable extends UserIDTable { public class NicknamesTable extends UserIDTable {
private final String columnNick; private final String columnNick = "nickname";
private final String columnCurrent; private final String columnCurrent = "current_nick";
private final String columnServerID; //TODO private final String columnServerID = "server_id"; //TODO
/** /**
* @param db The database * @param db The database
@ -27,10 +27,6 @@ public class NicknamesTable extends UserIDTable {
*/ */
public NicknamesTable(SQLDB db, boolean usingMySQL) { public NicknamesTable(SQLDB db, boolean usingMySQL) {
super("plan_nicknames", db, usingMySQL); super("plan_nicknames", db, usingMySQL);
columnUserID = "user_id";
columnNick = "nickname";
columnCurrent = "current_nick";
columnServerID = "server_id";
} }
/** /**

View File

@ -13,33 +13,38 @@ import main.java.com.djrapitops.plan.database.sql.*;
import java.sql.PreparedStatement; import java.sql.PreparedStatement;
import java.sql.ResultSet; import java.sql.ResultSet;
import java.sql.SQLException; import java.sql.SQLException;
import java.util.ArrayList; import java.util.*;
import java.util.List;
import java.util.Optional;
import java.util.UUID;
/** /**
* Table representing plan_servers in the database. * Table for managing multiple server's data in the database.
* <p> * <p>
* Used for managing multiple server's data in the database. * plan_servers contains columns:
* <ul>
* <li>id</li>
* <li>uuid</li>
* <li>name</li>
* <li>web_address</li>
* <li>is_installed</li>
* </ul>
* Columns refer to Server Information.
* *
* @author Rsl1122 * @author Rsl1122
*/ */
public class ServerTable extends Table { public class ServerTable extends Table {
private final String columnServerID; private final String columnServerID = "id";
private final String columnServerUUID; private final String columnServerUUID = "uuid";
private final String columnServerName; private final String columnServerName = "name";
private final String columnWebserverAddress; private final String columnWebserverAddress = "web_address";
private final String columnInstalled; private final String columnInstalled = "is_installed";
public final String statementSelectServerID;
public final String statementSelectServerNameID;
public ServerTable(SQLDB db, boolean usingMySQL) { public ServerTable(SQLDB db, boolean usingMySQL) {
super("plan_servers", db, usingMySQL); super("plan_servers", db, usingMySQL);
columnServerID = "id"; statementSelectServerID = "(" + Select.from(tableName, tableName + "." + columnServerID).where(columnServerUUID + "=?").toString() + ")";
columnServerUUID = "uuid"; statementSelectServerNameID = "(" + Select.from(tableName, tableName + "." + columnServerName).where(columnServerID + "=?").toString() + ")";
columnServerName = "name";
columnWebserverAddress = "web_address";
columnInstalled = "is_installed";
} }
@Override @Override
@ -175,6 +180,25 @@ public class ServerTable extends Table {
} }
} }
public Map<Integer, String> getServerNames() throws SQLException {
Map<Integer, String> names = new HashMap<>();
PreparedStatement statement = null;
ResultSet set = null;
try {
statement = prepareStatement(Select.from(tableName,
columnServerName)
.toString());
set = statement.executeQuery();
while (set.next()) {
int id = set.getInt(columnServerID);
names.put(id, set.getString(columnServerName));
}
return names;
} finally {
close(set, statement);
}
}
/** /**
* Used to get BungeeCord WebServer info if present. * Used to get BungeeCord WebServer info if present.
* *
@ -226,4 +250,8 @@ public class ServerTable extends Table {
close(set, statement); close(set, statement);
} }
} }
public String getColumnID() {
return tableName + "." + columnServerID;
}
} }

View File

@ -1,12 +1,12 @@
package main.java.com.djrapitops.plan.database.tables; package main.java.com.djrapitops.plan.database.tables;
import main.java.com.djrapitops.plan.Log; import main.java.com.djrapitops.plan.Log;
import main.java.com.djrapitops.plan.data.SessionData; import main.java.com.djrapitops.plan.Plan;
import main.java.com.djrapitops.plan.database.Container; import main.java.com.djrapitops.plan.data.Session;
import main.java.com.djrapitops.plan.database.databases.SQLDB; import main.java.com.djrapitops.plan.database.databases.SQLDB;
import main.java.com.djrapitops.plan.database.sql.Select;
import main.java.com.djrapitops.plan.database.sql.Sql; import main.java.com.djrapitops.plan.database.sql.Sql;
import main.java.com.djrapitops.plan.database.sql.TableSqlParser; import main.java.com.djrapitops.plan.database.sql.TableSqlParser;
import main.java.com.djrapitops.plan.utilities.Benchmark;
import java.sql.PreparedStatement; import java.sql.PreparedStatement;
import java.sql.ResultSet; import java.sql.ResultSet;
@ -18,12 +18,14 @@ import java.util.*;
*/ */
public class SessionsTable extends UserIDTable { public class SessionsTable extends UserIDTable {
private final String columnSessionID; //TODO private final String columnSessionID = "id";
private final String columnSessionStart; private final String columnSessionStart = "session_start";
private final String columnSessionEnd; private final String columnSessionEnd = "session_end";
private final String columnServerID; //TODO private final String columnServerID = "server_id";
private final String columnMobKills; //TODO private final String columnMobKills = "mob_kills";
private final String columnDeaths; //TODO private final String columnDeaths = "deaths";
private final ServerTable serverTable;
/** /**
* @param db * @param db
@ -31,13 +33,7 @@ public class SessionsTable extends UserIDTable {
*/ */
public SessionsTable(SQLDB db, boolean usingMySQL) { public SessionsTable(SQLDB db, boolean usingMySQL) {
super("plan_sessions", db, usingMySQL); super("plan_sessions", db, usingMySQL);
columnUserID = "user_id"; serverTable = db.getServerTable();
columnSessionStart = "session_start";
columnSessionEnd = "session_end";
columnServerID = "server_id";
columnSessionID = "id";
columnMobKills = "mob_kills";
columnDeaths = "deaths";
} }
/** /**
@ -46,12 +42,17 @@ public class SessionsTable extends UserIDTable {
@Override @Override
public boolean createTable() { public boolean createTable() {
try { try {
UsersTable usersTable = db.getUsersTable();
execute(TableSqlParser.createTable(tableName) execute(TableSqlParser.createTable(tableName)
.primaryKeyIDColumn(usingMySQL, columnServerID, Sql.LONG)
.column(columnUserID, Sql.INT).notNull() .column(columnUserID, Sql.INT).notNull()
.column(columnServerID, Sql.INT).notNull()
.column(columnSessionStart, Sql.LONG).notNull() .column(columnSessionStart, Sql.LONG).notNull()
.column(columnSessionEnd, Sql.LONG).notNull() .column(columnSessionEnd, Sql.LONG).notNull()
.column(columnMobKills, Sql.INT).notNull()
.column(columnDeaths, Sql.INT).notNull()
.foreignKey(columnUserID, usersTable.getTableName(), usersTable.getColumnID()) .foreignKey(columnUserID, usersTable.getTableName(), usersTable.getColumnID())
.foreignKey(columnServerID, serverTable.getTableName(), serverTable.getColumnID())
.primaryKey(usingMySQL, columnSessionID)
.toString() .toString()
); );
return true; return true;
@ -62,31 +63,10 @@ public class SessionsTable extends UserIDTable {
} }
/** /**
* @param userId * Removes User's Sessions from the Database.
* @return * <p>
* @throws SQLException * // TODO KILLS SHOULD BE REMOVED FIRST.
*/ *
public List<SessionData> getSessionData(int userId) throws SQLException {
PreparedStatement statement = null;
ResultSet set = null;
try {
statement = prepareStatement("SELECT * FROM " + tableName + " WHERE (" + columnUserID + "=?)");
statement.setInt(1, userId);
set = statement.executeQuery();
List<SessionData> sessions = new ArrayList<>();
while (set.next()) {
// sessions.add(new SessionData(set.getLong(columnSessionStart), set.getLong(columnSessionEnd)));
}
set.close();
statement.close();
return sessions;
} finally {
close(set);
close(statement);
}
}
/**
* @param userId * @param userId
* @return * @return
*/ */
@ -94,165 +74,62 @@ public class SessionsTable extends UserIDTable {
return super.removeDataOf(userId); return super.removeDataOf(userId);
} }
/** public void saveSessionInformation(UUID uuid, Session session) throws SQLException {
* @param userId
* @param sessions
* @throws SQLException
*/
public void saveSessionData(int userId, List<SessionData> sessions) throws SQLException {
if (sessions == null) {
return;
}
sessions.removeAll(getSessionData(userId));
if (sessions.isEmpty()) {
return;
}
PreparedStatement statement = null; PreparedStatement statement = null;
try { try {
statement = prepareStatement("INSERT INTO " + tableName + " (" statement = prepareStatement("INSERT INTO " + tableName + " ("
+ columnUserID + ", " + columnUserID + ", "
+ columnSessionStart + ", " + columnSessionStart + ", "
+ columnSessionEnd + columnSessionEnd + ", "
+ ") VALUES (?, ?, ?)"); + columnDeaths + ", "
for (SessionData session : sessions) { + columnMobKills + ", "
long end = session.getSessionEnd(); + columnServerID
long start = session.getSessionStart(); + ") VALUES ("
if (end < start) { + columnUserID + "=" + usersTable.statementSelectID + ", "
continue; + "?, ?, ?, ?, "
} + serverTable.statementSelectServerID + ")");
statement.setString(1, uuid.toString());
statement.setInt(1, userId); statement.setLong(2, session.getSessionStart());
statement.setLong(2, start); statement.setLong(3, session.getSessionEnd());
statement.setLong(3, end); statement.setInt(4, session.getDeaths());
statement.addBatch(); statement.setInt(5, session.getMobKills());
}
statement.executeBatch(); statement.setString(6, Plan.getServerUUID().toString());
statement.execute();
} finally { } finally {
close(statement); close(statement);
} }
db.getWorldTimesTable().saveWorldTimes(session.getWorldTimes());
db.getKillsTable().savePlayerKills(uuid, session.getPlayerKills());
} }
/** public Map<String, List<Session>> getSessions(UUID uuid) throws SQLException {
* @param ids Map<Integer, String> serverNames = serverTable.getServerNames();
* @return Map<String, List<Session>> sessionsByServer = new HashMap<>();
* @throws SQLException
*/
public Map<Integer, List<SessionData>> getSessionData(Collection<Integer> ids) throws SQLException {
if (ids == null || ids.isEmpty()) {
return new HashMap<>();
}
Benchmark.start("Get Sessions multiple");
PreparedStatement statement = null; PreparedStatement statement = null;
ResultSet set = null; ResultSet set = null;
try { try {
Map<Integer, List<SessionData>> sessions = new HashMap<>(); statement = prepareStatement(Select.from(tableName, "*")
statement = prepareStatement("SELECT * FROM " + tableName); .where(columnUserID + "=" + usersTable.statementSelectID)
.toString());
statement.setString(1, uuid.toString());
set = statement.executeQuery(); set = statement.executeQuery();
for (Integer id : ids) {
sessions.put(id, new ArrayList<>());
}
while (set.next()) { while (set.next()) {
Integer id = set.getInt(columnUserID); long id = set.getLong(columnSessionID);
if (!ids.contains(id)) { long start = set.getLong(columnSessionStart);
continue; long end = set.getLong(columnSessionEnd);
} String serverName = serverNames.get(set.getInt(columnServerID));
long sessionStart = set.getLong(columnSessionStart); int deaths = set.getInt(columnDeaths);
long sessionEnd = set.getLong(columnSessionEnd); int mobKills = set.getInt(columnMobKills);
List<Session> sessions = sessionsByServer.getOrDefault(serverName, new ArrayList<>());
// sessions.get(id).add(new SessionData(sessionStart, sessionEnd)); sessions.add(new Session(id, start, end, deaths, mobKills));
} }
return sessionsByServer;
return sessions;
} finally { } finally {
close(set); close(set, statement);
close(statement);
Benchmark.stop("Database", "Get Sessions multiple");
} }
} }
/**
* @param sessions
* @throws SQLException
*/
public void saveSessionData(Map<Integer, List<SessionData>> sessions) throws SQLException {
if (sessions == null || sessions.isEmpty()) {
return;
}
Benchmark.start("Save Sessions multiple");
Map<Integer, List<SessionData>> saved = getSessionData(sessions.keySet());
for (Map.Entry<Integer, List<SessionData>> entrySet : sessions.entrySet()) {
Integer id = entrySet.getKey();
List<SessionData> sessionList = entrySet.getValue();
List<SessionData> s = saved.get(id);
if (s != null) {
sessionList.removeAll(s);
}
if (sessionList.isEmpty()) {
continue;
}
saved.put(id, sessionList);
}
List<List<Container<SessionData>>> batches = splitIntoBatches(sessions);
batches.forEach(batch -> {
try {
saveSessionBatch(batch);
} catch (SQLException e) {
Log.toLog("SessionsTable.saveSessionData", e);
}
});
Benchmark.stop("Database", "Save Sessions multiple");
}
private void saveSessionBatch(List<Container<SessionData>> batch) throws SQLException {
if (batch.isEmpty()) {
return;
}
PreparedStatement statement = null;
try {
statement = prepareStatement("INSERT INTO " + tableName + " ("
+ columnUserID + ", "
+ columnSessionStart + ", "
+ columnSessionEnd
+ ") VALUES (?, ?, ?)");
for (Container<SessionData> data : batch) {
SessionData session = data.getObject();
int id = data.getId();
if (!session.isValid()) {
continue;
}
statement.setInt(1, id);
statement.setLong(2, session.getSessionStart());
statement.setLong(3, session.getSessionEnd());
statement.addBatch();
}
statement.executeBatch();
} finally {
close(statement);
}
}
public void clean() {
// TODO Clean sessions before Configurable time span
}
} }

View File

@ -14,10 +14,12 @@ import java.sql.SQLException;
*/ */
public abstract class UserIDTable extends Table { public abstract class UserIDTable extends Table {
protected String columnUserID; protected final String columnUserID = "user_id";
protected final UsersTable usersTable;
public UserIDTable(String name, SQLDB db, boolean usingMySQL) { public UserIDTable(String name, SQLDB db, boolean usingMySQL) {
super(name, db, usingMySQL); super(name, db, usingMySQL);
usersTable = db.getUsersTable();
} }
protected boolean removeDataOf(int userID) { protected boolean removeDataOf(int userID) {

View File

@ -3,6 +3,7 @@ package main.java.com.djrapitops.plan.database.tables;
import main.java.com.djrapitops.plan.Log; import main.java.com.djrapitops.plan.Log;
import main.java.com.djrapitops.plan.data.UserData; import main.java.com.djrapitops.plan.data.UserData;
import main.java.com.djrapitops.plan.database.databases.SQLDB; import main.java.com.djrapitops.plan.database.databases.SQLDB;
import main.java.com.djrapitops.plan.database.sql.Select;
import main.java.com.djrapitops.plan.database.sql.Sql; import main.java.com.djrapitops.plan.database.sql.Sql;
import main.java.com.djrapitops.plan.database.sql.TableSqlParser; import main.java.com.djrapitops.plan.database.sql.TableSqlParser;
import main.java.com.djrapitops.plan.utilities.Benchmark; import main.java.com.djrapitops.plan.utilities.Benchmark;
@ -17,8 +18,8 @@ import java.util.*;
*/ */
public class UsersTable extends Table { public class UsersTable extends Table {
private final String columnID; private final String columnID = "id";
private final String columnUUID; private final String columnUUID = "uuid";
@Deprecated @Deprecated
private final String columnGeolocation; private final String columnGeolocation;
@Deprecated @Deprecated
@ -50,14 +51,16 @@ public class UsersTable extends Table {
@Deprecated @Deprecated
private final String columnLastWorld; private final String columnLastWorld;
public final String statementSelectID;
/** /**
* @param db * @param db
* @param usingMySQL * @param usingMySQL
*/ */
public UsersTable(SQLDB db, boolean usingMySQL) { public UsersTable(SQLDB db, boolean usingMySQL) {
super("plan_users", db, usingMySQL); super("plan_users", db, usingMySQL);
columnID = "id"; statementSelectID = "(" + Select.from(tableName, tableName + "." + columnID).where(columnUUID + "=?").toString() + ")";
columnUUID = "uuid";
columnGeolocation = "geolocation"; columnGeolocation = "geolocation";
columnLastGM = "last_gamemode"; columnLastGM = "last_gamemode";
columnLastGMSwapTime = "last_gamemode_swap"; columnLastGMSwapTime = "last_gamemode_swap";

View File

@ -2,6 +2,7 @@ package main.java.com.djrapitops.plan.database.tables;
import com.djrapitops.plugin.utilities.Verify; import com.djrapitops.plugin.utilities.Verify;
import main.java.com.djrapitops.plan.Log; import main.java.com.djrapitops.plan.Log;
import main.java.com.djrapitops.plan.data.time.WorldTimes;
import main.java.com.djrapitops.plan.database.databases.SQLDB; import main.java.com.djrapitops.plan.database.databases.SQLDB;
import main.java.com.djrapitops.plan.database.sql.Sql; import main.java.com.djrapitops.plan.database.sql.Sql;
import main.java.com.djrapitops.plan.database.sql.TableSqlParser; import main.java.com.djrapitops.plan.database.sql.TableSqlParser;
@ -21,13 +22,14 @@ import java.util.Map;
*/ */
public class WorldTimesTable extends UserIDTable { public class WorldTimesTable extends UserIDTable {
private final String columnServerID; //TODO private final String columnServerID = "server_id"; //TODO
private final WorldTable worldTable; private final WorldTable worldTable;
private final String worldIDColumn; private final String worldIDColumn;
private final String worldNameColumn; private final String worldNameColumn;
private final String columnWorldId; private final String columnWorldId = "world_id";
@Deprecated private final String columnPlaytime; @Deprecated
private final String columnPlaytime = "playtime";
//TODO GM Times to World table //TODO GM Times to World table
private final String selectWorldIDsql; private final String selectWorldIDsql;
@ -43,10 +45,6 @@ public class WorldTimesTable extends UserIDTable {
worldTable = db.getWorldTable(); worldTable = db.getWorldTable();
worldIDColumn = worldTable + "." + worldTable.getColumnID(); worldIDColumn = worldTable + "." + worldTable.getColumnID();
worldNameColumn = worldTable.getColumnWorldName(); worldNameColumn = worldTable.getColumnWorldName();
columnWorldId = "world_id";
columnUserID = "user_id";
columnPlaytime = "playtime";
columnServerID = "server_id";
selectWorldIDsql = "(SELECT " + worldIDColumn + " FROM " + worldTable + " WHERE (" + worldNameColumn + "=?))"; selectWorldIDsql = "(SELECT " + worldIDColumn + " FROM " + worldTable + " WHERE (" + worldNameColumn + "=?))";
} }
@ -315,4 +313,8 @@ public class WorldTimesTable extends UserIDTable {
close(statement); close(statement);
} }
} }
public void saveWorldTimes(WorldTimes worldTimes) {
// TODO saveWorldTimes (INSERT)
}
} }

View File

@ -139,7 +139,8 @@ public enum Msg {
HTML_OFFLINE("Html - Offline"), HTML_OFFLINE("Html - Offline"),
HTML_ACTIVE("Html - Active"), HTML_ACTIVE("Html - Active"),
HTML_INACTIVE("Html - Inactive"), HTML_INACTIVE("Html - Inactive"),
HTML_TABLE_NO_KILLS("Html - Table No Kills"),; HTML_TABLE_NO_KILLS("Html - Table No Kills"),
;
private final String identifier; private final String identifier;

View File

@ -1,6 +1,6 @@
package main.java.com.djrapitops.plan.ui.html.graphs; package main.java.com.djrapitops.plan.ui.html.graphs;
import main.java.com.djrapitops.plan.data.SessionData; import main.java.com.djrapitops.plan.data.Session;
import main.java.com.djrapitops.plan.data.TPS; import main.java.com.djrapitops.plan.data.TPS;
import main.java.com.djrapitops.plan.utilities.analysis.Point; import main.java.com.djrapitops.plan.utilities.analysis.Point;
@ -28,7 +28,7 @@ public class PlayerActivityGraphCreator {
return SeriesCreator.seriesGraph(points, true); return SeriesCreator.seriesGraph(points, true);
} }
public static String buildSeriesDataStringSessions(Collection<SessionData> sessions) { public static String buildSeriesDataStringSessions(Collection<Session> sessions) {
List<Point> points = sessions.stream() List<Point> points = sessions.stream()
.map(session -> new Point[]{new Point(session.getSessionStart(), 1), new Point(session.getSessionEnd(), 0)}) .map(session -> new Point[]{new Point(session.getSessionStart(), 1), new Point(session.getSessionEnd(), 0)})
.flatMap(Arrays::stream) .flatMap(Arrays::stream)

View File

@ -5,7 +5,7 @@
*/ */
package main.java.com.djrapitops.plan.ui.html.graphs; package main.java.com.djrapitops.plan.ui.html.graphs;
import main.java.com.djrapitops.plan.data.SessionData; import main.java.com.djrapitops.plan.data.Session;
import main.java.com.djrapitops.plan.utilities.analysis.AnalysisUtils; import main.java.com.djrapitops.plan.utilities.analysis.AnalysisUtils;
import java.util.Collection; import java.util.Collection;
@ -34,7 +34,7 @@ public class PunchCardGraphCreator {
* @param sessions Sessions (Unique/Player) to be placed into the PunchCard. * @param sessions Sessions (Unique/Player) to be placed into the PunchCard.
* @return Data array as a string. * @return Data array as a string.
*/ */
public static String createDataSeries(Collection<SessionData> sessions) { public static String createDataSeries(Collection<Session> sessions) {
List<Long> sessionStarts = getSessionStarts(sessions); List<Long> sessionStarts = getSessionStarts(sessions);
List<int[]> daysAndHours = AnalysisUtils.getDaysAndHours(sessionStarts); List<int[]> daysAndHours = AnalysisUtils.getDaysAndHours(sessionStarts);
int[][] dataArray = createDataArray(daysAndHours); int[][] dataArray = createDataArray(daysAndHours);
@ -75,11 +75,10 @@ public class PunchCardGraphCreator {
return dataArray; return dataArray;
} }
private static List<Long> getSessionStarts(Collection<SessionData> data) { private static List<Long> getSessionStarts(Collection<Session> data) {
return data.stream() return data.stream()
.filter(Objects::nonNull) .filter(Objects::nonNull)
.filter(SessionData::isValid) .map(Session::getSessionStart)
.map(SessionData::getSessionStart)
.sorted() .sorted()
.collect(Collectors.toList()); .collect(Collectors.toList());
} }

View File

@ -44,7 +44,7 @@ public class KillsTableCreator {
break; break;
} }
long date = kill.getDate(); long date = kill.getTime();
IOfflinePlayer victim = Fetch.getIOfflinePlayer(kill.getVictim()); IOfflinePlayer victim = Fetch.getIOfflinePlayer(kill.getVictim());
String name = victim.getName(); String name = victim.getName();

View File

@ -8,6 +8,7 @@ import main.java.com.djrapitops.plan.data.UserData;
/** /**
* @author Rsl1122 * @author Rsl1122
*/ */
@Deprecated // TODO Remove once sure that this is unnecessary.
public class NewPlayerCreator { public class NewPlayerCreator {
/** /**
@ -45,7 +46,6 @@ public class NewPlayerCreator {
* @return a new UserData object * @return a new UserData object
*/ */
public static UserData createNewPlayer(IOfflinePlayer player, Gamemode gm) { public static UserData createNewPlayer(IOfflinePlayer player, Gamemode gm) {
// TODO Rewrite
return null; return null;
} }

View File

@ -3,7 +3,7 @@ package main.java.com.djrapitops.plan.utilities;
import main.java.com.djrapitops.plan.Plan; import main.java.com.djrapitops.plan.Plan;
import main.java.com.djrapitops.plan.Settings; import main.java.com.djrapitops.plan.Settings;
import main.java.com.djrapitops.plan.data.AnalysisData; import main.java.com.djrapitops.plan.data.AnalysisData;
import main.java.com.djrapitops.plan.data.SessionData; import main.java.com.djrapitops.plan.data.Session;
import main.java.com.djrapitops.plan.data.UserData; import main.java.com.djrapitops.plan.data.UserData;
import main.java.com.djrapitops.plan.ui.html.graphs.PunchCardGraphCreator; import main.java.com.djrapitops.plan.ui.html.graphs.PunchCardGraphCreator;
@ -34,7 +34,7 @@ public class PlaceholderUtils {
replaceMap.put("tabContentPlugins", data.replacePluginsTabLayout()); replaceMap.put("tabContentPlugins", data.replacePluginsTabLayout());
// TODO Refresh time for Network pages // TODO Refresh time for Network pages
// replaceMap.put("refresh", FormatUtils.formatTimeAmountDifference(data.getRefreshDate(), MiscUtils.getTime())); // replaceMap.put("refresh", FormatUtils.formatTimeAmountDifference(data.getRefreshDate(), MiscUtils.getDate()));
// replaceMap.put("refreshlong", String.valueOf(data.getRefreshDate())); // replaceMap.put("refreshlong", String.valueOf(data.getRefreshDate()));
replaceMap.put("serverName", Settings.SERVER_NAME.toString()); replaceMap.put("serverName", Settings.SERVER_NAME.toString());
@ -74,7 +74,7 @@ public class PlaceholderUtils {
// replaceMap.put("mobKillCount", data.getMobKills()); // replaceMap.put("mobKillCount", data.getMobKills());
// replaceMap.put("deathCount", data.getDeaths()); // replaceMap.put("deathCount", data.getDeaths());
Set<SessionData> sessions = new HashSet<>(data.getSessions()); Set<Session> sessions = new HashSet<>(data.getSessions());
replaceMap.put("punchCardSeries", PunchCardGraphCreator.createDataSeries(sessions)); replaceMap.put("punchCardSeries", PunchCardGraphCreator.createDataSeries(sessions));
//TODO WorldTimes worldTimes = data.getWorldTimes(); //TODO WorldTimes worldTimes = data.getWorldTimes();
// TODO replaceMap.put("worldSeries", WorldPieCreator.createSeriesData(worldTimes.getTimes())); // TODO replaceMap.put("worldSeries", WorldPieCreator.createSeriesData(worldTimes.getTimes()));

View File

@ -5,7 +5,7 @@ import com.djrapitops.plugin.utilities.Verify;
import main.java.com.djrapitops.plan.Log; import main.java.com.djrapitops.plan.Log;
import main.java.com.djrapitops.plan.Plan; import main.java.com.djrapitops.plan.Plan;
import main.java.com.djrapitops.plan.data.AnalysisData; import main.java.com.djrapitops.plan.data.AnalysisData;
import main.java.com.djrapitops.plan.data.SessionData; import main.java.com.djrapitops.plan.data.Session;
import main.java.com.djrapitops.plan.data.TPS; import main.java.com.djrapitops.plan.data.TPS;
import main.java.com.djrapitops.plan.data.UserData; import main.java.com.djrapitops.plan.data.UserData;
import main.java.com.djrapitops.plan.data.additional.AnalysisType; import main.java.com.djrapitops.plan.data.additional.AnalysisType;
@ -129,8 +129,8 @@ public class Analysis {
rawData.sort(new UserDataLastPlayedComparator()); rawData.sort(new UserDataLastPlayedComparator());
List<UUID> uuids = rawData.stream().map(UserData::getUuid).collect(Collectors.toList()); List<UUID> uuids = rawData.stream().map(UserData::getUuid).collect(Collectors.toList());
Benchmark.start("Create Empty dataset"); Benchmark.start("Create Empty dataset");
DataCache handler = plugin.getHandler(); DataCache dataCache = plugin.getDataCache();
Map<String, Integer> commandUse = handler.getCommandUse(); Map<String, Integer> commandUse = dataCache.getCommandUse();
AnalysisData analysisData = new AnalysisData(commandUse, tpsData); AnalysisData analysisData = new AnalysisData(commandUse, tpsData);
analysisData.setPluginsTabLayout(plugin.getHookHandler().getPluginsTabLayoutForAnalysis()); analysisData.setPluginsTabLayout(plugin.getHookHandler().getPluginsTabLayoutForAnalysis());
@ -305,7 +305,7 @@ public class Analysis {
} }
//TODO List<KillData> playerKills = uData.getPlayerKills(); //TODO List<KillData> playerKills = uData.getPlayerKills();
List<SessionData> sessions = uData.getSessions(); List<Session> sessions = uData.getSessions();
joinInfo.addSessions(uuid, sessions); joinInfo.addSessions(uuid, sessions);
}); });
Benchmark.stop("Analysis", "Fill Dataset"); Benchmark.stop("Analysis", "Fill Dataset");

View File

@ -1,7 +1,7 @@
package main.java.com.djrapitops.plan.utilities.analysis; package main.java.com.djrapitops.plan.utilities.analysis;
import main.java.com.djrapitops.plan.Log; import main.java.com.djrapitops.plan.Log;
import main.java.com.djrapitops.plan.data.SessionData; import main.java.com.djrapitops.plan.data.Session;
import main.java.com.djrapitops.plan.data.additional.AnalysisType; import main.java.com.djrapitops.plan.data.additional.AnalysisType;
import main.java.com.djrapitops.plan.data.additional.PluginData; import main.java.com.djrapitops.plan.data.additional.PluginData;
import main.java.com.djrapitops.plan.utilities.FormatUtils; import main.java.com.djrapitops.plan.utilities.FormatUtils;
@ -62,11 +62,11 @@ public class AnalysisUtils {
* @param data * @param data
* @return * @return
*/ */
public static List<Long> transformSessionDataToLengths(Collection<SessionData> data) { public static List<Long> transformSessionDataToLengths(Collection<Session> data) {
return data.stream() return data.stream()
.filter(Objects::nonNull) .filter(Objects::nonNull)
.filter(session -> session.getLength() > 0) .filter(session -> session.getLength() > 0)
.map(SessionData::getLength) .map(Session::getLength)
.collect(Collectors.toList()); .collect(Collectors.toList());
} }
@ -206,7 +206,7 @@ public class AnalysisUtils {
* @param scale Scale (milliseconds), time before (Current epoch - scale) will be ignored. * @param scale Scale (milliseconds), time before (Current epoch - scale) will be ignored.
* @return Amount of Unique joins within the time span. * @return Amount of Unique joins within the time span.
*/ */
public static int getUniqueJoins(Map<UUID, List<SessionData>> sessions, long scale) { public static int getUniqueJoins(Map<UUID, List<Session>> sessions, long scale) {
long now = MiscUtils.getTime(); long now = MiscUtils.getTime();
long nowMinusScale = now - scale; long nowMinusScale = now - scale;
@ -226,13 +226,13 @@ public class AnalysisUtils {
* @param scale * @param scale
* @return * @return
*/ */
public static int getUniqueJoinsPerDay(Map<UUID, List<SessionData>> sessions, long scale) { public static int getUniqueJoinsPerDay(Map<UUID, List<Session>> sessions, long scale) {
Map<Integer, Set<UUID>> uniqueJoins = new HashMap<>(); Map<Integer, Set<UUID>> uniqueJoins = new HashMap<>();
long now = MiscUtils.getTime(); long now = MiscUtils.getTime();
long nowMinusScale = now - scale; long nowMinusScale = now - scale;
sessions.forEach((uuid, s) -> { sessions.forEach((uuid, s) -> {
for (SessionData session : s) { for (Session session : s) {
if (scale != -1 if (scale != -1
&& session.getSessionStart() < nowMinusScale) { && session.getSessionStart() < nowMinusScale) {
continue; continue;
@ -308,7 +308,7 @@ public class AnalysisUtils {
}).collect(Collectors.toList()); }).collect(Collectors.toList());
} }
private static int getDayOfYear(SessionData session) { private static int getDayOfYear(Session session) {
return getDayOfYear(session.getSessionStart()); return getDayOfYear(session.getSessionStart());
} }

View File

@ -1,23 +0,0 @@
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package main.java.com.djrapitops.plan.utilities.comparators;
import main.java.com.djrapitops.plan.data.handling.info.HandlingInfo;
import java.util.Comparator;
/**
* @author Rsl1122
*/
@Deprecated
public class HandlingInfoTimeComparator implements Comparator<HandlingInfo> {
@Override
public int compare(HandlingInfo o1, HandlingInfo o2) {
return Long.compare(o1.getTime(), o2.getTime());
}
}

View File

@ -11,7 +11,7 @@ public class KillDataComparator implements Comparator<KillData> {
@Override @Override
public int compare(KillData o1, KillData o2) { public int compare(KillData o1, KillData o2) {
return Long.compare(o1.getDate(), o2.getDate()); return Long.compare(o1.getTime(), o2.getTime());
} }
} }

View File

@ -1,16 +1,16 @@
package main.java.com.djrapitops.plan.utilities.comparators; package main.java.com.djrapitops.plan.utilities.comparators;
import main.java.com.djrapitops.plan.data.SessionData; import main.java.com.djrapitops.plan.data.Session;
import java.util.Comparator; import java.util.Comparator;
/** /**
* @author Rsl1122 * @author Rsl1122
*/ */
public class SessionDataComparator implements Comparator<SessionData> { public class SessionDataComparator implements Comparator<Session> {
@Override @Override
public int compare(SessionData s1, SessionData s2) { public int compare(Session s1, Session s2) {
return Long.compare(s1.getSessionStart(), s2.getSessionStart()); return Long.compare(s1.getSessionStart(), s2.getSessionStart());
} }
} }

View File

@ -6,6 +6,7 @@
package test.java.main.java.com.djrapitops.plan.data; package test.java.main.java.com.djrapitops.plan.data;
import main.java.com.djrapitops.plan.data.KillData; import main.java.com.djrapitops.plan.data.KillData;
import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import java.util.UUID; import java.util.UUID;
@ -17,20 +18,27 @@ import static org.junit.Assert.assertEquals;
*/ */
public class KillDataTest { public class KillDataTest {
private KillData test;
private UUID testUUID;
/** /**
* *
*/ */
public KillDataTest() { public KillDataTest() {
} }
@Before
public void setUp() throws Exception {
testUUID = UUID.fromString("71cfb6f0-c3ef-4954-8abe-13fa07afc340");
test = new KillData(testUUID, "TestWeapon", 100L);
}
/** /**
* *
*/ */
@Test @Test
public void testGetVictim() { public void testGetVictim() {
UUID uuid = UUID.fromString("71cfb6f0-c3ef-4954-8abe-13fa07afc340"); assertEquals(test.getVictim(), testUUID);
KillData k = new KillData(uuid, 1, "TestWeapon", 100L);
assertEquals(k.getVictim(), uuid);
} }
/** /**
@ -38,9 +46,7 @@ public class KillDataTest {
*/ */
@Test @Test
public void testGetDate() { public void testGetDate() {
UUID uuid = UUID.fromString("71cfb6f0-c3ef-4954-8abe-13fa07afc340"); assertEquals(test.getTime(), 100L);
KillData k = new KillData(uuid, 1, "TestWeapon", 100L);
assertEquals(k.getDate(), 100L);
} }
/** /**
@ -48,19 +54,6 @@ public class KillDataTest {
*/ */
@Test @Test
public void testGetWeapon() { public void testGetWeapon() {
UUID uuid = UUID.fromString("71cfb6f0-c3ef-4954-8abe-13fa07afc340"); assertEquals(test.getWeapon(), "TestWeapon");
KillData k = new KillData(uuid, 1, "TestWeapon", 100L);
assertEquals(k.getWeapon(), "TestWeapon");
} }
/**
*
*/
@Test
public void testGetVictimUserID() {
UUID uuid = UUID.fromString("71cfb6f0-c3ef-4954-8abe-13fa07afc340");
KillData k = new KillData(uuid, 1, "TestWeapon", 100L);
assertEquals(k.getVictimUserID(), 1);
}
} }

View File

@ -5,20 +5,20 @@
*/ */
package test.java.main.java.com.djrapitops.plan.data; package test.java.main.java.com.djrapitops.plan.data;
import main.java.com.djrapitops.plan.data.SessionData; import main.java.com.djrapitops.plan.data.Session;
import org.junit.Before; import org.junit.Before;
/** /**
* @author Rsl1122 * @author Rsl1122
*/ */
public class SessionDataTest { public class SessionTest {
private SessionData test; private Session test;
/** /**
* *
*/ */
public SessionDataTest() { public SessionTest() {
} }
/** /**
@ -26,7 +26,6 @@ public class SessionDataTest {
*/ */
@Before @Before
public void setUp() { public void setUp() {
test = new SessionData(0);
} }
/** /**

View File

@ -21,7 +21,7 @@ import org.powermock.modules.junit4.PowerMockRunner;
public class DataCacheTest { public class DataCacheTest {
private Database db; private Database db;
private DataCache handler; private DataCache dataCache;
private int callsToSaveCommandUse; private int callsToSaveCommandUse;
private int callsToSaveUserData; private int callsToSaveUserData;

View File

@ -12,9 +12,7 @@ import test.java.utils.TestInit;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
import static junit.framework.TestCase.assertEquals; import static junit.framework.TestCase.*;
import static junit.framework.TestCase.assertFalse;
import static junit.framework.TestCase.assertTrue;
/** /**
* @author Fuzzlemann * @author Fuzzlemann
@ -27,6 +25,7 @@ public class GeolocationCacheTest {
@Before @Before
public void setUp() { public void setUp() {
GeolocationCacheHandler.clearCache();
ipsToCountries.put("8.8.8.8", "United States"); ipsToCountries.put("8.8.8.8", "United States");
ipsToCountries.put("8.8.4.4", "United States"); ipsToCountries.put("8.8.4.4", "United States");
ipsToCountries.put("4.4.2.2", "United States"); ipsToCountries.put("4.4.2.2", "United States");
@ -46,7 +45,7 @@ public class GeolocationCacheTest {
String ip = entry.getKey(); String ip = entry.getKey();
String expCountry = entry.getValue(); String expCountry = entry.getValue();
String country = GeolocationCacheHandler.getUncachedCountry(ip); String country = GeolocationCacheHandler.getCountry(ip);
assertEquals(country, expCountry); assertEquals(country, expCountry);
} }
@ -60,15 +59,12 @@ public class GeolocationCacheTest {
String ip = entry.getKey(); String ip = entry.getKey();
String expIp = entry.getValue(); String expIp = entry.getValue();
String countryFirstCall = GeolocationCacheHandler.getUncachedCountry(ip);
assertFalse(GeolocationCacheHandler.isCached(ip)); assertFalse(GeolocationCacheHandler.isCached(ip));
String countrySecondCall = GeolocationCacheHandler.getCountry(ip); String countrySecondCall = GeolocationCacheHandler.getCountry(ip);
assertTrue(GeolocationCacheHandler.isCached(ip)); assertTrue(GeolocationCacheHandler.isCached(ip));
String countryThirdCall = GeolocationCacheHandler.getCachedCountry(ip); String countryThirdCall = GeolocationCacheHandler.getCountry(ip);
assertEquals(countryFirstCall, countrySecondCall);
assertEquals(countrySecondCall, countryThirdCall); assertEquals(countrySecondCall, countryThirdCall);
assertEquals(countryThirdCall, expIp); assertEquals(countryThirdCall, expIp);
} }

View File

@ -34,7 +34,7 @@ public class QueueTest {
private final UUID uuid1 = MockUtils.getPlayerUUID(); private final UUID uuid1 = MockUtils.getPlayerUUID();
private DataCache handler; private DataCache dataCache;
private Database db; private Database db;
public QueueTest() { public QueueTest() {
@ -51,12 +51,12 @@ public class QueueTest {
}; };
db.init(); db.init();
when(plan.getDB()).thenReturn(db); when(plan.getDB()).thenReturn(db);
handler = new DataCache(plan) { dataCache = new DataCache(plan) {
@Override @Override
public void startAsyncPeriodicSaveTask() { public void startAsyncPeriodicSaveTask() {
} }
}; };
when(plan.getHandler()).thenReturn(handler); when(plan.getDataCache()).thenReturn(dataCache);
} }
@After @After
@ -68,21 +68,6 @@ public class QueueTest {
public void testProcessQueue() { public void testProcessQueue() {
List<Integer> processCalls = new ArrayList<>(); List<Integer> processCalls = new ArrayList<>();
List<Integer> errors = new ArrayList<>(); List<Integer> errors = new ArrayList<>();
// handler.addToPool(new HandlingInfo(uuid1, InfoType.OTHER, 0) { // TODO Rewrite
// @Override
// public void process(UserData uData) {
// if (uData.equals(data1)) {
// uData.setName("TestSuccessful");
// processCalls.add(1);
// } else {
// errors.add(1);
// }
// }
// });
// while (processCalls.size() < 1) {
// if (errors.size() > 0) {
// fail();
// }
// }
} }
} }

View File

@ -171,5 +171,5 @@ public class WorldTimesTest {
assertEquals(2000L, worldOneGMTimes.getTime("ADVENTURE")); assertEquals(2000L, worldOneGMTimes.getTime("ADVENTURE"));
} }
// TODO Test where SessionData is ended, check if worldTimes & session length add up. // TODO Test where Session is ended, check if worldTimes & session length add up.
} }

View File

@ -68,6 +68,14 @@ public class DatabaseCommitTest {
assertTrue("Errors were caught.", rows == rowsAgain); assertTrue("Errors were caught.", rows == rowsAgain);
} }
@Test
public void testNoExceptionWhenCommitEmpty() throws SQLException {
db.init();
db.commit();
db.commit();
db.commit();
}
@Test @Test
public void testCommitToDBFile() throws SQLException { public void testCommitToDBFile() throws SQLException {
db.init(); db.init();

View File

@ -5,7 +5,7 @@
*/ */
package test.java.main.java.com.djrapitops.plan.utilities.analysis; package test.java.main.java.com.djrapitops.plan.utilities.analysis;
import main.java.com.djrapitops.plan.data.SessionData; import main.java.com.djrapitops.plan.data.Session;
import main.java.com.djrapitops.plan.utilities.MiscUtils; import main.java.com.djrapitops.plan.utilities.MiscUtils;
import main.java.com.djrapitops.plan.utilities.analysis.AnalysisUtils; import main.java.com.djrapitops.plan.utilities.analysis.AnalysisUtils;
import org.bukkit.plugin.java.JavaPlugin; import org.bukkit.plugin.java.JavaPlugin;
@ -122,10 +122,9 @@ public class AnalysisUtilsTest {
*/ */
@Test @Test
public void testTransformSessionDataToLengths() { public void testTransformSessionDataToLengths() {
Collection<SessionData> data = new ArrayList<>(); Collection<Session> data = new ArrayList<>();
data.add(new SessionData(0L, 5L, null, null, 0, 0)); data.add(new Session(0L, 5L, null, null, 0, 0));
data.add(new SessionData(0, 20L, null, null, 0, 0)); data.add(new Session(0, 20L, null, null, 0, 0));
data.add(new SessionData(0));
List<Long> expResult = new ArrayList<>(); List<Long> expResult = new ArrayList<>();
expResult.add(5L); expResult.add(5L);
expResult.add(20L); expResult.add(20L);

View File

@ -1,10 +1,9 @@
package test.java.main.java.com.djrapitops.plan.utilities.comparators; package test.java.main.java.com.djrapitops.plan.utilities.comparators;
import main.java.com.djrapitops.plan.data.SessionData; import main.java.com.djrapitops.plan.data.Session;
import main.java.com.djrapitops.plan.data.TPS; import main.java.com.djrapitops.plan.data.TPS;
import main.java.com.djrapitops.plan.data.UserData; import main.java.com.djrapitops.plan.data.UserData;
import main.java.com.djrapitops.plan.data.WebUser; import main.java.com.djrapitops.plan.data.WebUser;
import main.java.com.djrapitops.plan.data.handling.info.HandlingInfo;
import main.java.com.djrapitops.plan.locale.Message; import main.java.com.djrapitops.plan.locale.Message;
import main.java.com.djrapitops.plan.locale.Msg; import main.java.com.djrapitops.plan.locale.Msg;
import main.java.com.djrapitops.plan.utilities.PassEncryptUtil; import main.java.com.djrapitops.plan.utilities.PassEncryptUtil;
@ -20,16 +19,6 @@ import static org.junit.Assert.assertEquals;
public class ComparatorTest { public class ComparatorTest {
@Test
public void testHandlingInfoComparator() {
List<HandlingInfo> test = RandomData.randomHandlingInfo();
List<Long> longValues = test.stream().map(HandlingInfo::getTime).collect(Collectors.toList());
longValues.sort(Long::compare);
test.sort(new HandlingInfoTimeComparator());
List<Long> afterSort = test.stream().map(HandlingInfo::getTime).collect(Collectors.toList());
assertEquals(longValues, afterSort);
}
@Test @Test
public void testPointComparator() { public void testPointComparator() {
List<Point> test = RandomData.randomPoints(); List<Point> test = RandomData.randomPoints();
@ -43,11 +32,11 @@ public class ComparatorTest {
@Test @Test
public void testSessionDataComparator() { public void testSessionDataComparator() {
List<SessionData> test = RandomData.randomSessions(); List<Session> test = RandomData.randomSessions();
List<Long> longValues = test.stream().map(SessionData::getSessionStart).collect(Collectors.toList()); List<Long> longValues = test.stream().map(Session::getSessionStart).collect(Collectors.toList());
longValues.sort(Long::compare); longValues.sort(Long::compare);
test.sort(new SessionDataComparator()); test.sort(new SessionDataComparator());
List<Long> afterSort = test.stream().map(SessionData::getSessionStart).collect(Collectors.toList()); List<Long> afterSort = test.stream().map(Session::getSessionStart).collect(Collectors.toList());
assertEquals(longValues, afterSort); assertEquals(longValues, afterSort);
} }

View File

@ -1,11 +1,9 @@
package test.java.utils; package test.java.utils;
import main.java.com.djrapitops.plan.data.SessionData; import main.java.com.djrapitops.plan.data.Session;
import main.java.com.djrapitops.plan.data.TPS; import main.java.com.djrapitops.plan.data.TPS;
import main.java.com.djrapitops.plan.data.UserData; import main.java.com.djrapitops.plan.data.UserData;
import main.java.com.djrapitops.plan.data.WebUser; import main.java.com.djrapitops.plan.data.WebUser;
import main.java.com.djrapitops.plan.data.handling.info.HandlingInfo;
import main.java.com.djrapitops.plan.data.handling.info.InfoType;
import main.java.com.djrapitops.plan.utilities.PassEncryptUtil; import main.java.com.djrapitops.plan.utilities.PassEncryptUtil;
import main.java.com.djrapitops.plan.utilities.analysis.Point; import main.java.com.djrapitops.plan.utilities.analysis.Point;
import org.apache.commons.lang.RandomStringUtils; import org.apache.commons.lang.RandomStringUtils;
@ -13,7 +11,6 @@ import org.apache.commons.lang.RandomStringUtils;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Random; import java.util.Random;
import java.util.UUID;
import java.util.concurrent.ThreadLocalRandom; import java.util.concurrent.ThreadLocalRandom;
public class RandomData { public class RandomData {
@ -46,10 +43,10 @@ public class RandomData {
return test; return test;
} }
public static List<SessionData> randomSessions() { public static List<Session> randomSessions() {
List<SessionData> test = new ArrayList<>(); List<Session> test = new ArrayList<>();
for (int i = 0; i < 20; i++) { for (int i = 0; i < 20; i++) {
test.add(new SessionData(r.nextLong(), r.nextLong(), null, null, 0, 0)); test.add(new Session(r.nextLong(), r.nextLong(), null, null, 0, 0));
} }
return test; return test;
} }
@ -62,19 +59,6 @@ public class RandomData {
return test; return test;
} }
public static List<HandlingInfo> randomHandlingInfo() {
List<HandlingInfo> test = new ArrayList<>();
for (int i = 0; i < 20; i++) {
test.add(new HandlingInfo(UUID.randomUUID(), randomEnum(InfoType.class), r.nextLong()) {
@Override
public void process(UserData uData) {
}
});
}
return test;
}
public static <T extends Enum> T randomEnum(Class<T> clazz) { public static <T extends Enum> T randomEnum(Class<T> clazz) {
int x = r.nextInt(clazz.getEnumConstants().length); int x = r.nextInt(clazz.getEnumConstants().length);
return clazz.getEnumConstants()[x]; return clazz.getEnumConstants()[x];