From 48b186ab8ea28da7ffd63cbfd79d2a35b3cf7139 Mon Sep 17 00:00:00 2001 From: maamokun/MikanDev Date: Fri, 13 Dec 2024 00:39:00 +0900 Subject: [PATCH] feat: bro now has eyes --- src/handlers/flagTranslation.ts | 64 +++++++++++++++++++++++++++++---- 1 file changed, 57 insertions(+), 7 deletions(-) diff --git a/src/handlers/flagTranslation.ts b/src/handlers/flagTranslation.ts index 7838a19..38da2a0 100644 --- a/src/handlers/flagTranslation.ts +++ b/src/handlers/flagTranslation.ts @@ -21,6 +21,10 @@ const translate = new Translate({ key: process.env.GOOGLE_API_KEY as string, }); +const vision = new ImageAnnotatorClient({ + apiKey: process.env.GOOGLE_API_KEY as string, +}) + const prisma = new PrismaClient(); export async function translateMessage(reaction: MessageReaction, user: User) { @@ -41,21 +45,67 @@ export async function translateMessage(reaction: MessageReaction, user: User) { ); return; } - if (!message.content) { + if (!message.content && message.attachments.size === 0) { console.error("Message content is empty or undefined."); return; } - message.react(""); - const result = await translate + message.react("🔄"); + if (message.attachments.size > 0) { + if (message.attachments.first()?.contentType?.startsWith("image")) { + message.react("<:caughtin4k:1275020056543236158>"); + const attachment = message.attachments.first(); + if (!attachment) return; + const visionResult = await vision.annotateImage({ + image: { + source: { + imageUri: attachment.url, + }, + }, + features: [{ type: "TEXT_DETECTION" }], + }) + const [image] = visionResult; + if (!image.textAnnotations) { + message.reactions.removeAll(); + return message.react("❌"); + } + const text = image.textAnnotations[0].description; + const translationResult = await translate + .translate(text, language) + .catch((error) => { + message.reactions.removeAll(); + message.react("❌"); + return null; + }); + if (!translationResult) return; + const [translation] = translationResult; + const embed = new EmbedBuilder() + .setTitle("Translation to " + reaction.emoji.name) + .setDescription(translation) + .setColor("#FF7700") + .setTimestamp(); + await message.reply({ embeds: [embed], allowedMentions: { repliedUser: false } }); + message.reactions.removeAll(); + const userDb = await prisma.user.findUnique({ + where: { + id: user.id, + }, + }); + if (userDb?.premium) { + setTranslationRatelimit("translate", user.id, 10); + } else { + setTranslationRatelimit("translate", user.id, 60); + } + } + } + const translationResult = await translate .translate(message.content, language) .catch((error) => { message.reactions.removeAll(); message.react("❌"); - console.error("Translation error: ", error); return null; }); - if (!result) return; - const [translation] = result; + if (!translationResult) return; + const [translation] = translationResult; const embed = new EmbedBuilder() .setTitle("Translation to " + reaction.emoji.name) .setDescription(translation) @@ -73,4 +123,4 @@ export async function translateMessage(reaction: MessageReaction, user: User) { } else { setTranslationRatelimit("translate", user.id, 30); } -} +} \ No newline at end of file