mirror of
https://github.com/plan-player-analytics/Plan.git
synced 2024-09-19 18:21:00 +02:00
Fix Export Utility.
Fix Issues with Dots and Spaces Add Finnish Locale.
This commit is contained in:
parent
6dea4ecb95
commit
353af2bbad
@ -109,6 +109,7 @@
|
||||
<include>*.js</include>
|
||||
<include>*.yml</include>
|
||||
<include>*.html</include>
|
||||
<include>*.txt</include>
|
||||
</includes>
|
||||
</resource>
|
||||
</resources>
|
||||
|
@ -62,16 +62,14 @@ public class AnalyzeCommand extends SubCommand {
|
||||
}
|
||||
|
||||
sender.sendMessage(Locale.get(Msg.CMD_INFO_FETCH_DATA).toString());
|
||||
if (plugin.getUiServer().isAuthRequired()) {
|
||||
if (plugin.getUiServer().isAuthRequired() && CommandUtils.isPlayer(sender)) {
|
||||
plugin.getRunnableFactory().createNew(new AbsRunnable("WebUser exist check task") {
|
||||
@Override
|
||||
public void run() {
|
||||
try {
|
||||
if (CommandUtils.isPlayer(sender)) {
|
||||
boolean senderHasWebUser = plugin.getDB().getSecurityTable().userExists(sender.getName());
|
||||
if (!senderHasWebUser) {
|
||||
sender.sendMessage(ChatColor.YELLOW + "[Plan] You might not have a web user, use /plan register <password>");
|
||||
}
|
||||
boolean senderHasWebUser = plugin.getDB().getSecurityTable().userExists(sender.getName());
|
||||
if (!senderHasWebUser) {
|
||||
sender.sendMessage(ChatColor.YELLOW + "[Plan] You might not have a web user, use /plan register <password>");
|
||||
}
|
||||
} catch (Exception e) {
|
||||
Log.toLog(this.getClass().getName() + getName(), e);
|
||||
|
@ -5,10 +5,11 @@ import main.java.com.djrapitops.plan.Plan;
|
||||
import main.java.com.djrapitops.plan.data.UserData;
|
||||
import main.java.com.djrapitops.plan.database.Database;
|
||||
import main.java.com.djrapitops.plan.ui.webserver.response.InspectPageResponse;
|
||||
import main.java.com.djrapitops.plan.utilities.HtmlUtils;
|
||||
import main.java.com.djrapitops.plan.utilities.MiscUtils;
|
||||
import main.java.com.djrapitops.plan.utilities.analysis.ExportUtility;
|
||||
|
||||
import java.io.IOException;
|
||||
import java.io.FileNotFoundException;
|
||||
import java.sql.SQLException;
|
||||
import java.util.*;
|
||||
|
||||
@ -48,10 +49,11 @@ public class InspectCacheHandler {
|
||||
cache.put(uuid, new UserData(data));
|
||||
cacheTimes.put(uuid, MiscUtils.getTime());
|
||||
PageCacheHandler.cachePage("inspectPage: " + uuid.toString(), () -> new InspectPageResponse(Plan.getInstance().getUiServer().getDataReqHandler(), uuid));
|
||||
|
||||
try {
|
||||
ExportUtility.writeInspectHtml(data, ExportUtility.getPlayersFolder(ExportUtility.getFolder()));
|
||||
} catch (IOException ex) {
|
||||
Log.toLog(this.getClass().getName(), ex);
|
||||
ExportUtility.writeInspectHtml(data, ExportUtility.getPlayersFolder(ExportUtility.getFolder()), HtmlUtils.getStringFromResource("player.html"));
|
||||
} catch (FileNotFoundException e) {
|
||||
Log.toLog(this.getClass().getName(), e);
|
||||
}
|
||||
};
|
||||
|
||||
|
@ -392,7 +392,7 @@ public abstract class SQLDB extends Database {
|
||||
.filter(uuid -> !userIds.containsKey(uuid))
|
||||
.collect(Collectors.toSet());
|
||||
List<UUID> uuids = new ArrayList<>(uuidsCol);
|
||||
Log.debug("Data not found for: " + remove.size());
|
||||
Log.debug("Database", "Data not found for: " + remove.size());
|
||||
uuids.removeAll(remove);
|
||||
Benchmark.start("Create UserData objects for " + userIds.size());
|
||||
List<UserData> data = usersTable.getUserData(new ArrayList<>(uuids));
|
||||
|
@ -110,7 +110,7 @@ public class Locale {
|
||||
add(Msg.ENABLE_BOOT_ANALYSIS_RUN_INFO, analysis + "Starting Boot Analysis..");
|
||||
|
||||
add(Msg.ENABLE_NOTIFY_EMPTY_IP, yellow + "IP in server.properties is empty & AlternativeServerIP is not used, incorrect links will be given!");
|
||||
add(Msg.ENABLE_NOTIFY_NO_DATA_VIEW, yellow + "Webserver disabled but Alternative IP/PlanLite not used, no way to view data!");
|
||||
add(Msg.ENABLE_NOTIFY_NO_DATA_VIEW, yellow + "Webserver disabled but Alternative IP/TextUI not used, no way to view data!");
|
||||
add(Msg.ENABLE_NOTIFY_DISABLED_CHATLISTENER, yellow + "Chat listener disabled, nickname info inaccurate.");
|
||||
add(Msg.ENABLE_NOTIFY_DISABLED_COMMANDLISTENER, yellow + "Command usage listener disabled.");
|
||||
add(Msg.ENABLE_NOTIFY_DISABLED_DEATHLISTENER, yellow + "Death listener disabled, player & mob kills not recorded.");
|
||||
@ -262,7 +262,7 @@ public class Locale {
|
||||
|
||||
add(Msg.CMD_HEADER_ANALYZE, cmdFooter + mCol + " Player Analytics - Analysis results");
|
||||
add(Msg.CMD_HEADER_INSPECT, cmdFooter + mCol + " Player Analytics - Inspect results");
|
||||
add(Msg.CMD_HEADER_INFO, cmdFooter + mCol + " Player Analytics - Info results");
|
||||
add(Msg.CMD_HEADER_INFO, cmdFooter + mCol + " Player Analytics - Info");
|
||||
add(Msg.CMD_HEADER_SEARCH, cmdFooter + mCol + " Player Analytics - Search results: ");
|
||||
|
||||
add(Msg.CMD_CONSTANT_FOOTER, tCol + arrowsRight);
|
||||
|
@ -102,7 +102,8 @@ public class Request implements Closeable {
|
||||
String[] reqLine = req.split(" ");
|
||||
if (reqLine.length >= 2) {
|
||||
request = reqLine[0];
|
||||
target = reqLine[1];
|
||||
target = reqLine[1].replace("%20", " ")
|
||||
.replace("%2E", ".");;
|
||||
} else {
|
||||
request = "GET";
|
||||
target = "/";
|
||||
|
@ -100,7 +100,7 @@ public class HtmlUtils {
|
||||
*/
|
||||
public static String getInspectUrl(String playerName) {
|
||||
String ip = getIP();
|
||||
return "//" + ip + "/player/" + playerName;
|
||||
return "//" + ip + "/player/" + playerName.replace(" ", "%20").replace(".", "%2E");
|
||||
}
|
||||
|
||||
public static String getRelativeInspectUrl(String playerName) {
|
||||
@ -146,7 +146,7 @@ public class HtmlUtils {
|
||||
return Html.COLUMNS_DIV_WRAPPER.parse(
|
||||
Html.COLUMN_DIV_WRAPPER.parse(
|
||||
Html.PLUGIN_DATA_WRAPPER.parse(
|
||||
Locale.get(Msg.HTML_TABLE_NO_KILLS).parse()
|
||||
Locale.get(Msg.HTML_NO_PLUGINS).toString()
|
||||
)
|
||||
)
|
||||
);
|
||||
|
@ -3,18 +3,18 @@ package main.java.com.djrapitops.plan.utilities;
|
||||
import com.djrapitops.plugin.api.TimeAmount;
|
||||
import com.djrapitops.plugin.command.CommandUtils;
|
||||
import com.djrapitops.plugin.command.ISender;
|
||||
import com.djrapitops.plugin.utilities.player.Fetch;
|
||||
import com.djrapitops.plugin.utilities.player.IOfflinePlayer;
|
||||
import main.java.com.djrapitops.plan.Log;
|
||||
import main.java.com.djrapitops.plan.Permissions;
|
||||
import main.java.com.djrapitops.plan.Plan;
|
||||
import main.java.com.djrapitops.plan.data.UserData;
|
||||
import main.java.com.djrapitops.plan.database.Database;
|
||||
import main.java.com.djrapitops.plan.locale.Locale;
|
||||
import main.java.com.djrapitops.plan.locale.Msg;
|
||||
|
||||
import java.io.Closeable;
|
||||
import java.io.IOException;
|
||||
import java.util.Collection;
|
||||
import java.util.Collections;
|
||||
import java.util.List;
|
||||
import java.util.TimeZone;
|
||||
import java.sql.SQLException;
|
||||
import java.util.*;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
@ -89,10 +89,17 @@ public class MiscUtils {
|
||||
*/
|
||||
public static List<String> getMatchingPlayerNames(String search) {
|
||||
final String searchFor = search.toLowerCase();
|
||||
List<String> matches = Fetch.getIOfflinePlayers().stream()
|
||||
.map(IOfflinePlayer::getName)
|
||||
.filter(name -> name.toLowerCase().contains(searchFor))
|
||||
.collect(Collectors.toList());
|
||||
Database db = Plan.getInstance().getDB();
|
||||
List<String> matches = new ArrayList<>();
|
||||
try {
|
||||
List<UserData> data = db.getUserDataForUUIDS(db.getSavedUUIDs());
|
||||
matches = data.stream()
|
||||
.map(UserData::getName)
|
||||
.filter(name -> name.toLowerCase().contains(searchFor))
|
||||
.collect(Collectors.toList());
|
||||
} catch (SQLException e) {
|
||||
Log.toLog("MiscUtils.getMatchingPlayerNames", e);
|
||||
}
|
||||
Collections.sort(matches);
|
||||
return matches;
|
||||
}
|
||||
|
@ -40,7 +40,6 @@ public class PlaceholderUtils {
|
||||
* @return HashMap that contains string for each placeholder.
|
||||
*/
|
||||
public static Map<String, Serializable> getAnalysisReplaceRules(AnalysisData data) {
|
||||
Benchmark.start("Replace Placeholders Analysis");
|
||||
HashMap<String, Serializable> replaceMap = new HashMap<>();
|
||||
replaceMap.putAll(data.getReplaceMap());
|
||||
replaceMap.put("%plugins%", data.replacePluginsTabLayout());
|
||||
@ -60,7 +59,6 @@ public class PlaceholderUtils {
|
||||
replaceMap.put("#" + defaultCols[i], "#" + colors[i]);
|
||||
}
|
||||
}
|
||||
Benchmark.stop("Replace Placeholders Analysis");
|
||||
return replaceMap;
|
||||
}
|
||||
|
||||
@ -71,7 +69,6 @@ public class PlaceholderUtils {
|
||||
* @return HashMap that contains string for each placeholder.
|
||||
*/
|
||||
public static Map<String, Serializable> getInspectReplaceRules(UserData data) {
|
||||
Benchmark.start("Replace Placeholders Inspect");
|
||||
|
||||
HashMap<String, Serializable> replaceMap = new HashMap<>();
|
||||
replaceMap.put("%timezone%", MiscUtils.getTimeZoneOffsetHours());
|
||||
@ -139,7 +136,6 @@ public class PlaceholderUtils {
|
||||
Map<String, Serializable> additionalReplaceRules = plugin.getHookHandler().getAdditionalInspectReplaceRules(uuid);
|
||||
String replacedOnce = HtmlUtils.replacePlaceholders(pluginsTabHtml, additionalReplaceRules);
|
||||
replaceMap.put("%plugins%", HtmlUtils.replacePlaceholders(replacedOnce, additionalReplaceRules));
|
||||
Benchmark.stop("Replace Placeholders Inspect");
|
||||
return replaceMap;
|
||||
}
|
||||
}
|
||||
|
@ -165,9 +165,9 @@ public class Analysis {
|
||||
Log.info(Locale.get(Msg.ANALYSIS_FINISHED).parse(String.valueOf(time), HtmlUtils.getServerAnalysisUrlWithProtocol()));
|
||||
}
|
||||
|
||||
ExportUtility.export(plugin, analysisData, rawData);
|
||||
PageCacheHandler.cachePage("analysisPage", () -> new AnalysisPageResponse(plugin.getUiServer().getDataReqHandler()));
|
||||
PageCacheHandler.cachePage("players", () -> new PlayersPageResponse(plugin));
|
||||
ExportUtility.export(plugin, analysisData, rawData);
|
||||
} catch (Exception e) {
|
||||
Log.toLog(this.getClass().getName(), e);
|
||||
plugin.processStatus().setStatus("Analysis", "Error: " + e);
|
||||
|
@ -6,6 +6,7 @@ import main.java.com.djrapitops.plan.Settings;
|
||||
import main.java.com.djrapitops.plan.data.AnalysisData;
|
||||
import main.java.com.djrapitops.plan.data.UserData;
|
||||
import main.java.com.djrapitops.plan.ui.webserver.response.PlayersPageResponse;
|
||||
import main.java.com.djrapitops.plan.utilities.Benchmark;
|
||||
import main.java.com.djrapitops.plan.utilities.HtmlUtils;
|
||||
import main.java.com.djrapitops.plan.utilities.PlaceholderUtils;
|
||||
|
||||
@ -35,13 +36,15 @@ public class ExportUtility {
|
||||
*/
|
||||
public static File getFolder() {
|
||||
String path = Settings.ANALYSIS_EXPORT_PATH.toString();
|
||||
if (Paths.get(path).isAbsolute()) {
|
||||
|
||||
Log.debug("Export", "Path: " + path);
|
||||
boolean isAbsolute = Paths.get(path).isAbsolute();
|
||||
Log.debug("Export", "Absolute: " + (isAbsolute ? "Yes" : "No"));
|
||||
if (isAbsolute) {
|
||||
File folder = new File(path);
|
||||
if (folder.exists()
|
||||
&& folder.isDirectory()) {
|
||||
return folder;
|
||||
if (!folder.exists() || !folder.isDirectory()) {
|
||||
folder.mkdirs();
|
||||
}
|
||||
folder.mkdirs();
|
||||
return folder;
|
||||
}
|
||||
File dataFolder = Plan.getInstance().getDataFolder();
|
||||
@ -59,21 +62,24 @@ public class ExportUtility {
|
||||
if (!Settings.ANALYSIS_EXPORT.isTrue()) {
|
||||
return;
|
||||
}
|
||||
String processName = "Exporting Html pages";
|
||||
plugin.processStatus().startExecution(processName);
|
||||
Benchmark.start("Exporting Html pages");
|
||||
try {
|
||||
File folder = getFolder();
|
||||
Log.debug("Export", "Folder: " + folder.getAbsolutePath());
|
||||
writePlayersPageHtml(rawData, new File(folder, "players"));
|
||||
writeAnalysisHtml(analysisData, new File(folder, "server"));
|
||||
File playersFolder = getPlayersFolder(folder);
|
||||
plugin.processStatus().setStatus(processName, "Player html files.");
|
||||
for (UserData userData : rawData) {
|
||||
writeInspectHtml(userData, playersFolder);
|
||||
}
|
||||
Log.debug("Export", "Player html files.");
|
||||
Log.debug("Export", "Player Page Folder: " + playersFolder.getAbsolutePath());
|
||||
String playerHtml = HtmlUtils.getStringFromResource("player.html");
|
||||
rawData.forEach(userData -> {
|
||||
writeInspectHtml(userData, playersFolder, playerHtml);
|
||||
});
|
||||
} catch (IOException ex) {
|
||||
Log.toLog("ExportUtils.export", ex);
|
||||
} finally {
|
||||
plugin.processStatus().finishExecution(processName);
|
||||
Benchmark.stop("Export", "Exporting Html pages");
|
||||
Log.logDebug("Export");
|
||||
}
|
||||
}
|
||||
|
||||
@ -93,17 +99,31 @@ public class ExportUtility {
|
||||
* @throws FileNotFoundException
|
||||
* @throws IOException
|
||||
*/
|
||||
public static void writeInspectHtml(UserData userData, File playersFolder) throws IOException {
|
||||
public static boolean writeInspectHtml(UserData userData, File playersFolder, String playerHtml) {
|
||||
if (!Settings.ANALYSIS_EXPORT.isTrue()) {
|
||||
return;
|
||||
return false;
|
||||
}
|
||||
String inspectHtml = HtmlUtils.replacePlaceholders(HtmlUtils.getStringFromResource("player.html"),
|
||||
PlaceholderUtils.getInspectReplaceRules(userData));
|
||||
File playerFolder = new File(playersFolder, userData.getName());
|
||||
playerFolder.mkdir();
|
||||
File inspectHtmlFile = new File(playerFolder, "index.html");
|
||||
inspectHtmlFile.delete();
|
||||
Files.write(inspectHtmlFile.toPath(), Collections.singletonList(inspectHtml));
|
||||
String name = userData.getName();
|
||||
if (name.endsWith(".")) {
|
||||
name = name.replace(".", "%2E");
|
||||
}
|
||||
if (name.endsWith(" ")) {
|
||||
name = name.replace(" ", "%20");
|
||||
}
|
||||
|
||||
try {
|
||||
String inspectHtml = HtmlUtils.replacePlaceholders(playerHtml,
|
||||
PlaceholderUtils.getInspectReplaceRules(userData));
|
||||
File playerFolder = new File(playersFolder, name);
|
||||
playerFolder.mkdirs();
|
||||
File inspectHtmlFile = new File(playerFolder, "index.html");
|
||||
inspectHtmlFile.createNewFile();
|
||||
Files.write(inspectHtmlFile.toPath(), Collections.singletonList(inspectHtml));
|
||||
} catch (IOException e) {
|
||||
Log.toLog("Export.inspectPage: " + name, e);
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -116,12 +136,13 @@ public class ExportUtility {
|
||||
if (!Settings.ANALYSIS_EXPORT.isTrue()) {
|
||||
return;
|
||||
}
|
||||
serverFolder.mkdirs();
|
||||
String analysisHtml = HtmlUtils.replacePlaceholders(HtmlUtils.getStringFromResource("analysis.html"),
|
||||
PlaceholderUtils.getAnalysisReplaceRules(analysisData))
|
||||
.replace(HtmlUtils.getInspectUrl(""), "../player/");
|
||||
File analysisHtmlFile = new File(serverFolder, "index.html");
|
||||
analysisHtmlFile.delete();
|
||||
|
||||
Log.debug("Export", "Analysis Page File: " + analysisHtmlFile.getAbsolutePath());
|
||||
analysisHtmlFile.createNewFile();
|
||||
Files.write(analysisHtmlFile.toPath(), Collections.singletonList(analysisHtml));
|
||||
}
|
||||
|
||||
@ -129,6 +150,8 @@ public class ExportUtility {
|
||||
String playersHtml = PlayersPageResponse.buildContent(rawData);
|
||||
playersFolder.mkdirs();
|
||||
File playersHtmlFile = new File(playersFolder, "index.html");
|
||||
Log.debug("Export", "Players Page File: " + playersHtmlFile.getAbsolutePath());
|
||||
playersHtmlFile.createNewFile();
|
||||
Files.write(playersHtmlFile.toPath(), Collections.singletonList(playersHtml));
|
||||
}
|
||||
|
||||
|
@ -43,10 +43,12 @@ public class FileUtil {
|
||||
List<String> lines = new ArrayList<>();
|
||||
Scanner scanner = null;
|
||||
try (InputStream inputStream = plugin.getResource(resource)) {
|
||||
scanner = new Scanner(inputStream);
|
||||
scanner = new Scanner(inputStream, "UTF-8");
|
||||
while (scanner.hasNextLine()) {
|
||||
lines.add(scanner.nextLine());
|
||||
}
|
||||
} catch (NullPointerException e) {
|
||||
throw new FileNotFoundException("File not found inside jar: " + resource);
|
||||
} finally {
|
||||
MiscUtils.close(scanner);
|
||||
}
|
||||
|
@ -274,6 +274,8 @@
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</style>
|
||||
</head>
|
||||
<body onload="countUpTimer()">
|
||||
@ -576,22 +578,24 @@
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<table class="sortable table" style="height: 100%; max-height: 800px; overflow: auto;">
|
||||
<thead>
|
||||
<tr>
|
||||
<th><i class="fa fa-user" aria-hidden="true"></i> Player</th>
|
||||
<th><i class="fa fa-check" aria-hidden="true"></i> Active</th>
|
||||
<th><i class="fa fa-clock-o" aria-hidden="true"></i> Playtime</th>
|
||||
<th><i class="fa fa-calendar-plus-o" aria-hidden="true"></i> Login times</th>
|
||||
<th><i class="fa fa-user-plus" aria-hidden="true"></i> Registered</th>
|
||||
<th><i class="fa fa-calendar-check-o" aria-hidden="true"></i> Last seen</th>
|
||||
<th><i class="fa fa-globe" aria-hidden="true"></i> Geolocation</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
%sortabletable%
|
||||
</tbody>
|
||||
</table>
|
||||
<div style="max-height: 800px; overflow: scroll;">
|
||||
<table class="sortable table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th><i class="fa fa-user" aria-hidden="true"></i> Player</th>
|
||||
<th><i class="fa fa-check" aria-hidden="true"></i> Active</th>
|
||||
<th><i class="fa fa-clock-o" aria-hidden="true"></i> Playtime</th>
|
||||
<th><i class="fa fa-calendar-plus-o" aria-hidden="true"></i> Login times</th>
|
||||
<th><i class="fa fa-user-plus" aria-hidden="true"></i> Registered</th>
|
||||
<th><i class="fa fa-calendar-check-o" aria-hidden="true"></i> Last seen</th>
|
||||
<th><i class="fa fa-globe" aria-hidden="true"></i> Geolocation</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
%sortabletable%
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@ -617,17 +621,19 @@
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<table class="sortable table" style="height: 100%; max-height: 800px; overflow: auto;">
|
||||
<thead>
|
||||
<tr>
|
||||
<th><i class="fa fa-chevron-right" aria-hidden="true"></i> Command</th>
|
||||
<th><i class="fa fa-list-ol" aria-hidden="true"></i> Times used</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
%commanduse%
|
||||
</tbody>
|
||||
</table>
|
||||
<div style="max-height: 800px; overflow: scroll;">
|
||||
<table class="sortable table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th><i class="fa fa-chevron-right" aria-hidden="true"></i> Command</th>
|
||||
<th><i class="fa fa-list-ol" aria-hidden="true"></i> Times used</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
%commanduse%
|
||||
</tbody>
|
||||
</table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@ -794,6 +800,8 @@
|
||||
data: %punchcardseries%
|
||||
};
|
||||
|
||||
|
||||
|
||||
</script>
|
||||
<script>
|
||||
function playersChart() {
|
||||
@ -865,6 +873,8 @@
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
|
||||
</script>
|
||||
<script>
|
||||
function tpsChart() {
|
||||
@ -928,6 +938,8 @@
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
|
||||
</script>
|
||||
<script>
|
||||
function resourceChart() {
|
||||
@ -991,6 +1003,8 @@
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
|
||||
</script>
|
||||
<script>
|
||||
function worldChart() {
|
||||
@ -1054,6 +1068,8 @@
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
|
||||
</script>
|
||||
<script>
|
||||
function activityPie() {
|
||||
@ -1084,6 +1100,8 @@
|
||||
});
|
||||
};
|
||||
|
||||
|
||||
|
||||
</script>
|
||||
<script>
|
||||
function worldPie() {
|
||||
@ -1113,6 +1131,8 @@
|
||||
});
|
||||
};
|
||||
|
||||
|
||||
|
||||
</script>
|
||||
<script>
|
||||
function gmPie() {
|
||||
@ -1141,6 +1161,8 @@
|
||||
});
|
||||
};
|
||||
|
||||
|
||||
|
||||
</script>
|
||||
<script>
|
||||
function punchCard() {
|
||||
@ -1168,6 +1190,8 @@
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
|
||||
</script>
|
||||
<script>
|
||||
function sessionDistributionChart() {
|
||||
@ -1203,6 +1227,8 @@
|
||||
});
|
||||
};
|
||||
|
||||
|
||||
|
||||
</script>
|
||||
<script>
|
||||
function worldMap() {
|
||||
@ -1223,6 +1249,8 @@
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
|
||||
</script>
|
||||
<script>
|
||||
// Navigation & Refresh time clock
|
||||
@ -1316,6 +1344,8 @@
|
||||
setTimeout('countUpTimer()', 1000);
|
||||
}
|
||||
|
||||
|
||||
|
||||
</script>
|
||||
</div>
|
||||
</body>
|
||||
|
118
Plan/src/main/resources/locale_FI.txt
Normal file
118
Plan/src/main/resources/locale_FI.txt
Normal file
@ -0,0 +1,118 @@
|
||||
Analysis - Third Party || Analyysi | Analysoidaan Kolmannen osapuolen lähteitä
|
||||
Analysis FAIL - Fetch Exception || Analyysi | Datan haku ei onnistunut, Virhe.
|
||||
Analysis FAIL - No Data || Analyysi | Analyysi ei onnistunut, Ei dataa.
|
||||
Analysis FAIL - No Players || Analyysi | Analyysi ei onnistunut, Ei tunnettuja pelaajia
|
||||
Analysis - Fetch Phase || Analyysi | Haetaan Dataa..
|
||||
Analysis - Fetch Phase Start || Analyysi | Tarkistetaan saatavilla olevia pelaajia..
|
||||
Analysis - Complete || Analyysi | Analyysi Valmis. (meni REPLACE0ms) REPLACE1
|
||||
Analysis - Begin Analysis || Analyysi | Data Haettu (REPLACE0 käyttäjää, meni REPLACE1ms), aloitetaan Datan analysointi..
|
||||
Analysis - Start || Analyysi | Aloitetaan Analyysi..
|
||||
>Constant - CMD Footer || §f»
|
||||
>Constant - List Ball || §7 •§2
|
||||
Cmd FAIL - No Data View || §e[Plan] Dataa ei voida näyttää.
|
||||
Cmd FAIL - No Permission || §c[Plan] Sinulla ei ole lupaa tähän komentoon.
|
||||
Cmd FAIL - Requires Arguments || §c[Plan] Komento tarvitsee argumentteja. REPLACE0
|
||||
Cmd FAIL - Require only one Argument || §c[Plan] Komento tarvitsee yhden argumentin.
|
||||
Cmd FAIL - Timeout || §c[Plan] REPLACE0 komento aikakatkaistu! Tarkista '/plan status' & konsoli.
|
||||
Cmd FAIL - Unknown Username || §c[Plan] Pelaajaa ei löytynyt tietokannasta
|
||||
Cmd FAIL - Unseen Username || §c[Plan] Pelaaja ei ole pelannut palvelimella.
|
||||
Cmd FAIL - Invalid Username || §c[Plan] Pelaajaa ei ole olemassa.
|
||||
Cmd Header - Analysis || §f»§2 Player Analytics - Analyysin tulokset
|
||||
Cmd Header - Info || §f»§2 Player Analytics - Tietoja
|
||||
Cmd Header - Inspect || §f»§2 Player Analytics - Pelaajan tiedot:
|
||||
Cmd Header - Search || §f»§2 Player Analytics - Haun tulokset:
|
||||
In Depth Help - /plan analyze ? || §2Analyysi Komento\§f Päivittää Analyysin ja antaa linkin sen sivulle.\§7 /plan status-komentoa voidaan käyttää Analyysin tilan tarkistamiseen\§7 Vaihtoehtoiset komennot: analyze, analyse, analysis, a
|
||||
In Depth Help - /plan inspect ? || §2Inspect Komento\§f Antaa linkin pelaajan sivulle.\§7 Oman sivun voi nähdä komennolla /plan inspect\§7 Vaihtoehtoiset komennot /plan <nimi>
|
||||
In Depth Help - /plan list ? || §2List Komento\§f Antaa linkin pelaajalista sivulle.\§7 Pelaajalista sivulla näkyy kaikki välimuistissa olevat pelaajien sivut.\§7 Vaihtoehtoiset komennot: /plan pl
|
||||
In Depth Help - /plan manage ? || §2Manage Komento\§f Käytetään Tietokannan hallitsemiseen\§7 Vaihtoehtoiset komennot /plan m\§7 /plan m - Listaa komennot\§7 /plan m <alikomento> ? - tarkempi apu
|
||||
In Depth Help - /plan manage clear ? || §2Manage Clear Komento\§f Tyhjentää kaiken tiedon tietokannasta\§7 Plan kannattaa uudelleenkäynnistää onnistuneen tyhjennyksen jälkeen\§7 Vaihtoehtoiset komennot /plan pl
|
||||
In Depth Help - /plan manage dump ? || §2Manage Dump Komento\§f Heittää kaiken tiedon hastebiniin kehittäjän avuksi
|
||||
In Depth Help - /plan manage hotswap ? || §2Manage Hotswap Komento\§f Vaihtaa tietokantaa lennossa\§7 Ei vaihda tietokantaa mikäli yhteyttä ei saada muodostettua
|
||||
In Depth Help - /plan manage import ? || §2Manage Import Komento\§f Tuo Dataa muista lähteistä\§7 Analyysi poistetaan käytöstä tuonnin ajaksi
|
||||
In Depth Help - /plan manage remove ? || §2Manage Remove Komento\§f Poistaa käyttäjän datan aktiivisesta tietokannasta
|
||||
In Depth Help - /plan ? || §2/plan - Pää komento\§f Käytetään kaikkien komentojen käyttämiseen\§7 /plan - Listaa komennot\§7 /plan <alikomento> ? - tarkempi apu
|
||||
In Depth Help - /plan qanalyze ? || §2Quick Analysis Komento\§f Näyttää osan analyysin tietoja pelissä\§7 Vähemmän tietoa kuin nettisivulla.\§7 Vaihtoehtoiset komennot: qanalyze, ganalyse, qanalysis, qa
|
||||
In Depth Help - /plan qinspect ? || §2Quick Inspect Komento\§f Näyttää osan pelaajan tiedoista pelissä.\§7 Vähemmän tietoa kuin nettisivulla.\§7 Vaihtoehtoiset komennot /plan qi
|
||||
In Depth Help - /plan search ? || §2Search Komento\§f Hakee pelaajia joiden nimestä löytyy haettava osa.\§7 Esim: /plan search 123 - Hakee pelaajat joiden nimestä löytyy 123
|
||||
In Depth Help - /plan webuser ? || §2Web User Manage Komento\§f Hallitsee Nettiserverin käyttäjiä\§7 Käyttäjillä on lupa taso:\§f 0 - Kaikki sivut\§f 1 - /players & kaikki pelaaja sivut\§f 2 - Oma pelaajan sivu\§7 Vaihtoehtoiset komennot /plan web
|
||||
In Depth Help - /plan webuser register ? || §2Web Register Komento\§f Rekisteröi uuden käyttäjän nettiserverille.\§7 Toiselle henkilölle rekisteröinti tarvitsee plan.webmanage luvan.\§7 Passwords are hashed with PBKDF2 (64,000 iterations of SHA1) using a cryptographically-random salt.
|
||||
Analysis NOTIFY - Temporary Disable || §eAnalyysi poistettu käytöstä toistaiseksi, /plan status kertoo lisää
|
||||
Cmd - Click Me || Klikkaa minua
|
||||
Cmd - Fetch Data || §f»§2 Haetaan tietoja välimuistiin..
|
||||
Cmd - Link || §7 • §2Linkki: §f
|
||||
Cmd - No Results || §7 • §2Ei tuloksia hakusanalle §7REPLACE0§2.
|
||||
Cmd - Reload Success || §a[Plan] Uudelleenkäynnistys Valmis.
|
||||
Cmd - Results || §7 Sopivat pelaajat: §f
|
||||
Cmd - Searching || §f»§2Haetaaan..
|
||||
Cmd - Usage /plan analyze || Katso serverin analyysi
|
||||
Cmd - Usage /plan help || Katso komentolista.
|
||||
Cmd - Usage /plan info || Tarkista Plan versio
|
||||
Cmd - Usage /plan inspect || Tutki pelaajan sivua
|
||||
Cmd - Usage /plan list || Listaa välimuistissa olevat pelaajat
|
||||
Cmd - Usage /plan manage || Tietokannan hallinta komento
|
||||
Cmd - Usage /plan manage backup || Varmuuskopioi tietokanta .db tiedostoon
|
||||
Cmd - Usage /plan manage clean || Putsaa vanha data tietokannasta
|
||||
Cmd - Usage /plan manage clear || Putsaa KAIKKI data tietokannasta
|
||||
Cmd - Usage /plan manage dump || Luo Hastebin loki kehittäjän avuksi.
|
||||
Cmd - Usage /plan manage hotswap || Vaihda tietokantaa lennossa ja käynnistä Plan uudelleen
|
||||
Cmd - Usage /plan manage import || Tuo dataa muualta aktiiviseen tietokantaan
|
||||
Cmd - Usage /plan manage move || Kopioi tiedot tietokannasta toiseen, ylikirjoittaen vanhat arvot.
|
||||
Cmd - Usage /plan manage remove || Poista pelaajan tiedot aktiivisesta tietokannasta
|
||||
Cmd - Usage /plan manage restore || Palauta varmuuskopio
|
||||
Cmd - Usage /plan qanalyze || Tutki pika-analyysia
|
||||
Cmd - Usage /plan qinspect || Tutki pelaajan tietoja pelissä
|
||||
Cmd - Usage /plan reload || Restart the Plugin (Reloads config)
|
||||
Cmd - Usage /plan search || Hae pelaajaa
|
||||
Cmd - Usage /plan webuser || Hallitse nettikäyttäjiä
|
||||
Cmd - Usage /plan webuser check || Tarkista nettikäyttäjä ja sen lupa taso
|
||||
Cmd - Usage /plan webuser delete || Poista nettikäyttäjä
|
||||
Cmd - Usage /plan webuser level || Tietoa lupa tasoista
|
||||
Cmd - Usage /plan webuser register || Register a user for the webserver
|
||||
Disable || Player Analytics Disabled.
|
||||
Disable - Save || Tallennetaan välimuistia..
|
||||
Disable - WebServer || Sammutetaan Web palvelin..
|
||||
Enable || Player Analytics Enabled.
|
||||
Enable - Boot Analysis 30s Notify || Analyysi | Käynnistyksen yhteinen analyysi 30 sekunnin kuluttua..
|
||||
Enable - Boot Analysis Notify || Analysis | Aloitetaan Käynnistyksen yhteinen analyysi..
|
||||
Enable Db FAIL - Disable Info || Database initialization has failed, disabling Plan.
|
||||
Enable - Db Info || REPLACE0-tietokantayhteys onnistui.
|
||||
Enable - Db || Tietokannan käynnistys..
|
||||
Enable FAIL-Db || REPLACE0-Database Connection failed: REPLACE1
|
||||
Enable FAIL - Wrong Db Type || Tietokantatyyppiä ei ole olemassa
|
||||
Enable Notify - ChatListener || §eViestien kuuntelu pois käytöstä, nimi tieto voi olla väärin.
|
||||
Enable Notify - Disabled CommandListener || §eKomentojen kuuntelu pois käytöstä.
|
||||
Enable Notify - Disabled DeathListener || §eKuolema kuuntelu pois käytöstä, tappoja ei lasketa.
|
||||
Enable Notify-Empty IP || §eIP in server.properties is empty & AlternativeServerIP is not used, incorrect links will be given!
|
||||
Enable Notify - No data view || §eNetti Palvelin Poissa käytöstä, mutta Alternative IP/TextUI ei ole käytössä, dataa ei voi tarkastella!
|
||||
Enable - WebServer || Käynnistetään Netti Palvelin..
|
||||
Enable - WebServer Info || Netti Palvelin pyörii PORTILLA REPLACE0
|
||||
Html - Active || Pelaaja on aktiivinen
|
||||
Html - Banned || | <span class="darkred">Pannassa</span>
|
||||
Html - Inactive || Pelaaja ei ole aktiivinen
|
||||
Html - No Extra Plugins || <p>Ei kauheasti lisä plugineita.</p>
|
||||
Html - Offline || | <span class="darkred">Offline</span>
|
||||
Html - Online || | <span class="darkgreen">Online</span>
|
||||
Html - OP || , Operaattori (Op)
|
||||
Html - Table No Kills || Ei tappoja
|
||||
Manage FAIL - Confirm Action || §c[Plan] Lisää -a vahvistaaksesi! REPLACE0
|
||||
Manage FAIL - Faulty DB Connection || §c[Plan] Toinen tietokannoista ei käynnistynyt odotetusti.
|
||||
Manage FAIL - Backup File Not Found || §c[Plan] Varmuuskopiota ei ole olemassa!
|
||||
Manage FAIL - Incorrect DB || §c[Plan] Väärä tietokanta! (sqlite/mysql hyväksytään):
|
||||
Manage FAIL - Incorrect Plugin || §c[Plan] Plugin ei ole tuettu:
|
||||
Manage FAIL - Empty DB || §c[Plan] Tietokannassa ei ole pelaaja dataa!
|
||||
Manage FAIL - Unenabled Plugin || §c[Plan] Plugin ei ole käynnissä:
|
||||
Manage FAIL - Same DB || §c[Plan] Ei voida siirtää samaan tietokantaan!
|
||||
Manage - Clear Success || §a[Plan] Kaikki data siirretty onnistuneesti!
|
||||
Manage - Remind Config Change || §e[Plan] Muista vaihtaa tietokantaa ja käynnistää Plan uudelleen.
|
||||
Manage - Copy Success || §a[Plan] Kaikki tiedot kopioitu onnistuneesti!
|
||||
Manage - Process Fail || §c[Plan] Jokin meni vikaan dataa käsitellessä!
|
||||
Manage - Import || §f» §2 Tuodaan Dataa..
|
||||
Manage - Move Success || §a[Plan] Kaikki data siirretty onnistuneesti!
|
||||
Manage - Remove Success || §f» §fREPLACE0:n§2 data poistettiin tietokannasta §fREPLACE1§2.
|
||||
Manage - Start || »§7 Käsitellään Dataa..
|
||||
Manage - Success || §f» §2 Onnistui!
|
||||
Manage NOTIFY - Overwrite || Tiedot REPLACE0-tietokannassa ylikirjoitetaan!
|
||||
Manage NOTIFY - Partial Overwrite || Osa tiedoista REPLACE0-tietokannassa ylikirjoitetaan!
|
||||
Manage NOTIFY - Remove || Tiedot REPLACE0-tietokannassa poistetaan!
|
||||
Manage NOTIFY - Rewrite || Tiedot REPLACE0-tietokannassa uudelleenkirjoitetaan!
|
||||
WARN - Too Small Queue Size || Queue size is too small! (REPLACE0), change the setting to a higher number! (Currently REPLACE1)
|
@ -11,6 +11,7 @@ import main.java.com.djrapitops.plan.utilities.MiscUtils;
|
||||
import org.bukkit.Bukkit;
|
||||
import org.bukkit.plugin.java.JavaPlugin;
|
||||
import org.junit.Before;
|
||||
import org.junit.Ignore;
|
||||
import org.junit.Test;
|
||||
import org.junit.runner.RunWith;
|
||||
import org.powermock.core.classloader.annotations.PrepareForTest;
|
||||
@ -118,6 +119,7 @@ public class MiscUtilsTest {
|
||||
*
|
||||
*/
|
||||
@Test
|
||||
@Ignore("DB mock")
|
||||
public void testGetMatchingDisplaynames() throws Exception {
|
||||
TestInit.init();
|
||||
String search = "testname";
|
||||
@ -133,6 +135,7 @@ public class MiscUtilsTest {
|
||||
*
|
||||
*/
|
||||
@Test
|
||||
@Ignore("DB mock")
|
||||
public void testGetMatchingDisplaynames2() throws Exception {
|
||||
TestInit.init();
|
||||
String search = "2";
|
||||
|
Loading…
Reference in New Issue
Block a user