BungeePermsHook.java

package dev.aura.bungeechat.hook;

import dev.aura.bungeechat.api.account.BungeeChatAccount;
import dev.aura.bungeechat.api.hook.BungeeChatHook;
import dev.aura.bungeechat.api.hook.HookManager;
import dev.aura.bungeechat.util.LoggerHelper;
import java.util.Comparator;
import java.util.Optional;
import net.alpenblock.bungeeperms.BungeePerms;
import net.alpenblock.bungeeperms.Group;
import net.alpenblock.bungeeperms.PermissionsManager;
import net.alpenblock.bungeeperms.User;

public class BungeePermsHook implements BungeeChatHook {
  private static final Comparator<Group> groupComparator = Comparator.comparing(Group::getWeight);
  private final PermissionsManager permissionManager;

  public BungeePermsHook() {
    permissionManager = BungeePerms.getInstance().getPermissionsManager();
  }

  @Override
  public Optional<String> getPrefix(BungeeChatAccount account) {
    return getUser(account).flatMap(this::getGroup).map(Group::getPrefix);
  }

  @Override
  public Optional<String> getSuffix(BungeeChatAccount account) {
    return getUser(account).flatMap(this::getGroup).map(Group::getSuffix);
  }

  private Optional<Group> getGroup(User user) {
    Group group = permissionManager.getMainGroup(user);

    if (group == null) {
      return getDefaultPlayerGroup();
    } else {
      return Optional.of(group);
    }
  }

  private Optional<Group> getDefaultPlayerGroup() {
    return permissionManager.getDefaultGroups().stream().max(groupComparator);
  }

  private Optional<User> getUser(BungeeChatAccount account) {
    try {
      return Optional.ofNullable(permissionManager.getUser(account.getUniqueId()));
    } catch (NullPointerException e) {
      LoggerHelper.warning(
          "BungeePerms returned faulty data. This is a bug in BungeePerms. We recommend switching to LuckPerms or another permission manager if this error recurs.",
          e);

      return Optional.empty();
    }
  }

  @Override
  public int getPriority() {
    return HookManager.PERMISSION_PLUGIN_PREFIX_PRIORITY;
  }
}