const { createEmbed, formatPaginationEmbeds, page } = require('../../../../labscore/utils/embed') const { editOrReply } = require('../../../../labscore/utils/message') const { STATICS } = require('../../../../labscore/utils/statics') const { lyrics } = require('../../../../labscore/api'); const { paginator } = require('../../../../labscore/client'); const { ApplicationCommandOptionTypes, InteractionCallbackTypes } = require('detritus-client/lib/constants'); const { smallIconPill } = require('../../../../labscore/utils/markdown'); const META_FIELDS = { "Album": "stat_videos", "Released": "note" } function renderMetadata(metadata){ const pills = [] for(const m of metadata){ if(!META_FIELDS[m.id]) continue; pills.push(smallIconPill(META_FIELDS[m.id], `${m.id}: ${m.value}`)) } return pills.join(' ') } function createLyricsPage(context, search, fields){ let em = createEmbed("default", context, { author: { iconUrl: search.body.track.artist_cover, name: `${search.body.track.title} by ${search.body.track.artist}` }, fields: fields, footer: { iconUrl: STATICS.musixmatch, text: `Musixmatch • ${context.application.name}` } }) if(search.body.track.cover) em.thumbnail = { url: search.body.track.cover } if(search.body.track.metadata.length) em.description = renderMetadata(search.body.track.metadata) return em; } module.exports = { name: 'lyrics', description: 'Search for song lyrics.', contexts: [ 0, 1, 2 ], integrationTypes: [ 1 ], options: [ { name: 'query', description: 'Song name or partial lyrics.', type: ApplicationCommandOptionTypes.TEXT, required: true } ], run: async (context, args) => { await context.respond({data: {}, type: InteractionCallbackTypes.DEFERRED_CHANNEL_MESSAGE_WITH_SOURCE}) try{ let search = await lyrics(context, args.query) search = search.response if(search.body.status == 2) return editOrReply(context, createEmbed("error", context, search.body.message)) let fields = []; for(const f of search.body.lyrics.split('\n\n')){ fields.push({ name: '​', value: f.substr(0,1024), inline: false }) } let pages = [] while(fields.length) { let pageFields = fields.splice(0,3) // Display less fields if they take up too much vertical space while(pageFields.map((f)=>f.value).join('\n').split('\n').length >= 30 && pageFields[1]){ fields.unshift(pageFields[pageFields.length - 1]) pageFields = pageFields.splice(0, pageFields.length - 1) } pages.push(page(createLyricsPage(context, search, pageFields))) } await paginator.createPaginator({ context, pages: formatPaginationEmbeds(pages) }); }catch(e){ if(e.response?.body?.status && e.response.body.status == 2 && e.response.body.message) return editOrReply(context, createEmbed("error", context, e.response.body.message)) console.log(JSON.stringify(e.raw)) return editOrReply(context, createEmbed("error", context, `Something went wrong.`)) } }, };