From 56537dcafc96c9f17c4d00ccbf69b462b393fe84 Mon Sep 17 00:00:00 2001 From: boy0001 Date: Wed, 1 Oct 2014 18:01:41 +1000 Subject: [PATCH] Added trusted users --- .../src/com/intellectualcrafters/plot/C.java | 6 +- .../com/intellectualcrafters/plot/PWE.java | 4 +- .../com/intellectualcrafters/plot/Plot.java | 38 ++++-- .../plot/commands/Command.java | 8 ++ .../plot/commands/Copy.java | 44 +++++++ .../plot/commands/Home.java | 3 - .../plot/commands/Info.java | 9 +- .../plot/commands/Trusted.java | 124 ++++++++++++++++++ .../plot/database/DBFunc.java | 76 ++++++++++- .../plot/database/PlotMeConverter.java | 4 +- .../plot/events/PlayerPlotTrustedEvent.java | 68 ++++++++++ .../plot/listeners/WorldEditListener.java | 6 +- 12 files changed, 367 insertions(+), 23 deletions(-) create mode 100644 PlotSquared/src/com/intellectualcrafters/plot/commands/Copy.java create mode 100644 PlotSquared/src/com/intellectualcrafters/plot/commands/Trusted.java create mode 100644 PlotSquared/src/com/intellectualcrafters/plot/events/PlayerPlotTrustedEvent.java diff --git a/PlotSquared/src/com/intellectualcrafters/plot/C.java b/PlotSquared/src/com/intellectualcrafters/plot/C.java index 08f028e89..24cec7376 100644 --- a/PlotSquared/src/com/intellectualcrafters/plot/C.java +++ b/PlotSquared/src/com/intellectualcrafters/plot/C.java @@ -124,7 +124,7 @@ public enum C { /* * Info */ - PLOT_INFO_UNCLAIMED("&cPlot &6%s&c is not yet claimed"), PLOT_INFO("plot ID: &6%id%&c, plot Alias: &6%alias%&c, plot Owner: &6%owner%&c, plot Biome: &6%biome%&c, plot Time: &6%time%&c, plot Weather: &6%weather%&c, plot Helpers:&6%helpers%&c, plot Denied:&6%denied%&c, plot flags: &6%flags%"), PLOT_USER_LIST(" &6%user%&c,"), + PLOT_INFO_UNCLAIMED("&cPlot &6%s&c is not yet claimed"), PLOT_INFO("plot ID: &6%id%&c, plot Alias: &6%alias%&c, plot Owner: &6%owner%&c, plot Biome: &6%biome%&c, plot Time: &6%time%&c, plot Weather: &6%weather%&c, plot Helpers:&6%helpers%&c, plot Trusted:&6%trusted%&c, plot Denied:&6%denied%&c, plot flags: &6%flags%"), PLOT_USER_LIST(" &6%user%&c,"), /* * Generating */ @@ -169,6 +169,10 @@ public enum C { * Helper */ HELPER_ADDED("&6You successfully added a helper to the plot"), HELPER_REMOVED("&6You successfully removed a helper from the plot"), HELPER_NEED_ARGUMENT("&cArguments are missing. &6/plot helpers add {name} &cor &6/plot helpers remove {name}"), WAS_NOT_ADDED("&cThat player was not added as a helper on this plot"), + /* + * Trusted + */ + TRUSTED_ADDED("&6You successfully added a trusted user to the plot"), TRUSTED_REMOVED("&6You successfully removed a trusted user from the plot"), TRUSTED_NEED_ARGUMENT("&cArguments are missing. &6/plot trusted add {name} &cor &6/plot trusted remove {name}"), T_WAS_NOT_ADDED("&cThat player was not added as a trusted user on this plot"), /* * Set Owner */ diff --git a/PlotSquared/src/com/intellectualcrafters/plot/PWE.java b/PlotSquared/src/com/intellectualcrafters/plot/PWE.java index 2790ddea5..e025b96ea 100644 --- a/PlotSquared/src/com/intellectualcrafters/plot/PWE.java +++ b/PlotSquared/src/com/intellectualcrafters/plot/PWE.java @@ -1,6 +1,8 @@ package com.intellectualcrafters.plot; +import com.intellectualcrafters.plot.database.DBFunc; import com.sk89q.worldedit.*; + import org.bukkit.Location; import org.bukkit.World; import org.bukkit.entity.Player; @@ -30,7 +32,7 @@ public class PWE { boolean r; r = plot.getOwner() != null && plot.getOwner().equals(p.getUniqueId()); if (!r) { - if (p.hasPermission("plots.we.member") && plot.hasRights(p)) { + if (p.hasPermission("plots.we.member") && (plot.helpers.contains(DBFunc.everyone) || plot.helpers.contains(p.getUniqueId()))) { r = true; } else if (p.hasPermission("plots.we.bypass")) { s.setMask(null); diff --git a/PlotSquared/src/com/intellectualcrafters/plot/Plot.java b/PlotSquared/src/com/intellectualcrafters/plot/Plot.java index f5da19893..e52f23e3d 100644 --- a/PlotSquared/src/com/intellectualcrafters/plot/Plot.java +++ b/PlotSquared/src/com/intellectualcrafters/plot/Plot.java @@ -48,6 +48,10 @@ public class Plot implements Cloneable { * List of helpers (with plot permissions) */ public ArrayList helpers; + /** + * List of trusted users (with plot permissions) + */ + public ArrayList trusted; /** * List of denied players */ @@ -104,12 +108,13 @@ public class Plot implements Cloneable { * @param time * @param merged */ - public Plot(PlotId id, UUID owner, Biome plotBiome, ArrayList helpers, ArrayList denied, boolean changeTime, long time, boolean rain, String alias, PlotHomePosition position, Flag[] flags, String world, boolean[] merged) { + public Plot(PlotId id, UUID owner, Biome plotBiome, ArrayList helpers, ArrayList trusted, ArrayList denied, boolean changeTime, long time, boolean rain, String alias, PlotHomePosition position, Flag[] flags, String world, boolean[] merged) { this.id = id; this.settings = new PlotSettings(this); this.settings.setBiome(plotBiome); this.owner = owner; this.deny_entry = this.owner != null; + this.trusted = trusted; this.helpers = helpers; this.denied = denied; this.settings.setTime(time); @@ -152,7 +157,7 @@ public class Plot implements Cloneable { * @return true if the player is added as a helper or is the owner */ public boolean hasRights(Player player) { - return player.hasPermission("plots.admin") || ((this.helpers != null) && this.helpers.contains(DBFunc.everyone)) || ((this.helpers != null) && this.helpers.contains(player.getUniqueId())) || ((this.owner != null) && this.owner.equals(player.getUniqueId())); + return player.hasPermission("plots.admin") || ((this.helpers != null) && this.helpers.contains(DBFunc.everyone)) || ((this.helpers != null) && this.helpers.contains(player.getUniqueId())) || ((this.owner != null) && this.owner.equals(player.getUniqueId())) || (this.owner != null && this.trusted != null && Bukkit.getPlayer(this.owner) != null && (this.trusted.contains(player.getUniqueId()) || this.trusted.contains(DBFunc.everyone))); } /** @@ -220,6 +225,16 @@ public class Plot implements Cloneable { public void addHelper(UUID uuid) { this.helpers.add(uuid); } + + + /** + * Add someone as a trusted user (use DBFunc as well) + * + * @param uuid + */ + public void addTrusted(UUID uuid) { + this.trusted.add(uuid); + } /** * Get plot display name @@ -250,6 +265,15 @@ public class Plot implements Cloneable { public void removeHelper(UUID uuid) { this.helpers.remove(uuid); } + + /** + * Remove a trusted user (use DBFunc as well) + * + * @param uuid + */ + public void removeTrusted(UUID uuid) { + this.trusted.remove(uuid); + } /** * Clear a plot @@ -261,14 +285,4 @@ public class Plot implements Cloneable { PlotHelper.clear(plr, this); } - /** - * Delete a plot - * - * @param plr - * initiator - */ - @SuppressWarnings("unused") - public void delete(Player plr) { - this.clear(plr); - } } diff --git a/PlotSquared/src/com/intellectualcrafters/plot/commands/Command.java b/PlotSquared/src/com/intellectualcrafters/plot/commands/Command.java index b0e132ed9..95208a10d 100644 --- a/PlotSquared/src/com/intellectualcrafters/plot/commands/Command.java +++ b/PlotSquared/src/com/intellectualcrafters/plot/commands/Command.java @@ -26,6 +26,14 @@ public enum Command { // (Rating system) (ratings can be stored as the average, and number of ratings) // - /plot rate // - /plot list + TRUSTED("trusted","trust"), + /** + * + */ + COPY("copy"), + /** + * + */ KICK("kick","k"), /** * diff --git a/PlotSquared/src/com/intellectualcrafters/plot/commands/Copy.java b/PlotSquared/src/com/intellectualcrafters/plot/commands/Copy.java new file mode 100644 index 000000000..e7cd2b7e3 --- /dev/null +++ b/PlotSquared/src/com/intellectualcrafters/plot/commands/Copy.java @@ -0,0 +1,44 @@ +/* + * Copyright (c) IntellectualCrafters - 2014. + * You are not allowed to distribute and/or monetize any of our intellectual property. + * IntellectualCrafters is not affiliated with Mojang AB. Minecraft is a trademark of Mojang AB. + * + * >> File = Clear.java + * >> Generated by: Citymonstret at 2014-08-09 01:41 + */ + +package com.intellectualcrafters.plot.commands; + +import org.bukkit.entity.Player; + +import com.intellectualcrafters.plot.C; +import com.intellectualcrafters.plot.PlayerFunctions; +import com.intellectualcrafters.plot.Plot; +import com.intellectualcrafters.plot.PlotHelper; +import com.intellectualcrafters.plot.PlotMain; +import com.intellectualcrafters.plot.database.DBFunc; + +/** + * Created by Citymonstret on 2014-08-01. + */ +public class Copy extends SubCommand { + + public Copy() { + super(Command.COPY, "Copy a plot", "clear", CommandCategory.ACTIONS); + } + + @Override + public boolean execute(Player plr, String... args) { + if (!PlayerFunctions.isInPlot(plr)) { + PlayerFunctions.sendMessage(plr, "You're not in a plot."); + return false; + } + Plot plot = PlayerFunctions.getCurrentPlot(plr); + if ((plot==null || !plot.hasOwner() || !plot.getOwner().equals(plr.getUniqueId())) && !plr.hasPermission("plots.admin")) { + PlayerFunctions.sendMessage(plr, C.NO_PLOT_PERMS); + return false; + } + plot.clear(plr); + return true; + } +} diff --git a/PlotSquared/src/com/intellectualcrafters/plot/commands/Home.java b/PlotSquared/src/com/intellectualcrafters/plot/commands/Home.java index 62d0a5045..cec046070 100644 --- a/PlotSquared/src/com/intellectualcrafters/plot/commands/Home.java +++ b/PlotSquared/src/com/intellectualcrafters/plot/commands/Home.java @@ -37,9 +37,6 @@ public class Home extends SubCommand { @Override public boolean execute(Player plr, String... args) { - - // TODO plot names / alias - Plot[] plots = PlotMain.getPlots(plr).toArray(new Plot[0]); if (plots.length == 1) { PlotMain.teleportPlayer(plr, plr.getLocation(), plots[0]); diff --git a/PlotSquared/src/com/intellectualcrafters/plot/commands/Info.java b/PlotSquared/src/com/intellectualcrafters/plot/commands/Info.java index 8457628c4..f80902bd4 100644 --- a/PlotSquared/src/com/intellectualcrafters/plot/commands/Info.java +++ b/PlotSquared/src/com/intellectualcrafters/plot/commands/Info.java @@ -49,6 +49,7 @@ public class Info extends SubCommand { boolean hasOwner = plot.hasOwner(); boolean containsEveryone; + boolean trustedEveryone; // Wildcard player {added} { @@ -57,10 +58,15 @@ public class Info extends SubCommand { } else { containsEveryone = plot.helpers.contains(DBFunc.everyone); } + if (plot.trusted == null) { + trustedEveryone = false; + } else { + trustedEveryone = plot.trusted.contains(DBFunc.everyone); + } } // Unclaimed? - if (!hasOwner && !containsEveryone) { + if (!hasOwner && !containsEveryone && !trustedEveryone) { PlayerFunctions.sendMessage(player, C.PLOT_INFO_UNCLAIMED, plot.id.x + ";" + plot.id.y); return true; } @@ -83,6 +89,7 @@ public class Info extends SubCommand { info = info.replaceAll("%time%", plot.settings.getChangeTime() ? plot.settings.getTime() + "" : "default"); info = info.replaceAll("%weather%", plot.settings.getRain() ? "rain" : "default"); info = info.replaceAll("%helpers%", getPlayerList(plot.helpers)); + info = info.replaceAll("%trusted%", getPlayerList(plot.trusted)); info = info.replaceAll("%denied%", getPlayerList(plot.denied)); info = info.replaceAll("%flags%", StringUtils.join(plot.settings.getFlags(), "").length() > 0 ? StringUtils.join(plot.settings.getFlags(), ",") : "none"); PlayerFunctions.sendMessage(player, PlayerFunctions.getTopPlot(player.getWorld(), plot).id.toString()); diff --git a/PlotSquared/src/com/intellectualcrafters/plot/commands/Trusted.java b/PlotSquared/src/com/intellectualcrafters/plot/commands/Trusted.java new file mode 100644 index 000000000..4eca67bd0 --- /dev/null +++ b/PlotSquared/src/com/intellectualcrafters/plot/commands/Trusted.java @@ -0,0 +1,124 @@ +/* + * Copyright (c) IntellectualCrafters - 2014. + * You are not allowed to distribute and/or monetize any of our intellectual property. + * IntellectualCrafters is not affiliated with Mojang AB. Minecraft is a trademark of Mojang AB. + * + * >> File = Trusted.java + * >> Generated by: Citymonstret at 2014-08-09 01:41 + */ + +package com.intellectualcrafters.plot.commands; + +import java.util.UUID; + +import org.bukkit.Bukkit; +import org.bukkit.OfflinePlayer; +import org.bukkit.entity.Player; + +import com.intellectualcrafters.plot.C; +import com.intellectualcrafters.plot.PlayerFunctions; +import com.intellectualcrafters.plot.Plot; +import com.intellectualcrafters.plot.database.DBFunc; +import com.intellectualcrafters.plot.events.PlayerPlotTrustedEvent; + +@SuppressWarnings("deprecation") +public class Trusted extends SubCommand { + + public Trusted() { + super(Command.TRUSTED, "Manage trusted users for a plot", "trusted {add|remove} {player}", CommandCategory.ACTIONS); + } + + private boolean hasBeenOnServer(String name) { + Player plr; + if ((plr = Bukkit.getPlayer(name)) == null) { + OfflinePlayer oplr = Bukkit.getOfflinePlayer(name); + if (oplr == null) { + return false; + } else { + return oplr.hasPlayedBefore(); + } + } else { + if (plr.isOnline()) { + return true; + } else { + return plr.hasPlayedBefore(); + } + } + } + + @Override + public boolean execute(Player plr, String... args) { + if (args.length < 2) { + PlayerFunctions.sendMessage(plr, C.TRUSTED_NEED_ARGUMENT); + return true; + } + if (!PlayerFunctions.isInPlot(plr)) { + PlayerFunctions.sendMessage(plr, C.NOT_IN_PLOT); + return true; + } + Plot plot = PlayerFunctions.getCurrentPlot(plr); + if ((plot.owner == null) || !plot.hasRights(plr)) { + PlayerFunctions.sendMessage(plr, C.NO_PERMISSION); + return true; + } + if (args[0].equalsIgnoreCase("add")) { + if (args[1].equalsIgnoreCase("*")) { + UUID uuid = DBFunc.everyone; + plot.addTrusted(uuid); + DBFunc.setTrusted(plr.getWorld().getName(), plot, Bukkit.getOfflinePlayer(args[1])); + PlayerFunctions.sendMessage(plr, C.TRUSTED_ADDED); + return true; + } + if (!hasBeenOnServer(args[1])) { + PlayerFunctions.sendMessage(plr, C.PLAYER_HAS_NOT_BEEN_ON); + return true; + } + UUID uuid = null; + if ((Bukkit.getPlayer(args[1]) != null) && Bukkit.getPlayer(args[1]).isOnline()) { + uuid = Bukkit.getPlayer(args[1]).getUniqueId(); + } else { + uuid = Bukkit.getOfflinePlayer(args[1]).getUniqueId(); + } + plot.addTrusted(uuid); + DBFunc.setTrusted(plr.getWorld().getName(), plot, Bukkit.getOfflinePlayer(args[1])); + PlayerPlotTrustedEvent event = new PlayerPlotTrustedEvent(plr, plot, uuid, true); + Bukkit.getPluginManager().callEvent(event); + PlayerFunctions.sendMessage(plr, C.TRUSTED_ADDED); + } else if (args[0].equalsIgnoreCase("remove")) { + if (args[1].equalsIgnoreCase("*")) { + UUID uuid = DBFunc.everyone; + if (!plot.trusted.contains(uuid)) { + PlayerFunctions.sendMessage(plr, C.T_WAS_NOT_ADDED); + return true; + } + plot.removeTrusted(uuid); + DBFunc.removeTrusted(plr.getWorld().getName(), plot, Bukkit.getOfflinePlayer(args[1])); + PlayerFunctions.sendMessage(plr, C.TRUSTED_REMOVED); + return true; + } + if (!hasBeenOnServer(args[1])) { + PlayerFunctions.sendMessage(plr, C.PLAYER_HAS_NOT_BEEN_ON); + return true; + } + UUID uuid = null; + if (Bukkit.getPlayer(args[1]).isOnline()) { + uuid = Bukkit.getPlayer(args[1]).getUniqueId(); + } else { + uuid = Bukkit.getOfflinePlayer(args[1]).getUniqueId(); + } + if (!plot.trusted.contains(uuid)) { + PlayerFunctions.sendMessage(plr, C.T_WAS_NOT_ADDED); + return true; + } + plot.removeTrusted(uuid); + DBFunc.removeTrusted(plr.getWorld().getName(), plot, Bukkit.getOfflinePlayer(args[1])); + PlayerPlotTrustedEvent event = new PlayerPlotTrustedEvent(plr, plot, uuid, false); + Bukkit.getPluginManager().callEvent(event); + PlayerFunctions.sendMessage(plr, C.TRUSTED_REMOVED); + } else { + PlayerFunctions.sendMessage(plr, C.TRUSTED_NEED_ARGUMENT); + return true; + } + return true; + } +} diff --git a/PlotSquared/src/com/intellectualcrafters/plot/database/DBFunc.java b/PlotSquared/src/com/intellectualcrafters/plot/database/DBFunc.java index 1ba165f4f..259674cb6 100644 --- a/PlotSquared/src/com/intellectualcrafters/plot/database/DBFunc.java +++ b/PlotSquared/src/com/intellectualcrafters/plot/database/DBFunc.java @@ -100,6 +100,7 @@ public class DBFunc { stmt.addBatch("CREATE TABLE IF NOT EXISTS `plot` (" + "`id` INT(11) NOT NULL AUTO_INCREMENT," + "`plot_id_x` INT(11) NOT NULL," + "`plot_id_z` INT(11) NOT NULL," + "`owner` VARCHAR(45) NOT NULL," + "`world` VARCHAR(45) NOT NULL," + "`timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP," + "PRIMARY KEY (`id`)" + ") ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=0"); stmt.addBatch("CREATE TABLE IF NOT EXISTS `plot_denied` (" + "`plot_plot_id` INT(11) NOT NULL," + "`user_uuid` VARCHAR(40) NOT NULL" + ") ENGINE=InnoDB DEFAULT CHARSET=utf8"); stmt.addBatch("CREATE TABLE IF NOT EXISTS `plot_helpers` (" + "`plot_plot_id` INT(11) NOT NULL," + "`user_uuid` VARCHAR(40) NOT NULL" + ") ENGINE=InnoDB DEFAULT CHARSET=utf8"); + stmt.addBatch("CREATE TABLE IF NOT EXISTS `plot_trusted` (" + "`plot_plot_id` INT(11) NOT NULL," + "`user_uuid` VARCHAR(40) NOT NULL" + ") ENGINE=InnoDB DEFAULT CHARSET=utf8"); stmt.addBatch("CREATE TABLE IF NOT EXISTS `plot_settings` (" + " `plot_plot_id` INT(11) NOT NULL," + " `biome` VARCHAR(45) DEFAULT 'FOREST'," + " `rain` INT(1) DEFAULT 0," + " `custom_time` TINYINT(1) DEFAULT '0'," + " `time` INT(11) DEFAULT '8000'," + " `deny_entry` TINYINT(1) DEFAULT '0'," + " `alias` VARCHAR(50) DEFAULT NULL," + " `flags` VARCHAR(512) DEFAULT NULL," + " `merged` INT(11) DEFAULT NULL," + " `position` VARCHAR(50) NOT NULL DEFAULT 'DEFAULT'," + " PRIMARY KEY (`plot_plot_id`)," + " UNIQUE KEY `unique_alias` (`alias`)" + ") ENGINE=InnoDB DEFAULT CHARSET=utf8"); stmt.addBatch("ALTER TABLE `plot_settings` ADD CONSTRAINT `plot_settings_ibfk_1` FOREIGN KEY (`plot_plot_id`) REFERENCES `plot` (`id`) ON DELETE CASCADE"); @@ -107,6 +108,7 @@ public class DBFunc { stmt.addBatch("CREATE TABLE IF NOT EXISTS `plot` (" + "`id` INTEGER(11) PRIMARY KEY," + "`plot_id_x` INT(11) NOT NULL," + "`plot_id_z` INT(11) NOT NULL," + "`owner` VARCHAR(45) NOT NULL," + "`world` VARCHAR(45) NOT NULL," + "`timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP)"); stmt.addBatch("CREATE TABLE IF NOT EXISTS `plot_denied` (" + "`plot_plot_id` INT(11) NOT NULL," + "`user_uuid` VARCHAR(40) NOT NULL" + ")"); stmt.addBatch("CREATE TABLE IF NOT EXISTS `plot_helpers` (" + "`plot_plot_id` INT(11) NOT NULL," + "`user_uuid` VARCHAR(40) NOT NULL" + ")"); + stmt.addBatch("CREATE TABLE IF NOT EXISTS `plot_trusted` (" + "`plot_plot_id` INT(11) NOT NULL," + "`user_uuid` VARCHAR(40) NOT NULL" + ")"); stmt.addBatch("CREATE TABLE IF NOT EXISTS `plot_settings` (" + " `plot_plot_id` INT(11) NOT NULL," + " `biome` VARCHAR(45) DEFAULT 'FOREST'," + " `rain` INT(1) DEFAULT 0," + " `custom_time` TINYINT(1) DEFAULT '0'," + " `time` INT(11) DEFAULT '8000'," + " `deny_entry` TINYINT(1) DEFAULT '0'," + " `alias` VARCHAR(50) DEFAULT NULL," + " `flags` VARCHAR(512) DEFAULT NULL," + " `merged` INT(11) DEFAULT NULL," + " `position` VARCHAR(50) NOT NULL DEFAULT 'DEFAULT'," + " PRIMARY KEY (`plot_plot_id`)" + ")"); } @@ -137,6 +139,10 @@ public class DBFunc { stmt.setInt(1, id); stmt.executeUpdate(); stmt.close(); + stmt = connection.prepareStatement("DELETE FROM `plot_trusted` WHERE `plot_plot_id` = ?"); + stmt.setInt(1, id); + stmt.executeUpdate(); + stmt.close(); stmt = connection.prepareStatement("DELETE FROM `plot` WHERE `id` = ?"); stmt.setInt(1, id); stmt.executeUpdate(); @@ -270,6 +276,7 @@ public class DBFunc { } } ArrayList helpers = plotHelpers(id); + ArrayList trusted = plotTrusted(id); ArrayList denied = plotDenied(id); // boolean changeTime = ((Short) settings.get("custom_time") == // 0) ? false : true; @@ -309,7 +316,7 @@ public class DBFunc { for (int i = 0; i < 4; i++) { merged[3-i] = (merged_int & (1 << i)) != 0; } - p = new Plot(plot_id, owner, plotBiome, helpers, denied, /* changeTime */false, time, rain, alias, position, flags, worldname, merged); + p = new Plot(plot_id, owner, plotBiome, helpers, trusted, denied, /* changeTime */false, time, rain, alias, position, flags, worldname, merged); if (plots.containsKey(worldname)) { plots.get(worldname).put((plot_id), p); } else { @@ -559,6 +566,29 @@ public class DBFunc { } return l; } + + /** + * @param id + * @return + */ + private static ArrayList plotTrusted(int id) { + ArrayList l = new ArrayList(); + Statement stmt = null; + try { + stmt = connection.createStatement(); + ResultSet r = stmt.executeQuery("SELECT `user_uuid` FROM `plot_trusted` WHERE `plot_plot_id` = " + id); + UUID u; + while (r.next()) { + u = UUID.fromString(r.getString("user_uuid")); + l.add(u); + } + stmt.close(); + } catch (SQLException e) { + Logger.add(LogLevel.WARNING, "Failed to load trusted users for plot: " + id); + e.printStackTrace(); + } + return l; + } /** * @param plot @@ -581,6 +611,28 @@ public class DBFunc { } }); } + + /** + * @param plot + * @param player + */ + public static void removeTrusted(final String world, final Plot plot, final OfflinePlayer player) { + runTask(new Runnable() { + @Override + public void run() { + try { + PreparedStatement statement = connection.prepareStatement("DELETE FROM `plot_trusted` WHERE `plot_plot_id` = ? AND `user_uuid` = ?"); + statement.setInt(1, getId(world, plot.id)); + statement.setString(2, player.getUniqueId().toString()); + statement.executeUpdate(); + statement.close(); + } catch (SQLException e) { + e.printStackTrace(); + Logger.add(LogLevel.WARNING, "Failed to remove trusted user for plot " + plot.id); + } + } + }); + } /** * @param plot @@ -603,6 +655,28 @@ public class DBFunc { } }); } + + /** + * @param plot + * @param player + */ + public static void setTrusted(final String world, final Plot plot, final OfflinePlayer player) { + runTask(new Runnable() { + @Override + public void run() { + try { + PreparedStatement statement = connection.prepareStatement("INSERT INTO `plot_trusted` (`plot_plot_id`, `user_uuid`) VALUES(?,?)"); + statement.setInt(1, getId(world, plot.id)); + statement.setString(2, player.getUniqueId().toString()); + statement.executeUpdate(); + statement.close(); + } catch (SQLException e) { + Logger.add(LogLevel.WARNING, "Failed to set plot trusted for plot " + plot.id); + e.printStackTrace(); + } + } + }); + } /** * @param plot diff --git a/PlotSquared/src/com/intellectualcrafters/plot/database/PlotMeConverter.java b/PlotSquared/src/com/intellectualcrafters/plot/database/PlotMeConverter.java index 4d4b95acd..03688af0e 100644 --- a/PlotSquared/src/com/intellectualcrafters/plot/database/PlotMeConverter.java +++ b/PlotSquared/src/com/intellectualcrafters/plot/database/PlotMeConverter.java @@ -40,7 +40,6 @@ public class PlotMeConverter { if (plots!=null) { // TODO generate configuration based on PlotMe config - // TODO // - Plugin doesn't display a message if database is not setup at all PlotMain.sendConsoleSenderMessage("Converting " + plots.size() + " plots for '" + world.toString() + "'..."); @@ -48,6 +47,7 @@ public class PlotMeConverter { PlayerList denied = null; PlayerList added = null; ArrayList psAdded = new ArrayList<>(); + ArrayList psTrusted = new ArrayList<>(); ArrayList psDenied = new ArrayList<>(); if (world == null) { world = Bukkit.getWorld("world"); @@ -81,7 +81,7 @@ public class PlotMeConverter { } stream.println(eR3040bl230); PlotId id = new PlotId(Integer.parseInt(plot.id.split(";")[0]), Integer.parseInt(plot.id.split(";")[1])); - com.intellectualcrafters.plot.Plot pl = new com.intellectualcrafters.plot.Plot(id, plot.getOwnerId(), plot.getBiome(), psAdded, psDenied, false, 8000l, false, "", PlotHomePosition.DEFAULT, null, world.getName(), new boolean[] {false, false, false, false} ); + com.intellectualcrafters.plot.Plot pl = new com.intellectualcrafters.plot.Plot(id, plot.getOwnerId(), plot.getBiome(), psAdded, psTrusted, psDenied, false, 8000l, false, "", PlotHomePosition.DEFAULT, null, world.getName(), new boolean[] {false, false, false, false} ); // TODO createPlot doesn't add helpers / denied users diff --git a/PlotSquared/src/com/intellectualcrafters/plot/events/PlayerPlotTrustedEvent.java b/PlotSquared/src/com/intellectualcrafters/plot/events/PlayerPlotTrustedEvent.java new file mode 100644 index 000000000..16823168d --- /dev/null +++ b/PlotSquared/src/com/intellectualcrafters/plot/events/PlayerPlotTrustedEvent.java @@ -0,0 +1,68 @@ +package com.intellectualcrafters.plot.events; + +import java.util.UUID; + +import org.bukkit.entity.Player; +import org.bukkit.event.Event; +import org.bukkit.event.HandlerList; + +import com.intellectualcrafters.plot.Plot; + +/** + * Created by Citymonstret on 2014-08-16. + */ +public class PlayerPlotTrustedEvent extends Event { + private static HandlerList handlers = new HandlerList(); + + private Plot plot; + private Player initiator; + private boolean added; + private UUID player; + /** + * PlayerPlotTrustedEvent: Called when a plot trusted user is added/removed + * @param initiator + * @param plot + * @param player + * @param added + */ + public PlayerPlotTrustedEvent(Player initiator, Plot plot, UUID player, boolean added) { + this.initiator = initiator; + this.plot = plot; + this.added = added; + this.player = player; + } + + /** + * If a player was added + * @return boolean + */ + public boolean wasAdded() { + return this.added; + } + /** + * The UUID added/removed + * @return UUID + */ + public UUID getPlayer() { + return this.player; + } + /** + * The plot involved + * @return Plot + */ + public Plot getPlot() { + return this.plot; + } + /** + * The player initiating the action + * @return Player + */ + public Player getInitiator() { + return this.initiator; + } + + @Override + public HandlerList getHandlers() { + return handlers; + } +} diff --git a/PlotSquared/src/com/intellectualcrafters/plot/listeners/WorldEditListener.java b/PlotSquared/src/com/intellectualcrafters/plot/listeners/WorldEditListener.java index feddfeeb7..137250090 100644 --- a/PlotSquared/src/com/intellectualcrafters/plot/listeners/WorldEditListener.java +++ b/PlotSquared/src/com/intellectualcrafters/plot/listeners/WorldEditListener.java @@ -1,6 +1,8 @@ package com.intellectualcrafters.plot.listeners; import com.intellectualcrafters.plot.*; +import com.intellectualcrafters.plot.database.DBFunc; + import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.block.Block; @@ -115,7 +117,7 @@ public class WorldEditListener implements Listener { e.setCancelled(true); } else if (msg.startsWith("/up") || msg.startsWith("//up") || msg.startsWith("/worldedit:up") || msg.startsWith("/worldedit:/up")) { Plot plot = PlayerFunctions.getCurrentPlot(p); - if ((p == null) || !plot.hasRights(p)) { + if ((p == null) || !(plot.helpers.contains(DBFunc.everyone) || plot.helpers.contains(p.getUniqueId()))) { e.setCancelled(true); } } @@ -132,7 +134,7 @@ public class WorldEditListener implements Listener { if (((e.getAction() == Action.LEFT_CLICK_BLOCK) || (e.getAction() == Action.RIGHT_CLICK_BLOCK)) && (p.getItemInHand() != null) && (p.getItemInHand().getType() != Material.AIR)) { Block b = e.getClickedBlock(); Plot plot = PlotHelper.getCurrentPlot(b.getLocation()); - if ((plot != null) && plot.hasRights(p)) { + if ((plot != null) && (plot.helpers.contains(DBFunc.everyone) || plot.helpers.contains(p.getUniqueId()))) { PWE.setMask(p, b.getLocation()); } else { e.setCancelled(true);