190 lines
		
	
	
	
		
			5.3 KiB
		
	
	
	
		
			Java
		
	
	
	
	
	
			
		
		
	
	
			190 lines
		
	
	
	
		
			5.3 KiB
		
	
	
	
		
			Java
		
	
	
	
	
	
| package net.minecraft.client.multiplayer;
 | |
| 
 | |
| import com.google.common.collect.Lists;
 | |
| import com.mojang.logging.LogUtils;
 | |
| import java.nio.file.Files;
 | |
| import java.nio.file.Path;
 | |
| import java.util.List;
 | |
| import java.util.Objects;
 | |
| import net.fabricmc.api.EnvType;
 | |
| import net.fabricmc.api.Environment;
 | |
| import net.minecraft.Util;
 | |
| import net.minecraft.client.Minecraft;
 | |
| import net.minecraft.nbt.CompoundTag;
 | |
| import net.minecraft.nbt.ListTag;
 | |
| import net.minecraft.nbt.NbtIo;
 | |
| import net.minecraft.util.thread.ConsecutiveExecutor;
 | |
| import org.jetbrains.annotations.Nullable;
 | |
| import org.slf4j.Logger;
 | |
| 
 | |
| @Environment(EnvType.CLIENT)
 | |
| public class ServerList {
 | |
| 	private static final Logger LOGGER = LogUtils.getLogger();
 | |
| 	private static final ConsecutiveExecutor IO_EXECUTOR = new ConsecutiveExecutor(Util.backgroundExecutor(), "server-list-io");
 | |
| 	private static final int MAX_HIDDEN_SERVERS = 16;
 | |
| 	private final Minecraft minecraft;
 | |
| 	private final List<ServerData> serverList = Lists.<ServerData>newArrayList();
 | |
| 	private final List<ServerData> hiddenServerList = Lists.<ServerData>newArrayList();
 | |
| 
 | |
| 	public ServerList(Minecraft minecraft) {
 | |
| 		this.minecraft = minecraft;
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Loads a list of servers from servers.dat, by running ServerData.getServerDataFromNBTCompound on each NBT compound found in the "servers" tag list.
 | |
| 	 */
 | |
| 	public void load() {
 | |
| 		try {
 | |
| 			this.serverList.clear();
 | |
| 			this.hiddenServerList.clear();
 | |
| 			CompoundTag compoundTag = NbtIo.read(this.minecraft.gameDirectory.toPath().resolve("servers.dat"));
 | |
| 			if (compoundTag == null) {
 | |
| 				return;
 | |
| 			}
 | |
| 
 | |
| 			compoundTag.getListOrEmpty("servers").compoundStream().forEach(compoundTagx -> {
 | |
| 				ServerData serverData = ServerData.read(compoundTagx);
 | |
| 				if (compoundTagx.getBooleanOr("hidden", false)) {
 | |
| 					this.hiddenServerList.add(serverData);
 | |
| 				} else {
 | |
| 					this.serverList.add(serverData);
 | |
| 				}
 | |
| 			});
 | |
| 		} catch (Exception var2) {
 | |
| 			LOGGER.error("Couldn't load server list", (Throwable)var2);
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Runs getNBTCompound on each ServerData instance, puts everything into a "servers" NBT list and writes it to servers.dat.
 | |
| 	 */
 | |
| 	public void save() {
 | |
| 		try {
 | |
| 			ListTag listTag = new ListTag();
 | |
| 
 | |
| 			for (ServerData serverData : this.serverList) {
 | |
| 				CompoundTag compoundTag = serverData.write();
 | |
| 				compoundTag.putBoolean("hidden", false);
 | |
| 				listTag.add(compoundTag);
 | |
| 			}
 | |
| 
 | |
| 			for (ServerData serverData : this.hiddenServerList) {
 | |
| 				CompoundTag compoundTag = serverData.write();
 | |
| 				compoundTag.putBoolean("hidden", true);
 | |
| 				listTag.add(compoundTag);
 | |
| 			}
 | |
| 
 | |
| 			CompoundTag compoundTag2 = new CompoundTag();
 | |
| 			compoundTag2.put("servers", listTag);
 | |
| 			Path path = this.minecraft.gameDirectory.toPath();
 | |
| 			Path path2 = Files.createTempFile(path, "servers", ".dat");
 | |
| 			NbtIo.write(compoundTag2, path2);
 | |
| 			Path path3 = path.resolve("servers.dat_old");
 | |
| 			Path path4 = path.resolve("servers.dat");
 | |
| 			Util.safeReplaceFile(path4, path2, path3);
 | |
| 		} catch (Exception var7) {
 | |
| 			LOGGER.error("Couldn't save server list", (Throwable)var7);
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Gets the ServerData instance stored for the given index in the list.
 | |
| 	 */
 | |
| 	public ServerData get(int index) {
 | |
| 		return (ServerData)this.serverList.get(index);
 | |
| 	}
 | |
| 
 | |
| 	@Nullable
 | |
| 	public ServerData get(String ip) {
 | |
| 		for (ServerData serverData : this.serverList) {
 | |
| 			if (serverData.ip.equals(ip)) {
 | |
| 				return serverData;
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		for (ServerData serverDatax : this.hiddenServerList) {
 | |
| 			if (serverDatax.ip.equals(ip)) {
 | |
| 				return serverDatax;
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		return null;
 | |
| 	}
 | |
| 
 | |
| 	@Nullable
 | |
| 	public ServerData unhide(String ip) {
 | |
| 		for (int i = 0; i < this.hiddenServerList.size(); i++) {
 | |
| 			ServerData serverData = (ServerData)this.hiddenServerList.get(i);
 | |
| 			if (serverData.ip.equals(ip)) {
 | |
| 				this.hiddenServerList.remove(i);
 | |
| 				this.serverList.add(serverData);
 | |
| 				return serverData;
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		return null;
 | |
| 	}
 | |
| 
 | |
| 	public void remove(ServerData serverData) {
 | |
| 		if (!this.serverList.remove(serverData)) {
 | |
| 			this.hiddenServerList.remove(serverData);
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	public void add(ServerData server, boolean hidden) {
 | |
| 		if (hidden) {
 | |
| 			this.hiddenServerList.add(0, server);
 | |
| 
 | |
| 			while (this.hiddenServerList.size() > 16) {
 | |
| 				this.hiddenServerList.remove(this.hiddenServerList.size() - 1);
 | |
| 			}
 | |
| 		} else {
 | |
| 			this.serverList.add(server);
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Counts the number of ServerData instances in the list.
 | |
| 	 */
 | |
| 	public int size() {
 | |
| 		return this.serverList.size();
 | |
| 	}
 | |
| 
 | |
| 	/**
 | |
| 	 * Takes two list indexes, and swaps their order around.
 | |
| 	 */
 | |
| 	public void swap(int pos1, int pos2) {
 | |
| 		ServerData serverData = this.get(pos1);
 | |
| 		this.serverList.set(pos1, this.get(pos2));
 | |
| 		this.serverList.set(pos2, serverData);
 | |
| 		this.save();
 | |
| 	}
 | |
| 
 | |
| 	public void replace(int index, ServerData server) {
 | |
| 		this.serverList.set(index, server);
 | |
| 	}
 | |
| 
 | |
| 	private static boolean set(ServerData server, List<ServerData> serverList) {
 | |
| 		for (int i = 0; i < serverList.size(); i++) {
 | |
| 			ServerData serverData = (ServerData)serverList.get(i);
 | |
| 			if (Objects.equals(serverData.name, server.name) && serverData.ip.equals(server.ip)) {
 | |
| 				serverList.set(i, server);
 | |
| 				return true;
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		return false;
 | |
| 	}
 | |
| 
 | |
| 	public static void saveSingleServer(ServerData server) {
 | |
| 		IO_EXECUTOR.schedule(() -> {
 | |
| 			ServerList serverList = new ServerList(Minecraft.getInstance());
 | |
| 			serverList.load();
 | |
| 			if (!set(server, serverList.serverList)) {
 | |
| 				set(server, serverList.hiddenServerList);
 | |
| 			}
 | |
| 
 | |
| 			serverList.save();
 | |
| 		});
 | |
| 	}
 | |
| }
 |