mirror of
https://github.com/plan-player-analytics/Plan.git
synced 2024-10-17 15:55:02 +02:00
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:
commit
2f8e881519
@ -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>
|
||||
|
@ -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) {
|
||||
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();
|
||||
}
|
||||
}
|
||||
|
@ -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 {
|
||||
|
@ -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());
|
||||
|
60
Plan/src/main/java/com/djrapitops/plan/data/Action.java
Normal file
60
Plan/src/main/java/com/djrapitops/plan/data/Action.java
Normal 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);
|
||||
}
|
||||
}
|
@ -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 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.
|
||||
}
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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));
|
||||
|
@ -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()));
|
||||
|
@ -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);
|
||||
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
@ -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<>();
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
@ -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('_', ' ');
|
||||
}
|
||||
}
|
||||
|
@ -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) {
|
||||
|
||||
}
|
||||
}
|
@ -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);
|
||||
}
|
||||
}
|
@ -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);
|
||||
}
|
@ -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
|
||||
}
|
@ -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) {
|
||||
}
|
||||
|
||||
}
|
@ -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);
|
||||
}
|
||||
}
|
@ -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) {
|
||||
}
|
||||
}
|
@ -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) {
|
||||
}
|
||||
|
||||
}
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
@ -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);
|
||||
}
|
||||
}
|
@ -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
|
||||
}
|
||||
}
|
@ -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
|
||||
}
|
||||
}
|
@ -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);
|
||||
}
|
||||
}
|
@ -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
|
||||
}
|
||||
}
|
@ -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
|
||||
}
|
||||
}
|
@ -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();
|
||||
}
|
||||
}
|
||||
}
|
@ -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.
|
||||
}
|
||||
}
|
@ -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();
|
||||
}
|
@ -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
|
||||
}
|
||||
}
|
@ -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));
|
||||
}
|
||||
}
|
@ -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()));
|
||||
}
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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);
|
||||
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 {
|
||||
// handler.addToPool(loginInfo);
|
||||
plugin.addToProcessQueue(new BanProcessor(uuid, false));
|
||||
}
|
||||
this.cancel();
|
||||
}
|
||||
}).runTaskAsynchronously();
|
||||
}
|
||||
|
||||
/**
|
||||
* PlayerQuitEvent Listener.
|
||||
* <p>
|
||||
* Adds a LogoutInfo to the processing Queue.
|
||||
*
|
||||
* @param event Fired event
|
||||
*/
|
||||
@EventHandler(priority = EventPriority.MONITOR)
|
||||
public void onPlayerQuit(PlayerQuitEvent event) {
|
||||
// TODO Rewrite Logout system
|
||||
Player player = event.getPlayer();
|
||||
UUID uuid = player.getUniqueId();
|
||||
handler.endSession(uuid);
|
||||
|
||||
long time = MiscUtils.getTime();
|
||||
boolean banned = player.isBanned();
|
||||
Gamemode gm = Gamemode.wrap(player.getGameMode());
|
||||
String worldName = player.getWorld().getName();
|
||||
|
||||
plugin.addToProcessQueue(new LogoutInfo(uuid, time, banned, gm.name(), worldName));
|
||||
}
|
||||
|
||||
/**
|
||||
* PlayerKickEvent Listener.
|
||||
* <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)
|
||||
);
|
||||
}
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
@ -321,4 +321,6 @@ public abstract class Database {
|
||||
public ServerTable getServerTable() {
|
||||
return serverTable;
|
||||
}
|
||||
|
||||
public abstract void commit() throws SQLException;
|
||||
}
|
||||
|
@ -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",
|
||||
|
@ -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('_', ' ');
|
||||
}
|
||||
}
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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) {
|
||||
public void updateIP(UUID uuid, String ip, String geolocation) throws SQLException {
|
||||
List<String> ips = getIps(uuid);
|
||||
if (ips.contains(ip)) {
|
||||
return;
|
||||
}
|
||||
|
||||
ips.removeAll(getIPAddresses(userId));
|
||||
|
||||
if (ips.isEmpty()) {
|
||||
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");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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
|
||||
}
|
||||
}
|
||||
|
@ -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";
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
@ -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.executeBatch();
|
||||
} finally {
|
||||
close(statement);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @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");
|
||||
PreparedStatement statement = null;
|
||||
ResultSet set = null;
|
||||
|
||||
try {
|
||||
Map<Integer, List<SessionData>> sessions = new HashMap<>();
|
||||
statement = prepareStatement("SELECT * FROM " + tableName);
|
||||
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 sessionStart = set.getLong(columnSessionStart);
|
||||
long sessionEnd = set.getLong(columnSessionEnd);
|
||||
|
||||
// sessions.get(id).add(new SessionData(sessionStart, sessionEnd));
|
||||
}
|
||||
|
||||
return sessions;
|
||||
} finally {
|
||||
close(set);
|
||||
close(statement);
|
||||
Benchmark.stop("Database", "Get Sessions multiple");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @param sessions
|
||||
* @throws SQLException
|
||||
*/
|
||||
public void saveSessionData(Map<Integer, List<SessionData>> sessions) throws SQLException {
|
||||
if (sessions == null || sessions.isEmpty()) {
|
||||
return;
|
||||
}
|
||||
|
||||
Benchmark.start("Save Sessions multiple");
|
||||
|
||||
Map<Integer, List<SessionData>> saved = getSessionData(sessions.keySet());
|
||||
for (Map.Entry<Integer, List<SessionData>> entrySet : sessions.entrySet()) {
|
||||
Integer id = entrySet.getKey();
|
||||
List<SessionData> sessionList = entrySet.getValue();
|
||||
List<SessionData> s = saved.get(id);
|
||||
|
||||
if (s != null) {
|
||||
sessionList.removeAll(s);
|
||||
}
|
||||
|
||||
if (sessionList.isEmpty()) {
|
||||
continue;
|
||||
}
|
||||
|
||||
saved.put(id, sessionList);
|
||||
}
|
||||
|
||||
List<List<Container<SessionData>>> batches = splitIntoBatches(sessions);
|
||||
|
||||
batches.forEach(batch -> {
|
||||
try {
|
||||
saveSessionBatch(batch);
|
||||
} catch (SQLException e) {
|
||||
Log.toLog("SessionsTable.saveSessionData", e);
|
||||
}
|
||||
});
|
||||
|
||||
Benchmark.stop("Database", "Save Sessions multiple");
|
||||
}
|
||||
|
||||
private void saveSessionBatch(List<Container<SessionData>> batch) throws SQLException {
|
||||
if (batch.isEmpty()) {
|
||||
return;
|
||||
}
|
||||
|
||||
PreparedStatement statement = null;
|
||||
try {
|
||||
statement = prepareStatement("INSERT INTO " + tableName + " ("
|
||||
+ columnUserID + ", "
|
||||
+ columnSessionStart + ", "
|
||||
+ columnSessionEnd
|
||||
+ ") VALUES (?, ?, ?)");
|
||||
|
||||
for (Container<SessionData> data : batch) {
|
||||
SessionData session = data.getObject();
|
||||
int id = data.getId();
|
||||
if (!session.isValid()) {
|
||||
continue;
|
||||
}
|
||||
|
||||
statement.setInt(1, id);
|
||||
statement.setLong(2, session.getSessionStart());
|
||||
statement.setLong(3, session.getSessionEnd());
|
||||
statement.addBatch();
|
||||
}
|
||||
statement.executeBatch();
|
||||
statement.setInt(4, session.getDeaths());
|
||||
statement.setInt(5, session.getMobKills());
|
||||
|
||||
statement.setString(6, Plan.getServerUUID().toString());
|
||||
statement.execute();
|
||||
} finally {
|
||||
close(statement);
|
||||
}
|
||||
|
||||
db.getWorldTimesTable().saveWorldTimes(session.getWorldTimes());
|
||||
db.getKillsTable().savePlayerKills(uuid, session.getPlayerKills());
|
||||
}
|
||||
|
||||
public void clean() {
|
||||
// TODO Clean sessions before Configurable time span
|
||||
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 {
|
||||
statement = prepareStatement(Select.from(tableName, "*")
|
||||
.where(columnUserID + "=" + usersTable.statementSelectID)
|
||||
.toString());
|
||||
statement.setString(1, uuid.toString());
|
||||
set = statement.executeQuery();
|
||||
while (set.next()) {
|
||||
long id = set.getLong(columnSessionID);
|
||||
long start = set.getLong(columnSessionStart);
|
||||
long end = set.getLong(columnSessionEnd);
|
||||
String serverName = serverNames.get(set.getInt(columnServerID));
|
||||
|
||||
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 sessionsByServer;
|
||||
} finally {
|
||||
close(set, statement);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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) {
|
||||
|
@ -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";
|
||||
|
@ -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)
|
||||
}
|
||||
}
|
||||
|
@ -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;
|
||||
|
||||
|
@ -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)
|
||||
|
@ -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());
|
||||
}
|
||||
|
@ -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();
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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()));
|
||||
|
@ -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");
|
||||
|
@ -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());
|
||||
|
||||
}
|
||||
|
@ -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());
|
||||
}
|
||||
|
||||
}
|
@ -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());
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -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());
|
||||
}
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
/**
|
@ -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;
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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
|
||||
}
|
||||
}
|
||||
|
@ -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.
|
||||
}
|
@ -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();
|
||||
|
@ -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);
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
@ -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];
|
||||
|
Loading…
Reference in New Issue
Block a user