Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在不指定角色确切名称的情况下指定角色_Python_Discord_Discord.py - Fatal编程技术网

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

Python 如何在不指定角色确切名称的情况下指定角色,python,discord,discord.py,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, nam

我想知道是否有一种方法可以自行分配角色,而不必指定角色的确切名称。例如,如果我想要角色'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))

您可以使用
for循环
(或者
正则表达式
)迭代所有角色及其名称,并检查输入的字符串是否在名称中的任何位置。请记住,这会无意中与另一个角色匹配,例如
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会根据您键入的内容提供建议,因此键入其中的一部分应该已经引发了问题。您甚至可以使用内置的
转换器
立即获得
角色
实例

@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\u a+string\u b+string\u c.format(d)
也可以是
“string\u a{}{}.format(string\u b,string\u d)

据我所知,没有什么是这样的,但是为什么不直接提到角色呢?服务器中的一些角色名很长,一些用户就是写不正确。我见过其他机器人接受部分名称,这就是我问的原因。可能它们在代码中发生了变化,如
如果rolename==“bch”:返回D.bch.100
。但这不是一个好的解决方案。我也喜欢标记角色,但这是服务器所有者的请求,我无法说服他。谢谢你的意见!至于最后一部分,你完全正确。我真的说不出为什么一开始我没有这么做(我可能后来添加了第二部分,但没有意识到我可以在格式中包含角色名),但我要改变它。再次感谢!