package net.minecraft.network.chat; import it.unimi.dsi.fastutil.objects.ObjectArrayList; import it.unimi.dsi.fastutil.objects.ObjectList; import java.util.Optional; import org.jetbrains.annotations.Nullable; public class LastSeenMessagesValidator { private final int lastSeenCount; private final ObjectList trackedMessages = new ObjectArrayList<>(); @Nullable private MessageSignature lastPendingMessage; public LastSeenMessagesValidator(int lastSeenCount) { this.lastSeenCount = lastSeenCount; for (int i = 0; i < lastSeenCount; i++) { this.trackedMessages.add(null); } } public void addPending(MessageSignature signature) { if (!signature.equals(this.lastPendingMessage)) { this.trackedMessages.add(new LastSeenTrackedEntry(signature, true)); this.lastPendingMessage = signature; } } public int trackedMessagesCount() { return this.trackedMessages.size(); } public boolean applyOffset(int offset) { int i = this.trackedMessages.size() - this.lastSeenCount; if (offset >= 0 && offset <= i) { this.trackedMessages.removeElements(0, offset); return true; } else { return false; } } public Optional applyUpdate(LastSeenMessages.Update lastSeenUpdater) { if (!this.applyOffset(lastSeenUpdater.offset())) { return Optional.empty(); } else { ObjectList objectList = new ObjectArrayList<>(lastSeenUpdater.acknowledged().cardinality()); if (lastSeenUpdater.acknowledged().length() > this.lastSeenCount) { return Optional.empty(); } else { for (int i = 0; i < this.lastSeenCount; i++) { boolean bl = lastSeenUpdater.acknowledged().get(i); LastSeenTrackedEntry lastSeenTrackedEntry = (LastSeenTrackedEntry)this.trackedMessages.get(i); if (bl) { if (lastSeenTrackedEntry == null) { return Optional.empty(); } this.trackedMessages.set(i, lastSeenTrackedEntry.acknowledge()); objectList.add(lastSeenTrackedEntry.signature()); } else { if (lastSeenTrackedEntry != null && !lastSeenTrackedEntry.pending()) { return Optional.empty(); } this.trackedMessages.set(i, null); } } return Optional.of(new LastSeenMessages(objectList)); } } } }