我试图编写一个机器人,为用户提供一个" Admin"他键入" b.assemble"时的角色,但我不断收到此错误:
discord.ext.commands.errors.CommandInvokeError:
AttributeError: 'Context' object has no attribute 'guild'
调用错误的部分如下所示:
guild = ctx.guild
await guild.create_role(name="Admin")
role = discord.utils.get(ctx.guild.roles, name="Admin")
user = ctx.message.author
await user.add_roles(role)
答案 0 :(得分:3)
正如M. I. Wright在他们的回答中所写,你正在使用discord.py的异步分支。
在异步分支中,ctx.guild
不存在,您可以重新安装到重写分支(如其他应答者的建议),也可以使用ctx.guild
的异步分支替代方法:
server = ctx.message.server
role = await client.create_role(server, name="Admin")
member = ctx.message.author
await client.add_roles(member, role)
client
是机器人。
discord.py稳定版的文档在这里:http://discordpy.readthedocs.io/en/async/api.html
答案 1 :(得分:1)
您正在使用rewrite的文档,但目前还没有在PyPI上发布重写,因此执行pip install discord.py
会获得discord.py的旧版(当前公开版),被称为“异步”*。
如果你想使用重写,你必须暂时使用pip install -U git+https://github.com/Rapptz/discord.py@rewrite
从GitHub安装它。否则,您可以坚持pip install discord.py
并参考docs for async。
但是,请注意,重写现在完全可用,并没有等待正式发布,而异步是在仅错误修复模式下,并且缺乏对像Discord API这样的一些新增功能的支持。 Async的对象模型也有些令人失望,因为所有都绑定到了bot / client实例;这在重写中得到了缓解,例如你可以写await channel.send(message)
而不是await client.send(channel, message)
因此,如果你能够坚持使用重写,并且你可以尝试使用ctx.guild
- 但请注意,你需要定期重新执行上述pip install -U git+...
命令作为更新滚动。(还考虑加入Discord上的库支持服务器,链接到其GitHub仓库,在那里你会得到这些更新的消息。)
*“async”有点用词不当或至少是一个奇怪的名字,因为“rewrite”也使用了Python asyncio。他们只是方便的版本标记。
答案 2 :(得分:0)
我不是专家,但我有很多经验。我相信我看到了你的问题。
server = ctx.message.server
role = await client.create_role(server, name="Admin")
member = ctx.message.author
await client.add_roles(member, role)
尝试此操作。...
roles=["Admin","Moderator","Member"]
server = ctx.message.guild
for role in roles:
await client.create_role(server, role)