PlaceHolders.java

package dev.aura.bungeechat.message;

import dev.aura.bungeechat.account.BungeecordAccountManager;
import dev.aura.bungeechat.api.account.BungeeChatAccount;
import dev.aura.bungeechat.api.enums.AccountType;
import dev.aura.bungeechat.api.hook.HookManager;
import dev.aura.bungeechat.api.placeholder.BungeeChatContext;
import dev.aura.bungeechat.api.placeholder.PlaceHolder;
import dev.aura.bungeechat.api.placeholder.PlaceHolderManager;
import dev.aura.bungeechat.api.utils.TimeUtil;
import dev.aura.bungeechat.util.ServerNameUtil;
import java.net.SocketAddress;
import java.text.SimpleDateFormat;
import lombok.experimental.UtilityClass;
import net.md_5.bungee.api.ProxyServer;
import net.md_5.bungee.api.config.ServerInfo;
import net.md_5.bungee.api.connection.ProxiedPlayer;

@UtilityClass
public class PlaceHolders {
  private static final String dateFormat = "yyyy-MM-dd HH:mm:ss";

  public static void registerPlaceHolders() {
    PlaceHolderManager.registerPlaceholder(
        new PlaceHolder("timestamp", context -> TimeUtil.getLongTimeStamp()));
    PlaceHolderManager.registerPlaceholder(
        new PlaceHolder("time", context -> TimeUtil.getTimeStamp()));
    PlaceHolderManager.registerPlaceholder(
        new PlaceHolder("short_time", context -> TimeUtil.getShortTimeStamp()));
    PlaceHolderManager.registerPlaceholder(new PlaceHolder("date", context -> TimeUtil.getDate()));
    PlaceHolderManager.registerPlaceholder(new PlaceHolder("day", context -> TimeUtil.getDay()));
    PlaceHolderManager.registerPlaceholder(
        new PlaceHolder("month", context -> TimeUtil.getMonth()));
    PlaceHolderManager.registerPlaceholder(new PlaceHolder("year", context -> TimeUtil.getYear()));

    PlaceHolderManager.registerPlaceholder(
        new PlaceHolder(
                "name",
                context -> context.getSender().get().getName(),
                BungeeChatContext.HAS_SENDER)
            .createAliases("sender_name"));
    PlaceHolderManager.registerPlaceholder(
        new PlaceHolder(
                "displayname",
                context -> context.getSender().get().getDisplayName(),
                BungeeChatContext.HAS_SENDER)
            .createAliases("sender_displayname"));
    PlaceHolderManager.registerPlaceholder(
        new PlaceHolder(
                "fullname",
                context -> HookManager.getFullName(context.getSender().get()),
                BungeeChatContext.HAS_SENDER)
            .createAliases("sender_fullname"));
    PlaceHolderManager.registerPlaceholder(
        new PlaceHolder(
                "fulldisplayname",
                context -> HookManager.getFullDisplayName(context.getSender().get()),
                BungeeChatContext.HAS_SENDER)
            .createAliases("sender_displayfullname"));
    PlaceHolderManager.registerPlaceholder(
        new PlaceHolder(
                "prefix",
                context -> HookManager.getPrefix(context.getSender().get()),
                BungeeChatContext.HAS_SENDER)
            .createAliases("sender_prefix"));
    PlaceHolderManager.registerPlaceholder(
        new PlaceHolder(
                "suffix",
                context -> HookManager.getSuffix(context.getSender().get()),
                BungeeChatContext.HAS_SENDER)
            .createAliases("sender_suffix"));
    PlaceHolderManager.registerPlaceholder(
        new PlaceHolder(
                "ping",
                context -> String.valueOf(context.getSender().get().getPing()),
                BungeeChatContext.HAS_SENDER)
            .createAliases("sender_ping"));
    PlaceHolderManager.registerPlaceholder(
        new PlaceHolder(
                "uuid",
                context -> context.getSender().get().getUniqueId().toString(),
                BungeeChatContext.HAS_SENDER)
            .createAliases("sender_uuid"));
    PlaceHolderManager.registerPlaceholder(
        new PlaceHolder(
                "servername",
                context -> context.getSender().get().getServerName(),
                BungeeChatContext.HAS_SENDER)
            .createAliases("sender_servername", "to_servername"));
    PlaceHolderManager.registerPlaceholder(
        new PlaceHolder(
                "serveralias",
                context -> ServerNameUtil.getServerAlias(context.getSender().get().getServerName()),
                BungeeChatContext.HAS_SENDER)
            .createAliases("sender_serveralias", "to_serveralias"));
    PlaceHolderManager.registerPlaceholder(
        new PlaceHolder(
                "serverip",
                context -> context.getSender().get().getServerIP(),
                BungeeChatContext.HAS_SENDER)
            .createAliases("sender_serverip", "to_serverip"));
    PlaceHolderManager.registerPlaceholder(
        new PlaceHolder(
            "from_servername",
            context ->
                ServerNameUtil.getServerInfo(context.getServer().get())
                    .map(ServerInfo::getName)
                    .orElse(BungeeChatAccount.unknownServer),
            BungeeChatContext.HAS_SERVER));
    PlaceHolderManager.registerPlaceholder(
        new PlaceHolder(
            "from_serveralias",
            context ->
                ServerNameUtil.getServerInfo(context.getServer().get())
                    .map(ServerNameUtil::getServerAlias)
                    .orElse(BungeeChatAccount.unknownServer),
            BungeeChatContext.HAS_SERVER));
    PlaceHolderManager.registerPlaceholder(
        new PlaceHolder(
            "from_serverip",
            context ->
                ServerNameUtil.getServerInfo(context.getServer().get())
                    .map(ServerInfo::getSocketAddress)
                    .map(SocketAddress::toString)
                    .orElse(BungeeChatAccount.unknownServer),
            BungeeChatContext.HAS_SERVER));
    PlaceHolderManager.registerPlaceholder(
        new PlaceHolder(
                "muted_until",
                context -> getDateFormat().format(context.getSender().get().getMutedUntil()),
                BungeeChatContext.HAS_SENDER)
            .createAliases("sender_muted_until"));
    PlaceHolderManager.registerPlaceholder(
        new PlaceHolder(
                "server_online",
                context -> getLocalPlayerCount(context.getSender().get()),
                BungeeChatContext.HAS_SENDER)
            .createAliases("sender_server_online"));

    PlaceHolderManager.registerPlaceholder(
        new PlaceHolder(
            "target_name",
            context -> context.getTarget().get().getName(),
            BungeeChatContext.HAS_TARGET));
    PlaceHolderManager.registerPlaceholder(
        new PlaceHolder(
            "target_displayname",
            context -> context.getTarget().get().getDisplayName(),
            BungeeChatContext.HAS_TARGET));
    PlaceHolderManager.registerPlaceholder(
        new PlaceHolder(
            "target_fullname",
            context -> HookManager.getFullName(context.getTarget().get()),
            BungeeChatContext.HAS_TARGET));
    PlaceHolderManager.registerPlaceholder(
        new PlaceHolder(
            "target_fulldisplayname",
            context -> HookManager.getFullDisplayName(context.getTarget().get()),
            BungeeChatContext.HAS_TARGET));
    PlaceHolderManager.registerPlaceholder(
        new PlaceHolder(
            "target_prefix",
            context -> HookManager.getPrefix(context.getTarget().get()),
            BungeeChatContext.HAS_TARGET));
    PlaceHolderManager.registerPlaceholder(
        new PlaceHolder(
            "target_suffix",
            context -> HookManager.getSuffix(context.getTarget().get()),
            BungeeChatContext.HAS_TARGET));
    PlaceHolderManager.registerPlaceholder(
        new PlaceHolder(
            "target_ping",
            context -> String.valueOf(context.getTarget().get().getPing()),
            BungeeChatContext.HAS_TARGET));
    PlaceHolderManager.registerPlaceholder(
        new PlaceHolder(
            "target_uuid",
            context -> context.getTarget().get().getUniqueId().toString(),
            BungeeChatContext.HAS_TARGET));
    PlaceHolderManager.registerPlaceholder(
        new PlaceHolder(
            "target_servername",
            context -> context.getTarget().get().getServerName(),
            BungeeChatContext.HAS_TARGET));
    PlaceHolderManager.registerPlaceholder(
        new PlaceHolder(
            "target_serveralias",
            context -> ServerNameUtil.getServerAlias(context.getTarget().get().getServerName()),
            BungeeChatContext.HAS_TARGET));
    PlaceHolderManager.registerPlaceholder(
        new PlaceHolder(
            "target_serverip",
            context -> context.getTarget().get().getServerIP(),
            BungeeChatContext.HAS_TARGET));
    PlaceHolderManager.registerPlaceholder(
        new PlaceHolder(
            "target_muted_until",
            context -> getDateFormat().format(context.getSender().get().getMutedUntil()),
            BungeeChatContext.HAS_TARGET));
    PlaceHolderManager.registerPlaceholder(
        new PlaceHolder(
            "target_server_online",
            context -> getLocalPlayerCount(context.getTarget().get()),
            BungeeChatContext.HAS_TARGET));

    PlaceHolderManager.registerPlaceholder(
        new PlaceHolder(
            "channel", context -> context.getChannel().get(), BungeeChatContext.HAS_CHANNEL));
    PlaceHolderManager.registerPlaceholder(
        new PlaceHolder(
                "message",
                context -> PlaceHolderUtil.escape(context.getMessage().get()),
                BungeeChatContext.HAS_MESSAGE)
            .createAliases("command", "unknown_server"));
    PlaceHolderManager.registerPlaceholder(
        new PlaceHolder("network_online", context -> getTotalPlayerCount()));
  }

  private static String getLocalPlayerCount(BungeeChatAccount player) {
    if (player.getAccountType() == AccountType.CONSOLE) return getTotalPlayerCount();

    ProxiedPlayer nativePlayer =
        (ProxiedPlayer) BungeecordAccountManager.getCommandSender(player).get();

    return Integer.toString(nativePlayer.getServer().getInfo().getPlayers().size());
  }

  private static String getTotalPlayerCount() {
    return Integer.toString(ProxyServer.getInstance().getPlayers().size());
  }

  private static SimpleDateFormat getDateFormat() {
    return new SimpleDateFormat(dateFormat);
  }
}