PlayerChatMessage.java

net.minecraft.network.chat.PlayerChatMessage

信息

  • 全限定名:net.minecraft.network.chat.PlayerChatMessage
  • 类型:public record
  • 包:net.minecraft.network.chat
  • 源码路径:src/main/java/net/minecraft/network/chat/PlayerChatMessage.java
  • 起始行号:L18
  • 职责:

    TODO

字段/常量

  • MAP_CODEC

    • 类型: MapCodec<PlayerChatMessage>
    • 修饰符: public static final
    • 源码定位: L21
    • 说明:

      TODO

  • SYSTEM_SENDER

    • 类型: UUID
    • 修饰符: private static final
    • 源码定位: L38
    • 说明:

      TODO

  • MESSAGE_EXPIRES_AFTER_SERVER

    • 类型: Duration
    • 修饰符: public static final
    • 源码定位: L39
    • 说明:

      TODO

  • MESSAGE_EXPIRES_AFTER_CLIENT

    • 类型: Duration
    • 修饰符: public static final
    • 源码定位: L40
    • 说明:

      TODO

内部类/嵌套类型

构造器

方法

下面的方法块按源码顺序生成。

public static PlayerChatMessage system(String content) @ L42

  • 方法名:system
  • 源码定位:L42
  • 返回类型:PlayerChatMessage
  • 修饰符:public static

参数:

  • content: String

说明:

TODO

public static PlayerChatMessage unsigned(UUID sender, String content) @ L46

  • 方法名:unsigned
  • 源码定位:L46
  • 返回类型:PlayerChatMessage
  • 修饰符:public static

参数:

  • sender: UUID
  • content: String

说明:

TODO

public PlayerChatMessage withUnsignedContent(Component content) @ L52

  • 方法名:withUnsignedContent
  • 源码定位:L52
  • 返回类型:PlayerChatMessage
  • 修饰符:public

参数:

  • content: Component

说明:

TODO

public PlayerChatMessage removeUnsignedContent() @ L57

  • 方法名:removeUnsignedContent
  • 源码定位:L57
  • 返回类型:PlayerChatMessage
  • 修饰符:public

参数:

说明:

TODO

public PlayerChatMessage filter(FilterMask filterMask) @ L61

  • 方法名:filter
  • 源码定位:L61
  • 返回类型:PlayerChatMessage
  • 修饰符:public

参数:

  • filterMask: FilterMask

说明:

TODO

public PlayerChatMessage filter(boolean filtered) @ L65

  • 方法名:filter
  • 源码定位:L65
  • 返回类型:PlayerChatMessage
  • 修饰符:public

参数:

  • filtered: boolean

说明:

TODO

public PlayerChatMessage removeSignature() @ L69

  • 方法名:removeSignature
  • 源码定位:L69
  • 返回类型:PlayerChatMessage
  • 修饰符:public

参数:

说明:

TODO

  • 方法名:updateSignature
  • 源码定位:L75
  • 返回类型:void
  • 修饰符:public static

参数:

  • output: SignatureUpdater.Output
  • link: SignedMessageLink
  • body: SignedMessageBody

说明:

TODO

public boolean verify(SignatureValidator signatureValidator) @ L81

  • 方法名:verify
  • 源码定位:L81
  • 返回类型:boolean
  • 修饰符:public

参数:

  • signatureValidator: SignatureValidator

说明:

TODO

public String signedContent() @ L85

  • 方法名:signedContent
  • 源码定位:L85
  • 返回类型:String
  • 修饰符:public

参数:

说明:

TODO

public Component decoratedContent() @ L89

  • 方法名:decoratedContent
  • 源码定位:L89
  • 返回类型:Component
  • 修饰符:public

参数:

说明:

TODO

public Instant timeStamp() @ L93

  • 方法名:timeStamp
  • 源码定位:L93
  • 返回类型:Instant
  • 修饰符:public

参数:

说明:

TODO

public long salt() @ L97

  • 方法名:salt
  • 源码定位:L97
  • 返回类型:long
  • 修饰符:public

参数:

说明:

TODO

public boolean hasExpiredServer(Instant now) @ L101

  • 方法名:hasExpiredServer
  • 源码定位:L101
  • 返回类型:boolean
  • 修饰符:public

参数:

  • now: Instant

说明:

TODO

public boolean hasExpiredClient(Instant now) @ L105

  • 方法名:hasExpiredClient
  • 源码定位:L105
  • 返回类型:boolean
  • 修饰符:public

参数:

  • now: Instant

说明:

TODO

public UUID sender() @ L109

  • 方法名:sender
  • 源码定位:L109
  • 返回类型:UUID
  • 修饰符:public

参数:

说明:

TODO

public boolean isSystem() @ L113

  • 方法名:isSystem
  • 源码定位:L113
  • 返回类型:boolean
  • 修饰符:public

参数:

说明:

TODO

public boolean hasSignature() @ L117

  • 方法名:hasSignature
  • 源码定位:L117
  • 返回类型:boolean
  • 修饰符:public

参数:

说明:

TODO

public boolean hasSignatureFrom(UUID profileId) @ L121

  • 方法名:hasSignatureFrom
  • 源码定位:L121
  • 返回类型:boolean
  • 修饰符:public

参数:

  • profileId: UUID

说明:

TODO

public boolean isFullyFiltered() @ L125

  • 方法名:isFullyFiltered
  • 源码定位:L125
  • 返回类型:boolean
  • 修饰符:public

参数:

说明:

TODO

public static String describeSigned(PlayerChatMessage message) @ L129

  • 方法名:describeSigned
  • 源码定位:L129
  • 返回类型:String
  • 修饰符:public static

参数:

  • message: PlayerChatMessage

说明:

TODO

代码

public record PlayerChatMessage(
    SignedMessageLink link, @Nullable MessageSignature signature, SignedMessageBody signedBody, @Nullable Component unsignedContent, FilterMask filterMask
) {
    public static final MapCodec<PlayerChatMessage> MAP_CODEC = RecordCodecBuilder.mapCodec(
        i -> i.group(
                SignedMessageLink.CODEC.fieldOf("link").forGetter(PlayerChatMessage::link),
                MessageSignature.CODEC.optionalFieldOf("signature").forGetter(playerChatMessage -> Optional.ofNullable(playerChatMessage.signature)),
                SignedMessageBody.MAP_CODEC.forGetter(PlayerChatMessage::signedBody),
                ComponentSerialization.CODEC
                    .optionalFieldOf("unsigned_content")
                    .forGetter(playerChatMessage -> Optional.ofNullable(playerChatMessage.unsignedContent)),
                FilterMask.CODEC.optionalFieldOf("filter_mask", FilterMask.PASS_THROUGH).forGetter(PlayerChatMessage::filterMask)
            )
            .apply(
                i,
                (link, signature, signedBody, unsignedContent, filterMask) -> new PlayerChatMessage(
                    link, signature.orElse(null), signedBody, unsignedContent.orElse(null), filterMask
                )
            )
    );
    private static final UUID SYSTEM_SENDER = Util.NIL_UUID;
    public static final Duration MESSAGE_EXPIRES_AFTER_SERVER = Duration.ofMinutes(5L);
    public static final Duration MESSAGE_EXPIRES_AFTER_CLIENT = MESSAGE_EXPIRES_AFTER_SERVER.plus(Duration.ofMinutes(2L));
 
    public static PlayerChatMessage system(String content) {
        return unsigned(SYSTEM_SENDER, content);
    }
 
    public static PlayerChatMessage unsigned(UUID sender, String content) {
        SignedMessageBody body = SignedMessageBody.unsigned(content);
        SignedMessageLink link = SignedMessageLink.unsigned(sender);
        return new PlayerChatMessage(link, null, body, null, FilterMask.PASS_THROUGH);
    }
 
    public PlayerChatMessage withUnsignedContent(Component content) {
        Component unsignedContent = !content.equals(Component.literal(this.signedContent())) ? content : null;
        return new PlayerChatMessage(this.link, this.signature, this.signedBody, unsignedContent, this.filterMask);
    }
 
    public PlayerChatMessage removeUnsignedContent() {
        return this.unsignedContent != null ? new PlayerChatMessage(this.link, this.signature, this.signedBody, null, this.filterMask) : this;
    }
 
    public PlayerChatMessage filter(FilterMask filterMask) {
        return this.filterMask.equals(filterMask) ? this : new PlayerChatMessage(this.link, this.signature, this.signedBody, this.unsignedContent, filterMask);
    }
 
    public PlayerChatMessage filter(boolean filtered) {
        return this.filter(filtered ? this.filterMask : FilterMask.PASS_THROUGH);
    }
 
    public PlayerChatMessage removeSignature() {
        SignedMessageBody body = SignedMessageBody.unsigned(this.signedContent());
        SignedMessageLink link = SignedMessageLink.unsigned(this.sender());
        return new PlayerChatMessage(link, null, body, this.unsignedContent, this.filterMask);
    }
 
    public static void updateSignature(SignatureUpdater.Output output, SignedMessageLink link, SignedMessageBody body) throws SignatureException {
        output.update(Ints.toByteArray(1));
        link.updateSignature(output);
        body.updateSignature(output);
    }
 
    public boolean verify(SignatureValidator signatureValidator) {
        return this.signature != null && this.signature.verify(signatureValidator, output -> updateSignature(output, this.link, this.signedBody));
    }
 
    public String signedContent() {
        return this.signedBody.content();
    }
 
    public Component decoratedContent() {
        return Objects.requireNonNullElseGet(this.unsignedContent, () -> Component.literal(this.signedContent()));
    }
 
    public Instant timeStamp() {
        return this.signedBody.timeStamp();
    }
 
    public long salt() {
        return this.signedBody.salt();
    }
 
    public boolean hasExpiredServer(Instant now) {
        return now.isAfter(this.timeStamp().plus(MESSAGE_EXPIRES_AFTER_SERVER));
    }
 
    public boolean hasExpiredClient(Instant now) {
        return now.isAfter(this.timeStamp().plus(MESSAGE_EXPIRES_AFTER_CLIENT));
    }
 
    public UUID sender() {
        return this.link.sender();
    }
 
    public boolean isSystem() {
        return this.sender().equals(SYSTEM_SENDER);
    }
 
    public boolean hasSignature() {
        return this.signature != null;
    }
 
    public boolean hasSignatureFrom(UUID profileId) {
        return this.hasSignature() && this.link.sender().equals(profileId);
    }
 
    public boolean isFullyFiltered() {
        return this.filterMask.isFullyFiltered();
    }
 
    public static String describeSigned(PlayerChatMessage message) {
        return "'"
            + message.signedBody.content()
            + "' @ "
            + message.signedBody.timeStamp()
            + "\n - From: "
            + message.link.sender()
            + "/"
            + message.link.sessionId()
            + ", message #"
            + message.link.index()
            + "\n - Salt: "
            + message.signedBody.salt()
            + "\n - Signature: "
            + MessageSignature.describe(message.signature)
            + "\n - Last Seen: [\n"
            + message.signedBody
                .lastSeen()
                .entries()
                .stream()
                .map(signature -> "     " + MessageSignature.describe(signature) + "\n")
                .collect(Collectors.joining())
            + " ]\n";
    }
}

引用的其他类