Я нашел пример кода.
В моем боте планируются меню (или что-то еще) внутри меню.
Задача: сделать бота с небольшим функционалом. Например, Глав меню(список кнопок) - саб меню и т.д.
Планируются разные взаимодействия с БД через mongoose.
Так же я планирую использовать telegraf. В этой библиотеке есть "сцены", но.я не знаю, нужны ли они вообще. Я думаю, что всю логику можно раскидать по файлам, написать логику работы с меню в папку view и тогда можно обойтись без "сцен". Но я не уверен, что это правильный подход. Подскажите, прав ли я?
Еще имеется вопрос по поводу кода:
Как он должен выглядеть, если запуск бота в main-файле, а сцена в папке scene/mainMenuScene.js ?
Хотя я считаю, что вешать на каждое меню сцену - это слишком. Пожалуйста, помогите разобраться с этим.
Код, приведенный ниже, является примером реализации схемы. А у меня в index.js намешано достаточно много взаимодействия с ботом, например, bot.action, bot.hears + обработчики + функции для взаимодействия с db/controll /db/model
const Telegraf = require('telegraf')
const RedisSession = require('telegraf-session-redis')
const Stage = require('telegraf/stage')
const Scene = require('telegraf/scenes/base')
const { enter, leave } = Stage
const session = new RedisSession({
store: {
host: process.env.TELEGRAM_SESSION_HOST || '127.0.0.1',
port: process.env.TELEGRAM_SESSION_PORT || 32768
}
})
// Greeter scene
const greeterScene = new Scene('greeter')
greeterScene.enter((ctx) => ctx.reply('Hi'))
greeterScene.leave((ctx) => ctx.reply('Bye'))
greeterScene.hears('hi', enter('greeter'))
greeterScene.on('message', (ctx) => ctx.replyWithMarkdown('Send `hi`'))
// Echo scene
const echoScene = new Scene('echo')
echoScene.enter((ctx) => ctx.reply('echo scene'))
echoScene.leave((ctx) => ctx.reply('exiting echo scene'))
echoScene.command('back', leave())
echoScene.on('text', (ctx) => ctx.reply(ctx.message.text))
echoScene.on('message', (ctx) => ctx.reply('Only text messages please'))
const bot = new Telegraf(process.env.BOT_TOKEN)
const stage = new Stage([greeterScene, echoScene], { ttl: 10 })
bot.use(session)
bot.use(stage.middleware())
bot.command('greeter', enter('greeter'))
bot.command('echo', enter('echo'))
bot.on('message', (ctx) => ctx.reply('Try /echo or /greeter'))
bot.startPolling()