Skip to content

Commit

Permalink
added better delay for sending messages
Browse files Browse the repository at this point in the history
  • Loading branch information
introkun committed Feb 12, 2021
1 parent ebc59df commit ab3c9df
Show file tree
Hide file tree
Showing 3 changed files with 37 additions and 33 deletions.
7 changes: 7 additions & 0 deletions src/consoleLogger.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
class ConsoleLogger {
static log(message) {
console.log(`${(new Date).toISOString()}: ${message}`)
}
}

export default ConsoleLogger
39 changes: 17 additions & 22 deletions src/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand All @@ -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)
}
})
24 changes: 13 additions & 11 deletions src/messenger.js
Original file line number Diff line number Diff line change
@@ -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')
}
}

Expand Down

0 comments on commit ab3c9df

Please sign in to comment.