Я пытаюсь создать бота 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, в частности?