Задать вопрос
@Lynatik001

Нужна ли «сцена» в telegraf, при написании бота?

Я нашел пример кода.
В моем боте планируются меню (или что-то еще) внутри меню.

Задача: сделать бота с небольшим функционалом. Например, Глав меню(список кнопок) - саб меню и т.д.
Планируются разные взаимодействия с БД через 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()
  • Вопрос задан
  • 2696 просмотров
Подписаться 3 Сложный Комментировать
Пригласить эксперта
Ответы на вопрос 1
KonstantinOk
@KonstantinOk
Основатель проектов.
Сцены очень удобны из за одной детали, что если ты в цене, то всё идёт по одному сценарию, за который нельзя выйти. К примеру если в сцене есть кнопки и ты нажал, перейдя в следующий шаг, то предыдущие кнопки уже не будут срабатывают, а в ботах это часто люди делают. И меньше кода надо писать, если требуется ответ от юзера и обработка данных.

Выносить сцены можешь как угодно. У меня обычно отдельная пака и в ней отдельный скрипт на каждую сцену. А в маин файле только идёт ссылка на запуск первой ctx.scene.enter("sceneWizard"); console.log(ctx.message.text)
по сколько сцены являются частью ctx, то в отдельных файлах достаточно подключить import { Telegraf, Scenes, Composer, session, Markup } from "telegraf";
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы