private boolean invite(CommandSender sender, String[] args) {
    if (!(sender instanceof Player)) {
      return true;
    }
    Player player = (Player) sender;

    if (args.length != 1) {
      return false;
    }

    // check if leader
    Party party = plugin.parties.get(player.getName().toLowerCase());
    if (party == null) {
      party = new Party(player);
    }
    if (!party.isLeader(player)) {
      player.sendMessage("You can only invite someone if you are the party leader.");
      return true;
    }

    // get target player
    Player target = null;
    List<Player> matches = Bukkit.matchPlayer(args[0]);
    if (matches.size() == 1) {
      target = matches.get(0);
    }
    if (target == null) {
      player.sendMessage("No such player found.");
      return true;
    }

    // check if target is already in a party
    if (plugin.parties.containsKey(target.getName().toLowerCase())) {
      player.sendMessage("That player is already in a party.");
      return true;
    }

    // check if target is in an instance
    if (!target.getWorld().equals(Bukkit.getWorlds().get(0))) {
      player.sendMessage("That player is in an instance.");
      return true;
    }

    // invite to party
    plugin.parties.put(player.getName().toLowerCase(), party);
    target.sendMessage(player.getDisplayName() + " has invited you to join a party.");
    target.sendMessage("Type 'yes' to accept this invitation.");
    PendingAction action =
        new PendingAction(target, ActionType.JOIN_PARTY, player.getName().toLowerCase());
    plugin.addPendingAction(action);
    player.sendMessage("Invitation sent.");
    return true;
  }