Отложенные сообщения Telegram bot Node.js

136
04 июня 2019, 02:20

Всем здравствуйте. Делаю бота для Telegram на Node.js и node-telegram-bot-api. После команды /start бот проверяет наличие юзера в базе, если его нет, то нужно отправить 6 сообщений с определенным интервалом. И вот тут проблема. Если указывать интервал между сообщениями 1-2 минуты, то все ок, но если установить интервал 15-30+ мин, то сообщения не приходят. Складывается ощущение, что Node просто перестает работать не дожидаясь завершения таймаутов. Пробовал и setInterval и setTimeout - результат одинаковый. Подскажите, что не так. Весь код как есть прикладываю ниже.

const TelegramBot = require('node-telegram-bot-api')
const TOKEN = 'API_TOKEN'
const Koa = require('koa')
const Rout = require('koa-router')
const bodyParser = require('koa-bodyparser')
const request = require('request')
const fs = require('fs')

const bot = new TelegramBot(TOKEN)
bot.setWebHook('https://site.com/API_TOKEN')
const app = new Koa()
const router = Rout()
router.post('/API_TOKEN', ctx => {
    const {body} = ctx.request
    bot.processUpdate(body)
    ctx.status = 200
})
app.use(bodyParser())
app.use(router.routes())
const port = 3000
app.listen(port)
var notes = []
const KB = {
    refering: 'Реферальная программа',
    getRefLink: 'Получить реферальную ссылку'
}

const msgs = {
     referMsg: 'тут сообщение'
}
var userName = ''
var firstName = ''
var lastName = ''
var userId = ''
var block1 = `Сообщение 1`
var block2 = `Сообщение 2`
var block3_1 = `Сообщение 3`
var block3_2 = `Сообщение 4`
var block4 = `Сообщение 5`
var block5 = `Сообщение 6`
var isFollower = 0
bot.onText(/\/start/, msg => {
    userName = msg.from.username
    firstName = msg.from.first_name
    lastName = msg.from.last_name
    userId = msg.from.id;
     notes.push({
         'uid': userId,
         'text': block1,
         'text2': block2,
         'text3_1': block3_1,
         'text3_2': block3_2,
         'text4': block4,
         'text5': block5
     });
     var referId = '0'
     var startText = msg.text
     if(startText.length > 7){
         referId = startText.substr(7);
         if(referId.length > 0){
             referId = referId
         } else {
             referId = 0
         }
     }
request('https://site.com/api?getuser='+userId+'&username='+userName+'&first_name='+firstName+'&last_name='+lastName+'&refer='+referId, (error, response, body) => {
    if (error) throw new Error(error)
    if(response.statusCode === 200){
        const apiData = JSON.parse(body)
        const html = `<b>User:</b> - <em>${apiData.id}</em>`
        if(apiData.id != 0){
            isFollower = 1
        }
    }
})

const text = `Приветственное сообщение`
bot.sendMessage(msg.chat.id, text, {
                reply_markup: {
                    keyboard: [
                        [KB.refering]
                    ]
                }
            })
})
bot.on('message', msg => {
     switch (msg.text) {
         case KB.refering:
              sendRefProgramm(msg.chat.id)
         break
         case KB.getRefLink:
             sendRefLink(msg.chat.id, msg.from.id)
         break
    }
})
function sendRefProgramm(chatId){
    request('http://site.com/public/api?get_user_refs='+chatId, (error, response, body) => {
    if (error) throw new Error(error)
    if(response.statusCode === 200){
        const apiData = JSON.parse(body)
        var referals = apiData.referals
        var referalInfo = ''
        if(referals > 6) {
            referalInfo = `На данный момент ты привел ${apiData.referals} человек. Получить бонус можно написав мне @username`    
        } else {
            referalInfo = `На данный момент ты привел ${apiData.referals} человек.` 
        }
        const referalInfoMsg = `Сообщение`+referalInfo
        bot.sendMessage(chatId, referalInfoMsg, {
            reply_markup: {
                    keyboard: [
                        [KB.getRefLink]
                    ]
                }
        })
    }
})
}
function sendRefLink(chatId, userId){
     var msg = 'Ваша реферальная ссылка https://t.me/bot?start=' + userId
     bot.sendMessage(chatId, msg)
}
if(isFollower == 0){
// Block1
setTimeout(function(){
        for (var i = 0; i < notes.length; i++){
            bot.sendMessage(notes[i]['uid'], notes[i]['text'], {
                reply_markup: JSON.stringify({
                    inline_keyboard: [
                        [{ text: 'Регистрация', url: 'https://site.com' }]
                    ]
                })
            })
            bot.sendMessage(notes[i]['uid'], 'Учавствуй в реферальной программе, приглашай друзей и получай бонусы!', {
                reply_markup: {
                    keyboard: [
                        [KB.refering]
                    ]
                }
            })
        }
    // Block 2
    setTimeout(function(){
            for (var i = 0; i < notes.length; i++){
                bot.sendMessage(notes[i]['uid'], notes[i]['text2'], {
                    reply_markup: {
                        keyboard: [
                            [KB.refering]
                        ]
                    }
                })
            }
        // Block 3
        setTimeout(function(){
            for (var i = 0; i < notes.length; i++){
                bot.sendMessage(notes[i]['uid'], notes[i]['text3_1'])
                bot.sendPhoto(notes[i]['uid'], 'img.jpg')
            }
            // Block 3_2
            setTimeout(function(){
                for (var i = 0; i < notes.length; i++){
                    bot.sendMessage(notes[i]['uid'], notes[i]['text3_2'])
                    bot.sendPhoto(notes[i]['uid'], 'img.jpg')
                }
                // Block 4
                setTimeout(function(){
                    for (var i = 0; i < notes.length; i++){
                        bot.sendMessage(notes[i]['uid'], notes[i]['text4'], {
                                        reply_markup: JSON.stringify({
                                            inline_keyboard: [
                                                [{ text: 'Регистрация', url: 'http://site.com' }]
                                            ]
                                        })
                                    })
                    }
                    // Block 5
                    setTimeout(function(){
                        for (var i = 0; i < notes.length; i++){
                            bot.sendMessage(notes[i]['uid'], notes[i]['text5'], {
                                            reply_markup: {
                                                keyboard: [
                                                    [KB.refering]
                                                ]
                                            }
                                        })
                            bot.sendVideo(notes[i]['uid'], 'video.mp4')
                            notes.splice(i,1);
                        }
                    },3573000)
                },1797000)
            },30000)
        },1800000)
    },540000)
},60000)
}
Answer 1
const schedule = require('node-schedule');
function sendTime(time, msg, text) {
        new schedule.scheduleJob({ start: new Date(Date.now() + Number(time) * 1000 * 60), end: new Date(new Date(Date.now() + Number(time) * 1000 * 60 + 1000)), rule: '*/1 * * * * *' }, function () {
            bot.sendMessage(msg.chat.id, text);
        });
    }

Отправить сообщение с текстом "текст" с ожиданием 5 минут при получении /send:

bot.onText(/\/send/, msg => {
     sendTime(5,msg,'текст')
})
READ ALSO
Ошибка JS: TypeError: Electron.inita is not a constructor

Ошибка JS: TypeError: Electron.inita is not a constructor

Выдает такого рода ошибкуПогуглил, узнал, что она возникает когда пытаешься вызвать функцию как конструктор, но это не конструктор

160
Как правильно вызвать функцию?

Как правильно вызвать функцию?

Как правильно вызвать функцию в Jquery, если её название записано в переменную?

128
Удаление символов в строке по маске Xx и xX (adventofcode 5 day challenge)

Удаление символов в строке по маске Xx и xX (adventofcode 5 day challenge)

Необходимо строку в файле (в аттаче) длинной 50000 символов отсортировать по маске Xx и xX и удалить их из строки

123
Вопрос про события. (vue js, jquery)

Вопрос про события. (vue js, jquery)

В общем имеется следующий js код (vue)Переделывал этот же код на jquery, вопрос тот же

135