vkquick icon indicating copy to clipboard operation
vkquick copied to clipboard

Новый app-стиль

Open deknowny opened this issue 3 years ago • 3 comments

Новый app-стиль заключается в семантике обработки события и работы с командами в целом. Если раньше команды были наследниками обработчика событий, то теперь это независимые сущности, потому что как такового обработчика событий больше нет. Ниже я приведу примеры использования

deknowny avatar Apr 27 '21 20:04 deknowny

import vkquick as vq

app = vq.App("token")


@app.command("hi", "hello")
async def hi():
    return "Good evening!"


app.run()

deknowny avatar Apr 27 '21 20:04 deknowny

Естественно, затронуты и контекстные хранилища. В процессе размышлений я пришел к выводу, что информация об обработке события, в целом, не нужна вовсе. Это настолько 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}!"
    )

deknowny avatar Apr 27 '21 20:04 deknowny

Очень важно сказать, что логика App целиком и полностью определена именно в расширении для чат-ботов, т.е. сырой квик содержит функционал исключительно для получения новых событий и для удобного вызова API запросов

К возможностям App и методам в нем реализованным относятся:

  • .command(): Команда
  • .on_event(): Обработчик события
  • .on_message(): Обработчик сообщения (отличается контекстом)
  • .startup() & .shutdown(): Обработчики сигналов
  • .on_callback_button(): Обработка события нажатой кнопки с типом callback
  • .middleware(): Добавляет мидлвар. Логика мидлваров тоже поменялась -- теперь их можно писать одной функцией без каких либо классов

Стоит отметить небольшую деталь реализации -- все вышеперечисленные методы наследуются от Package. Пакет -- своего рода блупринт, который можно скормить приложению. Пакет может иметь свои мидлвары, свои сигналы и другое, что будет привязанно конкретно к этому пакеты и обработчикам/командам, привязанных к нему. Распространенной практикуй будет создание пакета в каком-либо файле, который впоследствии будет импортирован в основной, где уже будет подключаться к инстансу приложения. Если объектов пакета может быть много, то вот приложения -- один

deknowny avatar Apr 27 '21 20:04 deknowny