匹配 discord.py 中最接近的命令名称
Match to the nearest command name in discord.py
我正在尝试为我的 discord.py 机器人创建一个功能,当用户输入的内容不正确时,它会发送类似于用户用作命令的命令名称。例如,存在名为 .slap
的命令。但是用户输入 .slp
或类似的东西。
我希望机器人使用最相似的命令进行响应,在本例中为 .slap
。我还是个初学者,所以我不知道该怎么做。我发现了一个名为 fuzzywuzzy
和 Levenshtein distance
的库,但我不知道如何将它们用于我的机器人。
非常感谢任何帮助!
谢谢
首先,模糊匹配命令并执行它 认为 是正确的东西,添加到您的机器人中并不是一件好事。它增加了一个故障点,无论如何这对用户来说都是非常令人沮丧的。
但是,如果您建议一个可能的命令列表,它可能会工作得更好。
FuzzyWuzzy 是一个很好的工具。
它的文档非常有用,所以我真的认为如果您实际阅读它们不会有问题。
我用于实施的 2 美分是(在 pythonian pesudocode 中)
# user had input an invalid command
invalid_command = #userinput
command_list = [#list of your commands]
fuzzy_ratios = []
for command in command_list:
ratio = fuzzywuzzy.ratio(invalid_command, command)
fuzzy_ratios.append(ratio)
max_ratio_index = fuzzy_ratios.index(max(fuzzy_ratios))
fuzzy_matched = command_list[max_ratio_index]
return f"did you mean {fuzzy_matched}?"
请尝试实施并思考为什么需要实施。
你需要真正地尝试来实现你自己,否则你永远学不会。
你可以试试这个:
disables = []
@client.command()
@commands.has_permissions(administrator=True)
async def disable(ctx, command):
command = client.get_command(command)
if not f"{command}: {ctx.guild.id}" in disables:
disables.append(f"{command}: {ctx.guild.id}")
await ctx.send(f"Disabled **{command}** for this server.")
else:
await ctx.send('This command is already disabled')
@client.command()
@commands.has_permissions(administrator=True)
async def enable(ctx, command):
command = client.get_command(command)
if f"{command}: {ctx.guild.id}\n" in disables:
await ctx.send(f"Enabled **{command}** for this server.")
else:
await ctx.send('This command is already enabled')
现在你必须添加:
if "COMMAND: {ctx.guild.id}" in disables:
return
在 async def command(ctx)
和您为此命令的代码之间。
警告:这样做真的很糟糕。您可以尝试将禁用列表保存到 json 文件中。如果您需要帮助,请给我留言 - Special unit#5323
您可以使用别名。别名是命令的快捷方式,这里有一个例子:
@client.command(aliases=["slp","spla","spal","slpa","sap","salp"])
async def slap(ctx):
#Do whatever slap does
要创建别名,请添加 aliases=[""]
并开始添加别名。别名将作为命令调用。如果我做了 .spla
或你添加的任何别名,它仍然会做 .slap
做的事情。希望这对您有所帮助!
我正在尝试为我的 discord.py 机器人创建一个功能,当用户输入的内容不正确时,它会发送类似于用户用作命令的命令名称。例如,存在名为 .slap
的命令。但是用户输入 .slp
或类似的东西。
我希望机器人使用最相似的命令进行响应,在本例中为 .slap
。我还是个初学者,所以我不知道该怎么做。我发现了一个名为 fuzzywuzzy
和 Levenshtein distance
的库,但我不知道如何将它们用于我的机器人。
非常感谢任何帮助! 谢谢
首先,模糊匹配命令并执行它 认为 是正确的东西,添加到您的机器人中并不是一件好事。它增加了一个故障点,无论如何这对用户来说都是非常令人沮丧的。
但是,如果您建议一个可能的命令列表,它可能会工作得更好。
FuzzyWuzzy 是一个很好的工具。
它的文档非常有用,所以我真的认为如果您实际阅读它们不会有问题。
我用于实施的 2 美分是(在 pythonian pesudocode 中)
# user had input an invalid command
invalid_command = #userinput
command_list = [#list of your commands]
fuzzy_ratios = []
for command in command_list:
ratio = fuzzywuzzy.ratio(invalid_command, command)
fuzzy_ratios.append(ratio)
max_ratio_index = fuzzy_ratios.index(max(fuzzy_ratios))
fuzzy_matched = command_list[max_ratio_index]
return f"did you mean {fuzzy_matched}?"
请尝试实施并思考为什么需要实施。
你需要真正地尝试来实现你自己,否则你永远学不会。
你可以试试这个:
disables = []
@client.command()
@commands.has_permissions(administrator=True)
async def disable(ctx, command):
command = client.get_command(command)
if not f"{command}: {ctx.guild.id}" in disables:
disables.append(f"{command}: {ctx.guild.id}")
await ctx.send(f"Disabled **{command}** for this server.")
else:
await ctx.send('This command is already disabled')
@client.command()
@commands.has_permissions(administrator=True)
async def enable(ctx, command):
command = client.get_command(command)
if f"{command}: {ctx.guild.id}\n" in disables:
await ctx.send(f"Enabled **{command}** for this server.")
else:
await ctx.send('This command is already enabled')
现在你必须添加:
if "COMMAND: {ctx.guild.id}" in disables:
return
在 async def command(ctx)
和您为此命令的代码之间。
警告:这样做真的很糟糕。您可以尝试将禁用列表保存到 json 文件中。如果您需要帮助,请给我留言 - Special unit#5323
您可以使用别名。别名是命令的快捷方式,这里有一个例子:
@client.command(aliases=["slp","spla","spal","slpa","sap","salp"])
async def slap(ctx):
#Do whatever slap does
要创建别名,请添加 aliases=[""]
并开始添加别名。别名将作为命令调用。如果我做了 .spla
或你添加的任何别名,它仍然会做 .slap
做的事情。希望这对您有所帮助!