Twitch Chat Bot#
A simple twitch chat bot.
Chat bots can join channels, listen to chat and reply to messages, commands, subscriptions and many more.
Commands#
Chat commands are specific messages user can send in chat in order to trigger some action of your bot.
Example:
<User123>: !say Hello world
<MyBot>: User123 asked me to say "Hello world"
You can register listeners to chat commands using register_command()
.
The bot prefix can be set by using set_prefix()
, the default is !
Your command listener function needs to be async and take in one parameter of type ChatCommand
.
Example:
async def say_command_handler(cmd: ChatCommand):
await cmd.reply(f'{cmd.user.name} asked me to say "{cmd.parameter}")
chat.register_command('say', say_command_handler)
Command Middleware#
Command Middleware is a way to control when a command should be executed.
See Chat Command Middleware and Chat - Introduction to Middleware for more information.
Events#
You can listen to different events happening in the chat rooms you joined.
Generally you register a event listener using register_event()
.
The first parameter has to be of type ChatEvent
and the second one is your listener function.
Those Listeners always have to be async functions taking in one parameter (the payload). The Payload type is described below.
Example:
async def on_ready(cmd: EventData):
await cmd.chat.join_room('teekeks42')
chat.register_event(ChatEvent.READY, on_ready)
Available Events#
Event Name |
Event Data |
Description |
---|---|---|
Bot Ready |
This Event is triggered when the bot is started up and ready to join channels. |
|
Message Send |
ChatEvent: |
This Event is triggered when someone wrote a message in a channel we joined |
Channel Subscription |
This Event is triggered when someone subscribed to a channel we joined. |
|
Raid |
ChatEvent: |
Triggered when a channel gets raided |
Channel Config Changed |
ChatEvent: |
Triggered when a channel is changed (e.g. sub only mode was enabled) |
User Channel Join |
Triggered when someone other than the bot joins a channel. |
|
User Channel Leave |
Triggered when someone other than the bot leaves a channel. |
|
Bot Channel Join |
ChatEvent: |
Triggered when the bot joins a channel |
Bot Channel Leave |
Triggered when the bot left a channel |
|
Message Delete |
ChatEvent: |
Triggered when a single message in a channel got deleted |
User Messages Cleared |
ChatEvent: |
Triggered when a user was banned, timed out and/or all messaged from a user where deleted |
Bot Reveives Whisper Message |
ChatEvent: |
Triggered when someone whispers to your bot. |
Server Notice |
ChatEvent: |
Triggered when server sends a notice message. |
Code example#
from twitchAPI.twitch import Twitch
from twitchAPI.oauth import UserAuthenticator
from twitchAPI.type import AuthScope, ChatEvent
from twitchAPI.chat import Chat, EventData, ChatMessage, ChatSub, ChatCommand
import asyncio
APP_ID = 'my_app_id'
APP_SECRET = 'my_app_secret'
USER_SCOPE = [AuthScope.CHAT_READ, AuthScope.CHAT_EDIT]
TARGET_CHANNEL = 'teekeks42'
# this will be called when the event READY is triggered, which will be on bot start
async def on_ready(ready_event: EventData):
print('Bot is ready for work, joining channels')
# join our target channel, if you want to join multiple, either call join for each individually
# or even better pass a list of channels as the argument
await ready_event.chat.join_room(TARGET_CHANNEL)
# you can do other bot initialization things in here
# this will be called whenever a message in a channel was send by either the bot OR another user
async def on_message(msg: ChatMessage):
print(f'in {msg.room.name}, {msg.user.name} said: {msg.text}')
# this will be called whenever someone subscribes to a channel
async def on_sub(sub: ChatSub):
print(f'New subscription in {sub.room.name}:\n'
f' Type: {sub.sub_plan}\n'
f' Message: {sub.sub_message}')
# this will be called whenever the !reply command is issued
async def test_command(cmd: ChatCommand):
if len(cmd.parameter) == 0:
await cmd.reply('you did not tell me what to reply with')
else:
await cmd.reply(f'{cmd.user.name}: {cmd.parameter}')
# this is where we set up the bot
async def run():
# set up twitch api instance and add user authentication with some scopes
twitch = await Twitch(APP_ID, APP_SECRET)
auth = UserAuthenticator(twitch, USER_SCOPE)
token, refresh_token = await auth.authenticate()
await twitch.set_user_authentication(token, USER_SCOPE, refresh_token)
# create chat instance
chat = await Chat(twitch)
# register the handlers for the events you want
# listen to when the bot is done starting up and ready to join channels
chat.register_event(ChatEvent.READY, on_ready)
# listen to chat messages
chat.register_event(ChatEvent.MESSAGE, on_message)
# listen to channel subscriptions
chat.register_event(ChatEvent.SUB, on_sub)
# there are more events, you can view them all in this documentation
# you can directly register commands and their handlers, this will register the !reply command
chat.register_command('reply', test_command)
# we are done with our setup, lets start this bot up!
chat.start()
# lets run till we press enter in the console
try:
input('press ENTER to stop\n')
finally:
# now we can close the chat bot and the twitch api client
chat.stop()
await twitch.close()
# lets run our setup
asyncio.run(run())
Class Documentation#
- class twitchAPI.chat.Chat#
Bases:
object
The chat bot instance
- __init__(twitch, connection_url=None, is_verified_bot=False, initial_channel=None, callback_loop=None, no_message_reset_time=10)#
- Parameters:
twitch¶ (
Default:) – A Authenticated twitch instanceconnection_url¶ (
Default:) – alternative connection urlDefault:None
is_verified_bot¶ (
Default:) – set to true if your bot is verified by twitchDefault:False
initial_channel¶ (
Default:) – List of channel which should be automatically joined on startupDefault:None
callback_loop¶ (
Default:) –The asyncio eventloop to be used for callbacks.
Set this if you or a library you use cares about which asyncio event loop is running the callbacks. Defaults to the one used by Chat.
no_message_reset_time¶ (
Default:) – How many minutes of mo messages from Twitch before the connection is considered dead. Twitch sends a PING just under every 5 minutes and the bot must respond to them for Twitch to keep the connection active. At 10 minutes we’ve definitely missed at least one PINGDefault:10
-
logger: Default:#
The logger used for Chat related log messages
-
twitch: Default:#
The twitch instance being used
-
connection_url: Default:#
Alternative connection url
Default:None
-
ping_frequency: Default:#
Frequency in seconds for sending ping messages. This should usually not be changed.
-
ping_jitter: Default:#
Jitter in seconds for ping messages. This should usually not be changed.
-
listen_confirm_timeout: Default:#
Time in second that any
listen_
should wait for its subscription to be completed.-
reconnect_delay_steps: Default:#
Time in seconds between reconnect attempts
-
log_no_registered_command_handler: Default:#
Controls if instances of commands being issued in chat where no handler exists should be logged.
Default:True
-
room_cache: Default:#
internal cache of all chat rooms the bot is currently in
-
join_timeout: Default:#
Time in seconds till a channel join attempt times out
-
default_command_execution_blocked_handler: Default:#
The default handler to be called should a command execution be blocked by a middleware that has no specific handler set.
- start()#
- Return type:
- Default:
Start the Chat Client
- Raises:
RuntimeError – if already started
- stop()#
- Return type:
- Default:
Stop the Chat Client
- Raises:
RuntimeError – if the client is not running
- set_prefix(prefix)#
Sets a command prefix.
The default prefix is !, the prefix can not start with / or .
- Parameters:
prefix¶ (
Default:) – the new prefix to use for command parsing- Raises:
ValueError – when the given prefix is None or starts with / or .
- set_channel_prefix(prefix, channel)#
Sets a command prefix for the given channel or channels
The default channel prefix is either ! or the one set by
set_prefix()
, the prefix can not start with / or .- Parameters:
prefix¶ (
Default:) – the new prefix to use for commands in the given channelschannel¶ (
Default:) – the channel or channels you want the given command prefix to be used in- Raises:
ValueError – when the given prefix is None or starts with / or .
- reset_channel_prefix(channel)#
Resets the custom command prefix set by
set_channel_prefix()
back to the global one.- Parameters:
channel¶ (
Default:) – The channel or channels you want to reset the channel command prefix for- register_command(name, handler, command_middleware=None)#
Register a command
- Parameters:
name¶ (
Default:) – the name of the commandhandler¶ (
Default:) – The event handlercommand_middleware¶ (
Default:) – a optional list of middleware to use just for this command- Raises:
ValueError – if handler is not a coroutine
- Return type:
Default:- unregister_command(name)#
Unregister a already registered command.
- Parameters:
name¶ (
Default:) – the name of the command to unregister- Return type:
Default:- Returns:
True if the command was unregistered, otherwise false
- register_event(event, handler)#
Register a event handler
- Parameters:
event¶ (
Default:) – The Event you want to register the handler tohandler¶ (
Default:) – The handler you want to register.- Raises:
ValueError – if handler is not a coroutine
- unregister_event(event, handler)#
Unregister a handler from a event
- Parameters:
event¶ (
Default:) – The Event you want to unregister your handler fromhandler¶ (
Default:) – The handler you want to unregister- Return type:
Default:- Returns:
Returns true when the handler was removed from the event, otherwise false
- is_connected()#
- Return type:
- Default:
Returns your current connection status.
- is_ready()#
- Return type:
- Default:
Returns True if the chat bot is ready to join channels and/or receive events
- is_mod(room)#
Check if chat bot is a mod in a channel
- Parameters:
room¶ (
Default:) – The chat room you want to check if bot is a mod in. This can either be a instance ofChatRoom
or a string with the room name (either with leading # or without)- Return type:
Default:- Returns:
Returns True if chat bot is a mod
- is_subscriber(room)#
Check if chat bot is a subscriber in a channel
- Parameters:
room¶ (
Default:) – The chat room you want to check if bot is a subscriber in. This can either be a instance ofChatRoom
or a string with the room name (either with leading # or without)- Return type:
Default:- Returns:
Returns True if chat bot is a subscriber
- is_in_room(room)#
Check if the bot is currently in the given chat room
- Parameters:
room¶ (
Default:) – The chat room you want to check This can either be a instance ofChatRoom
or a string with the room name (either with leading # or without)- Return type:
Default:- async join_room(chat_rooms)#
join one or more chat rooms
Will only exit once all given chat rooms where successfully joined or
twitchAPI.chat.Chat.join_timeout
run out.- Parameters:
chat_rooms¶ (