Module twitchpy.bot

Classes

class Bot (oauth_token: str,
client_id: str,
client_secret: str,
redirect_uri: str,
tokens_path: str,
username: str,
channels: list[str],
command_prefix: str,
authorization_code: str | None = None,
jwt_token: str | None = None,
ready_message: str | None = None)
Expand source code
class Bot:
    """
    Represents a bot
    """

    def __init__(
        self,
        oauth_token: str,
        client_id: str,
        client_secret: str,
        redirect_uri: str,
        tokens_path: str,
        username: str,
        channels: list[str],
        command_prefix: str,
        authorization_code: str | None = None,
        jwt_token: str | None = None,
        ready_message: str | None = None,
    ):
        """
        Args:
            oauth_token (str): OAuth token
            client_id (str): Client ID
            client_secret (str): Client secret
            redirect_uri (str): Redirect URI
            tokens_path (str): Path of tokens file (file included)
            username (str): Name of the bot
            channels (list): Names of channels the bot will access
            command_prefix (str): Prefix of the commands the bot will recognize
            code (str): Authorization code for getting an user token
            jwt_token (str): JWT Token
            ready_message (str): Message that the bot will send through the chats of the channels it access
        """

        self.client = Client(
            client_id,
            client_secret,
            redirect_uri,
            tokens_path,
            authorization_code,
            jwt_token,
        )
        self.__oauth_token = oauth_token
        self.__finish = False
        self.username = username

        self.channels = []

        for channel in channels:
            self.channels.append(channel.replace("@", "").lower())

        self.command_prefix = command_prefix
        self.ready_message = ready_message if ready_message is not None else ""

        self.custom_methods_before_join_channel = {}
        self.methods_before_join_channel_to_remove = []
        self.custom_methods_after_join_channel = {}
        self.methods_after_join_channel_to_remove = []

        self.custom_methods_before_leave_channel = {}
        self.methods_before_leave_channel_to_remove = []
        self.custom_methods_after_leave_channel = {}
        self.methods_after_leave_channel_to_remove = []

        self.custom_checks = {}
        self.checks_to_remove = []
        self.custom_listeners = {}
        self.listeners_to_remove = []
        self.custom_commands = {}
        self.commands_to_remove = []
        self.custom_methods_before_commands = {}
        self.methods_before_commands_to_remove = []
        self.custom_methods_after_commands = {}
        self.methods_after_commands_to_remove = []

        self.custom_methods_after_clearchat = {}
        self.methods_after_clearchat_to_remove = []

        self.custom_methods_after_delete_message = {}
        self.methods_after_delete_message_to_remove = []

        self.custom_methods_after_bot_connected = {}
        self.methods_after_bot_connected_to_remove = []

        self.custom_methods_after_toggle_host = {}
        self.methods_after_toggle_host_to_remove = []

        self.custom_methods_after_server_reconnect = {}
        self.methods_after_server_reconnect_to_remove = []

        self.custom_methods_after_channel_change = {}
        self.methods_after_channel_change_to_remove = []

        self.custom_methods_after_event = {}
        self.methods_after_event_to_remove = []

        self.custom_methods_after_user_join = {}
        self.methods_after_user_join_to_remove = []

        self.custom_methods_after_whisper = {}
        self.methods_after_whisper_to_remove = []

        self.irc = ssl.SSLContext().wrap_socket(socket.socket())

    def __send_command(self, command: str, args: str, tags: str | None = None) -> None:
        logger.info("%s%s < %s", tags + " " if tags is not None else "", command, args)

        self.irc.send(
            (
                f"{tags + ' ' if tags is not None else ''}{command} {args}" + "\r\n"
            ).encode()
        )

    def __send_join(self, channel: str) -> None:
        self.__send_command("JOIN", f"#{channel}")

    def __send_nick(self, username: str) -> None:
        self.__send_command("NICK", username)

    def __send_part(self, channel: str) -> None:
        self.__send_command("PART", f"#{channel}")

    def __send_pass(self, oauth_token: str) -> None:
        self.__send_command("PASS", oauth_token)

    def __send_pong(self, text: str) -> None:
        self.__send_command("PONG", f":{text}")

    def __send_privmsg(
        self, channel: str, text: str, message_to_reply: str | None = None
    ) -> None:
        self.__send_command(
            "PRIVMSG",
            f"#{channel} :{text}",
            (
                f"@reply-parent-msg-id={message_to_reply}"
                if message_to_reply is not None
                else None
            ),
        )

    def __login(self) -> None:
        self.__send_pass(self.__oauth_token)
        self.__send_nick(self.username)

    def __request_irc_capabilities(self) -> None:
        self.__send_command(
            "CAP REQ", ":twitch.tv/commands twitch.tv/membership twitch.tv/tags"
        )

    def join_channel(self, channel: str) -> None:
        """
        Makes the bot to join into a channel

        Args:
            channel (str): The channel to join
        """

        self.__execute_methods_before_join_channel(channel)

        self.__send_join(channel)
        self.__send_privmsg(channel, self.ready_message)

        self.__execute_methods_after_join_channel(channel)

        self.__remove_methods_before_join_channel()
        self.__remove_methods_after_join_channel()

    def leave_channel(self, channel: str) -> None:
        """
        Makes the bot to leave into a channel

        Args:
            channel (str): The channel to leave
        """

        self.__execute_methods_before_leave_channel(channel)

        self.__send_part(channel)

        self.__execute_methods_after_leave_channel(channel)

        self.__remove_methods_before_leave_channel()
        self.__remove_methods_after_leave_channel()

    def __connect(self) -> None:
        self.irc.settimeout(_DEFAULT_TIMEOUT)
        self.irc.connect((_IRC_SERVER, _IRC_PORT))

        self.__login()
        self.__request_irc_capabilities()

        for channel in self.channels:
            self.join_channel(channel)

    def run(self) -> None:
        """
        Runs the bot
        """

        self.__connect()
        self.__loop()

    def stop(self) -> None:
        """
        Stops the bot
        """

        self.__finish = True

    def __get_user_from_prefix(self, prefix: str) -> str | None:
        domain = prefix.split("!")[0]

        if domain.endswith(".tmi.twitch.tv"):
            return domain.replace(".tmi.twitch.tv", "")

        if "tmi.twitch.tv" not in domain:
            return domain

        return None

    def __remove_prefix(self, string: str, prefix: str) -> str:
        if not string.startswith(prefix):
            return string

        return string[len(prefix) :]

    def __parse_message(self, received_msg: str) -> Message:
        parts = received_msg.split(" ")

        prefix = None
        user = None
        channel = None
        irc_command = None
        irc_tags = None
        irc_args = None
        text = None
        text_command = None
        text_args = None

        if parts[0].startswith("@"):
            irc_tags = dict(
                item.split("=")
                for item in self.__remove_prefix(parts[0], "@").split(";")
            )
            parts = parts[1:]

        if parts[0].startswith(":"):
            prefix = self.__remove_prefix(parts[0], ":")
            user = self.__get_user_from_prefix(prefix)
            parts = parts[1:]

        text_start = next(
            (idx for idx, part in enumerate(parts) if part.startswith(":")), None
        )

        if text_start is not None:
            text_parts = parts[text_start:]
            text_parts[0] = text_parts[0][1:]
            text = " ".join(text_parts)

            if text_parts[0].startswith(self.command_prefix):
                text_command = self.__remove_prefix(text_parts[0], self.command_prefix)
                text_args = text_parts[1:]

            parts = parts[:text_start]

        irc_command = parts[0]
        irc_args = parts[1:]

        hash_start = next(
            (idx for idx, part in enumerate(irc_args) if part.startswith("#")), None
        )

        if hash_start is not None:
            channel = irc_args[hash_start][1:]

        message = Message(
            prefix,
            user,
            channel,
            irc_command,
            irc_tags,
            irc_args,
            text,
            text_command,
            text_args,
        )

        return message

    def __execute_methods_before_join_channel(self, channel: str) -> None:
        for method in self.custom_methods_before_join_channel.values():
            method(channel)

    def __remove_methods_before_join_channel(self) -> None:
        for method in self.methods_before_join_channel_to_remove:
            if method in self.custom_methods_before_join_channel:
                self.custom_methods_before_join_channel.pop(method)

        self.methods_before_join_channel_to_remove = []

    def __execute_methods_after_join_channel(self, channel: str) -> None:
        for method in self.custom_methods_after_join_channel.values():
            method(channel)

    def __remove_methods_after_join_channel(self) -> None:
        for method in self.methods_after_join_channel_to_remove:
            if method in self.custom_methods_after_join_channel:
                self.custom_methods_after_join_channel.pop(method)

        self.methods_after_join_channel_to_remove = []

    def __execute_methods_before_leave_channel(self, channel: str) -> None:
        for method in self.custom_methods_before_leave_channel.values():
            method(channel)

    def __remove_methods_before_leave_channel(self) -> None:
        for method in self.methods_before_leave_channel_to_remove:
            if method in self.custom_methods_before_leave_channel:
                self.custom_methods_before_leave_channel.pop(method)

        self.methods_before_leave_channel_to_remove = []

    def __execute_methods_after_leave_channel(self, channel: str) -> None:
        for method in self.custom_methods_after_leave_channel.values():
            method(channel)

    def __remove_methods_after_leave_channel(self) -> None:
        for method in self.methods_after_leave_channel_to_remove:
            if method in self.custom_methods_after_leave_channel:
                self.custom_methods_after_leave_channel.pop(method)

        self.methods_after_leave_channel_to_remove = []

    def __execute_checks(self) -> None:
        for check in self.custom_checks.values():
            check()

    def __remove_checks(self) -> None:
        for check in self.checks_to_remove:
            if check in self.custom_checks:
                self.custom_checks.pop(check)

        self.checks_to_remove = []

    def __execute_listeners(self, message: Message) -> None:
        for listener in self.custom_listeners.values():
            listener(message)

    def __remove_listeners(self) -> None:
        for listener in self.listeners_to_remove:
            if listener in self.custom_listeners:
                self.custom_listeners.pop(listener)

        self.listeners_to_remove = []

    def __execute_command(self, message: Message) -> None:
        self.custom_commands[message.text_command](message)

    def __remove_commands(self) -> None:
        for command in self.commands_to_remove:
            if command in self.custom_commands:
                self.custom_commands.pop(command)

        self.commands_to_remove = []

    def __execute_methods_before_commands(self, message: Message) -> None:
        for before in self.custom_methods_before_commands.values():
            before(message)

    def __remove_methods_before_commands(self) -> None:
        for method in self.methods_before_commands_to_remove:
            if method in self.custom_methods_before_commands:
                self.custom_methods_before_commands.pop(method)

        self.methods_before_commands_to_remove = []

    def __execute_methods_after_commands(self, message: Message) -> None:
        for after in self.custom_methods_after_commands.values():
            after(message)

    def __remove_methods_after_commands(self) -> None:
        for method in self.methods_after_commands_to_remove:
            if method in self.custom_methods_after_commands:
                self.custom_methods_after_commands.pop(method)

        self.methods_after_commands_to_remove = []

    def __execute_methods_after_clearchat(self, message: Message) -> None:
        for method in self.custom_methods_after_clearchat.values():
            method(message)

    def __remove_methods_after_clearchat(self) -> None:
        for method in self.methods_after_clearchat_to_remove:
            if method in self.custom_methods_after_clearchat:
                self.custom_methods_after_clearchat.pop(method)

        self.methods_after_clearchat_to_remove = []

    def __execute_methods_after_delete_message(self, message: Message) -> None:
        for method in self.custom_methods_after_delete_message.values():
            method(message)

    def __remove_methods_after_delete_message(self) -> None:
        for method in self.methods_after_delete_message_to_remove:
            if method in self.custom_methods_after_delete_message:
                self.custom_methods_after_delete_message.pop(method)

        self.methods_after_delete_message_to_remove = []

    def __execute_methods_after_bot_connected(self, message: Message) -> None:
        for method in self.custom_methods_after_bot_connected.values():
            method(message)

    def __remove_methods_after_bot_connected(self) -> None:
        for method in self.methods_after_bot_connected_to_remove:
            if method in self.custom_methods_after_bot_connected:
                self.custom_methods_after_bot_connected.pop(method)

        self.methods_after_bot_connected_to_remove = []

    def __execute_methods_after_toggle_host(self, message: Message) -> None:
        for method in self.custom_methods_after_toggle_host.values():
            method(message)

    def __remove_methods_after_toggle_host(self) -> None:
        for method in self.methods_after_toggle_host_to_remove:
            if method in self.custom_methods_after_toggle_host:
                self.custom_methods_after_toggle_host.pop(method)

        self.methods_after_toggle_host_to_remove = []

    def __execute_methods_after_server_reconnect(self, message: Message) -> None:
        for method in self.custom_methods_after_server_reconnect.values():
            method(message)

    def __remove_methods_after_server_reconnect(self) -> None:
        for method in self.methods_after_server_reconnect_to_remove:
            if method in self.custom_methods_after_server_reconnect:
                self.custom_methods_after_server_reconnect.pop(method)

        self.methods_after_server_reconnect_to_remove = []

    def __execute_methods_after_channel_change(self, message: Message) -> None:
        for method in self.custom_methods_after_channel_change.values():
            method(message)

    def __remove_methods_after_channel_change(self) -> None:
        for method in self.methods_after_channel_change_to_remove:
            if method in self.custom_methods_after_channel_change:
                self.custom_methods_after_channel_change.pop(method)

        self.methods_after_channel_change_to_remove = []

    def __execute_methods_after_event(self, message: Message) -> None:
        for method in self.custom_methods_after_event.values():
            method(message)

    def __remove_methods_after_event(self) -> None:
        for method in self.methods_after_event_to_remove:
            if method in self.custom_methods_after_event:
                self.custom_methods_after_event.pop(method)

        self.methods_after_event_to_remove = []

    def __execute_methods_after_user_join(self, message: Message) -> None:
        for method in self.custom_methods_after_user_join.values():
            method(message)

    def __remove_methods_after_user_join(self) -> None:
        for method in self.methods_after_user_join_to_remove:
            if method in self.custom_methods_after_user_join:
                self.custom_methods_after_user_join.pop(method)

        self.methods_after_user_join_to_remove = []

    def __execute_methods_after_whisper(self, message: Message) -> None:
        for method in self.custom_methods_after_whisper.values():
            method(message)

    def __remove_methods_after_whisper(self) -> None:
        for method in self.methods_after_whisper_to_remove:
            if method in self.custom_methods_after_whisper:
                self.custom_methods_after_whisper.pop(method)

        self.methods_after_whisper_to_remove = []

    def __handle_notice(self, message: Message) -> None:
        logger.info(
            "%s > [%s]: %s | %s",
            message.irc_command,
            message.channel,
            message.text,
            message.irc_tags,
        )

    def __handle_part(self, message: Message) -> None:
        logger.info("%s > [%s] %s", message.irc_command, message.channel, message.user)

        self.__execute_methods_after_leave_channel(
            message.channel if message.channel is not None else ""
        )
        self.__remove_methods_after_leave_channel()

    def __handle_ping(self, message: Message) -> None:
        logger.info("%s > :%s", message.irc_command, message.text)

        self.__send_pong(message.text if message.text is not None else "")

    def __handle_privmsg(self, message: Message) -> None:
        logger.info(
            "%s > [%s] %s: %s | %s",
            message.irc_command,
            message.channel,
            message.user,
            message.text,
            message.irc_tags,
        )

        self.__execute_listeners(message)
        self.__remove_listeners()

        if message.text_command in self.custom_commands:
            self.__execute_methods_before_commands(message)
            self.__remove_methods_before_commands()
            self.__execute_command(message)
            self.__remove_commands()
            self.__execute_methods_after_commands(message)
            self.__remove_methods_after_commands()

    def __handle_clearchat(self, message: Message) -> None:
        logger.info(
            "%s > [%s] %s | %s",
            message.irc_command,
            message.channel,
            message.text if message.text is None else "",
            message.irc_tags,
        )

        self.__execute_methods_after_clearchat(message)
        self.__remove_methods_after_clearchat()

    def __handle_clearmsg(self, message: Message) -> None:
        logger.info(
            "%s > [%s]: %s | %s",
            message.irc_command,
            message.channel,
            message.text,
            message.irc_tags,
        )

        self.__execute_methods_after_delete_message(message)
        self.__remove_methods_after_delete_message()

    def __handle_globaluserstate(self, message: Message) -> None:
        logger.info("%s > | %s", message.irc_command, message.irc_tags)

        self.__execute_methods_after_bot_connected(message)
        self.__remove_methods_after_bot_connected()

    def __handle_hosttarget(self, message: Message) -> None:
        logger.info("%s > [%s]: %s", message.irc_command, message.channel, message.text)

        self.__execute_methods_after_toggle_host(message)
        self.__remove_methods_after_toggle_host()

    def __handle_reconnect(self, message: Message) -> None:
        logger.info("%s >", message.irc_command)

        self.__execute_methods_after_server_reconnect(message)
        self.__remove_methods_after_server_reconnect()

    def __handle_roomstate(self, message: Message) -> None:
        logger.info(
            "%s > [%s] | %s", message.irc_command, message.channel, message.irc_tags
        )

        self.__execute_methods_after_channel_change(message)
        self.__remove_methods_after_channel_change()

    def __handle_usernotice(self, message: Message) -> None:
        logger.info(
            "%s > [%s]: %s | %s",
            message.irc_command,
            message.channel,
            message.text if message.text is not None else "",
            message.irc_tags,
        )

        self.__execute_methods_after_event(message)
        self.__remove_methods_after_event()

    def __handle_userstate(self, message: Message) -> None:
        logger.info(
            "%s > [%s] | %s", message.irc_command, message.channel, message.irc_tags
        )

        self.__execute_methods_after_user_join(message)
        self.__remove_methods_after_user_join()

    def __handle_whisper(self, message: Message) -> None:
        logger.info(
            "%s > %s: %s",
            message.irc_command,
            message.irc_args[0] if message.irc_args is not None else "",
            message.text,
        )

        self.__execute_methods_after_whisper(message)
        self.__remove_methods_after_whisper()

    def __handle_message(self, received_msg: str) -> None:
        if len(received_msg) == 0:
            return

        message = self.__parse_message(received_msg)

        if message.irc_command == "NOTICE":
            self.__handle_notice(message)

        elif message.irc_command == "PART":
            self.__handle_part(message)

        elif message.irc_command == "PING":
            self.__handle_ping(message)

        elif message.irc_command == "PRIVMSG":
            self.__handle_privmsg(message)

        elif message.irc_command == "CLEARCHAT":
            self.__handle_clearchat(message)

        elif message.irc_command == "CLEARMSG":
            self.__handle_clearmsg(message)

        elif message.irc_command == "GLOBALUSERSTATE":
            self.__handle_globaluserstate(message)

        elif message.irc_command == "HOSTTARGET":
            self.__handle_hosttarget(message)

        elif message.irc_command == "RECONNECT":
            self.__handle_reconnect(message)

        elif message.irc_command == "ROOMSTATE":
            self.__handle_roomstate(message)

        elif message.irc_command == "USERNOTICE":
            self.__handle_usernotice(message)

        elif message.irc_command == "USERSTATE":
            self.__handle_userstate(message)

        elif message.irc_command == "WHISPER":
            self.__handle_whisper(message)

        else:
            logger.info(
                "%s > [%s] %s: %s",
                message.irc_command,
                message.channel,
                message.user,
                message.text,
            )

    def __loop(self) -> None:
        while not self.__finish:
            try:
                received_msgs = self.irc.recv(2048).decode()

                for received_msg in received_msgs.split("\r\n"):
                    self.__handle_message(received_msg)

            except socket.timeout:
                self.__execute_checks()
                self.__remove_checks()

    def send(self, channel: str, text: str) -> None:
        """
        Sends a message by chat

        Args:
            channel (str): Owner of the chat
            text (str): Message's text
        """

        self.__send_privmsg(channel, text)

    def reply(self, channel: str, message_id: str, text: str) -> None:
        """
        Replies to a message in a chat

        Args:
            channel (str): Owner of the chat
            message_id (str): ID of the message being replied to
            text (str): Message's text
        """

        self.__send_privmsg(channel, text, message_id)

    def ban(self, channel: str, user: str, reason: str = "") -> None:
        """
        Bans a user

        Args:
            channel (str): Channel who bans
            username (str): User to ban
            reason (str): Reason of the ban
        """

        self.send(channel, f"/ban @{user} {reason}")

    def unban(self, channel: str, user: str) -> None:
        """
        Undoes the ban of a user

        Args:
            channel (str): Name of the channel who readmits
            user (str): Name of the user to readmit
        """

        self.send(channel, f"/unban @{user}")

    def clear(self, channel: str) -> None:
        """
        Clears the chat

        Args:
            channel (str): Channel to clean the chat
        """

        self.send(channel, "/clear")

    def color(self, channel: str, color: str) -> None:
        """
        Changes the color of the channel's name in the chat

        Args:
            channel (str): Channel to change color
            color (str): New color's name
        """

        self.send(channel, f"/color {color}")

    def commercial(self, channel: str, duration: int = 30) -> None:
        """
        Places advertising in the channel

        Args:
            channel (str): Channel on which start the commercial
            duration (int): Duration of advertising
        """

        self.send(channel, f"/commercial {duration}")

    def delete(self, channel: str, message_id: str) -> None:
        """
        Deletes the specified message from the chat room

        Args:
            channel (str): Channel where the message was sent
            message_id (str): ID of the message
        """

        self.send(channel, f"/delete {message_id}")

    def disconnect(self, channel: str) -> None:
        """
        Closes the session that the command was received from

        Args:
            channel (str): Channel whose session close to
        """

        self.send(channel, "/disconnect")

    def emoteonly(self, channel: str) -> None:
        """
        Activates the "emotes only" mode

        Args:
            channel (str): Channel on which activate the mode
        """

        self.send(channel, "/emoteonly")

    def emoteonlyoff(self, channel: str) -> None:
        """
        Disables "emotes only" mode

        Args:
            channel (str): Channel on which disable the mode
        """

        self.send(channel, "/emoteonlyoff")

    def followers(self, channel: str) -> None:
        """
        Activates the "followers only" mode

        Args:
            channel (str): Channel on which activate the mode
        """

        self.send(channel, "/followers")

    def followersoff(self, channel: str) -> None:
        """
        Disables the "followers only" mode

        Args:
            channel (str): Channel on which disable the mode
        """

        self.send(channel, "/followersoff")

    def help(self, channel: str, command: str = "") -> None:
        """
        Shows detailed information about a command

        Args:
            channel (str): Channel in which show the command's information
            command (str): Command to show information about
        """

        self.send(channel, f"/help {command}")

    def host(self, channel: str, username: str) -> None:
        """
        Hosts a channel

        Args:
            channel (str): Name of the channel who hosts
            username (str): Name of the channel to host
        """

        self.send(channel, f"/host {username}")

    def unhost(self, channel: str) -> None:
        """
        Unhosts the hosted channel

        Args:
            channel (str): Channel who unhosts
        """

        self.send(channel, "/unhost")

    def marker(self, channel: str, description: str = "") -> None:
        """
        Leaves a mark on the channel's stream

        Args:
            channel (str): Channel in which leave the mark
            description (str): Mark's description
        """

        self.send(channel, f"/marker {description}")

    def me(self, channel: str, text: str) -> None:
        """
        Sends a message by chat in italics

        Args:
            channel (str): Owner of the chat
            text (str): Message's text
        """

        self.send(channel, f"/me {text}")

    def mod(self, channel: str, username: str) -> None:
        """
        Makes a user mod

        Args:
            channel (str): Channel who promotes the user
            username (str): Name of the user to be promoted
        """

        self.send(channel, f"/mod {username}")

    def unmod(self, channel: str, username: str) -> None:
        """
        Removes the moderator's rank from a user

        Args:
            channel (str): Channel who removes the moderator's rank
            username (str): User's name
        """

        self.send(channel, f"/unmod {username}")

    def mods(self, channel: str) -> None:
        """
        Shows the moderators list of a channel

        Args:
            channel (str): Channel who owns the moderators
        """

        self.send(channel, "/mods")

    def raid(self, channel: str, username: str) -> None:
        """
        Raids another channel

        Args:
            channel (str): Name of the channel who raids
            username (str): Name of the channel to raid
        """

        self.send(channel, f"/raid {username}")

    def unraid(self, channel: str) -> None:
        """
        Cancels an raid

        Args:
            channel (str): Channel who unraids
        """

        self.send(channel, "/unraid")

    def slow(self, channel: str, duration: int) -> None:
        """
        Activates the "slow" mode

        Args:
            channel (str): Channel on which activate the mode
            duration (int): Time between messages
        """

        self.send(channel, f"/slow {duration}")

    def slowoff(self, channel: str) -> None:
        """
        Disables the "slow" mode

        Args:
            channel (str): Channel on which disable the mode
        """

        self.send(channel, "/slowoff")

    def subscribers(self, channel: str) -> None:
        """
        Activates the "subscribers only" mode

        Args:
            channel (str): Channel on which activate the mode
        """

        self.send(channel, "/subscribers")

    def subscribersoff(self, channel: str) -> None:
        """
        Disables "subscriber only" mode

        Args:
            channel (str): Channel on which disable the mode
        """

        self.send(channel, "/subscribersoff")

    def timeout(self, channel: str, user: str, duration: int = 600) -> None:
        """
        Expels a user temporarily

        Args:
            channel (str): Channel who ejects
            user (str): Name of the user to expel
            duration (int): Ejecting time
        """

        self.send(channel, f"/timeout @{user} {duration}")

    def untimeout(self, channel: str, username: str) -> None:
        """
        Cancels the timeout of a user

        Args:
            channel (str): Channel who ejected the user
            username (str): User to readmit
        """

        self.send(channel, f"/untimeout @{username}")

    def uniquechat(self, channel: str) -> None:
        """
        Activates the "unique" mode

        Args:
            channel (str): Channel on which activate the mode
        """

        self.send(channel, "/uniquechat")

    def uniquechatoff(self, channel: str) -> None:
        """
        Disables the "unique" mode

        Args:
            channel (str): Channel on which disable the mode
        """

        self.send(channel, "/uniquechatoff")

    def vip(self, channel: str, username: str) -> None:
        """
        Makes a user vip

        Args:
            channel (str): Channel who makes a user vip
            username (str): User's name
        """

        self.send(channel, f"/vip {username}")

    def unvip(self, channel: str, username: str) -> None:
        """
        Removes the vip range from a user

        Args:
            channel (str): Channel who remove's the vip range
            username (str): User's name
        """

        self.send(channel, f"/unvip {username}")

    def vips(self, channel: str) -> None:
        """
        Shows the vips list of a channel

        Args:
            channel (str): Channel who owns the vips
        """

        self.send(channel, "/vips")

    def whisper(self, channel: str, user: str, text: str) -> None:
        """
        Whispers to a user

        Args:
            channel (str): Channel on which send the whisp
            user (str): User's name
            text (str): Whisper's text
        """

        self.send(channel, f"/w {user} {text}")

    def add_method_before_join_channel(
        self, name: str, method: Callable[[str], None]
    ) -> None:
        """
        Adds to the bot a method that will be executed before joinnnig a channel

        Args:
            name (str): Method's name
            method (Callable[[str], None]): Method to be executed before joinnnig a channel
        """

        self.custom_methods_before_join_channel[name] = method

    def remove_method_before_join_channel(self, name: str) -> None:
        """
        Removes a method that is executed before joinning a channel

        Args:
            name (str): Method's name
        """

        self.methods_before_join_channel_to_remove.append(name)

    def add_method_after_join_channel(
        self, name: str, method: Callable[[str], None]
    ) -> None:
        """
        Adds to the bot a method that will be executed after joinnnig a channel

        Args:
            name (str): Method's name
            method (Callable[[str], None]): Method to be executed after joinnnig a channel
        """

        self.custom_methods_after_join_channel[name] = method

    def remove_method_after_join_channel(self, name: str) -> None:
        """
        Removes a method that is executed after joinning a channel

        Args:
            name (str): Method's name
        """

        self.methods_after_join_channel_to_remove.append(name)

    def add_method_before_leave_channel(
        self, name: str, method: Callable[[str], None]
    ) -> None:
        """
        Adds to the bot a method that will be executed before leaving a channel

        Args:
            name (str): Method's name
            method (Callable[[str], None]): Method to be executed before leaving a channel
        """

        self.custom_methods_before_leave_channel[name] = method

    def remove_method_before_leave_channel(self, name: str) -> None:
        """
        Removes a method that is executed before leaving a channel

        Args:
            name (str): Method's name
        """

        self.methods_before_leave_channel_to_remove.append(name)

    def add_method_after_leave_channel(
        self, name: str, method: Callable[[str], None]
    ) -> None:
        """
        Adds to the bot a method that will be executed after leaving a channel

        Args:
            name (str): Method's name
            method (Callable[[str], None]): Method to be executed after leaving a channel
        """

        self.custom_methods_after_leave_channel[name] = method

    def remove_method_after_leave_channel(self, name: str) -> None:
        """
        Removes a method that is executed after leaving a channel

        Args:
            name (str): Method's name
        """

        self.methods_after_leave_channel_to_remove.append(name)

    def add_check(self, name: str, check: Callable[[], None]) -> None:
        """
        Adds a check to the bot
        Checks work permanently

        Args:
            name (str): Check's name
            check (Callable[[], None]): Method that will act as a check
        """

        self.custom_checks[name] = check

    def remove_check(self, name: str) -> None:
        """
        Removes a check from the bot

        Args:
            name (str): Check's name
        """

        self.checks_to_remove.append(name)

    def add_listener(self, name: str, listener: Callable[[Message], None]) -> None:
        """
        Adds a listener to the bot
        Listeners work only when a message is received
        Listeners must receive as a parameter the last message in the chat

        Args:
            name (str): Listener's name
            listener (Callable[[Message], None]): Method that will be executed after every chat message
        """

        self.custom_listeners[name] = listener

    def remove_listener(self, name: str) -> None:
        """
        Removes a listener from the bot

        Args:
            name (str): Listener's name
        """

        self.listeners_to_remove.append(name)

    def add_command(self, name: str, command: Callable[[Message], None]) -> None:
        """
        Adds a command to the bot
        Commands must receive as a parameter the messages which call them

        Args:
            name (str): Command's name
            command (Callable[[Message], None]): Method that will be executed when the command is invoked
        """

        self.custom_commands[name] = command

    def remove_command(self, name: str) -> None:
        """
        Removes a command from the bot

        Args:
            name (str): Command's name
        """

        self.commands_to_remove.append(name)

    def add_method_before_commands(
        self, name: str, method: Callable[[Message], None]
    ) -> None:
        """
        Adds to the bot a method that will be executed before each command

        Args:
            name (str): Method's name
            method (Callable[[Message], None]): Method to be executed before each command
        """

        self.custom_methods_before_commands[name] = method

    def remove_method_before_commands(self, name: str) -> None:
        """
        Removes a method that is executed before each command

        Args:
            name (str): Method's name
        """

        self.methods_before_commands_to_remove.append(name)

    def add_method_after_commands(
        self, name: str, method: Callable[[Message], None]
    ) -> None:
        """
        Adds to the bot a method that will be executed after each command

        Args:
            name (str): Method's name
            method (Callable[[Message], None]): Method to be executed after each command
        """

        self.custom_methods_after_commands[name] = method

    def remove_method_after_commands(self, name: str) -> None:
        """
        Removes a method that is executed after each command

        Args:
            name (str): Method's name
        """

        self.methods_after_commands_to_remove.append(name)

    def add_method_after_clearchat(
        self, name: str, method: Callable[[Message], None]
    ) -> None:
        """
        Adds to the bot a method that will be executed after each chat clearing

        Args:
            name (str): Method's name
            method (Callable[[Message], None]): Method to be executed after each chat clearing
        """

        self.custom_methods_after_clearchat[name] = method

    def remove_method_after_clearchat(self, name: str) -> None:
        """
        Removes a method that is executed after each chat clearing

        Args:
            name (str): Method's name
        """

        self.methods_after_clearchat_to_remove.append(name)

    def add_method_after_delete_message(
        self, name: str, method: Callable[[Message], None]
    ) -> None:
        """
        Adds to the bot a method that will be executed after each time a message is deleted

        Args:
            name (str): Method's name
            method (Callable[[Message], None]): Method to be executed after each time a message is deleted
        """

        self.custom_methods_after_delete_message[name] = method

    def remove_method_after_delete_message(self, name: str) -> None:
        """
        Removes a method that is executed after each time a message is deleted

        Args:
            name (str): Method's name
        """

        self.methods_after_delete_message_to_remove.append(name)

    def add_method_after_bot_connected(
        self, name: str, method: Callable[[Message], None]
    ) -> None:
        """
        Adds to the bot a method that will be executed after a bot connects to a chat

        Args:
            name (str): Method's name
            method (Callable[[Message], None]): Method to be executed after a bot connects to a chat
        """

        self.custom_methods_after_bot_connected[name] = method

    def remove_method_after_bot_connected(self, name: str) -> None:
        """
        Removes a method that is executed after a bot connects to a chat

        Args:
            name (str): Method's name
        """

        self.methods_after_bot_connected_to_remove.append(name)

    def add_method_after_toggle_host(
        self, name: str, method: Callable[[Message], None]
    ) -> None:
        """
        Adds to the bot a method that will be executed after a channel toggles hosting

        Args:
            name (str): Method's name
            method (Callable[[Message], None]): Method to be executed after a channel toggles hosting
        """

        self.custom_methods_after_toggle_host[name] = method

    def remove_method_after_toggle_host(self, name: str) -> None:
        """
        Removes a method that is executed after a channel toggles hosting

        Args:
            name (str): Method's name
        """

        self.methods_after_toggle_host_to_remove.append(name)

    def add_method_after_server_reconnect(
        self, name: str, method: Callable[[Message], None]
    ) -> None:
        """
        Adds to the bot a method that will be executed after a reconnect warning

        Args:
            name (str): Method's name
            method (Callable[[Message], None]): Method to be executed after a reconnect warning
        """

        self.custom_methods_after_server_reconnect[name] = method

    def remove_method_after_server_reconnect(self, name: str) -> None:
        """
        Removes a method that is executed after a reconnect warning

        Args:
            name (str): Method's name
        """

        self.methods_after_server_reconnect_to_remove.append(name)

    def add_method_after_channel_change(
        self, name: str, method: Callable[[Message], None]
    ) -> None:
        """
        Adds to the bot a method that will be executed after a channel's chat settings change

        Args:
            name (str): Method's name
            method (Callable[[Message], None]): Method to be executed after a channel's chat settings change
        """

        self.custom_methods_after_channel_change[name] = method

    def remove_method_after_channel_change(self, name: str) -> None:
        """
        Removes a method that is executed after a channel's chat settings change

        Args:
            name (str): Method's name
        """

        self.methods_after_channel_change_to_remove.append(name)

    def add_method_after_event(
        self, name: str, method: Callable[[Message], None]
    ) -> None:
        """
        Adds to the bot a method that will be executed after an event occurs

        Args:
            name (str): Method's name
            method (Callable[[Message], None]): Method to be executed after an event occurs
        """

        self.custom_methods_after_event[name] = method

    def remove_method_after_event(self, name: str) -> None:
        """
        Removes a method that is executed after an event occurs

        Args:
            name (str): Method's name
        """

        self.methods_after_event_to_remove.append(name)

    def add_method_after_user_join(
        self, name: str, method: Callable[[Message], None]
    ) -> None:
        """
        Adds to the bot a method that will be executed after an user joins into a channel

        Args:
            name (str): Method's name
            method (Callable[[Message], None]): Method to be executed after an user joins into a channel
        """

        self.custom_methods_after_user_join[name] = method

    def remove_method_after_user_join(self, name: str) -> None:
        """
        Removes a method that is executed after an user joins into a channel

        Args:
            name (str): Method's name
        """

        self.methods_after_user_join_to_remove.append(name)

    def add_method_after_whisper(
        self, name: str, method: Callable[[Message], None]
    ) -> None:
        """
        Adds to the bot a method that will be executed after a whisper is received

        Args:
            name (str): Method's name
            method (Callable[[Message], None]): Method to be executed after a whisper is received
        """

        self.custom_methods_after_whisper[name] = method

    def remove_method_after_whisper(self, name: str) -> None:
        """
        Removes a method that is executed after a whisper is received

        Args:
            name (str): Method's name
        """

        self.methods_after_whisper_to_remove.append(name)

Represents a bot

Args

oauth_token : str
OAuth token
client_id : str
Client ID
client_secret : str
Client secret
redirect_uri : str
Redirect URI
tokens_path : str
Path of tokens file (file included)
username : str
Name of the bot
channels : list
Names of channels the bot will access
command_prefix : str
Prefix of the commands the bot will recognize
code : str
Authorization code for getting an user token
jwt_token : str
JWT Token
ready_message : str
Message that the bot will send through the chats of the channels it access

Methods

def add_check(self, name: str, check: Callable[[], None]) ‑> None
Expand source code
def add_check(self, name: str, check: Callable[[], None]) -> None:
    """
    Adds a check to the bot
    Checks work permanently

    Args:
        name (str): Check's name
        check (Callable[[], None]): Method that will act as a check
    """

    self.custom_checks[name] = check

Adds a check to the bot Checks work permanently

Args

name : str
Check's name
check : Callable[[], None]
Method that will act as a check
def add_command(self,
name: str,
command: Callable[[Message], None]) ‑> None
Expand source code
def add_command(self, name: str, command: Callable[[Message], None]) -> None:
    """
    Adds a command to the bot
    Commands must receive as a parameter the messages which call them

    Args:
        name (str): Command's name
        command (Callable[[Message], None]): Method that will be executed when the command is invoked
    """

    self.custom_commands[name] = command

Adds a command to the bot Commands must receive as a parameter the messages which call them

Args

name : str
Command's name
command : Callable[[Message], None]
Method that will be executed when the command is invoked
def add_listener(self,
name: str,
listener: Callable[[Message], None]) ‑> None
Expand source code
def add_listener(self, name: str, listener: Callable[[Message], None]) -> None:
    """
    Adds a listener to the bot
    Listeners work only when a message is received
    Listeners must receive as a parameter the last message in the chat

    Args:
        name (str): Listener's name
        listener (Callable[[Message], None]): Method that will be executed after every chat message
    """

    self.custom_listeners[name] = listener

Adds a listener to the bot Listeners work only when a message is received Listeners must receive as a parameter the last message in the chat

Args

name : str
Listener's name
listener : Callable[[Message], None]
Method that will be executed after every chat message
def add_method_after_bot_connected(self,
name: str,
method: Callable[[Message], None]) ‑> None
Expand source code
def add_method_after_bot_connected(
    self, name: str, method: Callable[[Message], None]
) -> None:
    """
    Adds to the bot a method that will be executed after a bot connects to a chat

    Args:
        name (str): Method's name
        method (Callable[[Message], None]): Method to be executed after a bot connects to a chat
    """

    self.custom_methods_after_bot_connected[name] = method

Adds to the bot a method that will be executed after a bot connects to a chat

Args

name : str
Method's name
method : Callable[[Message], None]
Method to be executed after a bot connects to a chat
def add_method_after_channel_change(self,
name: str,
method: Callable[[Message], None]) ‑> None
Expand source code
def add_method_after_channel_change(
    self, name: str, method: Callable[[Message], None]
) -> None:
    """
    Adds to the bot a method that will be executed after a channel's chat settings change

    Args:
        name (str): Method's name
        method (Callable[[Message], None]): Method to be executed after a channel's chat settings change
    """

    self.custom_methods_after_channel_change[name] = method

Adds to the bot a method that will be executed after a channel's chat settings change

Args

name : str
Method's name
method : Callable[[Message], None]
Method to be executed after a channel's chat settings change
def add_method_after_clearchat(self,
name: str,
method: Callable[[Message], None]) ‑> None
Expand source code
def add_method_after_clearchat(
    self, name: str, method: Callable[[Message], None]
) -> None:
    """
    Adds to the bot a method that will be executed after each chat clearing

    Args:
        name (str): Method's name
        method (Callable[[Message], None]): Method to be executed after each chat clearing
    """

    self.custom_methods_after_clearchat[name] = method

Adds to the bot a method that will be executed after each chat clearing

Args

name : str
Method's name
method : Callable[[Message], None]
Method to be executed after each chat clearing
def add_method_after_commands(self,
name: str,
method: Callable[[Message], None]) ‑> None
Expand source code
def add_method_after_commands(
    self, name: str, method: Callable[[Message], None]
) -> None:
    """
    Adds to the bot a method that will be executed after each command

    Args:
        name (str): Method's name
        method (Callable[[Message], None]): Method to be executed after each command
    """

    self.custom_methods_after_commands[name] = method

Adds to the bot a method that will be executed after each command

Args

name : str
Method's name
method : Callable[[Message], None]
Method to be executed after each command
def add_method_after_delete_message(self,
name: str,
method: Callable[[Message], None]) ‑> None
Expand source code
def add_method_after_delete_message(
    self, name: str, method: Callable[[Message], None]
) -> None:
    """
    Adds to the bot a method that will be executed after each time a message is deleted

    Args:
        name (str): Method's name
        method (Callable[[Message], None]): Method to be executed after each time a message is deleted
    """

    self.custom_methods_after_delete_message[name] = method

Adds to the bot a method that will be executed after each time a message is deleted

Args

name : str
Method's name
method : Callable[[Message], None]
Method to be executed after each time a message is deleted
def add_method_after_event(self,
name: str,
method: Callable[[Message], None]) ‑> None
Expand source code
def add_method_after_event(
    self, name: str, method: Callable[[Message], None]
) -> None:
    """
    Adds to the bot a method that will be executed after an event occurs

    Args:
        name (str): Method's name
        method (Callable[[Message], None]): Method to be executed after an event occurs
    """

    self.custom_methods_after_event[name] = method

Adds to the bot a method that will be executed after an event occurs

Args

name : str
Method's name
method : Callable[[Message], None]
Method to be executed after an event occurs
def add_method_after_join_channel(self, name: str, method: Callable[[str], None]) ‑> None
Expand source code
def add_method_after_join_channel(
    self, name: str, method: Callable[[str], None]
) -> None:
    """
    Adds to the bot a method that will be executed after joinnnig a channel

    Args:
        name (str): Method's name
        method (Callable[[str], None]): Method to be executed after joinnnig a channel
    """

    self.custom_methods_after_join_channel[name] = method

Adds to the bot a method that will be executed after joinnnig a channel

Args

name : str
Method's name
method : Callable[[str], None]
Method to be executed after joinnnig a channel
def add_method_after_leave_channel(self, name: str, method: Callable[[str], None]) ‑> None
Expand source code
def add_method_after_leave_channel(
    self, name: str, method: Callable[[str], None]
) -> None:
    """
    Adds to the bot a method that will be executed after leaving a channel

    Args:
        name (str): Method's name
        method (Callable[[str], None]): Method to be executed after leaving a channel
    """

    self.custom_methods_after_leave_channel[name] = method

Adds to the bot a method that will be executed after leaving a channel

Args

name : str
Method's name
method : Callable[[str], None]
Method to be executed after leaving a channel
def add_method_after_server_reconnect(self,
name: str,
method: Callable[[Message], None]) ‑> None
Expand source code
def add_method_after_server_reconnect(
    self, name: str, method: Callable[[Message], None]
) -> None:
    """
    Adds to the bot a method that will be executed after a reconnect warning

    Args:
        name (str): Method's name
        method (Callable[[Message], None]): Method to be executed after a reconnect warning
    """

    self.custom_methods_after_server_reconnect[name] = method

Adds to the bot a method that will be executed after a reconnect warning

Args

name : str
Method's name
method : Callable[[Message], None]
Method to be executed after a reconnect warning
def add_method_after_toggle_host(self,
name: str,
method: Callable[[Message], None]) ‑> None
Expand source code
def add_method_after_toggle_host(
    self, name: str, method: Callable[[Message], None]
) -> None:
    """
    Adds to the bot a method that will be executed after a channel toggles hosting

    Args:
        name (str): Method's name
        method (Callable[[Message], None]): Method to be executed after a channel toggles hosting
    """

    self.custom_methods_after_toggle_host[name] = method

Adds to the bot a method that will be executed after a channel toggles hosting

Args

name : str
Method's name
method : Callable[[Message], None]
Method to be executed after a channel toggles hosting
def add_method_after_user_join(self,
name: str,
method: Callable[[Message], None]) ‑> None
Expand source code
def add_method_after_user_join(
    self, name: str, method: Callable[[Message], None]
) -> None:
    """
    Adds to the bot a method that will be executed after an user joins into a channel

    Args:
        name (str): Method's name
        method (Callable[[Message], None]): Method to be executed after an user joins into a channel
    """

    self.custom_methods_after_user_join[name] = method

Adds to the bot a method that will be executed after an user joins into a channel

Args

name : str
Method's name
method : Callable[[Message], None]
Method to be executed after an user joins into a channel
def add_method_after_whisper(self,
name: str,
method: Callable[[Message], None]) ‑> None
Expand source code
def add_method_after_whisper(
    self, name: str, method: Callable[[Message], None]
) -> None:
    """
    Adds to the bot a method that will be executed after a whisper is received

    Args:
        name (str): Method's name
        method (Callable[[Message], None]): Method to be executed after a whisper is received
    """

    self.custom_methods_after_whisper[name] = method

Adds to the bot a method that will be executed after a whisper is received

Args

name : str
Method's name
method : Callable[[Message], None]
Method to be executed after a whisper is received
def add_method_before_commands(self,
name: str,
method: Callable[[Message], None]) ‑> None
Expand source code
def add_method_before_commands(
    self, name: str, method: Callable[[Message], None]
) -> None:
    """
    Adds to the bot a method that will be executed before each command

    Args:
        name (str): Method's name
        method (Callable[[Message], None]): Method to be executed before each command
    """

    self.custom_methods_before_commands[name] = method

Adds to the bot a method that will be executed before each command

Args

name : str
Method's name
method : Callable[[Message], None]
Method to be executed before each command
def add_method_before_join_channel(self, name: str, method: Callable[[str], None]) ‑> None
Expand source code
def add_method_before_join_channel(
    self, name: str, method: Callable[[str], None]
) -> None:
    """
    Adds to the bot a method that will be executed before joinnnig a channel

    Args:
        name (str): Method's name
        method (Callable[[str], None]): Method to be executed before joinnnig a channel
    """

    self.custom_methods_before_join_channel[name] = method

Adds to the bot a method that will be executed before joinnnig a channel

Args

name : str
Method's name
method : Callable[[str], None]
Method to be executed before joinnnig a channel
def add_method_before_leave_channel(self, name: str, method: Callable[[str], None]) ‑> None
Expand source code
def add_method_before_leave_channel(
    self, name: str, method: Callable[[str], None]
) -> None:
    """
    Adds to the bot a method that will be executed before leaving a channel

    Args:
        name (str): Method's name
        method (Callable[[str], None]): Method to be executed before leaving a channel
    """

    self.custom_methods_before_leave_channel[name] = method

Adds to the bot a method that will be executed before leaving a channel

Args

name : str
Method's name
method : Callable[[str], None]
Method to be executed before leaving a channel
def ban(self, channel: str, user: str, reason: str = '') ‑> None
Expand source code
def ban(self, channel: str, user: str, reason: str = "") -> None:
    """
    Bans a user

    Args:
        channel (str): Channel who bans
        username (str): User to ban
        reason (str): Reason of the ban
    """

    self.send(channel, f"/ban @{user} {reason}")

Bans a user

Args

channel : str
Channel who bans
username : str
User to ban
reason : str
Reason of the ban
def clear(self, channel: str) ‑> None
Expand source code
def clear(self, channel: str) -> None:
    """
    Clears the chat

    Args:
        channel (str): Channel to clean the chat
    """

    self.send(channel, "/clear")

Clears the chat

Args

channel : str
Channel to clean the chat
def color(self, channel: str, color: str) ‑> None
Expand source code
def color(self, channel: str, color: str) -> None:
    """
    Changes the color of the channel's name in the chat

    Args:
        channel (str): Channel to change color
        color (str): New color's name
    """

    self.send(channel, f"/color {color}")

Changes the color of the channel's name in the chat

Args

channel : str
Channel to change color
color : str
New color's name
def commercial(self, channel: str, duration: int = 30) ‑> None
Expand source code
def commercial(self, channel: str, duration: int = 30) -> None:
    """
    Places advertising in the channel

    Args:
        channel (str): Channel on which start the commercial
        duration (int): Duration of advertising
    """

    self.send(channel, f"/commercial {duration}")

Places advertising in the channel

Args

channel : str
Channel on which start the commercial
duration : int
Duration of advertising
def delete(self, channel: str, message_id: str) ‑> None
Expand source code
def delete(self, channel: str, message_id: str) -> None:
    """
    Deletes the specified message from the chat room

    Args:
        channel (str): Channel where the message was sent
        message_id (str): ID of the message
    """

    self.send(channel, f"/delete {message_id}")

Deletes the specified message from the chat room

Args

channel : str
Channel where the message was sent
message_id : str
ID of the message
def disconnect(self, channel: str) ‑> None
Expand source code
def disconnect(self, channel: str) -> None:
    """
    Closes the session that the command was received from

    Args:
        channel (str): Channel whose session close to
    """

    self.send(channel, "/disconnect")

Closes the session that the command was received from

Args

channel : str
Channel whose session close to
def emoteonly(self, channel: str) ‑> None
Expand source code
def emoteonly(self, channel: str) -> None:
    """
    Activates the "emotes only" mode

    Args:
        channel (str): Channel on which activate the mode
    """

    self.send(channel, "/emoteonly")

Activates the "emotes only" mode

Args

channel : str
Channel on which activate the mode
def emoteonlyoff(self, channel: str) ‑> None
Expand source code
def emoteonlyoff(self, channel: str) -> None:
    """
    Disables "emotes only" mode

    Args:
        channel (str): Channel on which disable the mode
    """

    self.send(channel, "/emoteonlyoff")

Disables "emotes only" mode

Args

channel : str
Channel on which disable the mode
def followers(self, channel: str) ‑> None
Expand source code
def followers(self, channel: str) -> None:
    """
    Activates the "followers only" mode

    Args:
        channel (str): Channel on which activate the mode
    """

    self.send(channel, "/followers")

Activates the "followers only" mode

Args

channel : str
Channel on which activate the mode
def followersoff(self, channel: str) ‑> None
Expand source code
def followersoff(self, channel: str) -> None:
    """
    Disables the "followers only" mode

    Args:
        channel (str): Channel on which disable the mode
    """

    self.send(channel, "/followersoff")

Disables the "followers only" mode

Args

channel : str
Channel on which disable the mode
def help(self, channel: str, command: str = '') ‑> None
Expand source code
def help(self, channel: str, command: str = "") -> None:
    """
    Shows detailed information about a command

    Args:
        channel (str): Channel in which show the command's information
        command (str): Command to show information about
    """

    self.send(channel, f"/help {command}")

Shows detailed information about a command

Args

channel : str
Channel in which show the command's information
command : str
Command to show information about
def host(self, channel: str, username: str) ‑> None
Expand source code
def host(self, channel: str, username: str) -> None:
    """
    Hosts a channel

    Args:
        channel (str): Name of the channel who hosts
        username (str): Name of the channel to host
    """

    self.send(channel, f"/host {username}")

Hosts a channel

Args

channel : str
Name of the channel who hosts
username : str
Name of the channel to host
def join_channel(self, channel: str) ‑> None
Expand source code
def join_channel(self, channel: str) -> None:
    """
    Makes the bot to join into a channel

    Args:
        channel (str): The channel to join
    """

    self.__execute_methods_before_join_channel(channel)

    self.__send_join(channel)
    self.__send_privmsg(channel, self.ready_message)

    self.__execute_methods_after_join_channel(channel)

    self.__remove_methods_before_join_channel()
    self.__remove_methods_after_join_channel()

Makes the bot to join into a channel

Args

channel : str
The channel to join
def leave_channel(self, channel: str) ‑> None
Expand source code
def leave_channel(self, channel: str) -> None:
    """
    Makes the bot to leave into a channel

    Args:
        channel (str): The channel to leave
    """

    self.__execute_methods_before_leave_channel(channel)

    self.__send_part(channel)

    self.__execute_methods_after_leave_channel(channel)

    self.__remove_methods_before_leave_channel()
    self.__remove_methods_after_leave_channel()

Makes the bot to leave into a channel

Args

channel : str
The channel to leave
def marker(self, channel: str, description: str = '') ‑> None
Expand source code
def marker(self, channel: str, description: str = "") -> None:
    """
    Leaves a mark on the channel's stream

    Args:
        channel (str): Channel in which leave the mark
        description (str): Mark's description
    """

    self.send(channel, f"/marker {description}")

Leaves a mark on the channel's stream

Args

channel : str
Channel in which leave the mark
description : str
Mark's description
def me(self, channel: str, text: str) ‑> None
Expand source code
def me(self, channel: str, text: str) -> None:
    """
    Sends a message by chat in italics

    Args:
        channel (str): Owner of the chat
        text (str): Message's text
    """

    self.send(channel, f"/me {text}")

Sends a message by chat in italics

Args

channel : str
Owner of the chat
text : str
Message's text
def mod(self, channel: str, username: str) ‑> None
Expand source code
def mod(self, channel: str, username: str) -> None:
    """
    Makes a user mod

    Args:
        channel (str): Channel who promotes the user
        username (str): Name of the user to be promoted
    """

    self.send(channel, f"/mod {username}")

Makes a user mod

Args

channel : str
Channel who promotes the user
username : str
Name of the user to be promoted
def mods(self, channel: str) ‑> None
Expand source code
def mods(self, channel: str) -> None:
    """
    Shows the moderators list of a channel

    Args:
        channel (str): Channel who owns the moderators
    """

    self.send(channel, "/mods")

Shows the moderators list of a channel

Args

channel : str
Channel who owns the moderators
def raid(self, channel: str, username: str) ‑> None
Expand source code
def raid(self, channel: str, username: str) -> None:
    """
    Raids another channel

    Args:
        channel (str): Name of the channel who raids
        username (str): Name of the channel to raid
    """

    self.send(channel, f"/raid {username}")

Raids another channel

Args

channel : str
Name of the channel who raids
username : str
Name of the channel to raid
def remove_check(self, name: str) ‑> None
Expand source code
def remove_check(self, name: str) -> None:
    """
    Removes a check from the bot

    Args:
        name (str): Check's name
    """

    self.checks_to_remove.append(name)

Removes a check from the bot

Args

name : str
Check's name
def remove_command(self, name: str) ‑> None
Expand source code
def remove_command(self, name: str) -> None:
    """
    Removes a command from the bot

    Args:
        name (str): Command's name
    """

    self.commands_to_remove.append(name)

Removes a command from the bot

Args

name : str
Command's name
def remove_listener(self, name: str) ‑> None
Expand source code
def remove_listener(self, name: str) -> None:
    """
    Removes a listener from the bot

    Args:
        name (str): Listener's name
    """

    self.listeners_to_remove.append(name)

Removes a listener from the bot

Args

name : str
Listener's name
def remove_method_after_bot_connected(self, name: str) ‑> None
Expand source code
def remove_method_after_bot_connected(self, name: str) -> None:
    """
    Removes a method that is executed after a bot connects to a chat

    Args:
        name (str): Method's name
    """

    self.methods_after_bot_connected_to_remove.append(name)

Removes a method that is executed after a bot connects to a chat

Args

name : str
Method's name
def remove_method_after_channel_change(self, name: str) ‑> None
Expand source code
def remove_method_after_channel_change(self, name: str) -> None:
    """
    Removes a method that is executed after a channel's chat settings change

    Args:
        name (str): Method's name
    """

    self.methods_after_channel_change_to_remove.append(name)

Removes a method that is executed after a channel's chat settings change

Args

name : str
Method's name
def remove_method_after_clearchat(self, name: str) ‑> None
Expand source code
def remove_method_after_clearchat(self, name: str) -> None:
    """
    Removes a method that is executed after each chat clearing

    Args:
        name (str): Method's name
    """

    self.methods_after_clearchat_to_remove.append(name)

Removes a method that is executed after each chat clearing

Args

name : str
Method's name
def remove_method_after_commands(self, name: str) ‑> None
Expand source code
def remove_method_after_commands(self, name: str) -> None:
    """
    Removes a method that is executed after each command

    Args:
        name (str): Method's name
    """

    self.methods_after_commands_to_remove.append(name)

Removes a method that is executed after each command

Args

name : str
Method's name
def remove_method_after_delete_message(self, name: str) ‑> None
Expand source code
def remove_method_after_delete_message(self, name: str) -> None:
    """
    Removes a method that is executed after each time a message is deleted

    Args:
        name (str): Method's name
    """

    self.methods_after_delete_message_to_remove.append(name)

Removes a method that is executed after each time a message is deleted

Args

name : str
Method's name
def remove_method_after_event(self, name: str) ‑> None
Expand source code
def remove_method_after_event(self, name: str) -> None:
    """
    Removes a method that is executed after an event occurs

    Args:
        name (str): Method's name
    """

    self.methods_after_event_to_remove.append(name)

Removes a method that is executed after an event occurs

Args

name : str
Method's name
def remove_method_after_join_channel(self, name: str) ‑> None
Expand source code
def remove_method_after_join_channel(self, name: str) -> None:
    """
    Removes a method that is executed after joinning a channel

    Args:
        name (str): Method's name
    """

    self.methods_after_join_channel_to_remove.append(name)

Removes a method that is executed after joinning a channel

Args

name : str
Method's name
def remove_method_after_leave_channel(self, name: str) ‑> None
Expand source code
def remove_method_after_leave_channel(self, name: str) -> None:
    """
    Removes a method that is executed after leaving a channel

    Args:
        name (str): Method's name
    """

    self.methods_after_leave_channel_to_remove.append(name)

Removes a method that is executed after leaving a channel

Args

name : str
Method's name
def remove_method_after_server_reconnect(self, name: str) ‑> None
Expand source code
def remove_method_after_server_reconnect(self, name: str) -> None:
    """
    Removes a method that is executed after a reconnect warning

    Args:
        name (str): Method's name
    """

    self.methods_after_server_reconnect_to_remove.append(name)

Removes a method that is executed after a reconnect warning

Args

name : str
Method's name
def remove_method_after_toggle_host(self, name: str) ‑> None
Expand source code
def remove_method_after_toggle_host(self, name: str) -> None:
    """
    Removes a method that is executed after a channel toggles hosting

    Args:
        name (str): Method's name
    """

    self.methods_after_toggle_host_to_remove.append(name)

Removes a method that is executed after a channel toggles hosting

Args

name : str
Method's name
def remove_method_after_user_join(self, name: str) ‑> None
Expand source code
def remove_method_after_user_join(self, name: str) -> None:
    """
    Removes a method that is executed after an user joins into a channel

    Args:
        name (str): Method's name
    """

    self.methods_after_user_join_to_remove.append(name)

Removes a method that is executed after an user joins into a channel

Args

name : str
Method's name
def remove_method_after_whisper(self, name: str) ‑> None
Expand source code
def remove_method_after_whisper(self, name: str) -> None:
    """
    Removes a method that is executed after a whisper is received

    Args:
        name (str): Method's name
    """

    self.methods_after_whisper_to_remove.append(name)

Removes a method that is executed after a whisper is received

Args

name : str
Method's name
def remove_method_before_commands(self, name: str) ‑> None
Expand source code
def remove_method_before_commands(self, name: str) -> None:
    """
    Removes a method that is executed before each command

    Args:
        name (str): Method's name
    """

    self.methods_before_commands_to_remove.append(name)

Removes a method that is executed before each command

Args

name : str
Method's name
def remove_method_before_join_channel(self, name: str) ‑> None
Expand source code
def remove_method_before_join_channel(self, name: str) -> None:
    """
    Removes a method that is executed before joinning a channel

    Args:
        name (str): Method's name
    """

    self.methods_before_join_channel_to_remove.append(name)

Removes a method that is executed before joinning a channel

Args

name : str
Method's name
def remove_method_before_leave_channel(self, name: str) ‑> None
Expand source code
def remove_method_before_leave_channel(self, name: str) -> None:
    """
    Removes a method that is executed before leaving a channel

    Args:
        name (str): Method's name
    """

    self.methods_before_leave_channel_to_remove.append(name)

Removes a method that is executed before leaving a channel

Args

name : str
Method's name
def reply(self, channel: str, message_id: str, text: str) ‑> None
Expand source code
def reply(self, channel: str, message_id: str, text: str) -> None:
    """
    Replies to a message in a chat

    Args:
        channel (str): Owner of the chat
        message_id (str): ID of the message being replied to
        text (str): Message's text
    """

    self.__send_privmsg(channel, text, message_id)

Replies to a message in a chat

Args

channel : str
Owner of the chat
message_id : str
ID of the message being replied to
text : str
Message's text
def run(self) ‑> None
Expand source code
def run(self) -> None:
    """
    Runs the bot
    """

    self.__connect()
    self.__loop()

Runs the bot

def send(self, channel: str, text: str) ‑> None
Expand source code
def send(self, channel: str, text: str) -> None:
    """
    Sends a message by chat

    Args:
        channel (str): Owner of the chat
        text (str): Message's text
    """

    self.__send_privmsg(channel, text)

Sends a message by chat

Args

channel : str
Owner of the chat
text : str
Message's text
def slow(self, channel: str, duration: int) ‑> None
Expand source code
def slow(self, channel: str, duration: int) -> None:
    """
    Activates the "slow" mode

    Args:
        channel (str): Channel on which activate the mode
        duration (int): Time between messages
    """

    self.send(channel, f"/slow {duration}")

Activates the "slow" mode

Args

channel : str
Channel on which activate the mode
duration : int
Time between messages
def slowoff(self, channel: str) ‑> None
Expand source code
def slowoff(self, channel: str) -> None:
    """
    Disables the "slow" mode

    Args:
        channel (str): Channel on which disable the mode
    """

    self.send(channel, "/slowoff")

Disables the "slow" mode

Args

channel : str
Channel on which disable the mode
def stop(self) ‑> None
Expand source code
def stop(self) -> None:
    """
    Stops the bot
    """

    self.__finish = True

Stops the bot

def subscribers(self, channel: str) ‑> None
Expand source code
def subscribers(self, channel: str) -> None:
    """
    Activates the "subscribers only" mode

    Args:
        channel (str): Channel on which activate the mode
    """

    self.send(channel, "/subscribers")

Activates the "subscribers only" mode

Args

channel : str
Channel on which activate the mode
def subscribersoff(self, channel: str) ‑> None
Expand source code
def subscribersoff(self, channel: str) -> None:
    """
    Disables "subscriber only" mode

    Args:
        channel (str): Channel on which disable the mode
    """

    self.send(channel, "/subscribersoff")

Disables "subscriber only" mode

Args

channel : str
Channel on which disable the mode
def timeout(self, channel: str, user: str, duration: int = 600) ‑> None
Expand source code
def timeout(self, channel: str, user: str, duration: int = 600) -> None:
    """
    Expels a user temporarily

    Args:
        channel (str): Channel who ejects
        user (str): Name of the user to expel
        duration (int): Ejecting time
    """

    self.send(channel, f"/timeout @{user} {duration}")

Expels a user temporarily

Args

channel : str
Channel who ejects
user : str
Name of the user to expel
duration : int
Ejecting time
def unban(self, channel: str, user: str) ‑> None
Expand source code
def unban(self, channel: str, user: str) -> None:
    """
    Undoes the ban of a user

    Args:
        channel (str): Name of the channel who readmits
        user (str): Name of the user to readmit
    """

    self.send(channel, f"/unban @{user}")

Undoes the ban of a user

Args

channel : str
Name of the channel who readmits
user : str
Name of the user to readmit
def unhost(self, channel: str) ‑> None
Expand source code
def unhost(self, channel: str) -> None:
    """
    Unhosts the hosted channel

    Args:
        channel (str): Channel who unhosts
    """

    self.send(channel, "/unhost")

Unhosts the hosted channel

Args

channel : str
Channel who unhosts
def uniquechat(self, channel: str) ‑> None
Expand source code
def uniquechat(self, channel: str) -> None:
    """
    Activates the "unique" mode

    Args:
        channel (str): Channel on which activate the mode
    """

    self.send(channel, "/uniquechat")

Activates the "unique" mode

Args

channel : str
Channel on which activate the mode
def uniquechatoff(self, channel: str) ‑> None
Expand source code
def uniquechatoff(self, channel: str) -> None:
    """
    Disables the "unique" mode

    Args:
        channel (str): Channel on which disable the mode
    """

    self.send(channel, "/uniquechatoff")

Disables the "unique" mode

Args

channel : str
Channel on which disable the mode
def unmod(self, channel: str, username: str) ‑> None
Expand source code
def unmod(self, channel: str, username: str) -> None:
    """
    Removes the moderator's rank from a user

    Args:
        channel (str): Channel who removes the moderator's rank
        username (str): User's name
    """

    self.send(channel, f"/unmod {username}")

Removes the moderator's rank from a user

Args

channel : str
Channel who removes the moderator's rank
username : str
User's name
def unraid(self, channel: str) ‑> None
Expand source code
def unraid(self, channel: str) -> None:
    """
    Cancels an raid

    Args:
        channel (str): Channel who unraids
    """

    self.send(channel, "/unraid")

Cancels an raid

Args

channel : str
Channel who unraids
def untimeout(self, channel: str, username: str) ‑> None
Expand source code
def untimeout(self, channel: str, username: str) -> None:
    """
    Cancels the timeout of a user

    Args:
        channel (str): Channel who ejected the user
        username (str): User to readmit
    """

    self.send(channel, f"/untimeout @{username}")

Cancels the timeout of a user

Args

channel : str
Channel who ejected the user
username : str
User to readmit
def unvip(self, channel: str, username: str) ‑> None
Expand source code
def unvip(self, channel: str, username: str) -> None:
    """
    Removes the vip range from a user

    Args:
        channel (str): Channel who remove's the vip range
        username (str): User's name
    """

    self.send(channel, f"/unvip {username}")

Removes the vip range from a user

Args

channel : str
Channel who remove's the vip range
username : str
User's name
def vip(self, channel: str, username: str) ‑> None
Expand source code
def vip(self, channel: str, username: str) -> None:
    """
    Makes a user vip

    Args:
        channel (str): Channel who makes a user vip
        username (str): User's name
    """

    self.send(channel, f"/vip {username}")

Makes a user vip

Args

channel : str
Channel who makes a user vip
username : str
User's name
def vips(self, channel: str) ‑> None
Expand source code
def vips(self, channel: str) -> None:
    """
    Shows the vips list of a channel

    Args:
        channel (str): Channel who owns the vips
    """

    self.send(channel, "/vips")

Shows the vips list of a channel

Args

channel : str
Channel who owns the vips
def whisper(self, channel: str, user: str, text: str) ‑> None
Expand source code
def whisper(self, channel: str, user: str, text: str) -> None:
    """
    Whispers to a user

    Args:
        channel (str): Channel on which send the whisp
        user (str): User's name
        text (str): Whisper's text
    """

    self.send(channel, f"/w {user} {text}")

Whispers to a user

Args

channel : str
Channel on which send the whisp
user : str
User's name
text : str
Whisper's text