ekonda / kutana

The library for developing systems for messengers and social networks
MIT License
72 stars 17 forks source link

[Вопрос] Ожидаемая кнопка #57

Closed daeeros closed 3 years ago

daeeros commented 3 years ago

Приветствую, такой вопрос возник, к примеру у нас есть куча кнопок по типу u_1_2, u_0_6, u_9_1 и тд, такой вопрос, как можно вызвать vk.on_payload что бы он откликался на все кнопки которые начинаются допустим в нашем примере на u_?

michaelkryukov commented 3 years ago

Добрый день!

Мне кажется, этот вопрос сводится к тому, как можно с помощью обработчика vk.on_payloads принимать полезную информацию, только часть которой предопределена. Т.е. строку u_1_2 наверняка можно задать как JSON объект {"kind": "u", "meta1": 1, "meta2": 2}. И тогда достаточно научить обработчик передавать на обработку события, у которых (как минимум) поле kind содержит именно u. Это похоже на качественное решение этого вопроса.

Пример плагина, который демонстрирует описанный мной подход. Тут три кнопки, две из которых обрабатываются одним обработчиком, а третья - другим. При этом сама полезная нагрузка (за исключением поля "kind") может содержать любые данные.

import json
from kutana import Plugin

plugin = Plugin("kb")

@plugin.vk.on_payloads([{"kind": "1"}])
async def __(msg, ctx):
    await ctx.reply(f"Handler for kind (1), your meta is '{ctx.payload['meta']}'")

@plugin.vk.on_payloads([{"kind": "2"}])
async def __(msg, ctx):
    await ctx.reply(f"Handler for kind (2), your meta is '{ctx.payload['meta']}'")

@plugin.on_commands(["kb"])
async def __(msg, ctx):
    await ctx.reply("hey", keyboard=json.dumps({
        "one_time": True,
        "buttons": [
            [
                {"action": {
                        "type":"text",
                        "label": "kind=1, meta=2", "payload": "{\"kind\": \"1\", \"meta\": \"2\"}"
                }}
            ],
            [
                {"action": {
                        "type":"text",
                        "label": "kind=1, meta=4", "payload": "{\"kind\": \"1\", \"meta\": \"4\"}"
                }}
            ],
            [
                {"action": {
                        "type":"text",
                        "label": "kind=2, meta=4", "payload": "{\"kind\": \"1\", \"meta\": \"4\"}"
                }}
            ],
        ]
    }))
michaelkryukov commented 3 years ago

На данный момент обновлённый обработчик в master-ветке. Можете проверить, и, если там всё в порядке, доработки обработчика будут выпущены в следующей версии.