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] 删除。
我来说两句