package org.ripple.power.txns;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.Locale;
import java.util.TimeZone;
import org.json.JSONArray;
import org.json.JSONObject;
import org.ripple.power.collection.ArrayMap;
import org.ripple.power.config.LSystem;
import org.ripple.power.txns.data.AccountOffersResponse;
import org.ripple.power.txns.data.CandlesResponse;
import org.ripple.power.txns.data.MarketsRespone;
import org.ripple.power.txns.data.Take;
import org.ripple.power.txns.data.TotalNetworkValueResponse;
import org.ripple.power.txns.data.TransactionStatsResponse;
import org.ripple.power.utils.DateUtils;
import org.ripple.power.utils.HttpRequest;
import com.ripple.core.coretypes.RippleDate;
public class RippleChartsAPI {
public static enum Model {
ALL, YEAR, MONTH, WEEK, DAY, HOUR, MINUTE, SECOND
}
private static String CHARTS_URL = "http://api.ripplecharts.com/api/";
public static void setDataAPI_URL(String url) {
CHARTS_URL = url;
}
public static String getDataAPI_URL() {
return CHARTS_URL;
}
private final static SimpleDateFormat dateformat = new SimpleDateFormat(
"yyyy-MM-dd", Locale.US);
private final static SimpleDateFormat iso8601 = new SimpleDateFormat(
"yyyy-MM-dd'T'HH:mm:ss.SSSZ", Locale.US);
static {
iso8601.setTimeZone(TimeZone.getTimeZone("GMT"));
}
private static ArrayList<RippleItem> jsonToItems(Object o) {
if (o != null && o instanceof JSONArray) {
JSONArray arrays = (JSONArray) o;
ArrayList<RippleItem> list = new ArrayList<RippleItem>(
arrays.length() - 1);
for (int i = 0; i < arrays.length(); i++) {
RippleItem item = new RippleItem();
JSONArray obj = arrays.getJSONArray(i);
int idx = 0;
item.startTime = obj.getString(idx++);
item.baseVolume = obj.getDouble(idx++);
item.counterVolume = obj.getDouble(idx++);
item.count = obj.getDouble(idx++);
item.open = obj.getDouble(idx++);
item.high = obj.getDouble(idx++);
item.low = obj.getDouble(idx++);
item.close = obj.getDouble(idx++);
item.vwap = obj.getDouble(idx++);
item.openTime = obj.getString(idx++);
item.closeTime = obj.getString(idx++);
item.partial = obj.getBoolean(idx++);
list.add(item);
}
return list;
}
return null;
}
public static Object offers_exercised24hour(Take issued) {
return offers_exercised24hour(RippleDefault.BASE, issued);
}
public static ArrayList<RippleItem> offers_exercised24hour_items(
String currency, String issuer) {
Object o = offers_exercised24hour(RippleDefault.BASE,
new Take(currency,issuer));
return jsonToItems(o);
}
public static ArrayList<RippleItem> offers_exercised24hour_items(
Take issued) {
Object o = offers_exercised24hour(RippleDefault.BASE, issued);
return jsonToItems(o);
}
public static Object offers_exercised24hour(Take basecur,
Take counter) {
Calendar calone = DateUtils.getUTCCalendar();
calone.add(Calendar.DATE, -1);
String yesterday = dateformat.format(calone.getTime());
Calendar caltwo = DateUtils.getUTCCalendar();
caltwo.setTime(RippleDate.now());
String day = dateformat.format(caltwo.getTime());
return offers_exercised(basecur, counter, yesterday, day, true);
}
public static Object offers_exercisedYear(Take issued) {
return offers_exercisedYear(RippleDefault.BASE, issued);
}
public static ArrayList<RippleItem> offers_exercisedYear_items(
String currency, String issuer) {
Object o = offers_exercisedYear(RippleDefault.BASE,
new Take(currency,issuer));
return jsonToItems(o);
}
public static ArrayList<RippleItem> offers_exercisedYear_items(
Take issued) {
Object o = offers_exercisedYear(RippleDefault.BASE, issued);
return jsonToItems(o);
}
public static Object offers_exercisedYear(Take basecur,
Take counter) {
Calendar calone = DateUtils.getUTCCalendar();
calone.add(Calendar.DATE, -365);
String yesterday = dateformat.format(calone.getTime());
Calendar caltwo = DateUtils.getUTCCalendar();
caltwo.setTime(RippleDate.now());
String day = dateformat.format(caltwo.getTime());
return offers_exercised(basecur, counter, yesterday, day, false);
}
public static Object offers_exercisedMonth(Take issued) {
return offers_exercisedMonth(RippleDefault.BASE, issued);
}
public static ArrayList<RippleItem> offers_exercisedMonth_items(
String currency, String issuer) {
Object o = offers_exercisedMonth(RippleDefault.BASE,
new Take(currency,issuer));
return jsonToItems(o);
}
public static ArrayList<RippleItem> offers_exercisedMonth_items(
Take issued) {
Object o = offers_exercisedMonth(RippleDefault.BASE, issued);
return jsonToItems(o);
}
public static Object offers_exercisedMonth(Take basecur,
Take counter) {
Calendar calone = DateUtils.getUTCCalendar();
calone.add(Calendar.DATE, -30);
String yesterday = dateformat.format(calone.getTime());
Calendar caltwo = DateUtils.getUTCCalendar();
caltwo.setTime(RippleDate.now());
String day = dateformat.format(caltwo.getTime());
return offers_exercised(basecur, counter, yesterday, day, false);
}
public static Object offers_exercisedWeek(Take issued) {
return offers_exercisedWeek(RippleDefault.BASE, issued);
}
public static ArrayList<RippleItem> offers_exercisedWeek_items(
String currency, String issuer) {
Object o = offers_exercisedWeek(RippleDefault.BASE,
new Take( currency,issuer));
return jsonToItems(o);
}
public static ArrayList<RippleItem> offers_exercisedWeek_items(
Take issued) {
Object o = offers_exercisedWeek(RippleDefault.BASE, issued);
return jsonToItems(o);
}
public static Object offers_exercisedWeek(Take basecur,
Take counter) {
Calendar calone = DateUtils.getUTCCalendar();
calone.add(Calendar.DATE, -7);
String yesterday = dateformat.format(calone.getTime());
Calendar caltwo = DateUtils.getUTCCalendar();
caltwo.setTime(RippleDate.now());
String day = dateformat.format(caltwo.getTime());
return offers_exercised(basecur, counter, yesterday, day, false);
}
public static Object offers_exercised(Take basecur,
Take counter, String start, String end, boolean hour) {
JSONObject data = new JSONObject();
data.put("base", basecur.getJSON());
data.put("counter", counter.getJSON());
data.put("startTime", start);
data.put("endTime", end);
if (hour) {
data.put("timeIncrement", "minute");
data.put("timeMultiple", 5);
}
data.put("format", "json");
HttpRequest request = HttpRequest.post(CHARTS_URL + "offers_exercised");
String result = request.send(data);
if (result.startsWith("[")) {
return new JSONArray(result);
} else if (result.startsWith("{")) {
return new JSONObject(result);
} else {
return result;
}
}
public static Object historicalMetrics(String curreny, String issuer) {
HttpRequest request = HttpRequest
.post(CHARTS_URL + "historicalMetrics");
JSONObject data = new JSONObject();
JSONObject exchange = new JSONObject();
exchange.put("currency", curreny.toUpperCase());
exchange.put("issuer", issuer);
Calendar calone = DateUtils.getUTCCalendar();
calone.add(Calendar.DATE, -1);
String yesterday = dateformat.format(calone.getTime());
Calendar caltwo = DateUtils.getUTCCalendar();
caltwo.setTime(RippleDate.now());
String day = dateformat.format(caltwo.getTime());
data.put("exchange", exchange);
data.put("startTime", yesterday);
data.put("endTime", day);
data.put("timeIncrement", "day");
data.put("metric", "topMarkets");
String result = request.send(data);
if (result.startsWith("[")) {
return new JSONArray(result);
} else if (result.startsWith("{")) {
return new JSONObject(result);
} else {
return result;
}
}
public static Object getExchangeRates(final String basecur,
final String currency, final String issuer) {
Calendar now = DateUtils.getUTCCalendar();
String startTime = iso8601.format(new Date(now.getTimeInMillis()
- LSystem.DAY));
String endTime = iso8601.format(now.getTime());
JSONObject data = new JSONObject();
data.put("startTime", startTime);
data.put("endTime", endTime);
data.put("timeIncrement", "all");
data.put("timeMultiple", 1);
data.put("descending", false);
JSONObject base = new JSONObject();
base.put("currency", basecur.toUpperCase());
JSONObject trade = new JSONObject();
trade.put("currency", currency);
trade.put("issuer", issuer.toUpperCase());
data.put("base", base);
data.put("counter", trade);
HttpRequest request = HttpRequest.post(CHARTS_URL + "offers_exercised");
String result = request.send(data);
if (result.startsWith("[")) {
return new JSONArray(result);
} else if (result.startsWith("{")) {
return new JSONObject(result);
} else {
return result;
}
}
public static ArrayList<RippleItem> getExchangeRateItems(
final String currency, final String issuer) {
Object o = getExchangeRates(LSystem.nativeCurrency, currency, issuer);
if (o != null && o instanceof JSONArray) {
JSONArray arrays = (JSONArray) o;
ArrayList<RippleItem> list = new ArrayList<RippleItem>(
arrays.length() - 1);
ArrayMap names = null;
for (int i = 0; i < arrays.length(); i++) {
if (i == 0) {
JSONArray obj = arrays.getJSONArray(i);
final int size = obj.length();
if (names == null) {
names = new ArrayMap(size);
}
try {
for (int j = 0; j < size; j++) {
names.put(obj.getString(j), j);
}
} catch (Exception ex) {
names = null;
}
} else {
RippleItem item = new RippleItem();
JSONArray obj = arrays.getJSONArray(i);
if (names == null) {
int idx = 0;
item.startTime = obj.getString(idx++);
item.baseVolume = obj.getDouble(idx++);
item.counterVolume = obj.getDouble(idx++);
item.count = obj.getDouble(idx++);
item.open = obj.getDouble(idx++);
item.high = obj.getDouble(idx++);
item.low = obj.getDouble(idx++);
item.close = obj.getDouble(idx++);
item.vwap = obj.getDouble(idx++);
item.openTime = obj.getString(idx++);
item.closeTime = obj.getString(idx++);
item.partial = obj.getBoolean(idx++);
} else {
for (int j = 0; j < names.size(); j++) {
ArrayMap.Entry entry = names.getEntry(j);
switch (entry.getKey().toString()) {
case "startTime":
item.startTime = obj.getString((int) entry
.getValue());
break;
case "baseVolume":
item.baseVolume = obj.getDouble((int) entry
.getValue());
break;
case "counterVolume":
item.counterVolume = obj.getDouble((int) entry
.getValue());
break;
case "count":
item.count = obj.getDouble((int) entry
.getValue());
break;
case "open":
item.open = obj.getDouble((int) entry
.getValue());
break;
case "high":
item.high = obj.getDouble((int) entry
.getValue());
break;
case "low":
item.low = obj
.getDouble((int) entry.getValue());
break;
case "close":
item.close = obj.getDouble((int) entry
.getValue());
break;
case "vwap":
item.vwap = obj.getDouble((int) entry
.getValue());
break;
case "openTime":
item.openTime = obj.getString((int) entry
.getValue());
break;
case "closeTime":
item.openTime = obj.getString((int) entry
.getValue());
break;
case "partial":
item.partial = obj.getBoolean((int) entry
.getValue());
break;
default:
break;
}
}
}
list.add(item);
}
}
return list;
}
return null;
}
public static Object markettraders() {
HttpRequest request = HttpRequest.post(CHARTS_URL + "markettraders");
String result = request.body();
if (result.startsWith("[")) {
return new JSONArray(result);
} else if (result.startsWith("{")) {
return new JSONObject(result);
} else {
return result;
}
}
public static Object getExchangeRates(Take curreny) {
ArrayList<Take> issueds = new ArrayList<Take>();
issueds.add(curreny);
return getExchangeRates(RippleDefault.BASE, issueds);
}
public static Object getExchangeRates(Take base,
Take counter) {
ArrayList<Take> issueds = new ArrayList<Take>();
issueds.add(counter);
return getExchangeRates(base, issueds);
}
public static Object getExchangeRates(Take basecur,
ArrayList<Take> counters) {
HttpRequest request = HttpRequest.post(CHARTS_URL + "exchange_rates");
JSONObject obj = new JSONObject();
JSONArray arrays = new JSONArray();
if (counters != null) {
for (Take counter : counters) {
JSONObject item = new JSONObject();
item.put("base", basecur.getJSON());
item.put("counter", counter.getJSON());
arrays.put(item);
}
}
obj.put("pairs", arrays);
String result = request.send(obj);
if (result.startsWith("[")) {
return new JSONArray(result);
} else if (result.startsWith("{")) {
return new JSONObject(result);
} else {
return result;
}
}
public static double getXRPto(ArrayList<Take> list) {
double a = -1, b = -1;
Object result = getExchangeRates(RippleDefault.BASE, list);
if (result != null) {
if (result instanceof JSONArray) {
a = ((JSONArray) result).getJSONObject(0).getDouble("rate");
b = ((JSONArray) result).getJSONObject(1).getDouble("rate");
} else if (result instanceof JSONObject) {
a = ((JSONObject) result).getDouble("rate");
}
}
double real = Math.min(a, b);
return 1d / real;
}
public static double getXRPtoUSD() {
return getXRPto(RippleDefault.findCurrency("USD"));
}
public static double getXRPtoBTC() {
return getXRPto(RippleDefault.findCurrency("BTC"));
}
public static double getXRPtoJPY() {
return getXRPto(RippleDefault.findCurrency("JPY"));
}
public static double getXRPtoCNY() {
return getXRPto(RippleDefault.findCurrency("CNY"));
}
/**
* all ripple account count
*
* @return
*/
public static Object getAccountsCreatedAll() {
return getAccountsCreated(0, Model.ALL);
}
public static Object getAccountsCreated(int count, Model model) {
Calendar calone = DateUtils.getUTCCalendar();
Calendar rippleDate = DateUtils.getUTCCalendar();
rippleDate.setTime(RippleDate.now());
JSONObject obj = new JSONObject();
switch (model) {
case ALL:
obj.put("startTime", "2013-01-01T00:00:00.000Z");
obj.put("endTime", dateformat.format(rippleDate.getTime()));
obj.put("timeIncrement", "all");
break;
case DAY:
calone.add(Calendar.DATE, -count);
obj.put("startTime", dateformat.format(calone.getTime()));
obj.put("endTime", dateformat.format(rippleDate.getTime()));
obj.put("timeIncrement", "day");
break;
case WEEK:
calone.add(Calendar.DATE, -(count * 7));
obj.put("startTime", dateformat.format(calone.getTime()));
obj.put("endTime", dateformat.format(rippleDate.getTime()));
obj.put("timeIncrement", "week");
break;
case MONTH:
calone.add(Calendar.MONTH, -count);
obj.put("startTime", dateformat.format(calone.getTime()));
obj.put("endTime", dateformat.format(rippleDate.getTime()));
obj.put("timeIncrement", "week");
break;
case YEAR:
calone.add(Calendar.YEAR, -count);
obj.put("startTime", dateformat.format(calone.getTime()));
obj.put("endTime", dateformat.format(rippleDate.getTime()));
obj.put("timeIncrement", "day");
break;
default:
break;
}
obj.put("descending", "true");
obj.put("reduce", "true");
HttpRequest request = HttpRequest.post(CHARTS_URL + "accounts_created");
String result = request.send(obj);
if (result != null && result.indexOf("\"") != -1) {
if (result.startsWith("[")) {
return new JSONArray(result);
} else if (result.startsWith("{")) {
return new JSONObject(result);
} else {
return result;
}
}
return result;
}
public static CandlesResponse getTradeStatistics(String currency,
String issuer, long time) {
return getTradeStatistics(RippleDefault.BASE, new Take(currency,
issuer), time);
}
public static CandlesResponse getTradeStatistics(Take basecur,
Take counter, long time) {
return getTradeStatistics(basecur, counter, time, 15);
}
public static CandlesResponse getTradeStatistics(Take basecur,
Take counter, long time, int limit) {
Calendar now = DateUtils.getUTCCalendar();
String endTime = iso8601.format(now.getTime());
String startTime = endTime;
if (time > 0) {
startTime = iso8601.format(new Date(now.getTimeInMillis() - time));
} else {
startTime = iso8601.format(new Date(now.getTimeInMillis()
- LSystem.DAY));
}
JSONObject data = new JSONObject();
data.put("base", basecur.getJSON());
data.put("counter", counter.getJSON());
data.put("startTime", startTime);
data.put("endTime", endTime);
data.put("limit", limit);
data.put("timeIncrement", "minute");
data.put("timeMultiple", 5);
data.put("format", "json");
HttpRequest request = HttpRequest.post(CHARTS_URL + "offers_exercised");
String result = request.send(data);
CandlesResponse candles = new CandlesResponse();
if (result != null && result.indexOf("\"") != -1) {
if (result.startsWith("[")) {
candles.from(new JSONArray(result));
} else if (result.startsWith("{")) {
candles.from(new JSONObject(result));
}
}
return candles;
}
public static AccountOffersResponse account_offers_exercised(
String account, long time, int limit) {
Calendar now = DateUtils.getUTCCalendar();
String endTime = iso8601.format(now.getTime());
String startTime = endTime;
if (time > 0) {
startTime = iso8601.format(new Date(now.getTimeInMillis() - time));
} else {
startTime = iso8601.format(new Date(now.getTimeInMillis()
- LSystem.DAY));
}
JSONObject data = new JSONObject();
data.put("account", account);
data.put("startTime", startTime);
data.put("endTime", endTime);
data.put("offset", 0);
data.put("limit", limit);
data.put("format", "json");
HttpRequest request = HttpRequest.post(CHARTS_URL
+ "account_offers_exercised");
String result = request.send(data);
AccountOffersResponse accountOffers = new AccountOffersResponse();
if (result != null && result.indexOf("\"") != -1) {
if (result.startsWith("[")) {
accountOffers.from(new JSONArray(result));
} else if (result.startsWith("{")) {
accountOffers.from(new JSONObject(result));
}
}
return accountOffers;
}
public static MarketsRespone top_markets(Take exchange, long time) {
Calendar now = DateUtils.getUTCCalendar();
String startTime = iso8601
.format(new Date(now.getTimeInMillis() - time));
JSONObject data = new JSONObject();
data.put("startTime", startTime);
data.put("exchange", exchange.getJSON());
data.put("interval", "week");
HttpRequest request = HttpRequest.post(CHARTS_URL + "top_markets");
String result = request.send(data);
MarketsRespone topMarkets = new MarketsRespone();
if (result != null && result.indexOf("\"") != -1) {
if (result.startsWith("[")) {
topMarkets.from(new JSONArray(result));
} else if (result.startsWith("{")) {
topMarkets.from(new JSONObject(result));
}
}
return topMarkets;
}
public static TotalNetworkValueResponse total_network_value(
Take exchange) {
return total_network_value(exchange, LSystem.DAY);
}
public static TotalNetworkValueResponse total_network_value(
Take exchange, long time) {
Calendar now = DateUtils.getUTCCalendar();
String timer = iso8601.format(new Date(now.getTimeInMillis() - time));
JSONObject data = new JSONObject();
data.put("time", timer);
data.put("exchange", exchange.getJSON());
HttpRequest request = HttpRequest.post(CHARTS_URL
+ "total_network_value");
String result = request.send(data);
TotalNetworkValueResponse totalNetwork = new TotalNetworkValueResponse();
if (result != null && result.indexOf("\"") != -1) {
if (result.startsWith("[")) {
totalNetwork.from(new JSONArray(result));
} else if (result.startsWith("{")) {
totalNetwork.from(new JSONObject(result));
}
}
return totalNetwork;
}
public static TotalNetworkValueResponse total_value_sent(
Take exchange) {
return total_value_sent(exchange, Model.MONTH, LSystem.YEAR);
}
public static TotalNetworkValueResponse total_value_sent(
Take exchange, Model model, long time) {
Calendar now = DateUtils.getUTCCalendar();
String timer = iso8601.format(new Date(now.getTimeInMillis() - time));
JSONObject data = new JSONObject();
data.put("startTime", timer);
data.put("exchange", exchange.getJSON());
switch (model) {
case DAY:
data.put("interval", "day");
break;
case WEEK:
data.put("interval", "week");
break;
case MONTH:
data.put("interval", "month");
break;
default:
data.put("interval", "day");
break;
}
HttpRequest request = HttpRequest.post(CHARTS_URL + "total_value_sent");
String result = request.send(data);
TotalNetworkValueResponse totalNetwork = new TotalNetworkValueResponse();
if (result != null && result.indexOf("\"") != -1) {
if (result.startsWith("[")) {
totalNetwork.from(new JSONArray(result));
} else if (result.startsWith("{")) {
totalNetwork.from(new JSONObject(result));
}
}
return totalNetwork;
}
public static Object transaction_stats24hour(int limit) {
Calendar calone = DateUtils.getUTCCalendar();
calone.add(Calendar.DATE, -1);
String startTime = iso8601.format(calone.getTime());
Calendar caltwo = DateUtils.getUTCCalendar();
caltwo.setTime(RippleDate.now());
String endTime = iso8601.format(caltwo.getTime());
return transaction_stats(startTime, endTime, limit, Model.HOUR);
}
public static Object transaction_statsWeek(int limit) {
Calendar calone = DateUtils.getUTCCalendar();
calone.add(Calendar.DATE, -7);
String startTime = iso8601.format(calone.getTime());
Calendar caltwo = DateUtils.getUTCCalendar();
caltwo.setTime(RippleDate.now());
String endTime = iso8601.format(caltwo.getTime());
return transaction_stats(startTime, endTime, limit, Model.WEEK);
}
public static Object transaction_statsMonth(int limit) {
Calendar calone = DateUtils.getUTCCalendar();
calone.add(Calendar.MONTH, -1);
String startTime = iso8601.format(calone.getTime());
Calendar caltwo = DateUtils.getUTCCalendar();
caltwo.setTime(RippleDate.now());
String endTime = iso8601.format(caltwo.getTime());
return transaction_stats(startTime, endTime, limit, Model.MONTH);
}
public static Object transaction_statsYear(int limit) {
Calendar calone = DateUtils.getUTCCalendar();
calone.add(Calendar.YEAR, -1);
String startTime = iso8601.format(calone.getTime());
Calendar caltwo = DateUtils.getUTCCalendar();
caltwo.setTime(RippleDate.now());
String endTime = iso8601.format(caltwo.getTime());
return transaction_stats(startTime, endTime, limit, Model.YEAR);
}
public static TransactionStatsResponse transaction_stats(String startTime,
String endTime, int limit, Model model) {
JSONObject data = new JSONObject();
data.put("startTime", startTime);
data.put("endTime", endTime);
if (model != null) {
data.put("timeIncrement", model.toString().toLowerCase());
}
data.put("descending", true);
data.put("reduce", false);
data.put("limit", limit);
data.put("offset", 0);
data.put("format", "json");
HttpRequest request = HttpRequest
.post(CHARTS_URL + "transaction_stats");
String result = request.send(data);
TransactionStatsResponse transactionStats = new TransactionStatsResponse();
if (result != null && result.indexOf("\"") != -1) {
if (result.startsWith("[")) {
transactionStats.from(new JSONArray(result));
} else if (result.startsWith("{")) {
transactionStats.from(new JSONObject(result));
}
}
return transactionStats;
}
}