/players page parsing

This commit is contained in:
Rsl1122 2017-11-28 20:37:51 +02:00
parent 2856107e18
commit bc2f181975
4 changed files with 95 additions and 36 deletions

View File

@ -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<UUID, Map<UUID, List<Session>>> allSessions = db.getSessionsTable().getAllSessions(false);
Map<UUID, List<Session>> userSessions = new HashMap<>();
for (Map<UUID, List<Session>> sessions : allSessions.values()) {
for (Map.Entry<UUID, List<Session>> entry : sessions.entrySet()) {
UUID uuid = entry.getKey();
List<Session> list = userSessions.getOrDefault(uuid, new ArrayList<>());
list.addAll(entry.getValue());
userSessions.put(uuid, list);
}
}
Map<UUID, List<Session>> userSessions = AnalysisUtils.sortSessionsByUser(allSessions);
long dayAgo = now - TimeAmount.DAY.ms();
long weekAgo = now - TimeAmount.WEEK.ms();

View File

@ -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<String> names = new ArrayList<>(plugin.getDB().getUsersTable().getPlayerNames().values());
Collections.sort(names);
Map<String, String> 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<String> names) {
StringBuilder html = new StringBuilder("<p>");
int size = names.size();
public static String buildPlayersTable(Database db) {
try {
List<UserInfo> users = new ArrayList<>(db.getUsersTable().getUsers().values());
users.sort(new UserInfoLastPlayedComparator());
Map<UUID, Long> lastSeenForAllPlayers = db.getSessionsTable().getLastSeenForAllPlayers();
Map<UUID, List<Session>> sessionsByUser = AnalysisUtils.sortSessionsByUser(db.getSessionsTable().getAllSessions(false));
Map<UUID, List<GeoInfo>> geoInfos = db.getIpsTable().getAllGeoInfo();
html.append(size).append(" players. Use browser's Search to find players by name. (Ctrl+F)</p><table><tr>");
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("<td>").append(link).append("</td>");
try {
if (users.isEmpty()) {
tableContainer.addRow("<b>No Players</b>");
throw new IllegalArgumentException("No players");
}
if (i < size && i % 8 == 0) {
html.append("</tr><tr>");
List<String[]> 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<Session> 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<GeoInfo> 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(),
"<table class=\"table table-bordered table-striped table-hover player-table dataTable\">");
} catch (SQLException e) {
Log.toLog(PlayersPageResponse.class.getClass().getName(), e);
return new InternalErrorResponse(e, "/players").getContent();
}
html.append("</tr></table>");
return html.toString();
}
}

View File

@ -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<UUID, List<Session>> sortSessionsByUser(Map<UUID, Map<UUID, List<Session>>> allSessions) {
Map<UUID, List<Session>> userSessions = new HashMap<>();
for (Map<UUID, List<Session>> sessions : allSessions.values()) {
for (Map.Entry<UUID, List<Session>> entry : sessions.entrySet()) {
UUID uuid = entry.getKey();
List<Session> list = userSessions.getOrDefault(uuid, new ArrayList<>());
list.addAll(entry.getValue());
userSessions.put(uuid, list);
}
}
return userSessions;
}
}

View File

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