From bc2f1819751d59505f4e73838c336ca6411ad5c0 Mon Sep 17 00:00:00 2001 From: Rsl1122 Date: Tue, 28 Nov 2017 20:37:51 +0200 Subject: [PATCH] /players page parsing --- .../info/parsing/NetworkPageParser.java | 16 ++-- .../response/PlayersPageResponse.java | 90 +++++++++++++++---- .../utilities/analysis/AnalysisUtils.java | 16 +++- .../utilities/analysis/ExportUtility.java | 9 -- 4 files changed, 95 insertions(+), 36 deletions(-) diff --git a/Plan/src/main/java/com/djrapitops/plan/systems/info/parsing/NetworkPageParser.java b/Plan/src/main/java/com/djrapitops/plan/systems/info/parsing/NetworkPageParser.java index 74a591a10..d54738bb5 100644 --- a/Plan/src/main/java/com/djrapitops/plan/systems/info/parsing/NetworkPageParser.java +++ b/Plan/src/main/java/com/djrapitops/plan/systems/info/parsing/NetworkPageParser.java @@ -22,7 +22,10 @@ import main.java.com.djrapitops.plan.utilities.html.HtmlUtils; import main.java.com.djrapitops.plan.utilities.html.graphs.PlayerActivityGraphCreator; import java.sql.SQLException; -import java.util.*; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.UUID; /** * Html String parser for /network page. @@ -74,16 +77,7 @@ public class NetworkPageParser extends PageParser { private void uniquePlayers(long now, Database db) throws SQLException { Map>> allSessions = db.getSessionsTable().getAllSessions(false); - Map> userSessions = new HashMap<>(); - - for (Map> sessions : allSessions.values()) { - for (Map.Entry> entry : sessions.entrySet()) { - UUID uuid = entry.getKey(); - List list = userSessions.getOrDefault(uuid, new ArrayList<>()); - list.addAll(entry.getValue()); - userSessions.put(uuid, list); - } - } + Map> userSessions = AnalysisUtils.sortSessionsByUser(allSessions); long dayAgo = now - TimeAmount.DAY.ms(); long weekAgo = now - TimeAmount.WEEK.ms(); diff --git a/Plan/src/main/java/com/djrapitops/plan/systems/webserver/response/PlayersPageResponse.java b/Plan/src/main/java/com/djrapitops/plan/systems/webserver/response/PlayersPageResponse.java index ae16fdc47..c38a37a23 100644 --- a/Plan/src/main/java/com/djrapitops/plan/systems/webserver/response/PlayersPageResponse.java +++ b/Plan/src/main/java/com/djrapitops/plan/systems/webserver/response/PlayersPageResponse.java @@ -1,11 +1,24 @@ package main.java.com.djrapitops.plan.systems.webserver.response; import com.djrapitops.plugin.api.utility.log.Log; +import main.java.com.djrapitops.plan.Plan; +import main.java.com.djrapitops.plan.api.API; import main.java.com.djrapitops.plan.api.IPlan; +import main.java.com.djrapitops.plan.data.GeoInfo; +import main.java.com.djrapitops.plan.data.PlayerProfile; +import main.java.com.djrapitops.plan.data.Session; +import main.java.com.djrapitops.plan.data.UserInfo; +import main.java.com.djrapitops.plan.data.additional.TableContainer; +import main.java.com.djrapitops.plan.database.Database; import main.java.com.djrapitops.plan.systems.webserver.theme.Theme; +import main.java.com.djrapitops.plan.utilities.FormatUtils; import main.java.com.djrapitops.plan.utilities.MiscUtils; +import main.java.com.djrapitops.plan.utilities.analysis.AnalysisUtils; +import main.java.com.djrapitops.plan.utilities.comparators.GeoInfoComparator; +import main.java.com.djrapitops.plan.utilities.comparators.UserInfoLastPlayedComparator; import main.java.com.djrapitops.plan.utilities.file.FileUtil; import main.java.com.djrapitops.plan.utilities.html.Html; +import org.apache.commons.lang3.ArrayUtils; import org.apache.commons.lang3.text.StrSubstitutor; import java.io.IOException; @@ -25,7 +38,7 @@ public class PlayersPageResponse extends Response { List names = new ArrayList<>(plugin.getDB().getUsersTable().getPlayerNames().values()); Collections.sort(names); Map replace = new HashMap<>(); - replace.put("content", buildContent(names)); + replace.put("playersTable", buildPlayersTable(plugin.getDB())); replace.put("version", plugin.getVersion()); super.setContent(Theme.replaceColors(StrSubstitutor.replace(FileUtil.getStringFromResource("web/players.html"), replace))); } catch (SQLException | IOException e) { @@ -34,25 +47,72 @@ public class PlayersPageResponse extends Response { } } - public static String buildContent(List names) { - StringBuilder html = new StringBuilder("

"); - int size = names.size(); + public static String buildPlayersTable(Database db) { + try { + List users = new ArrayList<>(db.getUsersTable().getUsers().values()); + users.sort(new UserInfoLastPlayedComparator()); + Map lastSeenForAllPlayers = db.getSessionsTable().getLastSeenForAllPlayers(); + Map> sessionsByUser = AnalysisUtils.sortSessionsByUser(db.getSessionsTable().getAllSessions(false)); + Map> geoInfos = db.getIpsTable().getAllGeoInfo(); - html.append(size).append(" players. Use browser's Search to find players by name. (Ctrl+F)

"); + String userS = Html.FONT_AWESOME_ICON.parse("user") + " Player"; + String playtimeS = Html.FONT_AWESOME_ICON.parse("clock-o") + " Playtime"; + String sessionsS = Html.FONT_AWESOME_ICON.parse("calendar-plus-o") + " Sessions"; + String registeredS = Html.FONT_AWESOME_ICON.parse("user-plus") + " Registered"; + String lastSeenS = Html.FONT_AWESOME_ICON.parse("calendar-check-o") + " Last Seen"; + String geolocationS = Html.FONT_AWESOME_ICON.parse("globe") + " Geolocation"; - int i = 1; - for (String name : names) { - String link = Html.LINK.parse("../player/" + name, name); + TableContainer tableContainer = new TableContainer(userS, playtimeS, sessionsS, registeredS, lastSeenS, geolocationS); - html.append(""); + try { + if (users.isEmpty()) { + tableContainer.addRow("No Players"); + throw new IllegalArgumentException("No players"); + } - if (i < size && i % 8 == 0) { - html.append(""); + List sortedData = new ArrayList<>(); + API planAPI = Plan.getPlanAPI(); + + int i = 0; + for (UserInfo userInfo : users) { + if (i >= 25000) { + break; + } + UUID uuid = userInfo.getUuid(); + String[] playerData = new String[6]; + String playerName = userInfo.getName(); + + String link = Html.LINK_EXTERNAL.parse(planAPI.getPlayerInspectPageLink(playerName), playerName); + + List sessions = sessionsByUser.getOrDefault(uuid, new ArrayList<>()); + int sessionCount = sessions.size(); + long playtime = sessionCount != 0 ? PlayerProfile.getPlaytime(sessions.stream()) : 0L; + long registered = userInfo.getRegistered(); + long lastSeen = lastSeenForAllPlayers.getOrDefault(uuid, 0L); + List geoInfoList = geoInfos.getOrDefault(uuid, new ArrayList<>()); + geoInfoList.sort(new GeoInfoComparator()); + String geolocation = geoInfoList.isEmpty() ? "Not Known" : geoInfoList.get(0).getGeolocation(); + + playerData[0] = link; + playerData[1] = FormatUtils.formatTimeAmount(playtime); + playerData[2] = sessionCount + ""; + playerData[3] = FormatUtils.formatTimeStampYear(registered); + playerData[4] = lastSeen != 0 ? FormatUtils.formatTimeStampYear(lastSeen) : "-"; + playerData[5] = geolocation; + sortedData.add(playerData); + i++; + } + + for (String[] playerData : sortedData) { + tableContainer.addRow(ArrayUtils.addAll(playerData)); + } + } catch (IllegalArgumentException ignored) { } - i++; + return tableContainer.parseHtml().replace(Html.TABLE_SCROLL.parse(), + "
").append(link).append("
"); + } catch (SQLException e) { + Log.toLog(PlayersPageResponse.class.getClass().getName(), e); + return new InternalErrorResponse(e, "/players").getContent(); } - - html.append("
"); - return html.toString(); } } diff --git a/Plan/src/main/java/com/djrapitops/plan/utilities/analysis/AnalysisUtils.java b/Plan/src/main/java/com/djrapitops/plan/utilities/analysis/AnalysisUtils.java index d53f2e8b0..743e0474b 100644 --- a/Plan/src/main/java/com/djrapitops/plan/utilities/analysis/AnalysisUtils.java +++ b/Plan/src/main/java/com/djrapitops/plan/utilities/analysis/AnalysisUtils.java @@ -7,7 +7,6 @@ import main.java.com.djrapitops.plan.data.Session; import main.java.com.djrapitops.plan.data.time.GMTimes; import main.java.com.djrapitops.plan.data.time.WorldTimes; import main.java.com.djrapitops.plan.utilities.MiscUtils; -import main.java.com.djrapitops.plan.utilities.comparators.SessionLengthComparator; import java.sql.SQLException; import java.util.*; @@ -150,4 +149,19 @@ public class AnalysisUtils { Log.toLog("AnalysisUtils.addMissingWorlds", e); } } + + public static Map> sortSessionsByUser(Map>> allSessions) { + Map> userSessions = new HashMap<>(); + + for (Map> sessions : allSessions.values()) { + for (Map.Entry> entry : sessions.entrySet()) { + UUID uuid = entry.getKey(); + List list = userSessions.getOrDefault(uuid, new ArrayList<>()); + list.addAll(entry.getValue()); + userSessions.put(uuid, list); + } + } + + return userSessions; + } } diff --git a/Plan/src/main/java/com/djrapitops/plan/utilities/analysis/ExportUtility.java b/Plan/src/main/java/com/djrapitops/plan/utilities/analysis/ExportUtility.java index 582d7bc32..f9d294753 100644 --- a/Plan/src/main/java/com/djrapitops/plan/utilities/analysis/ExportUtility.java +++ b/Plan/src/main/java/com/djrapitops/plan/utilities/analysis/ExportUtility.java @@ -123,13 +123,4 @@ public class ExportUtility { // Log.logDebug("Export", "Analysis Page File: " + analysisHtmlFile.getAbsolutePath()); // Files.write(analysisHtmlFile.toPath(), Collections.singletonList(analysisHtml)); } - - private static void writePlayersPageHtml(List names, File playersFolder) throws IOException { - String playersHtml = PlayersPageResponse.buildContent(names); - playersFolder.mkdirs(); - File playersHtmlFile = new File(playersFolder, "index.html"); - Log.logDebug("Export", "Players Page File: " + playersHtmlFile.getAbsolutePath()); - Files.write(playersHtmlFile.toPath(), Collections.singletonList(playersHtml)); - } - }