Раздел навигации

Класс для работы с созданием / получением клавиатуры для VK API в JSON-Формате

Добро пожаловать!

Зарегистрировавшись у нас, вы сможете обсуждать, делиться и отправлять личные сообщения другим участникам нашего сообщества.

Зарегистрироваться!
  • Если Вы желаете помогать развитию проекта, готовы заполнять раздел(-ы) и подсказывать другим пользователям на портале, есть возможность попасть в команду редакторов. Для этого следует обратиться в техническую поддержку
lua / python developer
Редактор
Регистрация
13 Июн 2022
Сообщения
48
Основной код:
Lua:
local keyboard = { } do
    local keyboard.encode_json = encodeJson --> МЕТОД ENCODEJSON, ЕСЛИ НЕ ИСПОЛЬЗУЙТЕ MOONLOADER - cjson.encode
    keyboard.create = function(self)
        self.key = self
        self.value = {}
        self.row_select = 1
        self.buttonColors = {
            POSITIVE = "positive",
            PRIMARY = "primary",
            SECONDARY = "secondary",
            NEGATIVE = "negative"
        }
        self.action = {
            TEXT = "text",
            OPENLINK = "open_link",
            LOCATION = "location",
            VKPAY = "vkpay",
            CALLBACK = "callback",
            OPEN_APP = "open_app"
        }

        return self
    end

    keyboard.get_type = function(params, button_type)
        local button_types = {
            ["text"] = {
                ["action"] = {
                    ["type"] = "text",
                    ["label"] = params["label"] or params[1] or "",
                    ["payload"] = keyboard.encode_json({["button"] = params["payload"] or params[2] or ""})
                },
                ["color"] = params["color"]
            },
            ["open_link"] = {
                ["action"] = {
                    ["type"] = "open_link",
                    ["link"] = params["link"] or params[1] or "",
                    ["label"] = params["label"] or params[2] or "",
                    ["payload"] = keyboard.encode_json({["button"] = params["payload"] or params[3] or ""})
                }
            },
            ["location"] = {
                ["action"] = {
                    ["type"] = "location",
                    ["payload"] = keyboard.encode_json({["button"] = params["payload"] or params[1] or ""})
                }
            },
            ["vkpay"] = {
                ["action"] = {
                    ["type"] = "vkpay",
                    ["payload"] = keyboard.encode_json({["button"] = params["payload"] or params[1] or ""}),
                    ["hash"] = params["hash"] or params[2] or ""
                }
            },
            ["open_app"] = {
                ["action"] = {
                    ["type"] = "open_app",
                    ["app_id"] = params["app_id"] or params[1] or 0,
                    ["owner_id"] = params["owner_id"] or params[2] or 0,
                    ["payload"] = keyboard.encode_json({["button"] = params["payload"] or params[3] or ""}),
                    ["label"] = params["label"] or params[4] or "",
                    ["hash"] = params["hash"] or params[5] or ""
                }
            },
            ["callback"] = {
                ["action"] = {
                    ["type"] = "callback",
                    ["label"] = params["label"] or params[1] or "",
                    ["payload"] = keyboard.encode_json({["button"] = params["payload"] or params[2] or ""}),
                },
                ["color"] = params["color"]
            }
        }
        if not button_types[button_type] then
            return "Button Type is xuinya"
        end
        return button_types[button_type]
    end

    keyboard.add_button = function(self, button_type, params, button_color)
        if not self.value[self.row_select] then self.value[self.row_select] = {} end
  
        params["color"] = button_color
        self.value[self.row_select][#self.value[self.row_select] + 1] = keyboard.get_type(params, button_type)
    end

    keyboard.row = function(self)
        self.row_select = self.row_select + 1
    end

    keyboard.get_json = function(self, one_time, inline)
        local init = {}
        for row, buttons in ipairs(self.value) do
            init[row - 1] = {}
            for button_id, params in ipairs(buttons) do
                init[row - 1][button_id - 1] = params
            end
        end

        return {
            ["inline"] = inline or false,
            ["one_time"] = one_time or false,
            ["buttons"] = init
        }
    end

    setmetatable(keyboard, {
        __call = function(self)
            return self:create(self)
        end
    })
end

Пример:
Lua:
function get_keyboard()
    local markup = keyboard()
    markup:add_button(markup.action.OPENLINK, {
        "https://vk.com/tfornik",
        "Перейти по ссылке",
        "openLink"
    }, markup.buttonColors.POSITIVE)
    markup:row()
    markup:add_button(markup.action.LOCATION, {
        payload = "location"
    }, markup.buttonColors.POSITIVE)
    return markup:get_json(false, false)
end


Важно. На данный момент класс адаптирован для работы с MoonLoader.
Чтобы сделать его опциональным к этому, импортируйте библиотеку для работы с JSON, и переменной keyboard.encode_json присвойте значение функции encode. Пример: Если вы используйте библиотеку cjson -> [/B]cjson.encode



self:add_button(button_type:string, params:table, color:string)
  • Описание: Добавляет кнопку в список
  • button_type:string -> Тип кнопки( text, open_link, location и тд )
  • params:table -> Таблица с нужными для кнопки параметрами( чек пример )
  • color:string -> Цвет кнопки( positive, secondary, negative, primary )
self:row()
  • Описание: Создать новый ряд кнопок
self:get_json(one_time:boolean, inline:boolean)
  • Описание: Возвращает клавиатуру в JSON-Формате
  • one_time:boolean -> true - Одноразовая , false - Многоразовая
  • inline:boolean -> true - прикреплена к сообщению, false - не прикреплена

Важно. Параметры кнопок нужно передавать именно те, что требует VK_API ( кликабельно! )
1713116591363.png

Указывать аргументы в массиве можно как указывая название элемента( пример: { payload = "button_1", label = "gg" }, так и не указывая( пример: {"button_1", "gg"} )
 
Последнее редактирование:
Сверху