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>
<includes>
<include>*.keystore</include>
<include>*.js</include>
<include>*.css</include>
<include>*.yml</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>
</resource>
</resources>

View File

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

View File

@ -104,7 +104,7 @@ public class ManageRestoreCommand extends SubCommand {
if (ManageUtils.clearAndCopy(database, backupDB)) {
if (database.getConfigName().equals(plugin.getDB().getConfigName())) {
plugin.getHandler().getCommandUseFromDb();
plugin.getDataCache().getCommandUseFromDb();
}
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;
import main.java.com.djrapitops.plan.database.tables.Actions;
import java.util.Objects;
import java.util.UUID;
@ -12,23 +14,20 @@ import java.util.UUID;
public class KillData {
private final UUID victim;
private int victimUserID;
private final long date;
private final long time;
private final String weapon;
/**
* Creates a KillData object with given parameters.
*
* @param victim UUID of the victim.
* @param victimID ID of the victim, get from the database.
* @param weapon Weapon used.
* @param date Epoch millisecond at which the kill occurred.
* @param victim UUID of the victim.
* @param weapon Weapon used.
* @param time 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.weapon = weapon;
victimUserID = victimID;
this.date = date;
this.time = time;
}
/**
@ -45,8 +44,8 @@ public class KillData {
*
* @return long in ms.
*/
public long getDate() {
return date;
public long getTime() {
return time;
}
/**
@ -58,18 +57,10 @@ public class KillData {
return weapon;
}
/**
* Get the UserID of the victim, found from the database.
*
* @return For example: 6
*/
public int getVictimUserID() {
return victimUserID;
}
@Override
public String toString() {
return "{victim:" + victim + "|victimUserID:" + victimUserID + "|date:" + date + "|weapon:" + weapon + '}';
return "{victim:" + victim + "|time:" + time + "|weapon:" + weapon + '}';
}
@Override
@ -84,7 +75,7 @@ public class KillData {
return false;
}
final KillData other = (KillData) obj;
return this.date == other.date
return this.time == other.time
&& Objects.equals(this.weapon, other.weapon)
&& Objects.equals(this.victim, other.victim);
}
@ -93,12 +84,12 @@ public class KillData {
public int hashCode() {
int hash = 3;
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);
return hash;
}
public void setVictimUserID(int victimUserID) {
this.victimUserID = victimUserID;
public Action convertToAction() {
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;
/**
* 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.
* <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
*/
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 long sessionEnd;
private final List<KillData> playerKills;
private List<KillData> 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 +53,8 @@ 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<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.sessionEnd = sessionEnd;
this.worldTimes = worldTimes;
@ -69,6 +75,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 +125,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<KillData> getPlayerKills() {
return playerKills;
}
public int getMobKills() {
return mobKills;
}
public int getDeaths() {
return deaths;
}
@Override
@ -117,7 +152,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 +163,38 @@ 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);
}
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.
public class UserData {
private final List<SessionData> sessions;
private final List<Session> 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<SessionData> getSessions() {
public List<Session> getSessions() {
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.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<SessionData> sessions = joins.getAllSessions();
final List<Session> sessions = joins.getAllSessions();
List<Long> lengths = AnalysisUtils.transformSessionDataToLengths(sessions);
long averageLength = MathUtils.averageLong(lengths);
addValue("sessionAverage", FormatUtils.formatTimeAmount(averageLength));
List<SessionData> sessionsMonth = sessions.stream()
List<Session> sessionsMonth = sessions.stream()
.filter(s -> s.getSessionStart() > MiscUtils.getTime() - TimeAmount.MONTH.ms())
.collect(Collectors.toList());
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.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;
@ -10,7 +10,7 @@ import java.util.*;
import java.util.stream.Collectors;
/**
* Part responsible for all Player login related analysis.
* Part responsible for all Player player related analysis.
* <p>
* Placeholder values can be retrieved using the get method.
* <p>
@ -36,7 +36,7 @@ import java.util.stream.Collectors;
*/
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 long loginTimes;
@ -108,11 +108,11 @@ public class JoinInfoPart extends RawData {
return loginTimes;
}
public Map<UUID, List<SessionData>> getSessions() {
public Map<UUID, List<Session>> getSessions() {
return sessions;
}
public List<SessionData> getAllSessions() {
public List<Session> getAllSessions() {
return MiscUtils.flatMap(sessions.values());
}
@ -124,7 +124,7 @@ public class JoinInfoPart extends RawData {
return registered;
}
public void addSessions(UUID uuid, List<SessionData> sessions) {
public void addSessions(UUID uuid, List<Session> sessions) {
Verify.nullCheck(uuid);
Verify.nullCheck(sessions);
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.
*/
public void startAsyncPeriodicSaveTask() {
DataCache handler = this;
DataCache dataCache = this;
plugin.getRunnableFactory().createNew(new AbsRunnable("PeriodicCacheSaveTask") {
private int timesSaved = 0;
@ -134,7 +134,6 @@ public class DataCache extends SessionCache {
endSession(uuid);
String worldName = ((Player) p.getWrappedPlayerClass()).getWorld().getName();
}
// toProcess.sort(new HandlingInfoTimeComparator());
Benchmark.stop("Cache: ProcessOnlineHandlingInfo");
try {
db.saveCommandUse(commandUse);

View File

@ -69,7 +69,7 @@ public class GeolocationCacheHandler {
* @see <a href="http://freegeoip.net">http://freegeoip.net</a>
* @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();
}
}

View File

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

View File

@ -1,9 +1,10 @@
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;
import java.util.Optional;
import java.util.UUID;
/**
@ -14,7 +15,7 @@ import java.util.UUID;
*/
public class SessionCache {
private static final Map<UUID, SessionData> activeSessions = new HashMap<>();
private static final Map<UUID, Session> activeSessions = new HashMap<>();
/**
* Class Constructor.
@ -22,17 +23,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,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.
* @return SessionData or null if not cached.
* @return Session or null if not cached.
*/
@Deprecated
public SessionData getSession(UUID uuid) {
return activeSessions.get(uuid);
public Optional<Session> getCachedSession(UUID uuid) {
Session session = activeSessions.get(uuid);
if (session != null) {
return Optional.of(session);
}
return Optional.empty();
}
/**
@ -69,10 +73,10 @@ public class SessionCache {
* <p>
* Used for testing.
*
* @return key:value UUID:SessionData
* @return key:value UUID:Session
*/
@Deprecated
public Map<UUID, SessionData> getActiveSessions() {
public Map<UUID, Session> getActiveSessions() {
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.Plan;
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.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;
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.event.EventHandler;
import org.bukkit.event.EventPriority;
@ -38,6 +38,6 @@ public class PlanChatListener implements Listener {
}
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;
import main.java.com.djrapitops.plan.Log;
import main.java.com.djrapitops.plan.Permissions;
import main.java.com.djrapitops.plan.Plan;
import main.java.com.djrapitops.plan.Settings;
@ -20,7 +19,7 @@ import org.bukkit.event.player.PlayerCommandPreprocessEvent;
public class PlanCommandPreprocessListener implements Listener {
private final Plan plugin;
private final DataCache handler;
private final DataCache dataCache;
/**
* Class Constructor.
@ -29,7 +28,7 @@ public class PlanCommandPreprocessListener implements Listener {
*/
public PlanCommandPreprocessListener(Plan plugin) {
this.plugin = plugin;
handler = plugin.getHandler();
dataCache = plugin.getDataCache();
}
/**
@ -42,6 +41,10 @@ public class PlanCommandPreprocessListener implements Listener {
if (event.isCancelled()) {
return;
}
Player player = event.getPlayer();
if (player.hasPermission(Permissions.IGNORE_COMMANDUSE.getPermission())) {
return;
}
String commandName = event.getMessage().substring(1).split(" ")[0].toLowerCase();
@ -52,21 +55,13 @@ public class PlanCommandPreprocessListener implements Listener {
Command command = plugin.getServer().getPluginCommand(commandName);
if (command == null) {
if (doNotLogUnknownCommands) {
Log.debug("Ignored command, command is unknown");
return;
}
} else if (combineCommandAliasesToMainCommand) {
commandName = command.getName();
}
}
Player player = event.getPlayer();
if (player.hasPermission(Permissions.IGNORE_COMMANDUSE.getPermission())) {
Log.debug("Ignored command, player had ignore permission.");
return;
}
handler.handleCommand(commandName);
// TODO Command Usage -> DB Save Processor
dataCache.handleCommand(commandName);
}
}

View File

@ -1,8 +1,7 @@
package main.java.com.djrapitops.plan.data.listeners;
import main.java.com.djrapitops.plan.Plan;
import main.java.com.djrapitops.plan.data.handling.info.InfoType;
import main.java.com.djrapitops.plan.data.handling.info.PlaytimeDependentInfo;
import main.java.com.djrapitops.plan.data.Session;
import main.java.com.djrapitops.plan.utilities.MiscUtils;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
@ -10,6 +9,7 @@ import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerGameModeChangeEvent;
import java.util.Optional;
import java.util.UUID;
/**
@ -40,13 +40,16 @@ public class PlanGamemodeChangeListener implements Listener {
if (event.isCancelled()) {
return;
}
Player p = event.getPlayer();
UUID uuid = p.getUniqueId();
long time = MiscUtils.getTime();
String gameMode = event.getNewGameMode().name();
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;
import com.djrapitops.plugin.task.AbsRunnable;
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.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.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.DBCommitProcessor;
import main.java.com.djrapitops.plan.data.handling.player.*;
import main.java.com.djrapitops.plan.utilities.MiscUtils;
import main.java.com.djrapitops.plan.utilities.NewPlayerCreator;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerJoinEvent;
import org.bukkit.event.player.PlayerKickEvent;
import org.bukkit.event.player.PlayerLoginEvent;
import org.bukkit.event.player.PlayerQuitEvent;
import java.net.InetAddress;
import java.util.UUID;
/**
@ -32,89 +27,34 @@ import java.util.UUID;
public class PlanPlayerListener implements Listener {
private final Plan plugin;
private final DataCache handler;
private final DataCache cache;
/**
* Class Constructor.
* <p>
* Copies the references to multiple handlers from Current instance of handler.
*
* @param plugin Current instance of Plan
*/
public PlanPlayerListener(Plan 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)
public void onPlayerLogin(PlayerJoinEvent event) {
Player player = event.getPlayer();
IPlayer iPlayer = Fetch.wrapBukkit(player);
plugin.getNotificationCenter().checkNotifications(iPlayer);
UUID uuid = player.getUniqueId();
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));
public void onPlayerLogin(PlayerLoginEvent event) {
PlayerLoginEvent.Result result = event.getResult();
UUID uuid = event.getPlayer().getUniqueId();
if (result == PlayerLoginEvent.Result.KICK_BANNED) {
plugin.addToProcessQueue(new BanProcessor(uuid, true));
} else {
plugin.addToProcessQueue(new BanProcessor(uuid, false));
}
}
/**
* PlayerKickEvent Listener.
* <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
*/
@ -123,18 +63,62 @@ public class PlanPlayerListener implements Listener {
if (event.isCancelled()) {
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();
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();
//TODO String geoLocation = GeolocationCacheHandler.getCountry(ip.getHostAddress());
plugin.addToProcessQueue(new LogoutInfo(uuid, time, banned, gm.name(), worldName));
plugin.addToProcessQueue(new KickInfo(uuid));
plugin.addToProcessQueue(
new BanProcessor(uuid, player.isBanned()),
new EndSessionProcessor(uuid, time)
);
}
}

View File

@ -1,8 +1,7 @@
package main.java.com.djrapitops.plan.data.listeners;
import main.java.com.djrapitops.plan.Plan;
import main.java.com.djrapitops.plan.data.handling.info.InfoType;
import main.java.com.djrapitops.plan.data.handling.info.PlaytimeDependentInfo;
import main.java.com.djrapitops.plan.data.Session;
import main.java.com.djrapitops.plan.utilities.MiscUtils;
import org.bukkit.entity.Player;
import org.bukkit.event.EventHandler;
@ -10,6 +9,7 @@ import org.bukkit.event.EventPriority;
import org.bukkit.event.Listener;
import org.bukkit.event.player.PlayerChangedWorldEvent;
import java.util.Optional;
import java.util.UUID;
public class PlanWorldChangeListener implements Listener {
@ -22,17 +22,16 @@ public class PlanWorldChangeListener implements Listener {
@EventHandler(priority = EventPriority.MONITOR)
public void onWorldChange(PlayerChangedWorldEvent event) {
Player p = event.getPlayer();
String previousWorld = event.getFrom().getName();
String worldName = p.getWorld().getName();
if (previousWorld.equals(worldName)) {
return;
}
UUID uuid = p.getUniqueId();
String gameMode = p.getGameMode().name();
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 {
private final Plan plugin;
private final DataCache handler;
private final DataCache dataCache;
private final List<TPS> history;
private long lastCheckNano;
private int latestPlayersOnline = 0;
public TPSCountTimer(Plan plugin) {
super("TPSCountTimer");
lastCheckNano = -1;
this.handler = plugin.getHandler();
this.dataCache = plugin.getDataCache();
this.plugin = plugin;
history = new ArrayList<>();
}
@ -52,7 +54,8 @@ public class TPSCountTimer extends AbsRunnable {
history.add(tps);
if (history.size() >= 60) {
handler.addTPSLastMinute(history);
// TODO Process & Save to DB with a new Processor.
dataCache.addTPSLastMinute(history);
history.clear();
}
}
@ -79,6 +82,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 +171,8 @@ public class TPSCountTimer extends AbsRunnable {
private int getEntityCountPaper() {
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() {
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.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<Integer, List<String>> nicknames = nicknamesTable.getNicknames(ids);
Map<Integer, Set<InetAddress>> ipList = ipsTable.getIPList(ids);
Map<Integer, List<KillData>> playerKills = killsTable.getPlayerKills(ids, idUuidRel);
Map<Integer, List<SessionData>> sessionData = sessionsTable.getSessionData(ids);
Map<Integer, List<Session>> sessionData = sessionsTable.getSessionData(ids);
Map<Integer, Map<String, Long>> worldTimes = worldTimesTable.getWorldTimes(ids);
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;
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
*/
public class ActionsTable {
// TODO Actions table
// time, action, additional info
public class ActionsTable extends UserIDTable {
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 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.sql.Select;
import main.java.com.djrapitops.plan.database.sql.Sql;
import main.java.com.djrapitops.plan.database.sql.TableSqlParser;
import main.java.com.djrapitops.plan.utilities.Benchmark;
@ -12,15 +14,19 @@ import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.Map;
import java.util.Optional;
import java.util.UUID;
/**
* @author Rsl1122
*/
public class CommandUseTable extends Table {
private final String columnCommand;
private final String columnTimesUsed;
private final String columnServerID; //TODO
private final String columnCommandId = "id";
private final String columnCommand = "command";
private final String columnTimesUsed = "times_used";
private final String columnServerID = "server_id";
private ServerTable serverTable;
/**
* @param db
@ -28,9 +34,7 @@ public class CommandUseTable extends Table {
*/
public CommandUseTable(SQLDB db, boolean usingMySQL) {
super("plan_commandusages", db, usingMySQL);
columnCommand = "command";
columnTimesUsed = "times_used";
columnServerID = "server_id";
serverTable = db.getServerTable();
}
/**
@ -38,10 +42,15 @@ public class CommandUseTable extends Table {
*/
@Override
public boolean createTable() {
ServerTable serverTable = db.getServerTable();
try {
execute(TableSqlParser.createTable(tableName)
.primaryKeyIDColumn(usingMySQL, columnCommandId, Sql.INT)
.column(columnCommand, Sql.varchar(20)).notNull()
.column(columnTimesUsed, Sql.INT).notNull()
.column(columnServerID, Sql.INT).notNull()
.primaryKey(usingMySQL, columnCommandId)
.foreignKey(columnServerID, serverTable.toString(), serverTable.getColumnID())
.toString()
);
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 {
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");
Map<String, Integer> commandUse = new HashMap<>();
PreparedStatement statement = null;
ResultSet set = null;
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();
while (set.next()) {
String cmd = set.getString(columnCommand).toLowerCase();
@ -102,7 +130,6 @@ public class CommandUseTable extends Table {
String cmd = savedEntry.getKey();
// IMPORTANT - not using saved as value
Integer toSave = updateData.get(cmd);
if (toSave != null && toSave <= savedEntry.getValue()) {
updateData.remove(cmd);
}
@ -117,7 +144,10 @@ public class CommandUseTable extends Table {
private void updateCommands(Map<String, Integer> data) throws SQLException {
PreparedStatement statement = null;
try {
String updateStatement = "UPDATE " + tableName + " SET " + columnTimesUsed + "=? WHERE (" + columnCommand + "=?)";
String updateStatement = "UPDATE " + tableName + " SET " +
columnTimesUsed + "=? " +
"WHERE (" + columnCommand + "=?) AND (" +
columnServerID + "=" + serverTable.statementSelectServerID + ")";
statement = prepareStatement(updateStatement);
boolean commitRequired = false;
for (Map.Entry<String, Integer> entrySet : data.entrySet()) {
@ -130,6 +160,7 @@ public class CommandUseTable extends Table {
statement.setInt(1, amount);
statement.setString(2, key);
statement.setString(3, Plan.getServerUUID().toString());
statement.addBatch();
commitRequired = true;
}
@ -147,10 +178,11 @@ public class CommandUseTable extends Table {
try {
String insertStatement = "INSERT INTO " + tableName + " ("
+ columnCommand + ", "
+ columnTimesUsed
+ ") VALUES (?, ?)";
+ columnTimesUsed + ", "
+ columnServerID
+ ") VALUES (?, ?, " + serverTable.statementSelectServerID + ")";
statement = prepareStatement(insertStatement);
boolean commitRequired = false;
boolean addedRows = false;
for (Map.Entry<String, Integer> entrySet : data.entrySet()) {
String key = entrySet.getKey();
Integer amount = entrySet.getValue();
@ -161,15 +193,48 @@ public class CommandUseTable extends Table {
statement.setString(1, key);
statement.setInt(2, amount);
statement.setString(3, Plan.getServerUUID().toString());
statement.addBatch();
commitRequired = true;
addedRows = true;
}
if (commitRequired) {
if (addedRows) {
statement.executeBatch();
}
} finally {
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;
import com.djrapitops.plugin.utilities.Verify;
import main.java.com.djrapitops.plan.Log;
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 main.java.com.djrapitops.plan.utilities.Benchmark;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
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
*/
public class IPsTable extends UserIDTable {
private final String columnIP;
private final String columnGeolocation; // TODO
// TODO Write tests
private final String columnIP = "ip";
private final String columnGeolocation = "geolocation";
/**
* @param db The database
@ -28,9 +30,6 @@ public class IPsTable extends UserIDTable {
*/
public IPsTable(SQLDB db, boolean 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)
.column(columnUserID, Sql.INT).notNull()
.column(columnIP, Sql.varchar(20)).notNull()
.column(columnGeolocation, Sql.varchar(50)).notNull()
.foreignKey(columnUserID, usersTable.getTableName(), usersTable.getColumnID())
.toString()
);
@ -62,176 +62,81 @@ public class IPsTable extends UserIDTable {
}
/**
* @param userId The User ID from which the IPs should be retrieved from
* @return The retrieved IPs
* @param uuid UUID of the user.
* @return Users's Login Geolocations.
* @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;
ResultSet set = null;
try {
List<InetAddress> ips = new ArrayList<>();
List<String> stringList = new ArrayList<>();
statement = prepareStatement("SELECT * FROM " + tableName + " WHERE UPPER(" + columnUserID + ") LIKE UPPER(?)");
statement.setInt(1, userId);
statement = prepareStatement(Select.from(tableName, column)
.where(columnUserID + "=" + usersTable.statementSelectID)
.toString());
statement.setString(1, uuid.toString());
set = statement.executeQuery();
while (set.next()) {
String ipAddressName = set.getString(columnIP);
try {
ips.add(InetAddress.getByName(ipAddressName));
} catch (UnknownHostException e) {
Log.error("Host not found at getIPAddresses: " + ipAddressName); //Shouldn't ever happen
}
stringList.add(set.getString(column));
}
return ips;
return stringList;
} finally {
close(set, statement);
}
}
/**
* @param userId The User ID for which the IPs should be saved for
* @param ips The IPs
* @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()) {
public void updateIP(UUID uuid, String ip, String geolocation) throws SQLException {
List<String> ips = getIps(uuid);
if (ips.contains(ip)) {
return;
}
insertIp(uuid, ip, geolocation);
}
private void insertIp(UUID uuid, String ip, String geolocation) throws SQLException {
PreparedStatement statement = null;
try {
statement = prepareStatement("INSERT INTO " + tableName + " ("
+ columnUserID + ", "
+ columnIP
+ ") VALUES (?, ?)");
boolean commitRequired = false;
for (InetAddress ip : ips) {
if (ip == null) {
continue;
}
statement.setInt(1, userId);
statement.setString(2, ip.getHostAddress());
statement.addBatch();
commitRequired = true;
}
if (commitRequired) {
statement.executeBatch();
}
+ columnIP + ", "
+ columnGeolocation
+ ") VALUES ("
+ usersTable.statementSelectID + ", "
+ "?, ?)");
statement.setString(1, uuid.toString());
statement.setString(2, ip);
statement.setString(3, geolocation);
statement.execute();
} finally {
close(statement);
}
}
/**
* @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");
public Optional<String> getGeolocation(String ip) throws SQLException {
PreparedStatement statement = null;
ResultSet set = null;
try {
statement = prepareStatement("SELECT * FROM " + tableName);
statement = prepareStatement(Select.from(tableName, columnGeolocation)
.where(columnIP + "=?")
.toString());
statement.setString(1, ip);
set = statement.executeQuery();
Map<Integer, Set<InetAddress>> ips = new HashMap<>();
for (Integer id : ids) {
ips.put(id, new HashSet<>());
if (set.next()) {
return Optional.of(set.getString(columnGeolocation));
}
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;
return Optional.empty();
} finally {
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 {
private final String columnKillerUserID;
private final String columnVictimUserID;
private final String columnWeapon;
private final String columnDate;
private final String columnServerID; //TODO
private final String columnSessionID; //TODO
private final String columnKillerUserID = "killer_id";
private final String columnVictimUserID = "victim_id";
private final String columnWeapon = "weapon";
private final String columnDate = "date";
private final String columnServerID = "server_id"; //TODO
private final String columnSessionID = "session_id"; //TODO
/**
* @param db
@ -31,12 +31,6 @@ public class KillsTable extends Table {
*/
public KillsTable(SQLDB db, boolean 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();
List<KillData> killData = new ArrayList<>();
while (set.next()) {
int victimID = set.getInt(columnVictimUserID);
UUID victimUUID = usersTable.getUserUUID(String.valueOf(victimID));
killData.add(new KillData(victimUUID, victimID, set.getString(columnWeapon), set.getLong(columnDate)));
UUID victimUUID = null; // TODO Victim UUID Retrieval
killData.add(new KillData(victimUUID, set.getString(columnWeapon), set.getLong(columnDate)));
}
return killData;
} finally {
@ -128,26 +121,14 @@ public class KillsTable extends Table {
+ columnDate
+ ") VALUES (?, ?, ?, ?)");
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) {
if (kill == null || kill.getVictimUserID() == -1) {
if (kill == null) {
continue;
}
statement.setInt(1, userId);
statement.setInt(2, kill.getVictimUserID());
statement.setInt(2, -1); // TODO Victim ID Retrieval
statement.setString(3, kill.getWeapon());
statement.setLong(4, kill.getDate());
statement.setLong(4, kill.getTime());
statement.addBatch();
commitRequired = true;
}
@ -183,12 +164,11 @@ public class KillsTable extends Table {
}
while (set.next()) {
int killerID = set.getInt(columnKillerUserID);
int victimID = set.getInt(columnVictimUserID);
if (!ids.contains(killerID)) {
continue;
}
UUID victimUUID = uuids.get(victimID);
kills.get(killerID).add(new KillData(victimUUID, victimID, set.getString(columnWeapon), set.getLong(columnDate)));
UUID victimUUID = null; // TODO Victim UUID Retrieval
kills.get(killerID).add(new KillData(victimUUID, set.getString(columnWeapon), set.getLong(columnDate)));
}
return kills;
} finally {
@ -230,16 +210,11 @@ public class KillsTable extends Table {
playerKills.removeAll(s);
}
findMissingIDs(playerKills);
for (KillData kill : playerKills) {
if (kill.getVictimUserID() == -1) {
continue;
}
statement.setInt(1, id);
statement.setInt(2, kill.getVictimUserID());
statement.setInt(2, -1); // TODO Victim ID Retrieval
statement.setString(3, kill.getWeapon());
statement.setLong(4, kill.getDate());
statement.setLong(4, kill.getTime());
statement.addBatch();
commitRequired = true;
}
@ -254,13 +229,7 @@ public class KillsTable extends Table {
}
}
private void findMissingIDs(List<KillData> playerKills) throws SQLException {
for (KillData killData : playerKills) {
int victimUserID = killData.getVictimUserID();
if (victimUserID == -1) {
int newVictimID = db.getUsersTable().getUserId(killData.getVictim());
killData.setVictimUserID(newVictimID);
}
}
public void savePlayerKills(UUID uuid, List<KillData> playerKills) {
// TODO savePlayerKills
}
}

View File

@ -17,9 +17,9 @@ import java.util.*;
*/
public class NicknamesTable extends UserIDTable {
private final String columnNick;
private final String columnCurrent;
private final String columnServerID; //TODO
private final String columnNick = "nickname";
private final String columnCurrent = "current_nick";
private final String columnServerID = "server_id"; //TODO
/**
* @param db The database
@ -27,10 +27,6 @@ public class NicknamesTable extends UserIDTable {
*/
public NicknamesTable(SQLDB db, boolean 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.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import java.util.UUID;
import java.util.*;
/**
* Table representing plan_servers in the database.
* Table for managing multiple server's data in the database.
* <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
*/
public class ServerTable extends Table {
private final String columnServerID;
private final String columnServerUUID;
private final String columnServerName;
private final String columnWebserverAddress;
private final String columnInstalled;
private final String columnServerID = "id";
private final String columnServerUUID = "uuid";
private final String columnServerName = "name";
private final String columnWebserverAddress = "web_address";
private final String columnInstalled = "is_installed";
public final String statementSelectServerID;
public final String statementSelectServerNameID;
public ServerTable(SQLDB db, boolean usingMySQL) {
super("plan_servers", db, usingMySQL);
columnServerID = "id";
columnServerUUID = "uuid";
columnServerName = "name";
columnWebserverAddress = "web_address";
columnInstalled = "is_installed";
statementSelectServerID = "(" + Select.from(tableName, tableName + "." + columnServerID).where(columnServerUUID + "=?").toString() + ")";
statementSelectServerNameID = "(" + Select.from(tableName, tableName + "." + columnServerName).where(columnServerID + "=?").toString() + ")";
}
@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.
*
@ -226,4 +250,8 @@ public class ServerTable extends Table {
close(set, statement);
}
}
public String getColumnID() {
return tableName + "." + columnServerID;
}
}

View File

@ -1,12 +1,12 @@
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.database.Container;
import main.java.com.djrapitops.plan.Plan;
import main.java.com.djrapitops.plan.data.Session;
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 main.java.com.djrapitops.plan.utilities.Benchmark;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
@ -18,12 +18,14 @@ import java.util.*;
*/
public class SessionsTable extends UserIDTable {
private final String columnSessionID; //TODO
private final String columnSessionStart;
private final String columnSessionEnd;
private final String columnServerID; //TODO
private final String columnMobKills; //TODO
private final String columnDeaths; //TODO
private final String columnSessionID = "id";
private final String columnSessionStart = "session_start";
private final String columnSessionEnd = "session_end";
private final String columnServerID = "server_id";
private final String columnMobKills = "mob_kills";
private final String columnDeaths = "deaths";
private final ServerTable serverTable;
/**
* @param db
@ -31,13 +33,7 @@ public class SessionsTable extends UserIDTable {
*/
public SessionsTable(SQLDB db, boolean usingMySQL) {
super("plan_sessions", db, usingMySQL);
columnUserID = "user_id";
columnSessionStart = "session_start";
columnSessionEnd = "session_end";
columnServerID = "server_id";
columnSessionID = "id";
columnMobKills = "mob_kills";
columnDeaths = "deaths";
serverTable = db.getServerTable();
}
/**
@ -46,12 +42,17 @@ public class SessionsTable extends UserIDTable {
@Override
public boolean createTable() {
try {
UsersTable usersTable = db.getUsersTable();
execute(TableSqlParser.createTable(tableName)
.primaryKeyIDColumn(usingMySQL, columnServerID, Sql.LONG)
.column(columnUserID, Sql.INT).notNull()
.column(columnServerID, Sql.INT).notNull()
.column(columnSessionStart, 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(columnServerID, serverTable.getTableName(), serverTable.getColumnID())
.primaryKey(usingMySQL, columnSessionID)
.toString()
);
return true;
@ -62,31 +63,10 @@ public class SessionsTable extends UserIDTable {
}
/**
* @param userId
* @return
* @throws SQLException
*/
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);
}
}
/**
* Removes User's Sessions from the Database.
* <p>
* // TODO KILLS SHOULD BE REMOVED FIRST.
*
* @param userId
* @return
*/
@ -94,165 +74,62 @@ public class SessionsTable extends UserIDTable {
return super.removeDataOf(userId);
}
/**
* @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;
}
public void saveSessionInformation(UUID uuid, Session session) throws SQLException {
PreparedStatement statement = null;
try {
statement = prepareStatement("INSERT INTO " + tableName + " ("
+ columnUserID + ", "
+ columnSessionStart + ", "
+ columnSessionEnd
+ ") VALUES (?, ?, ?)");
for (SessionData session : sessions) {
long end = session.getSessionEnd();
long start = session.getSessionStart();
if (end < start) {
continue;
}
+ columnSessionEnd + ", "
+ columnDeaths + ", "
+ columnMobKills + ", "
+ columnServerID
+ ") VALUES ("
+ columnUserID + "=" + usersTable.statementSelectID + ", "
+ "?, ?, ?, ?, "
+ serverTable.statementSelectServerID + ")");
statement.setString(1, uuid.toString());
statement.setInt(1, userId);
statement.setLong(2, start);
statement.setLong(3, end);
statement.addBatch();
}
statement.setLong(2, session.getSessionStart());
statement.setLong(3, session.getSessionEnd());
statement.setInt(4, session.getDeaths());
statement.setInt(5, session.getMobKills());
statement.executeBatch();
statement.setString(6, Plan.getServerUUID().toString());
statement.execute();
} finally {
close(statement);
}
db.getWorldTimesTable().saveWorldTimes(session.getWorldTimes());
db.getKillsTable().savePlayerKills(uuid, session.getPlayerKills());
}
/**
* @param ids
* @return
* @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");
public Map<String, List<Session>> getSessions(UUID uuid) throws SQLException {
Map<Integer, String> serverNames = serverTable.getServerNames();
Map<String, List<Session>> sessionsByServer = new HashMap<>();
PreparedStatement statement = null;
ResultSet set = null;
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();
for (Integer id : ids) {
sessions.put(id, new ArrayList<>());
}
while (set.next()) {
Integer id = set.getInt(columnUserID);
if (!ids.contains(id)) {
continue;
}
long id = set.getLong(columnSessionID);
long start = set.getLong(columnSessionStart);
long end = set.getLong(columnSessionEnd);
String serverName = serverNames.get(set.getInt(columnServerID));
long sessionStart = set.getLong(columnSessionStart);
long sessionEnd = set.getLong(columnSessionEnd);
// sessions.get(id).add(new SessionData(sessionStart, sessionEnd));
int deaths = set.getInt(columnDeaths);
int mobKills = set.getInt(columnMobKills);
List<Session> sessions = sessionsByServer.getOrDefault(serverName, new ArrayList<>());
sessions.add(new Session(id, start, end, deaths, mobKills));
}
return sessions;
return sessionsByServer;
} finally {
close(set);
close(statement);
Benchmark.stop("Database", "Get Sessions multiple");
close(set, statement);
}
}
/**
* @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 {
protected String columnUserID;
protected final String columnUserID = "user_id";
protected final UsersTable usersTable;
public UserIDTable(String name, SQLDB db, boolean usingMySQL) {
super(name, db, usingMySQL);
usersTable = db.getUsersTable();
}
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.data.UserData;
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 main.java.com.djrapitops.plan.utilities.Benchmark;
@ -17,8 +18,8 @@ import java.util.*;
*/
public class UsersTable extends Table {
private final String columnID;
private final String columnUUID;
private final String columnID = "id";
private final String columnUUID = "uuid";
@Deprecated
private final String columnGeolocation;
@Deprecated
@ -50,14 +51,16 @@ public class UsersTable extends Table {
@Deprecated
private final String columnLastWorld;
public final String statementSelectID;
/**
* @param db
* @param usingMySQL
*/
public UsersTable(SQLDB db, boolean usingMySQL) {
super("plan_users", db, usingMySQL);
columnID = "id";
columnUUID = "uuid";
statementSelectID = "(" + Select.from(tableName, tableName + "." + columnID).where(columnUUID + "=?").toString() + ")";
columnGeolocation = "geolocation";
columnLastGM = "last_gamemode";
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 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.sql.Sql;
import main.java.com.djrapitops.plan.database.sql.TableSqlParser;
@ -21,13 +22,14 @@ import java.util.Map;
*/
public class WorldTimesTable extends UserIDTable {
private final String columnServerID; //TODO
private final String columnServerID = "server_id"; //TODO
private final WorldTable worldTable;
private final String worldIDColumn;
private final String worldNameColumn;
private final String columnWorldId;
@Deprecated private final String columnPlaytime;
private final String columnWorldId = "world_id";
@Deprecated
private final String columnPlaytime = "playtime";
//TODO GM Times to World table
private final String selectWorldIDsql;
@ -43,10 +45,6 @@ public class WorldTimesTable extends UserIDTable {
worldTable = db.getWorldTable();
worldIDColumn = worldTable + "." + worldTable.getColumnID();
worldNameColumn = worldTable.getColumnWorldName();
columnWorldId = "world_id";
columnUserID = "user_id";
columnPlaytime = "playtime";
columnServerID = "server_id";
selectWorldIDsql = "(SELECT " + worldIDColumn + " FROM " + worldTable + " WHERE (" + worldNameColumn + "=?))";
}
@ -315,4 +313,8 @@ public class WorldTimesTable extends UserIDTable {
close(statement);
}
}
public void saveWorldTimes(WorldTimes worldTimes) {
// TODO saveWorldTimes (INSERT)
}
}

View File

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

View File

@ -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<SessionData> sessions) {
public static String buildSeriesDataStringSessions(Collection<Session> sessions) {
List<Point> points = sessions.stream()
.map(session -> new Point[]{new Point(session.getSessionStart(), 1), new Point(session.getSessionEnd(), 0)})
.flatMap(Arrays::stream)

View File

@ -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<SessionData> sessions) {
public static String createDataSeries(Collection<Session> sessions) {
List<Long> sessionStarts = getSessionStarts(sessions);
List<int[]> daysAndHours = AnalysisUtils.getDaysAndHours(sessionStarts);
int[][] dataArray = createDataArray(daysAndHours);
@ -75,11 +75,10 @@ public class PunchCardGraphCreator {
return dataArray;
}
private static List<Long> getSessionStarts(Collection<SessionData> data) {
private static List<Long> getSessionStarts(Collection<Session> data) {
return data.stream()
.filter(Objects::nonNull)
.filter(SessionData::isValid)
.map(SessionData::getSessionStart)
.map(Session::getSessionStart)
.sorted()
.collect(Collectors.toList());
}

View File

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

View File

@ -8,6 +8,7 @@ import main.java.com.djrapitops.plan.data.UserData;
/**
* @author Rsl1122
*/
@Deprecated // TODO Remove once sure that this is unnecessary.
public class NewPlayerCreator {
/**
@ -45,7 +46,6 @@ public class NewPlayerCreator {
* @return a new UserData object
*/
public static UserData createNewPlayer(IOfflinePlayer player, Gamemode gm) {
// TODO Rewrite
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.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;
@ -34,7 +34,7 @@ public class PlaceholderUtils {
replaceMap.put("tabContentPlugins", data.replacePluginsTabLayout());
// 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("serverName", Settings.SERVER_NAME.toString());
@ -74,7 +74,7 @@ public class PlaceholderUtils {
// replaceMap.put("mobKillCount", data.getMobKills());
// 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));
//TODO WorldTimes worldTimes = data.getWorldTimes();
// 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.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;
@ -129,8 +129,8 @@ public class Analysis {
rawData.sort(new UserDataLastPlayedComparator());
List<UUID> uuids = rawData.stream().map(UserData::getUuid).collect(Collectors.toList());
Benchmark.start("Create Empty dataset");
DataCache handler = plugin.getHandler();
Map<String, Integer> commandUse = handler.getCommandUse();
DataCache dataCache = plugin.getDataCache();
Map<String, Integer> commandUse = dataCache.getCommandUse();
AnalysisData analysisData = new AnalysisData(commandUse, tpsData);
analysisData.setPluginsTabLayout(plugin.getHookHandler().getPluginsTabLayoutForAnalysis());
@ -305,7 +305,7 @@ public class Analysis {
}
//TODO List<KillData> playerKills = uData.getPlayerKills();
List<SessionData> sessions = uData.getSessions();
List<Session> sessions = uData.getSessions();
joinInfo.addSessions(uuid, sessions);
});
Benchmark.stop("Analysis", "Fill Dataset");

View File

@ -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<Long> transformSessionDataToLengths(Collection<SessionData> data) {
public static List<Long> transformSessionDataToLengths(Collection<Session> 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<UUID, List<SessionData>> sessions, long scale) {
public static int getUniqueJoins(Map<UUID, List<Session>> 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<UUID, List<SessionData>> sessions, long scale) {
public static int getUniqueJoinsPerDay(Map<UUID, List<Session>> sessions, long scale) {
Map<Integer, Set<UUID>> 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());
}

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
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;
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<SessionData> {
public class SessionDataComparator implements Comparator<Session> {
@Override
public int compare(SessionData s1, SessionData s2) {
public int compare(Session s1, Session s2) {
return Long.compare(s1.getSessionStart(), s2.getSessionStart());
}
}

View File

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

View File

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

View File

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

View File

@ -34,7 +34,7 @@ public class QueueTest {
private final UUID uuid1 = MockUtils.getPlayerUUID();
private DataCache handler;
private DataCache dataCache;
private Database db;
public QueueTest() {
@ -51,12 +51,12 @@ public class QueueTest {
};
db.init();
when(plan.getDB()).thenReturn(db);
handler = new DataCache(plan) {
dataCache = new DataCache(plan) {
@Override
public void startAsyncPeriodicSaveTask() {
}
};
when(plan.getHandler()).thenReturn(handler);
when(plan.getDataCache()).thenReturn(dataCache);
}
@After
@ -68,21 +68,6 @@ public class QueueTest {
public void testProcessQueue() {
List<Integer> processCalls = new ArrayList<>();
List<Integer> errors = new ArrayList<>();
// handler.addToPool(new HandlingInfo(uuid1, InfoType.OTHER, 0) {
// @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();
// }
// }
// TODO Rewrite
}
}

View File

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

View File

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

View File

@ -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<SessionData> 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<Session> data = new ArrayList<>();
data.add(new Session(0L, 5L, null, null, 0, 0));
data.add(new Session(0, 20L, null, null, 0, 0));
List<Long> expResult = new ArrayList<>();
expResult.add(5L);
expResult.add(20L);

View File

@ -1,10 +1,9 @@
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;
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.Msg;
import main.java.com.djrapitops.plan.utilities.PassEncryptUtil;
@ -20,16 +19,6 @@ import static org.junit.Assert.assertEquals;
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
public void testPointComparator() {
List<Point> test = RandomData.randomPoints();
@ -43,11 +32,11 @@ public class ComparatorTest {
@Test
public void testSessionDataComparator() {
List<SessionData> test = RandomData.randomSessions();
List<Long> longValues = test.stream().map(SessionData::getSessionStart).collect(Collectors.toList());
List<Session> test = RandomData.randomSessions();
List<Long> longValues = test.stream().map(Session::getSessionStart).collect(Collectors.toList());
longValues.sort(Long::compare);
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);
}

View File

@ -1,11 +1,9 @@
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;
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.analysis.Point;
import org.apache.commons.lang.RandomStringUtils;
@ -13,7 +11,6 @@ import org.apache.commons.lang.RandomStringUtils;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import java.util.UUID;
import java.util.concurrent.ThreadLocalRandom;
public class RandomData {
@ -46,10 +43,10 @@ public class RandomData {
return test;
}
public static List<SessionData> randomSessions() {
List<SessionData> test = new ArrayList<>();
public static List<Session> randomSessions() {
List<Session> 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;
}
@ -62,19 +59,6 @@ public class RandomData {
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) {
int x = r.nextInt(clazz.getEnumConstants().length);
return clazz.getEnumConstants()[x];