ReplyCommand.java

package dev.aura.bungeechat.command;

import dev.aura.bungeechat.account.BungeecordAccountManager;
import dev.aura.bungeechat.api.account.BungeeChatAccount;
import dev.aura.bungeechat.message.Messages;
import dev.aura.bungeechat.message.MessagesService;
import dev.aura.bungeechat.module.MessengerModule;
import dev.aura.bungeechat.permission.Permission;
import dev.aura.bungeechat.permission.PermissionManager;
import java.util.HashMap;
import java.util.Optional;
import net.md_5.bungee.api.CommandSender;

public class ReplyCommand extends BaseCommand {
  private static HashMap<CommandSender, CommandSender> replies;

  public ReplyCommand(MessengerModule messengerModule) {
    super(
        "reply",
        Permission.COMMAND_MESSAGE,
        messengerModule.getModuleSection().getStringList("aliases.reply"));

    if (replies == null) {
      replies = new HashMap<>();
    } else {
      replies.clear();
    }
  }

  protected static void setReply(CommandSender sender, CommandSender target) {
    replies.put(sender, target);
    replies.put(target, sender);
  }

  private static CommandSender getReplier(CommandSender player) {
    return replies.get(player);
  }

  @Override
  public void execute(CommandSender sender, String[] args) {
    if (!PermissionManager.hasPermission(sender, Permission.COMMAND_MESSAGE)) return;

    if (args.length < 1) {
      MessagesService.sendMessage(sender, Messages.INCORRECT_USAGE.get(sender, "/reply <message>"));
      return;
    }

    CommandSender initialTarget = getReplier(sender);
    Optional<BungeeChatAccount> targetAccount = BungeecordAccountManager.getAccount(initialTarget);

    if ((initialTarget != null) && !targetAccount.isPresent()) {
      MessagesService.sendMessage(sender, Messages.REPLY_OFFLINE.get());
      return;
    } else if (!targetAccount.isPresent()
        || (targetAccount.get().isVanished()
            && !PermissionManager.hasPermission(sender, Permission.COMMAND_VANISH_VIEW))) {
      MessagesService.sendMessage(sender, Messages.NO_REPLY.get());
      return;
    }

    CommandSender target = BungeecordAccountManager.getCommandSender(targetAccount.get()).get();

    if (!targetAccount.get().hasMessengerEnabled()
        && !PermissionManager.hasPermission(sender, Permission.BYPASS_TOGGLE_MESSAGE)) {
      MessagesService.sendMessage(sender, Messages.HAS_MESSENGER_DISABLED.get(target));
      return;
    }

    String finalMessage = String.join(" ", args);

    MessagesService.sendPrivateMessage(sender, target, finalMessage);
    ReplyCommand.setReply(sender, target);
  }
}