package mineverse.Aust1n46.chat.bungee; 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; import mineverse.Aust1n46.chat.api.SynchronizedMineverseChatPlayer; 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 net.md_5.bungee.api.ChatColor; import net.md_5.bungee.api.chat.TextComponent; import net.md_5.bungee.api.connection.ProxiedPlayer; import net.md_5.bungee.api.connection.Server; import net.md_5.bungee.api.event.PluginMessageEvent; 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 { public Map ignore = new HashMap(); public Map spy = new HashMap(); private Configuration bungeeconfig; private Configuration playerData; public static Set players = new HashSet(); public static HashMap networkPlayers = new HashMap(); @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)); } this.getProxy().registerChannel("venturechat:"); 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")) { } } @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(); } } @EventHandler public void onPluginMessage(PluginMessageEvent ev) { //System.out.println(ev.getTag() + "," + ev.getSender().toString() + "," + (ev.getSender() instanceof Server)); if(!ev.getTag().equals("venturechat:") && !ev.getTag().contains("viaversion:")) { return; } if(!(ev.getSender() instanceof Server)) { return; } Server ser = (Server) ev.getSender(); ByteArrayInputStream instream = new ByteArrayInputStream(ev.getData()); DataInputStream in = new DataInputStream(instream); try { String subchannel = in.readUTF(); //System.out.println(subchannel); ByteArrayOutputStream outstream = new ByteArrayOutputStream(); DataOutputStream out = new DataOutputStream(outstream); if(subchannel.equals("Chat")) { String chatchannel = in.readUTF(); String message = in.readUTF(); String playerName = in.readUTF(); boolean bungeeToggle = in.readBoolean(); String lastMessage = in.readUTF(); String f = in.readUTF(); String c = in.readUTF(); String json = in.readUTF(); out.writeUTF("Chat"); out.writeUTF(chatchannel); out.writeUTF(message); out.writeUTF(playerName); out.writeUTF(lastMessage); out.writeUTF(f); out.writeUTF(c); out.writeUTF(json); for(String send : getProxy().getServers().keySet()) { if(getProxy().getServers().get(send).getPlayers().size() > 0) { if(!bungeeToggle && !getProxy().getServers().get(send).getName().equalsIgnoreCase(ser.getInfo().getName())) { continue; } getProxy().getServers().get(send).sendData("venturechat:", outstream.toByteArray()); } } } if(subchannel.equals("Chwho")) { String identifier = in.readUTF(); if(identifier.equals("Get")) { String sender = in.readUTF(); String channel = in.readUTF(); SynchronizedMineverseChatPlayer smcp = MineverseChatAPI.getSynchronizedMineverseChatPlayer(UUID.fromString(sender)); smcp.clearMessagePackets(); smcp.clearMessageData(); out.writeUTF("Chwho"); out.writeUTF("Get"); out.writeUTF(sender); out.writeUTF(channel); for(String send : getProxy().getServers().keySet()) { if(getProxy().getServers().get(send).getPlayers().size() > 0) { getProxy().getServers().get(send).sendData("venturechat:", outstream.toByteArray()); } } } if(identifier.equals("Receive")) { String sender = in.readUTF(); String channel = in.readUTF(); SynchronizedMineverseChatPlayer smcp = MineverseChatAPI.getSynchronizedMineverseChatPlayer(UUID.fromString(sender)); smcp.incrementMessagePackets(); int players = in.readInt(); for(int a = 0; a < players; a++) { smcp.addData(in.readUTF()); } int servers = 0; for(String send : getProxy().getServers().keySet()) { if(getProxy().getServers().get(send).getPlayers().size() > 0) { servers ++; } } if(smcp.getMessagePackets() >= servers) { smcp.clearMessagePackets(); out.writeUTF("Chwho"); out.writeUTF("Receive"); out.writeUTF(sender); out.writeUTF(channel); out.writeInt(smcp.getMessageData().size()); for(String s : smcp.getMessageData()) { out.writeUTF(s); } smcp.clearMessageData(); Server server = getProxy().getPlayer(UUID.fromString(sender)).getServer(); server.sendData("venturechat:", outstream.toByteArray()); } } } if(subchannel.equals("RemoveMessage")) { String hash = in.readUTF(); out.writeUTF("RemoveMessage"); out.writeUTF(hash); for(String send : getProxy().getServers().keySet()) { if(getProxy().getServers().get(send).getPlayers().size() > 0) { getProxy().getServers().get(send).sendData("venturechat:", outstream.toByteArray()); } } } if(subchannel.equals("Ignore")) { String identifier = in.readUTF(); if(identifier.equals("Send")) { String server = ser.getInfo().getName(); String player = in.readUTF(); String sender = in.readUTF(); SynchronizedMineverseChatPlayer smcp = MineverseChatAPI.getSynchronizedMineverseChatPlayer(UUID.fromString(sender)); smcp.clearMessagePackets(); out.writeUTF("Ignore"); out.writeUTF("Send"); out.writeUTF(server); out.writeUTF(player); out.writeUTF(sender); for(String send : getProxy().getServers().keySet()) { if(getProxy().getServers().get(send).getPlayers().size() > 0) { getProxy().getServers().get(send).sendData("venturechat:", outstream.toByteArray()); } } } if(identifier.equals("Offline")) { String server = in.readUTF(); String player = in.readUTF(); String sender = in.readUTF(); SynchronizedMineverseChatPlayer smcp = MineverseChatAPI.getSynchronizedMineverseChatPlayer(UUID.fromString(sender)); smcp.incrementMessagePackets(); int servers = 0; for(String send : getProxy().getServers().keySet()) { if(getProxy().getServers().get(send).getPlayers().size() > 0) { servers ++; } } if(smcp.getMessagePackets() >= servers) { smcp.clearMessagePackets(); out.writeUTF("Ignore"); out.writeUTF("Offline"); out.writeUTF(player); out.writeUTF(sender); if(getProxy().getServers().get(server).getPlayers().size() > 0) { getProxy().getServers().get(server).sendData("venturechat:", outstream.toByteArray()); } } } if(identifier.equals("Echo")) { String server = in.readUTF(); String player = in.readUTF(); String sender = in.readUTF(); out.writeUTF("Ignore"); out.writeUTF("Echo"); out.writeUTF(player); out.writeUTF(sender); if(getProxy().getServers().get(server).getPlayers().size() > 0) { getProxy().getServers().get(server).sendData("venturechat:", outstream.toByteArray()); } } } if(subchannel.equals("Message")) { String identifier = in.readUTF(); if(identifier.equals("Send")) { String server = ser.getInfo().getName(); String player = in.readUTF(); String sender = in.readUTF(); String sName = in.readUTF(); String message = in.readUTF(); String echo = in.readUTF(); String spy = in.readUTF(); SynchronizedMineverseChatPlayer smcp = MineverseChatAPI.getSynchronizedMineverseChatPlayer(UUID.fromString(sender)); smcp.clearMessagePackets(); out.writeUTF("Message"); out.writeUTF("Send"); out.writeUTF(server); out.writeUTF(player); out.writeUTF(sender); out.writeUTF(sName); out.writeUTF(message); out.writeUTF(echo); out.writeUTF(spy); for(String send : getProxy().getServers().keySet()) { if(getProxy().getServers().get(send).getPlayers().size() > 0) { getProxy().getServers().get(send).sendData("venturechat:", outstream.toByteArray()); } } } if(identifier.equals("Offline")) { String server = in.readUTF(); String player = in.readUTF(); String sender = in.readUTF(); SynchronizedMineverseChatPlayer smcp = MineverseChatAPI.getSynchronizedMineverseChatPlayer(UUID.fromString(sender)); smcp.incrementMessagePackets(); int servers = 0; for(String send : getProxy().getServers().keySet()) { if(getProxy().getServers().get(send).getPlayers().size() > 0) { servers ++; } } if(smcp.getMessagePackets() >= servers) { smcp.clearMessagePackets(); out.writeUTF("Message"); out.writeUTF("Offline"); out.writeUTF(player); out.writeUTF(sender); if(getProxy().getServers().get(server).getPlayers().size() > 0) { getProxy().getServers().get(server).sendData("venturechat:", outstream.toByteArray()); } } } if(identifier.equals("Ignore")) { String server = in.readUTF(); String player = in.readUTF(); String sender = in.readUTF(); out.writeUTF("Message"); out.writeUTF("Ignore"); out.writeUTF(player); out.writeUTF(sender); if(getProxy().getServers().get(server).getPlayers().size() > 0) { getProxy().getServers().get(server).sendData("venturechat:", outstream.toByteArray()); } } if(identifier.equals("Blocked")) { String server = in.readUTF(); String player = in.readUTF(); String sender = in.readUTF(); out.writeUTF("Message"); out.writeUTF("Blocked"); out.writeUTF(player); out.writeUTF(sender); if(getProxy().getServers().get(server).getPlayers().size() > 0) { getProxy().getServers().get(server).sendData("venturechat:", outstream.toByteArray()); } } if(identifier.equals("Echo")) { String server = in.readUTF(); String player = in.readUTF(); String sender = in.readUTF(); String sName = in.readUTF(); String echo = in.readUTF(); String spy = in.readUTF(); out.writeUTF("Message"); out.writeUTF("Echo"); out.writeUTF(player); out.writeUTF(sender); out.writeUTF(echo); if(getProxy().getServers().get(server).getPlayers().size() > 0) { getProxy().getServers().get(server).sendData("venturechat:", outstream.toByteArray()); } outstream = new ByteArrayOutputStream(); out = new DataOutputStream(outstream); out.writeUTF("Message"); out.writeUTF("Spy"); out.writeUTF(player); out.writeUTF(sender); out.writeUTF(sName); out.writeUTF(spy); for(String send : getProxy().getServers().keySet()) { if(getProxy().getServers().get(send).getPlayers().size() > 0) { getProxy().getServers().get(send).sendData("venturechat:", outstream.toByteArray()); } } } } if(subchannel.equals("Sync")) { //System.out.println("Sync received..."); String identifier = in.readUTF(); if(identifier.equals("Receive")) { //System.out.println("Sending update..."); String server = ser.getInfo().getName(); UUID uuid = UUID.fromString(in.readUTF()); SynchronizedMineverseChatPlayer smcp = MineverseChatAPI.getSynchronizedMineverseChatPlayer(uuid); if(smcp == null) { smcp = new SynchronizedMineverseChatPlayer(uuid, new HashSet(), new HashMap(), new HashSet(), false, true); players.add(smcp); } out.writeUTF("Sync"); out.writeUTF(uuid.toString()); int channelCount = smcp.getListening().size(); //System.out.println(channelCount); out.write(channelCount); for(String channel : smcp.getListening()) { out.writeUTF(channel); } int muteCount = smcp.getMutes().keySet().size(); //System.out.println(muteCount); out.write(muteCount); for(String channel : smcp.getMutes().keySet()) { //System.out.println(channel); out.writeUTF(channel); } //System.out.println(smcp.isSpy() + " spy value"); //System.out.println(out.size() + " size before"); out.writeBoolean(smcp.isSpy()); out.writeBoolean(smcp.getMessageToggle()); //System.out.println(out.size() + " size after"); int ignoreCount = smcp.getIgnores().size(); //System.out.println(ignoreCount + " ignore size"); out.write(ignoreCount); for(UUID ignore : smcp.getIgnores()) { out.writeUTF(ignore.toString()); } if(getProxy().getServers().get(server).getPlayers().size() > 0) getProxy().getServers().get(server).sendData("venturechat:", outstream.toByteArray()); } if(identifier.equals("Update")) { UUID uuid = UUID.fromString(in.readUTF()); SynchronizedMineverseChatPlayer smcp = MineverseChatAPI.getSynchronizedMineverseChatPlayer(uuid); if(smcp == null) { smcp = new SynchronizedMineverseChatPlayer(uuid, new HashSet(), new HashMap(), new HashSet(), false, true); players.add(smcp); } smcp.getListening().clear(); smcp.getMutes().clear(); smcp.getIgnores().clear(); int sizeL = in.read(); //System.out.println(sizeL + " listening"); for(int a = 0; a < sizeL; a++) { smcp.addListening(in.readUTF()); } int sizeM = in.read(); //System.out.println(size + " mutes"); for(int b = 0; b < sizeM; b++) { String mute = in.readUTF(); //System.out.println(mute); smcp.addMute(mute); } int sizeI = in.read(); for(int c = 0; c < sizeI; c++) { String ignore = in.readUTF(); //System.out.println(mute); smcp.addIgnore(MineverseChatAPI.getSynchronizedMineverseChatPlayer(UUID.fromString(ignore))); } smcp.setSpy(in.readBoolean()); smcp.setMessageToggle(in.readBoolean()); } if(identifier.equals("PlayersReceive")) { String server = in.readUTF(); out.writeUTF("PlayersUpdate"); out.write(networkPlayers.keySet().size()); for(String s : networkPlayers.keySet()) { out.writeUTF(s + "," + networkPlayers.get(s)); } if(getProxy().getServers().get(server).getPlayers().size() > 0) getProxy().getServers().get(server).sendData("venturechat:", outstream.toByteArray()); } if(identifier.equals("PlayersUpdate")) { networkPlayers.clear(); int size = in.read(); //System.out.println(size); for(int a = 1; a <= size; a ++) { String player = in.readUTF(); String[] parts = player.split(","); networkPlayers.put(parts[0], parts[1]); } out.writeUTF("PlayersUpdate"); out.write(networkPlayers.keySet().size()); for(String s : networkPlayers.keySet()) { out.writeUTF(s + "," + networkPlayers.get(s)); } for(String send : getProxy().getServers().keySet()) { if(getProxy().getServers().get(send).getPlayers().size() > 0) getProxy().getServers().get(send).sendData("venturechat:", outstream.toByteArray()); } } } if(subchannel.equals("Mute")) { String identifier = in.readUTF(); if(identifier.equals("Channel")) { String player = in.readUTF(); String channel = in.readUTF(); ProxiedPlayer p = getProxy().getPlayer(player); p.sendMessage(new TextComponent(ChatColor.RED + "Invalid channel: " + channel)); } if(identifier.equals("Player")) { String player = in.readUTF(); String muteplayer = in.readUTF(); String server = in.readUTF(); ProxiedPlayer p = getProxy().getPlayer(player); p.sendMessage(new TextComponent(ChatColor.RED + "Player: " + ChatColor.GOLD + muteplayer + ChatColor.RED + " is not connected to server: " + server)); } if(identifier.equals("Mutable")) { String player = in.readUTF(); String channel = in.readUTF(); String color = in.readUTF(); ProxiedPlayer p = getProxy().getPlayer(player); p.sendMessage(new TextComponent(ChatColor.RED + "You cannot mute players in this channel: " + ChatColor.valueOf(color.toUpperCase()) + channel)); } if(identifier.equals("Already")) { String player = in.readUTF(); String muteplayer = in.readUTF(); String channel = in.readUTF(); String color = in.readUTF(); ProxiedPlayer p = getProxy().getPlayer(player); p.sendMessage(new TextComponent(ChatColor.GOLD + muteplayer + ChatColor.RED + " is already muted in channel: " + ChatColor.valueOf(color.toUpperCase()) + channel)); } if(identifier.equals("Time")) { String player = in.readUTF(); String muteplayer = in.readUTF(); String channel = in.readUTF(); String color = in.readUTF(); ProxiedPlayer p = getProxy().getPlayer(player); p.sendMessage(new TextComponent(ChatColor.RED + "Muted player " + ChatColor.GOLD + muteplayer + ChatColor.RED + " in: " + ChatColor.valueOf(color.toUpperCase()) + channel)); } if(identifier.equals("Valid")) { String player = in.readUTF(); String muteplayer = in.readUTF(); String channel = in.readUTF(); String color = in.readUTF(); String time = in.readUTF(); ProxiedPlayer p = getProxy().getPlayer(player); String timedmute = ""; if(!time.equals("None\n")) { String keyword = "minutes"; if(time.equals("1")) keyword = "minute"; timedmute = ChatColor.RED + " for " + time + " " + keyword; } p.sendMessage(new TextComponent(ChatColor.RED + "Muted player " + ChatColor.GOLD + muteplayer + ChatColor.RED + " in: " + ChatColor.valueOf(color.toUpperCase()) + channel + timedmute)); } } if(subchannel.equals("Muteall")) { String identifier = in.readUTF(); if(identifier.equals("Player")) { String player = in.readUTF(); String muteplayer = in.readUTF(); String server = in.readUTF(); ProxiedPlayer p = getProxy().getPlayer(player); p.sendMessage(new TextComponent(ChatColor.RED + "Player: " + ChatColor.GOLD + muteplayer + ChatColor.RED + " is not connected to server: " + server)); } if(identifier.equals("Valid")) { String player = in.readUTF(); String muteplayer = in.readUTF(); ProxiedPlayer p = getProxy().getPlayer(player); p.sendMessage(new TextComponent(ChatColor.RED + "Muted player " + ChatColor.GOLD + muteplayer + ChatColor.RED + " in all channels.")); } } if(subchannel.equals("Unmuteall")) { String identifier = in.readUTF(); if(identifier.equals("Player")) { String player = in.readUTF(); String muteplayer = in.readUTF(); String server = in.readUTF(); ProxiedPlayer p = getProxy().getPlayer(player); p.sendMessage(new TextComponent(ChatColor.RED + "Player: " + ChatColor.GOLD + muteplayer + ChatColor.RED + " is not connected to server: " + server)); } if(identifier.equals("Valid")) { String player = in.readUTF(); String muteplayer = in.readUTF(); ProxiedPlayer p = getProxy().getPlayer(player); p.sendMessage(new TextComponent(ChatColor.RED + "Unmuted player " + ChatColor.GOLD + muteplayer + ChatColor.RED + " in all channels.")); } } if(subchannel.equals("Unmute")) { String identifier = in.readUTF(); if(identifier.equals("Channel")) { String player = in.readUTF(); String channel = in.readUTF(); ProxiedPlayer p = getProxy().getPlayer(player); p.sendMessage(new TextComponent(ChatColor.RED + "Invalid channel: " + channel)); } if(identifier.equals("Player")) { String player = in.readUTF(); String muteplayer = in.readUTF(); String server = in.readUTF(); ProxiedPlayer p = getProxy().getPlayer(player); p.sendMessage(new TextComponent(ChatColor.RED + "Player: " + ChatColor.GOLD + muteplayer + ChatColor.RED + " is not connected to server: " + server)); } if(identifier.equals("Already")) { String player = in.readUTF(); String muteplayer = in.readUTF(); String channel = in.readUTF(); String color = in.readUTF(); ProxiedPlayer p = getProxy().getPlayer(player); p.sendMessage(new TextComponent(ChatColor.GOLD + muteplayer + ChatColor.RED + " is not muted in channel: " + ChatColor.valueOf(color.toUpperCase()) + channel)); } if(identifier.equals("Valid")) { String player = in.readUTF(); String muteplayer = in.readUTF(); String channel = in.readUTF(); String color = in.readUTF(); ProxiedPlayer p = getProxy().getPlayer(player); p.sendMessage(new TextComponent(ChatColor.RED + "Unmuted player " + ChatColor.GOLD + muteplayer + ChatColor.RED + " in: " + ChatColor.valueOf(color.toUpperCase()) + channel)); } } } catch(Exception e) { e.printStackTrace(); } } }