Skip to content

Commit 364e7d6

Browse files
committed
Added 22w17a support
1 parent bdf7144 commit 364e7d6

41 files changed

Lines changed: 1116 additions & 89 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

java/src/me/dustin/chatbot/block/BlockPos.java

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
package me.dustin.chatbot.block;
22

3-
import java.util.Objects;
4-
53
public class BlockPos {
64
private int x, y, z;
75

java/src/me/dustin/chatbot/chat/ChatMessage.java

Lines changed: 31 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -24,22 +24,23 @@ public ChatMessage(String senderName, String body) {
2424
this.body = body;
2525
}
2626

27-
public String getMessage() {
28-
if (senderName.isEmpty())
29-
return body;
30-
return senderName + " " + body;
31-
}
32-
33-
public String getSenderName() {
34-
return senderName;
35-
}
36-
37-
public String getBody() {
38-
return body;
27+
public static ChatMessage of(String jsonData) {
28+
parsingMessage.senderName = "";
29+
parsingMessage.body = "";
30+
parsingMessage.body = parse(GeneralHelper.gson.fromJson(jsonData, JsonObject.class));
31+
String body = parsingMessage.body;
32+
if (body.startsWith("<") && body.contains("> ") && parsingMessage.senderName.isEmpty()) {//crude way to move player name to actual name field if the text is set up weird
33+
String s = body.split("<")[1].split(">")[0];
34+
parsingMessage.senderName = s;
35+
parsingMessage.body = body.replace("<" + s + "> ", "");
36+
}
37+
return parsingMessage;
3938
}
4039

4140
public static String parse(JsonElement element) {
4241
StringJoiner sj = new StringJoiner(" ");
42+
if (element == null)
43+
return "";
4344
if (element.isJsonPrimitive())
4445
return element.getAsString();
4546
if (!element.isJsonObject()) {
@@ -90,20 +91,6 @@ public static String parse(JsonElement element) {
9091
}
9192
}
9293

93-
public static ChatMessage of(String jsonData) {
94-
parsingMessage.senderName = "";
95-
parsingMessage.body = "";
96-
JsonObject jsonObject = GeneralHelper.gson.fromJson(jsonData, JsonObject.class);
97-
parsingMessage.body = parse(jsonObject);
98-
String body = parsingMessage.body;
99-
if (body.startsWith("<") && body.contains("> ") && parsingMessage.senderName.toString().isEmpty()) {//crude way to move player name to actual name field if the text is set up weird
100-
String s = body.split("<")[1].split(">")[0];
101-
parsingMessage.senderName = s;
102-
parsingMessage.body = body.replace("<" + s + "> ", "");
103-
}
104-
return parsingMessage;
105-
}
106-
10794
private static String getExtra(JsonObject jsonObject) {
10895
StringBuilder s = new StringBuilder();
10996
JsonArray extra = jsonObject.getAsJsonArray("extra");
@@ -147,6 +134,24 @@ private static String removeFormatCodes(String s) {
147134
return s.replace("§k", "").replace("§l", "").replace("§m", "").replace("§n", "").replace("§o", "").replace("§r", "");
148135
}
149136

137+
public String getMessage() {
138+
if (senderName.isEmpty())
139+
return body;
140+
return senderName + " " + body;
141+
}
142+
143+
public String getSenderName() {
144+
return senderName;
145+
}
146+
147+
public String getBody() {
148+
return body;
149+
}
150+
151+
public void setSenderName(String senderName) {
152+
this.senderName = senderName;
153+
}
154+
150155
public enum TextColor {
151156
DARK_RED("dark_red", '4', "\u001B[31m", new Color(170, 0, 0)),
152157
RED("red", 'c', "\u001B[31m", new Color(255, 85, 85)),
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
package me.dustin.chatbot.chat;
2+
3+
import java.util.UUID;
4+
5+
public record ChatSender(UUID uuid, String name) {
6+
}

java/src/me/dustin/chatbot/chat/Translator.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ public static void setTranslation(String translation) {
1212
try {
1313
String v = ProtocolHandler.getCurrent().getName().replace(".", "_");
1414
if (v.contains("pre") || v.contains("w"))
15-
v = "1_18";
15+
v = "1_19";
1616
//fat fuckin mess to create the version id needed for the link, i.e. 1_12 from 1.12.2
1717
if (v.split("_").length > 2)
1818
v = v.split("_")[0] + "_" + v.split("_")[1];

java/src/me/dustin/chatbot/command/CommandManager.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ public void init() {
6666
private final EventListener<EventReceiveChatMessage> eventReceiveChatMessageEventListener = new EventListener<>(event -> {
6767
boolean directMessage = false;
6868
ClientBoundChatMessagePacket clientBoundChatMessagePacket = event.getChatMessagePacket();
69-
UUID sender = clientBoundChatMessagePacket.getSender();
69+
UUID sender = clientBoundChatMessagePacket.getSender().uuid();
7070
String string = GeneralHelper.strip(event.getChatMessagePacket().getMessage().getBody());
7171
String[] sA = string.split(" ");
7272
if (sA.length > 2 && sA[1].equalsIgnoreCase("whispers:")) {

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

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,14 @@
11
package me.dustin.chatbot.entity.player;
22

33
import me.dustin.chatbot.ChatBot;
4+
import me.dustin.chatbot.helper.KeyHelper;
45
import me.dustin.chatbot.helper.StopWatch;
56
import me.dustin.chatbot.network.ClientConnection;
67
import me.dustin.chatbot.network.ProtocolHandler;
8+
import me.dustin.chatbot.network.key.SaltAndSig;
79
import me.dustin.chatbot.network.packet.impl.play.c2s.*;
810

11+
import java.time.Instant;
912
import java.util.UUID;
1013

1114
public class ClientPlayer {
@@ -65,7 +68,9 @@ public void chat(String message) {
6568
if ((!ChatBot.getConfig().isRepeatMessages() && lastMessage.equalsIgnoreCase(message)) || !messageStopwatch.hasPassed(ChatBot.getConfig().getMessageDelay())) {
6669
return;
6770
}
68-
getClientConnection().sendPacket(new ServerBoundChatPacket((ChatBot.getConfig().isGreenText() && !message.startsWith("/") ? ">" : "") + message));
71+
Instant instant = Instant.now();
72+
SaltAndSig saltAndSig = getClientConnection().getKeyContainer() == null ? null : KeyHelper.sigForMessage(instant, message, getClientConnection().getKeyContainer().privateKey(), getUuid());
73+
getClientConnection().sendPacket(new ServerBoundChatPacket((ChatBot.getConfig().isGreenText() && !message.startsWith("/") ? ">" : "") + message, instant, saltAndSig));
6974
messageStopwatch.reset();
7075
lastMessage = message;
7176
}

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

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,9 @@
33
import me.dustin.chatbot.ChatBot;
44
import me.dustin.chatbot.event.EventAddPlayer;
55
import me.dustin.chatbot.event.EventRemovePlayer;
6+
import me.dustin.chatbot.helper.KeyHelper;
67
import me.dustin.chatbot.network.ClientConnection;
8+
import me.dustin.chatbot.network.key.SaltAndSig;
79
import me.dustin.chatbot.network.packet.impl.play.c2s.ServerBoundChatPacket;
810
import me.dustin.events.core.EventListener;
911
import me.dustin.events.core.annotate.EventPointer;
@@ -13,6 +15,7 @@
1315
import java.awt.*;
1416
import java.awt.event.KeyAdapter;
1517
import java.awt.event.KeyEvent;
18+
import java.time.Instant;
1619

1720
public class ChatBotGui extends JFrame {
1821
private final CustomTextPane output;
@@ -60,15 +63,23 @@ public ChatBotGui() {
6063
@Override
6164
public void keyPressed(KeyEvent e) {
6265
if (e.getKeyCode() == 10) {//they pressed enter
63-
if (ChatBot.getClientConnection() != null)
64-
ChatBot.getClientConnection().sendPacket(new ServerBoundChatPacket(input.getText()));
66+
if (ChatBot.getClientConnection() != null) {
67+
Instant instant = Instant.now();
68+
String message = input.getText();
69+
SaltAndSig saltAndSig = ChatBot.getClientConnection().getKeyContainer() == null ? null : KeyHelper.sigForMessage(instant, message, ChatBot.getClientConnection().getKeyContainer().privateKey(), ChatBot.getClientConnection().getClientPlayer().getUuid());
70+
ChatBot.getClientConnection().sendPacket(new ServerBoundChatPacket(message, instant, saltAndSig));
71+
}
6572
input.setText("");
6673
}
6774
}
6875
});
6976
sendButton.addActionListener(actionEvent -> {
70-
if (ChatBot.getClientConnection() != null)
71-
ChatBot.getClientConnection().sendPacket(new ServerBoundChatPacket(input.getText()));
77+
if (ChatBot.getClientConnection() != null) {
78+
Instant instant = Instant.now();
79+
String message = input.getText();
80+
SaltAndSig saltAndSig = ChatBot.getClientConnection().getKeyContainer() == null ? null : KeyHelper.sigForMessage(instant, message, ChatBot.getClientConnection().getKeyContainer().privateKey(), ChatBot.getClientConnection().getClientPlayer().getUuid());
81+
ChatBot.getClientConnection().sendPacket(new ServerBoundChatPacket(message, instant, saltAndSig));
82+
}
7283
this.input.setText("");
7384
});
7485
this.addWindowListener(new java.awt.event.WindowAdapter() {
Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,111 @@
1+
package me.dustin.chatbot.helper;
2+
3+
import com.google.common.primitives.Longs;
4+
import me.dustin.chatbot.network.key.KeyContainer;
5+
import me.dustin.chatbot.network.key.KeyPairResponse;
6+
import me.dustin.chatbot.network.key.PublicKeyContainer;
7+
import me.dustin.chatbot.network.key.SaltAndSig;
8+
9+
import java.nio.ByteBuffer;
10+
import java.nio.ByteOrder;
11+
import java.nio.charset.StandardCharsets;
12+
import java.security.*;
13+
import java.security.spec.EncodedKeySpec;
14+
import java.security.spec.PKCS8EncodedKeySpec;
15+
import java.time.Instant;
16+
import java.util.Base64;
17+
import java.util.HashMap;
18+
import java.util.Map;
19+
import java.util.UUID;
20+
21+
public class KeyHelper {
22+
23+
public static KeyPairResponse getKeyPairResponse(String accessToken) {
24+
Map<String, String> headers = new HashMap<>();
25+
headers.put("Content-Type", "application/json; charset=utf-8");
26+
headers.put("Content-Length", "0");
27+
headers.put("Authorization", "Bearer " + accessToken);
28+
GeneralHelper.HttpResponse httpResponse = GeneralHelper.httpRequest("https://api.minecraftservices.com/player/certificates", null, headers, "POST");
29+
return GeneralHelper.gson.fromJson(httpResponse.data(), KeyPairResponse.class);
30+
}
31+
32+
public static SaltAndSig sigForMessage(Instant instant, String string, PrivateKey privateKey, UUID uuid) {
33+
try {
34+
Signature signature = getSignature(privateKey);
35+
if (signature != null) {
36+
long l = new SecureRandom().nextLong();
37+
updateSig(signature, l, uuid, instant, string);
38+
return new SaltAndSig(l, signature.sign());
39+
}
40+
} catch (GeneralSecurityException var6) {
41+
System.out.println("Failed to sign chat message");
42+
}
43+
44+
return new SaltAndSig(0L, new byte[0]);
45+
}
46+
47+
private static void updateSig(Signature signature, long l, UUID uUID, Instant instant, String string) throws SignatureException {
48+
signature.update(Longs.toByteArray(l));
49+
signature.update(uuidToBytes(uUID.getMostSignificantBits(), uUID.getLeastSignificantBits()));
50+
signature.update(Longs.toByteArray(instant.getEpochSecond()));
51+
signature.update(string.getBytes(StandardCharsets.UTF_8));
52+
}
53+
54+
private static byte[] uuidToBytes(long l, long m) {
55+
ByteBuffer byteBuffer = ByteBuffer.allocate(16).order(ByteOrder.BIG_ENDIAN);
56+
byteBuffer.putLong(l).putLong(m);
57+
return byteBuffer.array();
58+
}
59+
60+
public static KeyContainer getKeyContainer(KeyPairResponse keyPairResponse) {
61+
return new KeyContainer(getPrivateKey(keyPairResponse.getPrivateKey()), new PublicKeyContainer(Instant.parse(keyPairResponse.getExpiresAt()), keyPairResponse.getPublicKey(), keyPairResponse.getPublicKeySignature()), Instant.parse(keyPairResponse.getRefreshedAfter()));
62+
}
63+
64+
private static Signature getSignature(PrivateKey privateKey) throws GeneralSecurityException {
65+
if (privateKey == null) {
66+
return null;
67+
} else {
68+
Signature signature = Signature.getInstance("SHA1withRSA");
69+
signature.initSign(privateKey);
70+
return signature;
71+
}
72+
}
73+
74+
public static PrivateKey getPrivateKey(String s) {
75+
return decodePrivateKey(s);
76+
}
77+
78+
private static PrivateKey createKey(byte[] bs) {
79+
try {
80+
EncodedKeySpec encodedKeySpec = new PKCS8EncodedKeySpec(bs);
81+
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
82+
return keyFactory.generatePrivate(encodedKeySpec);
83+
} catch (Exception e) {
84+
e.printStackTrace();
85+
}
86+
return null;
87+
}
88+
89+
private static PrivateKey decodePrivateKey(String string) {
90+
int i = string.indexOf("-----BEGIN RSA PRIVATE KEY-----");
91+
if (i != -1) {
92+
i += "-----BEGIN RSA PRIVATE KEY-----".length();
93+
int j = string.indexOf("-----END RSA PRIVATE KEY-----", i);
94+
string = string.substring(i, j + 1);
95+
}
96+
97+
return createKey(Base64.getMimeDecoder().decode(string));
98+
}
99+
100+
public static String decodePublicKey(String string) {
101+
int i = string.indexOf("-----BEGIN RSA PUBLIC KEY-----");
102+
if (i != -1) {
103+
i += "-----BEGIN RSA PUBLIC KEY-----".length();
104+
int j = string.indexOf("-----END RSA PUBLIC KEY-----", i);
105+
string = string.substring(i, j + 1);
106+
}
107+
108+
return string;
109+
}
110+
111+
}
Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
package me.dustin.chatbot.nbt;
2+
3+
import java.lang.reflect.Array;
4+
import java.util.AbstractList;
5+
6+
public abstract class AbstractNbtList<T extends NbtElement> extends AbstractList<T> implements NbtElement {
7+
public AbstractNbtList() {
8+
}
9+
10+
public abstract T set(int i, T nbtElement);
11+
12+
public abstract void add(int i, T nbtElement);
13+
14+
public abstract T remove(int i);
15+
16+
public abstract boolean setElement(int index, NbtElement element);
17+
18+
public abstract boolean addElement(int index, NbtElement element);
19+
20+
public abstract byte getHeldType();
21+
22+
public byte[] add(final byte[] array, final int index, final byte element) {
23+
return (byte[]) add(array, index, Byte.valueOf(element), Byte.TYPE);
24+
}
25+
26+
public int[] add(final int[] array, final int index, final int element) {
27+
return (int[]) add(array, index, Integer.valueOf(element), Integer.TYPE);
28+
}
29+
30+
public long[] add(final long[] array, final int index, final long element) {
31+
return (long[]) add(array, index, Long.valueOf(element), Long.TYPE);
32+
}
33+
34+
private Object add(final Object array, final int index, final Object element, final Class<?> clss) {
35+
if (array == null) {
36+
if (index != 0) {
37+
throw new IndexOutOfBoundsException("Index: " + index + ", Length: 0");
38+
}
39+
final Object joinedArray = Array.newInstance(clss, 1);
40+
Array.set(joinedArray, 0, element);
41+
return joinedArray;
42+
}
43+
final int length = Array.getLength(array);
44+
if (index > length || index < 0) {
45+
throw new IndexOutOfBoundsException("Index: " + index + ", Length: " + length);
46+
}
47+
final Object result = Array.newInstance(clss, length + 1);
48+
System.arraycopy(array, 0, result, 0, index);
49+
Array.set(result, index, element);
50+
if (index < length) {
51+
System.arraycopy(array, index, result, index + 1, length - index);
52+
}
53+
return result;
54+
}
55+
56+
public byte[] remove(final byte[] array, final int index) {
57+
return (byte[]) remove((Object) array, index);
58+
}
59+
60+
public int[] remove(final int[] array, final int index) {
61+
return (int[]) remove((Object) array, index);
62+
}
63+
64+
public long[] remove(final long[] array, final int index) {
65+
return (long[]) remove((Object) array, index);
66+
}
67+
68+
private Object remove(final Object array, final int index) {
69+
final int length = getLength(array);
70+
if (index < 0 || index >= length) {
71+
throw new IndexOutOfBoundsException("Index: " + index + ", Length: " + length);
72+
}
73+
74+
final Object result = Array.newInstance(array.getClass().getComponentType(), length - 1);
75+
System.arraycopy(array, 0, result, 0, index);
76+
if (index < length - 1) {
77+
System.arraycopy(array, index + 1, result, index, length - index - 1);
78+
}
79+
80+
return result;
81+
}
82+
83+
private int getLength(final Object array) {
84+
if (array == null) {
85+
return 0;
86+
}
87+
return Array.getLength(array);
88+
}
89+
}

0 commit comments

Comments
 (0)