const Telegram = require('telegraf/telegram') const Telegraf = require('telegraf') const fs = require('fs') const https = require('https') const telegram = new Telegram(process.env.BOT_TOKEN) const bot = new Telegraf(process.env.BOT_TOKEN) const downloadPrefix = process.env.DOWNLOAD_PREFIX const musicDir = 'music' const langData = fs.readFileSync('./string/lang.json', 'utf8') const language = JSON.parse(langData) const API_URL = "https://api.telegram.org/file/bot" + process.env.BOT_TOKEN const debug = require('debug')('app') const Queue = require('bull') var lang = language.en const queue = new Queue('rateLimited', { limiter: { max: 2, duration: 60000, bounceBack: false } }) const options = { delay: 60000, // 1 min in ms attempts: 2 } // ---------------------------------------------------------------------------- queue.process(async (job) => { return await saveFile(job.data.file_id, job.data.destination, job.data.filename).then(() => { const text = 'File ' + job.data.filename + ' downloaded.' telegram.sendMessage(job.data.chat_id, text) }).catch(error => { const text = 'Error downloading file: ' + error telegram.sendMessage(job.data.chat_id, text) }) }) // ---------------------------------------------------------------------------- function cleanString(string, additionalChars) { const chars = "!@#$^&%*()+=[]\/{}|:<>?,'–" + additionalChars var result = string.normalize('NFD').trim() .replace(/[\u0300-\u036f]/g, '') for (var i=0; i < chars.length; i++) { result = result.replace(new RegExp("\\" + chars[i], 'gi'), '') } return result } // ---------------------------------------------------------------------------- function saveFile(file_id, dest, filename) { return new Promise(function(resolve, reject){ if (!fs.existsSync(dest)){ fs.mkdirSync(dest, true) } const path = dest + filename const promise = telegram.getFile(file_id) promise.then(res => { const url = API_URL + '/' + res.file_path https.get(url, response => { if(response.statusCode != 200){ debug('Error downloading file: %s', response.statuscode) reject() }else{ const file = fs.createWriteStream(path) response.pipe(file) file.on('finish', function(){ file.close() debug('File saved in: "%s"', path) resolve() }).on('error', err =>{ fs.unlink(path) debug(err) reject() }) } }) }).catch(function(error){ debug('[SaveFile,Promise][Error]: %s', error) reject() }) }) } // ---------------------------------------------------------------------------- bot.start( (ctx) => { debug('Started: %s', ctx.from.id) return ctx.reply(lang.welcome) }) // ---------------------------------------------------------------------------- bot.command('spanish', (ctx) => { lang = language.es ctx.reply(lang.langChanged) }) // ---------------------------------------------------------------------------- bot.command('english', (ctx) => { lang = language.en ctx.reply(lang.langChanged) }) // ---------------------------------------------------------------------------- bot.command('donate', (ctx) => ctx.reply(lang.donate)) // ---------------------------------------------------------------------------- bot.command('help', (ctx) => ctx.reply(lang.help)) // ---------------------------------------------------------------------------- bot.on('audio', (ctx) => { const audio = ctx.message.audio const extension = audio.file_name.split('.').pop() const performer = cleanString(audio.performer, '.') const title = cleanString(audio.title, '.') var filename = performer + ' - ' + title + '.' + extension const dest = downloadPrefix + musicDir + '/' + audio.performer + '/' var data = { file_id: audio.file_id, destination: dest, filename: filename, chat_id: ctx.chat.id } queue.add(data, options) debug('------------------------------------------------------------') debug('Job added to queue') debug('file_id: %s', data.file_id) debug('destination: %s', data.destination) debug('filename: %s', data.filename) debug('chat_id: %s', data.chat_id) debug('------------------------------------------------------------') }) // ---------------------------------------------------------------------------- bot.startPolling()