mirror of
https://github.com/plan-player-analytics/Plan.git
synced 2025-01-15 12:41:36 +01:00
DataExtension API player page plugin tab generation
This commit is contained in:
parent
aab5436b25
commit
099330ebd7
@ -68,6 +68,11 @@ public class Icon {
|
|||||||
this.color = color;
|
this.color = color;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return "Icon{" + type.name() + ", '" + name + '\'' + ", " + color.name() + '}';
|
||||||
|
}
|
||||||
|
|
||||||
public static class Builder {
|
public static class Builder {
|
||||||
|
|
||||||
private final Icon icon;
|
private final Icon icon;
|
||||||
|
@ -25,7 +25,7 @@ import java.util.List;
|
|||||||
*
|
*
|
||||||
* @author Rsl1122
|
* @author Rsl1122
|
||||||
*/
|
*/
|
||||||
public class ExtensionPlayerData {
|
public class ExtensionPlayerData implements Comparable<ExtensionPlayerData> {
|
||||||
|
|
||||||
private final int pluginID;
|
private final int pluginID;
|
||||||
|
|
||||||
@ -47,10 +47,19 @@ public class ExtensionPlayerData {
|
|||||||
return extensionInformation;
|
return extensionInformation;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean hasOnlyGenericTab() {
|
||||||
|
return tabs.size() == 1 && tabs.get(0).getTabInformation().getTabName().isEmpty();
|
||||||
|
}
|
||||||
|
|
||||||
public List<ExtensionTabData> getTabs() {
|
public List<ExtensionTabData> getTabs() {
|
||||||
return tabs;
|
return tabs;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int compareTo(ExtensionPlayerData o) {
|
||||||
|
return String.CASE_INSENSITIVE_ORDER.compare(this.extensionInformation.getPluginName(), o.extensionInformation.getPluginName());
|
||||||
|
}
|
||||||
|
|
||||||
public static class Factory {
|
public static class Factory {
|
||||||
|
|
||||||
private final ExtensionPlayerData data;
|
private final ExtensionPlayerData data;
|
||||||
|
@ -50,6 +50,10 @@ public class ExtensionTabData implements Comparable<ExtensionTabData> {
|
|||||||
stringData = new HashMap<>();
|
stringData = new HashMap<>();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public TabInformation getTabInformation() {
|
||||||
|
return tabInformation;
|
||||||
|
}
|
||||||
|
|
||||||
public List<String> getValueOrder() {
|
public List<String> getValueOrder() {
|
||||||
return order;
|
return order;
|
||||||
}
|
}
|
||||||
|
@ -105,9 +105,9 @@ public class ExtensionPlayerDataQuery implements Query<Map<UUID, List<ExtensionP
|
|||||||
"t1." + ExtensionTabTable.TAB_NAME + " as tab_name," +
|
"t1." + ExtensionTabTable.TAB_NAME + " as tab_name," +
|
||||||
"t1." + ExtensionTabTable.TAB_PRIORITY + " as tab_priority," +
|
"t1." + ExtensionTabTable.TAB_PRIORITY + " as tab_priority," +
|
||||||
"t1." + ExtensionTabTable.ELEMENT_ORDER + " as element_order," +
|
"t1." + ExtensionTabTable.ELEMENT_ORDER + " as element_order," +
|
||||||
"i1." + ExtensionIconTable.ICON_NAME + " as plugin_icon_name," +
|
"i1." + ExtensionIconTable.ICON_NAME + " as provider_icon_name," +
|
||||||
"i1." + ExtensionIconTable.FAMILY + " as plugin_icon_family," +
|
"i1." + ExtensionIconTable.FAMILY + " as provider_icon_family," +
|
||||||
"i1." + ExtensionIconTable.COLOR + " as plugin_icon_color," +
|
"i1." + ExtensionIconTable.COLOR + " as provider_icon_color," +
|
||||||
"i2." + ExtensionIconTable.ICON_NAME + " as tab_icon_name," +
|
"i2." + ExtensionIconTable.ICON_NAME + " as tab_icon_name," +
|
||||||
"i2." + ExtensionIconTable.FAMILY + " as tab_icon_family," +
|
"i2." + ExtensionIconTable.FAMILY + " as tab_icon_family," +
|
||||||
"i2." + ExtensionIconTable.COLOR + " as tab_icon_color" +
|
"i2." + ExtensionIconTable.COLOR + " as tab_icon_color" +
|
||||||
@ -204,9 +204,9 @@ public class ExtensionPlayerDataQuery implements Query<Map<UUID, List<ExtensionP
|
|||||||
String description = set.getString(ExtensionProviderTable.DESCRIPTION);
|
String description = set.getString(ExtensionProviderTable.DESCRIPTION);
|
||||||
int priority = set.getInt("provider_priority");
|
int priority = set.getInt("provider_priority");
|
||||||
|
|
||||||
String iconName = set.getString("plugin_icon_name");
|
String iconName = set.getString("provider_icon_name");
|
||||||
Family family = Family.getByName("plugin_icon_family").orElse(Family.SOLID);
|
Family family = Family.getByName(set.getString("provider_icon_family")).orElse(Family.SOLID);
|
||||||
Color color = Color.getByName("plugin_icon_color").orElse(Color.NONE);
|
Color color = Color.getByName(set.getString("provider_icon_color")).orElse(Color.NONE);
|
||||||
Icon icon = new Icon(family, iconName, color);
|
Icon icon = new Icon(family, iconName, color);
|
||||||
|
|
||||||
return new ExtensionDescriptive(name, text, description, icon, priority);
|
return new ExtensionDescriptive(name, text, description, icon, priority);
|
||||||
|
@ -74,7 +74,7 @@ public class CacheInspectPluginsTabRequest extends InfoRequestWithVariables impl
|
|||||||
|
|
||||||
InspectPagePluginsContent pluginsTab = getPluginsTab(uuid);
|
InspectPagePluginsContent pluginsTab = getPluginsTab(uuid);
|
||||||
|
|
||||||
pluginsTab.addTab(serverUUID, nav, Base64Util.decode(html));
|
pluginsTab.addTab(nav, Base64Util.decode(html));
|
||||||
return DefaultResponses.SUCCESS.get();
|
return DefaultResponses.SUCCESS.get();
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -84,6 +84,6 @@ public class CacheInspectPluginsTabRequest extends InfoRequestWithVariables impl
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void runLocally() {
|
public void runLocally() {
|
||||||
getPluginsTab(player).addTab(serverInfo.getServerUUID(), variables.get("nav"), html);
|
getPluginsTab(player).addTab(variables.get("nav"), html);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -55,6 +55,10 @@ public class Server implements Comparable<Server> {
|
|||||||
return name;
|
return name;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public String getIdentifiableName() {
|
||||||
|
return !"Plan".equalsIgnoreCase(name) ? name : "Server " + id;
|
||||||
|
}
|
||||||
|
|
||||||
public void setName(String name) {
|
public void setName(String name) {
|
||||||
this.name = name;
|
this.name = name;
|
||||||
}
|
}
|
||||||
|
@ -21,10 +21,7 @@ import com.djrapitops.plan.system.webserver.cache.ResponseCache;
|
|||||||
import com.djrapitops.plan.system.webserver.response.pages.parts.InspectPagePluginsContent;
|
import com.djrapitops.plan.system.webserver.response.pages.parts.InspectPagePluginsContent;
|
||||||
import org.apache.commons.text.StringSubstitutor;
|
import org.apache.commons.text.StringSubstitutor;
|
||||||
|
|
||||||
import java.util.HashMap;
|
import java.util.*;
|
||||||
import java.util.Map;
|
|
||||||
import java.util.Objects;
|
|
||||||
import java.util.UUID;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author Rsl1122
|
* @author Rsl1122
|
||||||
@ -42,11 +39,12 @@ public class InspectPageResponse extends PageResponse {
|
|||||||
@Override
|
@Override
|
||||||
public String getContent() {
|
public String getContent() {
|
||||||
Map<String, String> replaceMap = new HashMap<>();
|
Map<String, String> replaceMap = new HashMap<>();
|
||||||
InspectPagePluginsContent pluginsTab = (InspectPagePluginsContent)
|
// PluginData compatibility
|
||||||
ResponseCache.loadResponse(PageId.PLAYER_PLUGINS_TAB.of(uuid));
|
Optional<String[]> pluginsTab = Optional.ofNullable((InspectPagePluginsContent) ResponseCache.loadResponse(PageId.PLAYER_PLUGINS_TAB.of(uuid)))
|
||||||
String[] inspectPagePluginsTab = pluginsTab != null ? pluginsTab.getContents() : getCalculating();
|
.map(InspectPagePluginsContent::getContents);
|
||||||
replaceMap.put("navPluginsTabs", inspectPagePluginsTab[0]);
|
|
||||||
replaceMap.put("pluginsTabs", inspectPagePluginsTab[1]);
|
replaceMap.put("navPluginsTabs", pluginsTab.map(nav -> nav[0]).orElse(""));
|
||||||
|
replaceMap.put("pluginsTabs", pluginsTab.map(tab -> tab[1]).orElse(""));
|
||||||
|
|
||||||
return StringSubstitutor.replace(super.getContent(), replaceMap);
|
return StringSubstitutor.replace(super.getContent(), replaceMap);
|
||||||
}
|
}
|
||||||
|
@ -39,15 +39,15 @@ import java.util.*;
|
|||||||
public class InspectPagePluginsContent extends PageResponse {
|
public class InspectPagePluginsContent extends PageResponse {
|
||||||
|
|
||||||
// ServerUUID, {nav, html}
|
// ServerUUID, {nav, html}
|
||||||
private final Map<UUID, String[]> pluginsTab;
|
private final Map<String, String[]> pluginsTab;
|
||||||
|
|
||||||
public InspectPagePluginsContent() {
|
public InspectPagePluginsContent() {
|
||||||
pluginsTab = new HashMap<>();
|
pluginsTab = new HashMap<>();
|
||||||
}
|
}
|
||||||
|
|
||||||
public InspectPagePluginsContent(UUID serverUUID, String nav, String html) {
|
public InspectPagePluginsContent(String nav, String html) {
|
||||||
pluginsTab = new HashMap<>();
|
pluginsTab = new HashMap<>();
|
||||||
addTab(serverUUID, nav, html);
|
addTab(nav, html);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static InspectPagePluginsContent generateForThisServer(UUID playerUUID, ServerInfo serverInfo, HookHandler hookHandler) {
|
public static InspectPagePluginsContent generateForThisServer(UUID playerUUID, ServerInfo serverInfo, HookHandler hookHandler) {
|
||||||
@ -56,16 +56,16 @@ public class InspectPagePluginsContent extends PageResponse {
|
|||||||
|
|
||||||
Map<PluginData, InspectContainer> containers = hookHandler.getInspectContainersFor(playerUUID);
|
Map<PluginData, InspectContainer> containers = hookHandler.getInspectContainersFor(playerUUID);
|
||||||
if (containers.isEmpty()) {
|
if (containers.isEmpty()) {
|
||||||
return new InspectPagePluginsContent(playerUUID, "<li><a>" + actualServerName + " (No Data)</a></li>",
|
return new InspectPagePluginsContent("<li><a>" + actualServerName + " (No Data)</a></li>",
|
||||||
"<div class=\"tab\"><div class=\"row clearfix\">" +
|
"<div class=\"tab\"><div class=\"row clearfix\">" +
|
||||||
"<div class=\"col-md-12\">" + Html.CARD.parse("<p>No Data (" + actualServerName + ")</p>") +
|
"<div class=\"col-md-12\">" + Html.CARD.parse("<p>No Data (" + actualServerName + ")</p>") +
|
||||||
"</div></div></div>");
|
"</div></div></div>");
|
||||||
}
|
}
|
||||||
|
|
||||||
String nav = "<li><a class=\"nav-button\" href=\"javascript:void(0)\">" + actualServerName + "</a></li>";
|
String nav = "<li><a class=\"nav-button\" href=\"javascript:void(0)\">" + actualServerName + " (Legacy)</a></li>";
|
||||||
String tab = createTab(containers);
|
String tab = createTab(containers);
|
||||||
|
|
||||||
return new InspectPagePluginsContent(serverInfo.getServerUUID(), nav, tab);
|
return new InspectPagePluginsContent(nav, tab);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static String createTab(Map<PluginData, InspectContainer> containers) {
|
private static String createTab(Map<PluginData, InspectContainer> containers) {
|
||||||
@ -84,8 +84,8 @@ public class InspectPagePluginsContent extends PageResponse {
|
|||||||
return tab.toString();
|
return tab.toString();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void addTab(UUID serverUUID, String nav, String html) {
|
public void addTab(String nav, String html) {
|
||||||
pluginsTab.put(serverUUID, new String[]{nav, html});
|
pluginsTab.put(nav, new String[]{nav, html});
|
||||||
}
|
}
|
||||||
|
|
||||||
public void addTab(InspectPagePluginsContent content) {
|
public void addTab(InspectPagePluginsContent content) {
|
||||||
|
@ -16,6 +16,8 @@
|
|||||||
*/
|
*/
|
||||||
package com.djrapitops.plan.utilities.html.icon;
|
package com.djrapitops.plan.utilities.html.icon;
|
||||||
|
|
||||||
|
import java.util.Optional;
|
||||||
|
|
||||||
public enum Color {
|
public enum Color {
|
||||||
RED("col-red"),
|
RED("col-red"),
|
||||||
PINK("col-pink"),
|
PINK("col-pink"),
|
||||||
@ -55,6 +57,14 @@ public enum Color {
|
|||||||
return Color.BLACK;
|
return Color.BLACK;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static Optional<Color> getByName(String name) {
|
||||||
|
try {
|
||||||
|
return Optional.of(valueOf(name));
|
||||||
|
} catch (IllegalArgumentException e) {
|
||||||
|
return Optional.empty();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public String getHtmlClass() {
|
public String getHtmlClass() {
|
||||||
return htmlClass;
|
return htmlClass;
|
||||||
}
|
}
|
||||||
|
@ -16,6 +16,8 @@
|
|||||||
*/
|
*/
|
||||||
package com.djrapitops.plan.utilities.html.icon;
|
package com.djrapitops.plan.utilities.html.icon;
|
||||||
|
|
||||||
|
import java.util.Optional;
|
||||||
|
|
||||||
public enum Family {
|
public enum Family {
|
||||||
SOLID(" fa fa-", "\"></i>"),
|
SOLID(" fa fa-", "\"></i>"),
|
||||||
REGULAR(" far fa-", "\"></i>"),
|
REGULAR(" far fa-", "\"></i>"),
|
||||||
@ -33,4 +35,12 @@ public enum Family {
|
|||||||
public String appendAround(String color, String name) {
|
public String appendAround(String color, String name) {
|
||||||
return "<i class=\"" + color + middle + name + suffix;
|
return "<i class=\"" + color + middle + name + suffix;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static Optional<Family> getByName(String name) {
|
||||||
|
try {
|
||||||
|
return Optional.of(valueOf(name));
|
||||||
|
} catch (IllegalArgumentException e) {
|
||||||
|
return Optional.empty();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -29,6 +29,14 @@ public class Icon {
|
|||||||
color = Color.NONE;
|
color = Color.NONE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static Icon fromExtensionIcon(com.djrapitops.plan.extension.icon.Icon icon) {
|
||||||
|
return new Icon(
|
||||||
|
Family.getByName(icon.getFamily().name()).orElse(Family.SOLID),
|
||||||
|
icon.getName(),
|
||||||
|
Color.getByName(icon.getColor().name()).orElse(Color.NONE)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
public Icon(Family type, String name, Color color) {
|
public Icon(Family type, String name, Color color) {
|
||||||
this.type = type;
|
this.type = type;
|
||||||
this.name = name;
|
this.name = name;
|
||||||
|
@ -33,6 +33,9 @@ import com.djrapitops.plan.system.settings.paths.TimeSettings;
|
|||||||
import com.djrapitops.plan.system.settings.theme.Theme;
|
import com.djrapitops.plan.system.settings.theme.Theme;
|
||||||
import com.djrapitops.plan.system.settings.theme.ThemeVal;
|
import com.djrapitops.plan.system.settings.theme.ThemeVal;
|
||||||
import com.djrapitops.plan.system.update.VersionCheckSystem;
|
import com.djrapitops.plan.system.update.VersionCheckSystem;
|
||||||
|
import com.djrapitops.plan.system.webserver.cache.PageId;
|
||||||
|
import com.djrapitops.plan.system.webserver.cache.ResponseCache;
|
||||||
|
import com.djrapitops.plan.system.webserver.response.pages.parts.InspectPagePluginsContent;
|
||||||
import com.djrapitops.plan.utilities.comparators.SessionStartComparator;
|
import com.djrapitops.plan.utilities.comparators.SessionStartComparator;
|
||||||
import com.djrapitops.plan.utilities.formatting.Formatter;
|
import com.djrapitops.plan.utilities.formatting.Formatter;
|
||||||
import com.djrapitops.plan.utilities.formatting.Formatters;
|
import com.djrapitops.plan.utilities.formatting.Formatters;
|
||||||
@ -67,6 +70,7 @@ public class InspectPage implements Page {
|
|||||||
|
|
||||||
private final PlanFiles files;
|
private final PlanFiles files;
|
||||||
private final PlanConfig config;
|
private final PlanConfig config;
|
||||||
|
private final PageFactory pageFactory;
|
||||||
private final Theme theme;
|
private final Theme theme;
|
||||||
private final Graphs graphs;
|
private final Graphs graphs;
|
||||||
private final HtmlTables tables;
|
private final HtmlTables tables;
|
||||||
@ -85,6 +89,7 @@ public class InspectPage implements Page {
|
|||||||
VersionCheckSystem versionCheckSystem,
|
VersionCheckSystem versionCheckSystem,
|
||||||
PlanFiles files,
|
PlanFiles files,
|
||||||
PlanConfig config,
|
PlanConfig config,
|
||||||
|
PageFactory pageFactory,
|
||||||
Theme theme,
|
Theme theme,
|
||||||
Graphs graphs,
|
Graphs graphs,
|
||||||
HtmlTables tables,
|
HtmlTables tables,
|
||||||
@ -98,6 +103,7 @@ public class InspectPage implements Page {
|
|||||||
this.versionCheckSystem = versionCheckSystem;
|
this.versionCheckSystem = versionCheckSystem;
|
||||||
this.files = files;
|
this.files = files;
|
||||||
this.config = config;
|
this.config = config;
|
||||||
|
this.pageFactory = pageFactory;
|
||||||
this.theme = theme;
|
this.theme = theme;
|
||||||
this.graphs = graphs;
|
this.graphs = graphs;
|
||||||
this.tables = tables;
|
this.tables = tables;
|
||||||
@ -131,7 +137,7 @@ public class InspectPage implements Page {
|
|||||||
|
|
||||||
public String parse(PlayerContainer player, UUID serverUUID, Map<UUID, String> serverNames) throws IOException {
|
public String parse(PlayerContainer player, UUID serverUUID, Map<UUID, String> serverNames) throws IOException {
|
||||||
long now = System.currentTimeMillis();
|
long now = System.currentTimeMillis();
|
||||||
UUID uuid = player.getUnsafe(PlayerKeys.UUID);
|
UUID playerUUID = player.getUnsafe(PlayerKeys.UUID);
|
||||||
|
|
||||||
PlaceholderReplacer replacer = new PlaceholderReplacer();
|
PlaceholderReplacer replacer = new PlaceholderReplacer();
|
||||||
|
|
||||||
@ -142,7 +148,7 @@ public class InspectPage implements Page {
|
|||||||
replacer.put("timeZone", config.getTimeZoneOffsetHours());
|
replacer.put("timeZone", config.getTimeZoneOffsetHours());
|
||||||
|
|
||||||
boolean online = false;
|
boolean online = false;
|
||||||
Optional<Session> activeSession = SessionCache.getCachedSession(uuid);
|
Optional<Session> activeSession = SessionCache.getCachedSession(playerUUID);
|
||||||
if (activeSession.isPresent()) {
|
if (activeSession.isPresent()) {
|
||||||
Session session = activeSession.get();
|
Session session = activeSession.get();
|
||||||
session.setSessionID(Integer.MAX_VALUE);
|
session.setSessionID(Integer.MAX_VALUE);
|
||||||
@ -259,6 +265,12 @@ public class InspectPage implements Page {
|
|||||||
replacer.put("backButton", "<li><a title=\"to Server page\" href=\"/server\"><i class=\"material-icons\">arrow_back</i><i class=\"material-icons\">storage</i></a></li>");
|
replacer.put("backButton", "<li><a title=\"to Server page\" href=\"/server\"><i class=\"material-icons\">arrow_back</i><i class=\"material-icons\">storage</i></a></li>");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
InspectPluginTab pluginTabs = pageFactory.inspectPluginTabs(playerUUID);
|
||||||
|
|
||||||
|
// Legacy PluginData support until moved to database.
|
||||||
|
InspectPagePluginsContent pluginsTab = (InspectPagePluginsContent) ResponseCache.loadResponse(PageId.PLAYER_PLUGINS_TAB.of(playerUUID), InspectPagePluginsContent::new);
|
||||||
|
pluginsTab.addTab(new InspectPagePluginsContent(pluginTabs.getNav(), pluginTabs.getTab()));
|
||||||
|
|
||||||
return replacer.apply(files.readCustomizableResourceFlat("web/player.html"));
|
return replacer.apply(files.readCustomizableResourceFlat("web/player.html"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -0,0 +1,168 @@
|
|||||||
|
/*
|
||||||
|
* 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 <https://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
package com.djrapitops.plan.utilities.html.pages;
|
||||||
|
|
||||||
|
import com.djrapitops.plan.extension.FormatType;
|
||||||
|
import com.djrapitops.plan.extension.implementation.TabInformation;
|
||||||
|
import com.djrapitops.plan.extension.implementation.results.player.ExtensionDescriptive;
|
||||||
|
import com.djrapitops.plan.extension.implementation.results.player.ExtensionInformation;
|
||||||
|
import com.djrapitops.plan.extension.implementation.results.player.ExtensionPlayerData;
|
||||||
|
import com.djrapitops.plan.extension.implementation.results.player.ExtensionTabData;
|
||||||
|
import com.djrapitops.plan.utilities.formatting.Formatter;
|
||||||
|
import com.djrapitops.plan.utilities.formatting.Formatters;
|
||||||
|
import com.djrapitops.plan.utilities.html.Html;
|
||||||
|
import com.djrapitops.plan.utilities.html.icon.Icon;
|
||||||
|
import com.djrapitops.plan.utilities.html.structure.TabsElement;
|
||||||
|
|
||||||
|
import java.util.*;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Responsible for generating /player page plugin tabs based on DataExtension API data.
|
||||||
|
*
|
||||||
|
* @author Rsl1122
|
||||||
|
*/
|
||||||
|
public class InspectPluginTab implements Comparable<InspectPluginTab> {
|
||||||
|
|
||||||
|
private String serverName;
|
||||||
|
private List<ExtensionPlayerData> data;
|
||||||
|
|
||||||
|
private Map<FormatType, Formatter<Long>> numberFormatters;
|
||||||
|
|
||||||
|
private Formatter<Double> decimalFormatter;
|
||||||
|
private Formatter<Double> percentageFormatter;
|
||||||
|
|
||||||
|
private String nav;
|
||||||
|
private String tab;
|
||||||
|
|
||||||
|
public InspectPluginTab(String nav, String tab) {
|
||||||
|
this.nav = nav;
|
||||||
|
this.tab = tab;
|
||||||
|
}
|
||||||
|
|
||||||
|
public InspectPluginTab(
|
||||||
|
String serverName,
|
||||||
|
List<ExtensionPlayerData> data,
|
||||||
|
Formatters formatters
|
||||||
|
) {
|
||||||
|
this.serverName = serverName;
|
||||||
|
this.data = data;
|
||||||
|
|
||||||
|
numberFormatters = new EnumMap<>(FormatType.class);
|
||||||
|
numberFormatters.put(FormatType.DATE_SECOND, formatters.secondLong());
|
||||||
|
numberFormatters.put(FormatType.DATE_YEAR, formatters.yearLong());
|
||||||
|
numberFormatters.put(FormatType.TIME_MILLISECONDS, formatters.timeAmount());
|
||||||
|
numberFormatters.put(FormatType.NONE, Object::toString);
|
||||||
|
|
||||||
|
this.decimalFormatter = formatters.decimals();
|
||||||
|
this.percentageFormatter = formatters.percentage();
|
||||||
|
|
||||||
|
generate();
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getNav() {
|
||||||
|
return nav;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getTab() {
|
||||||
|
return tab;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void generate() {
|
||||||
|
if (data.isEmpty()) {
|
||||||
|
nav = "<li><a class=\"nav-button\" href=\"javascript:void(0)\">" + serverName + " (No Data)</a></li>";
|
||||||
|
tab = "<div class=\"tab\"><div class=\"row clearfix\">" +
|
||||||
|
"<div class=\"col-md-12\">" + Html.CARD.parse("<p>No Data (" + serverName + ")</p>") +
|
||||||
|
"</div></div></div>";
|
||||||
|
} else {
|
||||||
|
nav = "<li><a class=\"nav-button\" href=\"javascript:void(0)\">" + serverName + "</a></li>";
|
||||||
|
tab = generatePageTab();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private String generatePageTab() {
|
||||||
|
Collections.sort(data);
|
||||||
|
|
||||||
|
StringBuilder tabBuilder = new StringBuilder();
|
||||||
|
|
||||||
|
for (ExtensionPlayerData datum : data) {
|
||||||
|
ExtensionInformation extensionInformation = datum.getExtensionInformation();
|
||||||
|
|
||||||
|
boolean onlyGeneric = datum.hasOnlyGenericTab();
|
||||||
|
|
||||||
|
String tabsElement;
|
||||||
|
if (onlyGeneric) {
|
||||||
|
ExtensionTabData genericTabData = datum.getTabs().get(0);
|
||||||
|
tabsElement = Html.BODY.parse(parseDataHtml(genericTabData));
|
||||||
|
} else {
|
||||||
|
tabsElement = new TabsElement(
|
||||||
|
datum.getTabs().stream().map(this::wrapToTabElementTab).toArray(TabsElement.Tab[]::new)
|
||||||
|
).toHtmlFull();
|
||||||
|
}
|
||||||
|
|
||||||
|
tabBuilder.append(wrapInContainer(extensionInformation, tabsElement));
|
||||||
|
}
|
||||||
|
|
||||||
|
return wrapInTab(tabBuilder.toString());
|
||||||
|
}
|
||||||
|
|
||||||
|
private String wrapInTab(String content) {
|
||||||
|
return "<div class=\"tab\"><div class=\"row clearfix\">" + content + "</div></div>";
|
||||||
|
}
|
||||||
|
|
||||||
|
private TabsElement.Tab wrapToTabElementTab(ExtensionTabData tabData) {
|
||||||
|
TabInformation tabInformation = tabData.getTabInformation();
|
||||||
|
|
||||||
|
return new TabsElement.Tab(tabInformation.getTabName(), parseDataHtml(tabData));
|
||||||
|
}
|
||||||
|
|
||||||
|
private String parseDataHtml(ExtensionTabData tabData) {
|
||||||
|
StringBuilder builder = new StringBuilder();
|
||||||
|
for (String key : tabData.getValueOrder()) {
|
||||||
|
tabData.getBoolean(key).ifPresent(data -> append(builder, data.getDescriptive(), data.getFormattedValue()));
|
||||||
|
tabData.getDouble(key).ifPresent(data -> append(builder, data.getDescriptive(), data.getFormattedValue(decimalFormatter)));
|
||||||
|
tabData.getPercentage(key).ifPresent(data -> append(builder, data.getDescriptive(), data.getFormattedValue(percentageFormatter)));
|
||||||
|
tabData.getNumber(key).ifPresent(data -> append(builder, data.getDescriptive(), data.getFormattedValue(numberFormatters.get(data.getFormatType()))));
|
||||||
|
tabData.getString(key).ifPresent(data -> append(builder, data.getDescriptive(), data.getFormattedValue()));
|
||||||
|
}
|
||||||
|
return builder.toString();
|
||||||
|
}
|
||||||
|
|
||||||
|
private void append(StringBuilder builder, ExtensionDescriptive descriptive, String formattedValue) {
|
||||||
|
Optional<String> description = descriptive.getDescription();
|
||||||
|
if (description.isPresent()) {
|
||||||
|
builder.append("<p title=\"").append(description.get()).append("\">");
|
||||||
|
} else {
|
||||||
|
builder.append("<p>");
|
||||||
|
}
|
||||||
|
builder.append(Icon.fromExtensionIcon(descriptive.getIcon()))
|
||||||
|
.append(' ').append(descriptive.getText()).append(": ").append(formattedValue).append("</p>");
|
||||||
|
}
|
||||||
|
|
||||||
|
private String wrapInContainer(ExtensionInformation information, String tabsElement) {
|
||||||
|
return "<div class=\"col-xs-12 col-sm-12 col-md-4 col-lg-4\"><div class=\"card\">" +
|
||||||
|
"<div class=\"header\">" +
|
||||||
|
"<h2>" + Icon.fromExtensionIcon(information.getIcon()) + ' ' + information.getPluginName() + "</h2>" +
|
||||||
|
"</div>" +
|
||||||
|
tabsElement +
|
||||||
|
"</div></div>";
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int compareTo(InspectPluginTab other) {
|
||||||
|
return String.CASE_INSENSITIVE_ORDER.compare(this.serverName, other.serverName);
|
||||||
|
}
|
||||||
|
}
|
@ -23,9 +23,12 @@ import com.djrapitops.plan.data.store.containers.PlayerContainer;
|
|||||||
import com.djrapitops.plan.db.Database;
|
import com.djrapitops.plan.db.Database;
|
||||||
import com.djrapitops.plan.db.access.queries.containers.ContainerFetchQueries;
|
import com.djrapitops.plan.db.access.queries.containers.ContainerFetchQueries;
|
||||||
import com.djrapitops.plan.db.access.queries.objects.ServerQueries;
|
import com.djrapitops.plan.db.access.queries.objects.ServerQueries;
|
||||||
|
import com.djrapitops.plan.extension.implementation.results.player.ExtensionPlayerData;
|
||||||
|
import com.djrapitops.plan.extension.implementation.storage.queries.ExtensionPlayerDataQuery;
|
||||||
import com.djrapitops.plan.system.database.DBSystem;
|
import com.djrapitops.plan.system.database.DBSystem;
|
||||||
import com.djrapitops.plan.system.file.PlanFiles;
|
import com.djrapitops.plan.system.file.PlanFiles;
|
||||||
import com.djrapitops.plan.system.info.connection.ConnectionSystem;
|
import com.djrapitops.plan.system.info.connection.ConnectionSystem;
|
||||||
|
import com.djrapitops.plan.system.info.server.Server;
|
||||||
import com.djrapitops.plan.system.info.server.ServerInfo;
|
import com.djrapitops.plan.system.info.server.ServerInfo;
|
||||||
import com.djrapitops.plan.system.settings.config.PlanConfig;
|
import com.djrapitops.plan.system.settings.config.PlanConfig;
|
||||||
import com.djrapitops.plan.system.settings.theme.Theme;
|
import com.djrapitops.plan.system.settings.theme.Theme;
|
||||||
@ -43,8 +46,7 @@ import dagger.Lazy;
|
|||||||
|
|
||||||
import javax.inject.Inject;
|
import javax.inject.Inject;
|
||||||
import javax.inject.Singleton;
|
import javax.inject.Singleton;
|
||||||
import java.util.Map;
|
import java.util.*;
|
||||||
import java.util.UUID;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Factory for creating different {@link Page} objects.
|
* Factory for creating different {@link Page} objects.
|
||||||
@ -130,19 +132,52 @@ public class PageFactory {
|
|||||||
return new AnalysisPage(analysisContainer, connectionSystem.get(), versionCheckSystem.get(), fileSystem.get(), formatters.get().decimals(), timings.get());
|
return new AnalysisPage(analysisContainer, connectionSystem.get(), versionCheckSystem.get(), fileSystem.get(), formatters.get().decimals(), timings.get());
|
||||||
}
|
}
|
||||||
|
|
||||||
public InspectPage inspectPage(UUID uuid) {
|
public InspectPage inspectPage(UUID playerUUID) {
|
||||||
Database db = dbSystem.get().getDatabase();
|
Database db = dbSystem.get().getDatabase();
|
||||||
PlayerContainer player = db.query(ContainerFetchQueries.fetchPlayerContainer(uuid));
|
PlayerContainer player = db.query(ContainerFetchQueries.fetchPlayerContainer(playerUUID));
|
||||||
Map<UUID, String> serverNames = db.query(ServerQueries.fetchServerNames());
|
Map<UUID, String> serverNames = db.query(ServerQueries.fetchServerNames());
|
||||||
return new InspectPage(
|
return new InspectPage(
|
||||||
player, serverNames,
|
player, serverNames,
|
||||||
versionCheckSystem.get(),
|
versionCheckSystem.get(),
|
||||||
fileSystem.get(), config.get(), theme.get(),
|
fileSystem.get(), config.get(), this, theme.get(),
|
||||||
graphs.get(), tables.get(), accordions.get(), formatters.get(),
|
graphs.get(), tables.get(), accordions.get(), formatters.get(),
|
||||||
serverInfo.get(), timings.get()
|
serverInfo.get(), timings.get()
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public InspectPluginTab inspectPluginTabs(UUID playerUUID) {
|
||||||
|
Database database = dbSystem.get().getDatabase();
|
||||||
|
|
||||||
|
Map<UUID, List<ExtensionPlayerData>> extensionPlayerData = database.query(new ExtensionPlayerDataQuery(playerUUID));
|
||||||
|
|
||||||
|
if (extensionPlayerData.isEmpty()) {
|
||||||
|
return new InspectPluginTab("No Extensions", Collections.emptyList(), formatters.get());
|
||||||
|
}
|
||||||
|
|
||||||
|
List<InspectPluginTab> inspectPluginTabs = new ArrayList<>();
|
||||||
|
for (Map.Entry<UUID, Server> entry : database.query(ServerQueries.fetchPlanServerInformation()).entrySet()) {
|
||||||
|
UUID serverUUID = entry.getKey();
|
||||||
|
String serverName = entry.getValue().getIdentifiableName();
|
||||||
|
|
||||||
|
List<ExtensionPlayerData> ofServer = extensionPlayerData.get(serverUUID);
|
||||||
|
if (ofServer == null) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
inspectPluginTabs.add(new InspectPluginTab(serverName, ofServer, formatters.get()));
|
||||||
|
}
|
||||||
|
|
||||||
|
StringBuilder navs = new StringBuilder();
|
||||||
|
StringBuilder tabs = new StringBuilder();
|
||||||
|
|
||||||
|
inspectPluginTabs.stream().sorted().forEach(tab -> {
|
||||||
|
navs.append(tab.getNav());
|
||||||
|
tabs.append(tab.getTab());
|
||||||
|
});
|
||||||
|
|
||||||
|
return new InspectPluginTab(navs.toString(), tabs.toString());
|
||||||
|
}
|
||||||
|
|
||||||
@Deprecated
|
@Deprecated
|
||||||
public InspectPagePluginsContent inspectPagePluginsContent(UUID playerUUID) {
|
public InspectPagePluginsContent inspectPagePluginsContent(UUID playerUUID) {
|
||||||
return InspectPagePluginsContent.generateForThisServer(playerUUID, serverInfo.get(), hookHandler.get());
|
return InspectPagePluginsContent.generateForThisServer(playerUUID, serverInfo.get(), hookHandler.get());
|
||||||
|
Loading…
Reference in New Issue
Block a user