python - 如何在不指定角色确切名称的情况下赋予角色
问题描述
我想知道是否有一种方法可以自行分配角色而无需指定角色的确切名称。例如,如果我想要角色“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))
解决方案
您可以使用 a for-loop
(或 a regex
)遍历所有角色及其名称,并检查输入的字符串是否在名称中的任何位置。请记住,这会无意中匹配另一个角色,例如te
在test
andtesting
中。您可以选择强制最小查询长度,但这也不能确保不会发生这种情况。您还可以防止此问题并显示所有匹配角色的列表,询问用户他们想要哪个角色。
@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)
。
推荐阅读
- python - 在 Digitalocean 中标记快照
- android - Dagger2 插入图
- jenkins-pipeline - 如何在多个分支中保持多个 Jenkins 管道文件 (Jenkinsfile) 一致?
- c# - 如何将数据从文本框保存到 UWP 中的数据网格
- batch-file - 是否可以在 cmd 中使用操纵杆/游戏控制器输入?
- git - 如何修复 GitHub 中的“Fetch to Code Inspector failed”?
- r - 运行一个函数 x 次,然后在再次运行之前休眠一段时间
- python - 将非零 numpy 数组元素附加到列表的最快方法
- node.js - NodeJS 将文件写入 AWS S3 - Promise.All 与 async/await 不等待
- javascript - 用 JavaScript 和 Chrome / Chromium 计算长段落的高度