Как разделить список и вывести его несколькими последовательными сообщениями
Разобьем список на части и пришлем его в таком виде пользователю.
Это может пригодиться, если в боте есть список, который содержит большое количество строк и его нельзя отправить пользователю целиком в одном сообщении из-за ограничений Телеграма.
Рассмотрим небольшой список в качестве примера, но этим примером можно пользоваться для разделения списков любого размера.
Например, у нас есть список имен:
[ { "name": "Emma" }, { "name": "Arnold" }, { "name": "Brian" }, { "name": "Margaret" }, { "name": "Elliot " } ]
В примере мы добавим этот список в бота с помощью Записи переменной, но такой список можно получить и другими способами, например, он может прийти Запросом или каким-то другим образом. Такие списки ещё могут называть массивами.
Добавим Запись переменных. В имени первой переменной напишем index. Index определяет, с какого элемента нужно выводить часть списка. У списка нумерация с нуля, поэтому, чтобы начать выводить список с имени Emma, напишем 0 в Значении.
В имени второй переменной напишем count — это количество элементов, которое нужно вывести.
Каждый шаг мы будем выводить столько элементов, сколько записано в значении count, и увеличивать index на это число. В итоге выведется число элементов равное index + count. А так как index мы сделали равным нулю, выводиться будет количество элементов, записанное в значении count.
Добавим Перемотку на следующий экран.
На этом экране будем использовать переменную slice — это верхняя граница, до которой нужно вывести элементы на этом шаге.
В самом простом случае slice равен index + count.
Перед тем, как начать брать значения из списка, убедимся, что номер первого элемента, который мы хотим получить (index), и количество элементов, которые мы хотим получить (count), находятся в пределах границ списка.
(#lt (add index count) list.length)
Например, если есть список из трех элементов, и мы хотим начать получать значения сo второго элемента (index) и взять три элемента (count), то так не получится, потому что мы выйдем за пределы списка. Чтобы избежать этой проблемы, используем способ защиты: для верхней границы (slice) укажем длину списка {{list.length}}. Это гарантирует, что мы останемся в пределах списка.
{{#lt (add index count) list.length}} {{add index count}} {{else}} {{list.length}} {{/lt}}
Далее мы будем использовать хелпер range.
Хелпер range пригодится для перебора чисел в заданном диапазоне.
Подробнее про то, как он работает можно почитать в этой статье.
Вместо того, чтобы писать такую конструкцию: {{get (get list @value) name}}, мы будем использовать with, внутри которого, в this, будет то, что мы передали, в данном случае — элемент списка.
{{"name": 'Emma'}}
Хелпер get помогает безопасно получить доступ к элементу объекта, избегая ошибок, которые могут возникнуть при обращении к несуществующему элементу.
list — это имя нашего списка.
{{#range index slice}} {{#with (get list @value)}} {{this.name}} {{/with}} {{/range}}
Перезапишем index, потому что с момента создания предыдущего индекса все данные уже были выведены.
Добавим две Перемотки.
Вторая Перемотка без дополнительных настроек, она сработает, если только не сработает первая.
В первую Перемотку добавим Условный шаблон {{lt slice list.length}} и укажем в ней переход на этот же самый экран, на котором мы сейчас находимся. В нашем примере он называется «Выводим список частями — Выводим».
На заключительном экране в Перемотке нажмём чекбокс для остановки бота до следующего сообщения от пользователя для того, чтобы бот не зациклился.
Если все сделано правильно, то в итоге всё будет выглядеть так: