0

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 Answer 1

1

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)
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.