diff --git a/commands/message/search/quora.js b/commands/message/search/quora.js index 48b4470..831e23f 100644 --- a/commands/message/search/quora.js +++ b/commands/message/search/quora.js @@ -4,7 +4,9 @@ const { editOrReply } = require('../../../labscore/utils/message') const { STATICS } = require('../../../labscore/utils/statics') const { paginator } = require('../../../labscore/client'); -const { quora } = require('../../../labscore/api'); +const { quora, quoraResult } = require('../../../labscore/api'); +const { InteractionCallbackTypes } = require('detritus-client/lib/constants'); +const { Components } = require('detritus-client/lib/utils'); function createQuoraAnswerPage(context, question, answer){ let tags = question.tags.map((t) => { @@ -39,6 +41,80 @@ function createQuoraAnswerPage(context, question, answer){ return res; } +async function quoraPaginator(context, pages, refMappings, currentRef){ + const paging = await paginator.createPaginator({ + context, + pages, + buttons: [ + "previous", + "next", + "search" + ] + }); + + paging.on("interaction", async ({ context: ctx, listener }) => { + if(ctx.customId == "search"){ + // Kill the original paginator and replace it with a select + listener.stopWithoutUpdate() + + const components = new Components({ + timeout: 10000, + run: async (sctx) => { + if (sctx.userId !== context.userId || !context.values) { + return await sctx.respond(InteractionCallbackTypes.DEFERRED_UPDATE_MESSAGE); + } + await sctx.editOrRespond({ + embeds: [ + createEmbed("loading", context, "Loading quora result...") + ], + components: [] + }) + // Get the page reference and fetch the results + let ref = refMappings.filter((r) => r.ref == sctx.data.values[0]) + ref = ref[0] + try{ + let search = await quoraResult(context, ref.link) + search = search.response.body + + if(search.status == 2) return editOrReply(context, {embeds:[createEmbed("error", context, search.message)]}) + + let nextPages = [] + // Create the initial page + + for(const answer of search.answers){ + nextPages.push(createQuoraAnswerPage(context, search.question, answer)) + } + + nextPages = formatPaginationEmbeds(nextPages) + + await quoraPaginator(context, nextPages, refMappings, sctx.data.values[0]) + + }catch(e){ + console.log(e) + return editOrReply(context, {embeds:[createEmbed("error", context, `Unable to perform quora search.`)]}) + } + }, + }); + + let selectOptions = refMappings.map((r) => { + return { + label: r.title, + value: r.ref, + default: (r.ref == currentRef) + } + }) + + components.addSelectMenu({ + placeholder: "Select a question.", + customId: "quora-select", + options: selectOptions + }) + + await ctx.editOrRespond({components}) + } + }) +} + module.exports = { name: 'quora', label: 'query', @@ -67,10 +143,11 @@ module.exports = { } pages = formatPaginationEmbeds(pages) - const paging = await paginator.createPaginator({ - context, - pages - }); + + const refMappings = search.results + + await quoraPaginator(context, pages, refMappings, refMappings[0].ref) + }catch(e){ console.log(e) return editOrReply(context, {embeds:[createEmbed("error", context, `Unable to perform quora search.`)]}) diff --git a/labscore/api/endpoints.js b/labscore/api/endpoints.js index 8868162..d25fe1a 100644 --- a/labscore/api/endpoints.js +++ b/labscore/api/endpoints.js @@ -32,6 +32,7 @@ const Api = Object.freeze({ SEARCH_GOOGLE_IMAGES: '/search/google-images', SEARCH_LYRICS: '/search/lyrics', SEARCH_QUORA: '/search/quora', + SEARCH_QUORA_RESULT: '/search/quora-result', SEARCH_REDDIT: '/search/reddit', SEARCH_REVERSE_IMAGE: '/search/reverse-image', SEARCH_RULE34: '/search/booru', diff --git a/labscore/api/index.js b/labscore/api/index.js index e544073..33e7cd9 100644 --- a/labscore/api/index.js +++ b/labscore/api/index.js @@ -124,6 +124,12 @@ module.exports.quora = async function(context, query){ }) } +module.exports.quoraResult = async function(context, reference){ + return await request(Api.SEARCH_QUORA_RESULT, "GET", {}, { + ref: reference + }) +} + module.exports.reddit = async function(context, query, nsfw = false){ return await request(Api.SEARCH_REDDIT, "GET", {}, { q: query, diff --git a/labscore/paginator/structures/BasePaginator.js b/labscore/paginator/structures/BasePaginator.js index 3492f1d..5f01655 100644 --- a/labscore/paginator/structures/BasePaginator.js +++ b/labscore/paginator/structures/BasePaginator.js @@ -133,13 +133,21 @@ module.exports = class BasePaginator extends EventEmitter { this.pages.push(page) } - stop(timeout = false) { + async stop(timeout = false) { this.emit("stop", this, timeout); this.removeAllListeners(); const targetIndex = this.client.activeListeners.findIndex(v => v.message.id === this.message.id); this.client.activeListeners.splice(targetIndex, 1); // Disable components - this.update({components:[]}); + await this.update({components:[]}); + return this; + } + + stopWithoutUpdate(timeout = false) { + this.emit("stop", this, timeout); + this.removeAllListeners(); + const targetIndex = this.client.activeListeners.findIndex(v => v.message.id === this.message.id); + this.client.activeListeners.splice(targetIndex, 1); return this; } }; \ No newline at end of file diff --git a/labscore/paginator/structures/Paginator.js b/labscore/paginator/structures/Paginator.js index 7070bf0..1b6fe5f 100644 --- a/labscore/paginator/structures/Paginator.js +++ b/labscore/paginator/structures/Paginator.js @@ -13,6 +13,7 @@ const ButtonEmoji = Object.freeze({ NEXT: '<:right:977871577758707782>', PREVIOUS: '<:left:977871577532211200>', STOP: '<:ico_trash:929498022386221096>', + SEARCH: '<:search:1063080546365866056>', UNKNOWN: '<:ico_question:949420315677691934>' })