Ошибка при запуске бота на telegraf js "telegraf: Unsupported scene"
Я попытался сделать сцены для телеграмм бота на telegraf js , но у меня выбивает ошибку . Я не смог найти решение проблемы . Ошибка:
Error: telegraf: Unsupported scene
at D:\Projects\bots\BuyBooks\node_modules\telegraf\stage.js:19:15
at Array.forEach (<anonymous>)
at Stage.register (D:\Projects\bots\BuyBooks\node_modules\telegraf\stage.js:17:12)
at D:\Projects\bots\BuyBooks\node_modules\telegraf\stage.js:13:36
at Array.forEach (<anonymous>)
at new Stage (D:\Projects\bots\BuyBooks\node_modules\telegraf\stage.js:13:12)
at Object.<anonymous> (D:\Projects\bots\BuyBooks\telegrambot.js:11:15)
at Module._compile (internal/modules/cjs/loader.js:1133:30)
at Object.Module._extensions..js (internal/modules/cjs/loader.js:1153:10)
at Module.load (internal/modules/cjs/loader.js:977:32)
Вот код основного файла:
const { Telegraf} = require('telegraf'),
config = require("./config/config.json"),
{Extra,Markup,Stage ,session} = Telegraf,
bot = new Telegraf(config.token),
SceneGenerator = require('./scenes'),
curScene = new SceneGenerator,
SearchSchene = curScene.GenSearchSchene,
InfoSchene = curScene.GenInfoSchene,
BookTopSchene = curScene.GenBookTopSchene;
const stage = new Stage([SearchSchene, InfoSchene, BookTopSchene])
bot.use(session())
bot.use(stage.middleware())
bot.start((ctx) => ctx.reply('Привет ! Напиши /help чтобы получить больше информации'))
bot.help((ctx) => ctx.reply('Список моих команд:\n|1. /search - поиск книги|\n|2. /info - краткая информация о книге|\n|3. /bookTop - топ книг с различных сайтов|'))
bot.command('search', async (ctx) => {
await ctx.scene.enter('search')
})
bot.launch()
Вот код с сценами:
const Scene = require("telegraf/scenes/base")
class SceneGenerator {
GenSearchSchene(){
const search = new Scene('search')
search.enter(async (ctx) =>{
await ctx.reply('Для поиска введите название книги')
})
search.on('text', async (ctx) =>{
const name = ctx.message.text
//проверяем наличие текста
if(name){
await ctx.reply('Идёт обработка . Это может занять некоторое время...')
await ctx.scene.leave();
}else{
await ctx.reply("Мне непонятно данное имя")
await ctx.scene.reenter()
}
})
search.on('message', (ctx) =>{
ctx.reply('Ты меня за дибила считаешь ?')
})
return search;
}
GenInfoSchene(){
const info = new Scene('info')
info.enter(async (ctx) =>{
await ctx.reply('Для поиска информации введите название книги')
})
info.on('text', async (ctx) =>{
const name = ctx.message.text
//проверяем наличие текста
if(name){
await ctx.reply('Идёт обработка . Это может занять некоторое время...')
ctx.scene.leave()
}else{
await ctx.reply("Мне непонятно данное имя")
await ctx.scene.reenter()
}
})
info.on('message', (ctx) =>{
ctx.reply('Ты меня за дибила считаешь ?')
})
return info
}
GenBookTopSchene(){
const bookTop = new Scene('bookTop')
bookTop.enter(async (ctx) =>{
await ctx.reply('Введите колличество книг которое хотите получить')
})
bookTop.on('text', async (ctx) =>{
const currAge = Number(ctx.message.text)
if(currAge && currAge > 0){
await ctx.reply('Идёт обработка . Это может занять некоторое время...')
await ctx.scene.leave()
}else{
await ctx.reply("Вы ввели не число или число равное/меньше нуля")
await ctx.scene.reenter()
}
})
bookTop.on('message', (ctx) =>{
ctx.reply('Ты меня за дибила считаешь ?')
})
return bookTop
}
}
module.exports = SceneGenerator
Ответы (1 шт):
Автор решения: nörbörnën
→ Ссылка
Объявление переменных:
curScene = new SceneGenerator,
SearchSchene = curScene.GenSearchSchene,
InfoSchene = curScene.GenInfoSchene,
BookTopSchene = curScene.GenBookTopSchene;
Ваше создание инстанса Stage:
const stage = new Stage([SearchSchene, InfoSchene, BookTopSchene])
Описание конструктора Stage:
const Stage: new <SceneContextMessageUpdate>(
scenes: Scene<SceneContextMessageUpdate>[],
options?: Partial<SceneContextOptions>
) => Stage<...>
Дело в том, что в переменных SearchSchene, InfoSchene, BookTopSchene - "фабрики" объектов, но не инстансы Scene, которые ожидает Stage.
В вашем коде правильным вызовом было бы
const stage = new Stage([SearchSchene(), InfoSchene(), BookTopSchene()])