python - discord.py 同时向多个人发送消息并接收他们的输入
问题描述
我正在尝试做的事情:我正在用我的机器人制作反人类卡 (CAH) 游戏,以便与朋友一起玩。为此,我想尽可能在接近同一时间向作者给出的所有玩家发送消息,而不是一个一个地向他们发送消息并等待某人的输入,然后再获得下一个人的输入。下面是我制作的一个简单的可视化示例,以防令人困惑。
我的问题:我如何一次向多个人发送消息并接收他们单独的输入?
代码:
我尝试使用多个命令将其分开,通过ctx.invoke
,因此机器人将按人运行命令。然而,机器人并没有按照我的预期去做,而是在单独浏览列表时向他们发送消息,而是在每个人之间停下来等待他们的输入,然后再将消息发送给下一个人。
@client.command() # part 1: beginning the command sequence
@commands.check(check_blacklist)
async def test(ctx, members: commands.Greedy[discord.Member]=None):
if members != None:
members.append(ctx.author)
msg = ""
for member in members:
msg += f"\> {member.display_name}\n"
await ctx.send(f"These people will be test: \n{msg}")
else:
await ctx.send("Nobody")
return
await ctx.invoke(client.get_command('test2'), members=members)
@client.command() # part 2: sending messages to each person to see if their dms are open
async def test2(ctx, members):
for member in members:
try:
await member.send("wa")
await ctx.send(f"Successful wa to {member.display_name}")
await ctx.invoke(client.get_command('test3'), member=member)
except:
await ctx.send(f"{member.mention} has their dms closed or is a bot :pensive:")
@client.command() # part 3: receiving inputs from each person
async def test3(ctx, member:discord.Member):
def check(msg):
return msg.author==member and str(msg.channel.type) == "private"
await member.send("Please provide an input:")
try:
response = await client.wait_for('message', check=check, timeout=75)
except:
await ctx.send(f"{member.display_name} didn't respond :pensive:")
return
await ctx.send(f"{member.mention}: {response.content}")
解决方案
我会使用不是命令的异步函数asyncio.gather
def is_dm_check(member):
def inner_check(msg):
return msg.author.id==member.id and msg.guild is None
return inner_check
async def get_input(member):
await member.send("Please provide an input:")
return client.wait_for('message', check=is_dm_check(member), timeout=75)
@client.command()
async def play_game(ctx, members: commands.Greedy[discord.Member]=None):
if not members:
await ctx.send("No Players")
return
responses = asyncio.gather(*map(get_input, members))
for member, response in zip(members, responses):
await ctx.send(f"{member.mention}: {response.content}")
推荐阅读
- cmake - 如何使用 qtcreator 通过 ninja 构建系统远程部署应用程序
- php - 字符串过滤器在 API 平台中不起作用
- javascript - 滚动时如何使元素粘在顶部
- xml - 如何从groovy中的xml中删除不是特定字段的节点?
- sql-server - 如何从表中获取最小入住时间和最大退房时间?
- wordpress - woocommerce BACS 添加自定义字段
- html - 如何将图像定位在 HTML/CSS 中的文本背景
- c# - 有没有办法以编程方式更改集合视图的默认项?
- node.js - 卡夫卡消费者在暂停和恢复后不消费消息
- java - 我们可以使用其他存储库绝对路径在 Maven 中引用其他存储库模块吗