From 7f9146fcf4bc98aa5e08c9a74a19d6841507ee1f Mon Sep 17 00:00:00 2001 From: Rsl1122 Date: Sat, 6 Oct 2018 21:38:59 +0300 Subject: [PATCH] [Debt] Refactored Server Boxes to network page generation Some features could not be implemented or will have reduced precision: - Server type - Players Online is deduced from TPS data - Analysis Refresh date is now a true/false based on cache value --- .../store/containers/NetworkContainer.java | 43 +++++---- .../plan/data/store/keys/NetworkKeys.java | 3 + .../databases/operation/FetchOperations.java | 1 + .../databases/sql/operation/SQLFetchOps.java | 4 + .../databases/sql/tables/TPSTable.java | 39 +++++++- .../plan/system/info/ServerInfoSystem.java | 3 +- .../plan/utilities/html/HtmlStructure.java | 79 --------------- .../html/structure/NetworkServerBox.java | 96 +++++++++++++++++++ 8 files changed, 164 insertions(+), 104 deletions(-) create mode 100644 Plan/src/main/java/com/djrapitops/plan/utilities/html/structure/NetworkServerBox.java diff --git a/Plan/src/main/java/com/djrapitops/plan/data/store/containers/NetworkContainer.java b/Plan/src/main/java/com/djrapitops/plan/data/store/containers/NetworkContainer.java index 7bdae0c79..4a5c8df78 100644 --- a/Plan/src/main/java/com/djrapitops/plan/data/store/containers/NetworkContainer.java +++ b/Plan/src/main/java/com/djrapitops/plan/data/store/containers/NetworkContainer.java @@ -1,5 +1,6 @@ package com.djrapitops.plan.data.store.containers; +import com.djrapitops.plan.data.container.TPS; import com.djrapitops.plan.data.store.Key; import com.djrapitops.plan.data.store.keys.NetworkKeys; import com.djrapitops.plan.data.store.keys.ServerKeys; @@ -8,6 +9,7 @@ import com.djrapitops.plan.data.store.mutators.TPSMutator; import com.djrapitops.plan.data.store.mutators.health.NetworkHealthInformation; import com.djrapitops.plan.data.store.objects.DateHolder; import com.djrapitops.plan.system.database.databases.Database; +import com.djrapitops.plan.system.info.server.Server; import com.djrapitops.plan.system.info.server.properties.ServerProperties; import com.djrapitops.plan.system.settings.Settings; import com.djrapitops.plan.system.settings.config.PlanConfig; @@ -17,13 +19,14 @@ import com.djrapitops.plan.utilities.formatting.Formatter; import com.djrapitops.plan.utilities.html.graphs.Graphs; import com.djrapitops.plan.utilities.html.graphs.bar.BarGraph; import com.djrapitops.plan.utilities.html.graphs.stack.StackGraph; +import com.djrapitops.plan.utilities.html.structure.NetworkServerBox; import com.djrapitops.plugin.api.Check; import com.djrapitops.plugin.api.TimeAmount; +import java.util.ArrayList; import java.util.HashMap; +import java.util.List; import java.util.Map; -import java.util.Optional; -import java.util.UUID; import java.util.concurrent.TimeUnit; /** @@ -48,19 +51,35 @@ public class NetworkContainer extends DataContainer { private Formatter yearFormatter; private Formatter secondLongFormatter; - private final Map serverContainers; - public NetworkContainer(ServerContainer bungeeContainer) { this.bungeeContainer = bungeeContainer; - serverContainers = new HashMap<>(); putSupplier(NetworkKeys.PLAYERS_MUTATOR, () -> PlayersMutator.forContainer(bungeeContainer)); addConstants(); + addServerBoxes(); addPlayerInformation(); addNetworkHealth(); } + private void addServerBoxes() { + putSupplier(NetworkKeys.NETWORK_PLAYER_ONLINE_DATA, () -> database.fetch().getPlayersOnlineForServers( + getValue(NetworkKeys.BUKKIT_SERVERS).orElse(new ArrayList<>())) + ); + putSupplier(NetworkKeys.SERVERS_TAB, () -> { + StringBuilder serverBoxes = new StringBuilder(); + Map> playersOnlineData = getValue(NetworkKeys.NETWORK_PLAYER_ONLINE_DATA).orElse(new HashMap<>()); + for (Server server : getValue(NetworkKeys.BUKKIT_SERVERS).orElse(new ArrayList<>())) { + TPSMutator tpsMutator = new TPSMutator(playersOnlineData.getOrDefault(server.getId(), new ArrayList<>())); + + // TODO Add Registered players per server. + NetworkServerBox serverBox = new NetworkServerBox(server, 0, tpsMutator, graphs); + serverBoxes.append(serverBox.toHtml()); + } + return serverBoxes.toString(); + }); + } + private void addNetworkHealth() { Key healthInformation = new Key<>(NetworkHealthInformation.class, "HEALTH_INFORMATION"); putSupplier(healthInformation, () -> new NetworkHealthInformation(this)); @@ -68,20 +87,6 @@ public class NetworkContainer extends DataContainer { putSupplier(NetworkKeys.HEALTH_NOTES, () -> getUnsafe(healthInformation).toHtml()); } - public void putAnalysisContainer(AnalysisContainer analysisContainer) { - serverContainers.put(analysisContainer.getServerContainer().getUnsafe(ServerKeys.SERVER_UUID), analysisContainer); - } - - public Optional getAnalysisContainer(UUID serverUUID) { - AnalysisContainer container = serverContainers.get(serverUUID); - if (container != null) { - return Optional.of(container); - } - AnalysisContainer analysisContainer = new AnalysisContainer(database.fetch().getServerContainer(serverUUID)); - serverContainers.put(serverUUID, analysisContainer); - return Optional.of(analysisContainer); - } - private void addConstants() { long now = System.currentTimeMillis(); putRawData(NetworkKeys.REFRESH_TIME, now); diff --git a/Plan/src/main/java/com/djrapitops/plan/data/store/keys/NetworkKeys.java b/Plan/src/main/java/com/djrapitops/plan/data/store/keys/NetworkKeys.java index f85c0c4ed..f5519f29d 100644 --- a/Plan/src/main/java/com/djrapitops/plan/data/store/keys/NetworkKeys.java +++ b/Plan/src/main/java/com/djrapitops/plan/data/store/keys/NetworkKeys.java @@ -1,5 +1,6 @@ package com.djrapitops.plan.data.store.keys; +import com.djrapitops.plan.data.container.TPS; import com.djrapitops.plan.data.store.Key; import com.djrapitops.plan.data.store.PlaceholderKey; import com.djrapitops.plan.data.store.Type; @@ -37,6 +38,7 @@ public class NetworkKeys { public static final PlaceholderKey PLAYERS_NEW_WEEK = CommonPlaceholderKeys.PLAYERS_NEW_WEEK; public static final PlaceholderKey PLAYERS_NEW_MONTH = CommonPlaceholderKeys.PLAYERS_NEW_MONTH; + public static final PlaceholderKey SERVERS_TAB = new PlaceholderKey<>(String.class, "tabContentServers"); public static final PlaceholderKey WORLD_MAP_SERIES = CommonPlaceholderKeys.WORLD_MAP_SERIES; public static final PlaceholderKey PLAYERS_ONLINE_SERIES = CommonPlaceholderKeys.PLAYERS_ONLINE_SERIES; public static final PlaceholderKey ACTIVITY_STACK_SERIES = CommonPlaceholderKeys.ACTIVITY_STACK_SERIES; @@ -55,6 +57,7 @@ public class NetworkKeys { public static final Key> BUKKIT_SERVERS = new Key<>(new Type>() {}, "BUKKIT_SERVERS"); public static final Key>>> ACTIVITY_DATA = CommonKeys.ACTIVITY_DATA; + public static final Key>> NETWORK_PLAYER_ONLINE_DATA = new Key<>(new Type>>() {}, "NETWORK_PLAYER_ONLINE_DATA"); private NetworkKeys() { /* static variable class */ diff --git a/Plan/src/main/java/com/djrapitops/plan/system/database/databases/operation/FetchOperations.java b/Plan/src/main/java/com/djrapitops/plan/system/database/databases/operation/FetchOperations.java index 666385c97..c5a80a86c 100644 --- a/Plan/src/main/java/com/djrapitops/plan/system/database/databases/operation/FetchOperations.java +++ b/Plan/src/main/java/com/djrapitops/plan/system/database/databases/operation/FetchOperations.java @@ -116,4 +116,5 @@ public interface FetchOperations { List getServerUUIDs(); + Map> getPlayersOnlineForServers(Collection serverUUIDs); } diff --git a/Plan/src/main/java/com/djrapitops/plan/system/database/databases/sql/operation/SQLFetchOps.java b/Plan/src/main/java/com/djrapitops/plan/system/database/databases/sql/operation/SQLFetchOps.java index cd7f12615..638190a91 100644 --- a/Plan/src/main/java/com/djrapitops/plan/system/database/databases/sql/operation/SQLFetchOps.java +++ b/Plan/src/main/java/com/djrapitops/plan/system/database/databases/sql/operation/SQLFetchOps.java @@ -461,4 +461,8 @@ public class SQLFetchOps extends SQLOps implements FetchOperations { return serverTable.getServerUUIDs(); } + @Override + public Map> getPlayersOnlineForServers(Collection serverUUIDs) { + return tpsTable.getPlayersOnlineForServers(serverUUIDs); + } } diff --git a/Plan/src/main/java/com/djrapitops/plan/system/database/databases/sql/tables/TPSTable.java b/Plan/src/main/java/com/djrapitops/plan/system/database/databases/sql/tables/TPSTable.java index df9c31c0f..bf0b7fb6d 100644 --- a/Plan/src/main/java/com/djrapitops/plan/system/database/databases/sql/tables/TPSTable.java +++ b/Plan/src/main/java/com/djrapitops/plan/system/database/databases/sql/tables/TPSTable.java @@ -7,10 +7,7 @@ import com.djrapitops.plan.system.database.databases.sql.SQLDB; import com.djrapitops.plan.system.database.databases.sql.processing.ExecStatement; import com.djrapitops.plan.system.database.databases.sql.processing.QueryAllStatement; import com.djrapitops.plan.system.database.databases.sql.processing.QueryStatement; -import com.djrapitops.plan.system.database.databases.sql.statements.Column; -import com.djrapitops.plan.system.database.databases.sql.statements.Select; -import com.djrapitops.plan.system.database.databases.sql.statements.Sql; -import com.djrapitops.plan.system.database.databases.sql.statements.TableSqlParser; +import com.djrapitops.plan.system.database.databases.sql.statements.*; import com.djrapitops.plan.system.info.server.Server; import com.djrapitops.plugin.api.TimeAmount; import com.djrapitops.plugin.utilities.Verify; @@ -304,6 +301,40 @@ public class TPSTable extends Table { }); } + public Map> getPlayersOnlineForServers(Collection servers) { + WhereParser sqlParser = Select.from(tableName, Col.SERVER_ID, Col.DATE, Col.PLAYERS_ONLINE) + .where(Col.DATE.get() + ">" + (System.currentTimeMillis() - TimeAmount.WEEK.toMillis(2L))); + String statementSelectServerID = serverTable.statementSelectServerID; + for (Server server : servers) { + sqlParser.or(Col.SERVER_ID + "=" + statementSelectServerID.replace("?", server.getUuid().toString())); + } + + String sql = sqlParser.toString(); + + return query(new QueryAllStatement>>(sql, 10000) { + @Override + public Map> processResults(ResultSet set) throws SQLException { + Map> map = new HashMap<>(); + while (set.next()) { + int serverID = set.getInt(Col.SERVER_ID.get()); + int playersOnline = set.getInt(Col.PLAYERS_ONLINE.get()); + long date = set.getLong(Col.DATE.get()); + + List tpsList = map.getOrDefault(serverID, new ArrayList<>()); + + TPS tps = TPSBuilder.get().date(date) + .skipTPS() + .playersOnline(playersOnline) + .toTPS(); + tpsList.add(tps); + + map.put(serverID, tpsList); + } + return map; + } + }); + } + public enum Col implements Column { SERVER_ID("server_id"), DATE("date"), diff --git a/Plan/src/main/java/com/djrapitops/plan/system/info/ServerInfoSystem.java b/Plan/src/main/java/com/djrapitops/plan/system/info/ServerInfoSystem.java index 3cedc8117..f60973990 100644 --- a/Plan/src/main/java/com/djrapitops/plan/system/info/ServerInfoSystem.java +++ b/Plan/src/main/java/com/djrapitops/plan/system/info/ServerInfoSystem.java @@ -13,7 +13,6 @@ import com.djrapitops.plan.system.info.request.InfoRequestFactory; import com.djrapitops.plan.system.info.request.SetupRequest; import com.djrapitops.plan.system.info.server.ServerInfo; import com.djrapitops.plan.system.webserver.WebServer; -import com.djrapitops.plan.utilities.html.HtmlStructure; import com.djrapitops.plugin.logging.console.PluginLogger; import dagger.Lazy; @@ -55,7 +54,7 @@ public class ServerInfoSystem extends InfoSystem { @Override public void updateNetworkPage() throws WebException { - String html = HtmlStructure.createServerContainer(); + String html = ""; // TODO Rework this part of the info system sendRequest(infoRequestFactory.cacheNetworkPageContentRequest(serverInfo.getServerUUID(), html)); } } diff --git a/Plan/src/main/java/com/djrapitops/plan/utilities/html/HtmlStructure.java b/Plan/src/main/java/com/djrapitops/plan/utilities/html/HtmlStructure.java index 56942ddf3..7d22858be 100644 --- a/Plan/src/main/java/com/djrapitops/plan/utilities/html/HtmlStructure.java +++ b/Plan/src/main/java/com/djrapitops/plan/utilities/html/HtmlStructure.java @@ -4,20 +4,11 @@ */ package com.djrapitops.plan.utilities.html; -import com.djrapitops.plan.data.store.mutators.TPSMutator; -import com.djrapitops.plan.system.database.databases.Database; -import com.djrapitops.plan.system.info.server.Server; -import com.djrapitops.plan.system.info.server.properties.ServerProperties; -import com.djrapitops.plan.utilities.formatting.Formatter; -import com.djrapitops.plan.utilities.html.graphs.Graphs; import com.djrapitops.plan.utilities.html.icon.Color; import com.djrapitops.plan.utilities.html.icon.Icon; import com.djrapitops.plan.utilities.html.icon.Icons; import org.apache.commons.text.TextStringBuilder; -import java.util.UUID; -import java.util.concurrent.ThreadLocalRandom; - /** * Class for parsing layout components of the websites. * @@ -60,76 +51,6 @@ public class HtmlStructure { return new String[]{"
  • Calculating... Refresh shortly
  • ", tab}; } - // TODO Rework into NetworkPage generation - @Deprecated - public static String createServerContainer() { - ServerProperties properties = null; // TODO - int maxPlayers = properties.getMaxPlayers(); - int online = properties.getOnlinePlayers(); - Formatter clockLongFormatter = null; //TODO - String refresh = clockLongFormatter.apply(System.currentTimeMillis()); - - Server server = null; // TODO - - String serverName = server.getName(); - String serverType = properties.getVersion(); - String address = "../server/" + serverName; - - Database db = null; // TODO - UUID serverUUID = server.getUuid(); - String id = ThreadLocalRandom.current().nextInt(100) + serverUUID.toString().replace("-", ""); - - int playerCount = 0; - String playerData = "[]"; - playerCount = db.count().getServerPlayerCount(serverUUID); - Graphs graphs = null; // TODO - playerData = graphs.line().playersOnlineGraph(new TPSMutator(db.fetch().getTPSData(serverUUID))).toHighChartsSeries(); - - return "
    " + - "
    " + - "
    " + - "
    " + - "
    " + - "

    " + serverName + "

    " + - "
    " + - "
    " + - "
    " + - "
    " + - "
    " + - "
    " + - "
    " + - "
    " + - "
    " + - "

    Registered Players " + - "" + playerCount + "

    " + - "

    Players Online " + - "" + online + " / " + maxPlayers + "

    " + - "

    Type " + - "" + serverType + "

    " + - "
    " + - "

    Last Updated" + - "" + refresh + "

    " + - "
    " + - "
    " + - "" + - ""; - } - public static String playerStatus(boolean online, boolean banned, boolean op) { StringBuilder html = new StringBuilder("

    "); if (online) { diff --git a/Plan/src/main/java/com/djrapitops/plan/utilities/html/structure/NetworkServerBox.java b/Plan/src/main/java/com/djrapitops/plan/utilities/html/structure/NetworkServerBox.java new file mode 100644 index 000000000..bf4e24270 --- /dev/null +++ b/Plan/src/main/java/com/djrapitops/plan/utilities/html/structure/NetworkServerBox.java @@ -0,0 +1,96 @@ +package com.djrapitops.plan.utilities.html.structure; + +import com.djrapitops.plan.data.store.mutators.PlayersOnlineResolver; +import com.djrapitops.plan.data.store.mutators.TPSMutator; +import com.djrapitops.plan.system.info.server.Server; +import com.djrapitops.plan.system.webserver.cache.PageId; +import com.djrapitops.plan.system.webserver.cache.ResponseCache; +import com.djrapitops.plan.utilities.html.graphs.Graphs; + +import java.util.Optional; +import java.util.UUID; +import java.util.concurrent.ThreadLocalRandom; + +/** + * Html that represents a server box on the network page. + * + * @author Rsl1122 + */ +public class NetworkServerBox { + + private final Server server; + private final int registeredPlayers; + private final TPSMutator tpsMutator; + + private final Graphs graphs; + + public NetworkServerBox( + Server server, + int registeredPlayers, + TPSMutator tpsMutator, + Graphs graphs + ) { + this.server = server; + this.registeredPlayers = registeredPlayers; + this.tpsMutator = tpsMutator; + this.graphs = graphs; + } + + public String toHtml() { + Optional playersOnline = new PlayersOnlineResolver(tpsMutator).getOnlineOn(System.currentTimeMillis()); + int onlineCount = playersOnline.orElse(0); + int maxCount = server.getMaxPlayers(); + + String serverName = server.getName(); + String address = "../server/" + serverName; + UUID serverUUID = server.getUuid(); + String htmlID = ThreadLocalRandom.current().nextInt(100) + serverUUID.toString().replace("-", ""); + + String playersOnlineData = graphs.line().playersOnlineGraph(tpsMutator).toHighChartsSeries(); + + boolean isCached = ResponseCache.isCached(PageId.SERVER.of(serverUUID)); + String cached = isCached ? "Yes" : "No"; + + return "

    " + + "
    " + + "
    " + + "
    " + + "
    " + + "

    " + serverName + "

    " + + "
    " + + "
    " + + "
    " + + "
    " + + "
    " + + "
    " + + "
    " + + "
    " + + "
    " + + "

    Registered Players " + + "" + registeredPlayers + "

    " + + "

    Players Online " + + "" + onlineCount + " / " + maxCount + "

    " + + "
    " + + "
    " + + "

    Analysis Cached" + + "" + cached + "

    " + + "
    " + + "" + + ""; + } +} \ No newline at end of file