From 997ec683aee38f9c8719dff72636cf102df378ab Mon Sep 17 00:00:00 2001 From: Rsl1122 Date: Tue, 22 Aug 2017 10:44:05 +0300 Subject: [PATCH] Renamed SessionData to Session Started work on Login Processing Changed some GeolocationCache public access methods to private. --- Plan/dependency-reduced-pom.xml | 20 +++- .../main/java/com/djrapitops/plan/Plan.java | 8 +- .../data/{SessionData.java => Session.java} | 91 ++++++++++++++----- .../com/djrapitops/plan/data/UserData.java | 8 +- .../plan/data/analysis/ActivityPart.java | 6 +- .../plan/data/analysis/JoinInfoPart.java | 10 +- .../data/cache/GeolocationCacheHandler.java | 8 +- .../plan/data/cache/SessionCache.java | 20 ++-- .../plan/data/handling/PlayerProcessor.java | 30 ++++++ .../handling/login/IPUpdateProcessor.java | 32 +++++++ .../handling/login/RegisterProcessor.java | 36 ++++++++ .../data/listeners/PlanPlayerListener.java | 27 ++++-- .../plan/data/listeners/TPSCountTimer.java | 7 ++ .../plan/database/databases/SQLDB.java | 4 +- .../plan/database/tables/SessionsTable.java | 40 ++++---- .../graphs/PlayerActivityGraphCreator.java | 4 +- .../ui/html/graphs/PunchCardGraphCreator.java | 9 +- .../plan/utilities/PlaceholderUtils.java | 4 +- .../plan/utilities/analysis/Analysis.java | 4 +- .../utilities/analysis/AnalysisUtils.java | 14 +-- .../comparators/SessionDataComparator.java | 6 +- ...{SessionDataTest.java => SessionTest.java} | 9 +- .../plan/data/cache/GeolocationCacheTest.java | 12 +-- .../plan/data/time/WorldTimesTest.java | 2 +- .../utilities/analysis/AnalysisUtilsTest.java | 9 +- .../utilities/comparators/ComparatorTest.java | 8 +- Plan/test/test/java/utils/RandomData.java | 8 +- 27 files changed, 305 insertions(+), 131 deletions(-) rename Plan/src/main/java/com/djrapitops/plan/data/{SessionData.java => Session.java} (60%) create mode 100644 Plan/src/main/java/com/djrapitops/plan/data/handling/PlayerProcessor.java create mode 100644 Plan/src/main/java/com/djrapitops/plan/data/handling/login/IPUpdateProcessor.java create mode 100644 Plan/src/main/java/com/djrapitops/plan/data/handling/login/RegisterProcessor.java rename Plan/test/test/java/main/java/com/djrapitops/plan/data/{SessionDataTest.java => SessionTest.java} (70%) diff --git a/Plan/dependency-reduced-pom.xml b/Plan/dependency-reduced-pom.xml index aa0691c29..49e4a1d31 100644 --- a/Plan/dependency-reduced-pom.xml +++ b/Plan/dependency-reduced-pom.xml @@ -14,10 +14,26 @@ ${basedir}/src/main/resources *.keystore - *.js + *.css *.yml *.html - *.txt + + + licence.yml + + + + . + ${basedir}/src/main/resources/html + + *.html + + + + . + ${basedir}/src/main/resources/js + + *.js diff --git a/Plan/src/main/java/com/djrapitops/plan/Plan.java b/Plan/src/main/java/com/djrapitops/plan/Plan.java index dabcfdff0..0a40beb30 100644 --- a/Plan/src/main/java/com/djrapitops/plan/Plan.java +++ b/Plan/src/main/java/com/djrapitops/plan/Plan.java @@ -83,6 +83,7 @@ public class Plan extends BukkitPlugin { private ServerInfoManager serverInfoManager; private ServerVariableHolder serverVariableHolder; + private TPSCountTimer tpsCountTimer; private int bootAnalysisTaskID = -1; /** @@ -162,7 +163,8 @@ public class Plan extends BukkitPlugin { this.analysisCache = new AnalysisCacheHandler(this); 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(); this.api = new API(this); @@ -472,6 +474,10 @@ public class Plan extends BukkitPlugin { return processingQueue; } + public TPSCountTimer getTpsCountTimer() { + return tpsCountTimer; + } + public void addToProcessQueue(Processor processor) { processingQueue.addToQueue(processor); } diff --git a/Plan/src/main/java/com/djrapitops/plan/data/SessionData.java b/Plan/src/main/java/com/djrapitops/plan/data/Session.java similarity index 60% rename from Plan/src/main/java/com/djrapitops/plan/data/SessionData.java rename to Plan/src/main/java/com/djrapitops/plan/data/Session.java index 7d9250c73..c07107705 100644 --- a/Plan/src/main/java/com/djrapitops/plan/data/SessionData.java +++ b/Plan/src/main/java/com/djrapitops/plan/data/Session.java @@ -6,34 +6,38 @@ import java.util.ArrayList; import java.util.List; /** - * This class is used for storing start and end of a play session inside UserData - * object. + * Object for storing various information about a player's play session. + *

+ * Includes: + *

    + *
  • World & GameMode playtimes
  • + *
  • Player & Mob kills
  • + *
  • Deaths
  • + *
+ *

+ * Following data can be derived from Sessions in the database (Between any time span): + *

    + *
  • Playtime
  • + *
  • LoginTimes
  • + *
* * @author Rsl1122 */ -public class SessionData { +public class Session { - private final WorldTimes worldTimes; // TODO add World Times to SessionData + private final WorldTimes worldTimes; private final long sessionStart; private long sessionEnd; private final List playerKills; private int mobKills; 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. * * @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.sessionStart = sessionStart; this.sessionEnd = -1; @@ -48,7 +52,7 @@ public class SessionData { * @param sessionStart Epoch millisecond the session was started. * @param sessionEnd Epoch millisecond the session ended. */ - public SessionData(long sessionStart, long sessionEnd, WorldTimes worldTimes, List playerKills, int mobKills, int deaths) { + public Session(long sessionStart, long sessionEnd, WorldTimes worldTimes, List playerKills, int mobKills, int deaths) { this.sessionStart = sessionStart; this.sessionEnd = sessionEnd; this.worldTimes = worldTimes; @@ -69,6 +73,29 @@ public class SessionData { 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. * @@ -96,14 +123,20 @@ public class SessionData { return sessionEnd; } - /** - * Check if the session start was before the end. - * - * @return Is the length positive? - */ - @Deprecated // TODO Remove - public boolean isValid() { - return sessionStart <= sessionEnd; + public WorldTimes getWorldTimes() { + return worldTimes; + } + + public List getPlayerKills() { + return playerKills; + } + + public int getMobKills() { + return mobKills; + } + + public int getDeaths() { + return deaths; } @Override @@ -117,7 +150,7 @@ public class SessionData { if (getClass() != obj.getClass()) { return false; } - final SessionData other = (SessionData) obj; + final Session other = (Session) obj; return this.sessionStart == other.sessionStart && this.sessionEnd == other.sessionEnd; } @@ -128,4 +161,16 @@ public class SessionData { hash = 97 * hash + (int) (this.sessionEnd ^ (this.sessionEnd >>> 32)); 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); + } } diff --git a/Plan/src/main/java/com/djrapitops/plan/data/UserData.java b/Plan/src/main/java/com/djrapitops/plan/data/UserData.java index de4a6b551..0803ef5c4 100644 --- a/Plan/src/main/java/com/djrapitops/plan/data/UserData.java +++ b/Plan/src/main/java/com/djrapitops/plan/data/UserData.java @@ -11,7 +11,7 @@ import java.util.*; // TODO Change to be only used for DB User Get Query responses. public class UserData { - private final List sessions; + private final List sessions; private int accessing; private boolean clearAfterSave; private UUID uuid; @@ -31,8 +31,6 @@ public class UserData { @Deprecated private boolean isBanned; //TODO DB Update code to JoinListener @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) @Deprecated private long lastPlayed; //TODO DB Update code to Join, Refresh, QuitListener @@ -173,9 +171,9 @@ public class UserData { /** * Get the sessions of a player. * - * @return a list of SessionData. + * @return a list of Session. */ - public List getSessions() { + public List getSessions() { return sessions; } diff --git a/Plan/src/main/java/com/djrapitops/plan/data/analysis/ActivityPart.java b/Plan/src/main/java/com/djrapitops/plan/data/analysis/ActivityPart.java index e7043f9d8..ac97969e1 100644 --- a/Plan/src/main/java/com/djrapitops/plan/data/analysis/ActivityPart.java +++ b/Plan/src/main/java/com/djrapitops/plan/data/analysis/ActivityPart.java @@ -2,7 +2,7 @@ package main.java.com.djrapitops.plan.data.analysis; import com.djrapitops.plugin.api.TimeAmount; 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.ui.html.graphs.PlayerActivityGraphCreator; import main.java.com.djrapitops.plan.ui.html.graphs.PunchCardGraphCreator; @@ -72,13 +72,13 @@ public class ActivityPart extends RawData { playerActivityGraphs(); - final List sessions = joins.getAllSessions(); + final List sessions = joins.getAllSessions(); List lengths = AnalysisUtils.transformSessionDataToLengths(sessions); long averageLength = MathUtils.averageLong(lengths); addValue("sessionAverage", FormatUtils.formatTimeAmount(averageLength)); - List sessionsMonth = sessions.stream() + List sessionsMonth = sessions.stream() .filter(s -> s.getSessionStart() > MiscUtils.getTime() - TimeAmount.MONTH.ms()) .collect(Collectors.toList()); addValue("punchCardSeries", PunchCardGraphCreator.createDataSeries(sessionsMonth)); diff --git a/Plan/src/main/java/com/djrapitops/plan/data/analysis/JoinInfoPart.java b/Plan/src/main/java/com/djrapitops/plan/data/analysis/JoinInfoPart.java index 8cb6955a9..66d7a3c3c 100644 --- a/Plan/src/main/java/com/djrapitops/plan/data/analysis/JoinInfoPart.java +++ b/Plan/src/main/java/com/djrapitops/plan/data/analysis/JoinInfoPart.java @@ -2,7 +2,7 @@ package main.java.com.djrapitops.plan.data.analysis; import com.djrapitops.plugin.api.TimeAmount; 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.analysis.AnalysisUtils; @@ -36,7 +36,7 @@ import java.util.stream.Collectors; */ public class JoinInfoPart extends RawData { - private final Map> sessions; + private final Map> sessions; private final List registered; private long loginTimes; @@ -108,11 +108,11 @@ public class JoinInfoPart extends RawData { return loginTimes; } - public Map> getSessions() { + public Map> getSessions() { return sessions; } - public List getAllSessions() { + public List getAllSessions() { return MiscUtils.flatMap(sessions.values()); } @@ -124,7 +124,7 @@ public class JoinInfoPart extends RawData { return registered; } - public void addSessions(UUID uuid, List sessions) { + public void addSessions(UUID uuid, List sessions) { Verify.nullCheck(uuid); Verify.nullCheck(sessions); this.sessions.put(uuid, sessions.stream().distinct().collect(Collectors.toList())); diff --git a/Plan/src/main/java/com/djrapitops/plan/data/cache/GeolocationCacheHandler.java b/Plan/src/main/java/com/djrapitops/plan/data/cache/GeolocationCacheHandler.java index 220dadff0..97b977304 100644 --- a/Plan/src/main/java/com/djrapitops/plan/data/cache/GeolocationCacheHandler.java +++ b/Plan/src/main/java/com/djrapitops/plan/data/cache/GeolocationCacheHandler.java @@ -69,7 +69,7 @@ public class GeolocationCacheHandler { * @see http://freegeoip.net * @see #getCountry(String) */ - public static String getUncachedCountry(String ipAddress) { + private static String getUncachedCountry(String ipAddress) { URL url; 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 * @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); } @@ -114,4 +114,8 @@ public class GeolocationCacheHandler { public static boolean isCached(String ipAddress) { return geolocationCache.asMap().containsKey(ipAddress); } + + public static void clearCache() { + geolocationCache.invalidateAll(); + } } diff --git a/Plan/src/main/java/com/djrapitops/plan/data/cache/SessionCache.java b/Plan/src/main/java/com/djrapitops/plan/data/cache/SessionCache.java index 30616e69d..4a73d8c78 100644 --- a/Plan/src/main/java/com/djrapitops/plan/data/cache/SessionCache.java +++ b/Plan/src/main/java/com/djrapitops/plan/data/cache/SessionCache.java @@ -1,6 +1,6 @@ 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.Map; @@ -14,7 +14,7 @@ import java.util.UUID; */ public class SessionCache { - private static final Map activeSessions = new HashMap<>(); + private static final Map activeSessions = new HashMap<>(); /** * Class Constructor. @@ -22,17 +22,17 @@ public class SessionCache { public SessionCache() { } - public void cacheSession(UUID uuid, SessionData session) { + public void cacheSession(UUID uuid, Session session) { activeSessions.put(uuid, session); } public void endSession(UUID uuid, long time) { - SessionData session = activeSessions.get(uuid); + Session session = activeSessions.get(uuid); if (session == null) { return; } session.endSession(time); - + // TODO DB Save the session. } /** @@ -54,13 +54,13 @@ 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. - * @return SessionData or null if not cached. + * @return Session or null if not cached. */ @Deprecated - public SessionData getSession(UUID uuid) { + public Session getSession(UUID uuid) { return activeSessions.get(uuid); } @@ -69,10 +69,10 @@ public class SessionCache { *

* Used for testing. * - * @return key:value UUID:SessionData + * @return key:value UUID:Session */ @Deprecated - public Map getActiveSessions() { + public Map getActiveSessions() { return activeSessions; } } diff --git a/Plan/src/main/java/com/djrapitops/plan/data/handling/PlayerProcessor.java b/Plan/src/main/java/com/djrapitops/plan/data/handling/PlayerProcessor.java new file mode 100644 index 000000000..99bab8a4f --- /dev/null +++ b/Plan/src/main/java/com/djrapitops/plan/data/handling/PlayerProcessor.java @@ -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; + +import main.java.com.djrapitops.plan.queue.processing.Processor; + +import java.util.UUID; + +/** + * Abstract Processor that takes UUID as a parameter. + *

+ * Created to allow extending processors to use Generics. + * + * @author Rsl1122 + */ +public abstract class PlayerProcessor extends Processor { + + public PlayerProcessor(UUID uuid) { + super(uuid); + } + + protected UUID getUUID() { + return object; + } + + @Override + public abstract void process(); +} \ No newline at end of file diff --git a/Plan/src/main/java/com/djrapitops/plan/data/handling/login/IPUpdateProcessor.java b/Plan/src/main/java/com/djrapitops/plan/data/handling/login/IPUpdateProcessor.java new file mode 100644 index 000000000..416dfc0af --- /dev/null +++ b/Plan/src/main/java/com/djrapitops/plan/data/handling/login/IPUpdateProcessor.java @@ -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.login; + +import main.java.com.djrapitops.plan.data.cache.GeolocationCacheHandler; +import main.java.com.djrapitops.plan.data.handling.PlayerProcessor; + +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(); + GeolocationCacheHandler.getCountry(ip); + // TODO DB Update IP & Geolocation + } +} \ No newline at end of file diff --git a/Plan/src/main/java/com/djrapitops/plan/data/handling/login/RegisterProcessor.java b/Plan/src/main/java/com/djrapitops/plan/data/handling/login/RegisterProcessor.java new file mode 100644 index 000000000..3d7ce68b9 --- /dev/null +++ b/Plan/src/main/java/com/djrapitops/plan/data/handling/login/RegisterProcessor.java @@ -0,0 +1,36 @@ +/* + * 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.login; + +import main.java.com.djrapitops.plan.Plan; +import main.java.com.djrapitops.plan.data.handling.PlayerProcessor; + +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 + } +} \ No newline at end of file diff --git a/Plan/src/main/java/com/djrapitops/plan/data/listeners/PlanPlayerListener.java b/Plan/src/main/java/com/djrapitops/plan/data/listeners/PlanPlayerListener.java index 5e8f824e4..bccf84427 100644 --- a/Plan/src/main/java/com/djrapitops/plan/data/listeners/PlanPlayerListener.java +++ b/Plan/src/main/java/com/djrapitops/plan/data/listeners/PlanPlayerListener.java @@ -5,11 +5,13 @@ 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.data.Session; import main.java.com.djrapitops.plan.data.UserData; 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.info.LoginInfo; import main.java.com.djrapitops.plan.data.handling.info.LogoutInfo; +import main.java.com.djrapitops.plan.data.handling.login.RegisterProcessor; import main.java.com.djrapitops.plan.utilities.MiscUtils; import main.java.com.djrapitops.plan.utilities.NewPlayerCreator; import org.bukkit.entity.Player; @@ -32,18 +34,18 @@ import java.util.UUID; public class PlanPlayerListener implements Listener { private final Plan plugin; - private final DataCache handler; + private final DataCache cache; /** * Class Constructor. *

- * Copies the references to multiple handlers from Current instance of handler. + * Copies the references to multiple handlers from Current instance of cache. * * @param plugin Current instance of Plan */ public PlanPlayerListener(Plan plugin) { this.plugin = plugin; - handler = plugin.getHandler(); + cache = plugin.getHandler(); } /** @@ -63,7 +65,16 @@ public class PlanPlayerListener implements Listener { plugin.getNotificationCenter().checkNotifications(iPlayer); UUID uuid = player.getUniqueId(); - handler.startSession(uuid); + String world = player.getWorld().getName(); + String gm = player.getGameMode().name(); + long time = MiscUtils.getTime(); + + int playersOnline = plugin.getTpsCountTimer().getLatestPlayersOnline(); + + cache.cacheSession(uuid, Session.start(time, world, gm)); + + plugin.addToProcessQueue(new RegisterProcessor(uuid, time, playersOnline)); + plugin.getRunnableFactory().createNew(new AbsRunnable("NewPlayerCheckTask") { @Override public void run() { @@ -80,9 +91,9 @@ public class PlanPlayerListener implements Listener { if (isNewPlayer) { UserData newUserData = NewPlayerCreator.createNewPlayer(iPlayer); loginInfo.process(newUserData); - // TODO Rewrite Register & Login system handler.newPlayer(newUserData); + // TODO Rewrite Register & Login system cache.newPlayer(newUserData); } else { - // handler.addToPool(loginInfo); + // cache.addToPool(loginInfo); } this.cancel(); } @@ -101,7 +112,7 @@ public class PlanPlayerListener implements Listener { // TODO Rewrite Logout system Player player = event.getPlayer(); UUID uuid = player.getUniqueId(); - handler.endSession(uuid); + cache.endSession(uuid); long time = MiscUtils.getTime(); boolean banned = player.isBanned(); @@ -127,7 +138,7 @@ public class PlanPlayerListener implements Listener { Player player = event.getPlayer(); UUID uuid = player.getUniqueId(); - handler.endSession(uuid); + cache.endSession(uuid); long time = MiscUtils.getTime(); boolean banned = player.isBanned(); diff --git a/Plan/src/main/java/com/djrapitops/plan/data/listeners/TPSCountTimer.java b/Plan/src/main/java/com/djrapitops/plan/data/listeners/TPSCountTimer.java index 65a281b44..41ef6a345 100644 --- a/Plan/src/main/java/com/djrapitops/plan/data/listeners/TPSCountTimer.java +++ b/Plan/src/main/java/com/djrapitops/plan/data/listeners/TPSCountTimer.java @@ -27,6 +27,8 @@ public class TPSCountTimer extends AbsRunnable { private final List history; private long lastCheckNano; + private int latestPlayersOnline = 0; + public TPSCountTimer(Plan plugin) { super("TPSCountTimer"); lastCheckNano = -1; @@ -79,6 +81,7 @@ public class TPSCountTimer extends AbsRunnable { long usedMemory = (totalMemory - runtime.freeMemory()) / 1000000; int playersOnline = plugin.getServer().getOnlinePlayers().size(); + latestPlayersOnline = playersOnline; int loadedChunks = getLoadedChunks(); int entityCount; @@ -167,4 +170,8 @@ public class TPSCountTimer extends AbsRunnable { private int getEntityCountPaper() { return plugin.getServer().getWorlds().stream().mapToInt(World::getEntityCount).sum(); } + + public int getLatestPlayersOnline() { + return latestPlayersOnline; + } } diff --git a/Plan/src/main/java/com/djrapitops/plan/database/databases/SQLDB.java b/Plan/src/main/java/com/djrapitops/plan/database/databases/SQLDB.java index 68f545b35..e7a514a0f 100644 --- a/Plan/src/main/java/com/djrapitops/plan/database/databases/SQLDB.java +++ b/Plan/src/main/java/com/djrapitops/plan/database/databases/SQLDB.java @@ -4,7 +4,7 @@ import com.djrapitops.plugin.task.AbsRunnable; import main.java.com.djrapitops.plan.Log; import main.java.com.djrapitops.plan.Plan; import main.java.com.djrapitops.plan.data.KillData; -import main.java.com.djrapitops.plan.data.SessionData; +import main.java.com.djrapitops.plan.data.Session; import main.java.com.djrapitops.plan.data.UserData; import main.java.com.djrapitops.plan.database.Database; import main.java.com.djrapitops.plan.database.tables.*; @@ -363,7 +363,7 @@ public abstract class SQLDB extends Database { Map> nicknames = nicknamesTable.getNicknames(ids); Map> ipList = ipsTable.getIPList(ids); Map> playerKills = killsTable.getPlayerKills(ids, idUuidRel); - Map> sessionData = sessionsTable.getSessionData(ids); + Map> sessionData = sessionsTable.getSessionData(ids); Map> worldTimes = worldTimesTable.getWorldTimes(ids); Log.debug("Database", diff --git a/Plan/src/main/java/com/djrapitops/plan/database/tables/SessionsTable.java b/Plan/src/main/java/com/djrapitops/plan/database/tables/SessionsTable.java index cbcc08f4c..4aeffd76d 100644 --- a/Plan/src/main/java/com/djrapitops/plan/database/tables/SessionsTable.java +++ b/Plan/src/main/java/com/djrapitops/plan/database/tables/SessionsTable.java @@ -1,7 +1,7 @@ package main.java.com.djrapitops.plan.database.tables; 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.database.Container; import main.java.com.djrapitops.plan.database.databases.SQLDB; import main.java.com.djrapitops.plan.database.sql.Sql; @@ -66,16 +66,16 @@ public class SessionsTable extends UserIDTable { * @return * @throws SQLException */ - public List getSessionData(int userId) throws SQLException { + public List 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 sessions = new ArrayList<>(); + List sessions = new ArrayList<>(); while (set.next()) { -// sessions.add(new SessionData(set.getLong(columnSessionStart), set.getLong(columnSessionEnd))); +// sessions.add(new Session(set.getLong(columnSessionStart), set.getLong(columnSessionEnd))); } set.close(); statement.close(); @@ -99,7 +99,7 @@ public class SessionsTable extends UserIDTable { * @param sessions * @throws SQLException */ - public void saveSessionData(int userId, List sessions) throws SQLException { + public void saveSessionData(int userId, List sessions) throws SQLException { if (sessions == null) { return; } @@ -118,7 +118,7 @@ public class SessionsTable extends UserIDTable { + columnSessionStart + ", " + columnSessionEnd + ") VALUES (?, ?, ?)"); - for (SessionData session : sessions) { + for (Session session : sessions) { long end = session.getSessionEnd(); long start = session.getSessionStart(); if (end < start) { @@ -142,7 +142,7 @@ public class SessionsTable extends UserIDTable { * @return * @throws SQLException */ - public Map> getSessionData(Collection ids) throws SQLException { + public Map> getSessionData(Collection ids) throws SQLException { if (ids == null || ids.isEmpty()) { return new HashMap<>(); } @@ -152,7 +152,7 @@ public class SessionsTable extends UserIDTable { ResultSet set = null; try { - Map> sessions = new HashMap<>(); + Map> sessions = new HashMap<>(); statement = prepareStatement("SELECT * FROM " + tableName); set = statement.executeQuery(); @@ -169,7 +169,7 @@ public class SessionsTable extends UserIDTable { long sessionStart = set.getLong(columnSessionStart); long sessionEnd = set.getLong(columnSessionEnd); -// sessions.get(id).add(new SessionData(sessionStart, sessionEnd)); +// sessions.get(id).add(new Session(sessionStart, sessionEnd)); } return sessions; @@ -184,18 +184,18 @@ public class SessionsTable extends UserIDTable { * @param sessions * @throws SQLException */ - public void saveSessionData(Map> sessions) throws SQLException { + public void saveSessionData(Map> sessions) throws SQLException { if (sessions == null || sessions.isEmpty()) { return; } Benchmark.start("Save Sessions multiple"); - Map> saved = getSessionData(sessions.keySet()); - for (Map.Entry> entrySet : sessions.entrySet()) { + Map> saved = getSessionData(sessions.keySet()); + for (Map.Entry> entrySet : sessions.entrySet()) { Integer id = entrySet.getKey(); - List sessionList = entrySet.getValue(); - List s = saved.get(id); + List sessionList = entrySet.getValue(); + List s = saved.get(id); if (s != null) { sessionList.removeAll(s); @@ -208,7 +208,7 @@ public class SessionsTable extends UserIDTable { saved.put(id, sessionList); } - List>> batches = splitIntoBatches(sessions); + List>> batches = splitIntoBatches(sessions); batches.forEach(batch -> { try { @@ -221,7 +221,7 @@ public class SessionsTable extends UserIDTable { Benchmark.stop("Database", "Save Sessions multiple"); } - private void saveSessionBatch(List> batch) throws SQLException { + private void saveSessionBatch(List> batch) throws SQLException { if (batch.isEmpty()) { return; } @@ -234,13 +234,9 @@ public class SessionsTable extends UserIDTable { + columnSessionEnd + ") VALUES (?, ?, ?)"); - for (Container data : batch) { - SessionData session = data.getObject(); + for (Container data : batch) { + Session 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()); diff --git a/Plan/src/main/java/com/djrapitops/plan/ui/html/graphs/PlayerActivityGraphCreator.java b/Plan/src/main/java/com/djrapitops/plan/ui/html/graphs/PlayerActivityGraphCreator.java index 51d93ca20..1f421193b 100644 --- a/Plan/src/main/java/com/djrapitops/plan/ui/html/graphs/PlayerActivityGraphCreator.java +++ b/Plan/src/main/java/com/djrapitops/plan/ui/html/graphs/PlayerActivityGraphCreator.java @@ -1,6 +1,6 @@ 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.utilities.analysis.Point; @@ -28,7 +28,7 @@ public class PlayerActivityGraphCreator { return SeriesCreator.seriesGraph(points, true); } - public static String buildSeriesDataStringSessions(Collection sessions) { + public static String buildSeriesDataStringSessions(Collection sessions) { List points = sessions.stream() .map(session -> new Point[]{new Point(session.getSessionStart(), 1), new Point(session.getSessionEnd(), 0)}) .flatMap(Arrays::stream) diff --git a/Plan/src/main/java/com/djrapitops/plan/ui/html/graphs/PunchCardGraphCreator.java b/Plan/src/main/java/com/djrapitops/plan/ui/html/graphs/PunchCardGraphCreator.java index 4c076289d..d2f0a0877 100644 --- a/Plan/src/main/java/com/djrapitops/plan/ui/html/graphs/PunchCardGraphCreator.java +++ b/Plan/src/main/java/com/djrapitops/plan/ui/html/graphs/PunchCardGraphCreator.java @@ -5,7 +5,7 @@ */ 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 java.util.Collection; @@ -34,7 +34,7 @@ public class PunchCardGraphCreator { * @param sessions Sessions (Unique/Player) to be placed into the PunchCard. * @return Data array as a string. */ - public static String createDataSeries(Collection sessions) { + public static String createDataSeries(Collection sessions) { List sessionStarts = getSessionStarts(sessions); List daysAndHours = AnalysisUtils.getDaysAndHours(sessionStarts); int[][] dataArray = createDataArray(daysAndHours); @@ -75,11 +75,10 @@ public class PunchCardGraphCreator { return dataArray; } - private static List getSessionStarts(Collection data) { + private static List getSessionStarts(Collection data) { return data.stream() .filter(Objects::nonNull) - .filter(SessionData::isValid) - .map(SessionData::getSessionStart) + .map(Session::getSessionStart) .sorted() .collect(Collectors.toList()); } diff --git a/Plan/src/main/java/com/djrapitops/plan/utilities/PlaceholderUtils.java b/Plan/src/main/java/com/djrapitops/plan/utilities/PlaceholderUtils.java index 8a2fde6df..a50bc3f7a 100644 --- a/Plan/src/main/java/com/djrapitops/plan/utilities/PlaceholderUtils.java +++ b/Plan/src/main/java/com/djrapitops/plan/utilities/PlaceholderUtils.java @@ -3,7 +3,7 @@ package main.java.com.djrapitops.plan.utilities; import main.java.com.djrapitops.plan.Plan; import main.java.com.djrapitops.plan.Settings; 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.ui.html.graphs.PunchCardGraphCreator; @@ -74,7 +74,7 @@ public class PlaceholderUtils { // replaceMap.put("mobKillCount", data.getMobKills()); // replaceMap.put("deathCount", data.getDeaths()); - Set sessions = new HashSet<>(data.getSessions()); + Set sessions = new HashSet<>(data.getSessions()); replaceMap.put("punchCardSeries", PunchCardGraphCreator.createDataSeries(sessions)); //TODO WorldTimes worldTimes = data.getWorldTimes(); // TODO replaceMap.put("worldSeries", WorldPieCreator.createSeriesData(worldTimes.getTimes())); diff --git a/Plan/src/main/java/com/djrapitops/plan/utilities/analysis/Analysis.java b/Plan/src/main/java/com/djrapitops/plan/utilities/analysis/Analysis.java index 26d04f843..9e8d4822d 100644 --- a/Plan/src/main/java/com/djrapitops/plan/utilities/analysis/Analysis.java +++ b/Plan/src/main/java/com/djrapitops/plan/utilities/analysis/Analysis.java @@ -5,7 +5,7 @@ import com.djrapitops.plugin.utilities.Verify; import main.java.com.djrapitops.plan.Log; import main.java.com.djrapitops.plan.Plan; 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.UserData; import main.java.com.djrapitops.plan.data.additional.AnalysisType; @@ -305,7 +305,7 @@ public class Analysis { } //TODO List playerKills = uData.getPlayerKills(); - List sessions = uData.getSessions(); + List sessions = uData.getSessions(); joinInfo.addSessions(uuid, sessions); }); Benchmark.stop("Analysis", "Fill Dataset"); diff --git a/Plan/src/main/java/com/djrapitops/plan/utilities/analysis/AnalysisUtils.java b/Plan/src/main/java/com/djrapitops/plan/utilities/analysis/AnalysisUtils.java index c13b99d1e..7b6f7488c 100644 --- a/Plan/src/main/java/com/djrapitops/plan/utilities/analysis/AnalysisUtils.java +++ b/Plan/src/main/java/com/djrapitops/plan/utilities/analysis/AnalysisUtils.java @@ -1,7 +1,7 @@ package main.java.com.djrapitops.plan.utilities.analysis; 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.PluginData; import main.java.com.djrapitops.plan.utilities.FormatUtils; @@ -62,11 +62,11 @@ public class AnalysisUtils { * @param data * @return */ - public static List transformSessionDataToLengths(Collection data) { + public static List transformSessionDataToLengths(Collection data) { return data.stream() .filter(Objects::nonNull) .filter(session -> session.getLength() > 0) - .map(SessionData::getLength) + .map(Session::getLength) .collect(Collectors.toList()); } @@ -206,7 +206,7 @@ public class AnalysisUtils { * @param scale Scale (milliseconds), time before (Current epoch - scale) will be ignored. * @return Amount of Unique joins within the time span. */ - public static int getUniqueJoins(Map> sessions, long scale) { + public static int getUniqueJoins(Map> sessions, long scale) { long now = MiscUtils.getTime(); long nowMinusScale = now - scale; @@ -226,13 +226,13 @@ public class AnalysisUtils { * @param scale * @return */ - public static int getUniqueJoinsPerDay(Map> sessions, long scale) { + public static int getUniqueJoinsPerDay(Map> sessions, long scale) { Map> uniqueJoins = new HashMap<>(); long now = MiscUtils.getTime(); long nowMinusScale = now - scale; sessions.forEach((uuid, s) -> { - for (SessionData session : s) { + for (Session session : s) { if (scale != -1 && session.getSessionStart() < nowMinusScale) { continue; @@ -308,7 +308,7 @@ public class AnalysisUtils { }).collect(Collectors.toList()); } - private static int getDayOfYear(SessionData session) { + private static int getDayOfYear(Session session) { return getDayOfYear(session.getSessionStart()); } diff --git a/Plan/src/main/java/com/djrapitops/plan/utilities/comparators/SessionDataComparator.java b/Plan/src/main/java/com/djrapitops/plan/utilities/comparators/SessionDataComparator.java index f4eab60dd..8ec31de9c 100644 --- a/Plan/src/main/java/com/djrapitops/plan/utilities/comparators/SessionDataComparator.java +++ b/Plan/src/main/java/com/djrapitops/plan/utilities/comparators/SessionDataComparator.java @@ -1,16 +1,16 @@ 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; /** * @author Rsl1122 */ -public class SessionDataComparator implements Comparator { +public class SessionDataComparator implements Comparator { @Override - public int compare(SessionData s1, SessionData s2) { + public int compare(Session s1, Session s2) { return Long.compare(s1.getSessionStart(), s2.getSessionStart()); } } diff --git a/Plan/test/test/java/main/java/com/djrapitops/plan/data/SessionDataTest.java b/Plan/test/test/java/main/java/com/djrapitops/plan/data/SessionTest.java similarity index 70% rename from Plan/test/test/java/main/java/com/djrapitops/plan/data/SessionDataTest.java rename to Plan/test/test/java/main/java/com/djrapitops/plan/data/SessionTest.java index e2a3fa8f9..2faa8b6c2 100644 --- a/Plan/test/test/java/main/java/com/djrapitops/plan/data/SessionDataTest.java +++ b/Plan/test/test/java/main/java/com/djrapitops/plan/data/SessionTest.java @@ -5,20 +5,20 @@ */ 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; /** * @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 public void setUp() { - test = new SessionData(0); } /** diff --git a/Plan/test/test/java/main/java/com/djrapitops/plan/data/cache/GeolocationCacheTest.java b/Plan/test/test/java/main/java/com/djrapitops/plan/data/cache/GeolocationCacheTest.java index 7eb8afef7..3eaa9aae8 100644 --- a/Plan/test/test/java/main/java/com/djrapitops/plan/data/cache/GeolocationCacheTest.java +++ b/Plan/test/test/java/main/java/com/djrapitops/plan/data/cache/GeolocationCacheTest.java @@ -12,9 +12,7 @@ import test.java.utils.TestInit; import java.util.HashMap; import java.util.Map; -import static junit.framework.TestCase.assertEquals; -import static junit.framework.TestCase.assertFalse; -import static junit.framework.TestCase.assertTrue; +import static junit.framework.TestCase.*; /** * @author Fuzzlemann @@ -27,6 +25,7 @@ public class GeolocationCacheTest { @Before public void setUp() { + GeolocationCacheHandler.clearCache(); ipsToCountries.put("8.8.8.8", "United States"); ipsToCountries.put("8.8.4.4", "United States"); ipsToCountries.put("4.4.2.2", "United States"); @@ -46,7 +45,7 @@ public class GeolocationCacheTest { String ip = entry.getKey(); String expCountry = entry.getValue(); - String country = GeolocationCacheHandler.getUncachedCountry(ip); + String country = GeolocationCacheHandler.getCountry(ip); assertEquals(country, expCountry); } @@ -60,15 +59,12 @@ public class GeolocationCacheTest { String ip = entry.getKey(); String expIp = entry.getValue(); - String countryFirstCall = GeolocationCacheHandler.getUncachedCountry(ip); assertFalse(GeolocationCacheHandler.isCached(ip)); - String countrySecondCall = GeolocationCacheHandler.getCountry(ip); assertTrue(GeolocationCacheHandler.isCached(ip)); - String countryThirdCall = GeolocationCacheHandler.getCachedCountry(ip); + String countryThirdCall = GeolocationCacheHandler.getCountry(ip); - assertEquals(countryFirstCall, countrySecondCall); assertEquals(countrySecondCall, countryThirdCall); assertEquals(countryThirdCall, expIp); } diff --git a/Plan/test/test/java/main/java/com/djrapitops/plan/data/time/WorldTimesTest.java b/Plan/test/test/java/main/java/com/djrapitops/plan/data/time/WorldTimesTest.java index a4a91f572..abdcb4ace 100644 --- a/Plan/test/test/java/main/java/com/djrapitops/plan/data/time/WorldTimesTest.java +++ b/Plan/test/test/java/main/java/com/djrapitops/plan/data/time/WorldTimesTest.java @@ -171,5 +171,5 @@ public class WorldTimesTest { 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. } \ No newline at end of file diff --git a/Plan/test/test/java/main/java/com/djrapitops/plan/utilities/analysis/AnalysisUtilsTest.java b/Plan/test/test/java/main/java/com/djrapitops/plan/utilities/analysis/AnalysisUtilsTest.java index a5dc642ed..2f0173ed0 100644 --- a/Plan/test/test/java/main/java/com/djrapitops/plan/utilities/analysis/AnalysisUtilsTest.java +++ b/Plan/test/test/java/main/java/com/djrapitops/plan/utilities/analysis/AnalysisUtilsTest.java @@ -5,7 +5,7 @@ */ 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.analysis.AnalysisUtils; import org.bukkit.plugin.java.JavaPlugin; @@ -122,10 +122,9 @@ public class AnalysisUtilsTest { */ @Test public void testTransformSessionDataToLengths() { - Collection data = new ArrayList<>(); - data.add(new SessionData(0L, 5L, null, null, 0, 0)); - data.add(new SessionData(0, 20L, null, null, 0, 0)); - data.add(new SessionData(0)); + Collection data = new ArrayList<>(); + data.add(new Session(0L, 5L, null, null, 0, 0)); + data.add(new Session(0, 20L, null, null, 0, 0)); List expResult = new ArrayList<>(); expResult.add(5L); expResult.add(20L); diff --git a/Plan/test/test/java/main/java/com/djrapitops/plan/utilities/comparators/ComparatorTest.java b/Plan/test/test/java/main/java/com/djrapitops/plan/utilities/comparators/ComparatorTest.java index 0731b1aa0..088f7bfe9 100644 --- a/Plan/test/test/java/main/java/com/djrapitops/plan/utilities/comparators/ComparatorTest.java +++ b/Plan/test/test/java/main/java/com/djrapitops/plan/utilities/comparators/ComparatorTest.java @@ -1,6 +1,6 @@ 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.UserData; import main.java.com.djrapitops.plan.data.WebUser; @@ -43,11 +43,11 @@ public class ComparatorTest { @Test public void testSessionDataComparator() { - List test = RandomData.randomSessions(); - List longValues = test.stream().map(SessionData::getSessionStart).collect(Collectors.toList()); + List test = RandomData.randomSessions(); + List longValues = test.stream().map(Session::getSessionStart).collect(Collectors.toList()); longValues.sort(Long::compare); test.sort(new SessionDataComparator()); - List afterSort = test.stream().map(SessionData::getSessionStart).collect(Collectors.toList()); + List afterSort = test.stream().map(Session::getSessionStart).collect(Collectors.toList()); assertEquals(longValues, afterSort); } diff --git a/Plan/test/test/java/utils/RandomData.java b/Plan/test/test/java/utils/RandomData.java index b72934d9b..f284a1cae 100644 --- a/Plan/test/test/java/utils/RandomData.java +++ b/Plan/test/test/java/utils/RandomData.java @@ -1,6 +1,6 @@ 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.UserData; import main.java.com.djrapitops.plan.data.WebUser; @@ -46,10 +46,10 @@ public class RandomData { return test; } - public static List randomSessions() { - List test = new ArrayList<>(); + public static List randomSessions() { + List test = new ArrayList<>(); 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; }