如何在一次運行中多次運行 wait_for 命令?

ZT255
msg = await ctx.channel.send(f"`Now playing: {var3}` \n{url}")
await msg.add_reaction(u"\u23F8")
await msg.add_reaction(u"\u25B6")
while True:
  try:
    reaction, user = await client.wait_for("reaction_add", check=lambda reaction, user: reaction.emoji in [u"\u23F8", u"\u25B6"], timeout=90.0)
  
  except asyncio.TimeoutError:
    return await msg.clear_reactions()
  
  else:
    if reaction.emoji == u"\u23F8":
      await msg.remove_reaction(reaction.emoji, ctx.author)
      await ctx.voice_client.pause()
    elif reaction.emoji == u"\u25B6":
      await msg.remove_reaction(reaction.emoji, ctx.author)
      await ctx.voice_client.resume()

這是來自播放命令的一段代碼,它應該發送一條消息顯示正在播放的內容,並顯示暫停和播放反應,當用戶做出反應時,它將暫停和播放音頻。現在它只在整個代碼運行期間運行一次,這意味著它只會在用戶第一次調用命令並做出反應時做出響應。例如,如果用戶播放某事然後在暫停反應中暫停,它將暫停,但如果他在他之後立即進行播放反應,則他將沒有反應。同樣,如果他在第一首歌曲之後播放另一首歌曲並嘗試暫停或播放反應,他將不會得到任何回應。

您可以做的是將反應處理程序包裝在 下asyncio.create_task(),這將防止這些代碼阻塞wait_for().

import asyncio

msg = await ctx.channel.send(f"`Now playing: {var3}` \n{url}")
await msg.add_reaction("\u23F8")
await msg.add_reaction("\u25B6")
while True:
  try:
    reaction, user = await bot.wait_for("reaction_add",
                                        check=lambda reaction, user:
                                        user.id == ctx.author.id and
                                        reaction.message.id == msg.id and
                                        reaction.emoji in ["\u23F8", "\u25B6"],
                                        timeout=90.0)

  
  except asyncio.TimeoutError:
    return await msg.clear_reactions()
  
  async def process():
    if reaction.emoji == "\u23F8":
      await msg.remove_reaction(reaction.emoji, ctx.author)
      await ctx.voice_client.pause()
    elif reaction.emoji == "\u25B6":
      await msg.remove_reaction(reaction.emoji, ctx.author)
      await ctx.voice_client.resume()

  asyncio.create_task(process())

除了使用 之外create_task(),您的wait_for檢查還應包括檢查相同的用戶和相同的消息。否則其他人可能會用這兩個表情符號對某些消息做出反應,你wait_for會認為它是有效的。此外,unicode 字符串u"..."不再需要u前綴,在 Python 3 中所有字符串默認都是 unicode。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何使用Ansible wait_for检查多行命令状态?

如何取消待定的wait_for

C ++中的condition_variable wait_for

如何在 Jupyter 筆記本中運行命令?

如何在 shell 腳本中運行 sacct 命令

我想知道如何正确使用 wait_for 命令。任何人都可以帮助我吗?它的不和谐.py

如何在 centos 容器中運行一些剪切命令?

如何在 discord.py 中使用 wait_for?

如何在循环线程中使用wait_for?

如何在discord.py中使用wait_for函数?

Discord wait_for() 如何添加作者的多个回复?

0作为std :: condition_variable :: wait_for中的超时

条件变量中 wait_for 函数的用途 - C++11

discord.py wait_for 在方法中不起作用

如何在 .ebextensions 文件夾中為彈性 beantalk 運行命令行命令?

使用 System() 僅在 Awk 內運行 Shell 命令一次“每個命令”,即,僅打印一次“文本”

在 GCP Composer 中運行命令

如何在 kubernetes 中的“kubectl run image command”之後運行命令?

如何在運行預定義的工匠命令時忽略控制台命令

我如何使wait_for()函数在嵌齿轮discord.py中工作?

Asyncio wait_for 一个函数结束,或者另一个函数

Discord.py wait_for 消息...如何取消息内容和消息写的人?

Dockerfile 命令不在組合上運行,但在構建容器後在 CLI 中運行

一次执行3行命令

如何從 Python 腳本運行 nohup 命令?

運行 onclick 命令以在 chartsJS 中顯示表格

在 on_message (discord.py) 中運行命令

如何在 gradle 任務被終止後運行命令?

如何在 macOS 上運行 Install4j 命令行編譯器?