Skip to content

Commit 2f1f2ac

Browse files
committed
22w18a
1 parent 145f374 commit 2f1f2ac

10 files changed

Lines changed: 84 additions & 19 deletions

File tree

java/src/me/dustin/chatbot/entity/player/ClientPlayer.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -68,8 +68,7 @@ public void chat(String message) {
6868
if ((!ChatBot.getConfig().isRepeatMessages() && lastMessage.equalsIgnoreCase(message)) || !messageStopwatch.hasPassed(ChatBot.getConfig().getMessageDelay())) {
6969
return;
7070
}
71-
Instant instant = Instant.now();
72-
getClientConnection().sendPacket(new ServerBoundChatPacket((ChatBot.getConfig().isGreenText() && !message.startsWith("/") ? ">" : "") + message, instant, KeyHelper.generateSaltAndSig(instant, message)));
71+
getClientConnection().sendChat((ChatBot.getConfig().isGreenText() && !message.startsWith("/") ? ">" : "") + message);
7372
messageStopwatch.reset();
7473
lastMessage = message;
7574
}

java/src/me/dustin/chatbot/gui/ChatBotGui.java

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -64,19 +64,15 @@ public ChatBotGui() {
6464
public void keyPressed(KeyEvent e) {
6565
if (e.getKeyCode() == 10) {//they pressed enter
6666
if (ChatBot.getClientConnection() != null) {
67-
Instant instant = Instant.now();
68-
String message = input.getText();
69-
ChatBot.getClientConnection().sendPacket(new ServerBoundChatPacket(message, instant, KeyHelper.generateSaltAndSig(instant, message)));
67+
ChatBot.getClientConnection().sendChat(input.getText());
7068
}
7169
input.setText("");
7270
}
7371
}
7472
});
7573
sendButton.addActionListener(actionEvent -> {
7674
if (ChatBot.getClientConnection() != null) {
77-
Instant instant = Instant.now();
78-
String message = input.getText();
79-
ChatBot.getClientConnection().sendPacket(new ServerBoundChatPacket(message, instant, KeyHelper.generateSaltAndSig(instant, message)));
75+
ChatBot.getClientConnection().sendChat(input.getText());
8076
}
8177
this.input.setText("");
8278
});

java/src/me/dustin/chatbot/helper/KeyHelper.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ public static SaltAndSig sigForMessage(Instant instant, String string, PrivateKe
3737
Signature signature = getSignature(privateKey);
3838
if (signature != null) {
3939
long l = nextLong();
40-
updateSig(signature, l, uuid, instant, string);
40+
updateSig(signature, l, uuid, instant, String.format("{\"text\":\"%s\"}", string));
4141
return new SaltAndSig(l, signature.sign());
4242
}
4343
} catch (GeneralSecurityException var6) {
@@ -72,7 +72,7 @@ public static Signature getSignature(PrivateKey privateKey) throws GeneralSecuri
7272
if (privateKey == null) {
7373
return null;
7474
} else {
75-
Signature signature = Signature.getInstance("SHA1withRSA");
75+
Signature signature = Signature.getInstance("SHA256withRSA");
7676
signature.initSign(privateKey);
7777
return signature;
7878
}
@@ -88,7 +88,7 @@ public static PrivateKey getPrivateKey(String s) {
8888

8989
private static PrivateKey createKey(byte[] bs) {
9090
try {
91-
EncodedKeySpec encodedKeySpec = new PKCS8EncodedKeySpec(bs);
91+
PKCS8EncodedKeySpec encodedKeySpec = new PKCS8EncodedKeySpec(bs);
9292
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
9393
return keyFactory.generatePrivate(encodedKeySpec);
9494
} catch (Exception e) {

java/src/me/dustin/chatbot/network/ClientConnection.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,13 +17,15 @@
1717
import me.dustin.chatbot.helper.StopWatch;
1818
import me.dustin.chatbot.helper.TPSHelper;
1919
import me.dustin.chatbot.network.key.KeyContainer;
20+
import me.dustin.chatbot.network.key.SaltAndSig;
2021
import me.dustin.chatbot.network.packet.Packet;
2122
import me.dustin.chatbot.network.packet.impl.handshake.ServerBoundHandshakePacket;
2223
import me.dustin.chatbot.network.packet.impl.login.c2s.ServerBoundLoginStartPacket;
2324
import me.dustin.chatbot.network.crypt.PacketCrypt;
2425
import me.dustin.chatbot.network.packet.handler.LoginClientBoundPacketHandler;
2526
import me.dustin.chatbot.network.packet.handler.ClientBoundPacketHandler;
2627
import me.dustin.chatbot.network.packet.impl.play.c2s.ServerBoundChatPacket;
28+
import me.dustin.chatbot.network.packet.impl.play.c2s.ServerBoundCommandPacket;
2729
import me.dustin.chatbot.network.packet.pipeline.PacketDecryptor;
2830
import me.dustin.chatbot.network.packet.pipeline.PacketDeflater;
2931
import me.dustin.chatbot.network.packet.pipeline.PacketEncryptor;
@@ -39,6 +41,7 @@
3941
import me.dustin.events.core.annotate.EventPointer;
4042

4143
import java.io.IOException;
44+
import java.time.Instant;
4245
import java.util.HashMap;
4346
import java.util.Map;
4447
import java.util.Queue;
@@ -193,6 +196,16 @@ public void updateTranslations() {
193196
Translator.setTranslation(ChatBot.getConfig().getLocale());
194197
}
195198

199+
public void sendChat(String message) {
200+
Instant instant = Instant.now();
201+
if (message.startsWith("/") && ProtocolHandler.getCurrent().getProtocolVer() > ProtocolHandler.getVersionFromName("1.18.2").getProtocolVer()) {
202+
SaltAndSig.SaltAndSigs saltAndSigs = SaltAndSig.SaltAndSigs.EMPTY;
203+
sendPacket(new ServerBoundCommandPacket(message.substring(1), instant, saltAndSigs));
204+
return;
205+
}
206+
ChatBot.getClientConnection().sendPacket(new ServerBoundChatPacket(message, instant, KeyHelper.generateSaltAndSig(instant, message)));
207+
}
208+
196209
public void tick() {
197210
while (isConnected()) {
198211
if (tickWatch.hasPassed(50)) {//only tick 20 times per second, just like normal mc

java/src/me/dustin/chatbot/network/key/SaltAndSig.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22

33
import me.dustin.chatbot.network.packet.pipeline.PacketByteBuf;
44

5+
import java.util.Map;
6+
57
public record SaltAndSig(long salt, byte[] signature){
68
public static final SaltAndSig EMPTY = new SaltAndSig(0L, new byte[0]);
79
public static SaltAndSig from(PacketByteBuf buf) {
@@ -12,4 +14,16 @@ public void write(PacketByteBuf packetByteBuf) {
1214
packetByteBuf.writeLong(this.salt());
1315
packetByteBuf.writeByteArray(this.signature());
1416
}
17+
18+
public record SaltAndSigs(long salt, Map<String, byte[]> signatures){
19+
public static final SaltAndSigs EMPTY = new SaltAndSigs(0L, Map.of());
20+
public static SaltAndSig from(PacketByteBuf buf) {
21+
return new SaltAndSig(buf.readLong(), buf.readByteArray());
22+
}
23+
24+
public void write(PacketByteBuf packetByteBuf) {
25+
packetByteBuf.writeLong(this.salt());
26+
packetByteBuf.writeMap(signatures(), (packetByteBuf1, s) -> packetByteBuf1.writeString(s, 16), PacketByteBuf::writeByteArray);
27+
}
28+
}
1529
}

java/src/me/dustin/chatbot/network/packet/impl/play/c2s/ServerBoundChatPacket.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,11 +30,10 @@ public ServerBoundChatPacket(String message, Instant instant, SaltAndSig saltAnd
3030

3131
@Override
3232
public void createPacket(PacketByteBuf packetByteBuf) throws IOException {
33+
packetByteBuf.writeString(message);
3334
if (ProtocolHandler.getCurrent().getProtocolVer() > ProtocolHandler.getVersionFromName("1.18.2").getProtocolVer()) {
3435
packetByteBuf.writeLong(instant.getEpochSecond());
35-
packetByteBuf.writeString(message);
3636
saltAndSig.write(packetByteBuf);
37-
} else
38-
packetByteBuf.writeString(message);
37+
}
3938
}
4039
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package me.dustin.chatbot.network.packet.impl.play.c2s;
2+
3+
import me.dustin.chatbot.network.ProtocolHandler;
4+
import me.dustin.chatbot.network.key.SaltAndSig;
5+
import me.dustin.chatbot.network.packet.Packet;
6+
import me.dustin.chatbot.network.packet.pipeline.PacketByteBuf;
7+
8+
import java.time.Instant;
9+
10+
public class ServerBoundCommandPacket extends Packet {
11+
private final String command;
12+
private final Instant timestamp;
13+
private final SaltAndSig.SaltAndSigs saltAndSigs;
14+
public ServerBoundCommandPacket(String command, Instant timestamp, SaltAndSig.SaltAndSigs saltAndSigs) {
15+
super(ProtocolHandler.getCurrent().getPacketId(ProtocolHandler.NetworkSide.SERVERBOUND, "command_message"));
16+
this.command = command;
17+
this.timestamp = timestamp;
18+
this.saltAndSigs = saltAndSigs;
19+
}
20+
21+
@Override
22+
public void createPacket(PacketByteBuf packetByteBuf) {
23+
packetByteBuf.writeString(command);
24+
packetByteBuf.writeLong(timestamp.getEpochSecond());
25+
saltAndSigs.write(packetByteBuf);
26+
}
27+
}

java/src/me/dustin/chatbot/network/packet/impl/play/s2c/ClientBoundChatMessagePacket.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ public class ClientBoundChatMessagePacket extends Packet.ClientBoundPacket {
3131
private final ChatSender sender;
3232
private final Instant expiresAt;
3333
private final SaltAndSig saltAndSig;
34+
private final ChatMessage teamName;
3435

3536
public ClientBoundChatMessagePacket(PacketByteBuf packetByteBuf) {
3637
super(packetByteBuf);
@@ -52,11 +53,17 @@ else if (!this.message.getSenderName().isEmpty()) {
5253
if (ProtocolHandler.getCurrent().getProtocolVer() > ProtocolHandler.getVersionFromName("1.18.2").getProtocolVer()) {
5354
name = ChatMessage.parse(GeneralHelper.gson.fromJson(packetByteBuf.readString(), JsonObject.class));
5455
this.message.setSenderName(name);
56+
boolean isTeam = packetByteBuf.readBoolean();
57+
if (isTeam)
58+
this.teamName = ChatMessage.of(packetByteBuf.readString());
59+
else
60+
teamName = null;
5561
this.expiresAt = Instant.ofEpochSecond(packetByteBuf.readLong());
5662
this.saltAndSig = SaltAndSig.from(packetByteBuf);
5763
} else {
5864
expiresAt = Instant.now();
5965
saltAndSig = new SaltAndSig(0L, new byte[0]);
66+
teamName = null;
6067
}
6168
this.sender = new ChatSender(uuid, name);
6269
}

java/src/me/dustin/chatbot/process/impl/CrackedLoginProcess.java

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -29,17 +29,15 @@ public void init() {
2929
for (String s : ChatBot.getConfig().getPasswordKeywords()) {
3030
if (chatMessage.getBody().contains(s)) {
3131
String message = ChatBot.getConfig().getPasswordCreateCommand() + " " + ChatBot.getConfig().getCrackedLoginPassword() + (ChatBot.getConfig().isPasswordCreateUseTwice() ? " " + ChatBot.getConfig().getCrackedLoginPassword() : "");
32-
Instant instant = Instant.now();
33-
getClientConnection().sendPacket(new ServerBoundChatPacket(message, instant, KeyHelper.generateSaltAndSig(instant, message)));
32+
ChatBot.getClientConnection().sendChat(message);
3433
stop();
3534
return;
3635
}
3736
}
3837
for (String s : ChatBot.getConfig().getLoginKeywords()) {
3938
if (chatMessage.getBody().contains(s)) {
4039
String message = ChatBot.getConfig().getLoginCommand() + " " + ChatBot.getConfig().getCrackedLoginPassword();
41-
Instant instant = Instant.now();
42-
getClientConnection().sendPacket(new ServerBoundChatPacket(message, instant, KeyHelper.generateSaltAndSig(instant, message)));
40+
ChatBot.getClientConnection().sendChat(message);
4341
stop();
4442
return;
4543
}

versions/protocol_versions.json

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,22 @@
11
{
2+
"839": {
3+
"name": "22w18a",
4+
"protocol_id": 1073741907,
5+
"packets": {
6+
"c2s": ["confirm_teleport", "block_nbt", "difficulty", "command_message", "chat_message", "client_action", "settings", "chat_suggestions", "container_button", "container_click", "close_container", "plugin", "book", "entity_nbt", "entity_interact", "generate_structure", "heartbeat", "lock_difficulty", "position", "position_rotation", "rotation", "ground_change", "move_vehicle", "steer_boat", "item_pick", "crafting_recipe", "toggle_fly", "player_action", "entity_action", "steer_vehicle", "pong", "displayed_recipe", "recipe_book", "anvil_item_name", "resourcepack", "advancement_tab", "trade", "beacon_effect", "hotbar_slot", "command_block", "minecart_command_block", "item_stack_create", "jigsaw_block", "structure_block", "sign_text", "swing_arm", "entity_spectate", "block_interact", "use_item"],
7+
"s2c": [
8+
"entity_object_spawn", "entity_experience_orb", "entity_player", "entity_animation", "statistics", "block_break", "block_break_animation", "block_data", "block_action", "block", "bossbar", "difficulty", "clear_title", "chat_suggestions", "commands", "close_container", "container_items", "container_properties", "container_item", "item_cooldown", "plugin", "named_sound", "kick", "entity_status", "explosion", "unload_chunk", "game_event", "open_horse_container", "initialize_world_border", "heartbeat", "chunk", "world_event", "particle", "chunk_light", "initialize", "map", "villager_trades", "relative_move", "movement_rotation", "rotation", "move_vehicle", "book", "open_container", "sign_editor", "ping", "crafting_recipe", "player_abilities", "chat_message", "end_combat_event", "enter_combat_event", "kill_combat_event", "tab_list", "player_face", "position_rotation", "unlock_recipes", "entity_destroy", "entity_remove_effect", "resourcepack", "respawn", "head_rotation", "blocks", "advancement_tab", "hotbar_text", "center_world_border", "interpolate_world_border", "size_world_border", "warn_time_world_border", "warn_blocks_world_border", "camera", "hotbar_slot", "chunk_center", "view_distance", "compass_position", "objective_position", "entity_data", "entity_attach", "velocity", "entity_equipment", "experience", "health", "objective", "entity_passenger", "teams", "scoreboard_score", "simulation_distance", "subtitle", "time", "title_text", "title_times", "entity_sound", "sound_event", "stop_sound", "game_message", "tab_list_text", "nbt_response", "entity_collect", "teleport", "advancements", "entity_attributes", "entity_effect", "recipes", "tags"
9+
]
10+
}
11+
},
212
"838": {
313
"name":"22w17a",
414
"protocol_id":1073741906,
515
"packets": {
616
"c2s": ["confirm_teleport","block_nbt","difficulty","chat_message","client_action","settings","chat_suggestions","container_button","container_click","close_container","plugin","book","entity_nbt","entity_interact","generate_structure","heartbeat","lock_difficulty","position","position_rotation","rotation","ground_change","move_vehicle","steer_boat","item_pick","crafting_recipe","toggle_fly","player_action","entity_action","steer_vehicle","pong","displayed_recipe","recipe_book","anvil_item_name","resourcepack","advancement_tab","trade","beacon_effect","hotbar_slot","command_block","minecart_command_block","item_stack_create","jigsaw_block","structure_block","sign_text","swing_arm","entity_spectate","block_interact","use_item"],
7-
"s2c": ["entity_object_spawn","entity_experience_orb","entity_player","entity_animation","statistics","block_break","block_break_animation","block_data","block_action","block","bossbar","difficulty","clear_title","chat_suggestions","commands","close_container","container_items","container_properties","container_item","item_cooldown","plugin","named_sound","kick","entity_status","explosion","unload_chunk","game_event","open_horse_container","initialize_world_border","heartbeat","chunk","world_event","particle","chunk_light","initialize","map","villager_trades","relative_move","movement_rotation","rotation","move_vehicle","book","open_container","sign_editor","ping","crafting_recipe","player_abilities","chat_message","end_combat_event","enter_combat_event","kill_combat_event","tab_list","player_face","position_rotation","unlock_recipes","entity_destroy","entity_remove_effect","resourcepack","respawn","head_rotation","blocks","advancement_tab","hotbar_text","center_world_border","interpolate_world_border","size_world_border","warn_time_world_border","warn_blocks_world_border","camera","hotbar_slot","chunk_center","view_distance","compass_position","objective_position","entity_data","entity_attach","velocity","entity_equipment","experience","health","objective","entity_passenger","teams","scoreboard_score","simulation_distance","subtitle","time","title_text","title_times","entity_sound","sound_event","stop_sound","game_message","tab_list_text","nbt_response","entity_collect","teleport","advancements","entity_attributes","entity_effect","recipes","tags"]
17+
"s2c": [
18+
"entity_object_spawn","entity_experience_orb","entity_player","entity_animation","statistics","block_break","block_break_animation","block_data","block_action","block","bossbar","difficulty","clear_title","chat_suggestions","commands","close_container","container_items","container_properties","container_item","item_cooldown","plugin","named_sound","kick","entity_status","explosion","unload_chunk","game_event","open_horse_container","initialize_world_border","heartbeat","chunk","world_event","particle","chunk_light","initialize","map","villager_trades","relative_move","movement_rotation","rotation","move_vehicle","book","open_container","sign_editor","ping","crafting_recipe","player_abilities","chat_message","end_combat_event","enter_combat_event","kill_combat_event","tab_list","player_face","position_rotation","unlock_recipes","entity_destroy","entity_remove_effect","resourcepack","respawn","head_rotation","blocks","advancement_tab","hotbar_text","center_world_border","interpolate_world_border","size_world_border","warn_time_world_border","warn_blocks_world_border","camera","hotbar_slot","chunk_center","view_distance","compass_position","objective_position","entity_data","entity_attach","velocity","entity_equipment","experience","health","objective","entity_passenger","teams","scoreboard_score","simulation_distance","subtitle","time","title_text","title_times","entity_sound","sound_event","stop_sound","game_message","tab_list_text","nbt_response","entity_collect","teleport","advancements","entity_attributes","entity_effect","recipes","tags"
19+
]
820
}
921
},
1022
"837": {

0 commit comments

Comments
 (0)