命令 discord.py 中的客户端事件

Posted

技术标签:

【中文标题】命令 discord.py 中的客户端事件【英文标题】:Client Event in command discord.py 【发布时间】:2021-06-12 22:16:20 【问题描述】:

我目前正在制作一个带有教程的不和谐机器人,我希望如果成员键入“下一步”,则下一步发送。

代码:

async def pytutorial(ctx):
    embed=discord.Embed(title="Help for Wolf-Hosting Bot", description="panel.wolf-hosting.nl", color=0x0400ff)
    embed.set_thumbnail(url="https://cdn.discordapp.com/icons/807978904727191572/0704feeefd7a91c1abb2c37f9c9cc4f4.webp?size=256")
    embed.add_field(name="Welcome to the Wolf Hosting python tutorial!", value="We are first going to start with chosing an editor. I prefer using VSCode.", inline=True)
    embed.add_field(name='Type "next" for the next step.', value="Don't include the """, inline=True)
    embed.add_field(name="Download VSCode:", value="https://code.visualstudio.com/download", inline=False)
    await ctx.send(embed=embed)
    @client.event
    async def on_message(message):
        if "next" in message.content:
            embed=discord.Embed(title="Help for Wolf-Hosting Bot", description="panel.wolf-hosting.nl", color=0x0400ff)
            embed.set_thumbnail(url="https://cdn.discordapp.com/icons/807978904727191572/0704feeefd7a91c1abb2c37f9c9cc4f4.webp?size=256")
            embed.add_field(name="Installing discord.py", value='First click on Terminal in VSCode. Type "py -3 -m pip install -U discord.py".', inline=True)
            embed.add_field(name='Type "next" for the next step.', value="Don't include the """, inline=True)
            embed.add_field(name="More advanced explaining:", value="https://discordpy.readthedocs.io/en/latest/intro.html#installing", inline=False)
            await ctx.send(embed=embed)

问题:on_message 事件一直在运行,人们无法再运行其他命令。 问题:如何在命令中创建一个事件(或者更好的方式来编写这个 xd)

【问题讨论】:

我想你在找wait_for 【参考方案1】:

等待消息或任何 discord.py 事件可以通过bot.wait_for完成

@bot.command() #assuming bot since you haven't specified
async def command(ctx):
   #show help or some embed here
   try: 
      msg = await bot.wait_for('message', check = lambda x: 'next' in x.content and x.author == ctx.author, timeout = 30) #use self.bot.wait_for in cogs
   except asyncio.TimeoutError:
      await ctx.send('You took too long to respond')
   finally:
      #do other stuff here
      await msg.channel.send('hi')

使用bot.wait_for

    第一个参数是你等待的事件,这样的事件都传 事件检查,检查函数采用与on_event 函数相同的参数。例如 on_messagemessage 作为参数。 检查函数应该返回一个布尔值。如果消息包含next 并且作者与命令作者相同,我们的检查函数返回true。 timeout 参数告诉机器人等待多长时间,如果超时,asyncio.TimeoutError 被引发,我们通过 try 和 except 捕获它。

参考资料:

bot.wait_for discord.py events

【讨论】:

没有string.contains这样的东西,在python中使用了in关键字,所以你应该使用x.content.contains('next')而不是x.content.contains('next')。而且他使用的是client而不是bot 已编辑,抱歉

以上是关于命令 discord.py 中的客户端事件的主要内容,如果未能解决你的问题,请参考以下文章

discord.py bot 找到要删除的频道消息,但显示其客户端 ID 与我的相同

关闭 Discord 机器人连接而不终止命令行 (discord.py)

Discord.py - 重新启动命令错误 - RuntimeError:事件循环已关闭

如何使用用户帐户获取/获取消息 (discord.py)

Discord.py 谷歌图片搜索

如何在 discord.py 机器人中正确使用任务/事件循环?