package org.manalith.ircbot.plugin.curex; import java.io.File; import java.io.IOException; import java.net.URL; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.Iterator; import org.apache.commons.configuration.ConfigurationException; import org.apache.commons.configuration.PropertiesConfiguration; import org.apache.commons.lang3.StringUtils; import org.jsoup.Jsoup; import org.jsoup.nodes.Document; import org.jsoup.nodes.Element; import org.jsoup.select.Elements; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; public class OpenExchangeRate { public class CurrencyNameTable { // local file private PropertiesConfiguration config; private File f; private String filename; // local variable private String key; private String val; public CurrencyNameTable(String path) { filename = "currencylist.prop"; f = new File(path + "/" + filename); if (f.exists()) { try { config = new PropertiesConfiguration(path + "/" + filename); } catch (ConfigurationException e) { e.printStackTrace(); } return; } key = ""; val = ""; // if file doesn't exist try { config = new PropertiesConfiguration(path + "/" + filename); } catch (ConfigurationException e) { config = new PropertiesConfiguration(); config.setFile(f); try { config.save(); // save an empty config = new PropertiesConfiguration(path + "/" + filename); } catch (ConfigurationException e1) { e1.printStackTrace(); } } // fetch currency unit list try { Document doc = Jsoup .connect( "http://www.currency-iso.org/dam/downloads/table_a1.xml") .get(); Elements ccytbl = doc.select("ISO_4217>CcyTbl>Ccyntry"); for (Element ccyntry : ccytbl) { val = ccyntry.select("CtryNm").text(); key = ccyntry.select("Ccy").text(); if (StringUtils.isEmpty(key)) continue; if (key.equals("XUA") || key.equals("XSU")) continue; if (key.equals("USD")) val = "UNITED STATES"; if (key.equals("EUR")) val = "EUROPEAN UNITED"; if (val.contains("\\u2019S")) val = val.replaceAll("\\u2019S", "'S"); if (val.contains(", ")) val = val.replaceAll(", ", " "); if (val.contains(",")) val = val.replaceAll(",", ""); config.setProperty(key, val); } config.setProperty("BTC", "BITCOIN"); config.setProperty("EEK", "ESTONIA KROON"); config.setProperty("MTL", "MALTA LIRA"); config.setProperty("LVL", "LATVIJAS REPUBLIKA"); config.setProperty("ZMK", "ZAMBIA KWACHA"); config.save(); } catch (IOException | ConfigurationException e) { e.printStackTrace(); } } public String[] getCurrencyList() { ArrayList<String> strarr = new ArrayList<>(); String[] result; Iterator<String> list = config.getKeys(); while (list.hasNext()) strarr.add(list.next()); result = new String[strarr.size()]; strarr.toArray(result); return result; } public String getCountryNameByCurrency(String currency) { if (!StringUtils.isEmpty(config.getString(currency))) return config.getString(currency); else return ""; } } private String base_url; private String app_id; private CurrencyNameTable table; private HashMap<String, Double> rates; public OpenExchangeRate(String path, String new_app_id) throws IOException { base_url = "https://openexchangerates.org/api/latest.json?app_id="; app_id = new_app_id; table = new CurrencyNameTable(path); rates = new HashMap<>(); initCurrencyTable(); } private void initCurrencyTable() throws IOException { if (StringUtils.isEmpty(app_id)) throw new IllegalArgumentException(); ObjectMapper om = new ObjectMapper(); JsonNode node = om.readTree(new URL(base_url + app_id)); node = node.get("rates"); Iterator<String> keys = node.fieldNames(); String k = ""; while (keys.hasNext()) { k = keys.next(); rates.put(k, node.path(k).asDouble()); } } public double calc(int val, String sourceUnit, String targetUnit) { double r = rates.get(targetUnit) / rates.get(sourceUnit); return r * val; } public double calc(double val, String sourceUnit, String targetUnit) { double r = rates.get(targetUnit) / rates.get(sourceUnit); return r * val; } public boolean isValidCurrency(String currencyUnit) { ArrayList<String> arr = getCurrencyList(); return arr.contains(currencyUnit); } public ArrayList<String> getCurrencyList() { return new ArrayList<>(Arrays.asList(rates.keySet().toArray( new String[rates.size()]))); } public String getCountryName(String currencyUnit) { return table.getCountryNameByCurrency(currencyUnit); } }