You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在discord.py的AutoComplete中过滤长列表?参考Dank Memer实现

Discord.py 自动补全超25项的过滤实现思路(仿Dank Memer)

discord.py的AutoComplete接口限制最多返回25个选项,Dank Memer这类机器人的核心解决思路是根据用户实时输入的关键词做模糊匹配,仅保留匹配项并截取前25个返回,具体实现步骤和示例如下:

核心逻辑

用户在输入参数时,自动补全回调函数会拿到当前输入的字符串,以此为过滤条件从完整候选列表中筛选出相关项,最后只返回前25个符合条件的结果——这样既满足Discord的限制,又能让用户快速找到目标选项。

具体实现步骤

  1. 准备完整的候选数据集:比如机器人的物品列表、命令列表等(数量可远超25)
  2. 编写自动补全回调函数:接收用户当前输入的字符串,对全量数据做过滤
  3. 自定义过滤规则:支持模糊包含、前缀匹配、忽略大小写等,按需选择
  4. 截断结果:把过滤后的列表截取到最多25项,转换成app_commands.Choice对象返回

示例代码(模拟Dank Memer物品商店补全)

import discord
from discord import app_commands

# 模拟Dank Memer的完整物品列表(远超25项)
FULL_ITEM_LIST = [
    "Meme Coin", "Dank Note", "Fake ID", "Laser Pointer", "Rubber Chicken",
    "Disguise Kit", "Explosive Meme", "Lucky Clover", "Golden Toaster", "Magic Wand",
    "Invisibility Cloak", "Time Machine", "Portal Gun", "Gravity Gun", "Banana Phone",
    "Pickle Rick", "Squid Game Mask", "Among Us Imposter Suit", "Fortnite Pickaxe",
    "Minecraft Diamond Sword", "Roblox Dominus", "Pokemon Pikachu Plush", "Harry Potter Wand",
    "Star Wars Lightsaber", "Marvel Infinity Gauntlet", "DC Batmobile", "Rick and Morty Portal Gun",
    "SpongeBob Krabby Patty", "Super Mario Mushroom", "Legend of Zelda Master Sword",
    # 可继续添加更多物品
]

class MyClient(discord.Client):
    def __init__(self):
        super().__init__(intents=discord.Intents.default())
        self.tree = app_commands.CommandTree(self)

    async def setup_hook(self):
        await self.tree.sync()

client = MyClient()

# 自动补全回调函数
async def item_autocomplete(interaction: discord.Interaction, current: str) -> list[app_commands.Choice[str]]:
    # 过滤规则:忽略大小写,匹配包含关键词的物品
    matches = [item for item in FULL_ITEM_LIST if current.lower() in item.lower()]
    # 仅返回前25个匹配项
    return [
        app_commands.Choice(name=item, value=item)
        for item in matches[:25]
    ]

# 绑定自动补全的购买命令
@client.tree.command(name="buy", description="购买商店物品")
@app_commands.autocomplete(item=item_autocomplete)
async def buy(interaction: discord.Interaction, item: str):
    await interaction.response.send_message(f"你成功购买了:{item}")

client.run("你的机器人Token")

优化技巧

  • 如果需要更精准的匹配(比如只匹配前缀),可以把过滤条件改成item.lower().startswith(current.lower())
  • 针对超大型数据集(上万条),可以优先展示热门物品(比如Dank Memer会把高频购买的物品排在前面),或者用数据库的模糊查询替代内存遍历,提升过滤效率

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 03:03:32