Дмитрий Гололобов, попробовал ваш вариант, работает.
Пытаюсь сделать так, чтобы бот отправлял определённое количество сообщений из БД:
// беру сообщения из бд
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
?
Благодарю заранее!