mirror of
https://github.com/plan-player-analytics/Plan.git
synced 2025-02-05 23:11:56 +01:00
/players page parsing
This commit is contained in:
parent
2856107e18
commit
bc2f181975
@ -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();
|
||||
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
@ -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));
|
||||
}
|
||||
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user