59 lines
1.8 KiB
Java
59 lines
1.8 KiB
Java
|
package cc.fascinated.common;
|
||
|
|
||
|
import lombok.NonNull;
|
||
|
import lombok.SneakyThrows;
|
||
|
import lombok.experimental.UtilityClass;
|
||
|
import org.xbill.DNS.Record;
|
||
|
import org.xbill.DNS.*;
|
||
|
|
||
|
import java.net.InetAddress;
|
||
|
import java.net.InetSocketAddress;
|
||
|
|
||
|
/**
|
||
|
* @author Braydon
|
||
|
*/
|
||
|
@UtilityClass
|
||
|
public final class DNSUtils {
|
||
|
private static final String SRV_QUERY_PREFIX = "_minecraft._tcp.%s";
|
||
|
|
||
|
/**
|
||
|
* Resolve the hostname to an {@link InetSocketAddress}.
|
||
|
*
|
||
|
* @param hostname the hostname to resolve
|
||
|
* @return the resolved {@link InetSocketAddress}
|
||
|
*/
|
||
|
@SneakyThrows
|
||
|
public static InetSocketAddress resolveSRV(@NonNull String hostname) {
|
||
|
Record[] records = new Lookup(SRV_QUERY_PREFIX.formatted(hostname), Type.SRV).run(); // Resolve SRV records
|
||
|
if (records == null) { // No records exist
|
||
|
return null;
|
||
|
}
|
||
|
String host = null;
|
||
|
int port = -1;
|
||
|
for (Record record : records) {
|
||
|
SRVRecord srv = (SRVRecord) record;
|
||
|
host = srv.getTarget().toString().replaceFirst("\\.$", "");
|
||
|
port = srv.getPort();
|
||
|
}
|
||
|
return host == null ? null : new InetSocketAddress(host, port);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Resolve the hostname to an {@link InetAddress}.
|
||
|
*
|
||
|
* @param hostname the hostname to resolve
|
||
|
* @return the resolved {@link InetAddress}
|
||
|
*/
|
||
|
@SneakyThrows
|
||
|
public static InetAddress resolveA(@NonNull String hostname) {
|
||
|
Record[] records = new Lookup(hostname, Type.A).run(); // Resolve A records
|
||
|
if (records == null) { // No records exist
|
||
|
return null;
|
||
|
}
|
||
|
InetAddress address = null;
|
||
|
for (Record record : records) {
|
||
|
address = ((ARecord) record).getAddress();
|
||
|
}
|
||
|
return address;
|
||
|
}
|
||
|
}
|