From 331a88f5d8ccc6ef4ca4d675bf10524362126779 Mon Sep 17 00:00:00 2001 From: sgtcaze Date: Mon, 29 Feb 2016 17:52:10 -0800 Subject: [PATCH] Add new command for database users to load groups correctly. Fixes #9 and #17 --- documentation/Commands.creole | 11 ++++++ .../nametagedit/plugin/NametagCommand.java | 19 ++++++++++ .../nametagedit/plugin/NametagHandler.java | 25 +++++++++++- .../plugin/converter/ConverterTask.java | 38 ++++++++++--------- .../plugin/storage/AbstractConfig.java | 3 ++ .../storage/database/DatabaseConfig.java | 20 +++++++++- .../database/tasks/DataDownloader.java | 8 +++- .../database/tasks/GroupConfigUpdater.java | 33 ++++++++++++++++ .../storage/database/tasks/PlayerLoader.java | 19 ++++++---- .../storage/database/tasks/TableCreator.java | 1 + .../storage/flatfile/FlatFileConfig.java | 6 +++ .../com/nametagedit/plugin/utils/Utils.java | 3 +- 12 files changed, 157 insertions(+), 29 deletions(-) create mode 100644 src/main/java/com/nametagedit/plugin/storage/database/tasks/GroupConfigUpdater.java diff --git a/documentation/Commands.creole b/documentation/Commands.creole index a22b466..77c0b93 100644 --- a/documentation/Commands.creole +++ b/documentation/Commands.creole @@ -7,6 +7,7 @@ | nte | clear [player] | Clears the prefix and suffix for a player | | nte | [player] | Sets the prefix or suffix for a player | | nte | groups list | Lists all loaded groups | +| nte | groups order | Orders the priority of groups. | | nte | groups add [group] | Creates a new group | | nte | groups remove [group] | Removes a group | | nte | groups [group] [perm] | Sets the default permission for a group | @@ -16,6 +17,16 @@ == Example Command Usage +=== Ordering Group Priority +Suppose we have 3 groups: Owner, Admin, Default. The first group looked at is the one with the highest priority. We would use: + +{{{ +/ne groups order Owner Admin Default +}}} + +NametagEdit will remember the order so groups always load properly. +v4.0.1 - Only users who use a database can use this command + === Editing Invidiual Prefixes/Suffixes Suppose we wish to have a nametag like diff --git a/src/main/java/com/nametagedit/plugin/NametagCommand.java b/src/main/java/com/nametagedit/plugin/NametagCommand.java index 88aa3e0..cf5098f 100644 --- a/src/main/java/com/nametagedit/plugin/NametagCommand.java +++ b/src/main/java/com/nametagedit/plugin/NametagCommand.java @@ -4,6 +4,7 @@ import com.nametagedit.plugin.converter.Converter; import com.nametagedit.plugin.converter.ConverterTask; import com.nametagedit.plugin.storage.data.GroupData; +import com.nametagedit.plugin.storage.database.tasks.GroupConfigUpdater; import com.nametagedit.plugin.utils.Utils; import lombok.AllArgsConstructor; import mkremins.fanciful.FancyMessage; @@ -15,6 +16,10 @@ import org.bukkit.permissions.Permission; import org.bukkit.permissions.PermissionDefault; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + @AllArgsConstructor public class NametagCommand implements CommandExecutor { @@ -72,6 +77,7 @@ private void sendLegacyUsage(CommandSender sender) { sender.sendMessage(Utils.format("&6/ne clear &fClears a player's nametag")); sender.sendMessage(Utils.format("&e&lGroup Usage")); sender.sendMessage(Utils.format("&6/ne groups list &fLists the current loaded groups")); + sender.sendMessage(Utils.format("&6/ne groups order ...")); sender.sendMessage(Utils.format("&6/ne groups add &fCreates a group")); sender.sendMessage(Utils.format("&6/ne groups remove &fRemoves a group")); sender.sendMessage(Utils.format("&6/ne groups permission &fChanges the permission")); @@ -91,6 +97,7 @@ private void sendUsage(CommandSender sender) { .then("\n/ne clear ").color(ChatColor.GOLD).suggest("/ne clear ").then("Clears a player's nametag").color(ChatColor.WHITE) .then("\nGroup Usage ").color(ChatColor.YELLOW).style(ChatColor.BOLD).then(" (Click a Command!)").color(ChatColor.GRAY) .then("\n/ne groups list ").color(ChatColor.GOLD).suggest("/ne groups list").then("Lists the current loaded groups").color(ChatColor.WHITE) + .then("\n/ne groups order ... ").color(ChatColor.GOLD).suggest("/ne groups order ").then("Orders groups for the database").color(ChatColor.WHITE) .then("\n/ne groups add ").color(ChatColor.GOLD).suggest("/ne groups add ").then("Creates a group").color(ChatColor.WHITE) .then("\n/ne groups remove ").color(ChatColor.GOLD).suggest("/ne groups remove ").then("Removes a group").color(ChatColor.WHITE) .then("\n/ne groups permission ").color(ChatColor.GOLD).suggest("/ne groups Group permission my.permission").then("Changes the permission").color(ChatColor.WHITE) @@ -193,6 +200,18 @@ private void cmdGroups(CommandSender sender, String[] args) { sender.sendMessage(Utils.format("&6Group: &f" + groupData.getGroupName() + " &6Permission: &f" + groupData.getPermission() + " &6Formatted: " + groupData.getPrefix() + sender.getName() + groupData.getSuffix())); } + } else if (args[1].equalsIgnoreCase("order")) { + if (!handler.getPlugin().getConfig().getBoolean("MySQL.Enabled")) { + sender.sendMessage(Utils.format("&cThis option is (temporarily) only available for NametagEdit servers that use a database.")); + return; + } + + if (args.length <= 2) { + sender.sendMessage(Utils.format("&cBe sure to enter the group order!")); + return; + } + + handler.getAbstractConfig().orderGroups(sender, args); } else if (args[1].equalsIgnoreCase("remove")) { if (args.length == 3) { String group = args[2]; diff --git a/src/main/java/com/nametagedit/plugin/NametagHandler.java b/src/main/java/com/nametagedit/plugin/NametagHandler.java index 1e00e33..42f287c 100644 --- a/src/main/java/com/nametagedit/plugin/NametagHandler.java +++ b/src/main/java/com/nametagedit/plugin/NametagHandler.java @@ -5,6 +5,7 @@ import com.nametagedit.plugin.storage.data.GroupData; import com.nametagedit.plugin.storage.data.PlayerData; import com.nametagedit.plugin.storage.database.DatabaseConfig; +import com.nametagedit.plugin.storage.database.tasks.GroupConfigUpdater; import com.nametagedit.plugin.storage.flatfile.FlatFileConfig; import com.nametagedit.plugin.utils.UUIDFetcher; import com.nametagedit.plugin.utils.Utils; @@ -166,6 +167,28 @@ private void handleClear(UUID uuid, String player) { abstractConfig.clear(uuid, player); } + public void loadDatabaseSettings(HashMap settings) { + String orderSetting = settings.get("order"); + if (orderSetting != null) { + String[] order = orderSetting.split(" "); + List current = new ArrayList<>(); + // Determine order for current loaded groups + for (String group : order) { + Iterator itr = groupData.iterator(); + while (itr.hasNext()) { + GroupData groupData = itr.next(); + if (groupData.getGroupName().equalsIgnoreCase(group)) { + current.add(groupData); + itr.remove(); + break; + } + } + } + current.addAll(groupData); // Add remaining entries (bad order, wasn't specified) + this.groupData = current; + } + } + public void applyTags() { for (Player online : Utils.getOnline()) { if (online != null) { @@ -175,13 +198,13 @@ public void applyTags() { } public void applyTagToPlayer(Player player) { - if (player == null) { return; } UUID uuid = player.getUniqueId(); PlayerData data = playerData.get(uuid); if (data != null) { plugin.getManager().updateNametag(player.getName(), Utils.format(data.getPrefix(), true), Utils.format(data.getSuffix(), true)); } else { for (GroupData group : groupData) { + System.out.println("Group order: " + group.getGroupName()); if (player.hasPermission(group.getBukkitPermission())) { plugin.getManager().updateNametag(player.getName(), Utils.format(group.getPrefix(), true), Utils.format(group.getSuffix(), true)); break; diff --git a/src/main/java/com/nametagedit/plugin/converter/ConverterTask.java b/src/main/java/com/nametagedit/plugin/converter/ConverterTask.java index 1d6902e..32fcb5d 100644 --- a/src/main/java/com/nametagedit/plugin/converter/ConverterTask.java +++ b/src/main/java/com/nametagedit/plugin/converter/ConverterTask.java @@ -82,27 +82,31 @@ private boolean convertFilesToDatabase(Connection connection) throws SQLExceptio final YamlConfiguration players = Utils.getConfig(playersFile); PreparedStatement insertOrUpdate = connection.prepareStatement(PLAYER_SAVER); - for (String key : players.getConfigurationSection("Players").getKeys(false)) { - insertOrUpdate.setString(1, key); - insertOrUpdate.setString(2, players.getString("Players." + key + ".Name")); - insertOrUpdate.setString(3, Utils.deformat(players.getString("Players." + key + ".Prefix", ""))); - insertOrUpdate.setString(4, Utils.deformat(players.getString("Players." + key + ".Suffix", ""))); - insertOrUpdate.setString(5, Utils.deformat(players.getString("Players." + key + ".Prefix", ""))); - insertOrUpdate.setString(6, Utils.deformat(players.getString("Players." + key + ".Suffix", ""))); - insertOrUpdate.addBatch(); + if (players != null) { + for (String key : players.getConfigurationSection("Players").getKeys(false)) { + insertOrUpdate.setString(1, key); + insertOrUpdate.setString(2, players.getString("Players." + key + ".Name")); + insertOrUpdate.setString(3, Utils.deformat(players.getString("Players." + key + ".Prefix", ""))); + insertOrUpdate.setString(4, Utils.deformat(players.getString("Players." + key + ".Suffix", ""))); + insertOrUpdate.setString(5, Utils.deformat(players.getString("Players." + key + ".Prefix", ""))); + insertOrUpdate.setString(6, Utils.deformat(players.getString("Players." + key + ".Suffix", ""))); + insertOrUpdate.addBatch(); + } } insertOrUpdate.executeBatch(); insertOrUpdate = connection.prepareStatement(GROUP_SAVER); - for (String key : groups.getConfigurationSection("Groups").getKeys(false)) { - insertOrUpdate.setString(1, key); - insertOrUpdate.setString(2, groups.getString("Groups." + key + ".Permission")); - insertOrUpdate.setString(3, Utils.deformat(groups.getString("Groups." + key + ".Prefix", ""))); - insertOrUpdate.setString(4, Utils.deformat(groups.getString("Groups." + key + ".Suffix", ""))); - insertOrUpdate.setString(5, Utils.deformat(groups.getString("Groups." + key + ".Prefix", ""))); - insertOrUpdate.setString(6, Utils.deformat(groups.getString("Groups." + key + ".Suffix", ""))); - insertOrUpdate.setString(7, groups.getString("Groups." + key + ".Permission")); - insertOrUpdate.addBatch(); + if (groups != null) { + for (String key : groups.getConfigurationSection("Groups").getKeys(false)) { + insertOrUpdate.setString(1, key); + insertOrUpdate.setString(2, groups.getString("Groups." + key + ".Permission")); + insertOrUpdate.setString(3, Utils.deformat(groups.getString("Groups." + key + ".Prefix", ""))); + insertOrUpdate.setString(4, Utils.deformat(groups.getString("Groups." + key + ".Suffix", ""))); + insertOrUpdate.setString(5, Utils.deformat(groups.getString("Groups." + key + ".Prefix", ""))); + insertOrUpdate.setString(6, Utils.deformat(groups.getString("Groups." + key + ".Suffix", ""))); + insertOrUpdate.setString(7, groups.getString("Groups." + key + ".Permission")); + insertOrUpdate.addBatch(); + } } insertOrUpdate.executeBatch(); diff --git a/src/main/java/com/nametagedit/plugin/storage/AbstractConfig.java b/src/main/java/com/nametagedit/plugin/storage/AbstractConfig.java index 3c01178..c52ad72 100644 --- a/src/main/java/com/nametagedit/plugin/storage/AbstractConfig.java +++ b/src/main/java/com/nametagedit/plugin/storage/AbstractConfig.java @@ -2,6 +2,7 @@ import com.nametagedit.plugin.storage.data.GroupData; import com.nametagedit.plugin.storage.data.PlayerData; +import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import java.util.UUID; @@ -26,4 +27,6 @@ public interface AbstractConfig { void clear(UUID uuid, String targetName); + void orderGroups(CommandSender commandSender, String[] args); + } \ No newline at end of file diff --git a/src/main/java/com/nametagedit/plugin/storage/database/DatabaseConfig.java b/src/main/java/com/nametagedit/plugin/storage/database/DatabaseConfig.java index 8ba2e7b..3a363c6 100644 --- a/src/main/java/com/nametagedit/plugin/storage/database/DatabaseConfig.java +++ b/src/main/java/com/nametagedit/plugin/storage/database/DatabaseConfig.java @@ -6,10 +6,15 @@ import com.nametagedit.plugin.storage.data.GroupData; import com.nametagedit.plugin.storage.data.PlayerData; import com.nametagedit.plugin.storage.database.tasks.*; +import com.nametagedit.plugin.utils.Utils; import com.zaxxer.hikari.HikariDataSource; +import org.bukkit.command.CommandSender; import org.bukkit.configuration.file.FileConfiguration; import org.bukkit.entity.Player; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; import java.util.UUID; public class DatabaseConfig implements AbstractConfig { @@ -40,13 +45,13 @@ public void load() { @Override public void reload() { - new DataDownloader(handler, hikari).runTask(plugin); + new DataDownloader(handler, hikari).runTaskAsynchronously(plugin); } @Override public void shutdown() { if (hikari != null) { - hikari.shutdown(); + hikari.close(); } } @@ -80,4 +85,15 @@ public void clear(UUID uuid, String targetName) { new PlayerDeleter(uuid, hikari).runTaskAsynchronously(plugin); } + @Override + public void orderGroups(CommandSender commandSender, String[] args) { + List order = new ArrayList<>(Arrays.asList(args).subList(2, args.length)); + String formatted = Arrays.toString(order.toArray()); + formatted = formatted.substring(1, formatted.length() - 1).replace(",", ""); + commandSender.sendMessage(Utils.format("&c&lNametagEdit Group Order:")); + commandSender.sendMessage(formatted); + commandSender.sendMessage(Utils.format("&cType /ne reload for these changes to take effect")); + new GroupConfigUpdater("order", formatted, hikari).runTaskAsynchronously(handler.getPlugin()); + } + } \ No newline at end of file diff --git a/src/main/java/com/nametagedit/plugin/storage/database/tasks/DataDownloader.java b/src/main/java/com/nametagedit/plugin/storage/database/tasks/DataDownloader.java index d617792..84fd46a 100644 --- a/src/main/java/com/nametagedit/plugin/storage/database/tasks/DataDownloader.java +++ b/src/main/java/com/nametagedit/plugin/storage/database/tasks/DataDownloader.java @@ -36,6 +36,7 @@ public DataDownloader(NametagHandler handler, HikariDataSource hikari) { @Override public void run() { + final HashMap settings = new HashMap<>(); final List groupData = new ArrayList<>(); final Map playerData = new HashMap<>(); @@ -56,6 +57,11 @@ public void run() { } } + results = connection.prepareStatement("SELECT setting,value FROM nte_config").executeQuery(); + while (results.next()) { + settings.put(results.getString("setting"), results.getString("value")); + } + results.close(); } catch (SQLException e) { e.printStackTrace(); @@ -65,7 +71,7 @@ public void run() { public void run() { handler.setGroupData(groupData); handler.setPlayerData(playerData); - + handler.loadDatabaseSettings(settings); for (Player player : Bukkit.getOnlinePlayers()) { PlayerData data = playerData.get(player.getUniqueId()); if (data != null) { diff --git a/src/main/java/com/nametagedit/plugin/storage/database/tasks/GroupConfigUpdater.java b/src/main/java/com/nametagedit/plugin/storage/database/tasks/GroupConfigUpdater.java new file mode 100644 index 0000000..cdbd892 --- /dev/null +++ b/src/main/java/com/nametagedit/plugin/storage/database/tasks/GroupConfigUpdater.java @@ -0,0 +1,33 @@ +package com.nametagedit.plugin.storage.database.tasks; + +import com.zaxxer.hikari.HikariDataSource; +import lombok.AllArgsConstructor; +import org.bukkit.scheduler.BukkitRunnable; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.SQLException; + +@AllArgsConstructor +public class GroupConfigUpdater extends BukkitRunnable { + + private String setting; + private String value; + private HikariDataSource hikari; + + @Override + public void run() { + try (Connection connection = hikari.getConnection()) { + String query = "INSERT INTO nte_config VALUES(?, ?) ON DUPLICATE KEY UPDATE value=?"; + PreparedStatement update = connection.prepareStatement(query); + update.setString(1, setting); + update.setString(2, value); + update.setString(3, value); + update.execute(); + update.close(); + } catch (SQLException e) { + e.printStackTrace(); + } + } + +} \ No newline at end of file diff --git a/src/main/java/com/nametagedit/plugin/storage/database/tasks/PlayerLoader.java b/src/main/java/com/nametagedit/plugin/storage/database/tasks/PlayerLoader.java index a48923e..1682673 100644 --- a/src/main/java/com/nametagedit/plugin/storage/database/tasks/PlayerLoader.java +++ b/src/main/java/com/nametagedit/plugin/storage/database/tasks/PlayerLoader.java @@ -27,6 +27,7 @@ public class PlayerLoader extends BukkitRunnable { public void run() { String tempPrefix = null; String tempSuffix = null; + boolean found = false; try (Connection connection = hikari.getConnection()) { String query = "SELECT prefix,suffix FROM nte_players WHERE uuid=?"; @@ -38,6 +39,7 @@ public void run() { if (resultSet.next()) { tempPrefix = resultSet.getString("prefix"); tempSuffix = resultSet.getString("suffix"); + found = true; } resultSet.close(); @@ -46,19 +48,22 @@ public void run() { } finally { final String prefix = tempPrefix == null ? "" : tempPrefix; final String suffix = tempSuffix == null ? "" : tempSuffix; + final boolean finalFound = found; new BukkitRunnable() { @Override public void run() { Player player = Bukkit.getPlayer(uuid); if (player != null) { - PlayerData data = handler.getPlayerData(player); - if (data == null) { - data = new PlayerData(player.getName(), player.getUniqueId(), prefix, suffix); - handler.getPlayerData().put(player.getUniqueId(), data); - } else { - data.setPrefix(prefix); - data.setSuffix(suffix); + if (finalFound) { + PlayerData data = handler.getPlayerData(player); + if (data == null) { + data = new PlayerData(player.getName(), player.getUniqueId(), prefix, suffix); + handler.getPlayerData().put(player.getUniqueId(), data); + } else { + data.setPrefix(prefix); + data.setSuffix(suffix); + } } handler.applyTagToPlayer(player); diff --git a/src/main/java/com/nametagedit/plugin/storage/database/tasks/TableCreator.java b/src/main/java/com/nametagedit/plugin/storage/database/tasks/TableCreator.java index 93e6cc3..dff6950 100644 --- a/src/main/java/com/nametagedit/plugin/storage/database/tasks/TableCreator.java +++ b/src/main/java/com/nametagedit/plugin/storage/database/tasks/TableCreator.java @@ -16,6 +16,7 @@ public class TableCreator extends BukkitRunnable { private HikariDataSource hikari; private final List QUERIES = new ArrayList() {{ + add("CREATE TABLE IF NOT EXISTS `nte_config` (`setting` varchar(16) NOT NULL, `value` varchar(200) NOT NULL, PRIMARY KEY (`setting`)) ENGINE=InnoDB DEFAULT CHARSET=latin1;"); add("CREATE TABLE IF NOT EXISTS `nte_players` (`uuid` varchar(64) NOT NULL, `name` varchar(16) NOT NULL, `prefix` varchar(16) NOT NULL, `suffix` varchar(16) NOT NULL, PRIMARY KEY (`uuid`))"); add("CREATE TABLE IF NOT EXISTS `nte_groups` (`name` varchar(64) NOT NULL, `permission` varchar(16) NOT NULL, `prefix` varchar(16) NOT NULL, `suffix` varchar(16) NOT NULL, PRIMARY KEY (`name`))"); }}; diff --git a/src/main/java/com/nametagedit/plugin/storage/flatfile/FlatFileConfig.java b/src/main/java/com/nametagedit/plugin/storage/flatfile/FlatFileConfig.java index c5e4fcb..e11210a 100644 --- a/src/main/java/com/nametagedit/plugin/storage/flatfile/FlatFileConfig.java +++ b/src/main/java/com/nametagedit/plugin/storage/flatfile/FlatFileConfig.java @@ -6,6 +6,7 @@ import com.nametagedit.plugin.storage.data.PlayerData; import com.nametagedit.plugin.utils.Utils; import org.bukkit.Bukkit; +import org.bukkit.command.CommandSender; import org.bukkit.configuration.file.YamlConfiguration; import org.bukkit.entity.Player; @@ -97,6 +98,11 @@ public void clear(UUID uuid, String targetName) { save(players, playersFile); } + @Override + public void orderGroups(CommandSender commandSender, String[] args) { + // TODO: Not implemented yet + } + private void save(YamlConfiguration config, File file) { try { config.save(file); diff --git a/src/main/java/com/nametagedit/plugin/utils/Utils.java b/src/main/java/com/nametagedit/plugin/utils/Utils.java index 7966fdc..16fa80c 100644 --- a/src/main/java/com/nametagedit/plugin/utils/Utils.java +++ b/src/main/java/com/nametagedit/plugin/utils/Utils.java @@ -86,10 +86,11 @@ public static YamlConfiguration getConfig(File file) { if (!file.exists()) { file.createNewFile(); } + return YamlConfiguration.loadConfiguration(file); } catch (IOException e) { e.printStackTrace(); + return null; } - return YamlConfiguration.loadConfiguration(file); } public static YamlConfiguration getConfig(File file, String resource, Plugin plugin) {