UNPKG

covilbot

Version:

Slack bot which connects with Mopidy and Spotify

104 lines (94 loc) 3.09 kB
var defaultTypes = ['album', 'artist', 'track', 'playlist'] function search(argv) { var query = argv.query.join(' ') var types = argv.types.slice() argv.db.logger.info('Searching for "%s" in types:', query, types) argv.db.spotify.search(query, types, { limit: argv.db.settings.limit, offset: 0 }) .then(function (data) { var maxCount = argv.db.settings.limit var typesCount = types.length argv.db.search.results = {} argv.db.search.hits = 0 var hit = 0 while (maxCount > 0 && typesCount > 0) { for (var t = 0; t < typesCount; t++) { var type = types[t] + 's' if (!argv.db.search.results[type]) { argv.db.search.results[type] = { items: [], total: data.body[type].total } } var length = argv.db.search.results[type].items.length if (data.body[type].items[length]) { argv.db.search.results[type].items[length] = data.body[type].items[length] maxCount-- } else { types.splice(t, 1) typesCount-- } } } for (type in argv.db.search.results) { for (var i = 0; i < argv.db.search.results[type].items.length; i++) { argv.db.search.results[type].items[i].hit = hit = hit + 1 } } argv.db.search.hits = hit if (argv.db.search.results.albums && argv.db.search.results.albums.items.length > 0) { return argv.db.spotify.getAlbums(argv.db.search.results.albums.items.map( function (album) { return album.id }) ) } else { return null } }) .then(function (data) { if (data && data.body) { for (var i = 0; i < data.body.albums.length; i++) { Object.assign(argv.db.search.results.albums.items[i], data.body.albums[i]) } } argv.db.post(argv.db.attachments.search(argv.db.search.results)) }) .catch(function (err) { argv.db.logger.error(err) }) } module.exports = { command: 'search <query..>', desc: 'Search Spotify', builder: { types: { alias: 't', type: 'array', choices: defaultTypes, default: defaultTypes, desc: 'Spotify resource type' } }, handler: function (argv) { if (!argv.db.search.expires || argv.db.search.expires <= new Date()) { argv.db.logger.info('Retrieve an access token') argv.db.spotify.clientCredentialsGrant() .then(function(data) { argv.db.logger.info('The access token expires in ' + data.body['expires_in']) argv.db.search.expires = new Date() argv.db.search.expires.setTime(argv.db.search.expires.getTime() + data.body['expires_in'] * 1000) argv.db.logger.info('The access token is ' + data.body['access_token']) // Save the access token so that it's used in future calls argv.db.spotify.setAccessToken(data.body['access_token']) search(argv) }, function(err) { argv.db.logger.error('Something went wrong when retrieving an access token', err); }) } else { search(argv) } } }