如何正确获取Discord消息反应用户列表并实现随机分组?
修复实现方案
现有代码的核心问题是发送带反应的消息后没有等待用户操作就直接读取反应列表,同时反应遍历逻辑、check函数的使用方式都存在错误,以下是可直接运行的修复代码:
import random # 原有✅表情选择游戏的逻辑保留 if str(reaction.emoji) == '✅': # 校验规则:仅统计非Bot用户点击的🎲表情,且反应属于当前召集消息 def check(reaction, user): return user != bot.user and str(reaction.emoji) == '🎲' and reaction.message.id == msg_players1.id # 发送玩家召集消息,添加🎲反应 msg_players1 = await ctx.send('Summoners, react below: ') await msg_players1.add_reaction('🎲') signed_users = set() # 循环监听反应,直到凑够10名玩家 while len(signed_users) < 10: reaction, user = await bot.wait_for('reaction_add', check=check) signed_users.add(user) # 打乱玩家列表,随机拆分两队 player_list = list(signed_users) random.shuffle(player_list) team_a, team_b = player_list[:5], player_list[5:] # 输出分组结果 await ctx.send(f"队伍1:{', '.join(user.name for user in team_a)}") await ctx.send(f"队伍2:{', '.join(user.name for user in team_b)}")
问题对应处理说明
- 排除Bot自身:通过check函数的
user != bot.user规则过滤,Bot触发的反应不会被计入玩家列表 - 满10人自动分组:通过while循环持续监听用户反应事件,集满10人后立刻停止监听执行分组逻辑
- 随机拆分队伍:调用random.shuffle打乱玩家列表后直接切片拆分,保证分组完全随机
- 补充问题修复:原代码未等待用户操作就直接读取消息属性,现在通过
bot.wait_for监听每次用户的反应添加操作,可正确获取所有点击了🎲表情的用户,不会仅返回命令调用者
内容的提问来源于stack exchange,提问作者Tutuba
相关产品推荐
相关产品推荐

