Лайфхаки Salebot
February 12, 2023

Когда не знаешь, сколько вешать

История про крутые нестандартные чат-боты.

Бывают случаи, когда необходимо отправить сообщение, а количество кнопок к нему неизвестно на стадии проектирования воронки - станет известно в процессе диалога. Да, так бывает :). Здесь нам также приходит на помощь способность конструктора Salebot выполнять скрипты Python.

Загрузка скриптов Python в Salebot по этой ссылке, больше не повторяюсь.

Рассмотрим эту историю от простого к сложному - всего рассмотрено 3 варианта.

Важно: примеры проверялись в тестовой консоли и не учитывали ограничений по кнопкам конкретных мессенджеров. Как говорится, будьте внимательны и осторожны :).

1. Мы просто задаём в динамике число кнопок, не заморачиваясь их отображением

Схема тупо выводит кнопки в линию

Что получаем в результате работы скрипта
Схема для варианта 1
Первый блок
Стрелка
Второй блок
Настройки кнопок

Код скрипта Python "sb_3buttons.py" (копипаст работает). Не забываем, что в Питоне отступы - это символ табуляции (клавиша "Tab")

def handle(data):
    ''' Получаем из переданных параметров число '''
    n = json.loads(data)["n"] 
    ''' Создаём список для итогового результата '''
    _buttons = []                          
    ''' В цикле формируем набор словарей с параметрами кнопок '''
    for i in range(n):    
        bdict = {"line":0, "index_in_line":i, "text":f"Кнопка {i+1}", "type":"inline"}
        ''' Добавляем полученный словарь в список '''
        _buttons.append(bdict)
    ''' Возвращаем полученное значение для блока кнопок '''
    return {'btns': _buttons}

2. Учимся формировать ряды кнопок

Схема выводит заданное число рядов с заданным числом кнопок

Результат работы схемы
Схема в конструкторе
Первый блок
Второй блок
Третий блок
Настройки кнопок

Код скрипта Python "sb_manybuttons.py "

# -*- coding: utf-8 -*-
import json
def handle(data):
    ''' Получаем число рядов '''
    line = json.loads(data)['n']  
    ''' Получаем число кнопок в ряду '''
    ind = json.loads(data)['m']  
    _buttons = []
    cnt = 0
    ''' Первый цикл - ряд кнопок '''
    for i in range(line):                  
    ''' Второй цикл - кнопки в ряду '''
        for j in range(ind):               
    ''' Порядковый номер кнопки '''
            cnt += 1                                
            bdict = {"line":i, "index_in_line":j, "text":f"Кнопка {cnt}", "type":"inline"}
            _buttons.append(bdict)
    return {'btns': _buttons}

3. У нас есть общее число кнопок и желаемое число кнопок в ряде

Самая гибкая и универсальная схема по общему числу кнопок сначала вычисляет число полных рядов кнопок, а затем остаток достраивает в последнем ряду. Прикольно получилось :)

Результат работы схемы для варианта 3

Схема аналогична той, что в варианте 2. Немного другие тексты в диалогах - оно и понятно 😊. Название файла со скриптом Python sb_manybuttons_lined.py. Вот его код:

# -*- coding: utf-8 -*-
import json
def handle(data):
    ''' Получаем общее число кнопок '''
    amount = json.loads(data)['n']        
    ''' Получаем число кнопок в ряду '''
    btns_in_line = json.loads['m']           
    _buttons = []
    ''' Получаем число полных рядов '''
    full_lines = amount // btns_in_line  
    ''' Остаток для последнего ряда '''
    leaving = amount % btns_in_line     
    cnt = 0
    for i in range(full_lines):
        for j in range(btns_in_line):
            cnt += 1
            bdict = {"line":i, "index_in_line":j, "text":f"Кнопка {cnt}", "type":"inline"}
            _buttons.append(bdict)
    ''' Формируем последний ряд из полученного остатка '''
    if (leaving > 0):                                        
        i += 1
        for j in range(leaving):
            cnt += 1
            bdict = {"line":i, "index_in_line":j, "text":f"Кнопка {cnt}", "type":"inline"}
            _buttons.append(bdict)
    return {'btns': _buttons}

Ничто не мешает попробовать эти схемы в действии - они полностью рабочие и вовсю применяются в ТГ и ВК.

Благодарность в виде доната приветствуется 😉. Как говорят восточные зулусы, buy me a coffee 😃

👇