From 6f5fb0976a167b125049b5595020dc764a72a8e1 Mon Sep 17 00:00:00 2001 From: Aust1n46 Date: Sat, 13 Feb 2021 13:16:07 -0600 Subject: [PATCH] Updated Bungee player data saving system. --- .../chat/bungee/MineverseChatBungee.java | 120 +++---------- .../chat/database/BungeePlayerData.java | 170 ++++++++++++++++++ .../Aust1n46/chat/utilities/Format.java | 18 +- 3 files changed, 208 insertions(+), 100 deletions(-) create mode 100644 src/mineverse/Aust1n46/chat/database/BungeePlayerData.java diff --git a/src/mineverse/Aust1n46/chat/bungee/MineverseChatBungee.java b/src/mineverse/Aust1n46/chat/bungee/MineverseChatBungee.java index 5685456..4b88bc1 100644 --- a/src/mineverse/Aust1n46/chat/bungee/MineverseChatBungee.java +++ b/src/mineverse/Aust1n46/chat/bungee/MineverseChatBungee.java @@ -4,13 +4,10 @@ import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.DataInputStream; import java.io.DataOutputStream; -import java.io.File; -import java.nio.file.Files; import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; -import java.util.StringTokenizer; import java.util.UUID; import mineverse.Aust1n46.chat.api.MineverseChatAPI; @@ -19,6 +16,7 @@ import mineverse.Aust1n46.chat.bungee.command.GlobalMute; import mineverse.Aust1n46.chat.bungee.command.GlobalMuteAll; import mineverse.Aust1n46.chat.bungee.command.GlobalUnmute; import mineverse.Aust1n46.chat.bungee.command.GlobalUnmuteAll; +import mineverse.Aust1n46.chat.database.BungeePlayerData; import net.md_5.bungee.api.ChatColor; import net.md_5.bungee.api.chat.TextComponent; import net.md_5.bungee.api.connection.ProxiedPlayer; @@ -28,111 +26,51 @@ import net.md_5.bungee.api.event.ServerDisconnectEvent; import net.md_5.bungee.api.event.ServerSwitchEvent; import net.md_5.bungee.api.plugin.Listener; import net.md_5.bungee.api.plugin.Plugin; -import net.md_5.bungee.config.Configuration; -import net.md_5.bungee.config.ConfigurationProvider; -import net.md_5.bungee.config.YamlConfiguration; import net.md_5.bungee.event.EventHandler; //This is the main class for the BungeeCord version of the plugin. public class MineverseChatBungee extends Plugin implements Listener { + private static MineverseChatBungee instance; public Map ignore = new HashMap(); public Map spy = new HashMap(); - private Configuration bungeeconfig; - private Configuration playerData; public static Set players = new HashSet(); public static String PLUGIN_MESSAGING_CHANNEL = "venturechat:data"; @Override public void onEnable() { - if(!getDataFolder().exists()) { - getDataFolder().mkdir(); - } - File config = new File(getDataFolder(), "bungeeconfig.yml"); - File sync = new File(getDataFolder(), "BungeePlayers.yml"); - try { - if(!config.exists()) { - Files.copy(getResourceAsStream("bungeeconfig.yml"), config.toPath()); - } - bungeeconfig = ConfigurationProvider.getProvider(YamlConfiguration.class).load(new File(getDataFolder(), "bungeeconfig.yml")); - if(!sync.exists()) { - Files.copy(getResourceAsStream("BungeePlayers.yml"), sync.toPath()); - } - playerData = ConfigurationProvider.getProvider(YamlConfiguration.class).load(new File(getDataFolder(), "BungeePlayers.yml")); - } - catch(Exception e) { - e.printStackTrace(); - } - for(String uuidString : playerData.getKeys()) { - UUID uuid = UUID.fromString(uuidString); - Set listening = new HashSet(); - StringTokenizer l = new StringTokenizer(playerData.getString(uuidString + ".channels"), ","); - while(l.hasMoreTokens()) { - String channel = l.nextToken(); - listening.add(channel); - } - HashMap mutes = new HashMap(); - StringTokenizer m = new StringTokenizer(playerData.getString(uuidString + ".mutes"), ","); - while(m.hasMoreTokens()) { - String[] parts = m.nextToken().split(":"); - mutes.put(parts[0], Integer.parseInt(parts[1])); - } - HashSet ignores = new HashSet(); - StringTokenizer n = new StringTokenizer(playerData.getString(uuidString + ".ignores"), ","); - while(n.hasMoreTokens()) { - String ignore = n.nextToken(); - ignores.add(UUID.fromString(ignore)); - } - boolean spy = playerData.getBoolean(uuidString + ".spy"); - boolean messageToggle = playerData.getBoolean(uuidString + ".messagetoggle"); - players.add(new SynchronizedMineverseChatPlayer(uuid, listening, mutes, ignores, spy, messageToggle)); - } + instance = this; + + BungeePlayerData.loadLegacyBungeePlayerData(); + BungeePlayerData.loadBungeePlayerData(); + this.getProxy().registerChannel(MineverseChatBungee.PLUGIN_MESSAGING_CHANNEL); this.getProxy().getPluginManager().registerListener(this, this); - if(bungeeconfig.getBoolean("muting")) { - getProxy().getPluginManager().registerCommand(this, new GlobalMute(this, "globalmute")); - getProxy().getPluginManager().registerCommand(this, new GlobalMute(this, "gmute")); - getProxy().getPluginManager().registerCommand(this, new GlobalMuteAll(this, "globalmuteall")); - getProxy().getPluginManager().registerCommand(this, new GlobalMuteAll(this, "gmuteall")); - getProxy().getPluginManager().registerCommand(this, new GlobalUnmute(this, "globalunmute")); - getProxy().getPluginManager().registerCommand(this, new GlobalUnmute(this, "gunmute")); - getProxy().getPluginManager().registerCommand(this, new GlobalUnmuteAll(this, "globalunmuteall")); - getProxy().getPluginManager().registerCommand(this, new GlobalUnmuteAll(this, "gunmuteall")); - } - if(bungeeconfig.getBoolean("nicknames")) { - - } + + registerBungeeCordMuteCommands(); } @Override public void onDisable() { - for(SynchronizedMineverseChatPlayer p : players) { - String listen = ""; - for(String s : p.getListening()) - listen += s + ","; - String mute = ""; - for(String s : p.getMutes().keySet()) - mute += s + ":0,"; - String ignore = ""; - for(UUID s : p.getIgnores()) - ignore += s.toString() + ","; - if(listen.length() > 0) - listen = listen.substring(0, listen.length() - 1); - if(mute.length() > 0) - mute = mute.substring(0, mute.length() - 1); - if(ignore.length() > 0) - ignore = ignore.substring(0, ignore.length() - 1); - playerData.set(p.getUUID().toString() + ".channels", listen); - playerData.set(p.getUUID().toString() + ".mutes", mute); - playerData.set(p.getUUID().toString() + ".ignores", ignore); - playerData.set(p.getUUID().toString() + ".spy", p.isSpy()); - playerData.set(p.getUUID().toString() + ".messagetoggle", p.getMessageToggle()); - } - try { - ConfigurationProvider.getProvider(YamlConfiguration.class).save(playerData, new File(getDataFolder(), "BungeePlayers.yml")); - } - catch(Exception e) { - e.printStackTrace(); - } + BungeePlayerData.saveBungeePlayerData(); + } + + /** + * Old BungeeCord mute commands that pretty much no one even knows about let alone uses... + * Slated for removal when the mute system is reworked. + */ + private void registerBungeeCordMuteCommands() { + getProxy().getPluginManager().registerCommand(this, new GlobalMute(this, "globalmute")); + getProxy().getPluginManager().registerCommand(this, new GlobalMute(this, "gmute")); + getProxy().getPluginManager().registerCommand(this, new GlobalMuteAll(this, "globalmuteall")); + getProxy().getPluginManager().registerCommand(this, new GlobalMuteAll(this, "gmuteall")); + getProxy().getPluginManager().registerCommand(this, new GlobalUnmute(this, "globalunmute")); + getProxy().getPluginManager().registerCommand(this, new GlobalUnmute(this, "gunmute")); + getProxy().getPluginManager().registerCommand(this, new GlobalUnmuteAll(this, "globalunmuteall")); + getProxy().getPluginManager().registerCommand(this, new GlobalUnmuteAll(this, "gunmuteall")); + } + + public static MineverseChatBungee getInstance() { + return instance; } @EventHandler diff --git a/src/mineverse/Aust1n46/chat/database/BungeePlayerData.java b/src/mineverse/Aust1n46/chat/database/BungeePlayerData.java new file mode 100644 index 0000000..83fcb07 --- /dev/null +++ b/src/mineverse/Aust1n46/chat/database/BungeePlayerData.java @@ -0,0 +1,170 @@ +package mineverse.Aust1n46.chat.database; + +import java.io.File; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Set; +import java.util.StringTokenizer; +import java.util.UUID; + +import mineverse.Aust1n46.chat.api.SynchronizedMineverseChatPlayer; +import mineverse.Aust1n46.chat.bungee.MineverseChatBungee; +import mineverse.Aust1n46.chat.utilities.Format; +import net.md_5.bungee.api.ProxyServer; +import net.md_5.bungee.api.chat.TextComponent; +import net.md_5.bungee.config.Configuration; +import net.md_5.bungee.config.ConfigurationProvider; +import net.md_5.bungee.config.YamlConfiguration; + +/** + * Class for reading and writing bungee player data. + * + * @author Aust1n46 + */ +public class BungeePlayerData { + private static MineverseChatBungee bungee = MineverseChatBungee.getInstance(); + private static final String BUNGEE_PLAYER_DATA_DIRECTORY_PATH = bungee.getDataFolder().getAbsolutePath() + "/PlayerData"; + + public static void loadLegacyBungeePlayerData() { + File sync = new File(bungee.getDataFolder(), "BungeePlayers.yml"); + if(!sync.exists()) { + return; + } + try { + ProxyServer.getInstance().getConsole().sendMessage(TextComponent.fromLegacyText(Format.FormatStringAll("&8[&eVentureChat&8]&c - Detected Legacy Player Data!"))); + ProxyServer.getInstance().getConsole().sendMessage(TextComponent.fromLegacyText(Format.FormatStringAll("&8[&eVentureChat&8]&c - Converting to new structure and deleting old BungeePlayers.yml file!"))); + Configuration playerData = ConfigurationProvider.getProvider(YamlConfiguration.class).load(sync); + for(String uuidString : playerData.getKeys()) { + UUID uuid = UUID.fromString(uuidString); + Set listening = new HashSet(); + StringTokenizer l = new StringTokenizer(playerData.getString(uuidString + ".channels"), ","); + while(l.hasMoreTokens()) { + String channel = l.nextToken(); + listening.add(channel); + } + HashMap mutes = new HashMap(); + StringTokenizer m = new StringTokenizer(playerData.getString(uuidString + ".mutes"), ","); + while(m.hasMoreTokens()) { + String[] parts = m.nextToken().split(":"); + mutes.put(parts[0], Integer.parseInt(parts[1])); + } + HashSet ignores = new HashSet(); + StringTokenizer n = new StringTokenizer(playerData.getString(uuidString + ".ignores"), ","); + while(n.hasMoreTokens()) { + String ignore = n.nextToken(); + ignores.add(UUID.fromString(ignore)); + } + boolean spy = playerData.getBoolean(uuidString + ".spy"); + boolean messageToggle = playerData.getBoolean(uuidString + ".messagetoggle"); + MineverseChatBungee.players.add(new SynchronizedMineverseChatPlayer(uuid, listening, mutes, ignores, spy, messageToggle)); + } + } + catch (Exception e) { + MineverseChatBungee.players.clear(); + ProxyServer.getInstance().getConsole().sendMessage(TextComponent.fromLegacyText(Format.FormatStringAll("&8[&eVentureChat&8]&c - Error Loading Legacy Player Data!"))); + ProxyServer.getInstance().getConsole().sendMessage(TextComponent.fromLegacyText(Format.FormatStringAll("&8[&eVentureChat&8]&c - Deleted BungeePlayers.yml file!"))); + } + finally { + sync.delete(); + } + } + + public static void loadBungeePlayerData() { + try { + File playerDataDirectory = new File(BUNGEE_PLAYER_DATA_DIRECTORY_PATH); + if(!playerDataDirectory.exists()) { + playerDataDirectory.mkdirs(); + } + Files.walk(Paths.get(BUNGEE_PLAYER_DATA_DIRECTORY_PATH)) + .filter(Files::isRegularFile) + .forEach((path) -> readBungeePlayerDataFile(path)); + } catch (IOException e) { + e.printStackTrace(); + } + } + + private static void readBungeePlayerDataFile(Path path) { + SynchronizedMineverseChatPlayer smcp; + File bungeePlayerDataFile = path.toFile(); + if(!bungeePlayerDataFile.exists()) { + return; + } + try { + Configuration bungeePlayerDataFileConfiguration = ConfigurationProvider.getProvider(YamlConfiguration.class).load(bungeePlayerDataFile); + String uuidString = bungeePlayerDataFile.getName().replace(".yml", ""); + UUID uuid = UUID.fromString(uuidString); + Set listening = new HashSet(); + StringTokenizer l = new StringTokenizer(bungeePlayerDataFileConfiguration.getString("channels"), ","); + while(l.hasMoreTokens()) { + String channel = l.nextToken(); + listening.add(channel); + } + HashMap mutes = new HashMap(); + StringTokenizer m = new StringTokenizer(bungeePlayerDataFileConfiguration.getString("mutes"), ","); + while(m.hasMoreTokens()) { + String[] parts = m.nextToken().split(":"); + mutes.put(parts[0], Integer.parseInt(parts[1])); + } + HashSet ignores = new HashSet(); + StringTokenizer n = new StringTokenizer(bungeePlayerDataFileConfiguration.getString("ignores"), ","); + while(n.hasMoreTokens()) { + String ignore = n.nextToken(); + ignores.add(UUID.fromString(ignore)); + } + boolean spy = bungeePlayerDataFileConfiguration.getBoolean("spy"); + boolean messageToggle = bungeePlayerDataFileConfiguration.getBoolean("messagetoggle"); + smcp = new SynchronizedMineverseChatPlayer(uuid, listening, mutes, ignores, spy, messageToggle); + } + catch(Exception e) { + ProxyServer.getInstance().getConsole().sendMessage(TextComponent.fromLegacyText(Format.FormatStringAll("&8[&eVentureChat&8]&c - Error Loading Data File: " + bungeePlayerDataFile.getName()))); + ProxyServer.getInstance().getConsole().sendMessage(TextComponent.fromLegacyText(Format.FormatStringAll("&8[&eVentureChat&8]&c - File will be skipped and deleted."))); + bungeePlayerDataFile.delete(); + return; + } + if(smcp != null) { + MineverseChatBungee.players.add(smcp); + } + } + + public static void saveBungeePlayerData() { + try { + for(SynchronizedMineverseChatPlayer p : MineverseChatBungee.players) { + File bungeePlayerDataFile = new File(BUNGEE_PLAYER_DATA_DIRECTORY_PATH, p.getUUID() + ".yml"); + if(!bungeePlayerDataFile.exists()) { + bungeePlayerDataFile.createNewFile(); + } + Configuration bungeePlayerDataFileConfiguration = ConfigurationProvider.getProvider(YamlConfiguration.class).load(bungeePlayerDataFile); + + String listen = ""; + for(String s : p.getListening()) + listen += s + ","; + String mute = ""; + for(String s : p.getMutes().keySet()) + mute += s + ":0,"; + String ignore = ""; + for(UUID s : p.getIgnores()) + ignore += s.toString() + ","; + if(listen.length() > 0) + listen = listen.substring(0, listen.length() - 1); + if(mute.length() > 0) + mute = mute.substring(0, mute.length() - 1); + if(ignore.length() > 0) + ignore = ignore.substring(0, ignore.length() - 1); + bungeePlayerDataFileConfiguration.set("channels", listen); + bungeePlayerDataFileConfiguration.set("mutes", mute); + bungeePlayerDataFileConfiguration.set("ignores", ignore); + bungeePlayerDataFileConfiguration.set("spy", p.isSpy()); + bungeePlayerDataFileConfiguration.set("messagetoggle", p.getMessageToggle()); + + ConfigurationProvider.getProvider(YamlConfiguration.class).save(bungeePlayerDataFileConfiguration, bungeePlayerDataFile); + } + } + catch (IOException e) { + e.printStackTrace(); + } + } +} diff --git a/src/mineverse/Aust1n46/chat/utilities/Format.java b/src/mineverse/Aust1n46/chat/utilities/Format.java index c903efa..e29eb26 100644 --- a/src/mineverse/Aust1n46/chat/utilities/Format.java +++ b/src/mineverse/Aust1n46/chat/utilities/Format.java @@ -1,5 +1,7 @@ package mineverse.Aust1n46.chat.utilities; +import static mineverse.Aust1n46.chat.MineverseChat.getInstance; + import java.util.ArrayList; import java.util.List; import java.util.StringTokenizer; @@ -25,15 +27,13 @@ import mineverse.Aust1n46.chat.versions.VersionHandler; * Class containing chat formatting methods. */ public class Format { - private static MineverseChat plugin = MineverseChat.getInstance(); - public static final int LEGACY_COLOR_CODE_LENGTH = 2; public static final int HEX_COLOR_CODE_LENGTH = 14; - public static final String DEFAULT_COLOR_CODE = String.valueOf(ChatColor.WHITE); public static final String HEX_COLOR_CODE_PREFIX = "#"; public static final char BUKKIT_COLOR_CODE_PREFIX_CHAR = '\u00A7'; public static final String BUKKIT_COLOR_CODE_PREFIX = String.valueOf(BUKKIT_COLOR_CODE_PREFIX_CHAR); public static final String BUKKIT_HEX_COLOR_CODE_PREFIX = "x"; + public static final String DEFAULT_COLOR_CODE = BUKKIT_COLOR_CODE_PREFIX + "f"; private static final Pattern LEGACY_CHAT_COLOR_DIGITS_PATTERN = Pattern.compile("&([0-9])"); private static final Pattern LEGACY_CHAT_COLOR_PATTERN = Pattern.compile( @@ -70,7 +70,7 @@ public class Format { } } catch (Exception e) { System.out.println("Exception?" + e.getLocalizedMessage()); - if (plugin.getConfig().getString("loglevel", "info").equals("debug")) { + if (getInstance().getConfig().getString("loglevel", "info").equals("debug")) { Bukkit.getConsoleSender().sendMessage(Format.FormatStringAll( "&8[&eVentureChat&8]&e - Prefix and / or suffix don't exist, setting to nothing.")); } @@ -85,7 +85,7 @@ public class Format { json += "]}"; json += "," + convertLinks(c); json += "]"; - if (plugin.getConfig().getString("loglevel", "info").equals("debug")) { + if (getInstance().getConfig().getString("loglevel", "info").equals("debug")) { System.out.println(json); System.out.println("END OF JSON"); System.out.println("END OF JSON"); @@ -436,12 +436,12 @@ public class Format { public static String formatModerationGUI(String json, Player player, String sender, String channelName, int hash) { if (player.hasPermission("venturechat.gui")) { json = json.substring(0, json.length() - 1); - json += "," + Format.convertToJsonColors(Format.FormatStringAll(plugin.getConfig().getString("guiicon")), + json += "," + Format.convertToJsonColors(Format.FormatStringAll(getInstance().getConfig().getString("guiicon")), ",\"clickEvent\":{\"action\":\"run_command\",\"value\":\"/vchatgui " + sender + " " + channelName + " " + hash + "\"},\"hoverEvent\":{\"action\":\"show_text\",\"value\":{\"text\":\"\",\"extra\":[" + Format.convertToJsonColors( - Format.FormatStringAll(plugin.getConfig().getString("guitext"))) + Format.FormatStringAll(getInstance().getConfig().getString("guitext"))) + "]}}") + "]"; } @@ -613,7 +613,7 @@ public class Format { public static String FilterChat(String msg) { int t = 0; - List filters = plugin.getConfig().getStringList("filters"); + List filters = getInstance().getConfig().getStringList("filters"); for (String s : filters) { t = 0; String[] pparse = new String[2]; @@ -697,7 +697,7 @@ public class Format { } public static boolean underlineURLs() { - return plugin.getConfig().getBoolean("underlineurls", true); + return getInstance().getConfig().getBoolean("underlineurls", true); } public static int currentTimeMillis() {