negezor / vk-io

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

Cannot read property 'enter' of undefined #303

Closed ObicaFF closed 4 years ago

ObicaFF commented 4 years ago

What did you do?

Написал команду

sceneManager.addScene(new StepScene('money', [
    (message) => {
        if (message.scene.step.firstTime || !message.text) {
            return message.send('Я готов к выдачи денег, подтвердите действие, напишите "подтверждаю"');
        }
        if (message.text == 'подтверждаю' || message.text == 'Подтверждаю') return message.scene.step.next();
        if (!message.text == 'подтверждаю' || message.text == 'Подтверждаю') return message.send(`Подтвердите действие, напишите "подтверждаю"`)
    },
    (message) => {
        if (message.scene.step.firstTime || !message.text) {
            return message.send('Сколько вам нужно?');
        }
        if (message.text == 'выйти') return message.scene.leave();

        a.balance += Number(message.text);

        return message.scene.step.next();
    },
    async (message) => {
        const {
            firstName,
            age
        } = message.scene.state;

        await message.send(`Готово, я выдал вам запрошенные деньги!`);

        await message.scene.leave();
    }
]));

vk.updates.on('message', sessionManager.middleware);
vk.updates.on('message', sceneManager.middleware);
vk.updates.on('message', (message, next) => {
    if (!message.scene.current) {
        return next();
    }
    const cancel = message.messagePayload && message.messagePayload.command === 'cancel';
    if (cancel) {
        return message.scene.leave({
            canceled: true
        });
    }
    return message.scene.reenter();
});

vk.updates.hear(/^(?:money)/i, (message) => {
    if (message.user.settings.adm < 1) return;
    return message.scene.enter('money');
});

What did you expect to happen?

Бот должен ответит на сообщение "money"

What was the actual result?

Cannot read property 'enter' of undefined

Получаю вот такую ошибку Screenshot_1

Additional Info

Versions

package version
vk-io 4.0.0
@vk-io/scenes 0.0.0-alpha.5
node 14.4.0
TypeScript no use
yarn or npm 6.14.7
Noop1 commented 4 years ago

Пришлите строчки 6482 и 971. (или это они и есть?)

negezor commented 4 years ago

Должен быть только один обработчик, из этих двух:

vk.updates.on('message', sceneManager.middleware);

Или

vk.updates.on('message', (message, next) => {
    if (!message.scene.current) {
        return next();
    }
    const cancel = message.messagePayload && message.messagePayload.command === 'cancel';
    if (cancel) {
        return message.scene.leave({
            canceled: true
        });
    }
    return message.scene.reenter();
});
ObicaFF commented 4 years ago

negezor, все равно Cannot read property 'enter' of undefined

ObicaFF commented 4 years ago

Noop1, 971 строка - message.args = message.text.match(command[0]); await command[1](message, bot);

а 6482 указывает, где произошла ошибка, там как раз enter

cmd.hear(/^(?:money)/i, (message) => { if(message.user.settings.adm < 1) return; return message.scene.enter('money'); // тут и начинается ошибка });

negezor commented 4 years ago

У вас используется своя реализация .hear()? Если да, то она должна обрабатываться позже установки сцены в контекст.

ObicaFF commented 4 years ago

Она и так обрабатывается позже установки сцены

Пробовал без реализации, там такая же ситуация с undenfined "enter"

negezor commented 4 years ago

Можно привести полный код? Ведь undefined будет только в случае того что в контекст не установлен scene.

ObicaFF commented 4 years ago

`const { VK, Keyboard } = require('vk-io'); const vk = new VK(); const commands = []; const request = require('prequest'); const fs = require("fs"); const googleTTS = require('google-tts-api'); let user = new VK(); const https = require('https'); const requests = require('request'); const rq = require("prequest"); const tcpp = require('tcp-ping'); const http = require('http'); const chalk = require('chalk'); let giving = false; const request = require('prequest'); const { SceneManager, StepScene } = require('@vk-io/scenes') const { SessionManager } = require('@vk-io/session') const sessionManager = new SessionManager(); const sceneManager = new SceneManager();

sceneManager.addScene(new StepScene('signup', [ (message) => { if (message.scene.step.firstTime || !message.text) { return message.send('Как тебя зовут?'); } a.nick = message.text; return message.scene.step.next(); }, (message) => { if (message.scene.step.firstTime || !message.text) { return message.send('Сколько тебе лет?'); } a.age = Number(message.text); return message.scene.step.next(); }, async (message) => { const { firstName, age } = message.scene.state;

    await message.send(`👤 Вы ${a.nick}, Вам ${a.age} лет`);

    await message.scene.leave();
}

]));

vk.updates.on('message', sessionManager.middleware); vk.updates.on('message', sceneManager.middleware); vk.updates.on('message', (message, next) => { if (!message.scene.current) { return next(); } const cancel = message.messagePayload && message.messagePayload.command === 'cancel'; if (cancel) { return message.scene.leave({ canceled: true }); } return message.scene.reenter(); });

cmd.hear(/^(?:тест)/i, (message) => { return message.scene.enter('signup'); });`

ObicaFF commented 4 years ago

пришлось заново переписать код без реализации.

` const { VK } = require("vk-io"); const vk = new VK(); const { updates } = vk; const fs = require("fs"); const admins = [1]; const users= require("./users.json"); const { SceneManager, StepScene } = require('@vk-io/scenes') const { SessionManager } = require('@vk-io/session') const sessionManager = new SessionManager(); const sceneManager = new SceneManager();

vk.setOptions({ token: "", apiMode: "parallel", pollingGroupId: });

async function saveAll() { require('fs').writeFileSync('./users.json', JSON.stringify(users, null, '\t')); return true; }

updates.startPolling(); updates.on('message', async (message, next) => { if(message.is("message") && message.isOutbox) return; message.user = message.senderId; if (message.user < 1) return; if (message.text) { console.log(@id${message.senderId} ${ message.isChat ? "#" + message.chatId : "" }, text: ${ message.text.slice(0, 36) }); } if (!users[message.senderId]) { users[message.senderId] = { permission: 0, balance: 1000, ban: false }; } message.user = users[message.senderId]; if (message.user.ban) return; try { await next(); saveAll(); } catch (err) { console.error(err) } });

updates.hear(/(тест)/i, async (message) => { await message.send(Работаю) });

updates.hear("up", async (message) => { if (!~admins.indexOf(message.senderId)) { return message.send('Ты не администратор'); } message.user.permission = 2; await message.send(Вам выданы права администратора); });

updates.hear(/(balance|баланс)/i, async (message) => { await message.send(Твой баланс: ${ message.user.balance } $) });

sceneManager.addScene(new StepScene('signup', [ (message) => { if (message.scene.step.firstTime || !message.text) { return message.send('Как тебя зовут?'); } a.nick = message.text; return message.scene.step.next(); }, (message) => { if (message.scene.step.firstTime || !message.text) { return message.send('Сколько тебе лет?'); } a.age = Number(message.text); return message.scene.step.next(); }, async (message) => { const { firstName, age } = message.scene.state;

    await message.send(`👤 Вы ${a.nick}, Вам ${a.age} лет`);

    await message.scene.leave();
}

]));

vk.updates.on('message', sessionManager.middleware); vk.updates.on('message', sceneManager.middleware); vk.updates.on('message', (message, next) => { if (!message.scene.current) { return next(); } const cancel = message.messagePayload && message.messagePayload.command === 'cancel'; if (cancel) { return message.scene.leave({ canceled: true }); } return message.scene.reenter(); });

vk.updates.hear(/^(?:проверь меня)/i, (message) => { return message.scene.enter('signup'); }); `

Именно с этого момента заработало Scene и без undenfined enter

negezor commented 4 years ago

В первом примере отсутсвует реализация cmd.hear()

ObicaFF commented 4 years ago

реализация - const cmd = { hear: (p, f) => { commands.push([p, f]); } }

negezor commented 4 years ago

Имелось ввиду обработка комманд.

ObicaFF commented 4 years ago

const command = commands.find(x=> x[0].test(message.text)); message.args = message.text.match(command[0]); await command[1](message, bot);

negezor commented 4 years ago

Так снова не показан где именно вызывается этот код, где именно этот обработчик? Выше или ниже к этим?

vk.updates.on('message', sessionManager.middleware);
vk.updates.on('message', sceneManager.middleware);
ObicaFF commented 4 years ago

Эти коды находится в самом внизу, а если точнее последние коды ( я про vk.updates.on('message', sessionManager.middleware); vk.updates.on('message', sceneManager.middleware);)

1. const command = commands.find(x=> x[0].test(message.text)); message.args = message.text.match(command[0]); await command[1](message, bot); // вот обработчик комманд находится в 615 строке. const cmd = { hear: (p, f) => { commands.push([p, f]); } } // реализация

↓↓↓ Пошли самые глубокие и последние коды

Manager.addScene(new StepScene('signup', [ (message) => { if (message.scene.step.firstTime || !message.text) { return message.send('Как тебя зовут?'); } a.nick = message.text; return message.scene.step.next(); }, (message) => { if (message.scene.step.firstTime || !message.text) { return message.send('Сколько тебе лет?'); } a.age = Number(message.text); return message.scene.step.next(); }, async (message) => { const { firstName, age } = message.scene.state;

    await message.send(`👤 Вы ${a.nick}, Вам ${a.age} лет`);

    await message.scene.leave();
}

]));

sceneManager.addScene(new StepScene('money', [ (message) => { if (message.scene.step.firstTime || !message.text) { return message.send('Я готов к выдачи денег, подтвердите действие, напишите "подтверждаю"'); } if(message.text == 'подтверждаю' || message.text == 'Подтверждаю') return message.scene.step.next(); if(!message.text == 'подтверждаю' || message.text == 'Подтверждаю') return message.send(Подтвердите действие, напишите "подтверждаю") }, (message) => { if (message.scene.step.firstTime || !message.text) { return message.send('Сколько вам нужно?'); } if(message.text == 'выйти') return message.scene.leave();

    a.balance += Number(message.text);

    return message.scene.step.next();
},
async (message) => {
    const { firstName, age } = message.scene.state;

    await message.send(`Готово, я выдал вам запрошенные деньги!`);

    await message.scene.leave();
}

]));

vk.updates.on('message', sessionManager.middleware); vk.updates.on('message', sceneManager.middleware); vk.updates.on('message', (message, next) => { if (!message.scene.current) { return next(); } const cancel = message.messagePayload && message.messagePayload.command === 'cancel'; if (cancel) { return message.scene.leave({ canceled: true }); } return message.scene.reenter(); });

vk.updates.hear(/^(?:тест)/i, (message) => { return message.scene.enter('signup'); });

cmd.hear(/^(?:money)/i, (message) => { if(a.adm < 1) return; return message.scene.enter('money'); });`

ObicaFF commented 4 years ago

До меня только что дошло, что vk.updates.on('message', sessionManager.middleware); vk.updates.on('message', sceneManager.middleware); Должен находится перед комманд