如何在不指定角色确切名称的情况下授予角色

时间:2020-09-28 10:20:12

标签: python discord discord.py

我想知道是否存在一种无需指定角色确切名称即可自行分配角色的方法。例如,如果我想要角色“ 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))

1 个答案:

答案 0 :(得分:1)

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

@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)