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>
|
<directory>${basedir}/src/main/resources</directory>
|
||||||
<includes>
|
<includes>
|
||||||
<include>*.keystore</include>
|
<include>*.keystore</include>
|
||||||
<include>*.js</include>
|
<include>*.css</include>
|
||||||
<include>*.yml</include>
|
<include>*.yml</include>
|
||||||
<include>*.html</include>
|
<include>*.html</include>
|
||||||
<include>*.txt</include>
|
</includes>
|
||||||
|
<excludes>
|
||||||
|
<exclude>licence.yml</exclude>
|
||||||
|
</excludes>
|
||||||
|
</resource>
|
||||||
|
<resource>
|
||||||
|
<targetPath>.</targetPath>
|
||||||
|
<directory>${basedir}/src/main/resources/html</directory>
|
||||||
|
<includes>
|
||||||
|
<include>*.html</include>
|
||||||
|
</includes>
|
||||||
|
</resource>
|
||||||
|
<resource>
|
||||||
|
<targetPath>.</targetPath>
|
||||||
|
<directory>${basedir}/src/main/resources/js</directory>
|
||||||
|
<includes>
|
||||||
|
<include>*.js</include>
|
||||||
</includes>
|
</includes>
|
||||||
</resource>
|
</resource>
|
||||||
</resources>
|
</resources>
|
||||||
|
@ -53,6 +53,7 @@ import org.bukkit.ChatColor;
|
|||||||
|
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
import java.util.UUID;
|
||||||
import java.util.concurrent.Executors;
|
import java.util.concurrent.Executors;
|
||||||
import java.util.concurrent.ScheduledExecutorService;
|
import java.util.concurrent.ScheduledExecutorService;
|
||||||
|
|
||||||
@ -70,7 +71,7 @@ public class Plan extends BukkitPlugin<Plan> {
|
|||||||
private API api;
|
private API api;
|
||||||
|
|
||||||
private ProcessingQueue processingQueue;
|
private ProcessingQueue processingQueue;
|
||||||
private DataCache handler;
|
private DataCache dataCache;
|
||||||
private InspectCacheHandler inspectCache;
|
private InspectCacheHandler inspectCache;
|
||||||
private AnalysisCacheHandler analysisCache;
|
private AnalysisCacheHandler analysisCache;
|
||||||
private HookHandler hookHandler; // Manages 3rd party data sources
|
private HookHandler hookHandler; // Manages 3rd party data sources
|
||||||
@ -83,6 +84,7 @@ public class Plan extends BukkitPlugin<Plan> {
|
|||||||
private ServerInfoManager serverInfoManager;
|
private ServerInfoManager serverInfoManager;
|
||||||
|
|
||||||
private ServerVariableHolder serverVariableHolder;
|
private ServerVariableHolder serverVariableHolder;
|
||||||
|
private TPSCountTimer tpsCountTimer;
|
||||||
private int bootAnalysisTaskID = -1;
|
private int bootAnalysisTaskID = -1;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -157,12 +159,13 @@ public class Plan extends BukkitPlugin<Plan> {
|
|||||||
Benchmark.stop("Enable", "Init Database");
|
Benchmark.stop("Enable", "Init Database");
|
||||||
|
|
||||||
Benchmark.start("Init DataCache");
|
Benchmark.start("Init DataCache");
|
||||||
this.handler = new DataCache(this);
|
this.dataCache = new DataCache(this);
|
||||||
this.inspectCache = new InspectCacheHandler(this);
|
this.inspectCache = new InspectCacheHandler(this);
|
||||||
this.analysisCache = new AnalysisCacheHandler(this);
|
this.analysisCache = new AnalysisCacheHandler(this);
|
||||||
Benchmark.stop("Enable", "Init DataCache");
|
Benchmark.stop("Enable", "Init DataCache");
|
||||||
|
|
||||||
super.getRunnableFactory().createNew(new TPSCountTimer(this)).runTaskTimer(1000, TimeAmount.SECOND.ticks());
|
tpsCountTimer = new TPSCountTimer(this);
|
||||||
|
super.getRunnableFactory().createNew(tpsCountTimer).runTaskTimer(1000, TimeAmount.SECOND.ticks());
|
||||||
registerListeners();
|
registerListeners();
|
||||||
|
|
||||||
this.api = new API(this);
|
this.api = new API(this);
|
||||||
@ -190,9 +193,10 @@ public class Plan extends BukkitPlugin<Plan> {
|
|||||||
Log.error("WebServer was not successfully initialized.");
|
Log.error("WebServer was not successfully initialized.");
|
||||||
}
|
}
|
||||||
|
|
||||||
Benchmark.start("ServerInfo Registration");
|
//TODO Re-Enable after DB ServerTable has been initialized properly.
|
||||||
serverInfoManager = new ServerInfoManager(this);
|
// Benchmark.start("ServerInfo Registration");
|
||||||
Benchmark.stop("Enable", "ServerInfo Registration");
|
// serverInfoManager = new ServerInfoManager(this);
|
||||||
|
// Benchmark.stop("Enable", "ServerInfo Registration");
|
||||||
|
|
||||||
setupFilter(); // TODO Move to RegisterCommand Constructor
|
setupFilter(); // TODO Move to RegisterCommand Constructor
|
||||||
|
|
||||||
@ -258,14 +262,14 @@ public class Plan extends BukkitPlugin<Plan> {
|
|||||||
|
|
||||||
getServer().getScheduler().cancelTasks(this);
|
getServer().getScheduler().cancelTasks(this);
|
||||||
|
|
||||||
if (Verify.notNull(handler, db)) {
|
if (Verify.notNull(dataCache, db)) {
|
||||||
Benchmark.start("Disable: DataCache Save");
|
Benchmark.start("Disable: DataCache Save");
|
||||||
// Saves the DataCache to the database without Bukkit's Schedulers.
|
// Saves the DataCache to the database without Bukkit's Schedulers.
|
||||||
Log.info(Locale.get(Msg.DISABLE_CACHE_SAVE).toString());
|
Log.info(Locale.get(Msg.DISABLE_CACHE_SAVE).toString());
|
||||||
|
|
||||||
ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor();
|
ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor();
|
||||||
scheduler.execute(() -> {
|
scheduler.execute(() -> {
|
||||||
handler.saveCacheOnDisable();
|
dataCache.saveCacheOnDisable();
|
||||||
taskStatus().cancelAllKnownTasks();
|
taskStatus().cancelAllKnownTasks();
|
||||||
Benchmark.stop("Disable: DataCache Save");
|
Benchmark.stop("Disable: DataCache Save");
|
||||||
});
|
});
|
||||||
@ -396,8 +400,8 @@ public class Plan extends BukkitPlugin<Plan> {
|
|||||||
*
|
*
|
||||||
* @return Current instance of the DataCache
|
* @return Current instance of the DataCache
|
||||||
*/
|
*/
|
||||||
public DataCache getHandler() {
|
public DataCache getDataCache() {
|
||||||
return handler;
|
return dataCache;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -472,7 +476,17 @@ public class Plan extends BukkitPlugin<Plan> {
|
|||||||
return processingQueue;
|
return processingQueue;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void addToProcessQueue(Processor processor) {
|
public TPSCountTimer getTpsCountTimer() {
|
||||||
processingQueue.addToQueue(processor);
|
return tpsCountTimer;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void addToProcessQueue(Processor... processors) {
|
||||||
|
for (Processor processor : processors) {
|
||||||
|
processingQueue.addToQueue(processor);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public static UUID getServerUUID() {
|
||||||
|
return getInstance().serverInfoManager.getServerUUID();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -9,7 +9,6 @@ import main.java.com.djrapitops.plan.data.UserData;
|
|||||||
import main.java.com.djrapitops.plan.data.additional.AnalysisType;
|
import main.java.com.djrapitops.plan.data.additional.AnalysisType;
|
||||||
import main.java.com.djrapitops.plan.data.additional.PluginData;
|
import main.java.com.djrapitops.plan.data.additional.PluginData;
|
||||||
import main.java.com.djrapitops.plan.data.cache.DBCallableProcessor;
|
import main.java.com.djrapitops.plan.data.cache.DBCallableProcessor;
|
||||||
import main.java.com.djrapitops.plan.data.handling.info.HandlingInfo;
|
|
||||||
import main.java.com.djrapitops.plan.ui.html.DataRequestHandler;
|
import main.java.com.djrapitops.plan.ui.html.DataRequestHandler;
|
||||||
import main.java.com.djrapitops.plan.ui.webserver.WebServer;
|
import main.java.com.djrapitops.plan.ui.webserver.WebServer;
|
||||||
import main.java.com.djrapitops.plan.utilities.HtmlUtils;
|
import main.java.com.djrapitops.plan.utilities.HtmlUtils;
|
||||||
@ -37,7 +36,6 @@ import java.util.stream.Collectors;
|
|||||||
* @see PluginData
|
* @see PluginData
|
||||||
* @see AnalysisType
|
* @see AnalysisType
|
||||||
* @see DBCallableProcessor
|
* @see DBCallableProcessor
|
||||||
* @see HandlingInfo
|
|
||||||
* @since 2.0.0
|
* @since 2.0.0
|
||||||
*/
|
*/
|
||||||
public class API {
|
public class API {
|
||||||
|
@ -104,7 +104,7 @@ public class ManageRestoreCommand extends SubCommand {
|
|||||||
|
|
||||||
if (ManageUtils.clearAndCopy(database, backupDB)) {
|
if (ManageUtils.clearAndCopy(database, backupDB)) {
|
||||||
if (database.getConfigName().equals(plugin.getDB().getConfigName())) {
|
if (database.getConfigName().equals(plugin.getDB().getConfigName())) {
|
||||||
plugin.getHandler().getCommandUseFromDb();
|
plugin.getDataCache().getCommandUseFromDb();
|
||||||
}
|
}
|
||||||
|
|
||||||
sender.sendMessage(Locale.get(Msg.MANAGE_INFO_COPY_SUCCESS).toString());
|
sender.sendMessage(Locale.get(Msg.MANAGE_INFO_COPY_SUCCESS).toString());
|
||||||
|
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;
|
package main.java.com.djrapitops.plan.data;
|
||||||
|
|
||||||
|
import main.java.com.djrapitops.plan.database.tables.Actions;
|
||||||
|
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
@ -12,23 +14,20 @@ import java.util.UUID;
|
|||||||
public class KillData {
|
public class KillData {
|
||||||
|
|
||||||
private final UUID victim;
|
private final UUID victim;
|
||||||
private int victimUserID;
|
private final long time;
|
||||||
private final long date;
|
|
||||||
private final String weapon;
|
private final String weapon;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a KillData object with given parameters.
|
* Creates a KillData object with given parameters.
|
||||||
*
|
*
|
||||||
* @param victim UUID of the victim.
|
* @param victim UUID of the victim.
|
||||||
* @param victimID ID of the victim, get from the database.
|
* @param weapon Weapon used.
|
||||||
* @param weapon Weapon used.
|
* @param time Epoch millisecond at which the kill occurred.
|
||||||
* @param date Epoch millisecond at which the kill occurred.
|
|
||||||
*/
|
*/
|
||||||
public KillData(UUID victim, int victimID, String weapon, long date) {
|
public KillData(UUID victim, String weapon, long time) {
|
||||||
this.victim = victim;
|
this.victim = victim;
|
||||||
this.weapon = weapon;
|
this.weapon = weapon;
|
||||||
victimUserID = victimID;
|
this.time = time;
|
||||||
this.date = date;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -45,8 +44,8 @@ public class KillData {
|
|||||||
*
|
*
|
||||||
* @return long in ms.
|
* @return long in ms.
|
||||||
*/
|
*/
|
||||||
public long getDate() {
|
public long getTime() {
|
||||||
return date;
|
return time;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -58,18 +57,10 @@ public class KillData {
|
|||||||
return weapon;
|
return weapon;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Get the UserID of the victim, found from the database.
|
|
||||||
*
|
|
||||||
* @return For example: 6
|
|
||||||
*/
|
|
||||||
public int getVictimUserID() {
|
|
||||||
return victimUserID;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String toString() {
|
public String toString() {
|
||||||
return "{victim:" + victim + "|victimUserID:" + victimUserID + "|date:" + date + "|weapon:" + weapon + '}';
|
return "{victim:" + victim + "|time:" + time + "|weapon:" + weapon + '}';
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -84,7 +75,7 @@ public class KillData {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
final KillData other = (KillData) obj;
|
final KillData other = (KillData) obj;
|
||||||
return this.date == other.date
|
return this.time == other.time
|
||||||
&& Objects.equals(this.weapon, other.weapon)
|
&& Objects.equals(this.weapon, other.weapon)
|
||||||
&& Objects.equals(this.victim, other.victim);
|
&& Objects.equals(this.victim, other.victim);
|
||||||
}
|
}
|
||||||
@ -93,12 +84,12 @@ public class KillData {
|
|||||||
public int hashCode() {
|
public int hashCode() {
|
||||||
int hash = 3;
|
int hash = 3;
|
||||||
hash = 89 * hash + Objects.hashCode(this.victim);
|
hash = 89 * hash + Objects.hashCode(this.victim);
|
||||||
hash = 89 * hash + (int) (this.date ^ (this.date >>> 32));
|
hash = 89 * hash + (int) (this.time ^ (this.time >>> 32));
|
||||||
hash = 89 * hash + Objects.hashCode(this.weapon);
|
hash = 89 * hash + Objects.hashCode(this.weapon);
|
||||||
return hash;
|
return hash;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setVictimUserID(int victimUserID) {
|
public Action convertToAction() {
|
||||||
this.victimUserID = victimUserID;
|
return new Action(time, Actions.KILLED, "name with " + weapon); // TODO Name Cache.
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -6,34 +6,39 @@ import java.util.ArrayList;
|
|||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This class is used for storing start and end of a play session inside UserData
|
* Object for storing various information about a player's play session.
|
||||||
* object.
|
* <p>
|
||||||
|
* Includes:
|
||||||
|
* <ul>
|
||||||
|
* <li>World & GameMode playtimes</li>
|
||||||
|
* <li>Player & Mob kills</li>
|
||||||
|
* <li>Deaths</li>
|
||||||
|
* </ul>
|
||||||
|
* <p>
|
||||||
|
* Following data can be derived from Sessions in the database (Between any time span):
|
||||||
|
* <ul>
|
||||||
|
* <li>Playtime</li>
|
||||||
|
* <li>LoginTimes</li>
|
||||||
|
* </ul>
|
||||||
*
|
*
|
||||||
* @author Rsl1122
|
* @author Rsl1122
|
||||||
*/
|
*/
|
||||||
public class SessionData {
|
public class Session {
|
||||||
|
|
||||||
private final WorldTimes worldTimes; // TODO add World Times to SessionData
|
private Long sessionID;
|
||||||
|
private WorldTimes worldTimes;
|
||||||
private final long sessionStart;
|
private final long sessionStart;
|
||||||
private long sessionEnd;
|
private long sessionEnd;
|
||||||
private final List<KillData> playerKills;
|
private List<KillData> playerKills;
|
||||||
private int mobKills;
|
private int mobKills;
|
||||||
private int deaths;
|
private int deaths;
|
||||||
|
|
||||||
|
|
||||||
@Deprecated // TODO Remove
|
|
||||||
public SessionData(long sessionStart) {
|
|
||||||
worldTimes = null;
|
|
||||||
this.sessionStart = 0;
|
|
||||||
playerKills = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a new session with given start and end of -1.
|
* Creates a new session with given start and end of -1.
|
||||||
*
|
*
|
||||||
* @param sessionStart Epoch millisecond the session was started.
|
* @param sessionStart Epoch millisecond the session was started.
|
||||||
*/
|
*/
|
||||||
public SessionData(long sessionStart, String world, String gm) {
|
public Session(long sessionStart, String world, String gm) {
|
||||||
this.worldTimes = new WorldTimes(world, gm);
|
this.worldTimes = new WorldTimes(world, gm);
|
||||||
this.sessionStart = sessionStart;
|
this.sessionStart = sessionStart;
|
||||||
this.sessionEnd = -1;
|
this.sessionEnd = -1;
|
||||||
@ -48,7 +53,8 @@ public class SessionData {
|
|||||||
* @param sessionStart Epoch millisecond the session was started.
|
* @param sessionStart Epoch millisecond the session was started.
|
||||||
* @param sessionEnd Epoch millisecond the session ended.
|
* @param sessionEnd Epoch millisecond the session ended.
|
||||||
*/
|
*/
|
||||||
public SessionData(long sessionStart, long sessionEnd, WorldTimes worldTimes, List<KillData> playerKills, int mobKills, int deaths) {
|
public Session(long id, long sessionStart, long sessionEnd, int mobKills, int deaths) {
|
||||||
|
this.sessionID = id;
|
||||||
this.sessionStart = sessionStart;
|
this.sessionStart = sessionStart;
|
||||||
this.sessionEnd = sessionEnd;
|
this.sessionEnd = sessionEnd;
|
||||||
this.worldTimes = worldTimes;
|
this.worldTimes = worldTimes;
|
||||||
@ -69,6 +75,29 @@ public class SessionData {
|
|||||||
worldTimes.updateState(endOfSession);
|
worldTimes.updateState(endOfSession);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Updates WorldTimes state.
|
||||||
|
*
|
||||||
|
* @param world World Name the player has moved to
|
||||||
|
* @param gm GameMode the player is in.
|
||||||
|
* @param time Epoch ms of the event.
|
||||||
|
*/
|
||||||
|
public void changeState(String world, String gm, long time) {
|
||||||
|
worldTimes.updateState(world, gm, time);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void playerKilled(KillData kill) {
|
||||||
|
playerKills.add(kill);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void mobKilled() {
|
||||||
|
mobKills++;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void died() {
|
||||||
|
deaths++;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Get the length of the session in milliseconds.
|
* Get the length of the session in milliseconds.
|
||||||
*
|
*
|
||||||
@ -96,14 +125,20 @@ public class SessionData {
|
|||||||
return sessionEnd;
|
return sessionEnd;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
public WorldTimes getWorldTimes() {
|
||||||
* Check if the session start was before the end.
|
return worldTimes;
|
||||||
*
|
}
|
||||||
* @return Is the length positive?
|
|
||||||
*/
|
public List<KillData> getPlayerKills() {
|
||||||
@Deprecated // TODO Remove
|
return playerKills;
|
||||||
public boolean isValid() {
|
}
|
||||||
return sessionStart <= sessionEnd;
|
|
||||||
|
public int getMobKills() {
|
||||||
|
return mobKills;
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getDeaths() {
|
||||||
|
return deaths;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -117,7 +152,7 @@ public class SessionData {
|
|||||||
if (getClass() != obj.getClass()) {
|
if (getClass() != obj.getClass()) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
final SessionData other = (SessionData) obj;
|
final Session other = (Session) obj;
|
||||||
return this.sessionStart == other.sessionStart && this.sessionEnd == other.sessionEnd;
|
return this.sessionStart == other.sessionStart && this.sessionEnd == other.sessionEnd;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -128,4 +163,38 @@ public class SessionData {
|
|||||||
hash = 97 * hash + (int) (this.sessionEnd ^ (this.sessionEnd >>> 32));
|
hash = 97 * hash + (int) (this.sessionEnd ^ (this.sessionEnd >>> 32));
|
||||||
return hash;
|
return hash;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Starts a new Session.
|
||||||
|
*
|
||||||
|
* @param time Time the session started.
|
||||||
|
* @param world World the session started in.
|
||||||
|
* @param gm GameMode the session started in.
|
||||||
|
* @return a new Session object.
|
||||||
|
*/
|
||||||
|
public static Session start(long time, String world, String gm) {
|
||||||
|
return new Session(time, world, gm);
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean isFetchedFromDB() {
|
||||||
|
return sessionID != null;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setWorldTimes(WorldTimes worldTimes) {
|
||||||
|
this.worldTimes = worldTimes;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setPlayerKills(List<KillData> playerKills) {
|
||||||
|
this.playerKills = playerKills;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Used to get the ID of the session in the Database.
|
||||||
|
*
|
||||||
|
* @return ID if present.
|
||||||
|
* @throws NullPointerException if Session was not fetched from DB. Check using {@code isFetchedFromDB}
|
||||||
|
*/
|
||||||
|
public long getSessionID() {
|
||||||
|
return sessionID;
|
||||||
|
}
|
||||||
}
|
}
|
@ -11,7 +11,7 @@ import java.util.*;
|
|||||||
// TODO Change to be only used for DB User Get Query responses.
|
// TODO Change to be only used for DB User Get Query responses.
|
||||||
public class UserData {
|
public class UserData {
|
||||||
|
|
||||||
private final List<SessionData> sessions;
|
private final List<Session> sessions;
|
||||||
private int accessing;
|
private int accessing;
|
||||||
private boolean clearAfterSave;
|
private boolean clearAfterSave;
|
||||||
private UUID uuid;
|
private UUID uuid;
|
||||||
@ -31,8 +31,6 @@ public class UserData {
|
|||||||
@Deprecated
|
@Deprecated
|
||||||
private boolean isBanned; //TODO DB Update code to JoinListener
|
private boolean isBanned; //TODO DB Update code to JoinListener
|
||||||
@Deprecated
|
@Deprecated
|
||||||
private boolean isOnline; //TODO New Class for getting online status of players
|
|
||||||
@Deprecated
|
|
||||||
private long registered; //TODO DB Update code to JoinListener (When registering)
|
private long registered; //TODO DB Update code to JoinListener (When registering)
|
||||||
@Deprecated
|
@Deprecated
|
||||||
private long lastPlayed; //TODO DB Update code to Join, Refresh, QuitListener
|
private long lastPlayed; //TODO DB Update code to Join, Refresh, QuitListener
|
||||||
@ -173,9 +171,9 @@ public class UserData {
|
|||||||
/**
|
/**
|
||||||
* Get the sessions of a player.
|
* Get the sessions of a player.
|
||||||
*
|
*
|
||||||
* @return a list of SessionData.
|
* @return a list of Session.
|
||||||
*/
|
*/
|
||||||
public List<SessionData> getSessions() {
|
public List<Session> getSessions() {
|
||||||
return sessions;
|
return sessions;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2,7 +2,7 @@ package main.java.com.djrapitops.plan.data.analysis;
|
|||||||
|
|
||||||
import com.djrapitops.plugin.api.TimeAmount;
|
import com.djrapitops.plugin.api.TimeAmount;
|
||||||
import com.djrapitops.plugin.utilities.Verify;
|
import com.djrapitops.plugin.utilities.Verify;
|
||||||
import main.java.com.djrapitops.plan.data.SessionData;
|
import main.java.com.djrapitops.plan.data.Session;
|
||||||
import main.java.com.djrapitops.plan.data.TPS;
|
import main.java.com.djrapitops.plan.data.TPS;
|
||||||
import main.java.com.djrapitops.plan.ui.html.graphs.PlayerActivityGraphCreator;
|
import main.java.com.djrapitops.plan.ui.html.graphs.PlayerActivityGraphCreator;
|
||||||
import main.java.com.djrapitops.plan.ui.html.graphs.PunchCardGraphCreator;
|
import main.java.com.djrapitops.plan.ui.html.graphs.PunchCardGraphCreator;
|
||||||
@ -72,13 +72,13 @@ public class ActivityPart extends RawData {
|
|||||||
|
|
||||||
playerActivityGraphs();
|
playerActivityGraphs();
|
||||||
|
|
||||||
final List<SessionData> sessions = joins.getAllSessions();
|
final List<Session> sessions = joins.getAllSessions();
|
||||||
|
|
||||||
List<Long> lengths = AnalysisUtils.transformSessionDataToLengths(sessions);
|
List<Long> lengths = AnalysisUtils.transformSessionDataToLengths(sessions);
|
||||||
long averageLength = MathUtils.averageLong(lengths);
|
long averageLength = MathUtils.averageLong(lengths);
|
||||||
addValue("sessionAverage", FormatUtils.formatTimeAmount(averageLength));
|
addValue("sessionAverage", FormatUtils.formatTimeAmount(averageLength));
|
||||||
|
|
||||||
List<SessionData> sessionsMonth = sessions.stream()
|
List<Session> sessionsMonth = sessions.stream()
|
||||||
.filter(s -> s.getSessionStart() > MiscUtils.getTime() - TimeAmount.MONTH.ms())
|
.filter(s -> s.getSessionStart() > MiscUtils.getTime() - TimeAmount.MONTH.ms())
|
||||||
.collect(Collectors.toList());
|
.collect(Collectors.toList());
|
||||||
addValue("punchCardSeries", PunchCardGraphCreator.createDataSeries(sessionsMonth));
|
addValue("punchCardSeries", PunchCardGraphCreator.createDataSeries(sessionsMonth));
|
||||||
|
@ -2,7 +2,7 @@ package main.java.com.djrapitops.plan.data.analysis;
|
|||||||
|
|
||||||
import com.djrapitops.plugin.api.TimeAmount;
|
import com.djrapitops.plugin.api.TimeAmount;
|
||||||
import com.djrapitops.plugin.utilities.Verify;
|
import com.djrapitops.plugin.utilities.Verify;
|
||||||
import main.java.com.djrapitops.plan.data.SessionData;
|
import main.java.com.djrapitops.plan.data.Session;
|
||||||
import main.java.com.djrapitops.plan.utilities.MiscUtils;
|
import main.java.com.djrapitops.plan.utilities.MiscUtils;
|
||||||
import main.java.com.djrapitops.plan.utilities.analysis.AnalysisUtils;
|
import main.java.com.djrapitops.plan.utilities.analysis.AnalysisUtils;
|
||||||
|
|
||||||
@ -10,7 +10,7 @@ import java.util.*;
|
|||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Part responsible for all Player login related analysis.
|
* Part responsible for all Player player related analysis.
|
||||||
* <p>
|
* <p>
|
||||||
* Placeholder values can be retrieved using the get method.
|
* Placeholder values can be retrieved using the get method.
|
||||||
* <p>
|
* <p>
|
||||||
@ -36,7 +36,7 @@ import java.util.stream.Collectors;
|
|||||||
*/
|
*/
|
||||||
public class JoinInfoPart extends RawData {
|
public class JoinInfoPart extends RawData {
|
||||||
|
|
||||||
private final Map<UUID, List<SessionData>> sessions;
|
private final Map<UUID, List<Session>> sessions;
|
||||||
private final List<Long> registered;
|
private final List<Long> registered;
|
||||||
private long loginTimes;
|
private long loginTimes;
|
||||||
|
|
||||||
@ -108,11 +108,11 @@ public class JoinInfoPart extends RawData {
|
|||||||
return loginTimes;
|
return loginTimes;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Map<UUID, List<SessionData>> getSessions() {
|
public Map<UUID, List<Session>> getSessions() {
|
||||||
return sessions;
|
return sessions;
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<SessionData> getAllSessions() {
|
public List<Session> getAllSessions() {
|
||||||
return MiscUtils.flatMap(sessions.values());
|
return MiscUtils.flatMap(sessions.values());
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -124,7 +124,7 @@ public class JoinInfoPart extends RawData {
|
|||||||
return registered;
|
return registered;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void addSessions(UUID uuid, List<SessionData> sessions) {
|
public void addSessions(UUID uuid, List<Session> sessions) {
|
||||||
Verify.nullCheck(uuid);
|
Verify.nullCheck(uuid);
|
||||||
Verify.nullCheck(sessions);
|
Verify.nullCheck(sessions);
|
||||||
this.sessions.put(uuid, sessions.stream().distinct().collect(Collectors.toList()));
|
this.sessions.put(uuid, sessions.stream().distinct().collect(Collectors.toList()));
|
||||||
|
@ -91,7 +91,7 @@ public class DataCache extends SessionCache {
|
|||||||
* @throws IllegalStateException BukkitScheduler is in a wrong state.
|
* @throws IllegalStateException BukkitScheduler is in a wrong state.
|
||||||
*/
|
*/
|
||||||
public void startAsyncPeriodicSaveTask() {
|
public void startAsyncPeriodicSaveTask() {
|
||||||
DataCache handler = this;
|
DataCache dataCache = this;
|
||||||
plugin.getRunnableFactory().createNew(new AbsRunnable("PeriodicCacheSaveTask") {
|
plugin.getRunnableFactory().createNew(new AbsRunnable("PeriodicCacheSaveTask") {
|
||||||
private int timesSaved = 0;
|
private int timesSaved = 0;
|
||||||
|
|
||||||
@ -134,7 +134,6 @@ public class DataCache extends SessionCache {
|
|||||||
endSession(uuid);
|
endSession(uuid);
|
||||||
String worldName = ((Player) p.getWrappedPlayerClass()).getWorld().getName();
|
String worldName = ((Player) p.getWrappedPlayerClass()).getWorld().getName();
|
||||||
}
|
}
|
||||||
// toProcess.sort(new HandlingInfoTimeComparator());
|
|
||||||
Benchmark.stop("Cache: ProcessOnlineHandlingInfo");
|
Benchmark.stop("Cache: ProcessOnlineHandlingInfo");
|
||||||
try {
|
try {
|
||||||
db.saveCommandUse(commandUse);
|
db.saveCommandUse(commandUse);
|
||||||
|
@ -69,7 +69,7 @@ public class GeolocationCacheHandler {
|
|||||||
* @see <a href="http://freegeoip.net">http://freegeoip.net</a>
|
* @see <a href="http://freegeoip.net">http://freegeoip.net</a>
|
||||||
* @see #getCountry(String)
|
* @see #getCountry(String)
|
||||||
*/
|
*/
|
||||||
public static String getUncachedCountry(String ipAddress) {
|
private static String getUncachedCountry(String ipAddress) {
|
||||||
URL url;
|
URL url;
|
||||||
|
|
||||||
String urlString = "http://freegeoip.net/csv/" + ipAddress;
|
String urlString = "http://freegeoip.net/csv/" + ipAddress;
|
||||||
@ -101,7 +101,7 @@ public class GeolocationCacheHandler {
|
|||||||
* @param ipAddress The IP Address which is retrieved out of the cache
|
* @param ipAddress The IP Address which is retrieved out of the cache
|
||||||
* @return The cached country, {@code null} if the country is not cached
|
* @return The cached country, {@code null} if the country is not cached
|
||||||
*/
|
*/
|
||||||
public static String getCachedCountry(String ipAddress) {
|
private static String getCachedCountry(String ipAddress) {
|
||||||
return geolocationCache.getIfPresent(ipAddress);
|
return geolocationCache.getIfPresent(ipAddress);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -114,4 +114,8 @@ public class GeolocationCacheHandler {
|
|||||||
public static boolean isCached(String ipAddress) {
|
public static boolean isCached(String ipAddress) {
|
||||||
return geolocationCache.asMap().containsKey(ipAddress);
|
return geolocationCache.asMap().containsKey(ipAddress);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static void clearCache() {
|
||||||
|
geolocationCache.invalidateAll();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -23,7 +23,7 @@ import java.util.*;
|
|||||||
@Deprecated
|
@Deprecated
|
||||||
public class InspectCacheHandler {
|
public class InspectCacheHandler {
|
||||||
|
|
||||||
private final DataCache handler;
|
private final DataCache dataCache;
|
||||||
private final Map<UUID, UserData> cache;
|
private final Map<UUID, UserData> cache;
|
||||||
private final Map<UUID, Long> cacheTimes;
|
private final Map<UUID, Long> cacheTimes;
|
||||||
|
|
||||||
@ -33,7 +33,7 @@ public class InspectCacheHandler {
|
|||||||
* @param plugin Current instance of Plan.class
|
* @param plugin Current instance of Plan.class
|
||||||
*/
|
*/
|
||||||
public InspectCacheHandler(Plan plugin) {
|
public InspectCacheHandler(Plan plugin) {
|
||||||
this.handler = plugin.getHandler();
|
this.dataCache = plugin.getDataCache();
|
||||||
this.cache = new HashMap<>();
|
this.cache = new HashMap<>();
|
||||||
cacheTimes = new HashMap<>();
|
cacheTimes = new HashMap<>();
|
||||||
}
|
}
|
||||||
|
@ -1,9 +1,10 @@
|
|||||||
package main.java.com.djrapitops.plan.data.cache;
|
package main.java.com.djrapitops.plan.data.cache;
|
||||||
|
|
||||||
import main.java.com.djrapitops.plan.data.SessionData;
|
import main.java.com.djrapitops.plan.data.Session;
|
||||||
|
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
import java.util.Optional;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -14,7 +15,7 @@ import java.util.UUID;
|
|||||||
*/
|
*/
|
||||||
public class SessionCache {
|
public class SessionCache {
|
||||||
|
|
||||||
private static final Map<UUID, SessionData> activeSessions = new HashMap<>();
|
private static final Map<UUID, Session> activeSessions = new HashMap<>();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Class Constructor.
|
* Class Constructor.
|
||||||
@ -22,17 +23,17 @@ public class SessionCache {
|
|||||||
public SessionCache() {
|
public SessionCache() {
|
||||||
}
|
}
|
||||||
|
|
||||||
public void cacheSession(UUID uuid, SessionData session) {
|
public void cacheSession(UUID uuid, Session session) {
|
||||||
activeSessions.put(uuid, session);
|
activeSessions.put(uuid, session);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void endSession(UUID uuid, long time) {
|
public void endSession(UUID uuid, long time) {
|
||||||
SessionData session = activeSessions.get(uuid);
|
Session session = activeSessions.get(uuid);
|
||||||
if (session == null) {
|
if (session == null) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
session.endSession(time);
|
session.endSession(time);
|
||||||
|
// TODO DB Save the session.
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -54,14 +55,17 @@ public class SessionCache {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Used to get the SessionData of the player in the sessionCache.
|
* Used to get the Session of the player in the sessionCache.
|
||||||
*
|
*
|
||||||
* @param uuid UUID of the player.
|
* @param uuid UUID of the player.
|
||||||
* @return SessionData or null if not cached.
|
* @return Session or null if not cached.
|
||||||
*/
|
*/
|
||||||
@Deprecated
|
public Optional<Session> getCachedSession(UUID uuid) {
|
||||||
public SessionData getSession(UUID uuid) {
|
Session session = activeSessions.get(uuid);
|
||||||
return activeSessions.get(uuid);
|
if (session != null) {
|
||||||
|
return Optional.of(session);
|
||||||
|
}
|
||||||
|
return Optional.empty();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -69,10 +73,10 @@ public class SessionCache {
|
|||||||
* <p>
|
* <p>
|
||||||
* Used for testing.
|
* Used for testing.
|
||||||
*
|
*
|
||||||
* @return key:value UUID:SessionData
|
* @return key:value UUID:Session
|
||||||
*/
|
*/
|
||||||
@Deprecated
|
@Deprecated
|
||||||
public Map<UUID, SessionData> getActiveSessions() {
|
public Map<UUID, Session> getActiveSessions() {
|
||||||
return activeSessions;
|
return activeSessions;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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.Log;
|
||||||
import main.java.com.djrapitops.plan.Plan;
|
import main.java.com.djrapitops.plan.Plan;
|
||||||
import main.java.com.djrapitops.plan.data.UserData;
|
import main.java.com.djrapitops.plan.data.UserData;
|
||||||
import org.apache.commons.lang3.text.WordUtils;
|
|
||||||
import org.bukkit.Material;
|
|
||||||
import org.bukkit.entity.LivingEntity;
|
import org.bukkit.entity.LivingEntity;
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
|
|
||||||
@ -56,13 +54,4 @@ public class KillHandling {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Normalizes a material name
|
|
||||||
*
|
|
||||||
* @param material The material
|
|
||||||
* @return The normalized material name
|
|
||||||
*/
|
|
||||||
public static String normalizeMaterialName(Material material) {
|
|
||||||
return WordUtils.capitalizeFully(material.name(), '_').replace('_', ' ');
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -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;
|
package main.java.com.djrapitops.plan.data.listeners;
|
||||||
|
|
||||||
import main.java.com.djrapitops.plan.Plan;
|
import main.java.com.djrapitops.plan.Plan;
|
||||||
import main.java.com.djrapitops.plan.data.handling.info.ChatInfo;
|
import main.java.com.djrapitops.plan.data.handling.player.NameProcessor;
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
import org.bukkit.event.EventHandler;
|
import org.bukkit.event.EventHandler;
|
||||||
import org.bukkit.event.EventPriority;
|
import org.bukkit.event.EventPriority;
|
||||||
@ -38,6 +38,6 @@ public class PlanChatListener implements Listener {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Player p = event.getPlayer();
|
Player p = event.getPlayer();
|
||||||
plugin.addToProcessQueue(new ChatInfo(p.getUniqueId(), p.getDisplayName()));
|
plugin.addToProcessQueue(new NameProcessor(p.getUniqueId(), p.getName(), p.getDisplayName()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,5 @@
|
|||||||
package main.java.com.djrapitops.plan.data.listeners;
|
package main.java.com.djrapitops.plan.data.listeners;
|
||||||
|
|
||||||
import main.java.com.djrapitops.plan.Log;
|
|
||||||
import main.java.com.djrapitops.plan.Permissions;
|
import main.java.com.djrapitops.plan.Permissions;
|
||||||
import main.java.com.djrapitops.plan.Plan;
|
import main.java.com.djrapitops.plan.Plan;
|
||||||
import main.java.com.djrapitops.plan.Settings;
|
import main.java.com.djrapitops.plan.Settings;
|
||||||
@ -20,7 +19,7 @@ import org.bukkit.event.player.PlayerCommandPreprocessEvent;
|
|||||||
public class PlanCommandPreprocessListener implements Listener {
|
public class PlanCommandPreprocessListener implements Listener {
|
||||||
|
|
||||||
private final Plan plugin;
|
private final Plan plugin;
|
||||||
private final DataCache handler;
|
private final DataCache dataCache;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Class Constructor.
|
* Class Constructor.
|
||||||
@ -29,7 +28,7 @@ public class PlanCommandPreprocessListener implements Listener {
|
|||||||
*/
|
*/
|
||||||
public PlanCommandPreprocessListener(Plan plugin) {
|
public PlanCommandPreprocessListener(Plan plugin) {
|
||||||
this.plugin = plugin;
|
this.plugin = plugin;
|
||||||
handler = plugin.getHandler();
|
dataCache = plugin.getDataCache();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -42,6 +41,10 @@ public class PlanCommandPreprocessListener implements Listener {
|
|||||||
if (event.isCancelled()) {
|
if (event.isCancelled()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
Player player = event.getPlayer();
|
||||||
|
if (player.hasPermission(Permissions.IGNORE_COMMANDUSE.getPermission())) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
String commandName = event.getMessage().substring(1).split(" ")[0].toLowerCase();
|
String commandName = event.getMessage().substring(1).split(" ")[0].toLowerCase();
|
||||||
|
|
||||||
@ -52,21 +55,13 @@ public class PlanCommandPreprocessListener implements Listener {
|
|||||||
Command command = plugin.getServer().getPluginCommand(commandName);
|
Command command = plugin.getServer().getPluginCommand(commandName);
|
||||||
if (command == null) {
|
if (command == null) {
|
||||||
if (doNotLogUnknownCommands) {
|
if (doNotLogUnknownCommands) {
|
||||||
Log.debug("Ignored command, command is unknown");
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
} else if (combineCommandAliasesToMainCommand) {
|
} else if (combineCommandAliasesToMainCommand) {
|
||||||
commandName = command.getName();
|
commandName = command.getName();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// TODO Command Usage -> DB Save Processor
|
||||||
Player player = event.getPlayer();
|
dataCache.handleCommand(commandName);
|
||||||
|
|
||||||
if (player.hasPermission(Permissions.IGNORE_COMMANDUSE.getPermission())) {
|
|
||||||
Log.debug("Ignored command, player had ignore permission.");
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
handler.handleCommand(commandName);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,8 +1,7 @@
|
|||||||
package main.java.com.djrapitops.plan.data.listeners;
|
package main.java.com.djrapitops.plan.data.listeners;
|
||||||
|
|
||||||
import main.java.com.djrapitops.plan.Plan;
|
import main.java.com.djrapitops.plan.Plan;
|
||||||
import main.java.com.djrapitops.plan.data.handling.info.InfoType;
|
import main.java.com.djrapitops.plan.data.Session;
|
||||||
import main.java.com.djrapitops.plan.data.handling.info.PlaytimeDependentInfo;
|
|
||||||
import main.java.com.djrapitops.plan.utilities.MiscUtils;
|
import main.java.com.djrapitops.plan.utilities.MiscUtils;
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
import org.bukkit.event.EventHandler;
|
import org.bukkit.event.EventHandler;
|
||||||
@ -10,6 +9,7 @@ import org.bukkit.event.EventPriority;
|
|||||||
import org.bukkit.event.Listener;
|
import org.bukkit.event.Listener;
|
||||||
import org.bukkit.event.player.PlayerGameModeChangeEvent;
|
import org.bukkit.event.player.PlayerGameModeChangeEvent;
|
||||||
|
|
||||||
|
import java.util.Optional;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -40,13 +40,16 @@ public class PlanGamemodeChangeListener implements Listener {
|
|||||||
if (event.isCancelled()) {
|
if (event.isCancelled()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
Player p = event.getPlayer();
|
Player p = event.getPlayer();
|
||||||
UUID uuid = p.getUniqueId();
|
UUID uuid = p.getUniqueId();
|
||||||
long time = MiscUtils.getTime();
|
long time = MiscUtils.getTime();
|
||||||
String gameMode = event.getNewGameMode().name();
|
String gameMode = event.getNewGameMode().name();
|
||||||
String worldName = p.getWorld().getName();
|
String worldName = p.getWorld().getName();
|
||||||
|
|
||||||
plugin.addToProcessQueue(new PlaytimeDependentInfo(uuid, InfoType.GM, time, gameMode, worldName));
|
Optional<Session> cachedSession = plugin.getDataCache().getCachedSession(uuid);
|
||||||
|
if (cachedSession.isPresent()) {
|
||||||
|
Session session = cachedSession.get();
|
||||||
|
session.changeState(worldName, gameMode, time);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,26 +1,21 @@
|
|||||||
package main.java.com.djrapitops.plan.data.listeners;
|
package main.java.com.djrapitops.plan.data.listeners;
|
||||||
|
|
||||||
import com.djrapitops.plugin.task.AbsRunnable;
|
|
||||||
import com.djrapitops.plugin.utilities.player.Fetch;
|
import com.djrapitops.plugin.utilities.player.Fetch;
|
||||||
import com.djrapitops.plugin.utilities.player.Gamemode;
|
|
||||||
import com.djrapitops.plugin.utilities.player.IPlayer;
|
|
||||||
import main.java.com.djrapitops.plan.Plan;
|
import main.java.com.djrapitops.plan.Plan;
|
||||||
import main.java.com.djrapitops.plan.data.UserData;
|
import main.java.com.djrapitops.plan.data.Session;
|
||||||
import main.java.com.djrapitops.plan.data.cache.DataCache;
|
import main.java.com.djrapitops.plan.data.cache.DataCache;
|
||||||
import main.java.com.djrapitops.plan.data.handling.info.KickInfo;
|
import main.java.com.djrapitops.plan.data.handling.DBCommitProcessor;
|
||||||
import main.java.com.djrapitops.plan.data.handling.info.LoginInfo;
|
import main.java.com.djrapitops.plan.data.handling.player.*;
|
||||||
import main.java.com.djrapitops.plan.data.handling.info.LogoutInfo;
|
|
||||||
import main.java.com.djrapitops.plan.utilities.MiscUtils;
|
import main.java.com.djrapitops.plan.utilities.MiscUtils;
|
||||||
import main.java.com.djrapitops.plan.utilities.NewPlayerCreator;
|
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
import org.bukkit.event.EventHandler;
|
import org.bukkit.event.EventHandler;
|
||||||
import org.bukkit.event.EventPriority;
|
import org.bukkit.event.EventPriority;
|
||||||
import org.bukkit.event.Listener;
|
import org.bukkit.event.Listener;
|
||||||
import org.bukkit.event.player.PlayerJoinEvent;
|
import org.bukkit.event.player.PlayerJoinEvent;
|
||||||
import org.bukkit.event.player.PlayerKickEvent;
|
import org.bukkit.event.player.PlayerKickEvent;
|
||||||
|
import org.bukkit.event.player.PlayerLoginEvent;
|
||||||
import org.bukkit.event.player.PlayerQuitEvent;
|
import org.bukkit.event.player.PlayerQuitEvent;
|
||||||
|
|
||||||
import java.net.InetAddress;
|
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -32,89 +27,34 @@ import java.util.UUID;
|
|||||||
public class PlanPlayerListener implements Listener {
|
public class PlanPlayerListener implements Listener {
|
||||||
|
|
||||||
private final Plan plugin;
|
private final Plan plugin;
|
||||||
private final DataCache handler;
|
private final DataCache cache;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Class Constructor.
|
* Class Constructor.
|
||||||
* <p>
|
|
||||||
* Copies the references to multiple handlers from Current instance of handler.
|
|
||||||
*
|
*
|
||||||
* @param plugin Current instance of Plan
|
* @param plugin Current instance of Plan
|
||||||
*/
|
*/
|
||||||
public PlanPlayerListener(Plan plugin) {
|
public PlanPlayerListener(Plan plugin) {
|
||||||
this.plugin = plugin;
|
this.plugin = plugin;
|
||||||
handler = plugin.getHandler();
|
cache = plugin.getDataCache();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* PlayerJoinEvent Listener.
|
|
||||||
* <p>
|
|
||||||
* If player is a new player, creates new data for the player.
|
|
||||||
* <p>
|
|
||||||
* Adds a LoginInfo to the processingQueue if the user is not new.
|
|
||||||
*
|
|
||||||
* @param event The Fired event.
|
|
||||||
*/
|
|
||||||
@EventHandler(priority = EventPriority.MONITOR)
|
@EventHandler(priority = EventPriority.MONITOR)
|
||||||
public void onPlayerLogin(PlayerJoinEvent event) {
|
public void onPlayerLogin(PlayerLoginEvent event) {
|
||||||
Player player = event.getPlayer();
|
PlayerLoginEvent.Result result = event.getResult();
|
||||||
|
UUID uuid = event.getPlayer().getUniqueId();
|
||||||
IPlayer iPlayer = Fetch.wrapBukkit(player);
|
if (result == PlayerLoginEvent.Result.KICK_BANNED) {
|
||||||
plugin.getNotificationCenter().checkNotifications(iPlayer);
|
plugin.addToProcessQueue(new BanProcessor(uuid, true));
|
||||||
|
} else {
|
||||||
UUID uuid = player.getUniqueId();
|
plugin.addToProcessQueue(new BanProcessor(uuid, false));
|
||||||
handler.startSession(uuid);
|
}
|
||||||
plugin.getRunnableFactory().createNew(new AbsRunnable("NewPlayerCheckTask") {
|
|
||||||
@Override
|
|
||||||
public void run() {
|
|
||||||
long time = MiscUtils.getTime();
|
|
||||||
InetAddress ip = player.getAddress().getAddress();
|
|
||||||
boolean banned = player.isBanned();
|
|
||||||
String displayName = player.getDisplayName();
|
|
||||||
String gm = player.getGameMode().name();
|
|
||||||
String worldName = player.getWorld().getName();
|
|
||||||
|
|
||||||
LoginInfo loginInfo = new LoginInfo(uuid, time, ip, banned, displayName, gm, 1, worldName);
|
|
||||||
boolean isNewPlayer = !plugin.getDB().wasSeenBefore(uuid);
|
|
||||||
|
|
||||||
if (isNewPlayer) {
|
|
||||||
UserData newUserData = NewPlayerCreator.createNewPlayer(iPlayer);
|
|
||||||
loginInfo.process(newUserData);
|
|
||||||
// TODO Rewrite Register & Login system handler.newPlayer(newUserData);
|
|
||||||
} else {
|
|
||||||
// handler.addToPool(loginInfo);
|
|
||||||
}
|
|
||||||
this.cancel();
|
|
||||||
}
|
|
||||||
}).runTaskAsynchronously();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* PlayerQuitEvent Listener.
|
|
||||||
* <p>
|
|
||||||
* Adds a LogoutInfo to the processing Queue.
|
|
||||||
*
|
|
||||||
* @param event Fired event
|
|
||||||
*/
|
|
||||||
@EventHandler(priority = EventPriority.MONITOR)
|
|
||||||
public void onPlayerQuit(PlayerQuitEvent event) {
|
|
||||||
// TODO Rewrite Logout system
|
|
||||||
Player player = event.getPlayer();
|
|
||||||
UUID uuid = player.getUniqueId();
|
|
||||||
handler.endSession(uuid);
|
|
||||||
|
|
||||||
long time = MiscUtils.getTime();
|
|
||||||
boolean banned = player.isBanned();
|
|
||||||
Gamemode gm = Gamemode.wrap(player.getGameMode());
|
|
||||||
String worldName = player.getWorld().getName();
|
|
||||||
|
|
||||||
plugin.addToProcessQueue(new LogoutInfo(uuid, time, banned, gm.name(), worldName));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* PlayerKickEvent Listener.
|
* PlayerKickEvent Listener.
|
||||||
* <p>
|
* <p>
|
||||||
* Adds a KickInfo & LogoutInfo to the processing Queue.
|
* Adds processing information to the ProcessingQueue.
|
||||||
|
* After KickEvent, the QuitEvent is automatically called.
|
||||||
*
|
*
|
||||||
* @param event Fired event
|
* @param event Fired event
|
||||||
*/
|
*/
|
||||||
@ -123,18 +63,62 @@ public class PlanPlayerListener implements Listener {
|
|||||||
if (event.isCancelled()) {
|
if (event.isCancelled()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
UUID uuid = event.getPlayer().getUniqueId();
|
||||||
|
plugin.addToProcessQueue(new KickProcessor(uuid));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* PlayerJoinEvent Listener.
|
||||||
|
* <p>
|
||||||
|
* Adds processing information to the ProcessingQueue.
|
||||||
|
*
|
||||||
|
* @param event The Fired event.
|
||||||
|
*/
|
||||||
|
@EventHandler(priority = EventPriority.MONITOR)
|
||||||
|
public void onPlayerJoin(PlayerJoinEvent event) {
|
||||||
|
Player player = event.getPlayer();
|
||||||
|
plugin.getNotificationCenter().checkNotifications(Fetch.wrapBukkit(player));
|
||||||
|
|
||||||
|
UUID uuid = player.getUniqueId();
|
||||||
|
long time = MiscUtils.getTime();
|
||||||
|
|
||||||
|
String world = player.getWorld().getName();
|
||||||
|
String gm = player.getGameMode().name();
|
||||||
|
|
||||||
|
String ip = player.getAddress().getAddress().toString();
|
||||||
|
|
||||||
|
String playerName = player.getName();
|
||||||
|
String displayName = player.getDisplayName();
|
||||||
|
|
||||||
|
int playersOnline = plugin.getTpsCountTimer().getLatestPlayersOnline();
|
||||||
|
|
||||||
|
cache.cacheSession(uuid, Session.start(time, world, gm));
|
||||||
|
|
||||||
|
plugin.addToProcessQueue(
|
||||||
|
new RegisterProcessor(uuid, time, playersOnline), //TODO Add required variables after UsersTable is done.
|
||||||
|
new IPUpdateProcessor(uuid, ip),
|
||||||
|
new NameProcessor(uuid, playerName, displayName),
|
||||||
|
new DBCommitProcessor(plugin.getDB())
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* PlayerQuitEvent Listener.
|
||||||
|
* <p>
|
||||||
|
* Adds processing information to the ProcessingQueue.
|
||||||
|
*
|
||||||
|
* @param event Fired event
|
||||||
|
*/
|
||||||
|
@EventHandler(priority = EventPriority.MONITOR)
|
||||||
|
public void onPlayerQuit(PlayerQuitEvent event) {
|
||||||
|
|
||||||
|
long time = MiscUtils.getTime();
|
||||||
Player player = event.getPlayer();
|
Player player = event.getPlayer();
|
||||||
UUID uuid = player.getUniqueId();
|
UUID uuid = player.getUniqueId();
|
||||||
|
|
||||||
handler.endSession(uuid);
|
plugin.addToProcessQueue(
|
||||||
|
new BanProcessor(uuid, player.isBanned()),
|
||||||
long time = MiscUtils.getTime();
|
new EndSessionProcessor(uuid, time)
|
||||||
boolean banned = player.isBanned();
|
);
|
||||||
Gamemode gm = Gamemode.wrap(player.getGameMode());
|
|
||||||
String worldName = player.getWorld().getName();
|
|
||||||
//TODO String geoLocation = GeolocationCacheHandler.getCountry(ip.getHostAddress());
|
|
||||||
plugin.addToProcessQueue(new LogoutInfo(uuid, time, banned, gm.name(), worldName));
|
|
||||||
plugin.addToProcessQueue(new KickInfo(uuid));
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,8 +1,7 @@
|
|||||||
package main.java.com.djrapitops.plan.data.listeners;
|
package main.java.com.djrapitops.plan.data.listeners;
|
||||||
|
|
||||||
import main.java.com.djrapitops.plan.Plan;
|
import main.java.com.djrapitops.plan.Plan;
|
||||||
import main.java.com.djrapitops.plan.data.handling.info.InfoType;
|
import main.java.com.djrapitops.plan.data.Session;
|
||||||
import main.java.com.djrapitops.plan.data.handling.info.PlaytimeDependentInfo;
|
|
||||||
import main.java.com.djrapitops.plan.utilities.MiscUtils;
|
import main.java.com.djrapitops.plan.utilities.MiscUtils;
|
||||||
import org.bukkit.entity.Player;
|
import org.bukkit.entity.Player;
|
||||||
import org.bukkit.event.EventHandler;
|
import org.bukkit.event.EventHandler;
|
||||||
@ -10,6 +9,7 @@ import org.bukkit.event.EventPriority;
|
|||||||
import org.bukkit.event.Listener;
|
import org.bukkit.event.Listener;
|
||||||
import org.bukkit.event.player.PlayerChangedWorldEvent;
|
import org.bukkit.event.player.PlayerChangedWorldEvent;
|
||||||
|
|
||||||
|
import java.util.Optional;
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
|
|
||||||
public class PlanWorldChangeListener implements Listener {
|
public class PlanWorldChangeListener implements Listener {
|
||||||
@ -22,17 +22,16 @@ public class PlanWorldChangeListener implements Listener {
|
|||||||
@EventHandler(priority = EventPriority.MONITOR)
|
@EventHandler(priority = EventPriority.MONITOR)
|
||||||
public void onWorldChange(PlayerChangedWorldEvent event) {
|
public void onWorldChange(PlayerChangedWorldEvent event) {
|
||||||
Player p = event.getPlayer();
|
Player p = event.getPlayer();
|
||||||
|
|
||||||
String previousWorld = event.getFrom().getName();
|
|
||||||
String worldName = p.getWorld().getName();
|
String worldName = p.getWorld().getName();
|
||||||
if (previousWorld.equals(worldName)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
UUID uuid = p.getUniqueId();
|
UUID uuid = p.getUniqueId();
|
||||||
String gameMode = p.getGameMode().name();
|
String gameMode = p.getGameMode().name();
|
||||||
long time = MiscUtils.getTime();
|
long time = MiscUtils.getTime();
|
||||||
|
|
||||||
plugin.addToProcessQueue(new PlaytimeDependentInfo(uuid, InfoType.WORLD, time, gameMode, worldName));
|
Optional<Session> cachedSession = plugin.getDataCache().getCachedSession(uuid);
|
||||||
|
if (cachedSession.isPresent()) {
|
||||||
|
Session session = cachedSession.get();
|
||||||
|
session.changeState(worldName, gameMode, time);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -23,14 +23,16 @@ import java.util.List;
|
|||||||
public class TPSCountTimer extends AbsRunnable {
|
public class TPSCountTimer extends AbsRunnable {
|
||||||
|
|
||||||
private final Plan plugin;
|
private final Plan plugin;
|
||||||
private final DataCache handler;
|
private final DataCache dataCache;
|
||||||
private final List<TPS> history;
|
private final List<TPS> history;
|
||||||
private long lastCheckNano;
|
private long lastCheckNano;
|
||||||
|
|
||||||
|
private int latestPlayersOnline = 0;
|
||||||
|
|
||||||
public TPSCountTimer(Plan plugin) {
|
public TPSCountTimer(Plan plugin) {
|
||||||
super("TPSCountTimer");
|
super("TPSCountTimer");
|
||||||
lastCheckNano = -1;
|
lastCheckNano = -1;
|
||||||
this.handler = plugin.getHandler();
|
this.dataCache = plugin.getDataCache();
|
||||||
this.plugin = plugin;
|
this.plugin = plugin;
|
||||||
history = new ArrayList<>();
|
history = new ArrayList<>();
|
||||||
}
|
}
|
||||||
@ -52,7 +54,8 @@ public class TPSCountTimer extends AbsRunnable {
|
|||||||
history.add(tps);
|
history.add(tps);
|
||||||
|
|
||||||
if (history.size() >= 60) {
|
if (history.size() >= 60) {
|
||||||
handler.addTPSLastMinute(history);
|
// TODO Process & Save to DB with a new Processor.
|
||||||
|
dataCache.addTPSLastMinute(history);
|
||||||
history.clear();
|
history.clear();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -79,6 +82,7 @@ public class TPSCountTimer extends AbsRunnable {
|
|||||||
long usedMemory = (totalMemory - runtime.freeMemory()) / 1000000;
|
long usedMemory = (totalMemory - runtime.freeMemory()) / 1000000;
|
||||||
|
|
||||||
int playersOnline = plugin.getServer().getOnlinePlayers().size();
|
int playersOnline = plugin.getServer().getOnlinePlayers().size();
|
||||||
|
latestPlayersOnline = playersOnline;
|
||||||
int loadedChunks = getLoadedChunks();
|
int loadedChunks = getLoadedChunks();
|
||||||
int entityCount;
|
int entityCount;
|
||||||
|
|
||||||
@ -167,4 +171,8 @@ public class TPSCountTimer extends AbsRunnable {
|
|||||||
private int getEntityCountPaper() {
|
private int getEntityCountPaper() {
|
||||||
return plugin.getServer().getWorlds().stream().mapToInt(World::getEntityCount).sum();
|
return plugin.getServer().getWorlds().stream().mapToInt(World::getEntityCount).sum();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public int getLatestPlayersOnline() {
|
||||||
|
return latestPlayersOnline;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -321,4 +321,6 @@ public abstract class Database {
|
|||||||
public ServerTable getServerTable() {
|
public ServerTable getServerTable() {
|
||||||
return serverTable;
|
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.Log;
|
||||||
import main.java.com.djrapitops.plan.Plan;
|
import main.java.com.djrapitops.plan.Plan;
|
||||||
import main.java.com.djrapitops.plan.data.KillData;
|
import main.java.com.djrapitops.plan.data.KillData;
|
||||||
import main.java.com.djrapitops.plan.data.SessionData;
|
import main.java.com.djrapitops.plan.data.Session;
|
||||||
import main.java.com.djrapitops.plan.data.UserData;
|
import main.java.com.djrapitops.plan.data.UserData;
|
||||||
import main.java.com.djrapitops.plan.database.Database;
|
import main.java.com.djrapitops.plan.database.Database;
|
||||||
import main.java.com.djrapitops.plan.database.tables.*;
|
import main.java.com.djrapitops.plan.database.tables.*;
|
||||||
@ -363,7 +363,7 @@ public abstract class SQLDB extends Database {
|
|||||||
Map<Integer, List<String>> nicknames = nicknamesTable.getNicknames(ids);
|
Map<Integer, List<String>> nicknames = nicknamesTable.getNicknames(ids);
|
||||||
Map<Integer, Set<InetAddress>> ipList = ipsTable.getIPList(ids);
|
Map<Integer, Set<InetAddress>> ipList = ipsTable.getIPList(ids);
|
||||||
Map<Integer, List<KillData>> playerKills = killsTable.getPlayerKills(ids, idUuidRel);
|
Map<Integer, List<KillData>> playerKills = killsTable.getPlayerKills(ids, idUuidRel);
|
||||||
Map<Integer, List<SessionData>> sessionData = sessionsTable.getSessionData(ids);
|
Map<Integer, List<Session>> sessionData = sessionsTable.getSessionData(ids);
|
||||||
Map<Integer, Map<String, Long>> worldTimes = worldTimesTable.getWorldTimes(ids);
|
Map<Integer, Map<String, Long>> worldTimes = worldTimesTable.getWorldTimes(ids);
|
||||||
|
|
||||||
Log.debug("Database",
|
Log.debug("Database",
|
||||||
|
@ -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;
|
package main.java.com.djrapitops.plan.database.tables;
|
||||||
|
|
||||||
|
import main.java.com.djrapitops.plan.Log;
|
||||||
|
import main.java.com.djrapitops.plan.Plan;
|
||||||
|
import main.java.com.djrapitops.plan.data.Action;
|
||||||
|
import main.java.com.djrapitops.plan.database.databases.SQLDB;
|
||||||
|
import main.java.com.djrapitops.plan.database.sql.Select;
|
||||||
|
import main.java.com.djrapitops.plan.database.sql.Sql;
|
||||||
|
import main.java.com.djrapitops.plan.database.sql.TableSqlParser;
|
||||||
|
|
||||||
|
import java.sql.PreparedStatement;
|
||||||
|
import java.sql.ResultSet;
|
||||||
|
import java.sql.SQLException;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* //TODO Class Javadoc Comment
|
* Table that is in charge of storing actions.
|
||||||
|
* <p>
|
||||||
|
* plan_actions contains columns:
|
||||||
|
* <ul>
|
||||||
|
* <li>user_id (plan_users: id)</li>
|
||||||
|
* <li>server_id (plan_servers: id)</li>
|
||||||
|
* <li>action_id</li>
|
||||||
|
* <li>date</li>
|
||||||
|
* <li>additional_info</li>
|
||||||
|
* </ul>
|
||||||
*
|
*
|
||||||
* @author Rsl1122
|
* @author Rsl1122
|
||||||
*/
|
*/
|
||||||
public class ActionsTable {
|
public class ActionsTable extends UserIDTable {
|
||||||
// TODO Actions table
|
|
||||||
// time, action, additional info
|
private final String columnServerID = "server_id";
|
||||||
|
private final String columnDate = "date";
|
||||||
|
private final String columnActionID = "action_id";
|
||||||
|
private final String columnAdditionalInfo = "additional_info";
|
||||||
|
|
||||||
|
public ActionsTable(String name, SQLDB db, boolean usingMySQL) {
|
||||||
|
super(name, db, usingMySQL);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean createTable() {
|
||||||
|
|
||||||
|
ServerTable serverTable = db.getServerTable();
|
||||||
|
try {
|
||||||
|
execute(TableSqlParser.createTable(tableName)
|
||||||
|
.column(columnUserID, Sql.INT).notNull()
|
||||||
|
.column(columnServerID, Sql.INT).notNull()
|
||||||
|
.column(columnDate, Sql.LONG).notNull()
|
||||||
|
.column(columnActionID, Sql.INT).notNull()
|
||||||
|
.column(columnAdditionalInfo, Sql.varchar(100))
|
||||||
|
.foreignKey(columnUserID, usersTable.toString(), usersTable.getColumnID())
|
||||||
|
.foreignKey(columnServerID, serverTable.toString(), serverTable.getColumnID())
|
||||||
|
.toString());
|
||||||
|
return true;
|
||||||
|
} catch (SQLException ex) {
|
||||||
|
Log.toLog(this.getClass().getName(), ex);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void insertAction(UUID uuid, Action action) throws SQLException {
|
||||||
|
PreparedStatement statement = null;
|
||||||
|
try {
|
||||||
|
ServerTable serverTable = db.getServerTable();
|
||||||
|
statement = prepareStatement("INSERT INTO " + tableName + " ("
|
||||||
|
+ columnUserID + ", "
|
||||||
|
+ columnServerID + ", "
|
||||||
|
+ columnActionID + ", "
|
||||||
|
+ columnDate + ", "
|
||||||
|
+ columnAdditionalInfo
|
||||||
|
+ ") VALUES ("
|
||||||
|
+ usersTable.statementSelectID + ", "
|
||||||
|
+ serverTable.statementSelectServerID + ", "
|
||||||
|
+ "?, ?, ?)"
|
||||||
|
);
|
||||||
|
statement.setString(1, uuid.toString());
|
||||||
|
statement.setString(2, Plan.getServerUUID().toString());
|
||||||
|
statement.setInt(3, action.getDoneAction().getId());
|
||||||
|
statement.setLong(4, action.getDate());
|
||||||
|
statement.setString(5, action.getAdditionalInfo());
|
||||||
|
statement.execute();
|
||||||
|
} finally {
|
||||||
|
close(statement);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Used to get all Actions done by a user on this server.
|
||||||
|
*
|
||||||
|
* @param uuid
|
||||||
|
* @return
|
||||||
|
* @throws SQLException
|
||||||
|
*/
|
||||||
|
public List<Action> getActions(UUID uuid) throws SQLException {
|
||||||
|
List<Action> actions = new ArrayList<>();
|
||||||
|
PreparedStatement statement = null;
|
||||||
|
ResultSet set = null;
|
||||||
|
try {
|
||||||
|
ServerTable serverTable = db.getServerTable();
|
||||||
|
statement = prepareStatement(Select.from(tableName, "*")
|
||||||
|
.where(columnUserID + "=" + usersTable.statementSelectID)
|
||||||
|
.toString());
|
||||||
|
set = statement.executeQuery();
|
||||||
|
while (set.next()) {
|
||||||
|
int serverID = set.getInt(columnServerID);
|
||||||
|
long date = set.getLong(columnDate);
|
||||||
|
Actions doneAction = Actions.getById(set.getInt(columnActionID));
|
||||||
|
String additionalInfo = set.getString(columnAdditionalInfo);
|
||||||
|
actions.add(new Action(date, doneAction, additionalInfo, serverID));
|
||||||
|
}
|
||||||
|
return actions;
|
||||||
|
} finally {
|
||||||
|
close(set, statement);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
@ -2,7 +2,9 @@ package main.java.com.djrapitops.plan.database.tables;
|
|||||||
|
|
||||||
import com.djrapitops.plugin.utilities.Verify;
|
import com.djrapitops.plugin.utilities.Verify;
|
||||||
import main.java.com.djrapitops.plan.Log;
|
import main.java.com.djrapitops.plan.Log;
|
||||||
|
import main.java.com.djrapitops.plan.Plan;
|
||||||
import main.java.com.djrapitops.plan.database.databases.SQLDB;
|
import main.java.com.djrapitops.plan.database.databases.SQLDB;
|
||||||
|
import main.java.com.djrapitops.plan.database.sql.Select;
|
||||||
import main.java.com.djrapitops.plan.database.sql.Sql;
|
import main.java.com.djrapitops.plan.database.sql.Sql;
|
||||||
import main.java.com.djrapitops.plan.database.sql.TableSqlParser;
|
import main.java.com.djrapitops.plan.database.sql.TableSqlParser;
|
||||||
import main.java.com.djrapitops.plan.utilities.Benchmark;
|
import main.java.com.djrapitops.plan.utilities.Benchmark;
|
||||||
@ -12,15 +14,19 @@ import java.sql.ResultSet;
|
|||||||
import java.sql.SQLException;
|
import java.sql.SQLException;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
import java.util.Optional;
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Rsl1122
|
* @author Rsl1122
|
||||||
*/
|
*/
|
||||||
public class CommandUseTable extends Table {
|
public class CommandUseTable extends Table {
|
||||||
|
|
||||||
private final String columnCommand;
|
private final String columnCommandId = "id";
|
||||||
private final String columnTimesUsed;
|
private final String columnCommand = "command";
|
||||||
private final String columnServerID; //TODO
|
private final String columnTimesUsed = "times_used";
|
||||||
|
private final String columnServerID = "server_id";
|
||||||
|
private ServerTable serverTable;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param db
|
* @param db
|
||||||
@ -28,9 +34,7 @@ public class CommandUseTable extends Table {
|
|||||||
*/
|
*/
|
||||||
public CommandUseTable(SQLDB db, boolean usingMySQL) {
|
public CommandUseTable(SQLDB db, boolean usingMySQL) {
|
||||||
super("plan_commandusages", db, usingMySQL);
|
super("plan_commandusages", db, usingMySQL);
|
||||||
columnCommand = "command";
|
serverTable = db.getServerTable();
|
||||||
columnTimesUsed = "times_used";
|
|
||||||
columnServerID = "server_id";
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -38,10 +42,15 @@ public class CommandUseTable extends Table {
|
|||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public boolean createTable() {
|
public boolean createTable() {
|
||||||
|
ServerTable serverTable = db.getServerTable();
|
||||||
try {
|
try {
|
||||||
execute(TableSqlParser.createTable(tableName)
|
execute(TableSqlParser.createTable(tableName)
|
||||||
|
.primaryKeyIDColumn(usingMySQL, columnCommandId, Sql.INT)
|
||||||
.column(columnCommand, Sql.varchar(20)).notNull()
|
.column(columnCommand, Sql.varchar(20)).notNull()
|
||||||
.column(columnTimesUsed, Sql.INT).notNull()
|
.column(columnTimesUsed, Sql.INT).notNull()
|
||||||
|
.column(columnServerID, Sql.INT).notNull()
|
||||||
|
.primaryKey(usingMySQL, columnCommandId)
|
||||||
|
.foreignKey(columnServerID, serverTable.toString(), serverTable.getColumnID())
|
||||||
.toString()
|
.toString()
|
||||||
);
|
);
|
||||||
return true;
|
return true;
|
||||||
@ -52,15 +61,34 @@ public class CommandUseTable extends Table {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return @throws SQLException
|
* Used to get all commands used in this server.
|
||||||
|
*
|
||||||
|
* @return command - times used Map
|
||||||
|
* @throws SQLException
|
||||||
*/
|
*/
|
||||||
public Map<String, Integer> getCommandUse() throws SQLException {
|
public Map<String, Integer> getCommandUse() throws SQLException {
|
||||||
|
return getCommandUse(Plan.getServerUUID());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Used to get all commands used in a server.
|
||||||
|
*
|
||||||
|
* @param serverUUID UUID of the server.
|
||||||
|
* @return command - times used Map
|
||||||
|
* @throws SQLException
|
||||||
|
*/
|
||||||
|
public Map<String, Integer> getCommandUse(UUID serverUUID) throws SQLException {
|
||||||
|
ServerTable serverTable = db.getServerTable();
|
||||||
Benchmark.start("Get CommandUse");
|
Benchmark.start("Get CommandUse");
|
||||||
Map<String, Integer> commandUse = new HashMap<>();
|
Map<String, Integer> commandUse = new HashMap<>();
|
||||||
PreparedStatement statement = null;
|
PreparedStatement statement = null;
|
||||||
ResultSet set = null;
|
ResultSet set = null;
|
||||||
try {
|
try {
|
||||||
statement = prepareStatement("SELECT * FROM " + tableName);
|
statement = prepareStatement(Select.from(tableName,
|
||||||
|
columnCommand, columnTimesUsed)
|
||||||
|
.where(columnServerID + "=" + serverTable.statementSelectServerID)
|
||||||
|
.toString());
|
||||||
|
statement.setString(1, serverUUID.toString());
|
||||||
set = statement.executeQuery();
|
set = statement.executeQuery();
|
||||||
while (set.next()) {
|
while (set.next()) {
|
||||||
String cmd = set.getString(columnCommand).toLowerCase();
|
String cmd = set.getString(columnCommand).toLowerCase();
|
||||||
@ -102,7 +130,6 @@ public class CommandUseTable extends Table {
|
|||||||
String cmd = savedEntry.getKey();
|
String cmd = savedEntry.getKey();
|
||||||
// IMPORTANT - not using saved as value
|
// IMPORTANT - not using saved as value
|
||||||
Integer toSave = updateData.get(cmd);
|
Integer toSave = updateData.get(cmd);
|
||||||
|
|
||||||
if (toSave != null && toSave <= savedEntry.getValue()) {
|
if (toSave != null && toSave <= savedEntry.getValue()) {
|
||||||
updateData.remove(cmd);
|
updateData.remove(cmd);
|
||||||
}
|
}
|
||||||
@ -117,7 +144,10 @@ public class CommandUseTable extends Table {
|
|||||||
private void updateCommands(Map<String, Integer> data) throws SQLException {
|
private void updateCommands(Map<String, Integer> data) throws SQLException {
|
||||||
PreparedStatement statement = null;
|
PreparedStatement statement = null;
|
||||||
try {
|
try {
|
||||||
String updateStatement = "UPDATE " + tableName + " SET " + columnTimesUsed + "=? WHERE (" + columnCommand + "=?)";
|
String updateStatement = "UPDATE " + tableName + " SET " +
|
||||||
|
columnTimesUsed + "=? " +
|
||||||
|
"WHERE (" + columnCommand + "=?) AND (" +
|
||||||
|
columnServerID + "=" + serverTable.statementSelectServerID + ")";
|
||||||
statement = prepareStatement(updateStatement);
|
statement = prepareStatement(updateStatement);
|
||||||
boolean commitRequired = false;
|
boolean commitRequired = false;
|
||||||
for (Map.Entry<String, Integer> entrySet : data.entrySet()) {
|
for (Map.Entry<String, Integer> entrySet : data.entrySet()) {
|
||||||
@ -130,6 +160,7 @@ public class CommandUseTable extends Table {
|
|||||||
|
|
||||||
statement.setInt(1, amount);
|
statement.setInt(1, amount);
|
||||||
statement.setString(2, key);
|
statement.setString(2, key);
|
||||||
|
statement.setString(3, Plan.getServerUUID().toString());
|
||||||
statement.addBatch();
|
statement.addBatch();
|
||||||
commitRequired = true;
|
commitRequired = true;
|
||||||
}
|
}
|
||||||
@ -147,10 +178,11 @@ public class CommandUseTable extends Table {
|
|||||||
try {
|
try {
|
||||||
String insertStatement = "INSERT INTO " + tableName + " ("
|
String insertStatement = "INSERT INTO " + tableName + " ("
|
||||||
+ columnCommand + ", "
|
+ columnCommand + ", "
|
||||||
+ columnTimesUsed
|
+ columnTimesUsed + ", "
|
||||||
+ ") VALUES (?, ?)";
|
+ columnServerID
|
||||||
|
+ ") VALUES (?, ?, " + serverTable.statementSelectServerID + ")";
|
||||||
statement = prepareStatement(insertStatement);
|
statement = prepareStatement(insertStatement);
|
||||||
boolean commitRequired = false;
|
boolean addedRows = false;
|
||||||
for (Map.Entry<String, Integer> entrySet : data.entrySet()) {
|
for (Map.Entry<String, Integer> entrySet : data.entrySet()) {
|
||||||
String key = entrySet.getKey();
|
String key = entrySet.getKey();
|
||||||
Integer amount = entrySet.getValue();
|
Integer amount = entrySet.getValue();
|
||||||
@ -161,15 +193,48 @@ public class CommandUseTable extends Table {
|
|||||||
|
|
||||||
statement.setString(1, key);
|
statement.setString(1, key);
|
||||||
statement.setInt(2, amount);
|
statement.setInt(2, amount);
|
||||||
|
statement.setString(3, Plan.getServerUUID().toString());
|
||||||
statement.addBatch();
|
statement.addBatch();
|
||||||
commitRequired = true;
|
addedRows = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (commitRequired) {
|
if (addedRows) {
|
||||||
statement.executeBatch();
|
statement.executeBatch();
|
||||||
}
|
}
|
||||||
} finally {
|
} finally {
|
||||||
close(statement);
|
close(statement);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Optional<String> getCommandByID(int id) throws SQLException {
|
||||||
|
PreparedStatement statement = null;
|
||||||
|
ResultSet set = null;
|
||||||
|
try {
|
||||||
|
statement = prepareStatement(Select.from(tableName, columnCommand).where(columnCommandId + "=?").toString());
|
||||||
|
statement.setInt(1, id);
|
||||||
|
set = statement.executeQuery();
|
||||||
|
if (set.next()) {
|
||||||
|
return Optional.of(set.getString(columnCommand));
|
||||||
|
}
|
||||||
|
return Optional.empty();
|
||||||
|
} finally {
|
||||||
|
close(statement);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public Optional<Integer> getCommandID(String command) throws SQLException {
|
||||||
|
PreparedStatement statement = null;
|
||||||
|
ResultSet set = null;
|
||||||
|
try {
|
||||||
|
statement = prepareStatement(Select.from(tableName, columnCommandId).where(columnCommand + "=?").toString());
|
||||||
|
statement.setString(1, command);
|
||||||
|
set = statement.executeQuery();
|
||||||
|
if (set.next()) {
|
||||||
|
return Optional.of(set.getInt(columnCommandId));
|
||||||
|
}
|
||||||
|
return Optional.empty();
|
||||||
|
} finally {
|
||||||
|
close(statement);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,26 +1,28 @@
|
|||||||
package main.java.com.djrapitops.plan.database.tables;
|
package main.java.com.djrapitops.plan.database.tables;
|
||||||
|
|
||||||
import com.djrapitops.plugin.utilities.Verify;
|
|
||||||
import main.java.com.djrapitops.plan.Log;
|
import main.java.com.djrapitops.plan.Log;
|
||||||
import main.java.com.djrapitops.plan.database.databases.SQLDB;
|
import main.java.com.djrapitops.plan.database.databases.SQLDB;
|
||||||
|
import main.java.com.djrapitops.plan.database.sql.Select;
|
||||||
import main.java.com.djrapitops.plan.database.sql.Sql;
|
import main.java.com.djrapitops.plan.database.sql.Sql;
|
||||||
import main.java.com.djrapitops.plan.database.sql.TableSqlParser;
|
import main.java.com.djrapitops.plan.database.sql.TableSqlParser;
|
||||||
import main.java.com.djrapitops.plan.utilities.Benchmark;
|
|
||||||
|
|
||||||
import java.net.InetAddress;
|
|
||||||
import java.net.UnknownHostException;
|
|
||||||
import java.sql.PreparedStatement;
|
import java.sql.PreparedStatement;
|
||||||
import java.sql.ResultSet;
|
import java.sql.ResultSet;
|
||||||
import java.sql.SQLException;
|
import java.sql.SQLException;
|
||||||
import java.util.*;
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Optional;
|
||||||
|
import java.util.UUID;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Rsl1122
|
* @author Rsl1122
|
||||||
*/
|
*/
|
||||||
public class IPsTable extends UserIDTable {
|
public class IPsTable extends UserIDTable {
|
||||||
|
|
||||||
private final String columnIP;
|
// TODO Write tests
|
||||||
private final String columnGeolocation; // TODO
|
|
||||||
|
private final String columnIP = "ip";
|
||||||
|
private final String columnGeolocation = "geolocation";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param db The database
|
* @param db The database
|
||||||
@ -28,9 +30,6 @@ public class IPsTable extends UserIDTable {
|
|||||||
*/
|
*/
|
||||||
public IPsTable(SQLDB db, boolean usingMySQL) {
|
public IPsTable(SQLDB db, boolean usingMySQL) {
|
||||||
super("plan_ips", db, usingMySQL);
|
super("plan_ips", db, usingMySQL);
|
||||||
columnUserID = "user_id";
|
|
||||||
columnIP = "ip";
|
|
||||||
columnGeolocation = "geolocation";
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -43,6 +42,7 @@ public class IPsTable extends UserIDTable {
|
|||||||
execute(TableSqlParser.createTable(tableName)
|
execute(TableSqlParser.createTable(tableName)
|
||||||
.column(columnUserID, Sql.INT).notNull()
|
.column(columnUserID, Sql.INT).notNull()
|
||||||
.column(columnIP, Sql.varchar(20)).notNull()
|
.column(columnIP, Sql.varchar(20)).notNull()
|
||||||
|
.column(columnGeolocation, Sql.varchar(50)).notNull()
|
||||||
.foreignKey(columnUserID, usersTable.getTableName(), usersTable.getColumnID())
|
.foreignKey(columnUserID, usersTable.getTableName(), usersTable.getColumnID())
|
||||||
.toString()
|
.toString()
|
||||||
);
|
);
|
||||||
@ -62,176 +62,81 @@ public class IPsTable extends UserIDTable {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param userId The User ID from which the IPs should be retrieved from
|
* @param uuid UUID of the user.
|
||||||
* @return The retrieved IPs
|
* @return Users's Login Geolocations.
|
||||||
* @throws SQLException when an error at retrieval happens
|
* @throws SQLException when an error at retrieval happens
|
||||||
*/
|
*/
|
||||||
public List<InetAddress> getIPAddresses(int userId) throws SQLException {
|
public List<String> getGeolocations(UUID uuid) throws SQLException {
|
||||||
|
return getStringList(uuid, columnGeolocation);
|
||||||
|
}
|
||||||
|
|
||||||
|
public List<String> getIps(UUID uuid) throws SQLException {
|
||||||
|
return getStringList(uuid, columnIP);
|
||||||
|
}
|
||||||
|
|
||||||
|
private List<String> getStringList(UUID uuid, String column) throws SQLException {
|
||||||
PreparedStatement statement = null;
|
PreparedStatement statement = null;
|
||||||
ResultSet set = null;
|
ResultSet set = null;
|
||||||
try {
|
try {
|
||||||
List<InetAddress> ips = new ArrayList<>();
|
List<String> stringList = new ArrayList<>();
|
||||||
|
|
||||||
statement = prepareStatement("SELECT * FROM " + tableName + " WHERE UPPER(" + columnUserID + ") LIKE UPPER(?)");
|
statement = prepareStatement(Select.from(tableName, column)
|
||||||
statement.setInt(1, userId);
|
.where(columnUserID + "=" + usersTable.statementSelectID)
|
||||||
|
.toString());
|
||||||
|
statement.setString(1, uuid.toString());
|
||||||
set = statement.executeQuery();
|
set = statement.executeQuery();
|
||||||
while (set.next()) {
|
while (set.next()) {
|
||||||
String ipAddressName = set.getString(columnIP);
|
stringList.add(set.getString(column));
|
||||||
try {
|
|
||||||
ips.add(InetAddress.getByName(ipAddressName));
|
|
||||||
} catch (UnknownHostException e) {
|
|
||||||
Log.error("Host not found at getIPAddresses: " + ipAddressName); //Shouldn't ever happen
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return ips;
|
return stringList;
|
||||||
} finally {
|
} finally {
|
||||||
close(set, statement);
|
close(set, statement);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
public void updateIP(UUID uuid, String ip, String geolocation) throws SQLException {
|
||||||
* @param userId The User ID for which the IPs should be saved for
|
List<String> ips = getIps(uuid);
|
||||||
* @param ips The IPs
|
if (ips.contains(ip)) {
|
||||||
* @throws SQLException when an error at saving happens
|
|
||||||
*/
|
|
||||||
public void saveIPList(int userId, Set<InetAddress> ips) throws SQLException {
|
|
||||||
if (ips == null) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
ips.removeAll(getIPAddresses(userId));
|
|
||||||
|
|
||||||
if (ips.isEmpty()) {
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
insertIp(uuid, ip, geolocation);
|
||||||
|
}
|
||||||
|
|
||||||
|
private void insertIp(UUID uuid, String ip, String geolocation) throws SQLException {
|
||||||
PreparedStatement statement = null;
|
PreparedStatement statement = null;
|
||||||
try {
|
try {
|
||||||
statement = prepareStatement("INSERT INTO " + tableName + " ("
|
statement = prepareStatement("INSERT INTO " + tableName + " ("
|
||||||
+ columnUserID + ", "
|
+ columnUserID + ", "
|
||||||
+ columnIP
|
+ columnIP + ", "
|
||||||
+ ") VALUES (?, ?)");
|
+ columnGeolocation
|
||||||
boolean commitRequired = false;
|
+ ") VALUES ("
|
||||||
|
+ usersTable.statementSelectID + ", "
|
||||||
for (InetAddress ip : ips) {
|
+ "?, ?)");
|
||||||
if (ip == null) {
|
statement.setString(1, uuid.toString());
|
||||||
continue;
|
statement.setString(2, ip);
|
||||||
}
|
statement.setString(3, geolocation);
|
||||||
|
statement.execute();
|
||||||
statement.setInt(1, userId);
|
|
||||||
statement.setString(2, ip.getHostAddress());
|
|
||||||
statement.addBatch();
|
|
||||||
|
|
||||||
commitRequired = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (commitRequired) {
|
|
||||||
statement.executeBatch();
|
|
||||||
}
|
|
||||||
} finally {
|
} finally {
|
||||||
close(statement);
|
close(statement);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
public Optional<String> getGeolocation(String ip) throws SQLException {
|
||||||
* @param ids The User IDs for which the IPs should be retrieved for
|
|
||||||
* @return The User IDs corresponding with their used IPs
|
|
||||||
* @throws SQLException when an error at retrieval happens
|
|
||||||
*/
|
|
||||||
public Map<Integer, Set<InetAddress>> getIPList(Collection<Integer> ids) throws SQLException {
|
|
||||||
if (Verify.isEmpty(ids)) {
|
|
||||||
return new HashMap<>();
|
|
||||||
}
|
|
||||||
|
|
||||||
Benchmark.start("Get Ips Multiple");
|
|
||||||
PreparedStatement statement = null;
|
PreparedStatement statement = null;
|
||||||
ResultSet set = null;
|
ResultSet set = null;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
statement = prepareStatement("SELECT * FROM " + tableName);
|
statement = prepareStatement(Select.from(tableName, columnGeolocation)
|
||||||
|
.where(columnIP + "=?")
|
||||||
|
.toString());
|
||||||
|
statement.setString(1, ip);
|
||||||
set = statement.executeQuery();
|
set = statement.executeQuery();
|
||||||
Map<Integer, Set<InetAddress>> ips = new HashMap<>();
|
if (set.next()) {
|
||||||
|
return Optional.of(set.getString(columnGeolocation));
|
||||||
for (Integer id : ids) {
|
|
||||||
ips.put(id, new HashSet<>());
|
|
||||||
}
|
}
|
||||||
|
return Optional.empty();
|
||||||
while (set.next()) {
|
|
||||||
Integer id = set.getInt(columnUserID);
|
|
||||||
|
|
||||||
if (!ids.contains(id)) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
String ipAddressName = set.getString(columnIP);
|
|
||||||
|
|
||||||
try {
|
|
||||||
ips.get(id).add(InetAddress.getByName(ipAddressName));
|
|
||||||
} catch (UnknownHostException e) {
|
|
||||||
Log.error("Host not found at getIPAddresses: " + ipAddressName); //Shouldn't ever happen
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return ips;
|
|
||||||
} finally {
|
} finally {
|
||||||
close(set, statement);
|
close(set, statement);
|
||||||
Benchmark.stop("Database", "Get Ips Multiple");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param ips The User IDs corresponding to their IPs used
|
|
||||||
* @throws SQLException when an error at saving happens
|
|
||||||
*/
|
|
||||||
public void saveIPList(Map<Integer, Set<InetAddress>> ips) throws SQLException {
|
|
||||||
if (Verify.isEmpty(ips)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
Benchmark.start("Save Ips Multiple");
|
|
||||||
Map<Integer, Set<InetAddress>> saved = getIPList(ips.keySet());
|
|
||||||
|
|
||||||
PreparedStatement statement = null;
|
|
||||||
try {
|
|
||||||
statement = prepareStatement("INSERT INTO " + tableName + " ("
|
|
||||||
+ columnUserID + ", "
|
|
||||||
+ columnIP
|
|
||||||
+ ") VALUES (?, ?)");
|
|
||||||
boolean commitRequired = false;
|
|
||||||
|
|
||||||
for (Map.Entry<Integer, Set<InetAddress>> entrySet : ips.entrySet()) {
|
|
||||||
Integer id = entrySet.getKey();
|
|
||||||
Set<InetAddress> ipAddresses = entrySet.getValue();
|
|
||||||
|
|
||||||
Set<InetAddress> s = saved.get(id);
|
|
||||||
|
|
||||||
if (s != null) {
|
|
||||||
ipAddresses.removeAll(s);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ipAddresses.isEmpty()) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (InetAddress ip : ipAddresses) {
|
|
||||||
if (ip == null) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
statement.setInt(1, id);
|
|
||||||
statement.setString(2, ip.getHostAddress());
|
|
||||||
statement.addBatch();
|
|
||||||
commitRequired = true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (commitRequired) {
|
|
||||||
statement.executeBatch();
|
|
||||||
}
|
|
||||||
} finally {
|
|
||||||
close(statement);
|
|
||||||
Benchmark.stop("Database", "Save Ips Multiple");
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -18,12 +18,12 @@ import java.util.*;
|
|||||||
*/
|
*/
|
||||||
public class KillsTable extends Table {
|
public class KillsTable extends Table {
|
||||||
|
|
||||||
private final String columnKillerUserID;
|
private final String columnKillerUserID = "killer_id";
|
||||||
private final String columnVictimUserID;
|
private final String columnVictimUserID = "victim_id";
|
||||||
private final String columnWeapon;
|
private final String columnWeapon = "weapon";
|
||||||
private final String columnDate;
|
private final String columnDate = "date";
|
||||||
private final String columnServerID; //TODO
|
private final String columnServerID = "server_id"; //TODO
|
||||||
private final String columnSessionID; //TODO
|
private final String columnSessionID = "session_id"; //TODO
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param db
|
* @param db
|
||||||
@ -31,12 +31,6 @@ public class KillsTable extends Table {
|
|||||||
*/
|
*/
|
||||||
public KillsTable(SQLDB db, boolean usingMySQL) {
|
public KillsTable(SQLDB db, boolean usingMySQL) {
|
||||||
super("plan_kills", db, usingMySQL);
|
super("plan_kills", db, usingMySQL);
|
||||||
columnWeapon = "weapon";
|
|
||||||
columnDate = "date";
|
|
||||||
columnKillerUserID = "killer_id";
|
|
||||||
columnVictimUserID = "victim_id";
|
|
||||||
columnServerID = "server_id";
|
|
||||||
columnSessionID = "session_id";
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -97,9 +91,8 @@ public class KillsTable extends Table {
|
|||||||
set = statement.executeQuery();
|
set = statement.executeQuery();
|
||||||
List<KillData> killData = new ArrayList<>();
|
List<KillData> killData = new ArrayList<>();
|
||||||
while (set.next()) {
|
while (set.next()) {
|
||||||
int victimID = set.getInt(columnVictimUserID);
|
UUID victimUUID = null; // TODO Victim UUID Retrieval
|
||||||
UUID victimUUID = usersTable.getUserUUID(String.valueOf(victimID));
|
killData.add(new KillData(victimUUID, set.getString(columnWeapon), set.getLong(columnDate)));
|
||||||
killData.add(new KillData(victimUUID, victimID, set.getString(columnWeapon), set.getLong(columnDate)));
|
|
||||||
}
|
}
|
||||||
return killData;
|
return killData;
|
||||||
} finally {
|
} finally {
|
||||||
@ -128,26 +121,14 @@ public class KillsTable extends Table {
|
|||||||
+ columnDate
|
+ columnDate
|
||||||
+ ") VALUES (?, ?, ?, ?)");
|
+ ") VALUES (?, ?, ?, ?)");
|
||||||
boolean commitRequired = false;
|
boolean commitRequired = false;
|
||||||
kills.stream().filter(Objects::nonNull).forEach(killData -> {
|
|
||||||
int victimUserID = killData.getVictimUserID();
|
|
||||||
if (victimUserID == -1) {
|
|
||||||
try {
|
|
||||||
int newVictimID = db.getUsersTable().getUserId(killData.getVictim());
|
|
||||||
killData.setVictimUserID(newVictimID);
|
|
||||||
} catch (SQLException e) {
|
|
||||||
Log.toLog(this.getClass().getName(), e);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
for (KillData kill : kills) {
|
for (KillData kill : kills) {
|
||||||
if (kill == null || kill.getVictimUserID() == -1) {
|
if (kill == null) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
statement.setInt(1, userId);
|
statement.setInt(1, userId);
|
||||||
statement.setInt(2, kill.getVictimUserID());
|
statement.setInt(2, -1); // TODO Victim ID Retrieval
|
||||||
statement.setString(3, kill.getWeapon());
|
statement.setString(3, kill.getWeapon());
|
||||||
statement.setLong(4, kill.getDate());
|
statement.setLong(4, kill.getTime());
|
||||||
statement.addBatch();
|
statement.addBatch();
|
||||||
commitRequired = true;
|
commitRequired = true;
|
||||||
}
|
}
|
||||||
@ -183,12 +164,11 @@ public class KillsTable extends Table {
|
|||||||
}
|
}
|
||||||
while (set.next()) {
|
while (set.next()) {
|
||||||
int killerID = set.getInt(columnKillerUserID);
|
int killerID = set.getInt(columnKillerUserID);
|
||||||
int victimID = set.getInt(columnVictimUserID);
|
|
||||||
if (!ids.contains(killerID)) {
|
if (!ids.contains(killerID)) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
UUID victimUUID = uuids.get(victimID);
|
UUID victimUUID = null; // TODO Victim UUID Retrieval
|
||||||
kills.get(killerID).add(new KillData(victimUUID, victimID, set.getString(columnWeapon), set.getLong(columnDate)));
|
kills.get(killerID).add(new KillData(victimUUID, set.getString(columnWeapon), set.getLong(columnDate)));
|
||||||
}
|
}
|
||||||
return kills;
|
return kills;
|
||||||
} finally {
|
} finally {
|
||||||
@ -230,16 +210,11 @@ public class KillsTable extends Table {
|
|||||||
playerKills.removeAll(s);
|
playerKills.removeAll(s);
|
||||||
}
|
}
|
||||||
|
|
||||||
findMissingIDs(playerKills);
|
|
||||||
|
|
||||||
for (KillData kill : playerKills) {
|
for (KillData kill : playerKills) {
|
||||||
if (kill.getVictimUserID() == -1) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
statement.setInt(1, id);
|
statement.setInt(1, id);
|
||||||
statement.setInt(2, kill.getVictimUserID());
|
statement.setInt(2, -1); // TODO Victim ID Retrieval
|
||||||
statement.setString(3, kill.getWeapon());
|
statement.setString(3, kill.getWeapon());
|
||||||
statement.setLong(4, kill.getDate());
|
statement.setLong(4, kill.getTime());
|
||||||
statement.addBatch();
|
statement.addBatch();
|
||||||
commitRequired = true;
|
commitRequired = true;
|
||||||
}
|
}
|
||||||
@ -254,13 +229,7 @@ public class KillsTable extends Table {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void findMissingIDs(List<KillData> playerKills) throws SQLException {
|
public void savePlayerKills(UUID uuid, List<KillData> playerKills) {
|
||||||
for (KillData killData : playerKills) {
|
// TODO savePlayerKills
|
||||||
int victimUserID = killData.getVictimUserID();
|
|
||||||
if (victimUserID == -1) {
|
|
||||||
int newVictimID = db.getUsersTable().getUserId(killData.getVictim());
|
|
||||||
killData.setVictimUserID(newVictimID);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -17,9 +17,9 @@ import java.util.*;
|
|||||||
*/
|
*/
|
||||||
public class NicknamesTable extends UserIDTable {
|
public class NicknamesTable extends UserIDTable {
|
||||||
|
|
||||||
private final String columnNick;
|
private final String columnNick = "nickname";
|
||||||
private final String columnCurrent;
|
private final String columnCurrent = "current_nick";
|
||||||
private final String columnServerID; //TODO
|
private final String columnServerID = "server_id"; //TODO
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param db The database
|
* @param db The database
|
||||||
@ -27,10 +27,6 @@ public class NicknamesTable extends UserIDTable {
|
|||||||
*/
|
*/
|
||||||
public NicknamesTable(SQLDB db, boolean usingMySQL) {
|
public NicknamesTable(SQLDB db, boolean usingMySQL) {
|
||||||
super("plan_nicknames", db, usingMySQL);
|
super("plan_nicknames", db, usingMySQL);
|
||||||
columnUserID = "user_id";
|
|
||||||
columnNick = "nickname";
|
|
||||||
columnCurrent = "current_nick";
|
|
||||||
columnServerID = "server_id";
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -13,33 +13,38 @@ import main.java.com.djrapitops.plan.database.sql.*;
|
|||||||
import java.sql.PreparedStatement;
|
import java.sql.PreparedStatement;
|
||||||
import java.sql.ResultSet;
|
import java.sql.ResultSet;
|
||||||
import java.sql.SQLException;
|
import java.sql.SQLException;
|
||||||
import java.util.ArrayList;
|
import java.util.*;
|
||||||
import java.util.List;
|
|
||||||
import java.util.Optional;
|
|
||||||
import java.util.UUID;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Table representing plan_servers in the database.
|
* Table for managing multiple server's data in the database.
|
||||||
* <p>
|
* <p>
|
||||||
* Used for managing multiple server's data in the database.
|
* plan_servers contains columns:
|
||||||
|
* <ul>
|
||||||
|
* <li>id</li>
|
||||||
|
* <li>uuid</li>
|
||||||
|
* <li>name</li>
|
||||||
|
* <li>web_address</li>
|
||||||
|
* <li>is_installed</li>
|
||||||
|
* </ul>
|
||||||
|
* Columns refer to Server Information.
|
||||||
*
|
*
|
||||||
* @author Rsl1122
|
* @author Rsl1122
|
||||||
*/
|
*/
|
||||||
public class ServerTable extends Table {
|
public class ServerTable extends Table {
|
||||||
|
|
||||||
private final String columnServerID;
|
private final String columnServerID = "id";
|
||||||
private final String columnServerUUID;
|
private final String columnServerUUID = "uuid";
|
||||||
private final String columnServerName;
|
private final String columnServerName = "name";
|
||||||
private final String columnWebserverAddress;
|
private final String columnWebserverAddress = "web_address";
|
||||||
private final String columnInstalled;
|
private final String columnInstalled = "is_installed";
|
||||||
|
|
||||||
|
public final String statementSelectServerID;
|
||||||
|
public final String statementSelectServerNameID;
|
||||||
|
|
||||||
public ServerTable(SQLDB db, boolean usingMySQL) {
|
public ServerTable(SQLDB db, boolean usingMySQL) {
|
||||||
super("plan_servers", db, usingMySQL);
|
super("plan_servers", db, usingMySQL);
|
||||||
columnServerID = "id";
|
statementSelectServerID = "(" + Select.from(tableName, tableName + "." + columnServerID).where(columnServerUUID + "=?").toString() + ")";
|
||||||
columnServerUUID = "uuid";
|
statementSelectServerNameID = "(" + Select.from(tableName, tableName + "." + columnServerName).where(columnServerID + "=?").toString() + ")";
|
||||||
columnServerName = "name";
|
|
||||||
columnWebserverAddress = "web_address";
|
|
||||||
columnInstalled = "is_installed";
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -175,6 +180,25 @@ public class ServerTable extends Table {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public Map<Integer, String> getServerNames() throws SQLException {
|
||||||
|
Map<Integer, String> names = new HashMap<>();
|
||||||
|
PreparedStatement statement = null;
|
||||||
|
ResultSet set = null;
|
||||||
|
try {
|
||||||
|
statement = prepareStatement(Select.from(tableName,
|
||||||
|
columnServerName)
|
||||||
|
.toString());
|
||||||
|
set = statement.executeQuery();
|
||||||
|
while (set.next()) {
|
||||||
|
int id = set.getInt(columnServerID);
|
||||||
|
names.put(id, set.getString(columnServerName));
|
||||||
|
}
|
||||||
|
return names;
|
||||||
|
} finally {
|
||||||
|
close(set, statement);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Used to get BungeeCord WebServer info if present.
|
* Used to get BungeeCord WebServer info if present.
|
||||||
*
|
*
|
||||||
@ -226,4 +250,8 @@ public class ServerTable extends Table {
|
|||||||
close(set, statement);
|
close(set, statement);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public String getColumnID() {
|
||||||
|
return tableName + "." + columnServerID;
|
||||||
|
}
|
||||||
}
|
}
|
@ -1,12 +1,12 @@
|
|||||||
package main.java.com.djrapitops.plan.database.tables;
|
package main.java.com.djrapitops.plan.database.tables;
|
||||||
|
|
||||||
import main.java.com.djrapitops.plan.Log;
|
import main.java.com.djrapitops.plan.Log;
|
||||||
import main.java.com.djrapitops.plan.data.SessionData;
|
import main.java.com.djrapitops.plan.Plan;
|
||||||
import main.java.com.djrapitops.plan.database.Container;
|
import main.java.com.djrapitops.plan.data.Session;
|
||||||
import main.java.com.djrapitops.plan.database.databases.SQLDB;
|
import main.java.com.djrapitops.plan.database.databases.SQLDB;
|
||||||
|
import main.java.com.djrapitops.plan.database.sql.Select;
|
||||||
import main.java.com.djrapitops.plan.database.sql.Sql;
|
import main.java.com.djrapitops.plan.database.sql.Sql;
|
||||||
import main.java.com.djrapitops.plan.database.sql.TableSqlParser;
|
import main.java.com.djrapitops.plan.database.sql.TableSqlParser;
|
||||||
import main.java.com.djrapitops.plan.utilities.Benchmark;
|
|
||||||
|
|
||||||
import java.sql.PreparedStatement;
|
import java.sql.PreparedStatement;
|
||||||
import java.sql.ResultSet;
|
import java.sql.ResultSet;
|
||||||
@ -18,12 +18,14 @@ import java.util.*;
|
|||||||
*/
|
*/
|
||||||
public class SessionsTable extends UserIDTable {
|
public class SessionsTable extends UserIDTable {
|
||||||
|
|
||||||
private final String columnSessionID; //TODO
|
private final String columnSessionID = "id";
|
||||||
private final String columnSessionStart;
|
private final String columnSessionStart = "session_start";
|
||||||
private final String columnSessionEnd;
|
private final String columnSessionEnd = "session_end";
|
||||||
private final String columnServerID; //TODO
|
private final String columnServerID = "server_id";
|
||||||
private final String columnMobKills; //TODO
|
private final String columnMobKills = "mob_kills";
|
||||||
private final String columnDeaths; //TODO
|
private final String columnDeaths = "deaths";
|
||||||
|
|
||||||
|
private final ServerTable serverTable;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param db
|
* @param db
|
||||||
@ -31,13 +33,7 @@ public class SessionsTable extends UserIDTable {
|
|||||||
*/
|
*/
|
||||||
public SessionsTable(SQLDB db, boolean usingMySQL) {
|
public SessionsTable(SQLDB db, boolean usingMySQL) {
|
||||||
super("plan_sessions", db, usingMySQL);
|
super("plan_sessions", db, usingMySQL);
|
||||||
columnUserID = "user_id";
|
serverTable = db.getServerTable();
|
||||||
columnSessionStart = "session_start";
|
|
||||||
columnSessionEnd = "session_end";
|
|
||||||
columnServerID = "server_id";
|
|
||||||
columnSessionID = "id";
|
|
||||||
columnMobKills = "mob_kills";
|
|
||||||
columnDeaths = "deaths";
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -46,12 +42,17 @@ public class SessionsTable extends UserIDTable {
|
|||||||
@Override
|
@Override
|
||||||
public boolean createTable() {
|
public boolean createTable() {
|
||||||
try {
|
try {
|
||||||
UsersTable usersTable = db.getUsersTable();
|
|
||||||
execute(TableSqlParser.createTable(tableName)
|
execute(TableSqlParser.createTable(tableName)
|
||||||
|
.primaryKeyIDColumn(usingMySQL, columnServerID, Sql.LONG)
|
||||||
.column(columnUserID, Sql.INT).notNull()
|
.column(columnUserID, Sql.INT).notNull()
|
||||||
|
.column(columnServerID, Sql.INT).notNull()
|
||||||
.column(columnSessionStart, Sql.LONG).notNull()
|
.column(columnSessionStart, Sql.LONG).notNull()
|
||||||
.column(columnSessionEnd, Sql.LONG).notNull()
|
.column(columnSessionEnd, Sql.LONG).notNull()
|
||||||
|
.column(columnMobKills, Sql.INT).notNull()
|
||||||
|
.column(columnDeaths, Sql.INT).notNull()
|
||||||
.foreignKey(columnUserID, usersTable.getTableName(), usersTable.getColumnID())
|
.foreignKey(columnUserID, usersTable.getTableName(), usersTable.getColumnID())
|
||||||
|
.foreignKey(columnServerID, serverTable.getTableName(), serverTable.getColumnID())
|
||||||
|
.primaryKey(usingMySQL, columnSessionID)
|
||||||
.toString()
|
.toString()
|
||||||
);
|
);
|
||||||
return true;
|
return true;
|
||||||
@ -62,31 +63,10 @@ public class SessionsTable extends UserIDTable {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param userId
|
* Removes User's Sessions from the Database.
|
||||||
* @return
|
* <p>
|
||||||
* @throws SQLException
|
* // TODO KILLS SHOULD BE REMOVED FIRST.
|
||||||
*/
|
*
|
||||||
public List<SessionData> getSessionData(int userId) throws SQLException {
|
|
||||||
PreparedStatement statement = null;
|
|
||||||
ResultSet set = null;
|
|
||||||
try {
|
|
||||||
statement = prepareStatement("SELECT * FROM " + tableName + " WHERE (" + columnUserID + "=?)");
|
|
||||||
statement.setInt(1, userId);
|
|
||||||
set = statement.executeQuery();
|
|
||||||
List<SessionData> sessions = new ArrayList<>();
|
|
||||||
while (set.next()) {
|
|
||||||
// sessions.add(new SessionData(set.getLong(columnSessionStart), set.getLong(columnSessionEnd)));
|
|
||||||
}
|
|
||||||
set.close();
|
|
||||||
statement.close();
|
|
||||||
return sessions;
|
|
||||||
} finally {
|
|
||||||
close(set);
|
|
||||||
close(statement);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param userId
|
* @param userId
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
@ -94,165 +74,62 @@ public class SessionsTable extends UserIDTable {
|
|||||||
return super.removeDataOf(userId);
|
return super.removeDataOf(userId);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
public void saveSessionInformation(UUID uuid, Session session) throws SQLException {
|
||||||
* @param userId
|
|
||||||
* @param sessions
|
|
||||||
* @throws SQLException
|
|
||||||
*/
|
|
||||||
public void saveSessionData(int userId, List<SessionData> sessions) throws SQLException {
|
|
||||||
if (sessions == null) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
sessions.removeAll(getSessionData(userId));
|
|
||||||
|
|
||||||
if (sessions.isEmpty()) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
PreparedStatement statement = null;
|
PreparedStatement statement = null;
|
||||||
try {
|
try {
|
||||||
statement = prepareStatement("INSERT INTO " + tableName + " ("
|
statement = prepareStatement("INSERT INTO " + tableName + " ("
|
||||||
+ columnUserID + ", "
|
+ columnUserID + ", "
|
||||||
+ columnSessionStart + ", "
|
+ columnSessionStart + ", "
|
||||||
+ columnSessionEnd
|
+ columnSessionEnd + ", "
|
||||||
+ ") VALUES (?, ?, ?)");
|
+ columnDeaths + ", "
|
||||||
for (SessionData session : sessions) {
|
+ columnMobKills + ", "
|
||||||
long end = session.getSessionEnd();
|
+ columnServerID
|
||||||
long start = session.getSessionStart();
|
+ ") VALUES ("
|
||||||
if (end < start) {
|
+ columnUserID + "=" + usersTable.statementSelectID + ", "
|
||||||
continue;
|
+ "?, ?, ?, ?, "
|
||||||
}
|
+ serverTable.statementSelectServerID + ")");
|
||||||
|
statement.setString(1, uuid.toString());
|
||||||
|
|
||||||
statement.setInt(1, userId);
|
statement.setLong(2, session.getSessionStart());
|
||||||
statement.setLong(2, start);
|
statement.setLong(3, session.getSessionEnd());
|
||||||
statement.setLong(3, end);
|
statement.setInt(4, session.getDeaths());
|
||||||
statement.addBatch();
|
statement.setInt(5, session.getMobKills());
|
||||||
}
|
|
||||||
|
|
||||||
statement.executeBatch();
|
statement.setString(6, Plan.getServerUUID().toString());
|
||||||
|
statement.execute();
|
||||||
} finally {
|
} finally {
|
||||||
close(statement);
|
close(statement);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
db.getWorldTimesTable().saveWorldTimes(session.getWorldTimes());
|
||||||
|
db.getKillsTable().savePlayerKills(uuid, session.getPlayerKills());
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
public Map<String, List<Session>> getSessions(UUID uuid) throws SQLException {
|
||||||
* @param ids
|
Map<Integer, String> serverNames = serverTable.getServerNames();
|
||||||
* @return
|
Map<String, List<Session>> sessionsByServer = new HashMap<>();
|
||||||
* @throws SQLException
|
|
||||||
*/
|
|
||||||
public Map<Integer, List<SessionData>> getSessionData(Collection<Integer> ids) throws SQLException {
|
|
||||||
if (ids == null || ids.isEmpty()) {
|
|
||||||
return new HashMap<>();
|
|
||||||
}
|
|
||||||
|
|
||||||
Benchmark.start("Get Sessions multiple");
|
|
||||||
PreparedStatement statement = null;
|
PreparedStatement statement = null;
|
||||||
ResultSet set = null;
|
ResultSet set = null;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
Map<Integer, List<SessionData>> sessions = new HashMap<>();
|
statement = prepareStatement(Select.from(tableName, "*")
|
||||||
statement = prepareStatement("SELECT * FROM " + tableName);
|
.where(columnUserID + "=" + usersTable.statementSelectID)
|
||||||
|
.toString());
|
||||||
|
statement.setString(1, uuid.toString());
|
||||||
set = statement.executeQuery();
|
set = statement.executeQuery();
|
||||||
|
|
||||||
for (Integer id : ids) {
|
|
||||||
sessions.put(id, new ArrayList<>());
|
|
||||||
}
|
|
||||||
|
|
||||||
while (set.next()) {
|
while (set.next()) {
|
||||||
Integer id = set.getInt(columnUserID);
|
long id = set.getLong(columnSessionID);
|
||||||
if (!ids.contains(id)) {
|
long start = set.getLong(columnSessionStart);
|
||||||
continue;
|
long end = set.getLong(columnSessionEnd);
|
||||||
}
|
String serverName = serverNames.get(set.getInt(columnServerID));
|
||||||
|
|
||||||
long sessionStart = set.getLong(columnSessionStart);
|
int deaths = set.getInt(columnDeaths);
|
||||||
long sessionEnd = set.getLong(columnSessionEnd);
|
int mobKills = set.getInt(columnMobKills);
|
||||||
|
List<Session> sessions = sessionsByServer.getOrDefault(serverName, new ArrayList<>());
|
||||||
// sessions.get(id).add(new SessionData(sessionStart, sessionEnd));
|
sessions.add(new Session(id, start, end, deaths, mobKills));
|
||||||
}
|
}
|
||||||
|
return sessionsByServer;
|
||||||
return sessions;
|
|
||||||
} finally {
|
} finally {
|
||||||
close(set);
|
close(set, statement);
|
||||||
close(statement);
|
|
||||||
Benchmark.stop("Database", "Get Sessions multiple");
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* @param sessions
|
|
||||||
* @throws SQLException
|
|
||||||
*/
|
|
||||||
public void saveSessionData(Map<Integer, List<SessionData>> sessions) throws SQLException {
|
|
||||||
if (sessions == null || sessions.isEmpty()) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
Benchmark.start("Save Sessions multiple");
|
|
||||||
|
|
||||||
Map<Integer, List<SessionData>> saved = getSessionData(sessions.keySet());
|
|
||||||
for (Map.Entry<Integer, List<SessionData>> entrySet : sessions.entrySet()) {
|
|
||||||
Integer id = entrySet.getKey();
|
|
||||||
List<SessionData> sessionList = entrySet.getValue();
|
|
||||||
List<SessionData> s = saved.get(id);
|
|
||||||
|
|
||||||
if (s != null) {
|
|
||||||
sessionList.removeAll(s);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (sessionList.isEmpty()) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
saved.put(id, sessionList);
|
|
||||||
}
|
|
||||||
|
|
||||||
List<List<Container<SessionData>>> batches = splitIntoBatches(sessions);
|
|
||||||
|
|
||||||
batches.forEach(batch -> {
|
|
||||||
try {
|
|
||||||
saveSessionBatch(batch);
|
|
||||||
} catch (SQLException e) {
|
|
||||||
Log.toLog("SessionsTable.saveSessionData", e);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
Benchmark.stop("Database", "Save Sessions multiple");
|
|
||||||
}
|
|
||||||
|
|
||||||
private void saveSessionBatch(List<Container<SessionData>> batch) throws SQLException {
|
|
||||||
if (batch.isEmpty()) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
PreparedStatement statement = null;
|
|
||||||
try {
|
|
||||||
statement = prepareStatement("INSERT INTO " + tableName + " ("
|
|
||||||
+ columnUserID + ", "
|
|
||||||
+ columnSessionStart + ", "
|
|
||||||
+ columnSessionEnd
|
|
||||||
+ ") VALUES (?, ?, ?)");
|
|
||||||
|
|
||||||
for (Container<SessionData> data : batch) {
|
|
||||||
SessionData session = data.getObject();
|
|
||||||
int id = data.getId();
|
|
||||||
if (!session.isValid()) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
statement.setInt(1, id);
|
|
||||||
statement.setLong(2, session.getSessionStart());
|
|
||||||
statement.setLong(3, session.getSessionEnd());
|
|
||||||
statement.addBatch();
|
|
||||||
}
|
|
||||||
statement.executeBatch();
|
|
||||||
} finally {
|
|
||||||
close(statement);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void clean() {
|
|
||||||
// TODO Clean sessions before Configurable time span
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -14,10 +14,12 @@ import java.sql.SQLException;
|
|||||||
*/
|
*/
|
||||||
public abstract class UserIDTable extends Table {
|
public abstract class UserIDTable extends Table {
|
||||||
|
|
||||||
protected String columnUserID;
|
protected final String columnUserID = "user_id";
|
||||||
|
protected final UsersTable usersTable;
|
||||||
|
|
||||||
public UserIDTable(String name, SQLDB db, boolean usingMySQL) {
|
public UserIDTable(String name, SQLDB db, boolean usingMySQL) {
|
||||||
super(name, db, usingMySQL);
|
super(name, db, usingMySQL);
|
||||||
|
usersTable = db.getUsersTable();
|
||||||
}
|
}
|
||||||
|
|
||||||
protected boolean removeDataOf(int userID) {
|
protected boolean removeDataOf(int userID) {
|
||||||
|
@ -3,6 +3,7 @@ package main.java.com.djrapitops.plan.database.tables;
|
|||||||
import main.java.com.djrapitops.plan.Log;
|
import main.java.com.djrapitops.plan.Log;
|
||||||
import main.java.com.djrapitops.plan.data.UserData;
|
import main.java.com.djrapitops.plan.data.UserData;
|
||||||
import main.java.com.djrapitops.plan.database.databases.SQLDB;
|
import main.java.com.djrapitops.plan.database.databases.SQLDB;
|
||||||
|
import main.java.com.djrapitops.plan.database.sql.Select;
|
||||||
import main.java.com.djrapitops.plan.database.sql.Sql;
|
import main.java.com.djrapitops.plan.database.sql.Sql;
|
||||||
import main.java.com.djrapitops.plan.database.sql.TableSqlParser;
|
import main.java.com.djrapitops.plan.database.sql.TableSqlParser;
|
||||||
import main.java.com.djrapitops.plan.utilities.Benchmark;
|
import main.java.com.djrapitops.plan.utilities.Benchmark;
|
||||||
@ -17,8 +18,8 @@ import java.util.*;
|
|||||||
*/
|
*/
|
||||||
public class UsersTable extends Table {
|
public class UsersTable extends Table {
|
||||||
|
|
||||||
private final String columnID;
|
private final String columnID = "id";
|
||||||
private final String columnUUID;
|
private final String columnUUID = "uuid";
|
||||||
@Deprecated
|
@Deprecated
|
||||||
private final String columnGeolocation;
|
private final String columnGeolocation;
|
||||||
@Deprecated
|
@Deprecated
|
||||||
@ -50,14 +51,16 @@ public class UsersTable extends Table {
|
|||||||
@Deprecated
|
@Deprecated
|
||||||
private final String columnLastWorld;
|
private final String columnLastWorld;
|
||||||
|
|
||||||
|
public final String statementSelectID;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @param db
|
* @param db
|
||||||
* @param usingMySQL
|
* @param usingMySQL
|
||||||
*/
|
*/
|
||||||
public UsersTable(SQLDB db, boolean usingMySQL) {
|
public UsersTable(SQLDB db, boolean usingMySQL) {
|
||||||
super("plan_users", db, usingMySQL);
|
super("plan_users", db, usingMySQL);
|
||||||
columnID = "id";
|
statementSelectID = "(" + Select.from(tableName, tableName + "." + columnID).where(columnUUID + "=?").toString() + ")";
|
||||||
columnUUID = "uuid";
|
|
||||||
columnGeolocation = "geolocation";
|
columnGeolocation = "geolocation";
|
||||||
columnLastGM = "last_gamemode";
|
columnLastGM = "last_gamemode";
|
||||||
columnLastGMSwapTime = "last_gamemode_swap";
|
columnLastGMSwapTime = "last_gamemode_swap";
|
||||||
|
@ -2,6 +2,7 @@ package main.java.com.djrapitops.plan.database.tables;
|
|||||||
|
|
||||||
import com.djrapitops.plugin.utilities.Verify;
|
import com.djrapitops.plugin.utilities.Verify;
|
||||||
import main.java.com.djrapitops.plan.Log;
|
import main.java.com.djrapitops.plan.Log;
|
||||||
|
import main.java.com.djrapitops.plan.data.time.WorldTimes;
|
||||||
import main.java.com.djrapitops.plan.database.databases.SQLDB;
|
import main.java.com.djrapitops.plan.database.databases.SQLDB;
|
||||||
import main.java.com.djrapitops.plan.database.sql.Sql;
|
import main.java.com.djrapitops.plan.database.sql.Sql;
|
||||||
import main.java.com.djrapitops.plan.database.sql.TableSqlParser;
|
import main.java.com.djrapitops.plan.database.sql.TableSqlParser;
|
||||||
@ -21,13 +22,14 @@ import java.util.Map;
|
|||||||
*/
|
*/
|
||||||
public class WorldTimesTable extends UserIDTable {
|
public class WorldTimesTable extends UserIDTable {
|
||||||
|
|
||||||
private final String columnServerID; //TODO
|
private final String columnServerID = "server_id"; //TODO
|
||||||
private final WorldTable worldTable;
|
private final WorldTable worldTable;
|
||||||
private final String worldIDColumn;
|
private final String worldIDColumn;
|
||||||
private final String worldNameColumn;
|
private final String worldNameColumn;
|
||||||
|
|
||||||
private final String columnWorldId;
|
private final String columnWorldId = "world_id";
|
||||||
@Deprecated private final String columnPlaytime;
|
@Deprecated
|
||||||
|
private final String columnPlaytime = "playtime";
|
||||||
//TODO GM Times to World table
|
//TODO GM Times to World table
|
||||||
|
|
||||||
private final String selectWorldIDsql;
|
private final String selectWorldIDsql;
|
||||||
@ -43,10 +45,6 @@ public class WorldTimesTable extends UserIDTable {
|
|||||||
worldTable = db.getWorldTable();
|
worldTable = db.getWorldTable();
|
||||||
worldIDColumn = worldTable + "." + worldTable.getColumnID();
|
worldIDColumn = worldTable + "." + worldTable.getColumnID();
|
||||||
worldNameColumn = worldTable.getColumnWorldName();
|
worldNameColumn = worldTable.getColumnWorldName();
|
||||||
columnWorldId = "world_id";
|
|
||||||
columnUserID = "user_id";
|
|
||||||
columnPlaytime = "playtime";
|
|
||||||
columnServerID = "server_id";
|
|
||||||
|
|
||||||
selectWorldIDsql = "(SELECT " + worldIDColumn + " FROM " + worldTable + " WHERE (" + worldNameColumn + "=?))";
|
selectWorldIDsql = "(SELECT " + worldIDColumn + " FROM " + worldTable + " WHERE (" + worldNameColumn + "=?))";
|
||||||
}
|
}
|
||||||
@ -315,4 +313,8 @@ public class WorldTimesTable extends UserIDTable {
|
|||||||
close(statement);
|
close(statement);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void saveWorldTimes(WorldTimes worldTimes) {
|
||||||
|
// TODO saveWorldTimes (INSERT)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -139,7 +139,8 @@ public enum Msg {
|
|||||||
HTML_OFFLINE("Html - Offline"),
|
HTML_OFFLINE("Html - Offline"),
|
||||||
HTML_ACTIVE("Html - Active"),
|
HTML_ACTIVE("Html - Active"),
|
||||||
HTML_INACTIVE("Html - Inactive"),
|
HTML_INACTIVE("Html - Inactive"),
|
||||||
HTML_TABLE_NO_KILLS("Html - Table No Kills"),;
|
HTML_TABLE_NO_KILLS("Html - Table No Kills"),
|
||||||
|
;
|
||||||
|
|
||||||
private final String identifier;
|
private final String identifier;
|
||||||
|
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
package main.java.com.djrapitops.plan.ui.html.graphs;
|
package main.java.com.djrapitops.plan.ui.html.graphs;
|
||||||
|
|
||||||
import main.java.com.djrapitops.plan.data.SessionData;
|
import main.java.com.djrapitops.plan.data.Session;
|
||||||
import main.java.com.djrapitops.plan.data.TPS;
|
import main.java.com.djrapitops.plan.data.TPS;
|
||||||
import main.java.com.djrapitops.plan.utilities.analysis.Point;
|
import main.java.com.djrapitops.plan.utilities.analysis.Point;
|
||||||
|
|
||||||
@ -28,7 +28,7 @@ public class PlayerActivityGraphCreator {
|
|||||||
return SeriesCreator.seriesGraph(points, true);
|
return SeriesCreator.seriesGraph(points, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static String buildSeriesDataStringSessions(Collection<SessionData> sessions) {
|
public static String buildSeriesDataStringSessions(Collection<Session> sessions) {
|
||||||
List<Point> points = sessions.stream()
|
List<Point> points = sessions.stream()
|
||||||
.map(session -> new Point[]{new Point(session.getSessionStart(), 1), new Point(session.getSessionEnd(), 0)})
|
.map(session -> new Point[]{new Point(session.getSessionStart(), 1), new Point(session.getSessionEnd(), 0)})
|
||||||
.flatMap(Arrays::stream)
|
.flatMap(Arrays::stream)
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
*/
|
*/
|
||||||
package main.java.com.djrapitops.plan.ui.html.graphs;
|
package main.java.com.djrapitops.plan.ui.html.graphs;
|
||||||
|
|
||||||
import main.java.com.djrapitops.plan.data.SessionData;
|
import main.java.com.djrapitops.plan.data.Session;
|
||||||
import main.java.com.djrapitops.plan.utilities.analysis.AnalysisUtils;
|
import main.java.com.djrapitops.plan.utilities.analysis.AnalysisUtils;
|
||||||
|
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
@ -34,7 +34,7 @@ public class PunchCardGraphCreator {
|
|||||||
* @param sessions Sessions (Unique/Player) to be placed into the PunchCard.
|
* @param sessions Sessions (Unique/Player) to be placed into the PunchCard.
|
||||||
* @return Data array as a string.
|
* @return Data array as a string.
|
||||||
*/
|
*/
|
||||||
public static String createDataSeries(Collection<SessionData> sessions) {
|
public static String createDataSeries(Collection<Session> sessions) {
|
||||||
List<Long> sessionStarts = getSessionStarts(sessions);
|
List<Long> sessionStarts = getSessionStarts(sessions);
|
||||||
List<int[]> daysAndHours = AnalysisUtils.getDaysAndHours(sessionStarts);
|
List<int[]> daysAndHours = AnalysisUtils.getDaysAndHours(sessionStarts);
|
||||||
int[][] dataArray = createDataArray(daysAndHours);
|
int[][] dataArray = createDataArray(daysAndHours);
|
||||||
@ -75,11 +75,10 @@ public class PunchCardGraphCreator {
|
|||||||
return dataArray;
|
return dataArray;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static List<Long> getSessionStarts(Collection<SessionData> data) {
|
private static List<Long> getSessionStarts(Collection<Session> data) {
|
||||||
return data.stream()
|
return data.stream()
|
||||||
.filter(Objects::nonNull)
|
.filter(Objects::nonNull)
|
||||||
.filter(SessionData::isValid)
|
.map(Session::getSessionStart)
|
||||||
.map(SessionData::getSessionStart)
|
|
||||||
.sorted()
|
.sorted()
|
||||||
.collect(Collectors.toList());
|
.collect(Collectors.toList());
|
||||||
}
|
}
|
||||||
|
@ -44,7 +44,7 @@ public class KillsTableCreator {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
long date = kill.getDate();
|
long date = kill.getTime();
|
||||||
|
|
||||||
IOfflinePlayer victim = Fetch.getIOfflinePlayer(kill.getVictim());
|
IOfflinePlayer victim = Fetch.getIOfflinePlayer(kill.getVictim());
|
||||||
String name = victim.getName();
|
String name = victim.getName();
|
||||||
|
@ -8,6 +8,7 @@ import main.java.com.djrapitops.plan.data.UserData;
|
|||||||
/**
|
/**
|
||||||
* @author Rsl1122
|
* @author Rsl1122
|
||||||
*/
|
*/
|
||||||
|
@Deprecated // TODO Remove once sure that this is unnecessary.
|
||||||
public class NewPlayerCreator {
|
public class NewPlayerCreator {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -45,7 +46,6 @@ public class NewPlayerCreator {
|
|||||||
* @return a new UserData object
|
* @return a new UserData object
|
||||||
*/
|
*/
|
||||||
public static UserData createNewPlayer(IOfflinePlayer player, Gamemode gm) {
|
public static UserData createNewPlayer(IOfflinePlayer player, Gamemode gm) {
|
||||||
// TODO Rewrite
|
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3,7 +3,7 @@ package main.java.com.djrapitops.plan.utilities;
|
|||||||
import main.java.com.djrapitops.plan.Plan;
|
import main.java.com.djrapitops.plan.Plan;
|
||||||
import main.java.com.djrapitops.plan.Settings;
|
import main.java.com.djrapitops.plan.Settings;
|
||||||
import main.java.com.djrapitops.plan.data.AnalysisData;
|
import main.java.com.djrapitops.plan.data.AnalysisData;
|
||||||
import main.java.com.djrapitops.plan.data.SessionData;
|
import main.java.com.djrapitops.plan.data.Session;
|
||||||
import main.java.com.djrapitops.plan.data.UserData;
|
import main.java.com.djrapitops.plan.data.UserData;
|
||||||
import main.java.com.djrapitops.plan.ui.html.graphs.PunchCardGraphCreator;
|
import main.java.com.djrapitops.plan.ui.html.graphs.PunchCardGraphCreator;
|
||||||
|
|
||||||
@ -34,7 +34,7 @@ public class PlaceholderUtils {
|
|||||||
replaceMap.put("tabContentPlugins", data.replacePluginsTabLayout());
|
replaceMap.put("tabContentPlugins", data.replacePluginsTabLayout());
|
||||||
|
|
||||||
// TODO Refresh time for Network pages
|
// TODO Refresh time for Network pages
|
||||||
// replaceMap.put("refresh", FormatUtils.formatTimeAmountDifference(data.getRefreshDate(), MiscUtils.getTime()));
|
// replaceMap.put("refresh", FormatUtils.formatTimeAmountDifference(data.getRefreshDate(), MiscUtils.getDate()));
|
||||||
// replaceMap.put("refreshlong", String.valueOf(data.getRefreshDate()));
|
// replaceMap.put("refreshlong", String.valueOf(data.getRefreshDate()));
|
||||||
|
|
||||||
replaceMap.put("serverName", Settings.SERVER_NAME.toString());
|
replaceMap.put("serverName", Settings.SERVER_NAME.toString());
|
||||||
@ -74,7 +74,7 @@ public class PlaceholderUtils {
|
|||||||
// replaceMap.put("mobKillCount", data.getMobKills());
|
// replaceMap.put("mobKillCount", data.getMobKills());
|
||||||
// replaceMap.put("deathCount", data.getDeaths());
|
// replaceMap.put("deathCount", data.getDeaths());
|
||||||
|
|
||||||
Set<SessionData> sessions = new HashSet<>(data.getSessions());
|
Set<Session> sessions = new HashSet<>(data.getSessions());
|
||||||
replaceMap.put("punchCardSeries", PunchCardGraphCreator.createDataSeries(sessions));
|
replaceMap.put("punchCardSeries", PunchCardGraphCreator.createDataSeries(sessions));
|
||||||
//TODO WorldTimes worldTimes = data.getWorldTimes();
|
//TODO WorldTimes worldTimes = data.getWorldTimes();
|
||||||
// TODO replaceMap.put("worldSeries", WorldPieCreator.createSeriesData(worldTimes.getTimes()));
|
// TODO replaceMap.put("worldSeries", WorldPieCreator.createSeriesData(worldTimes.getTimes()));
|
||||||
|
@ -5,7 +5,7 @@ import com.djrapitops.plugin.utilities.Verify;
|
|||||||
import main.java.com.djrapitops.plan.Log;
|
import main.java.com.djrapitops.plan.Log;
|
||||||
import main.java.com.djrapitops.plan.Plan;
|
import main.java.com.djrapitops.plan.Plan;
|
||||||
import main.java.com.djrapitops.plan.data.AnalysisData;
|
import main.java.com.djrapitops.plan.data.AnalysisData;
|
||||||
import main.java.com.djrapitops.plan.data.SessionData;
|
import main.java.com.djrapitops.plan.data.Session;
|
||||||
import main.java.com.djrapitops.plan.data.TPS;
|
import main.java.com.djrapitops.plan.data.TPS;
|
||||||
import main.java.com.djrapitops.plan.data.UserData;
|
import main.java.com.djrapitops.plan.data.UserData;
|
||||||
import main.java.com.djrapitops.plan.data.additional.AnalysisType;
|
import main.java.com.djrapitops.plan.data.additional.AnalysisType;
|
||||||
@ -129,8 +129,8 @@ public class Analysis {
|
|||||||
rawData.sort(new UserDataLastPlayedComparator());
|
rawData.sort(new UserDataLastPlayedComparator());
|
||||||
List<UUID> uuids = rawData.stream().map(UserData::getUuid).collect(Collectors.toList());
|
List<UUID> uuids = rawData.stream().map(UserData::getUuid).collect(Collectors.toList());
|
||||||
Benchmark.start("Create Empty dataset");
|
Benchmark.start("Create Empty dataset");
|
||||||
DataCache handler = plugin.getHandler();
|
DataCache dataCache = plugin.getDataCache();
|
||||||
Map<String, Integer> commandUse = handler.getCommandUse();
|
Map<String, Integer> commandUse = dataCache.getCommandUse();
|
||||||
|
|
||||||
AnalysisData analysisData = new AnalysisData(commandUse, tpsData);
|
AnalysisData analysisData = new AnalysisData(commandUse, tpsData);
|
||||||
analysisData.setPluginsTabLayout(plugin.getHookHandler().getPluginsTabLayoutForAnalysis());
|
analysisData.setPluginsTabLayout(plugin.getHookHandler().getPluginsTabLayoutForAnalysis());
|
||||||
@ -305,7 +305,7 @@ public class Analysis {
|
|||||||
}
|
}
|
||||||
//TODO List<KillData> playerKills = uData.getPlayerKills();
|
//TODO List<KillData> playerKills = uData.getPlayerKills();
|
||||||
|
|
||||||
List<SessionData> sessions = uData.getSessions();
|
List<Session> sessions = uData.getSessions();
|
||||||
joinInfo.addSessions(uuid, sessions);
|
joinInfo.addSessions(uuid, sessions);
|
||||||
});
|
});
|
||||||
Benchmark.stop("Analysis", "Fill Dataset");
|
Benchmark.stop("Analysis", "Fill Dataset");
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
package main.java.com.djrapitops.plan.utilities.analysis;
|
package main.java.com.djrapitops.plan.utilities.analysis;
|
||||||
|
|
||||||
import main.java.com.djrapitops.plan.Log;
|
import main.java.com.djrapitops.plan.Log;
|
||||||
import main.java.com.djrapitops.plan.data.SessionData;
|
import main.java.com.djrapitops.plan.data.Session;
|
||||||
import main.java.com.djrapitops.plan.data.additional.AnalysisType;
|
import main.java.com.djrapitops.plan.data.additional.AnalysisType;
|
||||||
import main.java.com.djrapitops.plan.data.additional.PluginData;
|
import main.java.com.djrapitops.plan.data.additional.PluginData;
|
||||||
import main.java.com.djrapitops.plan.utilities.FormatUtils;
|
import main.java.com.djrapitops.plan.utilities.FormatUtils;
|
||||||
@ -62,11 +62,11 @@ public class AnalysisUtils {
|
|||||||
* @param data
|
* @param data
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
public static List<Long> transformSessionDataToLengths(Collection<SessionData> data) {
|
public static List<Long> transformSessionDataToLengths(Collection<Session> data) {
|
||||||
return data.stream()
|
return data.stream()
|
||||||
.filter(Objects::nonNull)
|
.filter(Objects::nonNull)
|
||||||
.filter(session -> session.getLength() > 0)
|
.filter(session -> session.getLength() > 0)
|
||||||
.map(SessionData::getLength)
|
.map(Session::getLength)
|
||||||
.collect(Collectors.toList());
|
.collect(Collectors.toList());
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -206,7 +206,7 @@ public class AnalysisUtils {
|
|||||||
* @param scale Scale (milliseconds), time before (Current epoch - scale) will be ignored.
|
* @param scale Scale (milliseconds), time before (Current epoch - scale) will be ignored.
|
||||||
* @return Amount of Unique joins within the time span.
|
* @return Amount of Unique joins within the time span.
|
||||||
*/
|
*/
|
||||||
public static int getUniqueJoins(Map<UUID, List<SessionData>> sessions, long scale) {
|
public static int getUniqueJoins(Map<UUID, List<Session>> sessions, long scale) {
|
||||||
long now = MiscUtils.getTime();
|
long now = MiscUtils.getTime();
|
||||||
long nowMinusScale = now - scale;
|
long nowMinusScale = now - scale;
|
||||||
|
|
||||||
@ -226,13 +226,13 @@ public class AnalysisUtils {
|
|||||||
* @param scale
|
* @param scale
|
||||||
* @return
|
* @return
|
||||||
*/
|
*/
|
||||||
public static int getUniqueJoinsPerDay(Map<UUID, List<SessionData>> sessions, long scale) {
|
public static int getUniqueJoinsPerDay(Map<UUID, List<Session>> sessions, long scale) {
|
||||||
Map<Integer, Set<UUID>> uniqueJoins = new HashMap<>();
|
Map<Integer, Set<UUID>> uniqueJoins = new HashMap<>();
|
||||||
long now = MiscUtils.getTime();
|
long now = MiscUtils.getTime();
|
||||||
long nowMinusScale = now - scale;
|
long nowMinusScale = now - scale;
|
||||||
|
|
||||||
sessions.forEach((uuid, s) -> {
|
sessions.forEach((uuid, s) -> {
|
||||||
for (SessionData session : s) {
|
for (Session session : s) {
|
||||||
if (scale != -1
|
if (scale != -1
|
||||||
&& session.getSessionStart() < nowMinusScale) {
|
&& session.getSessionStart() < nowMinusScale) {
|
||||||
continue;
|
continue;
|
||||||
@ -308,7 +308,7 @@ public class AnalysisUtils {
|
|||||||
}).collect(Collectors.toList());
|
}).collect(Collectors.toList());
|
||||||
}
|
}
|
||||||
|
|
||||||
private static int getDayOfYear(SessionData session) {
|
private static int getDayOfYear(Session session) {
|
||||||
return getDayOfYear(session.getSessionStart());
|
return getDayOfYear(session.getSessionStart());
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -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
|
@Override
|
||||||
public int compare(KillData o1, KillData o2) {
|
public int compare(KillData o1, KillData o2) {
|
||||||
return Long.compare(o1.getDate(), o2.getDate());
|
return Long.compare(o1.getTime(), o2.getTime());
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -1,16 +1,16 @@
|
|||||||
package main.java.com.djrapitops.plan.utilities.comparators;
|
package main.java.com.djrapitops.plan.utilities.comparators;
|
||||||
|
|
||||||
import main.java.com.djrapitops.plan.data.SessionData;
|
import main.java.com.djrapitops.plan.data.Session;
|
||||||
|
|
||||||
import java.util.Comparator;
|
import java.util.Comparator;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Rsl1122
|
* @author Rsl1122
|
||||||
*/
|
*/
|
||||||
public class SessionDataComparator implements Comparator<SessionData> {
|
public class SessionDataComparator implements Comparator<Session> {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int compare(SessionData s1, SessionData s2) {
|
public int compare(Session s1, Session s2) {
|
||||||
return Long.compare(s1.getSessionStart(), s2.getSessionStart());
|
return Long.compare(s1.getSessionStart(), s2.getSessionStart());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -6,6 +6,7 @@
|
|||||||
package test.java.main.java.com.djrapitops.plan.data;
|
package test.java.main.java.com.djrapitops.plan.data;
|
||||||
|
|
||||||
import main.java.com.djrapitops.plan.data.KillData;
|
import main.java.com.djrapitops.plan.data.KillData;
|
||||||
|
import org.junit.Before;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
|
|
||||||
import java.util.UUID;
|
import java.util.UUID;
|
||||||
@ -17,20 +18,27 @@ import static org.junit.Assert.assertEquals;
|
|||||||
*/
|
*/
|
||||||
public class KillDataTest {
|
public class KillDataTest {
|
||||||
|
|
||||||
|
private KillData test;
|
||||||
|
private UUID testUUID;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
public KillDataTest() {
|
public KillDataTest() {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Before
|
||||||
|
public void setUp() throws Exception {
|
||||||
|
testUUID = UUID.fromString("71cfb6f0-c3ef-4954-8abe-13fa07afc340");
|
||||||
|
test = new KillData(testUUID, "TestWeapon", 100L);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
@Test
|
@Test
|
||||||
public void testGetVictim() {
|
public void testGetVictim() {
|
||||||
UUID uuid = UUID.fromString("71cfb6f0-c3ef-4954-8abe-13fa07afc340");
|
assertEquals(test.getVictim(), testUUID);
|
||||||
KillData k = new KillData(uuid, 1, "TestWeapon", 100L);
|
|
||||||
assertEquals(k.getVictim(), uuid);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -38,9 +46,7 @@ public class KillDataTest {
|
|||||||
*/
|
*/
|
||||||
@Test
|
@Test
|
||||||
public void testGetDate() {
|
public void testGetDate() {
|
||||||
UUID uuid = UUID.fromString("71cfb6f0-c3ef-4954-8abe-13fa07afc340");
|
assertEquals(test.getTime(), 100L);
|
||||||
KillData k = new KillData(uuid, 1, "TestWeapon", 100L);
|
|
||||||
assertEquals(k.getDate(), 100L);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -48,19 +54,6 @@ public class KillDataTest {
|
|||||||
*/
|
*/
|
||||||
@Test
|
@Test
|
||||||
public void testGetWeapon() {
|
public void testGetWeapon() {
|
||||||
UUID uuid = UUID.fromString("71cfb6f0-c3ef-4954-8abe-13fa07afc340");
|
assertEquals(test.getWeapon(), "TestWeapon");
|
||||||
KillData k = new KillData(uuid, 1, "TestWeapon", 100L);
|
|
||||||
assertEquals(k.getWeapon(), "TestWeapon");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
@Test
|
|
||||||
public void testGetVictimUserID() {
|
|
||||||
UUID uuid = UUID.fromString("71cfb6f0-c3ef-4954-8abe-13fa07afc340");
|
|
||||||
KillData k = new KillData(uuid, 1, "TestWeapon", 100L);
|
|
||||||
assertEquals(k.getVictimUserID(), 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -5,20 +5,20 @@
|
|||||||
*/
|
*/
|
||||||
package test.java.main.java.com.djrapitops.plan.data;
|
package test.java.main.java.com.djrapitops.plan.data;
|
||||||
|
|
||||||
import main.java.com.djrapitops.plan.data.SessionData;
|
import main.java.com.djrapitops.plan.data.Session;
|
||||||
import org.junit.Before;
|
import org.junit.Before;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Rsl1122
|
* @author Rsl1122
|
||||||
*/
|
*/
|
||||||
public class SessionDataTest {
|
public class SessionTest {
|
||||||
|
|
||||||
private SessionData test;
|
private Session test;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
public SessionDataTest() {
|
public SessionTest() {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -26,7 +26,6 @@ public class SessionDataTest {
|
|||||||
*/
|
*/
|
||||||
@Before
|
@Before
|
||||||
public void setUp() {
|
public void setUp() {
|
||||||
test = new SessionData(0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
@ -21,7 +21,7 @@ import org.powermock.modules.junit4.PowerMockRunner;
|
|||||||
public class DataCacheTest {
|
public class DataCacheTest {
|
||||||
|
|
||||||
private Database db;
|
private Database db;
|
||||||
private DataCache handler;
|
private DataCache dataCache;
|
||||||
|
|
||||||
private int callsToSaveCommandUse;
|
private int callsToSaveCommandUse;
|
||||||
private int callsToSaveUserData;
|
private int callsToSaveUserData;
|
||||||
|
@ -12,9 +12,7 @@ import test.java.utils.TestInit;
|
|||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
import static junit.framework.TestCase.assertEquals;
|
import static junit.framework.TestCase.*;
|
||||||
import static junit.framework.TestCase.assertFalse;
|
|
||||||
import static junit.framework.TestCase.assertTrue;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Fuzzlemann
|
* @author Fuzzlemann
|
||||||
@ -27,6 +25,7 @@ public class GeolocationCacheTest {
|
|||||||
|
|
||||||
@Before
|
@Before
|
||||||
public void setUp() {
|
public void setUp() {
|
||||||
|
GeolocationCacheHandler.clearCache();
|
||||||
ipsToCountries.put("8.8.8.8", "United States");
|
ipsToCountries.put("8.8.8.8", "United States");
|
||||||
ipsToCountries.put("8.8.4.4", "United States");
|
ipsToCountries.put("8.8.4.4", "United States");
|
||||||
ipsToCountries.put("4.4.2.2", "United States");
|
ipsToCountries.put("4.4.2.2", "United States");
|
||||||
@ -46,7 +45,7 @@ public class GeolocationCacheTest {
|
|||||||
String ip = entry.getKey();
|
String ip = entry.getKey();
|
||||||
String expCountry = entry.getValue();
|
String expCountry = entry.getValue();
|
||||||
|
|
||||||
String country = GeolocationCacheHandler.getUncachedCountry(ip);
|
String country = GeolocationCacheHandler.getCountry(ip);
|
||||||
|
|
||||||
assertEquals(country, expCountry);
|
assertEquals(country, expCountry);
|
||||||
}
|
}
|
||||||
@ -60,15 +59,12 @@ public class GeolocationCacheTest {
|
|||||||
String ip = entry.getKey();
|
String ip = entry.getKey();
|
||||||
String expIp = entry.getValue();
|
String expIp = entry.getValue();
|
||||||
|
|
||||||
String countryFirstCall = GeolocationCacheHandler.getUncachedCountry(ip);
|
|
||||||
assertFalse(GeolocationCacheHandler.isCached(ip));
|
assertFalse(GeolocationCacheHandler.isCached(ip));
|
||||||
|
|
||||||
String countrySecondCall = GeolocationCacheHandler.getCountry(ip);
|
String countrySecondCall = GeolocationCacheHandler.getCountry(ip);
|
||||||
assertTrue(GeolocationCacheHandler.isCached(ip));
|
assertTrue(GeolocationCacheHandler.isCached(ip));
|
||||||
|
|
||||||
String countryThirdCall = GeolocationCacheHandler.getCachedCountry(ip);
|
String countryThirdCall = GeolocationCacheHandler.getCountry(ip);
|
||||||
|
|
||||||
assertEquals(countryFirstCall, countrySecondCall);
|
|
||||||
assertEquals(countrySecondCall, countryThirdCall);
|
assertEquals(countrySecondCall, countryThirdCall);
|
||||||
assertEquals(countryThirdCall, expIp);
|
assertEquals(countryThirdCall, expIp);
|
||||||
}
|
}
|
||||||
|
@ -34,7 +34,7 @@ public class QueueTest {
|
|||||||
|
|
||||||
private final UUID uuid1 = MockUtils.getPlayerUUID();
|
private final UUID uuid1 = MockUtils.getPlayerUUID();
|
||||||
|
|
||||||
private DataCache handler;
|
private DataCache dataCache;
|
||||||
private Database db;
|
private Database db;
|
||||||
|
|
||||||
public QueueTest() {
|
public QueueTest() {
|
||||||
@ -51,12 +51,12 @@ public class QueueTest {
|
|||||||
};
|
};
|
||||||
db.init();
|
db.init();
|
||||||
when(plan.getDB()).thenReturn(db);
|
when(plan.getDB()).thenReturn(db);
|
||||||
handler = new DataCache(plan) {
|
dataCache = new DataCache(plan) {
|
||||||
@Override
|
@Override
|
||||||
public void startAsyncPeriodicSaveTask() {
|
public void startAsyncPeriodicSaveTask() {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
when(plan.getHandler()).thenReturn(handler);
|
when(plan.getDataCache()).thenReturn(dataCache);
|
||||||
}
|
}
|
||||||
|
|
||||||
@After
|
@After
|
||||||
@ -68,21 +68,6 @@ public class QueueTest {
|
|||||||
public void testProcessQueue() {
|
public void testProcessQueue() {
|
||||||
List<Integer> processCalls = new ArrayList<>();
|
List<Integer> processCalls = new ArrayList<>();
|
||||||
List<Integer> errors = new ArrayList<>();
|
List<Integer> errors = new ArrayList<>();
|
||||||
// handler.addToPool(new HandlingInfo(uuid1, InfoType.OTHER, 0) {
|
// TODO Rewrite
|
||||||
// @Override
|
|
||||||
// public void process(UserData uData) {
|
|
||||||
// if (uData.equals(data1)) {
|
|
||||||
// uData.setName("TestSuccessful");
|
|
||||||
// processCalls.add(1);
|
|
||||||
// } else {
|
|
||||||
// errors.add(1);
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
// });
|
|
||||||
// while (processCalls.size() < 1) {
|
|
||||||
// if (errors.size() > 0) {
|
|
||||||
// fail();
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -171,5 +171,5 @@ public class WorldTimesTest {
|
|||||||
assertEquals(2000L, worldOneGMTimes.getTime("ADVENTURE"));
|
assertEquals(2000L, worldOneGMTimes.getTime("ADVENTURE"));
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO Test where SessionData is ended, check if worldTimes & session length add up.
|
// TODO Test where Session is ended, check if worldTimes & session length add up.
|
||||||
}
|
}
|
@ -68,6 +68,14 @@ public class DatabaseCommitTest {
|
|||||||
assertTrue("Errors were caught.", rows == rowsAgain);
|
assertTrue("Errors were caught.", rows == rowsAgain);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testNoExceptionWhenCommitEmpty() throws SQLException {
|
||||||
|
db.init();
|
||||||
|
db.commit();
|
||||||
|
db.commit();
|
||||||
|
db.commit();
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testCommitToDBFile() throws SQLException {
|
public void testCommitToDBFile() throws SQLException {
|
||||||
db.init();
|
db.init();
|
||||||
|
@ -5,7 +5,7 @@
|
|||||||
*/
|
*/
|
||||||
package test.java.main.java.com.djrapitops.plan.utilities.analysis;
|
package test.java.main.java.com.djrapitops.plan.utilities.analysis;
|
||||||
|
|
||||||
import main.java.com.djrapitops.plan.data.SessionData;
|
import main.java.com.djrapitops.plan.data.Session;
|
||||||
import main.java.com.djrapitops.plan.utilities.MiscUtils;
|
import main.java.com.djrapitops.plan.utilities.MiscUtils;
|
||||||
import main.java.com.djrapitops.plan.utilities.analysis.AnalysisUtils;
|
import main.java.com.djrapitops.plan.utilities.analysis.AnalysisUtils;
|
||||||
import org.bukkit.plugin.java.JavaPlugin;
|
import org.bukkit.plugin.java.JavaPlugin;
|
||||||
@ -122,10 +122,9 @@ public class AnalysisUtilsTest {
|
|||||||
*/
|
*/
|
||||||
@Test
|
@Test
|
||||||
public void testTransformSessionDataToLengths() {
|
public void testTransformSessionDataToLengths() {
|
||||||
Collection<SessionData> data = new ArrayList<>();
|
Collection<Session> data = new ArrayList<>();
|
||||||
data.add(new SessionData(0L, 5L, null, null, 0, 0));
|
data.add(new Session(0L, 5L, null, null, 0, 0));
|
||||||
data.add(new SessionData(0, 20L, null, null, 0, 0));
|
data.add(new Session(0, 20L, null, null, 0, 0));
|
||||||
data.add(new SessionData(0));
|
|
||||||
List<Long> expResult = new ArrayList<>();
|
List<Long> expResult = new ArrayList<>();
|
||||||
expResult.add(5L);
|
expResult.add(5L);
|
||||||
expResult.add(20L);
|
expResult.add(20L);
|
||||||
|
@ -1,10 +1,9 @@
|
|||||||
package test.java.main.java.com.djrapitops.plan.utilities.comparators;
|
package test.java.main.java.com.djrapitops.plan.utilities.comparators;
|
||||||
|
|
||||||
import main.java.com.djrapitops.plan.data.SessionData;
|
import main.java.com.djrapitops.plan.data.Session;
|
||||||
import main.java.com.djrapitops.plan.data.TPS;
|
import main.java.com.djrapitops.plan.data.TPS;
|
||||||
import main.java.com.djrapitops.plan.data.UserData;
|
import main.java.com.djrapitops.plan.data.UserData;
|
||||||
import main.java.com.djrapitops.plan.data.WebUser;
|
import main.java.com.djrapitops.plan.data.WebUser;
|
||||||
import main.java.com.djrapitops.plan.data.handling.info.HandlingInfo;
|
|
||||||
import main.java.com.djrapitops.plan.locale.Message;
|
import main.java.com.djrapitops.plan.locale.Message;
|
||||||
import main.java.com.djrapitops.plan.locale.Msg;
|
import main.java.com.djrapitops.plan.locale.Msg;
|
||||||
import main.java.com.djrapitops.plan.utilities.PassEncryptUtil;
|
import main.java.com.djrapitops.plan.utilities.PassEncryptUtil;
|
||||||
@ -20,16 +19,6 @@ import static org.junit.Assert.assertEquals;
|
|||||||
|
|
||||||
public class ComparatorTest {
|
public class ComparatorTest {
|
||||||
|
|
||||||
@Test
|
|
||||||
public void testHandlingInfoComparator() {
|
|
||||||
List<HandlingInfo> test = RandomData.randomHandlingInfo();
|
|
||||||
List<Long> longValues = test.stream().map(HandlingInfo::getTime).collect(Collectors.toList());
|
|
||||||
longValues.sort(Long::compare);
|
|
||||||
test.sort(new HandlingInfoTimeComparator());
|
|
||||||
List<Long> afterSort = test.stream().map(HandlingInfo::getTime).collect(Collectors.toList());
|
|
||||||
assertEquals(longValues, afterSort);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testPointComparator() {
|
public void testPointComparator() {
|
||||||
List<Point> test = RandomData.randomPoints();
|
List<Point> test = RandomData.randomPoints();
|
||||||
@ -43,11 +32,11 @@ public class ComparatorTest {
|
|||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testSessionDataComparator() {
|
public void testSessionDataComparator() {
|
||||||
List<SessionData> test = RandomData.randomSessions();
|
List<Session> test = RandomData.randomSessions();
|
||||||
List<Long> longValues = test.stream().map(SessionData::getSessionStart).collect(Collectors.toList());
|
List<Long> longValues = test.stream().map(Session::getSessionStart).collect(Collectors.toList());
|
||||||
longValues.sort(Long::compare);
|
longValues.sort(Long::compare);
|
||||||
test.sort(new SessionDataComparator());
|
test.sort(new SessionDataComparator());
|
||||||
List<Long> afterSort = test.stream().map(SessionData::getSessionStart).collect(Collectors.toList());
|
List<Long> afterSort = test.stream().map(Session::getSessionStart).collect(Collectors.toList());
|
||||||
assertEquals(longValues, afterSort);
|
assertEquals(longValues, afterSort);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,11 +1,9 @@
|
|||||||
package test.java.utils;
|
package test.java.utils;
|
||||||
|
|
||||||
import main.java.com.djrapitops.plan.data.SessionData;
|
import main.java.com.djrapitops.plan.data.Session;
|
||||||
import main.java.com.djrapitops.plan.data.TPS;
|
import main.java.com.djrapitops.plan.data.TPS;
|
||||||
import main.java.com.djrapitops.plan.data.UserData;
|
import main.java.com.djrapitops.plan.data.UserData;
|
||||||
import main.java.com.djrapitops.plan.data.WebUser;
|
import main.java.com.djrapitops.plan.data.WebUser;
|
||||||
import main.java.com.djrapitops.plan.data.handling.info.HandlingInfo;
|
|
||||||
import main.java.com.djrapitops.plan.data.handling.info.InfoType;
|
|
||||||
import main.java.com.djrapitops.plan.utilities.PassEncryptUtil;
|
import main.java.com.djrapitops.plan.utilities.PassEncryptUtil;
|
||||||
import main.java.com.djrapitops.plan.utilities.analysis.Point;
|
import main.java.com.djrapitops.plan.utilities.analysis.Point;
|
||||||
import org.apache.commons.lang.RandomStringUtils;
|
import org.apache.commons.lang.RandomStringUtils;
|
||||||
@ -13,7 +11,6 @@ import org.apache.commons.lang.RandomStringUtils;
|
|||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Random;
|
import java.util.Random;
|
||||||
import java.util.UUID;
|
|
||||||
import java.util.concurrent.ThreadLocalRandom;
|
import java.util.concurrent.ThreadLocalRandom;
|
||||||
|
|
||||||
public class RandomData {
|
public class RandomData {
|
||||||
@ -46,10 +43,10 @@ public class RandomData {
|
|||||||
return test;
|
return test;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static List<SessionData> randomSessions() {
|
public static List<Session> randomSessions() {
|
||||||
List<SessionData> test = new ArrayList<>();
|
List<Session> test = new ArrayList<>();
|
||||||
for (int i = 0; i < 20; i++) {
|
for (int i = 0; i < 20; i++) {
|
||||||
test.add(new SessionData(r.nextLong(), r.nextLong(), null, null, 0, 0));
|
test.add(new Session(r.nextLong(), r.nextLong(), null, null, 0, 0));
|
||||||
}
|
}
|
||||||
return test;
|
return test;
|
||||||
}
|
}
|
||||||
@ -62,19 +59,6 @@ public class RandomData {
|
|||||||
return test;
|
return test;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static List<HandlingInfo> randomHandlingInfo() {
|
|
||||||
List<HandlingInfo> test = new ArrayList<>();
|
|
||||||
for (int i = 0; i < 20; i++) {
|
|
||||||
test.add(new HandlingInfo(UUID.randomUUID(), randomEnum(InfoType.class), r.nextLong()) {
|
|
||||||
@Override
|
|
||||||
public void process(UserData uData) {
|
|
||||||
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
return test;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static <T extends Enum> T randomEnum(Class<T> clazz) {
|
public static <T extends Enum> T randomEnum(Class<T> clazz) {
|
||||||
int x = r.nextInt(clazz.getEnumConstants().length);
|
int x = r.nextInt(clazz.getEnumConstants().length);
|
||||||
return clazz.getEnumConstants()[x];
|
return clazz.getEnumConstants()[x];
|
||||||
|
Loading…
Reference in New Issue
Block a user