negezor / vk-io

Modern VK API SDK for Node.js
https://npm.im/vk-io
MIT License
548 stars 85 forks source link

scene.current равна null! #233

Closed zdev-online closed 4 years ago

zdev-online commented 4 years ago

У меня есть bot.js(Ядро), commands.js(Команды), scenes.js(Сцены):

В scene.js подключаю

const {SceneManager, StepScene} = require('@vk-io/scenes');
const scene = new SceneManager();
// тут scene.addScene(...)
module.exports = {scene}

В bot.js подключаю scenes.js

const { scene } = require('./scenes.js');

var cmds = [];
function cmd(_r,_f){cmds.push({r:_r,f:_f})}

vk.api.updates.on('message',scene.middlewareIntercept);
vk.api.updates.on('message',scene.middlewareIntercept);
vk.updates.on('message',async (ctx,next)=>{
   if (!ctx.scene.current) {
        db.addUser(ctx.senderId).then((data)=>{ //= Проверка в БД
            cmds.map(async (val)=>{ // Поиск команды в commands.js
                if(!val.r.test(ctx.text)){return 0;} // Проверка на регулярку команды

                var params = ctx.text.match(val.r) || [];
                params[0] = ctx; 
                params.args = params.input.split(' ');
                ctx.user = await db.getUser(ctx.senderId);
                val.f(ctx, params); 
            });
        }).catch((e)=>{return console.log('При добавлении пользователя произошла ошибка!')});
        next();
    }else{
        const cancel =  ctx.messagePayload && ctx.messagePayload.command === 'cancel';
        if (cancel) {
            return ctx.scene.leave({
                canceled: true
            });
        }
        return ctx.scene.reenter();
    }
});
module.exports = {
    bot:{
        cmd: cmd
    }
}

require('./commands.js');

В commands.js делаю так:

const { bot } = require('./bot.js');

const ut = bot.ut;

bot.cmd(/(?:dev)/,(msg,params)=>{
    return msg.scene.enter('dev'); // Сама сцена
});

В сцену входит, но не фиксируется т.к при выводе ctx.scene.current в bot.js = null

Versions

package version
vk-io 4.0.0-rc.30
@vk-io/scenes 0.0.0-alpha.5
node 12.13.0
yarn or npm 6.13.6
zdev-online commented 4 years ago

Полный код (Исправленный) (P.S Проблема осталась!)

https://github.com/RomanJarckov/kosmos

negezor commented 4 years ago

В данном случае ctx.scene.current всегда будет null, так как до этого обработчика никогда не дойдёт код. Обработчик scene.middlewareIntercept при наличии сцены войдёт в неё, и дальнейшее выполнение цепочки middleware не пойдёт. Тут нужно делать выбор, на кастомную логику или внутренний scene.middlewareIntercept.

zdev-online commented 4 years ago

Не совсем понял, можно пример? Нужно использовать scene.middleware ?

negezor commented 4 years ago

Проблема решена?