Discord机器人?roast命令无法同时兼容带与不带@用户调用,是否有其他实现方案?
问题根源
你当前的代码强制要求roast命令必须传入一个discord.Member类型的用户参数,所以不带@用户调用?roast时,会因为参数校验不通过无法触发命令逻辑。
修复方案
将member参数改为可选参数,设置默认值为None,再根据参数是否存在走不同的逻辑分支即可同时支持两种调用格式,完整实现代码如下:
# 顶部先导入类型标注依赖,python 3.10+版本可直接用`discord.Member | None`替代Optional from typing import Optional import random import discord from discord.ext import commands @client.event async def on_ready(): await client.change_presence(status=discord.Status.dnd, activity=discord.Game(' "?" Booe')) print('Bot is ready to play!') @client.command() async def roast(ctx, member: Optional[discord.Member] = None): # 无指定用户时默认把调用者作为调侃对象,你也可以自行修改这个分支的逻辑 if not member: roast_list = [ f"{ctx.author.mention} 你就像单词Queue里的UEUE一样,毫无存在意义", # 可自行添加更多无参数场景的调侃话术 ] else: roast_list = [ f"{ctx.author.mention} 觉得{member.mention}就像单词Queue里的UEUE一样,毫无存在意义", # 可自行添加更多指定用户场景的调侃话术 ] await ctx.send(random.choice(roast_list))
扩展说明
如果需要支持用户输入无效用户(比如输了不存在的用户名)不报错,可以额外添加commands.MemberNotFound异常捕获,或者给参数加default=None的同时关闭类型转换校验,可根据自己的使用场景调整。
内容的提问来源于stack exchange,提问作者AndreiWJL
相关产品推荐
相关产品推荐

