vkquick
vkquick copied to clipboard
Новый app-стиль
Новый app-стиль заключается в семантике обработки события и работы с командами в целом. Если раньше команды были наследниками обработчика событий, то теперь это независимые сущности, потому что как такового обработчика событий больше нет. Ниже я приведу примеры использования
import vkquick as vq
app = vq.App("token")
@app.command("hi", "hello")
async def hi():
return "Good evening!"
app.run()
Естественно, затронуты и контекстные хранилища. В процессе размышлений я пришел к выводу, что информация об обработке события, в целом, не нужна вовсе. Это настолько low-level, что легче будет свою либу написать, что подстраивать функционал под эти данные. Теперь есть просто NewEvent
, который содержит объект события и объект бота (сущность бота создается во время запуска приложения, что позволяет удобным образом запускать мультиботов, но об этом позже) и NewMessage
. Первый для обработчиков событий, другой для команд и обработчиков сообщений. Да, появился новый тип хэндлера. Фактически, его логика та же, что и у Command из б7 с флагом any_text=True
. Честно, названия для этих, фактически, хранилищ, я не придумал. Может, оставлю их контекстами
import vkquick as vq
app = vq.App("token")
@app.on_event()
async def wall_post_new(ctx: vq.NewEvent):
print(f"New post at {ctx.event.date}")
@app.on_message()
async def message_log(ctx: vq.NewMessage):
sender = await ctx.mp.fetch_sender()
print(
f"New message from {sender.fullname} "
f"with text {ctx.msg.text}!"
)
Очень важно сказать, что логика App целиком и полностью определена именно в расширении для чат-ботов, т.е. сырой квик содержит функционал исключительно для получения новых событий и для удобного вызова API запросов
К возможностям App и методам в нем реализованным относятся:
-
.command()
: Команда -
.on_event()
: Обработчик события -
.on_message()
: Обработчик сообщения (отличается контекстом) -
.startup()
&.shutdown()
: Обработчики сигналов -
.on_callback_button()
: Обработка события нажатой кнопки с типомcallback
-
.middleware()
: Добавляет мидлвар. Логика мидлваров тоже поменялась -- теперь их можно писать одной функцией без каких либо классов
Стоит отметить небольшую деталь реализации -- все вышеперечисленные методы наследуются от Package
. Пакет -- своего рода блупринт, который можно скормить приложению. Пакет может иметь свои мидлвары, свои сигналы и другое, что будет привязанно конкретно к этому пакеты и обработчикам/командам, привязанных к нему. Распространенной практикуй будет создание пакета в каком-либо файле, который впоследствии будет импортирован в основной, где уже будет подключаться к инстансу приложения. Если объектов пакета может быть много, то вот приложения -- один