我遇到了这个错误,但是我没有在脚本的任何地方要求id
import discord
from discord.ext import commands
client = commands.Bot(command_prefix = 't-')
client.remove_command("help")
@client.event
async def on_ready():
print ('ready')
@client.command(pass_context=True)
async def addrole(ctx,name,hex):
user = ctx.message.author
role = discord.utils.get(user.server.roles, name=name, color=hex[1:]) #the [1:] removes the # in addrole name #ff0000
await client.add_roles(user, role) #And this line should give me the role after it's created
我希望当有人说t-addrole Role_name #hex
时,应该以该人的名字和十六进制的颜色来创建角色
答案 0 :(得分:1)
role = discord.utils.get(...)
最有可能返回None
。
尝试通过测试打印来确保可能(仅用于调试目的)
如果role
是None
,而您尝试使用add_roles()
,那么我的确记得它给我一个NoneType
的错误,其中涉及到id
,就像你在解释。所以我要走出去,并假设这是您的问题。 Discord.py最有可能不检查您是否将其作为None
参数发送给*roles
,因此会出现此错误。
因此,我建议您实施检查。
async def addrole(ctx,name,hex):
user = ctx.message.author
hex = hex.replace('#', '')
role = discord.utils.get(user.server.roles, name=name, color=hex)
if role:
await client.add_roles(user, role)
else:
#Idk what version of python/discord you're using so adjust this line as needed
await ctx.send(f"Rolename {name} with #{hex} color was not found")
请务必查看@Tristo的答案,因为您的错误实际上是由于hex
未被转化为discord.Color
而引起的。 虽然不会窃取他的代码/答案
答案 1 :(得分:1)
错误来自
new_roles = utils._unique(roer.id,用于itertools.chain(成员。角色,角色))
您的角色未找到该角色
role = discord.utils.get(user.server.roles, name=name, color=hex[1:])
您可以通过在其下方添加一个print(role)
之类的内容来进行确认,它应打印出None
另外,如果您读到有关discord.utils.get的信息,您可能会看到attrs
是迭代器成员的属性,是必需的
在这种情况下,user.server.roles
是一个包含user.server.roles的可迭代项,如果要按名称和颜色进行搜索,则需要分别传递字符串和discord.Color
这意味着您需要将role = discord.utils.get(user.server.roles, name=name, color=hex[1:])
更改为
hex = discord.Colour(int(f'0x{hex[1:]}', 16))
role = discord.utils.get(user.server.roles, name=name,color = hex )