Создание синтаксиса легко-масштабируемого вложенного меню для телеграм бота на js

Я разрабатываю собственный телеграм фреймворк. По опыту знаю, что большая часть времени отведенная на разработку уходит на создание меню. Сейчас вложенное меню на моем фреймворке может выглядеть так:

 [
    {
      message: '/start', // тригер на сообщение
      handler: (usr) => usr.reply('menu header', { // обработчик
        reply_markup: {
          keyboard: [
            [ 'submenu name' ]
          ],
          resize_keyboard: true
        }
      })
    },
    {
      message: 'submenu name',
      handler: (usr) => usr.reply('submenu header', {
        reply_markup: {
          keyboard: [
            [ 'subsubmenu name' ]
          ],
          resize_keyboard: true
        }
      })
    },
    {
      message: 'subsubmenu name',
      handler: (usr) => usr.reply('menu end')
    }
  ]

Но оно может состоять из 5-7 субменю, из-за чего разработка сильно замедляется.

Как бы лучше мог выглядеть этот код? Есть ли красивые решения для этого с помощью создания babel плагина (как jsx)? или лучше просто создать веб генератор меню?


Ответы (1 шт):

Автор решения: martiliones

module.exports = function () {
  return {
    title: 'Main menu',
    description: 'some desc',
    markup: '<b> %t </b> \n \n %d',
    children: [
      [
        {
          title: 'Balance',
          children: [
            [ 'Add funds', 'Withdraw' ],
            [ 'Create deposit from balance', 'My desopits' ],
            [ 'Calculator' ],
            [ 'Back', 'Main menu' ]
          ]
        },
        {
          title: 'Referral system',
          children: [
            [ 'Add funds', 'Withdraw' ],
            [ 'Create deposit from balance', 'My desopits' ]
          ]
        }
      ], 
      [
        {
          title: 'My transactions',
          children: [
            [ 'Add funds', 'Withdraw' ],
            [ 'Create deposit from balance', 'My desopits' ],
            [ 'Calculator' ],
            [ 'Back', 'Main menu']
          ]
        },
        'Russian'
      ]
    ]
  }
};

→ Ссылка