public boolean rankup(Player p) {
        if (!p.hasPermission(PERMISSION_RANKUP)) {
            p.sendMessage(translate("rankup.no-permission"));
            return false;
        }
        Rank current = ranks.getCurrentRank(perms, p);
        if (current == null) {
            p.sendMessage(translate("rankup.no-current-rank"));
            return false;
        }
        Rank next = ranks.getNextRank(current);
        if (next == null) {
            p.sendMessage(translate("rankup.no-next-rank", current.getName()));
            return false;
        }
        double price = next.getPrice();

        EconomyResponse transaction = econ.withdrawPlayer(p.getName(), p.getWorld().getName(), price);

        if (!transaction.transactionSuccess()) {
            p.sendMessage(translate("rankup.no-money", current.getName(), next.getName(), price));
            return false;
        }

        for (GroupAssignment assignment : current.getGroups()) {
            perms.playerRemoveGroup(assignment.getWorld(), p.getName(), assignment.getGroup());
        }

        for (GroupAssignment assignment : next.getGroups()) {
            perms.playerAddGroup(assignment.getWorld(), p.getName(), assignment.getGroup());
        }

        p.sendMessage(translate("rankup.success", current.getName(), next.getName(), price));

        getServer().broadcastMessage(translate("rankup.success-broadcast", p.getName(), p.getDisplayName(), current.getName(), next.getName(), price));
            
        return true;
    }