diff --git a/src/consoleLogger.js b/src/consoleLogger.js new file mode 100644 index 0000000..ac5964d --- /dev/null +++ b/src/consoleLogger.js @@ -0,0 +1,7 @@ +class ConsoleLogger { + static log(message) { + console.log(`${(new Date).toISOString()}: ${message}`) + } +} + +export default ConsoleLogger \ No newline at end of file diff --git a/src/index.js b/src/index.js index c42c765..788a2db 100644 --- a/src/index.js +++ b/src/index.js @@ -3,20 +3,9 @@ import config from 'config' import settings from "settings-store" import Messenger from './messenger.js' import DealsItem from './models/dealsItem.js' +import ConsoleLogger from './consoleLogger.js' -let delaySec = 1 -const delay = interval => { - console.log(`interval = ${interval}`) - return new Promise(resolve => setTimeout(resolve, interval)) -} - -async function sendMessage(messenger, message, index) { - await delay(index * delaySec * 1000) - delaySec += 10 - messenger.sendMessage(message) -} - -console.log('Initialising settings...') +ConsoleLogger.log('Initialising settings...') const settingsOpts = { appName: "oculus-deals-spider-bot", reverseDNS: "com.oculus.deals.spider.bot", @@ -26,33 +15,39 @@ settings.init(settingsOpts) const dbPath = config.get('DbPath') -console.log('Initialising DB...') +ConsoleLogger.log(`Initialising DB ${dbPath}...`) let db = new Datastore({filename: dbPath, autoload: true}) const token = config.get('TelegramToken') const telegramChannel = config.get('TelegramChannel') let messenger = new Messenger(token, telegramChannel) -console.log('Looking for deals in DB...') +ConsoleLogger.log('Looking for deals in DB...') const dbLastCheckTime = settings.value("dbLastCheckTime", 0) -console.log(`dbLastCheckTime is ${dbLastCheckTime}`) +ConsoleLogger.log(`dbLastCheckTime is ${dbLastCheckTime}`) db.find({ createdAt: { $gte: (new Date(dbLastCheckTime)).toISOString() } }, function (err, docs) { if (err) { - console.log(`Error selecting from DB: ${err}`) + ConsoleLogger.log(`Error selecting from DB: ${err}`) return } - console.log('Saving dbLastCheckTime...') + ConsoleLogger.log('Saving dbLastCheckTime...') settings.setValue("dbLastCheckTime", Date.now()) - console.log('Sending messages to Telegram channel...') - let i = 1 + ConsoleLogger.log('Sending messages to Telegram channel...') + let i = 0 + let messages = [] docs.forEach(doc => { - console.log(doc) - sendMessage(messenger, '📉 ' + new DealsItem(doc, ["deal", "oculus"]), i) + ConsoleLogger.log(doc) + ConsoleLogger.log(`queuing #${i} message`) i++ + messages.push('📉 ' + new DealsItem(doc, ["deal", "oculus"])) }) + if (messages && messages.length > 0) { + ConsoleLogger.log(`start singing messages`) + messenger.sendMessages(messages) + } }) \ No newline at end of file diff --git a/src/messenger.js b/src/messenger.js index 4d62f0d..13668bc 100644 --- a/src/messenger.js +++ b/src/messenger.js @@ -1,22 +1,24 @@ import TelegramBot from 'node-telegram-bot-api' - -let delaySec = 5 -const delay = interval => { - console.log(`interval = ${interval}`) - return new Promise(resolve => setTimeout(resolve, interval)) -} +import ConsoleLogger from './consoleLogger.js' class Messenger { constructor(token, channel) { - console.log('Initialising bot API...') + ConsoleLogger.log('Initialising bot API...') this.channel = channel this.bot = new TelegramBot(token, {polling: false}) } - async sendMessage(message) { - await delay(delaySec * 1000) - delaySec += 10 - this.bot.sendMessage(this.channel, message, {parse_mode: 'markdown'}) + async sendMessages(messages) { + const promises = messages.map((el, index) => { + return new Promise((resolve, reject) => { + setTimeout(() => { + ConsoleLogger.log(`Sending Telegram message #${index}`) + this.bot.sendMessage(this.channel, el, {parse_mode: 'markdown'}).then(resolve()) + }, (index + 1) * 5 * 1000) + }) + }) + + Promise.all(promises).then('Bulk message sending finished') } }