package com.mojang.realmsclient.gui; import com.mojang.realmsclient.RealmsMainScreen; import com.mojang.realmsclient.client.RealmsClient; import com.mojang.realmsclient.dto.RealmsNews; import com.mojang.realmsclient.dto.RealmsNotification; import com.mojang.realmsclient.dto.RealmsServer; import com.mojang.realmsclient.dto.RealmsServerPlayerLists; import com.mojang.realmsclient.gui.task.DataFetcher; import com.mojang.realmsclient.gui.task.RepeatedDelayStrategy; import com.mojang.realmsclient.gui.task.DataFetcher.Task; import com.mojang.realmsclient.util.RealmsPersistence; import java.time.Duration; import java.util.List; import java.util.concurrent.TimeUnit; import net.fabricmc.api.EnvType; import net.fabricmc.api.Environment; import net.minecraft.Util; @Environment(EnvType.CLIENT) public class RealmsDataFetcher { public final DataFetcher dataFetcher = new DataFetcher(Util.ioPool(), TimeUnit.MILLISECONDS, Util.timeSource); private final List> tasks; public final Task> notificationsTask; public final Task serverListUpdateTask; public final Task pendingInvitesTask; public final Task trialAvailabilityTask; public final Task newsTask; public final Task onlinePlayersTask; public final RealmsNewsManager newsManager = new RealmsNewsManager(new RealmsPersistence()); public RealmsDataFetcher(RealmsClient realmsClient) { this.serverListUpdateTask = this.dataFetcher .createTask( "server list", () -> { com.mojang.realmsclient.dto.RealmsServerList realmsServerList = realmsClient.listRealms(); return RealmsMainScreen.isSnapshot() ? new RealmsDataFetcher.ServerListData(realmsServerList.servers, realmsClient.listSnapshotEligibleRealms()) : new RealmsDataFetcher.ServerListData(realmsServerList.servers, List.of()); }, Duration.ofSeconds(60L), RepeatedDelayStrategy.CONSTANT ); this.pendingInvitesTask = this.dataFetcher .createTask("pending invite count", realmsClient::pendingInvitesCount, Duration.ofSeconds(10L), RepeatedDelayStrategy.exponentialBackoff(360)); this.trialAvailabilityTask = this.dataFetcher .createTask("trial availablity", realmsClient::trialAvailable, Duration.ofSeconds(60L), RepeatedDelayStrategy.exponentialBackoff(60)); this.newsTask = this.dataFetcher.createTask("unread news", realmsClient::getNews, Duration.ofMinutes(5L), RepeatedDelayStrategy.CONSTANT); this.notificationsTask = this.dataFetcher.createTask("notifications", realmsClient::getNotifications, Duration.ofMinutes(5L), RepeatedDelayStrategy.CONSTANT); this.onlinePlayersTask = this.dataFetcher.createTask("online players", realmsClient::getLiveStats, Duration.ofSeconds(10L), RepeatedDelayStrategy.CONSTANT); this.tasks = List.of( this.notificationsTask, this.serverListUpdateTask, this.pendingInvitesTask, this.trialAvailabilityTask, this.newsTask, this.onlinePlayersTask ); } public List> getTasks() { return this.tasks; } @Environment(EnvType.CLIENT) public record ServerListData(List serverList, List availableSnapshotServers) { } }