Перейти к содержанию

Package: maxapi.types

maxapi.types

Command(commands, prefix='/', check_case=False, ignore_symbol_at_sign=False, only_with_bot_username=False)

Bases: BaseFilter

Фильтр сообщений на соответствие команде.

Parameters:

Name Type Description Default
commands str | List[str]

Ожидаемая команда или список команд без префикса.

required
prefix str

Префикс команды (по умолчанию '/').

'/'
check_case bool

Учитывать регистр при сравнении (по умолчанию False).

False
ignore_symbol_at_sign bool

Учитывать символ "@" при отправке команды с упоминанием бота (по умолчанию False).

False
only_with_bot_username bool

Обязательно упоминать бота при отправке команды (по умолчанию False).

False

Инициализация фильтра команд.

Source code in maxapi/filters/command.py
def __init__(
    self,
    commands: str | List[str],
    prefix: str = "/",
    check_case: bool = False,
    ignore_symbol_at_sign: bool = False,
    only_with_bot_username: bool = False,
):
    """
    Инициализация фильтра команд.
    """

    if isinstance(commands, str):
        self.commands = [commands]
    else:
        self.commands = commands

    self.prefix = prefix
    self.check_case = check_case
    self.ignore_symbol_at_sign = ignore_symbol_at_sign
    self.only_with_bot_username = only_with_bot_username

    if not check_case:
        self.commands = [cmd.lower() for cmd in self.commands]

parse_command(text, bot_username)

Извлекает команду из текста.

Parameters:

Name Type Description Default
text str

Текст сообщения.

required
bot_username str

Имя пользователя бота.

required

Returns:

Type Description
str

Tuple[str, List[str]]: Кортеж из команды без префикса и списка аргументов,

List[str]

либо ('', []) если команда не найдена или текст не соответствует формату.

Source code in maxapi/filters/command.py
def parse_command(
    self, text: str, bot_username: str
) -> Tuple[str, List[str]]:
    """
    Извлекает команду из текста.

    Args:
        text (str): Текст сообщения.
        bot_username (str): Имя пользователя бота.

    Returns:
        Tuple[str, List[str]]: Кортеж из команды без префикса и списка аргументов,
        либо ('', []) если команда не найдена или текст не соответствует формату.
    """

    if not text.strip():
        return "", []

    args = text.split()

    if not args:
        return "", []

    first = args[0]

    if self.ignore_symbol_at_sign:
        if first == bot_username:
            first = "@" + first

    if first.startswith("@"):
        if len(args) < 2:
            return "", []

        if not first[1:] == bot_username:
            return "", []

        command_part = args[1]

        if not command_part.startswith(self.prefix):
            return "", []

        command = command_part[len(self.prefix) :]
        arguments = args[2:]

    else:
        if self.only_with_bot_username:
            return "", []

        command_part = first

        if not command_part.startswith(self.prefix):
            return "", []

        command = command_part[len(self.prefix) :]
        arguments = args[1:]

    return command, arguments

__call__(event) async

Проверяет, соответствует ли сообщение заданной(ым) команде(ам).

Parameters:

Name Type Description Default
event MessageCreated

Событие сообщения.

required

Returns:

Type Description
Union[Dict[str, List[str]], bool]

dict | bool: dict с аргументами команды при совпадении, иначе False.

Source code in maxapi/filters/command.py
async def __call__(
    self, event: UpdateUnion
) -> Union[Dict[str, List[str]], bool]:
    """
    Проверяет, соответствует ли сообщение заданной(ым) команде(ам).

    Args:
        event (MessageCreated): Событие сообщения.

    Returns:
        dict | bool: dict с аргументами команды при совпадении, иначе False.
    """

    if not isinstance(event, MessageCreated):
        return False

    # body может быть None — защитимся от обращения
    body = event.message.body
    if body is None:
        return False

    text = body.text
    if not text:
        return False

    # временно
    bot_me = event._ensure_bot().me
    bot_username = ""
    if bot_me:
        bot_username = bot_me.username or ""

    parsed_command, args = self.parse_command(text, bot_username)
    if not parsed_command:
        return False

    if not self.check_case:
        if parsed_command.lower() in [
            commands.lower() for commands in self.commands
        ]:
            return {"args": args}
        else:
            return False

    if parsed_command in self.commands:
        return {"args": args}

    return False

CommandStart(prefix='/', check_case=False, ignore_symbol_at_sign=False, only_with_bot_username=False)

Bases: Command

Фильтр для команды /start.

Parameters:

Name Type Description Default
prefix str

Префикс команды (по умолчанию '/').

'/'
check_case bool

Учитывать регистр (по умолчанию False)

False
ignore_symbol_at_sign bool

Учитывать символ "@" при отправке команды с упоминанием бота (по умолчанию False).

False
only_with_bot_username bool

Обязательно упоминать бота при отправке команды (по умолчанию False)..

False
Source code in maxapi/filters/command.py
def __init__(
    self,
    prefix: str = "/",
    check_case: bool = False,
    ignore_symbol_at_sign: bool = False,
    only_with_bot_username: bool = False,
) -> None:
    super().__init__(
        "start",
        prefix,
        check_case,
        ignore_symbol_at_sign,
        only_with_bot_username,
    )

Attachment

Bases: BaseModel

Универсальный класс вложения с типом и полезной нагрузкой.

Attributes:

Name Type Description
type AttachmentType

Тип вложения.

payload Optional[Union[...]]

Полезная нагрузка, зависит от типа вложения.

ButtonsPayload

Bases: BaseModel

Данные для вложения с кнопками.

Attributes:

Name Type Description
buttons List[List[InlineButtonUnion]]

Двумерный список inline-кнопок.

ContactAttachmentPayload

Bases: BaseModel

Данные для контакта.

Attributes:

Name Type Description
vcf_info Optional[str]

Информация в формате vcf.

max_info Optional[User]

Дополнительная информация о пользователе.

OtherAttachmentPayload

Bases: BaseModel

Данные для общих типов вложений (файлы и т.п.).

Attributes:

Name Type Description
url str

URL вложения.

token Optional[str]

Опциональный токен доступа.

PhotoAttachmentPayload

Bases: BaseModel

Данные для фото-вложения.

Attributes:

Name Type Description
photo_id int

Идентификатор фотографии.

token str

Токен для доступа к фото.

url str

URL фотографии.

StickerAttachmentPayload

Bases: BaseModel

Данные для вложения типа стикер.

Attributes:

Name Type Description
url str

URL стикера.

code str

Код стикера.

CallbackButton

Bases: Button

Кнопка с callback-действием.

Attributes:

Name Type Description
type ButtonType

Тип кнопки (фиксированное значение ButtonType.CALLBACK)

text str

Текст, отображаемый на кнопке (наследуется от Button)

payload Optional[str]

Дополнительные данные (до 256 символов), передаваемые при нажатии

intent Intent

Намерение кнопки (визуальный стиль и поведение)

ChatButton(**data)

Bases: Button

.. deprecated:: 0.9.14 Используйте другие типы кнопок.

Attributes:

Name Type Description
text str

Текст кнопки (наследуется от Button)

chat_title str

Название чата (до 128 символов)

chat_description Optional[str]

Описание чата (до 256 символов)

start_payload Optional[str]

Данные, передаваемые при старте чата (до 512 символов)

uuid Optional[int]

Уникальный идентификатор чата

Source code in maxapi/types/attachments/buttons/chat_button.py
def __init__(self, **data):
    super().__init__(**data)
    warnings.warn(
        "ChatButton устарел и будет удален в будущих версиях. "
        "Используйте другие типы кнопок.",
        DeprecationWarning,
        stacklevel=2,
    )

LinkButton

Bases: Button

Кнопка с внешней ссылкой.

Attributes:

Name Type Description
url Optional[str]

Ссылка для перехода (должна содержать http/https)

MessageButton

Bases: Button

Кнопка для отправки текста

Attributes:

Name Type Description
type ButtonType

Тип кнопки (определяет её поведение и функционал)

text str

Отправляемый текст

OpenAppButton

Bases: Button

Кнопка для открытия приложения

Attributes:

Name Type Description
text str

Видимый текст кнопки

web_app Optional[str]

Публичное имя (username) бота или ссылка на него, чьё мини-приложение надо запустить

contact_id Optional[int]

Идентификатор бота, чьё мини-приложение надо запустить

payload Optional[str]

Параметр запуска, который будет передан в initData мини-приложения

RequestContactButton

Bases: Button

Кнопка с контактом

Attributes:

Name Type Description
text str

Текст кнопки

RequestGeoLocationButton

Bases: Button

Кнопка запроса геолокации пользователя.

Attributes:

Name Type Description
quick bool

Если True, запрашивает геолокацию без дополнительного подтверждения пользователя (по умолчанию False)

PhotoAttachmentRequestPayload

Bases: BaseModel

Полезная нагрузка для запроса фото-вложения.

Attributes:

Name Type Description
url Optional[str]

URL изображения.

token Optional[str]

Токен доступа к изображению.

photos Optional[str]

Дополнительные данные о фотографиях.

BotCommand

Bases: BaseModel

Модель команды бота для сериализации.

Attributes:

Name Type Description
name str

Название команды.

description Optional[str]

Описание команды. Может быть None.

Message

Bases: BaseModel, BotMixin

Модель сообщения.

Attributes:

Name Type Description
sender Optional[User]

Отправитель сообщения, может быть None, если сообщение отправлено каналом https://github.com/love-apples/maxapi/discussions/14.

recipient Recipient

Получатель сообщения.

timestamp int

Временная метка сообщения.

link Optional[LinkedMessage]

Связанное сообщение. Может быть None.

body Optional[MessageBody]

Содержимое сообщения. Текст + вложения. Может быть null, если сообщение содержит только пересланное сообщение

stat Optional[MessageStat]

Статистика сообщения. Может быть None.

url Optional[str]

URL сообщения. Может быть None.

bot Optional[Bot]

Объект бота, исключается из сериализации.

answer(text=None, attachments=None, link=None, notify=None, parse_mode=None, sleep_after_input_media=True) async

Отправляет сообщение (автозаполнение chat_id, user_id).

Parameters:

Name Type Description Default
text str

Текст ответа. Может быть None.

None
attachments List[Attachment | InputMedia | InputMediaBuffer | AttachmentUpload]

Список вложений. Может быть None.

None
link NewMessageLink

Связь с другим сообщением. Может быть None.

None
notify bool

Флаг отправки уведомления. По умолчанию True.

None
parse_mode ParseMode

Режим форматирования текста. Может быть None.

None

Returns:

Type Description
Optional['SendedMessage']

Optional[SendedMessage]: Результат выполнения метода send_message бота.

Source code in maxapi/types/message.py
async def answer(
    self,
    text: Optional[str] = None,
    attachments: Optional[
        List[Attachment | InputMedia | InputMediaBuffer | AttachmentUpload]
    ] = None,
    link: Optional[NewMessageLink] = None,
    notify: Optional[bool] = None,
    parse_mode: Optional[ParseMode] = None,
    sleep_after_input_media: Optional[bool] = True,
) -> Optional["SendedMessage"]:
    """
    Отправляет сообщение (автозаполнение chat_id, user_id).

    Args:
        text (str, optional): Текст ответа. Может быть None.
        attachments (List[Attachment | InputMedia | InputMediaBuffer | AttachmentUpload], optional): Список вложений. Может быть None.
        link (NewMessageLink, optional): Связь с другим сообщением. Может быть None.
        notify (bool): Флаг отправки уведомления. По умолчанию True.
        parse_mode (ParseMode, optional): Режим форматирования текста. Может быть None.

    Returns:
        Optional[SendedMessage]: Результат выполнения метода send_message бота.
    """

    return await self._ensure_bot().send_message(
        chat_id=self.recipient.chat_id,
        user_id=self.recipient.user_id,
        text=text,
        attachments=attachments,
        link=link,
        notify=notify,
        parse_mode=parse_mode,
        sleep_after_input_media=sleep_after_input_media,
    )

reply(text=None, attachments=None, notify=None, parse_mode=None, sleep_after_input_media=True) async

Отправляет ответное сообщение (автозаполнение chat_id, user_id, link).

Parameters:

Name Type Description Default
text str

Текст ответа. Может быть None.

None
attachments List[Attachment | InputMedia | InputMediaBuffer | AttachmentUpload]

Список вложений. Может быть None.

None
notify bool

Флаг отправки уведомления. По умолчанию True.

None
parse_mode ParseMode

Режим форматирования текста. Может быть None.

None
sleep_after_input_media Optional[bool]

Optional[bool] = True,

True

Returns:

Type Description
Optional['SendedMessage']

Optional[SendedMessage]: Результат выполнения метода send_message бота.

Source code in maxapi/types/message.py
async def reply(
    self,
    text: Optional[str] = None,
    attachments: Optional[
        List[Attachment | InputMedia | InputMediaBuffer | AttachmentUpload]
    ] = None,
    notify: Optional[bool] = None,
    parse_mode: Optional[ParseMode] = None,
    sleep_after_input_media: Optional[bool] = True,
) -> Optional["SendedMessage"]:
    """
    Отправляет ответное сообщение (автозаполнение chat_id, user_id, link).

    Args:
        text (str, optional): Текст ответа. Может быть None.
        attachments (List[Attachment | InputMedia | InputMediaBuffer | AttachmentUpload], optional): Список вложений. Может быть None.
        notify (bool): Флаг отправки уведомления. По умолчанию True.
        parse_mode (ParseMode, optional): Режим форматирования текста. Может быть None.
        sleep_after_input_media: Optional[bool] = True,

    Returns:
        Optional[SendedMessage]: Результат выполнения метода send_message бота.
    """

    if self.body is None:
        msg = "Невозможно ответить: поле body отсутствует у сообщения"
        raise ValueError(msg)

    if self.recipient.chat_id is None:
        msg = "Невозможно ответить: chat_id отсутствует"
        raise ValueError(msg)

    return await self._ensure_bot().send_message(
        chat_id=self.recipient.chat_id,
        user_id=self.recipient.user_id,
        text=text,
        attachments=attachments,
        link=NewMessageLink(type=MessageLinkType.REPLY, mid=self.body.mid),
        notify=notify,
        parse_mode=parse_mode,
        sleep_after_input_media=sleep_after_input_media,
    )

forward(chat_id, user_id=None, attachments=None, notify=None, parse_mode=None, sleep_after_input_media=True) async

Пересылает отправленное сообщение в указанный чат (автозаполнение link).

Parameters:

Name Type Description Default
chat_id int

ID чата для отправки (обязателен, если не указан user_id)

required
user_id int

ID пользователя для отправки (обязателен, если не указан chat_id). По умолчанию None

None
attachments List[Attachment | InputMedia | InputMediaBuffer | AttachmentUpload]

Список вложений. Может быть None.

None
notify bool

Флаг отправки уведомления. По умолчанию True.

None
parse_mode ParseMode

Режим форматирования текста. Может быть None.

None
sleep_after_input_media Optional[bool]

Optional[bool] = True,

True

Returns:

Type Description
Optional['SendedMessage']

Optional[SendedMessage]: Результат выполнения метода send_message бота.

Source code in maxapi/types/message.py
async def forward(
    self,
    chat_id: Optional[int],
    user_id: Optional[int] = None,
    attachments: Optional[
        List[
            Union[
                Attachment, InputMedia, InputMediaBuffer, AttachmentUpload
            ]
        ]
    ] = None,
    notify: Optional[bool] = None,
    parse_mode: Optional[ParseMode] = None,
    sleep_after_input_media: Optional[bool] = True,
) -> Optional["SendedMessage"]:
    """
    Пересылает отправленное сообщение в указанный чат (автозаполнение link).

    Args:
        chat_id (int): ID чата для отправки (обязателен, если не указан user_id)
        user_id (int): ID пользователя для отправки (обязателен, если не указан chat_id). По умолчанию None
        attachments (List[Attachment | InputMedia | InputMediaBuffer | AttachmentUpload], optional): Список вложений. Может быть None.
        notify (bool): Флаг отправки уведомления. По умолчанию True.
        parse_mode (ParseMode, optional): Режим форматирования текста. Может быть None.
        sleep_after_input_media: Optional[bool] = True,

    Returns:
        Optional[SendedMessage]: Результат выполнения метода send_message бота.
    """

    if self.body is None:
        msg = "Невозможно переслать: поле body отсутствует у сообщения"
        raise ValueError(msg)

    return await self._ensure_bot().send_message(
        chat_id=chat_id,
        user_id=user_id,
        attachments=attachments,
        link=NewMessageLink(
            type=MessageLinkType.FORWARD, mid=self.body.mid
        ),
        notify=notify,
        parse_mode=parse_mode,
        sleep_after_input_media=sleep_after_input_media,
    )

edit(text=None, attachments=None, link=None, notify=True, parse_mode=None, sleep_after_input_media=True) async

Редактирует текущее сообщение.

Parameters:

Name Type Description Default
text str

Новый текст сообщения. Может быть None.

None
attachments List[Attachment | InputMedia | InputMediaBuffer | AttachmentUpload]

Новые вложения. Может быть None.

None
link NewMessageLink

Новая связь с сообщением. Может быть None.

None
notify bool

Флаг отправки уведомления. По умолчанию True.

True
parse_mode ParseMode

Режим форматирования текста. Может быть None.

None

Returns:

Type Description
Optional['EditedMessage']

Optional[EditedMessage]: Результат выполнения метода edit_message бота.

Source code in maxapi/types/message.py
async def edit(
    self,
    text: Optional[str] = None,
    attachments: Optional[
        List[Attachment | InputMedia | InputMediaBuffer | AttachmentUpload]
        | List[Attachments]
    ] = None,
    link: Optional[NewMessageLink] = None,
    notify: bool = True,
    parse_mode: Optional[ParseMode] = None,
    sleep_after_input_media: Optional[bool] = True,
) -> Optional["EditedMessage"]:
    """
    Редактирует текущее сообщение.

    Args:
        text (str, optional): Новый текст сообщения. Может быть None.
        attachments (List[Attachment | InputMedia | InputMediaBuffer | AttachmentUpload], optional): Новые вложения. Может быть None.
        link (NewMessageLink, optional): Новая связь с сообщением. Может быть None.
        notify (bool): Флаг отправки уведомления. По умолчанию True.
        parse_mode (ParseMode, optional): Режим форматирования текста. Может быть None.

    Returns:
        Optional[EditedMessage]: Результат выполнения метода edit_message бота.
    """

    if link is None and self.link:
        link = NewMessageLink(
            type=self.link.type, mid=self.link.message.mid
        )

    if attachments is None:
        if self.body is not None and self.body.attachments:
            attachments = self.body.attachments

    if self.body is None:
        msg = "Невозможно редактировать: поле body отсутствует у сообщения"
        raise ValueError(msg)

    return await self._ensure_bot().edit_message(
        message_id=self.body.mid,
        text=text,
        attachments=attachments,
        link=link,
        notify=notify,
        parse_mode=parse_mode,
        sleep_after_input_media=sleep_after_input_media,
    )

delete() async

Удаляет текущее сообщение.

Returns:

Name Type Description
DeletedMessage 'DeletedMessage'

Результат выполнения метода delete_message бота.

Source code in maxapi/types/message.py
async def delete(self) -> "DeletedMessage":
    """
    Удаляет текущее сообщение.

    Returns:
        DeletedMessage: Результат выполнения метода delete_message бота.
    """

    if self.body is None:
        msg = "Невозможно удалить: поле body отсутствует у сообщения"
        raise ValueError(msg)

    return await self._ensure_bot().delete_message(
        message_id=self.body.mid,
    )

pin(notify=True) async

Закрепляет текущее сообщение в чате.

Parameters:

Name Type Description Default
notify bool

Флаг отправки уведомления. По умолчанию True.

True

Returns:

Name Type Description
PinnedMessage 'PinnedMessage'

Результат выполнения метода pin_message бота.

Source code in maxapi/types/message.py
async def pin(self, notify: bool = True) -> "PinnedMessage":
    """
    Закрепляет текущее сообщение в чате.

    Args:
        notify (bool): Флаг отправки уведомления. По умолчанию True.

    Returns:
        PinnedMessage: Результат выполнения метода pin_message бота.
    """

    if self.body is None:
        msg = "Невозможно закрепить: поле body отсутствует у сообщения"
        raise ValueError(msg)

    if self.recipient.chat_id is None:
        raise ValueError("chat_id не может быть None")

    return await self._ensure_bot().pin_message(
        chat_id=self.recipient.chat_id,
        message_id=self.body.mid,
        notify=notify,
    )

Bases: BaseModel

Модель ссылки на новое сообщение.

Attributes:

Name Type Description
type MessageLinkType

Тип связи.

mid str

Идентификатор сообщения.

BotAdded

Bases: Update

Обновление, сигнализирующее о добавлении бота в чат.

Attributes:

Name Type Description
chat_id int

Идентификатор чата, куда добавлен бот.

user User

Объект пользователя-бота.

is_channel bool

Указывает, был ли бот добавлен в канал или нет

BotRemoved

Bases: Update

Обновление, сигнализирующее об удалении бота из чата.

Attributes:

Name Type Description
chat_id int

Идентификатор чата, из которого удалён бот.

user User

Объект пользователя-бота.

is_channel bool

Указывает, был ли пользователь добавлен в канал или нет

BotStarted

Bases: Update

Обновление, сигнализирующее о первом старте бота.

Attributes:

Name Type Description
chat_id int

Идентификатор чата.

user User

Пользователь (бот).

user_locale Optional[str]

Локаль пользователя.

payload Optional[str]

Дополнительные данные.

BotStopped

Bases: Update

Обновление, сигнализирующее об остановке бота.

Attributes:

Name Type Description
chat_id int

Идентификатор чата.

user User

Пользователь (бот).

user_locale Optional[str]

Локаль пользователя.

payload Optional[str]

Дополнительные данные.

ChatTitleChanged

Bases: Update

Обновление, сигнализирующее об изменении названия чата.

Attributes:

Name Type Description
chat_id Optional[int]

Идентификатор чата.

user User

Пользователь, совершивший изменение.

title str

Новое название чата.

DialogCleared

Bases: Update

Обновление, сигнализирующее об очистке диалога с ботом.

Attributes:

Name Type Description
chat_id int

Идентификатор чата.

user User

Пользователь (бот).

user_locale Optional[str]

Локаль пользователя.

DialogMuted

Bases: Update

Обновление, сигнализирующее об отключении оповещений от бота.

Attributes:

Name Type Description
chat_id int

Идентификатор чата.

muted_until int

Время до включения оповещений от бота.

user User

Пользователь (бот).

user_locale Optional[str]

Локаль пользователя.

DialogUnmuted

Bases: Update

Обновление, сигнализирующее о включении оповещений от бота.

Attributes:

Name Type Description
chat_id int

Идентификатор чата.

user User

Пользователь (бот).

user_locale Optional[str]

Локаль пользователя.

MessageCallback

Bases: Update

Обновление с callback-событием сообщения.

Attributes:

Name Type Description
message Optional[Message]

Изначальное сообщение, содержащее встроенную клавиатуру. Может быть null, если оно было удалено к моменту, когда бот получил это обновление.

user_locale Optional[str]

Локаль пользователя.

callback Callback

Объект callback.

get_ids()

Возвращает кортеж идентификаторов (chat_id, user_id).

Returns:

Type Description
Tuple[Optional[int], int]

tuple[Optional[int], int]: Идентификаторы чата и пользователя.

Source code in maxapi/types/updates/message_callback.py
def get_ids(self) -> Tuple[Optional[int], int]:
    """
    Возвращает кортеж идентификаторов (chat_id, user_id).

    Returns:
        tuple[Optional[int], int]: Идентификаторы чата и пользователя.
    """

    chat_id: Optional[int] = None
    if self.message is not None:
        chat_id = self.message.recipient.chat_id

    return chat_id, self.callback.user.user_id

answer(notification=None, new_text=None, link=None, notify=True, format=None, raise_if_not_exists=True) async

Отправляет ответ на callback с возможностью изменить текст, вложения и параметры уведомления.

Parameters:

Name Type Description Default
notification str

Текст уведомления.

None
new_text Optional[str]

Новый текст сообщения.

None
link Optional[NewMessageLink]

Связь с другим сообщением.

None
notify bool

Отправлять ли уведомление.

True
format Optional[ParseMode]

Режим разбора текста.

None
raise_if_not_exists bool

Выдавать ошибку при отсутствии сообщения, если пытаются изменить его содержимое (new_text/link/format).

True

Returns:

Name Type Description
SendedCallback SendedCallback

Результат вызова send_callback бота.

Source code in maxapi/types/updates/message_callback.py
async def answer(
    self,
    notification: Optional[str] = None,
    new_text: Optional[str] = None,
    link: Optional[NewMessageLink] = None,
    notify: bool = True,
    format: Optional[ParseMode] = None,
    raise_if_not_exists: bool = True,
) -> "SendedCallback":
    """
    Отправляет ответ на callback с возможностью изменить текст, вложения и параметры уведомления.

    Args:
        notification (str): Текст уведомления.
        new_text (Optional[str]): Новый текст сообщения.
        link (Optional[NewMessageLink]): Связь с другим сообщением.
        notify (bool): Отправлять ли уведомление.
        format (Optional[ParseMode]): Режим разбора текста.
        raise_if_not_exists: Выдавать ошибку при отсутствии сообщения,
            если пытаются изменить его содержимое (new_text/link/format).

    Returns:
        SendedCallback: Результат вызова send_callback бота.
    """

    # Если исходного сообщения нет (например, оно удалено), не стоит синтезировать
    # пустой payload message. Два варианта поведения:
    #  - если вызывающий просит изменить сообщение (new_text/link/format)
    #    => выбросить исключение
    #  - иначе отправить только notification с message=None, чтобы API не получил
    #    пустой объект message
    original_body = None
    if self.message is not None:
        original_body = self.message.body

    if original_body is None:
        # если пытаются изменить контент/вложение/связь
        if raise_if_not_exists and (
            new_text is not None or link is not None or format is not None
        ):
            raise ValueError(
                "Невозможно изменить сообщение: исходное сообщение отсутствует"
            )

        # отправляем только уведомление (без поля message)
        return await self._ensure_bot().send_callback(
            callback_id=self.callback.callback_id,
            message=None,
            notification=notification,
        )

    # Если исходное сообщение есть — собираем MessageForCallback на его основе
    message_for_callback = MessageForCallback()
    message_for_callback.text = new_text

    attachments: List[Attachments] = original_body.attachments or []

    message_for_callback.attachments = attachments
    message_for_callback.link = link
    message_for_callback.notify = notify
    message_for_callback.format = format

    return await self._ensure_bot().send_callback(
        callback_id=self.callback.callback_id,
        message=message_for_callback,
        notification=notification,
    )

MessageChatCreated(**data)

Bases: Update

.. deprecated:: 0.9.14 Это событие устарело и будет удалено в будущих версиях.

Событие создания чата.

Attributes:

Name Type Description
chat Chat

Объект чата.

title Optional[str]

Название чата.

message_id Optional[str]

ID сообщения.

start_payload Optional[str]

Payload для старта.

Source code in maxapi/types/updates/message_chat_created.py
def __init__(self, **data):
    super().__init__(**data)
    warnings.warn(
        "MessageChatCreated устарел и будет удален в будущих версиях.",
        DeprecationWarning,
        stacklevel=2,
    )

MessageCreated

Bases: Update

Обновление, сигнализирующее о создании нового сообщения.

Attributes:

Name Type Description
message Message

Объект сообщения.

user_locale Optional[str]

Локаль пользователя.

get_ids()

Возвращает кортеж идентификаторов (chat_id, user_id).

Returns:

Type Description
Tuple[Optional[int], Optional[int]]

tuple[Optional[int], Optional[int]]: Идентификатор чата и пользователя.

Source code in maxapi/types/updates/message_created.py
def get_ids(self) -> Tuple[Optional[int], Optional[int]]:
    """
    Возвращает кортеж идентификаторов (chat_id, user_id).

    Returns:
        tuple[Optional[int], Optional[int]]: Идентификатор чата и пользователя.
    """

    chat_id = self.message.recipient.chat_id
    user_id = self.message.sender.user_id if self.message.sender else None
    return (chat_id, user_id)

MessageEdited

Bases: Update

Обновление, сигнализирующее об изменении сообщения.

Attributes:

Name Type Description
message Message

Объект измененного сообщения.

get_ids()

Возвращает кортеж идентификаторов (chat_id, user_id).

Returns:

Type Description
Tuple[Optional[int], Optional[int]]

Tuple[Optional[int], Optional[int]]: Идентификаторы чата и пользователя.

Source code in maxapi/types/updates/message_edited.py
def get_ids(self) -> Tuple[Optional[int], Optional[int]]:
    """
    Возвращает кортеж идентификаторов (chat_id, user_id).

    Returns:
        Tuple[Optional[int], Optional[int]]: Идентификаторы чата и пользователя.
    """

    return (self.message.recipient.chat_id, self.message.recipient.user_id)

MessageRemoved

Bases: Update

Класс для обработки события удаления сообщения в чате.

Attributes:

Name Type Description
message_id str

Идентификатор удаленного сообщения. Может быть None.

chat_id int

Идентификатор чата. Может быть None.

user_id int

Идентификатор пользователя. Может быть None.

get_ids()

Возвращает кортеж идентификаторов (chat_id, user_id).

Returns:

Type Description
Tuple[Optional[int], Optional[int]]

Tuple[Optional[int], Optional[int]]: Идентификаторы чата и пользователя.

Source code in maxapi/types/updates/message_removed.py
def get_ids(self) -> Tuple[Optional[int], Optional[int]]:
    """
    Возвращает кортеж идентификаторов (chat_id, user_id).

    Returns:
        Tuple[Optional[int], Optional[int]]: Идентификаторы чата и пользователя.
    """

    return (self.chat_id, self.user_id)

UserAdded

Bases: Update

Класс для обработки события добавления пользователя в чат.

Attributes:

Name Type Description
inviter_id int

Идентификатор пользователя, добавившего нового участника. Может быть None.

chat_id int

Идентификатор чата. Может быть None.

user User

Объект пользователя, добавленного в чат.

is_channel bool

Указывает, был ли пользователь добавлен в канал или нет

get_ids()

Возвращает кортеж идентификаторов (chat_id, user_id).

Returns:

Type Description
Tuple[Optional[int], Optional[int]]

Tuple[Optional[int], Optional[int]]: Идентификаторы чата и пользователя.

Source code in maxapi/types/updates/user_added.py
def get_ids(self) -> Tuple[Optional[int], Optional[int]]:
    """
    Возвращает кортеж идентификаторов (chat_id, user_id).

    Returns:
        Tuple[Optional[int], Optional[int]]: Идентификаторы чата и пользователя.
    """

    return (self.chat_id, self.inviter_id)

UserRemoved

Bases: Update

Класс для обработки события выходе/удаления пользователя из чата.

Attributes:

Name Type Description
admin_id Optional[int]

Идентификатор администратора, удалившего пользователя. None при выходе из чата самим пользователем.

chat_id int

Идентификатор чата. Может быть None.

user User

Объект пользователя, удаленного из чата.

is_channel bool

Указывает, был ли пользователь удален из канала или нет

get_ids()

Возвращает кортеж идентификаторов (chat_id, user_id).

Returns:

Type Description
Tuple[Optional[int], Optional[int]]

Tuple[Optional[int], Optional[int]]: Идентификаторы чата и пользователя.

Source code in maxapi/types/updates/user_removed.py
def get_ids(self) -> Tuple[Optional[int], Optional[int]]:
    """
    Возвращает кортеж идентификаторов (chat_id, user_id).

    Returns:
        Tuple[Optional[int], Optional[int]]: Идентификаторы чата и пользователя.
    """

    return (self.chat_id, self.admin_id)

InputMedia(path)

Класс для представления медиафайла.

Attributes:

Name Type Description
path str

Путь к файлу.

type UploadType

Тип файла, определенный на основе содержимого (MIME-типа).

Инициализирует объект медиафайла.

Parameters:

Name Type Description Default
path str

Путь к файлу.

required
Source code in maxapi/types/input_media.py
def __init__(self, path: str):
    """
    Инициализирует объект медиафайла.

    Args:
        path (str): Путь к файлу.
    """

    self.path = path
    self.type = self.__detect_file_type(path)

__detect_file_type(path)

Определяет тип файла на основе его содержимого (MIME-типа).

Parameters:

Name Type Description Default
path str

Путь к файлу.

required

Returns:

Name Type Description
UploadType UploadType

Тип файла (VIDEO, IMAGE, AUDIO или FILE).

Source code in maxapi/types/input_media.py
def __detect_file_type(self, path: str) -> UploadType:
    """
    Определяет тип файла на основе его содержимого (MIME-типа).

    Args:
        path (str): Путь к файлу.

    Returns:
        UploadType: Тип файла (VIDEO, IMAGE, AUDIO или FILE).
    """

    with open(path, "rb") as f:
        sample = f.read(4096)

    try:
        matches = puremagic.magic_string(sample)
        if matches:
            mime_type = matches[0].mime_type
        else:
            mime_type = None
    except Exception:
        mime_type = None

    if mime_type is None:
        return UploadType.FILE

    if mime_type.startswith("video/"):
        return UploadType.VIDEO
    elif mime_type.startswith("image/"):
        return UploadType.IMAGE
    elif mime_type.startswith("audio/"):
        return UploadType.AUDIO
    else:
        return UploadType.FILE

InputMediaBuffer(buffer, filename=None)

Класс для представления медиафайла из буфера.

Attributes:

Name Type Description
buffer bytes

Буфер с содержимым файла.

type UploadType

Тип файла, определенный по содержимому.

Инициализирует объект медиафайла из буфера.

Parameters:

Name Type Description Default
buffer IO

Буфер с содержимым файла.

required
filename str

Название файла (по умолчанию присваивается uuid4).

None
Source code in maxapi/types/input_media.py
def __init__(self, buffer: bytes, filename: str | None = None):
    """
    Инициализирует объект медиафайла из буфера.

    Args:
        buffer (IO): Буфер с содержимым файла.
        filename (str): Название файла (по умолчанию присваивается uuid4).
    """

    self.filename = filename
    self.buffer = buffer
    self.type = self.__detect_file_type(buffer)

attachments

attachment

StickerAttachmentPayload

Bases: BaseModel

Данные для вложения типа стикер.

Attributes:

Name Type Description
url str

URL стикера.

code str

Код стикера.

PhotoAttachmentPayload

Bases: BaseModel

Данные для фото-вложения.

Attributes:

Name Type Description
photo_id int

Идентификатор фотографии.

token str

Токен для доступа к фото.

url str

URL фотографии.

OtherAttachmentPayload

Bases: BaseModel

Данные для общих типов вложений (файлы и т.п.).

Attributes:

Name Type Description
url str

URL вложения.

token Optional[str]

Опциональный токен доступа.

ContactAttachmentPayload

Bases: BaseModel

Данные для контакта.

Attributes:

Name Type Description
vcf_info Optional[str]

Информация в формате vcf.

max_info Optional[User]

Дополнительная информация о пользователе.

ButtonsPayload

Bases: BaseModel

Данные для вложения с кнопками.

Attributes:

Name Type Description
buttons List[List[InlineButtonUnion]]

Двумерный список inline-кнопок.

Attachment

Bases: BaseModel

Универсальный класс вложения с типом и полезной нагрузкой.

Attributes:

Name Type Description
type AttachmentType

Тип вложения.

payload Optional[Union[...]]

Полезная нагрузка, зависит от типа вложения.

audio

Audio

Bases: Attachment

Вложение с типом аудио.

Attributes:

Name Type Description
transcription Optional[str]

Транскрипция аудио (если есть).

buttons

attachment_button
AttachmentButton

Bases: Attachment

Модель кнопки вложения для сообщения.

Attributes:

Name Type Description
type Literal[INLINE_KEYBOARD]

Тип кнопки, фиксированное значение 'inline_keyboard'

payload Optional[Union[AttachmentUpload, PhotoAttachmentPayload, OtherAttachmentPayload, ButtonsPayload, ContactAttachmentPayload, StickerAttachmentPayload]]

Полезная нагрузка кнопки (массив рядов кнопок)

button
Button

Bases: BaseModel

Базовая модель кнопки для сообщений.

Attributes:

Name Type Description
type ButtonType

Тип кнопки (определяет её поведение и функционал)

text str

Текст, отображаемый на кнопке (1-64 символа)

callback_button
CallbackButton

Bases: Button

Кнопка с callback-действием.

Attributes:

Name Type Description
type ButtonType

Тип кнопки (фиксированное значение ButtonType.CALLBACK)

text str

Текст, отображаемый на кнопке (наследуется от Button)

payload Optional[str]

Дополнительные данные (до 256 символов), передаваемые при нажатии

intent Intent

Намерение кнопки (визуальный стиль и поведение)

chat_button
ChatButton(**data)

Bases: Button

.. deprecated:: 0.9.14 Используйте другие типы кнопок.

Attributes:

Name Type Description
text str

Текст кнопки (наследуется от Button)

chat_title str

Название чата (до 128 символов)

chat_description Optional[str]

Описание чата (до 256 символов)

start_payload Optional[str]

Данные, передаваемые при старте чата (до 512 символов)

uuid Optional[int]

Уникальный идентификатор чата

Source code in maxapi/types/attachments/buttons/chat_button.py
def __init__(self, **data):
    super().__init__(**data)
    warnings.warn(
        "ChatButton устарел и будет удален в будущих версиях. "
        "Используйте другие типы кнопок.",
        DeprecationWarning,
        stacklevel=2,
    )

Bases: Button

Кнопка с внешней ссылкой.

Attributes:

Name Type Description
url Optional[str]

Ссылка для перехода (должна содержать http/https)

message_button
MessageButton

Bases: Button

Кнопка для отправки текста

Attributes:

Name Type Description
type ButtonType

Тип кнопки (определяет её поведение и функционал)

text str

Отправляемый текст

open_app_button
OpenAppButton

Bases: Button

Кнопка для открытия приложения

Attributes:

Name Type Description
text str

Видимый текст кнопки

web_app Optional[str]

Публичное имя (username) бота или ссылка на него, чьё мини-приложение надо запустить

contact_id Optional[int]

Идентификатор бота, чьё мини-приложение надо запустить

payload Optional[str]

Параметр запуска, который будет передан в initData мини-приложения

request_contact
RequestContactButton

Bases: Button

Кнопка с контактом

Attributes:

Name Type Description
text str

Текст кнопки

request_geo_location_button
RequestGeoLocationButton

Bases: Button

Кнопка запроса геолокации пользователя.

Attributes:

Name Type Description
quick bool

Если True, запрашивает геолокацию без дополнительного подтверждения пользователя (по умолчанию False)

contact

Contact

Bases: Attachment

Вложение с типом контакта.

file

File

Bases: Attachment

Вложение с типом файла.

Attributes:

Name Type Description
filename Optional[str]

Имя файла.

size Optional[int]

Размер файла в байтах.

image

PhotoAttachmentRequestPayload

Bases: BaseModel

Полезная нагрузка для запроса фото-вложения.

Attributes:

Name Type Description
url Optional[str]

URL изображения.

token Optional[str]

Токен доступа к изображению.

photos Optional[str]

Дополнительные данные о фотографиях.

Image

Bases: Attachment

Вложение с типом изображения.

Attributes:

Name Type Description
type Literal['image']

Тип вложения, всегда 'image'.

location

Location

Bases: Attachment

Вложение с типом геолокации.

Attributes:

Name Type Description
latitude Optional[float]

Широта.

longitude Optional[float]

Долгота.

share

Share

Bases: Attachment

Вложение с типом "share" (поделиться).

Attributes:

Name Type Description
title Optional[str]

Заголовок для шаринга.

description Optional[str]

Описание.

image_url Optional[str]

URL изображения для предпросмотра.

sticker

Sticker

Bases: Attachment

Вложение с типом стикера.

Attributes:

Name Type Description
width Optional[int]

Ширина стикера в пикселях.

height Optional[int]

Высота стикера в пикселях.

upload

AttachmentPayload

Bases: BaseModel

Полезная нагрузка вложения с токеном.

Attributes:

Name Type Description
token str

Токен для доступа или идентификации вложения.

AttachmentUpload

Bases: BaseModel

Вложение с полезной нагрузкой для загрузки на сервера MAX.

Attributes:

Name Type Description
type UploadType

Тип вложения (например, image, video, audio).

payload AttachmentPayload

Полезная нагрузка с токеном.

video

VideoUrl

Bases: BaseModel

URLs различных разрешений видео.

Attributes:

Name Type Description
mp4_1080 Optional[str]

URL видео в 1080p.

mp4_720 Optional[str]

URL видео в 720p.

mp4_480 Optional[str]

URL видео в 480p.

mp4_360 Optional[str]

URL видео в 360p.

mp4_240 Optional[str]

URL видео в 240p.

mp4_144 Optional[str]

URL видео в 144p.

hls Optional[str]

URL HLS потока.

VideoThumbnail

Bases: BaseModel

Миниатюра видео.

Attributes:

Name Type Description
url str

URL миниатюры.

Video

Bases: Attachment

Вложение с типом видео.

Attributes:

Name Type Description
token Optional[str]

Токен видео.

urls Optional[VideoUrl]

URLs видео разных разрешений.

thumbnail VideoThumbnail

Миниатюра видео.

width Optional[int]

Ширина видео.

height Optional[int]

Высота видео.

duration Optional[int]

Продолжительность видео в секундах.

bot Optional[Any]

Ссылка на экземпляр бота, не сериализуется.

bot_mixin

BotMixin

Миксин для проверки инициализации bot.

callback

Callback

Bases: BaseModel

Модель callback-запроса.

Attributes:

Name Type Description
timestamp int

Временная метка callback.

callback_id str

Уникальный идентификатор callback.

payload Optional[str]

Дополнительные данные callback. Может быть None.

user User

Объект пользователя, инициировавшего callback.

chats

Icon

Bases: BaseModel

Модель иконки чата.

Attributes:

Name Type Description
url str

URL-адрес иконки.

Chat

Bases: BaseModel

Модель чата.

Attributes:

Name Type Description
chat_id int

Уникальный идентификатор чата.

type ChatType

Тип чата.

status ChatStatus

Статус чата.

title Optional[str]

Название чата.

icon Optional[Icon]

Иконка чата. Может быть None.

last_event_time int

Временная метка последнего события в чате.

participants_count int

Количество участников чата.

owner_id Optional[int]

Идентификатор владельца чата.

participants Optional[Dict[str, datetime]]

Словарь участников с временными метками. Может быть None.

is_public bool

Флаг публичности чата.

link Optional[str]

Ссылка на чат. Может быть None.

description Optional[str]

Описание чата. Может быть None.

dialog_with_user Optional[User]

Пользователь, с которым ведется диалог. Может быть None.

messages_count Optional[int]

Количество сообщений в чате. Может быть None.

chat_message_id Optional[str]

Идентификатор сообщения чата. Может быть None.

pinned_message Optional[Message]

Закрепленное сообщение. Может быть None.

convert_timestamps(value) classmethod

Преобразовать временные метки участников из миллисекунд в объекты datetime.

Parameters:

Name Type Description Default
value Optional[Dict[str, int]]

Словарь с временными метками в миллисекундах. Может быть None, если участников нет.

required

Returns:

Type Description
Optional[Dict[str, Optional[datetime]]]

Optional[Dict[str, Optional[datetime]]]: Словарь с временными метками в формате datetime. Может быть None, если входное значение было None.

Source code in maxapi/types/chats.py
@field_validator("participants", mode="before")
@classmethod
def convert_timestamps(
    cls,
    value: Optional[Dict[str, int]],
) -> Optional[Dict[str, Optional[datetime]]]:
    """
    Преобразовать временные метки участников из миллисекунд
    в объекты datetime.

    Args:
        value (Optional[Dict[str, int]]): Словарь с временными
            метками в миллисекундах. Может быть None, если участников нет.

    Returns:
        Optional[Dict[str, Optional[datetime]]]: Словарь с
            временными метками в формате datetime. Может быть None,
            если входное значение было None.
    """
    if value is None:
        return None

    return {key: from_ms(ts) for key, ts in value.items()}
serialize_participants(value, info)

Serialize participants dict: datetime -> milliseconds

Source code in maxapi/types/chats.py
@field_serializer("participants")
def serialize_participants(
    self, value: Optional[Dict[str, datetime]], info
):
    """Serialize participants dict: datetime -> milliseconds"""
    if value is None:
        return None
    return {key: to_ms(dt) for key, dt in value.items()}

Chats

Bases: BaseModel

Модель списка чатов.

Attributes:

Name Type Description
chats List[Chat]

Список чатов. По умолчанию пустой.

marker Optional[int]

Маркер для пагинации. Может быть None.

ChatMember

Bases: User

Модель участника чата.

Attributes:

Name Type Description
last_access_time Optional[int]

Время последнего доступа. Может быть None.

is_owner Optional[bool]

Флаг владельца чата. Может быть None.

is_admin Optional[bool]

Флаг администратора чата. Может быть None.

join_time Optional[int]

Время присоединения к чату. Может быть None.

permissions Optional[List[ChatPermission]]

Список разрешений участника. Может быть None.

alias Optional[str]

Заголовок, который будет показан на клиент. Может быть None.

command

BotCommand

Bases: BaseModel

Модель команды бота для сериализации.

Attributes:

Name Type Description
name str

Название команды.

description Optional[str]

Описание команды. Может быть None.

input_media

InputMedia(path)

Класс для представления медиафайла.

Attributes:

Name Type Description
path str

Путь к файлу.

type UploadType

Тип файла, определенный на основе содержимого (MIME-типа).

Инициализирует объект медиафайла.

Parameters:

Name Type Description Default
path str

Путь к файлу.

required
Source code in maxapi/types/input_media.py
def __init__(self, path: str):
    """
    Инициализирует объект медиафайла.

    Args:
        path (str): Путь к файлу.
    """

    self.path = path
    self.type = self.__detect_file_type(path)
__detect_file_type(path)

Определяет тип файла на основе его содержимого (MIME-типа).

Parameters:

Name Type Description Default
path str

Путь к файлу.

required

Returns:

Name Type Description
UploadType UploadType

Тип файла (VIDEO, IMAGE, AUDIO или FILE).

Source code in maxapi/types/input_media.py
def __detect_file_type(self, path: str) -> UploadType:
    """
    Определяет тип файла на основе его содержимого (MIME-типа).

    Args:
        path (str): Путь к файлу.

    Returns:
        UploadType: Тип файла (VIDEO, IMAGE, AUDIO или FILE).
    """

    with open(path, "rb") as f:
        sample = f.read(4096)

    try:
        matches = puremagic.magic_string(sample)
        if matches:
            mime_type = matches[0].mime_type
        else:
            mime_type = None
    except Exception:
        mime_type = None

    if mime_type is None:
        return UploadType.FILE

    if mime_type.startswith("video/"):
        return UploadType.VIDEO
    elif mime_type.startswith("image/"):
        return UploadType.IMAGE
    elif mime_type.startswith("audio/"):
        return UploadType.AUDIO
    else:
        return UploadType.FILE

InputMediaBuffer(buffer, filename=None)

Класс для представления медиафайла из буфера.

Attributes:

Name Type Description
buffer bytes

Буфер с содержимым файла.

type UploadType

Тип файла, определенный по содержимому.

Инициализирует объект медиафайла из буфера.

Parameters:

Name Type Description Default
buffer IO

Буфер с содержимым файла.

required
filename str

Название файла (по умолчанию присваивается uuid4).

None
Source code in maxapi/types/input_media.py
def __init__(self, buffer: bytes, filename: str | None = None):
    """
    Инициализирует объект медиафайла из буфера.

    Args:
        buffer (IO): Буфер с содержимым файла.
        filename (str): Название файла (по умолчанию присваивается uuid4).
    """

    self.filename = filename
    self.buffer = buffer
    self.type = self.__detect_file_type(buffer)

message

MarkupElement

Bases: BaseModel

Модель элемента разметки текста.

Attributes:

Name Type Description
type TextStyle

Тип разметки.

from_ int

Начальная позиция разметки в тексте.

length int

Длина разметки.

Bases: MarkupElement

Модель разметки ссылки.

Attributes:

Name Type Description
url Optional[str]

URL ссылки. Может быть None.

Recipient

Bases: BaseModel

Модель получателя сообщения.

Attributes:

Name Type Description
user_id Optional[int]

Идентификатор пользователя. Может быть None.

chat_id Optional[int]

Идентификатор чата. Может быть None.

chat_type ChatType

Тип получателя (диалог или чат).

MessageBody

Bases: BaseModel

Модель тела сообщения.

Attributes:

Name Type Description
mid str

Уникальный идентификатор сообщения.

seq int

Порядковый номер сообщения.

text str

Текст сообщения. Может быть None.

attachments Optional[List[Union[AttachmentButton, Audio, Video, File, Image, Sticker, Share]]]

Список вложений. По умолчанию пустой.

markup Optional[List[Union[MarkupLink, MarkupElement]]]

Список элементов разметки. По умолчанию пустой.

MessageStat

Bases: BaseModel

Модель статистики сообщения.

Attributes:

Name Type Description
views int

Количество просмотров сообщения.

LinkedMessage

Bases: BaseModel

Модель связанного сообщения.

Attributes:

Name Type Description
type MessageLinkType

Тип связи.

sender Optional[User]

Отправитель связанного сообщения, может быть None, если связанное сообщение отправлено каналом https://github.com/love-apples/maxapi/issues/11.

chat_id Optional[int]

Идентификатор чата. Может быть None.

message MessageBody

Тело связанного сообщения.

Message

Bases: BaseModel, BotMixin

Модель сообщения.

Attributes:

Name Type Description
sender Optional[User]

Отправитель сообщения, может быть None, если сообщение отправлено каналом https://github.com/love-apples/maxapi/discussions/14.

recipient Recipient

Получатель сообщения.

timestamp int

Временная метка сообщения.

link Optional[LinkedMessage]

Связанное сообщение. Может быть None.

body Optional[MessageBody]

Содержимое сообщения. Текст + вложения. Может быть null, если сообщение содержит только пересланное сообщение

stat Optional[MessageStat]

Статистика сообщения. Может быть None.

url Optional[str]

URL сообщения. Может быть None.

bot Optional[Bot]

Объект бота, исключается из сериализации.

answer(text=None, attachments=None, link=None, notify=None, parse_mode=None, sleep_after_input_media=True) async

Отправляет сообщение (автозаполнение chat_id, user_id).

Parameters:

Name Type Description Default
text str

Текст ответа. Может быть None.

None
attachments List[Attachment | InputMedia | InputMediaBuffer | AttachmentUpload]

Список вложений. Может быть None.

None
link NewMessageLink

Связь с другим сообщением. Может быть None.

None
notify bool

Флаг отправки уведомления. По умолчанию True.

None
parse_mode ParseMode

Режим форматирования текста. Может быть None.

None

Returns:

Type Description
Optional['SendedMessage']

Optional[SendedMessage]: Результат выполнения метода send_message бота.

Source code in maxapi/types/message.py
async def answer(
    self,
    text: Optional[str] = None,
    attachments: Optional[
        List[Attachment | InputMedia | InputMediaBuffer | AttachmentUpload]
    ] = None,
    link: Optional[NewMessageLink] = None,
    notify: Optional[bool] = None,
    parse_mode: Optional[ParseMode] = None,
    sleep_after_input_media: Optional[bool] = True,
) -> Optional["SendedMessage"]:
    """
    Отправляет сообщение (автозаполнение chat_id, user_id).

    Args:
        text (str, optional): Текст ответа. Может быть None.
        attachments (List[Attachment | InputMedia | InputMediaBuffer | AttachmentUpload], optional): Список вложений. Может быть None.
        link (NewMessageLink, optional): Связь с другим сообщением. Может быть None.
        notify (bool): Флаг отправки уведомления. По умолчанию True.
        parse_mode (ParseMode, optional): Режим форматирования текста. Может быть None.

    Returns:
        Optional[SendedMessage]: Результат выполнения метода send_message бота.
    """

    return await self._ensure_bot().send_message(
        chat_id=self.recipient.chat_id,
        user_id=self.recipient.user_id,
        text=text,
        attachments=attachments,
        link=link,
        notify=notify,
        parse_mode=parse_mode,
        sleep_after_input_media=sleep_after_input_media,
    )
reply(text=None, attachments=None, notify=None, parse_mode=None, sleep_after_input_media=True) async

Отправляет ответное сообщение (автозаполнение chat_id, user_id, link).

Parameters:

Name Type Description Default
text str

Текст ответа. Может быть None.

None
attachments List[Attachment | InputMedia | InputMediaBuffer | AttachmentUpload]

Список вложений. Может быть None.

None
notify bool

Флаг отправки уведомления. По умолчанию True.

None
parse_mode ParseMode

Режим форматирования текста. Может быть None.

None
sleep_after_input_media Optional[bool]

Optional[bool] = True,

True

Returns:

Type Description
Optional['SendedMessage']

Optional[SendedMessage]: Результат выполнения метода send_message бота.

Source code in maxapi/types/message.py
async def reply(
    self,
    text: Optional[str] = None,
    attachments: Optional[
        List[Attachment | InputMedia | InputMediaBuffer | AttachmentUpload]
    ] = None,
    notify: Optional[bool] = None,
    parse_mode: Optional[ParseMode] = None,
    sleep_after_input_media: Optional[bool] = True,
) -> Optional["SendedMessage"]:
    """
    Отправляет ответное сообщение (автозаполнение chat_id, user_id, link).

    Args:
        text (str, optional): Текст ответа. Может быть None.
        attachments (List[Attachment | InputMedia | InputMediaBuffer | AttachmentUpload], optional): Список вложений. Может быть None.
        notify (bool): Флаг отправки уведомления. По умолчанию True.
        parse_mode (ParseMode, optional): Режим форматирования текста. Может быть None.
        sleep_after_input_media: Optional[bool] = True,

    Returns:
        Optional[SendedMessage]: Результат выполнения метода send_message бота.
    """

    if self.body is None:
        msg = "Невозможно ответить: поле body отсутствует у сообщения"
        raise ValueError(msg)

    if self.recipient.chat_id is None:
        msg = "Невозможно ответить: chat_id отсутствует"
        raise ValueError(msg)

    return await self._ensure_bot().send_message(
        chat_id=self.recipient.chat_id,
        user_id=self.recipient.user_id,
        text=text,
        attachments=attachments,
        link=NewMessageLink(type=MessageLinkType.REPLY, mid=self.body.mid),
        notify=notify,
        parse_mode=parse_mode,
        sleep_after_input_media=sleep_after_input_media,
    )
forward(chat_id, user_id=None, attachments=None, notify=None, parse_mode=None, sleep_after_input_media=True) async

Пересылает отправленное сообщение в указанный чат (автозаполнение link).

Parameters:

Name Type Description Default
chat_id int

ID чата для отправки (обязателен, если не указан user_id)

required
user_id int

ID пользователя для отправки (обязателен, если не указан chat_id). По умолчанию None

None
attachments List[Attachment | InputMedia | InputMediaBuffer | AttachmentUpload]

Список вложений. Может быть None.

None
notify bool

Флаг отправки уведомления. По умолчанию True.

None
parse_mode ParseMode

Режим форматирования текста. Может быть None.

None
sleep_after_input_media Optional[bool]

Optional[bool] = True,

True

Returns:

Type Description
Optional['SendedMessage']

Optional[SendedMessage]: Результат выполнения метода send_message бота.

Source code in maxapi/types/message.py
async def forward(
    self,
    chat_id: Optional[int],
    user_id: Optional[int] = None,
    attachments: Optional[
        List[
            Union[
                Attachment, InputMedia, InputMediaBuffer, AttachmentUpload
            ]
        ]
    ] = None,
    notify: Optional[bool] = None,
    parse_mode: Optional[ParseMode] = None,
    sleep_after_input_media: Optional[bool] = True,
) -> Optional["SendedMessage"]:
    """
    Пересылает отправленное сообщение в указанный чат (автозаполнение link).

    Args:
        chat_id (int): ID чата для отправки (обязателен, если не указан user_id)
        user_id (int): ID пользователя для отправки (обязателен, если не указан chat_id). По умолчанию None
        attachments (List[Attachment | InputMedia | InputMediaBuffer | AttachmentUpload], optional): Список вложений. Может быть None.
        notify (bool): Флаг отправки уведомления. По умолчанию True.
        parse_mode (ParseMode, optional): Режим форматирования текста. Может быть None.
        sleep_after_input_media: Optional[bool] = True,

    Returns:
        Optional[SendedMessage]: Результат выполнения метода send_message бота.
    """

    if self.body is None:
        msg = "Невозможно переслать: поле body отсутствует у сообщения"
        raise ValueError(msg)

    return await self._ensure_bot().send_message(
        chat_id=chat_id,
        user_id=user_id,
        attachments=attachments,
        link=NewMessageLink(
            type=MessageLinkType.FORWARD, mid=self.body.mid
        ),
        notify=notify,
        parse_mode=parse_mode,
        sleep_after_input_media=sleep_after_input_media,
    )
edit(text=None, attachments=None, link=None, notify=True, parse_mode=None, sleep_after_input_media=True) async

Редактирует текущее сообщение.

Parameters:

Name Type Description Default
text str

Новый текст сообщения. Может быть None.

None
attachments List[Attachment | InputMedia | InputMediaBuffer | AttachmentUpload]

Новые вложения. Может быть None.

None
link NewMessageLink

Новая связь с сообщением. Может быть None.

None
notify bool

Флаг отправки уведомления. По умолчанию True.

True
parse_mode ParseMode

Режим форматирования текста. Может быть None.

None

Returns:

Type Description
Optional['EditedMessage']

Optional[EditedMessage]: Результат выполнения метода edit_message бота.

Source code in maxapi/types/message.py
async def edit(
    self,
    text: Optional[str] = None,
    attachments: Optional[
        List[Attachment | InputMedia | InputMediaBuffer | AttachmentUpload]
        | List[Attachments]
    ] = None,
    link: Optional[NewMessageLink] = None,
    notify: bool = True,
    parse_mode: Optional[ParseMode] = None,
    sleep_after_input_media: Optional[bool] = True,
) -> Optional["EditedMessage"]:
    """
    Редактирует текущее сообщение.

    Args:
        text (str, optional): Новый текст сообщения. Может быть None.
        attachments (List[Attachment | InputMedia | InputMediaBuffer | AttachmentUpload], optional): Новые вложения. Может быть None.
        link (NewMessageLink, optional): Новая связь с сообщением. Может быть None.
        notify (bool): Флаг отправки уведомления. По умолчанию True.
        parse_mode (ParseMode, optional): Режим форматирования текста. Может быть None.

    Returns:
        Optional[EditedMessage]: Результат выполнения метода edit_message бота.
    """

    if link is None and self.link:
        link = NewMessageLink(
            type=self.link.type, mid=self.link.message.mid
        )

    if attachments is None:
        if self.body is not None and self.body.attachments:
            attachments = self.body.attachments

    if self.body is None:
        msg = "Невозможно редактировать: поле body отсутствует у сообщения"
        raise ValueError(msg)

    return await self._ensure_bot().edit_message(
        message_id=self.body.mid,
        text=text,
        attachments=attachments,
        link=link,
        notify=notify,
        parse_mode=parse_mode,
        sleep_after_input_media=sleep_after_input_media,
    )
delete() async

Удаляет текущее сообщение.

Returns:

Name Type Description
DeletedMessage 'DeletedMessage'

Результат выполнения метода delete_message бота.

Source code in maxapi/types/message.py
async def delete(self) -> "DeletedMessage":
    """
    Удаляет текущее сообщение.

    Returns:
        DeletedMessage: Результат выполнения метода delete_message бота.
    """

    if self.body is None:
        msg = "Невозможно удалить: поле body отсутствует у сообщения"
        raise ValueError(msg)

    return await self._ensure_bot().delete_message(
        message_id=self.body.mid,
    )
pin(notify=True) async

Закрепляет текущее сообщение в чате.

Parameters:

Name Type Description Default
notify bool

Флаг отправки уведомления. По умолчанию True.

True

Returns:

Name Type Description
PinnedMessage 'PinnedMessage'

Результат выполнения метода pin_message бота.

Source code in maxapi/types/message.py
async def pin(self, notify: bool = True) -> "PinnedMessage":
    """
    Закрепляет текущее сообщение в чате.

    Args:
        notify (bool): Флаг отправки уведомления. По умолчанию True.

    Returns:
        PinnedMessage: Результат выполнения метода pin_message бота.
    """

    if self.body is None:
        msg = "Невозможно закрепить: поле body отсутствует у сообщения"
        raise ValueError(msg)

    if self.recipient.chat_id is None:
        raise ValueError("chat_id не может быть None")

    return await self._ensure_bot().pin_message(
        chat_id=self.recipient.chat_id,
        message_id=self.body.mid,
        notify=notify,
    )

Messages

Bases: BaseModel

Модель списка сообщений.

Attributes:

Name Type Description
messages List[Message]

Список сообщений.

bot Optional[Bot]

Объект бота, исключается из сериализации.

Bases: BaseModel

Модель ссылки на новое сообщение.

Attributes:

Name Type Description
type MessageLinkType

Тип связи.

mid str

Идентификатор сообщения.

subscription

Subscription

Bases: BaseModel

Подписка для вебхука

Attributes:

Name Type Description
url str

URL вебхука

time int

Unix-время, когда была создана подписка

update_types List[str]

Типы обновлений, на которые подписан бот

updates

bot_added

BotAdded

Bases: Update

Обновление, сигнализирующее о добавлении бота в чат.

Attributes:

Name Type Description
chat_id int

Идентификатор чата, куда добавлен бот.

user User

Объект пользователя-бота.

is_channel bool

Указывает, был ли бот добавлен в канал или нет

bot_removed

BotRemoved

Bases: Update

Обновление, сигнализирующее об удалении бота из чата.

Attributes:

Name Type Description
chat_id int

Идентификатор чата, из которого удалён бот.

user User

Объект пользователя-бота.

is_channel bool

Указывает, был ли пользователь добавлен в канал или нет

bot_started

BotStarted

Bases: Update

Обновление, сигнализирующее о первом старте бота.

Attributes:

Name Type Description
chat_id int

Идентификатор чата.

user User

Пользователь (бот).

user_locale Optional[str]

Локаль пользователя.

payload Optional[str]

Дополнительные данные.

bot_stopped

BotStopped

Bases: Update

Обновление, сигнализирующее об остановке бота.

Attributes:

Name Type Description
chat_id int

Идентификатор чата.

user User

Пользователь (бот).

user_locale Optional[str]

Локаль пользователя.

payload Optional[str]

Дополнительные данные.

chat_title_changed

ChatTitleChanged

Bases: Update

Обновление, сигнализирующее об изменении названия чата.

Attributes:

Name Type Description
chat_id Optional[int]

Идентификатор чата.

user User

Пользователь, совершивший изменение.

title str

Новое название чата.

dialog_cleared

DialogCleared

Bases: Update

Обновление, сигнализирующее об очистке диалога с ботом.

Attributes:

Name Type Description
chat_id int

Идентификатор чата.

user User

Пользователь (бот).

user_locale Optional[str]

Локаль пользователя.

dialog_muted

DialogMuted

Bases: Update

Обновление, сигнализирующее об отключении оповещений от бота.

Attributes:

Name Type Description
chat_id int

Идентификатор чата.

muted_until int

Время до включения оповещений от бота.

user User

Пользователь (бот).

user_locale Optional[str]

Локаль пользователя.

dialog_removed

DialogRemoved

Bases: Update

Обновление, сигнализирующее об удалении диалога с ботом.

Attributes:

Name Type Description
chat_id int

Идентификатор чата.

user User

Пользователь (бот).

user_locale Optional[str]

Локаль пользователя.

dialog_unmuted

DialogUnmuted

Bases: Update

Обновление, сигнализирующее о включении оповещений от бота.

Attributes:

Name Type Description
chat_id int

Идентификатор чата.

user User

Пользователь (бот).

user_locale Optional[str]

Локаль пользователя.

message_callback

MessageForCallback

Bases: BaseModel

Модель сообщения для ответа на callback-запрос.

Attributes:

Name Type Description
text Optional[str]

Текст сообщения.

attachments Optional[List[Union[AttachmentButton, Audio, Video, File, Image, Sticker, Share]]]

Список вложений.

link Optional[NewMessageLink]

Связь с другим сообщением.

notify Optional[bool]

Отправлять ли уведомление.

format Optional[ParseMode]

Режим разбора текста.

MessageCallback

Bases: Update

Обновление с callback-событием сообщения.

Attributes:

Name Type Description
message Optional[Message]

Изначальное сообщение, содержащее встроенную клавиатуру. Может быть null, если оно было удалено к моменту, когда бот получил это обновление.

user_locale Optional[str]

Локаль пользователя.

callback Callback

Объект callback.

get_ids()

Возвращает кортеж идентификаторов (chat_id, user_id).

Returns:

Type Description
Tuple[Optional[int], int]

tuple[Optional[int], int]: Идентификаторы чата и пользователя.

Source code in maxapi/types/updates/message_callback.py
def get_ids(self) -> Tuple[Optional[int], int]:
    """
    Возвращает кортеж идентификаторов (chat_id, user_id).

    Returns:
        tuple[Optional[int], int]: Идентификаторы чата и пользователя.
    """

    chat_id: Optional[int] = None
    if self.message is not None:
        chat_id = self.message.recipient.chat_id

    return chat_id, self.callback.user.user_id
answer(notification=None, new_text=None, link=None, notify=True, format=None, raise_if_not_exists=True) async

Отправляет ответ на callback с возможностью изменить текст, вложения и параметры уведомления.

Parameters:

Name Type Description Default
notification str

Текст уведомления.

None
new_text Optional[str]

Новый текст сообщения.

None
link Optional[NewMessageLink]

Связь с другим сообщением.

None
notify bool

Отправлять ли уведомление.

True
format Optional[ParseMode]

Режим разбора текста.

None
raise_if_not_exists bool

Выдавать ошибку при отсутствии сообщения, если пытаются изменить его содержимое (new_text/link/format).

True

Returns:

Name Type Description
SendedCallback SendedCallback

Результат вызова send_callback бота.

Source code in maxapi/types/updates/message_callback.py
async def answer(
    self,
    notification: Optional[str] = None,
    new_text: Optional[str] = None,
    link: Optional[NewMessageLink] = None,
    notify: bool = True,
    format: Optional[ParseMode] = None,
    raise_if_not_exists: bool = True,
) -> "SendedCallback":
    """
    Отправляет ответ на callback с возможностью изменить текст, вложения и параметры уведомления.

    Args:
        notification (str): Текст уведомления.
        new_text (Optional[str]): Новый текст сообщения.
        link (Optional[NewMessageLink]): Связь с другим сообщением.
        notify (bool): Отправлять ли уведомление.
        format (Optional[ParseMode]): Режим разбора текста.
        raise_if_not_exists: Выдавать ошибку при отсутствии сообщения,
            если пытаются изменить его содержимое (new_text/link/format).

    Returns:
        SendedCallback: Результат вызова send_callback бота.
    """

    # Если исходного сообщения нет (например, оно удалено), не стоит синтезировать
    # пустой payload message. Два варианта поведения:
    #  - если вызывающий просит изменить сообщение (new_text/link/format)
    #    => выбросить исключение
    #  - иначе отправить только notification с message=None, чтобы API не получил
    #    пустой объект message
    original_body = None
    if self.message is not None:
        original_body = self.message.body

    if original_body is None:
        # если пытаются изменить контент/вложение/связь
        if raise_if_not_exists and (
            new_text is not None or link is not None or format is not None
        ):
            raise ValueError(
                "Невозможно изменить сообщение: исходное сообщение отсутствует"
            )

        # отправляем только уведомление (без поля message)
        return await self._ensure_bot().send_callback(
            callback_id=self.callback.callback_id,
            message=None,
            notification=notification,
        )

    # Если исходное сообщение есть — собираем MessageForCallback на его основе
    message_for_callback = MessageForCallback()
    message_for_callback.text = new_text

    attachments: List[Attachments] = original_body.attachments or []

    message_for_callback.attachments = attachments
    message_for_callback.link = link
    message_for_callback.notify = notify
    message_for_callback.format = format

    return await self._ensure_bot().send_callback(
        callback_id=self.callback.callback_id,
        message=message_for_callback,
        notification=notification,
    )

message_chat_created

MessageChatCreated(**data)

Bases: Update

.. deprecated:: 0.9.14 Это событие устарело и будет удалено в будущих версиях.

Событие создания чата.

Attributes:

Name Type Description
chat Chat

Объект чата.

title Optional[str]

Название чата.

message_id Optional[str]

ID сообщения.

start_payload Optional[str]

Payload для старта.

Source code in maxapi/types/updates/message_chat_created.py
def __init__(self, **data):
    super().__init__(**data)
    warnings.warn(
        "MessageChatCreated устарел и будет удален в будущих версиях.",
        DeprecationWarning,
        stacklevel=2,
    )

message_created

MessageCreated

Bases: Update

Обновление, сигнализирующее о создании нового сообщения.

Attributes:

Name Type Description
message Message

Объект сообщения.

user_locale Optional[str]

Локаль пользователя.

get_ids()

Возвращает кортеж идентификаторов (chat_id, user_id).

Returns:

Type Description
Tuple[Optional[int], Optional[int]]

tuple[Optional[int], Optional[int]]: Идентификатор чата и пользователя.

Source code in maxapi/types/updates/message_created.py
def get_ids(self) -> Tuple[Optional[int], Optional[int]]:
    """
    Возвращает кортеж идентификаторов (chat_id, user_id).

    Returns:
        tuple[Optional[int], Optional[int]]: Идентификатор чата и пользователя.
    """

    chat_id = self.message.recipient.chat_id
    user_id = self.message.sender.user_id if self.message.sender else None
    return (chat_id, user_id)

message_edited

MessageEdited

Bases: Update

Обновление, сигнализирующее об изменении сообщения.

Attributes:

Name Type Description
message Message

Объект измененного сообщения.

get_ids()

Возвращает кортеж идентификаторов (chat_id, user_id).

Returns:

Type Description
Tuple[Optional[int], Optional[int]]

Tuple[Optional[int], Optional[int]]: Идентификаторы чата и пользователя.

Source code in maxapi/types/updates/message_edited.py
def get_ids(self) -> Tuple[Optional[int], Optional[int]]:
    """
    Возвращает кортеж идентификаторов (chat_id, user_id).

    Returns:
        Tuple[Optional[int], Optional[int]]: Идентификаторы чата и пользователя.
    """

    return (self.message.recipient.chat_id, self.message.recipient.user_id)

message_removed

MessageRemoved

Bases: Update

Класс для обработки события удаления сообщения в чате.

Attributes:

Name Type Description
message_id str

Идентификатор удаленного сообщения. Может быть None.

chat_id int

Идентификатор чата. Может быть None.

user_id int

Идентификатор пользователя. Может быть None.

get_ids()

Возвращает кортеж идентификаторов (chat_id, user_id).

Returns:

Type Description
Tuple[Optional[int], Optional[int]]

Tuple[Optional[int], Optional[int]]: Идентификаторы чата и пользователя.

Source code in maxapi/types/updates/message_removed.py
def get_ids(self) -> Tuple[Optional[int], Optional[int]]:
    """
    Возвращает кортеж идентификаторов (chat_id, user_id).

    Returns:
        Tuple[Optional[int], Optional[int]]: Идентификаторы чата и пользователя.
    """

    return (self.chat_id, self.user_id)

update

Update

Bases: BaseModel, BotMixin

Базовая модель обновления.

Attributes:

Name Type Description
update_type UpdateType

Тип обновления.

timestamp int

Временная метка обновления.

user_added

UserAdded

Bases: Update

Класс для обработки события добавления пользователя в чат.

Attributes:

Name Type Description
inviter_id int

Идентификатор пользователя, добавившего нового участника. Может быть None.

chat_id int

Идентификатор чата. Может быть None.

user User

Объект пользователя, добавленного в чат.

is_channel bool

Указывает, был ли пользователь добавлен в канал или нет

get_ids()

Возвращает кортеж идентификаторов (chat_id, user_id).

Returns:

Type Description
Tuple[Optional[int], Optional[int]]

Tuple[Optional[int], Optional[int]]: Идентификаторы чата и пользователя.

Source code in maxapi/types/updates/user_added.py
def get_ids(self) -> Tuple[Optional[int], Optional[int]]:
    """
    Возвращает кортеж идентификаторов (chat_id, user_id).

    Returns:
        Tuple[Optional[int], Optional[int]]: Идентификаторы чата и пользователя.
    """

    return (self.chat_id, self.inviter_id)

user_removed

UserRemoved

Bases: Update

Класс для обработки события выходе/удаления пользователя из чата.

Attributes:

Name Type Description
admin_id Optional[int]

Идентификатор администратора, удалившего пользователя. None при выходе из чата самим пользователем.

chat_id int

Идентификатор чата. Может быть None.

user User

Объект пользователя, удаленного из чата.

is_channel bool

Указывает, был ли пользователь удален из канала или нет

get_ids()

Возвращает кортеж идентификаторов (chat_id, user_id).

Returns:

Type Description
Tuple[Optional[int], Optional[int]]

Tuple[Optional[int], Optional[int]]: Идентификаторы чата и пользователя.

Source code in maxapi/types/updates/user_removed.py
def get_ids(self) -> Tuple[Optional[int], Optional[int]]:
    """
    Возвращает кортеж идентификаторов (chat_id, user_id).

    Returns:
        Tuple[Optional[int], Optional[int]]: Идентификаторы чата и пользователя.
    """

    return (self.chat_id, self.admin_id)

users

User

Bases: BaseModel

Модель пользователя.

Attributes:

Name Type Description
user_id int

Уникальный идентификатор пользователя.

first_name str

Имя пользователя.

last_name Optional[str]

Фамилия пользователя. Может быть None.

username Optional[str]

Имя пользователя (ник). Может быть None.

is_bot bool

Флаг, указывающий, является ли пользователь ботом.

last_activity_time int

Временная метка последней активности.

description Optional[str]

Описание пользователя. Может быть None.

avatar_url Optional[str]

URL аватара пользователя. Может быть None.

full_avatar_url Optional[str]

URL полного аватара пользователя. Может быть None.

commands Optional[List[BotCommand]]

Список команд бота. Может быть None.

ChatAdmin

Bases: BaseModel

Модель администратора чата.

Attributes:

Name Type Description
user_id int

Уникальный идентификатор администратора.

permissions List[ChatPermission]

Список разрешений администратора.