Unoptimized /players page implementation

This commit is contained in:
Rsl1122 2019-08-24 11:45:30 +03:00
parent df780c3099
commit 799e28f14a
10 changed files with 307 additions and 380 deletions

View File

@ -52,6 +52,7 @@ public class ServerPlayersTableContainersQuery implements Query<List<PlayerConta
Collection<BaseUser> baseUsers = db.query(BaseUserQueries.fetchServerBaseUsers(serverUUID));
Map<UUID, List<GeoInfo>> geoInformation = db.query(GeoInfoQueries.fetchServerGeoInformation(serverUUID));
// TODO Optimize the heck out of this
Map<UUID, List<Session>> sessions = db.query(SessionQueries.fetchSessionsOfServer(serverUUID));
Set<UUID> bannedUsers = db.query(UserInfoQueries.fetchBannedUUIDsOfServer(serverUUID));

View File

@ -26,6 +26,7 @@ import com.djrapitops.plan.data.store.mutators.TPSMutator;
import com.djrapitops.plan.data.store.objects.DateObj;
import com.djrapitops.plan.db.Database;
import com.djrapitops.plan.db.access.queries.analysis.PlayerCountQueries;
import com.djrapitops.plan.db.access.queries.containers.AllPlayerContainersQuery;
import com.djrapitops.plan.db.access.queries.containers.ServerPlayersTableContainersQuery;
import com.djrapitops.plan.db.access.queries.objects.*;
import com.djrapitops.plan.extension.implementation.storage.queries.ExtensionServerPlayerDataTableQuery;
@ -84,6 +85,21 @@ public class JSONFactory {
).toJSONString();
}
public String networkPlayersTableJSON() {
Integer xMostRecentPlayers = config.get(DisplaySettings.PLAYERS_PER_PLAYERS_PAGE);
Long playtimeThreshold = config.get(TimeSettings.ACTIVE_PLAY_THRESHOLD);
Boolean openPlayerLinksInNewTab = config.get(DisplaySettings.OPEN_PLAYER_LINKS_IN_NEW_TAB);
Database database = dbSystem.getDatabase();
return new PlayersTableJSONParser(
database.query(new AllPlayerContainersQuery()), // TODO Optimize the heck out of this
Collections.emptyMap(),
xMostRecentPlayers, playtimeThreshold, openPlayerLinksInNewTab,
formatters
).toJSONString();
}
public List<Map<String, Object>> serverSessionsAsJSONMap(UUID serverUUID) {
Database db = dbSystem.getDatabase();
List<Session> sessions = db.query(SessionQueries.fetchLatestSessionsOfServer(

View File

@ -18,6 +18,7 @@ package com.djrapitops.plan.system.webserver;
import com.djrapitops.plan.api.exceptions.WebUserAuthException;
import com.djrapitops.plan.api.exceptions.connection.*;
import com.djrapitops.plan.system.info.server.ServerInfo;
import com.djrapitops.plan.system.webserver.auth.Authentication;
import com.djrapitops.plan.system.webserver.cache.PageId;
import com.djrapitops.plan.system.webserver.cache.ResponseCache;
@ -49,12 +50,14 @@ public class ResponseHandler extends TreePageHandler {
private final RootJSONHandler rootJSONHandler;
private final ErrorHandler errorHandler;
private final ServerInfo serverInfo;
private Lazy<WebServer> webServer;
@Inject
public ResponseHandler(
ResponseFactory responseFactory,
Lazy<WebServer> webServer,
ServerInfo serverInfo,
DebugPageHandler debugPageHandler,
PlayersPageHandler playersPageHandler,
@ -66,6 +69,7 @@ public class ResponseHandler extends TreePageHandler {
) {
super(responseFactory);
this.webServer = webServer;
this.serverInfo = serverInfo;
this.debugPageHandler = debugPageHandler;
this.playersPageHandler = playersPageHandler;
this.playerPageHandler = playerPageHandler;
@ -83,9 +87,9 @@ public class ResponseHandler extends TreePageHandler {
registerPage("server", serverPageHandler);
if (webServer.get().isAuthRequired()) {
registerPage("", new RootPageHandler(responseFactory));
registerPage("", new RootPageHandler(responseFactory, serverInfo));
} else {
registerPage("", responseFactory.redirectResponse("/server"), 5);
registerPage("", responseFactory.redirectResponse(serverInfo.getServer().isProxy() ? "/network" : "/server"), 5);
}
registerPage("v1", rootJSONHandler);

View File

@ -18,6 +18,7 @@ package com.djrapitops.plan.system.webserver.pages;
import com.djrapitops.plan.api.exceptions.connection.WebException;
import com.djrapitops.plan.data.WebUser;
import com.djrapitops.plan.system.info.server.ServerInfo;
import com.djrapitops.plan.system.webserver.Request;
import com.djrapitops.plan.system.webserver.RequestTarget;
import com.djrapitops.plan.system.webserver.auth.Authentication;
@ -37,9 +38,11 @@ import java.util.Optional;
public class RootPageHandler implements PageHandler {
private final ResponseFactory responseFactory;
private final ServerInfo serverInfo;
public RootPageHandler(ResponseFactory responseFactory) {
public RootPageHandler(ResponseFactory responseFactory, ServerInfo serverInfo) {
this.responseFactory = responseFactory;
this.serverInfo = serverInfo;
}
@Override
@ -54,7 +57,7 @@ public class RootPageHandler implements PageHandler {
int permLevel = webUser.getPermLevel();
switch (permLevel) {
case 0:
return new RedirectResponse("/server");
return new RedirectResponse(serverInfo.getServer().isProxy() ? "/network" : "/server");
case 1:
return new RedirectResponse("/players");
case 2:

View File

@ -55,8 +55,12 @@ public class PlayersTableJSONHandler implements PageHandler {
@Override
public Response getResponse(Request request, RequestTarget target) throws WebException {
UUID serverUUID = identifiers.getServerUUID(target); // Can throw BadRequestException
return new JSONResponse(jsonFactory.serverPlayersTableJSON(serverUUID));
if (target.getParameter("server").isPresent()) {
UUID serverUUID = identifiers.getServerUUID(target); // Can throw BadRequestException
return new JSONResponse(jsonFactory.serverPlayersTableJSON(serverUUID));
}
// Assume network
return new JSONResponse(jsonFactory.networkPlayersTableJSON());
}
@Override

View File

@ -6,8 +6,7 @@
<meta charset="utf-8">
<meta content="IE=edge" http-equiv="X-UA-Compatible">
<meta content="width=device-width, initial-scale=1, maximum-scale=1" name="viewport">
<meta content="Player Analytics, player page that displays more insights about a specific player"
name="description">
<meta content="Player Analytics, generic error/debug page" name="description">
<meta content="Rsl1122" name="author">
<title>${titleText}</title>

View File

@ -92,7 +92,7 @@
<a class="collapse-item nav-button" href="javascript:void(0)"><i
class="fas fa-fw fa-chart-line"></i>
Overview</a>
<a class="collapse-item nav-button" href="javascript:void(0)"><i class="fas fa-fw fa-users"></i>
<a class="collapse-item" href="./players"><i class="fas fa-fw fa-users"></i>
Player List</a>
<a class="collapse-item nav-button" href="javascript:void(0)"><i class="fas fa-fw fa-globe"></i>
Geolocations</a>
@ -180,8 +180,7 @@
<!-- Players -->
<div class="col-xl-3 col-lg-3 col-sm-12">
<div class="card shadow mb-4">
<div
class="card-header py-3 d-flex flex-row align-items-center justify-content-between">
<div class="card-header py-3 d-flex flex-row align-items-center justify-content-between">
<h6 class="m-0 font-weight-bold col-black">Players</h6>
</div>
<div class="card-body" id="data_players">
@ -440,8 +439,7 @@
<!-- Playerbase Chart -->
<div class="col-xl-8 col-lg-8 col-sm-12">
<div class="card shadow mb-4">
<div
class="card-header py-3 d-flex flex-row align-items-center justify-content-between">
<div class="card-header py-3 d-flex flex-row align-items-center justify-content-between">
<h6 class="m-0 font-weight-bold col-black"><i
class="fas fa-fw fa-chart-line col-amber"></i>
Playerbase development</h6>
@ -453,8 +451,7 @@
<!-- Current Playerbase -->
<div class="col-xl-4 col-lg-4 col-sm-12">
<div class="card shadow mb-4">
<div
class="card-header py-3 d-flex flex-row align-items-center justify-content-between">
<div class="card-header py-3 d-flex flex-row align-items-center justify-content-between">
<h6 class="m-0 font-weight-bold col-black"><i
class="fa fa-fw fa-users col-amber"></i>
Current Playerbase</h6>
@ -574,34 +571,6 @@
</div>
</div> <!-- /.container-fluid -->
</div> <!-- End of Playerbase Overview tab -->
<!-- Begin Player List Tab -->
<div class="tab">
<div class="container-fluid mt-4">
<!-- Page Heading -->
<div class="d-sm-flex align-items-center justify-content-between mb-4">
<h1 class="h3 mb-0 text-gray-800"><i class="sidebar-toggler fa fa-fw fa-bars"></i>${networkDisplayName}
&middot; Player List</h1>
</div>
<div class="row">
<!-- Player List -->
<div class="col-xl-12 col-lg-12 col-sm-12">
<div class="card shadow mb-4">
<div
class="card-header py-3 d-flex flex-row align-items-center justify-content-between">
<h6 class="m-0 font-weight-bold col-black"><i
class="fas fa-fw fa-users col-black"></i>
Player List</h6>
</div>
<div class="card-body">
<p>This page will not exist, instead "Player List" will link to /players
page. </p>
</div>
</div>
</div>
</div>
</div> <!-- /.container-fluid -->
</div> <!-- End of Player List tab -->
<!-- Begin Geolocations Tab -->
<div class="tab" id="geolocations">
<div class="container-fluid mt-4">

View File

@ -136,8 +136,7 @@
<!-- Player Card -->
<div class="col-xs-12 col-sm-12 col-lg-6">
<div class="card shadow mb-4">
<div
class="card-header py-3 d-flex flex-row align-items-center justify-content-between">
<div class="card-header py-3 d-flex flex-row align-items-center justify-content-between">
<h6 class="m-0 font-weight-bold col-black"><i
class="far fa-fw fa-address-card"></i>
${playerName}</h6>
@ -242,8 +241,7 @@
<!-- Punchcard -->
<div class="col-xl-6 col-lg-6 col-sm-12">
<div class="card shadow mb-4">
<div
class="card-header py-3 d-flex flex-row align-items-center justify-content-between">
<div class="card-header py-3 d-flex flex-row align-items-center justify-content-between">
<h6 class="m-0 font-weight-bold col-black"><i class="fas fa-fw fa-braille"></i>
Punchcard</h6>
</div>
@ -326,8 +324,7 @@
<div class="col-lg-8 mb-8 col-sm-12">
<!-- Calendar -->
<div class="card shadow mb-4">
<div
class="card-header py-3 d-flex flex-row align-items-center justify-content-between">
<div class="card-header py-3 d-flex flex-row align-items-center justify-content-between">
<h6 class="m-0 font-weight-bold col-black"><i
class="far fa-fw fa-calendar-alt col-teal"></i>
Session Calendar</h6>
@ -477,8 +474,7 @@
<!-- Most Recent Kills -->
<div class="col-xl-6 col-lg-6 col-sm-12">
<div class="card shadow mb-4">
<div
class="card-header py-3 d-flex flex-row align-items-center justify-content-between">
<div class="card-header py-3 d-flex flex-row align-items-center justify-content-between">
<h6 class="m-0 font-weight-bold col-black"><i
class="fas fa-fw fa-crosshairs col-red"></i>
Recent PvP Kills</h6>
@ -489,8 +485,7 @@
<!-- Most Recent Deaths -->
<div class="col-xl-6 col-lg-6 col-sm-12">
<div class="card shadow mb-4">
<div
class="card-header py-3 d-flex flex-row align-items-center justify-content-between">
<div class="card-header py-3 d-flex flex-row align-items-center justify-content-between">
<h6 class="m-0 font-weight-bold col-black"><i
class="fas fa-fw fa-skull col-red"></i>
Recent PvP Deaths</h6>

View File

@ -1,351 +1,293 @@
<!DOCTYPE html>
<html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=Edge">
<meta content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" name="viewport">
<meta charset="utf-8">
<meta content="IE=edge" http-equiv="X-UA-Compatible">
<meta content="width=device-width, initial-scale=1, maximum-scale=1" name="viewport">
<meta content="Player Analytics, players page that displays list of players" name="description">
<meta content="Rsl1122" name="author">
<title>Plan | Players</title>
<!-- Favicon-->
<link rel="icon" href="favicon.ico" type="image/x-icon">
<!-- Google Fonts -->
<link href="https://fonts.googleapis.com/css?family=Roboto:400,700&subset=latin,cyrillic-ext" rel="stylesheet"
type="text/css">
<link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet" type="text/css">
<!-- Custom fonts for this template-->
<link crossorigin="anonymous" href="https://use.fontawesome.com/releases/v5.7.1/css/all.css"
integrity="sha384-fnmOCqbTlWIlj8LyTjo7mOUStjsKC4pOpQbqyi7RrhN7udi9RwhKkMHpvLbHG9Sr" rel="stylesheet">
<link href="https://fonts.googleapis.com/css?family=Nunito:300,400,600,700,800,900"
rel="stylesheet">
<!-- Bootstrap Core Css -->
<link crossorigin="anonymous" href="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css"
integrity="sha384-HSMxcRTRxnN+Bdg0JdbxYKrThecOKuH5zCYotlSAcp1+c8xmyTe9GYg1l9a69psu" rel="stylesheet">
<!-- Waves Effect Css -->
<link href="plugins/node-waves/waves.css" rel="stylesheet"/>
<!-- Animation Css -->
<link href="plugins/animate-css/animate.css" rel="stylesheet"/>
<!-- Custom Css -->
<!-- Custom styles for this template-->
<link href="css/sb-admin-2.css" rel="stylesheet">
<link href="css/style.css" rel="stylesheet">
<!-- Plan Stylesheet -->
<link href="css/main.css" rel="stylesheet">
<!-- AdminBSB Themes. You can choose a theme from css/themes instead of get all themes -->
<link href="css/themes/all-themes.css" rel="stylesheet"/>
<!-- Font Awesome -->
<link href="https://use.fontawesome.com/releases/v5.8.1/css/all.css" rel="stylesheet">
<link href="https://use.fontawesome.com/releases/v5.8.1/css/v4-shims.css" rel="stylesheet">
</head>
<body class="theme-red">
<!-- Page Loader -->
<div class="page-loader-wrapper">
<div class="loader">
<div class="preloader">
<div class="spinner-layer pl-light-green">
<div class="circle-clipper left">
<div class="circle"></div>
</div>
<div class="circle-clipper right">
<div class="circle"></div>
</div>
</div>
</div>
<p>Please wait...</p>
</div>
</div>
<!-- #END# Page Loader -->
<!-- Overlay For Sidebars -->
<div class="overlay"></div>
<!-- #END# Overlay For Sidebars -->
<!-- Search Bar -->
<div class="search-bar">
<div class="search-icon">
<i class="material-icons">search</i>
</div>
<input type="text" placeholder="START TYPING...">
<div class="close-search">
<i class="material-icons">close</i>
</div>
</div>
<!-- #END# Search Bar -->
<!-- Top Bar -->
<nav class="navbar">
<div class="container-fluid">
<div class="navbar-header">
<a href="javascript:void(0);" class="navbar-toggle collapsed" data-toggle="collapse"
data-target="#navbar-collapse" aria-expanded="false"></a>
<a href="javascript:void(0);" class="bars"></a>
<a class="navbar-brand">${networkName} | Players</a>
</div>
<div class="collapse navbar-collapse" id="navbar-collapse">
<ul class="nav navbar-nav navbar-right">
<!-- Call Search (Disabled)
<li><a href="javascript:void(0);" class="js-search" data-close="true"><i class="material-icons">search</i></a></li>
<!-- #END# Call Search -->
<li class="pull-right"><a href="javascript:void(0);" class="js-right-sidebar" data-close="true"><i
class="material-icons">settings</i></a></li>
</ul>
</div>
</div>
</nav>
<!-- #Top Bar -->
<section>
<!-- Left Sidebar -->
<aside id="leftsidebar" class="sidebar">
<!-- Menu -->
<div class="menu">
<ul class="list">
<li class="active">
<a class="nav-button" href="javascript:void(0)">
<i class="material-icons">people</i>
<span>Players</span>
</a>
</li>
<li>
<a target="_blank" href="../network">
<i class="material-icons">storage</i>
<span>Network/Server</span>
</a>
</li>
</ul>
</div>
<!-- #Menu -->
<!-- Footer -->
<div class="legal">
<div class="row clearfix">
<div class="col-xs-10 col-sm-10 col-lg-10">
<div class="version">
<b>Player Analytics: </b> v${version}
${update}
</div>
</div>
<div class="col-xs-2 col-sm-2 col-lg-2">
<a href="javascript:void(0)" class="help material-icons pull-right"
tabindex="0" data-trigger="focus" data-toggle="popover" data-placement="top"
data-container="body" data-html="true"
data-original-title="Player Analytics"
data-content="Author: Rsl1122
<br><br>Tutorials: <a target=&quot;_blank&quot; href=&quot;https://github.com/Rsl1122/Plan-PlayerAnalytics/wiki&quot;>Link</a>
<br>Issues: <a target=&quot;_blank&quot; href=&quot;https://github.com/Rsl1122/Plan-PlayerAnalytics/issues&quot;>Link</a>
<br><br>Discord: <a target=&quot;_blank&quot; href=&quot;https://discord.gg/yXKmjzT&quot;>Link</a>"
>help_outline</a>
</div>
</div>
</div>
<!-- #Footer -->
</aside>
<!-- #END# Left Sidebar -->
<!-- Right Sidebar -->
<aside id="rightsidebar" class="right-sidebar">
<div class="tab-content">
<div role="tabpanel" class="tab-pane fade in active in active" id="skins">
<ul class="demo-choose-skin">
<li data-theme="red" class="active">
<div class="red"></div>
<span>Red</span>
</li>
<li data-theme="pink">
<div class="pink"></div>
<span>Pink</span>
</li>
<li data-theme="purple">
<div class="purple"></div>
<span>Purple</span>
</li>
<li data-theme="deep-purple">
<div class="deep-purple"></div>
<span>Deep Purple</span>
</li>
<li data-theme="indigo">
<div class="indigo"></div>
<span>Indigo</span>
</li>
<li data-theme="blue">
<div class="blue"></div>
<span>Blue</span>
</li>
<li data-theme="light-blue">
<div class="light-blue"></div>
<span>Light Blue</span>
</li>
<li data-theme="cyan">
<div class="cyan"></div>
<span>Cyan</span>
</li>
<li data-theme="teal">
<div class="teal"></div>
<span>Teal</span>
</li>
<li data-theme="green">
<div class="green"></div>
<span>Green</span>
</li>
<li data-theme="light-green">
<div class="light-green"></div>
<span>Light Green</span>
</li>
<li data-theme="lime">
<div class="lime"></div>
<span>Lime</span>
</li>
<li data-theme="yellow">
<div class="yellow"></div>
<span>Yellow</span>
</li>
<li data-theme="amber">
<div class="amber"></div>
<span>Amber</span>
</li>
<li data-theme="orange">
<div class="orange"></div>
<span>Orange</span>
</li>
<li data-theme="deep-orange">
<div class="deep-orange"></div>
<span>Deep Orange</span>
</li>
<li data-theme="brown">
<div class="brown"></div>
<span>Brown</span>
</li>
<li data-theme="grey">
<div class="grey"></div>
<span>Grey</span>
</li>
<li data-theme="blue-grey">
<div class="blue-grey"></div>
<span>Blue Grey</span>
</li>
<li data-theme="black">
<div class="black"></div>
<span>Black</span>
</li>
</ul>
</div>
</div>
</aside>
<!-- #END# Right Sidebar -->
</section>
<body id="page-top">
<section class="content">
<div class="main-limiter">
<div id="main">
<div id="tab-players" class="tab">
<!-- Basic Examples -->
<div class="row clearfix">
<div class="col-lg-12 col-md-12 col-sm-12 col-xs-12">
<div class="card">
<div class="header">
<div class="col-xs-6 col-sm-6 col-lg-6">
<h2><i class="fa fa-fw fa-users"></i> Player List</h2>
<!-- Page Wrapper -->
<div id="wrapper">
<!-- Sidebar -->
<ul class="navbar-nav bg-plan sidebar sidebar-dark accordion" id="accordionSidebar">
<!-- Sidebar - Brand -->
<a class="sidebar-brand d-flex align-items-center justify-content-center">
<img class="w-22" src="img/Flaticon_circle.png">
</a>
<!-- Divider -->
<hr class="sidebar-divider my-0">
<li class="nav-item nav-button active">
<a class="nav-link" href="/">
<i class="fas fa-fw fa-arrow-left"></i>
<span>to main page</span></a>
</li>
<!-- Divider -->
<hr class="sidebar-divider">
<div class="ml-3 align-items-center justify-content-between">
<button class="btn bg-plan" data-target="#colorChooserModal" data-toggle="modal" type="button">
<i class="fa fa-palette"></i>
</button>
<button class="btn bg-plan" data-target="#informationModal" data-toggle="modal" type="button">
<i class="fa fa-fw fa-question-circle"></i>
</button>
</div>
<div class="ml-3 align-items-center justify-content-between">
${version}
</div>
</ul>
<!-- End of Sidebar -->
<!-- Content Wrapper -->
<div class="d-flex flex-column" id="content-wrapper">
<div class="sidebar-close-modal hidden"></div>
<!-- Main Content -->
<div id="content" style="display: flex;">
<!-- Begin Player Overview Tab -->
<div class="tab" style="width: 100%;">
<div class="container-fluid mt-4">
<!-- Page Heading -->
<div class="d-sm-flex align-items-center justify-content-between mb-4">
<h1 class="h3 mb-0 text-gray-800">${networkName} | Players</h1>
</div>
<div class="row">
<!-- Player List -->
<div class="col-xl-12 col-lg-12 col-sm-12">
<div class="card shadow mb-4">
<div class="card-header py-3 d-flex flex-row align-items-center justify-content-between">
<h6 class="m-0 font-weight-bold col-black"><i
class="fas fa-fw fa-users col-black"></i>
Player List</h6>
</div>
<div class="col-xs-6 col-sm-6 col-lg-6">
<a href="javascript:void(0)" class="help material-icons pull-right"
tabindex="0" data-trigger="focus" data-toggle="popover" data-placement="left"
data-container="body" data-html="true"
data-original-title="Playerlist"
data-content="Most Recent Players.
<br><br>Search can be used to limit by Geolocation or for finding players.
<br><br>By clicking a column the table is sorted by that column desc/asc.
<br><br>Similar but server specific table is available on /server-pages."
>help_outline</a>
</div>
</div>
<div class="body">
<div class="table-responsive">
${playersTable}
<table class="table table-bordered table-striped table-hover player-table dataTable">
<tr>
<td>Loading..</td>
</tr>
</table>
</div>
</div>
</div>
</div>
</div> <!-- /.container-fluid -->
</div> <!-- End of tab -->
</div> <!-- End of Main Content -->
</div>
<!-- End of Content Wrapper -->
<!-- Color Chooser Modal -->
<div aria-hidden="true" aria-labelledby="colorChooserModalLabel" class="modal fade" id="colorChooserModal"
role="dialog" tabindex="-1">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="colorChooserModalLabel"><i class="fa fa-palette"></i> Theme Select
</h5>
<button aria-label="Close" class="close" data-dismiss="modal" type="button">
<span aria-hidden="true">&times;</span>
</button>
</div>
<div class="modal-body">
<button class="btn color-chooser" id="choose-plan" type="button"><i
class="fa fa-palette"></i></button>
<button class="btn color-chooser" id="choose-red" type="button"><i
class="fa fa-palette"></i></button>
<button class="btn color-chooser" id="choose-pink" type="button"><i
class="fa fa-palette"></i></button>
<button class="btn color-chooser" id="choose-purple" type="button"><i
class="fa fa-palette"></i></button>
<button class="btn color-chooser" id="choose-deep-purple" type="button"><i
class="fa fa-palette"></i></button>
<button class="btn color-chooser" id="choose-indigo" type="button"><i
class="fa fa-palette"></i></button>
<button class="btn color-chooser" id="choose-blue" type="button"><i
class="fa fa-palette"></i></button>
<button class="btn color-chooser" id="choose-light-blue" type="button"><i
class="fa fa-palette"></i></button>
<button class="btn color-chooser" id="choose-cyan" type="button"><i
class="fa fa-palette"></i></button>
<button class="btn color-chooser" id="choose-teal" type="button"><i
class="fa fa-palette"></i></button>
<button class="btn color-chooser" id="choose-green" type="button"><i
class="fa fa-palette"></i></button>
<button class="btn color-chooser" id="choose-light-green" type="button"><i
class="fa fa-palette"></i></button>
<button class="btn color-chooser" id="choose-lime" type="button"><i
class="fa fa-palette"></i></button>
<button class="btn color-chooser" id="choose-yellow" type="button"><i
class="fa fa-palette"></i></button>
<button class="btn color-chooser" id="choose-amber" type="button"><i
class="fa fa-palette"></i></button>
<button class="btn color-chooser" id="choose-orange" type="button"><i
class="fa fa-palette"></i></button>
<button class="btn color-chooser" id="choose-deep-orange" type="button"><i
class="fa fa-palette"></i></button>
<button class="btn color-chooser" id="choose-brown" type="button"><i
class="fa fa-palette"></i></button>
<button class="btn color-chooser" id="choose-grey" type="button"><i
class="fa fa-palette"></i></button>
<button class="btn color-chooser" id="choose-blue-grey" type="button"><i
class="fa fa-palette"></i></button>
</div>
<div class="modal-footer">
<button class="btn" id="night-mode-toggle" type="button"><i class="fa fa-fw fa-cloud-moon"></i>
Night
Mode
</button>
<button class="btn bg-plan" data-dismiss="modal" type="button">OK</button>
</div>
<!-- #END# Basic Examples -->
</div>
<!-- #END# Tab Servers -->
</div>
</div>
</section>
<!-- Jquery Core Js -->
<script src="plugins/jquery/jquery.min.js"></script>
<!-- Information Modal -->
<div aria-hidden="true" aria-labelledby="informationModalLabel" class="modal fade" id="informationModal"
role="dialog" tabindex="-1">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="informationModalLabel"><i class="fa fa-fw fa-question-circle"></i>
Information about the plugin
</h5>
<button aria-label="Close" class="close" data-dismiss="modal" type="button">
<span aria-hidden="true">&times;</span>
</button>
</div>
<div class="modal-body">
<p>Player Analytics is developed and licensed under <a
href="https://opensource.org/licenses/LGPL-3.0" rel="noopener noreferrer"
target="_blank">Lesser General Public License
v3.0</a></p>
<hr>
<a class="btn col-plan" href="https://github.com/Rsl1122/Plan-PlayerAnalytics/wiki"
rel="noopener noreferrer" target="_blank"><i class="fa fa-fw fa-graduation-cap"></i> Plan
Wiki,
Tutorials & Documentation</a>
<a class="btn col-plan" href="https://github.com/Rsl1122/Plan-PlayerAnalytics/issues"
rel="noopener noreferrer" target="_blank"><i class="fa fa-fw fa-bug"></i> Report Issues</a>
<a class="btn col-plan" href="https://discord.gg/yXKmjzT" rel="noopener noreferrer"
target="_blank"><i class="fab fa-fw fa-discord"></i> General Support on Discord</a>
<hr>
<p>Player Analytics is developed by Rsl1122.</p>
<p>In addition following <span class="col-plan">awesome people</span> have contributed:</p>
<ul>
<li>Argetan <i class="fa fa-fw fa-code"></i></li>
<li>BrainStone <i class="fa fa-fw fa-code"></i></li>
<li>CyanTech <i class="fa fa-fw fa-language"></i></li>
<li>DarkPyves <i class="fa fa-fw fa-code"></i></li>
<li>DaveDevil <i class="fa fa-fw fa-language"></i></li>
<li>enterih <i class="fa fa-fw fa-language"></i></li>
<li>Eyremba <i class="fa fa-fw fa-language"></i></li>
<li>f0rb1d (佛壁灯) <i class="fa fa-fw fa-language"></i></li>
<li>fuzzlemann <i class="fa fa-fw fa-code"></i> <i class="fa fa-fw fa-language"></i></li>
<li>Miclebrick <i class="fa fa-fw fa-code"></i></li>
<li>Morsmorse <i class="fa fa-fw fa-language"></i></li>
<li>Vankka <i class="fa fa-fw fa-code"></i></li>
</ul>
<small><i class="fa fa-fw fa-code"></i> code contributor <i class="fa fa-fw fa-language"></i>
translator
</small>
<hr>
<p class="col-plan">Extra special thanks to those who have monetarily supported the development.
<i class="fa fa-fw fa-star col-amber"></i></p>
<hr>
<h6>bStats Metrics</h6>
<a class="btn col-plan" href="https://bstats.org/plugin/bukkit/Plan" rel="noopener noreferrer"
target="_blank"><i class="fa fa-fw fa-chart-area"></i> Bukkit</a>
<a class="btn col-plan" href="https://bstats.org/plugin/bungeecord/Plan"
rel="noopener noreferrer" target="_blank"><i class="fa fa-fw fa-chart-area"></i>
BungeeCord</a>
<a class="btn col-plan" href="https://bstats.org/plugin/sponge/plan" rel="noopener noreferrer"
target="_blank"><i class="fa fa-fw fa-chart-area"></i> Sponge</a>
</div>
<div class="modal-footer">
<button class="btn bg-plan" data-dismiss="modal" type="button">OK</button>
</div>
</div>
</div>
</div>
<!-- Bootstrap Core Js -->
<script crossorigin="anonymous" integrity="sha384-aJ21OjlMXNL5UyIl/XNwTMqvzeRMZH2w8c5cRVpzpU8Y5bApTppSuUkhZXN0VxHd"
src="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/js/bootstrap.min.js"></script>
<!-- Update Modal -->
<div aria-hidden="true" aria-labelledby="updateModalLabel" class="modal fade" id="updateModal" role="dialog"
tabindex="-1">
<div class="modal-dialog" role="document">
<div class="modal-content">
${updateModal}
<div class="modal-footer">
<button class="btn bg-plan" data-dismiss="modal" type="button">OK</button>
</div>
</div>
</div>
</div>
<!-- Slimscroll Plugin Js -->
<script src="plugins/jquery-slimscroll/jquery.slimscroll.js"></script>
</div>
<!-- End of Page Wrapper -->
<!-- Waves Effect Plugin Js -->
<script src="plugins/node-waves/waves.js"></script>
<!-- Scroll to Top Button-->
<a class="scroll-to-top rounded" href="#page-top">
<i class="fas fa-fw fa-angle-up"></i>
</a>
<!-- Jquery Table Plugin Js -->
<link href="https://cdn.datatables.net/v/bs/dt-1.10.18/datatables.min.css" rel="stylesheet" type="text/css"/>
<script src="https://cdn.datatables.net/v/bs/dt-1.10.18/datatables.min.js" type="text/javascript"></script>
<!-- Bootstrap core JavaScript-->
<script src="vendor/jquery/jquery.min.js"></script>
<script src="vendor/bootstrap/js/bootstrap.bundle.min.js"></script>
<!-- Core plugin JavaScript-->
<script src="vendor/jquery-easing/jquery.easing.min.js"></script>
<!-- Header, Sidenav & Skin changer -->
<script src="js/admin.js"></script>
<!-- Page level plugins -->
<script src="vendor/datatables/jquery.dataTables.min.js"></script>
<script src="vendor/datatables/dataTables.bootstrap4.min.js"></script>
<!-- Custom scripts for all pages-->
<script src="js/sb-admin-2.js"></script>
<script src="js/xmlhttprequests.js"></script>
<script src="js/color-selector.js"></script>
<!-- Plan load script -->
<script>
$(function () {
$('.player-table').DataTable({
responsive: true,
"order": [[5, "desc"]]
});
var navButtons = document.getElementsByClassName("nav-button");
var tabs = document.getElementsByClassName("tab");
var slideIndex = window.sessionStorage.getItem("AnalysisSlideIndex");
if (slideIndex === null) {
slideIndex = 0;
}
var x = document.getElementById("main");
x.style.transform = "translate3d(0px,0px,0)";
x.style.width = "" + navButtons.length * 100 + "%";
for (var i = 0; i < navButtons.length; i++) {
navButtons[i].onclick = openFunc(i);
tabs[i].style.width = "" + 100 / navButtons.length + "%";
}
x.style.opacity = "1";
openFunc(slideIndex)();
function openFunc(i) {
return function () {
var max = navButtons.length;
for (var j = 0; j < max; j++) {
if (navButtons[j].parentElement.classList.contains('active')) {
navButtons[j].parentElement.classList.remove('active');
}
if (j == i) {
navButtons[j].parentElement.classList.add('active');
}
}
var percent = -100 / navButtons.length;
slideIndex = i;
if (slideIndex > max) {
slideIndex = 0
}
if (slideIndex < 0) {
slideIndex = max
}
window.scrollTo(0, 0);
window.sessionStorage.setItem("AnalysisSlideIndex", slideIndex);
var value = slideIndex * percent;
x.style.transition = "0.5s";
x.style.transform = "translate3d(" + value + "%,0px,0)";
};
jsonRequest("../v1/players", function (playersTableJson, error) {
if (playersTableJson) {
$('.player-table').DataTable({
responsive: true,
columns: playersTableJson.columns,
data: playersTableJson.data,
order: [[5, "desc"]]
})
} else if (error) {
$('.player-table').DataTable({
columns: [{title: "Error"}],
data: [["Failed to load Players table data: " + error]]
})
}
});
</script>
<!-- Demo Js -->
<script src="js/demo.js"></script>
</body>
</html>
</html>

View File

@ -153,8 +153,7 @@
<!-- Online Activity Chart -->
<div class="col-xl-9 col-lg-9 col-sm-12">
<div class="card shadow mb-4">
<div
class="card-header py-3 d-flex flex-row align-items-center justify-content-between">
<div class="card-header py-3 d-flex flex-row align-items-center justify-content-between">
<h6 class="m-0 font-weight-bold col-black"><i
class="fas fa-fw fa-chart-area col-blue"></i>
Online Activity</h6>
@ -166,8 +165,7 @@
<!-- Last 7 days -->
<div class="col-xl-3 col-lg-3 col-sm-12">
<div class="card shadow mb-4">
<div
class="card-header py-3 d-flex flex-row align-items-center justify-content-between">
<div class="card-header py-3 d-flex flex-row align-items-center justify-content-between">
<h6 class="m-0 font-weight-bold col-black">Last 7 Days</h6>
</div>
<div class="card-body" id="data_7_days">
@ -665,8 +663,7 @@
<!-- Most Recent Kills -->
<div class="col-xl-8 col-lg-8 col-sm-12">
<div class="card shadow mb-4">
<div
class="card-header py-3 d-flex flex-row align-items-center justify-content-between">
<div class="card-header py-3 d-flex flex-row align-items-center justify-content-between">
<h6 class="m-0 font-weight-bold col-black"><i
class="fas fa-fw fa-crosshairs col-red"></i>
Recent Kills</h6>
@ -694,8 +691,7 @@
<!-- Playerbase Chart -->
<div class="col-xl-8 col-lg-8 col-sm-12">
<div class="card shadow mb-4">
<div
class="card-header py-3 d-flex flex-row align-items-center justify-content-between">
<div class="card-header py-3 d-flex flex-row align-items-center justify-content-between">
<h6 class="m-0 font-weight-bold col-black"><i
class="fas fa-fw fa-chart-line col-amber"></i>
Playerbase development</h6>
@ -707,8 +703,7 @@
<!-- Current Playerbase -->
<div class="col-xl-4 col-lg-4 col-sm-12">
<div class="card shadow mb-4">
<div
class="card-header py-3 d-flex flex-row align-items-center justify-content-between">
<div class="card-header py-3 d-flex flex-row align-items-center justify-content-between">
<h6 class="m-0 font-weight-bold col-black"><i
class="fa fa-fw fa-users col-amber"></i>
Current Playerbase</h6>
@ -842,8 +837,7 @@
<!-- Player List -->
<div class="col-xl-12 col-lg-12 col-sm-12">
<div class="card shadow mb-4">
<div
class="card-header py-3 d-flex flex-row align-items-center justify-content-between">
<div class="card-header py-3 d-flex flex-row align-items-center justify-content-between">
<h6 class="m-0 font-weight-bold col-black"><i
class="fas fa-fw fa-users col-black"></i>
Player List</h6>