Na moim Discord Bot (Python) Próbuję wykryć lub raczej sprawdzić wysłaną wiadomość w poleceniu: jeśli ktoś wpisuje polecenie $ Uruchom polecenie powinno sprawdzić w czasie pętli, które wiadomości są wysyłane po komendzie $ start. Jeśli wysłana wiadomość jest "Dołącz", użytkownik, który wysłał wiadomość, należy dodać do listy. Próbowałem wykryć i oszczędzać wiadomości w zmiennej za pośrednictwem funkcji ON_MESSAGE (), ale nie wydaje się działać i nie myślę, że mój kod robi tak dużo sensu, ale nie wiem, jak prawidłowo go wdrożyć.

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*)

Umieściłem SentMSG Varibale do odcinka Watch w VS-Code i zawsze mówi "niedostępny" Chociaż drukuje odpowiednie wartości. Również podczas unoszenia się nad nim w On_Message () mówi: "SentMSG" nie ma dostępu do pęcherzyków. Czy ktoś może poprawić mój kod lub czy ktoś ma lepszy pomysł na wdrożenie tego?

Byłbym wdzięczny za pomoc

0
Toilettenbrain 13 marzec 2021, 03:48

1 odpowiedź

Najlepsza odpowiedź

Zamiast używać zdarzenia On_Message, możesz sprawić, że bot wykryje wiadomości za pomocą klienta.wait_for!

Na przykład:

@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
1
FlexGames 13 marzec 2021, 19:09