Exemplo n.º 1
0
class Channel(object):
    """
    A class for keeping information about an IRC channel.
    """

    user_modes = 'ovqha'
    """
    Modes which are applicable to individual users, and which
    should be tracked in the mode_users dictionary.
    """

    def __init__(self):
        self._users = IRCDict()
        self.mode_users = collections.defaultdict(IRCDict)
        self.modes = {}

    def users(self):
        """Returns an unsorted list of the channel's users."""
        return self._users.keys()

    def opers(self):
        """Returns an unsorted list of the channel's operators."""
        return self.mode_users['o'].keys()

    def voiced(self):
        """Returns an unsorted list of the persons that have voice
        mode set in the channel."""
        return self.mode_users['v'].keys()

    def owners(self):
        """Returns an unsorted list of the channel's owners."""
        return self.mode_users['q'].keys()

    def halfops(self):
        """Returns an unsorted list of the channel's half-operators."""
        return self.mode_users['h'].keys()

    def admins(self):
        """Returns an unsorted list of the channel's admins."""
        return self.mode_users['a'].keys()

    def has_user(self, nick):
        """Check whether the channel has a user."""
        return nick in self._users

    def is_oper(self, nick):
        """Check whether a user has operator status in the channel."""
        return nick in self.mode_users['o']

    def is_voiced(self, nick):
        """Check whether a user has voice mode set in the channel."""
        return nick in self.mode_users['v']

    def is_owner(self, nick):
        """Check whether a user has owner status in the channel."""
        return nick in self.mode_users['q']

    def is_halfop(self, nick):
        """Check whether a user has half-operator status in the channel."""
        return nick in self.mode_users['h']

    def is_admin(self, nick):
        """Check whether a user has admin status in the channel."""
        return nick in self.mode_users['a']

    def add_user(self, nick):
        self._users[nick] = 1

    @property
    def user_dicts(self):
        yield self._users
        for d in self.mode_users.values():
            yield d

    def remove_user(self, nick):
        for d in self.user_dicts:
            d.pop(nick, None)

    def change_nick(self, before, after):
        self._users[after] = self._users.pop(before)
        for mode_lookup in self.mode_users.values():
            if before in mode_lookup:
                mode_lookup[after] = mode_lookup.pop(before)

    def set_userdetails(self, nick, details):
        if nick in self._users:
            self._users[nick] = details

    def set_mode(self, mode, value=None):
        """Set mode on the channel.

        Arguments:

            mode -- The mode (a single-character string).

            value -- Value
        """
        if mode in self.user_modes:
            self.mode_users[mode][value] = 1
        else:
            self.modes[mode] = value

    def clear_mode(self, mode, value=None):
        """Clear mode on the channel.

        Arguments:

            mode -- The mode (a single-character string).

            value -- Value
        """
        try:
            if mode in self.user_modes:
                del self.mode_users[mode][value]
            else:
                del self.modes[mode]
        except KeyError:
            pass

    def has_mode(self, mode):
        return mode in self.modes

    def is_moderated(self):
        return self.has_mode("m")

    def is_secret(self):
        return self.has_mode("s")

    def is_protected(self):
        return self.has_mode("p")

    def has_topic_lock(self):
        return self.has_mode("t")

    def is_invite_only(self):
        return self.has_mode("i")

    def has_allow_external_messages(self):
        return self.has_mode("n")

    def has_limit(self):
        return self.has_mode("l")

    def limit(self):
        if self.has_limit():
            return self.modes["l"]
        else:
            return None

    def has_key(self):
        return self.has_mode("k")
Exemplo n.º 2
0
class Channel(object):
    """
    A class for keeping information about an IRC channel.
    """
    def __init__(self):
        self.userdict = IRCDict()
        self.operdict = IRCDict()
        self.voiceddict = IRCDict()
        self.ownerdict = IRCDict()
        self.halfopdict = IRCDict()
        self.modes = {}

    def users(self):
        """Returns an unsorted list of the channel's users."""
        return self.userdict.keys()

    def opers(self):
        """Returns an unsorted list of the channel's operators."""
        return self.operdict.keys()

    def voiced(self):
        """Returns an unsorted list of the persons that have voice
        mode set in the channel."""
        return self.voiceddict.keys()

    def owners(self):
        """Returns an unsorted list of the channel's owners."""
        return self.ownerdict.keys()

    def halfops(self):
        """Returns an unsorted list of the channel's half-operators."""
        return self.halfopdict.keys()

    def has_user(self, nick):
        """Check whether the channel has a user."""
        return nick in self.userdict

    def is_oper(self, nick):
        """Check whether a user has operator status in the channel."""
        return nick in self.operdict

    def is_voiced(self, nick):
        """Check whether a user has voice mode set in the channel."""
        return nick in self.voiceddict

    def is_owner(self, nick):
        """Check whether a user has owner status in the channel."""
        return nick in self.ownerdict

    def is_halfop(self, nick):
        """Check whether a user has half-operator status in the channel."""
        return nick in self.halfopdict

    def add_user(self, nick):
        self.userdict[nick] = 1

    def remove_user(self, nick):
        for d in self.userdict, self.operdict, self.voiceddict:
            if nick in d:
                del d[nick]

    def change_nick(self, before, after):
        self.userdict[after] = self.userdict.pop(before)
        if before in self.operdict:
            self.operdict[after] = self.operdict.pop(before)
        if before in self.voiceddict:
            self.voiceddict[after] = self.voiceddict.pop(before)

    def set_userdetails(self, nick, details):
        if nick in self.userdict:
            self.userdict[nick] = details

    def set_mode(self, mode, value=None):
        """Set mode on the channel.

        Arguments:

            mode -- The mode (a single-character string).

            value -- Value
        """
        if mode == "o":
            self.operdict[value] = 1
        elif mode == "v":
            self.voiceddict[value] = 1
        elif mode == "q":
            self.ownerdict[value] = 1
        elif mode == "h":
            self.halfopdict[value] = 1
        else:
            self.modes[mode] = value

    def clear_mode(self, mode, value=None):
        """Clear mode on the channel.

        Arguments:

            mode -- The mode (a single-character string).

            value -- Value
        """
        try:
            if mode == "o":
                del self.operdict[value]
            elif mode == "v":
                del self.voiceddict[value]
            elif mode == "q":
                del self.ownerdict[value]
            elif mode == "h":
                del self.halfopdict[value]
            else:
                del self.modes[mode]
        except KeyError:
            pass

    def has_mode(self, mode):
        return mode in self.modes

    def is_moderated(self):
        return self.has_mode("m")

    def is_secret(self):
        return self.has_mode("s")

    def is_protected(self):
        return self.has_mode("p")

    def has_topic_lock(self):
        return self.has_mode("t")

    def is_invite_only(self):
        return self.has_mode("i")

    def has_allow_external_messages(self):
        return self.has_mode("n")

    def has_limit(self):
        return self.has_mode("l")

    def limit(self):
        if self.has_limit():
            return self.modes["l"]
        else:
            return None

    def has_key(self):
        return self.has_mode("k")