Split Session table creation for Player page to a separate class

This commit is contained in:
Rsl1122 2018-06-17 20:35:01 +03:00
parent a092e39ee4
commit a83c871bf8
8 changed files with 113 additions and 54 deletions

View File

@ -71,7 +71,7 @@ public class DataContainer extends HashMap<Key, Supplier> {
public <T> T getUnsafe(Key<T> key) {
Supplier supplier = get(key);
if (supplier == null) {
throw new IllegalArgumentException("Unsupported Key");
throw new IllegalArgumentException("Unsupported Key: " + key.getKeyName());
}
return (T) supplier.get();
}

View File

@ -39,6 +39,7 @@ import com.djrapitops.plan.utilities.html.structure.SessionAccordion;
import com.djrapitops.plan.utilities.html.tables.ActionsTable;
import com.djrapitops.plan.utilities.html.tables.GeoInfoTable;
import com.djrapitops.plan.utilities.html.tables.NicknameTable;
import com.djrapitops.plan.utilities.html.tables.PlayerSessionTable;
import com.djrapitops.plugin.api.Benchmark;
import com.djrapitops.plugin.api.TimeAmount;
@ -134,7 +135,19 @@ public class InspectPage extends Page {
SessionsMutator allSessionsMutator = new SessionsMutator(allSessions);
allSessions.sort(new SessionStartComparator());
SessionAccordion sessionAccordion = SessionAccordion.forPlayer(allSessions, () -> serverNames);
String sessionAccordionViewScript = "";
if (allSessions.isEmpty()) {
addValue("accordionSessions", "<div class=\"body\">" + "<p>No Sessions</p>" + "</div>");
} else {
if (Settings.DISPLAY_SESSIONS_AS_TABLE.isTrue()) {
addValue("accordionSessions", new PlayerSessionTable(playerName, allSessions).parseHtml());
} else {
SessionAccordion sessionAccordion = SessionAccordion.forPlayer(allSessions, () -> serverNames);
addValue("accordionSessions", sessionAccordion.toHtml());
sessionAccordionViewScript = sessionAccordion.toViewScript();
}
}
// TODO Session table if setting is enabled
ServerAccordion serverAccordion = new ServerAccordion(container, serverNames);
@ -143,9 +156,8 @@ public class InspectPage extends Page {
addValue("calendarSeries", playerCalendar.toCalendarSeries());
addValue("firstDay", 1);
addValue("accordionSessions", sessionAccordion.toHtml());
addValue("accordionServers", serverAccordion.toHtml());
addValue("sessionTabGraphViewFunctions", sessionAccordion.toViewScript() + serverAccordion.toViewScript());
addValue("sessionTabGraphViewFunctions", sessionAccordionViewScript + serverAccordion.toViewScript());
long dayAgo = now - TimeAmount.DAY.ms();
long weekAgo = now - TimeAmount.WEEK.ms();

View File

@ -4,9 +4,11 @@ import com.djrapitops.plan.data.PlayerProfile;
import com.djrapitops.plan.data.calculation.ActivityIndex;
import com.djrapitops.plan.data.container.Session;
import com.djrapitops.plan.data.container.StickyData;
import com.djrapitops.plan.data.store.keys.SessionKeys;
import com.djrapitops.plan.data.time.GMTimes;
import com.djrapitops.plan.data.time.WorldTimes;
import com.djrapitops.plan.system.settings.WorldAliasSettings;
import com.djrapitops.plan.utilities.FormatUtils;
import com.djrapitops.plugin.api.TimeAmount;
import java.util.*;
@ -258,4 +260,33 @@ public class AnalysisUtils {
return new StickyData(averageIndex, averageMessagesSent, averagePlayersOnline);
}
public static String getLongestWorldPlayed(Session session) {
Map<String, String> aliases = WorldAliasSettings.getAliases();
if (!session.supports(SessionKeys.WORLD_TIMES)) {
return "No World Time Data";
}
if (!session.supports(SessionKeys.END)) {
return "Current: " + aliases.get(session.getUnsafe(SessionKeys.WORLD_TIMES).getCurrentWorld());
}
WorldTimes worldTimes = session.getUnsafe(SessionKeys.WORLD_TIMES);
Map<String, Long> playtimePerAlias = getPlaytimePerAlias(worldTimes);
long total = worldTimes.getTotal();
long longest = 0;
String theWorld = "-";
for (Map.Entry<String, Long> entry : playtimePerAlias.entrySet()) {
String world = entry.getKey();
long time = entry.getValue();
if (time > longest) {
longest = time;
theWorld = world;
}
}
double percentage = longest * 100.0 / total;
return theWorld + " (" + FormatUtils.cutDecimals(percentage) + "%)";
}
}

View File

@ -5,17 +5,13 @@
package com.djrapitops.plan.utilities.html;
import com.djrapitops.plan.api.exceptions.database.DBOpException;
import com.djrapitops.plan.data.container.Session;
import com.djrapitops.plan.system.database.databases.Database;
import com.djrapitops.plan.system.info.server.Server;
import com.djrapitops.plan.system.info.server.ServerInfo;
import com.djrapitops.plan.system.info.server.ServerProperties;
import com.djrapitops.plan.system.settings.Settings;
import com.djrapitops.plan.utilities.FormatUtils;
import com.djrapitops.plan.utilities.analysis.Analysis;
import com.djrapitops.plan.utilities.html.graphs.line.OnlineActivityGraph;
import com.djrapitops.plan.utilities.html.structure.SessionTabStructureCreator;
import com.djrapitops.plan.utilities.html.tables.SessionsTableCreator;
import com.djrapitops.plugin.api.utility.log.Log;
import com.djrapitops.plugin.utilities.Verify;
@ -61,19 +57,6 @@ public class HtmlStructure {
return builder.toString();
}
@Deprecated
public static String[] createSessionsTabContentInspectPage(Map<String, List<Session>> sessions, List<Session> allSessions, UUID uuid) {
if (Settings.DISPLAY_SESSIONS_AS_TABLE.isTrue()) {
Map<UUID, List<Session>> sessionsByPlayer = new HashMap<>();
sessionsByPlayer.put(uuid, allSessions);
return new String[]{Html.TABLE_SESSIONS.parse("", "", "", SessionsTableCreator.createTable(sessionsByPlayer, allSessions)[0]), ""};
} else {
Map<UUID, Map<String, List<Session>>> map = new HashMap<>();
map.put(uuid, sessions);
return SessionTabStructureCreator.createStructure(map, allSessions, false);
}
}
public static String[] createInspectPageTabContentCalculating() {
String tab = "<div class=\"tab\">" +
"<div class=\"row clearfix\">" +

View File

@ -10,10 +10,10 @@ import com.djrapitops.plan.data.time.WorldTimes;
import com.djrapitops.plan.system.settings.Settings;
import com.djrapitops.plan.system.settings.theme.Theme;
import com.djrapitops.plan.system.settings.theme.ThemeVal;
import com.djrapitops.plan.utilities.analysis.AnalysisUtils;
import com.djrapitops.plan.utilities.html.HtmlStructure;
import com.djrapitops.plan.utilities.html.graphs.pie.WorldPie;
import com.djrapitops.plan.utilities.html.tables.KillsTable;
import com.djrapitops.plan.utilities.html.tables.SessionsTableCreator;
import java.util.*;
import java.util.function.Supplier;
@ -107,7 +107,7 @@ public class SessionAccordion extends AbstractAccordion {
int deaths = session.getValue(SessionKeys.DEATH_COUNT).orElse(0);
String info = appendWorldPercentage
? HtmlStructure.separateWithDots(sessionStart, SessionsTableCreator.getLongestWorldPlayed(session))
? HtmlStructure.separateWithDots(sessionStart, AnalysisUtils.getLongestWorldPlayed(session))
: sessionStart;
String title = HtmlStructure.separateWithDots(playerName, info) + "<span class=\"pull-right\">" + length + "</span>";
String htmlID = "" + session.getValue(SessionKeys.START).orElse(0L) + i;
@ -178,7 +178,7 @@ public class SessionAccordion extends AbstractAccordion {
int deaths = session.getValue(SessionKeys.DEATH_COUNT).orElse(0);
String info = appendWorldPercentage
? HtmlStructure.separateWithDots(sessionStart, SessionsTableCreator.getLongestWorldPlayed(session))
? HtmlStructure.separateWithDots(sessionStart, AnalysisUtils.getLongestWorldPlayed(session))
: sessionStart;
String title = HtmlStructure.separateWithDots(serverName, info) + "<span class=\"pull-right\">" + length + "</span>";
String htmlID = "" + session.getValue(SessionKeys.START).orElse(0L) + i;

View File

@ -14,6 +14,7 @@ import com.djrapitops.plan.system.cache.DataCache;
import com.djrapitops.plan.system.settings.Settings;
import com.djrapitops.plan.system.settings.theme.Theme;
import com.djrapitops.plan.system.settings.theme.ThemeVal;
import com.djrapitops.plan.utilities.analysis.AnalysisUtils;
import com.djrapitops.plan.utilities.html.Html;
import com.djrapitops.plan.utilities.html.HtmlStructure;
import com.djrapitops.plan.utilities.html.graphs.pie.WorldPie;
@ -79,7 +80,7 @@ public class SessionTabStructureCreator {
String link = PlanAPI.getInstance().getPlayerInspectPageLink(name);
String info = appendWorldPercentage
? HtmlStructure.separateWithDots(sessionStart, SessionsTableCreator.getLongestWorldPlayed(session))
? HtmlStructure.separateWithDots(sessionStart, AnalysisUtils.getLongestWorldPlayed(session))
: sessionStart;
String nameAndInfo = appendName ?
HtmlStructure.separateWithDots(name, info) :

View File

@ -0,0 +1,60 @@
package com.djrapitops.plan.utilities.html.tables;
import com.djrapitops.plan.api.PlanAPI;
import com.djrapitops.plan.data.container.Session;
import com.djrapitops.plan.data.element.TableContainer;
import com.djrapitops.plan.data.store.keys.SessionKeys;
import com.djrapitops.plan.data.store.mutators.formatting.Formatters;
import com.djrapitops.plan.system.settings.Settings;
import com.djrapitops.plan.utilities.analysis.AnalysisUtils;
import com.djrapitops.plan.utilities.html.Html;
import java.util.List;
/**
* TableContainer for a Session table for a single player.
*
* @author Rsl1122
*/
public class PlayerSessionTable extends TableContainer {
private final String playerName;
private final List<Session> sessions;
public PlayerSessionTable(String playerName, List<Session> sessions) {
super("Player", "Start", "Length", "World");
this.playerName = playerName;
this.sessions = sessions;
addRows();
}
private void addRows() {
int maxSessions = Settings.MAX_SESSIONS.getNumber();
if (maxSessions <= 0) {
maxSessions = 50;
}
String inspectUrl = PlanAPI.getInstance().getPlayerInspectPageLink(playerName);
int i = 0;
for (Session session : sessions) {
if (i >= maxSessions) {
break;
}
String start = Formatters.year().apply(session);
String length = session.supports(SessionKeys.END)
? Formatters.timeAmount().apply(session.getValue(SessionKeys.LENGTH).orElse(0L))
: "Online";
String world = AnalysisUtils.getLongestWorldPlayed(session);
String toolTip = "Session ID: " + session.getValue(SessionKeys.DB_ID)
.map(id -> Integer.toString(id))
.orElse("Not Saved.");
addRow(Html.LINK_TOOLTIP.parse(inspectUrl, playerName, toolTip), start, length, world);
i++;
}
}
}

View File

@ -7,12 +7,9 @@ package com.djrapitops.plan.utilities.html.tables;
import com.djrapitops.plan.api.PlanAPI;
import com.djrapitops.plan.data.container.Session;
import com.djrapitops.plan.data.store.mutators.formatting.Formatters;
import com.djrapitops.plan.data.time.WorldTimes;
import com.djrapitops.plan.system.cache.DataCache;
import com.djrapitops.plan.system.cache.SessionCache;
import com.djrapitops.plan.system.settings.Settings;
import com.djrapitops.plan.system.settings.WorldAliasSettings;
import com.djrapitops.plan.utilities.FormatUtils;
import com.djrapitops.plan.utilities.analysis.AnalysisUtils;
import com.djrapitops.plan.utilities.comparators.SessionStartComparator;
import com.djrapitops.plan.utilities.html.Html;
@ -79,7 +76,7 @@ public class SessionsTableCreator {
String name = dataCache.getName(uuid);
String start = Formatters.year().apply(session);
String length = session.getSessionEnd() != -1 ? Formatters.timeAmount().apply(session.getLength()) : "Online";
String world = getLongestWorldPlayed(session);
String world = AnalysisUtils.getLongestWorldPlayed(session);
String inspectUrl = PlanAPI.getInstance().getPlayerInspectPageLink(name);
String toolTip = "Session ID: " + (session.isFetchedFromDB() ? session.getSessionID() : "Not Saved.");
@ -104,29 +101,4 @@ public class SessionsTableCreator {
return new String[]{sessionTableBuilder.toString(), recentLoginsBuilder.toString()};
}
public static String getLongestWorldPlayed(Session session) {
Map<String, String> aliases = WorldAliasSettings.getAliases();
if (session.getSessionEnd() == -1) {
return "Current: " + aliases.get(session.getWorldTimes().getCurrentWorld());
}
WorldTimes worldTimes = session.getWorldTimes();
Map<String, Long> playtimePerAlias = AnalysisUtils.getPlaytimePerAlias(worldTimes);
long total = worldTimes.getTotal();
long longest = 0;
String theWorld = "-";
for (Map.Entry<String, Long> entry : playtimePerAlias.entrySet()) {
String world = entry.getKey();
long time = entry.getValue();
if (time > longest) {
longest = time;
theWorld = world;
}
}
double percentage = longest * 100.0 / total;
return theWorld + " (" + FormatUtils.cutDecimals(percentage) + "%)";
}
}