Эмбеды
Возможно, вы видели некоторые специальные сообщения в Discord (часто отправляемые ботами/вебхуками), которые имеют
цветную рамку, встроенные изображения, текстовые поля и другие свойства. Эти элементы называются Эмбедами, и в этом
разделе будет рассказано, как вы можете создать и отправить их с помощью своего бота. Это делается с помощью
объекта Embed
.
В этом разделе будут подробно рассмотрены атрибуты и методы, используемые в эмбедах. Таким образом, мы рекомендуем перейти к нужной вам теме через оглавление.
Предпросмотр эмбеда
Вот пример того, как может выглядеть эмбед. Мы рассмотрим конструкцию эмбеда в следующей части этой статьи.
Код для этого эмбеда приведен ниже.
import disnake
from disnake.ext import commands
# Внутри команды, прослушивателя событий и т.д.
embed = disnake.Embed(
title="Заголовок эмбеда",
description="Описание эмбеда",
color=disnake.Colour.yellow(),
timestamp=datetime.datetime.now(),
)
embed.set_author(
name="Автор эмбеда",
url="https://disnake.dev/",
icon_url="https://disnake.dev/assets/disnake-logo.png",
)
embed.set_footer(
text="Футер эмбеда",
icon_url="https://disnake.dev/assets/disnake-logo.png",
)
embed.set_thumbnail(url="https://disnake.dev/assets/disnake-logo.png")
embed.set_image(url="https://disnake.dev/assets/disnake-thin-banner.png")
embed.add_field(name="Обычный заголовок", value="Обычное значение", inline=False)
embed.add_field(name="Встроенный заголовок", value="Встроенное значение", inline=True)
embed.add_field(name="Встроенный заголовок", value="Встроенное значение", inline=True)
embed.add_field(name="Встроенный заголовок", value="Встроенное значение", inline=True)
await ctx.send(embed=embed)
Нет строгой необходимости использовать все элементы, представленные выше. Вы можете оставить некоторые из них в соответствии с вашими потребностями.
Цвет вставки (с помощью параметра color
) принимает экземпляр Colour
,
шестнадцатеричная строка или целое число.
Чтобы добавить пустое поле для эмбеда, вы можете использовать embed.add_field(name='\u200b', value='\u200b')
.
Создание эмбеда
Вы можете использовать Embed
для создания эмбедов и манипулирования ими.
embed = disnake.Embed(
title="Заголовок эмбеда",
description="Описание эмбеда",
colour=0xF0C43F,
)
Установка автора
Вы можете указать автора эмбеда с помощью метода set_author
.
Обратите внимание, что этот код запускается после того, как вы определили embed
через embed = disnake.Embed(...)
.
embed.set_author(
name="Автор эмбеда",
url="https://disnake.dev/",
icon_url="https://disnake.dev/assets/disnake-logo.png",
)
Поскольку в этом случае мы установили URL-адрес, нажатие на "Автор эмбеда" перенаправит пользователя на сайт
disnake.dev
.
Установка футера
Вы можете указать футер эмбеда с помощью метода set_footer
.
Обратите внимание, что этот код запускается после того, как вы определили embed
через embed = disnake.Embed(...)
.
embed.set_footer(
text="Футер эмбеда",
icon_url="https://disnake.dev/assets/disnake-logo.png",
)
Установка миниатюры
Вы можете указать миниатюру с помощью метода set_thumbnail
.
Обратите внимание, что этот код запускается после того, как вы определили embed
через embed = disnake.Embed(...)
.
embed.set_thumbnail(url="https://disnake.dev/assets/disnake-thin-banner.png")
Использование временных отметок
Временные отметки отображаются возле футера эмбеда, указывая время, в которое было отправлен/инициирован эмбед. Это
можно сделать с помощью параметра timestamp
disnake.Embed()
. Обратите внимание, что вам нужно будет импортировать пакет datetime
в ваш код.
import datetime
# Внутри команды, прослушивателя событий и т.д.
embed = disnake.Embed(
title="Эмбед!",
description="Описание",
colour=0xF0C43F,
timestamp=datetime.datetime.now(),
)
Добавление полей
Поля эмбеда имеют два параметра - название (или заголовок) и значение внутри с помощью
метода add_field
. Также можно использовать markdown в
обоих параметрах.
# Обычные поля
embed.add_field(name="Обычный заголовок", value="Обычное значение", inline=False)
# Встроенные поля
embed.add_field(name="Встроенный заголовок", value="Встроенное значение", inline=True)
embed.add_field(name="Встроенный заголовок", value="Встроенное значение", inline=True)
embed.add_field(name="Встроенный заголовок", value="Встроенное значение", inline=True)
Эти атрибуты также полностью поддерживают использование markdown, а также выделение ссылок. Вы также можете вставлять
поля в определенную позицию с указанным индексом,
используя embed.insert_field_at(index, ...)
.
Добавление изображений
Это можно сделать с помощью методв set_image
, который
принимает либо ссылку, либо объект File
.
# Используя ссылку
embed.set_image(url="https://disnake.dev/assets/disnake-thin-banner.png")
# Используя локальный файл
embed.set_image(file=disnake.File("path/to/file.png"))
Отправка эмбеда
Как только эмбед будет создан, вам также нужно отправить его в канал. Это означает, что вам нужно вызвать метод
send(embed=embed)
для объекта, например объекта TextChannel
(т.е. message.channel.send
) или объекта
Context
(ctx.send
). В противном случае эмбед не будет отправлен.
Словарь в эмбед
Тип данных dict
(и, по сути, файл json
) может быть преобразован в вложение, используя
метод Embed.from_dict()
. Мы можем воссоздать вставку,
сделанную в начале этой страницы, используя то же самое.
embed_dict = {
"title": "Заголовок эмбеда",
"description": "Описание эмбеда",
"color": 0xFEE75C,
"timestamp": datetime.datetime.now().isoformat(),
"author": {
"name": "Автор эмбеда",
"url": "https://disnake.dev/",
"icon_url": "https://disnake.dev/assets/disnake-logo.png",
},
"thumbnail": {"url": "https://disnake.dev/assets/disnake-logo.png"},
"fields": [
{"name": "Обычный заголовок", "value": "Обычное значение", "inline": "false"},
{"name": "Встроенный заголовок", "value": "Встроенное значение", "inline": "true"},
{"name": "Встроенный заголовок", "value": "Встроенное значение", "inline": "true"},
{"name": "Встроенный заголовок", "value": "Встроенное значение", "inline": "true"},
],
"image": {"url": "https://disnake.dev/assets/disnake-thin-banner.png"},
"footer": {"text": "Футер эмбеда", "icon_url": "https://disnake.dev/assets/disnake-logo.png"},
}
await channel.send(embed=disnake.Embed.from_dict(embed_dict))
Это даст точно такой же результат, как и встраивание, показанное здесь. Обратите внимание, что
временная отметка, передаваемая через словарь, должна быть в формате ISO8601 (что было достигнуто здесь с помощью
datetime.datetime.now().isoformat()
). Вы можете узнать больше о формате вложений dict
в
официальной документации Discord.
Примечания
- Для отображения полей рядом друг с другом необходимо, чтобы по крайней мере для двух последовательных полей было
установлено значение
inline=True
. - Временная отметка автоматически настраивает часовой пояс в зависимости от устройства пользователя.
- Упоминания любого рода в эмбедах будут корректно отображаться только в пределах описания и значений полей эмбеда.
- Упоминания во вложениях не будут вызывать уведомление.
- Эмбеды позволяют маскировать ссылки (например,
[Guide](https://guide.disnake.dev/ 'optional hovertext')
), но только в описании и значениях полей.
Ограничения
Есть несколько ограничений, о которых следует помнить при планировании ваших эмбедов из-за ограничений API. Вот краткий список ограничений:
- Заголовок эмбеда ограничен 256 символами.
- Описание эмбеда ограничен 4096 символами.
- Максимум 25 полей.
- Название поля ограничено 256 символами и их значение 1024 символами.
- Текст футера ограничен 2048 символами.
- Имя автора ограничено 256 символами.
- Сумма всех символов из всех структур эмбеда в сообщении не должна превышать 6000 символов.
- Одно сообщение может содержать до 10 эмбедов.
Получившийся код
Код, представленный на этой странице, можно найти в нашем репозитории GitHub здесь.