Быстрые ответы
Если вы уже работали с другими библиотеками для разработки под VK API (например, vk_api
или vk
), то скорее всего вы уже сталкивались с проблемой лишнего кода, чтобы банально отправить сообщение, нужно каждый раз писать messages.send
и назначать random_id
в случайное число или 0, а peer_id
в event.object.message.peer_id
. В общем, ужас. Команда, которая имеет несколько вариантов ответа разрастается до вселенских маштабов, и зачастую приходится писать свои функции-обертки, но в большинстве случаев работают они костыльно, поэтому vkquick предлагает свое решение этой проблемы
return-схема¶
Если вам нужно отправить сообщение в тот же самый диалог/беседу, откуда оно пришло — можете просто вернуть его. Помимо текста, можно вернуть vq.Message
, который содержит в себе все поля метода messages.send
и также автоматически выставляет peer_id
в event.object.message.peer_id
Example
Просто ответить пользователю
return "Lorem ipsum"
Example
Вам нужно отключить пуш от упоминаний в сообщений, которое отпарвляете (тобишь кейс, где нужно передать некоторые поля messages.send
)
return vq.Message(
"Lorem ipsum and [id1|push]",
disable_mentions=True
)
yield-схема¶
Предположим, что вы возвращаете какой-то список, и вместо того, чтобы складывать текст, вы можете просто yield'ить его.
Example
Список продуктов в столбик
import vkquick as vq
@vq.Cmd(names=["fruits"])
@vq.Reaction("message_new")
def fruits():
yield "Apple\n"
yield "Orange\n"
yield "Banana"
import vkquick as vq
@vq.Cmd(names=["fruits"])
@vq.Reaction("message_new")
def fruits():
return "Apple\nOrange\nBanana"
Example
Возращает имена всех пользователей из пересланных сообщений
import vkquick as vq
@vq.Cmd(names=["fdws"])
@vq.Reaction("message_new")
def fws_names(users: vq.FwdUsers()):
for ind, user in enumerate(users, 1):
yield f"{ind}) {user:<fn> <ln>}\n"
import vkquick as vq
@vq.Cmd(names=["fdws"])
@vq.Reaction("message_new")
def fws_names(users: vq.FwdUsers()):
text = ""
for ind, user in enumerate(users, 1):
text += f"{ind}) {user:<fn> <ln>}\n"
return text
Note
Вы не можете использовать yield вместе с vq.Message
или return
Отправка сразу¶
Вы также можете отправить сообщение внутри реакции сразу и продолжить выполнять какой-то код, предварительно используя vq.Message()
как payload-тип
import vkquick as vq
@vq.Reaction("message_new")
async def foo(answer: vq.Message()):
"""
Отправит 3 сообщения
"""
await answer("Lorem ipsum", disable_mentions=True)
await answer("Ipsum lorem", keyboard=vq.Keyboard.empty())
return vq.Message("Star it pls: https://github.com/Rhinik/vkquick")
Однако, вы все еще можете использовать "ручное" управление и отправить сообщение по старинке
import vkquick as vq
@vq.Cmd(names=["hi"])
@vq.Reaction("message_new")
async def hello(api: vq.API, event: vq.Event()):
await api.messages.send(
peer_id=event.object.message.peer_id,
message="hello",
random_id=vq.random_id()
)
# Doing smth
Tip
Для сообщений, отправленных от лица пользователя (хотя vkquick не подразумевает создание юзерботов) вручную, можете использовать функцию random_id
, опционально принимающая диапазон генерируемого ±
числа
Ответ на нажатие callback-кнопки¶
Вместо вызова messages.sendMessageEventAnswer
вы можете использовать payload-аргумент CallbackAnswer
. Вызовите метод, соответствующий типу события, которое должно случиться и передайте соответствующие аргументы
Всевозможные типы
show_snackbar
open_link
open_app
принимает в себя соответствующие аргументы, требуемые для поля event_data
Example
import vkquick as vq
@vq.Reaction("message_event")
async def callback_handler(
cbanswer: vq.CallbackAnswer()
):
await cbanswer.show_snackbar("Lorem ipsum")