diff --git a/src/main/java/land/chipmunk/chayapak/chomens_bot/data/voiceChat/ClientGroup.java b/src/main/java/land/chipmunk/chayapak/chomens_bot/data/voiceChat/ClientGroup.java new file mode 100644 index 0000000..be396b0 --- /dev/null +++ b/src/main/java/land/chipmunk/chayapak/chomens_bot/data/voiceChat/ClientGroup.java @@ -0,0 +1,26 @@ +package land.chipmunk.chayapak.chomens_bot.data.voiceChat; + +import land.chipmunk.chayapak.chomens_bot.util.FriendlyByteBuf; +import lombok.AllArgsConstructor; +import lombok.Getter; + +import java.util.UUID; + +@AllArgsConstructor +public class ClientGroup { + @Getter private final UUID id; + @Getter private final String name; + @Getter private final boolean hasPassword; + @Getter private final boolean persistent; + @Getter private final GroupType type; + + public static ClientGroup fromBytes(FriendlyByteBuf buf) { + return new ClientGroup( + buf.readUUID(), + buf.readUtf(512), + buf.readBoolean(), + buf.readBoolean(), + GroupType.values()[buf.readShort()] + ); + } +} diff --git a/src/main/java/land/chipmunk/chayapak/chomens_bot/data/voiceChat/GroupType.java b/src/main/java/land/chipmunk/chayapak/chomens_bot/data/voiceChat/GroupType.java new file mode 100644 index 0000000..6169f5e --- /dev/null +++ b/src/main/java/land/chipmunk/chayapak/chomens_bot/data/voiceChat/GroupType.java @@ -0,0 +1,7 @@ +package land.chipmunk.chayapak.chomens_bot.data.voiceChat; + +public enum GroupType { + NORMAL, + OPEN, + ISOLATED +} 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 3babb4a..70f7151 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 @@ -8,16 +8,22 @@ import com.github.steveice10.packetlib.event.session.DisconnectedEvent; import com.github.steveice10.packetlib.packet.Packet; import io.netty.buffer.Unpooled; import land.chipmunk.chayapak.chomens_bot.Bot; +import land.chipmunk.chayapak.chomens_bot.data.voiceChat.ClientGroup; 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.customPayload.JoinGroupPacket; +import land.chipmunk.chayapak.chomens_bot.voiceChat.customPayload.SecretPacket; import land.chipmunk.chayapak.chomens_bot.voiceChat.packets.*; +import lombok.Getter; import java.net.*; +import java.util.ArrayList; +import java.util.List; -// 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 +// ALMOST ALL of these codes are from the simple voice chat mod itself including the other voicechat classes +// mic packet exists but is never sent because i am too lazy to implement the player + evilbot already has a voicechat music player public class VoiceChatPlugin extends Bot.Listener { private final Bot bot; @@ -27,6 +33,8 @@ public class VoiceChatPlugin extends Bot.Listener { private boolean running = false; + @Getter private List<ClientGroup> groups = new ArrayList<>(); + public VoiceChatPlugin(Bot bot) { this.bot = bot; @@ -100,9 +108,36 @@ public class VoiceChatPlugin extends Bot.Listener { } } }).start(); + } else if (_packet.getChannel().equals("voicechat:add_group")) { + final byte[] bytes = _packet.getData(); + final FriendlyByteBuf buf = new FriendlyByteBuf(Unpooled.wrappedBuffer(bytes)); + + final ClientGroup group = ClientGroup.fromBytes(buf); + + groups.add(group); } } + public void joinGroup (String group, String password) { + final ClientGroup[] clientGroups = groups + .stream() + .filter(eachGroup -> eachGroup.name().equals(group)) + .toArray(ClientGroup[]::new); + + if (clientGroups.length == 0) throw new RuntimeException("Group " + group + " doesn't exist"); + + final ClientGroup clientGroup = clientGroups[0]; + + final FriendlyByteBuf buf = new FriendlyByteBuf(Unpooled.buffer()); + + new JoinGroupPacket(clientGroup.id(), password).toBytes(buf); + + bot.session().send(new ServerboundCustomPayloadPacket( + "voicechat:set_group", + buf.array() + )); + } + public void sendToServer (NetworkMessage message) { try { socket.send( @@ -144,6 +179,8 @@ public class VoiceChatPlugin extends Bot.Listener { public void disconnected(DisconnectedEvent event) { socket.close(); + groups.clear(); + running = false; } diff --git a/src/main/java/land/chipmunk/chayapak/chomens_bot/voiceChat/InitializationData.java b/src/main/java/land/chipmunk/chayapak/chomens_bot/voiceChat/InitializationData.java index 36c0aca..b3434e9 100644 --- a/src/main/java/land/chipmunk/chayapak/chomens_bot/voiceChat/InitializationData.java +++ b/src/main/java/land/chipmunk/chayapak/chomens_bot/voiceChat/InitializationData.java @@ -1,7 +1,7 @@ package land.chipmunk.chayapak.chomens_bot.voiceChat; import land.chipmunk.chayapak.chomens_bot.data.voiceChat.Codec; -import land.chipmunk.chayapak.chomens_bot.voiceChat.packets.SecretPacket; +import land.chipmunk.chayapak.chomens_bot.voiceChat.customPayload.SecretPacket; import lombok.Getter; import java.util.UUID; 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 3fa0d6a..33d45c0 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 @@ -39,7 +39,7 @@ public class NetworkMessage { static { packetRegistry = new HashMap<>(); -// packetRegistry.put((byte) 0x1, MicPacket.class); + packetRegistry.put((byte) 0x1, MicPacket.class); // packetRegistry.put((byte) 0x2, PlayerSoundPacket.class); // packetRegistry.put((byte) 0x3, GroupSoundPacket.class); // packetRegistry.put((byte) 0x4, LocationSoundPacket.class); diff --git a/src/main/java/land/chipmunk/chayapak/chomens_bot/voiceChat/customPayload/JoinGroupPacket.java b/src/main/java/land/chipmunk/chayapak/chomens_bot/voiceChat/customPayload/JoinGroupPacket.java new file mode 100644 index 0000000..d4cbc6e --- /dev/null +++ b/src/main/java/land/chipmunk/chayapak/chomens_bot/voiceChat/customPayload/JoinGroupPacket.java @@ -0,0 +1,34 @@ +package land.chipmunk.chayapak.chomens_bot.voiceChat.customPayload; + +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 JoinGroupPacket implements Packet<JoinGroupPacket> { + @Getter private UUID group; + @Getter private String password; + + public JoinGroupPacket () {} + + @Override + public JoinGroupPacket fromBytes(FriendlyByteBuf buf) { + group = buf.readUUID(); + if (buf.readBoolean()) { + password = buf.readUtf(512); + } + return this; + } + + @Override + public void toBytes(FriendlyByteBuf buf) { + buf.writeUUID(group); + buf.writeBoolean(password != null); + if (password != null) { + buf.writeUtf(password, 512); + } + } +} diff --git a/src/main/java/land/chipmunk/chayapak/chomens_bot/voiceChat/packets/SecretPacket.java b/src/main/java/land/chipmunk/chayapak/chomens_bot/voiceChat/customPayload/SecretPacket.java similarity index 95% rename from src/main/java/land/chipmunk/chayapak/chomens_bot/voiceChat/packets/SecretPacket.java rename to src/main/java/land/chipmunk/chayapak/chomens_bot/voiceChat/customPayload/SecretPacket.java index 38e69f4..e1b8c09 100644 --- a/src/main/java/land/chipmunk/chayapak/chomens_bot/voiceChat/packets/SecretPacket.java +++ b/src/main/java/land/chipmunk/chayapak/chomens_bot/voiceChat/customPayload/SecretPacket.java @@ -1,4 +1,4 @@ -package land.chipmunk.chayapak.chomens_bot.voiceChat.packets; +package land.chipmunk.chayapak.chomens_bot.voiceChat.customPayload; import land.chipmunk.chayapak.chomens_bot.data.voiceChat.Codec; import land.chipmunk.chayapak.chomens_bot.util.FriendlyByteBuf; diff --git a/src/main/java/land/chipmunk/chayapak/chomens_bot/voiceChat/packets/MicPacket.java b/src/main/java/land/chipmunk/chayapak/chomens_bot/voiceChat/packets/MicPacket.java new file mode 100644 index 0000000..753afe4 --- /dev/null +++ b/src/main/java/land/chipmunk/chayapak/chomens_bot/voiceChat/packets/MicPacket.java @@ -0,0 +1,31 @@ +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; + +@AllArgsConstructor +public class MicPacket implements Packet<MicPacket> { + @Getter private byte[] data; + @Getter private boolean whispering; + @Getter private long sequenceNumber; + + public MicPacket() {} + + @Override + public MicPacket fromBytes(FriendlyByteBuf buf) { + MicPacket soundPacket = new MicPacket(); + soundPacket.data = buf.readByteArray(); + soundPacket.sequenceNumber = buf.readLong(); + soundPacket.whispering = buf.readBoolean(); + return soundPacket; + } + + @Override + public void toBytes(FriendlyByteBuf buf) { + buf.writeByteArray(data); + buf.writeLong(sequenceNumber); + buf.writeBoolean(whispering); + } +}