Home > Mobile >  Delay for messages in node-telegram-bot-api
Delay for messages in node-telegram-bot-api

Time:11-12

I am working on a telegram bot with the node-telegram-bot-api library. I made 2 buttons using keyboard. But when you click on them a lot, the bot will spam and sooner or later it will freeze. Is it possible to somehow put a delay for the user on messages.

if (text === '/start') {
            return bot.sendMessage(chatId, 'hello', keyboardMain);
        }
export const keyboardMain = {
    reply_markup: JSON.stringify({
        keyboard: [
            [{
                text: '/start',
            },
        ],
        resize_keyboard: true
    })
};

CodePudding user response:

You can create a user throttler using Javascript Map

/*
 * @param {number} waitTime Seconds to wait
 */
function throttler(waitTime) {
  const users = new Map()
  return (chatId) => {
     const now = parseInt(Date.now()/1000)
     const hitTime = users.get(chatId)
     if (hitTime) {
       const diff = now - hitTime
       if (diff < waitTime) {
         return false
       } 
       users.set(chatId, now)
       return true
     }
     users.set(chatId, now)
     return true
  }
}

How to use: You'll get the user's chatId from telegram api. You can use that id as an identifier and stop the user for given specific time.

For instance I'm gonna stop the user for 10seconds once the user requests.

// global 10 second throttler
const throttle = throttler(10) // 10 seconds

// in your code
const allowReply = throttle(chatId) // chatId obtained from telegram

if (allowReply) {
   // reply to user
} else {
  // dont reply
}

CodePudding user response:

I tried using this code, put the function code in my function file, connected everything to the required file, and I don’t understand what to do next and where to insert the last code and what to do with it. I'm new to JavaScript and just learning.

import {
    bot
} from '../token.js';

import {
    throttler
} from '../functions/functions.js';

import {
    keyboardMain
} from '../keyboards/keyboardsMain.js';

export function commands() {
    bot.on('message', msg => {
        const text = msg.text;
        const chatId = msg.chat.id;

        const throttle = throttler(10);

        if (text === '/start') {
            const allowReply = throttle(chatId) // chatId obtained from telegram

            if (allowReply) {
               return bot.sendMessage(chatId, 'hello', keyboardMain);
            } else {
               // dont reply
            }
        }

        return bot.sendMessage(chatId, 'error');
    });
}
  • Related