mirror of
https://github.com/plan-player-analytics/Plan.git
synced 2025-02-01 21:11:23 +01:00
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:
parent
e8acdc678a
commit
ec78b6a007
@ -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()) {
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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();
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
@ -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]);
|
||||
}
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
|
@ -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);
|
||||
|
@ -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<>();
|
||||
|
@ -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) {
|
||||
|
@ -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 {
|
||||
|
@ -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>
|
||||
|
@ -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
|
||||
|
||||
|
||||
|
||||
|
@ -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>
|
||||
|
@ -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:
|
||||
|
Loading…
Reference in New Issue
Block a user