package net.taehui.twilight.system import com.fasterxml.jackson.databind.ObjectMapper import com.github.pemistahl.lingua.api.Language import com.github.pemistahl.lingua.api.LanguageDetectorBuilder import net.taehui.twilight.JSON import net.taehui.twilight.Logger import org.apache.hc.client5.http.HttpResponseException import org.apache.hc.client5.http.classic.methods.HttpPost import org.apache.hc.client5.http.entity.UrlEncodedFormEntity import org.apache.hc.client5.http.impl.classic.BasicHttpClientResponseHandler import org.apache.hc.client5.http.impl.classic.HttpClients import org.apache.hc.core5.http.message.BasicNameValuePair import java.nio.charset.StandardCharsets import java.util.concurrent.CompletableFuture object Translator { private val languageSystem = LanguageDetectorBuilder.fromLanguages(Language.KOREAN, Language.ENGLISH, Language.JAPANESE).build() fun translate( language: String, text: String, logger: Logger ): CompletableFuture<String> { return if (text.length > 766) CompletableFuture.completedFuture( text ) else { val textLanguage = when (languageSystem.detectLanguageOf(text)) { Language.KOREAN -> "ko" Language.ENGLISH -> "en" Language.JAPANESE -> "ja" else -> "" } val targetLanguage = language.split('-')[0] if (textLanguage.isEmpty() || textLanguage == "en" || textLanguage == targetLanguage) CompletableFuture.completedFuture( text ) else DB.loadTranslatedText( text, targetLanguage ).thenApply { loadedTranslatedText -> try { loadedTranslatedText.ifEmpty { HttpClients.createDefault().use { val dataPost = HttpPost("https://naveropenapi.apigw.ntruss.com/nmt/v1/translation") dataPost.setHeader("X-NCP-APIGW-API-KEY-ID", Configure.nhn.translationID) dataPost.setHeader("X-NCP-APIGW-API-KEY", Configure.nhn.translationPw) dataPost.entity = UrlEncodedFormEntity( listOf( BasicNameValuePair("source", textLanguage), BasicNameValuePair("target", targetLanguage), BasicNameValuePair("text", text) ), StandardCharsets.UTF_8 ) val translatedText = ObjectMapper().readValue( it.execute(dataPost, BasicHttpClientResponseHandler()), JSON.N2MT::class.java ).message.result.translatedText DB.saveTranslatedText(text, targetLanguage, translatedText) translatedText } } } catch (e: HttpResponseException) { if (e.statusCode != 429) { logger.logFault(e) } text } } } } }