package io.gitlab.jfronny.translater; import com.github.vbauer.yta.model.Direction; import com.github.vbauer.yta.model.Language; import com.github.vbauer.yta.model.Languages; import com.github.vbauer.yta.service.YTranslateApiImpl; import com.sun.org.apache.xpath.internal.operations.Mod; import org.apache.commons.lang3.StringUtils; import java.util.*; public class YnTransformer extends CachingTransformer { private static YTranslateApiImpl api = null; private static Set languages = null; private static final Random rnd = new Random(); @Override public String getTransformed(String str) { try { if (api == null) api = new YTranslateApiImpl(ModInit.cfg.key); if (languages == null) languages = api.languageApi().all().languages(); if (str.contains("%")) { StringBuilder res = new StringBuilder(); boolean f = true; for (String s : str.split("%")) { if (!f) { res.append("%"); if (s.length() > 0) res.append(s.charAt(0)).append(getTransformed(s.substring(1)).replace("%", "")); } else res.append(getTransformed(s)); f = false; } return res.toString(); } else if (str.contains("$")) { StringBuilder res = new StringBuilder(); boolean f = true; for (String s : str.split("\\$")) { if (!f) { res.append("$").append(s.charAt(0)).append(getTransformed(s.substring(1)).replace("$", "")); } else res.append(getTransformed(s)); f = false; } return res.toString(); } else if (str.contains("§")) { StringBuilder res = new StringBuilder(); boolean f = true; for (String s : str.split("§")) { if (!f) { res.append("§").append(s.charAt(0)).append(getTransformed(s.substring(1)).replace("§", "")); } else res.append(getTransformed(s)); f = false; } return res.toString(); } else { return Break(str); } } catch (Exception e) { ModInit.Warn("Failed to transform: " + str + " (" + str.length() + " characters)"); ModInit.Warn("Please report this bug with the mod containing the lang file"); throw e; } } private String Break(String str) { try { if (!valid(str)) return str; Language startLang = api.detectionApi().detect(str).orElse(Language.EN); if (!valid(startLang.code())) { ModInit.Warn("Could not detect language for: " + str); ModInit.Warn("Defaulting to EN"); startLang = Language.EN; } String currentState = str; Language currentLang = startLang; for (int i = 0; i < ModInit.cfg.rounds; i++) { Language newLang = selectRandom(); currentState = api.translationApi().translate(currentState, Direction.of(ModInit.cfg.breakFully ? selectRandom() : currentLang, newLang)).text(); currentLang = newLang; } currentState = api.translationApi().translate(currentState, startLang).text(); ModInit.Log("Transformed: \"" + str + "\" to: \"" + currentState + "\""); return currentState; } catch (Exception e) { ModInit.Warn("Failed to break: " + str + " (" + str.length() + " characters)"); ModInit.Warn("Please report this bug with the mod containing the lang file"); throw e; } } private boolean valid(String str) { if (str.length() < 2) return false; for (char c : str.toCharArray()) { String tmp = "" + c; if (StringUtils.isAlphanumeric(tmp)) return true; } return false; } private Language selectRandom() { return languages.stream().skip(rnd.nextInt(languages.size())).findFirst().get(); } }