• Как получить chat_id из базы данных - Telegram bot?

    @paulbraam Автор вопроса
    Начинающий Node.js разработчик
    Дмитрий Гололобов, попробовал ваш вариант, работает.
    Пытаюсь сделать так, чтобы бот отправлял определённое количество сообщений из БД:

    // беру сообщения из бд
    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()
     })

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

    Вот ещё один вариант попробовал. Тут плюс, что можно остановить скрипт. Берется список юзеров, которые оправили запрос, и сообщения распределяются между юзерами, то есть если начали одновременно, то из 4 сообщений каждому придет по 2 разных.

    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)
    })

    В обоих вариантах кажется проблема в том, что cron работает для всех юзеров глобально.
    Подскажите, пожалуйста, можно как-то запускать скрипт отдельно для каждого chat_id?
    Благодарю заранее!
    Ответ написан