Discord开发中如何将用户的消息反应保存为变量
实现方法
完全可以实现,你现有代码的核心问题是on_message内定义的msg是局部变量,和全局声明的msg没有关联,导致on_reaction_add里的消息匹配逻辑永远不会触发,且没有单独存储用户反应的变量。
推荐修改方案
用内置的wait_for方法监听单次反应输入更简洁,不需要额外单独写全局的on_reaction_add事件,修改后完整代码如下:
import discord client = discord.Client() # 用来存储用户选择的反应的全局变量,后续可以直接调用 user_selected_reaction = None @client.event async def on_ready(): print('We have logged in as {0.user}'.format(client)) @client.event async def on_message(message): global user_selected_reaction if message.author == client.user: return # 发送问题消息并添加反应 msg = await message.channel.send("**Question 1?**") reactions = ['1️⃣','2️⃣','3️⃣','4️⃣'] for emoji in reactions: await msg.add_reaction(emoji) # 定义反应检查规则:排除机器人自己的反应,反应是指定的四个,且反应绑定的消息是刚发送的问题消息 def check(reaction, user): return user != client.user and str(reaction.emoji) in reactions and reaction.message.id == msg.id try: # 等待用户反应,这里可以设置timeout参数,比如timeout=30就是30秒没输入就超时 reaction, user = await client.wait_for('reaction_add', check=check) # 把用户选择的第一个反应赋值给全局变量 user_selected_reaction = str(reaction.emoji) # 测试输出,可以删掉 await message.channel.send(f"你选择的反应是:{user_selected_reaction}") # 如果需要支持后续用户改选覆盖变量值,去掉下面的return,再加个循环持续监听即可 return except: # 超时的处理逻辑,可以自己加 await message.channel.send("等待反应超时") client.run("你的token")
逻辑说明
- 你后续需要调用用户选择的反应时,直接取全局变量
user_selected_reaction的值即可 - 如果需要支持用户后续选择其他反应覆盖之前的结果,只需要持续监听符合
check规则的reaction_add事件,每次触发时更新user_selected_reaction的值即可 - 如果需要区分不同用户的反应,把存储变量改成字典类型,以用户ID为key存储对应反应即可
内容的提问来源于stack exchange,提问作者Rrezon Beqiri
相关产品推荐
相关产品推荐

