Боты Discord: обнаружение сообщения в другой команде

На моем боте Discord (python) я пытаюсь обнаружить или, скорее, проверить отправленное сообщение в команде: если кто-то набирает команду $start, команда должна проверить в цикле while, какие сообщения отправляются после команды $start. Если отправленное сообщение - «присоединиться», пользователь, отправивший сообщение, должен быть добавлен в список. Я пытался обнаружить и сохранить сообщения в переменной с помощью функции on_message(), но, похоже, это не работает, и я не думаю, что мой код имеет такой смысл, но я не знаю, как правильно его реализовать.

      import discord
from discord.ext import commands
    
client = commands.Bot(command_prefix = "$")

@client.event
async def on_ready():
    print("started")

sentMsg = ""
users = []

@client.event
async def on_message(msg):
    if msg.author == client.user:
        return
    else:
        sentMsg = msg.content
        print(sentMsg)

@client.command()
async def start(ctx):
    print(sentMsg)
    await ctx.send("starting ...")
    users.append(ctx.author)
    while True:
        if sentMsg == "join":
            ctx.send("Joined!")
            sentMsg = ""

client.run(*token*)

Я помещаю переменную sentMsg в раздел Watch в VS-Code, и она всегда говорит «недоступно», хотя выводит правильные значения. Также при наведении курсора на него в on_message() он говорит: "sentMsg" не используется Pylance. Может ли кто-нибудь улучшить мой код или у кого-нибудь есть идея лучше реализовать это?

Буду признателен за чью-нибудь помощь

1 ответ

вместо использования события on_message вы можете заставить бота обнаруживать сообщения с помощью client.wait_for!

Например:

      @client.command()
async def start(ctx):
    await ctx.send("starting ...")
        try:
            message = await client.wait_for('message', timeout=10, check=lambda m: m.author == ctx.author and m.channel == ctx.channel and ctx.content == "join") # You can set the timeout to 'None' 
            # if you don't want it to timeout (then you can also remove the 'asyncio.TimeoutError' except case 
            # (remember you have to have at least 1 except after a 'try'))

            # if you want the bot to cancel this if the message content is not 'join',
            # take the last statement from the check and put it here with an if
            
            # what you want to do after "join" message

        except asyncio.TimeoutError:
            await ctx.send('You failed to respond in time!')
            return
Другие вопросы по тегам