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

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

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

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

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

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

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

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

В начало ↑