我想知道是否存在一种无需指定角色确切名称即可自行分配角色的方法。例如,如果我想要角色“ 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))
答案 0 :(得分:1)
您可以使用for-loop
(或regex
)遍历所有角色及其名称,并检查输入的字符串是否在名称中的任何位置。请记住,这 会无意中匹配另一个角色,例如te
和test
中都包含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)
。