private void promoteUser(ChangeRolePacket r)
    {
        OperationStatusPacket opStat;
        int flag = OperationStatusPacket.SUCCESS;
        User sender = null;
        User affected = null;
        
        for (User u : users.keySet())
        {
            if(u.getID() == r.getSenderID())
            {
                sender = u;
            }
            else if(u.getID() == r.getUserID())
            {
                affected = u;
            }
            if(sender != null && affected != null)
                break;
        }
        
        // This should *never* happen
        if(sender == null)
            return;
        if(affected != null)
        {
            try 
            {
                // Update the user's role.
                ChatRoleDAOMySQLImpl.getInstance().updateRole(chatID, r.getUserID(), r.getRole());
                
                affected.setRole(r.getRole());
                // If the SQL statement fails, this will never run, so it's safe to do here
                Packet p = PacketCreator.createUserNotify(affected.getName(), r.getUserID(), r.getChatID(), r.getRole(), UserNotifyPacket.PROMOTED);
                broadcast(r.getUserID(), p, false, true);

            } catch (SQLException e) 
            {
                System.err.println("Chat.promoteUser: SQL exception thrown: " + e.getMessage());
                flag = OperationStatusPacket.FAIL;
            }
        }
        else
            flag = OperationStatusPacket.FAIL;
        
        // Send them an OperationStatusPacket no matter what
        opStat = PacketCreator.createOperationStatus(r.getSenderID(), chatID, flag, OperationStatusPacket.OP_CRUD);
        ((ServerUser)sender).notifyClient(opStat);
    }