コード例 #1
0
ファイル: bot.py プロジェクト: johndward01/Python-Projects
class Bot:
    def __init__(self, command_prefix='!'):
        self.socket = socket()
        self.connected = False
        self.command_prefix = command_prefix

        self.on_message_received = Event()
        self.on_message_sent = Event()

        self.on_whisper_received = Event()
        self.on_whisper_sent = Event()

        self.on_command_executed = Event()
        self.on_command_triggered = Event()

    def disconnect(self):
        self.socket.close()
        self.connected = False

    def run(self):
        if not self.connected:
            self._connect()

        while True:
            try:
                msg = self._get_next_socket_msg()
                self._process_message(msg)
            except Exception as e:
                print(f'exception occured in run():\n\t{e}')
                continue

    def send(self, content):
        self.send_raw(f'PRIVMSG #{cfg["channel"]} :{content}')

    def send_raw(self, content):
        self.socket.send(encode(content))

    def _process_message(self, raw_str):
        msg = str_to_message(raw_str)
        if msg is not None:
            if not self._process_command(msg):
                self.on_message_received.trigger(msg)

    def _process_command(self, msg: Message):
        if msg.content.startswith(self.command_prefix):
            parts = shlex.split(msg.content)
            parts[0] = parts[0][1:]
            cmd = ([c for c in commands if c.name == parts[0]] or (None, ))[0]

            if cmd:
                try:
                    cmd(msg, parts[1:])
                except Exception as e:
                    print(f'error executing command {cmd.name}:\n\t{e}')
                return True
        return False

    def _connect(self, log_errors=True):
        try:
            self.socket.connect(('irc.chat.twitch.tv', 6667))
            self._login()
            self.connected = True
        except Exception as e:
            if log_errors:
                print(f'error occured when trying to connect to chat: \n\t{e}')

    def _login(self):
        self.socket.send(encode(f'PASS {cfg["oauth"]}'))
        self.socket.send(encode(f'NICK {cfg["username"]}'))
        self.socket.send(encode(f'JOIN #{cfg["channel"]}'))

    def _get_next_socket_msg(self):
        return decode(self.socket.recv(1024))