首页 > 解决方案 > 如何在不指定角色确切名称的情况下赋予角色

问题描述

我想知道是否有一种方法可以自行分配角色而无需指定角色的确切名称。例如,如果我想要角色“D.Bch.100”,我可以只写“bch”并仍然获得角色。这是我的代码:

@client.command(name = "giverole", aliases = ["giveroles"])
async def giverole(ctx, *, rolename):
    role = discord.utils.get(ctx.guild.roles, name=rolename)
    user = ctx.message.author
    await user.add_roles(role)
    await ctx.channel.send("Done! Added " + rolename + (" role to {0.author.mention}. Enjoy it!").format(ctx))

标签: pythondiscorddiscord.py

解决方案


您可以使用 a for-loop(或 a regex)遍历所有角色及其名称,并检查输入的字符串是否在名称中的任何位置。请记住,这无意中匹配另一个角色,例如tetestandtesting中。您可以选择强制最小查询长度,但这也不能确保不会发生这种情况。您还可以防止此问题并显示所有匹配角色的列表,询问用户他们想要哪个角色。

@client.command(name = "giverole", aliases = ["giveroles"])
async def giverole(ctx, *, rolename):
    role_to_give = None
    for role in ctx.guild.roles:
        if rolename in role.name.lower():
            role_to_give = role # found it
            break
    if role_to_give is None:
        # no role contains their query in the name
    else:
        await user.add_roles(role)
await ctx.channel.send("Done! Added " + role_to_give.name + (" role to {0.author.mention}. Enjoy it!").format(ctx))

将角色名称转换为小写,使其不区分大小写。

尽管我强烈建议您改为标记角色,正如评论中所建议的那样。与您在评论中提到的不同,具有长名称的角色不应该造成问题,因为 Discord 会根据您输入的内容提供建议,因此输入其中的一部分应该已经提出。您甚至可以使用内置程序converter来立即获取role实例。

@client.command(name = "giverole", aliases = ["giveroles"])
async def giverole(ctx, *, rolename: discord.Role):
    await ctx.author.add_roles(rolename)
    await ctx.send("Added " + rolename.name)

此外,您不必使用ctx.message.author来获取作者,也可以使用ctx.author并且更短一些。

最后,我不完全理解您为什么在连接它们的同时使用格式字符串?它首先违背了使用格式字符串的目的。string_a + string_b + string_c.format(d)还不如"string_a {} {}".format(string_b, string_d)


推荐阅读