From 75ec0542825fbef70f4b9d509dc3cc14c0dddb24 Mon Sep 17 00:00:00 2001 From: supositware Date: Sun, 15 Aug 2021 23:28:56 +0200 Subject: [PATCH] Remove yandex translate and use DeepL --- commands/utility/translate | 110 ++++++++++++++++++++++++++++++++++ commands/utility/translate.js | 89 +++++++++------------------ 2 files changed, 137 insertions(+), 62 deletions(-) create mode 100644 commands/utility/translate diff --git a/commands/utility/translate b/commands/utility/translate new file mode 100644 index 0000000..104f32d --- /dev/null +++ b/commands/utility/translate @@ -0,0 +1,110 @@ +const { Command } = require('discord-akairo'); +const fetch = require('node-fetch'); +const { yandexTRN, yandexDICT } = require('../../config.json'); + +class translateCommand extends Command { + constructor() { + super('translate', { + aliases: ['translate', 'trn'], + category: 'utility', + clientPermissions: ['SEND_MESSAGES', 'EMBED_LINKS'], + args: [ + { + id: 'language', + type: ['az','ml','sq','mt','am','mk','en','mi','ar','mr','hy','mhr','af','mn','eu','de','ba','ne','be','no','bn','pa','my','pap','bg','fa','bs','pl','cy','pt','hu','ro','vi','ru','ht','ceb','gl','sr','nl','si','mrj','sk','el','sl','ka','sw','gu','su','da','tg','he','th','yi','tl','id','ta','ga','tt','it','te','is','tr','es','udm','kk','uz','kn','uk','ca','ur','ky','fi','zh','fr','ko','hi','xh','hr','km','cs','lo','sv','la','gd','lv','et','lt','eo','lb','jv','mg','ja','ms'], + prompt: { + start: 'In what language do you want to translate it to', + retry: 'That\'s not a valid language! try again.' + }, + default: 'en' + }, + { + id: 'text', + type: 'string', + prompt: { + start: 'What sentences/words do you want to translate?', + }, + match: 'rest' + } + ], + description: { + content: 'Translate what you send in your desired language. You can find the language code here: https://tech.yandex.com/translate/doc/dg/concepts/api-overview-docpage/', + usage: '[language code] [Text to translate]', + examples: ['fr "What are we doing today?"', 'en "Que faisons-nous aujourd\'hui?"'] + } + }); + } + + async exec(message, args) { + let language = args.language; + let text = args.text; + + let textURI = encodeURI(text); + fetch(`https://translate.yandex.net/api/v1.5/tr.json/translate?key=${yandexTRN}&text=${textURI}&lang=${language}&options=1`, { + }).then((response) => { + return response.json(); + }).then((response) => { + if (response.code == '502') + return message.channel.send(`${response.message}, you probably didn't input the correct language code, you can check them here! https://tech.yandex.com/translate/doc/dg/concepts/api-overview-docpage/`); + else if (response.code == '408') + return message.channel.send(response.message); + else if (response.code != '200') { + console.error(response); + return message.channel.send('An error has occurred'); + } + + let description = response.text[0]; + let lang = response.detected.lang; + + // Lookup in yandex dictionary the translated word and find other word for it + fetch(`https://dictionary.yandex.net/api/v1/dicservice.json/lookup?key=${yandexDICT}&lang=${language}-${language}&text=${encodeURI(response.text[0])}`, { + }).then((response) => { + return response.json(); + }).then((response) => { + console.log(response); + if (response.code == '501') return message.channel.send(response.message); + // If it didn't find anything in the dictionary simply send the translation + if (response.def.length == 0) { + const translationEmbed = this.client.util.embed() + .setColor(message.member ? message.member.displayHexColor : 'NAVY') + .setTitle('Asked for the following translation:') + .setURL('https://tech.yandex.com/dictionary/') + .setAuthor(message.author.username) + .addField('Translated text', description) + .addField('Translated from', lang) + .setTimestamp() + .setFooter('Powered by Yandex.Translate'); + + return message.channel.send(translationEmbed); + } + + let dict = ''; + + if (response.def[0].ts == undefined) + description = `${response.def[0].pos} - ${response.def[0].text}`; + else + description = `${response.def[0].pos} - ${response.def[0].text} - [${response.def[0].ts}]`; + + for (let i = 0; i < response.def[0].tr.length; i++ ) { + dict += `\n${response.def[0].tr[i].pos} - ${response.def[0].tr[i].text} `; + } + + const translationEmbed = this.client.util.embed() + .setColor(message.member ? message.member.displayHexColor : 'NAVY') + .setTitle('Asked for the following translation:') + .setURL('https://tech.yandex.com/dictionary/') + .setAuthor(message.author.username) + .addField('Translated text', description) + .addField('Dictionary', dict) + .addField('Translated from', lang) + .setTimestamp() + .setFooter('Powered by Yandex.Translate & Yandex.Dictionary'); + + return message.channel.send(translationEmbed); + }); + + }); + } +} + +module.exports = translateCommand; \ No newline at end of file diff --git a/commands/utility/translate.js b/commands/utility/translate.js index 104f32d..4aef8d6 100644 --- a/commands/utility/translate.js +++ b/commands/utility/translate.js @@ -1,6 +1,7 @@ const { Command } = require('discord-akairo'); -const fetch = require('node-fetch'); -const { yandexTRN, yandexDICT } = require('../../config.json'); +const axios = require('axios'); + +const { deepl } = require('../../config.json'); class translateCommand extends Command { constructor() { @@ -11,7 +12,7 @@ class translateCommand extends Command { args: [ { id: 'language', - type: ['az','ml','sq','mt','am','mk','en','mi','ar','mr','hy','mhr','af','mn','eu','de','ba','ne','be','no','bn','pa','my','pap','bg','fa','bs','pl','cy','pt','hu','ro','vi','ru','ht','ceb','gl','sr','nl','si','mrj','sk','el','sl','ka','sw','gu','su','da','tg','he','th','yi','tl','id','ta','ga','tt','it','te','is','tr','es','udm','kk','uz','kn','uk','ca','ur','ky','fi','zh','fr','ko','hi','xh','hr','km','cs','lo','sv','la','gd','lv','et','lt','eo','lb','jv','mg','ja','ms'], + type: ['bg', 'cs', 'da', 'de', 'el', 'en', 'es', 'et', 'fi', 'fr', 'hu', 'it', 'ja', 'lt', 'lv', 'nl', 'pl', 'pt', 'ro', 'ru', 'sk', 'sl', 'sv', 'zh'], prompt: { start: 'In what language do you want to translate it to', retry: 'That\'s not a valid language! try again.' @@ -36,74 +37,38 @@ class translateCommand extends Command { } async exec(message, args) { - let language = args.language; + let language = args.language.toUpperCase(); let text = args.text; - let textURI = encodeURI(text); - fetch(`https://translate.yandex.net/api/v1.5/tr.json/translate?key=${yandexTRN}&text=${textURI}&lang=${language}&options=1`, { - }).then((response) => { - return response.json(); - }).then((response) => { - if (response.code == '502') - return message.channel.send(`${response.message}, you probably didn't input the correct language code, you can check them here! https://tech.yandex.com/translate/doc/dg/concepts/api-overview-docpage/`); - else if (response.code == '408') - return message.channel.send(response.message); - else if (response.code != '200') { - console.error(response); - return message.channel.send('An error has occurred'); - } + const params = new URLSearchParams(); + params.append('auth_key', deepl); + params.append('text', text); + params.append('target_lang', language); - let description = response.text[0]; - let lang = response.detected.lang; - // Lookup in yandex dictionary the translated word and find other word for it - fetch(`https://dictionary.yandex.net/api/v1/dicservice.json/lookup?key=${yandexDICT}&lang=${language}-${language}&text=${encodeURI(response.text[0])}`, { - }).then((response) => { - return response.json(); - }).then((response) => { - console.log(response); - if (response.code == '501') return message.channel.send(response.message); - // If it didn't find anything in the dictionary simply send the translation - if (response.def.length == 0) { - const translationEmbed = this.client.util.embed() - .setColor(message.member ? message.member.displayHexColor : 'NAVY') - .setTitle('Asked for the following translation:') - .setURL('https://tech.yandex.com/dictionary/') - .setAuthor(message.author.username) - .addField('Translated text', description) - .addField('Translated from', lang) - .setTimestamp() - .setFooter('Powered by Yandex.Translate'); + axios.post('https://api-free.deepl.com/v2/translate', params, { + headers: { + 'Content-Type': 'application/x-www-form-urlencoded' + } + }).then(response => { + console.log(response.data.translations[0].text); - return message.channel.send(translationEmbed); - } - - let dict = ''; + const data = response.data.translations[0]; - if (response.def[0].ts == undefined) - description = `${response.def[0].pos} - ${response.def[0].text}`; - else - description = `${response.def[0].pos} - ${response.def[0].text} - [${response.def[0].ts}]`; - - for (let i = 0; i < response.def[0].tr.length; i++ ) { - dict += `\n${response.def[0].tr[i].pos} - ${response.def[0].tr[i].text} `; - } + const translationEmbed = this.client.util.embed() + .setColor(message.member ? message.member.displayHexColor : 'NAVY') + .setTitle('Asked for the following translation:') + .setURL('https://www.deepl.com/translator') + .setAuthor(message.author.username) + .addField('Translated text', data.text) + .addField('Translated from', data.detected_source_language) + .setTimestamp() + .setFooter('Powered by DeepL'); - const translationEmbed = this.client.util.embed() - .setColor(message.member ? message.member.displayHexColor : 'NAVY') - .setTitle('Asked for the following translation:') - .setURL('https://tech.yandex.com/dictionary/') - .setAuthor(message.author.username) - .addField('Translated text', description) - .addField('Dictionary', dict) - .addField('Translated from', lang) - .setTimestamp() - .setFooter('Powered by Yandex.Translate & Yandex.Dictionary'); + return message.channel.send(translationEmbed); + }); - return message.channel.send(translationEmbed); - }); - }); } }