Создание ролей в Discord с разрешениями

Я работал над этим как побочный проект около 2 месяцев, и хоть убей, я не могу заставить бота создавать роли с разрешениями. Вот что у меня есть.

levels={
        "Admin":{"name":"ADMIN","hoist":"1","colour":"0x6F0A0A","permissions":""},
    "Moderator":{"name":"WATCHMEN","hoist":"1","colour":"0xFF611A","permissions":"discord.permissions(manage_roles=True,kick_members=True,ban_members=True,create_instant_invite=True,mention_everyone=True,change_nickname=True,manage_nicknames=True,read_message_history,send_messages=True,embed_links=True,send_tts_messages,attach_files=True,external_emojis=True,add-reactions=True)"},
    "Member":{"name":"MEMBER","hoist":"0","colour":"0x52D41A","permissions":"discord.permissions(send_messages=True)"},
    "Verify":{"name":"VERIFY","hoist":"1","colour":"0xFFFFFF","permissions":"discord.permissions(send_messages=True)"},

}

а также

async def cook_roles(ctx):
    for level in levels.keys():
        guild=ctx.guild
        name=levels[level]['name']
        hoist=levels[level]['hoist']
        colour=levels[level]['colour']
      #  perms=levels[level]['permissions']
        if name == "Admin":
            perms=discord.Permissions.all()
        else:
            perms=discord.Permissions(levels[level]['permissions'])
        print=(perms)
        await ctx.send(perms)
        await guild.create_role(name=name,hoist=hoist,permissions=perms,colour=discord.Colour(int(colour,16)))

Любая помощь приветствуется!

Я пробовал убрать discord.Permissions () и форматирование в пермах вроде этого

perms=discord.Permissions(levles[level]['permissions'])

но это тоже не сработало. (Я перепробовал множество вещей и просто не понял.)


Вот обратная связь для первого предоставленного ответа:

Traceback (последний вызов последним): файл "/usr/local/lib/python3.6/dist-packages/discord/ext/commands/core.py", строка 83, в оболочке ret = await coro (* args, * * kwargs) Файл «ny.py», строка 483, в build await cook_roles (ctx) Файл «ny.py», строка 551, в cook_roles, await guild.create_role (name = name, hoist = hoist, permissions = perms, color = discord.Colour (int (color, 16))) TypeError: int () не может преобразовать не-строку с явной базой

Вышеупомянутое исключение явилось прямой причиной следующего исключения:

Traceback (most recent call last):
  File "/usr/local/lib/python3.6/dist-packages/discord/ext/commands/bot.py", line 892, in invoke
    await ctx.command.invoke(ctx)
  File "/usr/local/lib/python3.6/dist-packages/discord/ext/commands/core.py", line 797, in invoke
    await injected(*ctx.args, **ctx.kwargs)
  File "/usr/local/lib/python3.6/dist-packages/discord/ext/commands/core.py", line 92, in wrapped
    raise CommandInvokeError(exc) from exc
discord.ext.commands.errors.CommandInvokeError: Command raised an exception: TypeError: int() can't convert non-string with explicit base

person Taux1c    schedule 06.04.2020    source источник
comment
Также использовал .getvalue (), но не повезло   -  person Taux1c    schedule 07.04.2020


Ответы (1)


У вас есть строковые значения в dict, которые не считаются реальными объектами.

Вы можете хранить объекты любого типа в dicts, поэтому все, что вам нужно сделать, в основном, это сделать значения в dict фактических объектах с фактическими типами.

Вы также пытались использовать модуль permissions вместо класса Permissions. И всегда проверяйте наличие имен разрешений: discord.Permissions (ваша ошибка заключалась в отсутствии =True и add-reactions вместо add_reactions)

levels = {
    "Admin": {"name": "ADMIN", "hoist": True, "colour": 0x6F0A0A, "permissions": discord.Permissions()},
    "Moderator": {
        "name": "WATCHMEN",
        "hoist": True,
        "colour": 0xFF611A,
        "permissions": discord.Permissions(manage_roles=True,
        kick_members=True,
        ban_members=True,
        create_instant_invite=True,
        mention_everyone=True,
        change_nickname=True,
        manage_nicknames=True,
        read_message_history=True,
        send_messages=True,
        embed_links=True,
        send_tts_messages=True,
        attach_files=True,
        external_emojis=True,
        add_reactions=True),
    },
    "Member": {
        "name": "MEMBER",
        "hoist": False,
        "colour": 0x52D41A,
        "permissions": discord.Permissions(send_messages=True),
    },
    "Verify": {
        "name": "VERIFY",
        "hoist": True,
        "colour": 0xFFFFFF,
        "permissions": discord.Permissions(send_messages=True),
    },
}
person Fixator10    schedule 09.04.2020
comment
Это дает обратную связь, которую я сейчас включил в свой вопрос. - person Taux1c; 11.04.2020
comment
int(str, base) требуется только для преобразования строк, используйте только discord.Colour(colour) - person Fixator10; 11.04.2020