Discord.py中如何获取被提及用户的消息?旧版Bot更新后wait_for参数报错问题解决
你遇到的问题是因为discord.py的API更新后,wait_for()方法不再支持直接传入author关键字参数了——这个参数在旧版本里可用,但新版本已经移除,必须通过**check回调函数**来验证消息发送者的身份。
问题根源
原来的代码里这一行:
antwort = await bot.wait_for(author = op, timeout=90)
在新版本discord.py中,wait_for()第一个参数必须指定要等待的事件类型(比如'message'),然后通过check参数传入一个函数,用来过滤符合条件的事件。
修改方案
- 首先,定义一个
check函数,确保回复来自目标用户op,且在同一个频道内(避免其他频道的消息干扰):
def check(msg): return msg.author == op and msg.channel == ctx.channel
- 修改
wait_for()的调用方式,加上事件类型'message'和check参数,同时处理超时情况(避免程序卡住):
import asyncio # 需要导入asyncio来处理超时异常 # ... 前面的攻击计算代码保持不变 ... else: await ctx.send(f"{ctx.message.author.mention} griff {op.mention} mit **{__erfolg}** Erfolgen an! {op.nick} gib bitte deinen Wert für physische Verteidigung ein.") # 修改后的wait_for部分 try: antwort = await bot.wait_for('message', check=check, timeout=90) except asyncio.TimeoutError: return await ctx.send(f"{op.mention} 超时未回复,操作已取消!") antwortVer = antwort.content verteidigung = int(antwortVer) # ... 后面的防御计算代码保持不变 ...
额外优化建议
你可以把重复的掷骰子逻辑封装成一个独立函数,减少代码冗余,比如:
def calculate_success(dice_count): erfolg = 0 sechs = dice_count while sechs > 0: _, current_erfolg, current_sechs = wurf(sechs) erfolg += current_erfolg sechs = current_sechs return erfolg
这样前面的攻击计算可以简化为__erfolg = calculate_success(a),防御计算简化为erfolgVer = calculate_success(verteidigung),代码会更整洁易维护。
内容的提问来源于stack exchange,提问作者Kendel Ventonda
相关产品推荐
相关产品推荐

