mirror of
https://gitlab.com/bignutty/labscore.git
synced 2025-06-07 13:43:06 -04:00
98 lines
No EOL
3.3 KiB
JavaScript
98 lines
No EOL
3.3 KiB
JavaScript
const { paginator } = require('#client');
|
|
const { PERMISSION_GROUPS } = require('#constants');
|
|
|
|
const { createEmbed, formatPaginationEmbeds, page } = require('#utils/embed')
|
|
const { editOrReply } = require('#utils/message')
|
|
|
|
const superagent = require('superagent')
|
|
|
|
// TODO: create a favicon() util
|
|
module.exports = {
|
|
name: 'xkcd',
|
|
label: 'query',
|
|
metadata: {
|
|
description: 'Search XKCD comics.',
|
|
description_short: 'Search XKCD comics.',
|
|
examples: ['xkcd lead pipe'],
|
|
category: 'search',
|
|
usage: 'xkcd <query>'
|
|
},
|
|
permissionsClient: [...PERMISSION_GROUPS.baseline],
|
|
run: async (context, args) => {
|
|
context.triggerTyping();
|
|
if (!args.query) return editOrReply(context, createEmbed("warning", context, `Missing Parameter (query).`))
|
|
|
|
if(!isNaN(parseInt(args.query))){
|
|
try{
|
|
let search = await superagent.get(`https://xkcd.com/${parseInt(args.query)}/info.0.json`)
|
|
|
|
return editOrReply(context, createEmbed("default", context, {
|
|
author: {
|
|
name: search.body.safe_title,
|
|
url: `https://xkcd.com/${search.body.num}/`
|
|
},
|
|
description: search.body.alt,
|
|
image: {
|
|
url: search.body.img
|
|
},
|
|
footer: {
|
|
iconUrl: `https://www.google.com/s2/favicons?domain=xkcd.com&sz=256`,
|
|
text: `xkcd • ${context.application.name}`
|
|
}
|
|
}))
|
|
}catch(e){
|
|
return editOrReply(context, createEmbed("error", context, `Comic not found.`))
|
|
}
|
|
} else {
|
|
try {
|
|
let search = await superagent.post(`https://qtg5aekc2iosjh93p.a1.typesense.net/multi_search?use_cache=true&x-typesense-api-key=${process.env.XKCD_KEY}`)
|
|
.send({
|
|
"searches": [
|
|
{
|
|
"query_by": "title,altTitle,transcript,topics,embedding",
|
|
"query_by_weights": "127,80,80,1,1",
|
|
"num_typos": 1,
|
|
"exclude_fields": "embedding",
|
|
"vector_query": "embedding:([], k: 30, distance_threshold: 0.1, alpha: 0.9)",
|
|
"highlight_full_fields": "title,altTitle,transcript,topics,embedding",
|
|
"collection": "xkcd",
|
|
"q": args.query,
|
|
"facet_by": "topics,publishDateYear",
|
|
"max_facet_values": 100,
|
|
"page": 1,
|
|
"per_page": 100
|
|
}
|
|
]
|
|
})
|
|
|
|
let pages = []
|
|
for (const res of search.body.results[0].hits) {
|
|
pages.push(page(createEmbed("default", context, {
|
|
author: {
|
|
name: res.document.title,
|
|
url: `https://xkcd.com/${res.document.id}/`
|
|
},
|
|
description: res.document.altTitle,
|
|
image: {
|
|
url: res.document.imageUrl
|
|
},
|
|
footer: {
|
|
iconUrl: `https://www.google.com/s2/favicons?domain=xkcd.com&sz=256`,
|
|
text: `xkcd • ${context.application.name}`
|
|
}
|
|
})))
|
|
}
|
|
|
|
if (!pages.length) return editOrReply(context, createEmbed("warning", context, `No results found.`))
|
|
|
|
await paginator.createPaginator({
|
|
context,
|
|
pages: formatPaginationEmbeds(pages)
|
|
});
|
|
} catch (e) {
|
|
console.log(e)
|
|
return editOrReply(context, createEmbed("error", context, `Unable to perform xkcd search.`))
|
|
}
|
|
}
|
|
},
|
|
}; |