Когда не знаешь, сколько вешать
История про крутые нестандартные чат-боты.
Бывают случаи, когда необходимо отправить сообщение, а количество кнопок к нему неизвестно на стадии проектирования воронки - станет известно в процессе диалога. Да, так бывает :). Здесь нам также приходит на помощь способность конструктора Salebot выполнять скрипты Python.
Загрузка скриптов Python в Salebot по этой ссылке, больше не повторяюсь.
Рассмотрим эту историю от простого к сложному - всего рассмотрено 3 варианта.
Важно: примеры проверялись в тестовой консоли и не учитывали ограничений по кнопкам конкретных мессенджеров. Как говорится, будьте внимательны и осторожны :).
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. У нас есть общее число кнопок и желаемое число кнопок в ряде
Самая гибкая и универсальная схема по общему числу кнопок сначала вычисляет число полных рядов кнопок, а затем остаток достраивает в последнем ряду. Прикольно получилось :)
Схема аналогична той, что в варианте 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 😃