| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143 |
- 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()
|