Search code examples
pythonbotstwitch

Python Twitchio unable to use command and event_message at same time


I'm trying to record twitch chat messages while still recognizing commands, however, recording the messages using event_message seems to stop the command from working.

Anybody know how you would recognize/respond to commands and record message at the same time?

from twitchio.ext import commands
import time
from datetime import datetime


class Bot(commands.Bot):
    def __init__(self):
        super().__init__(
            token='oauth:',
            prefix='!',
            initial_channels=['channelname']
        )

    # This function isn't running; event_message is stealing the input!
    @commands.command(name='ping')
    async def my_command(self, ctx):
        print('Caught ping')
        await ctx.send('pong')

    # records the messages (or in this case, the time a message is sent)
    async def event_message(self, message):
        print(time.mktime(datetime.now().timetuple()))  # prints the unix second


if __name__ == '__main__':
    bot = Bot()
    bot.run()

Reducing this down even more, the same issue occurs here; with the bot responding to the command, but not printing the message author or content:

from twitchio.ext import commands
import os

bot = commands.Bot(
    token='', prefix="!", initial_channels=[""], client_id='', nick='', client_secret='')


#This isn't working; Should still grab the message author/name and print.
Ive tried twitchio versions between 1.3.0 and 2.3.0, but the issue persists.
@bot.event
async def event_message(ctx):
    print(ctx.author.name)
    print(ctx.content)
    await bot.handle_commands(ctx)


#This is running
@bot.command(name='test')
async def test_command(ctx):
    await ctx.send('this is a test response')


if __name__ == '__main__':
    bot.run()

Solution

  • Issue was not including an "await bot.handle_commands(ctx)" command below the event_message function. Attached below is a working code

    from twitchio.ext import commands
    
    
    class Bot(commands.Bot):
        def __init__(self):
            super().__init__(token='', prefix="!", initial_channels=[""])
    
        @commands.command()
        async def ping(self, ctx):
            print('Caught Ping')
            await ctx.send(f'Pong!')
    
        async def event_message(self, message):
            print(message.author.name, message.content)
            await bot.handle_commands(message)          # <--This is the new line
    
    bot = Bot()
    bot.run()
    

    NOTE: An error is raised by the event_message function when the bot sees one of its' own messages in chat. This doesn't seem to inhibit function, but it can be fixed by changing the code to the following:

        async def event_message(self, message):
            if hasattr(message.author, 'name'):         # <-- New Line
                print(message.author.name, message.content)
                await bot.handle_commands(message)