如何在discord.py中使用由多个单词组成的命令别名
问题原因
discord.py 原生的命令解析逻辑默认按空格拆分消息内容,取第一个拆分后的片段作为命令名匹配,因此aliases参数本身不支持传入带空格的多词内容,你输入[前缀]night night时,程序只会把night当作命令名匹配,第二个night会被识别为命令参数,自然无法触发对应命令。
可用实现方案
方案1:通过on_message事件手动匹配多词别名
这个方案灵活度最高,不需要改动原有命令的结构,新增多词别名时只要加匹配规则即可,示例代码如下:
# 原有goodnight命令仅保留单单词别名即可 @bot.command(aliases=["gn"]) async def goodnight(ctx): await ctx.send("@everyone Goodnight everyone!") @bot.event async def on_message(message): # 匹配前缀+多词别名的规则,示例假设你的机器人命令前缀为!,可自行调整 if message.content.lower() == "!night night": # 手动生成命令上下文,触发goodnight命令 ctx = await bot.get_context(message) await ctx.invoke(goodnight) # 必须保留此行,否则其他普通命令会全部失效 await bot.process_commands(message)
方案2:通过嵌套命令组实现
你也可以通过discord.py的组命令功能,把多词别名拆分为父命令+子命令的形式实现,示例代码如下:
# 定义父命令night,设置调用无对应子命令时不触发操作 @bot.group(invoke_without_command=True) async def night(ctx): pass # 定义子命令night,形成!night night的调用形式,直接复用goodnight逻辑 @night.command(name="night") async def _night_night(ctx): await goodnight(ctx) # 原有goodnight命令保持不变 @bot.command(aliases=["gn"]) async def goodnight(ctx): await ctx.send("@everyone Goodnight everyone!")
注意事项
- 两种方案都可以兼容原有单单词别名的使用,不需要调整已有调用逻辑
- 如果需要新增更多多词别名,方案1只要在
on_message里新增对应匹配规则即可,方案2需要新增对应层级的组命令/子命令
内容的提问来源于stack exchange,提问作者DavyJonesStockings
相关产品推荐
相关产品推荐

