ServerNameUtil.java

package dev.aura.bungeechat.util;

import com.typesafe.config.Config;
import dev.aura.bungeechat.config.Configuration;
import dev.aura.bungeechat.message.Messages;
import dev.aura.bungeechat.message.MessagesService;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.stream.Collectors;
import lombok.experimental.UtilityClass;
import net.md_5.bungee.api.CommandSender;
import net.md_5.bungee.api.ProxyServer;
import net.md_5.bungee.api.config.ServerInfo;

@UtilityClass
public class ServerNameUtil {
  private static Map<String, String> aliasMapping = new HashMap<>();

  public static Optional<ServerInfo> getServerInfo(String serverName) {
    return ProxyServer.getInstance().getServers().values().stream()
        .filter(server -> serverName.equalsIgnoreCase(server.getName()))
        .findAny();
  }

  public static Optional<String> verifyServerName(String serverName) {
    return getServerInfo(serverName).map(ServerInfo::getName);
  }

  public static Optional<String> verifyServerName(String serverName, CommandSender sender) {
    final Optional<String> verifiedServerName = verifyServerName(serverName);

    if (!verifiedServerName.isPresent()) {
      MessagesService.sendMessage(sender, Messages.UNKNOWN_SERVER.get(sender, serverName));
    }

    return verifiedServerName;
  }

  public static List<String> getServerNames() {
    return new ArrayList<>(ProxyServer.getInstance().getServers().keySet());
  }

  public static List<String> getMatchingServerNames(String partialName) {
    return getServerNames().stream()
        .filter(serverName -> serverName.startsWith(partialName))
        .collect(Collectors.toList());
  }

  public static String getServerAlias(ServerInfo server) {
    return getServerAlias(server.getName());
  }

  public static String getServerAlias(String name) {
    return aliasMapping.getOrDefault(name, name);
  }

  public static void loadAliases() {
    Config section = Configuration.get().getConfig("ServerAlias");

    aliasMapping =
        section.root().entrySet().stream()
            .collect(
                Collectors.toMap(
                    Map.Entry::getKey, entry -> entry.getValue().unwrapped().toString()));
  }
}