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);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|