Вопрос или проблема
Я хочу получить значки пользователя Discord с помощью discord.py. В настоящее время я использую Python 3.12.6
и последнюю версию discord.py. Метод, который я использую сейчас, заключается в том, что у меня есть функция, которая принимает объект сообщения, извлекает первого упомянутого пользователя в этом сообщении и использует его для получения информации. Вот что у меня есть на данный момент:
user = message.mentions[0] # Получает пользователя, у которого нужно взять информацию
badges = user.public_flags # Получает значки
badges_str = str(badges.all()).replace('[<UserFlags.', '').replace('>]', '').replace('_',' ').replace(':', '').title() # Заменяет ненужную информацию
badges_str="".join([i for i in badges_str if not i.isdigit()]) # удаляет цифры
Сейчас я также пробовал распечатать все значения, включая badges
, но ничего не работает. Пользователь находится в гильдии, в которой выполняется эта команда, и у меня есть множество исключений, подтверждающих, что пользователь существует, и программа получает правильного человека.
Все, что я действительно хочу, это получить список объектов значков
или строк
, которые я могу привязать к иконкам, чтобы красиво отобразить значки в небольшом.embed. Но вместо этого я получаю пустой массив. Нет никакой информации, и я даже пытался это сделать на других серверах, ролях, ботах, токенах, намерениях и т. д…
Я пытался читать документацию (https://discordpy.readthedocs.io/en/), посмотрел на множество других вопросов на Stack Overflow и другие проекты на Python на GitHub, которые делают это или что-то подобное. Все это, вплоть до чтения исходного кода discord.py. Ничто не помогло, и я пришел сюда в надежде найти ответ на относительно странный вопрос.
Итак, user.public_flags.all()
на самом деле является списком
Enum
ов. Вместо того, чтобы конвертировать весь список перечислений в строку и очищать его от множества лишнего, вы можете добиться большего успеха, используя его в том виде, в котором он есть, например:
user = message.mentions[0]
badges = [badge.name for badge in user.public_flags.all()]
Ответ или решение
Чтобы получить значки профиля пользователя в Discord с использованием библиотеки discord.py
, вам следует располагать правильным доступом к атрибуту public_flags
, который представляет собой набор перечислений (Enums), отражающих значки пользователя. Ваш текущий код почти правильный, однако следует лучше обрабатывать значения, чтобы избежать ненужных преобразований.
Вы можете использовать следующий подход для получения списка значков пользователя:
@bot.command()
async def badges(ctx, member: discord.Member = None):
if member is None:
member = ctx.author # Если не указан пользовател, используем автора сообщения
# Получаем значки пользователя
badges = [badge.name for badge in member.public_flags.all()]
if not badges:
await ctx.send(f'{member.display_name} не имеет значков.')
else:
badges_str = ', '.join(badges)
await ctx.send(f'Значки {member.display_name}: {badges_str}')
Объяснение:
-
Получение пользователя: Ваша функция принимает упоминание пользователя. Если пользователь не указан, по умолчанию используется автор сообщения.
-
Получение значков: Вместо преобразования значков в строку и стриминга лишней информации, вы используете генератор списка, чтобы собрать
name
каждого значка. Это даёт более чистый и читаемый список. -
Отправка результата: Если у пользователя нет значков, бот отправляет соответствующее сообщение. В противном случае выводится список значков.
Примечания:
-
Убедитесь, что у вас есть необходимые права доступа и что у пользователя, чьи значки вы пытаетесь получить, действительно есть какие-либо значки (например, значки партнёра, спонсора и т.д.).
-
Проверьте, чтобы у вашего бота были включены необходимые
intents
, такие какmembers
, чтобы он мог получать информацию о членах сервера.
В результате данный код даст вам ясное представление о значках пользователя и позволит их красиво отображать.