Release 2.0.0

- Added isOnline to player inspect.
- Added plan.ignore.commanduse permission

Fixed Bugs:
- Activity piechart now displayed correctly
- Activity Graph now drawn correctly
This commit is contained in:
Rsl1122 2017-01-16 21:32:30 +02:00
parent e8acdc678a
commit ec78b6a007
17 changed files with 97 additions and 119 deletions

View File

@ -1,11 +1,7 @@
package com.djrapitops.planlite.command.utils;
import com.djrapitops.planlite.PlanLite;
import java.io.File;
import java.net.URL;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Scanner;
import static org.bukkit.plugin.java.JavaPlugin.getPlugin;
@ -18,7 +14,7 @@ public class MiscUtils {
String[] cVersion;
String lineWithVersion;
try {
URL githubUrl = new URL("https://raw.githubusercontent.com/Rsl1122/Plan-PlayerAnalytics/master/src/plugin.yml");
URL githubUrl = new URL("https://raw.githubusercontent.com/Rsl1122/Plan-PlayerAnalytics/master/Plan%20Lite/src/plugin.yml");
lineWithVersion = "";
Scanner websiteScanner = new Scanner(githubUrl.openStream());
while (websiteScanner.hasNextLine()) {

View File

@ -13,10 +13,6 @@ import com.djrapitops.plan.data.listeners.*;
import main.java.com.djrapitops.plan.ui.webserver.WebSocketServer;
import org.bukkit.plugin.java.JavaPlugin;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.HashSet;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
@ -37,8 +33,6 @@ public class Plan extends JavaPlugin {
@Override
public void onEnable() {
logToFile("-- Server Start/Reload --");
getDataFolder().mkdirs();
databases = new HashSet<>();
@ -63,10 +57,7 @@ public class Plan extends JavaPlugin {
getConfig().options().copyDefaults(true);
getConfig().options().header("Plan Config\n"
+ "debug - Errors are saved in errorlog.txt when they occur\n"
+ "visible - Plugin's data is accessable with /plan inspect command"
);
getConfig().options().header("Plan Config | More info at https://www.spigotmc.org/wiki/plan-configuration/");
saveConfig();
@ -133,28 +124,6 @@ public class Plan extends JavaPlugin {
getLogger().severe(message);
}
public void logToFile(String message) {
if (getConfig().getBoolean("debug")) {
File folder = getDataFolder();
if (!folder.exists()) {
folder.mkdir();
}
File log = new File(getDataFolder(), "Debug.txt");
try {
if (!log.exists()) {
log.createNewFile();
}
FileWriter fw = new FileWriter(log, true);
try (PrintWriter pw = new PrintWriter(fw)) {
pw.println(message + "\n");
pw.flush();
}
} catch (IOException e) {
logError("Failed to create Debug.txt file");
}
}
}
public API getAPI() {
return api;
}

View File

@ -48,10 +48,9 @@ public class AnalyzeCommand extends SubCommand {
*/
@Override
public boolean onCommand(CommandSender sender, Command cmd, String commandLabel, String[] args) {
Date refresh = new Date();
if (!analysisCache.isCached()) {
analysisCache.updateCache();
} else if (new Date().getTime() - analysisCache.getData().getRefreshDate() > 60) {
} else if (new Date().getTime() - analysisCache.getData().getRefreshDate() > 60000) {
analysisCache.updateCache();
}
ChatColor oColor = Phrase.COLOR_MAIN.color();

View File

@ -101,8 +101,7 @@ public class InspectCommand extends SubCommand {
if (inspectCache.getCache().containsKey(uuid)) {
// Header
sender.sendMessage(hColor + Phrase.ARROWS_RIGHT.toString() + oColor
+ " Player Analytics - Inspect results: " + oColor + playerName
+ tColor + " | took " + oColor + FormatUtils.formatTimeAmountSinceDate(refreshDate, new Date()));
+ " Player Analytics - Inspect results: " + oColor + playerName);
// Link
String url = "http://" + (useAlternativeIP ? alternativeIP : plugin.getServer().getIp() + ":" + port)
+ "/player/" + playerName;

View File

@ -41,6 +41,7 @@ public class UserData {
private PlanLitePlayerData planLiteData;
private String name;
private boolean isOnline;
public UserData(Player player, DemographicsData demData, Database db) {
uuid = player.getUniqueId();
@ -64,6 +65,7 @@ public class UserData {
this.demData = demData;
isBanned = player.isBanned();
name = player.getName();
isOnline = player.isOnline();
}
public UserData(OfflinePlayer player, DemographicsData demData, Database db) {
@ -86,6 +88,7 @@ public class UserData {
this.demData = demData;
isBanned = player.isBanned();
name = player.getName();
isOnline = player.isOnline();
}
public void addIpAddress(InetAddress ip) {
@ -307,4 +310,10 @@ public class UserData {
public void setName(String name) {
this.name = name;
}
public boolean isOnline() {
return isOnline;
}
}

View File

@ -25,6 +25,9 @@ public class PlanCommandPreprocessListener implements Listener {
if (event.isCancelled()) {
return;
}
if (event.getPlayer().hasPermission("plan.ignore.commanduse")) {
return;
}
serverH.handleCommand(event.getMessage().split(" ")[0]);
}
}

View File

@ -423,12 +423,13 @@ public abstract class SQLDB extends Database {
while (set.next()) {
int newPlayers = set.getInt(serverdataColumnNewPlayers);
int playersOnline = set.getInt(serverdataColumnPlayersOnline);
rawServerData.put(set.getLong(serverdataColumnDate), new ServerData(commandUse, newPlayers, playersOnline));
rawServerData.put(new Date(set.getLong(serverdataColumnDate)).toInstant().getEpochSecond() * (long) 1000,
new ServerData(commandUse, newPlayers, playersOnline));
}
set.close();
statement.close();
} catch (SQLException e) {
plugin.logToFile("DATABASE-SQLDB-GetServerData\n" + e + "\n" + e.getCause());
e.printStackTrace();
}
return rawServerData;
}
@ -454,7 +455,7 @@ public abstract class SQLDB extends Database {
set.close();
statement.close();
} catch (SQLException e) {
plugin.logToFile("DATABASE-SQLDB-GetServerData\n" + e + "\n" + e.getCause());
e.printStackTrace();
}
return new ServerData(commandUse, newPlayers);
}
@ -463,7 +464,7 @@ public abstract class SQLDB extends Database {
public void saveServerData(ServerData data) {
try {
saveCommandUse(data.getCommandUsage());
long now = new Date().getTime();
long now = new Date().toInstant().getEpochSecond() * (long) 1000;
PreparedStatement statement = connection.prepareStatement("INSERT INTO " + serverdataName + " ("
+ serverdataColumnDate + ", "
+ serverdataColumnNewPlayers + ", "
@ -516,7 +517,7 @@ public abstract class SQLDB extends Database {
set.close();
statement.close();
} catch (SQLException e) {
plugin.logToFile("DATABASE-SQLDB\n" + e + "\n" + e.getCause());
e.printStackTrace();
}
return commandUse;
}
@ -554,7 +555,7 @@ public abstract class SQLDB extends Database {
statement.execute();
statement.close();
} catch (SQLException e) {
plugin.logToFile("DATABASE_SQLDB\n" + e + "\n" + e.getCause());
e.printStackTrace();
}
}
@ -632,12 +633,7 @@ public abstract class SQLDB extends Database {
saveGMTimes(userId, data.getGmTimes());
} catch (SQLException | NullPointerException e) {
e.printStackTrace();
plugin.logToFile("SQLDB-Save\n" + e
+ "\n" + data.getLastGamemode()
+ "\n" + Bukkit.getDefaultGameMode()
+ "\n" + wasSeenBefore(uuid)
);
e.printStackTrace();
}
data.setAccessing(false);
}

View File

@ -23,9 +23,9 @@ public class ActivityPieChartCreator {
int total = totalBanned + active + inactive;
int banPerc = (int) ((totalBanned / total) * 100);
int inacPerc = (int) ((inactive / total) * 100);
int actPerc = (int) ((active / total) * 100);
int banPerc = (int) ((totalBanned * 1.0 / total) * 100);
int inacPerc = (int) ((inactive * 1.0 / total) * 100);
int actPerc = (int) ((active * 1.0 / total) * 100);
while (banPerc + inacPerc + actPerc < 100) {
actPerc++;
}
@ -38,7 +38,7 @@ public class ActivityPieChartCreator {
Slice s4 = Slice.newSlice((int) (actPerc), Color.newColor("228B22"), "Active", "Active");
PieChart refChart = GCharts.newPieChart(s4, s3, s1);
refChart.setSize(500, 150);
refChart.setSize(400, 150);
refChart.setThreeD(true);
String refURL = refChart.toURLString();
return refURL;

View File

@ -59,7 +59,7 @@ public class GMTimesPieChartCreator {
Slice s4 = Slice.newSlice(three, Color.newColor("228B22"), "Spectator", "Spectator");
PieChart refChart = GCharts.newPieChart(s1, s2, s3, s4);
refChart.setSize(500, 150);
refChart.setSize(400, 150);
refChart.setThreeD(true);
String refURL = refChart.toURLString();
return refURL;

View File

@ -34,22 +34,37 @@ public class PlayerActivityGraphCreator {
Plan plugin = getPlugin(Plan.class);
int maxPlayers = plugin.getHandler().getMaxPlayers();
long now = new Date().getTime();
long now = new Date().toInstant().getEpochSecond() * (long) 1000;
long nowMinusScale = now - scale;
int i = 0;
for (long keyDate : rawServerData.keySet()) {
if (keyDate < nowMinusScale) {
continue;
}
Double scaledDateValue = ((keyDate - nowMinusScale) * 1.0 / scale) * 100;
ServerData serverData = rawServerData.get(keyDate);
Double scaledPlayerValue = (serverData.getPlayersOnline() * 1.0 / maxPlayers) * 100;
Double scaledNewPValue = (serverData.getNewPlayers() * 1.0 / maxPlayers) * 100;
xListDate.add(scaledDateValue);
pYList.add(scaledPlayerValue);
nYList.add(scaledNewPValue);
int lastPValue = 0;
int lastNValue = 0;
int lastSavedPValue = -1;
int lastSavedNValue = -1;
long lastSaveI = 0;
for (long i = nowMinusScale; i <= now; i += 1000) {
if (rawServerData.containsKey(i)) {
ServerData serverData = rawServerData.get(i);
lastPValue = serverData.getPlayersOnline();
lastNValue = serverData.getNewPlayers();
}
Double scaledDateValue = ((i - nowMinusScale) * 1.0 / scale) * 100;
Double scaledPlayerValue = (lastPValue * 1.0 / maxPlayers) * 100;
Double scaledNewPValue = (lastNValue * 1.0 / maxPlayers) * 100;
if (lastSavedPValue != lastPValue || lastSavedNValue != lastNValue || i-lastSaveI > (scale / (long) 50)) {
lastSaveI = i;
xListDate.add(scaledDateValue);
pYList.add((lastSavedPValue * 1.0 / maxPlayers) * 100);
nYList.add((lastSavedNValue * 1.0 / maxPlayers) * 100);
lastSavedPValue = lastPValue;
lastSavedNValue = lastNValue;
xListDate.add(scaledDateValue);
pYList.add(scaledPlayerValue);
nYList.add(scaledNewPValue);
}
}
// Date labels
for (long j = 0; j <= 8; j++) {
long scaleAddition = j * (scale / 8);

View File

@ -75,14 +75,14 @@ public class Analysis {
rawServerData = plugin.getDB().getServerDataHashMap();
plugin.log("Analysis | Data Fetched, beginning Analysis of data..");
AnalysisData data = new AnalysisData();
long scale = 2592000 * Long.valueOf("1000");
String playerActivityHtmlMonth = AnalysisUtils.createPlayerActivityGraph(rawServerData, scale);
long scaleMonth = (long) 2592000 * (long) 1000;
String playerActivityHtmlMonth = AnalysisUtils.createPlayerActivityGraph(rawServerData, scaleMonth);
data.setPlayersChartImgHtmlMonth(playerActivityHtmlMonth);
scale = 604800 * 1000;
String playerActivityHtmlWeek = AnalysisUtils.createPlayerActivityGraph(rawServerData, scale);
long scaleWeek = 604800 * 1000;
String playerActivityHtmlWeek = AnalysisUtils.createPlayerActivityGraph(rawServerData, scaleWeek);
data.setPlayersChartImgHtmlWeek(playerActivityHtmlWeek);
scale = 86400 * 1000;
String playerActivityHtmlDay = AnalysisUtils.createPlayerActivityGraph(rawServerData, scale);
long scaleDay = 86400 * 1000;
String playerActivityHtmlDay = AnalysisUtils.createPlayerActivityGraph(rawServerData, scaleDay);
data.setPlayersChartImgHtmlDay(playerActivityHtmlDay);
long gmZero = 0;
long gmOne = 0;
@ -175,7 +175,12 @@ public class Analysis {
for (int age : ages) {
totalAge += age;
}
double averageAge = totalAge * 1.0 / ages.size();
double averageAge;
if (ages.size() != 0) {
averageAge = totalAge * 1.0 / ages.size();
} else {
averageAge = -1;
}
data.setAverageAge(averageAge);
long gmTotal = gmZero + gmOne + gmTwo + gmThree;
HashMap<GameMode, Long> totalGmTimes = new HashMap<>();

View File

@ -67,8 +67,11 @@ public class AnalysisUtils {
replaceMap.put("%playtime%", FormatUtils.formatTimeAmount("" + data.getPlayTime()));
replaceMap.put("%banned%", data.isBanned() ? "Banned" : "Not Banned");
replaceMap.put("%op%", data.isOp() ? ", Operator (Op)" : "");
replaceMap.put("%isonline%", (data.isOnline()) ? "| Online":"| Offline");
PlanLiteHook hook = getPlugin(Plan.class).getPlanLiteHook();
replaceMap.put("%planlite%", hook.isEnabled() ? getPlanLitePlayerHtml(data.getPlanLiteData()) : "");
replaceMap.put("%inaccuratedatawarning%", (new Date().getTime()-data.getRegistered() < 180000)
? "<h3>Data might be inaccurate, player has just registered.</h3>" : "");
return replaceMap;
}
@ -93,12 +96,12 @@ public class AnalysisUtils {
replaceMap.put("%playerchartweek%", data.getPlayersChartImgHtmlWeek());
replaceMap.put("%playerchartday%", data.getPlayersChartImgHtmlDay());
replaceMap.put("%top50commands%", data.getTop50CommandsListHtml());
replaceMap.put("%avgage%", "" + data.getAverageAge());
replaceMap.put("%avgage%", (data.getAverageAge() != -1) ? "" + data.getAverageAge() : "Not Known");
replaceMap.put("%avgplaytime%", FormatUtils.formatTimeAmount("" + data.getAveragePlayTime()));
replaceMap.put("%totalplaytime%", FormatUtils.formatTimeAmount("" + data.getTotalPlayTime()));
replaceMap.put("%ops%", "" + data.getOps());
replaceMap.put("%refresh%", FormatUtils.formatTimeAmountSinceString("" + data.getRefreshDate(), new Date()));
replaceMap.put("%totallogins%", "" + data.getTotalLoginTimes());
replaceMap.put("%totallogins%", "" + data.getTotalLoginTimes());
PlanLiteHook hook = getPlugin(Plan.class).getPlanLiteHook();
replaceMap.put("%planlite%", hook.isEnabled() ? getPlanLiteAnalysisHtml(data.getPlanLiteData()) : "");
return replaceMap;
@ -107,6 +110,9 @@ public class AnalysisUtils {
static boolean isActive(long lastPlayed, long playTime, int loginTimes) {
Plan plugin = getPlugin(Plan.class);
int timeToActive = plugin.getConfig().getInt("Settings.Analysis.MinutesPlayedUntilConsidiredActive");
if (timeToActive < 0) {
timeToActive = 0;
}
long twoWeeks = 1209600000;
if (new Date().getTime() - lastPlayed < twoWeeks) {
if (loginTimes > 3) {

View File

@ -31,7 +31,7 @@ public class MiscUtils {
String cVersion;
String lineWithVersion;
try {
URL githubUrl = new URL("https://raw.githubusercontent.com/Rsl1122/Plan-PlayerAnalytics/master/src/plugin.yml");
URL githubUrl = new URL("https://raw.githubusercontent.com/Rsl1122/Plan-PlayerAnalytics/master/Plan/src/main/resources/plugin.yml");
lineWithVersion = "";
Scanner websiteScanner = new Scanner(githubUrl.openStream());
while (websiteScanner.hasNextLine()) {
@ -51,7 +51,7 @@ public class MiscUtils {
return "You're running the latest version";
}
} catch (Exception e) {
plugin.logToFile("Failed to compare versions.\n" + e);
plugin.logError("Failed to compare versions.");
}
return "Failed to get newest version number.";
}
@ -60,12 +60,12 @@ public class MiscUtils {
String playerName = "";
Plan plugin = getPlugin(Plan.class);
if (args.length > 0) {
if ((args[0].equals("-a")) || (args[0].equals("-r"))) {
playerName = "ArgumentGivenError";
plugin.log("No username given, returned empty username.");
plugin.logToFile(Phrase.ERROR_NO_USERNAME + args[0]);
} else if (sender.hasPermission("plan.inspect.other") || !(sender instanceof Player)) {
if (sender.hasPermission("plan.inspect.other")
|| !(sender instanceof Player)
|| args[0].toLowerCase().equals(sender.getName().toLowerCase())) {
playerName = args[0];
} else {
sender.sendMessage(Phrase.COMMAND_NO_PERMISSION.toString());
}
} else {
try {

View File

@ -36,7 +36,7 @@
<p>%activitytotal% players have played on this server.</p>
<p>A Total of %totalplaytime% has been played with the average of %avgplaytime%</p>
<p>Players have joined %totallogins% times.</p>
<p>The average age of known players is %avgage%.</p>
<p>The average of known player ages is %avgage%.</p>
<br/><h4>Playerbase composition</h4>
%activitypiechart%
<p>Active %active% | Inactive %inactive% | Banned %banned% | Total Players: %activitytotal%</p>

View File

@ -1,5 +1,3 @@
debug: true
Settings:
Analysis:
MinutesPlayedUntilConsidiredActive: 10
@ -16,23 +14,10 @@ Settings:
ShowAlternativeServerIP: false
AlternativeIP: your.ip.here:%port%
PlanLite:
Enabled: false
Enabled: true
database:
type: sqlite
enabledData:
planLite:
pluginEnabled: true
towny: true
factions: true
achievements: true
votes: true
economy: true
essentials:
ruleBreaking: true

View File

@ -18,13 +18,14 @@
<h1 style="text-decoration: underline;">Plan | Inspect Player %name%</h1>
<h4>UUID: %uuid%</h4>
<h4>Registered: %registered% %banned%%op%</h4>
%inaccuratedatawarning%
<table>
<tr>
<td style="margin-left: 3px; margin-right: auto;
border-style: groove; border-width: 3px; border-radius: 12px; padding: 2px 4px 2px 3px;
box-shadow: 5px 5px 4px 0px #888888;">
<h4>Information</h4>
<p>Last seen: %lastseen% %active%</p>
<p>Last seen: %lastseen% %active% %isonline%</p>
<p>Nicknames: %nicknames% | Has connected from ips: %ips%</p>
<p>Geolocation: %geoloc%</p>
<p>Playtime: %playtime%</p>

View File

@ -35,42 +35,37 @@ permissions:
default: true
plan.inspect.other:
description: Allows you to check other players' player data.
default: true
default: op
plan.analyze:
description: Allows you to check analysed data about all players.
default: true
plan.analyze.refresh:
description: Allows you to refresh the analyse result with -r argument
default: op
plan.reload:
description: Allows to reload plugin config
default: true
default: op
plan.search:
description: Allows search
default: true
default: op
plan.info:
description: Allows to view info
default: true
plan.debug:
description: Allows debug command
default: op
plan.ignore.commanduse:
description: Commands used by this player are not saved
default: false
plan.basic:
children:
plan.?: true
plan.inspect: true
plan.info: true
plan.search: true
plan.inspect: true
plan.advanced:
childer:
plan.basic: true
plan.info: true
plan.analyze: true
plan.staff:
children:
plan.debug: true
plan.search: true
plan.advanced: true
plan.inspect.other: true
plan.analyze.refresh: true
plan.reload: true
plan.*:
children: