Runs a WHOIS on someone.
        Required arguments:
        * nick - Nick to whois.
        Returns a dictionary:
            IDENT == The user's ident.
            HOST == The user's host.
            NAME == The user's real name.
            SERVER == The server the user is on.
            SERVER_INFO == The name of the server the user is on.
            CHANNELS == A list of channels the user is on.
            IDLE == The user's idle time.
            AWAY, present if the user is away,
                returns a string containing their away message.
            OP == Present if the user is an IRC operator.
            ETC == Other data sent in response to the WHOIS query.

def whois(self, nick):
        """
        Runs a WHOIS on someone.
        Required arguments:
        * nick - Nick to whois.
        Returns a dictionary:
            IDENT == The user's ident.
            HOST == The user's host.
            NAME == The user's real name.
            SERVER == The server the user is on.
            SERVER_INFO == The name of the server the user is on.
            CHANNELS == A list of channels the user is on.
            IDLE == The user's idle time.
            AWAY, present if the user is away,
                returns a string containing their away message.
            OP == Present if the user is an IRC operator.
            ETC == Other data sent in response to the WHOIS query.
        """
        with self.lock:
            self.send('WHOIS %s' % nick)
            whois_r = {'CHANNELS': []}

            while self.readable():
                msg = self._recv()
                info = msg[2].split(None, 4)
                if msg[0] == '311':
                    whois_r['IDENT'] = info[1]
                    whois_r['HOST'] = info[2]
                    whois_r['NAME'] = info[4][1:]
                elif msg[0] == '312':
                    whois_r['SERVER'] = info[1]
                    whois_r['SERVER_INFO'] = ' '.join(info[2:])[1:]
                elif msg[0] == '319':
                    whois_r['CHANNELS'].append(' '.join(info[1:])[1:].split())
                elif msg[0] == '317':
                    whois_r['IDLE'] = info[2]
                elif msg[0] == '301':
                    whois_r['AWAY'] = info[1][1:]
                elif msg[0] == '313':
                    whois_r['OP'] = ' '.join(info[1:])[1:]
                elif msg[0] == '318':
                    break
                else:
                    if 'ETC' in whois_r:
                        whois_r['ETC'].append(msg[2])
                    else:
                        whois_r['ETC'] = [msg[2]]

            return whois_r