UNPKG

wabot

Version:

Whatsapp Bot Module for automate response and interact whit users

358 lines (301 loc) 14.2 kB
<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>Wabot Documentation plugins/music.js</title> <script src="https://cdn.jsdelivr.net/gh/google/code-prettify@master/loader/run_prettify.js"></script> <script src="https://unpkg.com/@babel/standalone/babel.min.js"></script> <script src="./build/entry.js"></script> <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> <!--[if lt IE 9]> <script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script> <![endif]--> <link href="https://fonts.googleapis.com/css?family=Roboto:100,400,700|Inconsolata,700" rel="stylesheet"> <link rel="stylesheet" href="https://use.fontawesome.com/releases/v5.6.3/css/all.css" integrity="sha384-UHRtZLI+pbxtHCWp1t77Bi1L4ZtiqrqD80Kn4Z8NTSRyMA2Fd33n5dQ8lWUE00s/" crossorigin="anonymous"> <link type="text/css" rel="stylesheet" href="https://jmblog.github.io/color-themes-for-google-code-prettify/themes/tomorrow-night.min.css"> <link type="text/css" rel="stylesheet" href="styles/app.min.css"> <link type="text/css" rel="stylesheet" href="styles/iframe.css"> <link type="text/css" rel="stylesheet" href=""> <script async defer src="https://buttons.github.io/buttons.js"></script> </head> <body class="layout small-header"> <div id="stickyNavbarOverlay"></div> <div class="top-nav"> <div class="inner"> <a id="hamburger" role="button" class="navbar-burger" aria-label="menu" aria-expanded="false"> <span aria-hidden="true"></span> <span aria-hidden="true"></span> <span aria-hidden="true"></span> </a> <div class="logo"> <a href="index.html"> <h1 class="navbar-item">Wabot Documentation</h1> </a> </div> <div class="menu"> <div class="navigation"> <a href="index.html" class="link" > API Documentation </a> <a class="link user-link " href="https://github.com/luiscruzga/wabot" > Github </a> <a class="link user-link " href="https://github.com/luiscruzga/wabot/blob/master/example/test.js" > Example </a> </div> </div> </div> </div> <div id="main"> <div class="sidebar " id="sidebarNav" > <div class="search-wrapper"> <input id="search" type="text" placeholder="Search docs..." class="input"> </div> <nav> <h2><a href="index.html">Documentation</a></h2><div class="category"><h3>Namespaces</h3><ul><li><a href="Plugins.html">Plugins</a></li></ul><h3>Classes</h3><ul><li><a href="WABOT.html">WABOT</a></li></ul><h3>Events</h3><ul><li><a href="WABOT.html#event:command">command</a></li><li><a href="WABOT.html#event:message">message</a></li><li><a href="WABOT.html#event:onAddedToGroup">onAddedToGroup</a></li><li><a href="WABOT.html#event:onBattery">onBattery</a></li><li><a href="WABOT.html#event:onMessageFromBloqued">onMessageFromBloqued</a></li><li><a href="WABOT.html#event:onMessageFromNoPrivileges">onMessageFromNoPrivileges</a></li><li><a href="WABOT.html#event:onMessageMediaUploadedEvent">onMessageMediaUploadedEvent</a></li><li><a href="WABOT.html#event:onParticipantsChanged">onParticipantsChanged</a></li><li><a href="WABOT.html#event:onPlugged">onPlugged</a></li><li><a href="WABOT.html#event:onRemovedFromGroup">onRemovedFromGroup</a></li><li><a href="WABOT.html#event:onStateChanged">onStateChanged</a></li><li><a href="WABOT.html#event:ready">ready</a></li><li><a href="WABOT.html#event:vcard">vcard</a></li><li><a href="WABOT.html#event:waitNewAcknowledgements">waitNewAcknowledgements</a></li></ul></div> </nav> </div> <div class="core" id="main-content-wrapper"> <div class="content"> <header class="page-title"> <p>Source</p> <h1>plugins/music.js</h1> </header> <section> <article> <pre class="prettyprint source linenums"><code>// Modules to install separately const puppeteer = require('puppeteer'); const request = require('request'); const fs = require('fs'); const path = require('path'); var timeRefresh = 120; const musicPath = './files/'; var clientId = ''; function randomUUI(a,b){for(b=a='';a++&lt;36;b+=a*51&amp;52?(a^15?8^Math.random()*(a^20?16:4):4).toString(16):'');return b} const getConfigInfo = async () => { const browser = await puppeteer.launch({ headless: true }); const page = await browser.newPage(); await page.setRequestInterception(true); page.on('request', async (request) => { if (request.url().indexOf('https://api-v2.soundcloud.com/search?') == 0){ const url = request.url(); const params = url.split('&amp;'); const client_id = params.find(el => el.indexOf('client_id') == 0).replace('client_id=', ''); clientId = client_id || ''; } request.continue(); }); await page.goto('https://soundcloud.com/search?q=dance%20monkey', { waitUntil: 'load', timeout: 0 }); await browser.close(); } function escapeRegExp(string){ return string.replace(/[.*+?^${}()|[\]\\]/g, "\\$&amp;"); } function replaceAll(str, term, replacement) { return str.replace(new RegExp(escapeRegExp(term), 'g'), replacement); } function replaceEspecialCharacter(str){ var chars={ "á":"a", "é":"e", "í":"i", "ó":"o", "ú":"u", "à":"a", "è":"e", "ì":"i", "ò":"o", "ù":"u", "Á":"A", "É":"E", "Í":"I", "Ó":"O", "Ú":"U", "À":"A", "È":"E", "Ì":"I", "Ò":"O", "Ù":"U"} var expr=/[áàéèíìóòúù]/ig; var res=str.replace(expr,function(e){return chars[e]}); return res; } var downloadMp3 = async function(in_url){ return new Promise(function(resolve, reject) { let uui = randomUUI(); let mp3File = path.join(__dirname, `${musicPath}${uui}.mp3`); request(in_url) .on('error', (err) => { reject('Error'); }) .pipe(fs.createWriteStream(mp3File)) .on('close', () => resolve(mp3File)) .on('error', error => reject('Error')) }) } var searchProgressiveMp3 = async function(in_url, client_id){ return new Promise(function(resolve, reject) { request(`${in_url}?client_id=${client_id}`, { json: true }, (err, res, body) => { if (err) { reject('Error'); }else{ resolve(body); } }); }) } var searchTrack = async function (in_search, client_id){ return new Promise(function(resolve, reject) { request(`https://api-v2.soundcloud.com/search/tracks?kind=%27user%27&amp;client_id=${client_id}&amp;q=${replaceEspecialCharacter(in_search)}`, { json: true }, (err, res, body) => { if (err) { reject('Error'); }else{ resolve(body); } }); }) } const defaultConfig = { idChat: '', search: '', messageError: '*Ooops, An error occurred while trying to get the requested song, please try again later*', messageNoDataFound: '*The requested song could not be found, please try another*', messageValidClientId: '*A valid clientId must be provided*' } /** * Plugin to get a song in mp3 format directly from soundcloud * @function music * @memberof Plugins * @param {string} idChat - Chat id to send the new image to * @param {string} search - Customer search parameter * @param {string} messageError - Message to send in case of error * @param {string} messageNoDataFound - Message to send in case of not finding information * @param {string} messageValidClientId - Message to send when a clientId is not indicated in the initial configuration * @see {@link https://soundcloud.com|SoundCloud} */ module.exports = { /** * Id - Name of the plugin to use * @property {string} id - Name of the plugin to use */ id: 'music', /** * Initial setting function to pass the parameters manually (no longer necessary, there is a process that does it) * @param {object} data - Initial information for the plugin * @param {string} data.clientId */ setup(data) { if (typeof data.clientId !== 'undefined') { clientId = data.clientId } }, /** * Initial function triggered only if the user adds this plugin to the initial configuration */ init() { // REFRESH Config Info EVERY X MINUTES getConfigInfo(); setInterval(() => { getConfigInfo(); }, 60000 * timeRefresh); }, plugin(_args) { let _this = this; const args = _this.mergeOpts(defaultConfig, _args); if (args.idChat !== '' &amp;&amp; args.search !== '') { if (clientId !== ''){ searchTrack(args.search.toLowerCase().trim(), clientId.trim()) .then(data => { if(typeof data.collection === 'undefined' || data.collection === undefined || data.collection.length === 0){ _this.sendMessage({ "idChat": args.idChat, "message": args.messageNoDataFound }); }else{ let track, media, progressiveUrl; let found_ = false; for(var x=0; x &lt; data.collection.length; x++){ track = data.collection[x]; // Para prevenir descargar canciones Preview if (track.duration > 30000){ media = track.media.transcodings.find(obj => obj.format.protocol === 'progressive'); if(media !== undefined){ found_ = true; progressiveUrl = media.url; break; } } } if(!found_){ _this.sendMessage({ "idChat": args.idChat, "message": args.messageNoDataFound }); }else { searchProgressiveMp3(progressiveUrl, clientId.trim()) .then(dataMp3 => { downloadMp3(dataMp3.url) .then(file_ => { var bitmap = fs.readFileSync(file_); var encodedstring = new Buffer.from(bitmap).toString('base64'); fs.unlinkSync(file_); _this.sendMusic({ "idChat": args.idChat, "file": encodedstring }) }) .catch(err => { _this.sendMessage({ "idChat": args.idChat, "message": args.messageError }); }) }) .catch(err => { _this.sendMessage({ "idChat": args.idChat, "message": args.messageError }); }) } } }) .catch(err => { _this.sendMessage({ "idChat": args.idChat, "message": args.messageError }); }) } else { _this.sendMessage({ "idChat": args.idChat, "message": args.messageValidClientId }); } } } }; </code></pre> </article> </section> </div> <footer class="footer"> <div class="content has-text-centered"> <p>Documentation generated by <a href="https://github.com/jsdoc3/jsdoc">JSDoc 3.6.6</a></p> <p class="sidebar-created-by"> <a href="https://github.com/SoftwareBrothers/better-docs" target="_blank">BetterDocs theme</a> provided with <i class="fas fa-heart"></i> by <a href="http://softwarebrothers.co" target="_blank">SoftwareBrothers - JavaScript Development Agency</a> </p> </div> </footer> </div> <div id="side-nav" class="side-nav"> </div> </div> <script src="scripts/app.min.js"></script> <script>PR.prettyPrint();</script> <script src="scripts/linenumber.js"> </script> <script src="scripts/search.js"> </script> </body> </html>