Как получить роли пользователей при перезаписи discord.py

Здесь новый пользователь discord.py-rewrite.

Я кодирую бота с интерфейсом разногласий: он подключен к более чем одному серверу (гильдии), и в настоящее время мне нужна система авторизации, чтобы ограничить ее использование. Я думал, что смогу получить все роли пользователей и проанализировать их позже, когда понадобится. Так я и сделал:

    @client.event
    async def on_ready():
        ... 
        for guild in client.guilds:
            for member in guild.members:
                for role in member.roles:
                    if role.name == "Test":
                        print("USER_ID: %d - ROLE: %s" % (member.id, role.name))

но мне это не нравится. Я должен хранить их, и это неэффективно. Также мне нужно обновить фоновую подпрограмму, чтобы проверить, присоединяются ли новые участники / меняются ли роли. Итак, мой вопрос: есть ли простой способ проверить на лету роли пользователей в общих гильдиях при получении сообщения? Прокрутка официального API, единственный способ получить общие гильдии пользователей - это profile (), но как бот я получаю Запрещенную ошибку, как говорит API.

    @client.event
    async def on_message(message):
        ...
        profile = await message.author.profile()
discord.errors.Forbidden: FORBIDDEN (status code: 403): Bots cannot use this endpoint

(обновление) ДОБАВЛЕНИЕ:

Мне нужно проверять роли пользователей даже в личных сообщениях, поэтому мне нужно получить own_guilds


person Marco Piunti    schedule 23.04.2019    source источник
comment
Вам нужно будет создать свою собственную функцию для поиска общих гильдий для данного пользователя. Эта функция должна будет пройти через все гильдии, к которым подключен бот, и проверить, существует ли пользователь в этой гильдии. Тем не менее, кажется странным, что вы просматриваете все гильдии в поисках разрешений пользователей для выполнения действий в личных сообщениях. Что именно должно ограничивать это разрешение? Было бы проще зарегистрировать пользователя в самом боте для авторизации вместо роли гильдии? Что произойдет, если у пользователя будет роль в одной гильдии, но нет в другой?   -  person Anu6is    schedule 23.04.2019
comment
как зарегистрироваться у самого бота для авторизации было бы проще некоторых вложенных циклов?   -  person Marco Piunti    schedule 23.04.2019
comment
Потребуется какое-то внешнее хранилище (база данных или файл). Пользователь выполняет команду регистрации, входит в хранилище, бот обращается к хранилищу для выполнения действий, требующих авторизации   -  person Anu6is    schedule 23.04.2019
comment
да, я думал об этом, но я хотел бы упростить взаимодействие с пользователем (т.е. никаких действий пользователя не требуется).   -  person Marco Piunti    schedule 23.04.2019
comment
Влияют ли команды, выполняемые через личные сообщения с ботом, на гильдии, в которых находится пользователь? Я уже спрашивал об этом ранее, но что будет, если у меня будет роль в одной гильдии, а в другой - нет?   -  person Anu6is    schedule 23.04.2019
comment
Здесь Discord используется только для ввода / вывода. Гильдия не влияет на действия. Если у пользователя есть нужная роль только на одном сервере, этого должно быть достаточно, чтобы начать взаимодействие.   -  person Marco Piunti    schedule 23.04.2019
comment
Принято к сведению. Этот сценарий для меня усиливает аргумент в пользу простой регистрации с помощью бота, но решать вам, не хотите ли вы, чтобы отдельный пользователь прошел через это. Тем не менее, кто-то все равно должен будет предоставить пользователю эту конкретную роль. Так или иначе, пользователю нужно что-то делать для работы бота ... будь то кто-то дал мне роль или я регистрируюсь у бота.   -  person Anu6is    schedule 23.04.2019
comment
Я предпочитаю, чтобы админы гильдии делали всю грязную работу :) - ty anu6is за ваши советы!   -  person Marco Piunti    schedule 23.04.2019
comment
лол, без проблем.   -  person Anu6is    schedule 23.04.2019


Ответы (1)


Я просмотрел документацию и не думаю, что есть более простой способ сделать это.

@commands.command(pass_context=True)
async def test(self, ctx):
    for role in ctx.guild.roles:
        if role.name == 'Your role name':
            #Code

Просто, когда вызывается определенная команда, вы проверяете каждую роль в гильдии, в которую было отправлено сообщение, и если имя роли совпадает с именем роли, которое вы выбрали, он выполнит определенный код.

person Aeossa    schedule 23.04.2019
comment
Проблема в том, что мне нужно проверять роли (и делать проверку разрешений) даже через личное сообщение, поэтому необходимость в мутуал-гильдии - person Marco Piunti; 23.04.2019