如何使用 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 进行检查。

另请注意,serverdiscord.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 docs Guild.create_role() discord.Permissions Member.add_roles() discord.on_message()

【讨论】:

以上是关于如何使用 discord.py 创建和分配角色?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 discord.py 创建颜色角色

Discord Py - 如何使用文本命令向公会的所有成员添加多个角色

我怎样才能允许人们使用 discord.py 只踢低于其角色的成员?

如何将 discord.py remove_roles 用于多个角色? (作为参数的对象列表)

无法在我的 for 循环中使用 add_roles discord.py 重写

如何在 discord.py 中创建 discord.Permissions 对象?