如何使用 discord.py 创建和分配角色?
Posted
技术标签:
【中文标题】如何使用 discord.py 创建和分配角色?【英文标题】:How do I make and assign roles using discord.py? 【发布时间】:2020-09-13 03:59:30 【问题描述】:我正在尝试在 discord 中扮演一个全新的角色(使用 discord.py),但我尝试的一切都不起作用。我已经试过了
await guild.create_role(name("R3KT")) #NameError: name 'guild' not defined
和
author = ctx.message.author
await client.create_role(author.server, name="role name") #NameError: name 'ctx' not defined
我尝试将 ctx 和 guild 更改为“客户端”,但仍然没有成功。如果需要,我将发送整个代码(不包括不和谐名称和机器人密钥)
这是完整的代码:
import discord
token = "bot-key"
client = discord.Client()
@client.event
async def on_ready():
print("Bot is online and connected to Discord")
@client.event
async def on_message(message):
message.content = message.content.upper()
if message.author == client.user:
return
if message.content.startswith("AS HELLO"):
await message.channel.send("works")
elif message.content.startswith("AS CREATEROLE"):
if str(message.author) == "myDiscName#6969":
author = message.author
await discord.create_role(author.server, name="R3KT")
elif message.content.startswith("AS GIVEROLE"):
if str(message.author) == "myDiscName#6969":
print("give role")
client.run(token)
【问题讨论】:
你能在你的整个代码中发布(包括你的on_message
或命令事件)
在这里,我发布了整个代码。希望你能找到任何缺陷。 (也正如我所说,我替换了光盘名称和机器人密钥)
【参考方案1】:
您不想通过名称和编号进行检查(因为如果您有 nitro,您可以更改它),您应该按每个用户唯一且不可变的 ID 进行检查。
另请注意,server
在discord.py
中称为guild
。
elif message.content.startswith("AS CREATEROLE"):
if message.author.id == YOUR_ID_GOES_HERE: # find your id by right clicking on yourself and selecting "copy id" at the bottom of the menu of options
author = message.author
# create a role named "R3KT" that has the permissions "Administrator" that has the color "white" that is not displayed separately and is not mentionable by everyone
await message.guild.create_role(name="R3KT", permissions=discord.Permissions(8), colour=discord.Colour.from_rgb(255, 255, 255), hoist=False, mentionable=False)
Permissions integer calculator
discord.Guild.create_role
给自己一个角色:
elif message.content.startswith("AS GIVEROLE"):
if message.author.id == YOUR_ID_GOES_HERE:
user = message.author
await user.add_roles(message.guild.get_role(ROLE_ID_GOES_HERE), reason='Someone did a giverole bot command') # left click on the role and click "copy id"
discord.Member.add_roles
discord.Guild.get_role
【讨论】:
创建新角色部分成功了,谢谢!但是分配部分有错误。 RuntimeWarning: coroutine 'Member.add_roles' is never awaited user.add_roles(message.guild.get_role(714872502714761287), reason='test') # 左键点击角色,点击“复制id” 是的,很好。await user.add_roles(message.guild.get_role(ROLE_ID_GOES_HERE), reason='test')
应该可以工作
这行得通。万分感谢!我剩下的唯一问题是,是否有办法自动获取新角色的 ID?因为我要在我朋友的服务器上使用它,我没有管理员权限,所以我无法手动获取角色 ID。
您可以在会员列表中点击您的朋友,它会显示一些内容,包括他的角色。右键单击要定位的角色,然后单击复制 ID
这行不通,因为该角色只会分配给我,不会分配给其他人。我希望机器人在我的命令上扮演角色,并在另一个命令上将该角色分配给我(只有我能够执行这两个命令)。但是,当我使用第一个命令创建角色时,它会获得第二个命令所需的唯一 ID。【参考方案2】:
在您提供的第二个示例中,您似乎在旧 d.py (0.16.x
) 文档和 d.py rewrite (1.x
) 之间使用了混搭。
确保您安装了最新版本(重写),因为不再维护异步。
这是一个使用命令装饰器的示例(用法:!newrole Member
)
@client.command()
async def newrole(ctx, *, rolename=None):
if not rolename:
await ctx.send("You forgot to provide a name!")
else:
role = await ctx.guild.create_role(name=rolename, mentionable=True)
await ctx.author.add_roles(role)
await ctx.send(f"Successfully created and assigned role.mention!")
mentionable
kwarg 不是强制性的 - 如果未指定,它默认为 False
- 例如,我只是将其设置为 True
。您还可以为该角色编写自己的权限。
另一个使用 on_message
的示例 - 建议使用命令装饰器,因为 args 更容易处理
async def on_message(message):
args = message.content.split(" ")[2:] # 2: because prefix contains space
if message.content.lower().startswith("as createrole"):
role = await message.guild.create_role(name=" ".join(args))
await message.author.add_roles(role)
await message.channel.send(f"Successfully created and assigned role.mention!")
参考资料:
discord.py Rewrite docsGuild.create_role()
discord.Permissions
Member.add_roles()
discord.on_message()
【讨论】:
以上是关于如何使用 discord.py 创建和分配角色?的主要内容,如果未能解决你的问题,请参考以下文章
Discord Py - 如何使用文本命令向公会的所有成员添加多个角色
我怎样才能允许人们使用 discord.py 只踢低于其角色的成员?
如何将 discord.py remove_roles 用于多个角色? (作为参数的对象列表)