From 3858519f8fb95d7b63f3d43094024be29f97a282 Mon Sep 17 00:00:00 2001 From: Aust1n46 Date: Thu, 26 Aug 2021 23:11:18 -0400 Subject: [PATCH] Add Velocity proxy support. --- pom.xml | 10 + .../Aust1n46/chat/MineverseChat.java | 4 +- .../chat/bungee/MineverseChatBungee.java | 554 +----------------- .../chat/bungee/VentureChatProxy.java | 533 +++++++++++++++++ .../chat/bungee/VentureChatProxyServer.java | 19 + .../chat/bungee/VentureChatProxySource.java | 11 + .../chat/bungee/VentureChatVelocity.java | 109 ++++ .../Aust1n46/chat/command/chat/Chwho.java | 1 - 8 files changed, 711 insertions(+), 530 deletions(-) create mode 100644 src/main/java/mineverse/Aust1n46/chat/bungee/VentureChatProxy.java create mode 100644 src/main/java/mineverse/Aust1n46/chat/bungee/VentureChatProxyServer.java create mode 100644 src/main/java/mineverse/Aust1n46/chat/bungee/VentureChatProxySource.java create mode 100644 src/main/java/mineverse/Aust1n46/chat/bungee/VentureChatVelocity.java diff --git a/pom.xml b/pom.xml index d132250..a252e8f 100644 --- a/pom.xml +++ b/pom.xml @@ -100,6 +100,10 @@ essentialsx-repo https://repo.essentialsx.net/snapshots/ + + velocity + https://repo.velocitypowered.com/snapshots/ + @@ -170,6 +174,12 @@ + + com.velocitypowered + velocity-api + 1.0.0-SNAPSHOT + provided + net.md-5 bungeecord-api diff --git a/src/main/java/mineverse/Aust1n46/chat/MineverseChat.java b/src/main/java/mineverse/Aust1n46/chat/MineverseChat.java index 234bc93..4fd902a 100644 --- a/src/main/java/mineverse/Aust1n46/chat/MineverseChat.java +++ b/src/main/java/mineverse/Aust1n46/chat/MineverseChat.java @@ -468,8 +468,8 @@ public class MineverseChat extends JavaPlugin implements PluginMessageListener { if(subchannel.equals("Chwho")) { String identifier = msgin.readUTF(); if(identifier.equals("Get")) { + String server = msgin.readUTF(); String sender = msgin.readUTF(); - String name = msgin.readUTF(); String chatchannel = msgin.readUTF(); List listening = new ArrayList(); if(ChatChannel.isChannel(chatchannel)) { @@ -485,8 +485,8 @@ public class MineverseChat extends JavaPlugin implements PluginMessageListener { } out.writeUTF("Chwho"); out.writeUTF("Receive"); + out.writeUTF(server); out.writeUTF(sender); - out.writeUTF(name); out.writeUTF(chatchannel); out.writeInt(listening.size()); for(String s : listening) { diff --git a/src/main/java/mineverse/Aust1n46/chat/bungee/MineverseChatBungee.java b/src/main/java/mineverse/Aust1n46/chat/bungee/MineverseChatBungee.java index 60f13a0..e2146b1 100644 --- a/src/main/java/mineverse/Aust1n46/chat/bungee/MineverseChatBungee.java +++ b/src/main/java/mineverse/Aust1n46/chat/bungee/MineverseChatBungee.java @@ -1,19 +1,15 @@ 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.UUID; +import java.util.List; +import java.util.stream.Collectors; -import mineverse.Aust1n46.chat.api.MineverseChatAPI; -import mineverse.Aust1n46.chat.api.SynchronizedMineverseChatPlayer; -import mineverse.Aust1n46.chat.command.mute.MuteContainer; import mineverse.Aust1n46.chat.database.BungeePlayerData; -import mineverse.Aust1n46.chat.database.TemporaryDataInstance; import mineverse.Aust1n46.chat.utilities.UUIDFetcher; +import net.md_5.bungee.api.ProxyServer; import net.md_5.bungee.api.connection.ProxiedPlayer; import net.md_5.bungee.api.connection.Server; import net.md_5.bungee.api.event.PluginMessageEvent; @@ -32,10 +28,9 @@ import net.md_5.bungee.event.EventHandler; * * @author Aust1n46 */ -public class MineverseChatBungee extends Plugin implements Listener { +public class MineverseChatBungee extends Plugin implements Listener, VentureChatProxySource { private static MineverseChatBungee instance; private static Configuration bungeeConfig; - public static String PLUGIN_MESSAGING_CHANNEL = "venturechat:data"; @Override public void onEnable() { @@ -58,7 +53,7 @@ public class MineverseChatBungee extends Plugin implements Listener { BungeePlayerData.loadLegacyBungeePlayerData(); BungeePlayerData.loadBungeePlayerData(); - this.getProxy().registerChannel(PLUGIN_MESSAGING_CHANNEL); + this.getProxy().registerChannel(VentureChatProxy.PLUGIN_MESSAGING_CHANNEL_STRING); this.getProxy().getPluginManager().registerListener(this, this); } @@ -102,7 +97,7 @@ public class MineverseChatBungee extends Plugin implements Listener { for(String send : getProxy().getServers().keySet()) { if(getProxy().getServers().get(send).getPlayers().size() > 0) { - getProxy().getServers().get(send).sendData(PLUGIN_MESSAGING_CHANNEL, outstream.toByteArray()); + getProxy().getServers().get(send).sendData(VentureChatProxy.PLUGIN_MESSAGING_CHANNEL_STRING, outstream.toByteArray()); } } } @@ -112,525 +107,30 @@ public class MineverseChatBungee extends Plugin implements Listener { } @EventHandler - public void onPluginMessage(PluginMessageEvent ev) { - //System.out.println(ev.getTag() + "," + ev.getSender().toString() + "," + (ev.getSender() instanceof Server)); - if(!ev.getTag().equals(PLUGIN_MESSAGING_CHANNEL) && !ev.getTag().contains("viaversion:")) { + public void onPluginMessage(PluginMessageEvent event) { + if(!event.getTag().equals(VentureChatProxy.PLUGIN_MESSAGING_CHANNEL_STRING) && !event.getTag().contains("viaversion:")) { return; } - if(!(ev.getSender() instanceof Server)) { + if(!(event.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 senderName = in.readUTF(); - String senderUUID = in.readUTF(); - boolean bungeeToggle = in.readBoolean(); - int hash = in.readInt(); - String format = in.readUTF(); - String chat = in.readUTF(); - String json = in.readUTF(); - String primaryGroup = in.readUTF(); - String nickname = in.readUTF(); - out.writeUTF("Chat"); - out.writeUTF(ser.getInfo().getName()); - out.writeUTF(chatchannel); - out.writeUTF(senderName); - out.writeUTF(senderUUID); - out.writeInt(hash); - out.writeUTF(format); - out.writeUTF(chat); - out.writeUTF(json); - out.writeUTF(primaryGroup); - out.writeUTF(nickname); - 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(PLUGIN_MESSAGING_CHANNEL, outstream.toByteArray()); - } - } - } - if(subchannel.equals("DiscordSRV")) { - String chatchannel = in.readUTF(); - String message = in.readUTF(); - out.writeUTF("DiscordSRV"); - out.writeUTF(chatchannel); - out.writeUTF(message); - for(String send : getProxy().getServers().keySet()) { - if(getProxy().getServers().get(send).getPlayers().size() > 0) { - getProxy().getServers().get(send).sendData(PLUGIN_MESSAGING_CHANNEL, outstream.toByteArray()); - } - } - } - if(subchannel.equals("Chwho")) { - String identifier = in.readUTF(); - if(identifier.equals("Get")) { - String sender = in.readUTF(); - String name = 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(name); - out.writeUTF(channel); - for(String send : getProxy().getServers().keySet()) { - if(getProxy().getServers().get(send).getPlayers().size() > 0) { - getProxy().getServers().get(send).sendData(PLUGIN_MESSAGING_CHANNEL, outstream.toByteArray()); - } - } - } - if(identifier.equals("Receive")) { - String sender = in.readUTF(); - String name = 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(name).getServer(); - server.sendData(PLUGIN_MESSAGING_CHANNEL, 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(PLUGIN_MESSAGING_CHANNEL, 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(PLUGIN_MESSAGING_CHANNEL, 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(PLUGIN_MESSAGING_CHANNEL, outstream.toByteArray()); - } - } - } - if(identifier.equals("Echo")) { - String server = in.readUTF(); - String player = in.readUTF(); - String receiverName = in.readUTF(); - String sender = in.readUTF(); - out.writeUTF("Ignore"); - out.writeUTF("Echo"); - out.writeUTF(player); - out.writeUTF(receiverName); - out.writeUTF(sender); - if(getProxy().getServers().get(server).getPlayers().size() > 0) { - getProxy().getServers().get(server).sendData(PLUGIN_MESSAGING_CHANNEL, outstream.toByteArray()); - } - } - } - if(subchannel.equals("Mute")) { - String identifier = in.readUTF(); - if(identifier.equals("Send")) { - String server = ser.getInfo().getName(); - String senderIdentifier = in.readUTF(); - String playerToMute = in.readUTF(); - String channelName = in.readUTF(); - long time = in.readLong(); - String reason = in.readUTF(); - UUID temporaryDataInstanceUUID = TemporaryDataInstance.createTemporaryDataInstance(); - out.writeUTF("Mute"); - out.writeUTF("Send"); - out.writeUTF(server); - out.writeUTF(senderIdentifier); - out.writeUTF(temporaryDataInstanceUUID.toString()); - out.writeUTF(playerToMute); - out.writeUTF(channelName); - out.writeLong(time); - out.writeUTF(reason); - for(String send : getProxy().getServers().keySet()) { - if(getProxy().getServers().get(send).getPlayers().size() > 0) { - getProxy().getServers().get(send).sendData(PLUGIN_MESSAGING_CHANNEL, outstream.toByteArray()); - } - } - } - if(identifier.equals("Valid")) { - String server = in.readUTF(); - String senderIdentifier = in.readUTF(); - String playerToMute = in.readUTF(); - String channelName = in.readUTF(); - long time = in.readLong(); - String reason = in.readUTF(); - out.writeUTF("Mute"); - out.writeUTF("Valid"); - out.writeUTF(senderIdentifier); - out.writeUTF(playerToMute); - out.writeUTF(channelName); - out.writeLong(time); - out.writeUTF(reason); - if(getProxy().getServers().get(server).getPlayers().size() > 0) { - getProxy().getServers().get(server).sendData(PLUGIN_MESSAGING_CHANNEL, outstream.toByteArray()); - } - } - if(identifier.equals("Offline")) { - String server = in.readUTF(); - UUID temporaryDataInstanceUUID = UUID.fromString(in.readUTF()); - String senderIdentifier = in.readUTF(); - String playerToMute = in.readUTF(); - TemporaryDataInstance temporaryDataInstance = TemporaryDataInstance.getTemporaryDataInstance(temporaryDataInstanceUUID); - temporaryDataInstance.incrementMessagePackets(); - int servers = 0; - for(String send : getProxy().getServers().keySet()) { - if(getProxy().getServers().get(send).getPlayers().size() > 0) { - servers ++; - } - } - if(temporaryDataInstance.getMessagePackets() >= servers) { - temporaryDataInstance.destroyInstance(); - out.writeUTF("Mute"); - out.writeUTF("Offline"); - out.writeUTF(senderIdentifier); - out.writeUTF(playerToMute); - if(getProxy().getServers().get(server).getPlayers().size() > 0) { - getProxy().getServers().get(server).sendData(PLUGIN_MESSAGING_CHANNEL, outstream.toByteArray()); - } - } - } - if(identifier.equals("AlreadyMuted")) { - String server = in.readUTF(); - String senderIdentifier = in.readUTF(); - String playerToMute = in.readUTF(); - String channelName = in.readUTF(); - out.writeUTF("Mute"); - out.writeUTF("AlreadyMuted"); - out.writeUTF(senderIdentifier); - out.writeUTF(playerToMute); - out.writeUTF(channelName); - if(getProxy().getServers().get(server).getPlayers().size() > 0) { - getProxy().getServers().get(server).sendData(PLUGIN_MESSAGING_CHANNEL, outstream.toByteArray()); - } - } - } - if(subchannel.equals("Unmute")) { - String identifier = in.readUTF(); - if(identifier.equals("Send")) { - String server = ser.getInfo().getName(); - String senderIdentifier = in.readUTF(); - String playerToUnmute = in.readUTF(); - String channelName = in.readUTF(); - UUID temporaryDataInstanceUUID = TemporaryDataInstance.createTemporaryDataInstance(); - out.writeUTF("Unmute"); - out.writeUTF("Send"); - out.writeUTF(server); - out.writeUTF(senderIdentifier); - out.writeUTF(temporaryDataInstanceUUID.toString()); - out.writeUTF(playerToUnmute); - out.writeUTF(channelName); - for(String send : getProxy().getServers().keySet()) { - if(getProxy().getServers().get(send).getPlayers().size() > 0) { - getProxy().getServers().get(send).sendData(PLUGIN_MESSAGING_CHANNEL, outstream.toByteArray()); - } - } - } - if(identifier.equals("Valid")) { - String server = in.readUTF(); - String senderIdentifier = in.readUTF(); - String playerToUnmute = in.readUTF(); - String channelName = in.readUTF(); - out.writeUTF("Unmute"); - out.writeUTF("Valid"); - out.writeUTF(senderIdentifier); - out.writeUTF(playerToUnmute); - out.writeUTF(channelName); - if(getProxy().getServers().get(server).getPlayers().size() > 0) { - getProxy().getServers().get(server).sendData(PLUGIN_MESSAGING_CHANNEL, outstream.toByteArray()); - } - } - if(identifier.equals("Offline")) { - String server = in.readUTF(); - UUID temporaryDataInstanceUUID = UUID.fromString(in.readUTF()); - String senderIdentifier = in.readUTF(); - String playerToUnmute = in.readUTF(); - TemporaryDataInstance temporaryDataInstance = TemporaryDataInstance.getTemporaryDataInstance(temporaryDataInstanceUUID); - temporaryDataInstance.incrementMessagePackets(); - int servers = 0; - for(String send : getProxy().getServers().keySet()) { - if(getProxy().getServers().get(send).getPlayers().size() > 0) { - servers ++; - } - } - if(temporaryDataInstance.getMessagePackets() >= servers) { - temporaryDataInstance.destroyInstance(); - out.writeUTF("Unmute"); - out.writeUTF("Offline"); - out.writeUTF(senderIdentifier); - out.writeUTF(playerToUnmute); - if(getProxy().getServers().get(server).getPlayers().size() > 0) { - getProxy().getServers().get(server).sendData(PLUGIN_MESSAGING_CHANNEL, outstream.toByteArray()); - } - } - } - if(identifier.equals("NotMuted")) { - String server = in.readUTF(); - String senderIdentifier = in.readUTF(); - String playerToUnmute = in.readUTF(); - String channelName = in.readUTF(); - out.writeUTF("Unmute"); - out.writeUTF("NotMuted"); - out.writeUTF(senderIdentifier); - out.writeUTF(playerToUnmute); - out.writeUTF(channelName); - if(getProxy().getServers().get(server).getPlayers().size() > 0) { - getProxy().getServers().get(server).sendData(PLUGIN_MESSAGING_CHANNEL, 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 send = in.readUTF(); - String echo = in.readUTF(); - String spy = in.readUTF(); - String msg = 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(send); - out.writeUTF(echo); - out.writeUTF(spy); - out.writeUTF(msg); - for(String serv : getProxy().getServers().keySet()) { - if(getProxy().getServers().get(serv).getPlayers().size() > 0) { - getProxy().getServers().get(serv).sendData(PLUGIN_MESSAGING_CHANNEL, 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(PLUGIN_MESSAGING_CHANNEL, 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(PLUGIN_MESSAGING_CHANNEL, 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(PLUGIN_MESSAGING_CHANNEL, outstream.toByteArray()); - } - } - if(identifier.equals("Echo")) { - String server = in.readUTF(); - String player = in.readUTF(); - String receiverUUID = 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(receiverUUID); - out.writeUTF(sender); - out.writeUTF(echo); - if(getProxy().getServers().get(server).getPlayers().size() > 0) { - getProxy().getServers().get(server).sendData(PLUGIN_MESSAGING_CHANNEL, outstream.toByteArray()); - } - outstream = new ByteArrayOutputStream(); - out = new DataOutputStream(outstream); - out.writeUTF("Message"); - out.writeUTF("Spy"); - out.writeUTF(player); - 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(PLUGIN_MESSAGING_CHANNEL, 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); - MineverseChatAPI.addSynchronizedMineverseChatPlayerToMap(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().size(); - //System.out.println(muteCount); - out.write(muteCount); - for(MuteContainer muteContainer : smcp.getMutes()) { - out.writeUTF(muteContainer.getChannel()); - out.writeLong(muteContainer.getDuration()); - out.writeUTF(muteContainer.getReason()); - } - //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(PLUGIN_MESSAGING_CHANNEL, outstream.toByteArray()); - } - if(identifier.equals("Update")) { - UUID uuid = UUID.fromString(in.readUTF()); - SynchronizedMineverseChatPlayer smcp = MineverseChatAPI.getSynchronizedMineverseChatPlayer(uuid); - if(smcp == null) { - smcp = new SynchronizedMineverseChatPlayer(uuid); - MineverseChatAPI.addSynchronizedMineverseChatPlayerToMap(smcp); - } - smcp.getListening().clear(); - smcp.clearMutes(); - 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(); - for(int b = 0; b < sizeM; b++) { - String mute = in.readUTF(); - long muteTime = in.readLong(); - String muteReason = in.readUTF(); - //System.out.println(mute); - smcp.addMute(mute, muteTime, muteReason); - } - 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()); - } - } - } - catch(Exception e) { - e.printStackTrace(); - } + String serverName = ((Server) event.getSender()).getInfo().getName(); + VentureChatProxy.onPluginMessage(event.getData(), serverName, this); + } + + @Override + public void sendPluginMessage(String serverName, byte[] data) { + getProxy().getServers().get(serverName).sendData(VentureChatProxy.PLUGIN_MESSAGING_CHANNEL_STRING, data); + } + + @Override + public List getServers() { + return getProxy().getServers().values().stream().map(bungeeServer -> new VentureChatProxyServer(bungeeServer.getName(), bungeeServer.getPlayers().isEmpty())).collect(Collectors.toList()); + } + + @Override + public VentureChatProxyServer getServer(String serverName) { + ProxyServer server = (ProxyServer) getProxy().getServers().get(serverName); + return new VentureChatProxyServer(serverName, server.getPlayers().isEmpty()); } } diff --git a/src/main/java/mineverse/Aust1n46/chat/bungee/VentureChatProxy.java b/src/main/java/mineverse/Aust1n46/chat/bungee/VentureChatProxy.java new file mode 100644 index 0000000..49c073f --- /dev/null +++ b/src/main/java/mineverse/Aust1n46/chat/bungee/VentureChatProxy.java @@ -0,0 +1,533 @@ +package mineverse.Aust1n46.chat.bungee; + +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.DataInputStream; +import java.io.DataOutputStream; +import java.util.UUID; +import java.util.concurrent.atomic.AtomicInteger; + +import mineverse.Aust1n46.chat.api.MineverseChatAPI; +import mineverse.Aust1n46.chat.api.SynchronizedMineverseChatPlayer; +import mineverse.Aust1n46.chat.command.mute.MuteContainer; +import mineverse.Aust1n46.chat.database.TemporaryDataInstance; + +public class VentureChatProxy { + public static String PLUGIN_MESSAGING_CHANNEL_NAMESPACE = "venturechat"; + public static String PLUGIN_MESSAGING_CHANNEL_NAME = "data"; + public static String PLUGIN_MESSAGING_CHANNEL_STRING = "venturechat:data"; + + public static void onPluginMessage(byte[] data, String serverName, VentureChatProxySource source) { + ByteArrayInputStream instream = new ByteArrayInputStream(data); + DataInputStream in = new DataInputStream(instream); + try { + String subchannel = in.readUTF(); + //System.out.println(subchannel); + final ByteArrayOutputStream outstream = new ByteArrayOutputStream(); + DataOutputStream out = new DataOutputStream(outstream); + if(subchannel.equals("Chat")) { + String chatchannel = in.readUTF(); + String senderName = in.readUTF(); + String senderUUID = in.readUTF(); + boolean bungeeToggle = in.readBoolean(); + int hash = in.readInt(); + String format = in.readUTF(); + String chat = in.readUTF(); + String json = in.readUTF(); + String primaryGroup = in.readUTF(); + String nickname = in.readUTF(); + out.writeUTF("Chat"); + out.writeUTF(serverName); + out.writeUTF(chatchannel); + out.writeUTF(senderName); + out.writeUTF(senderUUID); + out.writeInt(hash); + out.writeUTF(format); + out.writeUTF(chat); + out.writeUTF(json); + out.writeUTF(primaryGroup); + out.writeUTF(nickname); + for(VentureChatProxyServer send : source.getServers()) { + if(!send.isEmpty()) { + if(!bungeeToggle && !send.getName().equalsIgnoreCase(serverName)) { + continue; + } + source.sendPluginMessage(send.getName(), outstream.toByteArray()); + } + } + } + if(subchannel.equals("DiscordSRV")) { + String chatchannel = in.readUTF(); + String message = in.readUTF(); + out.writeUTF("DiscordSRV"); + out.writeUTF(chatchannel); + out.writeUTF(message); + source.getServers().forEach(send -> { + if(!send.isEmpty()) { + source.sendPluginMessage(send.getName(), outstream.toByteArray()); + } + }); + } + if(subchannel.equals("Chwho")) { + String identifier = in.readUTF(); + if(identifier.equals("Get")) { + String server = serverName; + 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(server); + out.writeUTF(sender); + out.writeUTF(channel); + source.getServers().forEach(send -> { + if(!send.isEmpty()) { + source.sendPluginMessage(send.getName(), outstream.toByteArray()); + } + }); + } + if(identifier.equals("Receive")) { + String server = in.readUTF(); + 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()); + } + AtomicInteger servers = new AtomicInteger(0); + source.getServers().forEach(send -> { + if(!send.isEmpty()) { + servers.incrementAndGet(); + } + }); + if(smcp.getMessagePackets() >= servers.get()) { + 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(); + source.sendPluginMessage(server, outstream.toByteArray()); + } + } + } + if(subchannel.equals("RemoveMessage")) { + String hash = in.readUTF(); + out.writeUTF("RemoveMessage"); + out.writeUTF(hash); + source.getServers().forEach(send -> { + if(!send.isEmpty()) { + source.sendPluginMessage(send.getName(), outstream.toByteArray()); + } + }); + } + if(subchannel.equals("Ignore")) { + String identifier = in.readUTF(); + if(identifier.equals("Send")) { + String server = serverName; + 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); + source.getServers().forEach(send -> { + if(!send.isEmpty()) { + source.sendPluginMessage(send.getName(), 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(); + AtomicInteger servers = new AtomicInteger(0); + source.getServers().forEach(send -> { + if(!send.isEmpty()) { + servers.incrementAndGet(); + } + }); + if(smcp.getMessagePackets() >= servers.get()) { + smcp.clearMessagePackets(); + out.writeUTF("Ignore"); + out.writeUTF("Offline"); + out.writeUTF(player); + out.writeUTF(sender); + if(!source.getServer(server).isEmpty()) { + source.sendPluginMessage(server, outstream.toByteArray()); + } + } + } + if(identifier.equals("Echo")) { + String server = in.readUTF(); + String player = in.readUTF(); + String receiverName = in.readUTF(); + String sender = in.readUTF(); + out.writeUTF("Ignore"); + out.writeUTF("Echo"); + out.writeUTF(player); + out.writeUTF(receiverName); + out.writeUTF(sender); + if(!source.getServer(server).isEmpty()) { + source.sendPluginMessage(server, outstream.toByteArray()); + } + } + } + if(subchannel.equals("Mute")) { + String identifier = in.readUTF(); + if(identifier.equals("Send")) { + String server = serverName; + String senderIdentifier = in.readUTF(); + String playerToMute = in.readUTF(); + String channelName = in.readUTF(); + long time = in.readLong(); + String reason = in.readUTF(); + UUID temporaryDataInstanceUUID = TemporaryDataInstance.createTemporaryDataInstance(); + out.writeUTF("Mute"); + out.writeUTF("Send"); + out.writeUTF(server); + out.writeUTF(senderIdentifier); + out.writeUTF(temporaryDataInstanceUUID.toString()); + out.writeUTF(playerToMute); + out.writeUTF(channelName); + out.writeLong(time); + out.writeUTF(reason); + source.getServers().forEach(send -> { + if(!send.isEmpty()) { + source.sendPluginMessage(send.getName(), outstream.toByteArray()); + } + }); + } + if(identifier.equals("Valid")) { + String server = in.readUTF(); + String senderIdentifier = in.readUTF(); + String playerToMute = in.readUTF(); + String channelName = in.readUTF(); + long time = in.readLong(); + String reason = in.readUTF(); + out.writeUTF("Mute"); + out.writeUTF("Valid"); + out.writeUTF(senderIdentifier); + out.writeUTF(playerToMute); + out.writeUTF(channelName); + out.writeLong(time); + out.writeUTF(reason); + if(!source.getServer(server).isEmpty()) { + source.sendPluginMessage(server, outstream.toByteArray()); + } + } + if(identifier.equals("Offline")) { + String server = in.readUTF(); + UUID temporaryDataInstanceUUID = UUID.fromString(in.readUTF()); + String senderIdentifier = in.readUTF(); + String playerToMute = in.readUTF(); + TemporaryDataInstance temporaryDataInstance = TemporaryDataInstance.getTemporaryDataInstance(temporaryDataInstanceUUID); + temporaryDataInstance.incrementMessagePackets(); + AtomicInteger servers = new AtomicInteger(0); + source.getServers().forEach(send -> { + if(!send.isEmpty()) { + servers.incrementAndGet(); + } + }); + if(temporaryDataInstance.getMessagePackets() >= servers.get()) { + temporaryDataInstance.destroyInstance(); + out.writeUTF("Mute"); + out.writeUTF("Offline"); + out.writeUTF(senderIdentifier); + out.writeUTF(playerToMute); + if(!source.getServer(server).isEmpty()) { + source.sendPluginMessage(server, outstream.toByteArray()); + } + } + } + if(identifier.equals("AlreadyMuted")) { + String server = in.readUTF(); + String senderIdentifier = in.readUTF(); + String playerToMute = in.readUTF(); + String channelName = in.readUTF(); + out.writeUTF("Mute"); + out.writeUTF("AlreadyMuted"); + out.writeUTF(senderIdentifier); + out.writeUTF(playerToMute); + out.writeUTF(channelName); + if(!source.getServer(server).isEmpty()) { + source.sendPluginMessage(server, outstream.toByteArray()); + } + } + } + if(subchannel.equals("Unmute")) { + String identifier = in.readUTF(); + if(identifier.equals("Send")) { + String server = serverName; + String senderIdentifier = in.readUTF(); + String playerToUnmute = in.readUTF(); + String channelName = in.readUTF(); + UUID temporaryDataInstanceUUID = TemporaryDataInstance.createTemporaryDataInstance(); + out.writeUTF("Unmute"); + out.writeUTF("Send"); + out.writeUTF(server); + out.writeUTF(senderIdentifier); + out.writeUTF(temporaryDataInstanceUUID.toString()); + out.writeUTF(playerToUnmute); + out.writeUTF(channelName); + source.getServers().forEach(send -> { + if(!send.isEmpty()) { + source.sendPluginMessage(send.getName(), outstream.toByteArray()); + } + }); + } + if(identifier.equals("Valid")) { + String server = in.readUTF(); + String senderIdentifier = in.readUTF(); + String playerToUnmute = in.readUTF(); + String channelName = in.readUTF(); + out.writeUTF("Unmute"); + out.writeUTF("Valid"); + out.writeUTF(senderIdentifier); + out.writeUTF(playerToUnmute); + out.writeUTF(channelName); + if(!source.getServer(server).isEmpty()) { + source.sendPluginMessage(server, outstream.toByteArray()); + } + } + if(identifier.equals("Offline")) { + String server = in.readUTF(); + UUID temporaryDataInstanceUUID = UUID.fromString(in.readUTF()); + String senderIdentifier = in.readUTF(); + String playerToUnmute = in.readUTF(); + TemporaryDataInstance temporaryDataInstance = TemporaryDataInstance.getTemporaryDataInstance(temporaryDataInstanceUUID); + temporaryDataInstance.incrementMessagePackets(); + AtomicInteger servers = new AtomicInteger(0); + source.getServers().forEach(send -> { + if(!send.isEmpty()) { + servers.incrementAndGet(); + } + }); + if(temporaryDataInstance.getMessagePackets() >= servers.get()) { + temporaryDataInstance.destroyInstance(); + out.writeUTF("Unmute"); + out.writeUTF("Offline"); + out.writeUTF(senderIdentifier); + out.writeUTF(playerToUnmute); + if(!source.getServer(server).isEmpty()) { + source.sendPluginMessage(server, outstream.toByteArray()); + } + } + } + if(identifier.equals("NotMuted")) { + String server = in.readUTF(); + String senderIdentifier = in.readUTF(); + String playerToUnmute = in.readUTF(); + String channelName = in.readUTF(); + out.writeUTF("Unmute"); + out.writeUTF("NotMuted"); + out.writeUTF(senderIdentifier); + out.writeUTF(playerToUnmute); + out.writeUTF(channelName); + if(!source.getServer(server).isEmpty()) { + source.sendPluginMessage(server, outstream.toByteArray()); + } + } + } + if(subchannel.equals("Message")) { + String identifier = in.readUTF(); + if(identifier.equals("Send")) { + String server = serverName; + String player = in.readUTF(); + String sender = in.readUTF(); + String sName = in.readUTF(); + String send = in.readUTF(); + String echo = in.readUTF(); + String spy = in.readUTF(); + String msg = 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(send); + out.writeUTF(echo); + out.writeUTF(spy); + out.writeUTF(msg); + source.getServers().forEach(serv -> { + if(!send.isEmpty()) { + source.sendPluginMessage(serv.getName(), 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(); + AtomicInteger servers = new AtomicInteger(0); + source.getServers().forEach(send -> { + if(!send.isEmpty()) { + servers.incrementAndGet(); + } + }); + if(smcp.getMessagePackets() >= servers.get()) { + smcp.clearMessagePackets(); + out.writeUTF("Message"); + out.writeUTF("Offline"); + out.writeUTF(player); + out.writeUTF(sender); + if(!source.getServer(server).isEmpty()) { + source.sendPluginMessage(server, 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(!source.getServer(server).isEmpty()) { + source.sendPluginMessage(server, 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(!source.getServer(server).isEmpty()) { + source.sendPluginMessage(server, outstream.toByteArray()); + } + } + if(identifier.equals("Echo")) { + String server = in.readUTF(); + String player = in.readUTF(); + String receiverUUID = 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(receiverUUID); + out.writeUTF(sender); + out.writeUTF(echo); + if(!source.getServer(server).isEmpty()) { + source.sendPluginMessage(server, outstream.toByteArray()); + } + outstream.reset(); + out = new DataOutputStream(outstream); + out.writeUTF("Message"); + out.writeUTF("Spy"); + out.writeUTF(player); + out.writeUTF(sName); + out.writeUTF(spy); + source.getServers().forEach(send -> { + if(!send.isEmpty()) { + source.sendPluginMessage(send.getName(), 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 = serverName; + UUID uuid = UUID.fromString(in.readUTF()); + SynchronizedMineverseChatPlayer smcp = MineverseChatAPI.getSynchronizedMineverseChatPlayer(uuid); + if(smcp == null) { + smcp = new SynchronizedMineverseChatPlayer(uuid); + MineverseChatAPI.addSynchronizedMineverseChatPlayerToMap(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().size(); + //System.out.println(muteCount); + out.write(muteCount); + for(MuteContainer muteContainer : smcp.getMutes()) { + out.writeUTF(muteContainer.getChannel()); + out.writeLong(muteContainer.getDuration()); + out.writeUTF(muteContainer.getReason()); + } + //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(!source.getServer(server).isEmpty()) { + source.sendPluginMessage(server, outstream.toByteArray()); + } + } + if(identifier.equals("Update")) { + UUID uuid = UUID.fromString(in.readUTF()); + SynchronizedMineverseChatPlayer smcp = MineverseChatAPI.getSynchronizedMineverseChatPlayer(uuid); + if(smcp == null) { + smcp = new SynchronizedMineverseChatPlayer(uuid); + MineverseChatAPI.addSynchronizedMineverseChatPlayerToMap(smcp); + } + smcp.getListening().clear(); + smcp.clearMutes(); + 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(); + for(int b = 0; b < sizeM; b++) { + String mute = in.readUTF(); + long muteTime = in.readLong(); + String muteReason = in.readUTF(); + //System.out.println(mute); + smcp.addMute(mute, muteTime, muteReason); + } + 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()); + } + } + } + catch(Exception e) { + e.printStackTrace(); + } + } +} diff --git a/src/main/java/mineverse/Aust1n46/chat/bungee/VentureChatProxyServer.java b/src/main/java/mineverse/Aust1n46/chat/bungee/VentureChatProxyServer.java new file mode 100644 index 0000000..1623b96 --- /dev/null +++ b/src/main/java/mineverse/Aust1n46/chat/bungee/VentureChatProxyServer.java @@ -0,0 +1,19 @@ +package mineverse.Aust1n46.chat.bungee; + +public class VentureChatProxyServer { + private String name; + private boolean empty; + + public VentureChatProxyServer(String name, boolean empty) { + this.name = name; + this.empty = empty; + } + + public boolean isEmpty() { + return empty; + } + + public String getName() { + return name; + } +} diff --git a/src/main/java/mineverse/Aust1n46/chat/bungee/VentureChatProxySource.java b/src/main/java/mineverse/Aust1n46/chat/bungee/VentureChatProxySource.java new file mode 100644 index 0000000..884af39 --- /dev/null +++ b/src/main/java/mineverse/Aust1n46/chat/bungee/VentureChatProxySource.java @@ -0,0 +1,11 @@ +package mineverse.Aust1n46.chat.bungee; + +import java.util.List; + +public interface VentureChatProxySource { + public void sendPluginMessage(String serverName, byte[] data); + + public List getServers(); + + public VentureChatProxyServer getServer(String serverName); +} diff --git a/src/main/java/mineverse/Aust1n46/chat/bungee/VentureChatVelocity.java b/src/main/java/mineverse/Aust1n46/chat/bungee/VentureChatVelocity.java new file mode 100644 index 0000000..2f59c68 --- /dev/null +++ b/src/main/java/mineverse/Aust1n46/chat/bungee/VentureChatVelocity.java @@ -0,0 +1,109 @@ +package mineverse.Aust1n46.chat.bungee; + +import java.io.ByteArrayOutputStream; +import java.io.DataOutputStream; +import java.util.List; +import java.util.Optional; +import java.util.concurrent.TimeUnit; +import java.util.stream.Collectors; + +import org.slf4j.Logger; + +import com.google.inject.Inject; +import com.velocitypowered.api.event.Subscribe; +import com.velocitypowered.api.event.connection.DisconnectEvent; +import com.velocitypowered.api.event.connection.PluginMessageEvent; +import com.velocitypowered.api.event.connection.PluginMessageEvent.ForwardResult; +import com.velocitypowered.api.event.player.ServerConnectedEvent; +import com.velocitypowered.api.event.proxy.ProxyInitializeEvent; +import com.velocitypowered.api.plugin.Plugin; +import com.velocitypowered.api.proxy.Player; +import com.velocitypowered.api.proxy.ProxyServer; +import com.velocitypowered.api.proxy.ServerConnection; +import com.velocitypowered.api.proxy.messages.ChannelIdentifier; +import com.velocitypowered.api.proxy.messages.MinecraftChannelIdentifier; +import com.velocitypowered.api.proxy.server.RegisteredServer; + +@Plugin(id = "venturechat", name = "VentureChat", version = "${project.version}", +description = "#1 Channels Chat plugin! Spigot + Bungee. Supports PlaceholderAPI + JSON formatting. Moderation GUI!", authors = {"Aust1n46"}) +public class VentureChatVelocity implements VentureChatProxySource { + private final ProxyServer proxyServer; + private final ChannelIdentifier channelIdentifier = MinecraftChannelIdentifier.create(VentureChatProxy.PLUGIN_MESSAGING_CHANNEL_NAMESPACE, VentureChatProxy.PLUGIN_MESSAGING_CHANNEL_NAME); + + @Inject + public VentureChatVelocity(ProxyServer server, Logger logger) { + this.proxyServer = server; + } + + @Subscribe + public void onInitialize(ProxyInitializeEvent event) { + proxyServer.getChannelRegistrar().register(channelIdentifier); + } + + @Subscribe + public void onPlayerJoin(ServerConnectedEvent event) { + proxyServer.getScheduler().buildTask(this, () -> { + updatePlayerNames(); + }) + .delay(500, TimeUnit.MILLISECONDS) + .schedule(); + } + + @Subscribe + public void onPlayerQuit(DisconnectEvent event) { + updatePlayerNames(); + } + + private void updatePlayerNames() { + try { + ByteArrayOutputStream outstream = new ByteArrayOutputStream(); + DataOutputStream out = new DataOutputStream(outstream); + out.writeUTF("PlayerNames"); + out.writeInt(proxyServer.getPlayerCount()); + for(Player player : proxyServer.getAllPlayers()) { + out.writeUTF(player.getUsername()); + } + getServers().forEach(send -> { + if(!send.isEmpty()) { + sendPluginMessage(send.getName(), outstream.toByteArray()); + } + }); + } + catch(Exception e) { + e.printStackTrace(); + } + } + + @Subscribe + public void onPluginMessage(PluginMessageEvent event) { + String channelIdentifierId = event.getIdentifier().getId(); + if(!channelIdentifierId.equals(VentureChatProxy.PLUGIN_MESSAGING_CHANNEL_STRING) && !channelIdentifierId.contains("viaversion:")) { + return; + } + if(!(event.getSource() instanceof ServerConnection)) { + return; + } + String serverName = ((ServerConnection) event.getSource()).getServerInfo().getName(); + VentureChatProxy.onPluginMessage(event.getData(), serverName, this); + event.setResult(ForwardResult.handled()); + } + + @Override + public void sendPluginMessage(String serverName, byte[] data) { + Optional server = proxyServer.getServer(serverName); + if(server.isPresent()) { + server.get().sendPluginMessage(channelIdentifier, data); + } + } + + @Override + public List getServers() { + return proxyServer.getAllServers().stream().map(velocityServer -> new VentureChatProxyServer(velocityServer.getServerInfo().getName(), velocityServer.getPlayersConnected().isEmpty())).collect(Collectors.toList()); + } + + @Override + public VentureChatProxyServer getServer(String serverName) { + RegisteredServer server = proxyServer.getServer(serverName).get(); + return new VentureChatProxyServer(serverName, server.getPlayersConnected().isEmpty()); + } +} diff --git a/src/main/java/mineverse/Aust1n46/chat/command/chat/Chwho.java b/src/main/java/mineverse/Aust1n46/chat/command/chat/Chwho.java index 69b2781..e8d1183 100644 --- a/src/main/java/mineverse/Aust1n46/chat/command/chat/Chwho.java +++ b/src/main/java/mineverse/Aust1n46/chat/command/chat/Chwho.java @@ -49,7 +49,6 @@ public class Chwho implements VentureCommand { out.writeUTF("Chwho"); out.writeUTF("Get"); out.writeUTF(mcp.getUUID().toString()); - out.writeUTF(mcp.getName()); out.writeUTF(channel.getName()); mcp.getPlayer().sendPluginMessage(plugin, MineverseChat.PLUGIN_MESSAGING_CHANNEL, byteOutStream.toByteArray()); out.close();