From c5d49cf0f72e71f150052cf3c09c85231595b53c Mon Sep 17 00:00:00 2001 From: bignutty <3515180-bignutty@users.noreply.gitlab.com> Date: Sat, 22 Feb 2025 15:20:11 +0100 Subject: [PATCH] update translate header design (again, this time consistently) --- commands/interaction/context/ocr.js | 14 +- commands/interaction/slash/utils/ocr.js | 152 +++++++++++------- commands/interaction/slash/utils/translate.js | 4 +- commands/message/utils/ocrtr.js | 6 +- commands/message/utils/translate.js | 2 +- 5 files changed, 109 insertions(+), 69 deletions(-) diff --git a/commands/interaction/context/ocr.js b/commands/interaction/context/ocr.js index 5c1aef1..ea94c38 100644 --- a/commands/interaction/context/ocr.js +++ b/commands/interaction/context/ocr.js @@ -4,12 +4,12 @@ const { TRANSLATE_DISPLAY_MAPPINGS, TRANSLATE_LANGUAGES, PERMISSION_GROUPS } = r const { getMessageAttachment, validateAttachment } = require('#utils/attachment'); const { createEmbed } = require('#utils/embed'); const { acknowledge } = require('#utils/interactions'); -const { codeblock, pill, icon, iconAsEmojiObject } = require('#utils/markdown'); +const { codeblock, pill, icon, stringwrap} = require('#utils/markdown'); const { editOrReply } = require('#utils/message'); -const { STATICS, STATIC_ACTIONS } = require('#utils/statics'); +const { STATICS } = require('#utils/statics'); const { Context, Argument } = require('detritus-client/lib/command'); -const { ApplicationCommandTypes, MessageFlags, InteractionContextTypes, ApplicationIntegrationTypes, MessageComponentTypes, InteractionCallbackTypes } = require("detritus-client/lib/constants"); +const { ApplicationCommandTypes, MessageFlags, InteractionContextTypes, ApplicationIntegrationTypes, InteractionCallbackTypes } = require("detritus-client/lib/constants"); const { Components } = require('detritus-client/lib/utils'); module.exports = { @@ -39,13 +39,13 @@ module.exports = { if(attachment && validateAttachment(attachment, "image")){ attachment = attachment.url } else { - delete attachment; + attachment = false; } if(!attachment) return editOrReply(context, createEmbed("warning", context, "No images found.")) let ocr = await googleVisionOcr(context, attachment) - if(ocr.response.body.status == 1) return editOrReply(context, createEmbed("warning", context, ocr.response.body.text)) + if(ocr.response.body.status === 1) return editOrReply(context, createEmbed("warning", context, ocr.response.body.text)) const components = new Components({ timeout: 100000, @@ -54,11 +54,11 @@ module.exports = { let translate = await googleTranslate(context, ocr.response.body.text, "en", "auto") - let fromFlag = TRANSLATE_DISPLAY_MAPPINGS[translate.response.body.language.from || sourceLanguage] || '' + let fromFlag = TRANSLATE_DISPLAY_MAPPINGS[translate.response.body.language.from] || '' let toFlag = TRANSLATE_DISPLAY_MAPPINGS[translate.response.body.language.to] || '' return editOrReply(context, createEmbed("default", context, { - description: `${icon("locale")} ​ ${fromFlag} ${pill(TRANSLATE_LANGUAGES[translate.response.body.language.from || sourceLanguage] || translate.response.body.language.from || "Detected Language")} ​ ​ ​​${icon("arrow_right")} ​ ​ ​ ​${toFlag} ${pill(TRANSLATE_LANGUAGES[translate.response.body.language.to] || translate.response.body.language.to)}\n${codeblock("ansi", [translate.response.body.translation])}`, + description: `-# ${icon("locale")} ​ ${fromFlag} ${pill(TRANSLATE_LANGUAGES[translate.response.body.language.from] || translate.response.body.language.from || "Detected Language")} ​ ​ ​​${icon("arrow_right")} ​ ​ ​ ​${toFlag} ${pill(TRANSLATE_LANGUAGES[translate.response.body.language.to] || translate.response.body.language.to)}\n${codeblock("ansi", [stringwrap(translate.response.body.translation, 1900)])}`, thumbnail: { url: attachment }, diff --git a/commands/interaction/slash/utils/ocr.js b/commands/interaction/slash/utils/ocr.js index a6f8c8d..6e24fa1 100644 --- a/commands/interaction/slash/utils/ocr.js +++ b/commands/interaction/slash/utils/ocr.js @@ -1,64 +1,104 @@ -const { googleVisionOcr } = require("#api"); -const { PERMISSION_GROUPS } = require("#constants"); +const {googleVisionOcr, googleTranslate} = require("#api"); +const {PERMISSION_GROUPS, TRANSLATE_DISPLAY_MAPPINGS, TRANSLATE_LANGUAGES} = require("#constants"); -const { validateAttachment } = require("#utils/attachment"); -const { createEmbed } = require("#utils/embed"); -const { acknowledge } = require("#utils/interactions"); -const { codeblock, stringwrap } = require("#utils/markdown"); -const { editOrReply } = require("#utils/message"); -const { STATICS } = require("#utils/statics"); +const {validateAttachment} = require("#utils/attachment"); +const {createEmbed} = require("#utils/embed"); +const {acknowledge} = require("#utils/interactions"); +const {codeblock, stringwrap, icon, pill} = require("#utils/markdown"); +const {editOrReply} = require("#utils/message"); +const {STATICS} = require("#utils/statics"); -const { ApplicationCommandOptionTypes, InteractionContextTypes, ApplicationIntegrationTypes } = require('detritus-client/lib/constants'); +const { + ApplicationCommandOptionTypes, + InteractionContextTypes, + ApplicationIntegrationTypes, + InteractionCallbackTypes +} = require('detritus-client/lib/constants'); +const {Components} = require("detritus-client/lib/utils"); module.exports = { - name: 'ocr', - description: 'Reads text contents from an image.', - contexts: [ - InteractionContextTypes.GUILD, - InteractionContextTypes.PRIVATE_CHANNEL, - InteractionContextTypes.BOT_DM - ], - integrationTypes: [ - ApplicationIntegrationTypes.USER_INSTALL - ], - options: [ - { - name: 'image', - description: 'Image to scan', - 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 ocr = await googleVisionOcr(context, args.image.url); - - if(ocr.response.body.status == 1) return context.editOrRespond({ embeds: [createEmbed("warning", context, ocr.response.body.text)] }) - - return await editOrReply(context, createEmbed("default", context, { - thumbnail: { - url: args.image.url + name: 'ocr', + description: 'Reads text contents from an image.', + contexts: [ + InteractionContextTypes.GUILD, + InteractionContextTypes.PRIVATE_CHANNEL, + InteractionContextTypes.BOT_DM + ], + integrationTypes: [ + ApplicationIntegrationTypes.USER_INSTALL + ], + options: [ + { + name: 'image', + description: 'Image to scan', + type: ApplicationCommandOptionTypes.ATTACHMENT, + required: true }, - description: codeblock("ansi", ["​" + stringwrap(ocr.response.body.text, 2000)]), - footer: { - iconUrl: STATICS.googlelens, - text: `Google Lens • ${context.application.name} • Took ${ocr.timings}s` + { + 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 ocr = await googleVisionOcr(context, args.image.url); + + if (ocr.response.body.status === 1) return context.editOrRespond({embeds: [createEmbed("warning", context, ocr.response.body.text)]}) + + const components = new Components({ + timeout: 100000, + run: async (ctx) => { + if (ctx.userId !== context.userId) return await ctx.respond(InteractionCallbackTypes.DEFERRED_UPDATE_MESSAGE); + + let translate = await googleTranslate(context, ocr.response.body.text, "en", "auto") + + let fromFlag = TRANSLATE_DISPLAY_MAPPINGS[translate.response.body.language.from] || '' + let toFlag = TRANSLATE_DISPLAY_MAPPINGS[translate.response.body.language.to] || '' + + return editOrReply(context, createEmbed("default", context, { + description: `-# ${icon("locale")} ​ ${fromFlag} ${pill(TRANSLATE_LANGUAGES[translate.response.body.language.from] || translate.response.body.language.from || "Detected Language")} ​ ​ ​​${icon("arrow_right")} ​ ​ ​ ​${toFlag} ${pill(TRANSLATE_LANGUAGES[translate.response.body.language.to] || translate.response.body.language.to)}\n${codeblock("ansi", [stringwrap(translate.response.body.translation, 1900)])}`, + thumbnail: { + url: args.image.url + }, + footer: { + iconUrl: STATICS.googletranslate, + text: `Google Translate • ${context.application.name}` + } + })) + } + }) + + components.addButton({ + label: "Translate", + emoji: icon("button_translate"), + custom_id: "actions-translate", + style: 2 + }) + + return await editOrReply(context, { + embeds: [createEmbed( + "default", context, { + thumbnail: { + url: args.image.url + }, + description: codeblock("ansi", ["​" + stringwrap(ocr.response.body.text, 2000)]), + footer: { + iconUrl: STATICS.googlelens, + text: `Google Lens • ${context.application.name} • Took ${ocr.timings}s` + } + })], + components + }) + } catch (e) { + console.log(e) + return editOrReply(context, createEmbed("error", context, "Unable to perform OCR.")) } - })) - }catch(e){ - console.log(e) - return editOrReply(context, createEmbed("error", context, "Unable to perform OCR.")) } - } } \ No newline at end of file diff --git a/commands/interaction/slash/utils/translate.js b/commands/interaction/slash/utils/translate.js index 515af7c..4158551 100644 --- a/commands/interaction/slash/utils/translate.js +++ b/commands/interaction/slash/utils/translate.js @@ -76,14 +76,14 @@ module.exports = { let toFlag = TRANSLATE_DISPLAY_MAPPINGS[translate.response.body.language.to] || '' return editOrReply(context, createEmbed("default", context, { - description: `-# ${icon("subtext_translate")} Translated from​ ${fromFlag} **${TRANSLATE_LANGUAGES[translate.response.body.language.from || sourceLanguage] || translate.response.body.language.from || args.from}** to ​${toFlag} **${TRANSLATE_LANGUAGES[translate.response.body.language.to] || translate.response.body.language.to}**.\n${codeblock("ansi", [translate.response.body.translation])}`, + description: `-# ${icon("locale")} ​ ${fromFlag} ${pill(TRANSLATE_LANGUAGES[translate.response.body.language.from || sourceLanguage] || translate.response.body.language.from || "Detected Language")} ​ ​ ​​${icon("arrow_right")} ​ ​ ​ ​${toFlag} ${pill(TRANSLATE_LANGUAGES[translate.response.body.language.to] || translate.response.body.language.to)}\n${codeblock("ansi", [translate.response.body.translation])}`, footer: { iconUrl: STATICS.googletranslate, text: `Google Translate • ${context.application.name}` } })) }catch(e){ - if(e.response?.body?.status && e.response.body.status == 2) return editOrReply(context, createEmbed("error", context, `Unable to translate text.`)) + if(e.response?.body?.status && e.response.body.status === 2) return editOrReply(context, createEmbed("error", context, `Unable to translate text.`)) console.log(e) return editOrReply(context, createEmbed("error", context, `Something went wrong.`)) } diff --git a/commands/message/utils/ocrtr.js b/commands/message/utils/ocrtr.js index a5f12d5..6304e48 100644 --- a/commands/message/utils/ocrtr.js +++ b/commands/message/utils/ocrtr.js @@ -47,7 +47,7 @@ module.exports = { return editOrReply(context, createEmbed("error", context, "Unable to retrieve Google Vision API response.")) } - if(ocr.response.body.status == 1) return editOrReply(context, createEmbed("warning", context, ocr.response.body.text)) + if(ocr.response.body.status === 1) return editOrReply(context, createEmbed("warning", context, ocr.response.body.text)) try{ let translate = await googleTranslate(context, ocr.response.body.text, targetLanguage, sourceLanguage) @@ -56,7 +56,7 @@ module.exports = { let toFlag = TRANSLATE_DISPLAY_MAPPINGS[translate.response.body.language.to] || '' return editOrReply(context, createEmbed("default", context, { - description: `${icon("locale")} ​ ${fromFlag} ${pill(TRANSLATE_LANGUAGES[translate.response.body.language.from || sourceLanguage])} ​ ​ ​​${icon("arrow_right")} ​ ​ ​ ​${toFlag} ${pill(TRANSLATE_LANGUAGES[translate.response.body.language.to])}\n${codeblock("ansi", [translate.response.body.translation.substr(0,4000)])}`, + description: `-# ${icon("locale")} ​ ${fromFlag} ${pill(TRANSLATE_LANGUAGES[translate.response.body.language.from || sourceLanguage])} ​ ​ ​​${icon("arrow_right")} ​ ​ ​ ​${toFlag} ${pill(TRANSLATE_LANGUAGES[translate.response.body.language.to])}\n${codeblock("ansi", [translate.response.body.translation.substr(0,4000)])}`, thumbnail: { url: image }, @@ -66,7 +66,7 @@ module.exports = { } })) }catch(e){ - if(e.response?.body?.status && e.response.body.status == 2) return editOrReply(context, createEmbed("error", context, `Unable to translate text.`)) + if(e.response?.body?.status && e.response.body.status === 2) return editOrReply(context, createEmbed("error", context, `Unable to translate text.`)) console.log(e) return editOrReply(context, createEmbed("error", context, `Something went wrong.`)) } diff --git a/commands/message/utils/translate.js b/commands/message/utils/translate.js index 89c50ac..885655d 100644 --- a/commands/message/utils/translate.js +++ b/commands/message/utils/translate.js @@ -181,7 +181,7 @@ module.exports = { let toFlag = TRANSLATE_DISPLAY_MAPPINGS[translate.response.body.language.to] || '' return editOrReply(context, createEmbed("default", context, { - description: `-# ${icon("subtext_translate")} Translated from​ ${fromFlag} **${TRANSLATE_LANGUAGES[translate.response.body.language.from || sourceLanguage] || translate.response.body.language.from || args.from}** to ​${toFlag} **${TRANSLATE_LANGUAGES[translate.response.body.language.to] || translate.response.body.language.to}**.\n${codeblock("ansi", [translate.response.body.translation])}`, + description: `-# ${icon("locale")} ​ ${fromFlag} ${pill(TRANSLATE_LANGUAGES[translate.response.body.language.from || sourceLanguage] || translate.response.body.language.from || "Detected Language")} ​ ​ ​​${icon("arrow_right")} ​ ​ ​ ​${toFlag} ${pill(TRANSLATE_LANGUAGES[translate.response.body.language.to] || translate.response.body.language.to)}\n${codeblock("ansi", [stringwrap(translate.response.body.translation, 1900)])}`, footer: { iconUrl: STATICS.googletranslate, text: `Google Translate • ${context.application.name}`