aboutsummaryrefslogtreecommitdiff
import typing, uuid
from src import IRCBot, IRCChannel, IRCBuffer, IRCObject, IRCServer, utils

class User(IRCObject.Object):
    def __init__(self, nickname: str, id: int, server: "IRCServer.Server",
            bot: "IRCBot.Bot"):
        self.name = ""
        self.nickname = ""
        self.nickname_lower = ""

        self.server = server
        self.set_nickname(nickname)
        self._id = id
        self._id_override: typing.Optional[int] = None
        self.username: typing.Optional[str] = None
        self.hostname: typing.Optional[str] = None
        self.realname: typing.Optional[str] = None
        self.bot = bot
        self.channels: typing.Set[IRCChannel.Channel] = set([])

        self.account = None

        self.away = False
        self.away_message: typing.Optional[str] = None

        self.buffer = IRCBuffer.Buffer(bot, server)

    def __repr__(self) -> str:
        return "IRCUser.User(%s|%s)" % (self.server.name, self.name)
    def __str__(self) -> str:
        return self.nickname

    def hostmask(self) -> typing.Optional[str]:
        if self.nickname and self.username and self.hostname:
            return "%s!%s@%s" % (self.nickname, self.username, self.hostname)
        return None
    def userhost(self) -> typing.Optional[str]:
        if self.username and self.hostname:
            return "%s@%s" % (self.username, self.hostname)
        return None

    def get_id(self)-> int:
        return self._id_override or self._id

    def set_nickname(self, nickname: str):
        self.nickname = nickname
        self.nickname_lower = self.server.irc_lower(nickname)
        self.name = self.nickname_lower
    def join_channel(self, channel: "IRCChannel.Channel"):
        self.channels.add(channel)
    def part_channel(self, channel: "IRCChannel.Channel"):
        self.channels.remove(channel)

    def set_setting(self, setting: str, value: typing.Any):
        self.bot.database.user_settings.set(self.get_id(), setting, value)
    def get_setting(self, setting: str, default: typing.Any=None) -> typing.Any:
        return self.bot.database.user_settings.get(self.get_id(), setting,
            default)

    def find_setting(self, pattern: str=None, prefix: str=None,
            default: typing.Any=[]) -> typing.List[typing.Any]:
        if not pattern == None:
            return self.bot.database.user_settings.find(self.get_id(), pattern,
                default)
        elif not prefix == None:
            return self.bot.database.user_settings.find_prefix(self.get_id(),
                prefix, default)
        else:
            raise ValueError("Please provide 'pattern' or 'prefix'")

    def del_setting(self, setting):
        self.bot.database.user_settings.delete(self.get_id(), setting)
    def get_channel_settings_per_setting(self, setting: str,
            default: typing.Any=[]) -> typing.List[typing.Any]:
        return self.bot.database.user_channel_settings.find_by_setting(
            self.get_id(), setting, default)

    def send_message(self, message: str, tags: dict={}):
        self.server.send_message(self.nickname, message, tags=tags)
    def send_action(self, message: str, tags: dict={}):
        self.server.send_action(self.nickname, message, tags=tags)
    def send_notice(self, text: str, tags: dict={}):
        self.server.send_notice(self.nickname, text, tags=tags)
    def send_ctcp_response(self, command: str, args: str):
        self.send_notice("\x01%s %s\x01" % (command, args))
    def send_tagmsg(self, tags: dict):
        self.server.send_tagmsg(self.nickname, tags)