WorldPie Creator, removed some useless things & Todo markings

This commit is contained in:
Rsl1122 2017-08-29 20:10:08 +03:00
parent a2d7e6a3b2
commit 75843e16ed
14 changed files with 131 additions and 151 deletions

View File

@ -43,7 +43,6 @@ import main.java.com.djrapitops.plan.systems.info.server.ServerInfoManager;
import main.java.com.djrapitops.plan.systems.listeners.*;
import main.java.com.djrapitops.plan.systems.processing.Processor;
import main.java.com.djrapitops.plan.systems.queue.ProcessingQueue;
import main.java.com.djrapitops.plan.systems.tasks.PeriodicDBCommitTask;
import main.java.com.djrapitops.plan.systems.tasks.TPSCountTimer;
import main.java.com.djrapitops.plan.systems.webserver.PageCache;
import main.java.com.djrapitops.plan.systems.webserver.WebServer;
@ -214,10 +213,7 @@ public class Plan extends BukkitPlugin<Plan> implements IPlan {
Benchmark.start("Task Registration");
tpsCountTimer = new TPSCountTimer(this);
long period = TimeAmount.MINUTE.ticks() * 5L;
runnableFactory.createNew(tpsCountTimer).runTaskTimer(1000, TimeAmount.SECOND.ticks());
runnableFactory.createNew(new PeriodicDBCommitTask(this)).runTaskTimerAsynchronously(period, period);
// Analysis refresh settings
int analysisRefreshMinutes = Settings.ANALYSIS_AUTO_REFRESH.getNumber();
boolean analysisRefreshTaskIsEnabled = analysisRefreshMinutes > 0;

View File

@ -2,13 +2,14 @@ package main.java.com.djrapitops.plan.database;
import main.java.com.djrapitops.plan.api.IPlan;
import main.java.com.djrapitops.plan.api.exceptions.DatabaseInitException;
import main.java.com.djrapitops.plan.data.UserInfo;
import main.java.com.djrapitops.plan.database.tables.*;
import org.apache.commons.dbcp2.BasicDataSource;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.*;
import java.util.Map;
import java.util.Set;
import java.util.UUID;
/**
* Abstract class representing a Database.
@ -124,17 +125,6 @@ public abstract class Database {
public void init() throws DatabaseInitException {
}
/**
* Used to get all UserInfo for multiple UUIDs.
* <p>
* Should only be called from async thread.
*
* @param uuids UUIDs to fetch data for.
* @return Data for matching UUIDs.
* @throws SQLException If database error occurs.
*/
public abstract List<UserInfo> getUserDataForUUIDS(Collection<UUID> uuids) throws SQLException;
/**
* Check if the user is saved in the database.
*

View File

@ -3,7 +3,6 @@ package main.java.com.djrapitops.plan.database.databases;
import main.java.com.djrapitops.plan.Log;
import main.java.com.djrapitops.plan.api.IPlan;
import main.java.com.djrapitops.plan.api.exceptions.DatabaseInitException;
import main.java.com.djrapitops.plan.data.UserInfo;
import main.java.com.djrapitops.plan.database.Database;
import main.java.com.djrapitops.plan.database.tables.*;
import main.java.com.djrapitops.plan.utilities.Benchmark;
@ -11,9 +10,6 @@ import org.apache.commons.dbcp2.BasicDataSource;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.UUID;
/**
@ -263,16 +259,6 @@ public abstract class SQLDB extends Database {
}
}
@Override
public List<UserInfo> getUserDataForUUIDS(Collection<UUID> uuidsCol) throws SQLException {
if (uuidsCol == null || uuidsCol.isEmpty()) {
return new ArrayList<>();
}
// TODO REWRITE
return new ArrayList<>();
}
private void setStatus(String status) {
Log.debug("Database", status);
}

View File

@ -16,8 +16,6 @@ import java.util.*;
*/
public class IPsTable extends UserIDTable {
// TODO Write tests
private final String columnIP = "ip";
private final String columnGeolocation = "geolocation";

View File

@ -147,6 +147,4 @@ public class KillsTable extends UserIDTable {
close(set, statement);
}
}
// TODO getPlayerKills (UUID)
}

View File

@ -20,8 +20,6 @@ import java.util.stream.Collectors;
*/
public class SessionsTable extends UserIDTable {
// TODO getLastPlayed(UUID, UUID)
private final String columnID = "id";
private final String columnSessionStart = "session_start";
private final String columnSessionEnd = "session_end";

View File

@ -21,13 +21,14 @@ import java.util.List;
import java.util.UUID;
/**
* //TODO Class Javadoc Comment
* Server Specific user information table.
*
* Represents plan_user_info.
*
* @author Rsl1122
*/
public class UserInfoTable extends UserIDTable {
//TODO Server Specific Table
private final String columnRegistered = "registered";
private final String columnOP = "opped";
private final String columnBanned = "banned";

View File

@ -4,7 +4,6 @@ import com.djrapitops.plugin.utilities.player.Fetch;
import main.java.com.djrapitops.plan.Plan;
import main.java.com.djrapitops.plan.data.Session;
import main.java.com.djrapitops.plan.systems.cache.DataCache;
import main.java.com.djrapitops.plan.systems.processing.DBCommitProcessor;
import main.java.com.djrapitops.plan.systems.processing.player.*;
import main.java.com.djrapitops.plan.utilities.MiscUtils;
import org.bukkit.entity.Player;
@ -98,8 +97,7 @@ public class PlanPlayerListener implements Listener {
plugin.addToProcessQueue(
new RegisterProcessor(uuid, player.getFirstPlayed(), time, playerName, playersOnline),
new IPUpdateProcessor(uuid, ip),
new NameProcessor(uuid, playerName, displayName),
new DBCommitProcessor(plugin.getDB())
new NameProcessor(uuid, playerName, displayName)
);
}

View File

@ -1,5 +1,9 @@
package main.java.com.djrapitops.plan.systems.processing.player;
import main.java.com.djrapitops.plan.Plan;
import main.java.com.djrapitops.plan.data.Session;
import java.util.Optional;
import java.util.UUID;
/**
@ -22,6 +26,7 @@ public class DeathProcessor extends PlayerProcessor {
@Override
public void process() {
UUID uuid = getUUID();
// TODO DB Update Deaths +1
Optional<Session> cachedSession = Plan.getInstance().getDataCache().getCachedSession(uuid);
cachedSession.ifPresent(Session::died);
}
}

View File

@ -1,35 +0,0 @@
/*
* Licence is provided in the jar as license.yml also here:
* https://github.com/Rsl1122/Plan-PlayerAnalytics/blob/master/Plan/src/main/resources/license.yml
*/
package main.java.com.djrapitops.plan.systems.tasks;
import com.djrapitops.plugin.task.AbsRunnable;
import main.java.com.djrapitops.plan.Plan;
import main.java.com.djrapitops.plan.database.Database;
import main.java.com.djrapitops.plan.systems.processing.DBCommitProcessor;
/**
* Periodically commits changes to the SQLite Database.
*
* @author Rsl1122
*/
public class PeriodicDBCommitTask extends AbsRunnable {
private Plan plugin;
public PeriodicDBCommitTask(Plan plugin) {
super("PeriodicDBCommitTask");
this.plugin = plugin;
}
@Override
public void run() {
Database db = plugin.getDB();
if ("mysql".equals(db.getConfigName())) {
this.cancel();
return;
}
plugin.addToProcessQueue(new DBCommitProcessor(db));
}
}

View File

@ -1,34 +1,88 @@
package main.java.com.djrapitops.plan.utilities.html.graphs;
import main.java.com.djrapitops.plan.data.time.GMTimes;
import main.java.com.djrapitops.plan.data.time.WorldTimes;
import java.util.Map;
import java.util.stream.Collectors;
public class WorldPieCreator {
private WorldPieCreator() {
throw new IllegalStateException("Utility Class");
}
public static String createSeriesData(WorldTimes worldTimes) {
// TODO Rewrite WorldPie
// StringBuilder arrayBuilder = new StringBuilder("[");
// int i = 0;
// int size = worldTimes.size();
// for (Map.Entry<String, Long> world : worldTimes.entrySet()) {
// arrayBuilder.append("{name:'").append(world.getKey())
// .append("',y:").append(world.getValue());
//
// if (i == 1) {
// arrayBuilder.append(", sliced: true, selected: true");
// }
//
// arrayBuilder.append("}");
// if (i < size - 1) {
// arrayBuilder.append(",");
// }
// i++;
// }
// arrayBuilder.append("]");
// return arrayBuilder.toString();
return "[]";
/**
* Used to create HighCharts series string for series & drilldown.
*
* @param worldTimes WorldTimes object.
* @return String array, index 0: Series data, 1: drilldown data
*/
public static String[] createSeriesData(WorldTimes worldTimes) {
StringBuilder seriesBuilder = new StringBuilder("[");
int i = 0;
Map<String, Long> playtimePerWorld = worldTimes.getWorldTimes().entrySet().stream()
.collect(Collectors.toMap(Map.Entry::getKey, entry -> entry.getValue().getTotal()));
int size = playtimePerWorld.size();
for (Map.Entry<String, Long> world : playtimePerWorld.entrySet()) {
seriesBuilder.append("{name:'").append(world.getKey())
.append("',y:").append(world.getValue());
seriesBuilder.append("}");
if (i < size - 1) {
seriesBuilder.append(",");
}
i++;
}
seriesBuilder.append("]");
String seriesData = seriesBuilder.toString();
String drilldownData = createDrilldownData(worldTimes);
return new String[]{seriesData, drilldownData};
}
private static String createDrilldownData(WorldTimes worldTimes) {
StringBuilder drilldownBuilder = new StringBuilder("[");
int i = 0;
Map<String, GMTimes> gmTimesMap = worldTimes.getWorldTimes();
int size = gmTimesMap.size();
for (Map.Entry<String, GMTimes> world : gmTimesMap.entrySet()) {
drilldownBuilder.append("{name:'").append(world.getKey())
.append("', id:'").append(world.getKey())
.append("',");
drilldownBuilder.append("data: [");
appendGMTimesForWorld(drilldownBuilder, world);
if (i < size - 1) {
drilldownBuilder.append(",");
}
i++;
}
drilldownBuilder.append("]");
return drilldownBuilder.toString();
}
private static void appendGMTimesForWorld(StringBuilder drilldownBuilder, Map.Entry<String, GMTimes> world) {
Map<String, Long> gmTimes = world.getValue().getTimes();
int smallSize = gmTimes.size();
int j = 0;
for (Map.Entry<String, Long> entry : gmTimes.entrySet()) {
drilldownBuilder.append("['")
.append(entry.getKey())
.append("',")
.append(entry.getValue())
.append("]");
if (j < smallSize - 1) {
drilldownBuilder.append(",");
}
j++;
}
drilldownBuilder.append("]}");
}
}

View File

@ -1,4 +1,4 @@
function worldPie(id, worldSeries, worldTotal) {
function worldPie(id, worldSeries, gmSeries) {
Highcharts.chart(id, {
chart: {
plotBackgroundColor: null,
@ -6,20 +6,52 @@ function worldPie(id, worldSeries, worldTotal) {
plotShadow: false,
type: 'pie'
},
subtitle: {text: worldTotal},
tooltip: {
pointFormat: '{series.name}: <b>{point.percentage:.2f}%</b>'
title: {text: ''},
subtitle: {
text: 'Click the slices to view used GameMode'
},
plotOptions: {
pie: {
allowPointSelect: true,
cursor: 'pointer',
dataLabels: {
enabled: false
},
showInLegend: true
allowPointSelect: true,
cursor: 'pointer',
dataLabels: {
enabled: false
},
showInLegend: true
}
},
tooltip: {
formatter: function() {
return '<b>'+this.point.name+':</b> ' + formatTimeAmount(this.y) + '<br>('+this.percentage.toFixed(2)+'%)';
}
},
series: [worldSeries]
drilldown: {series: [gmSeries]}
});
}
function formatTimeAmount(ms) {
var out = "";
var seconds = Math.floor(ms / 1000);
var dd = Math.floor(seconds / 86400);
seconds -= (dd * 86400);
var dh = Math.floor(seconds / 3600);
seconds -= (dh * 3600);
var dm = Math.floor(seconds / 60);
seconds -= (dm * 60);
seconds = Math.floor(seconds);
if (dd !== 0) {
out += dd.toString() + "d ";
}
if (dh !== 0) {
out += dh.toString() + "h ";
}
if (dm !== 0) {
out += dm.toString() + "m ";
}
out += seconds.toString() + "s ";
return out;
}

View File

@ -160,6 +160,4 @@ public class WorldTimesTest {
assertEquals(2000L, worldTwoGMTimes.getTime("CREATIVE"));
assertEquals(2000L, worldOneGMTimes.getTime("ADVENTURE"));
}
// TODO Test where Session is ended, check if worldTimes & session length add up.
}

View File

@ -1,39 +0,0 @@
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package test.java.main.java.com.djrapitops.plan.utilities;
import org.bukkit.plugin.java.JavaPlugin;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
/**
* @author Rsl1122
*/
@RunWith(PowerMockRunner.class)
@PrepareForTest(JavaPlugin.class)
public class NewPlayerCreatorTest {
public NewPlayerCreatorTest() {
}
@Before
public void setUp() throws Exception {
}
@After
public void tearDown() {
}
@Test
public void test() {
// TODO Rewrite
}
}