Как запустить cronjob для конкретного пользователя c - бот Telegram - PullRequest
0 голосов
/ 03 мая 2020

Я пытаюсь создать бота Telegram, который делает следующее: как только пользователь отправляет команду, он начинает ежедневно получать серии сообщений. Это похоже на небольшой курс с ежедневными уроками.

Я использую Telegraf, cron для запуска мероприятия и MongoDB для хранения пользовательских данных.

Я пытался сделать это двумя способами.

Первый скрипт:

const messages = data.get('messages')
    .map('message')
    .value();

let i=0;

const CronJob = require('cron').CronJob;

const createJob = async function(chatid) {
  return new CronJob('*/15 * * * * *', async function() {
    const user = await db.User.findOne({chat_id: chatid});
    await bot.telegram.sendMessage(user.chat_id, messages[i]);
    console.log('Job running');
    i++;
 });
 }

 bot.command('launch', async (ctx) => {
   const myNewJob = await createJob(ctx.chat.id)
   await bot.telegram.sendMessage(ctx.chat.id, `Let's start`);
   myNewJob.start()
 })

Но в результате пользователь, который запускает скрипт в последний раз, перехватывает сообщения, то есть получает сообщения не с самого начала. Более того, скрипт не может быть остановлен.

Вот еще один скрипт, который я пробовал:

const messages = data.get('messages')
    .map('message')
    .value();

const CronJob = require('cron').CronJob;

const usersToNotify = []

let i=0;

const job = new CronJob('*/15 * * * * *', async function() {
  for await (const user of usersToNotify) {
    await bot.telegram.sendMessage(user, messages[i]);
    i++;
    if (messages.length == i) {
      job.stop();
      }
}
})

job.start()

bot.command('launch', async (ctx) => {
  const User = await db.User.findOne({chat_id: ctx.chat.id});
  usersToNotify.push(User.chat_id)
})

bot.command('stop', async (ctx) => {
  const User = await db.User.findOne({chat_id: ctx.chat.id});
  const index = usersToNotify.findIndex(value => value === User.chat_id)
  usersToNotify.splice(index,1)
})

Этот получает chat_id пользователей, которые запускают скрипт и создает массив пользователей. , Но в этом случае, если 2 пользователя отправят команду одновременно, они получат, скажем, 2 разных сообщения из 4.

В обоих случаях сценарий работает глобально. Не могли бы вы предложить решение о том, как запустить скрипт для конкретного пользователя c, в частности?

...