From 8362ef0659244c07e5f9e357dc27acfa8b432854 Mon Sep 17 00:00:00 2001 From: notnull Date: Wed, 25 Dec 2019 06:35:18 -0500 Subject: [PATCH] add ability to delete tracks --- package-lock.json | 22 ++++++++++++---------- src/irc-bot.js | 19 +++++-------------- src/linx-commands.js | 16 ++++++++++++++++ src/mpc-commands.js | 22 ++++++++++++++++++++++ src/spotify.js | 41 +++++++++++++++++++++++++++++++---------- 5 files changed, 86 insertions(+), 34 deletions(-) create mode 100644 src/linx-commands.js diff --git a/package-lock.json b/package-lock.json index 97ea0e8..56b8fb3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -689,16 +689,6 @@ "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" }, - "form-data": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", - "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", - "requires": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.6", - "mime-types": "^2.1.12" - } - }, "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", @@ -1209,6 +1199,18 @@ "tough-cookie": "~2.4.3", "tunnel-agent": "^0.6.0", "uuid": "^3.3.2" + }, + "dependencies": { + "form-data": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz", + "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.6", + "mime-types": "^2.1.12" + } + } } }, "request-promise": { diff --git a/src/irc-bot.js b/src/irc-bot.js index e24adc0..8304c9c 100644 --- a/src/irc-bot.js +++ b/src/irc-bot.js @@ -1,13 +1,9 @@ const IRC = require('irc-framework') const bot = new IRC.Client() -const { - getPlaylist, - getCurrentTrack, - skipTrack, - reset, -} = require('./mpc-commands') -const { searchTrack, requestTrack } = require('./spotify') +const { searchTrack, requestTrack, deleteTrack } = require('./spotify') +const { getCurrentTrack, skipTrack, reset } = require('./mpc-commands') +const { getMyPlaylist } = require('./linx-commands') const chalk = require('chalk') const owners = ['notnull'] @@ -37,8 +33,9 @@ bot.matchMessage(/^!part/, event => handlePart(event)) bot.matchMessage(/^!quit/, event => handleQuit(event)) /** RADIO COMMANDS**/ -bot.matchMessage(/^!playlist/, event => sendPlaylist(event)) +bot.matchMessage(/^!playlist/, event => getMyPlaylist(event, bot)) bot.matchMessage(/^!request/, event => requestTrack(event)) +bot.matchMessage(/^!delete/, event => deleteTrack(event)) bot.matchMessage(/^!search/, event => searchTrack(event)) bot.matchMessage(/^!skip/, event => sendSkipTrack(event)) bot.matchMessage(/^!help/, event => sendHelp(event)) @@ -63,12 +60,6 @@ const handleReset = event => { if (!owners.includes(event.nick)) return reset(event) } -const sendPlaylist = event => { - const { error, playlist } = getPlaylist() - if (error) return event.reply('Something went wrong.') - const splitPlaylist = playlist.split('\n').slice(0, 5) - splitPlaylist.map(s => bot.say(event.nick, s)) -} const sendHelp = event => { const help = [ diff --git a/src/linx-commands.js b/src/linx-commands.js new file mode 100644 index 0000000..cb1d891 --- /dev/null +++ b/src/linx-commands.js @@ -0,0 +1,16 @@ +const axios = require('axios') +const fs = require('fs') + +const getMyPlaylist = (event, bot) => { + fs.readFile(`./playlists/${event.nick}`, 'utf-8', (err, playlist) => { + if (err) return event.reply("You don't have a playlist.") + const config = { headers: { 'Linx-Randomize': 'yes' } } + axios + .put('https://irc.anarchyplanet.org/img/upload', playlist, config) + .then(res => { + bot.say(event.nick, res.data) + }) + }) +} + +module.exports = { getMyPlaylist } diff --git a/src/mpc-commands.js b/src/mpc-commands.js index 7672ae5..be558be 100644 --- a/src/mpc-commands.js +++ b/src/mpc-commands.js @@ -79,10 +79,32 @@ const play = event => { if (error) return handleError(error, event) } +const removeTrack = (trackName, artistName, uri, event) => { + console.log('removing track', uri, event.nick) + fs.readFile('./playlists/' + event.nick, 'utf-8', (err, playlist) => { + console.log('err', err, 'playlist', playlist) + if (err) return event.reply("You don't have a playlist.") + const match = playlist.split('\n').find(p => p.match(new RegExp(uri))) + if (!match) return event.reply("This track wasn't found in your playlist.") + const filteredPlaylist = playlist.split('\n').filter(t => t !== match) + fs.writeFile( + `./playlists/${'notnull'}`, + filteredPlaylist.join('\n'), + err => { + if (err) return handleError(err) + return event.reply( + `${trackName} by ${artistName} was successfully deleted from your playlist.` + ) + } + ) + }) +} + module.exports = { getPlaylist, getCurrentTrack, skipTrack, insertTrack, + removeTrack, reset, } diff --git a/src/spotify.js b/src/spotify.js index d8e94a3..2bc9f4f 100644 --- a/src/spotify.js +++ b/src/spotify.js @@ -1,7 +1,7 @@ const Spotify = require('node-spotify-api') const chalk = require('chalk') require('dotenv').config() -const { insertTrack } = require('./mpc-commands') +const { insertTrack, removeTrack } = require('./mpc-commands') let request = '' const handleSpam = require('./handleSpam') @@ -72,26 +72,47 @@ const requestTrack = event => { printTrackData(trackName, artistName, albumName, uri) const { error } = insertTrack(uri) if (error) return event.reply('Something went wrong.') - const request = `'${trackName}' by ${artistName}` + const request = `"${trackName}" artist "${artistName}"` addToPlaylist(event.nick, `${uri} # ${request}`) event.reply(`Requested ${request}`) }) } -// const printQuery = query => { -// console.log(chalk.red('\n*******************************************\n')) -// console.log('Sending the following query to Spotify:') -// console.log(query) -// console.log(chalk.red('\n*******************************************\n')) -// } +const deleteTrack = event => { + console.log('Deleting', event.message) + let pattern = /^!delete ["“](.+?)["”]( artist ["“](.+?)["”])?/ + let match = event.message.match(pattern) + if (!match) + return event.reply( + 'Use !delete "track name" artist "artist name" (artist and artist name optional)' + ) + + let query = match[1] + if (match[3]) query += ` artist:${match[3]}` + printQuery(query) + spotify.search({ type: 'track', query }).then(data => { + if (!data || !data.tracks) return event.reply('Something went wrong.') + if (data.tracks.total === 0) return event.reply('Not found.') + const { trackName, artistName, uri } = parseTrackData(data.tracks) + removeTrack(trackName, artistName, uri, event) + }) +} + +const printQuery = query => { + console.log(chalk.red('\n*******************************************\n')) + console.log('Sending the following query to Spotify:') + console.log(query) + console.log(chalk.red('\n*******************************************\n')) +} // const printTrackNames = items => { // console.log(chalk.yellow('\n*******************************************\n')) // console.log('Search returned the following tracks:') // items.map(i => console.log(`'${i.name}' by ${i.artists[0].name}`)) // console.log(chalk.yellow('\n*******************************************\n')) // } -const printTrackData = (name, artist, albumName, uri) => { +const printTrackData = (name, artist, albumName, uri, message) => { console.log(chalk.blue('\n*******************************************\n')) + if (message) console.log(message) console.log('name:', name) console.log('artist:', artist) console.log('album:', albumName) @@ -99,4 +120,4 @@ const printTrackData = (name, artist, albumName, uri) => { console.log(chalk.blue('\n*******************************************\n')) } -module.exports = { searchTrack, requestTrack } +module.exports = { searchTrack, requestTrack, deleteTrack }