簡體   English   中英

node-telegram-bot-api 上的 Telegram 機器人邏輯中的問題

[英]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 及其階段的“數組”。 你可以檢查我對這個邏輯的實現

https://github.com/Blabolka/five-minutes-to-three-tg-bot/blob/master/src/common/services/StageManager.ts

這里是使用示例:

使用示例圖像

在您的情況下,您需要在bot.on('callback_query')的同一級別上聲明您的bot.on('message')處理程序初始化,並在bot.on('message')處理程序中編寫一些 if 條件來檢查如果用戶點擊任何按鈕

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM