如何用Python编写Discord bot实现@提及用户及指令响应功能
解决方案
完整可运行修改后代码
if message.content.startswith('!highfive'): channel = message.channel # 校验指令格式,获取被@的目标用户 if not message.mentions: await channel.send("请使用正确格式:`!highfive @你要击掌的用户`") return target_user = message.mentions[0] sender = message.author # 发送击掌请求消息 await channel.send(f"{sender.mention} 想要和你击掌 {target_user.mention}") # 校验规则:仅允许被@的目标用户在当前频道回复yes/no def check(m): return m.author == target_user and m.content in ['yes', 'no'] and m.channel == channel try: reply_msg = await client.wait_for('message', timeout=10.0, check=check) # 根据回复内容分支处理 if reply_msg.content == 'yes': await channel.send(f"🥳 {target_user.mention} 接受了 {sender.mention} 的击掌!") else: await channel.send(f"😢 {target_user.mention} 拒绝了 {sender.mention} 的击掌") except asyncio.TimeoutError: await channel.send(f"{sender.mention} 对方太久没有回应,击掌请求已过期")
实现逻辑说明
- 问题1(获取并提及被@用户)实现:
Discord.py 中message对象自带mentions属性,会返回消息中所有被@用户的有序列表,列表第一个元素就是指令后跟的第一个被@用户。代码中额外增加了空值判断,避免用户没@其他人直接发指令触发报错。 - 问题2(分别响应yes/no、保留超时逻辑)实现:
修改check校验规则,仅允许被@的目标用户在当前频道回复yes/no才会被识别为有效回复。拿到用户回复后直接判断内容做分支处理即可,原有的asyncio.TimeoutError捕获逻辑完全保留不受影响。
内容的提问来源于stack exchange,提问作者Radiant Rose
相关产品推荐
相关产品推荐

