60 lines
2.5 KiB
Java
60 lines
2.5 KiB
Java
package net.minecraft.network.chat;
|
|
|
|
import com.google.common.primitives.Ints;
|
|
import com.google.common.primitives.Longs;
|
|
import com.mojang.serialization.Codec;
|
|
import com.mojang.serialization.MapCodec;
|
|
import com.mojang.serialization.codecs.RecordCodecBuilder;
|
|
import java.nio.charset.StandardCharsets;
|
|
import java.security.SignatureException;
|
|
import java.time.Instant;
|
|
import java.util.Optional;
|
|
import net.minecraft.network.FriendlyByteBuf;
|
|
import net.minecraft.util.ExtraCodecs;
|
|
import net.minecraft.util.SignatureUpdater;
|
|
|
|
public record SignedMessageBody(String content, Instant timeStamp, long salt, LastSeenMessages lastSeen) {
|
|
public static final MapCodec<SignedMessageBody> MAP_CODEC = RecordCodecBuilder.mapCodec(
|
|
instance -> instance.group(
|
|
Codec.STRING.fieldOf("content").forGetter(SignedMessageBody::content),
|
|
ExtraCodecs.INSTANT_ISO8601.fieldOf("time_stamp").forGetter(SignedMessageBody::timeStamp),
|
|
Codec.LONG.fieldOf("salt").forGetter(SignedMessageBody::salt),
|
|
LastSeenMessages.CODEC.optionalFieldOf("last_seen", LastSeenMessages.EMPTY).forGetter(SignedMessageBody::lastSeen)
|
|
)
|
|
.apply(instance, SignedMessageBody::new)
|
|
);
|
|
|
|
public static SignedMessageBody unsigned(String content) {
|
|
return new SignedMessageBody(content, Instant.now(), 0L, LastSeenMessages.EMPTY);
|
|
}
|
|
|
|
public void updateSignature(SignatureUpdater.Output output) throws SignatureException {
|
|
output.update(Longs.toByteArray(this.salt));
|
|
output.update(Longs.toByteArray(this.timeStamp.getEpochSecond()));
|
|
byte[] bs = this.content.getBytes(StandardCharsets.UTF_8);
|
|
output.update(Ints.toByteArray(bs.length));
|
|
output.update(bs);
|
|
this.lastSeen.updateSignature(output);
|
|
}
|
|
|
|
public SignedMessageBody.Packed pack(MessageSignatureCache signatureCache) {
|
|
return new SignedMessageBody.Packed(this.content, this.timeStamp, this.salt, this.lastSeen.pack(signatureCache));
|
|
}
|
|
|
|
public record Packed(String content, Instant timeStamp, long salt, LastSeenMessages.Packed lastSeen) {
|
|
public Packed(FriendlyByteBuf buffer) {
|
|
this(buffer.readUtf(256), buffer.readInstant(), buffer.readLong(), new LastSeenMessages.Packed(buffer));
|
|
}
|
|
|
|
public void write(FriendlyByteBuf buffer) {
|
|
buffer.writeUtf(this.content, 256);
|
|
buffer.writeInstant(this.timeStamp);
|
|
buffer.writeLong(this.salt);
|
|
this.lastSeen.write(buffer);
|
|
}
|
|
|
|
public Optional<SignedMessageBody> unpack(MessageSignatureCache signatureCache) {
|
|
return this.lastSeen.unpack(signatureCache).map(lastSeenMessages -> new SignedMessageBody(this.content, this.timeStamp, this.salt, lastSeenMessages));
|
|
}
|
|
}
|
|
}
|