diff --git a/src/main/java/land/chipmunk/chayapak/chomens_bot/plugins/VoiceChatPlugin.java b/src/main/java/land/chipmunk/chayapak/chomens_bot/plugins/VoiceChatPlugin.java index 4d5fd8f..3a05147 100644 --- a/src/main/java/land/chipmunk/chayapak/chomens_bot/plugins/VoiceChatPlugin.java +++ b/src/main/java/land/chipmunk/chayapak/chomens_bot/plugins/VoiceChatPlugin.java @@ -12,17 +12,12 @@ import land.chipmunk.chayapak.chomens_bot.data.voiceChat.RawUdpPacket; import land.chipmunk.chayapak.chomens_bot.util.FriendlyByteBuf; import land.chipmunk.chayapak.chomens_bot.voiceChat.InitializationData; import land.chipmunk.chayapak.chomens_bot.voiceChat.NetworkMessage; -import land.chipmunk.chayapak.chomens_bot.voiceChat.packets.KeepAlivePacket; -import land.chipmunk.chayapak.chomens_bot.voiceChat.packets.PingPacket; -import land.chipmunk.chayapak.chomens_bot.voiceChat.packets.SecretPacket; -import land.chipmunk.chayapak.chomens_bot.voiceChat.packets.AuthenticatePacket; +import land.chipmunk.chayapak.chomens_bot.voiceChat.packets.*; import java.net.*; -// exists for some reason, still wip and will be finished in the next 69 years -// and i prob implemented it in a wrong way lol -// at least when you do `/voicechat test (bot username)` it will show `Client not connected` -// instead of `(bot username) does not have Simple Voice Chat installed` +// most of these codes are from the simple voice chat mod itself including the other voicechat classes +// i didn't implement mic yet because my goal is to make `/voicechat test` work with the bot public class VoiceChatPlugin extends Bot.Listener { private final Bot bot; @@ -31,6 +26,8 @@ public class VoiceChatPlugin extends Bot.Listener { private InetAddress address; private InetSocketAddress socketAddress; + private boolean running = false; + public VoiceChatPlugin(Bot bot) { this.bot = bot; @@ -59,16 +56,12 @@ public class VoiceChatPlugin extends Bot.Listener { "voicechat:update_state", new FriendlyByteBuf(Unpooled.buffer()).writeBoolean(false).array() )); + + running = true; } public void packetReceived(ClientboundCustomPayloadPacket _packet) { - // sus - /* - System.out.println("\"" + _packet.getChannel() + "\""); - System.out.println(Arrays.toString(_packet.getData())); - System.out.println(new String(_packet.getData())); - */ - if (_packet.getChannel().equals("voicechat:secret")) { + if (_packet.getChannel().equals("voicechat:secret")) { // fard final byte[] bytes = _packet.getData(); final FriendlyByteBuf buf = new FriendlyByteBuf(Unpooled.wrappedBuffer(bytes)); @@ -91,41 +84,38 @@ public class VoiceChatPlugin extends Bot.Listener { } bot.executorService().execute(() -> { - while (true) { - try { - if (socket.isClosed()) continue; + sendToServer(new NetworkMessage(new AuthenticatePacket(initializationData.playerUUID(), initializationData.secret()))); + while (running) { + try { final NetworkMessage message = NetworkMessage.readPacket(socket.read(), initializationData); if (message == null) continue; - if (message.packet() instanceof AuthenticatePacket) { - System.out.println("SERVER AUTHENTICATED FINALLYYYYYYYYYYYYYYYY"); - } else if (message.packet() instanceof PingPacket pingPacket) { - System.out.println("got ping packet"); - sendToServer(new NetworkMessage(pingPacket)); - } else if (message.packet() instanceof KeepAlivePacket) { - System.out.println("got keep alive packet"); - sendToServer(new NetworkMessage(new KeepAlivePacket())); - } else { - System.out.println("got " + message.packet().getClass().getName()); - } + if (message.packet() instanceof PingPacket pingPacket) sendToServer(new NetworkMessage(pingPacket)); + else if (message.packet() instanceof KeepAlivePacket) sendToServer(new NetworkMessage(new KeepAlivePacket())); + else if (message.packet() instanceof AuthenticateAckPacket) sendToServer(new NetworkMessage(new ConnectionCheckPacket())); } catch (Exception e) { - e.printStackTrace(); + if (running) e.printStackTrace(); + else break; // is this neccessary? } } }); } } - public void sendToServer (NetworkMessage message) throws Exception { - socket.send( - message.writeClient(initializationData), - socketAddress - ); + public void sendToServer (NetworkMessage message) { + try { + socket.send( + message.writeClient(initializationData), + socketAddress + ); + } catch (Exception e) { + e.printStackTrace(); + } } - private static class VoiceChatSocketBase { + private class VoiceChatSocketBase { private final byte[] BUFFER = new byte[4096]; public RawUdpPacket read (DatagramSocket socket) { @@ -133,13 +123,8 @@ public class VoiceChatPlugin extends Bot.Listener { try { DatagramPacket packet = new DatagramPacket(BUFFER, BUFFER.length); - System.out.println("receiving packet"); - - // the problem is this next line, just this 1 line. it makes the entire thing froze socket.receive(packet); - System.out.println("FINALLY DONE RECEIVING AAAAHHHHHHHHHHHHHHHHHHH"); - // Setting the timestamp after receiving the packet long timestamp = System.currentTimeMillis(); byte[] data = new byte[packet.getLength()]; @@ -157,9 +142,11 @@ public class VoiceChatPlugin extends Bot.Listener { @Override public void disconnected(DisconnectedEvent event) { socket.close(); + + running = false; } - private static class ClientVoiceChatSocket extends VoiceChatSocketBase { + private class ClientVoiceChatSocket extends VoiceChatSocketBase { private DatagramSocket socket; public void open() throws SocketException { diff --git a/src/main/java/land/chipmunk/chayapak/chomens_bot/voiceChat/NetworkMessage.java b/src/main/java/land/chipmunk/chayapak/chomens_bot/voiceChat/NetworkMessage.java index 0f454a4..7cabc50 100644 --- a/src/main/java/land/chipmunk/chayapak/chomens_bot/voiceChat/NetworkMessage.java +++ b/src/main/java/land/chipmunk/chayapak/chomens_bot/voiceChat/NetworkMessage.java @@ -4,7 +4,7 @@ import io.netty.buffer.Unpooled; import land.chipmunk.chayapak.chomens_bot.data.voiceChat.RawUdpPacket; import land.chipmunk.chayapak.chomens_bot.util.AES; import land.chipmunk.chayapak.chomens_bot.util.FriendlyByteBuf; -import land.chipmunk.chayapak.chomens_bot.voiceChat.packets.AuthenticatePacket; +import land.chipmunk.chayapak.chomens_bot.voiceChat.packets.*; import lombok.Getter; import javax.crypto.BadPaddingException; @@ -49,11 +49,11 @@ public class NetworkMessage { // packetRegistry.put((byte) 0x3, GroupSoundPacket.class); // packetRegistry.put((byte) 0x4, LocationSoundPacket.class); packetRegistry.put((byte) 0x5, AuthenticatePacket.class); -// packetRegistry.put((byte) 0x6, AuthenticateAckPacket.class); -// packetRegistry.put((byte) 0x7, PingPacket.class); -// packetRegistry.put((byte) 0x8, KeepAlivePacket.class); -// packetRegistry.put((byte) 0x9, ConnectionCheckPacket.class); -// packetRegistry.put((byte) 0xA, ConnectionCheckAckPacket.class); + packetRegistry.put((byte) 0x6, AuthenticateAckPacket.class); + packetRegistry.put((byte) 0x7, PingPacket.class); + packetRegistry.put((byte) 0x8, KeepAlivePacket.class); + packetRegistry.put((byte) 0x9, ConnectionCheckPacket.class); + packetRegistry.put((byte) 0xA, ConnectionAckPacket.class); } public static NetworkMessage readPacket (RawUdpPacket packet, InitializationData initializationData) throws IllegalAccessException, InstantiationException, InvocationTargetException, NoSuchMethodException { @@ -79,10 +79,7 @@ public class NetworkMessage { FriendlyByteBuf buffer = new FriendlyByteBuf(Unpooled.wrappedBuffer(decrypt)); byte packetType = buffer.readByte(); final Class<? extends Packet<?>> packetClass = packetRegistry.get(packetType); - if (packetClass == null) { - System.out.println("packet type is null " + packetType); - return null; - } + if (packetClass == null) return null; Packet<?> p = packetClass.getDeclaredConstructor().newInstance(); NetworkMessage message = new NetworkMessage(timestamp); diff --git a/src/main/java/land/chipmunk/chayapak/chomens_bot/voiceChat/packets/AuthenticateAckPacket.java b/src/main/java/land/chipmunk/chayapak/chomens_bot/voiceChat/packets/AuthenticateAckPacket.java new file mode 100644 index 0000000..d1fd642 --- /dev/null +++ b/src/main/java/land/chipmunk/chayapak/chomens_bot/voiceChat/packets/AuthenticateAckPacket.java @@ -0,0 +1,15 @@ +package land.chipmunk.chayapak.chomens_bot.voiceChat.packets; + +import land.chipmunk.chayapak.chomens_bot.util.FriendlyByteBuf; +import land.chipmunk.chayapak.chomens_bot.voiceChat.Packet; + +public class AuthenticateAckPacket implements Packet<AuthenticateAckPacket> { + @Override + public AuthenticateAckPacket fromBytes(FriendlyByteBuf buf) { + return new AuthenticateAckPacket(); + } + + @Override + public void toBytes(FriendlyByteBuf buf) { + } +} diff --git a/src/main/java/land/chipmunk/chayapak/chomens_bot/voiceChat/packets/AuthenticatePacket.java b/src/main/java/land/chipmunk/chayapak/chomens_bot/voiceChat/packets/AuthenticatePacket.java index f737fc9..462cf21 100644 --- a/src/main/java/land/chipmunk/chayapak/chomens_bot/voiceChat/packets/AuthenticatePacket.java +++ b/src/main/java/land/chipmunk/chayapak/chomens_bot/voiceChat/packets/AuthenticatePacket.java @@ -2,14 +2,18 @@ package land.chipmunk.chayapak.chomens_bot.voiceChat.packets; import land.chipmunk.chayapak.chomens_bot.util.FriendlyByteBuf; import land.chipmunk.chayapak.chomens_bot.voiceChat.Packet; +import lombok.AllArgsConstructor; import lombok.Getter; import java.util.UUID; +@AllArgsConstructor public class AuthenticatePacket implements Packet<AuthenticatePacket> { @Getter private UUID playerUUID; @Getter private UUID secret; + public AuthenticatePacket () {} + @Override public AuthenticatePacket fromBytes (FriendlyByteBuf buf) { AuthenticatePacket packet = new AuthenticatePacket(); diff --git a/src/main/java/land/chipmunk/chayapak/chomens_bot/voiceChat/packets/ConnectionAckPacket.java b/src/main/java/land/chipmunk/chayapak/chomens_bot/voiceChat/packets/ConnectionAckPacket.java new file mode 100644 index 0000000..f93f413 --- /dev/null +++ b/src/main/java/land/chipmunk/chayapak/chomens_bot/voiceChat/packets/ConnectionAckPacket.java @@ -0,0 +1,15 @@ +package land.chipmunk.chayapak.chomens_bot.voiceChat.packets; + +import land.chipmunk.chayapak.chomens_bot.util.FriendlyByteBuf; +import land.chipmunk.chayapak.chomens_bot.voiceChat.Packet; + +public class ConnectionAckPacket implements Packet<ConnectionAckPacket> { + @Override + public ConnectionAckPacket fromBytes(FriendlyByteBuf buf) { + return new ConnectionAckPacket(); + } + + @Override + public void toBytes(FriendlyByteBuf buf) { + } +} diff --git a/src/main/java/land/chipmunk/chayapak/chomens_bot/voiceChat/packets/ConnectionCheckPacket.java b/src/main/java/land/chipmunk/chayapak/chomens_bot/voiceChat/packets/ConnectionCheckPacket.java new file mode 100644 index 0000000..6956043 --- /dev/null +++ b/src/main/java/land/chipmunk/chayapak/chomens_bot/voiceChat/packets/ConnectionCheckPacket.java @@ -0,0 +1,15 @@ +package land.chipmunk.chayapak.chomens_bot.voiceChat.packets; + +import land.chipmunk.chayapak.chomens_bot.util.FriendlyByteBuf; +import land.chipmunk.chayapak.chomens_bot.voiceChat.Packet; + +public class ConnectionCheckPacket implements Packet<ConnectionCheckPacket> { + @Override + public ConnectionCheckPacket fromBytes(FriendlyByteBuf buf) { + return new ConnectionCheckPacket(); + } + + @Override + public void toBytes(FriendlyByteBuf buf) { + } +}