sopel/tools/target.py
2017-11-22 19:26:40 -05:00

91 lines
2.8 KiB
Python
Executable File

# coding=utf-8
from __future__ import unicode_literals, absolute_import, print_function, division
import functools
from tools import Identifier
@functools.total_ordering
class User(object):
"""A representation of a user Sopel is aware of."""
def __init__(self, nick, user, host):
assert isinstance(nick, Identifier)
self.nick = nick
"""The user's nickname."""
self.user = user
"""The user's local username."""
self.host = host
"""The user's hostname."""
self.channels = {}
"""The channels the user is in.
This maps channel name ``Identifier``\s to ``Channel`` objects."""
self.account = None
"""The IRC services account of the user.
This relies on IRCv3 account tracking being enabled."""
self.away = None
"""Whether the user is marked as away."""
hostmask = property(lambda self: '{}!{}@{}'.format(self.nick, self.user,
self.host))
"""The user's full hostmask."""
def __eq__(self, other):
if not isinstance(other, User):
return NotImplemented
return self.nick == other.nick
def __lt__(self, other):
if not isinstance(other, User):
return NotImplemented
return self.nick < other.nick
@functools.total_ordering
class Channel(object):
"""A representation of a channel Sopel is in."""
def __init__(self, name):
assert isinstance(name, Identifier)
self.name = name
"""The name of the channel."""
self.users = {}
"""The users in the channel.
This maps username ``Identifier``\s to channel objects."""
self.privileges = {}
"""The permissions of the users in the channel.
This maps username ``Identifier``s to bitwise integer values. This can
be compared to appropriate constants from ``sopel.module``."""
self.topic = ''
"""The topic of the channel."""
def clear_user(self, nick):
user = self.users.pop(nick, None)
self.privileges.pop(nick, None)
if user != None:
user.channels.pop(self.name, None)
def add_user(self, user):
assert isinstance(user, User)
self.users[user.nick] = user
self.privileges[user.nick] = 0
user.channels[self.name] = self
def rename_user(self, old, new):
if old in self.users:
self.users[new] = self.users.pop(old)
if old in self.privileges:
self.privileges[new] = self.privileges.pop(old)
def __eq__(self, other):
if not isinstance(other, Channel):
return NotImplemented
return self.name == other.name
def __lt__(self, other):
if not isinstance(other, Channel):
return NotImplemented
return self.name < other.name