@EventHandler(priority = EventPriority.HIGHEST, ignoreCancelled = true)
  public void onPlayerJoin(PlayerJoinEvent event) {
    final Player player = event.getPlayer();
    ClanPlayer clanPlayer = clanManager.getClanPlayer(player);
    if (clanPlayer == null) return;
    System.out.println(player.getName() + " is in SimpleClans db.");
    Clan clan = clanPlayer.getClan();
    if (clan == null) // If not part of a clan, do no more
    return;

    final String tag = clan.getColorTag();
    System.out.println(player.getName() + " has a clan: " + tag);

    // Feature: set prefix in tablist
    // compatible with other prefix/suffix plugins since we just set PlayerListName
    scheduler.scheduleSyncDelayedTask(
        instance,
        new Runnable() {
          public void run() {
            player.setPlayerListName(tag + " " + player.getDisplayName());
          }
        },
        30L); // Long delay to ensure this has priority & no need to instantly set

    scheduler.scheduleSyncDelayedTask(
        instance,
        new Runnable() {
          public void run() {
            Team team = sb.getTeam(player.getName());
            if (team == null) return;
            team.setPrefix(tag + " "); // TODO: Check if a colored tag colors name
          }
        },
        40L); // Ensure healthbar made the team
  }
  /**
   * Check if
   *
   * @param field
   * @param offenderName
   * @return
   */
  public boolean inWar(Field field, String offenderName) {
    if (!hasSimpleClans()) {
      return false;
    }

    ClanPlayer cp = simpleClans.getClanManager().getClanPlayer(offenderName);
    ClanPlayer cpOwner = simpleClans.getClanManager().getClanPlayer(field.getOwner());

    if (cp != null && cpOwner != null) {
      List<Clan> warringClans = cp.getClan().getWarringClans();

      String ownerClan = cpOwner.getTag();

      for (Clan warring : warringClans) {
        if (ownerClan.equals(warring.getTag())) {
          return true;
        }
      }
    }

    return false;
  }
  /**
   * Execute the command
   *
   * @param player
   * @param arg
   */
  public void execute(Player player, String[] arg) {
    SimpleClans plugin = SimpleClans.getInstance();

    if (plugin.getPermissionsManager().has(player, "simpleclans.member.resign")) {
      ClanPlayer cp = plugin.getClanManager().getClanPlayer(player);

      if (cp != null) {
        Clan clan = cp.getClan();

        if (!clan.isLeader(player) || clan.getLeaders().size() > 1) {
          clan.addBb(
              player.getName(),
              ChatColor.AQUA
                  + MessageFormat.format(
                      plugin.getLang().getString("0.has.resigned"),
                      Helper.capitalize(player.getName())));
          clan.removePlayerFromClan(player.getName());
        } else if (clan.isLeader(player) && clan.getLeaders().size() == 1) {
          plugin
              .getClanManager()
              .serverAnnounce(
                  ChatColor.AQUA
                      + MessageFormat.format(
                          plugin.getLang().getString("clan.has.been.disbanded"), clan.getName()));
          clan.disband();
        } else {
          ChatBlock.sendMessage(
              player,
              ChatColor.RED
                  + plugin
                      .getLang()
                      .getString(
                          "last.leader.cannot.resign.you.must.appoint.another.leader.or.disband.the.clan"));
        }
      } else {
        ChatBlock.sendMessage(
            player, ChatColor.RED + plugin.getLang().getString("not.a.member.of.any.clan"));
      }
    } else {
      ChatBlock.sendMessage(
          player, ChatColor.RED + plugin.getLang().getString("insufficient.permissions"));
    }
  }
  @Override
  public void execute(Player player, String label, String[] args) {

    if (plugin.getPermissionsManager().has(player, "simpleclans.leader.kick")) {
      ClanPlayer cp = plugin.getClanManager().getClanPlayer(player);

      if (cp != null) {
        Clan clan = cp.getClan();

        if (clan.isLeader(player)) {
          String kicked = args[0];

          if (kicked != null) {
            if (!kicked.equals(player.getName())) {
              if (clan.isMember(kicked)) {
                if (!clan.isLeader(kicked)) {
                  clan.addBb(
                      player.getName(),
                      ChatColor.AQUA
                          + MessageFormat.format(
                              plugin.getLang("has.been.kicked.by"),
                              Helper.capitalize(kicked),
                              player.getName()));
                  clan.removePlayerFromClan(kicked);
                } else {
                  ChatBlock.sendMessage(
                      player, ChatColor.RED + plugin.getLang("you.cannot.kick.another.leader"));
                }
              } else {
                ChatBlock.sendMessage(
                    player,
                    ChatColor.RED + plugin.getLang("the.player.is.not.a.member.of.your.clan"));
              }
            } else {
              ChatBlock.sendMessage(
                  player, ChatColor.RED + plugin.getLang("you.cannot.kick.yourself"));
            }
          } else {
            ChatBlock.sendMessage(player, ChatColor.RED + plugin.getLang("no.player.matched"));
          }
        } else {
          ChatBlock.sendMessage(player, ChatColor.RED + plugin.getLang("no.leader.permissions"));
        }
      } else {
        ChatBlock.sendMessage(player, ChatColor.RED + plugin.getLang("not.a.member.of.any.clan"));
      }
    } else {
      ChatBlock.sendMessage(player, ChatColor.RED + plugin.getLang("insufficient.permissions"));
    }
  }
  /**
   * Execute the command
   *
   * @param player
   * @param arg
   */
  public void execute(Player player, String[] arg) {
    SimpleClans plugin = SimpleClans.getInstance();

    if (plugin.getPermissionsManager().has(player, "simpleclans.leader.invite")) {
      ClanPlayer cp = plugin.getClanManager().getClanPlayer(player);

      if (cp != null) {
        Clan clan = cp.getClan();

        if (clan.isLeader(player)) {
          if (arg.length == 1) {
            Player invited = Helper.matchOnePlayer(arg[0]);

            if (invited != null) {
              if (plugin.getPermissionsManager().has(invited, "simpleclans.member.can-join")) {
                if (!invited.getName().equals(player.getName())) {
                  if (!plugin.getSettingsManager().isBanned(player.getName())) {
                    ClanPlayer cpInv = plugin.getClanManager().getClanPlayer(invited);

                    if (cpInv == null) {
                      plugin.getRequestManager().addInviteRequest(cp, invited.getName(), clan);
                      ChatBlock.sendMessage(
                          player,
                          ChatColor.AQUA
                              + MessageFormat.format(
                                  plugin.getLang().getString("has.been.asked.to.join"),
                                  Helper.capitalize(invited.getName()),
                                  clan.getName()));
                    } else {
                      ChatBlock.sendMessage(
                          player,
                          ChatColor.RED
                              + plugin
                                  .getLang()
                                  .getString("the.player.is.already.member.of.another.clan"));
                    }
                  } else {
                    ChatBlock.sendMessage(
                        player,
                        ChatColor.RED
                            + plugin
                                .getLang()
                                .getString("this.player.is.banned.from.using.clan.commands"));
                  }
                } else {
                  ChatBlock.sendMessage(
                      player,
                      ChatColor.RED + plugin.getLang().getString("you.cannot.invite.yourself"));
                }
              } else {
                ChatBlock.sendMessage(
                    player,
                    ChatColor.RED
                        + plugin
                            .getLang()
                            .getString(
                                "the.player.doesn.t.not.have.the.permissions.to.join.clans"));
              }
            } else {
              ChatBlock.sendMessage(
                  player, ChatColor.RED + plugin.getLang().getString("no.player.matched"));
            }
          } else {
            ChatBlock.sendMessage(
                player,
                ChatColor.RED
                    + MessageFormat.format(
                        plugin.getLang().getString("usage.0.invite.player"),
                        plugin.getSettingsManager().getCommandClan()));
          }
        } else {
          ChatBlock.sendMessage(
              player, ChatColor.RED + plugin.getLang().getString("no.leader.permissions"));
        }
      } else {
        ChatBlock.sendMessage(
            player, ChatColor.RED + plugin.getLang().getString("not.a.member.of.any.clan"));
      }
    } else {
      ChatBlock.sendMessage(
          player, ChatColor.RED + plugin.getLang().getString("insufficient.permissions"));
    }
  }
  @Override
  public void execute(CommandSender sender, String label, String[] args) {
    String headColor = plugin.getSettingsManager().getPageHeadingsColor();
    String subColor = plugin.getSettingsManager().getPageSubTitleColor();

    if (plugin.getPermissionsManager().has(sender, "simpleclans.anyone.rivalries")) {
      List<Clan> clans = plugin.getClanManager().getClans();
      plugin.getClanManager().sortClansByKDR(clans);

      ChatBlock chatBlock = new ChatBlock();

      ChatBlock.sendBlank(sender);
      ChatBlock.saySingle(
          sender,
          plugin.getSettingsManager().getServerName()
              + subColor
              + " "
              + plugin.getLang("rivalries")
              + " "
              + headColor
              + Helper.generatePageSeparator(plugin.getSettingsManager().getPageSep()));
      ChatBlock.sendBlank(sender);
      ChatBlock.sendMessage(
          sender,
          headColor
              + plugin.getLang("legend")
              + ChatColor.DARK_RED
              + " ["
              + plugin.getLang("war")
              + "]");
      ChatBlock.sendBlank(sender);

      chatBlock.setAlignment("l", "l");
      chatBlock.addRow(plugin.getLang("clan"), plugin.getLang("rivals"));

      for (Clan clan : clans) {
        if (!clan.isVerified()) {
          continue;
        }

        chatBlock.addRow(
            "  " + ChatColor.AQUA + clan.getName(),
            clan.getRivalString(ChatColor.DARK_GRAY + ", "));
      }

      boolean more = chatBlock.sendBlock(sender, plugin.getSettingsManager().getPageSize());

      if (more) {
        plugin.getStorageManager().addChatBlock(sender, chatBlock);
        ChatBlock.sendBlank(sender);
        ChatBlock.sendMessage(
            sender,
            headColor
                + MessageFormat.format(
                    plugin.getLang("view.next.page"),
                    plugin.getSettingsManager().getCommandMore()));
      }

      ChatBlock.sendBlank(sender);
    } else {
      ChatBlock.sendMessage(sender, ChatColor.RED + plugin.getLang("insufficient.permissions"));
    }
  }