diff --git a/Plan/common/src/main/java/com/djrapitops/plan/system/HtmlUtilities.java b/Plan/common/src/main/java/com/djrapitops/plan/system/HtmlUtilities.java index e3d4e82ef..409ed1a13 100644 --- a/Plan/common/src/main/java/com/djrapitops/plan/system/HtmlUtilities.java +++ b/Plan/common/src/main/java/com/djrapitops/plan/system/HtmlUtilities.java @@ -18,7 +18,6 @@ package com.djrapitops.plan.system; import com.djrapitops.plan.utilities.formatting.Formatters; import com.djrapitops.plan.utilities.html.graphs.Graphs; -import com.djrapitops.plan.utilities.html.tables.HtmlTables; import dagger.Lazy; import javax.inject.Inject; @@ -28,17 +27,14 @@ import javax.inject.Singleton; public class HtmlUtilities { private final Lazy formatters; - private final Lazy htmlTables; private final Lazy graphs; @Inject public HtmlUtilities( Lazy formatters, - Lazy htmlTables, Lazy graphs ) { this.formatters = formatters; - this.htmlTables = htmlTables; this.graphs = graphs; } @@ -46,10 +42,6 @@ public class HtmlUtilities { return formatters.get(); } - public HtmlTables getHtmlTables() { - return htmlTables.get(); - } - public Graphs getGraphs() { return graphs.get(); } diff --git a/Plan/common/src/main/java/com/djrapitops/plan/system/json/PlayersTableJSONParser.java b/Plan/common/src/main/java/com/djrapitops/plan/system/json/PlayersTableJSONParser.java index 98767cb5f..38c3929e8 100644 --- a/Plan/common/src/main/java/com/djrapitops/plan/system/json/PlayersTableJSONParser.java +++ b/Plan/common/src/main/java/com/djrapitops/plan/system/json/PlayersTableJSONParser.java @@ -67,6 +67,8 @@ public class PlayersTableJSONParser { ) { // Data this.players = players; + this.players.sort(new PlayerContainerLastPlayedComparator()); + this.extensionData = extensionData; extensionDescriptives = new ArrayList<>(); diff --git a/Plan/common/src/main/java/com/djrapitops/plan/utilities/html/pages/PageFactory.java b/Plan/common/src/main/java/com/djrapitops/plan/utilities/html/pages/PageFactory.java index 7b73bedec..0fc1fe04d 100644 --- a/Plan/common/src/main/java/com/djrapitops/plan/utilities/html/pages/PageFactory.java +++ b/Plan/common/src/main/java/com/djrapitops/plan/utilities/html/pages/PageFactory.java @@ -31,7 +31,6 @@ import com.djrapitops.plan.system.settings.config.PlanConfig; import com.djrapitops.plan.system.settings.theme.Theme; import com.djrapitops.plan.system.update.VersionCheckSystem; import com.djrapitops.plan.utilities.formatting.Formatters; -import com.djrapitops.plan.utilities.html.tables.HtmlTables; import com.djrapitops.plugin.benchmarking.Timings; import com.djrapitops.plugin.logging.debug.DebugLogger; import com.djrapitops.plugin.logging.error.ErrorHandler; @@ -55,7 +54,6 @@ public class PageFactory { private final Lazy theme; private final Lazy dbSystem; private final Lazy serverInfo; - private final Lazy tables; private final Lazy formatters; private final Lazy debugLogger; private final Lazy timings; @@ -69,7 +67,6 @@ public class PageFactory { Lazy theme, Lazy dbSystem, Lazy serverInfo, - Lazy tables, Lazy formatters, Lazy debugLogger, Lazy timings, @@ -81,7 +78,6 @@ public class PageFactory { this.theme = theme; this.dbSystem = dbSystem; this.serverInfo = serverInfo; - this.tables = tables; this.formatters = formatters; this.debugLogger = debugLogger; this.timings = timings; @@ -96,9 +92,7 @@ public class PageFactory { } public PlayersPage playersPage() { - return new PlayersPage(versionCheckSystem.get(), fileSystem.get(), config.get(), - dbSystem.get().getDatabase(), serverInfo.get(), tables.get(), - timings.get()); + return new PlayersPage(versionCheckSystem.get(), fileSystem.get(), config.get(), serverInfo.get()); } public ServerPage serverPage(UUID serverUUID) throws NotFoundException { diff --git a/Plan/common/src/main/java/com/djrapitops/plan/utilities/html/pages/PlayersPage.java b/Plan/common/src/main/java/com/djrapitops/plan/utilities/html/pages/PlayersPage.java index 0543ecac5..13834b90d 100644 --- a/Plan/common/src/main/java/com/djrapitops/plan/utilities/html/pages/PlayersPage.java +++ b/Plan/common/src/main/java/com/djrapitops/plan/utilities/html/pages/PlayersPage.java @@ -17,9 +17,6 @@ package com.djrapitops.plan.utilities.html.pages; import com.djrapitops.plan.api.exceptions.ParseException; -import com.djrapitops.plan.data.store.containers.PlayerContainer; -import com.djrapitops.plan.db.Database; -import com.djrapitops.plan.db.access.queries.containers.ContainerFetchQueries; import com.djrapitops.plan.system.file.PlanFiles; import com.djrapitops.plan.system.info.server.ServerInfo; import com.djrapitops.plan.system.settings.config.PlanConfig; @@ -27,10 +24,6 @@ import com.djrapitops.plan.system.settings.paths.PluginSettings; import com.djrapitops.plan.system.settings.paths.ProxySettings; import com.djrapitops.plan.system.update.VersionCheckSystem; import com.djrapitops.plan.utilities.formatting.PlaceholderReplacer; -import com.djrapitops.plan.utilities.html.tables.HtmlTables; -import com.djrapitops.plugin.benchmarking.Timings; - -import java.util.List; /** * Html String parser for /players page. @@ -42,29 +35,18 @@ public class PlayersPage implements Page { private final VersionCheckSystem versionCheckSystem; private final PlanFiles files; private final PlanConfig config; - private final Database database; private final ServerInfo serverInfo; - private final HtmlTables tables; - - private final Timings timings; - PlayersPage( VersionCheckSystem versionCheckSystem, PlanFiles files, PlanConfig config, - Database database, - ServerInfo serverInfo, - HtmlTables tables, - Timings timings + ServerInfo serverInfo ) { this.versionCheckSystem = versionCheckSystem; this.files = files; this.config = config; - this.database = database; this.serverInfo = serverInfo; - this.tables = tables; - this.timings = timings; } @Override @@ -80,11 +62,6 @@ public class PlayersPage implements Page { placeholders.put("networkName", config.get(PluginSettings.SERVER_NAME)); } - timings.start("Players page players table parsing"); - List playerContainers = database.query(ContainerFetchQueries.fetchAllPlayerContainers()); - placeholders.put("playersTable", tables.playerTableForPlayersPage(playerContainers).parseHtml()); - timings.end("Pages", "Players page players table parsing"); - return placeholders.apply(files.getCustomizableResourceOrDefault("web/players.html").asString()); } catch (Exception e) { throw new ParseException(e); diff --git a/Plan/common/src/main/java/com/djrapitops/plan/utilities/html/tables/HtmlTables.java b/Plan/common/src/main/java/com/djrapitops/plan/utilities/html/tables/HtmlTables.java deleted file mode 100644 index defb51335..000000000 --- a/Plan/common/src/main/java/com/djrapitops/plan/utilities/html/tables/HtmlTables.java +++ /dev/null @@ -1,65 +0,0 @@ -/* - * This file is part of Player Analytics (Plan). - * - * Plan is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License v3 as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Plan is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with Plan. If not, see . - */ -package com.djrapitops.plan.utilities.html.tables; - -import com.djrapitops.plan.data.element.TableContainer; -import com.djrapitops.plan.data.store.containers.PlayerContainer; -import com.djrapitops.plan.system.settings.config.PlanConfig; -import com.djrapitops.plan.system.settings.paths.DisplaySettings; -import com.djrapitops.plan.system.settings.paths.TimeSettings; -import com.djrapitops.plan.utilities.formatting.Formatters; - -import javax.inject.Inject; -import javax.inject.Singleton; -import java.util.List; - -/** - * Factory class for objects that represent HTML tables. - * - * @author Rsl1122 - */ -@Singleton -public class HtmlTables { - - private final PlanConfig config; - private final Formatters formatters; - - @Inject - public HtmlTables( - PlanConfig config, - Formatters formatters - ) { - this.config = config; - this.formatters = formatters; - } - - /** - * Create a Player table for a players page. - * - * @param players List of {@link PlayerContainer}s of players. - * @return a new {@link PlayersTable}. - */ - public TableContainer playerTableForPlayersPage(List players) { - return new PlayersTable( - players, config.get(DisplaySettings.PLAYERS_PER_PLAYERS_PAGE), - config.get(TimeSettings.ACTIVE_PLAY_THRESHOLD), - config.get(DisplaySettings.OPEN_PLAYER_LINKS_IN_NEW_TAB), - formatters.timeAmount(), formatters.yearLong(), formatters.decimals() - ); - } - -} \ No newline at end of file diff --git a/Plan/common/src/main/java/com/djrapitops/plan/utilities/html/tables/PlayersTable.java b/Plan/common/src/main/java/com/djrapitops/plan/utilities/html/tables/PlayersTable.java deleted file mode 100644 index 0ed6b4a39..000000000 --- a/Plan/common/src/main/java/com/djrapitops/plan/utilities/html/tables/PlayersTable.java +++ /dev/null @@ -1,123 +0,0 @@ -/* - * This file is part of Player Analytics (Plan). - * - * Plan is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License v3 as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Plan is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with Plan. If not, see . - */ -package com.djrapitops.plan.utilities.html.tables; - -import com.djrapitops.plan.api.PlanAPI; -import com.djrapitops.plan.data.container.GeoInfo; -import com.djrapitops.plan.data.element.TableContainer; -import com.djrapitops.plan.data.store.containers.PlayerContainer; -import com.djrapitops.plan.data.store.keys.PlayerKeys; -import com.djrapitops.plan.data.store.mutators.ActivityIndex; -import com.djrapitops.plan.data.store.mutators.GeoInfoMutator; -import com.djrapitops.plan.data.store.mutators.SessionsMutator; -import com.djrapitops.plan.utilities.comparators.PlayerContainerLastPlayedComparator; -import com.djrapitops.plan.utilities.formatting.Formatter; -import com.djrapitops.plan.utilities.html.Html; -import com.djrapitops.plan.utilities.html.icon.Family; -import com.djrapitops.plan.utilities.html.icon.Icon; - -import java.util.List; - -/** - * Html table that displays a lot of information about players. - * - * @author Rsl1122 - */ -class PlayersTable extends TableContainer { - - private final List players; - private final int maxPlayers; - private final long activeMsThreshold; - private final boolean openPlayerPageInNewTab; - - private final Formatter decimalFormatter; - - PlayersTable( - List players, - int maxPlayers, - long activeMsThreshold, - boolean openPlayerPageInNewTab, - Formatter timeAmountFormatter, - Formatter yearLongFormatter, - Formatter decimalFormatter - ) { - super( - Icon.called("user") + " Name", - Icon.called("check") + " Activity Index", - Icon.called("clock").of(Family.REGULAR) + " Playtime", - Icon.called("calendar-plus").of(Family.REGULAR) + " Sessions", - Icon.called("user-plus") + " Registered", - Icon.called("calendar-check").of(Family.REGULAR) + " Last Seen", - Icon.called("globe") + " Geolocation" - ); - this.players = players; - this.maxPlayers = maxPlayers; - this.activeMsThreshold = activeMsThreshold; - this.openPlayerPageInNewTab = openPlayerPageInNewTab; - this.decimalFormatter = decimalFormatter; - useJqueryDataTables("player-table"); - - setFormatter(2, timeAmountFormatter); - setFormatter(4, yearLongFormatter); - setFormatter(5, yearLongFormatter); - addRows(); - } - - private void addRows() { - PlanAPI planAPI = PlanAPI.getInstance(); - long now = System.currentTimeMillis(); - - players.sort(new PlayerContainerLastPlayedComparator()); - - int i = 0; - for (PlayerContainer player : players) { - if (i >= maxPlayers) { - break; - } - String name = player.getValue(PlayerKeys.NAME).orElse("Unknown"); - String url = planAPI.getPlayerInspectPageLink(name); - - SessionsMutator sessionsMutator = SessionsMutator.forContainer(player); - int loginTimes = sessionsMutator.count(); - long playtime = sessionsMutator.toPlaytime(); - long registered = player.getValue(PlayerKeys.REGISTERED).orElse(0L); - long lastSeen = sessionsMutator.toLastSeen(); - - ActivityIndex activityIndex = player.getActivityIndex(now, activeMsThreshold); - boolean isBanned = player.getValue(PlayerKeys.BANNED).orElse(false); - String activityString = activityIndex.getFormattedValue(decimalFormatter) - + (isBanned ? " (Banned)" : " (" + activityIndex.getGroup() + ")"); - - String geolocation = GeoInfoMutator.forContainer(player).mostRecent().map(GeoInfo::getGeolocation).orElse("-"); - - Html link = openPlayerPageInNewTab ? Html.LINK_EXTERNAL : Html.LINK; - - addRow( - link.parse(url, name), - activityString, - playtime, - loginTimes, - registered, - lastSeen, - geolocation - ); - - i++; - } - - } -} \ No newline at end of file diff --git a/Plan/common/src/test/java/com/djrapitops/plan/utilities/html/tables/PlayersTableTest.java b/Plan/common/src/test/java/com/djrapitops/plan/utilities/html/tables/PlayersTableTest.java deleted file mode 100644 index 21a60bb8b..000000000 --- a/Plan/common/src/test/java/com/djrapitops/plan/utilities/html/tables/PlayersTableTest.java +++ /dev/null @@ -1,90 +0,0 @@ -/* - * This file is part of Player Analytics (Plan). - * - * Plan is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License v3 as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * Plan is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Lesser General Public License for more details. - * - * You should have received a copy of the GNU Lesser General Public License - * along with Plan. If not, see . - */ -package com.djrapitops.plan.utilities.html.tables; - -import com.djrapitops.plan.api.CommonAPI; -import com.djrapitops.plan.data.store.containers.PlayerContainer; -import com.djrapitops.plan.data.store.keys.PlayerKeys; -import com.djrapitops.plan.system.database.DBSystem; -import com.djrapitops.plan.utilities.uuid.UUIDUtility; -import com.djrapitops.plugin.logging.console.TestPluginLogger; -import com.djrapitops.plugin.logging.error.ConsoleErrorLogger; -import org.junit.jupiter.api.BeforeAll; -import org.junit.jupiter.api.Test; -import org.junit.platform.runner.JUnitPlatform; -import org.junit.runner.RunWith; -import org.mockito.Mockito; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.Stack; -import java.util.concurrent.TimeUnit; - -import static org.junit.jupiter.api.Assertions.assertTrue; - -/** - * Tests for {@link PlayersTable} - * - * @author Rsl1122 - */ -@RunWith(JUnitPlatform.class) -class PlayersTableTest { - - @BeforeAll - static void setUpClass() { - new CommonAPI( - Mockito.mock(DBSystem.class), - Mockito.mock(UUIDUtility.class), - new TestPluginLogger(), - new ConsoleErrorLogger(new TestPluginLogger()) - ); - } - - @Test - void noClassCastExceptionsFromFormatting() { - PlayerContainer container = new PlayerContainer(); - container.putRawData(PlayerKeys.SESSIONS, new ArrayList<>()); - List players = Collections.singletonList(container); - String html = new PlayersTable( - players, - 50, // maxPlayers - TimeUnit.MINUTES.toMillis(60), // activeMsThreshold - false, - l -> "", - l -> "", - d -> "" - ).parseHtml(); - - testHtmlValidity(html); - } - - private void testHtmlValidity(String html) { - Stack stack = new Stack<>(); - String[] split = html.split("<"); - for (String s : split) { - if (s.startsWith("/")) { - String expectedElement = stack.pop(); - assertTrue(s.startsWith("/" + expectedElement), () -> "Element not properly closed: " + expectedElement); - } else { - stack.push(s.split(" ", 2)[0].split(">", 2)[0]); - } - } - stack.pop(); // Pop the empty string since the html string starts with < - assertTrue(stack.empty(), () -> "Stack was not empty: " + stack.toString()); - } -} \ No newline at end of file