From 193054f1fc870861a889b82bb4542a2cc778b329 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alexander=20S=C3=B6derberg?= Date: Sun, 19 Jul 2020 14:23:55 +0200 Subject: [PATCH] Move shit out of MainUtil into more appropriate classes --- .../plotsquared/bukkit/BukkitPlatform.java | 16 +- .../bukkit/placeholder/Placeholders.java | 4 +- .../bukkit/util/BukkitRegionManager.java | 4 +- .../bukkit/uuid/SQLiteUUIDService.java | 6 +- .../com/plotsquared/core/PlotSquared.java | 12 +- .../com/plotsquared/core/command/Add.java | 9 +- .../com/plotsquared/core/command/Area.java | 3 +- .../com/plotsquared/core/command/Auto.java | 8 +- .../com/plotsquared/core/command/Buy.java | 5 +- .../com/plotsquared/core/command/Comment.java | 2 +- .../com/plotsquared/core/command/Copy.java | 2 +- .../core/command/DatabaseCommand.java | 5 +- .../plotsquared/core/command/DebugExec.java | 9 +- .../com/plotsquared/core/command/Deny.java | 9 +- .../com/plotsquared/core/command/Grant.java | 68 +- .../plotsquared/core/command/HomeCommand.java | 2 +- .../com/plotsquared/core/command/Info.java | 15 +- .../com/plotsquared/core/command/Kick.java | 3 +- .../com/plotsquared/core/command/ListCmd.java | 5 +- .../com/plotsquared/core/command/Move.java | 2 +- .../com/plotsquared/core/command/Owner.java | 5 +- .../com/plotsquared/core/command/Remove.java | 3 +- .../com/plotsquared/core/command/Swap.java | 2 +- .../com/plotsquared/core/command/Target.java | 2 +- .../plotsquared/core/command/Template.java | 13 +- .../com/plotsquared/core/command/Trust.java | 9 +- .../com/plotsquared/core/command/Visit.java | 5 +- .../core/configuration/ConfigurationUtil.java | 30 + .../plotsquared/core/database/SQLManager.java | 5 +- .../core/generator/HybridPlotManager.java | 29 +- .../core/generator/HybridPlotWorld.java | 10 +- .../core/generator/SquarePlotManager.java | 6 +- .../core/listener/PlotListener.java | 22 +- .../java/com/plotsquared/core/plot/Plot.java | 327 ++++++- .../com/plotsquared/core/plot/PlotArea.java | 9 +- .../plotsquared/core/plot/PlotCluster.java | 21 +- .../core/plot/expiration/ExpireManager.java | 3 +- .../plot/flag/implementations/KeepFlag.java | 5 +- .../core/plot/world/SinglePlotManager.java | 6 +- .../com/plotsquared/core/util/FileUtils.java | 67 ++ .../com/plotsquared/core/util/HashUtil.java | 57 ++ .../com/plotsquared/core/util/MainUtil.java | 867 +----------------- .../plotsquared/core/util/PlayerManager.java | 148 +++ .../com/plotsquared/core/util/RegionUtil.java | 38 + .../core/util/SchematicHandler.java | 102 ++- .../com/plotsquared/core/util/TimeUtil.java | 129 +++ .../com/plotsquared/core/util/WorldUtil.java | 20 +- .../core/util/query/SearchPlotProvider.java | 83 +- 48 files changed, 1142 insertions(+), 1070 deletions(-) create mode 100644 Core/src/main/java/com/plotsquared/core/util/FileUtils.java create mode 100644 Core/src/main/java/com/plotsquared/core/util/HashUtil.java create mode 100644 Core/src/main/java/com/plotsquared/core/util/TimeUtil.java diff --git a/Bukkit/src/main/java/com/plotsquared/bukkit/BukkitPlatform.java b/Bukkit/src/main/java/com/plotsquared/bukkit/BukkitPlatform.java index b7d87ec59..01cf8114e 100644 --- a/Bukkit/src/main/java/com/plotsquared/bukkit/BukkitPlatform.java +++ b/Bukkit/src/main/java/com/plotsquared/bukkit/BukkitPlatform.java @@ -44,11 +44,11 @@ import com.plotsquared.bukkit.placeholder.PlaceholderFormatter; import com.plotsquared.bukkit.placeholder.Placeholders; import com.plotsquared.bukkit.player.BukkitPlayerManager; import com.plotsquared.bukkit.util.BukkitChatManager; -import com.plotsquared.bukkit.util.task.BukkitTaskManager; import com.plotsquared.bukkit.util.BukkitUtil; import com.plotsquared.bukkit.util.BukkitWorld; import com.plotsquared.bukkit.util.SetGenCB; import com.plotsquared.bukkit.util.UpdateUtility; +import com.plotsquared.bukkit.util.task.BukkitTaskManager; import com.plotsquared.bukkit.util.task.PaperTimeConverter; import com.plotsquared.bukkit.util.task.SpigotTimeConverter; import com.plotsquared.bukkit.uuid.BungeePermsUUIDService; @@ -67,6 +67,7 @@ import com.plotsquared.core.configuration.Captions; import com.plotsquared.core.configuration.ChatFormatter; import com.plotsquared.core.configuration.ConfigurationNode; import com.plotsquared.core.configuration.ConfigurationSection; +import com.plotsquared.core.configuration.ConfigurationUtil; import com.plotsquared.core.configuration.Settings; import com.plotsquared.core.configuration.file.YamlConfiguration; import com.plotsquared.core.database.DBFunc; @@ -88,6 +89,7 @@ import com.plotsquared.core.plot.PlotAreaTerrainType; import com.plotsquared.core.plot.PlotAreaType; import com.plotsquared.core.plot.PlotId; import com.plotsquared.core.plot.comment.CommentManager; +import com.plotsquared.core.plot.flag.implementations.ServerPlotFlag; import com.plotsquared.core.plot.message.PlainChatManager; import com.plotsquared.core.plot.world.PlotAreaManager; import com.plotsquared.core.plot.world.SinglePlotArea; @@ -99,7 +101,7 @@ import com.plotsquared.core.util.ChatManager; import com.plotsquared.core.util.ConsoleColors; import com.plotsquared.core.util.EconHandler; import com.plotsquared.core.util.EventDispatcher; -import com.plotsquared.core.util.MainUtil; +import com.plotsquared.core.util.FileUtils; import com.plotsquared.core.util.PermHandler; import com.plotsquared.core.util.PlatformWorldManager; import com.plotsquared.core.util.PremiumVerification; @@ -408,8 +410,8 @@ import static com.plotsquared.core.util.ReflectionUtils.getRefClass; final SQLiteUUIDService sqLiteUUIDService = new SQLiteUUIDService("user_cache.db"); final SQLiteUUIDService legacyUUIDService; - if (Settings.UUID.LEGACY_DATABASE_SUPPORT && MainUtil - .getFile(PlotSquared.platform().getDirectory(), "usercache.db").exists()) { + if (Settings.UUID.LEGACY_DATABASE_SUPPORT && + FileUtils.getFile(PlotSquared.platform().getDirectory(), "usercache.db").exists()) { legacyUUIDService = new SQLiteUUIDService("usercache.db"); } else { legacyUUIDService = null; @@ -569,7 +571,7 @@ import static com.plotsquared.core.util.ReflectionUtils.getRefClass; } final Plot plot = area.getOwnedPlot(id); if (plot != null) { - if (!MainUtil.isServerOwned(plot) || PlotPlayer.wrap(plot.getOwner()) == null) { + if (!plot.getFlag(ServerPlotFlag.class) || PlotPlayer.wrap(plot.getOwner()) == null) { if (world.getKeepSpawnInMemory()) { world.setKeepSpawnInMemory(false); return; @@ -1049,8 +1051,8 @@ import static com.plotsquared.core.util.ReflectionUtils.getRefClass; String manager = worldConfig.getString("generator.plugin", getPluginName()); PlotAreaBuilder builder = PlotAreaBuilder.newBuilder().plotManager(manager) .generatorName(worldConfig.getString("generator.init", manager)) - .plotAreaType(MainUtil.getType(worldConfig)) - .terrainType(MainUtil.getTerrain(worldConfig)) + .plotAreaType(ConfigurationUtil.getType(worldConfig)) + .terrainType(ConfigurationUtil.getTerrain(worldConfig)) .settingsNodesWrapper(new SettingsNodesWrapper(new ConfigurationNode[0], null)) .worldName(worldName); getInjector().getInstance(SetupUtils.class).setupWorld(builder); diff --git a/Bukkit/src/main/java/com/plotsquared/bukkit/placeholder/Placeholders.java b/Bukkit/src/main/java/com/plotsquared/bukkit/placeholder/Placeholders.java index 69a11523f..d79a7b4fb 100644 --- a/Bukkit/src/main/java/com/plotsquared/bukkit/placeholder/Placeholders.java +++ b/Bukkit/src/main/java/com/plotsquared/bukkit/placeholder/Placeholders.java @@ -30,7 +30,7 @@ import com.plotsquared.core.player.PlotPlayer; import com.plotsquared.core.plot.Plot; import com.plotsquared.core.plot.flag.GlobalFlagContainer; import com.plotsquared.core.plot.flag.PlotFlag; -import com.plotsquared.core.util.MainUtil; +import com.plotsquared.core.util.PlayerManager; import me.clip.placeholderapi.PlaceholderAPIPlugin; import me.clip.placeholderapi.expansion.PlaceholderExpansion; import org.bukkit.Bukkit; @@ -122,7 +122,7 @@ public class Placeholders extends PlaceholderExpansion { } try { - return MainUtil.getName(plotOwner, false); + return PlayerManager.getName(plotOwner, false); } catch (final Exception ignored) {} final String name = Bukkit.getOfflinePlayer(plotOwner).getName(); diff --git a/Bukkit/src/main/java/com/plotsquared/bukkit/util/BukkitRegionManager.java b/Bukkit/src/main/java/com/plotsquared/bukkit/util/BukkitRegionManager.java index 660a42148..d3ed2b53c 100644 --- a/Bukkit/src/main/java/com/plotsquared/bukkit/util/BukkitRegionManager.java +++ b/Bukkit/src/main/java/com/plotsquared/bukkit/util/BukkitRegionManager.java @@ -38,9 +38,9 @@ import com.plotsquared.core.plot.PlotManager; import com.plotsquared.core.queue.LocalBlockQueue; import com.plotsquared.core.queue.ScopedLocalBlockQueue; import com.plotsquared.core.util.ChunkManager; -import com.plotsquared.core.util.MainUtil; import com.plotsquared.core.util.RegionManager; import com.plotsquared.core.util.RegionUtil; +import com.plotsquared.core.util.WorldUtil; import com.plotsquared.core.util.entity.EntityCategories; import com.plotsquared.core.util.task.RunnableVal; import com.plotsquared.core.util.task.TaskManager; @@ -484,7 +484,7 @@ import static com.plotsquared.core.util.entity.EntityCategories.CAP_VEHICLE; @Override public void run(int[] value) { BlockVector2 loc = BlockVector2.at(value[0], value[1]); PlotSquared.platform().getChunkManager().loadChunk(world, loc, false).thenRun(() -> { - MainUtil.setBiome(world, value[2], value[3], value[4], value[5], biome); + WorldUtil.setBiome(world, value[2], value[3], value[4], value[5], biome); queue.refreshChunk(value[0], value[1]); }); } diff --git a/Bukkit/src/main/java/com/plotsquared/bukkit/uuid/SQLiteUUIDService.java b/Bukkit/src/main/java/com/plotsquared/bukkit/uuid/SQLiteUUIDService.java index b2f2a8707..d0ee06337 100644 --- a/Bukkit/src/main/java/com/plotsquared/bukkit/uuid/SQLiteUUIDService.java +++ b/Bukkit/src/main/java/com/plotsquared/bukkit/uuid/SQLiteUUIDService.java @@ -27,11 +27,11 @@ package com.plotsquared.bukkit.uuid; import com.plotsquared.core.PlotSquared; import com.plotsquared.core.database.SQLite; -import com.plotsquared.core.util.MainUtil; +import com.plotsquared.core.util.FileUtils; import com.plotsquared.core.uuid.UUIDMapping; import com.plotsquared.core.uuid.UUIDService; -import javax.annotation.Nonnull; +import javax.annotation.Nonnull; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; @@ -51,7 +51,7 @@ public class SQLiteUUIDService implements UUIDService, Consumer future = new CompletableFuture<>(); - MainUtil.getUUIDsFromString(args[0], (uuids, throwable) -> { + PlayerManager.getUUIDsFromString(args[0], (uuids, throwable) -> { if (throwable != null) { if (throwable instanceof TimeoutException) { Captions.FETCHING_PLAYERS_TIMEOUT.send(player); @@ -91,17 +92,17 @@ public class Add extends Command { if (uuid == DBFunc.EVERYONE && !( Permissions.hasPermission(player, Captions.PERMISSION_TRUST_EVERYONE) || Permissions .hasPermission(player, Captions.PERMISSION_ADMIN_COMMAND_TRUST))) { - MainUtil.sendMessage(player, Captions.INVALID_PLAYER, MainUtil.getName(uuid)); + MainUtil.sendMessage(player, Captions.INVALID_PLAYER, PlayerManager.getName(uuid)); iterator.remove(); continue; } if (plot.isOwner(uuid)) { - MainUtil.sendMessage(player, Captions.ALREADY_ADDED, MainUtil.getName(uuid)); + MainUtil.sendMessage(player, Captions.ALREADY_ADDED, PlayerManager.getName(uuid)); iterator.remove(); continue; } if (plot.getMembers().contains(uuid)) { - MainUtil.sendMessage(player, Captions.ALREADY_ADDED, MainUtil.getName(uuid)); + MainUtil.sendMessage(player, Captions.ALREADY_ADDED, PlayerManager.getName(uuid)); iterator.remove(); continue; } diff --git a/Core/src/main/java/com/plotsquared/core/command/Area.java b/Core/src/main/java/com/plotsquared/core/command/Area.java index 969737766..aad920373 100644 --- a/Core/src/main/java/com/plotsquared/core/command/Area.java +++ b/Core/src/main/java/com/plotsquared/core/command/Area.java @@ -47,6 +47,7 @@ import com.plotsquared.core.plot.PlotId; import com.plotsquared.core.plot.message.PlotMessage; import com.plotsquared.core.plot.world.PlotAreaManager; import com.plotsquared.core.setup.PlotAreaBuilder; +import com.plotsquared.core.util.FileUtils; import com.plotsquared.core.util.MainUtil; import com.plotsquared.core.util.MathMan; import com.plotsquared.core.util.Permissions; @@ -186,7 +187,7 @@ public class Area extends SubCommand { hybridPlotWorld.PLOT_HEIGHT = hybridPlotWorld.ROAD_HEIGHT = hybridPlotWorld.WALL_HEIGHT = playerSelectionMin.getBlockY(); // No sign plz hybridPlotWorld.setAllowSigns(false); - final File parentFile = MainUtil.getFile(PlotSquared.platform().getDirectory(), "schematics" + File.separator + + final File parentFile = FileUtils.getFile(PlotSquared.platform().getDirectory(), "schematics" + File.separator + "GEN_ROAD_SCHEMATIC" + File.separator + hybridPlotWorld.getWorldName() + File.separator + hybridPlotWorld.getId()); if (!parentFile.exists() && !parentFile.mkdirs()) { diff --git a/Core/src/main/java/com/plotsquared/core/command/Auto.java b/Core/src/main/java/com/plotsquared/core/command/Auto.java index fd66fa848..ea6a6cf6c 100644 --- a/Core/src/main/java/com/plotsquared/core/command/Auto.java +++ b/Core/src/main/java/com/plotsquared/core/command/Auto.java @@ -25,6 +25,7 @@ */ package com.plotsquared.core.command; +import com.google.common.collect.Lists; import com.google.common.primitives.Ints; import com.google.inject.Inject; import com.plotsquared.core.PlotSquared; @@ -50,10 +51,10 @@ import com.plotsquared.core.util.Permissions; import com.plotsquared.core.util.task.AutoClaimFinishTask; import com.plotsquared.core.util.task.RunnableVal; import com.plotsquared.core.util.task.TaskManager; + import javax.annotation.Nonnull; import javax.annotation.Nullable; - -import java.util.ArrayList; +import java.util.List; import java.util.Set; @CommandDeclaration(command = "auto", @@ -307,7 +308,8 @@ public class Auto extends SubCommand { plot.claim(player, plotId.equals(end), null); } - ArrayList plotIds = MainUtil.getPlotSelectionIds(start, end); + final List plotIds = Lists.newArrayList((Iterable) + PlotId.PlotRangeIterator.range(start, end)); final PlotId pos1 = plotIds.get(0); final PlotAutoMergeEvent mergeEvent = this.eventDispatcher .callAutoMerge(plotarea.getPlotAbs(pos1), plotIds); diff --git a/Core/src/main/java/com/plotsquared/core/command/Buy.java b/Core/src/main/java/com/plotsquared/core/command/Buy.java index f62f24bc2..88f4dd4af 100644 --- a/Core/src/main/java/com/plotsquared/core/command/Buy.java +++ b/Core/src/main/java/com/plotsquared/core/command/Buy.java @@ -36,12 +36,11 @@ import com.plotsquared.core.plot.flag.PlotFlag; import com.plotsquared.core.plot.flag.implementations.PriceFlag; import com.plotsquared.core.util.EconHandler; import com.plotsquared.core.util.EventDispatcher; -import com.plotsquared.core.util.MainUtil; import com.plotsquared.core.util.task.RunnableVal2; import com.plotsquared.core.util.task.RunnableVal3; -import javax.annotation.Nullable; import javax.annotation.Nonnull; +import javax.annotation.Nullable; import java.util.Set; import java.util.concurrent.CompletableFuture; @@ -72,7 +71,7 @@ public class Buy extends Command { final Plot plot; if (args.length != 0) { checkTrue(args.length == 1, Captions.COMMAND_SYNTAX, getUsage()); - plot = check(MainUtil.getPlotFromString(player, args[0], true), null); + plot = check(Plot.getPlotFromString(player, args[0], true), null); } else { plot = check(player.getCurrentPlot(), Captions.NOT_IN_PLOT); } diff --git a/Core/src/main/java/com/plotsquared/core/command/Comment.java b/Core/src/main/java/com/plotsquared/core/command/Comment.java index 455ec268c..952aa8b58 100644 --- a/Core/src/main/java/com/plotsquared/core/command/Comment.java +++ b/Core/src/main/java/com/plotsquared/core/command/Comment.java @@ -56,7 +56,7 @@ public class Comment extends SubCommand { // Attempt to extract a plot out of the first argument Plot plot = null; if (!CommentManager.inboxes.containsKey(args[0].toLowerCase(Locale.ENGLISH))) { - plot = MainUtil.getPlotFromString(player, args[0], false); + plot = Plot.getPlotFromString(player, args[0], false); } int index; diff --git a/Core/src/main/java/com/plotsquared/core/command/Copy.java b/Core/src/main/java/com/plotsquared/core/command/Copy.java index 6743074ff..429a52da5 100644 --- a/Core/src/main/java/com/plotsquared/core/command/Copy.java +++ b/Core/src/main/java/com/plotsquared/core/command/Copy.java @@ -56,7 +56,7 @@ public class Copy extends SubCommand { Captions.COMMAND_SYNTAX.send(player, getUsage()); return false; } - Plot plot2 = MainUtil.getPlotFromString(player, args[0], true); + Plot plot2 = Plot.getPlotFromString(player, args[0], true); if (plot2 == null) { return false; } diff --git a/Core/src/main/java/com/plotsquared/core/command/DatabaseCommand.java b/Core/src/main/java/com/plotsquared/core/command/DatabaseCommand.java index 96a0592d9..1379a0d38 100644 --- a/Core/src/main/java/com/plotsquared/core/command/DatabaseCommand.java +++ b/Core/src/main/java/com/plotsquared/core/command/DatabaseCommand.java @@ -42,6 +42,7 @@ import com.plotsquared.core.plot.PlotId; import com.plotsquared.core.plot.world.PlotAreaManager; import com.plotsquared.core.plot.world.SinglePlotArea; import com.plotsquared.core.util.EventDispatcher; +import com.plotsquared.core.util.FileUtils; import com.plotsquared.core.util.MainUtil; import com.plotsquared.core.util.query.PlotQuery; import com.plotsquared.core.util.task.TaskManager; @@ -125,7 +126,7 @@ public class DatabaseCommand extends SubCommand { .sendMessage(player, "/plot database import [prefix]"); return false; } - File file = MainUtil.getFile(PlotSquared.platform().getDirectory(), + File file = FileUtils.getFile(PlotSquared.platform().getDirectory(), args[1].endsWith(".db") ? args[1] : args[1] + ".db"); if (!file.exists()) { MainUtil.sendMessage(player, "&6Database does not exist: " + file); @@ -200,7 +201,7 @@ public class DatabaseCommand extends SubCommand { return MainUtil.sendMessage(player, "/plot database sqlite [file]"); } File sqliteFile = - MainUtil.getFile(PlotSquared.platform().getDirectory(), args[1] + ".db"); + FileUtils.getFile(PlotSquared.platform().getDirectory(), args[1] + ".db"); implementation = new SQLite(sqliteFile); break; default: diff --git a/Core/src/main/java/com/plotsquared/core/command/DebugExec.java b/Core/src/main/java/com/plotsquared/core/command/DebugExec.java index dbe3a526f..598baf510 100644 --- a/Core/src/main/java/com/plotsquared/core/command/DebugExec.java +++ b/Core/src/main/java/com/plotsquared/core/command/DebugExec.java @@ -50,6 +50,7 @@ import com.plotsquared.core.queue.GlobalBlockQueue; import com.plotsquared.core.util.ChunkManager; import com.plotsquared.core.util.EconHandler; import com.plotsquared.core.util.EventDispatcher; +import com.plotsquared.core.util.FileUtils; import com.plotsquared.core.util.MainUtil; import com.plotsquared.core.util.MathMan; import com.plotsquared.core.util.SchematicHandler; @@ -63,11 +64,11 @@ import com.plotsquared.core.util.task.RunnableVal3; import com.plotsquared.core.util.task.TaskManager; import com.sk89q.worldedit.WorldEdit; import com.sk89q.worldedit.world.block.BlockState; -import javax.annotation.Nonnull; -import javax.annotation.Nullable; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import javax.annotation.Nonnull; +import javax.annotation.Nullable; import javax.script.Bindings; import javax.script.ScriptContext; import javax.script.ScriptEngine; @@ -327,7 +328,7 @@ public class DebugExec extends SubCommand { return false; case "addcmd": try { - final String cmd = StringMan.join(Files.readLines(MainUtil.getFile(new File( + final String cmd = StringMan.join(Files.readLines(FileUtils.getFile(new File( PlotSquared.platform().getDirectory() + File.separator + Settings.Paths.SCRIPTS), args[1]), StandardCharsets.UTF_8), System.getProperty("line.separator")); @@ -359,7 +360,7 @@ public class DebugExec extends SubCommand { async = true; case "run": try { - script = StringMan.join(Files.readLines(MainUtil.getFile(new File( + script = StringMan.join(Files.readLines(FileUtils.getFile(new File( PlotSquared.platform().getDirectory() + File.separator + Settings.Paths.SCRIPTS), args[1]), StandardCharsets.UTF_8), System.getProperty("line.separator")); diff --git a/Core/src/main/java/com/plotsquared/core/command/Deny.java b/Core/src/main/java/com/plotsquared/core/command/Deny.java index b97be84f7..e8008d6bb 100644 --- a/Core/src/main/java/com/plotsquared/core/command/Deny.java +++ b/Core/src/main/java/com/plotsquared/core/command/Deny.java @@ -36,6 +36,7 @@ import com.plotsquared.core.plot.world.PlotAreaManager; import com.plotsquared.core.util.EventDispatcher; import com.plotsquared.core.util.MainUtil; import com.plotsquared.core.util.Permissions; +import com.plotsquared.core.util.PlayerManager; import com.plotsquared.core.util.TabCompletions; import com.plotsquared.core.util.WorldUtil; import com.sk89q.worldedit.world.gamemode.GameModes; @@ -84,7 +85,7 @@ public class Deny extends SubCommand { return true; } - MainUtil.getUUIDsFromString(args[0], (uuids, throwable) -> { + PlayerManager.getUUIDsFromString(args[0], (uuids, throwable) -> { if (throwable instanceof TimeoutException) { MainUtil.sendMessage(player, Captions.FETCHING_PLAYERS_TIMEOUT); } else if (throwable != null || uuids.isEmpty()) { @@ -94,12 +95,12 @@ public class Deny extends SubCommand { if (uuid == DBFunc.EVERYONE && !( Permissions.hasPermission(player, Captions.PERMISSION_DENY_EVERYONE) || Permissions .hasPermission(player, Captions.PERMISSION_ADMIN_COMMAND_DENY))) { - MainUtil.sendMessage(player, Captions.INVALID_PLAYER, MainUtil.getName(uuid)); + MainUtil.sendMessage(player, Captions.INVALID_PLAYER, PlayerManager.getName(uuid)); } else if (plot.isOwner(uuid)) { - MainUtil.sendMessage(player, Captions.CANT_REMOVE_OWNER, MainUtil.getName(uuid)); + MainUtil.sendMessage(player, Captions.CANT_REMOVE_OWNER, PlayerManager.getName(uuid)); return; } else if (plot.getDenied().contains(uuid)) { - MainUtil.sendMessage(player, Captions.ALREADY_ADDED, MainUtil.getName(uuid)); + MainUtil.sendMessage(player, Captions.ALREADY_ADDED, PlayerManager.getName(uuid)); return; } else { if (uuid != DBFunc.EVERYONE) { diff --git a/Core/src/main/java/com/plotsquared/core/command/Grant.java b/Core/src/main/java/com/plotsquared/core/command/Grant.java index 59c1453a8..ab1ef00d4 100644 --- a/Core/src/main/java/com/plotsquared/core/command/Grant.java +++ b/Core/src/main/java/com/plotsquared/core/command/Grant.java @@ -33,13 +33,16 @@ import com.plotsquared.core.database.DBFunc; import com.plotsquared.core.player.PlotPlayer; import com.plotsquared.core.util.MainUtil; import com.plotsquared.core.util.Permissions; +import com.plotsquared.core.util.PlayerManager; import com.plotsquared.core.util.task.RunnableVal; import com.plotsquared.core.util.task.RunnableVal2; import com.plotsquared.core.util.task.RunnableVal3; +import java.util.Map; import java.util.UUID; import java.util.concurrent.CompletableFuture; import java.util.concurrent.TimeoutException; +import java.util.function.Consumer; @CommandDeclaration(command = "grant", category = CommandCategory.CLAIMING, @@ -70,44 +73,51 @@ public class Grant extends Command { if (args.length > 2) { break; } - MainUtil.getUUIDsFromString(args[1], (uuids, throwable) -> { + PlayerManager.getUUIDsFromString(args[1], (uuids, throwable) -> { if (throwable instanceof TimeoutException) { MainUtil.sendMessage(player, Captions.FETCHING_PLAYERS_TIMEOUT); } else if (throwable != null || uuids.size() != 1) { MainUtil.sendMessage(player, Captions.INVALID_PLAYER); } else { final UUID uuid = uuids.toArray(new UUID[0])[0]; - MainUtil.getPersistentMeta(uuid, - "grantedPlots", new RunnableVal() { - @Override public void run(byte[] array) { - if (arg0.equals("check")) { // check - int granted; - if (array == null) { - granted = 0; - } else { - granted = Ints.fromByteArray(array); - } - Captions.GRANTED_PLOTS.send(player, granted); - } else { // add - int amount; - if (array == null) { - amount = 1; - } else { - amount = 1 + Ints.fromByteArray(array); - } - boolean replace = array != null; - String key = "grantedPlots"; - byte[] rawData = Ints.toByteArray(amount); + final Consumer result = array -> { + if (arg0.equals("check")) { // check + int granted; + if (array == null) { + granted = 0; + } else { + granted = Ints.fromByteArray(array); + } + Captions.GRANTED_PLOTS.send(player, granted); + } else { // add + int amount; + if (array == null) { + amount = 1; + } else { + amount = 1 + Ints.fromByteArray(array); + } + boolean replace = array != null; + String key = "grantedPlots"; + byte[] rawData = Ints.toByteArray(amount); - PlotPlayer online = PlotSquared.platform().getPlayerManager().getPlayerIfExists(uuid); - if (online != null) { - online.setPersistentMeta(key, rawData); - } else { - DBFunc.addPersistentMeta(uuid, key, rawData, replace); - } + PlotPlayer online = PlotSquared.platform().getPlayerManager().getPlayerIfExists(uuid); + if (online != null) { + online.setPersistentMeta(key, rawData); + } else { + DBFunc.addPersistentMeta(uuid, key, rawData, replace); } } - }); + }; + PlotPlayer pp = PlotSquared.platform().getPlayerManager().getPlayerIfExists(uuid); + if (pp != null) { + result.accept(player.getPersistentMeta("grantedPlots")); + } else { + DBFunc.getPersistentMeta(uuid, new RunnableVal>() { + @Override public void run(Map value) { + result.accept(value.get("grantedPlots")); + } + }); + } } }); return CompletableFuture.completedFuture(true); diff --git a/Core/src/main/java/com/plotsquared/core/command/HomeCommand.java b/Core/src/main/java/com/plotsquared/core/command/HomeCommand.java index 3cc72188a..715767e73 100644 --- a/Core/src/main/java/com/plotsquared/core/command/HomeCommand.java +++ b/Core/src/main/java/com/plotsquared/core/command/HomeCommand.java @@ -127,7 +127,7 @@ public class HomeCommand extends Command { break; } // either plot id or alias - Plot fromId = MainUtil.getPlotFromString(player, identifier, false); + Plot fromId = Plot.getPlotFromString(player, identifier, false); if (fromId != null && fromId.isOwner(player.getUUID())) { // it was a valid plot id basePlotOnly = false; diff --git a/Core/src/main/java/com/plotsquared/core/command/Info.java b/Core/src/main/java/com/plotsquared/core/command/Info.java index fab3d412f..ebc8a482b 100644 --- a/Core/src/main/java/com/plotsquared/core/command/Info.java +++ b/Core/src/main/java/com/plotsquared/core/command/Info.java @@ -32,7 +32,6 @@ import com.plotsquared.core.player.PlotPlayer; import com.plotsquared.core.plot.Plot; import com.plotsquared.core.plot.flag.implementations.HideInfoFlag; import com.plotsquared.core.util.MainUtil; -import com.plotsquared.core.util.task.RunnableVal; @CommandDeclaration(command = "info", aliases = "i", @@ -60,10 +59,10 @@ public class Info extends SubCommand { case "owner": case "rating": case "likes": - plot = MainUtil.getPlotFromString(player, null, false); + plot = Plot.getPlotFromString(player, null, false); break; default: - plot = MainUtil.getPlotFromString(player, arg, false); + plot = Plot.getPlotFromString(player, arg, false); if (args.length == 2) { arg = args[1]; } else { @@ -141,13 +140,9 @@ public class Info extends SubCommand { } else { full = false; } - MainUtil.format(info, plot, player, full, new RunnableVal() { - @Override public void run(String value) { - MainUtil.sendMessage(player, - Captions.PLOT_INFO_HEADER.getTranslated() + '\n' + value + '\n' - + Captions.PLOT_INFO_FOOTER.getTranslated(), false); - } - }); + plot.format(info, player, full).thenAcceptAsync(value -> + player.sendMessage(Captions.PLOT_INFO_HEADER.getTranslated() + '\n' + value + '\n' + + Captions.PLOT_INFO_FOOTER.getTranslated())); return true; } diff --git a/Core/src/main/java/com/plotsquared/core/command/Kick.java b/Core/src/main/java/com/plotsquared/core/command/Kick.java index 1b35df43c..2559900fc 100644 --- a/Core/src/main/java/com/plotsquared/core/command/Kick.java +++ b/Core/src/main/java/com/plotsquared/core/command/Kick.java @@ -35,6 +35,7 @@ import com.plotsquared.core.plot.Plot; import com.plotsquared.core.plot.world.PlotAreaManager; import com.plotsquared.core.util.MainUtil; import com.plotsquared.core.util.Permissions; +import com.plotsquared.core.util.PlayerManager; import com.plotsquared.core.util.TabCompletions; import com.plotsquared.core.util.WorldUtil; import javax.annotation.Nonnull; @@ -77,7 +78,7 @@ public class Kick extends SubCommand { return false; } - MainUtil.getUUIDsFromString(args[0], (uuids, throwable) -> { + PlayerManager.getUUIDsFromString(args[0], (uuids, throwable) -> { if (throwable instanceof TimeoutException) { MainUtil.sendMessage(player, Captions.FETCHING_PLAYERS_TIMEOUT); } else if (throwable != null || uuids.isEmpty()) { diff --git a/Core/src/main/java/com/plotsquared/core/command/ListCmd.java b/Core/src/main/java/com/plotsquared/core/command/ListCmd.java index 57bbe624a..49fa42f40 100644 --- a/Core/src/main/java/com/plotsquared/core/command/ListCmd.java +++ b/Core/src/main/java/com/plotsquared/core/command/ListCmd.java @@ -42,6 +42,7 @@ import com.plotsquared.core.util.EconHandler; import com.plotsquared.core.util.MainUtil; import com.plotsquared.core.util.MathMan; import com.plotsquared.core.util.Permissions; +import com.plotsquared.core.util.PlayerManager; import com.plotsquared.core.util.StringComparison; import com.plotsquared.core.util.StringMan; import com.plotsquared.core.util.TabCompletions; @@ -378,11 +379,11 @@ public class ListCmd extends SubCommand { } PlotMessage trusted = new PlotMessage().text(Captions.color( Captions.PLOT_INFO_TRUSTED.getTranslated() - .replaceAll("%trusted%", MainUtil.getPlayerList(plot.getTrusted())))) + .replaceAll("%trusted%", PlayerManager.getPlayerList(plot.getTrusted())))) .color("$1"); PlotMessage members = new PlotMessage().text(Captions.color( Captions.PLOT_INFO_MEMBERS.getTranslated() - .replaceAll("%members%", MainUtil.getPlayerList(plot.getMembers())))) + .replaceAll("%members%", PlayerManager.getPlayerList(plot.getMembers())))) .color("$1"); message.text("[").color("$3").text(i + "") .command("/plot visit " + plot.getArea() + ";" + plot.getId()) diff --git a/Core/src/main/java/com/plotsquared/core/command/Move.java b/Core/src/main/java/com/plotsquared/core/command/Move.java index 2ae527f54..e53a727de 100644 --- a/Core/src/main/java/com/plotsquared/core/command/Move.java +++ b/Core/src/main/java/com/plotsquared/core/command/Move.java @@ -81,7 +81,7 @@ public class Move extends SubCommand { PlotArea area = this.plotAreaManager.getPlotAreaByString(args[0]); Plot plot2; if (area == null) { - plot2 = MainUtil.getPlotFromString(player, args[0], true); + plot2 = Plot.getPlotFromString(player, args[0], true); if (plot2 == null) { return CompletableFuture.completedFuture(false); } diff --git a/Core/src/main/java/com/plotsquared/core/command/Owner.java b/Core/src/main/java/com/plotsquared/core/command/Owner.java index c4b0938fb..880dd5530 100644 --- a/Core/src/main/java/com/plotsquared/core/command/Owner.java +++ b/Core/src/main/java/com/plotsquared/core/command/Owner.java @@ -37,6 +37,7 @@ import com.plotsquared.core.plot.Plot; import com.plotsquared.core.util.EventDispatcher; import com.plotsquared.core.util.MainUtil; import com.plotsquared.core.util.Permissions; +import com.plotsquared.core.util.PlayerManager; import com.plotsquared.core.util.task.TaskManager; import javax.annotation.Nonnull; @@ -102,9 +103,9 @@ public class Owner extends SetCommand { MainUtil.sendMessage(player, Captions.SET_OWNER); return; } - final PlotPlayer other = PlotSquared.platform().getPlayerManager().getPlayerIfExists(uuid); + final PlotPlayer other = PlotSquared.platform().getPlayerManager().getPlayerIfExists(uuid); if (plot.isOwner(uuid)) { - Captions.ALREADY_OWNER.send(player, MainUtil.getName(uuid)); + Captions.ALREADY_OWNER.send(player, PlayerManager.getName(uuid)); return; } if (!force && !Permissions diff --git a/Core/src/main/java/com/plotsquared/core/command/Remove.java b/Core/src/main/java/com/plotsquared/core/command/Remove.java index b20a4da3a..ff9c66b7b 100644 --- a/Core/src/main/java/com/plotsquared/core/command/Remove.java +++ b/Core/src/main/java/com/plotsquared/core/command/Remove.java @@ -34,6 +34,7 @@ import com.plotsquared.core.plot.Plot; import com.plotsquared.core.util.EventDispatcher; import com.plotsquared.core.util.MainUtil; import com.plotsquared.core.util.Permissions; +import com.plotsquared.core.util.PlayerManager; import com.plotsquared.core.util.TabCompletions; import javax.annotation.Nonnull; @@ -74,7 +75,7 @@ public class Remove extends SubCommand { return true; } - MainUtil.getUUIDsFromString(args[0], (uuids, throwable) -> { + PlayerManager.getUUIDsFromString(args[0], (uuids, throwable) -> { int count = 0; if (throwable instanceof TimeoutException) { MainUtil.sendMessage(player, Captions.FETCHING_PLAYERS_TIMEOUT); diff --git a/Core/src/main/java/com/plotsquared/core/command/Swap.java b/Core/src/main/java/com/plotsquared/core/command/Swap.java index 9e7ce5208..ed97da1c0 100644 --- a/Core/src/main/java/com/plotsquared/core/command/Swap.java +++ b/Core/src/main/java/com/plotsquared/core/command/Swap.java @@ -63,7 +63,7 @@ public class Swap extends SubCommand { Captions.COMMAND_SYNTAX.send(player, getUsage()); return CompletableFuture.completedFuture(false); } - Plot plot2 = MainUtil.getPlotFromString(player, args[0], true); + Plot plot2 = Plot.getPlotFromString(player, args[0], true); if (plot2 == null) { return CompletableFuture.completedFuture(false); } diff --git a/Core/src/main/java/com/plotsquared/core/command/Target.java b/Core/src/main/java/com/plotsquared/core/command/Target.java index 3c0941c2c..effb3a7ba 100644 --- a/Core/src/main/java/com/plotsquared/core/command/Target.java +++ b/Core/src/main/java/com/plotsquared/core/command/Target.java @@ -69,7 +69,7 @@ public class Target extends SubCommand { MainUtil.sendMessage(player, Captions.FOUND_NO_PLOTS); return false; } - } else if ((target = MainUtil.getPlotFromString(player, args[0], true)) == null) { + } else if ((target = Plot.getPlotFromString(player, args[0], true)) == null) { return false; } target.getCenter(player::setCompassTarget); diff --git a/Core/src/main/java/com/plotsquared/core/command/Template.java b/Core/src/main/java/com/plotsquared/core/command/Template.java index 5e90d5a90..0f4e90897 100644 --- a/Core/src/main/java/com/plotsquared/core/command/Template.java +++ b/Core/src/main/java/com/plotsquared/core/command/Template.java @@ -27,6 +27,7 @@ package com.plotsquared.core.command; import com.google.inject.Inject; import com.plotsquared.core.PlotSquared; +import com.plotsquared.core.configuration.ConfigurationUtil; import com.plotsquared.core.inject.annotations.WorldConfig; import com.plotsquared.core.inject.annotations.WorldFile; import com.plotsquared.core.configuration.Captions; @@ -44,6 +45,7 @@ import com.plotsquared.core.queue.GlobalBlockQueue; import com.plotsquared.core.setup.PlotAreaBuilder; import com.plotsquared.core.setup.SettingsNodesWrapper; import com.plotsquared.core.util.FileBytes; +import com.plotsquared.core.util.FileUtils; import com.plotsquared.core.util.MainUtil; import com.plotsquared.core.util.SetupUtils; import com.plotsquared.core.util.WorldUtil; @@ -90,7 +92,7 @@ public class Template extends SubCommand { public static boolean extractAllFiles(String world, String template) { try { File folder = - MainUtil.getFile(PlotSquared.platform().getDirectory(), Settings.Paths.TEMPLATES); + FileUtils.getFile(PlotSquared.platform().getDirectory(), Settings.Paths.TEMPLATES); if (!folder.exists()) { return false; } @@ -144,8 +146,7 @@ public class Template extends SubCommand { } public static void zipAll(String world, Set files) throws IOException { - File output = - MainUtil.getFile(PlotSquared.platform().getDirectory(), Settings.Paths.TEMPLATES); + File output = FileUtils.getFile(PlotSquared.platform().getDirectory(), Settings.Paths.TEMPLATES); output.mkdirs(); try (FileOutputStream fos = new FileOutputStream( output + File.separator + world + ".template"); @@ -194,7 +195,7 @@ public class Template extends SubCommand { .sendMessage(player, "&cInvalid template file: " + args[2] + ".template"); return false; } - File worldFile = MainUtil.getFile(PlotSquared.platform().getDirectory(), + File worldFile = FileUtils.getFile(PlotSquared.platform().getDirectory(), Settings.Paths.TEMPLATES + File.separator + "tmp-data.yml"); YamlConfiguration worldConfig = YamlConfiguration.loadConfiguration(worldFile); this.worldConfiguration.set("worlds." + world, worldConfig.get("")); @@ -208,8 +209,8 @@ public class Template extends SubCommand { worldConfig.getString("generator.plugin", PlotSquared.platform().getPluginName()); String generator = worldConfig.getString("generator.init", manager); PlotAreaBuilder builder = PlotAreaBuilder.newBuilder() - .plotAreaType(MainUtil.getType(worldConfig)) - .terrainType(MainUtil.getTerrain(worldConfig)) + .plotAreaType(ConfigurationUtil.getType(worldConfig)) + .terrainType(ConfigurationUtil.getTerrain(worldConfig)) .plotManager(manager) .generatorName(generator) .settingsNodesWrapper(new SettingsNodesWrapper(new ConfigurationNode[0], null)) diff --git a/Core/src/main/java/com/plotsquared/core/command/Trust.java b/Core/src/main/java/com/plotsquared/core/command/Trust.java index a84feffc3..0003e0a67 100644 --- a/Core/src/main/java/com/plotsquared/core/command/Trust.java +++ b/Core/src/main/java/com/plotsquared/core/command/Trust.java @@ -33,6 +33,7 @@ import com.plotsquared.core.plot.Plot; import com.plotsquared.core.util.EventDispatcher; import com.plotsquared.core.util.MainUtil; import com.plotsquared.core.util.Permissions; +import com.plotsquared.core.util.PlayerManager; import com.plotsquared.core.util.TabCompletions; import com.plotsquared.core.util.task.RunnableVal2; import com.plotsquared.core.util.task.RunnableVal3; @@ -75,7 +76,7 @@ public class Trust extends Command { checkTrue(args.length == 1, Captions.COMMAND_SYNTAX, getUsage()); final CompletableFuture future = new CompletableFuture<>(); - MainUtil.getUUIDsFromString(args[0], (uuids, throwable) -> { + PlayerManager.getUUIDsFromString(args[0], (uuids, throwable) -> { if (throwable != null) { if (throwable instanceof TimeoutException) { Captions.FETCHING_PLAYERS_TIMEOUT.send(player); @@ -93,17 +94,17 @@ public class Trust extends Command { if (uuid == DBFunc.EVERYONE && !( Permissions.hasPermission(player, Captions.PERMISSION_TRUST_EVERYONE) || Permissions .hasPermission(player, Captions.PERMISSION_ADMIN_COMMAND_TRUST))) { - MainUtil.sendMessage(player, Captions.INVALID_PLAYER, MainUtil.getName(uuid)); + MainUtil.sendMessage(player, Captions.INVALID_PLAYER, PlayerManager.getName(uuid)); iterator.remove(); continue; } if (currentPlot.isOwner(uuid)) { - MainUtil.sendMessage(player, Captions.ALREADY_ADDED, MainUtil.getName(uuid)); + MainUtil.sendMessage(player, Captions.ALREADY_ADDED, PlayerManager.getName(uuid)); iterator.remove(); continue; } if (currentPlot.getTrusted().contains(uuid)) { - MainUtil.sendMessage(player, Captions.ALREADY_ADDED, MainUtil.getName(uuid)); + MainUtil.sendMessage(player, Captions.ALREADY_ADDED, PlayerManager.getName(uuid)); iterator.remove(); continue; } diff --git a/Core/src/main/java/com/plotsquared/core/command/Visit.java b/Core/src/main/java/com/plotsquared/core/command/Visit.java index 5982d9337..72b74efdd 100644 --- a/Core/src/main/java/com/plotsquared/core/command/Visit.java +++ b/Core/src/main/java/com/plotsquared/core/command/Visit.java @@ -37,6 +37,7 @@ import com.plotsquared.core.plot.world.PlotAreaManager; import com.plotsquared.core.util.MainUtil; import com.plotsquared.core.util.MathMan; import com.plotsquared.core.util.Permissions; +import com.plotsquared.core.util.PlayerManager; import com.plotsquared.core.util.TabCompletions; import com.plotsquared.core.util.query.PlotQuery; import com.plotsquared.core.util.query.SortingStrategy; @@ -178,7 +179,7 @@ public class Visit extends Command { final PlotArea finalSortByArea = sortByArea; int finalPage1 = page; - MainUtil.getUUIDsFromString(args[0], (uuids, throwable) -> { + PlayerManager.getUUIDsFromString(args[0], (uuids, throwable) -> { if (throwable instanceof TimeoutException) { Captions.FETCHING_PLAYERS_TIMEOUT.send(player); } else if (throwable != null || uuids.size() != 1) { @@ -219,7 +220,7 @@ public class Visit extends Command { }); } else { // Try to parse a plot - final Plot plot = MainUtil.getPlotFromString(player, finalArgs[0], true); + final Plot plot = Plot.getPlotFromString(player, finalArgs[0], true); if (plot != null) { this.visit(player, PlotQuery.newQuery().withPlot(plot), null, confirm, whenDone, 1); } diff --git a/Core/src/main/java/com/plotsquared/core/configuration/ConfigurationUtil.java b/Core/src/main/java/com/plotsquared/core/configuration/ConfigurationUtil.java index a5dd65f8e..73f54f34b 100644 --- a/Core/src/main/java/com/plotsquared/core/configuration/ConfigurationUtil.java +++ b/Core/src/main/java/com/plotsquared/core/configuration/ConfigurationUtil.java @@ -26,6 +26,9 @@ package com.plotsquared.core.configuration; import com.plotsquared.core.plot.BlockBucket; +import com.plotsquared.core.plot.PlotAreaTerrainType; +import com.plotsquared.core.plot.PlotAreaType; +import com.plotsquared.core.util.MathMan; import com.sk89q.worldedit.function.pattern.Pattern; import com.sk89q.worldedit.world.biome.BiomeType; import com.sk89q.worldedit.world.biome.BiomeTypes; @@ -33,6 +36,10 @@ import com.sk89q.worldedit.world.block.BlockState; import lombok.Getter; import javax.annotation.Nonnull; +import java.util.Optional; +import java.util.function.Function; +import java.util.function.IntFunction; +import java.util.function.Supplier; /** @@ -101,6 +108,29 @@ public class ConfigurationUtil { } }; + private static T getValueFromConfig(ConfigurationSection config, String path, + IntFunction> intParser, Function> textualParser, + Supplier defaultValue) { + String value = config.getString(path); + if (value == null) { + return defaultValue.get(); + } + if (MathMan.isInteger(value)) { + return intParser.apply(Integer.parseInt(value)).orElseGet(defaultValue); + } + return textualParser.apply(value).orElseGet(defaultValue); + } + + public static PlotAreaType getType(ConfigurationSection config) { + return getValueFromConfig(config, "generator.type", PlotAreaType::fromLegacyInt, + PlotAreaType::fromString, () -> PlotAreaType.NORMAL); + } + + public static PlotAreaTerrainType getTerrain(ConfigurationSection config) { + return getValueFromConfig(config, "generator.terrain", PlotAreaTerrainType::fromLegacyInt, + PlotAreaTerrainType::fromString, () -> PlotAreaTerrainType.NONE); + } + public static final class UnknownBlockException extends IllegalArgumentException { diff --git a/Core/src/main/java/com/plotsquared/core/database/SQLManager.java b/Core/src/main/java/com/plotsquared/core/database/SQLManager.java index cac8497dd..e73080a60 100644 --- a/Core/src/main/java/com/plotsquared/core/database/SQLManager.java +++ b/Core/src/main/java/com/plotsquared/core/database/SQLManager.java @@ -47,6 +47,7 @@ import com.plotsquared.core.plot.flag.GlobalFlagContainer; import com.plotsquared.core.plot.flag.PlotFlag; import com.plotsquared.core.plot.flag.types.BlockTypeListFlag; import com.plotsquared.core.util.EventDispatcher; +import com.plotsquared.core.util.HashUtil; import com.plotsquared.core.util.MainUtil; import com.plotsquared.core.util.StringMan; import com.plotsquared.core.util.task.RunnableVal; @@ -934,7 +935,7 @@ public class SQLManager implements AbstractDB { preparedStatement.setString(7, legacySettings.settings.getAlias()); } boolean[] merged = legacySettings.settings.getMerged(); - int hash = MainUtil.hash(merged); + int hash = HashUtil.hash(merged); preparedStatement.setInt(8, hash); BlockLoc loc = legacySettings.settings.getPosition(); String position; @@ -2049,7 +2050,7 @@ public class SQLManager implements AbstractDB { plot.getSettings().setMerged(merged); addPlotTask(plot, new UniqueStatement("setMerged") { @Override public void set(PreparedStatement statement) throws SQLException { - int hash = MainUtil.hash(merged); + int hash = HashUtil.hash(merged); statement.setInt(1, hash); statement.setInt(2, getId(plot)); } diff --git a/Core/src/main/java/com/plotsquared/core/generator/HybridPlotManager.java b/Core/src/main/java/com/plotsquared/core/generator/HybridPlotManager.java index c23c63b6c..de73d3891 100644 --- a/Core/src/main/java/com/plotsquared/core/generator/HybridPlotManager.java +++ b/Core/src/main/java/com/plotsquared/core/generator/HybridPlotManager.java @@ -37,9 +37,10 @@ import com.plotsquared.core.plot.PlotId; import com.plotsquared.core.queue.LocalBlockQueue; import com.plotsquared.core.util.ChunkManager; import com.plotsquared.core.util.FileBytes; -import com.plotsquared.core.util.MainUtil; +import com.plotsquared.core.util.FileUtils; import com.plotsquared.core.util.MathMan; import com.plotsquared.core.util.RegionManager; +import com.plotsquared.core.util.WorldUtil; import com.plotsquared.core.util.task.RunnableVal; import com.sk89q.worldedit.function.pattern.Pattern; import com.sk89q.worldedit.world.biome.BiomeType; @@ -47,12 +48,13 @@ import com.sk89q.worldedit.world.block.BaseBlock; import com.sk89q.worldedit.world.block.BlockState; import com.sk89q.worldedit.world.block.BlockTypes; import lombok.Getter; -import javax.annotation.Nonnull; +import javax.annotation.Nonnull; import java.io.File; import java.io.IOException; import java.nio.file.Files; import java.util.HashSet; +import java.util.Objects; public class HybridPlotManager extends ClassicPlotManager { @@ -77,7 +79,7 @@ public class HybridPlotManager extends ClassicPlotManager { .getWorldName() + File.separator; try { File sideRoad = - MainUtil.getFile(PlotSquared.platform().getDirectory(), dir + "sideroad.schem"); + FileUtils.getFile(PlotSquared.platform().getDirectory(), dir + "sideroad.schem"); String newDir = "schematics" + File.separator + "GEN_ROAD_SCHEMATIC" + File.separator + "__TEMP_DIR__" + File.separator; if (sideRoad.exists()) { @@ -85,12 +87,12 @@ public class HybridPlotManager extends ClassicPlotManager { Files.readAllBytes(sideRoad.toPath()))); } File intersection = - MainUtil.getFile(PlotSquared.platform().getDirectory(), dir + "intersection.schem"); + FileUtils.getFile(PlotSquared.platform().getDirectory(), dir + "intersection.schem"); if (intersection.exists()) { files.add(new FileBytes(newDir + "intersection.schem", Files.readAllBytes(intersection.toPath()))); } - File plot = MainUtil.getFile(PlotSquared.platform().getDirectory(), dir + "plot.schem"); + File plot = FileUtils.getFile(PlotSquared.platform().getDirectory(), dir + "plot.schem"); if (plot.exists()) { files.add(new FileBytes(newDir + "plot.schem", Files.readAllBytes(plot.toPath()))); } @@ -109,7 +111,7 @@ public class HybridPlotManager extends ClassicPlotManager { Location pos1 = Location.at(hybridPlotWorld.getWorldName(), top.getX() + 1, 0, bot.getZ() - 1); Location pos2 = Location.at(hybridPlotWorld.getWorldName(), bot.getX(), Math.min(getWorldHeight(), 255), top.getZ() + 1); - MainUtil.resetBiome(hybridPlotWorld, pos1, pos2); + this.resetBiome(hybridPlotWorld, pos1, pos2); if (!hybridPlotWorld.ROAD_SCHEMATIC_ENABLED) { return true; } @@ -119,6 +121,17 @@ public class HybridPlotManager extends ClassicPlotManager { return true; } + private void resetBiome(@Nonnull final HybridPlotWorld hybridPlotWorld, @Nonnull final Location pos1, + @Nonnull final Location pos2) { + BiomeType biome = hybridPlotWorld.getPlotBiome(); + if (!Objects.equals(PlotSquared.platform().getWorldUtil() + .getBiomeSynchronous(hybridPlotWorld.getWorldName(), (pos1.getX() + pos2.getX()) / 2, + (pos1.getZ() + pos2.getZ()) / 2), biome)) { + WorldUtil.setBiome(hybridPlotWorld.getWorldName(), pos1.getX(), pos1.getZ(), pos2.getX(), pos2.getZ(), + biome); + } + } + private void createSchemAbs(LocalBlockQueue queue, Location pos1, Location pos2, boolean isRoad) { int size = hybridPlotWorld.SIZE; @@ -170,7 +183,7 @@ public class HybridPlotManager extends ClassicPlotManager { Location pos1 = Location.at(hybridPlotWorld.getWorldName(), bot.getX() - 1, 0, top.getZ() + 1); Location pos2 = Location.at(hybridPlotWorld.getWorldName(), top.getX() + 1, Math.min(getWorldHeight(), 255), bot.getZ()); - MainUtil.resetBiome(hybridPlotWorld, pos1, pos2); + this.resetBiome(hybridPlotWorld, pos1, pos2); if (!hybridPlotWorld.ROAD_SCHEMATIC_ENABLED) { return true; } @@ -238,7 +251,7 @@ public class HybridPlotManager extends ClassicPlotManager { } /* Otherwise we need to set each component, as we don't want to regenerate the road or other plots that share the same chunk.*/ // Set the biome - MainUtil.setBiome(world, value[2], value[3], value[4], value[5], biome); + WorldUtil.setBiome(world, value[2], value[3], value[4], value[5], biome); // These two locations are for each component (e.g. bedrock, main block, floor, air) Location bot = Location.at(world, value[2], 0, value[3]); Location top = Location.at(world, value[4], 1, value[5]); diff --git a/Core/src/main/java/com/plotsquared/core/generator/HybridPlotWorld.java b/Core/src/main/java/com/plotsquared/core/generator/HybridPlotWorld.java index a4a0d3a28..063849ba5 100644 --- a/Core/src/main/java/com/plotsquared/core/generator/HybridPlotWorld.java +++ b/Core/src/main/java/com/plotsquared/core/generator/HybridPlotWorld.java @@ -39,7 +39,7 @@ import com.plotsquared.core.plot.PlotManager; import com.plotsquared.core.plot.schematic.Schematic; import com.plotsquared.core.queue.GlobalBlockQueue; import com.plotsquared.core.util.EconHandler; -import com.plotsquared.core.util.MainUtil; +import com.plotsquared.core.util.FileUtils; import com.plotsquared.core.util.MathMan; import com.plotsquared.core.util.RegionManager; import com.plotsquared.core.util.SchematicHandler; @@ -56,11 +56,11 @@ import com.sk89q.worldedit.util.Direction; import com.sk89q.worldedit.world.biome.BiomeType; import com.sk89q.worldedit.world.block.BaseBlock; import lombok.Getter; -import javax.annotation.Nonnull; -import javax.annotation.Nullable; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import javax.annotation.Nonnull; +import javax.annotation.Nullable; import javax.inject.Inject; import java.io.File; import java.lang.reflect.Field; @@ -219,9 +219,9 @@ public class HybridPlotWorld extends ClassicPlotWorld { // Try to determine root. This means that plot areas can have separate schematic // directories - if (!(root = MainUtil.getFile(PlotSquared.platform().getDirectory(), "schematics/GEN_ROAD_SCHEMATIC/" + + if (!(root = FileUtils.getFile(PlotSquared.platform().getDirectory(), "schematics/GEN_ROAD_SCHEMATIC/" + this.getWorldName() + "/" + this.getId())).exists()) { - root = MainUtil.getFile(PlotSquared.platform().getDirectory(), + root = FileUtils.getFile(PlotSquared.platform().getDirectory(), "schematics/GEN_ROAD_SCHEMATIC/" + this.getWorldName()); } diff --git a/Core/src/main/java/com/plotsquared/core/generator/SquarePlotManager.java b/Core/src/main/java/com/plotsquared/core/generator/SquarePlotManager.java index be5380cce..389214029 100644 --- a/Core/src/main/java/com/plotsquared/core/generator/SquarePlotManager.java +++ b/Core/src/main/java/com/plotsquared/core/generator/SquarePlotManager.java @@ -30,13 +30,13 @@ import com.plotsquared.core.location.Location; import com.plotsquared.core.plot.Plot; import com.plotsquared.core.plot.PlotArea; import com.plotsquared.core.plot.PlotId; -import com.plotsquared.core.util.MainUtil; +import com.plotsquared.core.util.HashUtil; import com.plotsquared.core.util.RegionManager; import com.sk89q.worldedit.regions.CuboidRegion; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import javax.annotation.Nonnull; +import javax.annotation.Nonnull; import java.util.Iterator; import java.util.Set; @@ -193,7 +193,7 @@ public abstract class SquarePlotManager extends GridPlotManager { PlotId id = PlotId.of(dx, dz); boolean[] merged = new boolean[] {rz <= pathWidthLower, rx > end, rz > end, rx <= pathWidthLower}; - int hash = MainUtil.hash(merged); + int hash = HashUtil.hash(merged); // Not merged, and no need to check if it is if (hash == 0) { return id; diff --git a/Core/src/main/java/com/plotsquared/core/listener/PlotListener.java b/Core/src/main/java/com/plotsquared/core/listener/PlotListener.java index 49610c8cb..2579976a4 100644 --- a/Core/src/main/java/com/plotsquared/core/listener/PlotListener.java +++ b/Core/src/main/java/com/plotsquared/core/listener/PlotListener.java @@ -58,16 +58,16 @@ import com.plotsquared.core.plot.flag.types.TimedFlag; import com.plotsquared.core.util.EventDispatcher; import com.plotsquared.core.util.MainUtil; import com.plotsquared.core.util.Permissions; +import com.plotsquared.core.util.PlayerManager; import com.plotsquared.core.util.StringMan; -import com.plotsquared.core.util.task.RunnableVal; import com.plotsquared.core.util.task.TaskManager; import com.plotsquared.core.util.task.TaskTime; import com.sk89q.worldedit.world.gamemode.GameMode; import com.sk89q.worldedit.world.gamemode.GameModes; import com.sk89q.worldedit.world.item.ItemType; import com.sk89q.worldedit.world.item.ItemTypes; -import javax.annotation.Nullable; +import javax.annotation.Nullable; import java.util.HashMap; import java.util.Iterator; import java.util.Map; @@ -155,12 +155,8 @@ public class PlotListener { final String greeting = plot.getFlag(GreetingFlag.class); if (!greeting.isEmpty()) { - MainUtil.format(Captions.PREFIX_GREETING.getTranslated() + greeting, plot, player, - false, new RunnableVal() { - @Override public void run(String value) { - MainUtil.sendMessage(player, value); - } - }); + plot.format(Captions.PREFIX_GREETING.getTranslated() + greeting, player, false) + .thenAcceptAsync(player::sendMessage); } if (plot.getFlag(NotifyEnterFlag.class)) { @@ -271,7 +267,7 @@ public class PlotListener { replacements.put("%world%", plot.getArea().toString()); replacements.put("%greeting%", greeting); replacements.put("%alias", plot.toString()); - replacements.put("%s", MainUtil.getName(plot.getOwner())); + replacements.put("%s", PlayerManager.getName(plot.getOwner())); String main = StringMan .replaceFromMap(Captions.TITLE_ENTERED_PLOT.getTranslated(), replacements); @@ -331,12 +327,8 @@ public class PlotListener { final String farewell = plot.getFlag(FarewellFlag.class); if (!farewell.isEmpty()) { - MainUtil.format(Captions.PREFIX_FAREWELL.getTranslated() + farewell, plot, player, - false, new RunnableVal() { - @Override public void run(String value) { - MainUtil.sendMessage(player, value); - } - }); + plot.format(Captions.PREFIX_FAREWELL.getTranslated() + farewell, player, false) + .thenAcceptAsync(player::sendMessage); } if (plot.getFlag(NotifyLeaveFlag.class)) { diff --git a/Core/src/main/java/com/plotsquared/core/plot/Plot.java b/Core/src/main/java/com/plotsquared/core/plot/Plot.java index ba18a5649..918388008 100644 --- a/Core/src/main/java/com/plotsquared/core/plot/Plot.java +++ b/Core/src/main/java/com/plotsquared/core/plot/Plot.java @@ -26,9 +26,12 @@ package com.plotsquared.core.plot; import com.google.common.collect.ImmutableSet; +import com.google.common.collect.Lists; import com.google.common.collect.Sets; import com.google.inject.Inject; import com.plotsquared.core.PlotSquared; +import com.plotsquared.core.command.Like; +import com.plotsquared.core.configuration.CaptionUtility; import com.plotsquared.core.configuration.Captions; import com.plotsquared.core.configuration.ConfigurationUtil; import com.plotsquared.core.configuration.Settings; @@ -45,6 +48,7 @@ import com.plotsquared.core.location.BlockLoc; import com.plotsquared.core.location.Direction; import com.plotsquared.core.location.Location; import com.plotsquared.core.location.PlotLoc; +import com.plotsquared.core.player.ConsolePlayer; import com.plotsquared.core.player.PlotPlayer; import com.plotsquared.core.plot.comment.PlotComment; import com.plotsquared.core.plot.expiration.ExpireManager; @@ -53,7 +57,10 @@ import com.plotsquared.core.plot.flag.FlagContainer; import com.plotsquared.core.plot.flag.GlobalFlagContainer; import com.plotsquared.core.plot.flag.InternalFlag; import com.plotsquared.core.plot.flag.PlotFlag; +import com.plotsquared.core.plot.flag.implementations.DescriptionFlag; import com.plotsquared.core.plot.flag.implementations.KeepFlag; +import com.plotsquared.core.plot.flag.implementations.ServerPlotFlag; +import com.plotsquared.core.plot.flag.types.DoubleFlag; import com.plotsquared.core.plot.schematic.Schematic; import com.plotsquared.core.queue.GlobalBlockQueue; import com.plotsquared.core.queue.LocalBlockQueue; @@ -61,9 +68,13 @@ import com.plotsquared.core.util.EventDispatcher; import com.plotsquared.core.util.MainUtil; import com.plotsquared.core.util.MathMan; import com.plotsquared.core.util.Permissions; +import com.plotsquared.core.util.PlayerManager; import com.plotsquared.core.util.RegionManager; +import com.plotsquared.core.util.RegionUtil; import com.plotsquared.core.util.SchematicHandler; +import com.plotsquared.core.util.TimeUtil; import com.plotsquared.core.util.WorldUtil; +import com.plotsquared.core.util.query.PlotQuery; import com.plotsquared.core.util.task.RunnableVal; import com.plotsquared.core.util.task.TaskManager; import com.plotsquared.core.util.task.TaskTime; @@ -86,6 +97,7 @@ import java.awt.geom.PathIterator; import java.awt.geom.Rectangle2D; import java.io.File; import java.net.URL; +import java.text.DecimalFormat; import java.util.ArrayDeque; import java.util.ArrayList; import java.util.Collection; @@ -124,24 +136,18 @@ import static com.plotsquared.core.util.entity.EntityCategories.CAP_VEHICLE; */ public class Plot { - private static final Logger logger = LoggerFactory.getLogger("P2/" + Plot.class.getSimpleName()); - public static final int MAX_HEIGHT = 256; + private static final Logger logger = LoggerFactory.getLogger("P2/" + Plot.class.getSimpleName()); + private static final DecimalFormat FLAG_DECIMAL_FORMAT = new DecimalFormat("0"); + + static { + FLAG_DECIMAL_FORMAT.setMaximumFractionDigits(340); + } + private static Set connected_cache; private static Set regions_cache; - @Nonnull private PlotId id; - - // These will be injected - @Inject private EventDispatcher eventDispatcher; - @Inject private PlotListener plotListener; - @Inject private RegionManager regionManager; - @Inject private GlobalBlockQueue blockQueue; - @Inject private WorldUtil worldUtil; - @Inject private SchematicHandler schematicHandler; - @Inject @ImpromptuPipeline private UUIDPipeline impromptuPipeline; - /** * Plot flag container */ @@ -150,7 +156,6 @@ public class Plot { * Has the plot changed since the last save cycle? */ public boolean countsTowardsMax = true; - /** * Represents whatever the database manager needs it to:
* - A value of -1 usually indicates the plot will not be stored in the DB
@@ -159,6 +164,15 @@ public class Plot { * @deprecated magical */ @Deprecated public int temp; + @Nonnull private PlotId id; + // These will be injected + @Inject private EventDispatcher eventDispatcher; + @Inject private PlotListener plotListener; + @Inject private RegionManager regionManager; + @Inject private GlobalBlockQueue blockQueue; + @Inject private WorldUtil worldUtil; + @Inject private SchematicHandler schematicHandler; + @Inject @ImpromptuPipeline private UUIDPipeline impromptuPipeline; /** * plot owner * (Merged plots can have multiple owners) @@ -284,6 +298,72 @@ public class Plot { PlotSquared.platform().getInjector().injectMembers(this); } + /** + * Get the plot from a string. + * + * @param player Provides a context for what world to search in. Prefixing the term with 'world_name;' will override this context. + * @param arg The search term + * @param message If a message should be sent to the player if a plot cannot be found + * @return The plot if only 1 result is found, or null + */ + @Nullable public static Plot getPlotFromString(PlotPlayer player, String arg, + boolean message) { + if (arg == null) { + if (player == null) { + if (message) { + logger.info("[P2] No plot area string was supplied"); + } + return null; + } + return player.getCurrentPlot(); + } + PlotArea area; + if (player != null) { + area = PlotSquared.get().getPlotAreaManager().getPlotAreaByString(arg); + if (area == null) { + area = player.getApplicablePlotArea(); + } + } else { + area = ConsolePlayer.getConsole().getApplicablePlotArea(); + } + String[] split = arg.split(";|,"); + PlotId id; + if (split.length == 4) { + area = PlotSquared.get().getPlotAreaManager() + .getPlotAreaByString(split[0] + ';' + split[1]); + id = PlotId.fromString(split[2] + ';' + split[3]); + } else if (split.length == 3) { + area = PlotSquared.get().getPlotAreaManager().getPlotAreaByString(split[0]); + id = PlotId.fromString(split[1] + ';' + split[2]); + } else if (split.length == 2) { + id = PlotId.fromString(arg); + } else { + Collection plots; + if (area == null) { + plots = PlotQuery.newQuery().allPlots().asList(); + } else { + plots = area.getPlots(); + } + for (Plot p : plots) { + String name = p.getAlias(); + if (!name.isEmpty() && name.equalsIgnoreCase(arg)) { + return p; + } + } + if (message) { + MainUtil.sendMessage(player, Captions.NOT_VALID_PLOT_ID); + } + return null; + } + if (area == null) { + if (message) { + MainUtil.sendMessage(player, Captions.NOT_VALID_PLOT_WORLD); + } + return null; + } + return area.getPlotAbs(id); + } + /** * Gets a plot from a string e.g. [area];[id] * @@ -329,6 +409,13 @@ public class Plot { return null; } + @Nonnull private static Location[] getCorners(@Nonnull final String world, + @Nonnull final CuboidRegion region) { + final BlockVector3 min = region.getMinimumPoint(); + final BlockVector3 max = region.getMaximumPoint(); + return new Location[] {Location.at(world, min), Location.at(world, max)}; + } + /** * Get the owner of this exact plot, as it is * stored in the database. @@ -471,7 +558,7 @@ public class Plot { * @see #getOwnerAbs() getOwnerAbs() to get the owner as stored in the database */ public UUID getOwner() { - if (MainUtil.isServerOwned(this)) { + if (this.getFlag(ServerPlotFlag.class)) { return DBFunc.SERVER; } return this.getOwnerAbs(); @@ -578,6 +665,15 @@ public class Plot { return this.id; } + /** + * Change the plot ID + * + * @param id new plot ID + */ + public void setId(@Nonnull final PlotId id) { + this.id = id; + } + /** * Gets the plot world object for this plot
* - The generic PlotArea object can be casted to its respective class for more control (e.g. HybridPlotWorld) @@ -961,7 +1057,7 @@ public class Plot { if (queue.isEmpty()) { Runnable run = () -> { for (CuboidRegion region : regions) { - Location[] corners = MainUtil.getCorners(getWorldName(), region); + Location[] corners = getCorners(getWorldName(), region); regionManager.clearAllEntities(corners[0], corners[1]); } TaskManager.runTask(whenDone); @@ -1071,7 +1167,7 @@ public class Plot { blockQueue.addEmptyTask(() -> { TaskManager.runTaskAsync(() -> { for (Plot current : plots) { - current.setSign(MainUtil.getName(current.getOwnerAbs())); + current.setSign(PlayerManager.getName(current.getOwnerAbs())); } }); }); @@ -1859,6 +1955,8 @@ public class Plot { return this.setComponent(component, parsed.toPattern()); } + //TODO Better documentation needed. + /** * Retrieve the biome of the plot. */ @@ -1867,6 +1965,8 @@ public class Plot { .getBiome(location.getWorldName(), location.getX(), location.getZ(), result)); } + //TODO Better documentation needed. + /** * @deprecated May cause synchronous chunk loads */ @@ -1876,8 +1976,6 @@ public class Plot { .getBiomeSynchronous(location.getWorldName(), location.getX(), location.getZ()); } - //TODO Better documentation needed. - /** * Returns the top location for the plot. */ @@ -1885,8 +1983,6 @@ public class Plot { return this.getManager().getPlotTopLocAbs(this.id).withWorld(this.getWorldName()); } - //TODO Better documentation needed. - /** * Returns the bottom location for the plot. */ @@ -2001,7 +2097,7 @@ public class Plot { if (!this.isMerged()) { return new Location[] {this.getBottomAbs(), this.getTopAbs()}; } - return MainUtil.getCorners(this.getWorldName(), this.getRegions()); + return RegionUtil.getCorners(this.getWorldName(), this.getRegions()); } /** @@ -2078,7 +2174,6 @@ public class Plot { return this.area + ";" + this.id.toString(); } - /** * Remove a denied player (use DBFunc as well)
* Using the * uuid will remove all users @@ -2179,8 +2274,8 @@ public class Plot { } } else { TaskManager.runTaskAsync(() -> { - String name = Plot.this.id + "," + Plot.this.area + ',' + MainUtil - .getName(Plot.this.getOwnerAbs()); + String name = Plot.this.id + "," + Plot.this.area + ',' + + PlayerManager.getName(Plot.this.getOwnerAbs()); boolean result = schematicHandler.save(value, Settings.Paths.SCHEMATICS + File.separator + name + ".schem"); if (whenDone != null) { @@ -2754,8 +2849,9 @@ public class Plot { PlotId top = PlotId.of(current.getId().getX(), current.getId().getY()); while (merge) { merge = false; - ArrayList ids = MainUtil.getPlotSelectionIds(PlotId.of(bot.getX(), bot.getY() - 1), - PlotId.of(top.getX(), bot.getY() - 1)); + List ids = Lists.newArrayList((Iterable) + PlotId.PlotRangeIterator.range(PlotId.of(bot.getX(), bot.getY() - 1), + PlotId.of(top.getX(), bot.getY() - 1))); boolean tmp = true; for (PlotId id : ids) { Plot plot = this.area.getPlotAbs(id); @@ -2768,8 +2864,9 @@ public class Plot { merge = true; bot = PlotId.of(bot.getX(), bot.getY() - 1); } - ids = MainUtil.getPlotSelectionIds(PlotId.of(top.getX() + 1, bot.getY()), - PlotId.of(top.getX() + 1, top.getY())); + ids = Lists.newArrayList((Iterable) + PlotId.PlotRangeIterator.range(PlotId.of(top.getX() + 1, bot.getY()), + PlotId.of(top.getX() + 1, top.getY()))); tmp = true; for (PlotId id : ids) { Plot plot = this.area.getPlotAbs(id); @@ -2782,8 +2879,9 @@ public class Plot { merge = true; top = PlotId.of(top.getX() + 1, top.getY()); } - ids = MainUtil.getPlotSelectionIds(PlotId.of(bot.getX(), top.getY() + 1), - PlotId.of(top.getX(), top.getY() + 1)); + ids = Lists.newArrayList((Iterable) + PlotId.PlotRangeIterator.range(PlotId.of(bot.getX(), top.getY() + 1), + PlotId.of(top.getX(), top.getY() + 1))); tmp = true; for (PlotId id : ids) { Plot plot = this.area.getPlotAbs(id); @@ -2796,8 +2894,9 @@ public class Plot { merge = true; top = PlotId.of(top.getX(), top.getY() + 1); } - ids = MainUtil.getPlotSelectionIds(PlotId.of(bot.getX() - 1, bot.getY()), - PlotId.of(bot.getX() - 1, top.getY())); + ids = Lists.newArrayList((Iterable) + PlotId.PlotRangeIterator.range(PlotId.of(bot.getX() - 1, bot.getY()), + PlotId.of(bot.getX() - 1, top.getY()))); tmp = true; for (PlotId id : ids) { Plot plot = this.area.getPlotAbs(id); @@ -2813,7 +2912,8 @@ public class Plot { } Location gtopabs = this.area.getPlotAbs(top).getTopAbs(); Location gbotabs = this.area.getPlotAbs(bot).getBottomAbs(); - visited.addAll(MainUtil.getPlotSelectionIds(bot, top)); + visited.addAll(Lists.newArrayList((Iterable) + PlotId.PlotRangeIterator.range(bot, top))); for (int x = bot.getX(); x <= top.getX(); x++) { Plot plot = this.area.getPlotAbs(PlotId.of(x, top.getY())); if (plot.getMerged(Direction.SOUTH)) { @@ -3194,7 +3294,7 @@ public class Plot { TaskManager.runTask(whenDone); } else { CuboidRegion region = regions.poll(); - Location[] corners = MainUtil.getCorners(getWorldName(), region); + Location[] corners = getCorners(getWorldName(), region); Location pos1 = corners[0]; Location pos2 = corners[1]; Location pos3 = pos1.add(offsetX, 0, offsetZ).withWorld(destination.getWorldName()); @@ -3226,7 +3326,7 @@ public class Plot { } final Runnable task = this; CuboidRegion region = regions.poll(); - Location[] corners = MainUtil.getCorners(getWorldName(), region); + Location[] corners = getCorners(getWorldName(), region); final Location pos1 = corners[0]; final Location pos2 = corners[1]; Location newPos = pos1.add(offsetX, 0, offsetZ).withWorld(destination.getWorldName()); @@ -3320,7 +3420,7 @@ public class Plot { return; } CuboidRegion region = regions.poll(); - Location[] corners = MainUtil.getCorners(getWorldName(), region); + Location[] corners = getCorners(getWorldName(), region); Location pos1 = corners[0]; Location pos2 = corners[1]; Location newPos = pos1 .add(offsetX, 0, offsetZ).withWorld(destination.getWorldName()); @@ -3381,13 +3481,158 @@ public class Plot { return FlagContainer.castUnsafe(flagInstance).getValue(); } + public CompletableFuture format(final String iInfo, PlotPlayer player, final boolean full) { + final CompletableFuture future = new CompletableFuture<>(); + int num = this.getConnectedPlots().size(); + String alias = !this.getAlias().isEmpty() ? this.getAlias() : Captions.NONE.getTranslated(); + Location bot = this.getCorners()[0]; + PlotSquared.platform().getWorldUtil() + .getBiome(this.getWorldName(), bot.getX(), bot.getZ(), biome -> { + String info = iInfo; + String trusted = PlayerManager.getPlayerList(this.getTrusted()); + String members = PlayerManager.getPlayerList(this.getMembers()); + String denied = PlayerManager.getPlayerList(this.getDenied()); + String seen; + if (Settings.Enabled_Components.PLOT_EXPIRY && ExpireManager.IMP != null) { + if (this.isOnline()) { + seen = Captions.NOW.getTranslated(); + } else { + int time = (int) (ExpireManager.IMP.getAge(this) / 1000); + if (time != 0) { + seen = TimeUtil.secToTime(time); + } else { + seen = Captions.UNKNOWN.getTranslated(); + } + } + } else { + seen = Captions.NEVER.getTranslated(); + } + + String description = this.getFlag(DescriptionFlag.class); + if (description.isEmpty()) { + description = Captions.PLOT_NO_DESCRIPTION.getTranslated(); + } + + StringBuilder flags = new StringBuilder(); + Collection> flagCollection = this.getApplicableFlags(true); + if (flagCollection.isEmpty()) { + flags.append(Captions.NONE.getTranslated()); + } else { + String prefix = " "; + for (final PlotFlag flag : flagCollection) { + Object value; + if (flag instanceof DoubleFlag && !Settings.General.SCIENTIFIC) { + value = FLAG_DECIMAL_FORMAT.format(flag.getValue()); + } else { + value = flag.toString(); + } + flags.append(prefix).append(CaptionUtility + .format(player, Captions.PLOT_FLAG_LIST.getTranslated(), flag.getName(), + CaptionUtility.formatRaw(player, value.toString(), ""))); + prefix = ", "; + } + } + boolean build = this.isAdded(player.getUUID()); + String owner = this.getOwners().isEmpty() ? "unowned" : PlayerManager.getPlayerList(this.getOwners()); + if (this.getArea() != null) { + info = info.replace("%area%", + this.getArea().getWorldName() + (this.getArea().getId() == null ? + "" : + "(" + this.getArea().getId() + ")")); + } else { + info = info.replace("%area%", Captions.NONE.getTranslated()); + } + info = info.replace("%id%", this.getId().toString()); + info = info.replace("%alias%", alias); + info = info.replace("%num%", String.valueOf(num)); + info = info.replace("%desc%", description); + info = info.replace("%biome%", biome.toString().toLowerCase()); + info = info.replace("%owner%", owner); + info = info.replace("%members%", members); + info = info.replace("%player%", player.getName()); + info = info.replace("%trusted%", trusted); + info = info.replace("%helpers%", members); + info = info.replace("%denied%", denied); + info = info.replace("%seen%", seen); + info = info.replace("%flags%", flags); + info = info.replace("%build%", String.valueOf(build)); + if (info.contains("%rating%")) { + final String newInfo = info; + TaskManager.runTaskAsync(() -> { + String info1; + if (Settings.Ratings.USE_LIKES) { + info1 = newInfo.replaceAll("%rating%", + String.format("%.0f%%", Like.getLikesPercentage(this) * 100D)); + } else { + int max = 10; + if (Settings.Ratings.CATEGORIES != null && !Settings.Ratings.CATEGORIES + .isEmpty()) { + max = 8; + } + if (full && Settings.Ratings.CATEGORIES != null + && Settings.Ratings.CATEGORIES.size() > 1) { + double[] ratings = this.getAverageRatings(); + String rating = ""; + String prefix = ""; + for (int i = 0; i < ratings.length; i++) { + rating += + prefix + Settings.Ratings.CATEGORIES.get(i) + '=' + String + .format("%.1f", ratings[i]); + prefix = ","; + } + info1 = newInfo.replaceAll("%rating%", rating); + } else { + info1 = newInfo.replaceAll("%rating%", + String.format("%.1f", this.getAverageRating()) + '/' + max); + } + } + future.complete(info1); + }); + return; + } + future.complete(info); + }); + return future; + } + /** - * Change the plot ID + * If rating categories are enabled, get the average rating by category.
+ * - The index corresponds to the index of the category in the config * - * @param id new plot ID + * @return Average ratings in each category */ - public void setId(@Nonnull final PlotId id) { - this.id = id; + public double[] getAverageRatings() { + Map rating; + if (this.getSettings().getRatings() != null) { + rating = this.getSettings().getRatings(); + } else if (Settings.Enabled_Components.RATING_CACHE) { + rating = new HashMap<>(); + } else { + rating = DBFunc.getRatings(this); + } + int size = 1; + if (!Settings.Ratings.CATEGORIES.isEmpty()) { + size = Math.max(1, Settings.Ratings.CATEGORIES.size()); + } + double[] ratings = new double[size]; + if (rating == null || rating.isEmpty()) { + return ratings; + } + for (Entry entry : rating.entrySet()) { + int current = entry.getValue(); + if (Settings.Ratings.CATEGORIES.isEmpty()) { + ratings[0] += current; + } else { + for (int i = 0; i < Settings.Ratings.CATEGORIES.size(); i++) { + ratings[i] += current % 10 - 1; + current /= 10; + } + } + } + for (int i = 0; i < size; i++) { + ratings[i] /= rating.size(); + } + return ratings; } } diff --git a/Core/src/main/java/com/plotsquared/core/plot/PlotArea.java b/Core/src/main/java/com/plotsquared/core/plot/PlotArea.java index 027e73e0b..815bdeae2 100644 --- a/Core/src/main/java/com/plotsquared/core/plot/PlotArea.java +++ b/Core/src/main/java/com/plotsquared/core/plot/PlotArea.java @@ -27,6 +27,7 @@ package com.plotsquared.core.plot; import com.google.common.collect.ImmutableMap; import com.google.common.collect.ImmutableSet; +import com.google.common.collect.Lists; import com.plotsquared.core.collection.QuadMap; import com.plotsquared.core.configuration.CaptionUtility; import com.plotsquared.core.configuration.Captions; @@ -51,7 +52,6 @@ import com.plotsquared.core.queue.GlobalBlockQueue; import com.plotsquared.core.queue.LocalBlockQueue; import com.plotsquared.core.util.EconHandler; import com.plotsquared.core.util.Expression; -import com.plotsquared.core.util.MainUtil; import com.plotsquared.core.util.MathMan; import com.plotsquared.core.util.RegionUtil; import com.plotsquared.core.util.StringMan; @@ -271,8 +271,8 @@ public abstract class PlotArea { throw new IllegalArgumentException("Must extend GridPlotWorld to provide"); } if (config.contains("generator.terrain")) { - this.terrain = MainUtil.getTerrain(config); - this.type = MainUtil.getType(config); + this.terrain = ConfigurationUtil.getTerrain(config); + this.type = ConfigurationUtil.getType(config); } this.mobSpawning = config.getBoolean("natural_mob_spawning"); this.miscSpawnUnowned = config.getBoolean("misc_spawn_unowned"); @@ -993,7 +993,8 @@ public abstract class PlotArea { final int size = (1 + pos2.getX() - pos1.getX()) * (1 + pos2.getY() - pos1.getY()); final Set result = new HashSet<>(); if (size < 16 || size < getPlotCount()) { - for (final PlotId pid : MainUtil.getPlotSelectionIds(pos1, pos2)) { + for (final PlotId pid : Lists.newArrayList((Iterable) + PlotId.PlotRangeIterator.range(pos1, pos2))) { final Plot plot = getPlotAbs(pid); if (plot.hasOwner()) { if (plot.getId().getX() > pos1.getX() || plot.getId().getY() > pos1.getY() diff --git a/Core/src/main/java/com/plotsquared/core/plot/PlotCluster.java b/Core/src/main/java/com/plotsquared/core/plot/PlotCluster.java index f5ec63146..92821ead6 100644 --- a/Core/src/main/java/com/plotsquared/core/plot/PlotCluster.java +++ b/Core/src/main/java/com/plotsquared/core/plot/PlotCluster.java @@ -25,15 +25,15 @@ */ package com.plotsquared.core.plot; +import com.plotsquared.core.PlotSquared; import com.plotsquared.core.database.DBFunc; import com.plotsquared.core.location.BlockLoc; import com.plotsquared.core.location.Location; -import com.plotsquared.core.util.MainUtil; import com.plotsquared.core.util.RegionUtil; import com.sk89q.worldedit.regions.CuboidRegion; + import javax.annotation.Nonnull; import javax.annotation.Nullable; - import java.util.HashSet; import java.util.UUID; import java.util.function.Consumer; @@ -156,13 +156,16 @@ public class PlotCluster { public void getHome(@Nonnull final Consumer result) { final BlockLoc home = this.settings.getPosition(); Consumer locationConsumer = toReturn -> - MainUtil.getHighestBlock(this.area.getWorldName(), toReturn.getX(), toReturn.getZ(), - max -> { - if (max > toReturn.getY()) { - result.accept(toReturn.withY(1 + max)); - } else { - result.accept(toReturn); - } + PlotSquared.platform().getWorldUtil().getHighestBlock(this.area.getWorldName(), toReturn.getX(), toReturn.getZ(), + highest -> { + if (highest == 0) { + highest = 63; + } + if (highest > toReturn.getY()) { + result.accept(toReturn.withY(1 + highest)); + } else { + result.accept(toReturn); + } }); if (home.getY() == 0) { // default pos diff --git a/Core/src/main/java/com/plotsquared/core/plot/expiration/ExpireManager.java b/Core/src/main/java/com/plotsquared/core/plot/expiration/ExpireManager.java index 68f2c4b89..2a3514540 100644 --- a/Core/src/main/java/com/plotsquared/core/plot/expiration/ExpireManager.java +++ b/Core/src/main/java/com/plotsquared/core/plot/expiration/ExpireManager.java @@ -40,6 +40,7 @@ import com.plotsquared.core.plot.flag.GlobalFlagContainer; import com.plotsquared.core.plot.flag.PlotFlag; import com.plotsquared.core.plot.flag.implementations.AnalysisFlag; import com.plotsquared.core.plot.flag.implementations.KeepFlag; +import com.plotsquared.core.plot.flag.implementations.ServerPlotFlag; import com.plotsquared.core.plot.message.PlotMessage; import com.plotsquared.core.util.EventDispatcher; import com.plotsquared.core.util.MainUtil; @@ -215,7 +216,7 @@ public class ExpireManager { return new ArrayList<>(); } - if (MainUtil.isServerOwned(plot)) { + if (plot.getFlag(ServerPlotFlag.class)) { return new ArrayList<>(); } diff --git a/Core/src/main/java/com/plotsquared/core/plot/flag/implementations/KeepFlag.java b/Core/src/main/java/com/plotsquared/core/plot/flag/implementations/KeepFlag.java index 187237f2a..d4a1b263b 100644 --- a/Core/src/main/java/com/plotsquared/core/plot/flag/implementations/KeepFlag.java +++ b/Core/src/main/java/com/plotsquared/core/plot/flag/implementations/KeepFlag.java @@ -28,8 +28,9 @@ package com.plotsquared.core.plot.flag.implementations; import com.plotsquared.core.configuration.Captions; import com.plotsquared.core.plot.flag.FlagParseException; import com.plotsquared.core.plot.flag.PlotFlag; -import com.plotsquared.core.util.MainUtil; import com.plotsquared.core.util.MathMan; +import com.plotsquared.core.util.TimeUtil; + import javax.annotation.Nonnull; public class KeepFlag extends PlotFlag { @@ -60,7 +61,7 @@ public class KeepFlag extends PlotFlag { case "false": return flagOf(false); default: - return flagOf(MainUtil.timeToSec(input) * 1000 + System.currentTimeMillis()); + return flagOf(TimeUtil.timeToSec(input) * 1000 + System.currentTimeMillis()); } } diff --git a/Core/src/main/java/com/plotsquared/core/plot/world/SinglePlotManager.java b/Core/src/main/java/com/plotsquared/core/plot/world/SinglePlotManager.java index 2335735fd..82aaa7a3f 100644 --- a/Core/src/main/java/com/plotsquared/core/plot/world/SinglePlotManager.java +++ b/Core/src/main/java/com/plotsquared/core/plot/world/SinglePlotManager.java @@ -31,11 +31,11 @@ import com.plotsquared.core.plot.Plot; import com.plotsquared.core.plot.PlotArea; import com.plotsquared.core.plot.PlotId; import com.plotsquared.core.plot.PlotManager; -import com.plotsquared.core.util.MainUtil; +import com.plotsquared.core.util.FileUtils; import com.plotsquared.core.util.task.TaskManager; import com.sk89q.worldedit.function.pattern.Pattern; -import javax.annotation.Nonnull; +import javax.annotation.Nonnull; import java.io.File; import java.util.List; @@ -65,7 +65,7 @@ public class SinglePlotManager extends PlotManager { PlotSquared.platform().getSetupUtils().unload(plot.getWorldName(), false); final File worldFolder = new File(PlotSquared.platform().getWorldContainer(), plot.getWorldName()); TaskManager.getPlatformImplementation().taskAsync(() -> { - MainUtil.deleteDirectory(worldFolder); + FileUtils.deleteDirectory(worldFolder); if (whenDone != null) { whenDone.run(); } diff --git a/Core/src/main/java/com/plotsquared/core/util/FileUtils.java b/Core/src/main/java/com/plotsquared/core/util/FileUtils.java new file mode 100644 index 000000000..54e674b77 --- /dev/null +++ b/Core/src/main/java/com/plotsquared/core/util/FileUtils.java @@ -0,0 +1,67 @@ +/* + * _____ _ _ _____ _ + * | __ \| | | | / ____| | | + * | |__) | | ___ | |_| (___ __ _ _ _ __ _ _ __ ___ __| | + * | ___/| |/ _ \| __|\___ \ / _` | | | |/ _` | '__/ _ \/ _` | + * | | | | (_) | |_ ____) | (_| | |_| | (_| | | | __/ (_| | + * |_| |_|\___/ \__|_____/ \__, |\__,_|\__,_|_| \___|\__,_| + * | | + * |_| + * PlotSquared plot management system for Minecraft + * Copyright (C) 2020 IntellectualSites + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package com.plotsquared.core.util; + +import javax.annotation.Nonnull; +import java.io.File; +import java.nio.file.Paths; + +public final class FileUtils { + + private FileUtils() { + } + + /** + * Attempt to (recursively) delete a directory + * + * @param directory Directory to delete + * @throws RuntimeException If the deletion fails + */ + public static void deleteDirectory(@Nonnull final File directory) { + if (directory.exists()) { + final File[] files = directory.listFiles(); + if (null != files) { + for (final File file : files) { + if (file.isDirectory()) { + deleteDirectory(file); + } + } + } + } + if (!directory.delete()) { + throw new RuntimeException( + String.format("Failed to delete directory %s", directory.getName())); + } + } + + @Nonnull public static File getFile(@Nonnull final File base, @Nonnull final String path) { + if (Paths.get(path).isAbsolute()) { + return new File(path); + } + return new File(base, path); + } + +} diff --git a/Core/src/main/java/com/plotsquared/core/util/HashUtil.java b/Core/src/main/java/com/plotsquared/core/util/HashUtil.java new file mode 100644 index 000000000..99f45878c --- /dev/null +++ b/Core/src/main/java/com/plotsquared/core/util/HashUtil.java @@ -0,0 +1,57 @@ +/* + * _____ _ _ _____ _ + * | __ \| | | | / ____| | | + * | |__) | | ___ | |_| (___ __ _ _ _ __ _ _ __ ___ __| | + * | ___/| |/ _ \| __|\___ \ / _` | | | |/ _` | '__/ _ \/ _` | + * | | | | (_) | |_ ____) | (_| | |_| | (_| | | | __/ (_| | + * |_| |_|\___/ \__|_____/ \__, |\__,_|\__,_|_| \___|\__,_| + * | | + * |_| + * PlotSquared plot management system for Minecraft + * Copyright (C) 2020 IntellectualSites + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package com.plotsquared.core.util; + +import javax.annotation.Nonnull; + +public final class HashUtil { + + private HashUtil() { + } + + /** + * Hashcode of a boolean array.
+ * - Used for traversing mega plots quickly. + * + * @param array Booleans to hash + * @return hashcode + */ + public static int hash(@Nonnull final boolean[] array) { + if (array.length == 4) { + if (!array[0] && !array[1] && !array[2] && !array[3]) { + return 0; + } + return ((array[0] ? 1 : 0) << 3) + ((array[1] ? 1 : 0) << 2) + ((array[2] ? 1 : 0) << 1) + + (array[3] ? 1 : 0); + } + int n = 0; + for (boolean anArray : array) { + n = (n << 1) + (anArray ? 1 : 0); + } + return n; + } + +} diff --git a/Core/src/main/java/com/plotsquared/core/util/MainUtil.java b/Core/src/main/java/com/plotsquared/core/util/MainUtil.java index fb169c3e6..e81b54e6e 100644 --- a/Core/src/main/java/com/plotsquared/core/util/MainUtil.java +++ b/Core/src/main/java/com/plotsquared/core/util/MainUtil.java @@ -25,87 +25,23 @@ */ package com.plotsquared.core.util; -import com.plotsquared.core.PlotSquared; -import com.plotsquared.core.command.Like; import com.plotsquared.core.configuration.Caption; import com.plotsquared.core.configuration.CaptionUtility; import com.plotsquared.core.configuration.Captions; -import com.plotsquared.core.configuration.ConfigurationSection; -import com.plotsquared.core.configuration.Settings; -import com.plotsquared.core.database.DBFunc; -import com.plotsquared.core.location.Location; -import com.plotsquared.core.player.ConsolePlayer; import com.plotsquared.core.player.PlotPlayer; -import com.plotsquared.core.plot.Plot; -import com.plotsquared.core.plot.PlotArea; -import com.plotsquared.core.plot.PlotAreaTerrainType; -import com.plotsquared.core.plot.PlotAreaType; -import com.plotsquared.core.plot.PlotId; -import com.plotsquared.core.plot.expiration.ExpireManager; -import com.plotsquared.core.plot.flag.PlotFlag; -import com.plotsquared.core.plot.flag.implementations.DescriptionFlag; -import com.plotsquared.core.plot.flag.implementations.ServerPlotFlag; -import com.plotsquared.core.plot.flag.types.DoubleFlag; -import com.plotsquared.core.util.net.AbstractDelegateOutputStream; -import com.plotsquared.core.util.query.PlotQuery; -import com.plotsquared.core.util.task.RunnableVal; import com.plotsquared.core.util.task.TaskManager; -import com.plotsquared.core.uuid.UUIDMapping; -import com.sk89q.worldedit.math.BlockVector2; -import com.sk89q.worldedit.math.BlockVector3; -import com.sk89q.worldedit.regions.CuboidRegion; -import com.sk89q.worldedit.world.biome.BiomeType; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import javax.annotation.Nonnull; -import javax.annotation.Nullable; -import java.io.File; -import java.io.IOException; -import java.io.OutputStream; -import java.io.OutputStreamWriter; -import java.io.PrintWriter; -import java.net.HttpURLConnection; -import java.net.MalformedURLException; -import java.net.URL; -import java.net.URLConnection; -import java.nio.charset.StandardCharsets; -import java.nio.file.Paths; -import java.text.DecimalFormat; -import java.util.ArrayList; -import java.util.Collection; -import java.util.Collections; -import java.util.HashMap; -import java.util.HashSet; -import java.util.LinkedList; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; -import java.util.Objects; -import java.util.Optional; -import java.util.Scanner; -import java.util.Set; -import java.util.UUID; -import java.util.concurrent.TimeUnit; -import java.util.function.BiConsumer; -import java.util.function.Function; -import java.util.function.IntConsumer; -import java.util.function.IntFunction; -import java.util.function.Supplier; -import java.util.stream.Collectors; -import java.util.stream.IntStream; /** * plot functions */ public class MainUtil { - private static final Logger logger = LoggerFactory.getLogger("P2/" + MainUtil.class.getSimpleName()); - private static final DecimalFormat FLAG_DECIMAL_FORMAT = new DecimalFormat("0"); - - static { - FLAG_DECIMAL_FORMAT.setMaximumFractionDigits(340); - } + private static final Logger logger = + LoggerFactory.getLogger("P2/" + MainUtil.class.getSimpleName()); /** * Cache of mapping x,y,z coordinates to the chunk array
@@ -154,482 +90,6 @@ public class MainUtil { } } - public static void upload(@Nullable UUID uuid, @Nullable final String file, - @Nonnull final String extension, @Nullable final RunnableVal writeTask, - @Nonnull final RunnableVal whenDone) { - if (writeTask == null) { - TaskManager.runTask(whenDone); - return; - } - final String filename; - final String website; - if (uuid == null) { - uuid = UUID.randomUUID(); - website = Settings.Web.URL + "upload.php?" + uuid; - filename = "plot." + extension; - } else { - website = Settings.Web.URL + "save.php?" + uuid; - filename = file + '.' + extension; - } - final URL url; - try { - url = new URL(Settings.Web.URL + "?key=" + uuid + "&type=" + extension); - } catch (MalformedURLException e) { - e.printStackTrace(); - whenDone.run(); - return; - } - TaskManager.runTaskAsync(() -> { - try { - String boundary = Long.toHexString(System.currentTimeMillis()); - URLConnection con = new URL(website).openConnection(); - con.setDoOutput(true); - con.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + boundary); - try (OutputStream output = con.getOutputStream(); - PrintWriter writer = new PrintWriter( - new OutputStreamWriter(output, StandardCharsets.UTF_8), true)) { - String CRLF = "\r\n"; - writer.append("--" + boundary).append(CRLF); - writer.append("Content-Disposition: form-data; name=\"param\"").append(CRLF); - writer.append( - "Content-Type: text/plain; charset=" + StandardCharsets.UTF_8.displayName()) - .append(CRLF); - String param = "value"; - writer.append(CRLF).append(param).append(CRLF).flush(); - writer.append("--" + boundary).append(CRLF); - writer.append( - "Content-Disposition: form-data; name=\"schematicFile\"; filename=\"" - + filename + '"').append(CRLF); - writer - .append("Content-Type: " + URLConnection.guessContentTypeFromName(filename)) - .append(CRLF); - writer.append("Content-Transfer-Encoding: binary").append(CRLF); - writer.append(CRLF).flush(); - writeTask.value = new AbstractDelegateOutputStream(output) { - @Override public void close() { - } // Don't close - }; - writeTask.run(); - output.flush(); - writer.append(CRLF).flush(); - writer.append("--" + boundary + "--").append(CRLF).flush(); - } - String content; - try (Scanner scanner = new Scanner(con.getInputStream()).useDelimiter("\\A")) { - content = scanner.next().trim(); - } - if (!content.startsWith("<")) { - } - int responseCode = ((HttpURLConnection) con).getResponseCode(); - if (responseCode == 200) { - whenDone.value = url; - } - TaskManager.runTask(whenDone); - } catch (IOException e) { - e.printStackTrace(); - TaskManager.runTask(whenDone); - } - }); - } - - /** - * Resets the biome if it was modified - * - * @param area - * @param pos1 - * @param pos2 - * @return true if any changes were made - */ - public static boolean resetBiome(PlotArea area, Location pos1, Location pos2) { - BiomeType biome = area.getPlotBiome(); - if (!Objects.equals(PlotSquared.platform().getWorldUtil().getBiomeSynchronous(area.getWorldName(), (pos1.getX() + pos2.getX()) / 2, - (pos1.getZ() + pos2.getZ()) / 2), biome)) { - MainUtil - .setBiome(area.getWorldName(), pos1.getX(), pos1.getZ(), pos2.getX(), pos2.getZ(), - biome); - return true; - } - return false; - } - - public static String secToTime(long time) { - StringBuilder toreturn = new StringBuilder(); - if (time >= 33868800) { - int years = (int) (time / 33868800); - time -= years * 33868800; - toreturn.append(years + "y "); - } - if (time >= 604800) { - int weeks = (int) (time / 604800); - time -= weeks * 604800; - toreturn.append(weeks + "w "); - } - if (time >= 86400) { - int days = (int) (time / 86400); - time -= days * 86400; - toreturn.append(days + "d "); - } - if (time >= 3600) { - int hours = (int) (time / 3600); - time -= hours * 3600; - toreturn.append(hours + "h "); - } - if (time >= 60) { - int minutes = (int) (time / 60); - time -= minutes * 60; - toreturn.append(minutes + "m "); - } - if (toreturn.equals("") || time > 0) { - toreturn.append((time) + "s "); - } - return toreturn.toString().trim(); - } - - public static long timeToSec(String string) { - if (MathMan.isInteger(string)) { - return Long.parseLong(string); - } - string = string.toLowerCase().trim().toLowerCase(); - if (string.equalsIgnoreCase("false")) { - return 0; - } - String[] split = string.split(" "); - long time = 0; - for (String value : split) { - int nums = Integer.parseInt(value.replaceAll("[^\\d]", "")); - String letters = value.replaceAll("[^a-z]", ""); - switch (letters) { - case "week": - case "weeks": - case "wks": - case "w": - - time += 604800 * nums; - case "days": - case "day": - case "d": - time += 86400 * nums; - case "hour": - case "hr": - case "hrs": - case "hours": - case "h": - time += 3600 * nums; - case "minutes": - case "minute": - case "mins": - case "min": - case "m": - time += 60 * nums; - case "seconds": - case "second": - case "secs": - case "sec": - case "s": - time += nums; - } - } - return time; - } - - /** - * Hashcode of a boolean array.
- * - Used for traversing mega plots quickly. - * - * @param array - * @return hashcode - */ - public static int hash(boolean[] array) { - if (array.length == 4) { - if (!array[0] && !array[1] && !array[2] && !array[3]) { - return 0; - } - return ((array[0] ? 1 : 0) << 3) + ((array[1] ? 1 : 0) << 2) + ((array[2] ? 1 : 0) << 1) - + (array[3] ? 1 : 0); - } - int n = 0; - for (boolean anArray : array) { - n = (n << 1) + (anArray ? 1 : 0); - } - return n; - } - - /** - * Get a list of plot ids within a selection. - * - * @param pos1 - * @param pos2 - * @return - */ - public static ArrayList getPlotSelectionIds(PlotId pos1, PlotId pos2) { - ArrayList myPlots = new ArrayList<>(); - for (int x = pos1.getX(); x <= pos2.getX(); x++) { - for (int y = pos1.getY(); y <= pos2.getY(); y++) { - myPlots.add(PlotId.of(x, y)); - } - } - return myPlots; - } - - /** - * Get the name from a UUID. - * - * @param owner Owner UUID - * @return The player's name, None, Everyone or Unknown - */ - @Nonnull public static String getName(@Nullable UUID owner) { - return getName(owner, true); - } - - /** - * Get the name from a UUID. - * - * @param owner Owner UUID - * @param blocking Whether or not the operation can be blocking - * @return The player's name, None, Everyone or Unknown - */ - @Nonnull public static String getName(@Nullable final UUID owner, final boolean blocking) { - if (owner == null) { - return Captions.NONE.getTranslated(); - } - if (owner.equals(DBFunc.EVERYONE)) { - return Captions.EVERYONE.getTranslated(); - } - if (owner.equals(DBFunc.SERVER)) { - return Captions.SERVER.getTranslated(); - } - final String name; - if (blocking) { - name = PlotSquared.get().getImpromptuUUIDPipeline().getSingle(owner, Settings.UUID.BLOCKING_TIMEOUT); - } else { - final UUIDMapping uuidMapping = PlotSquared.get().getImpromptuUUIDPipeline().getImmediately(owner); - if (uuidMapping != null) { - name = uuidMapping.getUsername(); - } else { - name = null; - } - } - if (name == null) { - return Captions.UNKNOWN.getTranslated(); - } - return name; - } - - public static boolean isServerOwned(Plot plot) { - return plot.getFlag(ServerPlotFlag.class); - } - - @Nonnull public static Location[] getCorners(@Nonnull final String world, @Nonnull final CuboidRegion region) { - final BlockVector3 min = region.getMinimumPoint(); - final BlockVector3 max = region.getMaximumPoint(); - return new Location[] {Location.at(world, min), Location.at(world, max)}; - } - - /** - * Get the corner locations for a list of regions. - * - * @param world - * @param regions - * @return - * @see Plot#getCorners() - */ - @Nonnull public static Location[] getCorners(String world, Collection regions) { - Location min = null; - Location max = null; - for (CuboidRegion region : regions) { - Location[] corners = getCorners(world, region); - if (min == null) { - min = corners[0]; - max = corners[1]; - continue; - } - Location pos1 = corners[0]; - Location pos2 = corners[1]; - if (pos2.getX() > max.getX()) { - max = max.withX(pos2.getX()); - } - if (pos1.getX() < min.getX()) { - min = min.withX(pos1.getX()); - } - if (pos2.getZ() > max.getZ()) { - max = max.withZ(pos2.getZ()); - } - if (pos1.getZ() < min.getZ()) { - min = min.withZ(pos1.getZ()); - } - } - return new Location[] {min, max}; - } - - /** - * Fuzzy plot search with spaces separating terms. - * - Terms: type, alias, world, owner, trusted, member - * - * @param search - * @return - */ - public static List getPlotsBySearch(String search) { - String[] split = search.split(" "); - int size = split.length * 2; - - List uuids = new ArrayList<>(); - PlotId id = null; - - for (String term : split) { - try { - UUID uuid = PlotSquared.get().getImpromptuUUIDPipeline().getSingle(term, Settings.UUID.BLOCKING_TIMEOUT); - if (uuid == null) { - uuid = UUID.fromString(term); - } - uuids.add(uuid); - } catch (Exception ignored) { - id = PlotId.fromString(term); - } - } - - ArrayList> plotList = - IntStream.range(0, size).mapToObj(i -> new ArrayList()) - .collect(Collectors.toCollection(() -> new ArrayList<>(size))); - - PlotArea area = null; - String alias = null; - for (Plot plot : PlotQuery.newQuery().allPlots()) { - int count = 0; - if (!uuids.isEmpty()) { - for (UUID uuid : uuids) { - if (plot.isOwner(uuid)) { - count += 2; - } else if (plot.isAdded(uuid)) { - count++; - } - } - } - if (id != null) { - if (plot.getId().equals(id)) { - count++; - } - } - if (area != null && plot.getArea().equals(area)) { - count++; - } - if (alias != null && alias.equals(plot.getAlias())) { - count += 2; - } - if (count != 0) { - plotList.get(count - 1).add(plot); - } - } - - List plots = new ArrayList<>(); - for (int i = plotList.size() - 1; i >= 0; i--) { - if (!plotList.get(i).isEmpty()) { - plots.addAll(plotList.get(i)); - } - } - return plots; - } - - /** - * Get the plot from a string. - * - * @param player Provides a context for what world to search in. Prefixing the term with 'world_name;' will override this context. - * @param arg The search term - * @param message If a message should be sent to the player if a plot cannot be found - * @return The plot if only 1 result is found, or null - */ - @Nullable public static Plot getPlotFromString(PlotPlayer player, String arg, boolean message) { - if (arg == null) { - if (player == null) { - if (message) { - logger.info("[P2] No plot area string was supplied"); - } - return null; - } - return player.getCurrentPlot(); - } - PlotArea area; - if (player != null) { - area = PlotSquared.get().getPlotAreaManager().getPlotAreaByString(arg); - if (area == null) { - area = player.getApplicablePlotArea(); - } - } else { - area = ConsolePlayer.getConsole().getApplicablePlotArea(); - } - String[] split = arg.split(";|,"); - PlotId id; - if (split.length == 4) { - area = PlotSquared.get().getPlotAreaManager().getPlotAreaByString(split[0] + ';' + split[1]); - id = PlotId.fromString(split[2] + ';' + split[3]); - } else if (split.length == 3) { - area = PlotSquared.get().getPlotAreaManager().getPlotAreaByString(split[0]); - id = PlotId.fromString(split[1] + ';' + split[2]); - } else if (split.length == 2) { - id = PlotId.fromString(arg); - } else { - Collection plots; - if (area == null) { - plots = PlotQuery.newQuery().allPlots().asList(); - } else { - plots = area.getPlots(); - } - for (Plot p : plots) { - String name = p.getAlias(); - if (!name.isEmpty() && name.equalsIgnoreCase(arg)) { - return p; - } - } - if (message) { - MainUtil.sendMessage(player, Captions.NOT_VALID_PLOT_ID); - } - return null; - } - if (area == null) { - if (message) { - MainUtil.sendMessage(player, Captions.NOT_VALID_PLOT_WORLD); - } - return null; - } - return area.getPlotAbs(id); - } - - public static File getFile(File base, String path) { - if (Paths.get(path).isAbsolute()) { - return new File(path); - } - return new File(base, path); - } - - /** - * Synchronously set the biome in a selection. - * - * @param world - * @param p1x - * @param p1z - * @param p2x - * @param p2z - * @param biome - */ - public static void setBiome(String world, int p1x, int p1z, int p2x, int p2z, BiomeType biome) { - BlockVector3 pos1 = BlockVector2.at(p1x, p1z).toBlockVector3(); - BlockVector3 pos2 = BlockVector2.at(p2x, p2z).toBlockVector3(Plot.MAX_HEIGHT - 1); - CuboidRegion region = new CuboidRegion(pos1, pos2); - PlotSquared.platform().getWorldUtil().setBiomes(world, region, biome); - } - - /** - * Get the highest block at a location. - */ - public static void getHighestBlock(String world, int x, int z, IntConsumer result) { - PlotSquared.platform().getWorldUtil().getHighestBlock(world, x, z, highest -> { - if (highest == 0) { - result.accept(63); - } else { - result.accept(highest); - } - }); - } - /** * Send a message to the player. * @@ -637,7 +97,7 @@ public class MainUtil { * @param message Message to send * @return true Can be used in things such as commands (return PlayerFunctions.sendMessage(...)) */ - public static boolean sendMessage(PlotPlayer player, String message) { + public static boolean sendMessage(PlotPlayer player, String message) { return sendMessage(player, message, true); } @@ -659,7 +119,7 @@ public class MainUtil { * @param prefix If the message should be prefixed with the configured prefix * @return */ - public static boolean sendMessage(PlotPlayer player, @Nonnull String msg, boolean prefix) { + public static boolean sendMessage(PlotPlayer player, @Nonnull String msg, boolean prefix) { if (!msg.isEmpty()) { if (player == null) { String message = CaptionUtility @@ -680,7 +140,7 @@ public class MainUtil { * @param caption the message to send * @return boolean success */ - public static boolean sendMessage(PlotPlayer player, Caption caption, String... args) { + public static boolean sendMessage(PlotPlayer player, Caption caption, String... args) { return sendMessage(player, caption, (Object[]) args); } @@ -691,7 +151,7 @@ public class MainUtil { * @param caption the message to send * @return boolean success */ - public static boolean sendMessage(final PlotPlayer player, final Caption caption, + public static boolean sendMessage(final PlotPlayer player, final Caption caption, final Object... args) { if (caption.getTranslated().isEmpty()) { return true; @@ -707,319 +167,4 @@ public class MainUtil { return true; } - /** - * If rating categories are enabled, get the average rating by category.
- * - The index corresponds to the index of the category in the config - * - * @param plot - * @return - */ - public static double[] getAverageRatings(Plot plot) { - Map rating; - if (plot.getSettings().getRatings() != null) { - rating = plot.getSettings().getRatings(); - } else if (Settings.Enabled_Components.RATING_CACHE) { - rating = new HashMap<>(); - } else { - rating = DBFunc.getRatings(plot); - } - int size = 1; - if (!Settings.Ratings.CATEGORIES.isEmpty()) { - size = Math.max(1, Settings.Ratings.CATEGORIES.size()); - } - double[] ratings = new double[size]; - if (rating == null || rating.isEmpty()) { - return ratings; - } - for (Entry entry : rating.entrySet()) { - int current = entry.getValue(); - if (Settings.Ratings.CATEGORIES.isEmpty()) { - ratings[0] += current; - } else { - for (int i = 0; i < Settings.Ratings.CATEGORIES.size(); i++) { - ratings[i] += current % 10 - 1; - current /= 10; - } - } - } - for (int i = 0; i < size; i++) { - ratings[i] /= rating.size(); - } - return ratings; - } - - public static void getUUIDsFromString(final String list, final BiConsumer, Throwable> consumer) { - String[] split = list.split(","); - - final Set result = new HashSet<>(); - final List request = new LinkedList<>(); - - for (final String name : split) { - if (name.isEmpty()) { - consumer.accept(Collections.emptySet(), null); - return; - } else if ("*".equals(name)) { - result.add(DBFunc.EVERYONE); - } else if (name.length() > 16) { - try { - result.add(UUID.fromString(name)); - } catch (IllegalArgumentException ignored) { - consumer.accept(Collections.emptySet(), null); - return; - } - } else { - request.add(name); - } - } - - if (request.isEmpty()) { - consumer.accept(result, null); - } else { - PlotSquared.get().getImpromptuUUIDPipeline().getUUIDs(request, Settings.UUID.NON_BLOCKING_TIMEOUT) - .whenComplete((uuids, throwable) -> { - if (throwable != null) { - consumer.accept(null, throwable); - } else { - for (final UUIDMapping uuid : uuids) { - result.add(uuid.getUuid()); - } - consumer.accept(result, null); - } - }); - } - } - - /** - * Format a string with plot information. - * - * @param iInfo - * @param plot - * @param player - * @param full - * @param whenDone - */ - public static void format(final String iInfo, final Plot plot, PlotPlayer player, - final boolean full, final RunnableVal whenDone) { - int num = plot.getConnectedPlots().size(); - String alias = !plot.getAlias().isEmpty() ? plot.getAlias() : Captions.NONE.getTranslated(); - Location bot = plot.getCorners()[0]; - PlotSquared.platform().getWorldUtil().getBiome(plot.getWorldName(), bot.getX(), bot.getZ(), biome -> { - String info = iInfo; - String trusted = getPlayerList(plot.getTrusted()); - String members = getPlayerList(plot.getMembers()); - String denied = getPlayerList(plot.getDenied()); - String seen; - if (Settings.Enabled_Components.PLOT_EXPIRY && ExpireManager.IMP != null) { - if (plot.isOnline()) { - seen = Captions.NOW.getTranslated(); - } else { - int time = (int) (ExpireManager.IMP.getAge(plot) / 1000); - if (time != 0) { - seen = MainUtil.secToTime(time); - } else { - seen = Captions.UNKNOWN.getTranslated(); - } - } - } else { - seen = Captions.NEVER.getTranslated(); - } - - String description = plot.getFlag(DescriptionFlag.class); - if (description.isEmpty()) { - description = Captions.PLOT_NO_DESCRIPTION.getTranslated(); - } - - StringBuilder flags = new StringBuilder(); - Collection> flagCollection = plot.getApplicableFlags(true); - if (flagCollection.isEmpty()) { - flags.append(Captions.NONE.getTranslated()); - } else { - String prefix = " "; - for (final PlotFlag flag : flagCollection) { - Object value; - if (flag instanceof DoubleFlag && !Settings.General.SCIENTIFIC) { - value = FLAG_DECIMAL_FORMAT.format(flag.getValue()); - } else { - value = flag.toString(); - } - flags.append(prefix).append(CaptionUtility - .format(player, Captions.PLOT_FLAG_LIST.getTranslated(), flag.getName(), - CaptionUtility.formatRaw(player, value.toString(), ""))); - prefix = ", "; - } - } - boolean build = plot.isAdded(player.getUUID()); - String owner = plot.getOwners().isEmpty() ? "unowned" : getPlayerList(plot.getOwners()); - if (plot.getArea() != null) { - info = info.replace("%area%", - plot.getArea().getWorldName() + (plot.getArea().getId() == null ? - "" : - "(" + plot.getArea().getId() + ")")); - } else { - info = info.replace("%area%", Captions.NONE.getTranslated()); - } - info = info.replace("%id%", plot.getId().toString()); - info = info.replace("%alias%", alias); - info = info.replace("%num%", String.valueOf(num)); - info = info.replace("%desc%", description); - info = info.replace("%biome%", biome.toString().toLowerCase()); - info = info.replace("%owner%", owner); - info = info.replace("%members%", members); - info = info.replace("%player%", player.getName()); - info = info.replace("%trusted%", trusted); - info = info.replace("%helpers%", members); - info = info.replace("%denied%", denied); - info = info.replace("%seen%", seen); - info = info.replace("%flags%", flags); - info = info.replace("%build%", String.valueOf(build)); - if (info.contains("%rating%")) { - final String newInfo = info; - TaskManager.runTaskAsync(() -> { - String info1; - if (Settings.Ratings.USE_LIKES) { - info1 = newInfo.replaceAll("%rating%", - String.format("%.0f%%", Like.getLikesPercentage(plot) * 100D)); - } else { - int max = 10; - if (Settings.Ratings.CATEGORIES != null && !Settings.Ratings.CATEGORIES - .isEmpty()) { - max = 8; - } - if (full && Settings.Ratings.CATEGORIES != null - && Settings.Ratings.CATEGORIES.size() > 1) { - double[] ratings = MainUtil.getAverageRatings(plot); - String rating = ""; - String prefix = ""; - for (int i = 0; i < ratings.length; i++) { - rating += prefix + Settings.Ratings.CATEGORIES.get(i) + '=' + String - .format("%.1f", ratings[i]); - prefix = ","; - } - info1 = newInfo.replaceAll("%rating%", rating); - } else { - info1 = newInfo.replaceAll("%rating%", - String.format("%.1f", plot.getAverageRating()) + '/' + max); - } - } - whenDone.run(info1); - }); - return; - } - whenDone.run(info); - }); - } - - public static boolean deleteDirectory(File directory) { - if (directory.exists()) { - File[] files = directory.listFiles(); - if (null != files) { - for (File file : files) { - if (file.isDirectory()) { - deleteDirectory(file); - } - } - } - } - return (directory.delete()); - } - - /* - @Nonnull public static String getName(UUID owner) { - if (owner == null) { - return Captions.NONE.getTranslated(); - } - if (owner.equals(DBFunc.EVERYONE)) { - return Captions.EVERYONE.getTranslated(); - } - if (owner.equals(DBFunc.SERVER)) { - return Captions.SERVER.getTranslated(); - } - String name = PlotSquared.get().getImpromptuUUIDPipeline().getSingle(owner, Settings.UUID.BLOCKING_TIMEOUT); - if (name == null) { - return Captions.UNKNOWN.getTranslated(); - } - return name; - } - */ - - /** - * Get a list of names given a list of UUIDs. - * - Uses the format {@link Captions#PLOT_USER_LIST} for the returned string - */ - public static String getPlayerList(final Collection uuids) { - if (uuids.size() < 1) { - return Captions.NONE.getTranslated(); - } - - final List players = new LinkedList<>(); - final List users = new LinkedList<>(); - for (final UUID uuid : uuids) { - if (uuid == null) { - users.add(Captions.NONE.getTranslated()); - } else if (DBFunc.EVERYONE.equals(uuid)) { - users.add(Captions.EVERYONE.getTranslated()); - } else if (DBFunc.SERVER.equals(uuid)) { - users.add(Captions.SERVER.getTranslated()); - } else { - players.add(uuid); - } - } - - try { - for (final UUIDMapping mapping : PlotSquared.get().getImpromptuUUIDPipeline().getNames(players).get(Settings.UUID.BLOCKING_TIMEOUT, - TimeUnit.MILLISECONDS)) { - users.add(mapping.getUsername()); - } - } catch (final Exception e) { - e.printStackTrace(); - } - - String c = Captions.PLOT_USER_LIST.getTranslated(); - StringBuilder list = new StringBuilder(); - for (int x = 0; x < users.size(); x++) { - if (x + 1 == uuids.size()) { - list.append(c.replace("%user%", users.get(x)).replace(",", "")); - } else { - list.append(c.replace("%user%", users.get(x))); - } - } - return list.toString(); - } - - public static void getPersistentMeta(UUID uuid, final String key, - final RunnableVal result) { - PlotPlayer player = PlotSquared.platform().getPlayerManager().getPlayerIfExists(uuid); - if (player != null) { - result.run(player.getPersistentMeta(key)); - } else { - DBFunc.getPersistentMeta(uuid, new RunnableVal>() { - @Override public void run(Map value) { - result.run(value.get(key)); - } - }); - } - } - - private static T getValueFromConfig(ConfigurationSection config, String path, - IntFunction> intParser, Function> textualParser, - Supplier defaultValue) { - String value = config.getString(path); - if (value == null) { - return defaultValue.get(); - } - if (MathMan.isInteger(value)) { - return intParser.apply(Integer.parseInt(value)).orElseGet(defaultValue); - } - return textualParser.apply(value).orElseGet(defaultValue); - } - - public static PlotAreaType getType(ConfigurationSection config) { - return getValueFromConfig(config, "generator.type", PlotAreaType::fromLegacyInt, - PlotAreaType::fromString, () -> PlotAreaType.NORMAL); - } - - public static PlotAreaTerrainType getTerrain(ConfigurationSection config) { - return getValueFromConfig(config, "generator.terrain", PlotAreaTerrainType::fromLegacyInt, - PlotAreaTerrainType::fromString, () -> PlotAreaTerrainType.NONE); - } } diff --git a/Core/src/main/java/com/plotsquared/core/util/PlayerManager.java b/Core/src/main/java/com/plotsquared/core/util/PlayerManager.java index 4cba66d9a..e316d6c19 100644 --- a/Core/src/main/java/com/plotsquared/core/util/PlayerManager.java +++ b/Core/src/main/java/com/plotsquared/core/util/PlayerManager.java @@ -25,8 +25,14 @@ */ package com.plotsquared.core.util; +import com.plotsquared.core.PlotSquared; +import com.plotsquared.core.configuration.Captions; +import com.plotsquared.core.configuration.Settings; +import com.plotsquared.core.database.DBFunc; import com.plotsquared.core.player.OfflinePlotPlayer; import com.plotsquared.core.player.PlotPlayer; +import com.plotsquared.core.uuid.UUIDMapping; + import javax.annotation.Nonnull; import javax.annotation.Nullable; @@ -34,8 +40,14 @@ import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.HashMap; +import java.util.HashSet; +import java.util.LinkedList; +import java.util.List; import java.util.Map; +import java.util.Set; import java.util.UUID; +import java.util.concurrent.TimeUnit; +import java.util.function.BiConsumer; /** * Manages player instances @@ -45,6 +57,142 @@ public abstract class PlayerManager

, T> { private final Map playerMap = new HashMap<>(); private final Object playerLock = new Object(); + public static void getUUIDsFromString(@Nonnull final String list, + @Nonnull final BiConsumer, Throwable> consumer) { + String[] split = list.split(","); + + final Set result = new HashSet<>(); + final List request = new LinkedList<>(); + + for (final String name : split) { + if (name.isEmpty()) { + consumer.accept(Collections.emptySet(), null); + return; + } else if ("*".equals(name)) { + result.add(DBFunc.EVERYONE); + } else if (name.length() > 16) { + try { + result.add(UUID.fromString(name)); + } catch (IllegalArgumentException ignored) { + consumer.accept(Collections.emptySet(), null); + return; + } + } else { + request.add(name); + } + } + + if (request.isEmpty()) { + consumer.accept(result, null); + } else { + PlotSquared.get().getImpromptuUUIDPipeline() + .getUUIDs(request, Settings.UUID.NON_BLOCKING_TIMEOUT) + .whenComplete((uuids, throwable) -> { + if (throwable != null) { + consumer.accept(null, throwable); + } else { + for (final UUIDMapping uuid : uuids) { + result.add(uuid.getUuid()); + } + consumer.accept(result, null); + } + }); + } + } + + /** + * Get a list of names given a list of UUIDs. + * - Uses the format {@link Captions#PLOT_USER_LIST} for the returned string + * + * @param uuids UUIDs + * @return Name list + */ + @Nonnull public static String getPlayerList(@Nonnull final Collection uuids) { + if (uuids.size() < 1) { + return Captions.NONE.getTranslated(); + } + + final List players = new LinkedList<>(); + final List users = new LinkedList<>(); + for (final UUID uuid : uuids) { + if (uuid == null) { + users.add(Captions.NONE.getTranslated()); + } else if (DBFunc.EVERYONE.equals(uuid)) { + users.add(Captions.EVERYONE.getTranslated()); + } else if (DBFunc.SERVER.equals(uuid)) { + users.add(Captions.SERVER.getTranslated()); + } else { + players.add(uuid); + } + } + + try { + for (final UUIDMapping mapping : PlotSquared.get().getImpromptuUUIDPipeline() + .getNames(players).get(Settings.UUID.BLOCKING_TIMEOUT, TimeUnit.MILLISECONDS)) { + users.add(mapping.getUsername()); + } + } catch (final Exception e) { + e.printStackTrace(); + } + + String c = Captions.PLOT_USER_LIST.getTranslated(); + StringBuilder list = new StringBuilder(); + for (int x = 0; x < users.size(); x++) { + if (x + 1 == uuids.size()) { + list.append(c.replace("%user%", users.get(x)).replace(",", "")); + } else { + list.append(c.replace("%user%", users.get(x))); + } + } + return list.toString(); + } + + /** + * Get the name from a UUID. + * + * @param owner Owner UUID + * @return The player's name, None, Everyone or Unknown + */ + @Nonnull public static String getName(@Nullable final UUID owner) { + return getName(owner, true); + } + + /** + * Get the name from a UUID. + * + * @param owner Owner UUID + * @param blocking Whether or not the operation can be blocking + * @return The player's name, None, Everyone or Unknown + */ + @Nonnull public static String getName(@Nullable final UUID owner, final boolean blocking) { + if (owner == null) { + return Captions.NONE.getTranslated(); + } + if (owner.equals(DBFunc.EVERYONE)) { + return Captions.EVERYONE.getTranslated(); + } + if (owner.equals(DBFunc.SERVER)) { + return Captions.SERVER.getTranslated(); + } + final String name; + if (blocking) { + name = PlotSquared.get().getImpromptuUUIDPipeline() + .getSingle(owner, Settings.UUID.BLOCKING_TIMEOUT); + } else { + final UUIDMapping uuidMapping = + PlotSquared.get().getImpromptuUUIDPipeline().getImmediately(owner); + if (uuidMapping != null) { + name = uuidMapping.getUsername(); + } else { + name = null; + } + } + if (name == null) { + return Captions.UNKNOWN.getTranslated(); + } + return name; + } + /** * Remove a player from the player map * diff --git a/Core/src/main/java/com/plotsquared/core/util/RegionUtil.java b/Core/src/main/java/com/plotsquared/core/util/RegionUtil.java index ffce29963..4b11eb5f6 100644 --- a/Core/src/main/java/com/plotsquared/core/util/RegionUtil.java +++ b/Core/src/main/java/com/plotsquared/core/util/RegionUtil.java @@ -25,6 +25,7 @@ */ package com.plotsquared.core.util; +import com.plotsquared.core.location.Location; import com.plotsquared.core.plot.Plot; import com.sk89q.worldedit.math.BlockVector2; import com.sk89q.worldedit.math.BlockVector3; @@ -32,8 +33,45 @@ import com.sk89q.worldedit.regions.CuboidRegion; import javax.annotation.Nonnull; import java.awt.geom.Rectangle2D; +import java.util.Collection; public class RegionUtil { + + @Nonnull public static Location[] getCorners(@Nonnull final String world, + @Nonnull final CuboidRegion region) { + final BlockVector3 min = region.getMinimumPoint(); + final BlockVector3 max = region.getMaximumPoint(); + return new Location[] {Location.at(world, min), Location.at(world, max)}; + } + + @Nonnull public static Location[] getCorners(String world, Collection regions) { + Location min = null; + Location max = null; + for (CuboidRegion region : regions) { + Location[] corners = getCorners(world, region); + if (min == null) { + min = corners[0]; + max = corners[1]; + continue; + } + Location pos1 = corners[0]; + Location pos2 = corners[1]; + if (pos2.getX() > max.getX()) { + max = max.withX(pos2.getX()); + } + if (pos1.getX() < min.getX()) { + min = min.withX(pos1.getX()); + } + if (pos2.getZ() > max.getZ()) { + max = max.withZ(pos2.getZ()); + } + if (pos1.getZ() < min.getZ()) { + min = min.withZ(pos1.getZ()); + } + } + return new Location[] {min, max}; + } + public static CuboidRegion createRegion(int pos1x, int pos2x, int pos1z, int pos2z) { return createRegion(pos1x, pos2x, 0, Plot.MAX_HEIGHT - 1, pos1z, pos2z); } diff --git a/Core/src/main/java/com/plotsquared/core/util/SchematicHandler.java b/Core/src/main/java/com/plotsquared/core/util/SchematicHandler.java index 83ac22219..09aebcd84 100644 --- a/Core/src/main/java/com/plotsquared/core/util/SchematicHandler.java +++ b/Core/src/main/java/com/plotsquared/core/util/SchematicHandler.java @@ -33,6 +33,7 @@ import com.plotsquared.core.plot.Plot; import com.plotsquared.core.plot.PlotArea; import com.plotsquared.core.plot.schematic.Schematic; import com.plotsquared.core.queue.LocalBlockQueue; +import com.plotsquared.core.util.net.AbstractDelegateOutputStream; import com.plotsquared.core.util.task.RunnableVal; import com.plotsquared.core.util.task.TaskManager; import com.plotsquared.core.util.task.TaskTime; @@ -59,12 +60,13 @@ import com.sk89q.worldedit.math.BlockVector3; import com.sk89q.worldedit.regions.CuboidRegion; import com.sk89q.worldedit.world.biome.BiomeType; import com.sk89q.worldedit.world.block.BaseBlock; -import javax.annotation.Nonnull; import org.json.JSONArray; import org.json.JSONException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import javax.annotation.Nonnull; +import javax.annotation.Nullable; import java.io.BufferedReader; import java.io.ByteArrayOutputStream; import java.io.File; @@ -75,10 +77,15 @@ import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; +import java.io.OutputStreamWriter; +import java.io.PrintWriter; +import java.net.HttpURLConnection; +import java.net.MalformedURLException; import java.net.URL; import java.net.URLConnection; import java.nio.channels.Channels; import java.nio.channels.ReadableByteChannel; +import java.nio.charset.StandardCharsets; import java.util.ArrayDeque; import java.util.ArrayList; import java.util.Arrays; @@ -88,6 +95,7 @@ import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; +import java.util.Scanner; import java.util.Set; import java.util.UUID; import java.util.stream.Collectors; @@ -108,6 +116,84 @@ public abstract class SchematicHandler { this.worldUtil = worldUtil; } + public static void upload(@Nullable UUID uuid, @Nullable final String file, + @Nonnull final String extension, @Nullable final RunnableVal writeTask, + @Nonnull final RunnableVal whenDone) { + if (writeTask == null) { + TaskManager.runTask(whenDone); + return; + } + final String filename; + final String website; + if (uuid == null) { + uuid = UUID.randomUUID(); + website = Settings.Web.URL + "upload.php?" + uuid; + filename = "plot." + extension; + } else { + website = Settings.Web.URL + "save.php?" + uuid; + filename = file + '.' + extension; + } + final URL url; + try { + url = new URL(Settings.Web.URL + "?key=" + uuid + "&type=" + extension); + } catch (MalformedURLException e) { + e.printStackTrace(); + whenDone.run(); + return; + } + TaskManager.runTaskAsync(() -> { + try { + String boundary = Long.toHexString(System.currentTimeMillis()); + URLConnection con = new URL(website).openConnection(); + con.setDoOutput(true); + con.setRequestProperty("Content-Type", "multipart/form-data; boundary=" + boundary); + try (OutputStream output = con.getOutputStream(); + PrintWriter writer = new PrintWriter( + new OutputStreamWriter(output, StandardCharsets.UTF_8), true)) { + String CRLF = "\r\n"; + writer.append("--" + boundary).append(CRLF); + writer.append("Content-Disposition: form-data; name=\"param\"").append(CRLF); + writer.append( + "Content-Type: text/plain; charset=" + StandardCharsets.UTF_8.displayName()) + .append(CRLF); + String param = "value"; + writer.append(CRLF).append(param).append(CRLF).flush(); + writer.append("--" + boundary).append(CRLF); + writer.append( + "Content-Disposition: form-data; name=\"schematicFile\"; filename=\"" + + filename + '"').append(CRLF); + writer + .append("Content-Type: " + URLConnection.guessContentTypeFromName(filename)) + .append(CRLF); + writer.append("Content-Transfer-Encoding: binary").append(CRLF); + writer.append(CRLF).flush(); + writeTask.value = new AbstractDelegateOutputStream(output) { + @Override public void close() { + } // Don't close + }; + writeTask.run(); + output.flush(); + writer.append(CRLF).flush(); + writer.append("--" + boundary + "--").append(CRLF).flush(); + } + String content; + try (Scanner scanner = new Scanner(con.getInputStream()).useDelimiter("\\A")) { + content = scanner.next().trim(); + } + if (!content.startsWith("<")) { + } + int responseCode = ((HttpURLConnection) con).getResponseCode(); + if (responseCode == 200) { + whenDone.value = url; + } + TaskManager.runTask(whenDone); + } catch (IOException e) { + e.printStackTrace(); + TaskManager.runTask(whenDone); + } + }); + } + public boolean exportAll(Collection collection, final File outputDir, final String namingScheme, final Runnable ifSuccess) { if (this.exportAll) { @@ -312,7 +398,7 @@ public abstract class SchematicHandler { */ public Schematic getSchematic(String name) throws UnsupportedFormatException { File parent = - MainUtil.getFile(PlotSquared.platform().getDirectory(), Settings.Paths.SCHEMATICS); + FileUtils.getFile(PlotSquared.platform().getDirectory(), Settings.Paths.SCHEMATICS); if (!parent.exists()) { if (!parent.mkdir()) { throw new RuntimeException("Could not create schematic parent directory"); @@ -321,10 +407,10 @@ public abstract class SchematicHandler { if (!name.endsWith(".schem") && !name.endsWith(".schematic")) { name = name + ".schem"; } - File file = MainUtil.getFile(PlotSquared.platform().getDirectory(), + File file = FileUtils.getFile(PlotSquared.platform().getDirectory(), Settings.Paths.SCHEMATICS + File.separator + name); if (!file.exists()) { - file = MainUtil.getFile(PlotSquared.platform().getDirectory(), + file = FileUtils.getFile(PlotSquared.platform().getDirectory(), Settings.Paths.SCHEMATICS + File.separator + name); } return getSchematic(file); @@ -337,7 +423,7 @@ public abstract class SchematicHandler { */ public Collection getSchematicNames() { final File parent = - MainUtil.getFile(PlotSquared.platform().getDirectory(), Settings.Paths.SCHEMATICS); + FileUtils.getFile(PlotSquared.platform().getDirectory(), Settings.Paths.SCHEMATICS); final List names = new ArrayList<>(); if (parent.exists()) { final String[] rawNames = @@ -436,7 +522,7 @@ public abstract class SchematicHandler { TaskManager.runTask(whenDone); return; } - MainUtil.upload(uuid, file, "schem", new RunnableVal() { + upload(uuid, file, "schem", new RunnableVal() { @Override public void run(OutputStream output) { try (NBTOutputStream nos = new NBTOutputStream( new GZIPOutputStream(output, true))) { @@ -460,7 +546,7 @@ public abstract class SchematicHandler { return false; } try { - File tmp = MainUtil.getFile(PlotSquared.platform().getDirectory(), path); + File tmp = FileUtils.getFile(PlotSquared.platform().getDirectory(), path); tmp.getParentFile().mkdirs(); try (NBTOutputStream nbtStream = new NBTOutputStream( new GZIPOutputStream(new FileOutputStream(tmp)))) { @@ -480,7 +566,7 @@ public abstract class SchematicHandler { // async TaskManager.runTaskAsync(() -> { // Main positions - Location[] corners = MainUtil.getCorners(world, regions); + Location[] corners = RegionUtil.getCorners(world, regions); final Location bot = corners[0]; final Location top = corners[1]; diff --git a/Core/src/main/java/com/plotsquared/core/util/TimeUtil.java b/Core/src/main/java/com/plotsquared/core/util/TimeUtil.java new file mode 100644 index 000000000..61b18653c --- /dev/null +++ b/Core/src/main/java/com/plotsquared/core/util/TimeUtil.java @@ -0,0 +1,129 @@ +/* + * _____ _ _ _____ _ + * | __ \| | | | / ____| | | + * | |__) | | ___ | |_| (___ __ _ _ _ __ _ _ __ ___ __| | + * | ___/| |/ _ \| __|\___ \ / _` | | | |/ _` | '__/ _ \/ _` | + * | | | | (_) | |_ ____) | (_| | |_| | (_| | | | __/ (_| | + * |_| |_|\___/ \__|_____/ \__, |\__,_|\__,_|_| \___|\__,_| + * | | + * |_| + * PlotSquared plot management system for Minecraft + * Copyright (C) 2020 IntellectualSites + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package com.plotsquared.core.util; + +import javax.annotation.Nonnegative; +import javax.annotation.Nonnull; + +public final class TimeUtil { + + private TimeUtil() { + } + + /** + * Format seconds into a string with the format + * #y #w #d #h #s + * + * @param time Time to format + * @return Formatted string + */ + @Nonnull public static String secToTime(@Nonnegative long time) { + StringBuilder toReturn = new StringBuilder(); + if (time >= 33868800) { + int years = (int) (time / 33868800); + time -= years * 33868800; + toReturn.append(years).append("y "); + } + if (time >= 604800) { + int weeks = (int) (time / 604800); + time -= weeks * 604800; + toReturn.append(weeks).append("w "); + } + if (time >= 86400) { + int days = (int) (time / 86400); + time -= days * 86400; + toReturn.append(days).append("d "); + } + if (time >= 3600) { + int hours = (int) (time / 3600); + time -= hours * 3600; + toReturn.append(hours).append("h "); + } + if (time >= 60) { + int minutes = (int) (time / 60); + time -= minutes * 60; + toReturn.append(minutes).append("m "); + } + if (toReturn.length() == 0 || time > 0) { + toReturn.append(time).append("s "); + } + return toReturn.toString().trim(); + } + + /** + * Parse a time string back into time + * + * @param string String to parse + * @return Parsed time + */ + @Nonnegative public static long timeToSec(@Nonnull String string) { + if (MathMan.isInteger(string)) { + return Long.parseLong(string); + } + string = string.toLowerCase().trim().toLowerCase(); + if (string.equalsIgnoreCase("false")) { + return 0; + } + final String[] split = string.split(" "); + long time = 0; + for (final String value : split) { + final int numbers = Integer.parseInt(value.replaceAll("[^\\d]", "")); + String letters = value.replaceAll("[^a-z]", ""); + switch (letters) { + case "week": + case "weeks": + case "wks": + case "w": + + time += 604800 * numbers; + case "days": + case "day": + case "d": + time += 86400 * numbers; + case "hour": + case "hr": + case "hrs": + case "hours": + case "h": + time += 3600 * numbers; + case "minutes": + case "minute": + case "mins": + case "min": + case "m": + time += 60 * numbers; + case "seconds": + case "second": + case "secs": + case "sec": + case "s": + time += numbers; + } + } + return time; + } + +} diff --git a/Core/src/main/java/com/plotsquared/core/util/WorldUtil.java b/Core/src/main/java/com/plotsquared/core/util/WorldUtil.java index c8c7a6662..81d5e2f11 100644 --- a/Core/src/main/java/com/plotsquared/core/util/WorldUtil.java +++ b/Core/src/main/java/com/plotsquared/core/util/WorldUtil.java @@ -36,6 +36,7 @@ import com.sk89q.jnbt.NBTInputStream; import com.sk89q.jnbt.NBTOutputStream; import com.sk89q.jnbt.Tag; import com.sk89q.worldedit.math.BlockVector2; +import com.sk89q.worldedit.math.BlockVector3; import com.sk89q.worldedit.regions.CuboidRegion; import com.sk89q.worldedit.world.biome.BiomeType; import com.sk89q.worldedit.world.block.BlockState; @@ -70,6 +71,23 @@ public abstract class WorldUtil { this.regionManager = regionManager; } + /** + * Set the biome in a region + * + * @param world World name + * @param p1x Min X + * @param p1z Min Z + * @param p2x Max X + * @param p2z Max Z + * @param biome Biome + */ + public static void setBiome(String world, int p1x, int p1z, int p2x, int p2z, BiomeType biome) { + BlockVector3 pos1 = BlockVector2.at(p1x, p1z).toBlockVector3(); + BlockVector3 pos2 = BlockVector2.at(p2x, p2z).toBlockVector3(Plot.MAX_HEIGHT - 1); + CuboidRegion region = new CuboidRegion(pos1, pos2); + PlotSquared.platform().getWorldUtil().setBiomes(world, region, biome); + } + /** * Check if a given world name corresponds to a real world * @@ -213,7 +231,7 @@ public abstract class WorldUtil { public void upload(@Nonnull final Plot plot, @Nullable final UUID uuid, @Nullable final String file, @Nonnull final RunnableVal whenDone) { - plot.getHome(home -> MainUtil.upload(uuid, file, "zip", new RunnableVal() { + plot.getHome(home -> SchematicHandler.upload(uuid, file, "zip", new RunnableVal() { @Override public void run(OutputStream output) { try (final ZipOutputStream zos = new ZipOutputStream(output)) { File dat = getDat(plot.getWorldName()); diff --git a/Core/src/main/java/com/plotsquared/core/util/query/SearchPlotProvider.java b/Core/src/main/java/com/plotsquared/core/util/query/SearchPlotProvider.java index f838dc807..8678a8734 100644 --- a/Core/src/main/java/com/plotsquared/core/util/query/SearchPlotProvider.java +++ b/Core/src/main/java/com/plotsquared/core/util/query/SearchPlotProvider.java @@ -25,11 +25,19 @@ */ package com.plotsquared.core.util.query; +import com.plotsquared.core.PlotSquared; +import com.plotsquared.core.configuration.Settings; import com.plotsquared.core.plot.Plot; -import com.plotsquared.core.util.MainUtil; -import javax.annotation.Nonnull; +import com.plotsquared.core.plot.PlotArea; +import com.plotsquared.core.plot.PlotId; +import javax.annotation.Nonnull; +import java.util.ArrayList; import java.util.Collection; +import java.util.List; +import java.util.UUID; +import java.util.stream.Collectors; +import java.util.stream.IntStream; class SearchPlotProvider implements PlotProvider { @@ -40,7 +48,76 @@ class SearchPlotProvider implements PlotProvider { } @Override public Collection getPlots() { - return MainUtil.getPlotsBySearch(this.searchTerm); + return getPlotsBySearch(this.searchTerm); + } + + /** + * Fuzzy plot search with spaces separating terms. + * - Terms: type, alias, world, owner, trusted, member + * + * @param search Search string + * @return Search results + */ + @Nonnull private static List getPlotsBySearch(@Nonnull final String search) { + String[] split = search.split(" "); + int size = split.length * 2; + + List uuids = new ArrayList<>(); + PlotId id = null; + + for (String term : split) { + try { + UUID uuid = PlotSquared.get().getImpromptuUUIDPipeline() + .getSingle(term, Settings.UUID.BLOCKING_TIMEOUT); + if (uuid == null) { + uuid = UUID.fromString(term); + } + uuids.add(uuid); + } catch (Exception ignored) { + id = PlotId.fromString(term); + } + } + + ArrayList> plotList = + IntStream.range(0, size).mapToObj(i -> new ArrayList()) + .collect(Collectors.toCollection(() -> new ArrayList<>(size))); + + PlotArea area = null; + String alias = null; + for (Plot plot : PlotQuery.newQuery().allPlots()) { + int count = 0; + if (!uuids.isEmpty()) { + for (UUID uuid : uuids) { + if (plot.isOwner(uuid)) { + count += 2; + } else if (plot.isAdded(uuid)) { + count++; + } + } + } + if (id != null) { + if (plot.getId().equals(id)) { + count++; + } + } + if (area != null && plot.getArea().equals(area)) { + count++; + } + if (alias != null && alias.equals(plot.getAlias())) { + count += 2; + } + if (count != 0) { + plotList.get(count - 1).add(plot); + } + } + + List plots = new ArrayList<>(); + for (int i = plotList.size() - 1; i >= 0; i--) { + if (!plotList.get(i).isEmpty()) { + plots.addAll(plotList.get(i)); + } + } + return plots; } }