102 lines
3.5 KiB
JavaScript
102 lines
3.5 KiB
JavaScript
const Spotify = require('node-spotify-api')
|
|
const chalk = require('chalk')
|
|
require('dotenv').config()
|
|
const { insertTrack } = require('./mpc-commands')
|
|
|
|
let request = ''
|
|
const handleSpam = require('./handleSpam')
|
|
|
|
const CLIENT_ID = process.env.CLIENT_ID
|
|
const CLIENT_SECRET = process.env.CLIENT_SECRET
|
|
|
|
const spotify = new Spotify({
|
|
id: CLIENT_ID,
|
|
secret: CLIENT_SECRET,
|
|
})
|
|
|
|
const parseTrackData = tracks => {
|
|
const { items } = tracks
|
|
//printTrackNames(items)
|
|
const { album, artists, uri, name } = items[0]
|
|
const artist = artists[0].name
|
|
const albumName = album.name
|
|
return { trackName: name, artistName: artist, albumName, uri }
|
|
}
|
|
|
|
const addToPlaylist = (nick, string) => {
|
|
require('fs').appendFileSync(`playlists/${nick}`, string)
|
|
}
|
|
|
|
const searchTrack = event => {
|
|
let pattern = /^!search "(.+?)"( artist "(.+?)")?/
|
|
let match = event.message.match(pattern)
|
|
if (!match)
|
|
return event.reply(
|
|
'Incorrect syntax. Use !search "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('No results.')
|
|
const { trackName, artistName, albumName, uri } = parseTrackData(
|
|
data.tracks
|
|
)
|
|
printTrackData(trackName, artistName, albumName, uri)
|
|
event.reply(`'${trackName}' by ${artistName} on album ${albumName}`)
|
|
})
|
|
}
|
|
|
|
const requestTrack = event => {
|
|
if (event.message === request) return handleSpam(event)
|
|
request = event.message
|
|
let pattern = /^!request "(.+?)"( artist "(.+?)")?/
|
|
let match = event.message.match(pattern)
|
|
if (!match)
|
|
return event.reply(
|
|
'Incorrect syntax. Use !request "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('No results.')
|
|
const { trackName, artistName, albumName, uri } = parseTrackData(
|
|
data.tracks
|
|
)
|
|
printTrackData(trackName, artistName, albumName, uri)
|
|
const { error } = insertTrack(uri)
|
|
if (error) return event.reply('Something went wrong.')
|
|
const request = `'${trackName}' by ${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 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) => {
|
|
console.log(chalk.blue('\n*******************************************\n'))
|
|
console.log('name:', name)
|
|
console.log('artist:', artist)
|
|
console.log('album:', albumName)
|
|
console.log('uri:', uri)
|
|
console.log(chalk.blue('\n*******************************************\n'))
|
|
}
|
|
|
|
module.exports = { searchTrack, requestTrack }
|