ChatReportContextBuilder.java

net.minecraft.client.multiplayer.chat.report.ChatReportContextBuilder

信息

  • 全限定名:net.minecraft.client.multiplayer.chat.report.ChatReportContextBuilder
  • 类型:public class
  • 包:net.minecraft.client.multiplayer.chat.report
  • 源码路径:src/main/java/net/minecraft/client/multiplayer/chat/report/ChatReportContextBuilder.java
  • 起始行号:L20
  • 职责:

    TODO

字段/常量

  • leadingCount

    • 类型: int
    • 修饰符: private final
    • 源码定位: L21
    • 说明:

      TODO

  • activeCollectors

    • 类型: List<ChatReportContextBuilder.Collector>
    • 修饰符: private final
    • 源码定位: L22
    • 说明:

      TODO

内部类/嵌套类型

  • net.minecraft.client.multiplayer.chat.report.ChatReportContextBuilder.Collector

    • 类型: class
    • 修饰符: private
    • 源码定位: L70
    • 说明:

      TODO

  • net.minecraft.client.multiplayer.chat.report.ChatReportContextBuilder.Handler

    • 类型: interface
    • 修饰符: public
    • 源码定位: L112
    • 说明:

      TODO

构造器

public ChatReportContextBuilder(int leadingCount) @ L24

  • 构造器名:ChatReportContextBuilder
  • 源码定位:L24
  • 修饰符:public

参数:

  • leadingCount: int

说明:

TODO

方法

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

public void collectAllContext(ChatLog chatLog, IntCollection roots, ChatReportContextBuilder.Handler handler) @ L28

  • 方法名:collectAllContext
  • 源码定位:L28
  • 返回类型:void
  • 修饰符:public

参数:

  • chatLog: ChatLog
  • roots: IntCollection
  • handler: ChatReportContextBuilder.Handler

说明:

TODO

public void trackContext(PlayerChatMessage message) @ L44

  • 方法名:trackContext
  • 源码定位:L44
  • 返回类型:void
  • 修饰符:public

参数:

  • message: PlayerChatMessage

说明:

TODO

public boolean acceptContext(PlayerChatMessage message) @ L48

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

参数:

  • message: PlayerChatMessage

说明:

TODO

public boolean isActive() @ L65

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

参数:

说明:

TODO

代码

@OnlyIn(Dist.CLIENT)
public class ChatReportContextBuilder {
    private final int leadingCount;
    private final List<ChatReportContextBuilder.Collector> activeCollectors = new ArrayList<>();
 
    public ChatReportContextBuilder(int leadingCount) {
        this.leadingCount = leadingCount;
    }
 
    public void collectAllContext(ChatLog chatLog, IntCollection roots, ChatReportContextBuilder.Handler handler) {
        IntSortedSet uncollectedRoots = new IntRBTreeSet(roots);
 
        for (int id = uncollectedRoots.lastInt(); id >= chatLog.start() && (this.isActive() || !uncollectedRoots.isEmpty()); id--) {
            if (chatLog.lookup(id) instanceof LoggedChatMessage.Player event) {
                boolean context = this.acceptContext(event.message());
                if (uncollectedRoots.remove(id)) {
                    this.trackContext(event.message());
                    handler.accept(id, event);
                } else if (context) {
                    handler.accept(id, event);
                }
            }
        }
    }
 
    public void trackContext(PlayerChatMessage message) {
        this.activeCollectors.add(new ChatReportContextBuilder.Collector(message));
    }
 
    public boolean acceptContext(PlayerChatMessage message) {
        boolean collected = false;
        Iterator<ChatReportContextBuilder.Collector> iterator = this.activeCollectors.iterator();
 
        while (iterator.hasNext()) {
            ChatReportContextBuilder.Collector collector = iterator.next();
            if (collector.accept(message)) {
                collected = true;
                if (collector.isComplete()) {
                    iterator.remove();
                }
            }
        }
 
        return collected;
    }
 
    public boolean isActive() {
        return !this.activeCollectors.isEmpty();
    }
 
    @OnlyIn(Dist.CLIENT)
    private class Collector {
        private final Set<MessageSignature> lastSeenSignatures;
        private PlayerChatMessage lastChainMessage;
        private boolean collectingChain;
        private int count;
 
        private Collector(PlayerChatMessage fromMessage) {
            Objects.requireNonNull(ChatReportContextBuilder.this);
            super();
            this.collectingChain = true;
            this.lastSeenSignatures = new ObjectOpenHashSet<>(fromMessage.signedBody().lastSeen().entries());
            this.lastChainMessage = fromMessage;
        }
 
        private boolean accept(PlayerChatMessage message) {
            if (message.equals(this.lastChainMessage)) {
                return false;
            } else {
                boolean selected = this.lastSeenSignatures.remove(message.signature());
                if (this.collectingChain && this.lastChainMessage.sender().equals(message.sender())) {
                    if (this.lastChainMessage.link().isDescendantOf(message.link())) {
                        selected = true;
                        this.lastChainMessage = message;
                    } else {
                        this.collectingChain = false;
                    }
                }
 
                if (selected) {
                    this.count++;
                }
 
                return selected;
            }
        }
 
        private boolean isComplete() {
            return this.count >= ChatReportContextBuilder.this.leadingCount || !this.collectingChain && this.lastSeenSignatures.isEmpty();
        }
    }
 
    @OnlyIn(Dist.CLIENT)
    public interface Handler {
        void accept(int id, LoggedChatMessage.Player event);
    }
}

引用的其他类