簡體   English   中英

Discord.py 等待消息或反應

[英]Discord.py wait for message or reaction

我對 Python 和 Discord.py 都很陌生,我試圖找到如何讓機器人同時等待用戶的消息或反應。

我嘗試將每個分開,但只是導致機器人在反應之前需要消息響應。

這是我正在嘗試執行的類似代碼:

@bot.event
async def on_message(ctx):
    if ctx.author == bot.user:
        return

    if ctx.content == "$respond":
        message = await ctx.send("Waiting for response...")

        while True:
            try:
                response = #Will wait for a message(Yes or No) or reaction(Check or Cross) from ctx.author for 30 secs
            except asyncio.TimeoutError:
                await message.edit(content=f"{ctx.author} did not respond anymore!")
                break

            if response.content == "yes":
                await message.edit(content=f"{ctx.author} said yes!")
                continue
            
            elif response.content == "no":
                await message.edit(content=f"{ctx.author} said nyo!")
                continue
            
            #These are reactions
            elif str(response.emoji) == "✅":
                await message.edit(content=f"ctx.author reacted ✅!")
                continue
            
            elif str(response.emoji) == "❌":
                await messave.edit(content=f"Stopped listening to responses.")
                break

bot.wait_for是您在這里尋找的。

我建議使用bot.command()來處理命令,但這也很好。

這是您在特定條件下等待特定事件(作為第一個參數提供)的方式(如check參數中提供的那樣)

@bot.event
async def on_message(msg):
    if msg.author == bot.user:
        # if the author is the bot itself we just return to prevent recursive behaviour
        return
    if msg.content == "$response":

        sent_message = await msg.channel.send("Waiting for response...")
        res = await bot.wait_for(
            "message",
            check=lambda x: x.channel.id == msg.channel.id
            and msg.author.id == x.author.id
            and x.content.lower() == "yes"
            or x.content.lower() == "no",
            timeout=None,
        )

        if res.content.lower() == "yes":
            await sent_message.edit(content=f"{msg.author} said yes!")
        else:
            await sent_message.edit(content=f"{msg.author} said no!")

這將導致: 結果

監聽多個事件有點有趣,用這個片段替換現有的wait_for

done, pending = await asyncio.wait([
                    bot.loop.create_task(bot.wait_for('message')),
                    bot.loop.create_task(bot.wait_for('reaction_add'))
                ], return_when=asyncio.FIRST_COMPLETED)

你可以同時監聽兩個事件

以下是使用@bot.command()處理此問題的方法

import discord
import os
from discord.ext import commands

bot = commands.Bot(command_prefix="$", case_insensitive=True)


@bot.event
async def on_ready():
    print(f"Logged in as {bot.user}")


@bot.command()
async def response(ctx):
    sent_message = await ctx.channel.send("Waiting for response...")
    res = await bot.wait_for(
        "message",
        check=lambda x: x.channel.id == ctx.channel.id
        and ctx.author.id == x.author.id
        and x.content.lower() == "yes"
        or x.content.lower() == "no",
        timeout=None,
    )

    if res.content.lower() == "yes":
        await sent_message.edit(content=f"{ctx.author} said yes!")
    else:
        await sent_message.edit(content=f"{ctx.author} said no!")


bot.run(os.getenv("DISCORD_TOKEN"))

新結果 這會給你同樣的結果。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM