Payload-типы
До этого момента функции-обработчики наших реакций не имели никаких аргументов, однако, они это могут. Но вот вопрос — как Reaction
узнает, чем должны быть аргументы и что вообще они могут содержать, да и в принципе, нужны ли они? Ответ убил прост — да, с помощью аннотационных типов можно, например, получить объект сообщения, пользователя, отправившего это сообщения, список с фотографиями из сообщения, объект, позволяющий вызывать методы вк, вообще, что угодно, не проводя лишнюю возню с API. Допустим, мы хотим узнать время отправки сообщения, как это сделать? Перейдем к примеру
Создадим команду get_time
в боте, а в src/get_time/main.py
вставим следующее
from datetime import datetime
import vkquick as vq
@vq.Reaction("message_new")
def get_time(event: vq.Event()):
time = datetime.fromtimestamp(
event.object.message.date
)
return f"Время отправки: {time:%H:%M}"
После чего запускаем бота через $ bot run --reload --debug
, переходим к нему в лс и пишем любое сообщение, на что бот нам пришлет его время отправки. Вуа-ля!
Рассмотрим то, что мы написали в аргументах. Функция get_time
принимает в свой единственный аргумент event
объект события нового сообщения (message_new
), где в event.object.message
хранится информация о самом сообщении, одно из полей которого — date
, содержащее время отправки сообщения в timestamp. После чего с помощью модуля datetime
мы превращаем datetime в human-вид, оставляя часы и минуты в процессе интерполяции в f-строку.
Нам потребовалось реализовать в логике всего пару физических строк, остальное взял на себя vkquick
Note
Обратите внимание на скобки у vq.Event
. Для каждого payload-типа они обязательны, кроме нескольких исключений: vq.API
, vq.Bot
и аллиасные типы для аргументов текстовой команды, о которых речь пойдет позже
Payload-типы из коробки¶
Каждый тип доступен из модуля через обращение по точке, т.е. vq.Event
, vq.Sender
Event
¶
Возвращает объект пришедшего события. Само по себе событие это словарь, но с помощью attrdict
вы можете получать ключи через точку. О всех событиях и их структуре можно почитать здесь. Не принимает аргументов при вызове
Sender
¶
Возвращает свой объект пользователя vq.User
, отправившего сообщение, с полями быстрого доступа и собственным форматированием. Принимает список *аргсов для fields
параметра в users.get
и аргумент name_case
для определения падежа имени и фамилии, тобишь vq.Sender("bdate")
вернет пользователя
Example
Если написать боту myname
, то он вернет имя пользователя, отправившего сообщение
import vkquick as vq
@vq.Cmd(names=["myname"])
@vq.Reaction("message_new")
def get_name(sender: vq.Sender()):
return sender.fn # fn это first_name
RepliedUser
¶
Возвращает пользователя vq.User
из пересланного сообщения, если таковой имеется, иначе None
. Принимает аналогичные для Sender
поля
FwdUsers
¶
Возвращает список из пользователей vq.User
, попавших в пересланные сообщения (на самом верхнем уровне глубины). Переданные поля для fields
и name_case
добудутся для каждого из пользователей
ClientInfo
¶
Возвращает информацию о клиенте по доступным возможностям (может ли он работать с клаиватурой, с каруселями, какие кнопки поддерживает и прочее). Просто быстрый доступ к event.object.client_info
API
и Bot
¶
Сессионные объекты, поэтому для того, чтобы получить их в аннотациях, скобки ставить не нужно. Их описание находится на отдельной странице
CallbackAnswer
¶
Используйте для ответа на нажатие callback-кнопки. Примеры использования есть в разделе Быстрые ответы
GroupID
¶
Возращает ID группы из поля group_id
пришедшего события. Такое же значение находится под полем api.group_id.
в config.toml
ChatID
¶
ID чата. Для бесед peer_id - 2_000_000_000
, для диалогов с пользователем или сообществом — ID пользователя/сообщества
PeerID
¶
ID диалога. Для бесед > 2_000_000_000
Message
¶
Используйте для отправки нескольких сообщений, либо выполнения какого-либо кода. Примеры использования есть в разделе Быстрые ответы
Кастомный тип¶
Для того, чтобы создать свой аннотационный тип, унаследуйтесь от базового класса для всех аннотаций vq.Annotype
. После чего нужно будет переопределить абстрактный async/sync метод prepare
. Именно он вызывается у payload-типа для определения значения аргумента. Метод принимает в себя следующие параметры:
Имя | Тип | Описание |
---|---|---|
argname |
str | Имя аргумента, на которое будет передано значение |
event |
vq.Event (почти тот же самый attrdict.AttrMap) | Объект события LongPoll |
func |
function/coroutine function | Функция-обработчик |
bin_stack |
type | Пустышка. Создается для каждого отдельного вызова какой-либо команды и живет пока происходит валидация, подготовка аннотипов и вызов обработчика. Используйте для своих каких-то дополнительных параметров, чтобы избежать гонку данных |