Done receive message

This commit is contained in:
ReinforceZwei 2023-01-10 20:43:54 +08:00
parent 657fc6117b
commit 08da49756f
2 changed files with 40 additions and 10 deletions

View file

@ -240,6 +240,18 @@ namespace MinecraftClient.Protocol.Handlers
return ReadData(len, cache); return ReadData(len, cache);
} }
/// <summary>
/// Read a byte array with given length from a cache of bytes and remove it from the cache
/// </summary>
/// <param name="cache">Cache of bytes to read from</param>
/// <param name="length">Length of the bytes array</param>
/// <returns>The byte array</returns>
[MethodImpl(MethodImplOptions.AggressiveInlining | MethodImplOptions.AggressiveOptimization)]
public byte[] ReadNextByteArray(Queue<byte> cache, int length)
{
return ReadData(length, cache);
}
/// <summary> /// <summary>
/// Reads a length-prefixed array of unsigned long integers and removes it from the cache /// Reads a length-prefixed array of unsigned long integers and removes it from the cache
/// </summary> /// </summary>

View file

@ -522,12 +522,14 @@ namespace MinecraftClient.Protocol.Handlers
} }
else // 1.19.1 + else // 1.19.1 +
{ {
// 1.19.3+
if (protocolVersion >= MC_1_19_3_Version) if (protocolVersion >= MC_1_19_3_Version)
{ {
// Header section // Header section
Guid senderUUID = dataTypes.ReadNextUUID(packetData); Guid senderUUID = dataTypes.ReadNextUUID(packetData);
int index = dataTypes.ReadNextVarInt(packetData); int index = dataTypes.ReadNextVarInt(packetData);
byte[]? messageSignature = dataTypes.ReadNextBool(packetData) ? dataTypes.ReadNextByteArray(packetData) : null; // Signature is fixed size of 256 bytes
byte[]? messageSignature = dataTypes.ReadNextBool(packetData) ? dataTypes.ReadNextByteArray(packetData, 256) : null;
// Body // Body
string message = dataTypes.ReadNextString(packetData); string message = dataTypes.ReadNextString(packetData);
@ -541,8 +543,8 @@ namespace MinecraftClient.Protocol.Handlers
for (int i = 0; i < totalPreviousMessages; i++) for (int i = 0; i < totalPreviousMessages; i++)
{ {
int messageId = dataTypes.ReadNextVarInt(packetData); int messageId = dataTypes.ReadNextVarInt(packetData);
if (messageId > 0) if (messageId == 0) // from botcraft implementation. Only read if id is 0. Byte array is fixed size of 256 bytes
previousMessageSignatures.Add(new Tuple<int, byte[]>(messageId, dataTypes.ReadNextByteArray(packetData))); previousMessageSignatures.Add(new Tuple<int, byte[]>(messageId, dataTypes.ReadNextByteArray(packetData, 256)));
} }
// Other // Other
@ -579,10 +581,13 @@ namespace MinecraftClient.Protocol.Handlers
} }
} }
// TODO // TODO: Verify the message
ChatMessage chat = new(message, false, chatTypeId, senderUUID, unsignedChatContent, senderDisplayName, senderTeamName, timestamp, messageSignature, false);
handler.OnTextReceived(chat);
} }
else else
{ {
// 1.19.1 - 1.19.2
byte[]? precedingSignature = dataTypes.ReadNextBool(packetData) ? dataTypes.ReadNextByteArray(packetData) : null; byte[]? precedingSignature = dataTypes.ReadNextBool(packetData) ? dataTypes.ReadNextByteArray(packetData) : null;
Guid senderUUID = dataTypes.ReadNextUUID(packetData); Guid senderUUID = dataTypes.ReadNextUUID(packetData);
byte[] headerSignature = dataTypes.ReadNextByteArray(packetData); byte[] headerSignature = dataTypes.ReadNextByteArray(packetData);
@ -2483,7 +2488,8 @@ namespace MinecraftClient.Protocol.Handlers
if (!isOnlineMode || playerKeyPair == null || !Config.Signature.LoginWithSecureProfile || !Config.Signature.SignChat) if (!isOnlineMode || playerKeyPair == null || !Config.Signature.LoginWithSecureProfile || !Config.Signature.SignChat)
{ {
fields.AddRange(dataTypes.GetLong(0)); // Salt: Long fields.AddRange(dataTypes.GetLong(0)); // Salt: Long
fields.AddRange(dataTypes.GetVarInt(0)); // Signature Length: VarInt if (protocolVersion < MC_1_19_3_Version)
fields.AddRange(dataTypes.GetVarInt(0)); // Signature Length: VarInt (1.19 - 1.19.2)
} }
else else
{ {
@ -2493,21 +2499,33 @@ namespace MinecraftClient.Protocol.Handlers
// Signature Length & Signature: (VarInt) and Byte Array // Signature Length & Signature: (VarInt) and Byte Array
Guid uuid = handler.GetUserUuid(); Guid uuid = handler.GetUserUuid();
byte[] sign = (protocolVersion >= MC_1_19_2_Version) ? byte[] sign;
playerKeyPair.PrivateKey.SignMessage(message, uuid, timeNow, ref salt, acknowledgment!.lastSeen) : if (protocolVersion < MC_1_19_2_Version) // 1.19.1 or lower
playerKeyPair.PrivateKey.SignMessage(message, uuid, timeNow, ref salt); sign = playerKeyPair.PrivateKey.SignMessage(message, uuid, timeNow, ref salt);
fields.AddRange(dataTypes.GetVarInt(sign.Length)); else if (protocolVersion < MC_1_19_3_Version) // 1.19.2
sign = playerKeyPair.PrivateKey.SignMessage(message, uuid, timeNow, ref salt, acknowledgment!.lastSeen);
else // 1.19.3
sign = playerKeyPair.PrivateKey.SignMessage(message, uuid, timeNow, ref salt); // TODO?
if (protocolVersion < MC_1_19_3_Version)
fields.AddRange(dataTypes.GetVarInt(sign.Length));
else
fields.AddRange(dataTypes.GetBool(true));
fields.AddRange(sign); fields.AddRange(sign);
} }
// Signed Preview: Boolean // Signed Preview: Boolean
fields.AddRange(dataTypes.GetBool(false)); if (protocolVersion < MC_1_19_3_Version)
fields.AddRange(dataTypes.GetBool(false));
else
fields.AddRange(dataTypes.GetVarInt(1)); // message count
if (protocolVersion >= MC_1_19_2_Version) if (protocolVersion >= MC_1_19_2_Version)
{ {
// Message Acknowledgment // Message Acknowledgment
fields.AddRange(dataTypes.GetAcknowledgment(acknowledgment!, isOnlineMode && Config.Signature.LoginWithSecureProfile)); fields.AddRange(dataTypes.GetAcknowledgment(acknowledgment!, isOnlineMode && Config.Signature.LoginWithSecureProfile));
} }
} }
SendPacket(PacketTypesOut.ChatMessage, fields); SendPacket(PacketTypesOut.ChatMessage, fields);
return true; return true;