95 lines
		
	
	
	
		
			2.9 KiB
		
	
	
	
		
			Java
		
	
	
	
	
	
			
		
		
	
	
			95 lines
		
	
	
	
		
			2.9 KiB
		
	
	
	
		
			Java
		
	
	
	
	
	
| package net.minecraft.client.server;
 | |
| 
 | |
| import com.mojang.logging.LogUtils;
 | |
| import java.io.IOException;
 | |
| import java.net.DatagramPacket;
 | |
| import java.net.DatagramSocket;
 | |
| import java.net.InetAddress;
 | |
| import java.nio.charset.StandardCharsets;
 | |
| import java.util.concurrent.atomic.AtomicInteger;
 | |
| import net.fabricmc.api.EnvType;
 | |
| import net.fabricmc.api.Environment;
 | |
| import net.minecraft.DefaultUncaughtExceptionHandler;
 | |
| import org.slf4j.Logger;
 | |
| 
 | |
| @Environment(EnvType.CLIENT)
 | |
| public class LanServerPinger extends Thread {
 | |
| 	private static final AtomicInteger UNIQUE_THREAD_ID = new AtomicInteger(0);
 | |
| 	private static final Logger LOGGER = LogUtils.getLogger();
 | |
| 	public static final String MULTICAST_GROUP = "224.0.2.60";
 | |
| 	public static final int PING_PORT = 4445;
 | |
| 	private static final long PING_INTERVAL = 1500L;
 | |
| 	private final String motd;
 | |
| 	private final DatagramSocket socket;
 | |
| 	private boolean isRunning = true;
 | |
| 	private final String serverAddress;
 | |
| 
 | |
| 	public LanServerPinger(String motd, String serverAddress) throws IOException {
 | |
| 		super("LanServerPinger #" + UNIQUE_THREAD_ID.incrementAndGet());
 | |
| 		this.motd = motd;
 | |
| 		this.serverAddress = serverAddress;
 | |
| 		this.setDaemon(true);
 | |
| 		this.setUncaughtExceptionHandler(new DefaultUncaughtExceptionHandler(LOGGER));
 | |
| 		this.socket = new DatagramSocket();
 | |
| 	}
 | |
| 
 | |
| 	public void run() {
 | |
| 		String string = createPingString(this.motd, this.serverAddress);
 | |
| 		byte[] bs = string.getBytes(StandardCharsets.UTF_8);
 | |
| 
 | |
| 		while (!this.isInterrupted() && this.isRunning) {
 | |
| 			try {
 | |
| 				InetAddress inetAddress = InetAddress.getByName("224.0.2.60");
 | |
| 				DatagramPacket datagramPacket = new DatagramPacket(bs, bs.length, inetAddress, 4445);
 | |
| 				this.socket.send(datagramPacket);
 | |
| 			} catch (IOException var6) {
 | |
| 				LOGGER.warn("LanServerPinger: {}", var6.getMessage());
 | |
| 				break;
 | |
| 			}
 | |
| 
 | |
| 			try {
 | |
| 				sleep(1500L);
 | |
| 			} catch (InterruptedException var5) {
 | |
| 			}
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	public void interrupt() {
 | |
| 		super.interrupt();
 | |
| 		this.isRunning = false;
 | |
| 	}
 | |
| 
 | |
| 	public static String createPingString(String motdMessage, String adMessage) {
 | |
| 		return "[MOTD]" + motdMessage + "[/MOTD][AD]" + adMessage + "[/AD]";
 | |
| 	}
 | |
| 
 | |
| 	public static String parseMotd(String pingResponse) {
 | |
| 		int i = pingResponse.indexOf("[MOTD]");
 | |
| 		if (i < 0) {
 | |
| 			return "missing no";
 | |
| 		} else {
 | |
| 			int j = pingResponse.indexOf("[/MOTD]", i + "[MOTD]".length());
 | |
| 			return j < i ? "missing no" : pingResponse.substring(i + "[MOTD]".length(), j);
 | |
| 		}
 | |
| 	}
 | |
| 
 | |
| 	public static String parseAddress(String pingResponse) {
 | |
| 		int i = pingResponse.indexOf("[/MOTD]");
 | |
| 		if (i < 0) {
 | |
| 			return null;
 | |
| 		} else {
 | |
| 			int j = pingResponse.indexOf("[/MOTD]", i + "[/MOTD]".length());
 | |
| 			if (j >= 0) {
 | |
| 				return null;
 | |
| 			} else {
 | |
| 				int k = pingResponse.indexOf("[AD]", i + "[/MOTD]".length());
 | |
| 				if (k < 0) {
 | |
| 					return null;
 | |
| 				} else {
 | |
| 					int l = pingResponse.indexOf("[/AD]", k + "[AD]".length());
 | |
| 					return l < k ? null : pingResponse.substring(k + "[AD]".length(), l);
 | |
| 				}
 | |
| 			}
 | |
| 		}
 | |
| 	}
 | |
| }
 |