Closed ObicaFF closed 4 years ago
Пришлите строчки 6482 и 971. (или это они и есть?)
Должен быть только один обработчик, из этих двух:
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();
});
negezor, все равно Cannot read property 'enter' of undefined
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'); // тут и начинается ошибка });
У вас используется своя реализация .hear()
? Если да, то она должна обрабатываться позже установки сцены в контекст.
Она и так обрабатывается позже установки сцены
Пробовал без реализации, там такая же ситуация с undenfined "enter"
Можно привести полный код? Ведь undefined
будет только в случае того что в контекст не установлен scene.
`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'); });`
пришлось заново переписать код без реализации.
` 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
В первом примере отсутсвует реализация cmd.hear()
реализация -
const cmd = { hear: (p, f) => { commands.push([p, f]); } }
Имелось ввиду обработка комманд.
const command = commands.find(x=> x[0].test(message.text)); message.args = message.text.match(command[0]); await command[1](message, bot);
Так снова не показан где именно вызывается этот код, где именно этот обработчик? Выше или ниже к этим?
vk.updates.on('message', sessionManager.middleware);
vk.updates.on('message', sceneManager.middleware);
Эти коды находится в самом внизу, а если точнее последние коды
( я про 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'); });`
До меня только что дошло, что vk.updates.on('message', sessionManager.middleware); vk.updates.on('message', sceneManager.middleware);
Должен находится перед комманд
What did you do?
Написал команду
What did you expect to happen?
Бот должен ответит на сообщение "money"
What was the actual result?
Cannot read property 'enter' of undefined
Получаю вот такую ошибку
Additional Info
Versions
vk-io
4.0.0
@vk-io/scenes
0.0.0-alpha.5
node
14.4.0
TypeScript
no use
yarn
ornpm
6.14.7