You need to enable JavaScript to run this app. discord.py投票命令多emoji支持实现与TypeError报错排查
优惠活动
大模型
产品
解决方案
定价
更多

discord.py投票命令多emoji支持实现与TypeError报错排查

报错触发核心原因

  • 函数参数定义和discord.py的解析规则冲突:原代码写的async def poll(ctx, *, message, em1, em2, ...)中的*语法,作用是把它后面定义的所有参数标记为仅关键字参数,这类参数必须靠参数名=值的形式显式传入才能被识别,普通的空格分隔位置传参不会被接收。
  • 当用户输入!poll test :white_large_square: :black_large_square: :tired_face:时,discord.py会把命令后面的整段内容(也就是test :white_large_square: :black_large_square: :tired_face:)全部填充到*后面的第一个参数message里,后续必填的em1、em2完全收不到输入值,直接触发缺参数的TypeError。
  • 原代码存在隐藏的逻辑漏洞:权限校验不通过的分支没有提前终止执行流程,后续给消息加reaction的代码会因为msg变量从未被赋值,直接触发未定义变量的报错。

多emoji场景适配实现方案

核心调整逻辑:放弃写死固定数量的emoji参数(em1到em10的硬编码写法扩展性极差),改用可变位置参数收集用户的全部命令输入,在函数内部手动拆分出投票问题和emoji列表,灵活支持2-10个选项的投票场景(匹配Discord单条消息最多添加20个reaction的限制)。

可直接运行的修正代码如下:

@commands.command(name="poll")
async def poll(ctx, *poll_args):
    # 先执行权限校验,无权限直接终止逻辑
    author_perms = ctx.author.permissions_in(ctx.channel)
    if not author_perms.manage_messages:
        perm_embed = discord.Embed(
            title="Permission Denied.",
            description="You don't have permission to execute this command.",
            color=0xff0000
        )
        perm_embed.set_footer(text="Official GNAG Discord Bot Made by Lukeee#2222")
        await ctx.send(embed=perm_embed)
        return

    # 校验输入格式是否合法
    if len(poll_args) < 3: # 合法格式为 !poll 问题 选项1emoji 选项2emoji,最少3段输入
        tip_embed = discord.Embed(
            title="参数格式错误",
            description="正确使用示例:`!poll 投票问题 :emoji1: :emoji2: :emoji3:`,最少需要2个投票选项emoji",
            color=0xff0000
        )
        await ctx.send(embed=tip_embed)
        return

    # 拆分输入内容
    poll_question = poll_args[0]
    poll_emojis = list(poll_args[1:])
    # 限制最多10个选项,避免超出reaction数量上限
    if len(poll_emojis) > 10:
        poll_emojis = poll_emojis[:10]

    # 构造投票消息
    poll_embed = discord.Embed(title="📜Poll📜", color=discord.Color.red())
    poll_embed.add_field(name="Question", value=poll_question)
    poll_embed.set_footer(text="Official GNAG Discord Bot Made by Lukeee#2222")
    poll_msg = await ctx.channel.send(embed=poll_embed)

    # 批量添加reaction,增加无效emoji容错
    for emoji in poll_emojis:
        try:
            await poll_msg.add_reaction(emoji)
        except discord.errors.HTTPException:
            # 遇到拼写错误的无效emoji自动跳过,不中断命令执行
            continue

方案适配效果

  • 完全兼容指定的使用示例:输入!poll test :white_large_square: :black_large_square: :tired_face:时,会自动识别test为投票主题,把后面三个emoji依次添加为消息reaction,不需要手动匹配参数数量
  • 修复了原代码中无权限分支下的空变量报错问题
  • 增加了格式校验和无效emoji容错,不会因为单个输入错误导致整个命令崩溃
  • 支持任意数量的emoji输入,最多可承载10个投票选项,完全覆盖多选项的投票场景

内容的提问来源于stack exchange,提问作者Luke

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.31 09:54:05