const { reverseImageSearch } = require("#api"); const { paginator } = require("#client"); const { PERMISSION_GROUPS } = require("#constants"); const { validateAttachment } = require("#utils/attachment"); const { createEmbed, formatPaginationEmbeds, page } = require("#utils/embed"); const { acknowledge } = require("#utils/interactions"); const { editOrReply } = require("#utils/message"); const { ApplicationCommandOptionTypes } = require('detritus-client/lib/constants'); // TODO: create a favicon() util function createReverseImageSearchResultPage(context, result, source) { let res = page( createEmbed("default", context, { author: { iconUrl: `https://www.google.com/s2/favicons?domain=${encodeURIComponent(result.url)}&sz=256`, name: result.name, url: result.url }, image: { url: result.image }, thumbnail: { url: source } })) if (result.thumbnail) res.embeds[0].thumbnail = { url: result.thumbnail }; return res; } module.exports = { name: 'reverse-image-search', description: 'Searches for image matches on the internet.', contexts: [ 0, 1, 2 ], integrationTypes: [ 1 ], options: [ { name: 'image', description: 'Image to search for', type: ApplicationCommandOptionTypes.ATTACHMENT, required: true }, { name: 'incognito', description: 'Makes the response only visible to you.', type: ApplicationCommandOptionTypes.BOOLEAN, required: false, default: false } ], run: async (context, args) => { await acknowledge(context, args.incognito, [...PERMISSION_GROUPS.baseline_slash]); if(!validateAttachment(args.image, "image")) return await editOrReply(context, createEmbed("warning", context, "Unsupported attachment type.")) try{ let search = await reverseImageSearch(context, args.image.url); search = search.response if (search.body.status == 2) return editOrReply(context, createEmbed("warning", context, search.body.message)) let pages = [] for (const res of search.body.results) { pages.push(createReverseImageSearchResultPage(context, res, args.image.url)) } await paginator.createPaginator({ context, pages: formatPaginationEmbeds(pages) }); }catch(e){ console.log(e) return editOrReply(context, createEmbed("error", context, "Unable to perform reverse image search.")) } } }