package addon.translator; import bashoid.Message; import bashoid.Addon; import java.io.UnsupportedEncodingException; import java.net.URLEncoder; import org.jsoup.Jsoup; import org.jsoup.nodes.*; import org.jsoup.select.Elements; import utils.WebPage; import static utils.Constants.*; public class Translator extends Addon { private static final String LANGS[] = { "cz", "en", "ru", "de", "fr", "it", "es", "sk" }; private static final byte LANGS_COUNT = (byte) LANGS.length; private static final String NO_TRANSLATION = "No translation found"; private static final byte MAX_TRANSLATION_COUNT = 5; private String getAddress(String query, String langFrom, String langTo) throws UnsupportedEncodingException { query = URLEncoder.encode(query, "UTF-8"); return "http://slovnik.seznam.cz/" + langFrom + "-" + langTo + "/?q=" + query; } private String loadPage(String address) throws Exception { WebPage entry = WebPage.loadWebPage(address, "UTF-8"); return entry.getContent(); } private String getTranslation(String address) throws Exception { String content = loadPage(address); if(content.indexOf("nebylo nic nalezeno") != NOT_FOUND || content.indexOf("li jste hledat?") != NOT_FOUND) return NO_TRANSLATION; String[] translations = getAllPossibleTranslations(content); String output = ""; if (translations.length > 0) { for (byte i = 0; i < translations.length && i < MAX_TRANSLATION_COUNT; ++i) output += translations[i] + ", "; output = output.substring(0, output.length() - 2); if (translations.length > MAX_TRANSLATION_COUNT) output += " | " + address; return output; } else { return NO_TRANSLATION; } } private String[] getAllPossibleTranslations(String content) { Document doc = Jsoup.parse( content.replaceAll("<br />", "<span>#</span>") ); Element fastMeanings = doc.getElementById("fastMeanings"); if (fastMeanings != null) { String text = fastMeanings.text().replaceAll(" ,", ","); return text.substring(0, text.length() - 2).split(" # "); } else { Element moreResults = doc.getElementById("results"); Elements links = moreResults.getElementsByTag("a"); return links.text().split(" "); } } private String getLang(String message, boolean from) { return from ? message.substring(0, 2) : message.substring(6, 8); } public boolean isLangAllowed(String lang) { for(byte i = 0; i < LANGS_COUNT; ++i) if(lang.equals(LANGS[i])) return true; return false; } @Override public boolean shouldReact(Message message) { String msg = message.text; return (msg.length() > 8 && msg.indexOf("to") == 3 && msg.indexOf(' ') == 2 && msg.indexOf(' ', 3) == 5); } @Override protected void setReaction(Message message) { try { String langFrom = getLang(message.text, true); String langTo = getLang(message.text, false); if (isLangAllowed(langFrom) && isLangAllowed(langTo)) { if (langFrom.equals(langTo)) { reaction.add(NO_TRANSLATION); } else { String response = getTranslation(getAddress(message.text.substring(9), langFrom, langTo)); reaction.add(response); } } } catch (Exception e) { setError(e); } } }