diff --git a/Plan/src/main/java/com/djrapitops/plan/command/commands/ManageCommand.java b/Plan/src/main/java/com/djrapitops/plan/command/commands/ManageCommand.java index 3ca20ae3c..ae8421dd6 100644 --- a/Plan/src/main/java/com/djrapitops/plan/command/commands/ManageCommand.java +++ b/Plan/src/main/java/com/djrapitops/plan/command/commands/ManageCommand.java @@ -24,7 +24,7 @@ public class ManageCommand extends TreeCommand { * @param plugin Current instance of Plan */ public ManageCommand(Plan plugin) { - super(plugin, "manage,m", CommandType.CONSOLE, Permissions.MANAGE.getPermission(), Locale.get(Msg.CMD_USG_MANAGE) + "", "plan m"); + super(plugin, "manage,m", CommandType.CONSOLE, Permissions.MANAGE.getPermission(), Locale.get(Msg.CMD_USG_MANAGE).toString(), "plan m"); } diff --git a/Plan/src/main/java/com/djrapitops/plan/command/commands/manage/ManageDumpCommand.java b/Plan/src/main/java/com/djrapitops/plan/command/commands/manage/ManageDumpCommand.java index 9d8ca7382..a51d4e801 100644 --- a/Plan/src/main/java/com/djrapitops/plan/command/commands/manage/ManageDumpCommand.java +++ b/Plan/src/main/java/com/djrapitops/plan/command/commands/manage/ManageDumpCommand.java @@ -50,8 +50,12 @@ public class ManageDumpCommand extends SubCommand { plugin.getRunnableFactory().createNew(new AbsRunnable("DumpTask") { @Override public void run() { - sender.sendLink("Link to the Dump", DumpUtils.dump(plugin)); - sender.sendLink("Report Issues here", "https://github.com/Rsl1122/Plan-PlayerAnalytics/issues/new"); + try { + sender.sendLink("Link to the Dump", DumpUtils.dump(plugin)); + sender.sendLink("Report Issues here", "https://github.com/Rsl1122/Plan-PlayerAnalytics/issues/new"); + } finally { + this.cancel(); + } } }).runTaskAsynchronously(); } diff --git a/Plan/src/main/java/com/djrapitops/plan/data/cache/queue/DataCacheClearQueue.java b/Plan/src/main/java/com/djrapitops/plan/data/cache/queue/DataCacheClearQueue.java index c2b12d70f..9535946cf 100644 --- a/Plan/src/main/java/com/djrapitops/plan/data/cache/queue/DataCacheClearQueue.java +++ b/Plan/src/main/java/com/djrapitops/plan/data/cache/queue/DataCacheClearQueue.java @@ -27,7 +27,7 @@ public class DataCacheClearQueue extends Queue { * @param handler current instance of DataCacheHandler. */ public DataCacheClearQueue(DataCacheHandler handler) { - super(new ArrayBlockingQueue(Settings.PROCESS_CLEAR_LIMIT.getNumber())); + super(new ArrayBlockingQueue<>(Settings.PROCESS_CLEAR_LIMIT.getNumber())); setup = new ClearSetup(queue, handler); setup.go(); } @@ -63,7 +63,7 @@ class ClearConsumer extends Consumer implements Runnable { private DataCacheHandler handler; - ClearConsumer(BlockingQueue q, DataCacheHandler handler) { + ClearConsumer(BlockingQueue q, DataCacheHandler handler) { super(q, "ClearQueueConsumer"); this.handler = handler; } @@ -95,7 +95,7 @@ class ClearConsumer extends Consumer implements Runnable { class ClearSetup extends Setup { - public ClearSetup(BlockingQueue q, DataCacheHandler handler) { + ClearSetup(BlockingQueue q, DataCacheHandler handler) { super(new ClearConsumer(q, handler)); } } diff --git a/Plan/src/main/java/com/djrapitops/plan/data/cache/queue/DataCacheGetQueue.java b/Plan/src/main/java/com/djrapitops/plan/data/cache/queue/DataCacheGetQueue.java index af785dda2..4d4d35b4c 100644 --- a/Plan/src/main/java/com/djrapitops/plan/data/cache/queue/DataCacheGetQueue.java +++ b/Plan/src/main/java/com/djrapitops/plan/data/cache/queue/DataCacheGetQueue.java @@ -27,7 +27,7 @@ public class DataCacheGetQueue extends Queue * @param plugin current instance of Plan */ public DataCacheGetQueue(Plan plugin) { - super(new ArrayBlockingQueue(Settings.PROCESS_GET_LIMIT.getNumber())); + super(new ArrayBlockingQueue<>(Settings.PROCESS_GET_LIMIT.getNumber())); setup = new GetSetup(queue, plugin.getDB()); setup.go(); } @@ -49,8 +49,12 @@ public class DataCacheGetQueue extends Queue } } - public boolean containsUUIDtoBeCached(UUID uuid) { - return uuid != null && new ArrayList<>(queue).stream().anyMatch(map -> (map.get(uuid) != null && map.get(uuid).size() >= 2)); + boolean containsUUIDtoBeCached(UUID uuid) { + return uuid != null + && queue.stream() + .map(map -> map.get(uuid)) + .filter(Objects::nonNull) + .anyMatch(list -> list.size() >= 2); } } @@ -58,7 +62,7 @@ class GetConsumer extends Consumer>> { private Database db; - GetConsumer(BlockingQueue q, Database db) { + GetConsumer(BlockingQueue>> q, Database db) { super(q, "GetQueueConsumer"); this.db = db; } diff --git a/Plan/src/main/java/com/djrapitops/plan/ui/text/TextUI.java b/Plan/src/main/java/com/djrapitops/plan/ui/text/TextUI.java index 0551dd635..591c7709b 100644 --- a/Plan/src/main/java/com/djrapitops/plan/ui/text/TextUI.java +++ b/Plan/src/main/java/com/djrapitops/plan/ui/text/TextUI.java @@ -92,12 +92,12 @@ public class TextUI { return new String[]{ ball + " Total Players: " + sec + count.getPlayerCount(), - // + ball + " Active: " + sec + activity.getActive().size() + main + " Inactive: " + sec + activity.getInactive().size() + main + " Single Join: " + sec + activity.getJoinedOnce().size() + main + " Banned: " + sec + activity.getBans().size(), - // + ball + " New Players 24h: " + sec + join.get("npday") + main + " 7d: " + sec + d.get("npweek") + main + " 30d: " + sec + d.get("npmonth"), "", ball + " Total Playtime: " + sec + playtime.get("totalplaytime") + main + " Player Avg: " + sec + playtime.get("avgplaytime"), diff --git a/Plan/src/main/java/com/djrapitops/plan/utilities/analysis/Analysis.java b/Plan/src/main/java/com/djrapitops/plan/utilities/analysis/Analysis.java index 617606cca..182c26606 100644 --- a/Plan/src/main/java/com/djrapitops/plan/utilities/analysis/Analysis.java +++ b/Plan/src/main/java/com/djrapitops/plan/utilities/analysis/Analysis.java @@ -167,7 +167,7 @@ public class Analysis { PageCacheHandler.cachePage("analysisPage", () -> new AnalysisPageResponse(plugin.getUiServer().getDataReqHandler())); PageCacheHandler.cachePage("players", () -> new PlayersPageResponse(plugin)); - ExportUtility.export(plugin, analysisData, rawData); + ExportUtility.export(analysisData, rawData); } catch (Exception e) { Log.toLog(this.getClass().getName(), e); plugin.processStatus().setStatus("Analysis", "Error: " + e); diff --git a/Plan/src/main/java/com/djrapitops/plan/utilities/file/dump/DumpLog.java b/Plan/src/main/java/com/djrapitops/plan/utilities/file/dump/DumpLog.java index ec12ed12f..bdaa55a54 100644 --- a/Plan/src/main/java/com/djrapitops/plan/utilities/file/dump/DumpLog.java +++ b/Plan/src/main/java/com/djrapitops/plan/utilities/file/dump/DumpLog.java @@ -1,5 +1,7 @@ package main.java.com.djrapitops.plan.utilities.file.dump; +import com.google.common.base.Splitter; +import com.google.common.collect.ImmutableList; import main.java.com.djrapitops.plan.Log; import org.json.simple.JSONObject; import org.json.simple.parser.JSONParser; @@ -21,7 +23,7 @@ import java.util.List; */ public class DumpLog { - private List lines = new ArrayList<>(); + private final List lines = new ArrayList<>(); /** * Writes a header @@ -88,6 +90,11 @@ public class DumpLog { * @param line The content of the line */ private void addLine(CharSequence line) { + if (line == null) { + lines.add("\n"); + return; + } + lines.add(line.toString()); } @@ -97,7 +104,27 @@ public class DumpLog { * @return The link to the Dump Log */ String upload() { - String content = this.toString(); + List parts = ImmutableList.copyOf(split()).reverse(); + + String lastLink = null; + for (String part : parts) { + if (lastLink != null) { + part += "\n" + lastLink; + } + + lastLink = upload(part); + } + + return lastLink; + } + + /** + * Uploads the content to Hastebin using HTTPS and POST + * + * @param content The content + * @return The link to the content + */ + private String upload(String content) { HttpsURLConnection connection = null; try { URL url = new URL("https://hastebin.com/documents"); @@ -111,13 +138,16 @@ public class DumpLog { connection.setDoOutput(true); DataOutputStream wr = new DataOutputStream(connection.getOutputStream()); - wr.writeBytes(this.toString()); + wr.writeBytes(content); wr.flush(); wr.close(); - BufferedReader rd = new BufferedReader(new InputStreamReader(connection.getInputStream())); + BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream())); + + String response = reader.readLine(); + JSONParser parser = new JSONParser(); - JSONObject json = (JSONObject) parser.parse(rd.readLine()); + JSONObject json = (JSONObject) parser.parse(response); return "https://hastebin.com/" + json.get("key"); } catch (IOException | ParseException e) { @@ -130,6 +160,15 @@ public class DumpLog { } } + /** + * Splits the content of the DumpLog into parts + * + * @return The splitted content + */ + private Iterable split() { + return Splitter.fixedLength(390000).split(this.toString()); + } + @Override public String toString() { return String.join("\n", lines); diff --git a/Plan/src/main/resources/player.html b/Plan/src/main/resources/player.html index 0377f1beb..8c84c7d05 100644 --- a/Plan/src/main/resources/player.html +++ b/Plan/src/main/resources/player.html @@ -741,12 +741,12 @@ function openFunc(i) { return function() { - if (window.getComputedStyle(document.getElementById("navbutton")).getPropertyValue('display') == "inline") { + if (window.getComputedStyle(document.getElementById("navbutton")).getPropertyValue('display') === "inline") { closeNav(); } var max = navButtons.length; for (var j = 0; j < max; j++) { - if (j == i) { + if (j === i) { navButtons[j].classList.add('active'); continue; } @@ -770,9 +770,7 @@ var begin = new Date(%refreshlong%); var seconds = now.getTime() - begin.getTime(); - var out = formatTime(seconds); - - document.getElementById('divTime').innerHTML = out; + document.getElementById('divTime').innerHTML = formatTime(seconds); setTimeout('countUpTimer()', 1000); } diff --git a/Plan/src/test/java/utils/MockUtils.java b/Plan/src/test/java/utils/MockUtils.java index a53069cfb..70db22851 100644 --- a/Plan/src/test/java/utils/MockUtils.java +++ b/Plan/src/test/java/utils/MockUtils.java @@ -16,7 +16,6 @@ import org.bukkit.entity.Player; import org.mockito.Mockito; import org.powermock.api.mockito.PowerMockito; -import java.io.IOException; import java.net.InetAddress; import java.net.InetSocketAddress; import java.util.HashSet; @@ -154,7 +153,7 @@ public class MockUtils { return PowerMockito.mock(CommandSender.class); } - public static HttpServer mockHTTPServer() throws IOException { + public static HttpServer mockHTTPServer() { HttpServer httpServer = PowerMockito.mock(HttpServer.class); when(httpServer.getAddress()).thenReturn(new InetSocketAddress(80)); when(httpServer.getExecutor()).thenReturn(command -> System.out.println("HTTP Server command received")); diff --git a/PlanPluginBridge/pom.xml b/PlanPluginBridge/pom.xml index 343b10cda..0d8e4f8b0 100644 --- a/PlanPluginBridge/pom.xml +++ b/PlanPluginBridge/pom.xml @@ -3,7 +3,7 @@ 4.0.0 com.djrapitops PlanPluginBridge - 3.6.0 + 3.6.3 jar @@ -23,7 +23,7 @@ com.djrapitops Plan - 3.6.0 + 3.6.2 provided diff --git a/PlanPluginBridge/src/main/java/com/djrapitops/pluginbridge/plan/advancedachievements/AdvancedAchievementsAchievements.java b/PlanPluginBridge/src/main/java/com/djrapitops/pluginbridge/plan/advancedachievements/AdvancedAchievementsAchievements.java index bcf2e9282..6c0483b90 100644 --- a/PlanPluginBridge/src/main/java/com/djrapitops/pluginbridge/plan/advancedachievements/AdvancedAchievementsAchievements.java +++ b/PlanPluginBridge/src/main/java/com/djrapitops/pluginbridge/plan/advancedachievements/AdvancedAchievementsAchievements.java @@ -1,23 +1,26 @@ package com.djrapitops.pluginbridge.plan.advancedachievements; import com.hm.achievement.api.AdvancedAchievementsAPI; -import java.io.Serializable; -import java.util.Map; -import java.util.UUID; import main.java.com.djrapitops.plan.data.additional.AnalysisType; import main.java.com.djrapitops.plan.data.additional.PluginData; import main.java.com.djrapitops.plan.utilities.MiscUtils; +import java.io.Serializable; +import java.util.Collection; +import java.util.HashMap; +import java.util.Map; +import java.util.UUID; + /** * PluginData class for AdvancedAchievements-plugin. - * + *

* Registered to the plugin by AdvancedAchievementsHook. - * + *

* Gives the amount of achievements as value. * * @author Rsl1122 - * @since 3.1.0 * @see AdvancedAchievementsHook + * @since 3.1.0 */ public class AdvancedAchievementsAchievements extends PluginData { @@ -57,6 +60,14 @@ public class AdvancedAchievementsAchievements extends PluginData { lastRefresh = MiscUtils.getTime(); } + @Override + public Map getValues(Collection uuid) { + if (MiscUtils.getTime() - lastRefresh > 60000) { + refreshTotalAchievements(); + } + return new HashMap<>(totalAchievements); + } + @Override public Serializable getValue(UUID uuid) { if (MiscUtils.getTime() - lastRefresh > 60000) { diff --git a/PlanPluginBridge/src/main/java/com/djrapitops/pluginbridge/plan/askyblock/ASkyBlockIslandLevel.java b/PlanPluginBridge/src/main/java/com/djrapitops/pluginbridge/plan/askyblock/ASkyBlockIslandLevel.java index 4b09d7e23..5c783bcf2 100644 --- a/PlanPluginBridge/src/main/java/com/djrapitops/pluginbridge/plan/askyblock/ASkyBlockIslandLevel.java +++ b/PlanPluginBridge/src/main/java/com/djrapitops/pluginbridge/plan/askyblock/ASkyBlockIslandLevel.java @@ -1,11 +1,12 @@ package com.djrapitops.pluginbridge.plan.askyblock; import com.wasteofplastic.askyblock.ASkyBlockAPI; -import java.io.Serializable; -import java.util.UUID; import main.java.com.djrapitops.plan.data.additional.AnalysisType; import main.java.com.djrapitops.plan.data.additional.PluginData; +import java.io.Serializable; +import java.util.UUID; + /** * PluginData class for ASkyBlock-plugin. * diff --git a/PlanPluginBridge/src/main/java/com/djrapitops/pluginbridge/plan/essentials/EssentialsWarps.java b/PlanPluginBridge/src/main/java/com/djrapitops/pluginbridge/plan/essentials/EssentialsWarps.java index 14d49c18e..b6c5fcae3 100644 --- a/PlanPluginBridge/src/main/java/com/djrapitops/pluginbridge/plan/essentials/EssentialsWarps.java +++ b/PlanPluginBridge/src/main/java/com/djrapitops/pluginbridge/plan/essentials/EssentialsWarps.java @@ -2,16 +2,13 @@ package com.djrapitops.pluginbridge.plan.essentials; import com.earth2me.essentials.Essentials; import com.earth2me.essentials.Warps; -import java.io.Serializable; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.List; -import java.util.UUID; import main.java.com.djrapitops.plan.data.additional.AnalysisType; import main.java.com.djrapitops.plan.data.additional.PluginData; import main.java.com.djrapitops.plan.ui.html.Html; +import java.io.Serializable; +import java.util.*; + /** * PluginData class for Essentials-plugin. * @@ -56,7 +53,7 @@ public class EssentialsWarps extends PluginData { Collections.sort(warps); StringBuilder html = new StringBuilder(); if (warps.isEmpty()) { - html.append(Html.TABLELINE_4.parse(Html.FACTION_NO_FACTIONS.parse(), "", "", "")); + html.append(Html.TABLELINE_4.parse("No Factions", "", "", "")); } else { for (String warp : warps) { html.append(Html.TABLELINE_2.parse(warp, "/warp " + warp)); @@ -67,11 +64,7 @@ public class EssentialsWarps extends PluginData { @Override public Serializable getValue(UUID uuid) { - Warps warps = essentials.getWarps(); - if (!warps.isEmpty()) { - return warps.getList().toString(); - } - return "No Warps."; + return -1; } } diff --git a/PlanPluginBridge/src/main/java/com/djrapitops/pluginbridge/plan/factions/FactionsTable.java b/PlanPluginBridge/src/main/java/com/djrapitops/pluginbridge/plan/factions/FactionsTable.java index 36e83fa0e..eee1aaa84 100644 --- a/PlanPluginBridge/src/main/java/com/djrapitops/pluginbridge/plan/factions/FactionsTable.java +++ b/PlanPluginBridge/src/main/java/com/djrapitops/pluginbridge/plan/factions/FactionsTable.java @@ -3,12 +3,6 @@ package com.djrapitops.pluginbridge.plan.factions; import com.massivecraft.factions.entity.Faction; import com.massivecraft.factions.entity.FactionColl; import com.massivecraft.factions.entity.MPlayer; -import java.io.Serializable; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.UUID; -import java.util.stream.Collectors; import main.java.com.djrapitops.plan.Settings; import main.java.com.djrapitops.plan.data.additional.AnalysisType; import main.java.com.djrapitops.plan.data.additional.PluginData; @@ -16,14 +10,20 @@ import main.java.com.djrapitops.plan.ui.html.Html; import main.java.com.djrapitops.plan.utilities.FormatUtils; import main.java.com.djrapitops.plan.utilities.HtmlUtils; +import java.io.Serializable; +import java.util.ArrayList; +import java.util.List; +import java.util.UUID; +import java.util.stream.Collectors; + /** * PluginData class for Factions-plugin. - * + *

* Registered to the plugin by FactionsHook * * @author Rsl1122 - * @since 3.1.0 * @see FactionsHook + * @since 3.1.0 */ public class FactionsTable extends PluginData { @@ -31,7 +31,7 @@ public class FactionsTable extends PluginData { /** * Class Constructor, sets the parameters of the PluginData object. - * + *

* Uses Html to easily parse Html for the table. * * @see FactionsHook @@ -67,7 +67,7 @@ public class FactionsTable extends PluginData { StringBuilder html = new StringBuilder(); this.factions = getTopFactions(); if (factions.isEmpty()) { - html.append(Html.TABLELINE_4.parse(Html.FACTION_NO_FACTIONS.parse(), "", "", "")); + html.append(Html.TABLELINE_4.parse("No Factions", "", "", "")); } else { for (Faction f : factions) { String name; @@ -77,14 +77,14 @@ public class FactionsTable extends PluginData { if (f != null) { name = f.getName(); MPlayer fLeader = f.getLeader(); - leader = fLeader != null ? fLeader.getNameAndSomething("", "") : Html.FACTION_NO_LEADER.parse(); + leader = fLeader != null ? fLeader.getNameAndSomething("", "") : "No Leader"; power = FormatUtils.cutDecimals(f.getPower()); land = f.getLandCount() + ""; } else { - name = Html.FACTION_NOT_FOUND.parse(); - leader = Html.FACTION_NOT_FOUND.parse(); - power = Html.FACTION_NOT_FOUND.parse(); - land = Html.FACTION_NOT_FOUND.parse(); + name = "Not Found"; + leader = "Not Found"; + power = "Not Found"; + land = "Not Found"; } String leaderPage = Html.LINK.parse(HtmlUtils.getInspectUrl(leader), leader); html.append(Html.TABLELINE_4.parse(name, power, land, leaderPage)); diff --git a/PlanPluginBridge/src/main/java/com/djrapitops/pluginbridge/plan/towny/TownyTable.java b/PlanPluginBridge/src/main/java/com/djrapitops/pluginbridge/plan/towny/TownyTable.java index 381f5898e..75852b9a3 100644 --- a/PlanPluginBridge/src/main/java/com/djrapitops/pluginbridge/plan/towny/TownyTable.java +++ b/PlanPluginBridge/src/main/java/com/djrapitops/pluginbridge/plan/towny/TownyTable.java @@ -4,17 +4,17 @@ import com.massivecraft.factions.entity.MPlayer; import com.palmergames.bukkit.towny.object.Resident; import com.palmergames.bukkit.towny.object.Town; import com.palmergames.bukkit.towny.object.TownyUniverse; -import java.io.Serializable; -import java.util.Collections; -import java.util.List; -import java.util.UUID; -import java.util.stream.Collectors; import main.java.com.djrapitops.plan.Settings; import main.java.com.djrapitops.plan.data.additional.AnalysisType; import main.java.com.djrapitops.plan.data.additional.PluginData; import main.java.com.djrapitops.plan.ui.html.Html; import main.java.com.djrapitops.plan.utilities.HtmlUtils; +import java.io.Serializable; +import java.util.List; +import java.util.UUID; +import java.util.stream.Collectors; + /** * PluginData class for Towny-plugin. * @@ -45,7 +45,7 @@ public class TownyTable extends PluginData { StringBuilder html = new StringBuilder(); List towns = getTopTowns(); if (towns.isEmpty()) { - html.append(Html.TABLELINE_4.parse(Html.TOWN_NO_TOWNS.parse(), "", "", "")); + html.append(Html.TABLELINE_4.parse("No Towns", "", "", "")); } else { for (Town t : towns) { if (t == null) { diff --git a/PlanPluginBridge/src/main/java/com/djrapitops/pluginbridge/plan/towny/TownyTown.java b/PlanPluginBridge/src/main/java/com/djrapitops/pluginbridge/plan/towny/TownyTown.java index 68836765c..a1c1f1428 100644 --- a/PlanPluginBridge/src/main/java/com/djrapitops/pluginbridge/plan/towny/TownyTown.java +++ b/PlanPluginBridge/src/main/java/com/djrapitops/pluginbridge/plan/towny/TownyTown.java @@ -3,13 +3,13 @@ package com.djrapitops.pluginbridge.plan.towny; import com.palmergames.bukkit.towny.exceptions.NotRegisteredException; import com.palmergames.bukkit.towny.object.Resident; import com.palmergames.bukkit.towny.object.TownyUniverse; -import java.io.Serializable; -import java.util.UUID; -import main.java.com.djrapitops.plan.Phrase; import main.java.com.djrapitops.plan.Plan; import main.java.com.djrapitops.plan.data.UserData; import main.java.com.djrapitops.plan.data.additional.PluginData; +import java.io.Serializable; +import java.util.UUID; + /** * PluginData class for Towny-plugin. * @@ -37,7 +37,7 @@ public class TownyTown extends PluginData { public String getHtmlReplaceValue(String modifierPrefix, UUID uuid) { UserData data = Plan.getPlanAPI().getInspectCachedUserDataMap().get(uuid); if (data == null) { - return parseContainer(modifierPrefix, Phrase.NOT_IN_TOWN + ""); + return parseContainer(modifierPrefix, "Not in a Town"); } String name = data.getName(); try { @@ -46,11 +46,11 @@ public class TownyTown extends PluginData { if (res.hasTown()) { town = res.getTown().getName(); } else { - town = Phrase.NOT_IN_TOWN + ""; + town = "Not in a Town"; } return parseContainer("", town); } catch (NotRegisteredException ex) { - return parseContainer(modifierPrefix, Phrase.NOT_IN_TOWN + ""); + return parseContainer(modifierPrefix, "Not in a Town"); } } @@ -58,7 +58,7 @@ public class TownyTown extends PluginData { public Serializable getValue(UUID uuid) { UserData data = Plan.getPlanAPI().getInspectCachedUserDataMap().get(uuid); if (data == null) { - return Phrase.NOT_IN_TOWN + ""; + return "Not in a Town"; } String name = data.getName(); try { @@ -67,7 +67,7 @@ public class TownyTown extends PluginData { if (res.hasTown()) { town = res.getTown().getName(); } else { - town = Phrase.NOT_IN_TOWN + ""; + town = "Not in a Town"; } return town; } catch (NotRegisteredException ex) {