mirror of
https://github.com/plan-player-analytics/Plan.git
synced 2025-02-25 00:31:49 +01:00
commit
40157e8006
@ -23,7 +23,7 @@ import org.spongepowered.api.plugin.Plugin;
|
||||
import java.io.File;
|
||||
import java.io.InputStream;
|
||||
|
||||
@Plugin(id = "plan", name = "Plan", version = "4.4.0", description = "Player Analytics Plugin by Rsl1122", authors = {"Rsl1122"})
|
||||
@Plugin(id = "plan", name = "Plan", version = "4.4.1", description = "Player Analytics Plugin by Rsl1122", authors = {"Rsl1122"})
|
||||
public class PlanSponge extends SpongePlugin implements PlanPlugin {
|
||||
|
||||
@Inject
|
||||
@ -114,7 +114,7 @@ public class PlanSponge extends SpongePlugin implements PlanPlugin {
|
||||
|
||||
@Override
|
||||
public String getVersion() {
|
||||
return "4.4.0";
|
||||
return getClass().getAnnotation(Plugin.class).version();
|
||||
}
|
||||
|
||||
public SpongeSystem getSystem() {
|
||||
|
@ -24,7 +24,7 @@ public class TableContainer {
|
||||
protected final Formatter[] formatters;
|
||||
private List<Serializable[]> values;
|
||||
|
||||
private boolean jqueryDatatable;
|
||||
private String jqueryDatatable;
|
||||
|
||||
private String color;
|
||||
|
||||
@ -56,7 +56,7 @@ public class TableContainer {
|
||||
return getTableHeader() +
|
||||
parseHeader() +
|
||||
parseBody() +
|
||||
"</table>" + (jqueryDatatable ? "</div>" : "");
|
||||
"</table>" + (jqueryDatatable != null ? "</div>" : "");
|
||||
}
|
||||
|
||||
public final String parseBody() {
|
||||
@ -112,17 +112,28 @@ public class TableContainer {
|
||||
}
|
||||
|
||||
/**
|
||||
* Make use of JQuery Datatables plugin.
|
||||
* Make use of jQuery Data-tables plugin.
|
||||
* <p>
|
||||
* Use this with custom tables.
|
||||
* <p>
|
||||
* If this is called, result of {@code parseHtml()} should be wrapped with {@code Html.PANEL.parse(Html.PANEL_BODY.parse(result))}
|
||||
*/
|
||||
public void useJqueryDataTables() {
|
||||
this.jqueryDatatable = true;
|
||||
this.jqueryDatatable = "player-plugin-table";
|
||||
}
|
||||
|
||||
/**
|
||||
* Make use of jQuery Data-tables plugin.
|
||||
*
|
||||
* @param sortType "player-table" or "player-plugin-table"
|
||||
*/
|
||||
public void useJqueryDataTables(String sortType) {
|
||||
jqueryDatatable = sortType;
|
||||
}
|
||||
|
||||
private String getTableHeader() {
|
||||
if (jqueryDatatable) {
|
||||
return "<div class=\"table-responsive\">" + Html.TABLE_JQUERY.parse();
|
||||
if (jqueryDatatable != null) {
|
||||
return "<div class=\"table-responsive\">" + Html.TABLE_JQUERY.parse(jqueryDatatable);
|
||||
} else {
|
||||
return Html.TABLE_SCROLL.parse();
|
||||
}
|
||||
|
@ -52,7 +52,7 @@ public class PingMutator {
|
||||
int max = -1;
|
||||
for (Ping ping : pings) {
|
||||
Integer value = ping.getMax();
|
||||
if (value < 0) {
|
||||
if (value < 0 || 8000 < value) {
|
||||
continue;
|
||||
}
|
||||
if (value > max) {
|
||||
@ -67,7 +67,7 @@ public class PingMutator {
|
||||
int min = -1;
|
||||
for (Ping ping : pings) {
|
||||
Integer value = ping.getMin();
|
||||
if (value < 0) {
|
||||
if (value < 0 || 8000 < value) {
|
||||
continue;
|
||||
}
|
||||
if (value < min || min == -1) {
|
||||
@ -80,7 +80,7 @@ public class PingMutator {
|
||||
|
||||
public double average() {
|
||||
return pings.stream().mapToDouble(Ping::getAverage)
|
||||
.filter(value -> value >= 0)
|
||||
.filter(value -> value >= 0 && value <= 8000)
|
||||
.average().orElse(-1);
|
||||
}
|
||||
}
|
||||
|
@ -38,16 +38,22 @@ public class Processing implements SubSystem {
|
||||
|
||||
public static void submitNonCritical(Runnable runnable) {
|
||||
saveInstance(runnable);
|
||||
CompletableFuture.supplyAsync(() -> runnable, getInstance().nonCriticalExecutor)
|
||||
.thenAccept(Runnable::run)
|
||||
.handle(Processing::exceptionHandler);
|
||||
ExecutorService executor = getInstance().nonCriticalExecutor;
|
||||
if (executor.isShutdown()) {
|
||||
return;
|
||||
}
|
||||
CompletableFuture.supplyAsync(() -> {
|
||||
runnable.run();
|
||||
return true;
|
||||
}, executor).handle(Processing::exceptionHandler);
|
||||
}
|
||||
|
||||
public static void submitCritical(Runnable runnable) {
|
||||
saveInstance(runnable);
|
||||
CompletableFuture.supplyAsync(() -> runnable, getInstance().criticalExecutor)
|
||||
.thenAccept(Runnable::run)
|
||||
.handle(Processing::exceptionHandler);
|
||||
CompletableFuture.supplyAsync(() -> {
|
||||
runnable.run();
|
||||
return true;
|
||||
}, getInstance().criticalExecutor).handle(Processing::exceptionHandler);
|
||||
}
|
||||
|
||||
public static void submitNonCritical(Runnable... runnables) {
|
||||
@ -72,15 +78,17 @@ public class Processing implements SubSystem {
|
||||
|
||||
public static <T> Future<T> submitNonCritical(Callable<T> task) {
|
||||
saveInstance(task);
|
||||
return CompletableFuture.supplyAsync(() -> task, getInstance().nonCriticalExecutor)
|
||||
.thenApply(tCallable -> {
|
||||
try {
|
||||
return tCallable.call();
|
||||
} catch (Exception e) {
|
||||
throw new IllegalStateException(e);
|
||||
}
|
||||
})
|
||||
.handle(Processing::exceptionHandler);
|
||||
ExecutorService executor = getInstance().nonCriticalExecutor;
|
||||
if (executor.isShutdown()) {
|
||||
return null;
|
||||
}
|
||||
return CompletableFuture.supplyAsync(() -> {
|
||||
try {
|
||||
return task.call();
|
||||
} catch (Exception e) {
|
||||
throw new IllegalStateException(e);
|
||||
}
|
||||
}, getInstance().nonCriticalExecutor).handle(Processing::exceptionHandler);
|
||||
}
|
||||
|
||||
private static <T> T exceptionHandler(T t, Throwable throwable) {
|
||||
@ -92,15 +100,13 @@ public class Processing implements SubSystem {
|
||||
|
||||
public static <T> Future<T> submitCritical(Callable<T> task) {
|
||||
saveInstance(task);
|
||||
return CompletableFuture.supplyAsync(() -> task, getInstance().criticalExecutor)
|
||||
.thenApply(tCallable -> {
|
||||
try {
|
||||
return tCallable.call();
|
||||
} catch (Exception e) {
|
||||
throw new IllegalStateException(e);
|
||||
}
|
||||
})
|
||||
.handle(Processing::exceptionHandler);
|
||||
return CompletableFuture.supplyAsync(() -> {
|
||||
try {
|
||||
return task.call();
|
||||
} catch (Exception e) {
|
||||
throw new IllegalStateException(e);
|
||||
}
|
||||
}, getInstance().criticalExecutor).handle(Processing::exceptionHandler);
|
||||
}
|
||||
|
||||
public static Processing getInstance() {
|
||||
|
@ -27,6 +27,7 @@ import com.djrapitops.plan.data.store.objects.DateObj;
|
||||
import com.djrapitops.plan.system.processing.Processing;
|
||||
import com.djrapitops.plan.system.processing.processors.player.PingInsertProcessor;
|
||||
import com.djrapitops.plan.utilities.java.Reflection;
|
||||
import com.djrapitops.plugin.api.TimeAmount;
|
||||
import com.djrapitops.plugin.api.utility.log.Log;
|
||||
import com.djrapitops.plugin.task.AbsRunnable;
|
||||
import com.djrapitops.plugin.task.RunnableFactory;
|
||||
@ -106,6 +107,10 @@ public class PingCountTimer extends AbsRunnable implements Listener {
|
||||
Player player = Bukkit.getPlayer(uuid);
|
||||
if (player != null) {
|
||||
int ping = getPing(player);
|
||||
if (ping < -1 || ping > TimeAmount.SECOND.ms() * 8L) {
|
||||
// Don't accept bad values
|
||||
return;
|
||||
}
|
||||
history.add(new DateObj<>(time, ping));
|
||||
if (history.size() >= 30) {
|
||||
Processing.submit(new PingInsertProcessor(uuid, new ArrayList<>(history)));
|
||||
@ -155,7 +160,7 @@ public class PingCountTimer extends AbsRunnable implements Listener {
|
||||
addPlayer(player);
|
||||
}
|
||||
}
|
||||
}).runTaskLater(PING_INTERVAL * 2);
|
||||
}).runTaskLater(TimeAmount.SECOND.ticks() * 10L);
|
||||
}
|
||||
|
||||
@EventHandler
|
||||
|
@ -120,9 +120,12 @@ public class InspectPage implements Page {
|
||||
replacer.put("tableBodyIPs", new GeoInfoTable(player.getValue(PlayerKeys.GEO_INFO).orElse(new ArrayList<>())).parseBody());
|
||||
|
||||
PingMutator pingMutator = PingMutator.forContainer(player);
|
||||
replacer.put("avgPing", FormatUtils.cutDecimals(pingMutator.average()) + " ms");
|
||||
replacer.put("minPing", pingMutator.min() + " ms");
|
||||
replacer.put("maxPing", pingMutator.max() + " ms");
|
||||
double averagePing = pingMutator.average();
|
||||
int minPing = pingMutator.min();
|
||||
int maxPing = pingMutator.max();
|
||||
replacer.put("avgPing", averagePing != -1 ? FormatUtils.cutDecimals(averagePing) + " ms" : "Unavailable");
|
||||
replacer.put("minPing", minPing != -1 ? minPing + " ms" : "Unavailable");
|
||||
replacer.put("maxPing", maxPing != -1 ? maxPing + " ms" : "Unavailable");
|
||||
|
||||
List<Session> allSessions = player.getValue(PlayerKeys.SESSIONS).orElse(new ArrayList<>());
|
||||
SessionsMutator sessionsMutator = SessionsMutator.forContainer(player);
|
||||
|
@ -65,7 +65,7 @@ public enum Html {
|
||||
TABLE_END("</tbody></table>"),
|
||||
TABLE("<table class=\"table table-striped\">"),
|
||||
TABLE_SCROLL("<table class=\"table table-striped scrollbar\">"),
|
||||
TABLE_JQUERY("<table class=\"table table-bordered table-striped table-hover player-table dataTable\">"),
|
||||
TABLE_JQUERY("<table class=\"table table-bordered table-striped table-hover ${0} dataTable\">"),
|
||||
TABLE_COLORED("<table class=\"bg-${0} table table-striped\">"),
|
||||
TABLE_HEAD("<thead>${0}</thead>"),
|
||||
TABLE_BODY("<tbody>${0}</tbody>"),
|
||||
|
@ -39,7 +39,7 @@ public class PlayersTable extends TableContainer {
|
||||
);
|
||||
this.players = players;
|
||||
this.maxPlayers = maxPlayers;
|
||||
useJqueryDataTables();
|
||||
useJqueryDataTables("player-table");
|
||||
|
||||
setFormatter(2, Formatters.timeAmount());
|
||||
setFormatter(4, Formatters.yearLongValue());
|
||||
|
@ -32,7 +32,7 @@ public class PluginPlayersTable extends TableContainer {
|
||||
|
||||
this.players = players;
|
||||
|
||||
useJqueryDataTables();
|
||||
useJqueryDataTables("player-plugin-table");
|
||||
|
||||
if (players.isEmpty()) {
|
||||
addRow("No Players");
|
||||
@ -42,11 +42,6 @@ public class PluginPlayersTable extends TableContainer {
|
||||
}
|
||||
}
|
||||
|
||||
@Override
|
||||
public String parseHtml() {
|
||||
return super.parseHtml().replace("player-table", "player-plugin-table");
|
||||
}
|
||||
|
||||
private static String[] getHeaders(Set<String> columnNames) {
|
||||
List<String> header = new ArrayList<>(columnNames);
|
||||
Collections.sort(header);
|
||||
|
@ -1,4 +1,4 @@
|
||||
name: Plan
|
||||
author: Rsl1122
|
||||
main: com.djrapitops.plan.PlanBungee
|
||||
version: 4.4.0
|
||||
version: 4.4.1
|
@ -1,7 +1,7 @@
|
||||
name: Plan
|
||||
author: Rsl1122
|
||||
main: com.djrapitops.plan.Plan
|
||||
version: 4.4.0
|
||||
version: 4.4.1
|
||||
softdepend:
|
||||
- EssentialsX
|
||||
- Towny
|
||||
|
@ -864,7 +864,7 @@
|
||||
<!-- Plan laod script -->
|
||||
<script>
|
||||
$(function () {
|
||||
$('.player-table').DataTable({
|
||||
$('.player-plugin-table').DataTable({
|
||||
responsive: true
|
||||
});
|
||||
|
||||
|
@ -14,6 +14,7 @@ import com.palmergames.bukkit.towny.exceptions.TownyException;
|
||||
import com.palmergames.bukkit.towny.object.Coord;
|
||||
import com.palmergames.bukkit.towny.object.Resident;
|
||||
import com.palmergames.bukkit.towny.object.Town;
|
||||
import com.palmergames.bukkit.towny.object.TownBlock;
|
||||
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
@ -33,6 +34,8 @@ public class TownsAccordion extends AbstractAccordion {
|
||||
super("towny_accordion");
|
||||
this.towns = towns;
|
||||
this.playersMutator = playersMutator;
|
||||
|
||||
addElements();
|
||||
}
|
||||
|
||||
private void addElements() {
|
||||
@ -50,7 +53,8 @@ public class TownsAccordion extends AbstractAccordion {
|
||||
|
||||
List<Resident> residents = town.getResidents();
|
||||
int residentCount = residents.size();
|
||||
String landCount = town.getPurchasedBlocks() + " / " + town.getTotalBlocks();
|
||||
long claimedBlocks = town.getTownBlocks().stream().filter(TownBlock::hasTown).count();
|
||||
String landCount = claimedBlocks + " / " + town.getTotalBlocks();
|
||||
|
||||
Set<String> members = new HashSet<>();
|
||||
for (Resident resident : residents) {
|
||||
|
Loading…
Reference in New Issue
Block a user