Как разделить список и вывести его несколькими последовательными сообщениями

Разбивайте большие списки на части и присылайте его в таком виде пользователю.

Это может пригодиться, если в боте есть список, который содержит большое количество строк и его нельзя отправить пользователю целиком в одном сообщении из-за ограничений Телеграма.

Рассмотрим небольшой список в качестве примера, но этим примером можно пользоваться для разделения списков любого размера.

Например, у вас есть список имен:

[
  { "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}} и укажите в ней переход на этот же самый экран, на котором мы сейчас находимся. В этом примере он называется «‎Выводим список частями — Выводим»‎.

На заключительном экране в Перемотке активируйте чекбокс для остановки бота до следующего сообщения от пользователя для того, чтобы бот не зациклился.

Если все сделано правильно, то в итоге всё будет выглядеть так:

В начало ↑