mirror of
				https://github.com/IntellectualSites/PlotSquared.git
				synced 2025-11-04 03:03:43 +01:00 
			
		
		
		
	Fixes #538
This commit is contained in:
		@@ -633,7 +633,7 @@ public class PS {
 | 
			
		||||
     * @return
 | 
			
		||||
     */
 | 
			
		||||
    @Deprecated
 | 
			
		||||
    public static ArrayList<Plot> sortPlotsByTimestamp(Collection<Plot> input) {
 | 
			
		||||
    public ArrayList<Plot> sortPlotsByTimestamp(Collection<Plot> input) {
 | 
			
		||||
        List<Plot> list;
 | 
			
		||||
        if (input instanceof ArrayList<?>) {
 | 
			
		||||
            list = (List<Plot>) input;
 | 
			
		||||
@@ -812,7 +812,7 @@ public class PS {
 | 
			
		||||
     * @deprecated Unchecked, use {@link #sortPlots(Collection, SortType, String)} instead which will in turn call this
 | 
			
		||||
     * @param input
 | 
			
		||||
     */
 | 
			
		||||
    public static void sortPlotsByHash(Plot[] input) {
 | 
			
		||||
    public void sortPlotsByHash(Plot[] input) {
 | 
			
		||||
        List<Plot>[] bucket = new ArrayList[64];
 | 
			
		||||
        for (int i = 0; i < bucket.length; i++) {
 | 
			
		||||
            bucket[i] = new ArrayList<Plot>();
 | 
			
		||||
@@ -845,7 +845,7 @@ public class PS {
 | 
			
		||||
     * @deprecated Unchecked, use {@link #sortPlots(Collection, SortType, String)} instead which will in turn call this
 | 
			
		||||
     */
 | 
			
		||||
    @Deprecated
 | 
			
		||||
    public static void sortPlotsByTimestamp(Plot[] input) {
 | 
			
		||||
    public void sortPlotsByTimestamp(Plot[] input) {
 | 
			
		||||
        final int SIZE = 100;
 | 
			
		||||
        List<Plot>[] bucket = new ArrayList[SIZE];
 | 
			
		||||
        for (int i = 0; i < bucket.length; i++) {
 | 
			
		||||
@@ -1049,8 +1049,12 @@ public class PS {
 | 
			
		||||
     */
 | 
			
		||||
    @Deprecated
 | 
			
		||||
    public HashMap<PlotId, Plot> getPlots(final String world) {
 | 
			
		||||
        if (plots.containsKey(world)) {
 | 
			
		||||
            return new HashMap<>(lastMap);
 | 
			
		||||
        ConcurrentHashMap<PlotId, Plot> myplots = plots.get(world);
 | 
			
		||||
        if (myplots != null) {
 | 
			
		||||
            if (world == lastWorld) {
 | 
			
		||||
                return new HashMap<>(lastMap);
 | 
			
		||||
            }
 | 
			
		||||
            return new HashMap<>(myplots);
 | 
			
		||||
        }
 | 
			
		||||
        return new HashMap<>();
 | 
			
		||||
    }
 | 
			
		||||
@@ -1535,58 +1539,49 @@ public class PS {
 | 
			
		||||
     * Setup the database connection
 | 
			
		||||
     */
 | 
			
		||||
    public void setupDatabase() {
 | 
			
		||||
        if (Settings.DB.USE_MYSQL) {
 | 
			
		||||
            try {
 | 
			
		||||
                database = new MySQL(Settings.DB.HOST_NAME, Settings.DB.PORT, Settings.DB.DATABASE, Settings.DB.USER, Settings.DB.PASSWORD);
 | 
			
		||||
                connection = database.openConnection();
 | 
			
		||||
                {
 | 
			
		||||
                    if (DBFunc.dbManager == null) {
 | 
			
		||||
                        DBFunc.dbManager = new SQLManager(connection, Settings.DB.PREFIX);
 | 
			
		||||
                    }
 | 
			
		||||
                    DBFunc.createTables("mysql");
 | 
			
		||||
                }
 | 
			
		||||
            } catch (final Exception e) {
 | 
			
		||||
                log("&c[Plots] MySQL is not setup correctly. The plugin will disable itself.");
 | 
			
		||||
                if ((config == null) || config.getBoolean("debug")) {
 | 
			
		||||
                    log("&d==== Here is an ugly stacktrace if you are interested in those things ====");
 | 
			
		||||
                    e.printStackTrace();
 | 
			
		||||
                    log("&d==== End of stacktrace ====");
 | 
			
		||||
                    log("&6Please go to the PlotSquared 'storage.yml' and configure MySQL correctly.");
 | 
			
		||||
                }
 | 
			
		||||
        try {
 | 
			
		||||
            if (Settings.DB.USE_MONGO) {
 | 
			
		||||
                log(C.PREFIX.s() + "MongoDB is not yet implemented");
 | 
			
		||||
                log(C.PREFIX + "&cNo storage type is set!");
 | 
			
		||||
                IMP.disable();
 | 
			
		||||
                return;
 | 
			
		||||
            }
 | 
			
		||||
            if (DBFunc.dbManager == null) {
 | 
			
		||||
                if (Settings.DB.USE_MYSQL) {
 | 
			
		||||
                    database = new MySQL(Settings.DB.HOST_NAME, Settings.DB.PORT, Settings.DB.DATABASE, Settings.DB.USER, Settings.DB.PASSWORD);
 | 
			
		||||
                }
 | 
			
		||||
                else if (Settings.DB.USE_SQLITE) {
 | 
			
		||||
                    database = new SQLite(IMP.getDirectory() + File.separator + Settings.DB.SQLITE_DB + ".db");
 | 
			
		||||
                }
 | 
			
		||||
                else {
 | 
			
		||||
                    log(C.PREFIX + "&cNo storage type is set!");
 | 
			
		||||
                    IMP.disable();
 | 
			
		||||
                    return;
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            DBFunc.dbManager = new SQLManager(database, Settings.DB.PREFIX, false);
 | 
			
		||||
            plots = DBFunc.getPlots();
 | 
			
		||||
            if (Settings.ENABLE_CLUSTERS) {
 | 
			
		||||
                ClusterManager.clusters = DBFunc.getClusters();
 | 
			
		||||
            }
 | 
			
		||||
        } else if (Settings.DB.USE_MONGO) {
 | 
			
		||||
            // DBFunc.dbManager = new MongoManager();
 | 
			
		||||
            log(C.PREFIX.s() + "MongoDB is not yet implemented");
 | 
			
		||||
        } else if (Settings.DB.USE_SQLITE) {
 | 
			
		||||
            try {
 | 
			
		||||
                this.database = new SQLite(IMP.getDirectory() + File.separator + Settings.DB.SQLITE_DB + ".db");
 | 
			
		||||
                connection = this.database.openConnection();
 | 
			
		||||
                {
 | 
			
		||||
                    DBFunc.dbManager = new SQLManager(connection, Settings.DB.PREFIX);
 | 
			
		||||
                    final DatabaseMetaData meta = connection.getMetaData();
 | 
			
		||||
                    meta.getTables(null, null, Settings.DB.PREFIX + "plot", null);
 | 
			
		||||
                    DBFunc.createTables("sqlite");
 | 
			
		||||
                }
 | 
			
		||||
            } catch (final Exception e) {
 | 
			
		||||
                log(C.PREFIX.s() + "&cFailed to open SQLite connection. The plugin will disable itself.");
 | 
			
		||||
                log("&9==== Here is an ugly stacktrace, if you are interested in those things ===");
 | 
			
		||||
                e.printStackTrace();
 | 
			
		||||
                IMP.disable();
 | 
			
		||||
                return;
 | 
			
		||||
        }
 | 
			
		||||
        catch (Exception e) {
 | 
			
		||||
            log(C.PREFIX.s() + "&cFailed to open DATABASE connection. The plugin will disable itself.");
 | 
			
		||||
            if (Settings.DB.USE_MONGO) {
 | 
			
		||||
                log("$4MONGO");
 | 
			
		||||
            }
 | 
			
		||||
            plots = DBFunc.getPlots();
 | 
			
		||||
            if (Settings.ENABLE_CLUSTERS) {
 | 
			
		||||
                ClusterManager.clusters = DBFunc.getClusters();
 | 
			
		||||
            else if (Settings.DB.USE_MYSQL) {
 | 
			
		||||
                log("$4MYSQL");
 | 
			
		||||
            }
 | 
			
		||||
        } else {
 | 
			
		||||
            log(C.PREFIX + "&cNo storage type is set!");
 | 
			
		||||
            else if (Settings.DB.USE_SQLITE) {
 | 
			
		||||
                log("$4SQLITE");
 | 
			
		||||
            }
 | 
			
		||||
            log("&d==== Here is an ugly stacktrace, if you are interested in those things ===");
 | 
			
		||||
            e.printStackTrace();
 | 
			
		||||
            log("&d==== End of stacktrace ====");
 | 
			
		||||
            log("&6Please go to the PlotSquared 'storage.yml' and configure the database correctly.");
 | 
			
		||||
            IMP.disable();
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -1,19 +1,18 @@
 | 
			
		||||
package com.intellectualcrafters.plot.commands;
 | 
			
		||||
 | 
			
		||||
import java.sql.Connection;
 | 
			
		||||
import java.sql.SQLException;
 | 
			
		||||
import java.io.File;
 | 
			
		||||
import java.util.ArrayList;
 | 
			
		||||
import java.util.UUID;
 | 
			
		||||
import java.util.Arrays;
 | 
			
		||||
import java.util.HashSet;
 | 
			
		||||
 | 
			
		||||
import com.intellectualcrafters.plot.PS;
 | 
			
		||||
import com.intellectualcrafters.plot.database.MySQL;
 | 
			
		||||
import com.intellectualcrafters.plot.database.SQLManager;
 | 
			
		||||
import com.intellectualcrafters.plot.database.SQLite;
 | 
			
		||||
import com.intellectualcrafters.plot.object.Plot;
 | 
			
		||||
import com.intellectualcrafters.plot.object.PlotPlayer;
 | 
			
		||||
import com.intellectualcrafters.plot.util.MainUtil;
 | 
			
		||||
import com.intellectualcrafters.plot.util.StringComparison;
 | 
			
		||||
import com.intellectualcrafters.plot.util.TaskManager;
 | 
			
		||||
import com.intellectualcrafters.plot.util.UUIDHandler;
 | 
			
		||||
import com.plotsquared.general.commands.CommandDeclaration;
 | 
			
		||||
 | 
			
		||||
@CommandDeclaration(
 | 
			
		||||
@@ -23,27 +22,12 @@ import com.plotsquared.general.commands.CommandDeclaration;
 | 
			
		||||
        permission = "plots.database",
 | 
			
		||||
        description = "Convert/Backup Storage",
 | 
			
		||||
        requiredType = RequiredType.CONSOLE,
 | 
			
		||||
        usage = "/plots database <type> [details...]"
 | 
			
		||||
        usage = "/plots database [world] <sqlite|mysql>"
 | 
			
		||||
        
 | 
			
		||||
)
 | 
			
		||||
public class Database extends SubCommand {
 | 
			
		||||
 | 
			
		||||
    private static boolean sendMessageU(final UUID uuid, final String msg) {
 | 
			
		||||
        if (uuid == null) {
 | 
			
		||||
            PS.debug(msg);
 | 
			
		||||
        } else {
 | 
			
		||||
            final PlotPlayer p = UUIDHandler.getPlayer(uuid);
 | 
			
		||||
            if ((p != null) && p.isOnline()) {
 | 
			
		||||
                return MainUtil.sendMessage(p, msg);
 | 
			
		||||
            } else {
 | 
			
		||||
                return sendMessageU(null, msg);
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        return true;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static void insertPlots(final SQLManager manager, final UUID requester, final Connection c) {
 | 
			
		||||
        final java.util.Set<Plot> plots = PS.get().getPlots();
 | 
			
		||||
    public static void insertPlots(final SQLManager manager, final ArrayList<Plot> plots, final PlotPlayer player) {
 | 
			
		||||
        TaskManager.runTaskAsync(new Runnable() {
 | 
			
		||||
            @Override
 | 
			
		||||
            public void run() {
 | 
			
		||||
@@ -52,20 +36,16 @@ public class Database extends SubCommand {
 | 
			
		||||
                    for (final Plot p : plots) {
 | 
			
		||||
                        ps.add(p);
 | 
			
		||||
                    }
 | 
			
		||||
                    sendMessageU(requester, "&6Starting...");
 | 
			
		||||
                    MainUtil.sendMessage(player, "&6Starting...");
 | 
			
		||||
                    manager.createPlotsAndData(ps, new Runnable() {
 | 
			
		||||
                        @Override
 | 
			
		||||
                        public void run() {
 | 
			
		||||
                            sendMessageU(requester, "&6Database conversion finished!");
 | 
			
		||||
                            MainUtil.sendMessage(player, "&6Database conversion finished!");
 | 
			
		||||
                            manager.close();
 | 
			
		||||
                        }
 | 
			
		||||
                    });
 | 
			
		||||
                } catch (final Exception e) {
 | 
			
		||||
                    sendMessageU(requester, "Failed to insert plot objects, see stacktrace for info");
 | 
			
		||||
                    e.printStackTrace();
 | 
			
		||||
                }
 | 
			
		||||
                try {
 | 
			
		||||
                    c.close();
 | 
			
		||||
                } catch (final SQLException e) {
 | 
			
		||||
                    MainUtil.sendMessage(player, "Failed to insert plot objects, see stacktrace for info");
 | 
			
		||||
                    e.printStackTrace();
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
@@ -73,61 +53,72 @@ public class Database extends SubCommand {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public boolean onCommand(PlotPlayer plr, String[] args) {
 | 
			
		||||
    public boolean onCommand(PlotPlayer player, String[] args) {
 | 
			
		||||
        if (args.length < 1) {
 | 
			
		||||
            return sendMessage(plr, "/plot database [sqlite/mysql]");
 | 
			
		||||
            MainUtil.sendMessage(player, "/plot database [world] <sqlite|mysql>");
 | 
			
		||||
            return false;
 | 
			
		||||
        }
 | 
			
		||||
        final String type = new StringComparison(args[0], new String[] { "mysql", "sqlite" }).getBestMatch().toLowerCase();
 | 
			
		||||
        switch (type) {
 | 
			
		||||
            case "mysql":
 | 
			
		||||
                if (args.length < 6) {
 | 
			
		||||
                    return sendMessage(plr, "/plot database mysql [host] [port] [username] [password] [database] {prefix}");
 | 
			
		||||
                }
 | 
			
		||||
                final String host = args[1];
 | 
			
		||||
                final String port = args[2];
 | 
			
		||||
                final String username = args[3];
 | 
			
		||||
                final String password = args[4];
 | 
			
		||||
                final String database = args[5];
 | 
			
		||||
                String prefix = "";
 | 
			
		||||
                if (args.length > 6) {
 | 
			
		||||
                    prefix = args[6];
 | 
			
		||||
                }
 | 
			
		||||
                Connection n;
 | 
			
		||||
                try {
 | 
			
		||||
                    n = new MySQL(host, port, database, username, password).openConnection();
 | 
			
		||||
                    // Connection
 | 
			
		||||
                    if (n.isClosed()) {
 | 
			
		||||
                        return sendMessage(plr, "Failed to open connection");
 | 
			
		||||
        ArrayList<Plot> plots;
 | 
			
		||||
        if (PS.get().isPlotWorld(args[0])) {
 | 
			
		||||
            plots = PS.get().sortPlotsByTemp(PS.get().getPlotsInWorld(args[0]));
 | 
			
		||||
            args = Arrays.copyOfRange(args, 1, args.length);
 | 
			
		||||
        }
 | 
			
		||||
        else {
 | 
			
		||||
            plots = PS.get().sortPlotsByTemp(PS.get().getPlotsRaw());
 | 
			
		||||
        }
 | 
			
		||||
        if (args.length < 1) {
 | 
			
		||||
            MainUtil.sendMessage(player, "/plot database [world] <sqlite|mysql>");
 | 
			
		||||
            MainUtil.sendMessage(player, "[arg] indicates an optional argument");
 | 
			
		||||
            return false;
 | 
			
		||||
        }
 | 
			
		||||
        try {
 | 
			
		||||
            com.intellectualcrafters.plot.database.Database implementation;
 | 
			
		||||
            String prefix = "";
 | 
			
		||||
            switch (args[0].toLowerCase()) {
 | 
			
		||||
                case "mysql":
 | 
			
		||||
                    if (args.length < 6) {
 | 
			
		||||
                        return MainUtil.sendMessage(player, "/plot database mysql [host] [port] [username] [password] [database] {prefix}");
 | 
			
		||||
                    }
 | 
			
		||||
                } catch (SQLException | ClassNotFoundException e) {
 | 
			
		||||
                    e.printStackTrace();
 | 
			
		||||
                    return sendMessage(plr, "Failed to open connection, read stacktrace for info");
 | 
			
		||||
                }
 | 
			
		||||
                final SQLManager manager = new SQLManager(n, prefix);
 | 
			
		||||
                try {
 | 
			
		||||
                    manager.createTables("mysql");
 | 
			
		||||
                } catch (final SQLException e) {
 | 
			
		||||
                    e.printStackTrace();
 | 
			
		||||
                    return sendMessage(plr, "Could not create the required tables and/or load the database") && sendMessage(plr, "Please see the stacktrace for more information");
 | 
			
		||||
                }
 | 
			
		||||
                UUID requester = null;
 | 
			
		||||
                requester = UUIDHandler.getUUID(plr);
 | 
			
		||||
                insertPlots(manager, requester, n);
 | 
			
		||||
                break;
 | 
			
		||||
            case "sqlite":
 | 
			
		||||
                if (args.length < 2) {
 | 
			
		||||
                    return sendMessage(plr, "/plot database sqlite [file name]");
 | 
			
		||||
                }
 | 
			
		||||
                sendMessage(plr, "This is not supported yet");
 | 
			
		||||
                break;
 | 
			
		||||
            default:
 | 
			
		||||
                return sendMessage(plr, "Unknown database type");
 | 
			
		||||
                    final String host = args[1];
 | 
			
		||||
                    final String port = args[2];
 | 
			
		||||
                    final String username = args[3];
 | 
			
		||||
                    final String password = args[4];
 | 
			
		||||
                    final String database = args[5];
 | 
			
		||||
                    if (args.length > 6) {
 | 
			
		||||
                        prefix = args[6];
 | 
			
		||||
                    }
 | 
			
		||||
                    implementation = new MySQL(host, port, database, username, password);
 | 
			
		||||
                    break;
 | 
			
		||||
                case "sqlite":
 | 
			
		||||
                    if (args.length < 2) {
 | 
			
		||||
                        return MainUtil.sendMessage(player, "/plot database sqlite [file]: " + args.length + " | " + args[0]);
 | 
			
		||||
                    }
 | 
			
		||||
                    implementation = new SQLite(PS.get().IMP.getDirectory() + File.separator + args[1] + ".db");
 | 
			
		||||
                    break;
 | 
			
		||||
                default:
 | 
			
		||||
                    return MainUtil.sendMessage(player, "/plot database [sqlite/mysql]");
 | 
			
		||||
            }
 | 
			
		||||
            try {
 | 
			
		||||
                final SQLManager manager = new SQLManager(implementation, prefix, true);
 | 
			
		||||
                insertPlots(manager, plots, player);
 | 
			
		||||
                return true;
 | 
			
		||||
            }
 | 
			
		||||
            catch (Exception e) {
 | 
			
		||||
                MainUtil.sendMessage(player, "$1Failed to save plots, read stacktrace for info");
 | 
			
		||||
                MainUtil.sendMessage(player, "&d==== Here is an ugly stacktrace, if you are interested in those things ===");
 | 
			
		||||
                e.printStackTrace();
 | 
			
		||||
                MainUtil.sendMessage(player, "&d==== End of stacktrace ====");
 | 
			
		||||
                MainUtil.sendMessage(player, "$1Please make sure you are using the correct arguments!");
 | 
			
		||||
                return false;
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        catch (Exception e) {
 | 
			
		||||
            MainUtil.sendMessage(player, "$1Failed to open connection, read stacktrace for info");
 | 
			
		||||
            MainUtil.sendMessage(player, "&d==== Here is an ugly stacktrace, if you are interested in those things ===");
 | 
			
		||||
            e.printStackTrace();
 | 
			
		||||
            MainUtil.sendMessage(player, "&d==== End of stacktrace ====");
 | 
			
		||||
            MainUtil.sendMessage(player, "$1Please make sure you are using the correct arguments!");
 | 
			
		||||
            return false;
 | 
			
		||||
        }
 | 
			
		||||
        return false;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private boolean sendMessage(final PlotPlayer player, final String msg) {
 | 
			
		||||
        MainUtil.sendMessage(player, msg);
 | 
			
		||||
        return true;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -41,6 +41,7 @@ import com.plotsquared.general.commands.CommandDeclaration;
 | 
			
		||||
@CommandDeclaration(
 | 
			
		||||
        command = "flag",
 | 
			
		||||
        aliases = {"f"},
 | 
			
		||||
        usage = "/plot flag <set|remove|add|list|info> <flag> <value>",
 | 
			
		||||
        description = "Manage plot flags",
 | 
			
		||||
        category = CommandCategory.ACTIONS,
 | 
			
		||||
        requiredType = RequiredType.NONE,
 | 
			
		||||
@@ -48,6 +49,11 @@ import com.plotsquared.general.commands.CommandDeclaration;
 | 
			
		||||
)
 | 
			
		||||
public class FlagCmd extends SubCommand {
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public String getUsage() {
 | 
			
		||||
        return super.getUsage().replaceAll("<flag>", StringMan.join(FlagManager.getFlags(), "|"));
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    @Override
 | 
			
		||||
    public boolean onCommand(final PlotPlayer player, final String ... args) {
 | 
			
		||||
        
 | 
			
		||||
 
 | 
			
		||||
@@ -22,6 +22,7 @@ package com.intellectualcrafters.plot.commands;
 | 
			
		||||
 | 
			
		||||
import java.util.ArrayList;
 | 
			
		||||
import java.util.Arrays;
 | 
			
		||||
import java.util.HashSet;
 | 
			
		||||
import java.util.Iterator;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
 | 
			
		||||
@@ -136,7 +137,7 @@ public class MainCommand extends CommandManager<PlotPlayer> {
 | 
			
		||||
        return false;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    public static List<Command<PlotPlayer>> getCommands(final CommandCategory category, final PlotPlayer player) {
 | 
			
		||||
    public static List<Command<PlotPlayer>> getCommandAndAliases(final CommandCategory category, final PlotPlayer player) {
 | 
			
		||||
        List<Command<PlotPlayer>> commands = new ArrayList<>();
 | 
			
		||||
        for (Command<PlotPlayer> command : getInstance().getCommands()) {
 | 
			
		||||
            if (category != null && !command.getCategory().equals(category)) {
 | 
			
		||||
@@ -150,6 +151,20 @@ public class MainCommand extends CommandManager<PlotPlayer> {
 | 
			
		||||
        return commands;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    public static List<Command<PlotPlayer>> getCommands(final CommandCategory category, final PlotPlayer player) {
 | 
			
		||||
        List<Command<PlotPlayer>> commands = new ArrayList<>();
 | 
			
		||||
        for (Command<PlotPlayer> command : new HashSet<>(getInstance().getCommands())) {
 | 
			
		||||
            if (category != null && !command.getCategory().equals(category)) {
 | 
			
		||||
                continue;
 | 
			
		||||
            }
 | 
			
		||||
            if (player != null && !Permissions.hasPermission(player, command.getPermission())) {
 | 
			
		||||
                continue;
 | 
			
		||||
            }
 | 
			
		||||
            commands.add(command);
 | 
			
		||||
        }
 | 
			
		||||
        return commands;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
////    public static List<String> helpMenu(final PlotPlayer player, final CommandCategory category, int page) {
 | 
			
		||||
//        List<Command<PlotPlayer>> commands;
 | 
			
		||||
//       //  commands = getCommands(category, player);
 | 
			
		||||
@@ -338,10 +353,57 @@ public class MainCommand extends CommandManager<PlotPlayer> {
 | 
			
		||||
            MainUtil.sendMessage(plr, C.NOT_VALID_SUBCOMMAND);
 | 
			
		||||
            {
 | 
			
		||||
                List<Command<PlotPlayer>> cmds = getCommands(null, plr);
 | 
			
		||||
                if (label == null || cmds.size() == 0 || (cmd = new StringComparison<>(label, cmds).getMatchObject()) == null) {
 | 
			
		||||
                if (label == null || cmds.size() == 0) {
 | 
			
		||||
                    MainUtil.sendMessage(plr, C.DID_YOU_MEAN, "/plot help");
 | 
			
		||||
                }
 | 
			
		||||
                else {
 | 
			
		||||
                    HashSet<String> setargs = new HashSet<>(args.length + 1);
 | 
			
		||||
                    for (String arg : args) {
 | 
			
		||||
                        setargs.add(arg.toLowerCase());
 | 
			
		||||
                    }
 | 
			
		||||
                    setargs.add(label.toLowerCase());
 | 
			
		||||
                    String[] allargs = setargs.toArray(new String[setargs.size()]);
 | 
			
		||||
                    int best = 0;
 | 
			
		||||
                    for (Command<PlotPlayer> current : cmds) {
 | 
			
		||||
                        if (current.getUsage() != null) {
 | 
			
		||||
                            int count = 0;
 | 
			
		||||
                            for (String word : new HashSet<String>(Arrays.asList((current.getUsage() + " " + current.getPermission() + " " + current.getCategory().name()).toLowerCase().replaceAll("\\||\\>|\\<|\\[|\\]|\\{|\\}|\\_|\\/", " ").trim().replaceAll("\\s+", " ").split(" ")))) {
 | 
			
		||||
                                for (int i = 0; i < allargs.length; i++) {
 | 
			
		||||
                                    String arg = allargs[i];
 | 
			
		||||
                                    if (best - count - (allargs.length - i) * 3 >= 0) {
 | 
			
		||||
                                        continue;
 | 
			
		||||
                                    }
 | 
			
		||||
                                    if (StringMan.isEqual(arg, word)) {
 | 
			
		||||
                                        count+=3;
 | 
			
		||||
                                    }
 | 
			
		||||
                                    else if (word.length() > arg.length() && word.contains(arg)) {
 | 
			
		||||
                                        count+=2;
 | 
			
		||||
                                    }
 | 
			
		||||
                                }
 | 
			
		||||
                            }
 | 
			
		||||
                            for (String word : new HashSet<String>(Arrays.asList((current.getDescription()).toLowerCase().replaceAll("\\||\\>|\\<|\\[|\\]|\\{|\\}|\\_|\\/", " ").trim().replaceAll("\\s+", " ").split(" ")))) {
 | 
			
		||||
                                for (int i = 0; i < allargs.length; i++) {
 | 
			
		||||
                                    String arg = allargs[i];
 | 
			
		||||
                                    if (best - count - (allargs.length - i) * 2 >= 0) {
 | 
			
		||||
                                        continue;
 | 
			
		||||
                                    }
 | 
			
		||||
                                    if (StringMan.isEqual(arg, word)) {
 | 
			
		||||
                                        count+=2;
 | 
			
		||||
                                    }
 | 
			
		||||
                                    else if (word.length() > arg.length() && word.contains(arg)) {
 | 
			
		||||
                                        count++;
 | 
			
		||||
                                    }
 | 
			
		||||
                                }
 | 
			
		||||
                            }
 | 
			
		||||
                            if (count > best) {
 | 
			
		||||
                                best = count;
 | 
			
		||||
                                cmd = current;
 | 
			
		||||
                            }
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
                    if (cmd == null) {
 | 
			
		||||
                        cmd = new StringComparison<>(label, getCommandAndAliases(null, plr)).getMatchObject();
 | 
			
		||||
                    }
 | 
			
		||||
                    MainUtil.sendMessage(plr, C.DID_YOU_MEAN, cmd.getUsage().replaceAll("\\{label\\}", parts[0]));
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
 
 | 
			
		||||
@@ -54,7 +54,7 @@ import com.plotsquared.listener.PlotListener;
 | 
			
		||||
        command = "set",
 | 
			
		||||
        description = "Set a plot value",
 | 
			
		||||
        aliases = {"s"},
 | 
			
		||||
        usage = "/plot set <arg> <value(s)...>",
 | 
			
		||||
        usage = "/plot set <biome|alias|home|flag> <value...>",
 | 
			
		||||
        permission = "plots.set",
 | 
			
		||||
        category = CommandCategory.ACTIONS,
 | 
			
		||||
        requiredType = RequiredType.NONE
 | 
			
		||||
 
 | 
			
		||||
@@ -42,6 +42,7 @@ import com.intellectualcrafters.plot.object.comment.PlotComment;
 | 
			
		||||
 * @author Empire92
 | 
			
		||||
 */
 | 
			
		||||
public interface AbstractDB {
 | 
			
		||||
    
 | 
			
		||||
    /**
 | 
			
		||||
     * The UUID that will count as everyone
 | 
			
		||||
     */
 | 
			
		||||
@@ -76,7 +77,7 @@ public interface AbstractDB {
 | 
			
		||||
     *
 | 
			
		||||
     * @throws SQLException If the database manager is unable to create the tables
 | 
			
		||||
     */
 | 
			
		||||
    void createTables(final String database) throws Exception;
 | 
			
		||||
    void createTables() throws Exception;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Delete a plot
 | 
			
		||||
 
 | 
			
		||||
@@ -71,8 +71,12 @@ public class SQLManager implements AbstractDB {
 | 
			
		||||
    public final String CREATE_PLOT;
 | 
			
		||||
    public final String CREATE_CLUSTER;
 | 
			
		||||
    private final String prefix;
 | 
			
		||||
    // Private Final
 | 
			
		||||
    // Private
 | 
			
		||||
    private Connection connection;
 | 
			
		||||
    private boolean CLOSED = false;
 | 
			
		||||
    // Private Final
 | 
			
		||||
    private final Database database;
 | 
			
		||||
    private final boolean MYSQL;
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * important tasks
 | 
			
		||||
@@ -97,9 +101,13 @@ public class SQLManager implements AbstractDB {
 | 
			
		||||
     * cluster_settings
 | 
			
		||||
     */
 | 
			
		||||
    public volatile ConcurrentHashMap<PlotCluster, Queue<UniqueStatement>> clusterTasks;
 | 
			
		||||
    private boolean debug;
 | 
			
		||||
    
 | 
			
		||||
    public synchronized Queue<Runnable> getGlobalTasks() {
 | 
			
		||||
        return globalTasks;
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    public void addPlotTask(Plot plot, UniqueStatement task) {
 | 
			
		||||
    public synchronized void addPlotTask(Plot plot, UniqueStatement task) {
 | 
			
		||||
        if (plot == null) {
 | 
			
		||||
            plot = new Plot("", new PlotId(Integer.MAX_VALUE, Integer.MAX_VALUE), null);
 | 
			
		||||
        }
 | 
			
		||||
@@ -130,7 +138,7 @@ public class SQLManager implements AbstractDB {
 | 
			
		||||
        tasks.add(task);
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    public void addClusterTask(PlotCluster cluster, UniqueStatement task) {
 | 
			
		||||
    public synchronized void addClusterTask(PlotCluster cluster, UniqueStatement task) {
 | 
			
		||||
        Queue<UniqueStatement> tasks = clusterTasks.get(cluster);
 | 
			
		||||
        if (tasks == null) {
 | 
			
		||||
            tasks = new ConcurrentLinkedQueue<>();
 | 
			
		||||
@@ -139,8 +147,8 @@ public class SQLManager implements AbstractDB {
 | 
			
		||||
        tasks.add(task);
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    public void addGlobalTask(Runnable task) {
 | 
			
		||||
        globalTasks.add(task);
 | 
			
		||||
    public synchronized void addGlobalTask(Runnable task) {
 | 
			
		||||
        getGlobalTasks().add(task);
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    
 | 
			
		||||
@@ -149,10 +157,14 @@ public class SQLManager implements AbstractDB {
 | 
			
		||||
     *
 | 
			
		||||
     * @param c connection
 | 
			
		||||
     * @param p prefix
 | 
			
		||||
     * @throws Exception 
 | 
			
		||||
     */
 | 
			
		||||
    public SQLManager(final Connection c, final String p) {
 | 
			
		||||
    public SQLManager(final Database database, final String p, final boolean debug) throws Exception {
 | 
			
		||||
        this.debug = debug;
 | 
			
		||||
        // Private final
 | 
			
		||||
        this.connection = c;
 | 
			
		||||
        this.database = database;
 | 
			
		||||
        this.connection = database.openConnection();
 | 
			
		||||
        this.MYSQL = (database instanceof MySQL);
 | 
			
		||||
        globalTasks = new ConcurrentLinkedQueue<>();
 | 
			
		||||
        plotTasks = new ConcurrentHashMap<>();
 | 
			
		||||
        clusterTasks = new ConcurrentHashMap<>();
 | 
			
		||||
@@ -161,15 +173,15 @@ public class SQLManager implements AbstractDB {
 | 
			
		||||
            public void run() {
 | 
			
		||||
                long last = System.currentTimeMillis();
 | 
			
		||||
                while (true) {
 | 
			
		||||
                    if (PS.get().getDatabase() == null) {
 | 
			
		||||
                    if (CLOSED) {
 | 
			
		||||
                        break;
 | 
			
		||||
                    }
 | 
			
		||||
                    // schedule reconnect
 | 
			
		||||
                    if (Settings.DB.USE_MYSQL && System.currentTimeMillis() - last > 550000) {
 | 
			
		||||
                    if (MYSQL && System.currentTimeMillis() - last > 550000) {
 | 
			
		||||
                        last = System.currentTimeMillis();
 | 
			
		||||
                        try {
 | 
			
		||||
                            close();
 | 
			
		||||
                            connection = PS.get().getDatabase().forceConnection();
 | 
			
		||||
                            connection = database.forceConnection();
 | 
			
		||||
                        } catch (SQLException | ClassNotFoundException e) {
 | 
			
		||||
                            e.printStackTrace();
 | 
			
		||||
                        }
 | 
			
		||||
@@ -196,15 +208,16 @@ public class SQLManager implements AbstractDB {
 | 
			
		||||
        this.CREATE_PLOT = "INSERT INTO `" + this.prefix + "plot`(`plot_id_x`, `plot_id_z`, `owner`, `world`, `timestamp`) VALUES(?, ?, ?, ?, ?)";
 | 
			
		||||
        this.CREATE_CLUSTER = "INSERT INTO `" + this.prefix + "cluster`(`pos1_x`, `pos1_z`, `pos2_x`, `pos2_z`, `owner`, `world`) VALUES(?, ?, ?, ?, ?, ?)";
 | 
			
		||||
        updateTables();
 | 
			
		||||
        createTables();
 | 
			
		||||
    }
 | 
			
		||||
    
 | 
			
		||||
    public boolean sendBatch() {
 | 
			
		||||
        try {
 | 
			
		||||
            if (globalTasks.size() > 0) {
 | 
			
		||||
            if (getGlobalTasks().size() > 0) {
 | 
			
		||||
                if (connection.getAutoCommit()) {
 | 
			
		||||
                    connection.setAutoCommit(false);
 | 
			
		||||
                }
 | 
			
		||||
                Runnable task = globalTasks.remove();
 | 
			
		||||
                Runnable task = getGlobalTasks().remove();
 | 
			
		||||
                if (task != null) {
 | 
			
		||||
                    task.run();
 | 
			
		||||
                }
 | 
			
		||||
@@ -530,7 +543,7 @@ public class SQLManager implements AbstractDB {
 | 
			
		||||
                try {
 | 
			
		||||
                    stmt.setString((i * 4) + 3, plot.owner.toString());
 | 
			
		||||
                } catch (final Exception e) {
 | 
			
		||||
                    stmt.setString((i * 4) + 3, DBFunc.everyone.toString());
 | 
			
		||||
                    stmt.setString((i * 4) + 3, everyone.toString());
 | 
			
		||||
                }
 | 
			
		||||
                stmt.setString((i * 5) + 4, plot.world);
 | 
			
		||||
                stmt.setTimestamp((i * 5) + 5, new Timestamp(plot.getTimestamp()));
 | 
			
		||||
@@ -544,7 +557,7 @@ public class SQLManager implements AbstractDB {
 | 
			
		||||
                try {
 | 
			
		||||
                    stmt.setString((i * 6) + 4, plot.owner.toString());
 | 
			
		||||
                } catch (final Exception e1) {
 | 
			
		||||
                    stmt.setString((i * 6) + 4, DBFunc.everyone.toString());
 | 
			
		||||
                    stmt.setString((i * 6) + 4, everyone.toString());
 | 
			
		||||
                }
 | 
			
		||||
                stmt.setString((i * 6) + 5, plot.world);
 | 
			
		||||
                stmt.setTimestamp((i * 6) + 6, new Timestamp(plot.getTimestamp()));
 | 
			
		||||
@@ -570,7 +583,7 @@ public class SQLManager implements AbstractDB {
 | 
			
		||||
            return;
 | 
			
		||||
        }
 | 
			
		||||
        int packet;
 | 
			
		||||
        if (Settings.DB.USE_MYSQL) {
 | 
			
		||||
        if (MYSQL) {
 | 
			
		||||
            packet = Math.min(size, 5000);
 | 
			
		||||
        } else {
 | 
			
		||||
            packet = Math.min(size, 50);
 | 
			
		||||
@@ -612,7 +625,7 @@ public class SQLManager implements AbstractDB {
 | 
			
		||||
            if (whenDone != null) whenDone.run();
 | 
			
		||||
            return;
 | 
			
		||||
        } catch (Exception e) {
 | 
			
		||||
            if (Settings.DB.USE_MYSQL) {
 | 
			
		||||
            if (MYSQL) {
 | 
			
		||||
                e.printStackTrace();
 | 
			
		||||
                PS.debug("&cERROR 1: " + " | " + objList.get(0).getClass().getCanonicalName());
 | 
			
		||||
            }
 | 
			
		||||
@@ -868,6 +881,9 @@ public class SQLManager implements AbstractDB {
 | 
			
		||||
    
 | 
			
		||||
    public void commit() {
 | 
			
		||||
        try {
 | 
			
		||||
            if (CLOSED) {
 | 
			
		||||
                return;
 | 
			
		||||
            }
 | 
			
		||||
            if (!this.connection.getAutoCommit()) {
 | 
			
		||||
                this.connection.commit();
 | 
			
		||||
                this.connection.setAutoCommit(true);
 | 
			
		||||
@@ -928,14 +944,13 @@ public class SQLManager implements AbstractDB {
 | 
			
		||||
     * @throws SQLException
 | 
			
		||||
     */
 | 
			
		||||
    @Override
 | 
			
		||||
    public void createTables(final String database) throws SQLException {
 | 
			
		||||
    public void createTables() throws SQLException {
 | 
			
		||||
        final String[] tables;
 | 
			
		||||
        if (Settings.ENABLE_CLUSTERS) {
 | 
			
		||||
            tables = new String[]{"plot", "plot_denied", "plot_helpers", "plot_comments", "plot_trusted", "plot_rating", "plot_settings", "cluster"};
 | 
			
		||||
        } else {
 | 
			
		||||
            tables = new String[]{"plot", "plot_denied", "plot_helpers", "plot_comments", "plot_trusted", "plot_rating", "plot_settings"};
 | 
			
		||||
        }
 | 
			
		||||
        final boolean mysql = database.equals("mysql");
 | 
			
		||||
        final DatabaseMetaData meta = connection.getMetaData();
 | 
			
		||||
        int create = 0;
 | 
			
		||||
        for (final String s : tables) {
 | 
			
		||||
@@ -952,7 +967,7 @@ public class SQLManager implements AbstractDB {
 | 
			
		||||
        add_constraint = create == tables.length;
 | 
			
		||||
        PS.debug("Creating tables");
 | 
			
		||||
        final Statement stmt = this.connection.createStatement();
 | 
			
		||||
        if (mysql) {
 | 
			
		||||
        if (MYSQL) {
 | 
			
		||||
            stmt.addBatch("CREATE TABLE IF NOT EXISTS `" + this.prefix + "plot` (" + "`id` INT(11) NOT NULL AUTO_INCREMENT," + "`plot_id_x` INT(11) NOT NULL," + "`plot_id_z` INT(11) NOT NULL," + "`owner` VARCHAR(40) 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 `" + this.prefix + "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 `" + this.prefix + "plot_helpers` (" + "`plot_plot_id` INT(11) NOT NULL," + "`user_uuid` VARCHAR(40) NOT NULL" + ") ENGINE=InnoDB DEFAULT CHARSET=utf8");
 | 
			
		||||
@@ -1154,32 +1169,36 @@ public class SQLManager implements AbstractDB {
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
            try (Statement statement = connection.createStatement()) {
 | 
			
		||||
                statement.executeUpdate("DELETE FROM `" + this.prefix + "plot_denied` WHERE `plot_plot_id` NOT IN (SELECT `id` FROM `" + this.prefix + "plot`)");
 | 
			
		||||
                statement.close();
 | 
			
		||||
            }
 | 
			
		||||
            catch (Exception e) {
 | 
			
		||||
                e.printStackTrace();
 | 
			
		||||
            }
 | 
			
		||||
            
 | 
			
		||||
            rs.close();
 | 
			
		||||
            try (Statement statement = connection.createStatement()) {
 | 
			
		||||
                for (String table : new String[]{"plot_denied", "plot_helpers", "plot_trusted"} ) {
 | 
			
		||||
                    ResultSet result = statement.executeQuery("SELECT plot_plot_id, user_uuid, COUNT(*) FROM " + this.prefix + table + " GROUP BY plot_plot_id, user_uuid HAVING COUNT(*) > 1");
 | 
			
		||||
                    if (result.next()) {
 | 
			
		||||
                        PS.debug("BACKING UP: " + this.prefix + table);
 | 
			
		||||
                        result.close();
 | 
			
		||||
                        statement.executeUpdate("CREATE TABLE "  + this.prefix + table + "_tmp AS SELECT * FROM " + this.prefix + table + " GROUP BY plot_plot_id, user_uuid");
 | 
			
		||||
                        statement.executeUpdate("DROP TABLE " + this.prefix + table);
 | 
			
		||||
                        statement.executeUpdate("CREATE TABLE " + this.prefix + table + " AS SELECT * FROM "  + this.prefix + table + "_tmp");
 | 
			
		||||
                        statement.executeUpdate("DROP TABLE " + this.prefix + table + "_tmp");
 | 
			
		||||
                        PS.debug("RESTORING: " + this.prefix + table);
 | 
			
		||||
                    }
 | 
			
		||||
            rs = data.getColumns(null, null, this.prefix + "plot_denied", "plot_plot_id");
 | 
			
		||||
            if (rs.next()) {
 | 
			
		||||
                try (Statement statement = connection.createStatement()) {
 | 
			
		||||
                    statement.executeUpdate("DELETE FROM `" + this.prefix + "plot_denied` WHERE `plot_plot_id` NOT IN (SELECT `id` FROM `" + this.prefix + "plot`)");
 | 
			
		||||
                    statement.close();
 | 
			
		||||
                }
 | 
			
		||||
                catch (Exception e) {
 | 
			
		||||
                    e.printStackTrace();
 | 
			
		||||
                }
 | 
			
		||||
                
 | 
			
		||||
                rs.close();
 | 
			
		||||
                try (Statement statement = connection.createStatement()) {
 | 
			
		||||
                    for (String table : new String[]{"plot_denied", "plot_helpers", "plot_trusted"} ) {
 | 
			
		||||
                        ResultSet result = statement.executeQuery("SELECT plot_plot_id, user_uuid, COUNT(*) FROM " + this.prefix + table + " GROUP BY plot_plot_id, user_uuid HAVING COUNT(*) > 1");
 | 
			
		||||
                        if (result.next()) {
 | 
			
		||||
                            PS.debug("BACKING UP: " + this.prefix + table);
 | 
			
		||||
                            result.close();
 | 
			
		||||
                            statement.executeUpdate("CREATE TABLE "  + this.prefix + table + "_tmp AS SELECT * FROM " + this.prefix + table + " GROUP BY plot_plot_id, user_uuid");
 | 
			
		||||
                            statement.executeUpdate("DROP TABLE " + this.prefix + table);
 | 
			
		||||
                            statement.executeUpdate("CREATE TABLE " + this.prefix + table + " AS SELECT * FROM "  + this.prefix + table + "_tmp");
 | 
			
		||||
                            statement.executeUpdate("DROP TABLE " + this.prefix + table + "_tmp");
 | 
			
		||||
                            PS.debug("RESTORING: " + this.prefix + table);
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
                    statement.close();
 | 
			
		||||
                }
 | 
			
		||||
                catch (Exception e2) {
 | 
			
		||||
                    e2.printStackTrace();
 | 
			
		||||
                }
 | 
			
		||||
                statement.close();
 | 
			
		||||
            }
 | 
			
		||||
            catch (Exception e2) {
 | 
			
		||||
                e2.printStackTrace();
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        catch (Exception e) {
 | 
			
		||||
@@ -2351,7 +2370,7 @@ public class SQLManager implements AbstractDB {
 | 
			
		||||
            public void run() {
 | 
			
		||||
                try {
 | 
			
		||||
                    close();
 | 
			
		||||
                    SQLManager.this.connection = PS.get().getDatabase().forceConnection();
 | 
			
		||||
                    SQLManager.this.connection = database.forceConnection();
 | 
			
		||||
                    final Statement stmt = connection.createStatement();
 | 
			
		||||
                    stmt.addBatch("DROP TABLE `" + prefix + "cluster_invited`");
 | 
			
		||||
                    stmt.addBatch("DROP TABLE `" + prefix + "cluster_helpers`");
 | 
			
		||||
@@ -2524,6 +2543,7 @@ public class SQLManager implements AbstractDB {
 | 
			
		||||
    @Override
 | 
			
		||||
    public void close() {
 | 
			
		||||
        try {
 | 
			
		||||
            CLOSED = true;
 | 
			
		||||
            connection.close();
 | 
			
		||||
        } catch (SQLException e) {
 | 
			
		||||
            e.printStackTrace();
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user