0
votes

I am attempting to include positional arguments into an on_message function using discord.py but I receive an error below

 File "/usr/lib/python3.8/site-packages/discord/client.py", line 312, in _run_event
    await coro(*args, **kwargs)
TypeError: on_message() missing 3 required positional arguments: 'channels', 'textdata', and 'command'

My aim is to pass channels - a name of a channel on discord server, textdata - file path of text file, command - command that user will enter in discord channel for data to be returned.

I just wanted to ask is it possible to pass positional arguments into on_message or can message be the only one?

The code I have is

channels =[]

@client.event
async def on_message(message, channels , textdata, command):
    
    id = client.get_guild(7319460*****229982)
    
    
    
    
    if str(message.channel) in channels:
        if message.content.find(command) != -1:

            with open(textdata, 'r') as file:
                msg = file.read(2000).strip()
                while len(msg) > 0:
                    await message.author.send(msg)
                    msg = file.read(2000).strip()
                    
def callall():
    on_message(channels="boxingmma",  textdata="/home/brendan/Desktop/Python/liveonsatscraper/testlasttime.txt", command="!boxingfixtures")

The reason I am attempting this is because I need to be able to run the code above on multiple discord channels, to output the data from the filepaths in textdata and to provide a different command based on the data required. I could copy the code above 100 times and input the hardcoded string values for each of the arguments but I thought it would be better to pass these values into the function above to save repeating code.

Thank you in advance to anyone that can provide guidance or a solution to this.

1

1 Answers

1
votes

When the bot receives a message through on_message, there is only one parameter: message. It's a class all on it's own, but it can be broken down into:

message.content #what was said, string
message.channel #which channel it was said in, channel class
message.guild #which server it was said in, guild class
message.author #who sent the message, user class

And you can go from there.

{EDIT}

If you want it to be able to parse commands as well, do like so:

@bot.event
async def on_message(message):
    if message.author == bot.user: return #makes it so the bot doesn't listen to itself
    await bot.process_commands(message)