Как разделить список и вывести его несколькими последовательными сообщениями
Разбивайте большие списки на части и присылайте его в таком виде пользователю.
Это может пригодиться, если в боте есть список, который содержит большое количество строк и его нельзя отправить пользователю целиком в одном сообщении из-за ограничений Телеграма.
Рассмотрим небольшой список в качестве примера, но этим примером можно пользоваться для разделения списков любого размера.
Например, у вас есть список имен:
[ { "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 для перебора чисел в заданном диапазоне.
Подробнее про то, как он работает можно почитать в этой статье.
Вместо того, чтобы писать такую конструкцию: {{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}} и укажите в ней переход на этот же самый экран, на котором мы сейчас находимся. В этом примере он называется «Выводим список частями — Выводим».
На заключительном экране в Перемотке активируйте чекбокс для остановки бота до следующего сообщения от пользователя для того, чтобы бот не зациклился.
Если все сделано правильно, то в итоге всё будет выглядеть так: