[英]Problem in Telegram bot logic on node-telegram-bot-api
剛開始學習 JS 和 NodeJs。 我正在編寫一個 TG 機器人,只是作為一個獲取 JS 知識和經驗的項目,一般來說,這不是重點! 在事件處理程序中遇到了這樣一個問題:我有一個類似keyboard_inline的注冊窗口,當/start命令出現幾個帶有性別選擇的按鈕時
bot.onText(/\/start/, async msg => { db.get("SELECT * FROM users WHERE user_id = ?", [msg.chat.id], async (no, yes) => { yes ? console.log('ss') : await bot.sendMessage(msg.chat.id, msg.chat.first_name + ',' + ' ' + 'добро пожаловать! 🙈\n\n' + 'Вы ещё у нас не зарегистрированы! Пожалуйста, выберите свой пол для продолжения регистрации:', keyboardName(signup)); }); });
有一個數據庫,但這不是重點,那里的檢查被禁用,它不會以任何方式影響它。 但是對keyboardName函數的實際調用,使它簡化了代碼的可讀性
const keyboardName = (name) => {
return {
reply_markup: JSON.stringify ({
inline_keyboard: name
})
}
};
以下是按鈕:
const signup = [
[
{
text: '👨 Я парень',
callback_data: 'signup_man'
},
{
text: '👩 Я девушка',
callback_data: 'signup_woman'
}
]
];
這是按鈕單擊事件處理程序本身:
bot.on('callback_query', async query => {
switch (query.data) {
case 'signup_man':
await bot.sendMessage(query.message.chat.id, 'Введи возраст от 16 до 90');
bot.on('message', async msg => {
if (msg.text >= 1 && msg.text <= 90) {
return await bot.sendMessage(msg.chat.id, 'это тестовое сообщение');
} else
bot.sendMessage(msg.chat.id, 'Возраст от 16 до 90');
})
break;
case 'signup_woman':
bot.sendMessage(msg.chat.id, 'С тобой приятно иметь дело! А теперь введи свой возраст, просто в чат, цифрами :)');
break;
}
});
問題是這樣的:當您從一個帳戶使用機器人時,所有邏輯和檢查都可以正常工作,但是如果我同時啟動多個帳戶,那么在最后一段中,當輸入用戶的年齡時(聊天.id),幾條消息將發送到聊天室(與正在運行的機器人並單擊按鈕的帳戶數量相稱)。 我想了解什么是錯的以及為什么會發生)
嘗試了很多東西,但我似乎不明白其中的邏輯
發生這種情況是因為每次單擊按鈕都會添加另一個處理程序。 node-telegram-bot-api 的大問題,您不能在其他情況下使用某些處理程序而不能在另一種情況下使用。
要處理這個問題,您可以創建一個包含用戶 ID 及其階段的“數組”。 你可以檢查我對這個邏輯的實現
這里是使用示例:
在您的情況下,您需要在bot.on('callback_query')
的同一級別上聲明您的bot.on('message')
處理程序初始化,並在bot.on('message')
處理程序中編寫一些 if 條件來檢查如果用戶點擊任何按鈕
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.