From 5a97c8c99908edd7b66d179953991827255b2d61 Mon Sep 17 00:00:00 2001 From: h4r0015k Date: Thu, 21 Mar 2019 18:56:03 +0530 Subject: [PATCH 001/183] Update kucoin api --- .../mobnetic/coinguardian/model/market/Kucoin.java | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/Kucoin.java b/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/Kucoin.java index 817b64de..021add3d 100644 --- a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/Kucoin.java +++ b/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/Kucoin.java @@ -20,9 +20,9 @@ public class Kucoin extends Market { private final static String NAME = "Kucoin"; private final static String TTS_NAME = NAME; - private final static String URL = "https://api.kucoin.com/v1/open/tick?symbol=%1$s"; + private final static String URL = "https://api.kucoin.com/api/v1/market/stats?symbol=%1$s"; - private final static String URL_COINS_PAIRS = "https://api.kucoin.com/v1/market/open/symbols"; + private final static String URL_COINS_PAIRS = "https://api.kucoin.com/api/v1/symbols"; public Kucoin() { super(NAME, TTS_NAME, null); @@ -41,8 +41,8 @@ protected void parseTickerFromJsonObject(int requestId, JSONObject jsonObject, T ticker.vol = tickerJsonObject.getDouble("vol"); ticker.high = tickerJsonObject.getDouble("high"); ticker.low = tickerJsonObject.getDouble("low"); - ticker.last = tickerJsonObject.getDouble("lastDealPrice"); - ticker.timestamp = tickerJsonObject.getLong("datetime"); + ticker.last = tickerJsonObject.getDouble("last"); + ticker.timestamp = tickerJsonObject.getLong("time"); } // ==================== @@ -60,8 +60,8 @@ protected void parseCurrencyPairsFromJsonObject(int requestId, JSONObject jsonOb for(int i=0; i< data.length(); ++i) { final JSONObject pairJsonObject = data.getJSONObject(i); pairs.add(new CurrencyPairInfo( - pairJsonObject.getString("coinType"), - pairJsonObject.getString("coinTypePair"), + pairJsonObject.getString("baseCurrency"), + pairJsonObject.getString("quoteCurrency"), pairJsonObject.getString("symbol") )); } From e133aebcceeecc8c9960ff146c940d97b28f96d5 Mon Sep 17 00:00:00 2001 From: rrovensky <54415495+rrovensky@users.noreply.github.com> Date: Thu, 30 Jul 2020 20:20:52 +0200 Subject: [PATCH 002/183] Update Bitstamp.java --- .../com/mobnetic/coinguardian/model/market/Bitstamp.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/Bitstamp.java b/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/Bitstamp.java index bc827f32..a8305dfe 100644 --- a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/Bitstamp.java +++ b/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/Bitstamp.java @@ -40,6 +40,11 @@ public class Bitstamp extends Market { Currency.EUR, Currency.USD }); + CURRENCY_PAIRS.put(VirtualCurrency.XLM, new String[]{ + VirtualCurrency.BTC, + Currency.EUR, + Currency.USD + }); CURRENCY_PAIRS.put(VirtualCurrency.XRP, new String[]{ VirtualCurrency.BTC, Currency.EUR, From 7fb53264418e4274c97404dbc3d808da7681c7ba Mon Sep 17 00:00:00 2001 From: Aneonex Software <69394046+aneonex@users.noreply.github.com> Date: Sat, 8 Aug 2020 18:23:07 +0300 Subject: [PATCH 003/183] Update README.md Removed donations --- README.md | 8 -------- 1 file changed, 8 deletions(-) diff --git a/README.md b/README.md index 525eb4c8..4b747e21 100644 --- a/README.md +++ b/README.md @@ -13,14 +13,6 @@ Please submit all requests for new exchanges/currency pairs or bugs in Bitcoin C ##### Bitcoin Checker on Google Play Store: https://play.google.com/store/apps/details?id=com.mobnetic.coinguardian -### Donate to Bitcoin Checker project: - -♥ __BTC__: 1KyLY5sT1Ffa6ctFPFpdL2bxhSAxNqfvMA - -♥ __DOGE__: D81kyZ49E132enb7ct7RcPGpjgsrN7bsd7 - -♥ __LTC__: LZ3EiK42o5nbDW3cwiaKUptFQ9eBA3x1vw - ## Table of Contents From 44c70a5144773c90ba4b1675751bd05e06590d27 Mon Sep 17 00:00:00 2001 From: Alexander Biryukov Date: Thu, 27 Aug 2020 23:21:50 +0300 Subject: [PATCH 004/183] Fixed app Url --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 4b747e21..f5a98007 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,7 @@ _We proudly announce_ that [DataModule](dataModule) (containing exchanges and cu Please submit all requests for new exchanges/currency pairs or bugs in Bitcoin Checker apps in the [Issues](https://github.com/mobnetic/BitcoinChecker/issues) section. ##### Bitcoin Checker on Google Play Store: -https://play.google.com/store/apps/details?id=com.mobnetic.coinguardian +https://play.google.com/store/apps/details?id=com.aneonex.bitcoinchecker From 684739947abc54cbc1c24ddb76a2193f89dc2156 Mon Sep 17 00:00:00 2001 From: Alexander Biryukov Date: Fri, 28 Aug 2020 00:39:32 +0300 Subject: [PATCH 005/183] Improved convertation decimal to string (points increased 3 to 5) --- .gitignore | 72 +++++++++++++++++-- .../bundles/debug/res/values/values.xml | 7 -- .../coinguardian/util/FormatUtilsBase.java | 8 +-- 3 files changed, 70 insertions(+), 17 deletions(-) delete mode 100644 dataModule/build/intermediates/bundles/debug/res/values/values.xml diff --git a/.gitignore b/.gitignore index c6cbe562..af6cb634 100644 --- a/.gitignore +++ b/.gitignore @@ -1,8 +1,68 @@ -*.iml -.gradle +# built application files +*.apk +*.ap_ +*.bak + +.vs/ + +# files for the dex VM +*.dex + +# Java class files +*.class + +# Gradle shit +./gradle +./gradle/ +./gradle/* +.gradle/ + +# generated files +bin/ +gen/ +obj/ +DJI-SDK-LIB/bin/ +DJI-SDK-LIB/gen/ +DJI-SDK-LIB/obj/ +IVT-A/bin/ +IVT-A/gen/ +IVT-A/obj/ +build/ +Documentation-Generator/doc/ +Pack-Relative/sdk-package/ +Pack-Relative/sdk-testing-package/ + +# generated file +lint.xml +IVT-A/lint.xml +DJI-SDK-LIB/lint.xml + +# Local configuration file (sdk/lib path, etc) /local.properties -/.idea/workspace.xml -/.idea/libraries +/project.properties +DJI-SDK-LIB/local.properties +IVT-A/local.properties +IVT-A/project.properties +IVT-A/.externalToolBuilders + +# Eclipse project files +/.classpath +.settings/ +DJI-SDK-LIB/.settings/ +IVT-A/.classpath +IVT-A/.settings/ + +# Proguard folder generated by Eclipse +proguard/ +IVT-A/proguard/ +DJI-SDK-LIB/proguard/ + +# Intellij project files +*.ipr +*.iws +.idea/ +*.iml + +# Mac files .DS_Store -/build -/captures + diff --git a/dataModule/build/intermediates/bundles/debug/res/values/values.xml b/dataModule/build/intermediates/bundles/debug/res/values/values.xml deleted file mode 100644 index ee13075b..00000000 --- a/dataModule/build/intermediates/bundles/debug/res/values/values.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - This exchange has limit for 3000 requests per hour. Make sure you don\'t exceed the limit:) - Caution: Due to this exchange\'s specification checking price on it may consume a lot of mobile data (while on mobile network). Be sure that you understand the possible consequences. - Selected market was probably removed and does not exist. Please choose another one. - This exchange has limit for 100 requests per minute. Make sure you don\'t exceed the limit:) - \ No newline at end of file diff --git a/dataModule/src/main/java/com/mobnetic/coinguardian/util/FormatUtilsBase.java b/dataModule/src/main/java/com/mobnetic/coinguardian/util/FormatUtilsBase.java index b359a311..437e9945 100644 --- a/dataModule/src/main/java/com/mobnetic/coinguardian/util/FormatUtilsBase.java +++ b/dataModule/src/main/java/com/mobnetic/coinguardian/util/FormatUtilsBase.java @@ -15,18 +15,18 @@ public class FormatUtilsBase { // Double formatting // ==================== private final static DecimalFormat FORMAT_TWO_DECIMAL = new DecimalFormat("0.00"); - private final static DecimalFormat FORMAT_THREE_SIGNIFICANT_AT_MOST = new DecimalFormat("@##"); + private final static DecimalFormat FORMAT_FIVE_SIGNIFICANT_AT_MOST = new DecimalFormat("@#####"); private final static DecimalFormat FORMAT_EIGHT_SIGNIFICANT_AT_MOST = new DecimalFormat("@#######"); // ==================== // Format methods // ==================== public static String formatDouble(double value, boolean isPrice) { - return formatDouble(value<1 ? FORMAT_THREE_SIGNIFICANT_AT_MOST : FORMAT_TWO_DECIMAL, value); + return formatDouble(value<1 ? FORMAT_FIVE_SIGNIFICANT_AT_MOST : FORMAT_TWO_DECIMAL, value); } - public static String formatDoubleWithThreeMax(double value) { - return formatDouble(FORMAT_THREE_SIGNIFICANT_AT_MOST, value); + public static String formatDoubleWithFiveMax(double value) { + return formatDouble(FORMAT_FIVE_SIGNIFICANT_AT_MOST, value); } protected static String formatDoubleWithEightMax(double value) { From 2f38bd04eaa6ffbad55018cefd659a1c5b00e843 Mon Sep 17 00:00:00 2001 From: Alexander Biryukov Date: Sat, 29 Aug 2020 00:07:32 +0300 Subject: [PATCH 006/183] Upgraded grandle and Android SDK version --- .idea/compiler.xml | 22 ------ .idea/copyright/profiles_settings.xml | 3 - .idea/gradle.xml | 19 ----- .idea/markdown-navigator.xml | 67 ------------------ .../markdown-navigator/profiles_settings.xml | 3 - .idea/misc.xml | 62 ---------------- .idea/modules.xml | 10 --- .idea/runConfigurations.xml | 12 ---- .idea/vcs.xml | 6 -- build.gradle | 4 +- dataModule/build.gradle | 8 +-- dataModule/src/main/AndroidManifest.xml | 4 +- dataModuleTester/build.gradle | 15 ++-- dataModuleTester/libs/volley.jar | Bin 88756 -> 0 bytes dataModuleTester/src/main/AndroidManifest.xml | 4 +- gradle/wrapper/gradle-wrapper.properties | 2 +- 16 files changed, 20 insertions(+), 221 deletions(-) delete mode 100644 .idea/compiler.xml delete mode 100644 .idea/copyright/profiles_settings.xml delete mode 100644 .idea/gradle.xml delete mode 100644 .idea/markdown-navigator.xml delete mode 100644 .idea/markdown-navigator/profiles_settings.xml delete mode 100644 .idea/misc.xml delete mode 100644 .idea/modules.xml delete mode 100644 .idea/runConfigurations.xml delete mode 100644 .idea/vcs.xml delete mode 100644 dataModuleTester/libs/volley.jar diff --git a/.idea/compiler.xml b/.idea/compiler.xml deleted file mode 100644 index 96cc43ef..00000000 --- a/.idea/compiler.xml +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/copyright/profiles_settings.xml b/.idea/copyright/profiles_settings.xml deleted file mode 100644 index e7bedf33..00000000 --- a/.idea/copyright/profiles_settings.xml +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/.idea/gradle.xml b/.idea/gradle.xml deleted file mode 100644 index d494f36d..00000000 --- a/.idea/gradle.xml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/.idea/markdown-navigator.xml b/.idea/markdown-navigator.xml deleted file mode 100644 index 13954015..00000000 --- a/.idea/markdown-navigator.xml +++ /dev/null @@ -1,67 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/markdown-navigator/profiles_settings.xml b/.idea/markdown-navigator/profiles_settings.xml deleted file mode 100644 index 674a5916..00000000 --- a/.idea/markdown-navigator/profiles_settings.xml +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml deleted file mode 100644 index 7158618b..00000000 --- a/.idea/misc.xml +++ /dev/null @@ -1,62 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1.8 - - - - - - - - \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml deleted file mode 100644 index ec4e9391..00000000 --- a/.idea/modules.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - \ No newline at end of file diff --git a/.idea/runConfigurations.xml b/.idea/runConfigurations.xml deleted file mode 100644 index 7f68460d..00000000 --- a/.idea/runConfigurations.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml deleted file mode 100644 index 94a25f7f..00000000 --- a/.idea/vcs.xml +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - \ No newline at end of file diff --git a/build.gradle b/build.gradle index 2e369803..2b29ba25 100644 --- a/build.gradle +++ b/build.gradle @@ -1,15 +1,17 @@ // Top-level build file where you can add configuration options common to all sub-projects/modules. buildscript { repositories { + google() jcenter() } dependencies { - classpath 'com.android.tools.build:gradle:2.2.3' + classpath 'com.android.tools.build:gradle:3.2.1' } } allprojects { repositories { + google() jcenter() } } diff --git a/dataModule/build.gradle b/dataModule/build.gradle index 34cf2fcc..224abde4 100644 --- a/dataModule/build.gradle +++ b/dataModule/build.gradle @@ -1,12 +1,12 @@ apply plugin: 'com.android.library' android { - compileSdkVersion 23 - buildToolsVersion "24.0.3" + compileSdkVersion 28 + buildToolsVersion "28.0.3" defaultConfig { - minSdkVersion 9 - targetSdkVersion 18 + minSdkVersion 26 + targetSdkVersion 28 } buildTypes { diff --git a/dataModule/src/main/AndroidManifest.xml b/dataModule/src/main/AndroidManifest.xml index b0c8e0f3..1d3236c6 100644 --- a/dataModule/src/main/AndroidManifest.xml +++ b/dataModule/src/main/AndroidManifest.xml @@ -3,8 +3,8 @@ android:versionCode="1" android:versionName="1.0" > - + android:targetSdkVersion="18" /--> diff --git a/dataModuleTester/build.gradle b/dataModuleTester/build.gradle index 0f5061a7..d7dbe3b8 100644 --- a/dataModuleTester/build.gradle +++ b/dataModuleTester/build.gradle @@ -1,13 +1,13 @@ apply plugin: 'com.android.application' android { - compileSdkVersion 23 - buildToolsVersion "24.0.3" + compileSdkVersion 28 + buildToolsVersion "28.0.3" defaultConfig { applicationId "com.mobnetic.coinguardiandatamodule.tester" - minSdkVersion 9 - targetSdkVersion 18 + minSdkVersion 26 + targetSdkVersion 28 } buildTypes { @@ -19,7 +19,8 @@ android { } dependencies { - compile project(':dataModule') - compile 'com.google.code.gson:gson:2.2.4' - compile files('libs/volley.jar') + implementation project(':dataModule') + implementation 'com.google.code.gson:gson:2.6.2' + implementation 'com.android.volley:volley:1.1.0' +// compile files('libs/volley.jar') } diff --git a/dataModuleTester/libs/volley.jar b/dataModuleTester/libs/volley.jar deleted file mode 100644 index 0a6b8ea577ae61179fef47daf2eab151fc924bb2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 88756 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 j - + android:targetSdkVersion="18" /--> Date: Sat, 29 Aug 2020 00:13:55 +0300 Subject: [PATCH 007/183] Deleted closed exchanges: Btce, BtcChina --- .../coinguardian/config/MarketsConfig.java | 2 - .../coinguardian/model/market/Btcchina.java | 50 -------- .../coinguardian/model/market/Btce.java | 110 ------------------ 3 files changed, 162 deletions(-) delete mode 100644 dataModule/src/main/java/com/mobnetic/coinguardian/model/market/Btcchina.java delete mode 100644 dataModule/src/main/java/com/mobnetic/coinguardian/model/market/Btce.java diff --git a/dataModule/src/main/java/com/mobnetic/coinguardian/config/MarketsConfig.java b/dataModule/src/main/java/com/mobnetic/coinguardian/config/MarketsConfig.java index 9e9ee2f5..6f279a35 100644 --- a/dataModule/src/main/java/com/mobnetic/coinguardian/config/MarketsConfig.java +++ b/dataModule/src/main/java/com/mobnetic/coinguardian/config/MarketsConfig.java @@ -14,8 +14,6 @@ private final static void addMarket(Market market) { static { addMarket(new Bitstamp()); - addMarket(new Btcchina()); - addMarket(new Btce()); addMarket(new Bitcurex()); addMarket(new Mercado()); addMarket(new Kraken()); diff --git a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/Btcchina.java b/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/Btcchina.java deleted file mode 100644 index fef9cc36..00000000 --- a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/Btcchina.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.mobnetic.coinguardian.model.market; - -import java.util.HashMap; -import java.util.LinkedHashMap; - -import org.json.JSONObject; - -import com.mobnetic.coinguardian.model.CheckerInfo; -import com.mobnetic.coinguardian.model.Market; -import com.mobnetic.coinguardian.model.Ticker; -import com.mobnetic.coinguardian.model.currency.Currency; -import com.mobnetic.coinguardian.model.currency.VirtualCurrency; - -public class Btcchina extends Market { - - private final static String NAME = "BtcChina"; - private final static String TTS_NAME = "BTC China"; - private final static String URL = "https://data.btcchina.com/data/ticker?market=%1$s%2$s"; - private final static HashMap CURRENCY_PAIRS = new LinkedHashMap(); - static { - CURRENCY_PAIRS.put(VirtualCurrency.BTC, new String[]{ - VirtualCurrency.LTC, - Currency.CNY - }); - CURRENCY_PAIRS.put(VirtualCurrency.LTC, new String[]{ - Currency.CNY - }); - } - - public Btcchina() { - super(NAME, TTS_NAME, CURRENCY_PAIRS); - } - - @Override - public String getUrl(int requestId, CheckerInfo checkerInfo) { - return String.format(URL, checkerInfo.getCurrencyCounterLowerCase(), checkerInfo.getCurrencyBaseLowerCase()); // reversed currencies - } - - @Override - protected void parseTickerFromJsonObject(int requestId, JSONObject jsonObject, Ticker ticker, CheckerInfo checkerInfo) throws Exception { - final JSONObject tickerJsonObject = jsonObject.getJSONObject("ticker"); - - ticker.bid = tickerJsonObject.getDouble("buy"); - ticker.ask = tickerJsonObject.getDouble("sell"); - ticker.vol = tickerJsonObject.getDouble("vol"); - ticker.high = tickerJsonObject.getDouble("high"); - ticker.low = tickerJsonObject.getDouble("low"); - ticker.last = tickerJsonObject.getDouble("last"); - } -} diff --git a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/Btce.java b/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/Btce.java deleted file mode 100644 index af016f76..00000000 --- a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/Btce.java +++ /dev/null @@ -1,110 +0,0 @@ -package com.mobnetic.coinguardian.model.market; - -import com.mobnetic.coinguardian.model.CheckerInfo; -import com.mobnetic.coinguardian.model.CurrencyPairInfo; -import com.mobnetic.coinguardian.model.Market; -import com.mobnetic.coinguardian.model.Ticker; -import com.mobnetic.coinguardian.model.currency.Currency; -import com.mobnetic.coinguardian.model.currency.VirtualCurrency; - -import org.json.JSONArray; -import org.json.JSONObject; - -import java.util.HashMap; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Locale; - -public class Btce extends Market { - - private final static String NAME = "WEX"; - private final static String TTS_NAME = NAME; - private final static String URL = "https://wex.nz/api/3/ticker/%1$s"; - private final static String URL_CURRENCY_PAIRS = "https://wex.nz/api/3/info"; - private final static HashMap CURRENCY_PAIRS = new LinkedHashMap(); - static { - CURRENCY_PAIRS.put(VirtualCurrency.BTC, new String[]{ - Currency.USD, - Currency.RUR, - Currency.EUR - }); - CURRENCY_PAIRS.put(VirtualCurrency.LTC, new String[]{ - VirtualCurrency.BTC, - Currency.USD, - Currency.RUR, - Currency.EUR - }); - CURRENCY_PAIRS.put(VirtualCurrency.NMC, new String[]{ - VirtualCurrency.BTC, - Currency.USD - }); - CURRENCY_PAIRS.put(VirtualCurrency.NVC, new String[]{ - VirtualCurrency.BTC, - Currency.USD - }); - CURRENCY_PAIRS.put(Currency.USD, new String[]{ - Currency.RUR - }); - CURRENCY_PAIRS.put(Currency.EUR, new String[]{ - Currency.USD, - Currency.RUR - }); - CURRENCY_PAIRS.put(VirtualCurrency.PPC, new String[]{ - VirtualCurrency.BTC, - Currency.USD - }); - } - - public Btce() { - super(NAME, TTS_NAME, CURRENCY_PAIRS); - } - - @Override - public String getUrl(int requestId, CheckerInfo checkerInfo) { - String pairId = checkerInfo.getCurrencyPairId(); - if(checkerInfo.getCurrencyPairId() == null) { - pairId = String.format("%1$s_%2$s", checkerInfo.getCurrencyBaseLowerCase(), checkerInfo.getCurrencyCounterLowerCase()); - } - return String.format(URL, pairId); - } - - @Override - protected void parseTickerFromJsonObject(int requestId, JSONObject jsonObject, Ticker ticker, CheckerInfo checkerInfo) throws Exception { - final JSONArray names = jsonObject.names(); - JSONObject tickerJsonObject = jsonObject.getJSONObject(names.getString(0)); - - ticker.bid = tickerJsonObject.getDouble("sell"); // REVERSED! - ticker.ask = tickerJsonObject.getDouble("buy"); // REVERSED! - ticker.vol = tickerJsonObject.getDouble("vol"); - ticker.high = tickerJsonObject.getDouble("high"); - ticker.low = tickerJsonObject.getDouble("low"); - ticker.last = tickerJsonObject.getDouble("last"); - ticker.timestamp = tickerJsonObject.getLong("updated"); - } - - // ==================== - // Get currency pairs - // ==================== - @Override - public String getCurrencyPairsUrl(int requestId) { - return URL_CURRENCY_PAIRS; - } - - @Override - protected void parseCurrencyPairsFromJsonObject(int requestId, JSONObject jsonObject, List pairs) throws Exception { - final JSONObject pairsJsonObject = jsonObject.getJSONObject("pairs"); - final JSONArray pairsNames = pairsJsonObject.names(); - for(int i=0; i Date: Sat, 29 Aug 2020 00:48:58 +0300 Subject: [PATCH 008/183] Sort exchange list view --- .../coinguardian/util/MarketsConfigUtils.java | 5 ++- .../tester/MainActivity.java | 43 ++++++++++++++----- 2 files changed, 35 insertions(+), 13 deletions(-) diff --git a/dataModule/src/main/java/com/mobnetic/coinguardian/util/MarketsConfigUtils.java b/dataModule/src/main/java/com/mobnetic/coinguardian/util/MarketsConfigUtils.java index 8c8260fb..1a6d0ea3 100644 --- a/dataModule/src/main/java/com/mobnetic/coinguardian/util/MarketsConfigUtils.java +++ b/dataModule/src/main/java/com/mobnetic/coinguardian/util/MarketsConfigUtils.java @@ -9,7 +9,8 @@ public class MarketsConfigUtils { private final static Market UNKNOWN = new Unknown(); - + +/* public static Market getMarketById(int id) { synchronized (MarketsConfig.MARKETS) { if(id>=0 && id { + public String key; + public String name; + + public MarketEntry(String key, String name) { + this.key = key; + this.name = name; + } + + @Override + public String toString() { + return name; + } + + @Override + public int compareTo(MarketEntry o) { + return name.compareTo(o.name); + } + } + private RequestQueue requestQueue; private Spinner marketSpinner; private View currencySpinnersWrapper; @@ -126,9 +146,8 @@ public void onClick(View v) { // Get selected items // ==================== private Market getSelectedMarket() { - int size = MarketsConfig.MARKETS.size(); - int idx = (size - 1) - marketSpinner.getSelectedItemPosition(); - return MarketsConfigUtils.getMarketById(idx); + MarketEntry marketEntry = (MarketEntry)marketSpinner.getSelectedItem(); + return MarketsConfigUtils.getMarketByKey(marketEntry.key); } private String getSelectedCurrencyBase() { @@ -152,18 +171,20 @@ private int getSelectedContractType(Market market) { return Futures.CONTRACT_TYPE_WEEKLY; } - // ==================== // Refreshing UI // ==================== private void refreshMarketSpinner() { - final CharSequence[] entries = new String[MarketsConfig.MARKETS.size()]; + final MarketEntry[] entries = new MarketEntry[MarketsConfig.MARKETS.size()]; int i = entries.length - 1; for(Market market : MarketsConfig.MARKETS.values()) { - entries[i--] = market.name; + MarketEntry marketEntry = new MarketEntry(market.key, market.name); + entries[i--] = marketEntry;// market.name; } - - marketSpinner.setAdapter(new ArrayAdapter(this, android.R.layout.simple_spinner_dropdown_item, entries)); + + java.util.Arrays.sort(entries); + + marketSpinner.setAdapter(new ArrayAdapter(this, android.R.layout.simple_spinner_dropdown_item, entries)); } private void refreshCurrencySpinners(Market market) { From 0906486c0d0d572856a9face6c42d9ec47399f97 Mon Sep 17 00:00:00 2001 From: Alexander Biryukov Date: Sat, 29 Aug 2020 02:21:52 +0300 Subject: [PATCH 009/183] Fixed BitcoinToYou exchange --- .../coinguardian/model/market/BitCore.java | 40 -------- .../model/market/BitMarket24PL.java | 64 ------------- .../model/market/BitMarketPL.java | 71 -------------- .../model/market/BitcoinAverage.java | 92 ------------------- .../model/market/BitcoinToYou.java | 19 ++-- 5 files changed, 13 insertions(+), 273 deletions(-) delete mode 100644 dataModule/src/main/java/com/mobnetic/coinguardian/model/market/BitCore.java delete mode 100644 dataModule/src/main/java/com/mobnetic/coinguardian/model/market/BitMarket24PL.java delete mode 100644 dataModule/src/main/java/com/mobnetic/coinguardian/model/market/BitMarketPL.java delete mode 100644 dataModule/src/main/java/com/mobnetic/coinguardian/model/market/BitcoinAverage.java diff --git a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/BitCore.java b/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/BitCore.java deleted file mode 100644 index 5dffc0f1..00000000 --- a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/BitCore.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.mobnetic.coinguardian.model.market; - -import java.util.HashMap; -import java.util.LinkedHashMap; - -import org.json.JSONObject; - -import com.mobnetic.coinguardian.model.CheckerInfo; -import com.mobnetic.coinguardian.model.Market; -import com.mobnetic.coinguardian.model.Ticker; -import com.mobnetic.coinguardian.model.currency.Currency; -import com.mobnetic.coinguardian.model.currency.VirtualCurrency; - -public class BitCore extends Market { - - private final static String NAME = "BitCore"; - private final static String TTS_NAME = "Bit Core"; - private final static String URL = "http://api.bitcore.co.kr/ticker"; - private final static HashMap CURRENCY_PAIRS = new LinkedHashMap(); - static { - CURRENCY_PAIRS.put(VirtualCurrency.BTC, new String[]{ - Currency.KRW - }); - } - - public BitCore() { - super(NAME, TTS_NAME, CURRENCY_PAIRS); - } - - @Override - public String getUrl(int requestId, CheckerInfo checkerInfo) { - return URL; - } - - @Override - protected void parseTickerFromJsonObject(int requestId, JSONObject jsonObject, Ticker ticker, CheckerInfo checkerInfo) throws Exception { - ticker.vol = jsonObject.getDouble("volume"); - ticker.last = jsonObject.getDouble("last"); - } -} diff --git a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/BitMarket24PL.java b/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/BitMarket24PL.java deleted file mode 100644 index c6578c99..00000000 --- a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/BitMarket24PL.java +++ /dev/null @@ -1,64 +0,0 @@ -package com.mobnetic.coinguardian.model.market; - -import java.util.HashMap; -import java.util.LinkedHashMap; - -import org.json.JSONObject; - -import com.mobnetic.coinguardian.model.CheckerInfo; -import com.mobnetic.coinguardian.model.Market; -import com.mobnetic.coinguardian.model.Ticker; -import com.mobnetic.coinguardian.model.currency.Currency; -import com.mobnetic.coinguardian.model.currency.VirtualCurrency; - -public class BitMarket24PL extends Market { - - private final static String NAME = "BitMarket24.pl"; - private final static String TTS_NAME = "Bit Market 24"; - private final static String URL = "https://bitmarket24.pl/api/%1$s_%2$s/status.json"; - private final static HashMap CURRENCY_PAIRS = new LinkedHashMap(); - static { - CURRENCY_PAIRS.put(VirtualCurrency.BCC, new String[]{ - Currency.PLN - }); - CURRENCY_PAIRS.put(VirtualCurrency.BTC, new String[]{ - Currency.PLN - }); - CURRENCY_PAIRS.put(VirtualCurrency.BTG, new String[]{ - Currency.PLN - }); - CURRENCY_PAIRS.put(VirtualCurrency.LTC, new String[]{ - VirtualCurrency.BTC, - Currency.PLN - }); - } - - public BitMarket24PL() { - super(NAME, TTS_NAME, CURRENCY_PAIRS); - } - - @Override - public String getUrl(int requestId, CheckerInfo checkerInfo) { - return String.format(URL, checkerInfo.getCurrencyBase(), checkerInfo.getCurrencyCounter()); - } - - @Override - protected void parseTickerFromJsonObject(int requestId, JSONObject jsonObject, Ticker ticker, CheckerInfo checkerInfo) throws Exception { - if (!jsonObject.isNull("bid")) { - ticker.bid = jsonObject.getDouble("bid"); - } - if (!jsonObject.isNull("ask")) { - ticker.ask = jsonObject.getDouble("ask"); - } - if (!jsonObject.isNull("volume")) { - ticker.vol = jsonObject.getDouble("volume"); - } - if (!jsonObject.isNull("high")) { - ticker.high = jsonObject.getDouble("high"); - } - if (!jsonObject.isNull("low")) { - ticker.low = jsonObject.getDouble("low"); - } - ticker.last = jsonObject.getDouble("last"); - } -} diff --git a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/BitMarketPL.java b/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/BitMarketPL.java deleted file mode 100644 index 93b35860..00000000 --- a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/BitMarketPL.java +++ /dev/null @@ -1,71 +0,0 @@ -package com.mobnetic.coinguardian.model.market; - -import java.util.HashMap; -import java.util.LinkedHashMap; - -import org.json.JSONObject; - -import com.mobnetic.coinguardian.model.CheckerInfo; -import com.mobnetic.coinguardian.model.Market; -import com.mobnetic.coinguardian.model.Ticker; -import com.mobnetic.coinguardian.model.currency.Currency; -import com.mobnetic.coinguardian.model.currency.VirtualCurrency; - -public class BitMarketPL extends Market { - - private final static String SYMBOL_SWAP = "SWAP"; - - private final static String NAME = "BitMarket.pl"; - private final static String TTS_NAME = "Bit Market"; - private final static String URL = "https://www.bitmarket.pl/json/%1$s%2$s/ticker.json"; - private final static String URL_SWAP = "https://bitmarket.pl/json/swap%1$s/swap.json"; - private final static HashMap CURRENCY_PAIRS = new LinkedHashMap(); - static { - CURRENCY_PAIRS.put(VirtualCurrency.BTC, new String[]{ - Currency.EUR, - Currency.PLN, - SYMBOL_SWAP - }); - CURRENCY_PAIRS.put(VirtualCurrency.BCC, new String[]{ - Currency.PLN - }); - CURRENCY_PAIRS.put(VirtualCurrency.LTC, new String[]{ - VirtualCurrency.BTC, - Currency.PLN, - SYMBOL_SWAP - }); - CURRENCY_PAIRS.put(VirtualCurrency.ETH, new String[]{ - SYMBOL_SWAP - }); - } - - public BitMarketPL() { - super(NAME, TTS_NAME, CURRENCY_PAIRS); - } - - private boolean isSwap(CheckerInfo checkerInfo) { - return SYMBOL_SWAP.equals(checkerInfo.getCurrencyCounter()); - } - - @Override - public String getUrl(int requestId, CheckerInfo checkerInfo) { - if (isSwap(checkerInfo)){ - return String.format(URL_SWAP, checkerInfo.getCurrencyBase()); - } - return String.format(URL, checkerInfo.getCurrencyBase(), checkerInfo.getCurrencyCounter()); - } - - @Override - protected void parseTickerFromJsonObject(int requestId, JSONObject jsonObject, Ticker ticker, CheckerInfo checkerInfo) throws Exception { - if (isSwap(checkerInfo)){ - ticker.last = jsonObject.getDouble("cutoff"); - } else { - ticker.bid = jsonObject.getDouble("bid"); - ticker.ask = jsonObject.getDouble("ask"); - ticker.vol = jsonObject.getDouble("volume"); - ticker.high = jsonObject.getDouble("high"); - ticker.low = jsonObject.getDouble("low"); - ticker.last = jsonObject.getDouble("last"); - } - } -} diff --git a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/BitcoinAverage.java b/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/BitcoinAverage.java deleted file mode 100644 index 714e91aa..00000000 --- a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/BitcoinAverage.java +++ /dev/null @@ -1,92 +0,0 @@ -package com.mobnetic.coinguardian.model.market; - -import com.mobnetic.coinguardian.model.CheckerInfo; -import com.mobnetic.coinguardian.model.CurrencyPairInfo; -import com.mobnetic.coinguardian.model.Market; -import com.mobnetic.coinguardian.model.Ticker; -import com.mobnetic.coinguardian.model.currency.Currency; -import com.mobnetic.coinguardian.model.currency.VirtualCurrency; -import com.mobnetic.coinguardian.util.TimeUtils; - -import org.json.JSONArray; -import org.json.JSONObject; - -import java.util.HashMap; -import java.util.LinkedHashMap; -import java.util.List; - -public class BitcoinAverage extends Market { - - private final static String NAME = "BitcoinAverage"; - private final static String TTS_NAME = "Bitcoin Average"; - private final static String URL = "https://apiv2.bitcoinaverage.com/indices/global/ticker/%1$s"; - private final static String URL_CURRENCY_PAIRS = "https://apiv2.bitcoinaverage.com/constants/symbols"; - private final static HashMap CURRENCY_PAIRS = new LinkedHashMap(); - static { - CURRENCY_PAIRS.put(VirtualCurrency.BTC, new String[]{ - Currency.AUD, - Currency.BRL, - Currency.CAD, - Currency.CHF, - Currency.CNY, - Currency.CZK, - Currency.EUR, - Currency.GBP, - Currency.ILS, - Currency.JPY, - Currency.NOK, - Currency.NZD, - Currency.PLN, - Currency.RUB, - Currency.SEK, - Currency.SGD, - Currency.USD, - Currency.ZAR, - }); - } - - public BitcoinAverage() { - super(NAME, TTS_NAME, CURRENCY_PAIRS); - } - - @Override - public String getUrl(int requestId, CheckerInfo checkerInfo) { - final String pairId; - if (checkerInfo.getCurrencyPairId() == null) { - pairId = checkerInfo.getCurrencyBase() + checkerInfo.getCurrencyCounter(); - } else { - pairId = checkerInfo.getCurrencyPairId(); - } - return String.format(URL, pairId); - } - - @Override - protected void parseTickerFromJsonObject(int requestId, JSONObject jsonObject, Ticker ticker, CheckerInfo checkerInfo) throws Exception { - ticker.bid = jsonObject.getDouble("bid"); - ticker.ask = jsonObject.getDouble("ask"); - ticker.vol = jsonObject.getDouble("volume"); - ticker.high = jsonObject.getDouble("high"); - ticker.low = jsonObject.getDouble("low"); - ticker.last = jsonObject.getDouble("last"); - ticker.timestamp = jsonObject.getLong("timestamp") * TimeUtils.MILLIS_IN_SECOND; - } - - // ==================== - // Get currency pairs - // ==================== - @Override - public String getCurrencyPairsUrl(int requestId) { - return URL_CURRENCY_PAIRS; - } - - @Override - protected void parseCurrencyPairsFromJsonObject(int requestId, JSONObject jsonObject, List pairs) throws Exception { - final JSONArray pairsJsonArray = jsonObject.getJSONObject("global").getJSONArray("symbols"); - for(int i=0; i CURRENCY_PAIRS = new LinkedHashMap(); static { CURRENCY_PAIRS.put(VirtualCurrency.BTC, new String[]{ @@ -29,15 +29,22 @@ public BitcoinToYou() { @Override public String getUrl(int requestId, CheckerInfo checkerInfo) { - return URL; +/* + String pairId = checkerInfo.getCurrencyPairId(); + if (pairId == null) { + pairId = String.format("%1$s_%2$s", checkerInfo.getCurrencyBaseLowerCase(), checkerInfo.getCurrencyCounterLowerCase()); + } + */ + String result = String.format(URL, checkerInfo.getCurrencyBase(), checkerInfo.getCurrencyCounter()); + return result; } @Override protected void parseTickerFromJsonObject(int requestId, JSONObject jsonObject, Ticker ticker, CheckerInfo checkerInfo) throws Exception { - final JSONObject tickerJsonObject = jsonObject.getJSONObject("ticker"); - ticker.bid = tickerJsonObject.getDouble("buy"); - ticker.ask = tickerJsonObject.getDouble("sell"); - ticker.vol = tickerJsonObject.getDouble("vol"); + final JSONObject tickerJsonObject = jsonObject.getJSONObject("summary"); +// ticker.bid = tickerJsonObject.getDouble("buy"); +// ticker.ask = tickerJsonObject.getDouble("sell"); + ticker.vol = tickerJsonObject.getDouble("amount"); ticker.high = tickerJsonObject.getDouble("high"); ticker.low = tickerJsonObject.getDouble("low"); ticker.last = tickerJsonObject.getDouble("last"); From 9ecd79b1b89d6b4123ac8abae3f7f320fec28312 Mon Sep 17 00:00:00 2001 From: Alexander Biryukov Date: Sat, 29 Aug 2020 02:30:05 +0300 Subject: [PATCH 010/183] Fixed BitcoinTrade exchange --- .../com/mobnetic/coinguardian/model/market/BitcoinTrade.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/BitcoinTrade.java b/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/BitcoinTrade.java index 35e10b2e..d0fe633c 100644 --- a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/BitcoinTrade.java +++ b/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/BitcoinTrade.java @@ -14,7 +14,7 @@ public class BitcoinTrade extends Market { private final static String NAME = "BitcoinTrade"; private final static String TTS_NAME = "Bitcoin Trade"; - private final static String URL = "https://api.bitcointrade.com.br/v1/public/%1$s/ticker/"; + private final static String URL = "https://api.bitcointrade.com.br/v3/public/%1$s%2$s/ticker"; private final static HashMap CURRENCY_PAIRS = new LinkedHashMap(); static { CURRENCY_PAIRS.put(VirtualCurrency.BTC, new String[]{ @@ -34,7 +34,7 @@ public BitcoinTrade() { @Override public String getUrl(int requestId, CheckerInfo checkerInfo) { - return String.format(URL, checkerInfo.getCurrencyBase()); + return String.format(URL, checkerInfo.getCurrencyCounter(), checkerInfo.getCurrencyBase()); } @Override From c40fba7a518937486a315ea45f49c576b886c6d0 Mon Sep 17 00:00:00 2001 From: Alexander Biryukov Date: Sat, 29 Aug 2020 02:30:37 +0300 Subject: [PATCH 011/183] Deleted obsoleted exchanges --- .../coinguardian/config/MarketsConfig.java | 7 -- .../coinguardian/model/market/Anxpro.java | 116 ------------------ .../coinguardian/model/market/Basebit.java | 66 ---------- .../model/market/SevenNineSix.java | 55 --------- 4 files changed, 244 deletions(-) delete mode 100644 dataModule/src/main/java/com/mobnetic/coinguardian/model/market/Anxpro.java delete mode 100644 dataModule/src/main/java/com/mobnetic/coinguardian/model/market/Basebit.java delete mode 100644 dataModule/src/main/java/com/mobnetic/coinguardian/model/market/SevenNineSix.java diff --git a/dataModule/src/main/java/com/mobnetic/coinguardian/config/MarketsConfig.java b/dataModule/src/main/java/com/mobnetic/coinguardian/config/MarketsConfig.java index 6f279a35..a37142d8 100644 --- a/dataModule/src/main/java/com/mobnetic/coinguardian/config/MarketsConfig.java +++ b/dataModule/src/main/java/com/mobnetic/coinguardian/config/MarketsConfig.java @@ -28,7 +28,6 @@ private final static void addMarket(Market market) { addMarket(new Btcturk()); addMarket(new Coinse()); addMarket(new Campbx()); - addMarket(new BitcoinAverage()); addMarket(new TheRock()); addMarket(new CexIO()); addMarket(new Virtex()); @@ -41,10 +40,8 @@ private final static void addMarket(Market market) { addMarket(new CoinJar()); addMarket(new Poloniex()); addMarket(new Winkdex()); - addMarket(new Anxpro()); addMarket(new BitX()); addMarket(new CCex()); - addMarket(new BitMarketPL()); addMarket(new Bitorado()); addMarket(new CryptoRush()); addMarket(new CoinDesk()); @@ -68,12 +65,10 @@ private final static void addMarket(Market market) { addMarket(new Cryptonit()); addMarket(new LakeBTC()); addMarket(new BitMaszyna()); - addMarket(new BitCore()); addMarket(new Zaydo()); addMarket(new AllCoin()); addMarket(new Ripio()); addMarket(new DolarBlueNet()); - addMarket(new Basebit()); addMarket(new CoinSwap()); addMarket(new Paymium()); addMarket(new Bitso()); @@ -87,13 +82,11 @@ private final static void addMarket(Market market) { addMarket(new BitBay()); addMarket(new QuadrigaCX()); addMarket(new CoinMateIO()); - addMarket(new BitMarket24PL()); addMarket(new Buttercoin()); addMarket(new CoinTraderNet()); addMarket(new LocalBitcoins()); addMarket(new Cryptopia()); addMarket(new Igot()); - addMarket(new SevenNineSix()); addMarket(new Mexbt()); addMarket(new Vaultoro()); addMarket(new BitxCom()); diff --git a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/Anxpro.java b/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/Anxpro.java deleted file mode 100644 index 072943c1..00000000 --- a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/Anxpro.java +++ /dev/null @@ -1,116 +0,0 @@ -package com.mobnetic.coinguardian.model.market; - -import java.util.HashMap; -import java.util.LinkedHashMap; - -import org.json.JSONObject; - -import com.mobnetic.coinguardian.model.CheckerInfo; -import com.mobnetic.coinguardian.model.Market; -import com.mobnetic.coinguardian.model.Ticker; -import com.mobnetic.coinguardian.model.currency.Currency; -import com.mobnetic.coinguardian.model.currency.VirtualCurrency; -import com.mobnetic.coinguardian.util.TimeUtils; - -public class Anxpro extends Market { - - private final static String NAME = "Anxpro"; - private final static String TTS_NAME = "ANX Pro"; - private final static String URL = "https://anxpro.com/api/2/%1$s%2$s/money/ticker"; - private final static HashMap CURRENCY_PAIRS = new LinkedHashMap(); - static { - CURRENCY_PAIRS.put(VirtualCurrency.BTC, new String[]{ - Currency.USD, - Currency.HKD, - Currency.EUR, - Currency.CAD, - Currency.AUD, - Currency.SGD, - Currency.JPY, - Currency.CHF, - Currency.GBP, - Currency.NZD - }); - CURRENCY_PAIRS.put(VirtualCurrency.DOGE, new String[]{ - VirtualCurrency.BTC, - Currency.USD, - Currency.HKD, - Currency.EUR, - Currency.CAD, - Currency.AUD, - Currency.SGD, - Currency.JPY, - Currency.CHF, - Currency.GBP, - Currency.NZD - }); - CURRENCY_PAIRS.put(VirtualCurrency.LTC, new String[]{ - VirtualCurrency.BTC, - Currency.USD, - Currency.HKD, - Currency.EUR, - Currency.CAD, - Currency.AUD, - Currency.SGD, - Currency.JPY, - Currency.CHF, - Currency.GBP, - Currency.NZD - }); - CURRENCY_PAIRS.put(VirtualCurrency.PPC, new String[]{ - VirtualCurrency.BTC, - VirtualCurrency.LTC, - Currency.USD, - Currency.HKD, - Currency.EUR, - Currency.CAD, - Currency.AUD, - Currency.SGD, - Currency.JPY, - Currency.CHF, - Currency.GBP, - Currency.NZD - }); - CURRENCY_PAIRS.put(VirtualCurrency.NMC, new String[]{ - VirtualCurrency.BTC, - VirtualCurrency.LTC, - Currency.USD, - Currency.HKD, - Currency.EUR, - Currency.CAD, - Currency.AUD, - Currency.SGD, - Currency.JPY, - Currency.CHF, - Currency.GBP, - Currency.NZD - }); - } - - public Anxpro() { - super(NAME, TTS_NAME, CURRENCY_PAIRS); - } - - @Override - public String getUrl(int requestId, CheckerInfo checkerInfo) { - return String.format(URL, checkerInfo.getCurrencyBase(), checkerInfo.getCurrencyCounter()); - } - - @Override - protected void parseTickerFromJsonObject(int requestId, JSONObject jsonObject, Ticker ticker, CheckerInfo checkerInfo) throws Exception { - final JSONObject dataObject = jsonObject.getJSONObject("data"); - - ticker.bid = getPriceValueFromObject(dataObject, "buy"); - ticker.ask = getPriceValueFromObject(dataObject, "sell"); - ticker.vol = getPriceValueFromObject(dataObject, "vol"); - ticker.high = getPriceValueFromObject(dataObject, "high"); - ticker.low = getPriceValueFromObject(dataObject, "low"); - ticker.last = getPriceValueFromObject(dataObject, "last"); - ticker.timestamp = dataObject.getLong("now")/TimeUtils.NANOS_IN_MILLIS; - } - - private double getPriceValueFromObject(JSONObject jsonObject, String key) throws Exception { - final JSONObject innerObject = jsonObject.getJSONObject(key); - return innerObject.getDouble("value"); - } -} diff --git a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/Basebit.java b/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/Basebit.java deleted file mode 100644 index d5563cb9..00000000 --- a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/Basebit.java +++ /dev/null @@ -1,66 +0,0 @@ -package com.mobnetic.coinguardian.model.market; - -import java.util.List; - -import org.json.JSONArray; -import org.json.JSONObject; - -import com.mobnetic.coinguardian.model.CheckerInfo; -import com.mobnetic.coinguardian.model.CurrencyPairInfo; -import com.mobnetic.coinguardian.model.Market; -import com.mobnetic.coinguardian.model.Ticker; - -public class Basebit extends Market { - - private final static String NAME = "Basebit"; - private final static String TTS_NAME = "Base Bit"; - private final static String URL = "http://www.basebit.com.br/quote-%1$s"; - private final static String URL_CURRENCY_PAIRS = "http://www.basebit.com.br/listpairs"; - - public Basebit() { - super(NAME, TTS_NAME, null); - } - - @Override - public String getUrl(int requestId, CheckerInfo checkerInfo) { - return String.format(URL, checkerInfo.getCurrencyPairId()); - } - - @Override - protected void parseTickerFromJsonObject(int requestId, JSONObject jsonObject, Ticker ticker, CheckerInfo checkerInfo) throws Exception { - final JSONObject resultJsonObject = jsonObject.getJSONObject("result"); - ticker.vol = resultJsonObject.getDouble("volume24h"); - ticker.high = resultJsonObject.getDouble("high"); - ticker.low = resultJsonObject.getDouble("low"); - ticker.last = resultJsonObject.getDouble("last"); - } - - @Override - protected String parseErrorFromJsonObject(int requestId, JSONObject jsonObject, CheckerInfo checkerInfo) throws Exception { - return jsonObject.getString("errorMessage"); - } - - // ==================== - // Get currency pairs - // ==================== - @Override - public String getCurrencyPairsUrl(int requestId) { - return URL_CURRENCY_PAIRS; - } - - @Override - protected void parseCurrencyPairs(int requestId, String responseString, List pairs) throws Exception { - final JSONArray pairsJsonArray = new JSONArray(responseString); - - for(int i=0; i=2) { - pairs.add(new CurrencyPairInfo( - currencyNames[0], - currencyNames[1], - pairName)); - } - } - } -} diff --git a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/SevenNineSix.java b/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/SevenNineSix.java deleted file mode 100644 index b25213ee..00000000 --- a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/SevenNineSix.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.mobnetic.coinguardian.model.market; - -import java.util.HashMap; -import java.util.LinkedHashMap; - -import org.json.JSONObject; - -import com.mobnetic.coinguardian.model.CheckerInfo; -import com.mobnetic.coinguardian.model.Market; -import com.mobnetic.coinguardian.model.Ticker; -import com.mobnetic.coinguardian.model.currency.Currency; -import com.mobnetic.coinguardian.model.currency.VirtualCurrency; -import com.mobnetic.coinguardian.util.ParseUtils; - -public class SevenNineSix extends Market { - - private final static String NAME = "796"; - private final static String TTS_NAME = NAME; - private final static String URL_BTC = "http://api.796.com/v3/futures/ticker.html?type=weekly"; - private final static String URL_LTC = "http://api.796.com/v3/futures/ticker.html?type=ltc"; - private final static HashMap CURRENCY_PAIRS = new LinkedHashMap(); - static { - CURRENCY_PAIRS.put(VirtualCurrency.BTC, new String[]{ - Currency.USD - }); - CURRENCY_PAIRS.put(VirtualCurrency.LTC, new String[]{ - Currency.USD - }); - } - - public SevenNineSix() { - super(NAME, TTS_NAME, CURRENCY_PAIRS); - } - - @Override - public String getUrl(int requestId, CheckerInfo checkerInfo) { - if(VirtualCurrency.LTC.equals(checkerInfo.getCurrencyBase())) { - return URL_LTC; - } else { - return URL_BTC; - } - } - - @Override - protected void parseTickerFromJsonObject(int requestId, JSONObject jsonObject, Ticker ticker, CheckerInfo checkerInfo) throws Exception { - final JSONObject tickerJsonObject = jsonObject.getJSONObject("ticker"); - - ticker.bid = ParseUtils.getDoubleFromString(tickerJsonObject, "buy"); - ticker.ask = ParseUtils.getDoubleFromString(tickerJsonObject, "sell"); - ticker.vol = ParseUtils.getDoubleFromString(tickerJsonObject, "vol"); - ticker.high = ParseUtils.getDoubleFromString(tickerJsonObject, "high"); - ticker.low = ParseUtils.getDoubleFromString(tickerJsonObject, "low"); - ticker.last = ParseUtils.getDoubleFromString(tickerJsonObject, "last"); - } -} \ No newline at end of file From 2b4fe3fc8bc59c02deb95c2f6428e872b9901b39 Mon Sep 17 00:00:00 2001 From: Alexander Biryukov Date: Sat, 29 Aug 2020 02:38:05 +0300 Subject: [PATCH 012/183] Return back method MarketsConfigUtils.getMarketById --- .../com/mobnetic/coinguardian/util/MarketsConfigUtils.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/dataModule/src/main/java/com/mobnetic/coinguardian/util/MarketsConfigUtils.java b/dataModule/src/main/java/com/mobnetic/coinguardian/util/MarketsConfigUtils.java index 1a6d0ea3..7d71792c 100644 --- a/dataModule/src/main/java/com/mobnetic/coinguardian/util/MarketsConfigUtils.java +++ b/dataModule/src/main/java/com/mobnetic/coinguardian/util/MarketsConfigUtils.java @@ -10,7 +10,6 @@ public class MarketsConfigUtils { private final static Market UNKNOWN = new Unknown(); -/* public static Market getMarketById(int id) { synchronized (MarketsConfig.MARKETS) { if(id>=0 && id Date: Sat, 29 Aug 2020 12:51:39 +0300 Subject: [PATCH 013/183] Added XLM currency --- .../mobnetic/coinguardian/model/currency/VirtualCurrency.java | 1 + 1 file changed, 1 insertion(+) diff --git a/dataModule/src/main/java/com/mobnetic/coinguardian/model/currency/VirtualCurrency.java b/dataModule/src/main/java/com/mobnetic/coinguardian/model/currency/VirtualCurrency.java index 76466dbe..0e665a3b 100644 --- a/dataModule/src/main/java/com/mobnetic/coinguardian/model/currency/VirtualCurrency.java +++ b/dataModule/src/main/java/com/mobnetic/coinguardian/model/currency/VirtualCurrency.java @@ -349,6 +349,7 @@ public class VirtualCurrency { public static final String XDG = "XDG"; // DOGE public static final String XIV = "XIV"; public static final String XJO = "XJO"; + public static final String XLM = "XLM"; public static final String XMR = "XMR"; public static final String XNC = "XNC"; public static final String XPM = "XPM"; From dd5816cd2698c17579c133bd3906be9c09817f89 Mon Sep 17 00:00:00 2001 From: Alexander Biryukov Date: Sat, 29 Aug 2020 13:05:16 +0300 Subject: [PATCH 014/183] Added GBP to Bitstamp --- .../coinguardian/model/market/Bitstamp.java | 25 +++++++++++++------ 1 file changed, 18 insertions(+), 7 deletions(-) diff --git a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/Bitstamp.java b/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/Bitstamp.java index a8305dfe..55acc0eb 100644 --- a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/Bitstamp.java +++ b/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/Bitstamp.java @@ -20,35 +20,46 @@ public class Bitstamp extends Market { static { CURRENCY_PAIRS.put(VirtualCurrency.BTC, new String[]{ Currency.EUR, - Currency.USD + Currency.USD, + Currency.GBP }); CURRENCY_PAIRS.put(VirtualCurrency.BCH, new String[]{ VirtualCurrency.BTC, Currency.EUR, - Currency.USD + Currency.USD, + Currency.GBP }); CURRENCY_PAIRS.put(Currency.EUR, new String[]{ - Currency.USD + Currency.USD, + Currency.GBP }); + CURRENCY_PAIRS.put(Currency.GBP, new String[]{ + Currency.EUR, + Currency.USD + }); CURRENCY_PAIRS.put(VirtualCurrency.ETH, new String[]{ VirtualCurrency.BTC, Currency.EUR, - Currency.USD + Currency.USD, + Currency.GBP }); CURRENCY_PAIRS.put(VirtualCurrency.LTC, new String[]{ VirtualCurrency.BTC, Currency.EUR, - Currency.USD + Currency.USD, + Currency.GBP }); CURRENCY_PAIRS.put(VirtualCurrency.XLM, new String[]{ VirtualCurrency.BTC, Currency.EUR, - Currency.USD + Currency.USD, + Currency.GBP }); CURRENCY_PAIRS.put(VirtualCurrency.XRP, new String[]{ VirtualCurrency.BTC, Currency.EUR, - Currency.USD + Currency.USD, + Currency.GBP }); } From 5748bfc43b9cdb0bdc0fb57e8721a3f4409a7c5d Mon Sep 17 00:00:00 2001 From: Aneonex Software <69394046+aneonex@users.noreply.github.com> Date: Sat, 29 Aug 2020 13:43:43 +0300 Subject: [PATCH 015/183] Added Google Play badge --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index f5a98007..552f9dc5 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,6 @@ +[![Get it on Google Play](https://upload.wikimedia.org/wikipedia/commons/thumb/7/78/Google_Play_Store_badge_EN.svg/200px-Google_Play_Store_badge_EN.svg.png)](https://play.google.com/store/apps/details?id=com.aneonex.bitcoinchecker) + + # Bitcoin Checker __Bitcoin Checker__ is a FREE app to track the most recent prices of your favourite currency pairs (on over 80 supported exchanges) in many customizable ways (such as rich notifications, TTS voice announcements, Home and Lockscreen widget or multiple alarms). From 38df6b63083b937b33ef8b5317c87244e34fcca2 Mon Sep 17 00:00:00 2001 From: Aneonex Software <69394046+aneonex@users.noreply.github.com> Date: Sat, 29 Aug 2020 14:09:10 +0300 Subject: [PATCH 016/183] Readme: Added notice --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 552f9dc5..d6801a98 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,8 @@ [![Get it on Google Play](https://upload.wikimedia.org/wikipedia/commons/thumb/7/78/Google_Play_Store_badge_EN.svg/200px-Google_Play_Store_badge_EN.svg.png)](https://play.google.com/store/apps/details?id=com.aneonex.bitcoinchecker) +> Notice: This project continues the development of the [original inactive project Bitcoin Checker](https://github.com/mobnetic/BitcoinChecker). + # Bitcoin Checker __Bitcoin Checker__ is a FREE app to track the most recent prices of your favourite currency pairs (on over 80 supported exchanges) in many customizable ways (such as rich notifications, TTS voice announcements, Home and Lockscreen widget or multiple alarms). From e555425d8d499299aa626eef1481f46d968d114c Mon Sep 17 00:00:00 2001 From: Alexander Biryukov Date: Sat, 29 Aug 2020 15:14:28 +0300 Subject: [PATCH 017/183] Bitfinex changed to API v1 and removed obsoleted exchanges --- .../coinguardian/config/MarketsConfig.java | 1 - .../model/market/BitcoinVenezuela.java | 4 +- .../coinguardian/model/market/Bitcurex.java | 53 ------------------- .../coinguardian/model/market/Bitfinex.java | 30 ++++++----- .../coinguardian/model/market/Bithumb.java | 5 +- 5 files changed, 22 insertions(+), 71 deletions(-) delete mode 100644 dataModule/src/main/java/com/mobnetic/coinguardian/model/market/Bitcurex.java diff --git a/dataModule/src/main/java/com/mobnetic/coinguardian/config/MarketsConfig.java b/dataModule/src/main/java/com/mobnetic/coinguardian/config/MarketsConfig.java index a37142d8..4cd0df7f 100644 --- a/dataModule/src/main/java/com/mobnetic/coinguardian/config/MarketsConfig.java +++ b/dataModule/src/main/java/com/mobnetic/coinguardian/config/MarketsConfig.java @@ -14,7 +14,6 @@ private final static void addMarket(Market market) { static { addMarket(new Bitstamp()); - addMarket(new Bitcurex()); addMarket(new Mercado()); addMarket(new Kraken()); addMarket(new Bitfinex()); diff --git a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/BitcoinVenezuela.java b/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/BitcoinVenezuela.java index fc427b93..e195fcec 100644 --- a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/BitcoinVenezuela.java +++ b/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/BitcoinVenezuela.java @@ -15,8 +15,8 @@ public class BitcoinVenezuela extends Market { private final static String NAME = "BitcoinVenezuela"; private final static String TTS_NAME = "Bitcoin Venezuela"; - private final static String URL = "http://api.bitcoinvenezuela.com/?html=no¤cy=%1$s&amount=1&to=%2$s"; - private final static String URL_CURRENCY_PAIRS = "http://api.bitcoinvenezuela.com/"; + private final static String URL = "https://api.bitcoinvenezuela.com/?html=no¤cy=%1$s&amount=1&to=%2$s"; + private final static String URL_CURRENCY_PAIRS = "https://api.bitcoinvenezuela.com/"; public BitcoinVenezuela() { super(NAME, TTS_NAME, null); diff --git a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/Bitcurex.java b/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/Bitcurex.java deleted file mode 100644 index 9b37f61f..00000000 --- a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/Bitcurex.java +++ /dev/null @@ -1,53 +0,0 @@ -package com.mobnetic.coinguardian.model.market; - -import java.util.HashMap; -import java.util.LinkedHashMap; - -import org.json.JSONObject; - -import com.mobnetic.coinguardian.model.CheckerInfo; -import com.mobnetic.coinguardian.model.Market; -import com.mobnetic.coinguardian.model.Ticker; -import com.mobnetic.coinguardian.model.currency.Currency; -import com.mobnetic.coinguardian.model.currency.VirtualCurrency; - -public class Bitcurex extends Market { - - private final static String NAME = "Bitcurex"; - private final static String TTS_NAME = NAME; - private final static String URL = "https://bitcurex.com/api/%1$s/ticker.json"; - private final static HashMap CURRENCY_PAIRS = new LinkedHashMap(); - static { - CURRENCY_PAIRS.put(VirtualCurrency.BTC, new String[]{ - Currency.PLN, - Currency.EUR - }); - } - - public Bitcurex() { - super(NAME, TTS_NAME, CURRENCY_PAIRS); - } - - @Override - public String getUrl(int requestId, CheckerInfo checkerInfo) { - return String.format(URL, checkerInfo.getCurrencyCounterLowerCase()); - } - - @Override - protected void parseTickerFromJsonObject(int requestId, JSONObject jsonObject, Ticker ticker, CheckerInfo checkerInfo) throws Exception { - ticker.bid = parsePrice(jsonObject.getDouble("best_ask")); - ticker.ask = parsePrice(jsonObject.getDouble("best_bid")); - ticker.vol = parseBTC(jsonObject.getDouble("total_volume")); - ticker.high = parsePrice(jsonObject.getDouble("highest_tx_price")); - ticker.low = parsePrice(jsonObject.getDouble("lowest_tx_price")); - ticker.last = parsePrice(jsonObject.getDouble("last_tx_price")); - } - - private double parsePrice(double price) { - return price/10000; - } - - private double parseBTC(double satoshi) { - return satoshi/100000000; - } -} diff --git a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/Bitfinex.java b/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/Bitfinex.java index 9ed34cb2..8ed7ae39 100644 --- a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/Bitfinex.java +++ b/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/Bitfinex.java @@ -21,8 +21,8 @@ public class Bitfinex extends Market { private final static String NAME = "Bitfinex"; private final static String TTS_NAME = NAME; - private final static String URL = "https://api.bitfinex.com/v1/pubticker/%1$s"; - private final static String URL_CURRENCY_PAIRS = "https://api.bitfinex.com/v1/symbols"; + private final static String URL = "https://api-pub.bitfinex.com/v2/ticker/%1$s"; + private final static String URL_CURRENCY_PAIRS = "https://api-pub.bitfinex.com/v2/tickers?symbols=ALL"; private final static HashMap CURRENCY_PAIRS = new LinkedHashMap<>(); static { CURRENCY_PAIRS.put(VirtualCurrency.BCC, new String[]{ @@ -111,14 +111,14 @@ public String getUrl(int requestId, CheckerInfo checkerInfo) { } @Override - protected void parseTickerFromJsonObject(int requestId, JSONObject jsonObject, Ticker ticker, CheckerInfo checkerInfo) throws Exception { - ticker.bid = ParseUtils.getDoubleFromString(jsonObject, "bid"); - ticker.ask = ParseUtils.getDoubleFromString(jsonObject, "ask"); - ticker.vol = ParseUtils.getDoubleFromString(jsonObject, "volume"); - ticker.high = ParseUtils.getDoubleFromString(jsonObject, "high"); - ticker.low = ParseUtils.getDoubleFromString(jsonObject, "low"); - ticker.last = ParseUtils.getDoubleFromString(jsonObject, "last_price"); - ticker.timestamp = (long) (jsonObject.getDouble("timestamp")*TimeUtils.MILLIS_IN_SECOND); + protected void parseTicker(int requestId, String responseString, Ticker ticker, CheckerInfo checkerInfo) throws Exception { + JSONArray jsonArray = new JSONArray(responseString); + ticker.bid = jsonArray.getDouble(0); + ticker.ask = jsonArray.getDouble(2); + ticker.last = jsonArray.getDouble(6); + ticker.vol = jsonArray.getDouble(7); + ticker.high = jsonArray.getDouble(8); + ticker.low = jsonArray.getDouble(9); } // ==================== @@ -133,11 +133,13 @@ public String getCurrencyPairsUrl(int requestId) { protected void parseCurrencyPairs(int requestId, String responseString, List pairs) throws Exception { final JSONArray pairsArray = new JSONArray(responseString); for (int i = 0; i < pairsArray.length(); ++i) { - final String pairId = pairsArray.getString(i); - if (pairId != null && pairId.length() == 6) { + final JSONArray pairArray = pairsArray.getJSONArray(i); + final String pairId = pairArray.getString(0); + if (pairId != null && pairId.length() == 7) { + // pairId example "tBTCUSD" pairs.add(new CurrencyPairInfo( - pairId.substring(0, 3).toUpperCase(Locale.US), - pairId.substring(3).toUpperCase(Locale.US), + pairId.substring(1, 4).toUpperCase(Locale.US), + pairId.substring(4).toUpperCase(Locale.US), pairId)); } } diff --git a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/Bithumb.java b/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/Bithumb.java index dc7a5167..b5e52931 100644 --- a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/Bithumb.java +++ b/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/Bithumb.java @@ -51,6 +51,9 @@ public class Bithumb extends Market { CURRENCY_PAIRS.put(VirtualCurrency.QTUM, new String[]{ Currency.KRW }); + CURRENCY_PAIRS.put(VirtualCurrency.CON, new String[]{ + Currency.KRW + }); } public Bithumb() { @@ -77,7 +80,7 @@ protected void parseTickerFromJsonObject(int requestId, JSONObject jsonObject, T JSONObject dataObject = jsonObject.getJSONObject("data"); if (requestId == 0) { - ticker.vol = dataObject.getDouble("volume_1day"); + ticker.vol = dataObject.getDouble("units_traded_24H"); ticker.high = dataObject.getDouble("max_price"); ticker.low = dataObject.getDouble("min_price"); ticker.last = dataObject.getDouble("closing_price"); From 51e76fea9d81162a60c9924208f57c45e5aede63 Mon Sep 17 00:00:00 2001 From: Alexander Biryukov Date: Sat, 29 Aug 2020 19:08:19 +0300 Subject: [PATCH 018/183] Removed obsoleted SwissCex --- .../coinguardian/config/MarketsConfig.java | 1 - .../coinguardian/model/market/SwissCex.java | 70 ------------------- 2 files changed, 71 deletions(-) delete mode 100644 dataModule/src/main/java/com/mobnetic/coinguardian/model/market/SwissCex.java diff --git a/dataModule/src/main/java/com/mobnetic/coinguardian/config/MarketsConfig.java b/dataModule/src/main/java/com/mobnetic/coinguardian/config/MarketsConfig.java index 4cd0df7f..07848ec4 100644 --- a/dataModule/src/main/java/com/mobnetic/coinguardian/config/MarketsConfig.java +++ b/dataModule/src/main/java/com/mobnetic/coinguardian/config/MarketsConfig.java @@ -54,7 +54,6 @@ private final static void addMarket(Market market) { addMarket(new Bit2c()); addMarket(new CryptoAltex()); addMarket(new BtcMarkets()); - addMarket(new SwissCex()); addMarket(new Bleutrade()); addMarket(new ShareXcoin()); addMarket(new Unisend()); diff --git a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/SwissCex.java b/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/SwissCex.java deleted file mode 100644 index a939508c..00000000 --- a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/SwissCex.java +++ /dev/null @@ -1,70 +0,0 @@ -package com.mobnetic.coinguardian.model.market; - -import java.util.List; - -import org.json.JSONArray; -import org.json.JSONObject; - -import android.text.TextUtils; - -import com.mobnetic.coinguardian.model.CheckerInfo; -import com.mobnetic.coinguardian.model.CurrencyPairInfo; -import com.mobnetic.coinguardian.model.Market; -import com.mobnetic.coinguardian.model.Ticker; - -public class SwissCex extends Market { - - private final static String NAME = "SWISSCEX"; - private final static String TTS_NAME = "Swiss Cex"; - private final static String URL = "http://api.swisscex.com/quote/%1$s/%2$s?apiKey=%3$s"; - private final static String URL_CURRENCY_PAIRS = "http://api.swisscex.com/quotes?apiKey=%1$s"; - public static String API_KEY = "61u3kk4h2una357envden8cuk6"; - - public SwissCex() { - super(NAME, TTS_NAME, null); - } - - @Override - public String getUrl(int requestId, CheckerInfo checkerInfo) { - return String.format(URL, checkerInfo.getCurrencyBase(), checkerInfo.getCurrencyCounter(), API_KEY); - } - - @Override - protected void parseTickerFromJsonObject(int requestId, JSONObject jsonObject, Ticker ticker, CheckerInfo checkerInfo) throws Exception { - final JSONObject quoteJsonObject = jsonObject.getJSONObject("quote"); - ticker.bid = quoteJsonObject.getDouble("bidPrice"); - ticker.ask = quoteJsonObject.getDouble("askPrice"); - ticker.vol = quoteJsonObject.getDouble("volume24"); - ticker.high = quoteJsonObject.getDouble("high24"); - ticker.low = quoteJsonObject.getDouble("low24"); - ticker.last = quoteJsonObject.getDouble("lastPrice"); - } - - @Override - protected String parseError(int requestId, String responseString, CheckerInfo checkerInfo) throws Exception { - if(TextUtils.isEmpty(API_KEY)) - return "API_KEY is empty"; - return responseString; - } - - // ==================== - // Get currency pairs - // ==================== - @Override - public String getCurrencyPairsUrl(int requestId) { - return String.format(URL_CURRENCY_PAIRS, API_KEY); - } - - @Override - protected void parseCurrencyPairsFromJsonObject(int requestId, JSONObject jsonObject, List pairs) throws Exception { - final JSONArray pairNames = jsonObject.names(); - for(int i=0; i Date: Sun, 30 Aug 2020 01:57:09 +0300 Subject: [PATCH 019/183] Migrate to latest gradle 6.1.1 --- dataModule/build.gradle | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dataModule/build.gradle b/dataModule/build.gradle index 224abde4..f322dc77 100644 --- a/dataModule/build.gradle +++ b/dataModule/build.gradle @@ -2,7 +2,7 @@ apply plugin: 'com.android.library' android { compileSdkVersion 28 - buildToolsVersion "28.0.3" + buildToolsVersion "29.0.2" defaultConfig { minSdkVersion 26 From 2d580d0975d7bd01f52ee89ba6023b4aa7f63993 Mon Sep 17 00:00:00 2001 From: Alexander Biryukov Date: Sun, 30 Aug 2020 14:31:05 +0300 Subject: [PATCH 020/183] Gradle updated to latest version --- build.gradle | 2 +- dataModuleTester/build.gradle | 2 +- gradle/wrapper/gradle-wrapper.properties | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/build.gradle b/build.gradle index 2b29ba25..dad9ef0a 100644 --- a/build.gradle +++ b/build.gradle @@ -5,7 +5,7 @@ buildscript { jcenter() } dependencies { - classpath 'com.android.tools.build:gradle:3.2.1' + classpath 'com.android.tools.build:gradle:4.0.1' } } diff --git a/dataModuleTester/build.gradle b/dataModuleTester/build.gradle index d7dbe3b8..d86e881f 100644 --- a/dataModuleTester/build.gradle +++ b/dataModuleTester/build.gradle @@ -2,7 +2,7 @@ apply plugin: 'com.android.application' android { compileSdkVersion 28 - buildToolsVersion "28.0.3" + buildToolsVersion "29.0.2" defaultConfig { applicationId "com.mobnetic.coinguardiandatamodule.tester" diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index ca251ff5..f7054891 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -#Mon Dec 28 10:00:20 PST 2015 +#Sun Aug 30 14:25:09 MSK 2020 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-4.9-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-6.1.1-all.zip From 391d81f3ec2a04dc1cf4784f3da07591d9232fde Mon Sep 17 00:00:00 2001 From: Alexander Biryukov Date: Mon, 31 Aug 2020 01:23:52 +0300 Subject: [PATCH 021/183] Create gradle.yml Setup CI --- .github/workflows/gradle.yml | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 .github/workflows/gradle.yml diff --git a/.github/workflows/gradle.yml b/.github/workflows/gradle.yml new file mode 100644 index 00000000..58e1c59c --- /dev/null +++ b/.github/workflows/gradle.yml @@ -0,0 +1,26 @@ +# This workflow will build a Java project with Gradle +# For more information see: https://help.github.com/actions/language-and-framework-guides/building-and-testing-java-with-gradle + +name: Java CI with Gradle + +on: + push: + branches: [ master ] + pull_request: + branches: [ master ] + +jobs: + build: + + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v2 + - name: Set up JDK 1.8 + uses: actions/setup-java@v1 + with: + java-version: 1.8 + - name: Grant execute permission for gradlew + run: chmod +x gradlew + - name: Build with Gradle + run: ./gradlew build From 18819a649fba4c52a6ce8fd1f3a6666c95e3de58 Mon Sep 17 00:00:00 2001 From: Alexander Biryukov Date: Mon, 31 Aug 2020 01:31:41 +0300 Subject: [PATCH 022/183] Fixed resources number format --- dataModuleTester/src/main/res/values/strings.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dataModuleTester/src/main/res/values/strings.xml b/dataModuleTester/src/main/res/values/strings.xml index 12c6443d..c7946fbe 100644 --- a/dataModuleTester/src/main/res/values/strings.xml +++ b/dataModuleTester/src/main/res/values/strings.xml @@ -8,7 +8,7 @@ Refresh Last sync: %1$s never - Currency pairs: %1$s + Currency pairs: %1$d Price: %1$s High: %1$s From d99f64133d2c03ebfebe1941cd2f30ff38e0b6f7 Mon Sep 17 00:00:00 2001 From: Aneonex Software <69394046+aneonex@users.noreply.github.com> Date: Wed, 2 Sep 2020 00:39:42 +0300 Subject: [PATCH 023/183] Added donations into readme --- README.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/README.md b/README.md index d6801a98..8fe30f21 100644 --- a/README.md +++ b/README.md @@ -18,6 +18,12 @@ Please submit all requests for new exchanges/currency pairs or bugs in Bitcoin C ##### Bitcoin Checker on Google Play Store: https://play.google.com/store/apps/details?id=com.aneonex.bitcoinchecker +## Donate to project develpment +- BTC: 1ADwViiQWaiw5ghkcNnSRA5KDZhdhgGvR1 +- ETH: 0x06339d6415f1ef0fa8f9a9e62e55f3610c043e0e + +Thank you! + ## Table of Contents From 15e7cc6f28f93e3314d14db036ba95dc459720ec Mon Sep 17 00:00:00 2001 From: Aneonex Software <69394046+aneonex@users.noreply.github.com> Date: Wed, 2 Sep 2020 01:35:38 +0300 Subject: [PATCH 024/183] Update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 8fe30f21..11a586db 100644 --- a/README.md +++ b/README.md @@ -13,7 +13,7 @@ _We proudly announce_ that [DataModule](dataModule) (containing exchanges and cu * Update currency pairs on their favourite exchange ### Issues -Please submit all requests for new exchanges/currency pairs or bugs in Bitcoin Checker apps in the [Issues](https://github.com/mobnetic/BitcoinChecker/issues) section. +Please submit all requests for new exchanges/currency pairs or bugs in Bitcoin Checker apps in the [Issues](../../issues/) section. ##### Bitcoin Checker on Google Play Store: https://play.google.com/store/apps/details?id=com.aneonex.bitcoinchecker @@ -124,7 +124,7 @@ public MarketExample() { ### 2. Providing currency pairs: If given exchanges provides a mechanism to fetch currency pairs dynamically, there is no need to specify them manually then. Please see [this section](# 6-fetching-currency-pairs-directly-from-exchange). -Otherwise you have to specify which currency pairs are supported by your new exchange. Description for this is done above, in the [Updating currency pairs on existing exchange](https://github.com/mobnetic/BitcoinCheckerDataModule# updating-currency-pairs-on-existing-exchange) section. +Otherwise you have to specify which currency pairs are supported by your new exchange. Description for this is done above, in the [Updating currency pairs on existing exchange](https://github.com/aneonex/BitcoinCheckerDataModule# updating-currency-pairs-on-existing-exchange) section. ### 3. Providing API Url: The API Url is provided by the getUrl method. The simplest implementation is to just return the URL field. Sometimes, the Url requires some additional parameters (like currency names) - then you have to provide them using ```String.format()``` method. From 0cbb934a2d2e29412d00add182e845f7a6db1006 Mon Sep 17 00:00:00 2001 From: Aneonex Software <69394046+aneonex@users.noreply.github.com> Date: Wed, 2 Sep 2020 01:39:33 +0300 Subject: [PATCH 025/183] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 11a586db..eec18efe 100644 --- a/README.md +++ b/README.md @@ -124,7 +124,7 @@ public MarketExample() { ### 2. Providing currency pairs: If given exchanges provides a mechanism to fetch currency pairs dynamically, there is no need to specify them manually then. Please see [this section](# 6-fetching-currency-pairs-directly-from-exchange). -Otherwise you have to specify which currency pairs are supported by your new exchange. Description for this is done above, in the [Updating currency pairs on existing exchange](https://github.com/aneonex/BitcoinCheckerDataModule# updating-currency-pairs-on-existing-exchange) section. +Otherwise you have to specify which currency pairs are supported by your new exchange. Description for this is done above, in the [Updating currency pairs on existing exchange](https://github.com/aneonex/BitcoinChecker#updating-currency-pairs-on-existing-exchange) section. ### 3. Providing API Url: The API Url is provided by the getUrl method. The simplest implementation is to just return the URL field. Sometimes, the Url requires some additional parameters (like currency names) - then you have to provide them using ```String.format()``` method. From c049852bf0b73ba140631104469f053ea8d9e827 Mon Sep 17 00:00:00 2001 From: Alexander Biryukov Date: Wed, 2 Sep 2020 11:01:59 +0300 Subject: [PATCH 026/183] Binance all pairs support --- dataModule/src/main/AndroidManifest.xml | 2 +- .../coinguardian/model/market/Binance.java | 30 +++++++++++-------- 2 files changed, 18 insertions(+), 14 deletions(-) diff --git a/dataModule/src/main/AndroidManifest.xml b/dataModule/src/main/AndroidManifest.xml index 1d3236c6..f725bc51 100644 --- a/dataModule/src/main/AndroidManifest.xml +++ b/dataModule/src/main/AndroidManifest.xml @@ -1,7 +1,7 @@ + android:versionName="1.1" > + android:versionName="2.0" > diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/config/MarketsConfig.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/config/MarketsConfig.kt new file mode 100644 index 00000000..5864096a --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/config/MarketsConfig.kt @@ -0,0 +1,140 @@ +package com.aneonex.bitcoinchecker.datamodule.config + +import com.aneonex.bitcoinchecker.datamodule.model.Market +import com.aneonex.bitcoinchecker.datamodule.model.market.* +import java.util.* + +object MarketsConfig { + @kotlin.jvm.JvmField + val MARKETS = LinkedHashMap() + private fun addMarket(market: Market) { + MARKETS[market.key] = market + } + + init { + addMarket(Bitstamp()) + addMarket(Mercado()) + addMarket(Kraken()) + addMarket(Bitfinex()) + addMarket(Okcoin()) + addMarket(Cryptsy()) + addMarket(Coinbase()) + addMarket(Vircurex()) + addMarket(Fxbtc()) + addMarket(Bter()) + addMarket(Justcoin()) + addMarket(Btcturk()) + addMarket(Coinse()) + addMarket(Campbx()) + addMarket(TheRock()) + addMarket(CexIO()) + addMarket(Virtex()) + addMarket(Huobi()) + addMarket(VaultOfSatoshi()) + addMarket(CoinMarketIO()) + addMarket(McxNOW()) + addMarket(CryptoTrade()) + addMarket(MintPal()) + addMarket(CoinJar()) + addMarket(Poloniex()) + addMarket(Winkdex()) + addMarket(BitX()) + addMarket(CCex()) + addMarket(Bitorado()) + addMarket(CryptoRush()) + addMarket(CoinDesk()) + addMarket(Koinim()) + addMarket(FybSE()) + addMarket(FybSG()) + addMarket(Prelude()) + addMarket(BitKonan()) + addMarket(BitTrex()) + addMarket(Comkort()) + addMarket(Bit2c()) + addMarket(CryptoAltex()) + addMarket(BtcMarkets()) + addMarket(Bleutrade()) + addMarket(ShareXcoin()) + addMarket(Unisend()) + addMarket(BitcoinVenezuela()) + addMarket(Korbit()) + addMarket(CoinTree()) + addMarket(Cryptonit()) + addMarket(LakeBTC()) + addMarket(BitMaszyna()) + addMarket(Zaydo()) + addMarket(AllCoin()) + addMarket(Ripio()) + addMarket(DolarBlueNet()) + addMarket(CoinSwap()) + addMarket(Paymium()) + addMarket(Bitso()) + addMarket(Cryptoine()) + addMarket(BitcoinToYou()) + addMarket(BitexLa()) + addMarket(ItBit()) + addMarket(BitcoinCoId()) + addMarket(HitBtc()) + addMarket(CleverCoin()) + addMarket(BitBay()) + addMarket(QuadrigaCX()) + addMarket(CoinMateIO()) + addMarket(Buttercoin()) + addMarket(CoinTraderNet()) + addMarket(LocalBitcoins()) + addMarket(Cryptopia()) + addMarket(Igot()) + addMarket(Mexbt()) + addMarket(Vaultoro()) + addMarket(BitxCom()) + addMarket(BtcBox()) + addMarket(BtcXIndia()) + addMarket(Uphold()) + addMarket(YoBit()) + addMarket(ShapeShift()) + addMarket(BitoEX()) + addMarket(OKCoinFutures()) + // addMarket(new FoscEx()); + addMarket(CoinSecure()) + addMarket(Dashcurex()) + addMarket(Quoine()) + addMarket(Livecoin()) + addMarket(Gemini()) + addMarket(Coinapult()) + addMarket(Btc38()) + addMarket(ETHEXIndia()) + addMarket(GateCoin()) + addMarket(Liqui()) + addMarket(ChileBit()) + addMarket(SurBitcoin()) + addMarket(VBtc()) + addMarket(Urdubit()) + addMarket(NegocieCoins()) + addMarket(BitMEX()) + addMarket(BitFlyer()) + addMarket(BitFlyerFX()) + addMarket(Coinone()) + addMarket(Bithumb()) + addMarket(Coinsph()) + addMarket(Bl3p()) + addMarket(SurBtc()) + addMarket(CoinFloor()) + addMarket(Lykke()) + addMarket(Coinnest()) + addMarket(Braziliex()) + addMarket(Abucoins()) + addMarket(Zebpay()) + addMarket(Paribu()) + addMarket(SatoshiTango()) + addMarket(Koinex()) + // addMarket(new Unocoin()); + addMarket(BlinkTrade()) + addMarket(Exmo()) + addMarket(Binance()) + addMarket(Kucoin()) + addMarket(BitcoinTrade()) + addMarket(OmniTrade()) + addMarket(Coinome()) + addMarket(Nocks()) + } +} \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/config/Settings.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/config/Settings.kt new file mode 100644 index 00000000..773aeee4 --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/config/Settings.kt @@ -0,0 +1,5 @@ +package com.aneonex.bitcoinchecker.datamodule.config + +object Settings { + var userCountry: String? = null +} \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/CheckerInfo.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/CheckerInfo.kt new file mode 100644 index 00000000..9ec55ce2 --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/CheckerInfo.kt @@ -0,0 +1,11 @@ +package com.aneonex.bitcoinchecker.datamodule.model + +import java.util.* + +class CheckerInfo(currencyBase: String, currencyCounter: String, currencyPairId: String?, val contractType: Int) + : CurrencyPairInfo(currencyBase, currencyCounter, currencyPairId) { + val currencyBaseLowerCase: String + get() = currencyBase.toLowerCase(Locale.US) + val currencyCounterLowerCase: String + get() = currencyCounter.toLowerCase(Locale.US) +} \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/CurrencyPairInfo.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/CurrencyPairInfo.kt new file mode 100644 index 00000000..78740623 --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/CurrencyPairInfo.kt @@ -0,0 +1,9 @@ +package com.aneonex.bitcoinchecker.datamodule.model + +open class CurrencyPairInfo(val currencyBase: String, val currencyCounter: String, val currencyPairId: String?) : Comparable { + @Throws(NullPointerException::class) + override fun compareTo(other: CurrencyPairInfo): Int { + val compBase = currencyBase.compareTo(other.currencyBase, ignoreCase = true) + return if (compBase != 0) compBase else currencyCounter.compareTo(other.currencyCounter, ignoreCase = true) + } +} \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/CurrencyPairsListWithDate.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/CurrencyPairsListWithDate.kt new file mode 100644 index 00000000..27d5cb36 --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/CurrencyPairsListWithDate.kt @@ -0,0 +1,8 @@ +package com.aneonex.bitcoinchecker.datamodule.model + +class CurrencyPairsListWithDate { + @kotlin.jvm.JvmField + var date: Long = 0 + @kotlin.jvm.JvmField + var pairs: List? = null +} \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/CurrencySubunit.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/CurrencySubunit.kt new file mode 100644 index 00000000..602ced87 --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/CurrencySubunit.kt @@ -0,0 +1,3 @@ +package com.aneonex.bitcoinchecker.datamodule.model + +class CurrencySubunit @JvmOverloads constructor(val name: String, val subunitToUnit: Long, val allowDecimal: Boolean = true) \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/CurrencySubunitsMap.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/CurrencySubunitsMap.kt new file mode 100644 index 00000000..fe394169 --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/CurrencySubunitsMap.kt @@ -0,0 +1,13 @@ +package com.aneonex.bitcoinchecker.datamodule.model + +import java.util.* + +class CurrencySubunitsMap(vararg currencySubunits: CurrencySubunit) : LinkedHashMap() { + companion object { +// private const val serialVersionUID = -7219011491064245859L + } + + init { + for (currencySubunit in currencySubunits) put(currencySubunit.subunitToUnit, currencySubunit) + } +} \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/Futures.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/Futures.kt new file mode 100644 index 00000000..c22664e8 --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/Futures.kt @@ -0,0 +1,23 @@ +package com.aneonex.bitcoinchecker.datamodule.model + +object Futures { + const val CONTRACT_TYPE_WEEKLY = 0 + const val CONTRACT_TYPE_BIWEEKLY = 1 +// const val CONTRACT_TYPE_MONTHLY = 2 +// const val CONTRACT_TYPE_BIMONTHLY = 3 + const val CONTRACT_TYPE_QUARTERLY = 4 + private val CONTRACT_TYPE_SHORT_NAMES = arrayOf( + "1W", + "2W", + "1M", + "2M", + "3M" + ) + + @kotlin.jvm.JvmStatic + fun getContractTypeShortName(contractType: Int): String? { + return if (contractType >= 0 && contractType < CONTRACT_TYPE_SHORT_NAMES.size) { + CONTRACT_TYPE_SHORT_NAMES[contractType] + } else null + } +} \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/FuturesMarket.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/FuturesMarket.kt new file mode 100644 index 00000000..0335c6c8 --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/FuturesMarket.kt @@ -0,0 +1,13 @@ +package com.aneonex.bitcoinchecker.datamodule.model + +import com.aneonex.bitcoinchecker.datamodule.model.currency.CurrencyPairsMap + +abstract class FuturesMarket(name: String, ttsName: String, currencyPairs: CurrencyPairsMap?, val contractTypes: IntArray) + : Market(name, ttsName, currencyPairs) { + + override fun getUrl(requestId: Int, checkerInfo: CheckerInfo): String { + return getUrl(requestId, checkerInfo, checkerInfo.contractType) + } + + protected abstract fun getUrl(requestId: Int, checkerInfo: CheckerInfo, contractType: Int): String +} \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/Market.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/Market.kt new file mode 100644 index 00000000..8b3cd26f --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/Market.kt @@ -0,0 +1,98 @@ +package com.aneonex.bitcoinchecker.datamodule.model + +import android.text.TextUtils +import com.aneonex.bitcoinchecker.datamodule.model.currency.CurrencyPairsMap +import com.aneonex.bitcoinchecker.datamodule.util.TimeUtils +import org.json.JSONObject + +abstract class Market(name: String, ttsName: String, currencyPairs: CurrencyPairsMap?) { + @kotlin.jvm.JvmField + val key: String = this.javaClass.simpleName + + @kotlin.jvm.JvmField + val name: String = name + + val ttsName: String = ttsName + + @kotlin.jvm.JvmField + val currencyPairs: CurrencyPairsMap? + + open val cautionResId: Int + get() = 0 + + // ==================== + // Parse Ticker + // ==================== + open fun getNumOfRequests(checkerInfo: CheckerInfo?): Int { + return 1 + } + + abstract fun getUrl(requestId: Int, checkerInfo: CheckerInfo): String + @Throws(Exception::class) + fun parseTickerMain(requestId: Int, responseString: String, ticker: Ticker, checkerInfo: CheckerInfo): Ticker { + parseTicker(requestId, responseString, ticker, checkerInfo) + if (ticker.timestamp <= 0) ticker.timestamp = System.currentTimeMillis() else ticker.timestamp = TimeUtils.parseTimeToMillis(ticker.timestamp) + return ticker + } + + @Throws(Exception::class) + protected open fun parseTicker(requestId: Int, responseString: String, ticker: Ticker, checkerInfo: CheckerInfo) { + parseTickerFromJsonObject(requestId, JSONObject(responseString), ticker, checkerInfo) + } + + @Throws(Exception::class) + protected open fun parseTickerFromJsonObject(requestId: Int, jsonObject: JSONObject, ticker: Ticker, checkerInfo: CheckerInfo) { + // do parsing + } + + // ==================== + // Parse Ticker Error + // ==================== + @Throws(Exception::class) + fun parseErrorMain(requestId: Int, responseString: String, checkerInfo: CheckerInfo): String? { + return parseError(requestId, responseString, checkerInfo) + } + + @Throws(Exception::class) + protected open fun parseError(requestId: Int, responseString: String, checkerInfo: CheckerInfo): String? { + return parseErrorFromJsonObject(requestId, JSONObject(responseString), checkerInfo) + } + + @Throws(Exception::class) + protected open fun parseErrorFromJsonObject(requestId: Int, jsonObject: JSONObject, checkerInfo: CheckerInfo?): String? { + throw Exception() + } + + // ==================== + // Parse currency pairs + // ==================== + open val currencyPairsNumOfRequests: Int + get() = 1 + + open fun getCurrencyPairsUrl(requestId: Int): String? { + return null + } + + @Throws(Exception::class) + fun parseCurrencyPairsMain(requestId: Int, responseString: String, pairs: MutableList) { + parseCurrencyPairs(requestId, responseString, pairs) + for (i in pairs.indices.reversed()) { + val currencyPairInfo = pairs[i] + if (TextUtils.isEmpty(currencyPairInfo.currencyBase) || TextUtils.isEmpty(currencyPairInfo.currencyCounter)) pairs.removeAt(i) + } + } + + @Throws(Exception::class) + protected open fun parseCurrencyPairs(requestId: Int, responseString: String, pairs: MutableList) { + parseCurrencyPairsFromJsonObject(requestId, JSONObject(responseString), pairs) + } + + @Throws(Exception::class) + protected open fun parseCurrencyPairsFromJsonObject(requestId: Int, jsonObject: JSONObject, pairs: MutableList) { + // do parsing + } + + init { + this.currencyPairs = currencyPairs + } +} \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/Ticker.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/Ticker.kt new file mode 100644 index 00000000..638f840f --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/Ticker.kt @@ -0,0 +1,32 @@ +package com.aneonex.bitcoinchecker.datamodule.model + +class Ticker { + @kotlin.jvm.JvmField + var bid: Double + @kotlin.jvm.JvmField + var ask: Double + @kotlin.jvm.JvmField + var vol: Double + @kotlin.jvm.JvmField + var high: Double + @kotlin.jvm.JvmField + var low: Double + @kotlin.jvm.JvmField + var last: Double + @kotlin.jvm.JvmField + var timestamp: Long + + companion object { + const val NO_DATA = -1 + } + + init { + bid = NO_DATA.toDouble() + ask = NO_DATA.toDouble() + vol = NO_DATA.toDouble() + high = NO_DATA.toDouble() + low = NO_DATA.toDouble() + last = NO_DATA.toDouble() + timestamp = NO_DATA.toLong() + } +} \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/currency/CurrenciesSubunits.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/currency/CurrenciesSubunits.kt new file mode 100644 index 00000000..03ca125a --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/currency/CurrenciesSubunits.kt @@ -0,0 +1,22 @@ +package com.aneonex.bitcoinchecker.datamodule.model.currency + +import com.aneonex.bitcoinchecker.datamodule.model.CurrencySubunit +import com.aneonex.bitcoinchecker.datamodule.model.CurrencySubunitsMap +import java.util.* + +object CurrenciesSubunits { + val CURRENCIES_SUBUNITS = HashMap() + + init { + CURRENCIES_SUBUNITS[VirtualCurrency.BTC] = CurrencySubunitsMap( + CurrencySubunit(VirtualCurrency.BTC, 1), + CurrencySubunit(VirtualCurrency.mBTC, 1000), + CurrencySubunit(VirtualCurrency.uBTC, 1000000), + CurrencySubunit(VirtualCurrency.Satoshi, 100000000, false) + ) + CURRENCIES_SUBUNITS[VirtualCurrency.LTC] = CurrencySubunitsMap( + CurrencySubunit(VirtualCurrency.LTC, 1), + CurrencySubunit(VirtualCurrency.mLTC, 1000) + ) + } +} \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/currency/Currency.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/currency/Currency.kt new file mode 100644 index 00000000..8f51066d --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/currency/Currency.kt @@ -0,0 +1,167 @@ +package com.aneonex.bitcoinchecker.datamodule.model.currency + +object Currency { + const val AED = "AED" + const val AFN = "AFN" + const val ALL = "ALL" + const val AMD = "AMD" + const val ANG = "ANG" + const val AOA = "AOA" + const val ARS = "ARS" + const val AUD = "AUD" + const val AWG = "AWG" + const val AZN = "AZN" + const val BAM = "BAM" + const val BBD = "BBD" + const val BDT = "BDT" + const val BGN = "BGN" + const val BHD = "BHD" + const val BIF = "BIF" + const val BMD = "BMD" + const val BND = "BND" + const val BOB = "BOB" + const val BRL = "BRL" + const val BSD = "BSD" + const val BTN = "BTN" + const val BWP = "BWP" + const val BYR = "BYR" + const val BZD = "BZD" + const val CAD = "CAD" + const val CDF = "CDF" + const val CHF = "CHF" + const val CLP = "CLP" + const val CNY = "CNY" + const val COP = "COP" + const val CRC = "CRC" + const val CUP = "CUP" + const val CVE = "CVE" + const val CZK = "CZK" + const val DJF = "DJF" + const val DKK = "DKK" + const val DOP = "DOP" + const val DZD = "DZD" + const val EEK = "EEK" + const val EGP = "EGP" + const val ERN = "ERN" + const val ETB = "ETB" + const val EUR = "EUR" + const val FJD = "FJD" + const val FKP = "FKP" + const val GBP = "GBP" + const val GEL = "GEL" + const val GHS = "GHS" + const val GIP = "GIP" + const val GMD = "GMD" + const val GNF = "GNF" + const val GOLD = "GOLD" + const val GTQ = "GTQ" + const val GYD = "GYD" + const val HKD = "HKD" + const val HNL = "HNL" + const val HRK = "HRK" + const val HTG = "HTG" + const val HUF = "HUF" + const val IDR = "IDR" + const val ILS = "ILS" + const val INR = "INR" + const val IQD = "IQD" + const val IRR = "IRR" + const val ISK = "ISK" + const val JMD = "JMD" + const val JOD = "JOD" + const val JPY = "JPY" + const val KES = "KES" + const val KGS = "KGS" + const val KHR = "KHR" + const val KMF = "KMF" + const val KPW = "KPW" + const val KRW = "KRW" + const val KWD = "KWD" + const val KYD = "KYD" + const val KZT = "KZT" + const val LAK = "LAK" + const val LBP = "LBP" + const val LKR = "LKR" + const val LRD = "LRD" + const val LSL = "LSL" + const val LTL = "LTL" + const val LVL = "LVL" + const val LYD = "LYD" + const val MAD = "MAD" + const val MDL = "MDL" + const val MGA = "MGA" + const val MKD = "MKD" + const val MMK = "MMK" + const val MNT = "MNT" + const val MOP = "MOP" + const val MRO = "MRO" + const val MUR = "MUR" + const val MVR = "MVR" + const val MWK = "MWK" + const val MXN = "MXN" + const val MYR = "MYR" + const val MZN = "MZN" + const val NAD = "NAD" + const val NGN = "NGN" + const val NIO = "NIO" + const val NIS = "NIS" + const val NOK = "NOK" + const val NPR = "NPR" + const val NZD = "NZD" + const val OMR = "OMR" + const val PAB = "PAB" + const val PEN = "PEN" + const val PGK = "PGK" + const val PHP = "PHP" + const val PKR = "PKR" + const val PLN = "PLN" + const val PYG = "PYG" + const val QAR = "QAR" + const val RON = "RON" + const val RSD = "RSD" + const val RUB = "RUB" + const val RUR = "RUR" + const val RWF = "RWF" + const val SAR = "SAR" + const val SBD = "SBD" + const val SCR = "SCR" + const val SDG = "SDG" + const val SEK = "SEK" + const val SGD = "SGD" + const val SHP = "SHP" + const val SLL = "SLL" + const val SOS = "SOS" + const val SRD = "SRD" + const val STD = "STD" + const val SVC = "SVC" + const val SYP = "SYP" + const val SZL = "SZL" + const val THB = "THB" + const val TJS = "TJS" + const val TMM = "TMM" + const val TND = "TND" + const val TOP = "TOP" + const val TRY = "TRY" + const val TTD = "TTD" + const val TWD = "TWD" + const val TZS = "TZS" + const val UAH = "UAH" + const val UGX = "UGX" + const val USD = "USD" + const val UYU = "UYU" + const val UZS = "UZS" + const val VEF = "VEF" + const val VND = "VND" + const val VUV = "VUV" + const val WST = "WST" + const val XAF = "XAF" + const val XAG = "XAG" + const val XAU = "XAU" + const val XCD = "XCD" + const val XOF = "XOF" + const val XPF = "XPF" + const val YER = "YER" + const val ZAR = "ZAR" + const val ZMK = "ZMK" + const val ZWL = "ZWL" +} \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/currency/CurrencyPairsMap.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/currency/CurrencyPairsMap.kt new file mode 100644 index 00000000..3643ee40 --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/currency/CurrencyPairsMap.kt @@ -0,0 +1,3 @@ +package com.aneonex.bitcoinchecker.datamodule.model.currency + +class CurrencyPairsMap: LinkedHashMap>() \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/currency/CurrencySymbols.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/currency/CurrencySymbols.kt new file mode 100644 index 00000000..0eeb68da --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/currency/CurrencySymbols.kt @@ -0,0 +1,54 @@ +package com.aneonex.bitcoinchecker.datamodule.model.currency + +import java.util.* + +object CurrencySymbols { + val CURRENCY_SYMBOLS = HashMap() + + init { + CURRENCY_SYMBOLS[Currency.USD] = "$" + CURRENCY_SYMBOLS[Currency.PLN] = "zł" + CURRENCY_SYMBOLS[Currency.CNY] = "¥" + CURRENCY_SYMBOLS[Currency.EUR] = "€" + // CURRENCY_SYMBOLS.put(CAD, "$"); + CURRENCY_SYMBOLS[Currency.GBP] = "£" + CURRENCY_SYMBOLS[Currency.CHF] = "Fr" + CURRENCY_SYMBOLS[Currency.RUB] = "р." + CURRENCY_SYMBOLS[Currency.RUR] = "р." + CURRENCY_SYMBOLS[Currency.AUD] = "$" + CURRENCY_SYMBOLS[Currency.SEK] = "kr" + CURRENCY_SYMBOLS[Currency.DKK] = "kr" + CURRENCY_SYMBOLS[Currency.HKD] = "$" + CURRENCY_SYMBOLS[Currency.SGD] = "$" + CURRENCY_SYMBOLS[Currency.THB] = "฿" + CURRENCY_SYMBOLS[Currency.NZD] = "$" + CURRENCY_SYMBOLS[Currency.JPY] = "¥" + CURRENCY_SYMBOLS[Currency.BRL] = "R$" + CURRENCY_SYMBOLS[Currency.KRW] = "₩" + CURRENCY_SYMBOLS[Currency.AFN] = "؋" + CURRENCY_SYMBOLS[Currency.ALL] = "L" + CURRENCY_SYMBOLS[Currency.DZD] = "د.ج" + CURRENCY_SYMBOLS[Currency.AOA] = "Kz" + CURRENCY_SYMBOLS[Currency.ARS] = "$" + CURRENCY_SYMBOLS[Currency.AMD] = "դր." + CURRENCY_SYMBOLS[Currency.AWG] = "ƒ" + CURRENCY_SYMBOLS[Currency.AZN] = "m" + CURRENCY_SYMBOLS[Currency.BSD] = "$" + CURRENCY_SYMBOLS[Currency.BHD] = "ب.د" + CURRENCY_SYMBOLS[Currency.BDT] = "৳" + CURRENCY_SYMBOLS[Currency.BBD] = "$" + CURRENCY_SYMBOLS[Currency.BYR] = "Br" + CURRENCY_SYMBOLS[Currency.BZD] = "$" + CURRENCY_SYMBOLS[Currency.BMD] = "$" + CURRENCY_SYMBOLS[Currency.BTN] = "Nu." + CURRENCY_SYMBOLS[Currency.BOB] = "Bs." + CURRENCY_SYMBOLS[Currency.BAM] = "КМ" + CURRENCY_SYMBOLS[Currency.BWP] = "P" + CURRENCY_SYMBOLS[Currency.BND] = "$" + CURRENCY_SYMBOLS[Currency.BGN] = "лв" + CURRENCY_SYMBOLS[Currency.BIF] = "Fr" + CURRENCY_SYMBOLS[Currency.TRY] = "TL" + CURRENCY_SYMBOLS[Currency.ZAR] = "R" + CURRENCY_SYMBOLS[Currency.IDR] = "Rp" + } +} \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/currency/VirtualCurrency.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/currency/VirtualCurrency.kt new file mode 100644 index 00000000..3d8a42d8 --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/currency/VirtualCurrency.kt @@ -0,0 +1,373 @@ +package com.aneonex.bitcoinchecker.datamodule.model.currency + +object VirtualCurrency { +// const val _10_5 = "10-5" +// const val _21 = "21" +// const val _42 = "42" +// const val _66 = "66" +// const val _888 = "888" + const val ADT = "ADT" + const val AE = "AE" + const val ALB = "ALB" + const val ALF = "ALF" + const val ALP = "ALP" + const val ALT = "ALT" + const val AMC = "AMC" + const val ANC = "ANC" + const val ANI = "ANI" + const val ANT = "ANT" + const val ARG = "ARG" + const val ASC = "ASC" + const val AUR = "AUR" + const val BAT = "BAT" + const val BC = "BC" + const val BCC = "BCC" + const val BCH = "BCH" + const val BCU = "BCU" + const val BCX = "BCX" + const val BEE = "BEE" + const val BEER = "BEER" + const val BELA = "BELA" + const val BELI = "BELI" + const val BEN = "BEN" + const val BET = "BET" + const val BF1 = "BF1" + const val BFX = "BFX" + const val BIL = "BIL" + const val BLA = "BLA" + const val BLC = "BLC" + const val BNB = "BNB" + const val BQC = "BQC" + const val BTB = "BTB" + const val BTC = "BTC" + const val mBTC = "mBTC" + const val uBTC = "µBTC" + const val Satoshi = "Satoshi" + const val BTCS = "BTCS" + const val BTE = "BTE" + const val BTG = "BTG" + const val BTP = "BTP" + const val BTQ = "BTQ" + const val BTR = "BTR" + const val BUK = "BUK" + const val BUR = "BUR" + const val C2 = "C2" + const val CACH = "CACH" + const val CAGE = "CAGE" + const val CAP = "CAP" + const val CARB = "CARB" + const val CASH = "CASH" + const val CAT = "CAT" + const val CDC = "CDC" + const val CENT = "CENT" + const val CGA = "CGA" + const val CGB = "CGB" + const val CIN = "CIN" + const val CL = "CL" + const val CLR = "CLR" + const val CMC = "CMC" + const val CMT = "CMT" + const val CNC = "CNC" + const val CNOTE = "CNOTE" + const val COIN = "COIN" + const val COINO = "COINO" + const val COL = "COL" + const val COLA = "COLA" + const val CON = "CON" + const val CORG = "CORG" + const val CPR = "CPR" + const val CR = "CR" + const val CRA = "CRA" + const val CRC = "CRC" + const val CRD = "CRD" + const val CREA = "CREA" + const val CRN = "CRN" + const val CRS = "CRS" + const val CSC = "CSC" + const val CTM = "CTM" + const val DASH = "DASH" + const val DBL = "DBL" + const val DELTA = "DELTA" + const val DEM = "DEM" + const val DGB = "DGB" + const val DGC = "DGC" + const val DIME = "DIME" + const val DMD = "DMD" + const val DOG = "DOG" + const val DOGE = "DOGE" + const val DOPE = "DOPE" + const val DRK = "DRK" + const val DSH = "DSH" // DASH + const val DTC = "DTC" + const val DUCK = "DUCK" + const val DVC = "DVC" + const val EAC = "EAC" + const val ECC = "ECC" + const val ECN = "ECN" + const val ELC = "ELC" + const val ELP = "ELP" + const val EMC2 = "EMC2" + const val EMD = "EMD" + const val EMO = "EMO" + const val EOS = "EOS" + const val ETC = "ETC" + const val ETH = "ETH" + const val ETOK = "ETOK" + const val eTOK = "eTOK" + const val EUC = "EUC" + const val EXC = "EXC" + const val EZC = "EZC" + const val FCK = "FCK" + const val FFC = "FFC" + const val FLAP = "FLAP" + const val FLO = "FLO" + const val FLT = "FLT" + const val FOX = "FOX" + const val FRC = "FRC" + const val FRK = "FRK" + const val FRQ = "FRQ" + const val FRY = "FRY" + const val FRZ = "FRZ" + const val FSC = "FSC" + const val FSS = "FSS" + const val FST = "FST" + const val FTC = "FTC" + const val FUNK = "FUNK" + const val FZ = "FZ" + const val GAME = "GAME" + const val GDC = "GDC" + const val GHS = "GHS" + const val GLB = "GLB" + const val GLC = "GLC" + const val GLD = "GLD" + const val GLX = "GLX" + const val GME = "GME" + const val GNT = "GNT" + const val GOAT = "GOAT" + const val GOX = "GOX" + const val GPUC = "GPUC" + const val GRC = "GRC" + const val GRUMP = "GRUMP" + const val HBN = "HBN" + const val HEX = "HEX" + const val HIRO = "HIRO" + const val HRO = "HRO" + const val HUC = "HUC" + const val HVC = "HVC" + const val HXC = "HXC" + const val HYC = "HYC" + const val I0C = "I0C" + const val ICN = "ICN" + const val IFC = "IFC" + const val IND = "IND" + const val IOST = "IOST" + const val IOT = "IOT" + const val IQD = "IQD" + const val IXC = "IXC" + const val JKC = "JKC" + const val JRY = "JRY" + const val KARM = "KARM" + const val KCS = "KCS" + const val KDC = "KDC" + const val KGC = "KGC" + const val KKC = "KKC" + const val KNC = "KNC" + const val KOI = "KOI" + const val KRN = "KRN" + const val KUN = "KUN" + const val LBW = "LBW" + const val LDC = "LDC" + const val LEAF = "LEAF" + const val LGBT = "LGBT" + const val LGC = "LGC" + const val LK7 = "LK7" + const val LKY = "LKY" + const val LMC = "LMC" + const val LOT = "LOT" + const val LSK = "LSK" + const val LTB = "LTB" + const val LTC = "LTC" + const val mLTC = "mLTC" + const val LYC = "LYC" + const val MAX = "MAX" + const val MCR = "MCR" + const val MCX = "MCX" + const val MEC = "MEC" + const val MEM = "MEM" + const val MEOW = "MEOW" + const val MIM = "MIM" + const val MINT = "MINT" + const val MMC = "MMC" + const val MNC = "MNC" + const val MOON = "MOON" + const val MRC = "MRC" + const val MRS = "MRS" + const val MRY = "MRY" + const val MSC = "MSC" + const val MST = "MST" + const val MTC = "MTC" + const val MTS = "MTS" + const val MXB = "MXB" + const val MXN = "MXN" + const val MYMINER = "MYMINER" + const val MYR = "MYR" + const val MZC = "MZC" + const val NAN = "NAN" + const val NBL = "NBL" + const val NCASH = "NCASH" + const val NDL = "NDL" + const val NEC = "NEC" + const val NEO = "NEO" + const val NET = "NET" + const val NIB = "NIB" + const val NKA = "NKA" + const val NMC = "NMC" + const val NOBL = "NOBL" + const val NOTE = "NOTE" + const val NRB = "NRB" + const val NUC = "NUC" + const val NVC = "NVC" + const val NXT = "NXT" + const val NYAN = "NYAN" + const val OIL = "OIL" + const val OLY = "OLY" + const val OMG = "OMG" + const val ORB = "ORB" + const val ORG = "ORG" + const val ORO = "ORO" + const val OSC = "OSC" +// const val `P$` = "P$" + const val PAND = "PAND" + const val PANDA = "PANDA" + const val PCC = "PCC" + const val PCN = "PCN" + const val PENG = "PENG" + const val PHI = "PHI" + const val PHS = "PHS" + const val PIC = "PIC" + const val PLC = "PLC" + const val PLT = "PLT" + const val PMC = "PMC" + const val PND = "PND" + const val POD = "POD" + const val POINTS = "POINTS" + const val POT = "POT" + const val PPC = "PPC" + const val PRC = "PRC" + const val PRT = "PRT" + const val PT = "PT" + const val PTC = "PTC" + const val PTS = "PTS" + const val PWC = "PWC" + const val PWNY = "PWNY" + const val PXC = "PXC" + const val PXL = "PXL" + const val PYC = "PYC" + const val Q2C = "Q2C" + const val QB = "QB" + const val QRK = "QRK" + const val QTUM = "QTUM" + const val RAD = "RAD" + const val RAIN = "RAIN" + const val RBBT = "RBBT" + const val RCH = "RCH" + const val RDD = "RDD" + const val REC = "REC" + const val RED = "RED" + const val REDD = "REDD" // RDD + const val REP = "REP" // RDD + const val RIC = "RIC" + const val RON = "RON" + const val RPC = "RPC" + const val RPD = "RPD" + const val RRT = "RRT" + const val RSC = "RSC" + const val RBY = "RBY" + const val RYC = "RYC" + const val SAN = "SAN" + const val SAT = "SAT" + const val SAV = "SAV" + const val SBC = "SBC" + const val SBX = "SBX" + const val SC = "SC" + const val SCO = "SCO" + const val SMC = "SMC" + const val SOC = "SOC" + const val SOCHI = "SOCHI" + const val SPA = "SPA" + const val SPT = "SPT" + const val SRC = "SRC" + const val START = "START" + const val STC = "STC" + const val STL = "STL" + const val STR = "STR" + const val STY = "STY" + const val SUN = "SUN" + const val SXC = "SXC" + const val SYN = "SYN" + const val TAG = "TAG" + const val TAK = "TAK" + const val TEA = "TEA" + const val TEK = "TEK" + const val TEL = "TEL" + const val TES = "TES" + const val TFC = "TFC" + const val TGC = "TGC" + const val TH1 = "TH1" + const val THOR = "THOR" + const val TIPS = "TIPS" + const val TIX = "TIX" + const val TOP = "TOP" + const val TRC = "TRC" + const val TRL = "TRL" + const val TRX = "TRX" + const val TSL = "TSL" + const val TTC = "TTC" + const val TUSD = "TUSD" + const val UFO = "UFO" + const val UNC = "UNC" + const val UNI = "UNI" + const val UNO = "UNO" + const val USDE = "USDE" + const val USDe = "USDe" + const val USDT = "USDT" + const val UTC = "UTC" + const val VDC = "VDC" + const val VEN = "VEN" + const val VGC = "VGC" + const val VLC = "VLC" + const val VLT = "VLT" + const val VMP = "VMP" + const val VOLT = "VOLT" + const val VTC = "VTC" + const val WDC = "WDC" + const val WIKI = "WIKI" + const val WOLF = "WOLF" + const val XBT = "XBT" // BTC + const val XCP = "XCP" + const val XDG = "XDG" // DOGE + const val XIV = "XIV" + const val XJO = "XJO" + const val XLM = "XLM" + const val XMR = "XMR" + const val XNC = "XNC" + const val XPM = "XPM" + const val XPY = "XPY" + const val XRP = "XRP" + const val XVN = "XVN" // VEN + const val XXL = "XXL" + const val YAC = "YAC" + const val YANG = "YANG" + const val YBC = "YBC" + const val YIN = "YIN" + const val ZCC = "ZCC" + const val ZEC = "ZEC" + const val ZED = "ZED" + const val ZEIT = "ZEIT" + const val ZET = "ZET" + const val ZEU = "ZEU" + const val ZIL = "ZIL" + const val ZMB = "ZMB" + const val ZRX = "ZRX" + const val ZTC = "ZTC" +} \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Abucoins.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Abucoins.kt new file mode 100644 index 00000000..aace5a94 --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Abucoins.kt @@ -0,0 +1,50 @@ +@file:Suppress("SpellCheckingInspection") + +package com.aneonex.bitcoinchecker.datamodule.model.market + +import com.aneonex.bitcoinchecker.datamodule.model.CheckerInfo +import com.aneonex.bitcoinchecker.datamodule.model.CurrencyPairInfo +import com.aneonex.bitcoinchecker.datamodule.model.Market +import com.aneonex.bitcoinchecker.datamodule.model.Ticker +import org.json.JSONArray +import org.json.JSONObject + +class Abucoins : Market(NAME, TTS_NAME, null) { + override fun getUrl(requestId: Int, checkerInfo: CheckerInfo): String { + return String.format(URL, checkerInfo.currencyPairId) + } + + @Throws(Exception::class) + override fun parseTickerFromJsonObject(requestId: Int, jsonObject: JSONObject, ticker: Ticker, checkerInfo: CheckerInfo) { + ticker.vol = jsonObject.getDouble("volume") + ticker.high = jsonObject.getDouble("high") + ticker.low = jsonObject.getDouble("low") + ticker.last = jsonObject.getDouble("last") + } + + // ==================== + // Get currency pairs + // ==================== + override fun getCurrencyPairsUrl(requestId: Int): String? { + return URL_CURRENCY_PAIRS + } + + @Throws(Exception::class) + override fun parseCurrencyPairs(requestId: Int, responseString: String, pairs: MutableList) { + val jsonArray = JSONArray(responseString) + for (i in 0 until jsonArray.length()) { + val pairJsonObject = jsonArray.getJSONObject(i) + pairs.add(CurrencyPairInfo( + pairJsonObject.getString("base_currency"), + pairJsonObject.getString("quote_currency"), + pairJsonObject.getString("id"))) + } + } + + companion object { + private const val NAME = "Abucoins" + private const val TTS_NAME = NAME + private const val URL = "https://api.abucoins.com/products/%1\$s/stats" + private const val URL_CURRENCY_PAIRS = "https://api.abucoins.com/products" + } +} \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/AllCoin.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/AllCoin.kt new file mode 100644 index 00000000..a2ef3375 --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/AllCoin.kt @@ -0,0 +1,62 @@ +package com.aneonex.bitcoinchecker.datamodule.model.market + +import com.aneonex.bitcoinchecker.datamodule.model.CheckerInfo +import com.aneonex.bitcoinchecker.datamodule.model.CurrencyPairInfo +import com.aneonex.bitcoinchecker.datamodule.model.Market +import com.aneonex.bitcoinchecker.datamodule.model.Ticker +import com.aneonex.bitcoinchecker.datamodule.util.ParseUtils +import com.aneonex.bitcoinchecker.datamodule.R +import org.json.JSONObject + +class AllCoin : Market(NAME, TTS_NAME, null) { + override fun getUrl(requestId: Int, checkerInfo: CheckerInfo): String { + return String.format(URL, checkerInfo.currencyBase, checkerInfo.currencyCounter) + } + + @Throws(Exception::class) + override fun parseTickerFromJsonObject(requestId: Int, jsonObject: JSONObject, ticker: Ticker, checkerInfo: CheckerInfo) { + val dataJsonObject = jsonObject.getJSONObject("data") + ticker.bid = ParseUtils.getDoubleFromString(dataJsonObject, "top_bid") + ticker.ask = ParseUtils.getDoubleFromString(dataJsonObject, "top_ask") + ticker.vol = ParseUtils.getDoubleFromString(dataJsonObject, "volume_24h_" + checkerInfo.currencyBase) + ticker.high = ParseUtils.getDoubleFromString(dataJsonObject, "max_24h_price") + ticker.low = ParseUtils.getDoubleFromString(dataJsonObject, "min_24h_price") + ticker.last = ParseUtils.getDoubleFromString(dataJsonObject, "trade_price") + } + + @Throws(Exception::class) + override fun parseErrorFromJsonObject(requestId: Int, jsonObject: JSONObject, checkerInfo: CheckerInfo?): String? { + return jsonObject.getString("error_info") + } + + override val cautionResId: Int + get() = R.string.market_caution_allcoin + + // ==================== + // Get currency pairs + // ==================== + override fun getCurrencyPairsUrl(requestId: Int): String? { + return URL_CURRENCY_PAIRS + } + + @Throws(Exception::class) + override fun parseCurrencyPairsFromJsonObject(requestId: Int, jsonObject: JSONObject, pairs: MutableList) { + val dataJsonObject = jsonObject.getJSONObject("data") + val pairsJsonArray = dataJsonObject.names() + for (i in 0 until pairsJsonArray.length()) { + val pairName = pairsJsonArray.getString(i) + val marketJsonObject = dataJsonObject.getJSONObject(pairName) + pairs.add(CurrencyPairInfo( + marketJsonObject.getString("type"), + marketJsonObject.getString("exchange"), + pairName)) + } + } + + companion object { + private const val NAME = "AllCoin" + private const val TTS_NAME = "All Coin" + private const val URL = "https://www.allcoin.com/api2/pair/%1\$s_%2\$s" + private const val URL_CURRENCY_PAIRS = "https://www.allcoin.com/api2/pairs" + } +} \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Binance.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Binance.kt new file mode 100644 index 00000000..1bf1c83a --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Binance.kt @@ -0,0 +1,57 @@ +package com.aneonex.bitcoinchecker.datamodule.model.market + +import com.aneonex.bitcoinchecker.datamodule.model.CheckerInfo +import com.aneonex.bitcoinchecker.datamodule.model.CurrencyPairInfo +import com.aneonex.bitcoinchecker.datamodule.model.Market +import com.aneonex.bitcoinchecker.datamodule.model.Ticker +import org.json.JSONObject + +class Binance : Market(NAME, TTS_NAME, null) { + override fun getUrl(requestId: Int, checkerInfo: CheckerInfo): String { + return String.format(URL, checkerInfo.currencyPairId) + } + + @Throws(Exception::class) + override fun parseTickerFromJsonObject(requestId: Int, jsonObject: JSONObject, ticker: Ticker, checkerInfo: CheckerInfo) { + ticker.bid = jsonObject.getDouble("bidPrice") + ticker.ask = jsonObject.getDouble("askPrice") + ticker.vol = jsonObject.getDouble("volume") + ticker.high = jsonObject.getDouble("highPrice") + ticker.low = jsonObject.getDouble("lowPrice") + ticker.last = jsonObject.getDouble("lastPrice") + } + + // ==================== + // Get currency pairs + // ==================== + override fun getCurrencyPairsUrl(requestId: Int): String? { + return URL_CURRENCY_PAIRS + } + + @Throws(Exception::class) + override fun parseCurrencyPairs(requestId: Int, responseString: String, pairs: MutableList) { + val jsonObject = JSONObject(responseString) + val jsonSymbols = jsonObject.getJSONArray("symbols") + for (i in 0 until jsonSymbols.length()) { + val marketJsonObject = jsonSymbols.getJSONObject(i) + val status = marketJsonObject.getString("status") + if (status != "TRADING") { + continue + } + val symbol = marketJsonObject.getString("symbol") + val baseAsset = marketJsonObject.getString("baseAsset") + val quoteAsset = marketJsonObject.getString("quoteAsset") + pairs.add(CurrencyPairInfo( + baseAsset, + quoteAsset, + symbol)) + } + } + + companion object { + private const val NAME = "Binance" + private const val TTS_NAME = NAME + private const val URL = "https://api.binance.com/api/v3/ticker/24hr?symbol=%1\$s" + private const val URL_CURRENCY_PAIRS = "https://api.binance.com/api/v3/exchangeInfo" + } +} \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Bit2c.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Bit2c.kt new file mode 100644 index 00000000..8f051b8a --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Bit2c.kt @@ -0,0 +1,52 @@ +package com.aneonex.bitcoinchecker.datamodule.model.market + +import com.aneonex.bitcoinchecker.datamodule.model.CheckerInfo +import com.aneonex.bitcoinchecker.datamodule.model.Market +import com.aneonex.bitcoinchecker.datamodule.model.Ticker +import com.aneonex.bitcoinchecker.datamodule.model.currency.Currency +import com.aneonex.bitcoinchecker.datamodule.model.currency.VirtualCurrency +import com.aneonex.bitcoinchecker.datamodule.model.currency.CurrencyPairsMap +import org.json.JSONObject + +class Bit2c : Market(NAME, TTS_NAME, CURRENCY_PAIRS) { + companion object { + private const val NAME = "Bit2c" + private const val TTS_NAME = "Bit 2c" + private const val URL = "https://www.bit2c.co.il/Exchanges/%1\$s%2\$s/Ticker.json" + private val CURRENCY_PAIRS: CurrencyPairsMap = CurrencyPairsMap() + + //GET https://bit2c.co.il/Exchanges/[BtcNis/EthNis/BchNis/LtcNis/EtcNis/BtgNis]/Ticker.json + init { + CURRENCY_PAIRS[VirtualCurrency.BTC] = arrayOf( + Currency.NIS + ) + CURRENCY_PAIRS[VirtualCurrency.ETH] = arrayOf( + Currency.NIS + ) + CURRENCY_PAIRS[VirtualCurrency.BCH] = arrayOf( + Currency.NIS + ) + CURRENCY_PAIRS[VirtualCurrency.LTC] = arrayOf( + Currency.NIS + ) + CURRENCY_PAIRS[VirtualCurrency.ETC] = arrayOf( + Currency.NIS + ) + CURRENCY_PAIRS[VirtualCurrency.BTG] = arrayOf( + Currency.NIS + ) + } + } + + override fun getUrl(requestId: Int, checkerInfo: CheckerInfo): String { + return String.format(URL, checkerInfo.currencyBase, checkerInfo.currencyCounter) + } + + @Throws(Exception::class) + override fun parseTickerFromJsonObject(requestId: Int, jsonObject: JSONObject, ticker: Ticker, checkerInfo: CheckerInfo) { + ticker.bid = jsonObject.getDouble("h") + ticker.ask = jsonObject.getDouble("l") + ticker.vol = jsonObject.getDouble("a") + ticker.last = jsonObject.getDouble("ll") + } +} \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/BitBay.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/BitBay.kt new file mode 100644 index 00000000..df540255 --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/BitBay.kt @@ -0,0 +1,76 @@ +package com.aneonex.bitcoinchecker.datamodule.model.market + +import com.aneonex.bitcoinchecker.datamodule.model.CheckerInfo +import com.aneonex.bitcoinchecker.datamodule.model.Market +import com.aneonex.bitcoinchecker.datamodule.model.Ticker +import com.aneonex.bitcoinchecker.datamodule.model.currency.Currency +import com.aneonex.bitcoinchecker.datamodule.model.currency.VirtualCurrency +import com.aneonex.bitcoinchecker.datamodule.model.currency.CurrencyPairsMap +import org.json.JSONObject + +class BitBay : Market(NAME, TTS_NAME, CURRENCY_PAIRS) { + companion object { + private const val NAME = "BitBay.net" + private const val TTS_NAME = "Bit Bay" + private const val URL = "https://bitbay.net/API/Public/%1\$s%2\$s/ticker.json" + private val CURRENCY_PAIRS: CurrencyPairsMap = CurrencyPairsMap() + + init { + CURRENCY_PAIRS[VirtualCurrency.BCC] = arrayOf( + VirtualCurrency.BTC, + Currency.PLN, + Currency.USD, + Currency.EUR + ) + CURRENCY_PAIRS[VirtualCurrency.BTC] = arrayOf( + Currency.PLN, + Currency.USD, + Currency.EUR + ) + CURRENCY_PAIRS[VirtualCurrency.DASH] = arrayOf( + VirtualCurrency.BTC, + Currency.PLN, + Currency.USD, + Currency.EUR + ) + CURRENCY_PAIRS[VirtualCurrency.GAME] = arrayOf( + VirtualCurrency.BTC, + Currency.PLN, + Currency.USD, + Currency.EUR + ) + CURRENCY_PAIRS[VirtualCurrency.LTC] = arrayOf( + VirtualCurrency.BTC, + Currency.PLN, + Currency.USD, + Currency.EUR + ) + CURRENCY_PAIRS[VirtualCurrency.ETH] = arrayOf( + VirtualCurrency.BTC, + Currency.PLN, + Currency.USD, + Currency.EUR + ) + CURRENCY_PAIRS[VirtualCurrency.LSK] = arrayOf( + VirtualCurrency.BTC, + Currency.PLN, + Currency.USD, + Currency.EUR + ) + } + } + + override fun getUrl(requestId: Int, checkerInfo: CheckerInfo): String { + return String.format(URL, checkerInfo.currencyBase, checkerInfo.currencyCounter) + } + + @Throws(Exception::class) + override fun parseTickerFromJsonObject(requestId: Int, jsonObject: JSONObject, ticker: Ticker, checkerInfo: CheckerInfo) { + ticker.bid = jsonObject.getDouble("bid") + ticker.ask = jsonObject.getDouble("ask") + ticker.vol = jsonObject.getDouble("volume") + ticker.high = jsonObject.getDouble("max") + ticker.low = jsonObject.getDouble("min") + ticker.last = jsonObject.getDouble("last") + } +} \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/BitFlyer.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/BitFlyer.kt new file mode 100644 index 00000000..55515c65 --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/BitFlyer.kt @@ -0,0 +1,37 @@ +package com.aneonex.bitcoinchecker.datamodule.model.market + +import com.aneonex.bitcoinchecker.datamodule.model.CheckerInfo +import com.aneonex.bitcoinchecker.datamodule.model.Market +import com.aneonex.bitcoinchecker.datamodule.model.Ticker +import com.aneonex.bitcoinchecker.datamodule.model.currency.Currency +import com.aneonex.bitcoinchecker.datamodule.model.currency.VirtualCurrency +import com.aneonex.bitcoinchecker.datamodule.model.currency.CurrencyPairsMap +import org.json.JSONObject + +class BitFlyer : Market(NAME, TTS_NAME, CURRENCY_PAIRS) { + companion object { + private const val NAME = "bitFlyer" + private const val TTS_NAME = "bit flyer" + private const val URL = "https://api.bitflyer.jp/v1/ticker?product_code=%1\$s_%2\$s" + private val CURRENCY_PAIRS: CurrencyPairsMap = CurrencyPairsMap() + + init { + CURRENCY_PAIRS[VirtualCurrency.BTC] = arrayOf( + Currency.JPY) + CURRENCY_PAIRS[VirtualCurrency.ETH] = arrayOf( + VirtualCurrency.BTC) + } + } + + override fun getUrl(requestId: Int, checkerInfo: CheckerInfo): String { + return String.format(URL, checkerInfo.currencyBase, checkerInfo.currencyCounter) + } + + @Throws(Exception::class) + override fun parseTickerFromJsonObject(requestId: Int, jsonObject: JSONObject, ticker: Ticker, checkerInfo: CheckerInfo) { + ticker.bid = jsonObject.getDouble("best_bid") + ticker.ask = jsonObject.getDouble("best_ask") + ticker.vol = jsonObject.getDouble("volume_by_product") + ticker.last = jsonObject.getDouble("ltp") + } +} \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/BitFlyerFX.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/BitFlyerFX.kt new file mode 100644 index 00000000..574aca0f --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/BitFlyerFX.kt @@ -0,0 +1,35 @@ +package com.aneonex.bitcoinchecker.datamodule.model.market + +import com.aneonex.bitcoinchecker.datamodule.model.CheckerInfo +import com.aneonex.bitcoinchecker.datamodule.model.Market +import com.aneonex.bitcoinchecker.datamodule.model.Ticker +import com.aneonex.bitcoinchecker.datamodule.model.currency.Currency +import com.aneonex.bitcoinchecker.datamodule.model.currency.VirtualCurrency +import com.aneonex.bitcoinchecker.datamodule.model.currency.CurrencyPairsMap +import org.json.JSONObject + +class BitFlyerFX : Market(NAME, TTS_NAME, CURRENCY_PAIRS) { + companion object { + private const val NAME = "bitFlyer FX" + private const val TTS_NAME = "bit flyer FX" + private const val URL = "https://api.bitflyer.jp/v1/ticker?product_code=FX_%1\$s_%2\$s" + private val CURRENCY_PAIRS: CurrencyPairsMap = CurrencyPairsMap() + + init { + CURRENCY_PAIRS[VirtualCurrency.BTC] = arrayOf( + Currency.JPY) + } + } + + override fun getUrl(requestId: Int, checkerInfo: CheckerInfo): String { + return String.format(URL, checkerInfo.currencyBase, checkerInfo.currencyCounter) + } + + @Throws(Exception::class) + override fun parseTickerFromJsonObject(requestId: Int, jsonObject: JSONObject, ticker: Ticker, checkerInfo: CheckerInfo) { + ticker.bid = jsonObject.getDouble("best_bid") + ticker.ask = jsonObject.getDouble("best_ask") + ticker.vol = jsonObject.getDouble("volume_by_product") + ticker.last = jsonObject.getDouble("ltp") + } +} \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/BitKonan.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/BitKonan.kt new file mode 100644 index 00000000..3c7e05b5 --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/BitKonan.kt @@ -0,0 +1,46 @@ +package com.aneonex.bitcoinchecker.datamodule.model.market + +import com.aneonex.bitcoinchecker.datamodule.model.CheckerInfo +import com.aneonex.bitcoinchecker.datamodule.model.Market +import com.aneonex.bitcoinchecker.datamodule.model.Ticker +import com.aneonex.bitcoinchecker.datamodule.model.currency.Currency +import com.aneonex.bitcoinchecker.datamodule.model.currency.VirtualCurrency +import com.aneonex.bitcoinchecker.datamodule.model.currency.CurrencyPairsMap +import org.json.JSONObject + +class BitKonan : Market(NAME, TTS_NAME, CURRENCY_PAIRS) { + companion object { + private const val NAME = "BitKonan" + private const val TTS_NAME = "Bit Konan" + private const val URL_BTC = "https://bitkonan.com/api/ticker" + private const val URL_LTC = "https://bitkonan.com/api/ltc_ticker" + private val CURRENCY_PAIRS: CurrencyPairsMap = CurrencyPairsMap() + + init { + CURRENCY_PAIRS[VirtualCurrency.BTC] = arrayOf( + Currency.USD + ) + CURRENCY_PAIRS[VirtualCurrency.LTC] = arrayOf( + Currency.USD + ) + } + } + + override fun getUrl(requestId: Int, checkerInfo: CheckerInfo): String { + return if (VirtualCurrency.BTC == checkerInfo.currencyBase) { + URL_BTC + } else { + URL_LTC + } + } + + @Throws(Exception::class) + override fun parseTickerFromJsonObject(requestId: Int, jsonObject: JSONObject, ticker: Ticker, checkerInfo: CheckerInfo) { + ticker.bid = jsonObject.getDouble("bid") + ticker.ask = jsonObject.getDouble("ask") + ticker.vol = jsonObject.getDouble("volume") + ticker.high = jsonObject.getDouble("high") + ticker.low = jsonObject.getDouble("low") + ticker.last = jsonObject.getDouble("last") + } +} \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/BitMEX.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/BitMEX.kt new file mode 100644 index 00000000..11ca54aa --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/BitMEX.kt @@ -0,0 +1,79 @@ +package com.aneonex.bitcoinchecker.datamodule.model.market + +import com.aneonex.bitcoinchecker.datamodule.model.CheckerInfo +import com.aneonex.bitcoinchecker.datamodule.model.CurrencyPairInfo +import com.aneonex.bitcoinchecker.datamodule.model.Market +import com.aneonex.bitcoinchecker.datamodule.model.Ticker +import org.json.JSONArray +import org.json.JSONObject +import java.text.SimpleDateFormat +import java.util.* + +class BitMEX : Market(NAME, TTS_NAME, null) { + companion object { + private const val NAME = "BitMEX" + private const val TTS_NAME = NAME + private const val URL = "https://www.bitmex.com/api/v1/instrument" + + "?symbol=%1\$s" + + "&columns=bidPrice,askPrice,turnover24h,highPrice,lowPrice,lastPrice" + private const val URL_CURRENCY_PAIRS = "https://www.bitmex.com/api/v1/instrument" + + "?columns=rootSymbol,typ" + + "&filter={\"state\":\"Open\"}" + private val ISO_DATE_FORMAT = SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", Locale.ENGLISH) + + init { + ISO_DATE_FORMAT.timeZone = TimeZone.getTimeZone("GMT") + } + } + + override fun getUrl(requestId: Int, checkerInfo: CheckerInfo): String { + return String.format(URL, checkerInfo.currencyPairId) + } + + @Throws(Exception::class) + override fun parseTicker(requestId: Int, responseString: String, ticker: Ticker, checkerInfo: CheckerInfo) { + parseTickerFromJsonObject(requestId, JSONArray(responseString).getJSONObject(0), ticker, checkerInfo) + } + + @Throws(Exception::class) + override fun parseTickerFromJsonObject(requestId: Int, jsonObject: JSONObject, ticker: Ticker, checkerInfo: CheckerInfo) { + ticker.bid = jsonObject.getDouble("bidPrice") + ticker.ask = jsonObject.getDouble("askPrice") + // This comes back in Satoshis + ticker.vol = jsonObject.getDouble("turnover24h") / 1e8 + if (!jsonObject.isNull("highPrice")) ticker.high = jsonObject.getDouble("highPrice") + if (!jsonObject.isNull("lowPrice")) ticker.low = jsonObject.getDouble("lowPrice") + ticker.last = jsonObject.getDouble("lastPrice") + // This is an ISO timestamp representing UTC time + ticker.timestamp = ISO_DATE_FORMAT.parse(jsonObject.getString("timestamp")).time + } + + // ==================== + // Get currency pairs + // ==================== + override fun getCurrencyPairsUrl(requestId: Int): String? { + return URL_CURRENCY_PAIRS + } + + @Throws(Exception::class) + override fun parseCurrencyPairs(requestId: Int, responseString: String, pairs: MutableList) { + val instruments = JSONArray(responseString) + for (i in 0 until instruments.length()) { + parseCurrencyPairsFromJsonObject(requestId, instruments.getJSONObject(i), pairs) + } + } + + @Throws(Exception::class) + override fun parseCurrencyPairsFromJsonObject(requestId: Int, jsonObject: JSONObject, pairs: MutableList) { + var base = jsonObject.getString("rootSymbol") + val id = jsonObject.getString("symbol") + var quote = id.substring(id.indexOf(base) + base.length) + + // Binary + if (jsonObject.getString("typ") == "FFICSX") { + quote = base + base = "BINARY" + } + pairs.add(CurrencyPairInfo(base, quote, id)) + } +} \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/BitMaszyna.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/BitMaszyna.kt new file mode 100644 index 00000000..371d7317 --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/BitMaszyna.kt @@ -0,0 +1,41 @@ +package com.aneonex.bitcoinchecker.datamodule.model.market + +import com.aneonex.bitcoinchecker.datamodule.model.CheckerInfo +import com.aneonex.bitcoinchecker.datamodule.model.Market +import com.aneonex.bitcoinchecker.datamodule.model.Ticker +import com.aneonex.bitcoinchecker.datamodule.model.currency.Currency +import com.aneonex.bitcoinchecker.datamodule.model.currency.VirtualCurrency +import com.aneonex.bitcoinchecker.datamodule.model.currency.CurrencyPairsMap +import org.json.JSONObject + +class BitMaszyna : Market(NAME, TTS_NAME, CURRENCY_PAIRS) { + companion object { + private const val NAME = "BitMaszyna.pl" + private const val TTS_NAME = "Bit Maszyna" + private const val URL = "https://bitmaszyna.pl/api/%1\$s%2\$s/ticker.json" + private val CURRENCY_PAIRS: CurrencyPairsMap = CurrencyPairsMap() + + init { + CURRENCY_PAIRS[VirtualCurrency.BTC] = arrayOf( + Currency.PLN + ) + CURRENCY_PAIRS[VirtualCurrency.LTC] = arrayOf( + Currency.PLN + ) + } + } + + override fun getUrl(requestId: Int, checkerInfo: CheckerInfo): String { + return String.format(URL, checkerInfo.currencyBase, checkerInfo.currencyCounter) + } + + @Throws(Exception::class) + override fun parseTickerFromJsonObject(requestId: Int, jsonObject: JSONObject, ticker: Ticker, checkerInfo: CheckerInfo) { + ticker.bid = jsonObject.getDouble("bid") + ticker.ask = jsonObject.getDouble("ask") + ticker.vol = jsonObject.getDouble("volume1") + ticker.high = jsonObject.getDouble("high") + ticker.low = jsonObject.getDouble("low") + ticker.last = jsonObject.getDouble("last") + } +} \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/BitTrex.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/BitTrex.kt new file mode 100644 index 00000000..b4843b84 --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/BitTrex.kt @@ -0,0 +1,47 @@ +package com.aneonex.bitcoinchecker.datamodule.model.market + +import com.aneonex.bitcoinchecker.datamodule.model.CheckerInfo +import com.aneonex.bitcoinchecker.datamodule.model.CurrencyPairInfo +import com.aneonex.bitcoinchecker.datamodule.model.Market +import com.aneonex.bitcoinchecker.datamodule.model.Ticker +import org.json.JSONObject + +class BitTrex : Market(NAME, TTS_NAME, null) { + override fun getUrl(requestId: Int, checkerInfo: CheckerInfo): String { + return String.format(URL, checkerInfo.currencyCounter, checkerInfo.currencyBase) // reversed + } + + @Throws(Exception::class) + override fun parseTickerFromJsonObject(requestId: Int, jsonObject: JSONObject, ticker: Ticker, checkerInfo: CheckerInfo) { + val resultJsonObject = jsonObject.getJSONObject("result") + ticker.bid = resultJsonObject.getDouble("Bid") + ticker.ask = resultJsonObject.getDouble("Ask") + ticker.last = resultJsonObject.getDouble("Last") + } + + // ==================== + // Get currency pairs + // ==================== + override fun getCurrencyPairsUrl(requestId: Int): String? { + return URL_CURRENCY_PAIRS + } + + @Throws(Exception::class) + override fun parseCurrencyPairsFromJsonObject(requestId: Int, jsonObject: JSONObject, pairs: MutableList) { + val resultJsonArray = jsonObject.getJSONArray("result") + for (i in 0 until resultJsonArray.length()) { + val marketJsonObject = resultJsonArray.getJSONObject(i) + pairs.add(CurrencyPairInfo( + marketJsonObject.getString("MarketCurrency"), // reversed + marketJsonObject.getString("BaseCurrency"), // reversed + marketJsonObject.getString("MarketName"))) + } + } + + companion object { + private const val NAME = "BitTrex" + private const val TTS_NAME = "Bit Trex" + private const val URL = "https://bittrex.com/api/v1.1/public/getticker?market=%1\$s-%2\$s" + private const val URL_CURRENCY_PAIRS = "https://bittrex.com/api/v1.1/public/getmarkets" + } +} \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/BitX.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/BitX.kt new file mode 100644 index 00000000..9e3cf0ec --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/BitX.kt @@ -0,0 +1,83 @@ +package com.aneonex.bitcoinchecker.datamodule.model.market + +import com.aneonex.bitcoinchecker.datamodule.model.CheckerInfo +import com.aneonex.bitcoinchecker.datamodule.model.CurrencyPairInfo +import com.aneonex.bitcoinchecker.datamodule.model.Market +import com.aneonex.bitcoinchecker.datamodule.model.Ticker +import com.aneonex.bitcoinchecker.datamodule.model.currency.Currency +import com.aneonex.bitcoinchecker.datamodule.model.currency.VirtualCurrency +import com.aneonex.bitcoinchecker.datamodule.model.currency.CurrencyPairsMap +import org.json.JSONObject + +class BitX : Market(NAME, TTS_NAME, CURRENCY_PAIRS) { + companion object { + private const val NAME = "Luno" + private const val TTS_NAME = NAME + private const val URL = "https://api.mybitx.com/api/1/ticker?pair=%1\$s" + private const val URL_CURRENCY_PAIRS = "https://api.mybitx.com/api/1/tickers" + private val CURRENCY_PAIRS: CurrencyPairsMap = CurrencyPairsMap() + + init { + CURRENCY_PAIRS[VirtualCurrency.BTC] = arrayOf( + Currency.IDR, + Currency.SGD, + Currency.MYR, + Currency.NGN, + Currency.ZAR + ) + } + } + + override fun getUrl(requestId: Int, checkerInfo: CheckerInfo): String { + val pairString: String? + pairString = checkerInfo.currencyPairId + ?: String.format("%1\$s%2\$s", fixCurrency(checkerInfo.currencyBase), fixCurrency(checkerInfo.currencyCounter)) + return String.format(URL, pairString) + } + + private fun fixCurrency(currency: String): String { + if (VirtualCurrency.BTC == currency) { + return VirtualCurrency.XBT + } else if (VirtualCurrency.XBT == currency) { + return VirtualCurrency.BTC + } + return currency + } + + @Throws(Exception::class) + override fun parseTickerFromJsonObject(requestId: Int, jsonObject: JSONObject, ticker: Ticker, checkerInfo: CheckerInfo) { + ticker.bid = jsonObject.getDouble("bid") + ticker.ask = jsonObject.getDouble("ask") + ticker.vol = jsonObject.getDouble("rolling_24_hour_volume") + ticker.last = jsonObject.getDouble("last_trade") + ticker.timestamp = jsonObject.getLong("timestamp") + } + + // ==================== + // Get currency pairs + // ==================== + override fun getCurrencyPairsUrl(requestId: Int): String? { + return URL_CURRENCY_PAIRS + } + + @Throws(Exception::class) + override fun parseCurrencyPairsFromJsonObject(requestId: Int, jsonObject: JSONObject, pairs: MutableList) { + val dataJsonArray = jsonObject.getJSONArray("tickers") + for (i in 0 until dataJsonArray.length()) { + val currencyPair = dataJsonArray.getJSONObject(i).getString("pair") ?: continue + var currencyBase: String + var currencyCounter: String + try { + currencyBase = fixCurrency(currencyPair.substring(0, 3)) + currencyCounter = fixCurrency(currencyPair.substring(3)) + } catch (e: Exception) { + continue + } + pairs.add(CurrencyPairInfo( + currencyBase, + currencyCounter, + currencyPair + )) + } + } +} \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/BitcoinCoId.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/BitcoinCoId.kt new file mode 100644 index 00000000..6409d544 --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/BitcoinCoId.kt @@ -0,0 +1,58 @@ +package com.aneonex.bitcoinchecker.datamodule.model.market + +import com.aneonex.bitcoinchecker.datamodule.model.CheckerInfo +import com.aneonex.bitcoinchecker.datamodule.model.CurrencyPairInfo +import com.aneonex.bitcoinchecker.datamodule.model.Market +import com.aneonex.bitcoinchecker.datamodule.model.Ticker +import org.json.JSONObject +import java.util.* + +class BitcoinCoId : Market(NAME, TTS_NAME, null) { + override fun getUrl(requestId: Int, checkerInfo: CheckerInfo): String { + var pairId = checkerInfo.currencyPairId + if (pairId == null) { + pairId = String.format("%1\$s_%2\$s", checkerInfo.currencyBaseLowerCase, checkerInfo.currencyCounterLowerCase) + } + return String.format(URL, pairId) + } + + @Throws(Exception::class) + override fun parseTickerFromJsonObject(requestId: Int, jsonObject: JSONObject, ticker: Ticker, checkerInfo: CheckerInfo) { + val tickerJsonObject = jsonObject.getJSONObject("ticker") + ticker.bid = tickerJsonObject.getDouble("buy") + ticker.ask = tickerJsonObject.getDouble("sell") + ticker.vol = tickerJsonObject.getDouble("vol_" + checkerInfo.currencyBaseLowerCase) + ticker.high = tickerJsonObject.getDouble("high") + ticker.low = tickerJsonObject.getDouble("low") + ticker.last = tickerJsonObject.getDouble("last") + ticker.timestamp = tickerJsonObject.getLong("server_time") + } + + // ==================== + // Get currency pairs + // ==================== + override fun getCurrencyPairsUrl(requestId: Int): String? { + return URL_CURRENCY_PAIRS + } + + @Throws(Exception::class) + override fun parseCurrencyPairsFromJsonObject(requestId: Int, jsonObject: JSONObject, pairs: MutableList) { + val tickersJsonObject = jsonObject.getJSONObject("tickers") + val tickerNamesArray = tickersJsonObject.names() + for (i in 0 until tickerNamesArray.length()) { + val pairId = tickerNamesArray.getString(i) ?: continue + val currencies = pairId.split("_".toRegex()).toTypedArray() + if (currencies.size != 2) continue + val currencyBase = currencies[0].toUpperCase(Locale.ENGLISH) + val currencyCounter = currencies[1].toUpperCase(Locale.ENGLISH) + pairs.add(CurrencyPairInfo(currencyBase, currencyCounter, pairId)) + } + } + + companion object { + private const val NAME = "Bitcoin.co.id" + private const val TTS_NAME = "Bitcoin co id" + private const val URL = "https://vip.bitcoin.co.id/api/%1\$s/ticker/" + private const val URL_CURRENCY_PAIRS = "https://vip.bitcoin.co.id/api/summaries" + } +} \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/BitcoinToYou.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/BitcoinToYou.kt new file mode 100644 index 00000000..619f0ba0 --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/BitcoinToYou.kt @@ -0,0 +1,45 @@ +package com.aneonex.bitcoinchecker.datamodule.model.market + +import com.aneonex.bitcoinchecker.datamodule.model.CheckerInfo +import com.aneonex.bitcoinchecker.datamodule.model.Market +import com.aneonex.bitcoinchecker.datamodule.model.Ticker +import com.aneonex.bitcoinchecker.datamodule.model.currency.Currency +import com.aneonex.bitcoinchecker.datamodule.model.currency.VirtualCurrency +import com.aneonex.bitcoinchecker.datamodule.model.currency.CurrencyPairsMap +import org.json.JSONObject + +class BitcoinToYou : Market(NAME, TTS_NAME, CURRENCY_PAIRS) { + companion object { + private const val NAME = "BitcoinToYou" + private const val TTS_NAME = "Bitcoin To You" + private const val URL = "https://back.bitcointoyou.com/api/ticker?pair=%1\$s_%2\$sC" + private val CURRENCY_PAIRS: CurrencyPairsMap = CurrencyPairsMap() + + init { + CURRENCY_PAIRS[VirtualCurrency.BTC] = arrayOf( + Currency.BRL + ) + } + } + + override fun getUrl(requestId: Int, checkerInfo: CheckerInfo): String { +/* + String pairId = checkerInfo.getCurrencyPairId(); + if (pairId == null) { + pairId = String.format("%1$s_%2$s", checkerInfo.getCurrencyBaseLowerCase(), checkerInfo.getCurrencyCounterLowerCase()); + } + */ + return String.format(URL, checkerInfo.currencyBase, checkerInfo.currencyCounter) + } + + @Throws(Exception::class) + override fun parseTickerFromJsonObject(requestId: Int, jsonObject: JSONObject, ticker: Ticker, checkerInfo: CheckerInfo) { + val tickerJsonObject = jsonObject.getJSONObject("summary") + // ticker.bid = tickerJsonObject.getDouble("buy"); +// ticker.ask = tickerJsonObject.getDouble("sell"); + ticker.vol = tickerJsonObject.getDouble("amount") + ticker.high = tickerJsonObject.getDouble("high") + ticker.low = tickerJsonObject.getDouble("low") + ticker.last = tickerJsonObject.getDouble("last") + } +} \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/BitcoinTrade.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/BitcoinTrade.kt new file mode 100644 index 00000000..fe117a61 --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/BitcoinTrade.kt @@ -0,0 +1,45 @@ +package com.aneonex.bitcoinchecker.datamodule.model.market + +import com.aneonex.bitcoinchecker.datamodule.model.CheckerInfo +import com.aneonex.bitcoinchecker.datamodule.model.Market +import com.aneonex.bitcoinchecker.datamodule.model.Ticker +import com.aneonex.bitcoinchecker.datamodule.model.currency.Currency +import com.aneonex.bitcoinchecker.datamodule.model.currency.VirtualCurrency +import com.aneonex.bitcoinchecker.datamodule.model.currency.CurrencyPairsMap +import org.json.JSONObject + +class BitcoinTrade : Market(NAME, TTS_NAME, CURRENCY_PAIRS) { + companion object { + private const val NAME = "BitcoinTrade" + private const val TTS_NAME = "Bitcoin Trade" + private const val URL = "https://api.bitcointrade.com.br/v3/public/%1\$s%2\$s/ticker" + private val CURRENCY_PAIRS: CurrencyPairsMap = CurrencyPairsMap() + + init { + CURRENCY_PAIRS[VirtualCurrency.BTC] = arrayOf( + Currency.BRL + ) + CURRENCY_PAIRS[VirtualCurrency.ETH] = arrayOf( + Currency.BRL + ) + CURRENCY_PAIRS[VirtualCurrency.LTC] = arrayOf( + Currency.BRL + ) + } + } + + override fun getUrl(requestId: Int, checkerInfo: CheckerInfo): String { + return String.format(URL, checkerInfo.currencyCounter, checkerInfo.currencyBase) + } + + @Throws(Exception::class) + override fun parseTickerFromJsonObject(requestId: Int, jsonObject: JSONObject, ticker: Ticker, checkerInfo: CheckerInfo) { + val dataJsonObject = jsonObject.getJSONObject("data") + ticker.bid = dataJsonObject.getDouble("buy") + ticker.ask = dataJsonObject.getDouble("sell") + ticker.vol = dataJsonObject.getDouble("volume") + ticker.high = dataJsonObject.getDouble("high") + ticker.low = dataJsonObject.getDouble("low") + ticker.last = dataJsonObject.getDouble("last") + } +} \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/BitcoinVenezuela.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/BitcoinVenezuela.kt new file mode 100644 index 00000000..830c45ce --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/BitcoinVenezuela.kt @@ -0,0 +1,53 @@ +package com.aneonex.bitcoinchecker.datamodule.model.market + +import com.aneonex.bitcoinchecker.datamodule.model.CheckerInfo +import com.aneonex.bitcoinchecker.datamodule.model.CurrencyPairInfo +import com.aneonex.bitcoinchecker.datamodule.model.Market +import com.aneonex.bitcoinchecker.datamodule.model.Ticker +import com.aneonex.bitcoinchecker.datamodule.model.currency.VirtualCurrency +import org.json.JSONObject + +class BitcoinVenezuela : Market(NAME, TTS_NAME, null) { + override fun getUrl(requestId: Int, checkerInfo: CheckerInfo): String { + return String.format(URL, checkerInfo.currencyBase, checkerInfo.currencyCounter) + } + + @Throws(Exception::class) + override fun parseTicker(requestId: Int, responseString: String, ticker: Ticker, checkerInfo: CheckerInfo) { + ticker.last = responseString.trim { it <= ' ' }.toDouble() + } + + // ==================== + // Get currency pairs + // ==================== + override fun getCurrencyPairsUrl(requestId: Int): String? { + return URL_CURRENCY_PAIRS + } + + @Throws(Exception::class) + override fun parseCurrencyPairsFromJsonObject(requestId: Int, jsonObject: JSONObject, pairs: MutableList) { + parseCurrencyPairsFromCurrencyBase(VirtualCurrency.BTC, jsonObject, pairs) + parseCurrencyPairsFromCurrencyBase(VirtualCurrency.LTC, jsonObject, pairs) + parseCurrencyPairsFromCurrencyBase(VirtualCurrency.MSC, jsonObject, pairs) + } + + @Throws(Exception::class) + private fun parseCurrencyPairsFromCurrencyBase(currencyBase: String, jsonObject: JSONObject, pairs: MutableList) { + if (!jsonObject.has(currencyBase)) return + val currencyBaseJsonObject = jsonObject.getJSONObject(currencyBase) + val counterCurrencyNames = currencyBaseJsonObject.names() + for (i in 0 until counterCurrencyNames.length()) { + pairs.add(CurrencyPairInfo( + currencyBase, + counterCurrencyNames.getString(i), + null)) + } + } + + companion object { + private const val NAME = "BitcoinVenezuela" + private const val TTS_NAME = "Bitcoin Venezuela" + private const val URL = "https://api.bitcoinvenezuela.com/?html=no¤cy=%1\$s&amount=1&to=%2\$s" + private const val URL_CURRENCY_PAIRS = "https://api.bitcoinvenezuela.com/" + } +} \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/BitexLa.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/BitexLa.kt new file mode 100644 index 00000000..1bc02791 --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/BitexLa.kt @@ -0,0 +1,38 @@ +package com.aneonex.bitcoinchecker.datamodule.model.market + +import com.aneonex.bitcoinchecker.datamodule.model.CheckerInfo +import com.aneonex.bitcoinchecker.datamodule.model.Market +import com.aneonex.bitcoinchecker.datamodule.model.Ticker +import com.aneonex.bitcoinchecker.datamodule.model.currency.Currency +import com.aneonex.bitcoinchecker.datamodule.model.currency.VirtualCurrency +import com.aneonex.bitcoinchecker.datamodule.model.currency.CurrencyPairsMap +import org.json.JSONObject + +class BitexLa : Market(NAME, TTS_NAME, CURRENCY_PAIRS) { + companion object { + private const val NAME = "Bitex.la" + private const val TTS_NAME = "Bitex" + private const val URL = "https://bitex.la/api-v1/rest/btc/market/ticker" + private val CURRENCY_PAIRS: CurrencyPairsMap = CurrencyPairsMap() + + init { + CURRENCY_PAIRS[VirtualCurrency.BTC] = arrayOf( + Currency.USD + ) + } + } + + override fun getUrl(requestId: Int, checkerInfo: CheckerInfo): String { + return URL + } + + @Throws(Exception::class) + override fun parseTickerFromJsonObject(requestId: Int, jsonObject: JSONObject, ticker: Ticker, checkerInfo: CheckerInfo) { + ticker.bid = jsonObject.getDouble("bid") + ticker.ask = jsonObject.getDouble("ask") + ticker.vol = jsonObject.getDouble("volume") + ticker.high = jsonObject.getDouble("high") + ticker.low = jsonObject.getDouble("low") + ticker.last = jsonObject.getDouble("last") + } +} \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Bitfinex.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Bitfinex.kt new file mode 100644 index 00000000..d807246b --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Bitfinex.kt @@ -0,0 +1,136 @@ +package com.aneonex.bitcoinchecker.datamodule.model.market + +import com.aneonex.bitcoinchecker.datamodule.model.CheckerInfo +import com.aneonex.bitcoinchecker.datamodule.model.CurrencyPairInfo +import com.aneonex.bitcoinchecker.datamodule.model.Market +import com.aneonex.bitcoinchecker.datamodule.model.Ticker +import com.aneonex.bitcoinchecker.datamodule.model.currency.Currency +import com.aneonex.bitcoinchecker.datamodule.model.currency.VirtualCurrency +import com.aneonex.bitcoinchecker.datamodule.model.currency.CurrencyPairsMap +import org.json.JSONArray +import java.util.* + +class Bitfinex : Market(NAME, TTS_NAME, CURRENCY_PAIRS) { + companion object { + private const val NAME = "Bitfinex" + private const val TTS_NAME = NAME + private const val URL = "https://api-pub.bitfinex.com/v2/ticker/%1\$s" + private const val URL_CURRENCY_PAIRS = "https://api-pub.bitfinex.com/v2/tickers?symbols=ALL" + private val CURRENCY_PAIRS: CurrencyPairsMap = CurrencyPairsMap() + + init { + CURRENCY_PAIRS[VirtualCurrency.BCC] = arrayOf( + VirtualCurrency.BTC, + Currency.USD + ) + CURRENCY_PAIRS[VirtualCurrency.BCH] = arrayOf( + VirtualCurrency.BTC, + VirtualCurrency.ETH, + Currency.USD + ) + CURRENCY_PAIRS[VirtualCurrency.BCU] = arrayOf( + VirtualCurrency.BTC, + Currency.USD + ) + CURRENCY_PAIRS[VirtualCurrency.BTC] = arrayOf( + Currency.USD + ) + CURRENCY_PAIRS[VirtualCurrency.DSH] = arrayOf( + VirtualCurrency.BTC, + Currency.USD + ) + CURRENCY_PAIRS[VirtualCurrency.EOS] = arrayOf( + VirtualCurrency.BTC, + VirtualCurrency.ETH, + Currency.USD + ) + CURRENCY_PAIRS[VirtualCurrency.ETC] = arrayOf( + VirtualCurrency.BTC, + Currency.USD + ) + CURRENCY_PAIRS[VirtualCurrency.ETH] = arrayOf( + VirtualCurrency.BTC, + Currency.USD + ) + CURRENCY_PAIRS[VirtualCurrency.IOT] = arrayOf( + VirtualCurrency.BTC, + VirtualCurrency.ETH, + Currency.USD + ) + CURRENCY_PAIRS[VirtualCurrency.LTC] = arrayOf( + VirtualCurrency.BTC, + Currency.USD + ) + CURRENCY_PAIRS[VirtualCurrency.OMG] = arrayOf( + VirtualCurrency.BTC, + VirtualCurrency.ETH, + Currency.USD + ) + CURRENCY_PAIRS[VirtualCurrency.RRT] = arrayOf( + VirtualCurrency.BTC, + Currency.USD + ) + CURRENCY_PAIRS[VirtualCurrency.SAN] = arrayOf( + VirtualCurrency.BTC, + VirtualCurrency.ETH, + Currency.USD + ) + CURRENCY_PAIRS[VirtualCurrency.XMR] = arrayOf( + VirtualCurrency.BTC, + Currency.USD + ) + CURRENCY_PAIRS[VirtualCurrency.XRP] = arrayOf( + VirtualCurrency.BTC, + Currency.USD + ) + CURRENCY_PAIRS[VirtualCurrency.ZEC] = arrayOf( + VirtualCurrency.BTC, + Currency.USD + ) + } + } + + override fun getUrl(requestId: Int, checkerInfo: CheckerInfo): String { + var pairId = checkerInfo.currencyPairId + if (pairId == null) { + pairId = String.format("t%1\$s%2\$s", + checkerInfo.currencyBase.toUpperCase(Locale.ROOT), + checkerInfo.currencyCounter.toUpperCase(Locale.ROOT)) + } + return String.format(URL, pairId) + } + + @Throws(Exception::class) + override fun parseTicker(requestId: Int, responseString: String, ticker: Ticker, checkerInfo: CheckerInfo) { + val jsonArray = JSONArray(responseString) + ticker.bid = jsonArray.getDouble(0) + ticker.ask = jsonArray.getDouble(2) + ticker.last = jsonArray.getDouble(6) + ticker.vol = jsonArray.getDouble(7) + ticker.high = jsonArray.getDouble(8) + ticker.low = jsonArray.getDouble(9) + } + + // ==================== + // Get currency pairs + // ==================== + override fun getCurrencyPairsUrl(requestId: Int): String? { + return URL_CURRENCY_PAIRS + } + + @Throws(Exception::class) + override fun parseCurrencyPairs(requestId: Int, responseString: String, pairs: MutableList) { + val pairsArray = JSONArray(responseString) + for (i in 0 until pairsArray.length()) { + val pairArray = pairsArray.getJSONArray(i) + val pairId = pairArray.getString(0) + if (pairId != null && pairId.length == 7) { + // pairId example "tBTCUSD" + pairs.add(CurrencyPairInfo( + pairId.substring(1, 4).toUpperCase(Locale.US), + pairId.substring(4).toUpperCase(Locale.US), + pairId)) + } + } + } +} \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Bithumb.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Bithumb.kt new file mode 100644 index 00000000..c5fe89bb --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Bithumb.kt @@ -0,0 +1,99 @@ +package com.aneonex.bitcoinchecker.datamodule.model.market + +import com.aneonex.bitcoinchecker.datamodule.model.CheckerInfo +import com.aneonex.bitcoinchecker.datamodule.model.Market +import com.aneonex.bitcoinchecker.datamodule.model.Ticker +import com.aneonex.bitcoinchecker.datamodule.model.currency.Currency +import com.aneonex.bitcoinchecker.datamodule.model.currency.VirtualCurrency +import com.aneonex.bitcoinchecker.datamodule.model.currency.CurrencyPairsMap +import org.json.JSONObject + +class Bithumb : Market(NAME, TTS_NAME, CURRENCY_PAIRS) { + companion object { + private const val NAME = "Bithumb" + private const val TTS_NAME = NAME + private const val URL_TICKER = "https://api.bithumb.com/public/ticker/%1\$s" + private const val URL_ORDERS = "https://api.bithumb.com/public/orderbook/%1\$s?count=1" + private val CURRENCY_PAIRS: CurrencyPairsMap = CurrencyPairsMap() + + init { + CURRENCY_PAIRS[VirtualCurrency.BTC] = arrayOf( + Currency.KRW + ) + CURRENCY_PAIRS[VirtualCurrency.ETH] = arrayOf( + Currency.KRW + ) + CURRENCY_PAIRS[VirtualCurrency.ETC] = arrayOf( + Currency.KRW + ) + CURRENCY_PAIRS[VirtualCurrency.DASH] = arrayOf( + Currency.KRW + ) + CURRENCY_PAIRS[VirtualCurrency.LTC] = arrayOf( + Currency.KRW + ) + CURRENCY_PAIRS[VirtualCurrency.XRP] = arrayOf( + Currency.KRW + ) + CURRENCY_PAIRS[VirtualCurrency.BCH] = arrayOf( + Currency.KRW + ) + CURRENCY_PAIRS[VirtualCurrency.XMR] = arrayOf( + Currency.KRW + ) + CURRENCY_PAIRS[VirtualCurrency.ZEC] = arrayOf( + Currency.KRW + ) + CURRENCY_PAIRS[VirtualCurrency.QTUM] = arrayOf( + Currency.KRW + ) + CURRENCY_PAIRS[VirtualCurrency.CON] = arrayOf( + Currency.KRW + ) + } + } + + override fun getNumOfRequests(checkerRecord: CheckerInfo?): Int { + return 2 + } + + override fun getUrl(requestId: Int, checkerInfo: CheckerInfo): String { + return if (requestId == 0) { + String.format(URL_TICKER, checkerInfo.currencyBaseLowerCase) + } else { + String.format(URL_ORDERS, checkerInfo.currencyBaseLowerCase) + } + } + + @Throws(Exception::class) + override fun parseTickerFromJsonObject(requestId: Int, jsonObject: JSONObject, ticker: Ticker, + checkerInfo: CheckerInfo) { + val dataObject = jsonObject.getJSONObject("data") + if (requestId == 0) { + ticker.vol = dataObject.getDouble("units_traded_24H") + ticker.high = dataObject.getDouble("max_price") + ticker.low = dataObject.getDouble("min_price") + ticker.last = dataObject.getDouble("closing_price") + ticker.timestamp = dataObject.getLong("date") + } else { + ticker.bid = getFirstPriceFromOrder(dataObject, "bids") + ticker.ask = getFirstPriceFromOrder(dataObject, "asks") + } + } + + @Throws(Exception::class) + override fun parseErrorFromJsonObject(requestId: Int, jsonObject: JSONObject, + checkerInfo: CheckerInfo?): String? { + return jsonObject.getString("message") + } + + @Throws(Exception::class) + private fun getFirstPriceFromOrder(jsonObject: JSONObject, key: String): Double { + val array = jsonObject.getJSONArray(key) + if (array.length() == 0) { + return Ticker.NO_DATA.toDouble() + } + val first = array.getJSONObject(0) + return first.getDouble("price") + } +} \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/BitoEX.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/BitoEX.kt new file mode 100644 index 00000000..a508213e --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/BitoEX.kt @@ -0,0 +1,37 @@ +package com.aneonex.bitcoinchecker.datamodule.model.market + +import com.aneonex.bitcoinchecker.datamodule.model.CheckerInfo +import com.aneonex.bitcoinchecker.datamodule.model.Market +import com.aneonex.bitcoinchecker.datamodule.model.Ticker +import com.aneonex.bitcoinchecker.datamodule.model.currency.Currency +import com.aneonex.bitcoinchecker.datamodule.model.currency.VirtualCurrency +import com.aneonex.bitcoinchecker.datamodule.model.currency.CurrencyPairsMap +import org.json.JSONArray + +class BitoEX : Market(NAME, TTS_NAME, CURRENCY_PAIRS) { + companion object { + private const val NAME = "BitoEX" + private const val TTS_NAME = NAME + private const val URL = "https://www.bitoex.com/sync/dashboard/%1\$s" + private val CURRENCY_PAIRS: CurrencyPairsMap = CurrencyPairsMap() + + init { + CURRENCY_PAIRS[VirtualCurrency.BTC] = arrayOf( + Currency.TWD + ) + } + } + + override fun getUrl(requestId: Int, checkerInfo: CheckerInfo): String { + return String.format(URL, System.currentTimeMillis()) + } + + @Throws(Exception::class) + override fun parseTicker(requestId: Int, responseString: String, ticker: Ticker, checkerInfo: CheckerInfo) { + val jsonArray = JSONArray(responseString) + ticker.ask = jsonArray.getString(0).replace(",".toRegex(), "").toDouble() + ticker.bid = jsonArray.getString(1).replace(",".toRegex(), "").toDouble() + ticker.last = ticker.ask + ticker.timestamp = java.lang.Long.valueOf(jsonArray.getString(2)) + } +} \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Bitorado.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Bitorado.kt new file mode 100644 index 00000000..281181fc --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Bitorado.kt @@ -0,0 +1,51 @@ +package com.aneonex.bitcoinchecker.datamodule.model.market + +import com.aneonex.bitcoinchecker.datamodule.model.CheckerInfo +import com.aneonex.bitcoinchecker.datamodule.model.CurrencyPairInfo +import com.aneonex.bitcoinchecker.datamodule.model.Market +import com.aneonex.bitcoinchecker.datamodule.model.Ticker +import org.json.JSONObject + +class Bitorado : Market(NAME, TTS_NAME, null) { + override fun getUrl(requestId: Int, checkerInfo: CheckerInfo): String { + return String.format(URL, checkerInfo.currencyBase, checkerInfo.currencyCounter) + } + + @Throws(Exception::class) + override fun parseTickerFromJsonObject(requestId: Int, jsonObject: JSONObject, ticker: Ticker, checkerInfo: CheckerInfo) { + val resultObject = jsonObject.getJSONObject("result") + ticker.bid = resultObject.optDouble("buy", Ticker.NO_DATA.toDouble()) + ticker.ask = resultObject.optDouble("sell", Ticker.NO_DATA.toDouble()) + ticker.vol = resultObject.optDouble("vol", Ticker.NO_DATA.toDouble()) + ticker.high = resultObject.optDouble("high", Ticker.NO_DATA.toDouble()) + ticker.low = resultObject.optDouble("low", Ticker.NO_DATA.toDouble()) + ticker.last = resultObject.optDouble("last", 0.0) + } + + // ==================== + // Get currency pairs + // ==================== + override fun getCurrencyPairsUrl(requestId: Int): String? { + return URL_CURRENCY_PAIRS + } + + @Throws(Exception::class) + override fun parseCurrencyPairsFromJsonObject(requestId: Int, jsonObject: JSONObject, pairs: MutableList) { + val result = jsonObject.getJSONObject("result") + val markets = result.getJSONObject("markets") + val pairNames = markets.names() + for (i in 0 until pairNames.length()) { + val pairId = pairNames.getString(i) ?: continue + val currencies = pairId.split("-".toRegex()).toTypedArray() + if (currencies.size != 2) continue + pairs.add(CurrencyPairInfo(currencies[0], currencies[1], pairId)) + } + } + + companion object { + private const val NAME = "Bitorado" + private const val TTS_NAME = NAME + private const val URL = "https://www.bitorado.com/api/market/%1\$s-%2\$s/ticker" + private const val URL_CURRENCY_PAIRS = "https://www.bitorado.com/api/ticker" + } +} \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Bitso.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Bitso.kt new file mode 100644 index 00000000..f53616a6 --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Bitso.kt @@ -0,0 +1,80 @@ +package com.aneonex.bitcoinchecker.datamodule.model.market + +import com.aneonex.bitcoinchecker.datamodule.model.CheckerInfo +import com.aneonex.bitcoinchecker.datamodule.model.CurrencyPairInfo +import com.aneonex.bitcoinchecker.datamodule.model.Market +import com.aneonex.bitcoinchecker.datamodule.model.Ticker +import com.aneonex.bitcoinchecker.datamodule.model.currency.Currency +import com.aneonex.bitcoinchecker.datamodule.model.currency.VirtualCurrency +import com.aneonex.bitcoinchecker.datamodule.model.currency.CurrencyPairsMap +import com.aneonex.bitcoinchecker.datamodule.util.ParseUtils +import org.json.JSONObject +import java.util.* + +class Bitso : Market(NAME, TTS_NAME, CURRENCY_PAIRS) { + companion object { + private const val NAME = "Bitso" + private const val TTS_NAME = NAME + private const val URL = "https://api.bitso.com/public/info" + private val CURRENCY_PAIRS: CurrencyPairsMap = CurrencyPairsMap() + + init { + CURRENCY_PAIRS[VirtualCurrency.BTC] = arrayOf( + Currency.MXN + ) + CURRENCY_PAIRS[VirtualCurrency.ETH] = arrayOf( + VirtualCurrency.BTC, + Currency.MXN + ) + CURRENCY_PAIRS[VirtualCurrency.XRP] = arrayOf( + VirtualCurrency.BTC, + Currency.MXN + ) + CURRENCY_PAIRS[VirtualCurrency.BCH] = arrayOf( + VirtualCurrency.BTC + ) + CURRENCY_PAIRS[VirtualCurrency.LTC] = arrayOf( + VirtualCurrency.BTC, + Currency.MXN + ) + } + } + + override fun getUrl(requestId: Int, checkerInfo: CheckerInfo): String { + return URL + } + + @Throws(Exception::class) + override fun parseTickerFromJsonObject(requestId: Int, jsonObject: JSONObject, ticker: Ticker, checkerInfo: CheckerInfo) { + var pairId = checkerInfo.currencyPairId + if (pairId == null) { + pairId = checkerInfo.currencyBaseLowerCase + "_" + checkerInfo.currencyCounterLowerCase + } + val pairJsonObject = jsonObject.getJSONObject(pairId) + ticker.bid = ParseUtils.getDoubleFromString(pairJsonObject, "buy") + ticker.ask = ParseUtils.getDoubleFromString(pairJsonObject, "sell") + ticker.vol = ParseUtils.getDoubleFromString(pairJsonObject, "volume") + ticker.last = ParseUtils.getDoubleFromString(pairJsonObject, "rate") + } + + // ==================== + // Get currency pairs + // ==================== + override fun getCurrencyPairsUrl(requestId: Int): String? { + return URL + } + + @Throws(Exception::class) + override fun parseCurrencyPairsFromJsonObject(requestId: Int, jsonObject: JSONObject, pairs: MutableList) { + val pairIds = jsonObject.names() + for (i in 0 until pairIds.length()) { + val pairId = pairIds.getString(i) ?: continue + val currencies = pairId.split("_".toRegex()).toTypedArray() + if (currencies.size != 2) continue + pairs.add(CurrencyPairInfo( + currencies[0].toUpperCase(Locale.US), + currencies[1].toUpperCase(Locale.US), + pairId)) + } + } +} \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Bitstamp.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Bitstamp.kt new file mode 100644 index 00000000..3fa906c4 --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Bitstamp.kt @@ -0,0 +1,79 @@ +package com.aneonex.bitcoinchecker.datamodule.model.market + +import com.aneonex.bitcoinchecker.datamodule.model.CheckerInfo +import com.aneonex.bitcoinchecker.datamodule.model.Market +import com.aneonex.bitcoinchecker.datamodule.model.Ticker +import com.aneonex.bitcoinchecker.datamodule.model.currency.Currency +import com.aneonex.bitcoinchecker.datamodule.model.currency.VirtualCurrency +import com.aneonex.bitcoinchecker.datamodule.model.currency.CurrencyPairsMap +import org.json.JSONObject + +class Bitstamp : Market(NAME, TTS_NAME, CURRENCY_PAIRS) { + companion object { + private const val NAME = "Bitstamp" + private const val TTS_NAME = NAME + private const val URL = "https://www.bitstamp.net/api/v2/ticker/%1\$s%2\$s" + private val CURRENCY_PAIRS: CurrencyPairsMap = CurrencyPairsMap() + + init { + CURRENCY_PAIRS[VirtualCurrency.BTC] = arrayOf( + Currency.EUR, + Currency.USD, + Currency.GBP + ) + CURRENCY_PAIRS[VirtualCurrency.BCH] = arrayOf( + VirtualCurrency.BTC, + Currency.EUR, + Currency.USD, + Currency.GBP + ) + CURRENCY_PAIRS[Currency.EUR] = arrayOf( + Currency.USD, + Currency.GBP + ) + CURRENCY_PAIRS[Currency.GBP] = arrayOf( + Currency.EUR, + Currency.USD + ) + CURRENCY_PAIRS[VirtualCurrency.ETH] = arrayOf( + VirtualCurrency.BTC, + Currency.EUR, + Currency.USD, + Currency.GBP + ) + CURRENCY_PAIRS[VirtualCurrency.LTC] = arrayOf( + VirtualCurrency.BTC, + Currency.EUR, + Currency.USD, + Currency.GBP + ) + CURRENCY_PAIRS[VirtualCurrency.XLM] = arrayOf( + VirtualCurrency.BTC, + Currency.EUR, + Currency.USD, + Currency.GBP + ) + CURRENCY_PAIRS[VirtualCurrency.XRP] = arrayOf( + VirtualCurrency.BTC, + Currency.EUR, + Currency.USD, + Currency.GBP + ) + } + } + + override fun getUrl(requestId: Int, checkerInfo: CheckerInfo): String { + return String.format(URL, checkerInfo.currencyBaseLowerCase, checkerInfo.currencyCounterLowerCase) + } + + @Throws(Exception::class) + override fun parseTickerFromJsonObject(requestId: Int, jsonObject: JSONObject, ticker: Ticker, checkerInfo: CheckerInfo) { + ticker.bid = jsonObject.getDouble("bid") + ticker.ask = jsonObject.getDouble("ask") + ticker.vol = jsonObject.getDouble("volume") + ticker.high = jsonObject.getDouble("high") + ticker.low = jsonObject.getDouble("low") + ticker.last = jsonObject.getDouble("last") + ticker.timestamp = jsonObject.getLong("timestamp") + } +} \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/BitxCom.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/BitxCom.kt new file mode 100644 index 00000000..751679b4 --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/BitxCom.kt @@ -0,0 +1,61 @@ +package com.aneonex.bitcoinchecker.datamodule.model.market + +import com.aneonex.bitcoinchecker.datamodule.model.CheckerInfo +import com.aneonex.bitcoinchecker.datamodule.model.Market +import com.aneonex.bitcoinchecker.datamodule.model.Ticker +import com.aneonex.bitcoinchecker.datamodule.model.currency.Currency +import com.aneonex.bitcoinchecker.datamodule.model.currency.VirtualCurrency +import com.aneonex.bitcoinchecker.datamodule.model.currency.CurrencyPairsMap +import org.json.JSONObject + +class BitxCom : Market(NAME, TTS_NAME, CURRENCY_PAIRS) { + companion object { + private const val NAME = "CoinsBank" + private const val TTS_NAME = NAME + private const val URL = "https://coinsbank.com/api/public/ticker?pair=%1\$s%2\$s" + private val CURRENCY_PAIRS: CurrencyPairsMap = CurrencyPairsMap() + + init { + CURRENCY_PAIRS[VirtualCurrency.BTC] = arrayOf( + Currency.EUR, + Currency.GBP, + Currency.USD + ) + CURRENCY_PAIRS[VirtualCurrency.LTC] = arrayOf( + VirtualCurrency.BTC, + Currency.EUR, + Currency.GBP, + Currency.USD + ) + CURRENCY_PAIRS[VirtualCurrency.GHS] = arrayOf( + VirtualCurrency.BTC, + Currency.EUR, + Currency.GBP, + VirtualCurrency.LTC, + Currency.USD + ) + CURRENCY_PAIRS[Currency.EUR] = arrayOf( + Currency.GBP, + Currency.USD + ) + CURRENCY_PAIRS[Currency.GBP] = arrayOf( + Currency.USD + ) + } + } + + override fun getUrl(requestId: Int, checkerInfo: CheckerInfo): String { + return String.format(URL, checkerInfo.currencyBase, checkerInfo.currencyCounter) + } + + @Throws(Exception::class) + override fun parseTickerFromJsonObject(requestId: Int, jsonObject: JSONObject, ticker: Ticker, checkerInfo: CheckerInfo) { + val dataJsonObject = jsonObject.getJSONObject("data") + ticker.bid = dataJsonObject.getDouble("buy") + ticker.ask = dataJsonObject.getDouble("sell") + ticker.vol = dataJsonObject.getDouble("volume") + ticker.high = dataJsonObject.getDouble("high") + ticker.low = dataJsonObject.getDouble("low") + ticker.last = dataJsonObject.getDouble("last") + } +} \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Bl3p.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Bl3p.kt new file mode 100644 index 00000000..2b3cb862 --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Bl3p.kt @@ -0,0 +1,42 @@ +package com.aneonex.bitcoinchecker.datamodule.model.market + +import com.aneonex.bitcoinchecker.datamodule.model.CheckerInfo +import com.aneonex.bitcoinchecker.datamodule.model.Market +import com.aneonex.bitcoinchecker.datamodule.model.Ticker +import com.aneonex.bitcoinchecker.datamodule.model.currency.Currency +import com.aneonex.bitcoinchecker.datamodule.model.currency.VirtualCurrency +import com.aneonex.bitcoinchecker.datamodule.model.currency.CurrencyPairsMap +import org.json.JSONObject + +class Bl3p : Market(NAME, TTS_NAME, CURRENCY_PAIRS) { + companion object { + private const val NAME = "BL3P" + private const val TTS_NAME = NAME + private const val URL = "https://api.bl3p.eu/1/%1\$s%2\$s/ticker" + private val CURRENCY_PAIRS: CurrencyPairsMap = CurrencyPairsMap() + + init { + CURRENCY_PAIRS[VirtualCurrency.BTC] = arrayOf( + Currency.EUR + ) + CURRENCY_PAIRS[VirtualCurrency.LTC] = arrayOf( + Currency.EUR + ) + } + } + + override fun getUrl(requestId: Int, checkerInfo: CheckerInfo): String { + return String.format(URL, checkerInfo.currencyBase, checkerInfo.currencyCounter) + } + + @Throws(Exception::class) + override fun parseTickerFromJsonObject(requestId: Int, jsonObject: JSONObject, ticker: Ticker, checkerInfo: CheckerInfo) { + ticker.bid = jsonObject.getDouble("bid") + ticker.ask = jsonObject.getDouble("ask") + ticker.vol = jsonObject.getJSONObject("volume").getDouble("24h") + ticker.high = jsonObject.getDouble("high") + ticker.low = jsonObject.getDouble("low") + ticker.last = jsonObject.getDouble("last") + ticker.timestamp = jsonObject.getLong("timestamp") + } +} \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Bleutrade.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Bleutrade.kt new file mode 100644 index 00000000..686caa78 --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Bleutrade.kt @@ -0,0 +1,65 @@ +package com.aneonex.bitcoinchecker.datamodule.model.market + +import com.aneonex.bitcoinchecker.datamodule.model.CheckerInfo +import com.aneonex.bitcoinchecker.datamodule.model.CurrencyPairInfo +import com.aneonex.bitcoinchecker.datamodule.model.Market +import com.aneonex.bitcoinchecker.datamodule.model.Ticker +import org.json.JSONArray +import org.json.JSONObject + +class Bleutrade : Market(NAME, TTS_NAME, null) { + override fun getUrl(requestId: Int, checkerInfo: CheckerInfo): String { + return String.format(URL, checkerInfo.currencyPairId) + } + + @Throws(Exception::class) + override fun parseTickerFromJsonObject(requestId: Int, jsonObject: JSONObject, ticker: Ticker, checkerInfo: CheckerInfo) { + val resultObject = jsonObject["result"] + var resultsJsonObject: JSONObject? = null + resultsJsonObject = if (resultObject is JSONArray) { + resultObject.getJSONObject(0) + } else { + resultObject as JSONObject + } + ticker.bid = resultsJsonObject!!.getDouble("Bid") + ticker.ask = resultsJsonObject.getDouble("Ask") + ticker.last = resultsJsonObject.getDouble("Last") + } + + @Throws(Exception::class) + override fun parseErrorFromJsonObject(requestId: Int, jsonObject: JSONObject, checkerInfo: CheckerInfo?): String? { + return jsonObject.getString("message") + } + + // ==================== + // Get currency pairs + // ==================== + override fun getCurrencyPairsUrl(requestId: Int): String? { + return URL_CURRENCY_PAIRS + } + + @Throws(Exception::class) + override fun parseCurrencyPairsFromJsonObject(requestId: Int, jsonObject: JSONObject, pairs: MutableList) { + val resultsJsonArray = jsonObject.getJSONArray("result") + for (i in 0 until resultsJsonArray.length()) { + val pairJsonObject = resultsJsonArray.getJSONObject(i) + val pairId = pairJsonObject.getString("MarketName") + val currencyBase = pairJsonObject.getString("MarketCurrency") + val currencyCounter = pairJsonObject.getString("BaseCurrency") + if (pairId != null && currencyBase != null && currencyCounter != null) { + pairs.add(CurrencyPairInfo( + currencyBase, + currencyCounter, + pairId + )) + } + } + } + + companion object { + private const val NAME = "Bleutrade" + private const val TTS_NAME = NAME + private const val URL = "https://bleutrade.com/api/v2/public/getticker?market=%1\$s" + private const val URL_CURRENCY_PAIRS = "https://bleutrade.com/api/v2/public/getmarkets" + } +} \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/BlinkTrade.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/BlinkTrade.kt new file mode 100644 index 00000000..04838c8e --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/BlinkTrade.kt @@ -0,0 +1,43 @@ +/** + * Author: Jorge Pereira @gmail.com> + * Date: Fri Dec 8 15:07:27 -02 2017 + * Desc: Blinktrade market + */ +package com.aneonex.bitcoinchecker.datamodule.model.market + +import com.aneonex.bitcoinchecker.datamodule.model.CheckerInfo +import com.aneonex.bitcoinchecker.datamodule.model.Market +import com.aneonex.bitcoinchecker.datamodule.model.Ticker +import com.aneonex.bitcoinchecker.datamodule.model.currency.Currency +import com.aneonex.bitcoinchecker.datamodule.model.currency.VirtualCurrency +import com.aneonex.bitcoinchecker.datamodule.model.currency.CurrencyPairsMap +import org.json.JSONObject + +class BlinkTrade : Market(NAME, TTS_NAME, CURRENCY_PAIRS) { + companion object { + private const val NAME = "BlinkTrade" + private const val TTS_NAME = "Blink Trade" + private const val URL = "https://bitcambioapi.blinktrade.com/api/v1/%2\$s/ticker?crypto_currency=%1\$s" + private val CURRENCY_PAIRS: CurrencyPairsMap = CurrencyPairsMap() + + init { + CURRENCY_PAIRS[VirtualCurrency.BTC] = arrayOf( + Currency.BRL + ) + } + } + + override fun getUrl(requestId: Int, checkerInfo: CheckerInfo): String { + return String.format(URL, checkerInfo.currencyBase, checkerInfo.currencyCounter) + } + + @Throws(Exception::class) + override fun parseTickerFromJsonObject(requestId: Int, jsonObject: JSONObject, ticker: Ticker, checkerInfo: CheckerInfo) { + ticker.bid = jsonObject.getDouble("buy") + ticker.ask = jsonObject.getDouble("sell") + ticker.vol = jsonObject.getDouble("vol") + ticker.high = jsonObject.getDouble("high") + ticker.low = jsonObject.getDouble("low") + ticker.last = jsonObject.getDouble("last") + } +} \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Braziliex.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Braziliex.kt new file mode 100644 index 00000000..9b8243fa --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Braziliex.kt @@ -0,0 +1,51 @@ +package com.aneonex.bitcoinchecker.datamodule.model.market + +import com.aneonex.bitcoinchecker.datamodule.model.CheckerInfo +import com.aneonex.bitcoinchecker.datamodule.model.CurrencyPairInfo +import com.aneonex.bitcoinchecker.datamodule.model.Market +import com.aneonex.bitcoinchecker.datamodule.model.Ticker +import org.json.JSONObject +import java.util.* + +class Braziliex : Market(NAME, TTS_NAME, null) { + override fun getUrl(requestId: Int, checkerInfo: CheckerInfo): String { + return String.format(URL, checkerInfo.currencyPairId) + } + + @Throws(Exception::class) + override fun parseTickerFromJsonObject(requestId: Int, jsonObject: JSONObject, ticker: Ticker, checkerInfo: CheckerInfo) { + ticker.bid = jsonObject.getDouble("highestBid") + ticker.ask = jsonObject.getDouble("lowestAsk") + ticker.vol = jsonObject.getDouble("baseVolume24") + ticker.high = jsonObject.getDouble("highestBid24") + ticker.low = jsonObject.getDouble("lowestAsk24") + ticker.last = jsonObject.getDouble("last") + } + + // ==================== + // Get currency pairs + // ==================== + override fun getCurrencyPairsUrl(requestId: Int): String? { + return URL_CURRENCY_PAIRS + } + + @Throws(Exception::class) + override fun parseCurrencyPairsFromJsonObject(requestId: Int, jsonObject: JSONObject, pairs: MutableList) { + val pairIds = jsonObject.names() + for (i in 0 until pairIds.length()) { + val pairId = pairIds.getString(i) ?: continue + val currencies = pairId.split("_".toRegex()).toTypedArray() + if (currencies.size != 2) continue + val currencyBase = currencies[0].toUpperCase(Locale.ENGLISH) + val currencyCounter = currencies[1].toUpperCase(Locale.ENGLISH) + pairs.add(CurrencyPairInfo(currencyBase, currencyCounter, pairId)) + } + } + + companion object { + private const val NAME = "Braziliex" + private const val TTS_NAME = NAME + private const val URL = "https://braziliex.com/api/v1/public/ticker/%1\$s" + private const val URL_CURRENCY_PAIRS = "https://braziliex.com/api/v1/public/ticker" + } +} \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Btc38.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Btc38.kt new file mode 100644 index 00000000..fcea9559 --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Btc38.kt @@ -0,0 +1,61 @@ +package com.aneonex.bitcoinchecker.datamodule.model.market + +import com.aneonex.bitcoinchecker.datamodule.model.CheckerInfo +import com.aneonex.bitcoinchecker.datamodule.model.CurrencyPairInfo +import com.aneonex.bitcoinchecker.datamodule.model.Market +import com.aneonex.bitcoinchecker.datamodule.model.Ticker +import com.aneonex.bitcoinchecker.datamodule.model.currency.Currency +import com.aneonex.bitcoinchecker.datamodule.model.currency.VirtualCurrency +import org.json.JSONObject +import java.util.* + +class Btc38 : Market(NAME, TTS_NAME, null) { + override fun getUrl(requestId: Int, checkerInfo: CheckerInfo): String { + return String.format(URL, checkerInfo.currencyBaseLowerCase, checkerInfo.currencyCounterLowerCase) + } + + @Throws(Exception::class) + override fun parseTickerFromJsonObject(requestId: Int, jsonObject: JSONObject, ticker: Ticker, checkerInfo: CheckerInfo) { + val tickerJsonObject = jsonObject.getJSONObject("ticker") + ticker.bid = tickerJsonObject.getDouble("buy") + ticker.ask = tickerJsonObject.getDouble("sell") + ticker.vol = tickerJsonObject.getDouble("vol") + ticker.high = tickerJsonObject.getDouble("high") + ticker.low = tickerJsonObject.getDouble("low") + ticker.last = tickerJsonObject.getDouble("last") + } + + // ==================== + // Get currency pairs + // ==================== + override val currencyPairsNumOfRequests: Int + get() = 2 + + private fun getCurrencyCounter(requestId: Int): String { + return if (requestId == 0) Currency.CNY else VirtualCurrency.BTC + } + + override fun getCurrencyPairsUrl(requestId: Int): String? { + return String.format(URL_CURRENCY_PAIRS, getCurrencyCounter(requestId).toLowerCase(Locale.ENGLISH)) + } + + @Throws(Exception::class) + override fun parseCurrencyPairsFromJsonObject(requestId: Int, jsonObject: JSONObject, pairs: MutableList) { + val currencyCounter = getCurrencyCounter(requestId) + val currencyBaseList = jsonObject.names() + for (i in 0 until currencyBaseList.length()) { + pairs.add(CurrencyPairInfo( + currencyBaseList.getString(i).toUpperCase(Locale.ENGLISH), + currencyCounter, + null + )) + } + } + + companion object { + private const val NAME = "Btc38" + private const val TTS_NAME = "BTC 38" + private const val URL = "http://api.btc38.com/v1/ticker.php?c=%1\$s&mk_type=%2\$s" + private const val URL_CURRENCY_PAIRS = "http://api.btc38.com/v1/ticker.php?c=all&mk_type=%1\$s" + } +} \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/BtcBox.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/BtcBox.kt new file mode 100644 index 00000000..ef18c5f5 --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/BtcBox.kt @@ -0,0 +1,38 @@ +package com.aneonex.bitcoinchecker.datamodule.model.market + +import com.aneonex.bitcoinchecker.datamodule.model.CheckerInfo +import com.aneonex.bitcoinchecker.datamodule.model.Market +import com.aneonex.bitcoinchecker.datamodule.model.Ticker +import com.aneonex.bitcoinchecker.datamodule.model.currency.Currency +import com.aneonex.bitcoinchecker.datamodule.model.currency.VirtualCurrency +import com.aneonex.bitcoinchecker.datamodule.model.currency.CurrencyPairsMap +import org.json.JSONObject + +class BtcBox : Market(NAME, TTS_NAME, CURRENCY_PAIRS) { + companion object { + private const val NAME = "BtcBox" + private const val TTS_NAME = "BTC Box" + private const val URL = "https://www.btcbox.co.jp/api/v1/ticker/" + private val CURRENCY_PAIRS: CurrencyPairsMap = CurrencyPairsMap() + + init { + CURRENCY_PAIRS[VirtualCurrency.BTC] = arrayOf( + Currency.JPY + ) + } + } + + override fun getUrl(requestId: Int, checkerInfo: CheckerInfo): String { + return URL + } + + @Throws(Exception::class) + override fun parseTickerFromJsonObject(requestId: Int, jsonObject: JSONObject, ticker: Ticker, checkerInfo: CheckerInfo) { + ticker.bid = jsonObject.getDouble("buy") + ticker.ask = jsonObject.getDouble("sell") + ticker.vol = jsonObject.getDouble("vol") + ticker.high = jsonObject.getDouble("high") + ticker.low = jsonObject.getDouble("low") + ticker.last = jsonObject.getDouble("last") + } +} \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/BtcMarkets.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/BtcMarkets.kt new file mode 100644 index 00000000..f3b0da8e --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/BtcMarkets.kt @@ -0,0 +1,56 @@ +package com.aneonex.bitcoinchecker.datamodule.model.market + +import com.aneonex.bitcoinchecker.datamodule.model.CheckerInfo +import com.aneonex.bitcoinchecker.datamodule.model.Market +import com.aneonex.bitcoinchecker.datamodule.model.Ticker +import com.aneonex.bitcoinchecker.datamodule.model.currency.Currency +import com.aneonex.bitcoinchecker.datamodule.model.currency.VirtualCurrency +import com.aneonex.bitcoinchecker.datamodule.model.currency.CurrencyPairsMap +import org.json.JSONObject + +class BtcMarkets : Market(NAME, TTS_NAME, CURRENCY_PAIRS) { + companion object { + private const val NAME = "BtcMarkets.net" + private const val TTS_NAME = "BTC Markets net" + private const val URL = "https://api.btcmarkets.net/market/%1\$s/%2\$s/tick" + private val CURRENCY_PAIRS: CurrencyPairsMap = CurrencyPairsMap() + + init { + CURRENCY_PAIRS[VirtualCurrency.BTC] = arrayOf( + Currency.AUD + ) + CURRENCY_PAIRS[VirtualCurrency.LTC] = arrayOf( + VirtualCurrency.BTC, + Currency.AUD + ) + CURRENCY_PAIRS[VirtualCurrency.ETC] = arrayOf( + VirtualCurrency.BTC, + Currency.AUD + ) + CURRENCY_PAIRS[VirtualCurrency.ETH] = arrayOf( + VirtualCurrency.BTC, + Currency.AUD + ) + CURRENCY_PAIRS[VirtualCurrency.XRP] = arrayOf( + VirtualCurrency.BTC, + Currency.AUD + ) + CURRENCY_PAIRS[VirtualCurrency.BCH] = arrayOf( + VirtualCurrency.BTC, + Currency.AUD + ) + } + } + + override fun getUrl(requestId: Int, checkerInfo: CheckerInfo): String { + return String.format(URL, checkerInfo.currencyBase, checkerInfo.currencyCounter) + } + + @Throws(Exception::class) + override fun parseTickerFromJsonObject(requestId: Int, jsonObject: JSONObject, ticker: Ticker, checkerInfo: CheckerInfo) { + ticker.bid = jsonObject.getDouble("bestBid") + ticker.ask = jsonObject.getDouble("bestAsk") + ticker.last = jsonObject.getDouble("lastPrice") + ticker.timestamp = jsonObject.getLong("timestamp") + } +} \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/BtcXIndia.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/BtcXIndia.kt new file mode 100644 index 00000000..f51998e2 --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/BtcXIndia.kt @@ -0,0 +1,39 @@ +package com.aneonex.bitcoinchecker.datamodule.model.market + +import com.aneonex.bitcoinchecker.datamodule.model.CheckerInfo +import com.aneonex.bitcoinchecker.datamodule.model.Market +import com.aneonex.bitcoinchecker.datamodule.model.Ticker +import com.aneonex.bitcoinchecker.datamodule.model.currency.Currency +import com.aneonex.bitcoinchecker.datamodule.model.currency.VirtualCurrency +import com.aneonex.bitcoinchecker.datamodule.model.currency.CurrencyPairsMap +import com.aneonex.bitcoinchecker.datamodule.util.ParseUtils +import org.json.JSONObject + +class BtcXIndia : Market(NAME, TTS_NAME, CURRENCY_PAIRS) { + companion object { + private const val NAME = "BTCXIndia" + private const val TTS_NAME = "BTC X India" + private const val URL = "https://api.btcxindia.com/ticker" + private val CURRENCY_PAIRS: CurrencyPairsMap = CurrencyPairsMap() + + init { + CURRENCY_PAIRS[VirtualCurrency.XRP] = arrayOf( + Currency.INR + ) + } + } + + override fun getUrl(requestId: Int, checkerInfo: CheckerInfo): String { + return URL + } + + @Throws(Exception::class) + override fun parseTickerFromJsonObject(requestId: Int, jsonObject: JSONObject, ticker: Ticker, checkerInfo: CheckerInfo) { + ticker.bid = jsonObject.getDouble("bid") + ticker.ask = jsonObject.getDouble("ask") + ticker.vol = jsonObject.getDouble("total_volume_24h") + ticker.high = ParseUtils.getDoubleFromString(jsonObject, "high") + ticker.low = ParseUtils.getDoubleFromString(jsonObject, "low") + ticker.last = jsonObject.getDouble("last_traded_price") + } +} \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Btcturk.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Btcturk.kt new file mode 100644 index 00000000..8586de7b --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Btcturk.kt @@ -0,0 +1,52 @@ +package com.aneonex.bitcoinchecker.datamodule.model.market + +import com.aneonex.bitcoinchecker.datamodule.model.CheckerInfo +import com.aneonex.bitcoinchecker.datamodule.model.Market +import com.aneonex.bitcoinchecker.datamodule.model.Ticker +import com.aneonex.bitcoinchecker.datamodule.model.currency.Currency +import com.aneonex.bitcoinchecker.datamodule.model.currency.VirtualCurrency +import com.aneonex.bitcoinchecker.datamodule.model.currency.CurrencyPairsMap +import com.aneonex.bitcoinchecker.datamodule.util.TimeUtils +import org.json.JSONArray + +class Btcturk : Market(NAME, TTS_NAME, CURRENCY_PAIRS) { + companion object { + private const val NAME = "BtcTurk" + private const val TTS_NAME = "Btc Turk" + private const val URL = "https://www.btcturk.com/api/ticker" + private val CURRENCY_PAIRS: CurrencyPairsMap = CurrencyPairsMap() + + init { + CURRENCY_PAIRS[VirtualCurrency.BTC] = arrayOf( + Currency.TRY + ) + CURRENCY_PAIRS[VirtualCurrency.ETH] = arrayOf( + VirtualCurrency.BTC, + Currency.TRY + ) + } + } + + override fun getUrl(requestId: Int, checkerInfo: CheckerInfo): String { + return URL + } + + @Throws(Exception::class) + override fun parseTicker(requestId: Int, responseString: String, ticker: Ticker, checkerInfo: CheckerInfo) { + val tickerJsonArray = JSONArray(responseString) + val pairId = checkerInfo.currencyBase + checkerInfo.currencyCounter + for (i in 0 until tickerJsonArray.length()) { + val tickerJsonObject = tickerJsonArray.getJSONObject(i) + if (pairId == tickerJsonObject.getString("pair")) { + ticker.bid = tickerJsonObject.getDouble("bid") + ticker.ask = tickerJsonObject.getDouble("ask") + ticker.vol = tickerJsonObject.getDouble("volume") + ticker.high = tickerJsonObject.getDouble("high") + ticker.low = tickerJsonObject.getDouble("low") + ticker.last = tickerJsonObject.getDouble("last") + ticker.timestamp = (tickerJsonObject.getDouble("timestamp") * TimeUtils.MILLIS_IN_SECOND).toLong() + break + } + } + } +} \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Bter.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Bter.kt new file mode 100644 index 00000000..efb7e59c --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Bter.kt @@ -0,0 +1,52 @@ +package com.aneonex.bitcoinchecker.datamodule.model.market + +import com.aneonex.bitcoinchecker.datamodule.model.CheckerInfo +import com.aneonex.bitcoinchecker.datamodule.model.CurrencyPairInfo +import com.aneonex.bitcoinchecker.datamodule.model.Market +import com.aneonex.bitcoinchecker.datamodule.model.Ticker +import org.json.JSONArray +import org.json.JSONObject +import java.util.* + +class Bter : Market(NAME, TTS_NAME, null) { + override fun getUrl(requestId: Int, checkerInfo: CheckerInfo): String { + return String.format(URL, checkerInfo.currencyBaseLowerCase, checkerInfo.currencyCounterLowerCase) + } + + @Throws(Exception::class) + override fun parseTickerFromJsonObject(requestId: Int, jsonObject: JSONObject, ticker: Ticker, checkerInfo: CheckerInfo) { + ticker.bid = jsonObject.getDouble("highestBid") + ticker.ask = jsonObject.getDouble("lowestAsk") + ticker.vol = jsonObject.getDouble("quoteVolume") + ticker.high = jsonObject.getDouble("high24hr") + ticker.low = jsonObject.getDouble("low24hr") + ticker.last = jsonObject.getDouble("last") + } + + // ==================== + // Get currency pairs + // ==================== + override fun getCurrencyPairsUrl(requestId: Int): String? { + return URL_CURRENCY_PAIRS + } + + @Throws(Exception::class) + override fun parseCurrencyPairs(requestId: Int, responseString: String, pairs: MutableList) { + val jsonArray = JSONArray(responseString) + for (i in 0 until jsonArray.length()) { + val pairId = jsonArray.getString(i) ?: continue + val currencies = pairId.split("_".toRegex()).toTypedArray() + if (currencies.size != 2) continue + val currencyBase = currencies[0].toUpperCase(Locale.ENGLISH) + val currencyCounter = currencies[1].toUpperCase(Locale.ENGLISH) + pairs.add(CurrencyPairInfo(currencyBase, currencyCounter, pairId)) + } + } + + companion object { + private const val NAME = "Gate.io" + private const val TTS_NAME = "Gate io" + private const val URL = "http://data.gate.io/api2/1/ticker/%1\$s_%2\$s" + private const val URL_CURRENCY_PAIRS = "http://data.gate.io/api2/1/pairs" + } +} \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Buttercoin.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Buttercoin.kt new file mode 100644 index 00000000..08a6f162 --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Buttercoin.kt @@ -0,0 +1,35 @@ +package com.aneonex.bitcoinchecker.datamodule.model.market + +import com.aneonex.bitcoinchecker.datamodule.model.CheckerInfo +import com.aneonex.bitcoinchecker.datamodule.model.Market +import com.aneonex.bitcoinchecker.datamodule.model.Ticker +import com.aneonex.bitcoinchecker.datamodule.model.currency.Currency +import com.aneonex.bitcoinchecker.datamodule.model.currency.VirtualCurrency +import com.aneonex.bitcoinchecker.datamodule.model.currency.CurrencyPairsMap +import org.json.JSONObject + +class Buttercoin : Market(NAME, TTS_NAME, CURRENCY_PAIRS) { + companion object { + private const val NAME = "Buttercoin" + private const val TTS_NAME = "Butter coin" + private const val URL = "https://api.buttercoin.com/v1/ticker" + private val CURRENCY_PAIRS: CurrencyPairsMap = CurrencyPairsMap() + + init { + CURRENCY_PAIRS[VirtualCurrency.BTC] = arrayOf( + Currency.USD + ) + } + } + + override fun getUrl(requestId: Int, checkerInfo: CheckerInfo): String { + return URL + } + + @Throws(Exception::class) + override fun parseTickerFromJsonObject(requestId: Int, jsonObject: JSONObject, ticker: Ticker, checkerInfo: CheckerInfo) { + ticker.bid = jsonObject.getDouble("bid") + ticker.ask = jsonObject.getDouble("ask") + ticker.last = jsonObject.getDouble("last") + } +} \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/CCex.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/CCex.kt new file mode 100644 index 00000000..bbce4e39 --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/CCex.kt @@ -0,0 +1,50 @@ +package com.aneonex.bitcoinchecker.datamodule.model.market + +import com.aneonex.bitcoinchecker.datamodule.model.CheckerInfo +import com.aneonex.bitcoinchecker.datamodule.model.CurrencyPairInfo +import com.aneonex.bitcoinchecker.datamodule.model.Market +import com.aneonex.bitcoinchecker.datamodule.model.Ticker +import org.json.JSONObject +import java.util.* + +class CCex : Market(NAME, TTS_NAME, null) { + override fun getUrl(requestId: Int, checkerInfo: CheckerInfo): String { + return String.format(URL, checkerInfo.currencyBaseLowerCase, checkerInfo.currencyCounterLowerCase) + } + + @Throws(Exception::class) + override fun parseTickerFromJsonObject(requestId: Int, jsonObject: JSONObject, ticker: Ticker, checkerInfo: CheckerInfo) { + val tickerObject = jsonObject.getJSONObject("ticker") + ticker.bid = tickerObject.getDouble("buy") + ticker.ask = tickerObject.getDouble("sell") + ticker.high = tickerObject.getDouble("high") + ticker.low = tickerObject.getDouble("low") + ticker.last = tickerObject.getDouble("lastprice") + // ticker.timestamp = tickerObject.getLong("updated"); // strange date? + } + + // ==================== + // Get currency pairs + // ==================== + override fun getCurrencyPairsUrl(requestId: Int): String? { + return URL_CURRENCY_PAIRS + } + + @Throws(Exception::class) + override fun parseCurrencyPairsFromJsonObject(requestId: Int, jsonObject: JSONObject, pairs: MutableList) { + val pairsJsonArray = jsonObject.getJSONArray("pairs") + for (i in 0 until pairsJsonArray.length()) { + val pair = pairsJsonArray.getString(i) ?: continue + val currencies: Array = pair.split("-".toRegex(), 2).toTypedArray() + if (currencies.size != 2 || currencies[0] == null || currencies[1] == null) continue + pairs.add(CurrencyPairInfo(currencies[0]!!.toUpperCase(Locale.US), currencies[1]!!.toUpperCase(Locale.US), pair)) + } + } + + companion object { + const val NAME = "C-CEX" + const val TTS_NAME = "C-Cex" + const val URL = "https://c-cex.com/t/%1\$s-%2\$s.json" + const val URL_CURRENCY_PAIRS = "https://c-cex.com/t/pairs.json" + } +} \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Campbx.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Campbx.kt new file mode 100644 index 00000000..31765759 --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Campbx.kt @@ -0,0 +1,35 @@ +package com.aneonex.bitcoinchecker.datamodule.model.market + +import com.aneonex.bitcoinchecker.datamodule.model.CheckerInfo +import com.aneonex.bitcoinchecker.datamodule.model.Market +import com.aneonex.bitcoinchecker.datamodule.model.Ticker +import com.aneonex.bitcoinchecker.datamodule.model.currency.Currency +import com.aneonex.bitcoinchecker.datamodule.model.currency.VirtualCurrency +import com.aneonex.bitcoinchecker.datamodule.model.currency.CurrencyPairsMap +import org.json.JSONObject + +class Campbx : Market(NAME, TTS_NAME, CURRENCY_PAIRS) { + companion object { + private const val NAME = "CampBX" + private const val TTS_NAME = "Camp BX" + private const val URL = "http://campbx.com/api/xticker.php" + private val CURRENCY_PAIRS: CurrencyPairsMap = CurrencyPairsMap() + + init { + CURRENCY_PAIRS[VirtualCurrency.BTC] = arrayOf( + Currency.USD + ) + } + } + + override fun getUrl(requestId: Int, checkerInfo: CheckerInfo): String { + return URL + } + + @Throws(Exception::class) + override fun parseTickerFromJsonObject(requestId: Int, jsonObject: JSONObject, ticker: Ticker, checkerInfo: CheckerInfo) { + ticker.bid = jsonObject.getDouble("Best Bid") + ticker.ask = jsonObject.getDouble("Best Ask") + ticker.last = jsonObject.getDouble("Last Trade") + } +} \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/CexIO.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/CexIO.kt new file mode 100644 index 00000000..7a55c39a --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/CexIO.kt @@ -0,0 +1,77 @@ +package com.aneonex.bitcoinchecker.datamodule.model.market + +import com.aneonex.bitcoinchecker.datamodule.model.CheckerInfo +import com.aneonex.bitcoinchecker.datamodule.model.CurrencyPairInfo +import com.aneonex.bitcoinchecker.datamodule.model.Market +import com.aneonex.bitcoinchecker.datamodule.model.Ticker +import com.aneonex.bitcoinchecker.datamodule.model.currency.Currency +import com.aneonex.bitcoinchecker.datamodule.model.currency.VirtualCurrency +import com.aneonex.bitcoinchecker.datamodule.model.currency.CurrencyPairsMap +import org.json.JSONObject + +class CexIO : Market(NAME, TTS_NAME, CURRENCY_PAIRS) { + companion object { + private const val NAME = "CEX.IO" + private const val TTS_NAME = "CEX IO" + private const val URL = "https://cex.io/api/ticker/%1\$s/%2\$s" + private const val URL_CURRENCY_PAIRS = "https://cex.io/api/currency_limits" + private val CURRENCY_PAIRS: CurrencyPairsMap = CurrencyPairsMap() + + init { + CURRENCY_PAIRS[VirtualCurrency.BTC] = arrayOf( + Currency.USD, + Currency.EUR, + Currency.GBP, + Currency.RUB) + CURRENCY_PAIRS[VirtualCurrency.ETH] = arrayOf( + Currency.USD, + Currency.EUR, + VirtualCurrency.BTC + ) + CURRENCY_PAIRS[VirtualCurrency.GHS] = arrayOf( + VirtualCurrency.BTC) + } + } + + override fun getUrl(requestId: Int, checkerInfo: CheckerInfo): String { + return String.format(URL, checkerInfo.currencyBase, checkerInfo.currencyCounter) + } + + @Throws(Exception::class) + override fun parseTickerFromJsonObject(requestId: Int, jsonObject: JSONObject, ticker: Ticker, checkerInfo: CheckerInfo) { + if (jsonObject.has("bid")) { + ticker.bid = jsonObject.getDouble("bid") + } + if (jsonObject.has("ask")) { + ticker.ask = jsonObject.getDouble("ask") + } + ticker.vol = jsonObject.getDouble("volume") + ticker.high = jsonObject.getDouble("high") + ticker.low = jsonObject.getDouble("low") + ticker.last = jsonObject.getDouble("last") + } + + // ==================== + // Get currency pairs + // ==================== + override fun getCurrencyPairsUrl(requestId: Int): String? { + return URL_CURRENCY_PAIRS + } + + @Throws(Exception::class) + override fun parseCurrencyPairsFromJsonObject(requestId: Int, jsonObject: JSONObject, pairs: MutableList) { + val dataJsonObject = jsonObject.getJSONObject("data") + val pairsJsonArray = dataJsonObject.getJSONArray("pairs") + for (i in 0 until pairsJsonArray.length()) { + val pairJsonObject = pairsJsonArray.getJSONObject(i) + val currencyBase = pairJsonObject.getString("symbol1") + val currencyCounter = pairJsonObject.getString("symbol2") + if (currencyBase != null && currencyCounter != null) { + pairs.add(CurrencyPairInfo( + currencyBase, + currencyCounter, + null)) + } + } + } +} \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/ChileBit.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/ChileBit.kt new file mode 100644 index 00000000..60e6e163 --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/ChileBit.kt @@ -0,0 +1,38 @@ +package com.aneonex.bitcoinchecker.datamodule.model.market + +import com.aneonex.bitcoinchecker.datamodule.model.CheckerInfo +import com.aneonex.bitcoinchecker.datamodule.model.Market +import com.aneonex.bitcoinchecker.datamodule.model.Ticker +import com.aneonex.bitcoinchecker.datamodule.model.currency.Currency +import com.aneonex.bitcoinchecker.datamodule.model.currency.CurrencyPairsMap +import com.aneonex.bitcoinchecker.datamodule.model.currency.VirtualCurrency +import org.json.JSONObject + +class ChileBit : Market(NAME, TTS_NAME, CURRENCY_PAIRS) { + companion object { + private const val NAME = "ChileBit.net" + private const val TTS_NAME = "Chile Bit" + private const val URL = "https://api.blinktrade.com/api/v1/%2\$s/ticker?crypto_currency=%1\$s" + private val CURRENCY_PAIRS: CurrencyPairsMap = CurrencyPairsMap() + + init { + CURRENCY_PAIRS[VirtualCurrency.BTC] = arrayOf( + Currency.CLP + ) + } + } + + override fun getUrl(requestId: Int, checkerInfo: CheckerInfo): String { + return String.format(URL, checkerInfo.currencyBase, checkerInfo.currencyCounter) + } + + @Throws(Exception::class) + override fun parseTickerFromJsonObject(requestId: Int, jsonObject: JSONObject, ticker: Ticker, checkerInfo: CheckerInfo) { + ticker.bid = jsonObject.getDouble("buy") + ticker.ask = jsonObject.getDouble("sell") + ticker.vol = jsonObject.getDouble("vol") + ticker.high = jsonObject.getDouble("high") + ticker.low = jsonObject.getDouble("low") + ticker.last = jsonObject.getDouble("last") + } +} \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/CleverCoin.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/CleverCoin.kt new file mode 100644 index 00000000..c03dc16b --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/CleverCoin.kt @@ -0,0 +1,39 @@ +package com.aneonex.bitcoinchecker.datamodule.model.market + +import com.aneonex.bitcoinchecker.datamodule.model.CheckerInfo +import com.aneonex.bitcoinchecker.datamodule.model.Market +import com.aneonex.bitcoinchecker.datamodule.model.Ticker +import com.aneonex.bitcoinchecker.datamodule.model.currency.Currency +import com.aneonex.bitcoinchecker.datamodule.model.currency.CurrencyPairsMap +import com.aneonex.bitcoinchecker.datamodule.model.currency.VirtualCurrency +import org.json.JSONObject + +class CleverCoin : Market(NAME, TTS_NAME, CURRENCY_PAIRS) { + companion object { + private const val NAME = "CleverCoin" + private const val TTS_NAME = "Clever Coin" + private const val URL = "https://api.clevercoin.com/v1/ticker" + private val CURRENCY_PAIRS: CurrencyPairsMap = CurrencyPairsMap() + + init { + CURRENCY_PAIRS[VirtualCurrency.BTC] = arrayOf( + Currency.EUR + ) + } + } + + override fun getUrl(requestId: Int, checkerInfo: CheckerInfo): String { + return URL + } + + @Throws(Exception::class) + override fun parseTickerFromJsonObject(requestId: Int, jsonObject: JSONObject, ticker: Ticker, checkerInfo: CheckerInfo) { + ticker.bid = jsonObject.getDouble("bid") + ticker.ask = jsonObject.getDouble("ask") + ticker.vol = jsonObject.getDouble("volume") + ticker.high = jsonObject.getDouble("high") + ticker.low = jsonObject.getDouble("low") + ticker.last = jsonObject.getDouble("last") + ticker.timestamp = jsonObject.getLong("timestamp") + } +} \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/CoinDesk.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/CoinDesk.kt new file mode 100644 index 00000000..7db3b1bb --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/CoinDesk.kt @@ -0,0 +1,44 @@ +package com.aneonex.bitcoinchecker.datamodule.model.market + +import com.aneonex.bitcoinchecker.datamodule.model.CheckerInfo +import com.aneonex.bitcoinchecker.datamodule.model.CurrencyPairInfo +import com.aneonex.bitcoinchecker.datamodule.model.Market +import com.aneonex.bitcoinchecker.datamodule.model.Ticker +import com.aneonex.bitcoinchecker.datamodule.model.currency.VirtualCurrency +import org.json.JSONObject + +class CoinDesk : Market(NAME, TTS_NAME, null) { + override fun getUrl(requestId: Int, checkerInfo: CheckerInfo): String { + return URL + } + + @Throws(Exception::class) + override fun parseTickerFromJsonObject(requestId: Int, jsonObject: JSONObject, ticker: Ticker, checkerInfo: CheckerInfo) { + val bpiJsonObject = jsonObject.getJSONObject("bpi") + val pairJsonObject = bpiJsonObject.getJSONObject(checkerInfo.currencyCounter) + ticker.last = pairJsonObject.getDouble("rate_float") + } + + // ==================== + // Get currency pairs + // ==================== + override fun getCurrencyPairsUrl(requestId: Int): String? { + return URL_CURRENCY_PAIRS + } + + @Throws(Exception::class) + override fun parseCurrencyPairsFromJsonObject(requestId: Int, jsonObject: JSONObject, pairs: MutableList) { + val bpiJsonObject = jsonObject.getJSONObject("bpi") + val currencyCounterNames = bpiJsonObject.names() + for (i in 0 until currencyCounterNames.length()) { + pairs.add(CurrencyPairInfo(VirtualCurrency.BTC, currencyCounterNames.getString(i), null)) + } + } + + companion object { + private const val NAME = "CoinDesk" + private const val TTS_NAME = "Coin Desk" + private const val URL = "https://api.coindesk.com/v1/bpi/currentprice.json" + private const val URL_CURRENCY_PAIRS = URL + } +} \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/CoinFloor.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/CoinFloor.kt new file mode 100644 index 00000000..0f05b9f5 --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/CoinFloor.kt @@ -0,0 +1,43 @@ +package com.aneonex.bitcoinchecker.datamodule.model.market + +import com.aneonex.bitcoinchecker.datamodule.model.CheckerInfo +import com.aneonex.bitcoinchecker.datamodule.model.Market +import com.aneonex.bitcoinchecker.datamodule.model.Ticker +import com.aneonex.bitcoinchecker.datamodule.model.currency.Currency +import com.aneonex.bitcoinchecker.datamodule.model.currency.CurrencyPairsMap +import com.aneonex.bitcoinchecker.datamodule.model.currency.VirtualCurrency +import org.json.JSONObject + +class CoinFloor : Market(NAME, TTS_NAME, CURRENCY_PAIRS) { + companion object { + private const val NAME = "Coinfloor" + private const val TTS_NAME = "Coin Floor" + private const val URL = "https://webapi.coinfloor.co.uk:8090/bist/%1\$s/%2\$s/ticker/" + private val CURRENCY_PAIRS: CurrencyPairsMap = CurrencyPairsMap() + + init { + CURRENCY_PAIRS[VirtualCurrency.XBT] = arrayOf( + Currency.GBP, + Currency.EUR, + Currency.USD + ) + CURRENCY_PAIRS[VirtualCurrency.BCH] = arrayOf( + Currency.GBP + ) + } + } + + override fun getUrl(requestId: Int, checkerInfo: CheckerInfo): String { + return String.format(URL, checkerInfo.currencyBase, checkerInfo.currencyCounter) + } + + @Throws(Exception::class) + override fun parseTickerFromJsonObject(requestId: Int, jsonObject: JSONObject, ticker: Ticker, checkerInfo: CheckerInfo) { + ticker.bid = jsonObject.getDouble("bid") + ticker.ask = jsonObject.getDouble("ask") + ticker.vol = jsonObject.getDouble("volume") + ticker.high = jsonObject.getDouble("high") + ticker.low = jsonObject.getDouble("low") + ticker.last = jsonObject.getDouble("last") + } +} \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/CoinJar.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/CoinJar.kt new file mode 100644 index 00000000..af19e5c5 --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/CoinJar.kt @@ -0,0 +1,51 @@ +package com.aneonex.bitcoinchecker.datamodule.model.market + +import com.aneonex.bitcoinchecker.datamodule.model.CheckerInfo +import com.aneonex.bitcoinchecker.datamodule.model.CurrencyPairInfo +import com.aneonex.bitcoinchecker.datamodule.model.Market +import com.aneonex.bitcoinchecker.datamodule.model.Ticker +import org.json.JSONObject + +class CoinJar : Market(NAME, TTS_NAME, null) { + override fun getUrl(requestId: Int, checkerInfo: CheckerInfo): String { + return URL + } + + @Throws(Exception::class) + override fun parseTickerFromJsonObject(requestId: Int, jsonObject: JSONObject, ticker: Ticker, checkerInfo: CheckerInfo) { + val ratesJsonObject = jsonObject.getJSONObject("exchange_rates") + val pairJsonObject = ratesJsonObject.getJSONObject(checkerInfo.currencyPairId) + ticker.bid = pairJsonObject.getDouble("bid") + ticker.ask = pairJsonObject.getDouble("ask") + ticker.last = pairJsonObject.getDouble("midpoint") + } + + // ==================== + // Get currency pairs + // ==================== + override fun getCurrencyPairsUrl(requestId: Int): String? { + return URL_CURRENCY_PAIRS + } + + @Throws(Exception::class) + override fun parseCurrencyPairsFromJsonObject(requestId: Int, jsonObject: JSONObject, pairs: MutableList) { + val ratesJsonObject = jsonObject.getJSONObject("exchange_rates") + val namesJsonArray = ratesJsonObject.names() + for (i in 0 until namesJsonArray.length()) { + val symbol = namesJsonArray.getString(i) + val pairJsonObject = ratesJsonObject.getJSONObject(symbol) + pairs.add(CurrencyPairInfo( + pairJsonObject.getString("base_currency"), + pairJsonObject.getString("counter_currency"), + symbol + )) + } + } + + companion object { + private const val NAME = "CoinJar" + private const val TTS_NAME = "Coin Jar" + private const val URL = "https://api.coinjar.com/v3/exchange_rates" + private const val URL_CURRENCY_PAIRS = URL + } +} \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/CoinMarketIO.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/CoinMarketIO.kt new file mode 100644 index 00000000..cba9cedf --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/CoinMarketIO.kt @@ -0,0 +1,78 @@ +package com.aneonex.bitcoinchecker.datamodule.model.market + +import com.aneonex.bitcoinchecker.datamodule.model.CheckerInfo +import com.aneonex.bitcoinchecker.datamodule.model.Market +import com.aneonex.bitcoinchecker.datamodule.model.Ticker +import com.aneonex.bitcoinchecker.datamodule.model.currency.CurrencyPairsMap +import com.aneonex.bitcoinchecker.datamodule.model.currency.VirtualCurrency +import org.json.JSONObject + +class CoinMarketIO : Market(NAME, TTS_NAME, CURRENCY_PAIRS) { + companion object { + private const val NAME = "CoinMarket.io" + private const val TTS_NAME = "Coin Market IO" + private const val URL = "https://coinmarket.io/ticker/%1\$s%2\$s" + private val CURRENCY_PAIRS: CurrencyPairsMap = CurrencyPairsMap() + + init { + CURRENCY_PAIRS[VirtualCurrency.LEAF] = arrayOf( + VirtualCurrency.BTC + ) + CURRENCY_PAIRS[VirtualCurrency.USDE] = arrayOf( + VirtualCurrency.BTC + ) + CURRENCY_PAIRS[VirtualCurrency.DGB] = arrayOf( + VirtualCurrency.BTC + ) + CURRENCY_PAIRS[VirtualCurrency.KDC] = arrayOf( + VirtualCurrency.BTC + ) + CURRENCY_PAIRS[VirtualCurrency.CON] = arrayOf( + VirtualCurrency.BTC + ) + CURRENCY_PAIRS[VirtualCurrency.NOBL] = arrayOf( + VirtualCurrency.BTC + ) + CURRENCY_PAIRS[VirtualCurrency.SMC] = arrayOf( + VirtualCurrency.BTC + ) + // CURRENCY_PAIRS.put(VirtualCurrency.PRT, new String[]{ +// VirtualCurrency.BTC +// }); + CURRENCY_PAIRS[VirtualCurrency.VTC] = arrayOf( + VirtualCurrency.BTC + ) + CURRENCY_PAIRS[VirtualCurrency.UTC] = arrayOf( + VirtualCurrency.BTC + ) + CURRENCY_PAIRS[VirtualCurrency.KARM] = arrayOf( + VirtualCurrency.BTC + ) + CURRENCY_PAIRS[VirtualCurrency.RDD] = arrayOf( + VirtualCurrency.BTC + ) + CURRENCY_PAIRS[VirtualCurrency.RPD] = arrayOf( + VirtualCurrency.BTC + ) + CURRENCY_PAIRS[VirtualCurrency.ICN] = arrayOf( + VirtualCurrency.BTC + ) + CURRENCY_PAIRS[VirtualCurrency.PENG] = arrayOf( + VirtualCurrency.BTC + ) + CURRENCY_PAIRS[VirtualCurrency.MINT] = arrayOf( + VirtualCurrency.BTC + ) + } + } + + override fun getUrl(requestId: Int, checkerInfo: CheckerInfo): String { + return String.format(URL, checkerInfo.currencyBase, checkerInfo.currencyCounter) + } + + @Throws(Exception::class) + override fun parseTickerFromJsonObject(requestId: Int, jsonObject: JSONObject, ticker: Ticker, checkerInfo: CheckerInfo) { + ticker.vol = jsonObject.getDouble("volume24") + ticker.last = jsonObject.getDouble("last") + } +} \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/CoinMateIO.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/CoinMateIO.kt new file mode 100644 index 00000000..5db7772b --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/CoinMateIO.kt @@ -0,0 +1,45 @@ +package com.aneonex.bitcoinchecker.datamodule.model.market + +import com.aneonex.bitcoinchecker.datamodule.model.CheckerInfo +import com.aneonex.bitcoinchecker.datamodule.model.Market +import com.aneonex.bitcoinchecker.datamodule.model.Ticker +import com.aneonex.bitcoinchecker.datamodule.model.currency.Currency +import com.aneonex.bitcoinchecker.datamodule.model.currency.CurrencyPairsMap +import com.aneonex.bitcoinchecker.datamodule.model.currency.VirtualCurrency +import org.json.JSONObject + +class CoinMateIO : Market(NAME, TTS_NAME, CURRENCY_PAIRS) { + companion object { + private const val NAME = "CoinMate.io" + private const val TTS_NAME = "Coin Mate" + private const val URL = "https://coinmate.io/api/ticker?currencyPair=%1\$s_%2\$s" + private val CURRENCY_PAIRS: CurrencyPairsMap = CurrencyPairsMap() + + init { + CURRENCY_PAIRS[VirtualCurrency.BTC] = arrayOf( + Currency.EUR, + Currency.CZK + ) + } + } + + override fun getUrl(requestId: Int, checkerInfo: CheckerInfo): String { + return String.format(URL, checkerInfo.currencyBase, checkerInfo.currencyCounter) + } + + @Throws(Exception::class) + override fun parseTickerFromJsonObject(requestId: Int, jsonObject: JSONObject, ticker: Ticker, checkerInfo: CheckerInfo) { + val dataJsonObject = jsonObject.getJSONObject("data") + ticker.bid = dataJsonObject.getDouble("bid") + ticker.ask = dataJsonObject.getDouble("ask") + ticker.vol = dataJsonObject.getDouble("amount") + ticker.high = dataJsonObject.getDouble("high") + ticker.low = dataJsonObject.getDouble("low") + ticker.last = dataJsonObject.getDouble("last") + } + + @Throws(Exception::class) + override fun parseErrorFromJsonObject(requestId: Int, jsonObject: JSONObject, checkerInfo: CheckerInfo?): String? { + return jsonObject.getString("errorMessage") + } +} \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/CoinSecure.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/CoinSecure.kt new file mode 100644 index 00000000..a518a843 --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/CoinSecure.kt @@ -0,0 +1,44 @@ +package com.aneonex.bitcoinchecker.datamodule.model.market + +import com.aneonex.bitcoinchecker.datamodule.model.CheckerInfo +import com.aneonex.bitcoinchecker.datamodule.model.Market +import com.aneonex.bitcoinchecker.datamodule.model.Ticker +import com.aneonex.bitcoinchecker.datamodule.model.currency.Currency +import com.aneonex.bitcoinchecker.datamodule.model.currency.CurrencyPairsMap +import com.aneonex.bitcoinchecker.datamodule.model.currency.VirtualCurrency +import org.json.JSONObject + +class CoinSecure : Market(NAME, TTS_NAME, CURRENCY_PAIRS) { + companion object { + private const val NAME = "CoinSecure" + private const val TTS_NAME = "Coin Secure" + private const val URL = "https://api.coinsecure.in/v1/exchange/ticker" + private val CURRENCY_PAIRS: CurrencyPairsMap = CurrencyPairsMap() + + init { + CURRENCY_PAIRS[VirtualCurrency.BTC] = arrayOf( + Currency.INR + ) + } + } + + override fun getUrl(requestId: Int, checkerInfo: CheckerInfo): String { + return URL + } + + @Throws(Exception::class) + override fun parseTickerFromJsonObject(requestId: Int, jsonObject: JSONObject, ticker: Ticker, checkerInfo: CheckerInfo) { + val messageJsonObject = jsonObject.getJSONObject("message") + ticker.bid = parsePrice(messageJsonObject.getDouble("bid")) + ticker.ask = parsePrice(messageJsonObject.getDouble("ask")) + ticker.vol = messageJsonObject.getDouble("coinvolume") / 100000000 + ticker.high = parsePrice(messageJsonObject.getDouble("high")) + ticker.low = parsePrice(messageJsonObject.getDouble("low")) + ticker.last = parsePrice(messageJsonObject.getDouble("lastPrice")) + // ticker.timestamp = messageJsonObject.getLong("timestamp"); + } + + private fun parsePrice(price: Double): Double { + return price / 100 + } +} \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/CoinSwap.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/CoinSwap.kt new file mode 100644 index 00000000..92e72814 --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/CoinSwap.kt @@ -0,0 +1,50 @@ +package com.aneonex.bitcoinchecker.datamodule.model.market + +import com.aneonex.bitcoinchecker.datamodule.model.CheckerInfo +import com.aneonex.bitcoinchecker.datamodule.model.CurrencyPairInfo +import com.aneonex.bitcoinchecker.datamodule.model.Market +import com.aneonex.bitcoinchecker.datamodule.model.Ticker +import org.json.JSONArray +import org.json.JSONObject + +class CoinSwap : Market(NAME, TTS_NAME, null) { + override fun getUrl(requestId: Int, checkerInfo: CheckerInfo): String { + return String.format(URL, checkerInfo.currencyBase, checkerInfo.currencyCounter) + } + + @Throws(Exception::class) + override fun parseTickerFromJsonObject(requestId: Int, jsonObject: JSONObject, ticker: Ticker, checkerInfo: CheckerInfo) { + ticker.bid = jsonObject.getDouble("bid") + ticker.ask = jsonObject.getDouble("ask") + ticker.vol = jsonObject.getDouble("dayvolume") + ticker.high = jsonObject.getDouble("dayhigh") + ticker.low = jsonObject.getDouble("daylow") + ticker.last = jsonObject.getDouble("lastprice") + } + + // ==================== + // Get currency pairs + // ==================== + override fun getCurrencyPairsUrl(requestId: Int): String? { + return URL_CURRENCY_PAIRS + } + + @Throws(Exception::class) + override fun parseCurrencyPairs(requestId: Int, responseString: String, pairs: MutableList) { + val marketsJsonArray = JSONArray(responseString) + for (i in 0 until marketsJsonArray.length()) { + val marketJsonObject = marketsJsonArray.getJSONObject(i) + pairs.add(CurrencyPairInfo( + marketJsonObject.getString("symbol"), + marketJsonObject.getString("exchange"), + null)) + } + } + + companion object { + private const val NAME = "Coin-Swap" + private const val TTS_NAME = "Coin Swap" + private const val URL = "https://api.coin-swap.net/market/stats/%1\$s/%2\$s" + private const val URL_CURRENCY_PAIRS = "http://api.coin-swap.net/market/summary" + } +} \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/CoinTraderNet.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/CoinTraderNet.kt new file mode 100644 index 00000000..0cd30e9f --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/CoinTraderNet.kt @@ -0,0 +1,42 @@ +package com.aneonex.bitcoinchecker.datamodule.model.market + +import com.aneonex.bitcoinchecker.datamodule.model.CheckerInfo +import com.aneonex.bitcoinchecker.datamodule.model.Market +import com.aneonex.bitcoinchecker.datamodule.model.Ticker +import com.aneonex.bitcoinchecker.datamodule.model.currency.Currency +import com.aneonex.bitcoinchecker.datamodule.model.currency.CurrencyPairsMap +import com.aneonex.bitcoinchecker.datamodule.model.currency.VirtualCurrency +import org.json.JSONObject + +class CoinTraderNet : Market(NAME, TTS_NAME, CURRENCY_PAIRS) { + companion object { + private const val NAME = "CoinTrader.net" + private const val TTS_NAME = "Coin Trader" + private const val URL = "https://www.cointrader.net/api4/stats/daily/%1\$s%2\$s" + private val CURRENCY_PAIRS: CurrencyPairsMap = CurrencyPairsMap() + + init { + CURRENCY_PAIRS[VirtualCurrency.BTC] = arrayOf( + Currency.USD, + Currency.CAD + ) + } + } + + override fun getUrl(requestId: Int, checkerInfo: CheckerInfo): String { + return String.format(URL, checkerInfo.currencyBase, checkerInfo.currencyCounter) + } + + @Throws(Exception::class) + override fun parseTickerFromJsonObject(requestId: Int, jsonObject: JSONObject, ticker: Ticker, checkerInfo: CheckerInfo) { + val dataJsonObject = jsonObject.getJSONObject("data") + val dataNamesArray = dataJsonObject.names() + val tickerJsonObject = dataJsonObject.getJSONObject(dataNamesArray.getString(0)) + ticker.bid = tickerJsonObject.getDouble("bid") + ticker.ask = tickerJsonObject.getDouble("offer") + ticker.vol = tickerJsonObject.getDouble("volume") + ticker.high = tickerJsonObject.getDouble("high") + ticker.low = tickerJsonObject.getDouble("low") + ticker.last = tickerJsonObject.getDouble("lastTradePrice") + } +} \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/CoinTree.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/CoinTree.kt new file mode 100644 index 00000000..620c7e36 --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/CoinTree.kt @@ -0,0 +1,35 @@ +package com.aneonex.bitcoinchecker.datamodule.model.market + +import com.aneonex.bitcoinchecker.datamodule.model.CheckerInfo +import com.aneonex.bitcoinchecker.datamodule.model.Market +import com.aneonex.bitcoinchecker.datamodule.model.Ticker +import com.aneonex.bitcoinchecker.datamodule.model.currency.Currency +import com.aneonex.bitcoinchecker.datamodule.model.currency.CurrencyPairsMap +import com.aneonex.bitcoinchecker.datamodule.model.currency.VirtualCurrency +import org.json.JSONObject + +class CoinTree : Market(NAME, TTS_NAME, CURRENCY_PAIRS) { + companion object { + private const val NAME = "CoinTree" + private const val TTS_NAME = "Coin Tree" + private const val URL = "https://www.cointree.com.au/api/price/btc/aud" + private val CURRENCY_PAIRS: CurrencyPairsMap = CurrencyPairsMap() + + init { + CURRENCY_PAIRS[VirtualCurrency.BTC] = arrayOf( + Currency.AUD + ) + } + } + + override fun getUrl(requestId: Int, checkerInfo: CheckerInfo): String { + return URL + } + + @Throws(Exception::class) + override fun parseTickerFromJsonObject(requestId: Int, jsonObject: JSONObject, ticker: Ticker, checkerInfo: CheckerInfo) { + ticker.bid = jsonObject.getDouble("Bid") + ticker.ask = jsonObject.getDouble("Ask") + ticker.last = jsonObject.getDouble("Spot") + } +} \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Coinapult.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Coinapult.kt new file mode 100644 index 00000000..0f7cdadf --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Coinapult.kt @@ -0,0 +1,44 @@ +package com.aneonex.bitcoinchecker.datamodule.model.market + +import com.aneonex.bitcoinchecker.datamodule.model.CheckerInfo +import com.aneonex.bitcoinchecker.datamodule.model.Market +import com.aneonex.bitcoinchecker.datamodule.model.Ticker +import com.aneonex.bitcoinchecker.datamodule.model.currency.Currency +import com.aneonex.bitcoinchecker.datamodule.model.currency.CurrencyPairsMap +import com.aneonex.bitcoinchecker.datamodule.model.currency.VirtualCurrency +import com.aneonex.bitcoinchecker.datamodule.util.TimeUtils +import org.json.JSONObject + +class Coinapult : Market(NAME, TTS_NAME, CURRENCY_PAIRS) { + companion object { + private const val NAME = "Coinapult" + private const val TTS_NAME = NAME + private const val URL = "https://api.coinapult.com/api/ticker?market=%2\$s_%1\$s" + private val CURRENCY_PAIRS: CurrencyPairsMap = CurrencyPairsMap() + + init { + CURRENCY_PAIRS[VirtualCurrency.BTC] = arrayOf( + Currency.USD, + Currency.EUR, + Currency.GBP, + Currency.XAG, + Currency.XAU + ) + } + } + + override fun getUrl(requestId: Int, checkerInfo: CheckerInfo): String { + return String.format(URL, checkerInfo.currencyBase, checkerInfo.currencyCounter) + } + + @Throws(Exception::class) + override fun parseErrorFromJsonObject(requestId: Int, jsonObject: JSONObject, checkerInfo: CheckerInfo?): String? { + return jsonObject.getString("error") + } + + @Throws(Exception::class) + override fun parseTickerFromJsonObject(requestId: Int, jsonObject: JSONObject, ticker: Ticker, checkerInfo: CheckerInfo) { + ticker.last = jsonObject.getDouble("index") + ticker.timestamp = jsonObject.getLong("updatetime") * TimeUtils.MILLIS_IN_SECOND + } +} \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Coinbase.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Coinbase.kt new file mode 100644 index 00000000..f87c0c84 --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Coinbase.kt @@ -0,0 +1,70 @@ +package com.aneonex.bitcoinchecker.datamodule.model.market + +import com.aneonex.bitcoinchecker.datamodule.model.CheckerInfo +import com.aneonex.bitcoinchecker.datamodule.model.CurrencyPairInfo +import com.aneonex.bitcoinchecker.datamodule.model.Market +import com.aneonex.bitcoinchecker.datamodule.model.Ticker +import com.aneonex.bitcoinchecker.datamodule.model.currency.Currency +import com.aneonex.bitcoinchecker.datamodule.model.currency.CurrencyPairsMap +import com.aneonex.bitcoinchecker.datamodule.model.currency.VirtualCurrency +import org.json.JSONArray +import org.json.JSONObject + +class Coinbase : Market(NAME, TTS_NAME, CURRENCY_PAIRS) { + companion object { + private const val NAME = "Coinbase" + private const val TTS_NAME = NAME + private const val URL = "https://api.gdax.com/products/%1\$s-%2\$s/ticker" + private const val URL_CURRENCY_PAIRS = "https://api.gdax.com/products/" + private val CURRENCY_PAIRS: CurrencyPairsMap = CurrencyPairsMap() + + init { + CURRENCY_PAIRS[VirtualCurrency.BTC] = arrayOf( + Currency.USD, + Currency.EUR, + Currency.GBP + ) + CURRENCY_PAIRS[VirtualCurrency.LTC] = arrayOf( + Currency.USD, + Currency.EUR, + VirtualCurrency.BTC + ) + CURRENCY_PAIRS[VirtualCurrency.ETH] = arrayOf( + Currency.USD, + Currency.EUR, + VirtualCurrency.BTC + ) + } + } + + override fun getUrl(requestId: Int, checkerInfo: CheckerInfo): String { + return String.format(URL, checkerInfo.currencyBase, checkerInfo.currencyCounter) + } + + @Throws(Exception::class) + override fun parseTickerFromJsonObject(requestId: Int, jsonObject: JSONObject, ticker: Ticker, checkerInfo: CheckerInfo) { + ticker.bid = jsonObject.getDouble("bid") + ticker.ask = jsonObject.getDouble("ask") + ticker.vol = jsonObject.getDouble("volume") + ticker.last = jsonObject.getDouble("price") + } + + // ==================== + // Get currency pairs + // ==================== + override fun getCurrencyPairsUrl(requestId: Int): String? { + return URL_CURRENCY_PAIRS + } + + @Throws(Exception::class) + override fun parseCurrencyPairs(requestId: Int, responseString: String, pairs: MutableList) { + val jsonArray = JSONArray(responseString) + for (i in 0 until jsonArray.length()) { + val pairJsonObject = jsonArray.getJSONObject(i) + pairs.add(CurrencyPairInfo( + pairJsonObject.getString("base_currency"), + pairJsonObject.getString("quote_currency"), + pairJsonObject.getString("id"))) + } + } +} \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Coinnest.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Coinnest.kt new file mode 100644 index 00000000..527c8bbb --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Coinnest.kt @@ -0,0 +1,71 @@ +package com.aneonex.bitcoinchecker.datamodule.model.market + +import com.aneonex.bitcoinchecker.datamodule.model.CheckerInfo +import com.aneonex.bitcoinchecker.datamodule.model.Market +import com.aneonex.bitcoinchecker.datamodule.model.Ticker +import com.aneonex.bitcoinchecker.datamodule.model.currency.Currency +import com.aneonex.bitcoinchecker.datamodule.model.currency.CurrencyPairsMap +import com.aneonex.bitcoinchecker.datamodule.model.currency.VirtualCurrency +import com.aneonex.bitcoinchecker.datamodule.util.TimeUtils +import org.json.JSONObject + +class Coinnest : Market(NAME, TTS_NAME, CURRENCY_PAIRS) { + companion object { + private const val NAME = "Coinnest" + private const val TTS_NAME = NAME + private const val URL = "https://api.coinnest.co.kr/api/pub/ticker?coin=%1\$s" + private val CURRENCY_PAIRS: CurrencyPairsMap = CurrencyPairsMap() + + init { + CURRENCY_PAIRS[VirtualCurrency.BTC] = arrayOf( + Currency.KRW + ) + CURRENCY_PAIRS[VirtualCurrency.BCC] = arrayOf( + Currency.KRW + ) + CURRENCY_PAIRS[VirtualCurrency.ETH] = arrayOf( + Currency.KRW + ) + CURRENCY_PAIRS[VirtualCurrency.ETC] = arrayOf( + Currency.KRW + ) + CURRENCY_PAIRS[VirtualCurrency.QTUM] = arrayOf( + Currency.KRW + ) + CURRENCY_PAIRS[VirtualCurrency.NEO] = arrayOf( + Currency.KRW + ) + CURRENCY_PAIRS[VirtualCurrency.KNC] = arrayOf( + Currency.KRW + ) + CURRENCY_PAIRS[VirtualCurrency.TSL] = arrayOf( + Currency.KRW + ) + CURRENCY_PAIRS[VirtualCurrency.OMG] = arrayOf( + Currency.KRW + ) + } + } + + override fun getUrl(requestId: Int, checkerInfo: CheckerInfo): String { + return String.format(URL, checkerInfo.currencyBaseLowerCase) + } + + @Throws(Exception::class) + override fun parseTickerFromJsonObject(requestId: Int, jsonObject: JSONObject, ticker: Ticker, + checkerInfo: CheckerInfo) { + ticker.high = jsonObject.getDouble("high") + ticker.low = jsonObject.getDouble("low") + ticker.bid = jsonObject.getDouble("buy") + ticker.ask = jsonObject.getDouble("sell") + ticker.last = jsonObject.getDouble("last") + ticker.vol = jsonObject.getDouble("vol") + ticker.timestamp = jsonObject.getLong("time") * TimeUtils.MILLIS_IN_SECOND + } + + @Throws(Exception::class) + override fun parseErrorFromJsonObject(requestId: Int, jsonObject: JSONObject, + checkerInfo: CheckerInfo?): String? { + return jsonObject.getString("msg") + } +} \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Coinome.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Coinome.kt new file mode 100644 index 00000000..d591c2ab --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Coinome.kt @@ -0,0 +1,52 @@ +package com.aneonex.bitcoinchecker.datamodule.model.market + +import com.aneonex.bitcoinchecker.datamodule.model.CheckerInfo +import com.aneonex.bitcoinchecker.datamodule.model.CurrencyPairInfo +import com.aneonex.bitcoinchecker.datamodule.model.Market +import com.aneonex.bitcoinchecker.datamodule.model.Ticker +import org.json.JSONObject +import java.util.* + +class Coinome : Market(NAME, TTS_NAME, null) { + override fun getUrl(requestId: Int, checkerInfo: CheckerInfo): String { + return URL + } + + @Throws(Exception::class) + override fun parseTickerFromJsonObject(requestId: Int, jsonObject: JSONObject, ticker: Ticker, checkerInfo: CheckerInfo) { + val tickerJsonObject = jsonObject.getJSONObject(checkerInfo.currencyPairId) + ticker.bid = tickerJsonObject.getDouble("highest_bid") + ticker.ask = tickerJsonObject.getDouble("lowest_ask") + //ticker.vol = tickerJsonObject.getDouble("24hr_volume"); Currently null + ticker.last = tickerJsonObject.getDouble("last") + } + + // ==================== + // Get currency pairs + // ==================== + override fun getCurrencyPairsUrl(requestId: Int): String? { + return URL + } + + @Throws(Exception::class) + override fun parseCurrencyPairsFromJsonObject(requestId: Int, jsonObject: JSONObject, pairs: MutableList) { + val pairArray = jsonObject.names() + for (i in 0 until pairArray.length()) { + val pairId = pairArray.getString(i) + val currencies = pairId.split("-".toRegex()).toTypedArray() + if (currencies.size >= 2) { + pairs.add(CurrencyPairInfo( + currencies[0].toUpperCase(Locale.US), + currencies[1].toUpperCase(Locale.US), + pairId + )) + } + } + } + + companion object { + private const val NAME = "Coinome" + private const val TTS_NAME = "Coin ome" + private const val URL = "https://www.coinome.com/api/v1/ticker.json" + } +} \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Coinone.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Coinone.kt new file mode 100644 index 00000000..80ff2256 --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Coinone.kt @@ -0,0 +1,77 @@ +package com.aneonex.bitcoinchecker.datamodule.model.market + +import com.aneonex.bitcoinchecker.datamodule.model.CheckerInfo +import com.aneonex.bitcoinchecker.datamodule.model.Market +import com.aneonex.bitcoinchecker.datamodule.model.Ticker +import com.aneonex.bitcoinchecker.datamodule.model.currency.Currency +import com.aneonex.bitcoinchecker.datamodule.model.currency.CurrencyPairsMap +import com.aneonex.bitcoinchecker.datamodule.model.currency.VirtualCurrency +import org.json.JSONObject + +class Coinone : Market(NAME, TTS_NAME, CURRENCY_PAIRS) { + companion object { + private const val NAME = "Coinone" + private const val TTS_NAME = NAME + private const val URL_TICKER = "https://api.coinone.co.kr/ticker?currency=%1\$s" + private const val URL_ORDERS = "https://api.coinone.co.kr/orderbook?currency=%1\$s" + private val CURRENCY_PAIRS: CurrencyPairsMap = CurrencyPairsMap() + + init { + CURRENCY_PAIRS[VirtualCurrency.BTC] = arrayOf( + Currency.KRW + ) + CURRENCY_PAIRS[VirtualCurrency.ETH] = arrayOf( + Currency.KRW + ) + CURRENCY_PAIRS[VirtualCurrency.ETC] = arrayOf( + Currency.KRW + ) + CURRENCY_PAIRS[VirtualCurrency.XRP] = arrayOf( + Currency.KRW + ) + CURRENCY_PAIRS[VirtualCurrency.BCH] = arrayOf( + Currency.KRW + ) + CURRENCY_PAIRS[VirtualCurrency.QTUM] = arrayOf( + Currency.KRW + ) + } + } + + override fun getNumOfRequests(checkerRecord: CheckerInfo?): Int { + return 2 + } + + override fun getUrl(requestId: Int, checkerInfo: CheckerInfo): String { + return if (requestId == 0) { + String.format(URL_TICKER, checkerInfo.currencyBaseLowerCase) + } else { + String.format(URL_ORDERS, checkerInfo.currencyBaseLowerCase) + } + } + + @Throws(Exception::class) + override fun parseTickerFromJsonObject(requestId: Int, jsonObject: JSONObject, ticker: Ticker, + checkerInfo: CheckerInfo) { + if (requestId == 0) { + ticker.vol = jsonObject.getDouble("volume") + ticker.high = jsonObject.getDouble("high") + ticker.low = jsonObject.getDouble("low") + ticker.last = jsonObject.getDouble("last") + ticker.timestamp = jsonObject.getLong("timestamp") + } else { + ticker.bid = getFirstPriceFromOrder(jsonObject, "bid") + ticker.ask = getFirstPriceFromOrder(jsonObject, "ask") + } + } + + @Throws(Exception::class) + private fun getFirstPriceFromOrder(jsonObject: JSONObject, key: String): Double { + val array = jsonObject.getJSONArray(key) + if (array.length() == 0) { + return Ticker.NO_DATA.toDouble() + } + val first = array.getJSONObject(0) + return first.getDouble("price") + } +} \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Coinse.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Coinse.kt new file mode 100644 index 00000000..8c42c73b --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Coinse.kt @@ -0,0 +1,101 @@ +package com.aneonex.bitcoinchecker.datamodule.model.market + +import com.aneonex.bitcoinchecker.datamodule.R +import com.aneonex.bitcoinchecker.datamodule.model.CheckerInfo +import com.aneonex.bitcoinchecker.datamodule.model.Market +import com.aneonex.bitcoinchecker.datamodule.model.Ticker +import com.aneonex.bitcoinchecker.datamodule.model.currency.CurrencyPairsMap +import com.aneonex.bitcoinchecker.datamodule.model.currency.VirtualCurrency +import org.json.JSONObject + +class Coinse : Market(NAME, TTS_NAME, CURRENCY_PAIRS) { + companion object { + private const val NAME = "Coins-E" + private const val TTS_NAME = NAME + private const val URL = "https://www.coins-e.com/api/v2/markets/data/" + private val CURRENCY_PAIRS: CurrencyPairsMap = CurrencyPairsMap() + + init { + CURRENCY_PAIRS[VirtualCurrency.ALP] = arrayOf(VirtualCurrency.BTC, VirtualCurrency.LTC) + CURRENCY_PAIRS[VirtualCurrency.AMC] = arrayOf(VirtualCurrency.BTC, VirtualCurrency.LTC) + CURRENCY_PAIRS[VirtualCurrency.ANC] = arrayOf(VirtualCurrency.BTC, VirtualCurrency.LTC) + CURRENCY_PAIRS[VirtualCurrency.ARG] = arrayOf(VirtualCurrency.BTC, VirtualCurrency.LTC) + CURRENCY_PAIRS[VirtualCurrency.BET] = arrayOf(VirtualCurrency.BTC, VirtualCurrency.LTC) + CURRENCY_PAIRS[VirtualCurrency.BQC] = arrayOf(VirtualCurrency.BTC) + CURRENCY_PAIRS[VirtualCurrency.BTG] = arrayOf(VirtualCurrency.BTC) + CURRENCY_PAIRS[VirtualCurrency.CGB] = arrayOf(VirtualCurrency.BTC) + CURRENCY_PAIRS[VirtualCurrency.CIN] = arrayOf(VirtualCurrency.BTC) + CURRENCY_PAIRS[VirtualCurrency.CMC] = arrayOf(VirtualCurrency.BTC) + CURRENCY_PAIRS[VirtualCurrency.COL] = arrayOf(VirtualCurrency.LTC) + CURRENCY_PAIRS[VirtualCurrency.CRC] = arrayOf(VirtualCurrency.BTC) + CURRENCY_PAIRS[VirtualCurrency.CSC] = arrayOf(VirtualCurrency.BTC) + CURRENCY_PAIRS[VirtualCurrency.DEM] = arrayOf(VirtualCurrency.BTC, VirtualCurrency.LTC) + CURRENCY_PAIRS[VirtualCurrency.DGC] = arrayOf(VirtualCurrency.BTC) + CURRENCY_PAIRS[VirtualCurrency.DMD] = arrayOf(VirtualCurrency.BTC) + CURRENCY_PAIRS[VirtualCurrency.DOGE] = arrayOf(VirtualCurrency.BTC) + CURRENCY_PAIRS[VirtualCurrency.DTC] = arrayOf(VirtualCurrency.BTC) + CURRENCY_PAIRS[VirtualCurrency.ELC] = arrayOf(VirtualCurrency.BTC) + CURRENCY_PAIRS[VirtualCurrency.ELP] = arrayOf(VirtualCurrency.BTC) + CURRENCY_PAIRS[VirtualCurrency.EMD] = arrayOf(VirtualCurrency.BTC) + CURRENCY_PAIRS[VirtualCurrency.EZC] = arrayOf(VirtualCurrency.BTC) + CURRENCY_PAIRS[VirtualCurrency.FLO] = arrayOf(VirtualCurrency.BTC) + CURRENCY_PAIRS[VirtualCurrency.FRK] = arrayOf(VirtualCurrency.BTC, VirtualCurrency.LTC) + CURRENCY_PAIRS[VirtualCurrency.FTC] = arrayOf(VirtualCurrency.BTC) + CURRENCY_PAIRS[VirtualCurrency.GDC] = arrayOf(VirtualCurrency.BTC) + CURRENCY_PAIRS[VirtualCurrency.GLC] = arrayOf(VirtualCurrency.BTC, VirtualCurrency.LTC) + CURRENCY_PAIRS[VirtualCurrency.GLX] = arrayOf(VirtualCurrency.BTC) + CURRENCY_PAIRS[VirtualCurrency.HYC] = arrayOf(VirtualCurrency.BTC) + CURRENCY_PAIRS[VirtualCurrency.IFC] = arrayOf(VirtualCurrency.BTC, VirtualCurrency.LTC, VirtualCurrency.XPM) + CURRENCY_PAIRS[VirtualCurrency.KGC] = arrayOf(VirtualCurrency.BTC, VirtualCurrency.LTC) + CURRENCY_PAIRS[VirtualCurrency.LBW] = arrayOf(VirtualCurrency.BTC) + CURRENCY_PAIRS[VirtualCurrency.LTC] = arrayOf(VirtualCurrency.BTC) + CURRENCY_PAIRS[VirtualCurrency.MEC] = arrayOf(VirtualCurrency.BTC) + CURRENCY_PAIRS[VirtualCurrency.NAN] = arrayOf(VirtualCurrency.BTC) + CURRENCY_PAIRS[VirtualCurrency.NET] = arrayOf(VirtualCurrency.BTC) + CURRENCY_PAIRS[VirtualCurrency.NIB] = arrayOf(VirtualCurrency.BTC) + CURRENCY_PAIRS[VirtualCurrency.NRB] = arrayOf(VirtualCurrency.BTC) + CURRENCY_PAIRS[VirtualCurrency.NUC] = arrayOf(VirtualCurrency.BTC) + CURRENCY_PAIRS[VirtualCurrency.NVC] = arrayOf(VirtualCurrency.BTC) + CURRENCY_PAIRS[VirtualCurrency.ORB] = arrayOf(VirtualCurrency.BTC, VirtualCurrency.LTC) + CURRENCY_PAIRS[VirtualCurrency.PPC] = arrayOf(VirtualCurrency.BTC, VirtualCurrency.XPM) + CURRENCY_PAIRS[VirtualCurrency.PTS] = arrayOf(VirtualCurrency.BTC) + CURRENCY_PAIRS[VirtualCurrency.PWC] = arrayOf(VirtualCurrency.BTC) + CURRENCY_PAIRS[VirtualCurrency.PXC] = arrayOf(VirtualCurrency.BTC, VirtualCurrency.LTC) + CURRENCY_PAIRS[VirtualCurrency.QRK] = arrayOf(VirtualCurrency.BTC, VirtualCurrency.LTC, VirtualCurrency.XPM) + CURRENCY_PAIRS[VirtualCurrency.RCH] = arrayOf(VirtualCurrency.BTC, VirtualCurrency.LTC) + CURRENCY_PAIRS[VirtualCurrency.REC] = arrayOf(VirtualCurrency.BTC, VirtualCurrency.LTC) + CURRENCY_PAIRS[VirtualCurrency.RED] = arrayOf(VirtualCurrency.BTC, VirtualCurrency.LTC) + CURRENCY_PAIRS[VirtualCurrency.SBC] = arrayOf(VirtualCurrency.BTC, VirtualCurrency.LTC) + CURRENCY_PAIRS[VirtualCurrency.SPT] = arrayOf(VirtualCurrency.BTC) + CURRENCY_PAIRS[VirtualCurrency.TAG] = arrayOf(VirtualCurrency.BTC) + CURRENCY_PAIRS[VirtualCurrency.TRC] = arrayOf(VirtualCurrency.BTC) + CURRENCY_PAIRS[VirtualCurrency.UNO] = arrayOf(VirtualCurrency.BTC) + CURRENCY_PAIRS[VirtualCurrency.VLC] = arrayOf(VirtualCurrency.BTC, VirtualCurrency.LTC) + CURRENCY_PAIRS[VirtualCurrency.WDC] = arrayOf(VirtualCurrency.BTC) + CURRENCY_PAIRS[VirtualCurrency.XNC] = arrayOf(VirtualCurrency.BTC, VirtualCurrency.LTC) + CURRENCY_PAIRS[VirtualCurrency.XPM] = arrayOf(VirtualCurrency.BTC, VirtualCurrency.LTC) + CURRENCY_PAIRS[VirtualCurrency.ZET] = arrayOf(VirtualCurrency.BTC) + } + } + + override val cautionResId: Int + get() = R.string.market_caution_much_data + + override fun getUrl(requestId: Int, checkerInfo: CheckerInfo): String { + return URL + } + + @Throws(Exception::class) + override fun parseTickerFromJsonObject(requestId: Int, jsonObject: JSONObject, ticker: Ticker, checkerInfo: CheckerInfo) { + val marketsObject = jsonObject.getJSONObject("markets") + val pairObject = marketsObject.getJSONObject(checkerInfo.currencyBase + "_" + checkerInfo.currencyCounter) + val marketStatObject = pairObject.getJSONObject("marketstat") + val inner24hObject = marketStatObject.getJSONObject("24h") + ticker.bid = marketStatObject.getDouble("bid") + ticker.ask = marketStatObject.getDouble("ask") + ticker.vol = inner24hObject.getDouble("volume") + ticker.high = inner24hObject.getDouble("h") + ticker.low = inner24hObject.getDouble("l") + ticker.last = marketStatObject.getDouble("ltp") + } +} \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Coinsph.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Coinsph.kt new file mode 100644 index 00000000..2771fd4f --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Coinsph.kt @@ -0,0 +1,50 @@ +package com.aneonex.bitcoinchecker.datamodule.model.market + +import com.aneonex.bitcoinchecker.datamodule.model.CheckerInfo +import com.aneonex.bitcoinchecker.datamodule.model.CurrencyPairInfo +import com.aneonex.bitcoinchecker.datamodule.model.Market +import com.aneonex.bitcoinchecker.datamodule.model.Ticker +import org.json.JSONObject + +class Coinsph : Market(NAME, TTS_NAME, null) { + override fun getUrl(requestId: Int, checkerInfo: CheckerInfo): String { + return String.format(URL, checkerInfo.currencyPairId) + } + + @Throws(Exception::class) + override fun parseTickerFromJsonObject(requestId: Int, jsonObject: JSONObject, ticker: Ticker, checkerInfo: CheckerInfo) { + val marketJsonObject = jsonObject.getJSONObject("market") + ticker.bid = marketJsonObject.getDouble("bid") + ticker.ask = marketJsonObject.getDouble("ask") + ticker.last = ticker.ask + } + + // ==================== + // Get currency pairs + // ==================== + override fun getCurrencyPairsUrl(requestId: Int): String? { + return URL_CURRENCY_PAIRS + } + + @Throws(Exception::class) + override fun parseCurrencyPairsFromJsonObject(requestId: Int, jsonObject: JSONObject, pairs: MutableList) { + val marketsJsonArray = jsonObject.getJSONArray("markets") + for (i in 0 until marketsJsonArray.length()) { + val pairJsonObject = marketsJsonArray.getJSONObject(i) + if (pairJsonObject != null) { + pairs.add(CurrencyPairInfo( + pairJsonObject.getString("product"), + pairJsonObject.getString("currency"), + pairJsonObject.getString("symbol") + )) + } + } + } + + companion object { + private const val NAME = "Coins.ph" + private const val TTS_NAME = NAME + private const val URL = "https://quote.coins.ph/v1/markets/%1\$s" + private const val URL_CURRENCY_PAIRS = "https://quote.coins.ph/v1/markets" + } +} \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Comkort.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Comkort.kt new file mode 100644 index 00000000..5df948fd --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Comkort.kt @@ -0,0 +1,60 @@ +package com.aneonex.bitcoinchecker.datamodule.model.market + +import com.aneonex.bitcoinchecker.datamodule.model.CheckerInfo +import com.aneonex.bitcoinchecker.datamodule.model.CurrencyPairInfo +import com.aneonex.bitcoinchecker.datamodule.model.Market +import com.aneonex.bitcoinchecker.datamodule.model.Ticker +import org.json.JSONObject + +class Comkort : Market(NAME, TTS_NAME, null) { + override fun getUrl(requestId: Int, checkerInfo: CheckerInfo): String { + return String.format(URL, checkerInfo.currencyPairId) + } + + @Throws(Exception::class) + override fun parseTickerFromJsonObject(requestId: Int, jsonObject: JSONObject, ticker: Ticker, checkerInfo: CheckerInfo) { + val marketsJsonObject = jsonObject.getJSONObject("markets") + val marketNames = marketsJsonObject.names() + val marketJsonObject = marketsJsonObject.getJSONObject(marketNames.getString(0)) + ticker.bid = getFirstOrderFrom(marketJsonObject, "buy_orders") + ticker.ask = getFirstOrderFrom(marketJsonObject, "sell_orders") + ticker.vol = marketJsonObject.getDouble("volume") + ticker.high = marketJsonObject.getDouble("high") + ticker.low = marketJsonObject.getDouble("low") + ticker.last = marketJsonObject.getDouble("last_price") + } + + @Throws(Exception::class) + private fun getFirstOrderFrom(marketJsonObject: JSONObject, arrayName: String): Double { + val ordersJsonArray = marketJsonObject.getJSONArray(arrayName) + return if (ordersJsonArray.length() > 0) { + ordersJsonArray.getJSONObject(0).getDouble("price") + } else Ticker.NO_DATA.toDouble() + } + + // ==================== + // Get currency pairs + // ==================== + override fun getCurrencyPairsUrl(requestId: Int): String? { + return URL_CURRENCY_PAIRS + } + + @Throws(Exception::class) + override fun parseCurrencyPairsFromJsonObject(requestId: Int, jsonObject: JSONObject, pairs: MutableList) { + val marketsJsonArray = jsonObject.getJSONArray("markets") + for (i in 0 until marketsJsonArray.length()) { + val marketJsonObject = marketsJsonArray.getJSONObject(i) + pairs.add(CurrencyPairInfo( + marketJsonObject.getString("item"), + marketJsonObject.getString("price_currency"), + marketJsonObject.getString("alias"))) + } + } + + companion object { + private const val NAME = "Comkort" + private const val TTS_NAME = NAME + private const val URL = "https://api.comkort.com/v1/public/market/summary?market_alias=%1\$s" + private const val URL_CURRENCY_PAIRS = "https://api.comkort.com/v1/public/market/list" + } +} \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/CryptoAltex.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/CryptoAltex.kt new file mode 100644 index 00000000..daa77127 --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/CryptoAltex.kt @@ -0,0 +1,47 @@ +package com.aneonex.bitcoinchecker.datamodule.model.market + +import com.aneonex.bitcoinchecker.datamodule.model.CheckerInfo +import com.aneonex.bitcoinchecker.datamodule.model.CurrencyPairInfo +import com.aneonex.bitcoinchecker.datamodule.model.Market +import com.aneonex.bitcoinchecker.datamodule.model.Ticker +import org.json.JSONObject + +class CryptoAltex : Market(NAME, TTS_NAME, null) { + override fun getUrl(requestId: Int, checkerInfo: CheckerInfo): String { + return URL + } + + @Throws(Exception::class) + override fun parseTickerFromJsonObject(requestId: Int, jsonObject: JSONObject, ticker: Ticker, checkerInfo: CheckerInfo) { + val pairObject = jsonObject.getJSONObject(checkerInfo.currencyPairId) + ticker.vol = pairObject.getDouble("24_hours_volume") + ticker.high = pairObject.getDouble("24_hours_price_high") + ticker.low = pairObject.getDouble("24_hours_price_low") + ticker.last = pairObject.getDouble("last_trade") + } + + // ==================== + // Get currency pairs + // ==================== + override fun getCurrencyPairsUrl(requestId: Int): String? { + return URL + } + + @Throws(Exception::class) + override fun parseCurrencyPairsFromJsonObject(requestId: Int, jsonObject: JSONObject, pairs: MutableList) { + val pairsNamesArray = jsonObject.names() + for (i in 0 until pairsNamesArray.length()) { + val pairName = pairsNamesArray.getString(i) + val split = pairName.split("/".toRegex()).toTypedArray() + if (split != null && split.size >= 2) { + pairs.add(CurrencyPairInfo(split[0], split[1], pairName)) + } + } + } + + companion object { + private const val NAME = "CryptoAltex" + private const val TTS_NAME = "Crypto Altex" + private const val URL = "https://www.cryptoaltex.com/api/public_v2.php" + } +} \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/CryptoRush.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/CryptoRush.kt new file mode 100644 index 00000000..598bb722 --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/CryptoRush.kt @@ -0,0 +1,53 @@ +package com.aneonex.bitcoinchecker.datamodule.model.market + +import com.aneonex.bitcoinchecker.datamodule.model.CheckerInfo +import com.aneonex.bitcoinchecker.datamodule.model.CurrencyPairInfo +import com.aneonex.bitcoinchecker.datamodule.model.Market +import com.aneonex.bitcoinchecker.datamodule.model.Ticker +import com.aneonex.bitcoinchecker.datamodule.R +import org.json.JSONObject + +class CryptoRush : Market(NAME, TTS_NAME, null) { + override val cautionResId: Int + get() = R.string.market_caution_much_data + + override fun getUrl(requestId: Int, checkerInfo: CheckerInfo): String { + return String.format(URL, checkerInfo.currencyBaseLowerCase, checkerInfo.currencyCounterLowerCase) + } + + @Throws(Exception::class) + override fun parseTickerFromJsonObject(requestId: Int, jsonObject: JSONObject, ticker: Ticker, checkerInfo: CheckerInfo) { + val pairJsonObject = jsonObject.getJSONObject(checkerInfo.currencyBase + "/" + checkerInfo.currencyCounter) + ticker.bid = pairJsonObject.getDouble("current_bid") + ticker.ask = pairJsonObject.getDouble("current_ask") + ticker.vol = pairJsonObject.getDouble("volume_base_24h") + ticker.high = pairJsonObject.getDouble("highest_24h") + ticker.low = pairJsonObject.getDouble("lowest_24h") + ticker.last = pairJsonObject.getDouble("last_trade") + } + + // ==================== + // Get currency pairs + // ==================== + override fun getCurrencyPairsUrl(requestId: Int): String? { + return URL_CURRENCY_PAIRS + } + + @Throws(Exception::class) + override fun parseCurrencyPairsFromJsonObject(requestId: Int, jsonObject: JSONObject, pairs: MutableList) { + val pairNames = jsonObject.names() + for (i in 0 until pairNames.length()) { + val pairId = pairNames.getString(i) ?: continue + val currencies = pairId.split("/".toRegex()).toTypedArray() + if (currencies.size != 2) continue + pairs.add(CurrencyPairInfo(currencies[0], currencies[1], pairId)) + } + } + + companion object { + const val NAME = "CryptoRush" + const val TTS_NAME = "Crypto Rush" + const val URL = "https://cryptorush.in/marketdata/all.json" + private const val URL_CURRENCY_PAIRS = URL + } +} \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/CryptoTrade.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/CryptoTrade.kt new file mode 100644 index 00000000..ce4fcfc7 --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/CryptoTrade.kt @@ -0,0 +1,85 @@ +package com.aneonex.bitcoinchecker.datamodule.model.market + +import com.aneonex.bitcoinchecker.datamodule.model.CheckerInfo +import com.aneonex.bitcoinchecker.datamodule.model.Market +import com.aneonex.bitcoinchecker.datamodule.model.Ticker +import com.aneonex.bitcoinchecker.datamodule.model.currency.Currency +import com.aneonex.bitcoinchecker.datamodule.model.currency.CurrencyPairsMap +import com.aneonex.bitcoinchecker.datamodule.model.currency.VirtualCurrency +import org.json.JSONObject + +class CryptoTrade : Market(NAME, TTS_NAME, CURRENCY_PAIRS) { + companion object { + private const val NAME = "Crypto-Trade" + private const val TTS_NAME = "Crypto Trade" + private const val URL = "https://crypto-trade.com/api/1/ticker/%1\$s_%2\$s" + private val CURRENCY_PAIRS: CurrencyPairsMap = CurrencyPairsMap() + + init { + CURRENCY_PAIRS[VirtualCurrency.BTC] = arrayOf( + Currency.USD, + Currency.EUR + ) + CURRENCY_PAIRS[VirtualCurrency.LTC] = arrayOf( + Currency.USD, + Currency.EUR, + VirtualCurrency.BTC + ) + CURRENCY_PAIRS[VirtualCurrency.NMC] = arrayOf( + Currency.USD, + VirtualCurrency.BTC + ) + CURRENCY_PAIRS[VirtualCurrency.XPM] = arrayOf( + Currency.USD, + VirtualCurrency.BTC, + VirtualCurrency.PPC + ) + CURRENCY_PAIRS[VirtualCurrency.PPC] = arrayOf( + Currency.USD, + VirtualCurrency.BTC + ) + CURRENCY_PAIRS[VirtualCurrency.TRC] = arrayOf( + VirtualCurrency.BTC + ) + CURRENCY_PAIRS[VirtualCurrency.FTC] = arrayOf( + Currency.USD, + VirtualCurrency.BTC + ) + CURRENCY_PAIRS[VirtualCurrency.DVC] = arrayOf( + VirtualCurrency.BTC + ) + CURRENCY_PAIRS[VirtualCurrency.WDC] = arrayOf( + Currency.USD, + VirtualCurrency.BTC + ) + CURRENCY_PAIRS[VirtualCurrency.DGC] = arrayOf( + VirtualCurrency.BTC + ) + CURRENCY_PAIRS[VirtualCurrency.UTC] = arrayOf( + Currency.USD, + Currency.EUR, + VirtualCurrency.BTC + ) + } + } + + override fun getUrl(requestId: Int, checkerInfo: CheckerInfo): String { + return String.format(URL, checkerInfo.currencyBaseLowerCase, checkerInfo.currencyCounterLowerCase) + } + + @Throws(Exception::class) + override fun parseTickerFromJsonObject(requestId: Int, jsonObject: JSONObject, ticker: Ticker, checkerInfo: CheckerInfo) { + val dataObject = jsonObject.getJSONObject("data") + ticker.bid = dataObject.getDouble("max_bid") + ticker.ask = dataObject.getDouble("min_ask") + ticker.vol = dataObject.getDouble("vol_" + checkerInfo.currencyBaseLowerCase) + ticker.high = dataObject.getDouble("high") + ticker.low = dataObject.getDouble("low") + ticker.last = dataObject.getDouble("last") + } + + @Throws(Exception::class) + override fun parseErrorFromJsonObject(requestId: Int, jsonObject: JSONObject, checkerInfo: CheckerInfo?): String? { + return jsonObject.getString("error") + } +} \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Cryptoine.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Cryptoine.kt new file mode 100644 index 00000000..38af5b60 --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Cryptoine.kt @@ -0,0 +1,57 @@ +package com.aneonex.bitcoinchecker.datamodule.model.market + +import com.aneonex.bitcoinchecker.datamodule.model.CheckerInfo +import com.aneonex.bitcoinchecker.datamodule.model.CurrencyPairInfo +import com.aneonex.bitcoinchecker.datamodule.model.Market +import com.aneonex.bitcoinchecker.datamodule.model.Ticker +import org.json.JSONObject +import java.util.* + +class Cryptoine : Market(NAME, TTS_NAME, null) { + override fun getUrl(requestId: Int, checkerInfo: CheckerInfo): String { + return String.format(URL, checkerInfo.currencyPairId) + } + + @Throws(Exception::class) + override fun parseTickerFromJsonObject(requestId: Int, jsonObject: JSONObject, ticker: Ticker, checkerInfo: CheckerInfo) { + ticker.bid = getDoubleOrZero(jsonObject, "buy") + ticker.ask = getDoubleOrZero(jsonObject, "sell") + ticker.vol = getDoubleOrZero(jsonObject, "vol_exchange") + ticker.high = getDoubleOrZero(jsonObject, "high") + ticker.low = getDoubleOrZero(jsonObject, "low") + ticker.last = getDoubleOrZero(jsonObject, "last") + } + + @Throws(Exception::class) + private fun getDoubleOrZero(jsonObject: JSONObject, name: String): Double { + return if (jsonObject.isNull(name)) 0.0 else jsonObject.getDouble(name) + } + + // ==================== + // Get currency pairs + // ==================== + override fun getCurrencyPairsUrl(requestId: Int): String? { + return URL_CURRENCY_PAIRS + } + + @Throws(Exception::class) + override fun parseCurrencyPairsFromJsonObject(requestId: Int, jsonObject: JSONObject, pairs: MutableList) { + val dataJsonObject = jsonObject.getJSONObject("data") + val pairNames = dataJsonObject.names() + for (i in 0 until pairNames.length()) { + val pairId = pairNames.getString(i) ?: continue + val currencies = pairId.split("_".toRegex()).toTypedArray() + if (currencies.size != 2) continue + val currencyBase = currencies[0].toUpperCase(Locale.ENGLISH) + val currencyCounter = currencies[1].toUpperCase(Locale.ENGLISH) + pairs.add(CurrencyPairInfo(currencyBase, currencyCounter, pairId)) + } + } + + companion object { + private const val NAME = "Cryptoine" + private const val TTS_NAME = NAME + private const val URL = "https://cryptoine.com/api/1/ticker/%1\$s" + private const val URL_CURRENCY_PAIRS = "https://cryptoine.com/api/1/markets" + } +} \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Cryptonit.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Cryptonit.kt new file mode 100644 index 00000000..9a32d957 --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Cryptonit.kt @@ -0,0 +1,58 @@ +package com.aneonex.bitcoinchecker.datamodule.model.market + +import com.aneonex.bitcoinchecker.datamodule.model.CheckerInfo +import com.aneonex.bitcoinchecker.datamodule.model.CurrencyPairInfo +import com.aneonex.bitcoinchecker.datamodule.model.Market +import com.aneonex.bitcoinchecker.datamodule.model.Ticker +import com.aneonex.bitcoinchecker.datamodule.util.ParseUtils +import org.json.JSONArray +import org.json.JSONObject +import java.util.* + +class Cryptonit : Market(NAME, TTS_NAME, null) { + override fun getUrl(requestId: Int, checkerInfo: CheckerInfo): String { + return String.format(URL, checkerInfo.currencyCounterLowerCase, checkerInfo.currencyBaseLowerCase) // reversed pairs! + } + + @Throws(Exception::class) + override fun parseTickerFromJsonObject(requestId: Int, jsonObject: JSONObject, ticker: Ticker, checkerInfo: CheckerInfo) { + val rateJsonObject = jsonObject.getJSONObject("rate") + val volumeJsonObject = jsonObject.getJSONObject("volume") + ticker.bid = ParseUtils.getDoubleFromString(rateJsonObject, "bid") + ticker.ask = ParseUtils.getDoubleFromString(rateJsonObject, "ask") + if (volumeJsonObject.has(checkerInfo.currencyBase)) { + ticker.vol = ParseUtils.getDoubleFromString(volumeJsonObject, checkerInfo.currencyBase) + } + ticker.high = ParseUtils.getDoubleFromString(rateJsonObject, "high") + ticker.low = ParseUtils.getDoubleFromString(rateJsonObject, "low") + ticker.last = ParseUtils.getDoubleFromString(rateJsonObject, "last") + } + + // ==================== + // Get currency pairs + // ==================== + override fun getCurrencyPairsUrl(requestId: Int): String? { + return URL_CURRENCY_PAIRS + } + + @Throws(Exception::class) + override fun parseCurrencyPairs(requestId: Int, responseString: String, pairs: MutableList) { + val pairsJsonArray = JSONArray(responseString) + var currenciesJsonArray: JSONArray? = null + for (i in 0 until pairsJsonArray.length()) { + currenciesJsonArray = pairsJsonArray.getJSONArray(i) + if (currenciesJsonArray.length() != 2) continue + val currencyBase = currenciesJsonArray.getString(1) // reversed pairs! + val currencyCounter = currenciesJsonArray.getString(0) // reversed pairs! + if (currencyBase == null || currencyCounter == null) continue + pairs.add(CurrencyPairInfo(currencyBase.toUpperCase(Locale.US), currencyCounter.toUpperCase(Locale.US), null)) + } + } + + companion object { + private const val NAME = "Cryptonit" + private const val TTS_NAME = NAME + private const val URL = "https://cryptonit.net/apiv2/rest/public/ccorder.json?bid_currency=%1\$s&ask_currency=%2\$s&ticker" + private const val URL_CURRENCY_PAIRS = "https://cryptonit.net/apiv2/rest/public/pairs.json" + } +} \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Cryptopia.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Cryptopia.kt new file mode 100644 index 00000000..48513630 --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Cryptopia.kt @@ -0,0 +1,60 @@ +package com.aneonex.bitcoinchecker.datamodule.model.market + +import com.aneonex.bitcoinchecker.datamodule.model.CheckerInfo +import com.aneonex.bitcoinchecker.datamodule.model.CurrencyPairInfo +import com.aneonex.bitcoinchecker.datamodule.model.Market +import com.aneonex.bitcoinchecker.datamodule.model.Ticker +import org.json.JSONObject + +class Cryptopia : Market(NAME, TTS_NAME, null) { + override fun getUrl(requestId: Int, checkerInfo: CheckerInfo): String { + return String.format(URL, checkerInfo.currencyPairId) + } + + @Throws(Exception::class) + override fun parseTickerFromJsonObject(requestId: Int, jsonObject: JSONObject, ticker: Ticker, checkerInfo: CheckerInfo) { + val dataJsonObject = jsonObject.getJSONObject("Data") + ticker.bid = dataJsonObject.getDouble("BidPrice") + ticker.ask = dataJsonObject.getDouble("AskPrice") + ticker.vol = dataJsonObject.getDouble("Volume") + ticker.high = dataJsonObject.getDouble("High") + ticker.low = dataJsonObject.getDouble("Low") + ticker.last = dataJsonObject.getDouble("LastPrice") + } + + @Throws(Exception::class) + override fun parseErrorFromJsonObject(requestId: Int, jsonObject: JSONObject, checkerInfo: CheckerInfo?): String? { + return jsonObject.getString("Message") + } + + // ==================== + // Get currency pairs + // ==================== + override fun getCurrencyPairsUrl(requestId: Int): String? { + return URL_CURRENCY_PAIRS + } + + @Throws(Exception::class) + override fun parseCurrencyPairsFromJsonObject(requestId: Int, jsonObject: JSONObject, pairs: MutableList) { + val dataJsonArray = jsonObject.getJSONArray("Data") + for (i in 0 until dataJsonArray.length()) { + val pairJsonObject = dataJsonArray.getJSONObject(i) + val currencyBase = pairJsonObject.getString("Symbol") + val currencyCounter = pairJsonObject.getString("BaseSymbol") + val pairId = pairJsonObject.getString("Id") + if (currencyCounter != null && currencyCounter != null && pairId != null) { + pairs.add(CurrencyPairInfo( + currencyBase, + currencyCounter, + pairId)) + } + } + } + + companion object { + private const val NAME = "Cryptopia" + private const val TTS_NAME = "Cryptopia" + private const val URL = "https://www.cryptopia.co.nz/api/GetMarket/%1\$s" + private const val URL_CURRENCY_PAIRS = "https://www.cryptopia.co.nz/api/GetTradePairs" + } +} \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Cryptsy.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Cryptsy.kt new file mode 100644 index 00000000..eda9f9a3 --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Cryptsy.kt @@ -0,0 +1,224 @@ +package com.aneonex.bitcoinchecker.datamodule.model.market + +import com.aneonex.bitcoinchecker.datamodule.model.CheckerInfo +import com.aneonex.bitcoinchecker.datamodule.model.CurrencyPairInfo +import com.aneonex.bitcoinchecker.datamodule.model.Market +import com.aneonex.bitcoinchecker.datamodule.model.Ticker +import org.json.JSONObject +import java.util.* + +class Cryptsy : Market(NAME, TTS_NAME, null) { + companion object { + private const val NAME = "Cryptsy" + private const val TTS_NAME = NAME + private const val URL = "https://cryptsy.com/api/v2/markets/%1\$s" + private const val URL_CURRENCY_PAIRS = "https://cryptsy.com/api/v2/markets" + private val CURRENCY_PAIRS_IDS = HashMap(151) + + init { + // Kept for backward compatibility + CURRENCY_PAIRS_IDS["42_BTC"] = 141 + CURRENCY_PAIRS_IDS["ADT_LTC"] = 94 + CURRENCY_PAIRS_IDS["ADT_XPM"] = 113 + CURRENCY_PAIRS_IDS["ALF_BTC"] = 57 + CURRENCY_PAIRS_IDS["AMC_BTC"] = 43 + CURRENCY_PAIRS_IDS["ANC_BTC"] = 66 + CURRENCY_PAIRS_IDS["ANC_LTC"] = 121 + CURRENCY_PAIRS_IDS["ARG_BTC"] = 48 + CURRENCY_PAIRS_IDS["ASC_LTC"] = 111 + CURRENCY_PAIRS_IDS["ASC_XPM"] = 112 + CURRENCY_PAIRS_IDS["AUR_BTC"] = 160 + CURRENCY_PAIRS_IDS["AUR_LTC"] = 161 + CURRENCY_PAIRS_IDS["BCX_BTC"] = 142 + CURRENCY_PAIRS_IDS["BEN_BTC"] = 157 + CURRENCY_PAIRS_IDS["BET_BTC"] = 129 + CURRENCY_PAIRS_IDS["BQC_BTC"] = 10 + CURRENCY_PAIRS_IDS["BTB_BTC"] = 23 + CURRENCY_PAIRS_IDS["BTE_BTC"] = 49 + CURRENCY_PAIRS_IDS["BTG_BTC"] = 50 + CURRENCY_PAIRS_IDS["BUK_BTC"] = 102 + CURRENCY_PAIRS_IDS["CACH_BTC"] = 154 + CURRENCY_PAIRS_IDS["CAP_BTC"] = 53 + CURRENCY_PAIRS_IDS["CASH_BTC"] = 150 + CURRENCY_PAIRS_IDS["CAT_BTC"] = 136 + CURRENCY_PAIRS_IDS["CGB_BTC"] = 70 + CURRENCY_PAIRS_IDS["CGB_LTC"] = 123 + CURRENCY_PAIRS_IDS["CLR_BTC"] = 95 + CURRENCY_PAIRS_IDS["CMC_BTC"] = 74 + CURRENCY_PAIRS_IDS["CNC_BTC"] = 8 + CURRENCY_PAIRS_IDS["CNC_LTC"] = 17 + CURRENCY_PAIRS_IDS["COL_LTC"] = 109 + CURRENCY_PAIRS_IDS["COL_XPM"] = 110 + CURRENCY_PAIRS_IDS["CPR_LTC"] = 91 + CURRENCY_PAIRS_IDS["CRC_BTC"] = 58 + CURRENCY_PAIRS_IDS["CSC_BTC"] = 68 + CURRENCY_PAIRS_IDS["DBL_LTC"] = 46 + CURRENCY_PAIRS_IDS["DEM_BTC"] = 131 + CURRENCY_PAIRS_IDS["DGB_BTC"] = 167 + CURRENCY_PAIRS_IDS["DGC_BTC"] = 26 + CURRENCY_PAIRS_IDS["DGC_LTC"] = 96 + CURRENCY_PAIRS_IDS["DMD_BTC"] = 72 + CURRENCY_PAIRS_IDS["DOGE_BTC"] = 132 + CURRENCY_PAIRS_IDS["DOGE_LTC"] = 135 + CURRENCY_PAIRS_IDS["DRK_BTC"] = 155 + CURRENCY_PAIRS_IDS["DVC_BTC"] = 40 + CURRENCY_PAIRS_IDS["DVC_LTC"] = 52 + CURRENCY_PAIRS_IDS["DVC_XPM"] = 122 + CURRENCY_PAIRS_IDS["EAC_BTC"] = 139 + CURRENCY_PAIRS_IDS["ELC_BTC"] = 12 + CURRENCY_PAIRS_IDS["ELP_LTC"] = 93 + CURRENCY_PAIRS_IDS["EMD_BTC"] = 69 + CURRENCY_PAIRS_IDS["EZC_BTC"] = 47 + CURRENCY_PAIRS_IDS["EZC_LTC"] = 55 + CURRENCY_PAIRS_IDS["FFC_BTC"] = 138 + CURRENCY_PAIRS_IDS["FLAP_BTC"] = 165 + CURRENCY_PAIRS_IDS["FLO_LTC"] = 61 + CURRENCY_PAIRS_IDS["FRC_BTC"] = 39 + CURRENCY_PAIRS_IDS["FRK_BTC"] = 33 + CURRENCY_PAIRS_IDS["FST_BTC"] = 44 + CURRENCY_PAIRS_IDS["FST_LTC"] = 124 + CURRENCY_PAIRS_IDS["FTC_BTC"] = 5 + CURRENCY_PAIRS_IDS["GDC_BTC"] = 82 + CURRENCY_PAIRS_IDS["GLC_BTC"] = 76 + CURRENCY_PAIRS_IDS["GLD_BTC"] = 30 + CURRENCY_PAIRS_IDS["GLD_LTC"] = 36 + CURRENCY_PAIRS_IDS["GLX_BTC"] = 78 + CURRENCY_PAIRS_IDS["GME_LTC"] = 84 + CURRENCY_PAIRS_IDS["HBN_BTC"] = 80 + CURRENCY_PAIRS_IDS["IFC_BTC"] = 59 + CURRENCY_PAIRS_IDS["IFC_LTC"] = 60 + CURRENCY_PAIRS_IDS["IFC_XPM"] = 105 + CURRENCY_PAIRS_IDS["IXC_BTC"] = 38 + CURRENCY_PAIRS_IDS["JKC_BTC"] = 25 + CURRENCY_PAIRS_IDS["JKC_LTC"] = 35 + CURRENCY_PAIRS_IDS["KGC_BTC"] = 65 + CURRENCY_PAIRS_IDS["LEAF_BTC"] = 148 + CURRENCY_PAIRS_IDS["LK7_BTC"] = 116 + CURRENCY_PAIRS_IDS["LKY_BTC"] = 34 + CURRENCY_PAIRS_IDS["LOT_BTC"] = 137 + CURRENCY_PAIRS_IDS["LTC_BTC"] = 3 + CURRENCY_PAIRS_IDS["MAX_BTC"] = 152 + CURRENCY_PAIRS_IDS["MEC_BTC"] = 45 + CURRENCY_PAIRS_IDS["MEC_LTC"] = 100 + CURRENCY_PAIRS_IDS["MEM_LTC"] = 56 + CURRENCY_PAIRS_IDS["MEOW_BTC"] = 149 + CURRENCY_PAIRS_IDS["MINT_BTC"] = 156 + CURRENCY_PAIRS_IDS["MNC_BTC"] = 7 + CURRENCY_PAIRS_IDS["MOON_LTC"] = 145 + CURRENCY_PAIRS_IDS["MST_LTC"] = 62 + CURRENCY_PAIRS_IDS["MZC_BTC"] = 164 + CURRENCY_PAIRS_IDS["NAN_BTC"] = 64 + CURRENCY_PAIRS_IDS["NBL_BTC"] = 32 + CURRENCY_PAIRS_IDS["NEC_BTC"] = 90 + CURRENCY_PAIRS_IDS["NET_BTC"] = 134 + CURRENCY_PAIRS_IDS["NET_LTC"] = 108 + CURRENCY_PAIRS_IDS["NET_XPM"] = 104 + CURRENCY_PAIRS_IDS["NMC_BTC"] = 29 + CURRENCY_PAIRS_IDS["NRB_BTC"] = 54 + CURRENCY_PAIRS_IDS["NVC_BTC"] = 13 + CURRENCY_PAIRS_IDS["NXT_BTC"] = 159 + CURRENCY_PAIRS_IDS["NXT_LTC"] = 162 + CURRENCY_PAIRS_IDS["ORB_BTC"] = 75 + CURRENCY_PAIRS_IDS["OSC_BTC"] = 144 + CURRENCY_PAIRS_IDS["PHS_BTC"] = 86 + CURRENCY_PAIRS_IDS["POINTS_BTC"] = 120 + CURRENCY_PAIRS_IDS["PPC_BTC"] = 28 + CURRENCY_PAIRS_IDS["PPC_LTC"] = 125 + CURRENCY_PAIRS_IDS["PTS_BTC"] = 119 + CURRENCY_PAIRS_IDS["PXC_BTC"] = 31 + CURRENCY_PAIRS_IDS["PXC_LTC"] = 101 + CURRENCY_PAIRS_IDS["PYC_BTC"] = 92 + CURRENCY_PAIRS_IDS["QRK_BTC"] = 71 + CURRENCY_PAIRS_IDS["QRK_LTC"] = 126 + CURRENCY_PAIRS_IDS["RDD_BTC"] = 169 + CURRENCY_PAIRS_IDS["RED_LTC"] = 87 + CURRENCY_PAIRS_IDS["RPC_BTC"] = 143 + CURRENCY_PAIRS_IDS["RYC_BTC"] = 9 + CURRENCY_PAIRS_IDS["RYC_LTC"] = 37 + CURRENCY_PAIRS_IDS["SAT_BTC"] = 168 + CURRENCY_PAIRS_IDS["SBC_BTC"] = 51 + CURRENCY_PAIRS_IDS["SBC_LTC"] = 128 + CURRENCY_PAIRS_IDS["SMC_BTC"] = 158 + CURRENCY_PAIRS_IDS["SPT_BTC"] = 81 + CURRENCY_PAIRS_IDS["SRC_BTC"] = 88 + CURRENCY_PAIRS_IDS["STR_BTC"] = 83 + CURRENCY_PAIRS_IDS["SXC_BTC"] = 153 + CURRENCY_PAIRS_IDS["SXC_LTC"] = 98 + CURRENCY_PAIRS_IDS["TAG_BTC"] = 117 + CURRENCY_PAIRS_IDS["TAK_BTC"] = 166 + CURRENCY_PAIRS_IDS["TEK_BTC"] = 114 + CURRENCY_PAIRS_IDS["TGC_BTC"] = 130 + CURRENCY_PAIRS_IDS["TIPS_LTC"] = 147 + CURRENCY_PAIRS_IDS["TIX_LTC"] = 107 + CURRENCY_PAIRS_IDS["TIX_XPM"] = 103 + CURRENCY_PAIRS_IDS["TRC_BTC"] = 27 + CURRENCY_PAIRS_IDS["UNO_BTC"] = 133 + CURRENCY_PAIRS_IDS["UTC_BTC"] = 163 + CURRENCY_PAIRS_IDS["VTC_BTC"] = 151 + CURRENCY_PAIRS_IDS["WDC_BTC"] = 14 + CURRENCY_PAIRS_IDS["WDC_LTC"] = 21 + CURRENCY_PAIRS_IDS["XJO_BTC"] = 115 + CURRENCY_PAIRS_IDS["XNC_LTC"] = 67 + CURRENCY_PAIRS_IDS["XPM_BTC"] = 63 + CURRENCY_PAIRS_IDS["XPM_LTC"] = 106 + CURRENCY_PAIRS_IDS["YAC_BTC"] = 11 + CURRENCY_PAIRS_IDS["YAC_LTC"] = 22 + CURRENCY_PAIRS_IDS["YBC_BTC"] = 73 + CURRENCY_PAIRS_IDS["ZCC_BTC"] = 140 + CURRENCY_PAIRS_IDS["ZED_BTC"] = 170 + CURRENCY_PAIRS_IDS["ZET_BTC"] = 85 + CURRENCY_PAIRS_IDS["ZET_LTC"] = 127 + } + } + + override fun getUrl(requestId: Int, checkerInfo: CheckerInfo): String { + if (checkerInfo.currencyPairId == null) { + val pairString = String.format("%1\$s_%2\$s", checkerInfo.currencyBase, checkerInfo.currencyCounter) + if (CURRENCY_PAIRS_IDS.containsKey(pairString)) { + return String.format(URL, CURRENCY_PAIRS_IDS[pairString].toString()) + } + } + return String.format(URL, checkerInfo.currencyPairId) + } + + @Throws(Exception::class) + override fun parseTickerFromJsonObject(requestId: Int, jsonObject: JSONObject, ticker: Ticker, checkerInfo: CheckerInfo) { + val dataJsonObject = jsonObject.getJSONObject("data") + val daySummaryObject = dataJsonObject.getJSONObject("24hr") + + // ticker.vol = daySummaryObject.getDouble("volume"); TODO enable later when there will be any documentation of real data to test on + ticker.high = daySummaryObject.getDouble("price_high") + ticker.low = daySummaryObject.getDouble("price_low") + ticker.last = dataJsonObject.getJSONObject("last_trade").getDouble("price") + } + + @Throws(Exception::class) + override fun parseError(requestId: Int, responseString: String, checkerInfo: CheckerInfo): String? { + return if (checkerInfo.currencyPairId == null) { + "Perform sync and re-add this Checker" + } else super.parseError(requestId, responseString, checkerInfo) + } + + // ==================== + // Get currency pairs + // ==================== + override fun getCurrencyPairsUrl(requestId: Int): String? { + return URL_CURRENCY_PAIRS + } + + @Throws(Exception::class) + override fun parseCurrencyPairsFromJsonObject(requestId: Int, jsonObject: JSONObject, pairs: MutableList) { + val dataJsonArray = jsonObject.getJSONArray("data") + for (i in 0 until dataJsonArray.length()) { + val marketObject = dataJsonArray.getJSONObject(i) + val currencyPair = marketObject.getString("label") ?: continue + val currencies: Array = currencyPair.split("/".toRegex()).toTypedArray() + if (currencies.size != 2 || currencies[0] == null || currencies[1] == null) continue + pairs.add(CurrencyPairInfo( + currencies[0], + currencies[1], + marketObject.getString("id") + )) + } + } +} \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Dashcurex.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Dashcurex.kt new file mode 100644 index 00000000..d7b14a17 --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Dashcurex.kt @@ -0,0 +1,47 @@ +package com.aneonex.bitcoinchecker.datamodule.model.market + +import com.aneonex.bitcoinchecker.datamodule.model.CheckerInfo +import com.aneonex.bitcoinchecker.datamodule.model.Market +import com.aneonex.bitcoinchecker.datamodule.model.Ticker +import com.aneonex.bitcoinchecker.datamodule.model.currency.Currency +import com.aneonex.bitcoinchecker.datamodule.model.currency.CurrencyPairsMap +import com.aneonex.bitcoinchecker.datamodule.model.currency.VirtualCurrency +import org.json.JSONObject + +class Dashcurex : Market(NAME, TTS_NAME, CURRENCY_PAIRS) { + companion object { + private const val NAME = "Dashcurex" + private const val TTS_NAME = NAME + private const val URL = "https://dashcurex.com/api/%1\$s/ticker.json" + private val CURRENCY_PAIRS: CurrencyPairsMap = CurrencyPairsMap() + + init { + CURRENCY_PAIRS[VirtualCurrency.DASH] = arrayOf( + Currency.PLN, + Currency.USD + ) + } + } + + override fun getUrl(requestId: Int, checkerInfo: CheckerInfo): String { + return String.format(URL, checkerInfo.currencyCounterLowerCase) + } + + @Throws(Exception::class) + override fun parseTickerFromJsonObject(requestId: Int, jsonObject: JSONObject, ticker: Ticker, checkerInfo: CheckerInfo) { + ticker.bid = parsePrice(jsonObject.getDouble("best_ask")) + ticker.ask = parsePrice(jsonObject.getDouble("best_bid")) + ticker.vol = parseBTC(jsonObject.getDouble("total_volume")) + ticker.high = parsePrice(jsonObject.getDouble("highest_tx_price")) + ticker.low = parsePrice(jsonObject.getDouble("lowest_tx_price")) + ticker.last = parsePrice(jsonObject.getDouble("last_tx_price")) + } + + private fun parsePrice(price: Double): Double { + return price / 10000 + } + + private fun parseBTC(satoshi: Double): Double { + return satoshi / 100000000 + } +} \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/DolarBlueNet.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/DolarBlueNet.kt new file mode 100644 index 00000000..e4d8e7de --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/DolarBlueNet.kt @@ -0,0 +1,34 @@ +package com.aneonex.bitcoinchecker.datamodule.model.market + +import com.aneonex.bitcoinchecker.datamodule.model.CheckerInfo +import com.aneonex.bitcoinchecker.datamodule.model.Market +import com.aneonex.bitcoinchecker.datamodule.model.Ticker +import com.aneonex.bitcoinchecker.datamodule.model.currency.Currency +import com.aneonex.bitcoinchecker.datamodule.model.currency.CurrencyPairsMap +import org.json.JSONObject + +class DolarBlueNet : Market(NAME, TTS_NAME, CURRENCY_PAIRS) { + companion object { + private const val NAME = "DolarBlue.net" + private const val TTS_NAME = "Dolar Blue" + private const val URL = "http://dolar.bitplanet.info/api.php" + private val CURRENCY_PAIRS: CurrencyPairsMap = CurrencyPairsMap() + + init { + CURRENCY_PAIRS[Currency.USD] = arrayOf( + Currency.ARS + ) + } + } + + override fun getUrl(requestId: Int, checkerInfo: CheckerInfo): String { + return URL + } + + @Throws(Exception::class) + override fun parseTickerFromJsonObject(requestId: Int, jsonObject: JSONObject, ticker: Ticker, checkerInfo: CheckerInfo) { + ticker.ask = jsonObject.getDouble("venta") + ticker.bid = jsonObject.getDouble("compra") + ticker.last = ticker.ask + } +} \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/ETHEXIndia.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/ETHEXIndia.kt new file mode 100644 index 00000000..25a2c5ec --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/ETHEXIndia.kt @@ -0,0 +1,39 @@ +package com.aneonex.bitcoinchecker.datamodule.model.market + +import com.aneonex.bitcoinchecker.datamodule.model.CheckerInfo +import com.aneonex.bitcoinchecker.datamodule.model.Market +import com.aneonex.bitcoinchecker.datamodule.model.Ticker +import com.aneonex.bitcoinchecker.datamodule.model.currency.Currency +import com.aneonex.bitcoinchecker.datamodule.model.currency.CurrencyPairsMap +import com.aneonex.bitcoinchecker.datamodule.model.currency.VirtualCurrency +import org.json.JSONObject + +class ETHEXIndia : Market(NAME, TTS_NAME, CURRENCY_PAIRS) { + companion object { + private const val NAME = "ETHEX India" + private const val TTS_NAME = NAME + private const val URL = "https://api.ethexindia.com/ticker/" + private val CURRENCY_PAIRS: CurrencyPairsMap = CurrencyPairsMap() + + init { + CURRENCY_PAIRS[VirtualCurrency.ETH] = arrayOf( + Currency.INR + ) + } + } + + override fun getUrl(requestId: Int, checkerInfo: CheckerInfo): String { + return URL + } + + @Throws(Exception::class) + override fun parseTickerFromJsonObject(requestId: Int, jsonObject: JSONObject, ticker: Ticker, checkerInfo: CheckerInfo) { + ticker.bid = jsonObject.getDouble("bid") + ticker.ask = jsonObject.getDouble("ask") + ticker.vol = jsonObject.getDouble("current_volume") + ticker.high = jsonObject.getDouble("high") + ticker.low = jsonObject.getDouble("low") + ticker.last = jsonObject.getDouble("last_traded_price") + ticker.timestamp = jsonObject.getLong("last_traded_time") + } +} \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Exmo.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Exmo.kt new file mode 100644 index 00000000..eb0c04f4 --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Exmo.kt @@ -0,0 +1,49 @@ +package com.aneonex.bitcoinchecker.datamodule.model.market + +import com.aneonex.bitcoinchecker.datamodule.model.CheckerInfo +import com.aneonex.bitcoinchecker.datamodule.model.CurrencyPairInfo +import com.aneonex.bitcoinchecker.datamodule.model.Market +import com.aneonex.bitcoinchecker.datamodule.model.Ticker +import org.json.JSONObject + +class Exmo : Market(NAME, TTS_NAME, null) { + override fun getUrl(requestId: Int, checkerInfo: CheckerInfo): String { + return URL + } + + @Throws(Exception::class) + override fun parseTickerFromJsonObject(requestId: Int, jsonObject: JSONObject, ticker: Ticker, checkerInfo: CheckerInfo) { + val pairJsonObject = jsonObject.getJSONObject(checkerInfo.currencyBase + "_" + checkerInfo.currencyCounter) + ticker.bid = pairJsonObject.getDouble("buy_price") + ticker.ask = pairJsonObject.getDouble("sell_price") + ticker.vol = pairJsonObject.getDouble("vol") + ticker.high = pairJsonObject.getDouble("high") + ticker.low = pairJsonObject.getDouble("low") + ticker.last = pairJsonObject.getDouble("last_trade") + } + + // ==================== + // Get currency pairs + // ==================== + override fun getCurrencyPairsUrl(requestId: Int): String? { + return URL_CURRENCY_PAIRS + } + + @Throws(Exception::class) + override fun parseCurrencyPairsFromJsonObject(requestId: Int, jsonObject: JSONObject, pairs: MutableList) { + val pairIds = jsonObject.names() + for (i in 0 until pairIds.length()) { + val pairId = pairIds.getString(i) ?: continue + val currencies = pairId.split("_".toRegex()).toTypedArray() + if (currencies.size != 2) continue + pairs.add(CurrencyPairInfo(currencies[0], currencies[1], pairId)) + } + } + + companion object { + private const val NAME = "Exmo" + private const val TTS_NAME = NAME + private const val URL = "https://api.exmo.com/v1/ticker/" + private const val URL_CURRENCY_PAIRS = "https://api.exmo.com/v1/pair_settings/" + } +} \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Fxbtc.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Fxbtc.kt new file mode 100644 index 00000000..44f026ed --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Fxbtc.kt @@ -0,0 +1,43 @@ +package com.aneonex.bitcoinchecker.datamodule.model.market + +import com.aneonex.bitcoinchecker.datamodule.model.CheckerInfo +import com.aneonex.bitcoinchecker.datamodule.model.Market +import com.aneonex.bitcoinchecker.datamodule.model.Ticker +import com.aneonex.bitcoinchecker.datamodule.model.currency.Currency +import com.aneonex.bitcoinchecker.datamodule.model.currency.CurrencyPairsMap +import com.aneonex.bitcoinchecker.datamodule.model.currency.VirtualCurrency +import org.json.JSONObject + +class Fxbtc : Market(NAME, TTS_NAME, CURRENCY_PAIRS) { + companion object { + private const val NAME = "FxBtc" + private const val TTS_NAME = NAME + private const val URL = "https://www.fxbtc.com/jport?op=query&type=ticker&symbol=%1\$s_%2\$s" + private val CURRENCY_PAIRS: CurrencyPairsMap = CurrencyPairsMap() + + init { + CURRENCY_PAIRS[VirtualCurrency.BTC] = arrayOf( + Currency.CNY + ) + CURRENCY_PAIRS[VirtualCurrency.LTC] = arrayOf( + Currency.CNY, + VirtualCurrency.BTC + ) + } + } + + override fun getUrl(requestId: Int, checkerInfo: CheckerInfo): String { + return String.format(URL, checkerInfo.currencyBaseLowerCase, checkerInfo.currencyCounterLowerCase) + } + + @Throws(Exception::class) + override fun parseTickerFromJsonObject(requestId: Int, jsonObject: JSONObject, ticker: Ticker, checkerInfo: CheckerInfo) { + val tickerObject = jsonObject.getJSONObject("ticker") + ticker.bid = tickerObject.getDouble("bid") + ticker.ask = tickerObject.getDouble("ask") + ticker.vol = tickerObject.getDouble("vol") + ticker.high = tickerObject.getDouble("high") + ticker.low = tickerObject.getDouble("low") + ticker.last = tickerObject.getDouble("last_rate") + } +} \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/FybSE.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/FybSE.kt new file mode 100644 index 00000000..97752f4f --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/FybSE.kt @@ -0,0 +1,35 @@ +package com.aneonex.bitcoinchecker.datamodule.model.market + +import com.aneonex.bitcoinchecker.datamodule.model.CheckerInfo +import com.aneonex.bitcoinchecker.datamodule.model.Market +import com.aneonex.bitcoinchecker.datamodule.model.Ticker +import com.aneonex.bitcoinchecker.datamodule.model.currency.Currency +import com.aneonex.bitcoinchecker.datamodule.model.currency.CurrencyPairsMap +import com.aneonex.bitcoinchecker.datamodule.model.currency.VirtualCurrency +import org.json.JSONObject + +class FybSE : Market(NAME, TTS_NAME, CURRENCY_PAIRS) { + companion object { + private const val NAME = "FYB-SE" + private const val TTS_NAME = "Fyb SE" + private const val URL = "https://www.fybse.se/api/%1\$s/ticker.json" + private val CURRENCY_PAIRS: CurrencyPairsMap = CurrencyPairsMap() + + init { + CURRENCY_PAIRS[VirtualCurrency.BTC] = arrayOf( + Currency.SEK + ) + } + } + + override fun getUrl(requestId: Int, checkerInfo: CheckerInfo): String { + return String.format(URL, checkerInfo.currencyCounter) + } + + @Throws(Exception::class) + override fun parseTickerFromJsonObject(requestId: Int, jsonObject: JSONObject, ticker: Ticker, checkerInfo: CheckerInfo) { + ticker.bid = jsonObject.getDouble("bid") + ticker.ask = jsonObject.getDouble("ask") + ticker.last = ticker.ask + } +} \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/FybSG.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/FybSG.kt new file mode 100644 index 00000000..a2bea3d1 --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/FybSG.kt @@ -0,0 +1,35 @@ +package com.aneonex.bitcoinchecker.datamodule.model.market + +import com.aneonex.bitcoinchecker.datamodule.model.CheckerInfo +import com.aneonex.bitcoinchecker.datamodule.model.Market +import com.aneonex.bitcoinchecker.datamodule.model.Ticker +import com.aneonex.bitcoinchecker.datamodule.model.currency.Currency +import com.aneonex.bitcoinchecker.datamodule.model.currency.CurrencyPairsMap +import com.aneonex.bitcoinchecker.datamodule.model.currency.VirtualCurrency +import org.json.JSONObject + +class FybSG : Market(NAME, TTS_NAME, CURRENCY_PAIRS) { + companion object { + private const val NAME = "FYB-SG" + private const val TTS_NAME = "Fyb SG" + private const val URL = "https://www.fybsg.com/api/%1\$s/ticker.json" + private val CURRENCY_PAIRS: CurrencyPairsMap = CurrencyPairsMap() + + init { + CURRENCY_PAIRS[VirtualCurrency.BTC] = arrayOf( + Currency.SGD + ) + } + } + + override fun getUrl(requestId: Int, checkerInfo: CheckerInfo): String { + return String.format(URL, checkerInfo.currencyCounter) + } + + @Throws(Exception::class) + override fun parseTickerFromJsonObject(requestId: Int, jsonObject: JSONObject, ticker: Ticker, checkerInfo: CheckerInfo) { + ticker.bid = jsonObject.getDouble("bid") + ticker.ask = jsonObject.getDouble("ask") + ticker.last = ticker.ask + } +} \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/GateCoin.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/GateCoin.kt new file mode 100644 index 00000000..da06c1ae --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/GateCoin.kt @@ -0,0 +1,63 @@ +package com.aneonex.bitcoinchecker.datamodule.model.market + +import com.aneonex.bitcoinchecker.datamodule.model.CheckerInfo +import com.aneonex.bitcoinchecker.datamodule.model.CurrencyPairInfo +import com.aneonex.bitcoinchecker.datamodule.model.Market +import com.aneonex.bitcoinchecker.datamodule.model.Ticker +import org.json.JSONObject + +class GateCoin : Market(NAME, TTS_NAME, null) { + override fun getUrl(requestId: Int, checkerInfo: CheckerInfo): String { + return URL + } + + @Throws(Exception::class) + override fun parseTickerFromJsonObject(requestId: Int, jsonObject: JSONObject, ticker: Ticker, checkerInfo: CheckerInfo) { + val pairNames = jsonObject.getJSONArray("tickers") //returned JSON text is an ARRAY of JSONObjects + val userCurrencyPairChoice = checkerInfo.currencyBase + checkerInfo.currencyCounter + //each JSONObject in the Array has a currency pair and its corresponding ticker details + for (i in 0 until pairNames.length()) { + val tickerDetails = pairNames.getJSONObject(i) + val currentPairId = tickerDetails.getString("currencyPair") + if (currentPairId == userCurrencyPairChoice) { + ticker.bid = tickerDetails.getDouble("bid") + ticker.ask = tickerDetails.getDouble("ask") + ticker.vol = tickerDetails.getDouble("volume") + ticker.high = tickerDetails.getDouble("high") + ticker.low = tickerDetails.getDouble("low") + ticker.last = tickerDetails.getDouble("last") + ticker.timestamp = tickerDetails.getLong("createDateTime") + break + } + } + } + + // ==================== + // Get currency pairs + // ==================== + override fun getCurrencyPairsUrl(requestId: Int): String? { + return URL + } + + @Throws(Exception::class) + override fun parseCurrencyPairsFromJsonObject(requestId: Int, jsonObject: JSONObject, pairs: MutableList) { + val pairNames = jsonObject.getJSONArray("tickers") //returned JSON text is an ARRAY of JSONObjects + for (i in 0 until pairNames.length()) { + //each JSONObject in the Array has a currency pair and its corresponding ticker details + val pairId = pairNames.getJSONObject(i).getString("currencyPair") ?: continue + //split by index - use char positions (start, end+1) as index + val baseCurrency = pairId.substring(0, 3) //base currency + val counterCurrency = pairId.substring(3, 6) //counter currency + + if(baseCurrency.isEmpty() || counterCurrency.isEmpty()) continue + + pairs.add(CurrencyPairInfo(baseCurrency, counterCurrency, pairId)) + } + } + + companion object { + private const val NAME = "GateCoin" + private const val TTS_NAME = "Gate Coin" + private const val URL = "https://api.gatecoin.com/Public/LiveTickers" + } +} \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Gemini.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Gemini.kt new file mode 100644 index 00000000..5756468e --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Gemini.kt @@ -0,0 +1,59 @@ +package com.aneonex.bitcoinchecker.datamodule.model.market + +import com.aneonex.bitcoinchecker.datamodule.model.CheckerInfo +import com.aneonex.bitcoinchecker.datamodule.model.Market +import com.aneonex.bitcoinchecker.datamodule.model.Ticker +import com.aneonex.bitcoinchecker.datamodule.model.currency.Currency +import com.aneonex.bitcoinchecker.datamodule.model.currency.CurrencyPairsMap +import com.aneonex.bitcoinchecker.datamodule.model.currency.VirtualCurrency +import org.json.JSONObject + +class Gemini : Market(NAME, TTS_NAME, CURRENCY_PAIRS) { + companion object { + private const val NAME = "Gemini" + private const val TTS_NAME = "Gemini" + private const val URL = "https://api.gemini.com/v1/book/%1\$s%2\$s?limit_asks=1&limit_bids=1" + private val CURRENCY_PAIRS: CurrencyPairsMap = CurrencyPairsMap() + + // Gemini allows dynamic symbol retrieval but returns it in format: [ "btcusd" ] + // This doesn't provide an easy way to programmatically split the currency + // So just define them + init { + CURRENCY_PAIRS[VirtualCurrency.BTC] = arrayOf( + Currency.USD + ) + CURRENCY_PAIRS[VirtualCurrency.ETH] = arrayOf( + VirtualCurrency.BTC, + Currency.USD + ) + } + } + + override fun getUrl(requestId: Int, checkerInfo: CheckerInfo): String { + return String.format(URL, checkerInfo.currencyBase, checkerInfo.currencyCounter) + } + + @Throws(Exception::class) + override fun parseTickerFromJsonObject(requestId: Int, jsonObject: JSONObject, ticker: Ticker, checkerInfo: CheckerInfo) { + //Gemini isn't a traditional tracker, rather it seems to return the X last bids and asks + //We could do something like take the average of the last Y prices + //But I will just take the average of the last bid and asking price + val bidsArray = jsonObject.getJSONArray("bids") + if (bidsArray != null && bidsArray.length() > 0) { + ticker.bid = bidsArray.getJSONObject(0).getDouble("price") + } + val asksArray = jsonObject.getJSONArray("asks") + if (asksArray != null && asksArray.length() > 0) { + ticker.ask = asksArray.getJSONObject(0).getDouble("price") + } + if (ticker.bid != Ticker.NO_DATA.toDouble() && ticker.ask != Ticker.NO_DATA.toDouble()) { + ticker.last = (ticker.bid + ticker.ask) / 2.0 + } else if (ticker.bid != Ticker.NO_DATA.toDouble()) { + ticker.last = ticker.bid + } else if (ticker.ask != Ticker.NO_DATA.toDouble()) { + ticker.last = ticker.ask + } else { + ticker.last = 0.0 + } + } +} \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/HitBtc.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/HitBtc.kt new file mode 100644 index 00000000..ca446827 --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/HitBtc.kt @@ -0,0 +1,51 @@ +package com.aneonex.bitcoinchecker.datamodule.model.market + +import com.aneonex.bitcoinchecker.datamodule.model.CheckerInfo +import com.aneonex.bitcoinchecker.datamodule.model.CurrencyPairInfo +import com.aneonex.bitcoinchecker.datamodule.model.Market +import com.aneonex.bitcoinchecker.datamodule.model.Ticker +import com.aneonex.bitcoinchecker.datamodule.util.ParseUtils +import org.json.JSONObject + +class HitBtc : Market(NAME, TTS_NAME, null) { + override fun getUrl(requestId: Int, checkerInfo: CheckerInfo): String { + return String.format(URL, checkerInfo.currencyPairId) + } + + @Throws(Exception::class) + override fun parseTickerFromJsonObject(requestId: Int, jsonObject: JSONObject, ticker: Ticker, checkerInfo: CheckerInfo) { + ticker.bid = ParseUtils.getDoubleFromString(jsonObject, "bid") + ticker.ask = ParseUtils.getDoubleFromString(jsonObject, "ask") + ticker.vol = ParseUtils.getDoubleFromString(jsonObject, "volume") + ticker.high = ParseUtils.getDoubleFromString(jsonObject, "high") + ticker.low = ParseUtils.getDoubleFromString(jsonObject, "low") + ticker.last = ParseUtils.getDoubleFromString(jsonObject, "last") + } + + // ==================== + // Get currency pairs + // ==================== + override fun getCurrencyPairsUrl(requestId: Int): String? { + return URL_CURRENCY_PAIRS + } + + @Throws(Exception::class) + override fun parseCurrencyPairsFromJsonObject(requestId: Int, jsonObject: JSONObject, pairs: MutableList) { + val symbolsJsonArray = jsonObject.getJSONArray("symbols") + for (i in 0 until symbolsJsonArray.length()) { + val pairJsonObject = symbolsJsonArray.getJSONObject(i) + val currencyBase = pairJsonObject.getString("commodity") + val currencyCounter = pairJsonObject.getString("currency") + val currencyPairId = pairJsonObject.getString("symbol") + if (currencyBase == null || currencyCounter == null || currencyPairId == null) continue + pairs.add(CurrencyPairInfo(currencyBase, currencyCounter, currencyPairId)) + } + } + + companion object { + private const val NAME = "HitBTC" + private const val TTS_NAME = "Hit BTC" + private const val URL = "https://api.hitbtc.com/api/1/public/%1\$s/ticker" + private const val URL_CURRENCY_PAIRS = "https://api.hitbtc.com/api/1/public/symbols" + } +} \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Huobi.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Huobi.kt new file mode 100644 index 00000000..d8b6c175 --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Huobi.kt @@ -0,0 +1,50 @@ +package com.aneonex.bitcoinchecker.datamodule.model.market + +import com.aneonex.bitcoinchecker.datamodule.model.CheckerInfo +import com.aneonex.bitcoinchecker.datamodule.model.CurrencyPairInfo +import com.aneonex.bitcoinchecker.datamodule.model.Market +import com.aneonex.bitcoinchecker.datamodule.model.Ticker +import org.json.JSONObject +import java.util.* + +class Huobi : Market(NAME, TTS_NAME, null) { + override fun getUrl(requestId: Int, checkerInfo: CheckerInfo): String { + return String.format(URL, checkerInfo.currencyBaseLowerCase, checkerInfo.currencyCounterLowerCase) + } + + @Throws(Exception::class) + override fun parseTickerFromJsonObject(requestId: Int, jsonObject: JSONObject, ticker: Ticker, checkerInfo: CheckerInfo) { + val tickerJsonObject = jsonObject.getJSONObject("tick") + ticker.bid = tickerJsonObject.getJSONArray("bid").getDouble(0) + ticker.ask = tickerJsonObject.getJSONArray("ask").getDouble(0) + ticker.vol = tickerJsonObject.getDouble("vol") + ticker.high = tickerJsonObject.getDouble("high") + ticker.low = tickerJsonObject.getDouble("low") + ticker.last = tickerJsonObject.getDouble("close") + } + + override fun getCurrencyPairsUrl(requestId: Int): String? { + return URL_CURRENCY_PAIRS + } + + @Throws(Exception::class) + override fun parseCurrencyPairsFromJsonObject(requestId: Int, jsonObject: JSONObject, pairs: MutableList) { + if ("ok".equals(jsonObject.getString("status"), ignoreCase = true)) { + val data = jsonObject.getJSONArray("data") + for (i in 0 until data.length()) { + val base = data.getJSONObject(i).getString("base-currency").toUpperCase(Locale.US) + val counter = data.getJSONObject(i).getString("quote-currency").toUpperCase(Locale.US) + pairs.add(CurrencyPairInfo(base, counter, null)) + } + } else { + throw Exception("Parse currency pairs error.") + } + } + + companion object { + private const val NAME = "Huobi" + private const val TTS_NAME = NAME + private const val URL = "https://api.huobi.pro/market/detail/merged?symbol=%s%s" + private const val URL_CURRENCY_PAIRS = "https://api.huobi.pro/v1/common/symbols" + } +} \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Igot.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Igot.kt new file mode 100644 index 00000000..600f99a6 --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Igot.kt @@ -0,0 +1,51 @@ +package com.aneonex.bitcoinchecker.datamodule.model.market + +import com.aneonex.bitcoinchecker.datamodule.model.CheckerInfo +import com.aneonex.bitcoinchecker.datamodule.model.CurrencyPairInfo +import com.aneonex.bitcoinchecker.datamodule.model.Market +import com.aneonex.bitcoinchecker.datamodule.model.Ticker +import com.aneonex.bitcoinchecker.datamodule.model.currency.VirtualCurrency +import org.json.JSONObject +import java.util.* + +class Igot : Market(NAME, TTS_NAME, null) { + override fun getUrl(requestId: Int, checkerInfo: CheckerInfo): String { + return URL + } + + @Throws(Exception::class) + override fun parseTickerFromJsonObject(requestId: Int, jsonObject: JSONObject, ticker: Ticker, checkerInfo: CheckerInfo) { + val pairJsonObject = jsonObject.getJSONObject(checkerInfo.currencyPairId) + ticker.high = pairJsonObject.getDouble("highest_today") + ticker.low = pairJsonObject.getDouble("lowest_today") + ticker.last = pairJsonObject.getDouble("current_rate") + } + + // ==================== + // Get currency pairs + // ==================== + override fun getCurrencyPairsUrl(requestId: Int): String? { + return URL_CURRENCY_PAIRS + } + + @Throws(Exception::class) + override fun parseCurrencyPairsFromJsonObject(requestId: Int, jsonObject: JSONObject, pairs: MutableList) { + val pairsJsonArray = jsonObject.names() + for (i in 0 until pairsJsonArray.length()) { + val currencyCounter = pairsJsonArray.getString(i) + if (currencyCounter != null) { + pairs.add(CurrencyPairInfo( + VirtualCurrency.BTC, + currencyCounter.toUpperCase(Locale.ENGLISH), + currencyCounter)) + } + } + } + + companion object { + private const val NAME = "igot" + private const val TTS_NAME = "igot" + private const val URL = "https://www.igot.com/api/v1/stats/buy" + private const val URL_CURRENCY_PAIRS = URL + } +} \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/ItBit.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/ItBit.kt new file mode 100644 index 00000000..5b0f1948 --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/ItBit.kt @@ -0,0 +1,49 @@ +package com.aneonex.bitcoinchecker.datamodule.model.market + +import com.aneonex.bitcoinchecker.datamodule.model.CheckerInfo +import com.aneonex.bitcoinchecker.datamodule.model.Market +import com.aneonex.bitcoinchecker.datamodule.model.Ticker +import com.aneonex.bitcoinchecker.datamodule.model.currency.Currency +import com.aneonex.bitcoinchecker.datamodule.model.currency.CurrencyPairsMap +import com.aneonex.bitcoinchecker.datamodule.model.currency.VirtualCurrency +import org.json.JSONObject + +class ItBit : Market(NAME, TTS_NAME, CURRENCY_PAIRS) { + companion object { + private const val NAME = "itBit" + private const val TTS_NAME = "It Bit" + private const val URL = "https://api.itbit.com/v1/markets/%1\$s%2\$s/ticker" + private val CURRENCY_PAIRS: CurrencyPairsMap = CurrencyPairsMap() + + init { + CURRENCY_PAIRS[VirtualCurrency.BTC] = arrayOf( + Currency.USD, + Currency.SGD, + Currency.EUR + ) + } + } + + private fun fixCurrency(currency: String?): String? { + return if (VirtualCurrency.BTC == currency) VirtualCurrency.XBT else currency + } + + override fun getUrl(requestId: Int, checkerInfo: CheckerInfo): String { + return String.format(URL, fixCurrency(checkerInfo.currencyBase), checkerInfo.currencyCounter) + } + + @Throws(Exception::class) + override fun parseTickerFromJsonObject(requestId: Int, jsonObject: JSONObject, ticker: Ticker, checkerInfo: CheckerInfo) { + ticker.bid = jsonObject.getDouble("bid") + ticker.ask = jsonObject.getDouble("ask") + ticker.vol = jsonObject.getDouble("volume24h") + ticker.high = jsonObject.getDouble("high24h") + ticker.low = jsonObject.getDouble("low24h") + ticker.last = jsonObject.getDouble("lastPrice") + } + + @Throws(Exception::class) + override fun parseErrorFromJsonObject(requestId: Int, jsonObject: JSONObject, checkerInfo: CheckerInfo?): String? { + return jsonObject.getString("message") // not working? + } +} \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Justcoin.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Justcoin.kt new file mode 100644 index 00000000..40f0bc13 --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Justcoin.kt @@ -0,0 +1,66 @@ +package com.aneonex.bitcoinchecker.datamodule.model.market + +import com.aneonex.bitcoinchecker.datamodule.model.CheckerInfo +import com.aneonex.bitcoinchecker.datamodule.model.Market +import com.aneonex.bitcoinchecker.datamodule.model.Ticker +import com.aneonex.bitcoinchecker.datamodule.model.currency.Currency +import com.aneonex.bitcoinchecker.datamodule.model.currency.CurrencyPairsMap +import com.aneonex.bitcoinchecker.datamodule.model.currency.VirtualCurrency +import org.json.JSONObject + +class Justcoin : Market(NAME, TTS_NAME, CURRENCY_PAIRS) { + companion object { + private const val NAME = "Justcoin" + private const val TTS_NAME = "Just coin" + private const val URL = "https://justcoin.com/api/2/%1\$s%2\$s/money/ticker" + private val CURRENCY_PAIRS: CurrencyPairsMap = CurrencyPairsMap() + + init { + CURRENCY_PAIRS[VirtualCurrency.BTC] = arrayOf( + Currency.USD, + Currency.EUR, + Currency.GBP, + Currency.HKD, + Currency.CHF, + Currency.AUD, + Currency.CAD, + Currency.NZD, + Currency.SGD, + Currency.JPY + ) + CURRENCY_PAIRS[VirtualCurrency.LTC] = arrayOf( + VirtualCurrency.BTC + ) + CURRENCY_PAIRS[VirtualCurrency.DOGE] = arrayOf( + VirtualCurrency.BTC + ) + CURRENCY_PAIRS[VirtualCurrency.STR] = arrayOf( + VirtualCurrency.BTC + ) + CURRENCY_PAIRS[VirtualCurrency.XRP] = arrayOf( + VirtualCurrency.BTC + ) + } + } + + override fun getUrl(requestId: Int, checkerInfo: CheckerInfo): String { + return String.format(URL, checkerInfo.currencyBase, checkerInfo.currencyCounter) + } + + @Throws(Exception::class) + override fun parseTickerFromJsonObject(requestId: Int, jsonObject: JSONObject, ticker: Ticker, checkerInfo: CheckerInfo) { + val dataObject = jsonObject.getJSONObject("data") + ticker.bid = getPriceValueFromObject(dataObject, "buy") + ticker.ask = getPriceValueFromObject(dataObject, "sell") + ticker.vol = getPriceValueFromObject(dataObject, "vol") + ticker.high = getPriceValueFromObject(dataObject, "high") + ticker.low = getPriceValueFromObject(dataObject, "low") + ticker.last = getPriceValueFromObject(dataObject, "last") + } + + @Throws(Exception::class) + private fun getPriceValueFromObject(jsonObject: JSONObject, key: String): Double { + val innerObject = jsonObject.getJSONObject(key) + return innerObject.getDouble("value") + } +} \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Koinex.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Koinex.kt new file mode 100644 index 00000000..811bd101 --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Koinex.kt @@ -0,0 +1,49 @@ +package com.aneonex.bitcoinchecker.datamodule.model.market + +import com.aneonex.bitcoinchecker.datamodule.model.CheckerInfo +import com.aneonex.bitcoinchecker.datamodule.model.CurrencyPairInfo +import com.aneonex.bitcoinchecker.datamodule.model.Market +import com.aneonex.bitcoinchecker.datamodule.model.Ticker +import com.aneonex.bitcoinchecker.datamodule.model.currency.Currency +import org.json.JSONObject + +class Koinex : Market(NAME, TTS_NAME, null) { + override fun getUrl(requestId: Int, checkerInfo: CheckerInfo): String { + return URL + } + + @Throws(Exception::class) + override fun parseTickerFromJsonObject(requestId: Int, jsonObject: JSONObject, ticker: Ticker, checkerInfo: CheckerInfo) { + val names = jsonObject.getJSONObject("stats") + val tickerJsonObject = names.getJSONObject(checkerInfo.currencyBase) + ticker.bid = tickerJsonObject.getDouble("highest_bid") + ticker.ask = tickerJsonObject.getDouble("lowest_ask") + ticker.vol = tickerJsonObject.getDouble("vol_24hrs") + ticker.high = tickerJsonObject.getDouble("max_24hrs") + ticker.low = tickerJsonObject.getDouble("min_24hrs") + ticker.last = tickerJsonObject.getDouble("last_traded_price") + } + + // ==================== + // Get currency pairs + // ==================== + override fun getCurrencyPairsUrl(requestId: Int): String? { + return URL_CURRENCY_PAIRS + } + + @Throws(Exception::class) + override fun parseCurrencyPairsFromJsonObject(requestId: Int, jsonObject: JSONObject, pairs: MutableList) { + val currencyJSONObject = jsonObject.getJSONObject("stats") + val currencyArray = currencyJSONObject.names() + for (i in 0 until currencyArray.length()) { + pairs.add(CurrencyPairInfo(currencyArray.getString(i), Currency.INR, null)) + } + } + + companion object { + private const val NAME = "Koinex" + private const val TTS_NAME = "Koin ex" + private const val URL = "https://koinex.in/api/ticker" + private const val URL_CURRENCY_PAIRS = URL + } +} \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Koinim.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Koinim.kt new file mode 100644 index 00000000..a51c3c08 --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Koinim.kt @@ -0,0 +1,44 @@ +package com.aneonex.bitcoinchecker.datamodule.model.market + +import com.aneonex.bitcoinchecker.datamodule.model.CheckerInfo +import com.aneonex.bitcoinchecker.datamodule.model.Market +import com.aneonex.bitcoinchecker.datamodule.model.Ticker +import com.aneonex.bitcoinchecker.datamodule.model.currency.Currency +import com.aneonex.bitcoinchecker.datamodule.model.currency.CurrencyPairsMap +import com.aneonex.bitcoinchecker.datamodule.model.currency.VirtualCurrency +import org.json.JSONObject + +class Koinim : Market(NAME, TTS_NAME, CURRENCY_PAIRS) { + companion object { + const val NAME = "Koinim" + const val TTS_NAME = NAME + const val URL_BTC = "https://koinim.com/ticker/" + const val URL_LTC = "https://koinim.com/ticker/ltc/" + val CURRENCY_PAIRS: CurrencyPairsMap = CurrencyPairsMap() + + init { + CURRENCY_PAIRS[VirtualCurrency.BTC] = arrayOf( + Currency.TRY + ) + CURRENCY_PAIRS[VirtualCurrency.LTC] = arrayOf( + Currency.TRY + ) + } + } + + override fun getUrl(requestId: Int, checkerInfo: CheckerInfo): String { + return if (VirtualCurrency.LTC == checkerInfo.currencyBase) { + URL_LTC + } else URL_BTC + } + + @Throws(Exception::class) + override fun parseTickerFromJsonObject(requestId: Int, jsonObject: JSONObject, ticker: Ticker, checkerInfo: CheckerInfo) { + ticker.bid = jsonObject.getDouble("buy") + ticker.ask = jsonObject.getDouble("sell") + ticker.vol = jsonObject.getDouble("volume") + ticker.high = jsonObject.getDouble("high") + ticker.low = jsonObject.getDouble("low") + ticker.last = jsonObject.getDouble("last_order") + } +} \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Korbit.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Korbit.kt new file mode 100644 index 00000000..69953e42 --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Korbit.kt @@ -0,0 +1,49 @@ +package com.aneonex.bitcoinchecker.datamodule.model.market + +import com.aneonex.bitcoinchecker.datamodule.model.CheckerInfo +import com.aneonex.bitcoinchecker.datamodule.model.Market +import com.aneonex.bitcoinchecker.datamodule.model.Ticker +import com.aneonex.bitcoinchecker.datamodule.model.currency.Currency +import com.aneonex.bitcoinchecker.datamodule.model.currency.CurrencyPairsMap +import com.aneonex.bitcoinchecker.datamodule.model.currency.VirtualCurrency +import org.json.JSONObject + +class Korbit : Market(NAME, TTS_NAME, CURRENCY_PAIRS) { + companion object { + private const val NAME = "Korbit" + private const val TTS_NAME = NAME + private const val URL = "https://api.korbit.co.kr/v1/ticker/detailed?currency_pair=%1\$s_%2\$s" + private val CURRENCY_PAIRS: CurrencyPairsMap = CurrencyPairsMap() + + init { + CURRENCY_PAIRS[VirtualCurrency.BTC] = arrayOf( + Currency.KRW + ) + CURRENCY_PAIRS[VirtualCurrency.ETH] = arrayOf( + Currency.KRW + ) + CURRENCY_PAIRS[VirtualCurrency.ETC] = arrayOf( + Currency.KRW + ) + CURRENCY_PAIRS[VirtualCurrency.XRP] = arrayOf( + Currency.KRW + ) + } + } + + override fun getUrl(requestId: Int, checkerInfo: CheckerInfo): String { + return String.format(URL, checkerInfo.currencyBaseLowerCase, + checkerInfo.currencyCounterLowerCase) + } + + @Throws(Exception::class) + override fun parseTickerFromJsonObject(requestId: Int, jsonObject: JSONObject, ticker: Ticker, checkerInfo: CheckerInfo) { + ticker.bid = jsonObject.getDouble("bid") + ticker.ask = jsonObject.getDouble("ask") + ticker.vol = jsonObject.getDouble("volume") + ticker.high = jsonObject.getDouble("high") + ticker.low = jsonObject.getDouble("low") + ticker.last = jsonObject.getDouble("last") + ticker.timestamp = jsonObject.getLong("timestamp") + } +} \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Kraken.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Kraken.kt new file mode 100644 index 00000000..8b18baf4 --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Kraken.kt @@ -0,0 +1,87 @@ +package com.aneonex.bitcoinchecker.datamodule.model.market + +import com.aneonex.bitcoinchecker.datamodule.model.CheckerInfo +import com.aneonex.bitcoinchecker.datamodule.model.CurrencyPairInfo +import com.aneonex.bitcoinchecker.datamodule.model.Market +import com.aneonex.bitcoinchecker.datamodule.model.Ticker +import com.aneonex.bitcoinchecker.datamodule.model.currency.VirtualCurrency +import org.json.JSONObject + +class Kraken : Market(NAME, TTS_NAME, null) { + override fun getUrl(requestId: Int, checkerInfo: CheckerInfo): String { + return if (checkerInfo.currencyPairId != null) { + String.format(URL, checkerInfo.currencyPairId) + } else { + val currencyBase = fixCurrency(checkerInfo.currencyBase) + val currencyCounter = fixCurrency(checkerInfo.currencyCounter) + String.format(URL, currencyBase + currencyCounter) + } + } + + private fun fixCurrency(currency: String?): String? { + if (VirtualCurrency.BTC == currency) return VirtualCurrency.XBT + if (VirtualCurrency.VEN == currency) return VirtualCurrency.XVN + return if (VirtualCurrency.DOGE == currency) VirtualCurrency.XDG else currency + } + + @Throws(Exception::class) + override fun parseTickerFromJsonObject(requestId: Int, jsonObject: JSONObject, ticker: Ticker, checkerInfo: CheckerInfo) { + val resultObject = jsonObject.getJSONObject("result") + val pairObject = resultObject.getJSONObject(resultObject.names().getString(0)) + ticker.bid = getDoubleFromJsonArrayObject(pairObject, "b") + ticker.ask = getDoubleFromJsonArrayObject(pairObject, "a") + ticker.vol = getDoubleFromJsonArrayObject(pairObject, "v") + ticker.high = getDoubleFromJsonArrayObject(pairObject, "h") + ticker.low = getDoubleFromJsonArrayObject(pairObject, "l") + ticker.last = getDoubleFromJsonArrayObject(pairObject, "c") + } + + @Throws(Exception::class) + private fun getDoubleFromJsonArrayObject(jsonObject: JSONObject, arrayKey: String): Double { + val jsonArray = jsonObject.getJSONArray(arrayKey) + return if (jsonArray != null && jsonArray.length() > 0) jsonArray.getDouble(0) else 0.0 + } + + // ==================== + // Get currency pairs + // ==================== + override fun getCurrencyPairsUrl(requestId: Int): String? { + return URL_CURRENCY_PAIRS + } + + @Throws(Exception::class) + override fun parseCurrencyPairsFromJsonObject(requestId: Int, jsonObject: JSONObject, pairs: MutableList) { + val result = jsonObject.getJSONObject("result") + val pairNames = result.names() + for (i in 0 until pairNames.length()) { + val pairId = pairNames.getString(i) + if (pairId != null && pairId.indexOf('.') == -1) { + val pairJsonObject = result.getJSONObject(pairId) + pairs.add(CurrencyPairInfo( + parseCurrency(pairJsonObject.getString("base")), + parseCurrency(pairJsonObject.getString("quote")), + pairId)) + } + } + } + + private fun parseCurrency(currency: String): String { + var currency = currency + if (currency != null && currency.length >= 2) { + val firstChar = currency[0] + if (firstChar == 'Z' || firstChar == 'X') { + currency = currency.substring(1) + } + } + if (VirtualCurrency.XBT == currency) return VirtualCurrency.BTC + if (VirtualCurrency.XVN == currency) return VirtualCurrency.VEN + return if (VirtualCurrency.XDG == currency) VirtualCurrency.DOGE else currency + } + + companion object { + private const val NAME = "Kraken" + private const val TTS_NAME = NAME + private const val URL = "https://api.kraken.com/0/public/Ticker?pair=%1\$s" + private const val URL_CURRENCY_PAIRS = "https://api.kraken.com/0/public/AssetPairs" + } +} \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Kucoin.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Kucoin.kt new file mode 100644 index 00000000..ff1aa9c1 --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Kucoin.kt @@ -0,0 +1,52 @@ +package com.aneonex.bitcoinchecker.datamodule.model.market + +import com.aneonex.bitcoinchecker.datamodule.model.CheckerInfo +import com.aneonex.bitcoinchecker.datamodule.model.CurrencyPairInfo +import com.aneonex.bitcoinchecker.datamodule.model.Market +import com.aneonex.bitcoinchecker.datamodule.model.Ticker +import org.json.JSONObject + +class Kucoin : Market(NAME, TTS_NAME, null) { + override fun getUrl(requestId: Int, checkerInfo: CheckerInfo): String { + return String.format(URL, checkerInfo.currencyPairId) + } + + @Throws(Exception::class) + override fun parseTickerFromJsonObject(requestId: Int, jsonObject: JSONObject, ticker: Ticker, checkerInfo: CheckerInfo) { + val tickerJsonObject = jsonObject.getJSONObject("data") + ticker.bid = tickerJsonObject.getDouble("buy") + ticker.ask = tickerJsonObject.getDouble("sell") + ticker.vol = tickerJsonObject.getDouble("vol") + ticker.high = tickerJsonObject.getDouble("high") + ticker.low = tickerJsonObject.getDouble("low") + ticker.last = tickerJsonObject.getDouble("last") + ticker.timestamp = tickerJsonObject.getLong("time") + } + + // ==================== + // Get currency pairs + // ==================== + override fun getCurrencyPairsUrl(requestId: Int): String? { + return URL_COINS_PAIRS + } + + @Throws(Exception::class) + override fun parseCurrencyPairsFromJsonObject(requestId: Int, jsonObject: JSONObject, pairs: MutableList) { + val data = jsonObject.getJSONArray("data") + for (i in 0 until data.length()) { + val pairJsonObject = data.getJSONObject(i) + pairs.add(CurrencyPairInfo( + pairJsonObject.getString("baseCurrency"), + pairJsonObject.getString("quoteCurrency"), + pairJsonObject.getString("symbol") + )) + } + } + + companion object { + private const val NAME = "Kucoin" + private const val TTS_NAME = NAME + private const val URL = "https://api.kucoin.com/api/v1/market/stats?symbol=%1\$s" + private const val URL_COINS_PAIRS = "https://api.kucoin.com/api/v1/symbols" + } +} \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/LakeBTC.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/LakeBTC.kt new file mode 100644 index 00000000..4e09b7c6 --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/LakeBTC.kt @@ -0,0 +1,53 @@ +package com.aneonex.bitcoinchecker.datamodule.model.market + +import com.aneonex.bitcoinchecker.datamodule.model.CheckerInfo +import com.aneonex.bitcoinchecker.datamodule.model.CurrencyPairInfo +import com.aneonex.bitcoinchecker.datamodule.model.Market +import com.aneonex.bitcoinchecker.datamodule.model.Ticker +import org.json.JSONObject +import java.util.* + +class LakeBTC : Market(NAME, TTS_NAME, null) { + override fun getUrl(requestId: Int, checkerInfo: CheckerInfo): String { + return URL + } + + @Throws(Exception::class) + override fun parseTickerFromJsonObject(requestId: Int, jsonObject: JSONObject, ticker: Ticker, checkerInfo: CheckerInfo) { + val pairId: String? + pairId = checkerInfo.currencyPairId + ?: checkerInfo.currencyBaseLowerCase + checkerInfo.currencyCounterLowerCase + val pairJsonObject = jsonObject.getJSONObject(pairId) + ticker.bid = pairJsonObject.getDouble("bid") + ticker.ask = pairJsonObject.getDouble("ask") + ticker.vol = pairJsonObject.getDouble("volume") + ticker.high = pairJsonObject.getDouble("high") + ticker.low = pairJsonObject.getDouble("low") + ticker.last = pairJsonObject.getDouble("last") + } + + // ==================== + // Get currency pairs + // ==================== + override fun getCurrencyPairsUrl(requestId: Int): String? { + return URL_CURRENCY_PAIRS + } + + @Throws(Exception::class) + override fun parseCurrencyPairsFromJsonObject(requestId: Int, jsonObject: JSONObject, pairs: MutableList) { + val pairsJsonArray = jsonObject.names() + for (i in 0 until pairsJsonArray.length()) { + val pairId = pairsJsonArray.getString(i) + val currencyBase = pairId.substring(0, 3).toUpperCase(Locale.ENGLISH) + val currencyCounter = pairId.substring(3).toUpperCase(Locale.ENGLISH) + pairs.add(CurrencyPairInfo(currencyBase, currencyCounter, pairId)) + } + } + + companion object { + private const val NAME = "LakeBTC" + private const val TTS_NAME = "Lake BTC" + private const val URL = "https://api.lakebtc.com/api_v2/ticker" + private const val URL_CURRENCY_PAIRS = URL + } +} \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Liqui.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Liqui.kt new file mode 100644 index 00000000..3c732eef --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Liqui.kt @@ -0,0 +1,60 @@ +package com.aneonex.bitcoinchecker.datamodule.model.market + +import com.aneonex.bitcoinchecker.datamodule.model.CheckerInfo +import com.aneonex.bitcoinchecker.datamodule.model.CurrencyPairInfo +import com.aneonex.bitcoinchecker.datamodule.model.Market +import com.aneonex.bitcoinchecker.datamodule.model.Ticker +import org.json.JSONObject +import java.util.* + +class Liqui : Market(NAME, TTS_NAME, null) { + override fun getUrl(requestId: Int, checkerInfo: CheckerInfo): String { + var pairId = checkerInfo.currencyPairId + if (checkerInfo.currencyPairId == null) { + pairId = String.format("%1\$s_%2\$s", checkerInfo.currencyBaseLowerCase, checkerInfo.currencyCounterLowerCase) + } + return String.format(URL, pairId) + } + + @Throws(Exception::class) + override fun parseTickerFromJsonObject(requestId: Int, jsonObject: JSONObject, ticker: Ticker, checkerInfo: CheckerInfo) { + val names = jsonObject.names() + val tickerJsonObject = jsonObject.getJSONObject(names.getString(0)) + ticker.bid = tickerJsonObject.getDouble("sell") // REVERSED! + ticker.ask = tickerJsonObject.getDouble("buy") // REVERSED! + ticker.vol = tickerJsonObject.getDouble("vol") + ticker.high = tickerJsonObject.getDouble("high") + ticker.low = tickerJsonObject.getDouble("low") + ticker.last = tickerJsonObject.getDouble("last") + ticker.timestamp = tickerJsonObject.getLong("updated") + } + + // ==================== + // Get currency pairs + // ==================== + override fun getCurrencyPairsUrl(requestId: Int): String? { + return URL_CURRENCY_PAIRS + } + + @Throws(Exception::class) + override fun parseCurrencyPairsFromJsonObject(requestId: Int, jsonObject: JSONObject, pairs: MutableList) { + val pairsJsonObject = jsonObject.getJSONObject("pairs") + val pairsNames = pairsJsonObject.names() + for (i in 0 until pairsNames.length()) { + val pairId = pairsNames.getString(i) ?: continue + val currencies = pairId.split("_".toRegex()).toTypedArray() + if (currencies.size != 2) continue + val currencyBase = currencies[0].toUpperCase(Locale.ENGLISH) + val currencyCounter = currencies[1].toUpperCase(Locale.ENGLISH) + pairs.add(CurrencyPairInfo(currencyBase, currencyCounter, pairId)) + } + } + + companion object { + //Liqui's API is similar to BTC-e, so use BTCe.java for any help with updating this code + private const val NAME = "Liqui.io" + private const val TTS_NAME = "Liqui" + private const val URL = " https://api.liqui.io/api/3/ticker/%1\$s" + private const val URL_CURRENCY_PAIRS = "https://api.liqui.io/api/3/info" + } +} \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Livecoin.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Livecoin.kt new file mode 100644 index 00000000..cfc3dad4 --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Livecoin.kt @@ -0,0 +1,61 @@ +package com.aneonex.bitcoinchecker.datamodule.model.market + +import com.aneonex.bitcoinchecker.datamodule.model.CheckerInfo +import com.aneonex.bitcoinchecker.datamodule.model.CurrencyPairInfo +import com.aneonex.bitcoinchecker.datamodule.model.Market +import com.aneonex.bitcoinchecker.datamodule.model.Ticker +import org.json.JSONArray +import org.json.JSONObject + +class Livecoin : Market(NAME, TTS_NAME, null) { + override fun getUrl(requestId: Int, checkerInfo: CheckerInfo): String { + return String.format(URL, checkerInfo.currencyPairId) + } + + @Throws(Exception::class) + override fun parseTickerFromJsonObject(requestId: Int, jsonObject: JSONObject, ticker: Ticker, checkerInfo: CheckerInfo) { + if (!jsonObject.isNull("best_bid")) { + ticker.bid = jsonObject.getDouble("best_bid") + } + if (!jsonObject.isNull("best_ask")) { + ticker.ask = jsonObject.getDouble("best_ask") + } + if (!jsonObject.isNull("volume")) { + ticker.vol = jsonObject.getDouble("volume") + } + if (!jsonObject.isNull("high")) { + ticker.high = jsonObject.getDouble("high") + } + if (!jsonObject.isNull("low")) { + ticker.low = jsonObject.getDouble("low") + } + ticker.last = jsonObject.getDouble("last") + } + + override fun getCurrencyPairsUrl(requestId: Int): String? { + return URL_CURRENCY_PAIRS + } + + @Throws(Exception::class) + override fun parseCurrencyPairs(requestId: Int, responseString: String, pairs: MutableList) { + val tickerArray = JSONArray(responseString) + for (i in 0 until tickerArray.length()) { + val tickerRow = tickerArray.getJSONObject(i) + val symbol = tickerRow.getString("symbol") + val currencyNames = symbol.split("/".toRegex()).toTypedArray() + if (currencyNames != null && currencyNames.size >= 2) { + pairs.add(CurrencyPairInfo( + currencyNames[0], + currencyNames[1], + symbol)) + } + } + } + + companion object { + private const val NAME = "Livecoin" + private const val TTS_NAME = "Live coin" + private const val URL = "https://api.livecoin.net/exchange/ticker?currencyPair=%1\$s" + private const val URL_CURRENCY_PAIRS = "https://api.livecoin.net/exchange/ticker" + } +} \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/LocalBitcoins.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/LocalBitcoins.kt new file mode 100644 index 00000000..7e91fc4b --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/LocalBitcoins.kt @@ -0,0 +1,50 @@ +package com.aneonex.bitcoinchecker.datamodule.model.market + +import com.aneonex.bitcoinchecker.datamodule.model.CheckerInfo +import com.aneonex.bitcoinchecker.datamodule.model.CurrencyPairInfo +import com.aneonex.bitcoinchecker.datamodule.model.Market +import com.aneonex.bitcoinchecker.datamodule.model.Ticker +import com.aneonex.bitcoinchecker.datamodule.model.currency.VirtualCurrency +import org.json.JSONObject + +class LocalBitcoins : Market(NAME, TTS_NAME, null) { + override fun getUrl(requestId: Int, checkerInfo: CheckerInfo): String { + return URL + } + + @Throws(Exception::class) + override fun parseTickerFromJsonObject(requestId: Int, jsonObject: JSONObject, ticker: Ticker, checkerInfo: CheckerInfo) { + val pairJsonObject = jsonObject.getJSONObject(checkerInfo.currencyPairId) + ticker.vol = pairJsonObject.getDouble("volume_btc") + val ratesJsonObject = pairJsonObject.getJSONObject("rates") + ticker.last = ratesJsonObject.getDouble("last") + } + + // ==================== + // Get currency pairs + // ==================== + override fun getCurrencyPairsUrl(requestId: Int): String? { + return URL_CURRENCY_PAIRS + } + + @Throws(Exception::class) + override fun parseCurrencyPairsFromJsonObject(requestId: Int, jsonObject: JSONObject, pairs: MutableList) { + val pairsJsonArray = jsonObject.names() + for (i in 0 until pairsJsonArray.length()) { + val currencyCounter = pairsJsonArray.getString(i) + if (currencyCounter != null) { + pairs.add(CurrencyPairInfo( + VirtualCurrency.BTC, + currencyCounter, + currencyCounter)) + } + } + } + + companion object { + private const val NAME = "LocalBitcoins" + private const val TTS_NAME = "Local Bitcoins" + private const val URL = "https://localbitcoins.com/bitcoinaverage/ticker-all-currencies/" + private const val URL_CURRENCY_PAIRS = URL + } +} \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Lykke.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Lykke.kt new file mode 100644 index 00000000..19481ccf --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Lykke.kt @@ -0,0 +1,48 @@ +package com.aneonex.bitcoinchecker.datamodule.model.market + +import com.aneonex.bitcoinchecker.datamodule.model.CheckerInfo +import com.aneonex.bitcoinchecker.datamodule.model.CurrencyPairInfo +import com.aneonex.bitcoinchecker.datamodule.model.Market +import com.aneonex.bitcoinchecker.datamodule.model.Ticker +import org.json.JSONArray +import org.json.JSONObject + +class Lykke : Market(NAME, TTS_NAME, null) { + override fun getUrl(requestId: Int, checkerInfo: CheckerInfo): String { + return String.format(URL, checkerInfo.currencyPairId) + } + + @Throws(Exception::class) + override fun parseTickerFromJsonObject(requestId: Int, jsonObject: JSONObject, ticker: Ticker, checkerInfo: CheckerInfo) { + ticker.bid = jsonObject.getDouble("bid") + ticker.ask = jsonObject.getDouble("ask") + ticker.vol = jsonObject.getDouble("volume24H") + ticker.last = jsonObject.getDouble("lastPrice") + } + + // ==================== + // Get currency pairs + // ==================== + override fun getCurrencyPairsUrl(requestId: Int): String? { + return URL_CURRENCY_PAIRS + } + + @Throws(Exception::class) + override fun parseCurrencyPairs(requestId: Int, responseString: String, pairs: MutableList) { + val jsonArray = JSONArray(responseString) + for (i in 0 until jsonArray.length()) { + val pairJsonObject = jsonArray.getJSONObject(i) + pairs.add(CurrencyPairInfo( + pairJsonObject.getString("baseAssetId"), + pairJsonObject.getString("quotingAssetId"), + pairJsonObject.getString("id"))) + } + } + + companion object { + private const val NAME = "Lykke" + private const val TTS_NAME = NAME + private const val URL = "https://public-api.lykke.com/api/Market/%1\$s" + private const val URL_CURRENCY_PAIRS = "https://public-api.lykke.com/api/AssetPairs/dictionary" + } +} \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/McxNOW.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/McxNOW.kt new file mode 100644 index 00000000..1b02bd04 --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/McxNOW.kt @@ -0,0 +1,85 @@ +package com.aneonex.bitcoinchecker.datamodule.model.market + +import android.text.TextUtils +import com.aneonex.bitcoinchecker.datamodule.model.CheckerInfo +import com.aneonex.bitcoinchecker.datamodule.model.CurrencyPairInfo +import com.aneonex.bitcoinchecker.datamodule.model.Market +import com.aneonex.bitcoinchecker.datamodule.model.Ticker +import com.aneonex.bitcoinchecker.datamodule.model.currency.VirtualCurrency +import com.aneonex.bitcoinchecker.datamodule.util.XmlParserUtils +import org.w3c.dom.Document +import org.w3c.dom.Element +import org.xml.sax.InputSource +import java.io.StringReader +import javax.xml.parsers.DocumentBuilderFactory + +class McxNOW : Market(NAME, TTS_NAME, null) { + override fun getUrl(requestId: Int, checkerInfo: CheckerInfo): String { + return String.format(URL, checkerInfo.currencyBase) + } + + @Throws(Exception::class) + override fun parseTicker(requestId: Int, responseString: String, ticker: Ticker, checkerInfo: CheckerInfo) { + val db = DocumentBuilderFactory.newInstance().newDocumentBuilder() + val `is` = InputSource() + `is`.characterStream = StringReader(responseString) + val doc = db.parse(`is`) + ticker.bid = getFirstPriceFromOrder(doc, "buy") + ticker.ask = getFirstPriceFromOrder(doc, "sell") + ticker.vol = XmlParserUtils.getDoubleNodeValue(XmlParserUtils.getFirstElementByTagName(doc, "curvol")) + ticker.high = XmlParserUtils.getDoubleNodeValue(XmlParserUtils.getFirstElementByTagName(doc, "priceh")) + ticker.low = XmlParserUtils.getDoubleNodeValue(XmlParserUtils.getFirstElementByTagName(doc, "pricel")) + ticker.last = XmlParserUtils.getDoubleNodeValue(XmlParserUtils.getFirstElementByTagName(doc, "lprice")) + } + + @Throws(Exception::class) + private fun getFirstPriceFromOrder(doc: Document, arrayName: String): Double { + val arrayNode = XmlParserUtils.getFirstElementByTagName(doc, arrayName) + if (arrayNode != null) { + val orderNodes = (arrayNode as Element).getElementsByTagName("o") + if (orderNodes != null && orderNodes.length > 1) { + val orderNode = orderNodes.item(1) + if (orderNode != null && orderNode is Element) { + val priceNodes = orderNode.getElementsByTagName("p") + if (priceNodes != null && priceNodes.length > 0) { + return XmlParserUtils.getDoubleNodeValue(priceNodes.item(0)) + } + } + } + } + return Ticker.NO_DATA.toDouble() + } + + // ==================== + // Get currency pairs + // ==================== + override fun getCurrencyPairsUrl(requestId: Int): String? { + return URL_CURRENCY_PAIRS + } + + @Throws(Exception::class) + override fun parseCurrencyPairs(requestId: Int, responseString: String, pairs: MutableList) { + val db = DocumentBuilderFactory.newInstance().newDocumentBuilder() + val `is` = InputSource() + `is`.characterStream = StringReader(responseString) + val doc = db.parse(`is`) + val nodes = doc.getElementsByTagName("cur") + var node: Element? = null + if (nodes != null) { + for (i in 0 until nodes.length) { + node = nodes.item(i) as Element + if (node != null) { + val currency = node.getAttribute("tla") + if (!TextUtils.isEmpty(currency) && VirtualCurrency.BTC != currency) pairs.add(CurrencyPairInfo(currency, VirtualCurrency.BTC, null)) + } + } + } + } + + companion object { + private const val NAME = "McxNOW" + private const val TTS_NAME = "MCX now" + private const val URL = "https://mcxnow.com/orders?cur=%1\$s" + private const val URL_CURRENCY_PAIRS = "https://mcxnow.com/current" + } +} \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Mercado.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Mercado.kt new file mode 100644 index 00000000..952d67a2 --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Mercado.kt @@ -0,0 +1,47 @@ +package com.aneonex.bitcoinchecker.datamodule.model.market + +import com.aneonex.bitcoinchecker.datamodule.model.CheckerInfo +import com.aneonex.bitcoinchecker.datamodule.model.Market +import com.aneonex.bitcoinchecker.datamodule.model.Ticker +import com.aneonex.bitcoinchecker.datamodule.model.currency.Currency +import com.aneonex.bitcoinchecker.datamodule.model.currency.CurrencyPairsMap +import com.aneonex.bitcoinchecker.datamodule.model.currency.VirtualCurrency +import com.aneonex.bitcoinchecker.datamodule.util.TimeUtils +import org.json.JSONObject + +class Mercado : Market(NAME, TTS_NAME, CURRENCY_PAIRS) { + companion object { + private const val NAME = "Mercado Bitcoin" + private const val TTS_NAME = "Mercado" + private const val URL = "https://www.mercadobitcoin.com.br/api/%1\$s/ticker/" + private val CURRENCY_PAIRS: CurrencyPairsMap = CurrencyPairsMap() + + init { + CURRENCY_PAIRS[VirtualCurrency.BTC] = arrayOf( + Currency.BRL + ) + CURRENCY_PAIRS[VirtualCurrency.BCH] = arrayOf( + Currency.BRL + ) + CURRENCY_PAIRS[VirtualCurrency.LTC] = arrayOf( + Currency.BRL + ) + } + } + + override fun getUrl(requestId: Int, checkerInfo: CheckerInfo): String { + return String.format(URL, checkerInfo.currencyBase) + } + + @Throws(Exception::class) + override fun parseTickerFromJsonObject(requestId: Int, jsonObject: JSONObject, ticker: Ticker, checkerInfo: CheckerInfo) { + val tickerJsonObject = jsonObject.getJSONObject("ticker") + ticker.bid = tickerJsonObject.getDouble("buy") + ticker.ask = tickerJsonObject.getDouble("sell") + ticker.vol = tickerJsonObject.getDouble("vol") + ticker.high = tickerJsonObject.getDouble("high") + ticker.low = tickerJsonObject.getDouble("low") + ticker.last = tickerJsonObject.getDouble("last") + ticker.timestamp = tickerJsonObject.getLong("date") * TimeUtils.MILLIS_IN_SECOND + } +} \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Mexbt.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Mexbt.kt new file mode 100644 index 00000000..908b1daf --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Mexbt.kt @@ -0,0 +1,38 @@ +package com.aneonex.bitcoinchecker.datamodule.model.market + +import com.aneonex.bitcoinchecker.datamodule.model.CheckerInfo +import com.aneonex.bitcoinchecker.datamodule.model.Market +import com.aneonex.bitcoinchecker.datamodule.model.Ticker +import com.aneonex.bitcoinchecker.datamodule.model.currency.Currency +import com.aneonex.bitcoinchecker.datamodule.model.currency.CurrencyPairsMap +import com.aneonex.bitcoinchecker.datamodule.model.currency.VirtualCurrency +import org.json.JSONObject + +class Mexbt : Market(NAME, TTS_NAME, CURRENCY_PAIRS) { + companion object { + private const val NAME = "meXBT" + private const val TTS_NAME = "me XBT" + private const val URL = "https://data.mexbt.com/ticker/%1\$s%2\$s" + private val CURRENCY_PAIRS: CurrencyPairsMap = CurrencyPairsMap() + + init { + CURRENCY_PAIRS[VirtualCurrency.BTC] = arrayOf( + VirtualCurrency.MXN, + Currency.USD) + } + } + + override fun getUrl(requestId: Int, checkerInfo: CheckerInfo): String { + return String.format(URL, checkerInfo.currencyBaseLowerCase, checkerInfo.currencyCounterLowerCase) + } + + @Throws(Exception::class) + override fun parseTickerFromJsonObject(requestId: Int, jsonObject: JSONObject, ticker: Ticker, checkerInfo: CheckerInfo) { + ticker.bid = jsonObject.getDouble("bid") + ticker.ask = jsonObject.getDouble("ask") + ticker.vol = jsonObject.getDouble("volume24Hour") + ticker.high = jsonObject.getDouble("high") + ticker.low = jsonObject.getDouble("low") + ticker.last = jsonObject.getDouble("last") + } +} \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/MintPal.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/MintPal.kt new file mode 100644 index 00000000..dbf66f13 --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/MintPal.kt @@ -0,0 +1,54 @@ +package com.aneonex.bitcoinchecker.datamodule.model.market + +import com.aneonex.bitcoinchecker.datamodule.model.CheckerInfo +import com.aneonex.bitcoinchecker.datamodule.model.CurrencyPairInfo +import com.aneonex.bitcoinchecker.datamodule.model.Market +import com.aneonex.bitcoinchecker.datamodule.model.Ticker +import org.json.JSONArray +import org.json.JSONObject + +class MintPal : Market(NAME, TTS_NAME, null) { + override fun getUrl(requestId: Int, checkerInfo: CheckerInfo): String { + return String.format(URL, checkerInfo.currencyBase, checkerInfo.currencyCounter) + } + + @Throws(Exception::class) + override fun parseTicker(requestId: Int, responseString: String, ticker: Ticker, checkerInfo: CheckerInfo) { + parseTickerFromJsonObject(requestId, JSONArray(responseString).getJSONObject(0), ticker, checkerInfo) + } + + @Throws(Exception::class) + override fun parseTickerFromJsonObject(requestId: Int, jsonObject: JSONObject, ticker: Ticker, checkerInfo: CheckerInfo) { + ticker.vol = jsonObject.getDouble("24hvol") + ticker.high = jsonObject.getDouble("24hhigh") + ticker.low = jsonObject.getDouble("24hlow") + ticker.last = jsonObject.getDouble("last_price") + } + + // ==================== + // Get currency pairs + // ==================== + override fun getCurrencyPairsUrl(requestId: Int): String? { + return URL_CURRENCY_PAIRS + } + + @Throws(Exception::class) + override fun parseCurrencyPairs(requestId: Int, responseString: String, pairs: MutableList) { + val jsonArray = JSONArray(responseString) + for (i in 0 until jsonArray.length()) { + val marketObject = jsonArray.getJSONObject(i) + pairs.add(CurrencyPairInfo( + marketObject.getString("code"), + marketObject.getString("exchange"), + null + )) + } + } + + companion object { + private const val NAME = "MintPal" + private const val TTS_NAME = "Mint Pal" + private const val URL = "https://api.mintpal.com/market/stats/%1\$s/%2\$s/" + private const val URL_CURRENCY_PAIRS = "https://api.mintpal.com/market/summary/" + } +} \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/NegocieCoins.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/NegocieCoins.kt new file mode 100644 index 00000000..09574289 --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/NegocieCoins.kt @@ -0,0 +1,41 @@ +package com.aneonex.bitcoinchecker.datamodule.model.market + +import com.aneonex.bitcoinchecker.datamodule.model.CheckerInfo +import com.aneonex.bitcoinchecker.datamodule.model.Market +import com.aneonex.bitcoinchecker.datamodule.model.Ticker +import com.aneonex.bitcoinchecker.datamodule.model.currency.Currency +import com.aneonex.bitcoinchecker.datamodule.model.currency.CurrencyPairsMap +import com.aneonex.bitcoinchecker.datamodule.model.currency.VirtualCurrency +import org.json.JSONObject + +class NegocieCoins : Market(NAME, TTS_NAME, CURRENCY_PAIRS) { + companion object { + private const val NAME = "NegocieCoins" + private const val TTS_NAME = "Negocie Coins" + private const val URL = "https://broker.negociecoins.com.br/api/v3/%1\$s%2\$s/ticker" + private val CURRENCY_PAIRS: CurrencyPairsMap = CurrencyPairsMap() + + init { + CURRENCY_PAIRS[VirtualCurrency.BTC] = arrayOf( + Currency.BRL + ) + CURRENCY_PAIRS[VirtualCurrency.LTC] = arrayOf( + Currency.BRL + ) + } + } + + override fun getUrl(requestId: Int, checkerInfo: CheckerInfo): String { + return String.format(URL, checkerInfo.currencyBase, checkerInfo.currencyCounter) + } + + @Throws(Exception::class) + override fun parseTickerFromJsonObject(requestId: Int, jsonObject: JSONObject, ticker: Ticker, checkerInfo: CheckerInfo) { + ticker.bid = jsonObject.getDouble("buy") + ticker.ask = jsonObject.getDouble("sell") + ticker.vol = jsonObject.getDouble("vol") + ticker.high = jsonObject.getDouble("high") + ticker.low = jsonObject.getDouble("low") + ticker.last = jsonObject.getDouble("last") + } +} \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Nocks.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Nocks.kt new file mode 100644 index 00000000..0b0bc58a --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Nocks.kt @@ -0,0 +1,59 @@ +package com.aneonex.bitcoinchecker.datamodule.model.market + +import com.aneonex.bitcoinchecker.datamodule.model.CheckerInfo +import com.aneonex.bitcoinchecker.datamodule.model.CurrencyPairInfo +import com.aneonex.bitcoinchecker.datamodule.model.Market +import com.aneonex.bitcoinchecker.datamodule.model.Ticker +import org.json.JSONObject + +class Nocks : Market(NAME, TTS_NAME, null) { + override fun getUrl(requestId: Int, checkerInfo: CheckerInfo): String { + return String.format(URL, checkerInfo.currencyPairId) + } + + @Throws(Exception::class) + override fun parseTickerFromJsonObject(requestId: Int, jsonObject: JSONObject, ticker: Ticker, checkerInfo: CheckerInfo) { + val dataObject = jsonObject.getJSONObject("data") + ticker.bid = getDoubleFromJsonObject(dataObject, "buy") + ticker.ask = getDoubleFromJsonObject(dataObject, "sell") + ticker.vol = getDoubleFromJsonObject(dataObject, "volume") + ticker.high = getDoubleFromJsonObject(dataObject, "high") + ticker.low = getDoubleFromJsonObject(dataObject, "low") + ticker.last = getDoubleFromJsonObject(dataObject, "last") + } + + @Throws(Exception::class) + private fun getDoubleFromJsonObject(jsonObject: JSONObject, key: String): Double { + return jsonObject.getJSONObject(key).getDouble("amount") + } + + // ==================== + // Get currency pairs + // ==================== + override fun getCurrencyPairsUrl(requestId: Int): String? { + return URL_CURRENCY_PAIRS + } + + @Throws(Exception::class) + override fun parseCurrencyPairsFromJsonObject(requestId: Int, jsonObject: JSONObject, pairs: MutableList) { + val resultJsonArray = jsonObject.getJSONArray("data") + for (i in 0 until resultJsonArray.length()) { + val marketJsonObject = resultJsonArray.getJSONObject(i) + val pairId = marketJsonObject.getString("code") + val currencies = pairId.split("-".toRegex()).toTypedArray() + if (currencies.size >= 2) { + pairs.add(CurrencyPairInfo( + currencies[0], + currencies[1], + pairId)) + } + } + } + + companion object { + private const val NAME = "Nocks" + private const val TTS_NAME = NAME + private const val URL = "https://api.nocks.com/api/v2/trade-market/%1\$s" + private const val URL_CURRENCY_PAIRS = "https://api.nocks.com/api/v2/trade-market" + } +} \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/OKCoinFutures.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/OKCoinFutures.kt new file mode 100644 index 00000000..281daff0 --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/OKCoinFutures.kt @@ -0,0 +1,57 @@ +package com.aneonex.bitcoinchecker.datamodule.model.market + +import com.aneonex.bitcoinchecker.datamodule.model.CheckerInfo +import com.aneonex.bitcoinchecker.datamodule.model.Futures +import com.aneonex.bitcoinchecker.datamodule.model.FuturesMarket +import com.aneonex.bitcoinchecker.datamodule.model.Ticker +import com.aneonex.bitcoinchecker.datamodule.model.currency.Currency +import com.aneonex.bitcoinchecker.datamodule.model.currency.CurrencyPairsMap +import com.aneonex.bitcoinchecker.datamodule.model.currency.VirtualCurrency +import org.json.JSONObject + +class OKCoinFutures : FuturesMarket(NAME, TTS_NAME, CURRENCY_PAIRS, CONTRACT_TYPES) { + companion object { + private const val NAME = "OKCoin Futures" + private const val TTS_NAME = "OK Coin Futures" + private const val URL = "https://www.okex.com/api/v1/future_ticker.do?symbol=%1\$s_%2\$s&contract_type=%3\$s" + private val CURRENCY_PAIRS: CurrencyPairsMap = CurrencyPairsMap() + private val CONTRACT_TYPES = intArrayOf( + Futures.CONTRACT_TYPE_WEEKLY, + Futures.CONTRACT_TYPE_BIWEEKLY, + Futures.CONTRACT_TYPE_QUARTERLY + ) + + init { + CURRENCY_PAIRS[VirtualCurrency.BTC] = arrayOf( // Currency.CNY, //At this time (2015-09-17) no API exist for www.okcoin.cn. Check https://www.okcoin.cn/about/rest_api.do + Currency.USD + ) + CURRENCY_PAIRS[VirtualCurrency.LTC] = arrayOf( // Currency.CNY, //At this time (2015-09-17) no API exist for www.okcoin.cn. Check https://www.okcoin.cn/about/rest_api.do + Currency.USD + ) + } + } + + public override fun getUrl(requestId: Int, checkerInfo: CheckerInfo, contractType: Int): String { + return String.format(URL, checkerInfo.currencyBaseLowerCase, checkerInfo.currencyCounterLowerCase, getContractTypeString(contractType)) + } + + private fun getContractTypeString(contractType: Int): String { + return when (contractType) { + Futures.CONTRACT_TYPE_WEEKLY -> "this_week" + Futures.CONTRACT_TYPE_BIWEEKLY -> "next_week" + Futures.CONTRACT_TYPE_QUARTERLY -> "quarter" + else -> "this_week" + } + } + + @Throws(Exception::class) + override fun parseTickerFromJsonObject(requestId: Int, jsonObject: JSONObject, ticker: Ticker, checkerInfo: CheckerInfo) { + val tickerJsonObject = jsonObject.getJSONObject("ticker") + ticker.bid = tickerJsonObject.getDouble("buy") + ticker.ask = tickerJsonObject.getDouble("sell") + ticker.vol = tickerJsonObject.getDouble("vol") + ticker.high = tickerJsonObject.getDouble("high") + ticker.low = tickerJsonObject.getDouble("low") + ticker.last = tickerJsonObject.getDouble("last") + } +} \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Okcoin.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Okcoin.kt new file mode 100644 index 00000000..a1b3fb7d --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Okcoin.kt @@ -0,0 +1,49 @@ +package com.aneonex.bitcoinchecker.datamodule.model.market + +import com.aneonex.bitcoinchecker.datamodule.model.CheckerInfo +import com.aneonex.bitcoinchecker.datamodule.model.Market +import com.aneonex.bitcoinchecker.datamodule.model.Ticker +import com.aneonex.bitcoinchecker.datamodule.model.currency.Currency +import com.aneonex.bitcoinchecker.datamodule.model.currency.CurrencyPairsMap +import com.aneonex.bitcoinchecker.datamodule.model.currency.VirtualCurrency +import org.json.JSONObject + +class Okcoin : Market(NAME, TTS_NAME, CURRENCY_PAIRS) { + companion object { + private const val NAME = "OKCoin" + private const val TTS_NAME = "OK Coin" + private const val URL_USD = "https://www.okcoin.com/api/v1/ticker.do?symbol=%1\$s_%2\$s" + private const val URL_CNY = "https://www.okcoin.cn/api/v1/ticker.do?symbol=%1\$s_%2\$s" + private val CURRENCY_PAIRS: CurrencyPairsMap = CurrencyPairsMap() + + init { + CURRENCY_PAIRS[VirtualCurrency.BTC] = arrayOf( + Currency.CNY, + Currency.USD + ) + CURRENCY_PAIRS[VirtualCurrency.LTC] = arrayOf( + Currency.CNY, + Currency.USD + ) + } + } + + override fun getUrl(requestId: Int, checkerInfo: CheckerInfo): String { + return if (Currency.USD == checkerInfo.currencyCounter) { + String.format(URL_USD, checkerInfo.currencyBaseLowerCase, checkerInfo.currencyCounterLowerCase) + } else { + String.format(URL_CNY, checkerInfo.currencyBaseLowerCase, checkerInfo.currencyCounterLowerCase) + } + } + + @Throws(Exception::class) + override fun parseTickerFromJsonObject(requestId: Int, jsonObject: JSONObject, ticker: Ticker, checkerInfo: CheckerInfo) { + val tickerJsonObject = jsonObject.getJSONObject("ticker") + ticker.bid = tickerJsonObject.getDouble("buy") + ticker.ask = tickerJsonObject.getDouble("sell") + ticker.vol = tickerJsonObject.getDouble("vol") + ticker.high = tickerJsonObject.getDouble("high") + ticker.low = tickerJsonObject.getDouble("low") + ticker.last = tickerJsonObject.getDouble("last") + } +} \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/OmniTrade.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/OmniTrade.kt new file mode 100644 index 00000000..807abe46 --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/OmniTrade.kt @@ -0,0 +1,50 @@ +package com.aneonex.bitcoinchecker.datamodule.model.market + +import com.aneonex.bitcoinchecker.datamodule.model.CheckerInfo +import com.aneonex.bitcoinchecker.datamodule.model.CurrencyPairInfo +import com.aneonex.bitcoinchecker.datamodule.model.Market +import com.aneonex.bitcoinchecker.datamodule.model.Ticker +import org.json.JSONArray +import org.json.JSONObject + +class OmniTrade : Market(NAME, TTS_NAME, null) { + override fun getUrl(requestId: Int, checkerInfo: CheckerInfo): String { + return String.format(URL, checkerInfo.currencyPairId) + } + + @Throws(Exception::class) + override fun parseTickerFromJsonObject(requestId: Int, jsonObject: JSONObject, ticker: Ticker, checkerInfo: CheckerInfo) { + val dataJsonObject = jsonObject.getJSONObject("ticker") + ticker.bid = dataJsonObject.getDouble("buy") + ticker.ask = dataJsonObject.getDouble("sell") + ticker.low = dataJsonObject.getDouble("low") + ticker.high = dataJsonObject.getDouble("high") + ticker.last = dataJsonObject.getDouble("last") + ticker.vol = dataJsonObject.getDouble("vol") + } + + // ==================== + // Get currency pairs + // ==================== + override fun getCurrencyPairsUrl(requestId: Int): String? { + return URL_CURRENCY_PAIRS + } + + @Throws(Exception::class) + override fun parseCurrencyPairs(requestId: Int, responseString: String, pairs: MutableList) { + val pairsArray = JSONArray(responseString) + for (i in 0 until pairsArray.length()) { + val pair = pairsArray.getJSONObject(i) + val currencies = pair.getString("name").split("/".toRegex()).toTypedArray() + if (currencies.size != 2) continue + pairs.add(CurrencyPairInfo(currencies[0], currencies[1], pair.getString("id"))) + } + } + + companion object { + private const val NAME = "OmniTrade" + private const val TTS_NAME = "Omni Trade" + private const val URL = "https://omnitrade.io/api/v2/tickers/%1\$s" + private const val URL_CURRENCY_PAIRS = "https://omnitrade.io/api/v2/markets" + } +} \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Paribu.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Paribu.kt new file mode 100644 index 00000000..1d3be2cf --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Paribu.kt @@ -0,0 +1,40 @@ +package com.aneonex.bitcoinchecker.datamodule.model.market + +import com.aneonex.bitcoinchecker.datamodule.model.CheckerInfo +import com.aneonex.bitcoinchecker.datamodule.model.Market +import com.aneonex.bitcoinchecker.datamodule.model.Ticker +import com.aneonex.bitcoinchecker.datamodule.model.currency.Currency +import com.aneonex.bitcoinchecker.datamodule.model.currency.CurrencyPairsMap +import com.aneonex.bitcoinchecker.datamodule.model.currency.VirtualCurrency +import com.aneonex.bitcoinchecker.datamodule.util.ParseUtils +import org.json.JSONObject + +class Paribu : Market(NAME, TTS_NAME, CURRENCY_PAIRS) { + companion object { + const val NAME = "Paribu" + const val TTS_NAME = NAME + const val URL = "https://www.paribu.com/ticker" + val CURRENCY_PAIRS: CurrencyPairsMap = CurrencyPairsMap() + + init { + CURRENCY_PAIRS[VirtualCurrency.BTC] = arrayOf( + Currency.TRY + ) + } + } + + override fun getUrl(requestId: Int, checkerInfo: CheckerInfo): String { + return URL + } + + @Throws(Exception::class) + override fun parseTickerFromJsonObject(requestId: Int, jsonObject: JSONObject, ticker: Ticker, checkerInfo: CheckerInfo) { + val dataJsonObject = jsonObject.getJSONObject("BTC_TL") + ticker.bid = ParseUtils.getDoubleFromString(dataJsonObject, "highestBid") + ticker.ask = ParseUtils.getDoubleFromString(dataJsonObject, "lowestAsk") + ticker.vol = ParseUtils.getDoubleFromString(dataJsonObject, "volume") + ticker.high = ParseUtils.getDoubleFromString(dataJsonObject, "high24hr") + ticker.low = ParseUtils.getDoubleFromString(dataJsonObject, "low24hr") + ticker.last = ParseUtils.getDoubleFromString(dataJsonObject, "last") + } +} \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Paymium.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Paymium.kt new file mode 100644 index 00000000..4e6fc4e1 --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Paymium.kt @@ -0,0 +1,51 @@ +package com.aneonex.bitcoinchecker.datamodule.model.market + +import com.aneonex.bitcoinchecker.datamodule.model.CheckerInfo +import com.aneonex.bitcoinchecker.datamodule.model.Market +import com.aneonex.bitcoinchecker.datamodule.model.Ticker +import com.aneonex.bitcoinchecker.datamodule.model.currency.Currency +import com.aneonex.bitcoinchecker.datamodule.model.currency.CurrencyPairsMap +import com.aneonex.bitcoinchecker.datamodule.model.currency.VirtualCurrency +import org.json.JSONObject + +class Paymium : Market(NAME, TTS_NAME, CURRENCY_PAIRS) { + companion object { + private const val NAME = "Paymium" + private const val TTS_NAME = NAME + private const val URL = "https://paymium.com/api/v1/data/eur/ticker" + private val CURRENCY_PAIRS: CurrencyPairsMap = CurrencyPairsMap() + + init { + CURRENCY_PAIRS[VirtualCurrency.BTC] = arrayOf( + Currency.EUR + ) + } + } + + override fun getUrl(requestId: Int, checkerInfo: CheckerInfo): String { + return URL + } + + @Throws(Exception::class) + override fun parseTickerFromJsonObject(requestId: Int, jsonObject: JSONObject, ticker: Ticker, checkerInfo: CheckerInfo) { + ticker.bid = jsonObject.getDouble("bid") + ticker.ask = jsonObject.getDouble("ask") + ticker.vol = jsonObject.getDouble("volume") + ticker.high = jsonObject.getDouble("high") + ticker.low = jsonObject.getDouble("low") + ticker.last = jsonObject.getDouble("price") + } + + @Throws(Exception::class) + override fun parseErrorFromJsonObject(requestId: Int, jsonObject: JSONObject, checkerInfo: CheckerInfo?): String? { + val stringBuilder = StringBuilder() + val errorsArray = jsonObject.getJSONArray("errors") + for (i in 0 until errorsArray.length()) { + if (stringBuilder.isNotEmpty()) { + stringBuilder.append("\n") + } + stringBuilder.append(errorsArray.getString(i)) + } + return stringBuilder.toString() + } +} \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Poloniex.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Poloniex.kt new file mode 100644 index 00000000..baac623d --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Poloniex.kt @@ -0,0 +1,46 @@ +package com.aneonex.bitcoinchecker.datamodule.model.market + +import com.aneonex.bitcoinchecker.datamodule.model.CheckerInfo +import com.aneonex.bitcoinchecker.datamodule.model.CurrencyPairInfo +import com.aneonex.bitcoinchecker.datamodule.model.Market +import com.aneonex.bitcoinchecker.datamodule.model.Ticker +import org.json.JSONObject + +class Poloniex : Market(NAME, TTS_NAME, null) { + override fun getUrl(requestId: Int, checkerInfo: CheckerInfo): String { + return URL + } + + @Throws(Exception::class) + override fun parseTickerFromJsonObject(requestId: Int, jsonObject: JSONObject, ticker: Ticker, checkerInfo: CheckerInfo) { + val pairJsonObject = jsonObject.getJSONObject(checkerInfo.currencyCounter + "_" + checkerInfo.currencyBase) // Reversed currencies + ticker.bid = pairJsonObject.getDouble("highestBid") + ticker.ask = pairJsonObject.getDouble("lowestAsk") + ticker.vol = pairJsonObject.getDouble("baseVolume") + ticker.last = pairJsonObject.getDouble("last") + } + + // ==================== + // Get currency pairs + // ==================== + override fun getCurrencyPairsUrl(requestId: Int): String? { + return URL + } + + @Throws(Exception::class) + override fun parseCurrencyPairsFromJsonObject(requestId: Int, jsonObject: JSONObject, pairs: MutableList) { + val pairNames = jsonObject.names() + for (i in 0 until pairNames.length()) { + val pairId = pairNames.getString(i) ?: continue + val currencies = pairId.split("_".toRegex()).toTypedArray() + if (currencies.size != 2) continue + pairs.add(CurrencyPairInfo(currencies[1], currencies[0], pairId)) //reversed pairs + } + } + + companion object { + private const val NAME = "Poloniex" + private const val TTS_NAME = NAME + private const val URL = "https://poloniex.com/public?command=returnTicker" + } +} \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Prelude.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Prelude.kt new file mode 100644 index 00000000..cece5fb4 --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Prelude.kt @@ -0,0 +1,83 @@ +package com.aneonex.bitcoinchecker.datamodule.model.market + +import com.aneonex.bitcoinchecker.datamodule.model.CheckerInfo +import com.aneonex.bitcoinchecker.datamodule.model.CurrencyPairInfo +import com.aneonex.bitcoinchecker.datamodule.model.Market +import com.aneonex.bitcoinchecker.datamodule.model.Ticker +import com.aneonex.bitcoinchecker.datamodule.model.currency.Currency +import org.json.JSONObject +import java.text.NumberFormat +import java.util.* + +class Prelude : Market(NAME, TTS_NAME, null) { + override fun getUrl(requestId: Int, checkerInfo: CheckerInfo): String { + if (requestId == 0) { + return String.format(URL_1, checkerInfo.currencyCounterLowerCase) + } + return if (Currency.USD == checkerInfo.currencyCounter) { + String.format(URL_2_USD, checkerInfo.currencyBase) + } else { + String.format(URL_2_BTC, checkerInfo.currencyBase) + } + } + + override fun getNumOfRequests(checkerInfo: CheckerInfo?): Int { + return 2 + } + + @Throws(Exception::class) + override fun parseTickerFromJsonObject(requestId: Int, jsonObject: JSONObject, ticker: Ticker, checkerInfo: CheckerInfo) { + // commas?! use US number parser. + val numberFormat = NumberFormat.getInstance(Locale.US) + if (requestId == 0) { + val pairings = jsonObject.getJSONArray("pairings") + for (i in 0 until pairings.length()) { + val pairing = pairings.getJSONObject(i) + val pair = pairing.getString("pair") + if (checkerInfo.currencyBase == pair) { + ticker.last = numberFormat.parse(pairing.getJSONObject("last_trade").getString("rate")).toDouble() + return + } + } + } else { + val statistics = jsonObject.getJSONObject("statistics") + ticker.vol = numberFormat.parse(statistics.getString("volume")).toDouble() + ticker.high = numberFormat.parse(statistics.getString("high")).toDouble() + ticker.low = numberFormat.parse(statistics.getString("low")).toDouble() + } + } + + // ==================== + // Get currency pairs + // ==================== + override val currencyPairsNumOfRequests: Int + get() = 2 + + override fun getCurrencyPairsUrl(requestId: Int): String? { + return if (requestId == 1) URL_CURRENCY_PAIRS_USD else URL_CURRENCY_PAIRS_BTC + } + + @Throws(Exception::class) + override fun parseCurrencyPairsFromJsonObject(requestId: Int, jsonObject: JSONObject, pairs: MutableList) { + val pairingsArray = jsonObject.getJSONArray("pairings") + val currencyCounter = jsonObject.getString("from") + for (i in 0 until pairingsArray.length()) { + val pairObject = pairingsArray.getJSONObject(i) + pairs.add(CurrencyPairInfo( + pairObject.getString("pair"), + currencyCounter, + null + )) + } + } + + companion object { + private const val NAME = "Prelude" + private const val TTS_NAME = NAME + private const val URL_1 = "https://api.prelude.io/pairings/%1\$s" + private const val URL_2_BTC = "https://api.prelude.io/statistics/%1\$s" + private const val URL_2_USD = "https://api.prelude.io/statistics-usd/%1\$s" + private const val URL_CURRENCY_PAIRS_BTC = "https://api.prelude.io/pairings/btc" + private const val URL_CURRENCY_PAIRS_USD = "https://api.prelude.io/pairings/usd" + } +} \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/QuadrigaCX.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/QuadrigaCX.kt new file mode 100644 index 00000000..8d5b1234 --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/QuadrigaCX.kt @@ -0,0 +1,53 @@ +package com.aneonex.bitcoinchecker.datamodule.model.market + +import com.aneonex.bitcoinchecker.datamodule.model.CheckerInfo +import com.aneonex.bitcoinchecker.datamodule.model.Market +import com.aneonex.bitcoinchecker.datamodule.model.Ticker +import com.aneonex.bitcoinchecker.datamodule.model.currency.Currency +import com.aneonex.bitcoinchecker.datamodule.model.currency.CurrencyPairsMap +import com.aneonex.bitcoinchecker.datamodule.model.currency.VirtualCurrency +import org.json.JSONObject + +class QuadrigaCX : Market(NAME, TTS_NAME, CURRENCY_PAIRS) { + companion object { + private const val NAME = "QuadrigaCX" + private const val TTS_NAME = "Quadriga CX" + private const val URL = "https://api.quadrigacx.com/v2/ticker?book=%1\$s_%2\$s" + private val CURRENCY_PAIRS: CurrencyPairsMap = CurrencyPairsMap() + + init { + CURRENCY_PAIRS[VirtualCurrency.BCH] = arrayOf( + Currency.CAD + ) + CURRENCY_PAIRS[VirtualCurrency.BTC] = arrayOf( + Currency.CAD, + Currency.USD + ) + CURRENCY_PAIRS[VirtualCurrency.BTG] = arrayOf( + Currency.CAD + ) + CURRENCY_PAIRS[VirtualCurrency.ETH] = arrayOf( + VirtualCurrency.BTC, + Currency.CAD + ) + CURRENCY_PAIRS[VirtualCurrency.LTC] = arrayOf( + Currency.CAD + ) + } + } + + override fun getUrl(requestId: Int, checkerInfo: CheckerInfo): String { + return String.format(URL, checkerInfo.currencyBaseLowerCase, checkerInfo.currencyCounterLowerCase) + } + + @Throws(Exception::class) + override fun parseTickerFromJsonObject(requestId: Int, jsonObject: JSONObject, ticker: Ticker, checkerInfo: CheckerInfo) { + ticker.bid = jsonObject.getDouble("bid") + ticker.ask = jsonObject.getDouble("ask") + ticker.vol = jsonObject.getDouble("volume") + ticker.high = jsonObject.getDouble("high") + ticker.low = jsonObject.getDouble("low") + ticker.last = jsonObject.getDouble("last") + ticker.timestamp = jsonObject.getLong("timestamp") + } +} \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Quoine.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Quoine.kt new file mode 100644 index 00000000..e1d656a6 --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Quoine.kt @@ -0,0 +1,58 @@ +package com.aneonex.bitcoinchecker.datamodule.model.market + +import com.aneonex.bitcoinchecker.datamodule.model.CheckerInfo +import com.aneonex.bitcoinchecker.datamodule.model.CurrencyPairInfo +import com.aneonex.bitcoinchecker.datamodule.model.Market +import com.aneonex.bitcoinchecker.datamodule.model.Ticker +import org.json.JSONArray +import org.json.JSONObject + +class Quoine : Market(NAME, TTS_NAME, null) { + override fun getUrl(requestId: Int, checkerInfo: CheckerInfo): String { + return String.format(URL, checkerInfo.currencyPairId) + } + + @Throws(Exception::class) + override fun parseTickerFromJsonObject(requestId: Int, jsonObject: JSONObject, ticker: Ticker, checkerInfo: CheckerInfo) { + ticker.bid = jsonObject.getDouble("market_bid") + ticker.ask = jsonObject.getDouble("market_ask") + ticker.vol = jsonObject.getDouble("volume_24h") + ticker.high = jsonObject.getDouble("high_market_ask") + ticker.low = jsonObject.getDouble("low_market_bid") + ticker.last = jsonObject.getDouble("last_traded_price") + } + + // ==================== + // Get currency pairs + // ==================== + override fun getCurrencyPairsUrl(requestId: Int): String? { + return URL_CURRENCY_PAIRS + } + + @Throws(Exception::class) + override fun parseCurrencyPairs(requestId: Int, responseString: String, pairs: MutableList) { + val pairsJsonArray = JSONArray(responseString) + for (i in 0 until pairsJsonArray.length()) { + val pairJsonObject = pairsJsonArray.getJSONObject(i) + if ("CASH" != pairJsonObject.getString("code")) { + continue + } + val currencyCounter = pairJsonObject.getString("currency") + val pairName = pairJsonObject.getString("currency_pair_code") + if (pairName != null && currencyCounter != null && pairName.endsWith(currencyCounter)) { + val currencyBase = pairName.substring(0, pairName.length - currencyCounter.length) + pairs.add(CurrencyPairInfo( + currencyBase, + currencyCounter, + pairName)) + } + } + } + + companion object { + private const val NAME = "Quoine" + private const val TTS_NAME = NAME + private const val URL = "https://api.quoine.com/products/code/CASH/%1\$s" + private const val URL_CURRENCY_PAIRS = "https://api.quoine.com/products/" + } +} \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Ripio.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Ripio.kt new file mode 100644 index 00000000..1ea9ad06 --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Ripio.kt @@ -0,0 +1,36 @@ +package com.aneonex.bitcoinchecker.datamodule.model.market + +import com.aneonex.bitcoinchecker.datamodule.model.CheckerInfo +import com.aneonex.bitcoinchecker.datamodule.model.Market +import com.aneonex.bitcoinchecker.datamodule.model.Ticker +import com.aneonex.bitcoinchecker.datamodule.model.currency.Currency +import com.aneonex.bitcoinchecker.datamodule.model.currency.CurrencyPairsMap +import com.aneonex.bitcoinchecker.datamodule.model.currency.VirtualCurrency +import org.json.JSONObject + +class Ripio : Market(NAME, TTS_NAME, CURRENCY_PAIRS) { + companion object { + private const val NAME = "Ripio" + private const val TTS_NAME = NAME + private const val URL = "https://www.ripio.com/api/v1/rates/" + private val CURRENCY_PAIRS: CurrencyPairsMap = CurrencyPairsMap() + + init { + CURRENCY_PAIRS[VirtualCurrency.BTC] = arrayOf( + Currency.ARS + ) + } + } + + override fun getUrl(requestId: Int, checkerInfo: CheckerInfo): String { + return URL + } + + @Throws(Exception::class) + override fun parseTickerFromJsonObject(requestId: Int, jsonObject: JSONObject, ticker: Ticker, checkerInfo: CheckerInfo) { + val ratesJsonObject = jsonObject.getJSONObject("rates") + ticker.bid = ratesJsonObject.getDouble("ARS_SELL") // reversed + ticker.ask = ratesJsonObject.getDouble("ARS_BUY") // reversed + ticker.last = ticker.ask + } +} \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/SatoshiTango.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/SatoshiTango.kt new file mode 100644 index 00000000..0e73ab2f --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/SatoshiTango.kt @@ -0,0 +1,41 @@ +package com.aneonex.bitcoinchecker.datamodule.model.market + +import com.aneonex.bitcoinchecker.datamodule.model.CheckerInfo +import com.aneonex.bitcoinchecker.datamodule.model.Market +import com.aneonex.bitcoinchecker.datamodule.model.Ticker +import com.aneonex.bitcoinchecker.datamodule.model.currency.Currency +import com.aneonex.bitcoinchecker.datamodule.model.currency.CurrencyPairsMap +import com.aneonex.bitcoinchecker.datamodule.model.currency.VirtualCurrency +import org.json.JSONObject + +class SatoshiTango : Market(NAME, TTS_NAME, CURRENCY_PAIRS) { + companion object { + private const val NAME = "SatoshiTango" + private const val TTS_NAME = "Satoshi Tango" + private const val URL = "https://api.satoshitango.com/v2/ticker" + private val CURRENCY_PAIRS: CurrencyPairsMap = CurrencyPairsMap() + + init { + CURRENCY_PAIRS[VirtualCurrency.BTC] = arrayOf( + Currency.USD, + Currency.ARS, + Currency.EUR + ) + } + } + + override fun getUrl(requestId: Int, checkerInfo: CheckerInfo): String { + return URL + } + + @Throws(Exception::class) + override fun parseTickerFromJsonObject(requestId: Int, jsonObject: JSONObject, ticker: Ticker, checkerInfo: CheckerInfo) { + val currencyCode = checkerInfo.currencyCounterLowerCase + checkerInfo.currencyBaseLowerCase + val tickerJsonObject = jsonObject.getJSONObject("data") + val buyObject = tickerJsonObject.getJSONObject("compra") + val sellObject = tickerJsonObject.getJSONObject("venta") + ticker.ask = buyObject.getDouble(currencyCode) + ticker.bid = sellObject.getDouble(currencyCode) + ticker.last = ticker.ask + } +} \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/ShapeShift.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/ShapeShift.kt new file mode 100644 index 00000000..1e62ef7e --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/ShapeShift.kt @@ -0,0 +1,59 @@ +package com.aneonex.bitcoinchecker.datamodule.model.market + +import com.aneonex.bitcoinchecker.datamodule.model.CheckerInfo +import com.aneonex.bitcoinchecker.datamodule.model.CurrencyPairInfo +import com.aneonex.bitcoinchecker.datamodule.model.Market +import com.aneonex.bitcoinchecker.datamodule.model.Ticker +import com.aneonex.bitcoinchecker.datamodule.util.ParseUtils +import org.json.JSONObject +import java.util.* + +class ShapeShift : Market(NAME, TTS_NAME, null) { + override fun getUrl(requestId: Int, checkerInfo: CheckerInfo): String { + return String.format(URL, checkerInfo.currencyBase, checkerInfo.currencyCounter) + } + + @Throws(Exception::class) + override fun parseTickerFromJsonObject(requestId: Int, jsonObject: JSONObject, ticker: Ticker, checkerInfo: CheckerInfo) { + ticker.last = ParseUtils.getDoubleFromString(jsonObject, "rate") + } + + // ==================== + // Get currency pairs + // ==================== + override fun getCurrencyPairsUrl(requestId: Int): String? { + return URL_CURRENCY_PAIRS + } + + @Throws(Exception::class) + override fun parseCurrencyPairsFromJsonObject(requestId: Int, jsonObject: JSONObject, pairs: MutableList) { + val jsonCoinNames = jsonObject.names() + val availableCoinNames: MutableList = ArrayList(jsonCoinNames.length()) + for (i in 0 until jsonCoinNames.length()) { + val coinJsonObject = jsonObject.getJSONObject(jsonCoinNames.getString(i)) + if ("available" == coinJsonObject.optString("status")) { + availableCoinNames.add(coinJsonObject.getString("symbol")) + } + } + val coinesCount = availableCoinNames.size + for (i in 0 until coinesCount) { + for (j in 0 until coinesCount) { + if (i != j) { + val currencyBase = availableCoinNames[i] + val currencyCounter = availableCoinNames[j] + pairs.add(CurrencyPairInfo( + currencyBase, + currencyCounter, + null)) + } + } + } + } + + companion object { + private const val NAME = "ShapeShift" + private const val TTS_NAME = "Shape Shift" + private const val URL = "https://shapeshift.io/rate/%1\$s_%2\$s" + private const val URL_CURRENCY_PAIRS = "https://shapeshift.io/getcoins" + } +} \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/ShareXcoin.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/ShareXcoin.kt new file mode 100644 index 00000000..b1962e5c --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/ShareXcoin.kt @@ -0,0 +1,49 @@ +package com.aneonex.bitcoinchecker.datamodule.model.market + +import com.aneonex.bitcoinchecker.datamodule.model.CheckerInfo +import com.aneonex.bitcoinchecker.datamodule.model.CurrencyPairInfo +import com.aneonex.bitcoinchecker.datamodule.model.Market +import com.aneonex.bitcoinchecker.datamodule.model.Ticker +import org.json.JSONObject + +class ShareXcoin : Market(NAME, TTS_NAME, null) { + override fun getUrl(requestId: Int, checkerInfo: CheckerInfo): String { + return String.format(URL, checkerInfo.currencyBase, checkerInfo.currencyCounter) + } + + @Throws(Exception::class) + override fun parseTickerFromJsonObject(requestId: Int, jsonObject: JSONObject, ticker: Ticker, checkerInfo: CheckerInfo) { + ticker.bid = jsonObject.getDouble("bid") + ticker.ask = jsonObject.getDouble("ask") + ticker.vol = jsonObject.getDouble("volume") + ticker.high = jsonObject.getDouble("high") + ticker.low = jsonObject.getDouble("low") + ticker.last = jsonObject.getDouble("last") + } + + // ==================== + // Get currency pairs + // ==================== + override fun getCurrencyPairsUrl(requestId: Int): String? { + return URL_CURRENCY_PAIRS + } + + @Throws(Exception::class) + override fun parseCurrencyPairsFromJsonObject(requestId: Int, jsonObject: JSONObject, pairs: MutableList) { + val marketsJsonArray = jsonObject.getJSONArray("markets") + for (i in 0 until marketsJsonArray.length()) { + val marketJsonObject = marketsJsonArray.getJSONObject(i) + pairs.add(CurrencyPairInfo( + marketJsonObject.getString("coin1"), + marketJsonObject.getString("coin2"), + marketJsonObject.getString("market_id"))) + } + } + + companion object { + private const val NAME = "ShareXcoin" + private const val TTS_NAME = "Share X coin" + private const val URL = "https://sharexcoin.com/public_api/v1/market/%1\$s_%2\$s/summary" + private const val URL_CURRENCY_PAIRS = "https://sharexcoin.com/public_api/v1/market/summary" + } +} \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/SurBitcoin.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/SurBitcoin.kt new file mode 100644 index 00000000..fd1af369 --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/SurBitcoin.kt @@ -0,0 +1,38 @@ +package com.aneonex.bitcoinchecker.datamodule.model.market + +import com.aneonex.bitcoinchecker.datamodule.model.CheckerInfo +import com.aneonex.bitcoinchecker.datamodule.model.Market +import com.aneonex.bitcoinchecker.datamodule.model.Ticker +import com.aneonex.bitcoinchecker.datamodule.model.currency.Currency +import com.aneonex.bitcoinchecker.datamodule.model.currency.CurrencyPairsMap +import com.aneonex.bitcoinchecker.datamodule.model.currency.VirtualCurrency +import org.json.JSONObject + +class SurBitcoin : Market(NAME, TTS_NAME, CURRENCY_PAIRS) { + companion object { + private const val NAME = "SurBitcoin" + private const val TTS_NAME = "Sur Bitcoin" + private const val URL = "https://api.blinktrade.com/api/v1/%2\$s/ticker?crypto_currency=%1\$s" + private val CURRENCY_PAIRS: CurrencyPairsMap = CurrencyPairsMap() + + init { + CURRENCY_PAIRS[VirtualCurrency.BTC] = arrayOf( + Currency.VEF + ) + } + } + + override fun getUrl(requestId: Int, checkerInfo: CheckerInfo): String { + return String.format(URL, checkerInfo.currencyBase, checkerInfo.currencyCounter) + } + + @Throws(Exception::class) + override fun parseTickerFromJsonObject(requestId: Int, jsonObject: JSONObject, ticker: Ticker, checkerInfo: CheckerInfo) { + ticker.bid = jsonObject.getDouble("buy") + ticker.ask = jsonObject.getDouble("sell") + ticker.vol = jsonObject.getDouble("vol") + ticker.high = jsonObject.getDouble("high") + ticker.low = jsonObject.getDouble("low") + ticker.last = jsonObject.getDouble("last") + } +} \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/SurBtc.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/SurBtc.kt new file mode 100644 index 00000000..d9cf4863 --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/SurBtc.kt @@ -0,0 +1,52 @@ +package com.aneonex.bitcoinchecker.datamodule.model.market + +import com.aneonex.bitcoinchecker.datamodule.model.CheckerInfo +import com.aneonex.bitcoinchecker.datamodule.model.CurrencyPairInfo +import com.aneonex.bitcoinchecker.datamodule.model.Market +import com.aneonex.bitcoinchecker.datamodule.model.Ticker +import org.json.JSONObject + +/** + * Implements SurBTC connection to the API + * @author Eduardo Laguna + */ +class SurBtc : Market(NAME, TTS_NAME, null) { + override fun getUrl(requestId: Int, checkerInfo: CheckerInfo): String { + return String.format(URL, checkerInfo.currencyPairId) + } + + @Throws(Exception::class) + override fun parseTickerFromJsonObject(requestId: Int, jsonObject: JSONObject, ticker: Ticker, checkerInfo: CheckerInfo) { + val tickerJsonObject = jsonObject.getJSONObject("ticker") + ticker.bid = tickerJsonObject.getJSONArray("max_bid").getDouble(0) + ticker.ask = tickerJsonObject.getJSONArray("min_ask").getDouble(0) + ticker.vol = tickerJsonObject.getJSONArray("volume").getDouble(0) + ticker.last = tickerJsonObject.getJSONArray("last_price").getDouble(0) + } + + // ==================== + // Get currency pairs + // ==================== + override fun getCurrencyPairsUrl(requestId: Int): String? { + return URL_CURRENCY_PAIRS + } + + @Throws(Exception::class) + override fun parseCurrencyPairsFromJsonObject(requestId: Int, jsonObject: JSONObject, pairs: MutableList) { + val marketsJsonArray = jsonObject.getJSONArray("markets") + for (i in 0 until marketsJsonArray.length()) { + val marketJsonObject = marketsJsonArray.getJSONObject(i) + pairs.add(CurrencyPairInfo( + marketJsonObject.getString("base_currency"), + marketJsonObject.getString("quote_currency"), + marketJsonObject.getString("id"))) + } + } + + companion object { + private const val NAME = "SurBtc" + private const val TTS_NAME = "Sur BTC" + private const val URL = "https://www.surbtc.com/api/v2/markets/%1\$s/ticker.json" + private const val URL_CURRENCY_PAIRS = "https://www.surbtc.com/api/v2/markets.json" + } +} \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/TheRock.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/TheRock.kt new file mode 100644 index 00000000..90399563 --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/TheRock.kt @@ -0,0 +1,90 @@ +package com.aneonex.bitcoinchecker.datamodule.model.market + +import com.aneonex.bitcoinchecker.datamodule.model.CheckerInfo +import com.aneonex.bitcoinchecker.datamodule.model.CurrencyPairInfo +import com.aneonex.bitcoinchecker.datamodule.model.Market +import com.aneonex.bitcoinchecker.datamodule.model.Ticker +import com.aneonex.bitcoinchecker.datamodule.model.currency.Currency +import com.aneonex.bitcoinchecker.datamodule.model.currency.CurrencyPairsMap +import com.aneonex.bitcoinchecker.datamodule.model.currency.VirtualCurrency +import org.json.JSONObject + +class TheRock : Market(NAME, TTS_NAME, CURRENCY_PAIRS) { + companion object { + private const val NAME = "TheRock" + private const val TTS_NAME = "The Rock" + private const val URL = "https://api.therocktrading.com/v1/funds/%1\$s/ticker" + private const val URL_CURRENCY_PAIRS = "https://api.therocktrading.com/v1/funds" + private val CURRENCY_PAIRS: CurrencyPairsMap = CurrencyPairsMap() + + init { + CURRENCY_PAIRS[VirtualCurrency.BTC] = arrayOf( + Currency.EUR, + Currency.USD, + VirtualCurrency.XRP + ) + CURRENCY_PAIRS[Currency.EUR] = arrayOf( + VirtualCurrency.DOGE, + VirtualCurrency.XRP + ) + CURRENCY_PAIRS[VirtualCurrency.LTC] = arrayOf( + VirtualCurrency.BTC, + Currency.EUR, + Currency.USD + ) + CURRENCY_PAIRS[VirtualCurrency.NMC] = arrayOf( + VirtualCurrency.BTC + ) + CURRENCY_PAIRS[VirtualCurrency.PPC] = arrayOf( + Currency.EUR + ) + CURRENCY_PAIRS[Currency.USD] = arrayOf( + VirtualCurrency.XRP + ) + } + } + + override fun getUrl(requestId: Int, checkerInfo: CheckerInfo): String { + var pairId = checkerInfo.currencyPairId + if (pairId == null) { + pairId = fixCurrency(checkerInfo.currencyBase) + fixCurrency(checkerInfo.currencyCounter) + } + return String.format(URL, pairId) + } + + private fun fixCurrency(currency: String?): String? { + return if (VirtualCurrency.DOGE == currency) { + VirtualCurrency.DOG + } else currency + } + + @Throws(Exception::class) + override fun parseTickerFromJsonObject(requestId: Int, jsonObject: JSONObject, ticker: Ticker, checkerInfo: CheckerInfo) { + ticker.bid = jsonObject.getDouble("bid") + ticker.ask = jsonObject.getDouble("ask") + ticker.vol = jsonObject.getDouble("volume") + ticker.high = jsonObject.getDouble("high") + ticker.low = jsonObject.getDouble("low") + ticker.last = jsonObject.getDouble("last") + } + + // ==================== + // Get currency pairs + // ==================== + override fun getCurrencyPairsUrl(requestId: Int): String? { + return URL_CURRENCY_PAIRS + } + + @Throws(Exception::class) + override fun parseCurrencyPairsFromJsonObject(requestId: Int, jsonObject: JSONObject, pairs: MutableList) { + val fundsJsonArray = jsonObject.getJSONArray("funds") + for (i in 0 until fundsJsonArray.length()) { + val pairJsonObject = fundsJsonArray.getJSONObject(i) + pairs.add(CurrencyPairInfo( + pairJsonObject.getString("trade_currency"), + pairJsonObject.getString("base_currency"), + pairJsonObject.getString("id")) + ) + } + } +} \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Unisend.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Unisend.kt new file mode 100644 index 00000000..d6c9b8bd --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Unisend.kt @@ -0,0 +1,36 @@ +package com.aneonex.bitcoinchecker.datamodule.model.market + +import com.aneonex.bitcoinchecker.datamodule.model.CheckerInfo +import com.aneonex.bitcoinchecker.datamodule.model.Market +import com.aneonex.bitcoinchecker.datamodule.model.Ticker +import com.aneonex.bitcoinchecker.datamodule.model.currency.Currency +import com.aneonex.bitcoinchecker.datamodule.model.currency.CurrencyPairsMap +import com.aneonex.bitcoinchecker.datamodule.model.currency.VirtualCurrency +import org.json.JSONObject + +class Unisend : Market(NAME, TTS_NAME, CURRENCY_PAIRS) { + companion object { + private const val NAME = "Unisend" + private const val TTS_NAME = "Uni send" + private const val URL = "https://www.unisend.com/api/price/ar/ars_btc" + private val CURRENCY_PAIRS: CurrencyPairsMap = CurrencyPairsMap() + + init { + CURRENCY_PAIRS[VirtualCurrency.BTC] = arrayOf( + Currency.ARS + ) + } + } + + override fun getUrl(requestId: Int, checkerInfo: CheckerInfo): String { + return String.format(URL, checkerInfo.currencyBase, checkerInfo.currencyCounter) + } + + @Throws(Exception::class) + override fun parseTickerFromJsonObject(requestId: Int, jsonObject: JSONObject, ticker: Ticker, checkerInfo: CheckerInfo) { + val pricesJsonObject = jsonObject.getJSONObject("prices") + ticker.bid = pricesJsonObject.getDouble("sell") // reversed! + ticker.ask = pricesJsonObject.getDouble("buy") // reversed! + ticker.last = ticker.ask + } +} \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Unknown.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Unknown.kt new file mode 100644 index 00000000..94367878 --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Unknown.kt @@ -0,0 +1,27 @@ +package com.aneonex.bitcoinchecker.datamodule.model.market + +import com.aneonex.bitcoinchecker.datamodule.R +import com.aneonex.bitcoinchecker.datamodule.model.CheckerInfo +import com.aneonex.bitcoinchecker.datamodule.model.Market +import com.aneonex.bitcoinchecker.datamodule.model.currency.CurrencyPairsMap +import com.aneonex.bitcoinchecker.datamodule.model.currency.VirtualCurrency + +class Unknown : Market(NAME, TTS_NAME, CURRENCY_PAIRS) { + companion object { + private const val NAME = "UNKNOWN" + private const val TTS_NAME = NAME + private const val URL = "" + private val CURRENCY_PAIRS: CurrencyPairsMap = CurrencyPairsMap() + + init { + CURRENCY_PAIRS[VirtualCurrency.BTC] = arrayOf(VirtualCurrency.BTC) + } + } + + override val cautionResId: Int + get() = R.string.market_caution_unknown + + override fun getUrl(requestId: Int, checkerInfo: CheckerInfo): String { + return URL + } +} \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Unocoin.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Unocoin.kt new file mode 100644 index 00000000..a5ace5cf --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Unocoin.kt @@ -0,0 +1,35 @@ +package com.aneonex.bitcoinchecker.datamodule.model.market + +import com.aneonex.bitcoinchecker.datamodule.model.CheckerInfo +import com.aneonex.bitcoinchecker.datamodule.model.Market +import com.aneonex.bitcoinchecker.datamodule.model.Ticker +import com.aneonex.bitcoinchecker.datamodule.model.currency.Currency +import com.aneonex.bitcoinchecker.datamodule.model.currency.CurrencyPairsMap +import com.aneonex.bitcoinchecker.datamodule.model.currency.VirtualCurrency +import org.json.JSONObject + +class Unocoin : Market(NAME, TTS_NAME, CURRENCY_PAIRS) { + companion object { + private const val NAME = "Unocoin" + private const val TTS_NAME = "Uno Coin" + private const val URL = "https://www.unocoin.com/trade?all" + private val CURRENCY_PAIRS: CurrencyPairsMap = CurrencyPairsMap() + + init { + CURRENCY_PAIRS[VirtualCurrency.BTC] = arrayOf( + Currency.INR + ) + } + } + + override fun getUrl(requestId: Int, checkerInfo: CheckerInfo): String { + return URL + } + + @Throws(Exception::class) + override fun parseTickerFromJsonObject(requestId: Int, jsonObject: JSONObject, ticker: Ticker, checkerInfo: CheckerInfo) { + ticker.bid = jsonObject.getDouble("sell") + ticker.ask = jsonObject.getDouble("buy") + ticker.last = jsonObject.getDouble("avg") + } +} \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Uphold.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Uphold.kt new file mode 100644 index 00000000..60c461dc --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Uphold.kt @@ -0,0 +1,62 @@ +// @joseccnet contribution. +package com.aneonex.bitcoinchecker.datamodule.model.market + +import com.aneonex.bitcoinchecker.datamodule.model.CheckerInfo +import com.aneonex.bitcoinchecker.datamodule.model.CurrencyPairInfo +import com.aneonex.bitcoinchecker.datamodule.model.Market +import com.aneonex.bitcoinchecker.datamodule.model.Ticker +import com.aneonex.bitcoinchecker.datamodule.util.ParseUtils +import org.json.JSONArray +import org.json.JSONObject + +class Uphold : Market(NAME, TTS_NAME, null) { + override fun getUrl(requestId: Int, checkerInfo: CheckerInfo): String { + return String.format(URL, checkerInfo.currencyPairId) + } + + @Throws(Exception::class) + override fun parseTickerFromJsonObject(requestId: Int, jsonObject: JSONObject, ticker: Ticker, checkerInfo: CheckerInfo) { + ticker.bid = ParseUtils.getDoubleFromString(jsonObject, "bid") + ticker.ask = ParseUtils.getDoubleFromString(jsonObject, "ask") + ticker.last = (ticker.bid + ticker.ask) / 2 //This is how Uphold operate on production (as I observed) + } + + // ==================== + // Get currency pairs + // ==================== + override fun getCurrencyPairsUrl(requestId: Int): String? { + return URL_CURRENCY_PAIRS + } + + @Throws(Exception::class) + override fun parseCurrencyPairs(requestId: Int, responseString: String, pairs: MutableList) { + val pairsJsonArray = JSONArray(responseString) + for (i in 0 until pairsJsonArray.length()) { + val pairJsonObject = pairsJsonArray.getJSONObject(i) + val pairId = pairJsonObject.getString("pair") + val currencyCounter = pairJsonObject.getString("currency") + if (currencyCounter != null && pairId != null && pairId.endsWith(currencyCounter)) { + val currencyBase = pairId.substring(0, pairId.length - currencyCounter.length) + if (currencyCounter != currencyBase) { + // normal pair + pairs.add(CurrencyPairInfo( + currencyBase, + currencyCounter, + pairId)) + // reversed pair + pairs.add(CurrencyPairInfo( + currencyCounter, + currencyBase, + currencyCounter + currencyBase)) + } + } + } + } + + companion object { + private const val NAME = "Uphold" + private const val TTS_NAME = NAME + private const val URL = "https://api.uphold.com/v0/ticker/%1\$s" + private const val URL_CURRENCY_PAIRS = "https://api.uphold.com/v0/ticker" + } +} \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Urdubit.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Urdubit.kt new file mode 100644 index 00000000..4a86fd7d --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Urdubit.kt @@ -0,0 +1,42 @@ +package com.aneonex.bitcoinchecker.datamodule.model.market + +import com.aneonex.bitcoinchecker.datamodule.model.CheckerInfo +import com.aneonex.bitcoinchecker.datamodule.model.Market +import com.aneonex.bitcoinchecker.datamodule.model.Ticker +import com.aneonex.bitcoinchecker.datamodule.model.currency.Currency +import com.aneonex.bitcoinchecker.datamodule.model.currency.CurrencyPairsMap +import com.aneonex.bitcoinchecker.datamodule.model.currency.VirtualCurrency +import org.json.JSONObject + +/** + * Created by naveed on 17/01/2017. + */ +class Urdubit : Market(NAME, TTS_NAME, CURRENCY_PAIRS) { + companion object { + private const val NAME = "Urdubit" + private const val TTS_NAME = NAME + private const val URL = "https://api.blinktrade.com/api/v1/%2\$s/ticker?crypto_currency=%1\$s" + private val CURRENCY_PAIRS: CurrencyPairsMap = CurrencyPairsMap() + + init { + CURRENCY_PAIRS[VirtualCurrency.BTC] = arrayOf( + Currency.PKR + ) + } + } + + override fun getUrl(requestId: Int, checkerInfo: CheckerInfo): String { + return String.format(URL, checkerInfo.currencyBase, checkerInfo.currencyCounter) + } + + @Throws(Exception::class) + override fun parseTickerFromJsonObject(requestId: Int, jsonObject: JSONObject, ticker: Ticker, checkerInfo: CheckerInfo) { + ticker.bid = jsonObject.getDouble("buy") + ticker.ask = jsonObject.getDouble("sell") + ticker.vol = jsonObject.getDouble("vol") + ticker.high = jsonObject.getDouble("high") + ticker.low = jsonObject.getDouble("low") + ticker.last = jsonObject.getDouble("last") + //ticker.timestamp = jsonObject.getLong("timestamp"); + } +} \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/VBtc.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/VBtc.kt new file mode 100644 index 00000000..d434c619 --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/VBtc.kt @@ -0,0 +1,38 @@ +package com.aneonex.bitcoinchecker.datamodule.model.market + +import com.aneonex.bitcoinchecker.datamodule.model.CheckerInfo +import com.aneonex.bitcoinchecker.datamodule.model.Market +import com.aneonex.bitcoinchecker.datamodule.model.Ticker +import com.aneonex.bitcoinchecker.datamodule.model.currency.Currency +import com.aneonex.bitcoinchecker.datamodule.model.currency.CurrencyPairsMap +import com.aneonex.bitcoinchecker.datamodule.model.currency.VirtualCurrency +import org.json.JSONObject + +class VBtc : Market(NAME, TTS_NAME, CURRENCY_PAIRS) { + companion object { + private const val NAME = "VBTC.vn" + private const val TTS_NAME = "V BTC" + private const val URL = "https://api.blinktrade.com/api/v1/%2\$s/ticker?crypto_currency=%1\$s" + private val CURRENCY_PAIRS: CurrencyPairsMap = CurrencyPairsMap() + + init { + CURRENCY_PAIRS[VirtualCurrency.BTC] = arrayOf( + Currency.VND + ) + } + } + + override fun getUrl(requestId: Int, checkerInfo: CheckerInfo): String { + return String.format(URL, checkerInfo.currencyBase, checkerInfo.currencyCounter) + } + + @Throws(Exception::class) + override fun parseTickerFromJsonObject(requestId: Int, jsonObject: JSONObject, ticker: Ticker, checkerInfo: CheckerInfo) { + ticker.bid = jsonObject.getDouble("buy") + ticker.ask = jsonObject.getDouble("sell") + ticker.vol = jsonObject.getDouble("vol") + ticker.high = jsonObject.getDouble("high") + ticker.low = jsonObject.getDouble("low") + ticker.last = jsonObject.getDouble("last") + } +} \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/VaultOfSatoshi.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/VaultOfSatoshi.kt new file mode 100644 index 00000000..2825cb5f --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/VaultOfSatoshi.kt @@ -0,0 +1,65 @@ +package com.aneonex.bitcoinchecker.datamodule.model.market + +import com.aneonex.bitcoinchecker.datamodule.model.CheckerInfo +import com.aneonex.bitcoinchecker.datamodule.model.CurrencyPairInfo +import com.aneonex.bitcoinchecker.datamodule.model.Market +import com.aneonex.bitcoinchecker.datamodule.model.Ticker +import org.json.JSONObject +import java.util.* + +class VaultOfSatoshi : Market(NAME, TTS_NAME, null) { + override fun getUrl(requestId: Int, checkerInfo: CheckerInfo): String { + return String.format(URL, checkerInfo.currencyBaseLowerCase, checkerInfo.currencyCounterLowerCase) + } + + @Throws(Exception::class) + override fun parseTickerFromJsonObject(requestId: Int, jsonObject: JSONObject, ticker: Ticker, checkerInfo: CheckerInfo) { + val dataObject = jsonObject.getJSONObject("data") + ticker.vol = getDoubleFromMtgoxFormatObject(dataObject, "volume_1day") + ticker.high = getDoubleFromMtgoxFormatObject(dataObject, "max_price") + ticker.low = getDoubleFromMtgoxFormatObject(dataObject, "min_price") + ticker.last = getDoubleFromMtgoxFormatObject(dataObject, "closing_price") + ticker.timestamp = dataObject.getLong("date") + } + + @Throws(Exception::class) + private fun getDoubleFromMtgoxFormatObject(jsonObject: JSONObject, key: String): Double { + val innerObject = jsonObject.getJSONObject(key) + return innerObject.getDouble("value") + } + + // ==================== + // Get currency pairs + // ==================== + override fun getCurrencyPairsUrl(requestId: Int): String? { + return URL_CURRENCY_PAIRS + } + + @Throws(Exception::class) + override fun parseCurrencyPairsFromJsonObject(requestId: Int, jsonObject: JSONObject, pairs: MutableList) { + val dataJsonArray = jsonObject.getJSONArray("data") + val virtualCurrencies = ArrayList() + val currencies = ArrayList() + for (i in 0 until dataJsonArray.length()) { + val currencyJsonObject = dataJsonArray.getJSONObject(i) + if (currencyJsonObject.getInt("virtual") != 0) virtualCurrencies.add(currencyJsonObject.getString("code")) else currencies.add(currencyJsonObject.getString("code")) + } + val virtualCurrenciesCount = virtualCurrencies.size + val currenciesCount = currencies.size + for (i in 0 until virtualCurrenciesCount) { + for (j in 0 until currenciesCount) { + pairs.add(CurrencyPairInfo(virtualCurrencies[i], currencies[j], null)) + } + for (j in 0 until virtualCurrenciesCount) { + if (i != j) pairs.add(CurrencyPairInfo(virtualCurrencies[i], virtualCurrencies[j], null)) + } + } + } + + companion object { + private const val NAME = "VaultOfSatoshi" + private const val TTS_NAME = "Vault Of Satoshi" + private const val URL = "https://api.vaultofsatoshi.com/public/ticker?order_currency=%1\$s&payment_currency=%2\$s" + private const val URL_CURRENCY_PAIRS = "https://api.vaultofsatoshi.com/public/currency" + } +} \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Vaultoro.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Vaultoro.kt new file mode 100644 index 00000000..a60cb437 --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Vaultoro.kt @@ -0,0 +1,32 @@ +package com.aneonex.bitcoinchecker.datamodule.model.market + +import com.aneonex.bitcoinchecker.datamodule.model.CheckerInfo +import com.aneonex.bitcoinchecker.datamodule.model.Market +import com.aneonex.bitcoinchecker.datamodule.model.Ticker +import com.aneonex.bitcoinchecker.datamodule.model.currency.Currency +import com.aneonex.bitcoinchecker.datamodule.model.currency.CurrencyPairsMap +import com.aneonex.bitcoinchecker.datamodule.model.currency.VirtualCurrency + +class Vaultoro : Market(NAME, TTS_NAME, CURRENCY_PAIRS) { + companion object { + private const val NAME = "Vaultoro" + private const val TTS_NAME = NAME + private const val URL = "https://api.vaultoro.com/latest/" + private val CURRENCY_PAIRS: CurrencyPairsMap = CurrencyPairsMap() + + init { + CURRENCY_PAIRS[Currency.GOLD] = arrayOf( + VirtualCurrency.BTC + ) + } + } + + override fun getUrl(requestId: Int, checkerInfo: CheckerInfo): String { + return URL + } + + @Throws(Exception::class) + override fun parseTicker(requestId: Int, responseString: String, ticker: Ticker, checkerInfo: CheckerInfo) { + ticker.last = responseString.toDouble() + } +} \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Vircurex.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Vircurex.kt new file mode 100644 index 00000000..03d8e9df --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Vircurex.kt @@ -0,0 +1,452 @@ +package com.aneonex.bitcoinchecker.datamodule.model.market + +import com.aneonex.bitcoinchecker.datamodule.model.CheckerInfo +import com.aneonex.bitcoinchecker.datamodule.model.Market +import com.aneonex.bitcoinchecker.datamodule.model.Ticker +import com.aneonex.bitcoinchecker.datamodule.model.currency.Currency +import com.aneonex.bitcoinchecker.datamodule.model.currency.CurrencyPairsMap +import com.aneonex.bitcoinchecker.datamodule.model.currency.VirtualCurrency +import org.json.JSONObject + +class Vircurex : Market(NAME, TTS_NAME, CURRENCY_PAIRS) { + companion object { + private const val NAME = "Vircurex" + private const val TTS_NAME = NAME + private const val URL = "https://api.vircurex.com/api/get_info_for_1_currency.json?base=%1\$s&alt=%2\$s" + private val CURRENCY_PAIRS: CurrencyPairsMap = CurrencyPairsMap() + + init { + CURRENCY_PAIRS[VirtualCurrency.BTC] = arrayOf( + Currency.USD, + Currency.EUR, + VirtualCurrency.ANC, + VirtualCurrency.DGC, + VirtualCurrency.DOGE, + VirtualCurrency.DVC, + VirtualCurrency.FRC, + VirtualCurrency.FTC, + VirtualCurrency.I0C, + VirtualCurrency.IXC, + VirtualCurrency.LTC, + VirtualCurrency.NMC, + VirtualCurrency.NVC, + VirtualCurrency.NXT, + VirtualCurrency.PPC, + VirtualCurrency.QRK, + VirtualCurrency.TRC, + VirtualCurrency.VTC, + VirtualCurrency.WDC, + VirtualCurrency.XPM + ) + CURRENCY_PAIRS[VirtualCurrency.ANC] = arrayOf( + Currency.USD, + Currency.EUR, + VirtualCurrency.BTC, + VirtualCurrency.DGC, + VirtualCurrency.DOGE, + VirtualCurrency.DVC, + VirtualCurrency.FRC, + VirtualCurrency.FTC, + VirtualCurrency.I0C, + VirtualCurrency.IXC, + VirtualCurrency.LTC, + VirtualCurrency.NMC, + VirtualCurrency.NVC, + VirtualCurrency.NXT, + VirtualCurrency.PPC, + VirtualCurrency.QRK, + VirtualCurrency.TRC, + VirtualCurrency.VTC, + VirtualCurrency.WDC, + VirtualCurrency.XPM + ) + CURRENCY_PAIRS[VirtualCurrency.DGC] = arrayOf( + Currency.USD, + Currency.EUR, + VirtualCurrency.BTC, + VirtualCurrency.ANC, + VirtualCurrency.DOGE, + VirtualCurrency.DVC, + VirtualCurrency.FRC, + VirtualCurrency.FTC, + VirtualCurrency.I0C, + VirtualCurrency.IXC, + VirtualCurrency.LTC, + VirtualCurrency.NMC, + VirtualCurrency.NVC, + VirtualCurrency.NXT, + VirtualCurrency.PPC, + VirtualCurrency.QRK, + VirtualCurrency.TRC, + VirtualCurrency.VTC, + VirtualCurrency.WDC, + VirtualCurrency.XPM + ) + CURRENCY_PAIRS[VirtualCurrency.DOGE] = arrayOf( + Currency.USD, + Currency.EUR, + VirtualCurrency.BTC, + VirtualCurrency.ANC, + VirtualCurrency.DGC, + VirtualCurrency.DVC, + VirtualCurrency.FRC, + VirtualCurrency.FTC, + VirtualCurrency.I0C, + VirtualCurrency.IXC, + VirtualCurrency.LTC, + VirtualCurrency.NMC, + VirtualCurrency.NVC, + VirtualCurrency.NXT, + VirtualCurrency.PPC, + VirtualCurrency.QRK, + VirtualCurrency.TRC, + VirtualCurrency.VTC, + VirtualCurrency.WDC, + VirtualCurrency.XPM + ) + CURRENCY_PAIRS[VirtualCurrency.DVC] = arrayOf( + Currency.USD, + Currency.EUR, + VirtualCurrency.BTC, + VirtualCurrency.ANC, + VirtualCurrency.DGC, + VirtualCurrency.DOGE, + VirtualCurrency.FRC, + VirtualCurrency.FTC, + VirtualCurrency.I0C, + VirtualCurrency.IXC, + VirtualCurrency.LTC, + VirtualCurrency.NMC, + VirtualCurrency.NVC, + VirtualCurrency.NXT, + VirtualCurrency.PPC, + VirtualCurrency.QRK, + VirtualCurrency.TRC, + VirtualCurrency.VTC, + VirtualCurrency.WDC, + VirtualCurrency.XPM + ) + CURRENCY_PAIRS[VirtualCurrency.FRC] = arrayOf( + Currency.USD, + Currency.EUR, + VirtualCurrency.BTC, + VirtualCurrency.ANC, + VirtualCurrency.DGC, + VirtualCurrency.DOGE, + VirtualCurrency.DVC, + VirtualCurrency.FTC, + VirtualCurrency.I0C, + VirtualCurrency.IXC, + VirtualCurrency.LTC, + VirtualCurrency.NMC, + VirtualCurrency.NVC, + VirtualCurrency.NXT, + VirtualCurrency.PPC, + VirtualCurrency.QRK, + VirtualCurrency.TRC, + VirtualCurrency.VTC, + VirtualCurrency.WDC, + VirtualCurrency.XPM + ) + CURRENCY_PAIRS[VirtualCurrency.FTC] = arrayOf( + Currency.USD, + Currency.EUR, + VirtualCurrency.BTC, + VirtualCurrency.ANC, + VirtualCurrency.DGC, + VirtualCurrency.DOGE, + VirtualCurrency.DVC, + VirtualCurrency.FRC, + VirtualCurrency.I0C, + VirtualCurrency.IXC, + VirtualCurrency.LTC, + VirtualCurrency.NMC, + VirtualCurrency.NVC, + VirtualCurrency.NXT, + VirtualCurrency.PPC, + VirtualCurrency.QRK, + VirtualCurrency.TRC, + VirtualCurrency.VTC, + VirtualCurrency.WDC, + VirtualCurrency.XPM + ) + CURRENCY_PAIRS[VirtualCurrency.I0C] = arrayOf( + Currency.USD, + Currency.EUR, + VirtualCurrency.BTC, + VirtualCurrency.ANC, + VirtualCurrency.DGC, + VirtualCurrency.DOGE, + VirtualCurrency.DVC, + VirtualCurrency.FRC, + VirtualCurrency.FTC, + VirtualCurrency.IXC, + VirtualCurrency.LTC, + VirtualCurrency.NMC, + VirtualCurrency.NVC, + VirtualCurrency.NXT, + VirtualCurrency.PPC, + VirtualCurrency.QRK, + VirtualCurrency.TRC, + VirtualCurrency.VTC, + VirtualCurrency.WDC, + VirtualCurrency.XPM + ) + CURRENCY_PAIRS[VirtualCurrency.IXC] = arrayOf( + Currency.USD, + Currency.EUR, + VirtualCurrency.BTC, + VirtualCurrency.ANC, + VirtualCurrency.DGC, + VirtualCurrency.DOGE, + VirtualCurrency.DVC, + VirtualCurrency.FRC, + VirtualCurrency.FTC, + VirtualCurrency.I0C, + VirtualCurrency.LTC, + VirtualCurrency.NMC, + VirtualCurrency.NVC, + VirtualCurrency.NXT, + VirtualCurrency.PPC, + VirtualCurrency.QRK, + VirtualCurrency.TRC, + VirtualCurrency.VTC, + VirtualCurrency.WDC, + VirtualCurrency.XPM + ) + CURRENCY_PAIRS[VirtualCurrency.LTC] = arrayOf( + Currency.USD, + Currency.EUR, + VirtualCurrency.BTC, + VirtualCurrency.ANC, + VirtualCurrency.DGC, + VirtualCurrency.DOGE, + VirtualCurrency.DVC, + VirtualCurrency.FRC, + VirtualCurrency.FTC, + VirtualCurrency.I0C, + VirtualCurrency.IXC, + VirtualCurrency.NMC, + VirtualCurrency.NVC, + VirtualCurrency.NXT, + VirtualCurrency.PPC, + VirtualCurrency.QRK, + VirtualCurrency.TRC, + VirtualCurrency.VTC, + VirtualCurrency.WDC, + VirtualCurrency.XPM + ) + CURRENCY_PAIRS[VirtualCurrency.NMC] = arrayOf( + Currency.USD, + Currency.EUR, + VirtualCurrency.BTC, + VirtualCurrency.ANC, + VirtualCurrency.DGC, + VirtualCurrency.DOGE, + VirtualCurrency.DVC, + VirtualCurrency.FRC, + VirtualCurrency.FTC, + VirtualCurrency.I0C, + VirtualCurrency.IXC, + VirtualCurrency.LTC, + VirtualCurrency.NVC, + VirtualCurrency.NXT, + VirtualCurrency.PPC, + VirtualCurrency.QRK, + VirtualCurrency.TRC, + VirtualCurrency.VTC, + VirtualCurrency.WDC, + VirtualCurrency.XPM + ) + CURRENCY_PAIRS[VirtualCurrency.NVC] = arrayOf( + Currency.USD, + Currency.EUR, + VirtualCurrency.BTC, + VirtualCurrency.ANC, + VirtualCurrency.DGC, + VirtualCurrency.DOGE, + VirtualCurrency.DVC, + VirtualCurrency.FRC, + VirtualCurrency.FTC, + VirtualCurrency.I0C, + VirtualCurrency.IXC, + VirtualCurrency.LTC, + VirtualCurrency.NMC, + VirtualCurrency.NXT, + VirtualCurrency.PPC, + VirtualCurrency.QRK, + VirtualCurrency.TRC, + VirtualCurrency.VTC, + VirtualCurrency.WDC, + VirtualCurrency.XPM + ) + CURRENCY_PAIRS[VirtualCurrency.NXT] = arrayOf( + Currency.USD, + Currency.EUR, + VirtualCurrency.BTC, + VirtualCurrency.ANC, + VirtualCurrency.DGC, + VirtualCurrency.DOGE, + VirtualCurrency.DVC, + VirtualCurrency.FRC, + VirtualCurrency.FTC, + VirtualCurrency.I0C, + VirtualCurrency.IXC, + VirtualCurrency.LTC, + VirtualCurrency.NMC, + VirtualCurrency.NVC, + VirtualCurrency.PPC, + VirtualCurrency.QRK, + VirtualCurrency.TRC, + VirtualCurrency.VTC, + VirtualCurrency.WDC, + VirtualCurrency.XPM + ) + CURRENCY_PAIRS[VirtualCurrency.PPC] = arrayOf( + Currency.USD, + Currency.EUR, + VirtualCurrency.BTC, + VirtualCurrency.ANC, + VirtualCurrency.DGC, + VirtualCurrency.DOGE, + VirtualCurrency.DVC, + VirtualCurrency.FRC, + VirtualCurrency.FTC, + VirtualCurrency.I0C, + VirtualCurrency.IXC, + VirtualCurrency.LTC, + VirtualCurrency.NMC, + VirtualCurrency.NVC, + VirtualCurrency.NXT, + VirtualCurrency.QRK, + VirtualCurrency.TRC, + VirtualCurrency.VTC, + VirtualCurrency.WDC, + VirtualCurrency.XPM + ) + CURRENCY_PAIRS[VirtualCurrency.QRK] = arrayOf( + Currency.USD, + Currency.EUR, + VirtualCurrency.BTC, + VirtualCurrency.ANC, + VirtualCurrency.DGC, + VirtualCurrency.DOGE, + VirtualCurrency.DVC, + VirtualCurrency.FRC, + VirtualCurrency.FTC, + VirtualCurrency.I0C, + VirtualCurrency.IXC, + VirtualCurrency.LTC, + VirtualCurrency.NMC, + VirtualCurrency.NVC, + VirtualCurrency.NXT, + VirtualCurrency.PPC, + VirtualCurrency.TRC, + VirtualCurrency.VTC, + VirtualCurrency.WDC, + VirtualCurrency.XPM + ) + CURRENCY_PAIRS[VirtualCurrency.TRC] = arrayOf( + Currency.USD, + Currency.EUR, + VirtualCurrency.BTC, + VirtualCurrency.ANC, + VirtualCurrency.DGC, + VirtualCurrency.DOGE, + VirtualCurrency.DVC, + VirtualCurrency.FRC, + VirtualCurrency.FTC, + VirtualCurrency.I0C, + VirtualCurrency.IXC, + VirtualCurrency.LTC, + VirtualCurrency.NMC, + VirtualCurrency.NVC, + VirtualCurrency.NXT, + VirtualCurrency.PPC, + VirtualCurrency.QRK, + VirtualCurrency.VTC, + VirtualCurrency.WDC, + VirtualCurrency.XPM + ) + CURRENCY_PAIRS[VirtualCurrency.VTC] = arrayOf( + Currency.USD, + Currency.EUR, + VirtualCurrency.BTC, + VirtualCurrency.ANC, + VirtualCurrency.DGC, + VirtualCurrency.DOGE, + VirtualCurrency.DVC, + VirtualCurrency.FRC, + VirtualCurrency.FTC, + VirtualCurrency.I0C, + VirtualCurrency.IXC, + VirtualCurrency.LTC, + VirtualCurrency.NMC, + VirtualCurrency.NVC, + VirtualCurrency.NXT, + VirtualCurrency.PPC, + VirtualCurrency.QRK, + VirtualCurrency.TRC, + VirtualCurrency.WDC, + VirtualCurrency.XPM + ) + CURRENCY_PAIRS[VirtualCurrency.WDC] = arrayOf( + Currency.USD, + Currency.EUR, + VirtualCurrency.BTC, + VirtualCurrency.ANC, + VirtualCurrency.DGC, + VirtualCurrency.DOGE, + VirtualCurrency.DVC, + VirtualCurrency.FRC, + VirtualCurrency.FTC, + VirtualCurrency.I0C, + VirtualCurrency.IXC, + VirtualCurrency.LTC, + VirtualCurrency.NMC, + VirtualCurrency.NVC, + VirtualCurrency.NXT, + VirtualCurrency.PPC, + VirtualCurrency.QRK, + VirtualCurrency.TRC, + VirtualCurrency.VTC, + VirtualCurrency.XPM + ) + CURRENCY_PAIRS[VirtualCurrency.XPM] = arrayOf( + Currency.USD, + Currency.EUR, + VirtualCurrency.BTC, + VirtualCurrency.ANC, + VirtualCurrency.DGC, + VirtualCurrency.DOGE, + VirtualCurrency.DVC, + VirtualCurrency.FRC, + VirtualCurrency.FTC, + VirtualCurrency.I0C, + VirtualCurrency.IXC, + VirtualCurrency.LTC, + VirtualCurrency.NMC, + VirtualCurrency.NVC, + VirtualCurrency.NXT, + VirtualCurrency.PPC, + VirtualCurrency.QRK, + VirtualCurrency.TRC, + VirtualCurrency.VTC, + VirtualCurrency.WDC) + } + } + + override fun getUrl(requestId: Int, checkerInfo: CheckerInfo): String { + return String.format(URL, checkerInfo.currencyBase, checkerInfo.currencyCounter) + } + + @Throws(Exception::class) + override fun parseTickerFromJsonObject(requestId: Int, jsonObject: JSONObject, ticker: Ticker, checkerInfo: CheckerInfo) { + ticker.bid = jsonObject.getDouble("highest_bid") + ticker.ask = jsonObject.getDouble("lowest_ask") + ticker.vol = jsonObject.getDouble("volume") + // ticker.high; +// ticker.low; + ticker.last = jsonObject.getDouble("last_trade") + } +} \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Virtex.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Virtex.kt new file mode 100644 index 00000000..e448dc57 --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Virtex.kt @@ -0,0 +1,54 @@ +package com.aneonex.bitcoinchecker.datamodule.model.market + +import com.aneonex.bitcoinchecker.datamodule.model.CheckerInfo +import com.aneonex.bitcoinchecker.datamodule.model.Market +import com.aneonex.bitcoinchecker.datamodule.model.Ticker +import com.aneonex.bitcoinchecker.datamodule.model.currency.Currency +import com.aneonex.bitcoinchecker.datamodule.model.currency.CurrencyPairsMap +import com.aneonex.bitcoinchecker.datamodule.model.currency.VirtualCurrency +import org.json.JSONObject + +class Virtex : Market(NAME, TTS_NAME, CURRENCY_PAIRS) { + companion object { + private const val NAME = "CaVirtEx" + private const val TTS_NAME = NAME + private const val URL = "https://cavirtex.com/api2/ticker.json" + private val CURRENCY_PAIRS: CurrencyPairsMap = CurrencyPairsMap() + + init { + CURRENCY_PAIRS[VirtualCurrency.BTC] = arrayOf( + Currency.CAD, + VirtualCurrency.LTC + ) + CURRENCY_PAIRS[VirtualCurrency.LTC] = arrayOf( + Currency.CAD + ) + } + } + + override fun getUrl(requestId: Int, checkerInfo: CheckerInfo): String { + return URL + } + + @Throws(Exception::class) + override fun parseTickerFromJsonObject(requestId: Int, jsonObject: JSONObject, ticker: Ticker, checkerInfo: CheckerInfo) { + val tickerJsonObject = jsonObject.getJSONObject("ticker") + val pairJsonObject = tickerJsonObject.getJSONObject(checkerInfo.currencyBase + checkerInfo.currencyCounter) + if (!pairJsonObject.isNull("buy")) { + ticker.bid = pairJsonObject.getDouble("buy") + } + if (!pairJsonObject.isNull("sell")) { + ticker.ask = pairJsonObject.getDouble("sell") + } + if (!pairJsonObject.isNull("volume")) { + ticker.vol = pairJsonObject.getDouble("volume") + } + if (!pairJsonObject.isNull("high")) { + ticker.high = pairJsonObject.getDouble("high") + } + if (!pairJsonObject.isNull("low")) { + ticker.low = pairJsonObject.getDouble("low") + } + ticker.last = pairJsonObject.getDouble("last") + } +} \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Winkdex.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Winkdex.kt new file mode 100644 index 00000000..373a40ff --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Winkdex.kt @@ -0,0 +1,36 @@ +package com.aneonex.bitcoinchecker.datamodule.model.market + +import com.aneonex.bitcoinchecker.datamodule.model.CheckerInfo +import com.aneonex.bitcoinchecker.datamodule.model.Market +import com.aneonex.bitcoinchecker.datamodule.model.Ticker +import com.aneonex.bitcoinchecker.datamodule.model.currency.Currency +import com.aneonex.bitcoinchecker.datamodule.model.currency.VirtualCurrency +import com.aneonex.bitcoinchecker.datamodule.model.currency.CurrencyPairsMap +import org.json.JSONObject + +class Winkdex : Market(NAME, TTS_NAME, CURRENCY_PAIRS) { + companion object { + private const val NAME = "Winkdex" + private const val TTS_NAME = NAME + private const val URL = "http://winkdex.com/static/js/stats.js" + private val CURRENCY_PAIRS: CurrencyPairsMap = CurrencyPairsMap() + + init { + CURRENCY_PAIRS[VirtualCurrency.BTC] = arrayOf( + Currency.USD + ) + } + } + + override fun getUrl(requestId: Int, checkerInfo: CheckerInfo): String { + return URL + } + + @Throws(Exception::class) + override fun parseTickerFromJsonObject(requestId: Int, jsonObject: JSONObject, ticker: Ticker, checkerInfo: CheckerInfo) { + ticker.vol = jsonObject.getDouble("volume_btc_24h") + ticker.high = jsonObject.getDouble("winkdex_high_24h") + ticker.low = jsonObject.getDouble("winkdex_low_24h") + ticker.last = jsonObject.getDouble("winkdex_usd") + } +} \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/YoBit.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/YoBit.kt new file mode 100644 index 00000000..78bf57ea --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/YoBit.kt @@ -0,0 +1,59 @@ +package com.aneonex.bitcoinchecker.datamodule.model.market + +import com.aneonex.bitcoinchecker.datamodule.model.CheckerInfo +import com.aneonex.bitcoinchecker.datamodule.model.CurrencyPairInfo +import com.aneonex.bitcoinchecker.datamodule.model.Market +import com.aneonex.bitcoinchecker.datamodule.model.Ticker +import com.aneonex.bitcoinchecker.datamodule.R +import org.json.JSONObject +import java.util.* + +class YoBit : Market(NAME, TTS_NAME, null) { + override val cautionResId: Int + get() = R.string.market_caution_yobit + + override fun getUrl(requestId: Int, checkerInfo: CheckerInfo): String { + return String.format(URL, checkerInfo.currencyPairId) + } + + @Throws(Exception::class) + override fun parseTickerFromJsonObject(requestId: Int, jsonObject: JSONObject, ticker: Ticker, checkerInfo: CheckerInfo) { + val names = jsonObject.names() + val tickerJsonObject = jsonObject.getJSONObject(names.getString(0)) + ticker.bid = tickerJsonObject.getDouble("sell") + ticker.ask = tickerJsonObject.getDouble("buy") + ticker.vol = tickerJsonObject.getDouble("vol") + ticker.high = tickerJsonObject.getDouble("high") + ticker.low = tickerJsonObject.getDouble("low") + ticker.last = tickerJsonObject.getDouble("last") + ticker.timestamp = tickerJsonObject.getLong("updated") + } + + // ==================== + // Get currency pairs + // ==================== + override fun getCurrencyPairsUrl(requestId: Int): String? { + return URL_CURRENCY_PAIRS + } + + @Throws(Exception::class) + override fun parseCurrencyPairsFromJsonObject(requestId: Int, jsonObject: JSONObject, pairs: MutableList) { + val pairsJsonObject = jsonObject.getJSONObject("pairs") + val pairsNames = pairsJsonObject.names() + for (i in 0 until pairsNames.length()) { + val pairId = pairsNames.getString(i) ?: continue + val currencies = pairId.split("_".toRegex()).toTypedArray() + if (currencies.size != 2) continue + val currencyBase = currencies[0].toUpperCase(Locale.ENGLISH) + val currencyCounter = currencies[1].toUpperCase(Locale.ENGLISH) + pairs.add(CurrencyPairInfo(currencyBase, currencyCounter, pairId)) + } + } + + companion object { + private const val NAME = "YoBit" + private const val TTS_NAME = NAME + private const val URL = "https://yobit.net/api/3/ticker/%1\$s" + private const val URL_CURRENCY_PAIRS = "https://yobit.net/api/3/info" + } +} \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Zaydo.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Zaydo.kt new file mode 100644 index 00000000..9b1355f0 --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Zaydo.kt @@ -0,0 +1,39 @@ +package com.aneonex.bitcoinchecker.datamodule.model.market + +import com.aneonex.bitcoinchecker.datamodule.model.CheckerInfo +import com.aneonex.bitcoinchecker.datamodule.model.Market +import com.aneonex.bitcoinchecker.datamodule.model.Ticker +import com.aneonex.bitcoinchecker.datamodule.model.currency.Currency +import com.aneonex.bitcoinchecker.datamodule.model.currency.CurrencyPairsMap +import com.aneonex.bitcoinchecker.datamodule.model.currency.VirtualCurrency +import com.aneonex.bitcoinchecker.datamodule.util.ParseUtils +import org.json.JSONObject + +class Zaydo : Market(NAME, TTS_NAME, CURRENCY_PAIRS) { + companion object { + private const val NAME = "Zaydo" + private const val TTS_NAME = NAME + private const val URL = "http://chart.zyado.com/ticker.json" + private val CURRENCY_PAIRS: CurrencyPairsMap = CurrencyPairsMap() + + init { + CURRENCY_PAIRS[VirtualCurrency.BTC] = arrayOf( + Currency.EUR + ) + } + } + + override fun getUrl(requestId: Int, checkerInfo: CheckerInfo): String { + return URL + } + + @Throws(Exception::class) + override fun parseTickerFromJsonObject(requestId: Int, jsonObject: JSONObject, ticker: Ticker, checkerInfo: CheckerInfo) { + ticker.bid = ParseUtils.getDoubleFromString(jsonObject, "bid") + ticker.ask = ParseUtils.getDoubleFromString(jsonObject, "ask") + ticker.vol = ParseUtils.getDoubleFromString(jsonObject, "volume") + ticker.high = ParseUtils.getDoubleFromString(jsonObject, "high") + ticker.low = ParseUtils.getDoubleFromString(jsonObject, "low") + ticker.last = ParseUtils.getDoubleFromString(jsonObject, "last") + } +} \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Zebpay.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Zebpay.kt new file mode 100644 index 00000000..7abde0bd --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Zebpay.kt @@ -0,0 +1,92 @@ +package com.aneonex.bitcoinchecker.datamodule.model.market + +import com.aneonex.bitcoinchecker.datamodule.model.CheckerInfo +import com.aneonex.bitcoinchecker.datamodule.model.Market +import com.aneonex.bitcoinchecker.datamodule.model.Ticker +import com.aneonex.bitcoinchecker.datamodule.model.currency.CurrencyPairsMap +import com.aneonex.bitcoinchecker.datamodule.model.currency.VirtualCurrency +import org.json.JSONObject + +class Zebpay : Market(NAME, TTS_NAME, CURRENCY_PAIRS) { + companion object { + private const val NAME = "Zebpay" + private const val TTS_NAME = "Zeb Pay" + private const val URL = "https://www.zebapi.com/api/v1/market/ticker-new/%1\$s/%2\$s" + private val CURRENCY_PAIRS: CurrencyPairsMap = CurrencyPairsMap() + + init { + CURRENCY_PAIRS[VirtualCurrency.AE] = arrayOf( + VirtualCurrency.BTC + ) + CURRENCY_PAIRS[VirtualCurrency.BAT] = arrayOf( + VirtualCurrency.BTC + ) + CURRENCY_PAIRS[VirtualCurrency.BCH] = arrayOf( + VirtualCurrency.BTC + ) + CURRENCY_PAIRS[VirtualCurrency.BTC] = arrayOf( + VirtualCurrency.TUSD + ) + CURRENCY_PAIRS[VirtualCurrency.BTG] = arrayOf( + VirtualCurrency.BTC, + VirtualCurrency.TUSD + ) + CURRENCY_PAIRS[VirtualCurrency.CMT] = arrayOf( + VirtualCurrency.BTC + ) + CURRENCY_PAIRS[VirtualCurrency.EOS] = arrayOf( + VirtualCurrency.BTC + ) + CURRENCY_PAIRS[VirtualCurrency.ETH] = arrayOf( + VirtualCurrency.BTC + ) + CURRENCY_PAIRS[VirtualCurrency.GNT] = arrayOf( + VirtualCurrency.BTC + ) + CURRENCY_PAIRS[VirtualCurrency.IOST] = arrayOf( + VirtualCurrency.BTC + ) + CURRENCY_PAIRS[VirtualCurrency.KNC] = arrayOf( + VirtualCurrency.BTC + ) + CURRENCY_PAIRS[VirtualCurrency.LTC] = arrayOf( + VirtualCurrency.BTC + ) + CURRENCY_PAIRS[VirtualCurrency.NCASH] = arrayOf( + VirtualCurrency.BTC, + VirtualCurrency.XRP + ) + CURRENCY_PAIRS[VirtualCurrency.OMG] = arrayOf( + VirtualCurrency.BTC + ) + CURRENCY_PAIRS[VirtualCurrency.REP] = arrayOf( + VirtualCurrency.BTC + ) + CURRENCY_PAIRS[VirtualCurrency.TRX] = arrayOf( + VirtualCurrency.BTC, + VirtualCurrency.XRP + ) + CURRENCY_PAIRS[VirtualCurrency.XRP] = arrayOf( + VirtualCurrency.BTC + ) + CURRENCY_PAIRS[VirtualCurrency.ZIL] = arrayOf( + VirtualCurrency.BTC + ) + CURRENCY_PAIRS[VirtualCurrency.ZRX] = arrayOf( + VirtualCurrency.BTC + ) + } + } + + override fun getUrl(requestId: Int, checkerInfo: CheckerInfo): String { + return String.format(URL, checkerInfo.currencyBaseLowerCase, checkerInfo.currencyCounterLowerCase) + } + + @Throws(Exception::class) + override fun parseTickerFromJsonObject(requestId: Int, jsonObject: JSONObject, ticker: Ticker, checkerInfo: CheckerInfo) { + ticker.bid = jsonObject.getDouble("sell") + ticker.ask = jsonObject.getDouble("buy") + ticker.vol = jsonObject.getDouble("volume") + ticker.last = jsonObject.getDouble("market") + } +} \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/example/MarketExample.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/example/MarketExample.kt new file mode 100644 index 00000000..7060f2bb --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/example/MarketExample.kt @@ -0,0 +1,44 @@ +package com.aneonex.bitcoinchecker.datamodule.model.market.example + +import com.aneonex.bitcoinchecker.datamodule.model.CheckerInfo +import com.aneonex.bitcoinchecker.datamodule.model.Market +import com.aneonex.bitcoinchecker.datamodule.model.Ticker +import com.aneonex.bitcoinchecker.datamodule.model.currency.Currency +import com.aneonex.bitcoinchecker.datamodule.model.currency.VirtualCurrency +import com.aneonex.bitcoinchecker.datamodule.model.currency.CurrencyPairsMap +import org.json.JSONObject + +class MarketExample : Market(NAME, TTS_NAME, CURRENCY_PAIRS) { + companion object { + private const val NAME = "Market Example" + private const val TTS_NAME = NAME + private const val URL = "https://www.marketexample.com/api/%1\$s_%2\$s/ticker/" + private val CURRENCY_PAIRS: CurrencyPairsMap = CurrencyPairsMap() + + init { + CURRENCY_PAIRS[VirtualCurrency.BTC] = arrayOf( + Currency.CNY, + Currency.USD + ) + CURRENCY_PAIRS[VirtualCurrency.DOGE] = arrayOf( + VirtualCurrency.BTC, + Currency.USD + ) + } + } + + override fun getUrl(requestId: Int, checkerInfo: CheckerInfo): String { + return String.format(URL, checkerInfo.currencyBase, checkerInfo.currencyCounter) + } + + @Throws(Exception::class) + override fun parseTickerFromJsonObject(requestId: Int, jsonObject: JSONObject, ticker: Ticker, checkerInfo: CheckerInfo) { + ticker.bid = jsonObject.getDouble("bid") + ticker.ask = jsonObject.getDouble("ask") + ticker.vol = jsonObject.getDouble("volume") + ticker.high = jsonObject.getDouble("high") + ticker.low = jsonObject.getDouble("low") + ticker.last = jsonObject.getDouble("last") + ticker.timestamp = jsonObject.getLong("timestamp") + } +} \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/util/CurrencyPairsMapHelper.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/util/CurrencyPairsMapHelper.kt new file mode 100644 index 00000000..0d28ce18 --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/util/CurrencyPairsMapHelper.kt @@ -0,0 +1,64 @@ +package com.aneonex.bitcoinchecker.datamodule.util + +import com.aneonex.bitcoinchecker.datamodule.model.CurrencyPairsListWithDate +import com.aneonex.bitcoinchecker.datamodule.model.currency.CurrencyPairsMap + +class CurrencyPairsMapHelper(currencyPairsListWithDate: CurrencyPairsListWithDate?) { + val date: Long + val currencyPairs: CurrencyPairsMap = CurrencyPairsMap() + private val currencyPairsIds: HashMap = HashMap() + var pairsCount = 0 + fun getCurrencyPairId(currencyBase: String?, currencyCounter: String?): String? { + return currencyPairsIds[createCurrencyPairKey(currencyBase, currencyCounter)] + } + + private fun createCurrencyPairKey(currencyBase: String?, currencyCounter: String?): String { + return String.format("%1\$s_%2\$s", currencyBase, currencyCounter) + } + + init { + + if (currencyPairsListWithDate == null) { + date = 0 + } + else { + date = currencyPairsListWithDate.date + + if(currencyPairsListWithDate.pairs != null) { + val sortedPairs = currencyPairsListWithDate.pairs!! + + pairsCount = sortedPairs.size + + // Calculate size for every currency group + val currencyGroupSizes = HashMap() + for (currencyPairInfo in sortedPairs) { + var currentCurrencyGroupSize = currencyGroupSizes[currencyPairInfo.currencyBase] + if (currentCurrencyGroupSize == null) { + currentCurrencyGroupSize = 1 + } else { + ++currentCurrencyGroupSize + } + currencyGroupSizes[currencyPairInfo.currencyBase] = currentCurrencyGroupSize + } + + var currentGroupPositionToInsert = 0 + for (currencyPairInfo in sortedPairs) { + var currencyGroup = currencyPairs[currencyPairInfo.currencyBase] + if (currencyGroup == null) { + // Initialize array with pre-calculated size + currencyGroup = Array(currencyGroupSizes[currencyPairInfo.currencyBase] ?: 0) { String() } + currencyPairs[currencyPairInfo.currencyBase] = currencyGroup + currentGroupPositionToInsert = 0 + } else { + ++currentGroupPositionToInsert + } + currencyGroup[currentGroupPositionToInsert] = currencyPairInfo.currencyCounter + if (currencyPairInfo.currencyPairId != null) { + val pairKey = createCurrencyPairKey(currencyPairInfo.currencyBase, currencyPairInfo.currencyCounter) + currencyPairsIds[pairKey] = currencyPairInfo.currencyPairId + } + } + } + } + } +} \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/util/CurrencyUtils.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/util/CurrencyUtils.kt new file mode 100644 index 00000000..db5fdb6d --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/util/CurrencyUtils.kt @@ -0,0 +1,19 @@ +package com.aneonex.bitcoinchecker.datamodule.util + +import com.aneonex.bitcoinchecker.datamodule.model.CurrencySubunit +import com.aneonex.bitcoinchecker.datamodule.model.currency.CurrenciesSubunits +import com.aneonex.bitcoinchecker.datamodule.model.currency.CurrencySymbols + +object CurrencyUtils { + fun getCurrencySymbol(currency: String): String { + return if (CurrencySymbols.CURRENCY_SYMBOLS.containsKey(currency)) CurrencySymbols.CURRENCY_SYMBOLS[currency]!! else currency + } + + fun getCurrencySubunit(currency: String?, subunitToUnit: Long): CurrencySubunit { + if (CurrenciesSubunits.CURRENCIES_SUBUNITS.containsKey(currency)) { + val subunits = CurrenciesSubunits.CURRENCIES_SUBUNITS[currency] + if (subunits!!.containsKey(subunitToUnit)) return subunits[subunitToUnit]!! + } + return CurrencySubunit(currency ?: "", 1) + } +} \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/util/FormatUtilsBase.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/util/FormatUtilsBase.kt new file mode 100644 index 00000000..77b3c997 --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/util/FormatUtilsBase.kt @@ -0,0 +1,90 @@ +package com.aneonex.bitcoinchecker.datamodule.util + +import android.content.Context +import android.text.format.DateFormat +import android.text.format.DateUtils +import com.aneonex.bitcoinchecker.datamodule.model.CurrencySubunit +import java.text.DecimalFormat +import java.util.* + +object FormatUtilsBase { + // ==================== + // Double formatting + // ==================== + private val FORMAT_TWO_DECIMAL = DecimalFormat("#,###.00") + private val FORMAT_FIVE_SIGNIFICANT_AT_MOST = DecimalFormat("@#####") + private val FORMAT_EIGHT_SIGNIFICANT_AT_MOST = DecimalFormat("@#######") + + // ==================== + // Format methods + // ==================== + fun formatDouble(value: Double/*, isPrice: Boolean*/): String { + return formatDouble(if (value < 1) FORMAT_FIVE_SIGNIFICANT_AT_MOST else FORMAT_TWO_DECIMAL, value) + } + + fun formatDoubleWithFiveMax(value: Double): String { + return formatDouble(FORMAT_FIVE_SIGNIFICANT_AT_MOST, value) + } + + private fun formatDoubleWithEightMax(value: Double): String { + return formatDouble(FORMAT_EIGHT_SIGNIFICANT_AT_MOST, value) + } + + private fun formatDouble(decimalFormat: DecimalFormat, value: Double): String { + synchronized(decimalFormat) { + try { + return decimalFormat.format(value) + } catch (e: Exception) { + e.printStackTrace() + } + return value.toString() + } + } + + // ==================== + // Price formatting + // ==================== + fun formatPriceWithCurrency(price: Double, subunitDst: CurrencySubunit): String { + return formatPriceWithCurrency(price, subunitDst, true) + } + + fun formatPriceWithCurrency(price: Double, subunitDst: CurrencySubunit, showCurrencyDst: Boolean): String { + var priceString = formatPriceValueForSubunit(price, subunitDst, forceInteger = false, skipNoSignificantDecimal = false) + if (showCurrencyDst) { + priceString = formatPriceWithCurrency(priceString, subunitDst.name) + } + return priceString + } + + @kotlin.jvm.JvmStatic + fun formatPriceWithCurrency(value: Double, currency: String): String { + return formatPriceWithCurrency(formatDouble(value), currency) + } + + private fun formatPriceWithCurrency(priceString: String, currency: String): String { + return priceString + " " + CurrencyUtils.getCurrencySymbol(currency) + } + + fun formatPriceValueForSubunit(price: Double, subunitDst: CurrencySubunit, forceInteger: Boolean, skipNoSignificantDecimal: Boolean): String { + val calcPrice = price * subunitDst.subunitToUnit.toDouble() + return if (!subunitDst.allowDecimal || forceInteger) return (calcPrice + 0.5f).toLong().toString() + else if (skipNoSignificantDecimal) formatDoubleWithEightMax(calcPrice) else formatDouble(calcPrice) + } + + // ==================== + // Date && Time formatting + // ==================== + @kotlin.jvm.JvmStatic + fun formatSameDayTimeOrDate(context: Context?, time: Long): String { + return if (DateUtils.isToday(time)) { + DateFormat.getTimeFormat(context).format(Date(time)) + } else { + DateFormat.getDateFormat(context).format(Date(time)) + } + } + + fun formatDateTime(context: Context?, time: Long): String { + val date = Date(time) + return DateFormat.getTimeFormat(context).format(date) + ", " + DateFormat.getDateFormat(context).format(date) + } +} \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/util/MarketsConfigUtils.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/util/MarketsConfigUtils.kt new file mode 100644 index 00000000..ea9eae56 --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/util/MarketsConfigUtils.kt @@ -0,0 +1,32 @@ +package com.aneonex.bitcoinchecker.datamodule.util + +import com.aneonex.bitcoinchecker.datamodule.config.MarketsConfig +import com.aneonex.bitcoinchecker.datamodule.model.Market +import com.aneonex.bitcoinchecker.datamodule.model.market.Unknown +import java.util.* + +object MarketsConfigUtils { + private val UNKNOWN: Market = Unknown() + + fun getMarketById(id: Int): Market { + synchronized(MarketsConfig.MARKETS) { + if (id >= 0 && id < MarketsConfig.MARKETS.size) { + return ArrayList(MarketsConfig.MARKETS.values)[id] + } + } + return UNKNOWN + } + + @kotlin.jvm.JvmStatic + fun getMarketByKey(key: String?): Market { + synchronized(MarketsConfig.MARKETS) { if (MarketsConfig.MARKETS.containsKey(key)) return MarketsConfig.MARKETS[key]!! } + return UNKNOWN + } + + fun getMarketIdByKey(key: String): Int { + for ((i, market) in MarketsConfig.MARKETS.values.withIndex()) { + if (market.key == key) return i + } + return 0 + } +} \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/util/ParseUtils.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/util/ParseUtils.kt new file mode 100644 index 00000000..f4b844be --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/util/ParseUtils.kt @@ -0,0 +1,11 @@ +package com.aneonex.bitcoinchecker.datamodule.util + +import org.json.JSONException +import org.json.JSONObject + +object ParseUtils { + @Throws(NumberFormatException::class, JSONException::class) + fun getDoubleFromString(jsonObject: JSONObject, name: String): Double { + return jsonObject.getString(name).toDouble() + } +} \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/util/TimeUtils.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/util/TimeUtils.kt new file mode 100644 index 00000000..9b149e83 --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/util/TimeUtils.kt @@ -0,0 +1,14 @@ +package com.aneonex.bitcoinchecker.datamodule.util + +object TimeUtils { +// const val NANOS_IN_MILLIS: Long = 1000 + const val MILLIS_IN_SECOND: Long = 1000 + const val MILLIS_IN_MINUTE = 60 * MILLIS_IN_SECOND + const val MILLIS_IN_HOUR = 60 * MILLIS_IN_MINUTE + const val MILLIS_IN_DAY = 24 * MILLIS_IN_HOUR + private const val MILLIS_IN_YEAR = 365 * MILLIS_IN_DAY + fun parseTimeToMillis(time: Long): Long { + if (time < MILLIS_IN_YEAR) return time * MILLIS_IN_SECOND else if (time > 5000 * MILLIS_IN_YEAR) return time / 1000 + return time + } +} \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/util/XmlParserUtils.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/util/XmlParserUtils.kt new file mode 100644 index 00000000..433e157e --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/util/XmlParserUtils.kt @@ -0,0 +1,33 @@ +package com.aneonex.bitcoinchecker.datamodule.util + +import org.w3c.dom.Document +import org.w3c.dom.Node + +object XmlParserUtils { + fun getFirstElementByTagName(doc: Document, name: String?): Node? { + val nodes = doc.getElementsByTagName(name) + return if (nodes != null && nodes.length > 0) nodes.item(0) else null + } + + @Throws(Exception::class) + fun getDoubleNodeValue(node: Node?): Double { + return getTextNodeValue(node).toDouble() + } + + @Throws(Exception::class) + fun getTextNodeValue(node: Node?): String { + var child: Node? + if (node != null) { + if (node.hasChildNodes()) { + child = node.firstChild + while (child != null) { + if (child.nodeType == Node.TEXT_NODE) { + return child.nodeValue + } + child = child.nextSibling + } + } + } + return "" + } +} \ No newline at end of file diff --git a/dataModule/src/main/java/com/mobnetic/coinguardian/config/MarketsConfig.java b/dataModule/src/main/java/com/mobnetic/coinguardian/config/MarketsConfig.java deleted file mode 100644 index 07848ec4..00000000 --- a/dataModule/src/main/java/com/mobnetic/coinguardian/config/MarketsConfig.java +++ /dev/null @@ -1,141 +0,0 @@ -package com.mobnetic.coinguardian.config; - -import com.mobnetic.coinguardian.model.Market; -import com.mobnetic.coinguardian.model.market.*; - -import java.util.LinkedHashMap; - -public class MarketsConfig { - - public final static LinkedHashMap MARKETS = new LinkedHashMap(); - private final static void addMarket(Market market) { - MarketsConfig.MARKETS.put(market.key, market); - } - - static { - addMarket(new Bitstamp()); - addMarket(new Mercado()); - addMarket(new Kraken()); - addMarket(new Bitfinex()); - addMarket(new Okcoin()); - addMarket(new Cryptsy()); - addMarket(new Coinbase()); - addMarket(new Vircurex()); - addMarket(new Fxbtc()); - addMarket(new Bter()); - addMarket(new Justcoin()); - addMarket(new Btcturk()); - addMarket(new Coinse()); - addMarket(new Campbx()); - addMarket(new TheRock()); - addMarket(new CexIO()); - addMarket(new Virtex()); - addMarket(new Huobi()); - addMarket(new VaultOfSatoshi()); - addMarket(new CoinMarketIO()); - addMarket(new McxNOW()); - addMarket(new CryptoTrade()); - addMarket(new MintPal()); - addMarket(new CoinJar()); - addMarket(new Poloniex()); - addMarket(new Winkdex()); - addMarket(new BitX()); - addMarket(new CCex()); - addMarket(new Bitorado()); - addMarket(new CryptoRush()); - addMarket(new CoinDesk()); - addMarket(new Koinim()); - addMarket(new FybSE()); - addMarket(new FybSG()); - addMarket(new Prelude()); - addMarket(new BitKonan()); - addMarket(new BitTrex()); - addMarket(new Comkort()); - addMarket(new Bit2c()); - addMarket(new CryptoAltex()); - addMarket(new BtcMarkets()); - addMarket(new Bleutrade()); - addMarket(new ShareXcoin()); - addMarket(new Unisend()); - addMarket(new BitcoinVenezuela()); - addMarket(new Korbit()); - addMarket(new CoinTree()); - addMarket(new Cryptonit()); - addMarket(new LakeBTC()); - addMarket(new BitMaszyna()); - addMarket(new Zaydo()); - addMarket(new AllCoin()); - addMarket(new Ripio()); - addMarket(new DolarBlueNet()); - addMarket(new CoinSwap()); - addMarket(new Paymium()); - addMarket(new Bitso()); - addMarket(new Cryptoine()); - addMarket(new BitcoinToYou()); - addMarket(new BitexLa()); - addMarket(new ItBit()); - addMarket(new BitcoinCoId()); - addMarket(new HitBtc()); - addMarket(new CleverCoin()); - addMarket(new BitBay()); - addMarket(new QuadrigaCX()); - addMarket(new CoinMateIO()); - addMarket(new Buttercoin()); - addMarket(new CoinTraderNet()); - addMarket(new LocalBitcoins()); - addMarket(new Cryptopia()); - addMarket(new Igot()); - addMarket(new Mexbt()); - addMarket(new Vaultoro()); - addMarket(new BitxCom()); - addMarket(new BtcBox()); - addMarket(new BtcXIndia()); - addMarket(new Uphold()); - addMarket(new YoBit()); - addMarket(new ShapeShift()); - addMarket(new BitoEX()); - addMarket(new OKCoinFutures()); -// addMarket(new FoscEx()); - addMarket(new CoinSecure()); - addMarket(new Dashcurex()); - addMarket(new Quoine()); - addMarket(new Livecoin()); - addMarket(new Gemini()); - addMarket(new Coinapult()); - addMarket(new Btc38()); - addMarket(new ETHEXIndia()); - addMarket(new GateCoin()); - addMarket(new Liqui()); - addMarket(new ChileBit()); - addMarket(new SurBitcoin()); - addMarket(new VBtc()); - addMarket(new Urdubit()); - addMarket(new NegocieCoins()); - addMarket(new BitMEX()); - addMarket(new BitFlyer()); - addMarket(new BitFlyerFX()); - addMarket(new Coinone()); - addMarket(new Bithumb()); - addMarket(new Coinsph()); - addMarket(new Bl3p()); - addMarket(new SurBtc()); - addMarket(new CoinFloor()); - addMarket(new Lykke()); - addMarket(new Coinnest()); - addMarket(new Braziliex()); - addMarket(new Abucoins()); - addMarket(new Zebpay()); - addMarket(new Paribu()); - addMarket(new SatoshiTango()); - addMarket(new Koinex()); -// addMarket(new Unocoin()); - addMarket(new BlinkTrade()); - addMarket(new Exmo()); - addMarket(new Binance()); - addMarket(new Kucoin()); - addMarket(new BitcoinTrade()); - addMarket(new OmniTrade()); - addMarket(new Coinome()); - addMarket(new Nocks()); - } -} diff --git a/dataModule/src/main/java/com/mobnetic/coinguardian/config/Settings.java b/dataModule/src/main/java/com/mobnetic/coinguardian/config/Settings.java deleted file mode 100644 index cd52411b..00000000 --- a/dataModule/src/main/java/com/mobnetic/coinguardian/config/Settings.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.mobnetic.coinguardian.config; - -public class Settings { - - public static String userCountry; - -} diff --git a/dataModule/src/main/java/com/mobnetic/coinguardian/model/CheckerInfo.java b/dataModule/src/main/java/com/mobnetic/coinguardian/model/CheckerInfo.java deleted file mode 100644 index ed335bc2..00000000 --- a/dataModule/src/main/java/com/mobnetic/coinguardian/model/CheckerInfo.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.mobnetic.coinguardian.model; - -import java.util.Locale; - -public class CheckerInfo extends CurrencyPairInfo { - - protected final int contractType; - - public CheckerInfo(String currencyBase, String currencyCounter, String currencyPairId, int contractType) { - super(currencyBase, currencyCounter, currencyPairId); - this.contractType = contractType; - } - - public String getCurrencyBaseLowerCase() { - return getCurrencyBase().toLowerCase(Locale.US); - } - - public String getCurrencyCounterLowerCase() { - return getCurrencyCounter().toLowerCase(Locale.US); - } - - public int getContractType() { - return contractType; - } -} diff --git a/dataModule/src/main/java/com/mobnetic/coinguardian/model/CurrencyPairInfo.java b/dataModule/src/main/java/com/mobnetic/coinguardian/model/CurrencyPairInfo.java deleted file mode 100644 index dc3f689a..00000000 --- a/dataModule/src/main/java/com/mobnetic/coinguardian/model/CurrencyPairInfo.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.mobnetic.coinguardian.model; - - -public class CurrencyPairInfo implements Comparable{ - - protected final String currencyBase; - protected final String currencyCounter; - protected final String currencyPairId; - - public CurrencyPairInfo(String currencyBase, String currencyCounter, String currencyPairId) { - this.currencyBase = currencyBase; - this.currencyCounter = currencyCounter; - this.currencyPairId = currencyPairId; - } - - public String getCurrencyBase() { - return currencyBase; - } - - public String getCurrencyCounter() { - return currencyCounter; - } - - public String getCurrencyPairId() { - return currencyPairId; - } - - @Override - public int compareTo(CurrencyPairInfo another) throws NullPointerException { - if(currencyBase==null || another.currencyBase==null || currencyCounter==null || another.currencyCounter==null) - throw new NullPointerException(); - - int compBase = currencyBase.compareToIgnoreCase(another.currencyBase); - return compBase!=0 ? compBase : currencyCounter.compareToIgnoreCase(another.currencyCounter); - } -} diff --git a/dataModule/src/main/java/com/mobnetic/coinguardian/model/CurrencyPairsListWithDate.java b/dataModule/src/main/java/com/mobnetic/coinguardian/model/CurrencyPairsListWithDate.java deleted file mode 100644 index 0648b5b8..00000000 --- a/dataModule/src/main/java/com/mobnetic/coinguardian/model/CurrencyPairsListWithDate.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.mobnetic.coinguardian.model; - -import java.util.List; - -public class CurrencyPairsListWithDate { - - public long date; - public List pairs; - -} diff --git a/dataModule/src/main/java/com/mobnetic/coinguardian/model/CurrencySubunit.java b/dataModule/src/main/java/com/mobnetic/coinguardian/model/CurrencySubunit.java deleted file mode 100644 index 419fb109..00000000 --- a/dataModule/src/main/java/com/mobnetic/coinguardian/model/CurrencySubunit.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.mobnetic.coinguardian.model; - -public class CurrencySubunit { - - public final String name; - public final long subunitToUnit; - public final boolean allowDecimal; - - public CurrencySubunit(String name, long subunitToUnit) { - this(name, subunitToUnit, true); - } - - public CurrencySubunit(String name, long subunitToUnit, boolean allowDecimal) { - this.name = name; - this.subunitToUnit = subunitToUnit; - this.allowDecimal = allowDecimal; - } -} diff --git a/dataModule/src/main/java/com/mobnetic/coinguardian/model/CurrencySubunitsMap.java b/dataModule/src/main/java/com/mobnetic/coinguardian/model/CurrencySubunitsMap.java deleted file mode 100644 index 09ffc221..00000000 --- a/dataModule/src/main/java/com/mobnetic/coinguardian/model/CurrencySubunitsMap.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.mobnetic.coinguardian.model; - -import java.util.LinkedHashMap; - -public class CurrencySubunitsMap extends LinkedHashMap { - - private static final long serialVersionUID = -7219011491064245859L; - - public CurrencySubunitsMap(CurrencySubunit... currencySubunits) { - for(CurrencySubunit currencySubunit : currencySubunits) - put(currencySubunit.subunitToUnit, currencySubunit); - } - -} diff --git a/dataModule/src/main/java/com/mobnetic/coinguardian/model/CurrencySymbol.java b/dataModule/src/main/java/com/mobnetic/coinguardian/model/CurrencySymbol.java deleted file mode 100644 index 7aa0c5e5..00000000 --- a/dataModule/src/main/java/com/mobnetic/coinguardian/model/CurrencySymbol.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.mobnetic.coinguardian.model; - -public class CurrencySymbol { - - public final String symbol; - public final boolean symbolFirst; - - public CurrencySymbol(String symbol) { - this(symbol, false); - } - - public CurrencySymbol(String symbol, boolean symbolFirst) { - this.symbol = symbol; - this.symbolFirst = symbolFirst; - } -} diff --git a/dataModule/src/main/java/com/mobnetic/coinguardian/model/Futures.java b/dataModule/src/main/java/com/mobnetic/coinguardian/model/Futures.java deleted file mode 100644 index 3d7d766c..00000000 --- a/dataModule/src/main/java/com/mobnetic/coinguardian/model/Futures.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.mobnetic.coinguardian.model; - -public class Futures { - - public final static int CONTRACT_TYPE_WEEKLY = 0; - public final static int CONTRACT_TYPE_BIWEEKLY = 1; - public final static int CONTRACT_TYPE_MONTHLY = 2; - public final static int CONTRACT_TYPE_BIMONTHLY = 3; - public final static int CONTRACT_TYPE_QUARTERLY = 4; - - private final static String[] CONTRACT_TYPE_SHORT_NAMES = new String[] { - "1W", - "2W", - "1M", - "2M", - "3M" - }; - - public static String getContractTypeShortName(int contractType) { - if (contractType >=0 && contractType < CONTRACT_TYPE_SHORT_NAMES.length) { - return CONTRACT_TYPE_SHORT_NAMES[contractType]; - } - return null; - } - -} diff --git a/dataModule/src/main/java/com/mobnetic/coinguardian/model/FuturesMarket.java b/dataModule/src/main/java/com/mobnetic/coinguardian/model/FuturesMarket.java deleted file mode 100644 index 8bb71b00..00000000 --- a/dataModule/src/main/java/com/mobnetic/coinguardian/model/FuturesMarket.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.mobnetic.coinguardian.model; - -import java.util.HashMap; - -public abstract class FuturesMarket extends Market { - - public final int[] contractTypes; - - public FuturesMarket(String name, String ttsName, HashMap currencyPairs, int[] contractTypes) { - super(name, ttsName, currencyPairs); - this.contractTypes = contractTypes; - } - - @Override - public final String getUrl(int requestId, CheckerInfo checkerInfo) { - return getUrl(requestId, checkerInfo, checkerInfo.getContractType()); - } - - protected abstract String getUrl(int requestId, CheckerInfo checkerInfo, int contractType); - -} diff --git a/dataModule/src/main/java/com/mobnetic/coinguardian/model/Market.java b/dataModule/src/main/java/com/mobnetic/coinguardian/model/Market.java deleted file mode 100644 index 98754a0a..00000000 --- a/dataModule/src/main/java/com/mobnetic/coinguardian/model/Market.java +++ /dev/null @@ -1,98 +0,0 @@ -package com.mobnetic.coinguardian.model; - -import java.util.HashMap; -import java.util.List; - -import org.json.JSONObject; - -import android.text.TextUtils; - -import com.mobnetic.coinguardian.util.TimeUtils; - -public abstract class Market { - - public final String key; - public final String name; - public final String ttsName; - public HashMap currencyPairs; - - public Market(String name, String ttsName, HashMap currencyPairs) { - this.key = this.getClass().getSimpleName(); - this.name = name; - this.ttsName = ttsName; - this.currencyPairs = currencyPairs; - } - - public int getCautionResId() { - return 0; - } - - - // ==================== - // Parse Ticker - // ==================== - public int getNumOfRequests(CheckerInfo checkerInfo) { - return 1; - } - - public abstract String getUrl(int requestId, CheckerInfo checkerInfo); - - public final Ticker parseTickerMain(int requestId, String responseString, Ticker ticker, CheckerInfo checkerInfo) throws Exception { - parseTicker(requestId, responseString, ticker, checkerInfo); - if(ticker.timestamp<=0) - ticker.timestamp = System.currentTimeMillis(); - else - ticker.timestamp = TimeUtils.parseTimeToMillis(ticker.timestamp); - - return ticker; - } - - protected void parseTicker(int requestId, String responseString, Ticker ticker, CheckerInfo checkerInfo) throws Exception { - parseTickerFromJsonObject(requestId, new JSONObject(responseString), ticker, checkerInfo); - } - protected void parseTickerFromJsonObject(int requestId, JSONObject jsonObject, Ticker ticker, CheckerInfo checkerInfo) throws Exception { - // do parsing - } - - // ==================== - // Parse Ticker Error - // ==================== - public final String parseErrorMain(int requestId, String responseString, CheckerInfo checkerInfo) throws Exception { - return parseError(requestId, responseString, checkerInfo); - } - - protected String parseError(int requestId, String responseString, CheckerInfo checkerInfo) throws Exception { - return parseErrorFromJsonObject(requestId, new JSONObject(responseString), checkerInfo); - } - protected String parseErrorFromJsonObject(int requestId, JSONObject jsonObject, CheckerInfo checkerInfo) throws Exception { - throw new Exception(); - } - - // ==================== - // Parse currency pairs - // ==================== - public int getCurrencyPairsNumOfRequests() { - return 1; - } - - public String getCurrencyPairsUrl(int requestId) { - return null; - } - - public final void parseCurrencyPairsMain(int requestId, String responseString, List pairs) throws Exception { - parseCurrencyPairs(requestId, responseString, pairs); - - for(int i=pairs.size()-1; i>=0; --i) { - CurrencyPairInfo currencyPairInfo = pairs.get(i); - if(currencyPairInfo==null || TextUtils.isEmpty(currencyPairInfo.getCurrencyBase()) || TextUtils.isEmpty(currencyPairInfo.getCurrencyCounter())) - pairs.remove(i); - } - } - - protected void parseCurrencyPairs(int requestId, String responseString, List pairs) throws Exception { - parseCurrencyPairsFromJsonObject(requestId, new JSONObject(responseString), pairs); - } - protected void parseCurrencyPairsFromJsonObject(int requestId, JSONObject jsonObject, List pairs) throws Exception { - // do parsing - } -} diff --git a/dataModule/src/main/java/com/mobnetic/coinguardian/model/Ticker.java b/dataModule/src/main/java/com/mobnetic/coinguardian/model/Ticker.java deleted file mode 100644 index b3a22fff..00000000 --- a/dataModule/src/main/java/com/mobnetic/coinguardian/model/Ticker.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.mobnetic.coinguardian.model; - - -public class Ticker { - - public double bid; - public double ask; - public double vol; - public double high; - public double low; - public double last; - public long timestamp; - - public final static int NO_DATA = -1; - - public Ticker() { - bid = NO_DATA; - ask = NO_DATA; - vol = NO_DATA; - high = NO_DATA; - low = NO_DATA; - last = NO_DATA; - timestamp = NO_DATA; - } -} diff --git a/dataModule/src/main/java/com/mobnetic/coinguardian/model/currency/CurrenciesSubunits.java b/dataModule/src/main/java/com/mobnetic/coinguardian/model/currency/CurrenciesSubunits.java deleted file mode 100644 index 546b6dd7..00000000 --- a/dataModule/src/main/java/com/mobnetic/coinguardian/model/currency/CurrenciesSubunits.java +++ /dev/null @@ -1,25 +0,0 @@ -package com.mobnetic.coinguardian.model.currency; - -import java.util.HashMap; - -import com.mobnetic.coinguardian.model.CurrencySubunit; -import com.mobnetic.coinguardian.model.CurrencySubunitsMap; - -public class CurrenciesSubunits { - - public final static HashMap CURRENCIES_SUBUNITS = new HashMap(); - static { - CURRENCIES_SUBUNITS.put(VirtualCurrency.BTC, new CurrencySubunitsMap( - new CurrencySubunit(VirtualCurrency.BTC, 1), - new CurrencySubunit(VirtualCurrency.mBTC, 1000), - new CurrencySubunit(VirtualCurrency.uBTC, 1000000), - new CurrencySubunit(VirtualCurrency.Satoshi, 100000000, false) - ) - ); - CURRENCIES_SUBUNITS.put(VirtualCurrency.LTC, new CurrencySubunitsMap( - new CurrencySubunit(VirtualCurrency.LTC, 1), - new CurrencySubunit(VirtualCurrency.mLTC, 1000) - ) - ); - } -} diff --git a/dataModule/src/main/java/com/mobnetic/coinguardian/model/currency/Currency.java b/dataModule/src/main/java/com/mobnetic/coinguardian/model/currency/Currency.java deleted file mode 100644 index 7e8642d7..00000000 --- a/dataModule/src/main/java/com/mobnetic/coinguardian/model/currency/Currency.java +++ /dev/null @@ -1,170 +0,0 @@ -package com.mobnetic.coinguardian.model.currency; - - -public class Currency { - - public static final String AED = "AED"; - public static final String AFN = "AFN"; - public static final String ALL = "ALL"; - public static final String AMD = "AMD"; - public static final String ANG = "ANG"; - public static final String AOA = "AOA"; - public static final String ARS = "ARS"; - public static final String AUD = "AUD"; - public static final String AWG = "AWG"; - public static final String AZN = "AZN"; - public static final String BAM = "BAM"; - public static final String BBD = "BBD"; - public static final String BDT = "BDT"; - public static final String BGN = "BGN"; - public static final String BHD = "BHD"; - public static final String BIF = "BIF"; - public static final String BMD = "BMD"; - public static final String BND = "BND"; - public static final String BOB = "BOB"; - public static final String BRL = "BRL"; - public static final String BSD = "BSD"; - public static final String BTN = "BTN"; - public static final String BWP = "BWP"; - public static final String BYR = "BYR"; - public static final String BZD = "BZD"; - public static final String CAD = "CAD"; - public static final String CDF = "CDF"; - public static final String CHF = "CHF"; - public static final String CLP = "CLP"; - public static final String CNY = "CNY"; - public static final String COP = "COP"; - public static final String CRC = "CRC"; - public static final String CUP = "CUP"; - public static final String CVE = "CVE"; - public static final String CZK = "CZK"; - public static final String DJF = "DJF"; - public static final String DKK = "DKK"; - public static final String DOP = "DOP"; - public static final String DZD = "DZD"; - public static final String EEK = "EEK"; - public static final String EGP = "EGP"; - public static final String ERN = "ERN"; - public static final String ETB = "ETB"; - public static final String EUR = "EUR"; - public static final String FJD = "FJD"; - public static final String FKP = "FKP"; - public static final String GBP = "GBP"; - public static final String GEL = "GEL"; - public static final String GHS = "GHS"; - public static final String GIP = "GIP"; - public static final String GMD = "GMD"; - public static final String GNF = "GNF"; - public static final String GOLD = "GOLD"; - public static final String GTQ = "GTQ"; - public static final String GYD = "GYD"; - public static final String HKD = "HKD"; - public static final String HNL = "HNL"; - public static final String HRK = "HRK"; - public static final String HTG = "HTG"; - public static final String HUF = "HUF"; - public static final String IDR = "IDR"; - public static final String ILS = "ILS"; - public static final String INR = "INR"; - public static final String IQD = "IQD"; - public static final String IRR = "IRR"; - public static final String ISK = "ISK"; - public static final String JMD = "JMD"; - public static final String JOD = "JOD"; - public static final String JPY = "JPY"; - public static final String KES = "KES"; - public static final String KGS = "KGS"; - public static final String KHR = "KHR"; - public static final String KMF = "KMF"; - public static final String KPW = "KPW"; - public static final String KRW = "KRW"; - public static final String KWD = "KWD"; - public static final String KYD = "KYD"; - public static final String KZT = "KZT"; - public static final String LAK = "LAK"; - public static final String LBP = "LBP"; - public static final String LKR = "LKR"; - public static final String LRD = "LRD"; - public static final String LSL = "LSL"; - public static final String LTL = "LTL"; - public static final String LVL = "LVL"; - public static final String LYD = "LYD"; - public static final String MAD = "MAD"; - public static final String MDL = "MDL"; - public static final String MGA = "MGA"; - public static final String MKD = "MKD"; - public static final String MMK = "MMK"; - public static final String MNT = "MNT"; - public static final String MOP = "MOP"; - public static final String MRO = "MRO"; - public static final String MUR = "MUR"; - public static final String MVR = "MVR"; - public static final String MWK = "MWK"; - public static final String MXN = "MXN"; - public static final String MYR = "MYR"; - public static final String MZN = "MZN"; - public static final String NAD = "NAD"; - public static final String NGN = "NGN"; - public static final String NIO = "NIO"; - public static final String NIS = "NIS"; - public static final String NOK = "NOK"; - public static final String NPR = "NPR"; - public static final String NZD = "NZD"; - public static final String OMR = "OMR"; - public static final String PAB = "PAB"; - public static final String PEN = "PEN"; - public static final String PGK = "PGK"; - public static final String PHP = "PHP"; - public static final String PKR = "PKR"; - public static final String PLN = "PLN"; - public static final String PYG = "PYG"; - public static final String QAR = "QAR"; - public static final String RON = "RON"; - public static final String RSD = "RSD"; - public static final String RUB = "RUB"; - public static final String RUR = "RUR"; - public static final String RWF = "RWF"; - public static final String SAR = "SAR"; - public static final String SBD = "SBD"; - public static final String SCR = "SCR"; - public static final String SDG = "SDG"; - public static final String SEK = "SEK"; - public static final String SGD = "SGD"; - public static final String SHP = "SHP"; - public static final String SLL = "SLL"; - public static final String SOS = "SOS"; - public static final String SRD = "SRD"; - public static final String STD = "STD"; - public static final String SVC = "SVC"; - public static final String SYP = "SYP"; - public static final String SZL = "SZL"; - public static final String THB = "THB"; - public static final String TJS = "TJS"; - public static final String TMM = "TMM"; - public static final String TND = "TND"; - public static final String TOP = "TOP"; - public static final String TRY = "TRY"; - public static final String TTD = "TTD"; - public static final String TWD = "TWD"; - public static final String TZS = "TZS"; - public static final String UAH = "UAH"; - public static final String UGX = "UGX"; - public static final String USD = "USD"; - public static final String UYU = "UYU"; - public static final String UZS = "UZS"; - public static final String VEF = "VEF"; - public static final String VND = "VND"; - public static final String VUV = "VUV"; - public static final String WST = "WST"; - public static final String XAF = "XAF"; - public static final String XAG = "XAG"; - public static final String XAU = "XAU"; - public static final String XCD = "XCD"; - public static final String XOF = "XOF"; - public static final String XPF = "XPF"; - public static final String YER = "YER"; - public static final String ZAR = "ZAR"; - public static final String ZMK = "ZMK"; - public static final String ZWL = "ZWL"; - -} diff --git a/dataModule/src/main/java/com/mobnetic/coinguardian/model/currency/CurrencySymbols.java b/dataModule/src/main/java/com/mobnetic/coinguardian/model/currency/CurrencySymbols.java deleted file mode 100644 index 5b4375b1..00000000 --- a/dataModule/src/main/java/com/mobnetic/coinguardian/model/currency/CurrencySymbols.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.mobnetic.coinguardian.model.currency; - -import java.util.HashMap; - -public class CurrencySymbols { - - public final static HashMap CURRENCY_SYMBOLS = new HashMap(); - static { - CURRENCY_SYMBOLS.put(Currency.USD, "$"); - CURRENCY_SYMBOLS.put(Currency.PLN, "zł"); - CURRENCY_SYMBOLS.put(Currency.CNY, "¥"); - CURRENCY_SYMBOLS.put(Currency.EUR, "€"); -// CURRENCY_SYMBOLS.put(CAD, "$"); - CURRENCY_SYMBOLS.put(Currency.GBP, "£"); - CURRENCY_SYMBOLS.put(Currency.CHF, "Fr"); - CURRENCY_SYMBOLS.put(Currency.RUB, "р."); - CURRENCY_SYMBOLS.put(Currency.RUR, "р."); - CURRENCY_SYMBOLS.put(Currency.AUD, "$"); - CURRENCY_SYMBOLS.put(Currency.SEK, "kr"); - CURRENCY_SYMBOLS.put(Currency.DKK, "kr"); - CURRENCY_SYMBOLS.put(Currency.HKD, "$"); - CURRENCY_SYMBOLS.put(Currency.SGD, "$"); - CURRENCY_SYMBOLS.put(Currency.THB, "฿"); - CURRENCY_SYMBOLS.put(Currency.NZD, "$"); - CURRENCY_SYMBOLS.put(Currency.JPY, "¥"); - CURRENCY_SYMBOLS.put(Currency.BRL, "R$"); - CURRENCY_SYMBOLS.put(Currency.KRW, "₩"); - - CURRENCY_SYMBOLS.put(Currency.AFN, "؋"); - CURRENCY_SYMBOLS.put(Currency.ALL, "L"); - CURRENCY_SYMBOLS.put(Currency.DZD, "د.ج"); - CURRENCY_SYMBOLS.put(Currency.AOA, "Kz"); - CURRENCY_SYMBOLS.put(Currency.ARS, "$"); - CURRENCY_SYMBOLS.put(Currency.AMD, "դր."); - CURRENCY_SYMBOLS.put(Currency.AWG, "ƒ"); - CURRENCY_SYMBOLS.put(Currency.AZN, "m"); - CURRENCY_SYMBOLS.put(Currency.BSD, "$"); - CURRENCY_SYMBOLS.put(Currency.BHD, "ب.د"); - CURRENCY_SYMBOLS.put(Currency.BDT, "৳"); - CURRENCY_SYMBOLS.put(Currency.BBD, "$"); - CURRENCY_SYMBOLS.put(Currency.BYR, "Br"); - CURRENCY_SYMBOLS.put(Currency.BZD, "$"); - CURRENCY_SYMBOLS.put(Currency.BMD, "$"); - CURRENCY_SYMBOLS.put(Currency.BTN, "Nu."); - CURRENCY_SYMBOLS.put(Currency.BOB, "Bs."); - CURRENCY_SYMBOLS.put(Currency.BAM, "КМ"); - CURRENCY_SYMBOLS.put(Currency.BWP, "P"); - CURRENCY_SYMBOLS.put(Currency.BND, "$"); - CURRENCY_SYMBOLS.put(Currency.BGN, "лв"); - CURRENCY_SYMBOLS.put(Currency.BIF, "Fr"); - CURRENCY_SYMBOLS.put(Currency.TRY, "TL"); - CURRENCY_SYMBOLS.put(Currency.ZAR, "R"); - CURRENCY_SYMBOLS.put(Currency.IDR, "Rp"); - } -} diff --git a/dataModule/src/main/java/com/mobnetic/coinguardian/model/currency/VirtualCurrency.java b/dataModule/src/main/java/com/mobnetic/coinguardian/model/currency/VirtualCurrency.java deleted file mode 100644 index 0e665a3b..00000000 --- a/dataModule/src/main/java/com/mobnetic/coinguardian/model/currency/VirtualCurrency.java +++ /dev/null @@ -1,374 +0,0 @@ -package com.mobnetic.coinguardian.model.currency; - -public class VirtualCurrency { - - public static final String _10_5 = "10-5"; - public static final String _21 = "21"; - public static final String _42 = "42"; - public static final String _66 = "66"; - public static final String _888 = "888"; - public static final String ADT = "ADT"; - public static final String AE = "AE"; - public static final String ALB = "ALB"; - public static final String ALF = "ALF"; - public static final String ALP = "ALP"; - public static final String ALT = "ALT"; - public static final String AMC = "AMC"; - public static final String ANC = "ANC"; - public static final String ANI = "ANI"; - public static final String ANT = "ANT"; - public static final String ARG = "ARG"; - public static final String ASC = "ASC"; - public static final String AUR = "AUR"; - public static final String BAT = "BAT"; - public static final String BC = "BC"; - public static final String BCC = "BCC"; - public static final String BCH = "BCH"; - public static final String BCU = "BCU"; - public static final String BCX = "BCX"; - public static final String BEE = "BEE"; - public static final String BEER = "BEER"; - public static final String BELA = "BELA"; - public static final String BELI = "BELI"; - public static final String BEN = "BEN"; - public static final String BET = "BET"; - public static final String BF1 = "BF1"; - public static final String BFX = "BFX"; - public static final String BIL = "BIL"; - public static final String BLA = "BLA"; - public static final String BLC = "BLC"; - public static final String BNB = "BNB"; - public static final String BQC = "BQC"; - public static final String BTB = "BTB"; - public static final String BTC = "BTC"; - public static final String mBTC = "mBTC"; - public static final String uBTC = "µBTC"; - public static final String Satoshi = "Satoshi"; - public static final String BTCS = "BTCS"; - public static final String BTE = "BTE"; - public static final String BTG = "BTG"; - public static final String BTP = "BTP"; - public static final String BTQ = "BTQ"; - public static final String BTR = "BTR"; - public static final String BUK = "BUK"; - public static final String BUR = "BUR"; - public static final String C2 = "C2"; - public static final String CACH = "CACH"; - public static final String CAGE = "CAGE"; - public static final String CAP = "CAP"; - public static final String CARB = "CARB"; - public static final String CASH = "CASH"; - public static final String CAT = "CAT"; - public static final String CDC = "CDC"; - public static final String CENT = "CENT"; - public static final String CGA = "CGA"; - public static final String CGB = "CGB"; - public static final String CIN = "CIN"; - public static final String CL = "CL"; - public static final String CLR = "CLR"; - public static final String CMC = "CMC"; - public static final String CMT = "CMT"; - public static final String CNC = "CNC"; - public static final String CNOTE = "CNOTE"; - public static final String COIN = "COIN"; - public static final String COINO = "COINO"; - public static final String COL = "COL"; - public static final String COLA = "COLA"; - public static final String CON = "CON"; - public static final String CORG = "CORG"; - public static final String CPR = "CPR"; - public static final String CR = "CR"; - public static final String CRA = "CRA"; - public static final String CRC = "CRC"; - public static final String CRD = "CRD"; - public static final String CREA = "CREA"; - public static final String CRN = "CRN"; - public static final String CRS = "CRS"; - public static final String CSC = "CSC"; - public static final String CTM = "CTM"; - public static final String DASH = "DASH"; - public static final String DBL = "DBL"; - public static final String DELTA = "DELTA"; - public static final String DEM = "DEM"; - public static final String DGB = "DGB"; - public static final String DGC = "DGC"; - public static final String DIME = "DIME"; - public static final String DMD = "DMD"; - public static final String DOG = "DOG"; - public static final String DOGE = "DOGE"; - public static final String DOPE = "DOPE"; - public static final String DRK = "DRK"; - public static final String DSH = "DSH"; // DASH - public static final String DTC = "DTC"; - public static final String DUCK = "DUCK"; - public static final String DVC = "DVC"; - public static final String EAC = "EAC"; - public static final String ECC = "ECC"; - public static final String ECN = "ECN"; - public static final String ELC = "ELC"; - public static final String ELP = "ELP"; - public static final String EMC2 = "EMC2"; - public static final String EMD = "EMD"; - public static final String EMO = "EMO"; - public static final String EOS = "EOS"; - public static final String ETC = "ETC"; - public static final String ETH = "ETH"; - public static final String ETOK = "ETOK"; - public static final String eTOK = "eTOK"; - public static final String EUC = "EUC"; - public static final String EXC = "EXC"; - public static final String EZC = "EZC"; - public static final String FCK = "FCK"; - public static final String FFC = "FFC"; - public static final String FLAP = "FLAP"; - public static final String FLO = "FLO"; - public static final String FLT = "FLT"; - public static final String FOX = "FOX"; - public static final String FRC = "FRC"; - public static final String FRK = "FRK"; - public static final String FRQ = "FRQ"; - public static final String FRY = "FRY"; - public static final String FRZ = "FRZ"; - public static final String FSC = "FSC"; - public static final String FSS = "FSS"; - public static final String FST = "FST"; - public static final String FTC = "FTC"; - public static final String FUNK = "FUNK"; - public static final String FZ = "FZ"; - public static final String GAME = "GAME"; - public static final String GDC = "GDC"; - public static final String GHS = "GHS"; - public static final String GLB = "GLB"; - public static final String GLC = "GLC"; - public static final String GLD = "GLD"; - public static final String GLX = "GLX"; - public static final String GME = "GME"; - public static final String GNT = "GNT"; - public static final String GOAT = "GOAT"; - public static final String GOX = "GOX"; - public static final String GPUC = "GPUC"; - public static final String GRC = "GRC"; - public static final String GRUMP = "GRUMP"; - public static final String HBN = "HBN"; - public static final String HEX = "HEX"; - public static final String HIRO = "HIRO"; - public static final String HRO = "HRO"; - public static final String HUC = "HUC"; - public static final String HVC = "HVC"; - public static final String HXC = "HXC"; - public static final String HYC = "HYC"; - public static final String I0C = "I0C"; - public static final String ICN = "ICN"; - public static final String IFC = "IFC"; - public static final String IND = "IND"; - public static final String IOST = "IOST"; - public static final String IOT = "IOT"; - public static final String IQD = "IQD"; - public static final String IXC = "IXC"; - public static final String JKC = "JKC"; - public static final String JRY = "JRY"; - public static final String KARM = "KARM"; - public static final String KCS = "KCS"; - public static final String KDC = "KDC"; - public static final String KGC = "KGC"; - public static final String KKC = "KKC"; - public static final String KNC = "KNC"; - public static final String KOI = "KOI"; - public static final String KRN = "KRN"; - public static final String KUN = "KUN"; - public static final String LBW = "LBW"; - public static final String LDC = "LDC"; - public static final String LEAF = "LEAF"; - public static final String LGBT = "LGBT"; - public static final String LGC = "LGC"; - public static final String LK7 = "LK7"; - public static final String LKY = "LKY"; - public static final String LMC = "LMC"; - public static final String LOT = "LOT"; - public static final String LSK = "LSK"; - public static final String LTB = "LTB"; - public static final String LTC = "LTC"; - public static final String mLTC = "mLTC"; - public static final String LYC = "LYC"; - public static final String MAX = "MAX"; - public static final String MCR = "MCR"; - public static final String MCX = "MCX"; - public static final String MEC = "MEC"; - public static final String MEM = "MEM"; - public static final String MEOW = "MEOW"; - public static final String MIM = "MIM"; - public static final String MINT = "MINT"; - public static final String MMC = "MMC"; - public static final String MNC = "MNC"; - public static final String MOON = "MOON"; - public static final String MRC = "MRC"; - public static final String MRS = "MRS"; - public static final String MRY = "MRY"; - public static final String MSC = "MSC"; - public static final String MST = "MST"; - public static final String MTC = "MTC"; - public static final String MTS = "MTS"; - public static final String MXB = "MXB"; - public static final String MXN = "MXN"; - public static final String MYMINER = "MYMINER"; - public static final String MYR = "MYR"; - public static final String MZC = "MZC"; - public static final String NAN = "NAN"; - public static final String NBL = "NBL"; - public static final String NCASH = "NCASH"; - public static final String NDL = "NDL"; - public static final String NEC = "NEC"; - public static final String NEO = "NEO"; - public static final String NET = "NET"; - public static final String NIB = "NIB"; - public static final String NKA = "NKA"; - public static final String NMC = "NMC"; - public static final String NOBL = "NOBL"; - public static final String NOTE = "NOTE"; - public static final String NRB = "NRB"; - public static final String NUC = "NUC"; - public static final String NVC = "NVC"; - public static final String NXT = "NXT"; - public static final String NYAN = "NYAN"; - public static final String OIL = "OIL"; - public static final String OLY = "OLY"; - public static final String OMG = "OMG"; - public static final String ORB = "ORB"; - public static final String ORG = "ORG"; - public static final String ORO = "ORO"; - public static final String OSC = "OSC"; - public static final String P$ = "P$"; - public static final String PAND = "PAND"; - public static final String PANDA = "PANDA"; - public static final String PCC = "PCC"; - public static final String PCN = "PCN"; - public static final String PENG = "PENG"; - public static final String PHI = "PHI"; - public static final String PHS = "PHS"; - public static final String PIC = "PIC"; - public static final String PLC = "PLC"; - public static final String PLT = "PLT"; - public static final String PMC = "PMC"; - public static final String PND = "PND"; - public static final String POD = "POD"; - public static final String POINTS = "POINTS"; - public static final String POT = "POT"; - public static final String PPC = "PPC"; - public static final String PRC = "PRC"; - public static final String PRT = "PRT"; - public static final String PT = "PT"; - public static final String PTC = "PTC"; - public static final String PTS = "PTS"; - public static final String PWC = "PWC"; - public static final String PWNY = "PWNY"; - public static final String PXC = "PXC"; - public static final String PXL = "PXL"; - public static final String PYC = "PYC"; - public static final String Q2C = "Q2C"; - public static final String QB = "QB"; - public static final String QRK = "QRK"; - public static final String QTUM = "QTUM"; - public static final String RAD = "RAD"; - public static final String RAIN = "RAIN"; - public static final String RBBT = "RBBT"; - public static final String RCH = "RCH"; - public static final String RDD = "RDD"; - public static final String REC = "REC"; - public static final String RED = "RED"; - public static final String REDD = "REDD"; // RDD - public static final String REP = "REP"; // RDD - public static final String RIC = "RIC"; - public static final String RON = "RON"; - public static final String RPC = "RPC"; - public static final String RPD = "RPD"; - public static final String RRT = "RRT"; - public static final String RSC = "RSC"; - public static final String RBY = "RBY"; - public static final String RYC = "RYC"; - public static final String SAN = "SAN"; - public static final String SAT = "SAT"; - public static final String SAV = "SAV"; - public static final String SBC = "SBC"; - public static final String SBX = "SBX"; - public static final String SC = "SC"; - public static final String SCO = "SCO"; - public static final String SMC = "SMC"; - public static final String SOC = "SOC"; - public static final String SOCHI = "SOCHI"; - public static final String SPA = "SPA"; - public static final String SPT = "SPT"; - public static final String SRC = "SRC"; - public static final String START = "START"; - public static final String STC = "STC"; - public static final String STL = "STL"; - public static final String STR = "STR"; - public static final String STY = "STY"; - public static final String SUN = "SUN"; - public static final String SXC = "SXC"; - public static final String SYN = "SYN"; - public static final String TAG = "TAG"; - public static final String TAK = "TAK"; - public static final String TEA = "TEA"; - public static final String TEK = "TEK"; - public static final String TEL = "TEL"; - public static final String TES = "TES"; - public static final String TFC = "TFC"; - public static final String TGC = "TGC"; - public static final String TH1 = "TH1"; - public static final String THOR = "THOR"; - public static final String TIPS = "TIPS"; - public static final String TIX = "TIX"; - public static final String TOP = "TOP"; - public static final String TRC = "TRC"; - public static final String TRL = "TRL"; - public static final String TRX = "TRX"; - public static final String TSL = "TSL"; - public static final String TTC = "TTC"; - public static final String TUSD = "TUSD"; - public static final String UFO = "UFO"; - public static final String UNC = "UNC"; - public static final String UNI = "UNI"; - public static final String UNO = "UNO"; - public static final String USDE = "USDE"; - public static final String USDe = "USDe"; - public static final String USDT = "USDT"; - public static final String UTC = "UTC"; - public static final String VDC = "VDC"; - public static final String VEN = "VEN"; - public static final String VGC = "VGC"; - public static final String VLC = "VLC"; - public static final String VLT = "VLT"; - public static final String VMP = "VMP"; - public static final String VOLT = "VOLT"; - public static final String VTC = "VTC"; - public static final String WDC = "WDC"; - public static final String WIKI = "WIKI"; - public static final String WOLF = "WOLF"; - public static final String XBT = "XBT"; // BTC - public static final String XCP = "XCP"; - public static final String XDG = "XDG"; // DOGE - public static final String XIV = "XIV"; - public static final String XJO = "XJO"; - public static final String XLM = "XLM"; - public static final String XMR = "XMR"; - public static final String XNC = "XNC"; - public static final String XPM = "XPM"; - public static final String XPY = "XPY"; - public static final String XRP = "XRP"; - public static final String XVN = "XVN"; // VEN - public static final String XXL = "XXL"; - public static final String YAC = "YAC"; - public static final String YANG = "YANG"; - public static final String YBC = "YBC"; - public static final String YIN = "YIN"; - public static final String ZCC = "ZCC"; - public static final String ZEC = "ZEC"; - public static final String ZED = "ZED"; - public static final String ZEIT = "ZEIT"; - public static final String ZET = "ZET"; - public static final String ZEU = "ZEU"; - public static final String ZIL = "ZIL"; - public static final String ZMB = "ZMB"; - public static final String ZRX = "ZRX"; - public static final String ZTC = "ZTC"; -} diff --git a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/Abucoins.java b/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/Abucoins.java deleted file mode 100644 index 8f36a7e6..00000000 --- a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/Abucoins.java +++ /dev/null @@ -1,56 +0,0 @@ -package com.mobnetic.coinguardian.model.market; - -import com.mobnetic.coinguardian.model.CheckerInfo; -import com.mobnetic.coinguardian.model.CurrencyPairInfo; -import com.mobnetic.coinguardian.model.Market; -import com.mobnetic.coinguardian.model.Ticker; - -import org.json.JSONArray; -import org.json.JSONObject; - -import java.util.List; - -public class Abucoins extends Market { - - private final static String NAME = "Abucoins"; - private final static String TTS_NAME = NAME; - private final static String URL = "https://api.abucoins.com/products/%1$s/stats"; - private final static String URL_CURRENCY_PAIRS = "https://api.abucoins.com/products"; - - public Abucoins() { - super(NAME, TTS_NAME, null); - } - - @Override - public String getUrl(int requestId, CheckerInfo checkerInfo) { - return String.format(URL, checkerInfo.getCurrencyPairId()); - } - - @Override - protected void parseTickerFromJsonObject(int requestId, JSONObject jsonObject, Ticker ticker, CheckerInfo checkerInfo) throws Exception { - ticker.vol = jsonObject.getDouble("volume"); - ticker.high = jsonObject.getDouble("high"); - ticker.low = jsonObject.getDouble("low"); - ticker.last = jsonObject.getDouble("last"); - } - - // ==================== - // Get currency pairs - // ==================== - @Override - public String getCurrencyPairsUrl(int requestId) { - return URL_CURRENCY_PAIRS; - } - - @Override - protected void parseCurrencyPairs(int requestId, String responseString, List pairs) throws Exception { - final JSONArray jsonArray = new JSONArray(responseString); - for(int i=0; i pairs) throws Exception { - final JSONObject dataJsonObject = jsonObject.getJSONObject("data"); - - final JSONArray pairsJsonArray = dataJsonObject.names(); - for(int i=0; i pairs) throws Exception { - final JSONObject jsonObject = new JSONObject(responseString); - final JSONArray jsonSymbols = jsonObject.getJSONArray("symbols");; - - for(int i=0; i CURRENCY_PAIRS = new LinkedHashMap<>(); - - //GET https://bit2c.co.il/Exchanges/[BtcNis/EthNis/BchNis/LtcNis/EtcNis/BtgNis]/Ticker.json - static { - CURRENCY_PAIRS.put(VirtualCurrency.BTC, new String[]{ - Currency.NIS - }); - CURRENCY_PAIRS.put(VirtualCurrency.ETH, new String[]{ - Currency.NIS - }); - CURRENCY_PAIRS.put(VirtualCurrency.BCH, new String[]{ - Currency.NIS - }); - CURRENCY_PAIRS.put(VirtualCurrency.LTC, new String[]{ - Currency.NIS - }); - CURRENCY_PAIRS.put(VirtualCurrency.ETC, new String[]{ - Currency.NIS - }); - CURRENCY_PAIRS.put(VirtualCurrency.BTG, new String[]{ - Currency.NIS - }); - } - - public Bit2c() { - super(NAME, TTS_NAME, CURRENCY_PAIRS); - } - - @Override - public String getUrl(int requestId, CheckerInfo checkerInfo) { - return String.format(URL, checkerInfo.getCurrencyBase(), checkerInfo.getCurrencyCounter()); - } - - @Override - protected void parseTickerFromJsonObject(int requestId, JSONObject jsonObject, Ticker ticker, CheckerInfo checkerInfo) throws Exception { - ticker.bid = jsonObject.getDouble("h"); - ticker.ask = jsonObject.getDouble("l"); - ticker.vol = jsonObject.getDouble("a"); - ticker.last = jsonObject.getDouble("ll"); - } -} diff --git a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/BitBay.java b/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/BitBay.java deleted file mode 100644 index 8b975818..00000000 --- a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/BitBay.java +++ /dev/null @@ -1,82 +0,0 @@ -package com.mobnetic.coinguardian.model.market; - -import java.util.HashMap; -import java.util.LinkedHashMap; - -import org.json.JSONObject; - -import com.mobnetic.coinguardian.model.CheckerInfo; -import com.mobnetic.coinguardian.model.Market; -import com.mobnetic.coinguardian.model.Ticker; -import com.mobnetic.coinguardian.model.currency.Currency; -import com.mobnetic.coinguardian.model.currency.VirtualCurrency; - -public class BitBay extends Market { - - private final static String NAME = "BitBay.net"; - private final static String TTS_NAME = "Bit Bay"; - private final static String URL = "https://bitbay.net/API/Public/%1$s%2$s/ticker.json"; - private final static HashMap CURRENCY_PAIRS = new LinkedHashMap(); - static { - CURRENCY_PAIRS.put(VirtualCurrency.BCC, new String[]{ - VirtualCurrency.BTC, - Currency.PLN, - Currency.USD, - Currency.EUR - }); - CURRENCY_PAIRS.put(VirtualCurrency.BTC, new String[]{ - Currency.PLN, - Currency.USD, - Currency.EUR - }); - CURRENCY_PAIRS.put(VirtualCurrency.DASH, new String[]{ - VirtualCurrency.BTC, - Currency.PLN, - Currency.USD, - Currency.EUR - }); - CURRENCY_PAIRS.put(VirtualCurrency.GAME, new String[]{ - VirtualCurrency.BTC, - Currency.PLN, - Currency.USD, - Currency.EUR - }); - CURRENCY_PAIRS.put(VirtualCurrency.LTC, new String[]{ - VirtualCurrency.BTC, - Currency.PLN, - Currency.USD, - Currency.EUR - }); - CURRENCY_PAIRS.put(VirtualCurrency.ETH, new String[]{ - VirtualCurrency.BTC, - Currency.PLN, - Currency.USD, - Currency.EUR - }); - CURRENCY_PAIRS.put(VirtualCurrency.LSK, new String[]{ - VirtualCurrency.BTC, - Currency.PLN, - Currency.USD, - Currency.EUR - }); - } - - public BitBay() { - super(NAME, TTS_NAME, CURRENCY_PAIRS); - } - - @Override - public String getUrl(int requestId, CheckerInfo checkerInfo) { - return String.format(URL, checkerInfo.getCurrencyBase(), checkerInfo.getCurrencyCounter()); - } - - @Override - protected void parseTickerFromJsonObject(int requestId, JSONObject jsonObject, Ticker ticker, CheckerInfo checkerInfo) throws Exception { - ticker.bid = jsonObject.getDouble("bid"); - ticker.ask = jsonObject.getDouble("ask"); - ticker.vol = jsonObject.getDouble("volume"); - ticker.high = jsonObject.getDouble("max"); - ticker.low = jsonObject.getDouble("min"); - ticker.last = jsonObject.getDouble("last"); - } -} diff --git a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/BitFlyer.java b/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/BitFlyer.java deleted file mode 100644 index 8b86f991..00000000 --- a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/BitFlyer.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.mobnetic.coinguardian.model.market; - -import com.mobnetic.coinguardian.model.CheckerInfo; -import com.mobnetic.coinguardian.model.Market; -import com.mobnetic.coinguardian.model.Ticker; -import com.mobnetic.coinguardian.model.currency.Currency; -import com.mobnetic.coinguardian.model.currency.VirtualCurrency; -import org.json.JSONObject; - -import java.util.HashMap; -import java.util.LinkedHashMap; - -public class BitFlyer extends Market { - - private final static String NAME = "bitFlyer"; - private final static String TTS_NAME = "bit flyer"; - private final static String URL = "https://api.bitflyer.jp/v1/ticker?product_code=%1$s_%2$s"; - private final static HashMap CURRENCY_PAIRS = new LinkedHashMap<>(); - static { - CURRENCY_PAIRS.put(VirtualCurrency.BTC, new String[]{ - Currency.JPY, - }); - CURRENCY_PAIRS.put(VirtualCurrency.ETH, new String[]{ - VirtualCurrency.BTC, - }); - } - - public BitFlyer() { - super(NAME, TTS_NAME, CURRENCY_PAIRS); - } - - @Override - public String getUrl(int requestId, CheckerInfo checkerInfo) { - return String.format(URL, checkerInfo.getCurrencyBase(), checkerInfo.getCurrencyCounter()); - } - - @Override - protected void parseTickerFromJsonObject(int requestId, JSONObject jsonObject, Ticker ticker, CheckerInfo checkerInfo) throws Exception { - ticker.bid = jsonObject.getDouble("best_bid"); - ticker.ask = jsonObject.getDouble("best_ask"); - ticker.vol = jsonObject.getDouble("volume_by_product"); - ticker.last = jsonObject.getDouble("ltp"); - } -} diff --git a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/BitFlyerFX.java b/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/BitFlyerFX.java deleted file mode 100644 index 29f64ed4..00000000 --- a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/BitFlyerFX.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.mobnetic.coinguardian.model.market; - -import com.mobnetic.coinguardian.model.CheckerInfo; -import com.mobnetic.coinguardian.model.Market; -import com.mobnetic.coinguardian.model.Ticker; -import com.mobnetic.coinguardian.model.currency.Currency; -import com.mobnetic.coinguardian.model.currency.VirtualCurrency; -import org.json.JSONObject; - -import java.util.HashMap; -import java.util.LinkedHashMap; - -public class BitFlyerFX extends Market { - - private final static String NAME = "bitFlyer FX"; - private final static String TTS_NAME = "bit flyer FX"; - private final static String URL = "https://api.bitflyer.jp/v1/ticker?product_code=FX_%1$s_%2$s"; - private final static HashMap CURRENCY_PAIRS = new LinkedHashMap<>(); - static { - CURRENCY_PAIRS.put(VirtualCurrency.BTC, new String[]{ - Currency.JPY, - }); - } - - public BitFlyerFX() { - super(NAME, TTS_NAME, CURRENCY_PAIRS); - } - - @Override - public String getUrl(int requestId, CheckerInfo checkerInfo) { - return String.format(URL, checkerInfo.getCurrencyBase(), checkerInfo.getCurrencyCounter()); - } - - @Override - protected void parseTickerFromJsonObject(int requestId, JSONObject jsonObject, Ticker ticker, CheckerInfo checkerInfo) throws Exception { - ticker.bid = jsonObject.getDouble("best_bid"); - ticker.ask = jsonObject.getDouble("best_ask"); - ticker.vol = jsonObject.getDouble("volume_by_product"); - ticker.last = jsonObject.getDouble("ltp"); - } -} diff --git a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/BitKonan.java b/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/BitKonan.java deleted file mode 100644 index f647ac0c..00000000 --- a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/BitKonan.java +++ /dev/null @@ -1,52 +0,0 @@ -package com.mobnetic.coinguardian.model.market; - -import java.util.HashMap; -import java.util.LinkedHashMap; - -import org.json.JSONObject; - -import com.mobnetic.coinguardian.model.CheckerInfo; -import com.mobnetic.coinguardian.model.Market; -import com.mobnetic.coinguardian.model.Ticker; -import com.mobnetic.coinguardian.model.currency.Currency; -import com.mobnetic.coinguardian.model.currency.VirtualCurrency; - -public class BitKonan extends Market { - - private final static String NAME = "BitKonan"; - private final static String TTS_NAME = "Bit Konan"; - private final static String URL_BTC = "https://bitkonan.com/api/ticker"; - private final static String URL_LTC = "https://bitkonan.com/api/ltc_ticker"; - private final static HashMap CURRENCY_PAIRS = new LinkedHashMap(); - static { - CURRENCY_PAIRS.put(VirtualCurrency.BTC, new String[]{ - Currency.USD - }); - CURRENCY_PAIRS.put(VirtualCurrency.LTC, new String[]{ - Currency.USD - }); - } - - public BitKonan() { - super(NAME, TTS_NAME, CURRENCY_PAIRS); - } - - @Override - public String getUrl(int requestId, CheckerInfo checkerInfo) { - if(VirtualCurrency.BTC.equals(checkerInfo.getCurrencyBase())) { - return URL_BTC; - } else { - return URL_LTC; - } - } - - @Override - protected void parseTickerFromJsonObject(int requestId, JSONObject jsonObject, Ticker ticker, CheckerInfo checkerInfo) throws Exception { - ticker.bid = jsonObject.getDouble("bid"); - ticker.ask = jsonObject.getDouble("ask"); - ticker.vol = jsonObject.getDouble("volume"); - ticker.high = jsonObject.getDouble("high"); - ticker.low = jsonObject.getDouble("low"); - ticker.last = jsonObject.getDouble("last"); - } -} diff --git a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/BitMEX.java b/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/BitMEX.java deleted file mode 100644 index 95be04d9..00000000 --- a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/BitMEX.java +++ /dev/null @@ -1,90 +0,0 @@ -package com.mobnetic.coinguardian.model.market; - -import java.text.SimpleDateFormat; -import java.util.List; -import java.util.Locale; -import java.util.TimeZone; - -import org.json.JSONArray; -import org.json.JSONObject; - -import com.mobnetic.coinguardian.model.CheckerInfo; -import com.mobnetic.coinguardian.model.CurrencyPairInfo; -import com.mobnetic.coinguardian.model.Market; -import com.mobnetic.coinguardian.model.Ticker; - -public class BitMEX extends Market { - - private final static String NAME = "BitMEX"; - private final static String TTS_NAME = NAME; - private final static String URL = "https://www.bitmex.com/api/v1/instrument" + - "?symbol=%1$s" + - "&columns=bidPrice,askPrice,turnover24h,highPrice,lowPrice,lastPrice"; - private final static String URL_CURRENCY_PAIRS = "https://www.bitmex.com/api/v1/instrument" + - "?columns=rootSymbol,typ" + - "&filter={\"state\":\"Open\"}"; - private final static SimpleDateFormat ISO_DATE_FORMAT = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'", Locale.ENGLISH); - static { - ISO_DATE_FORMAT.setTimeZone(TimeZone.getTimeZone("GMT")); - } - - public BitMEX() { - super(NAME, TTS_NAME, null); - } - - @Override - public String getUrl(int requestId, CheckerInfo checkerInfo) { - return String.format(URL, checkerInfo.getCurrencyPairId()); - } - - @Override - protected void parseTicker(int requestId, String responseString, Ticker ticker, CheckerInfo checkerInfo) throws Exception { - this.parseTickerFromJsonObject(requestId, new JSONArray(responseString).getJSONObject(0), ticker, checkerInfo); - } - - @Override - protected void parseTickerFromJsonObject(int requestId, JSONObject jsonObject, Ticker ticker, CheckerInfo checkerInfo) throws Exception { - ticker.bid = jsonObject.getDouble("bidPrice"); - ticker.ask = jsonObject.getDouble("askPrice"); - // This comes back in Satoshis - ticker.vol = jsonObject.getDouble("turnover24h") / 1e8; - if (!jsonObject.isNull("highPrice")) - ticker.high = jsonObject.getDouble("highPrice"); - if (!jsonObject.isNull("lowPrice")) - ticker.low = jsonObject.getDouble("lowPrice"); - ticker.last = jsonObject.getDouble("lastPrice"); - // This is an ISO timestamp representing UTC time - ticker.timestamp = ISO_DATE_FORMAT.parse(jsonObject.getString("timestamp")).getTime(); - } - - // ==================== - // Get currency pairs - // ==================== - @Override - public String getCurrencyPairsUrl(int requestId) { - return URL_CURRENCY_PAIRS; - } - - @Override - protected void parseCurrencyPairs(int requestId, String responseString, List pairs) throws Exception { - JSONArray instruments = new JSONArray(responseString); - for (int i = 0; i < instruments.length(); i++) { - this.parseCurrencyPairsFromJsonObject(requestId, instruments.getJSONObject(i), pairs); - } - } - - @Override - protected void parseCurrencyPairsFromJsonObject(int requestId, JSONObject jsonObject, List pairs) throws Exception { - String base = jsonObject.getString("rootSymbol"); - String id = jsonObject.getString("symbol"); - String quote = id.substring(id.indexOf(base) + base.length()); - - // Binary - if (jsonObject.getString("typ").equals("FFICSX")) { - quote = base; - base = "BINARY"; - } - - pairs.add(new CurrencyPairInfo(base, quote, id)); - } -} diff --git a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/BitMaszyna.java b/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/BitMaszyna.java deleted file mode 100644 index 4d701a0f..00000000 --- a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/BitMaszyna.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.mobnetic.coinguardian.model.market; - -import java.util.HashMap; -import java.util.LinkedHashMap; - -import org.json.JSONObject; - -import com.mobnetic.coinguardian.model.CheckerInfo; -import com.mobnetic.coinguardian.model.Market; -import com.mobnetic.coinguardian.model.Ticker; -import com.mobnetic.coinguardian.model.currency.Currency; -import com.mobnetic.coinguardian.model.currency.VirtualCurrency; - -public class BitMaszyna extends Market { - - private final static String NAME = "BitMaszyna.pl"; - private final static String TTS_NAME = "Bit Maszyna"; - private final static String URL = "https://bitmaszyna.pl/api/%1$s%2$s/ticker.json"; - private final static HashMap CURRENCY_PAIRS = new LinkedHashMap(); - static { - CURRENCY_PAIRS.put(VirtualCurrency.BTC, new String[]{ - Currency.PLN - }); - CURRENCY_PAIRS.put(VirtualCurrency.LTC, new String[]{ - Currency.PLN - }); - } - - public BitMaszyna() { - super(NAME, TTS_NAME, CURRENCY_PAIRS); - } - - @Override - public String getUrl(int requestId, CheckerInfo checkerInfo) { - return String.format(URL, checkerInfo.getCurrencyBase(), checkerInfo.getCurrencyCounter()); - } - - @Override - protected void parseTickerFromJsonObject(int requestId, JSONObject jsonObject, Ticker ticker, CheckerInfo checkerInfo) throws Exception { - ticker.bid = jsonObject.getDouble("bid"); - ticker.ask = jsonObject.getDouble("ask"); - ticker.vol = jsonObject.getDouble("volume1"); - ticker.high = jsonObject.getDouble("high"); - ticker.low = jsonObject.getDouble("low"); - ticker.last = jsonObject.getDouble("last"); - } -} diff --git a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/BitTrex.java b/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/BitTrex.java deleted file mode 100644 index fdb819db..00000000 --- a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/BitTrex.java +++ /dev/null @@ -1,57 +0,0 @@ -package com.mobnetic.coinguardian.model.market; - -import java.util.List; - -import org.json.JSONArray; -import org.json.JSONObject; - -import com.mobnetic.coinguardian.model.CheckerInfo; -import com.mobnetic.coinguardian.model.CurrencyPairInfo; -import com.mobnetic.coinguardian.model.Market; -import com.mobnetic.coinguardian.model.Ticker; - -public class BitTrex extends Market { - - private final static String NAME = "BitTrex"; - private final static String TTS_NAME = "Bit Trex"; - private final static String URL = "https://bittrex.com/api/v1.1/public/getticker?market=%1$s-%2$s"; - private final static String URL_CURRENCY_PAIRS = "https://bittrex.com/api/v1.1/public/getmarkets"; - - public BitTrex() { - super(NAME, TTS_NAME, null); - } - - @Override - public String getUrl(int requestId, CheckerInfo checkerInfo) { - return String.format(URL, checkerInfo.getCurrencyCounter(), checkerInfo.getCurrencyBase()); // reversed - } - - @Override - protected void parseTickerFromJsonObject(int requestId, JSONObject jsonObject, Ticker ticker, CheckerInfo checkerInfo) throws Exception { - final JSONObject resultJsonObject = jsonObject.getJSONObject("result"); - ticker.bid = resultJsonObject.getDouble("Bid"); - ticker.ask = resultJsonObject.getDouble("Ask"); - ticker.last = resultJsonObject.getDouble("Last"); - } - - // ==================== - // Get currency pairs - // ==================== - @Override - public String getCurrencyPairsUrl(int requestId) { - return URL_CURRENCY_PAIRS; - } - - @Override - protected void parseCurrencyPairsFromJsonObject(int requestId, JSONObject jsonObject, List pairs) throws Exception { - final JSONArray resultJsonArray = jsonObject.getJSONArray("result"); - - for(int i=0; i CURRENCY_PAIRS = new LinkedHashMap(); - static { - CURRENCY_PAIRS.put(VirtualCurrency.BTC, new String[]{ - Currency.IDR, - Currency.SGD, - Currency.MYR, - Currency.NGN, - Currency.ZAR - }); - } - - public BitX() { - super(NAME, TTS_NAME, CURRENCY_PAIRS); - } - - @Override - public String getUrl(int requestId, CheckerInfo checkerInfo) { - final String pairString; - if(checkerInfo.getCurrencyPairId()==null) { - pairString = String.format("%1$s%2$s", fixCurrency(checkerInfo.getCurrencyBase()), fixCurrency(checkerInfo.getCurrencyCounter())); - } else { - pairString = checkerInfo.getCurrencyPairId(); - } - return String.format(URL, pairString); - } - - private String fixCurrency(String currency) { - if(VirtualCurrency.BTC.equals(currency)) { - return VirtualCurrency.XBT; - } else if(VirtualCurrency.XBT.equals(currency)) { - return VirtualCurrency.BTC; - } - - return currency; - } - - @Override - protected void parseTickerFromJsonObject(int requestId, JSONObject jsonObject, Ticker ticker, CheckerInfo checkerInfo) throws Exception { - ticker.bid = jsonObject.getDouble("bid"); - ticker.ask = jsonObject.getDouble("ask"); - ticker.vol = jsonObject.getDouble("rolling_24_hour_volume"); - ticker.last = jsonObject.getDouble("last_trade"); - ticker.timestamp = jsonObject.getLong("timestamp"); - } - - // ==================== - // Get currency pairs - // ==================== - @Override - public String getCurrencyPairsUrl(int requestId) { - return URL_CURRENCY_PAIRS; - } - - @Override - protected void parseCurrencyPairsFromJsonObject(int requestId, JSONObject jsonObject, List pairs) throws Exception { - final JSONArray dataJsonArray = jsonObject.getJSONArray("tickers"); - for(int i=0; i CURRENCY_PAIRS = new LinkedHashMap(); - static { - CURRENCY_PAIRS.put(VirtualCurrency.BTC, new String[]{ - Currency.EUR - }); - } - - public BitcoinCentralNet() { - super(NAME, TTS_NAME, CURRENCY_PAIRS); - } - - @Override - public String getUrl(int requestId, CheckerInfo checkerInfo) { - return URL; - } - - @Override - protected void parseTickerFromJsonObject(int requestId, JSONObject jsonObject, Ticker ticker, CheckerInfo checkerInfo) throws Exception { - ticker.bid = jsonObject.getDouble("bid"); - ticker.ask = jsonObject.getDouble("ask"); - ticker.vol = jsonObject.getDouble("volume"); - ticker.high = jsonObject.getDouble("high"); - ticker.low = jsonObject.getDouble("low"); - ticker.last = jsonObject.getDouble("price"); - } -} diff --git a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/BitcoinCoId.java b/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/BitcoinCoId.java deleted file mode 100644 index 8ac688d6..00000000 --- a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/BitcoinCoId.java +++ /dev/null @@ -1,71 +0,0 @@ -package com.mobnetic.coinguardian.model.market; - -import java.util.List; -import java.util.Locale; - -import org.json.JSONArray; -import org.json.JSONObject; - -import com.mobnetic.coinguardian.model.CheckerInfo; -import com.mobnetic.coinguardian.model.CurrencyPairInfo; -import com.mobnetic.coinguardian.model.Market; -import com.mobnetic.coinguardian.model.Ticker; - -public class BitcoinCoId extends Market { - - private final static String NAME = "Bitcoin.co.id"; - private final static String TTS_NAME = "Bitcoin co id"; - private final static String URL = "https://vip.bitcoin.co.id/api/%1$s/ticker/"; - private final static String URL_CURRENCY_PAIRS = "https://vip.bitcoin.co.id/api/summaries"; - - public BitcoinCoId() { - super(NAME, TTS_NAME, null); - } - - @Override - public String getUrl(int requestId, CheckerInfo checkerInfo) { - String pairId = checkerInfo.getCurrencyPairId(); - if (pairId == null) { - pairId = String.format("%1$s_%2$s", checkerInfo.getCurrencyBaseLowerCase(), checkerInfo.getCurrencyCounterLowerCase()); - } - return String.format(URL, pairId); - } - - @Override - protected void parseTickerFromJsonObject(int requestId, JSONObject jsonObject, Ticker ticker, CheckerInfo checkerInfo) throws Exception { - final JSONObject tickerJsonObject = jsonObject.getJSONObject("ticker"); - ticker.bid = tickerJsonObject.getDouble("buy"); - ticker.ask = tickerJsonObject.getDouble("sell"); - ticker.vol = tickerJsonObject.getDouble("vol_" + checkerInfo.getCurrencyBaseLowerCase()); - ticker.high = tickerJsonObject.getDouble("high"); - ticker.low = tickerJsonObject.getDouble("low"); - ticker.last = tickerJsonObject.getDouble("last"); - ticker.timestamp = tickerJsonObject.getLong("server_time"); - } - - // ==================== - // Get currency pairs - // ==================== - @Override - public String getCurrencyPairsUrl(int requestId) { - return URL_CURRENCY_PAIRS; - } - - @Override - protected void parseCurrencyPairsFromJsonObject(int requestId, JSONObject jsonObject, List pairs) throws Exception { - final JSONObject tickersJsonObject = jsonObject.getJSONObject("tickers"); - final JSONArray tickerNamesArray = tickersJsonObject.names(); - for(int i=0; i CURRENCY_PAIRS = new LinkedHashMap(); - static { - CURRENCY_PAIRS.put(VirtualCurrency.BTC, new String[]{ - Currency.BRL - }); - } - - public BitcoinToYou() { - super(NAME, TTS_NAME, CURRENCY_PAIRS); - } - - @Override - public String getUrl(int requestId, CheckerInfo checkerInfo) { -/* - String pairId = checkerInfo.getCurrencyPairId(); - if (pairId == null) { - pairId = String.format("%1$s_%2$s", checkerInfo.getCurrencyBaseLowerCase(), checkerInfo.getCurrencyCounterLowerCase()); - } - */ - String result = String.format(URL, checkerInfo.getCurrencyBase(), checkerInfo.getCurrencyCounter()); - return result; - } - - @Override - protected void parseTickerFromJsonObject(int requestId, JSONObject jsonObject, Ticker ticker, CheckerInfo checkerInfo) throws Exception { - final JSONObject tickerJsonObject = jsonObject.getJSONObject("summary"); -// ticker.bid = tickerJsonObject.getDouble("buy"); -// ticker.ask = tickerJsonObject.getDouble("sell"); - ticker.vol = tickerJsonObject.getDouble("amount"); - ticker.high = tickerJsonObject.getDouble("high"); - ticker.low = tickerJsonObject.getDouble("low"); - ticker.last = tickerJsonObject.getDouble("last"); - } -} diff --git a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/BitcoinTrade.java b/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/BitcoinTrade.java deleted file mode 100644 index d0fe633c..00000000 --- a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/BitcoinTrade.java +++ /dev/null @@ -1,51 +0,0 @@ -package com.mobnetic.coinguardian.model.market; - -import java.util.HashMap; -import java.util.LinkedHashMap; -import org.json.JSONObject; - -import com.mobnetic.coinguardian.model.CheckerInfo; -import com.mobnetic.coinguardian.model.Market; -import com.mobnetic.coinguardian.model.Ticker; -import com.mobnetic.coinguardian.model.currency.Currency; -import com.mobnetic.coinguardian.model.currency.VirtualCurrency; - -public class BitcoinTrade extends Market { - - private final static String NAME = "BitcoinTrade"; - private final static String TTS_NAME = "Bitcoin Trade"; - private final static String URL = "https://api.bitcointrade.com.br/v3/public/%1$s%2$s/ticker"; - private final static HashMap CURRENCY_PAIRS = new LinkedHashMap(); - static { - CURRENCY_PAIRS.put(VirtualCurrency.BTC, new String[]{ - Currency.BRL - }); - CURRENCY_PAIRS.put(VirtualCurrency.ETH, new String[]{ - Currency.BRL - }); - CURRENCY_PAIRS.put(VirtualCurrency.LTC, new String[]{ - Currency.BRL - }); - } - - public BitcoinTrade() { - super(NAME, TTS_NAME, CURRENCY_PAIRS); - } - - @Override - public String getUrl(int requestId, CheckerInfo checkerInfo) { - return String.format(URL, checkerInfo.getCurrencyCounter(), checkerInfo.getCurrencyBase()); - } - - @Override - protected void parseTickerFromJsonObject(int requestId, JSONObject jsonObject, Ticker ticker, CheckerInfo checkerInfo) throws Exception { - final JSONObject dataJsonObject = jsonObject.getJSONObject("data"); - - ticker.bid = dataJsonObject.getDouble("buy"); - ticker.ask = dataJsonObject.getDouble("sell"); - ticker.vol = dataJsonObject.getDouble("volume"); - ticker.high = dataJsonObject.getDouble("high"); - ticker.low = dataJsonObject.getDouble("low"); - ticker.last = dataJsonObject.getDouble("last"); - } -} diff --git a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/BitcoinVenezuela.java b/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/BitcoinVenezuela.java deleted file mode 100644 index e195fcec..00000000 --- a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/BitcoinVenezuela.java +++ /dev/null @@ -1,63 +0,0 @@ -package com.mobnetic.coinguardian.model.market; - -import java.util.List; - -import org.json.JSONArray; -import org.json.JSONObject; - -import com.mobnetic.coinguardian.model.CheckerInfo; -import com.mobnetic.coinguardian.model.CurrencyPairInfo; -import com.mobnetic.coinguardian.model.Market; -import com.mobnetic.coinguardian.model.Ticker; -import com.mobnetic.coinguardian.model.currency.VirtualCurrency; - -public class BitcoinVenezuela extends Market { - - private final static String NAME = "BitcoinVenezuela"; - private final static String TTS_NAME = "Bitcoin Venezuela"; - private final static String URL = "https://api.bitcoinvenezuela.com/?html=no¤cy=%1$s&amount=1&to=%2$s"; - private final static String URL_CURRENCY_PAIRS = "https://api.bitcoinvenezuela.com/"; - - public BitcoinVenezuela() { - super(NAME, TTS_NAME, null); - } - - @Override - public String getUrl(int requestId, CheckerInfo checkerInfo) { - return String.format(URL, checkerInfo.getCurrencyBase(), checkerInfo.getCurrencyCounter()); - } - - @Override - protected void parseTicker(int requestId, String responseString, Ticker ticker, CheckerInfo checkerInfo) throws Exception { - ticker.last = Double.parseDouble(responseString.trim()); - } - - // ==================== - // Get currency pairs - // ==================== - @Override - public String getCurrencyPairsUrl(int requestId) { - return URL_CURRENCY_PAIRS; - } - - @Override - protected void parseCurrencyPairsFromJsonObject(int requestId, JSONObject jsonObject, List pairs) throws Exception { - parseCurrencyPairsFromCurrencyBase(VirtualCurrency.BTC, jsonObject, pairs); - parseCurrencyPairsFromCurrencyBase(VirtualCurrency.LTC, jsonObject, pairs); - parseCurrencyPairsFromCurrencyBase(VirtualCurrency.MSC, jsonObject, pairs); - } - - private void parseCurrencyPairsFromCurrencyBase(String currencyBase, JSONObject jsonObject, List pairs) throws Exception { - if(!jsonObject.has(currencyBase)) - return; - - final JSONObject currencyBaseJsonObject = jsonObject.getJSONObject(currencyBase); - final JSONArray counterCurrencyNames = currencyBaseJsonObject.names(); - for(int i=0; i CURRENCY_PAIRS = new LinkedHashMap(); - static { - CURRENCY_PAIRS.put(VirtualCurrency.BTC, new String[]{ - Currency.USD - }); - } - - public BitexLa() { - super(NAME, TTS_NAME, CURRENCY_PAIRS); - } - - @Override - public String getUrl(int requestId, CheckerInfo checkerInfo) { - return URL; - } - - @Override - protected void parseTickerFromJsonObject(int requestId, JSONObject jsonObject, Ticker ticker, CheckerInfo checkerInfo) throws Exception { - ticker.bid = jsonObject.getDouble("bid"); - ticker.ask = jsonObject.getDouble("ask"); - ticker.vol = jsonObject.getDouble("volume"); - ticker.high = jsonObject.getDouble("high"); - ticker.low = jsonObject.getDouble("low"); - ticker.last = jsonObject.getDouble("last"); - } -} diff --git a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/Bitfinex.java b/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/Bitfinex.java deleted file mode 100644 index 8ed7ae39..00000000 --- a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/Bitfinex.java +++ /dev/null @@ -1,147 +0,0 @@ -package com.mobnetic.coinguardian.model.market; - -import com.mobnetic.coinguardian.model.CheckerInfo; -import com.mobnetic.coinguardian.model.CurrencyPairInfo; -import com.mobnetic.coinguardian.model.Market; -import com.mobnetic.coinguardian.model.Ticker; -import com.mobnetic.coinguardian.model.currency.Currency; -import com.mobnetic.coinguardian.model.currency.VirtualCurrency; -import com.mobnetic.coinguardian.util.ParseUtils; -import com.mobnetic.coinguardian.util.TimeUtils; - -import org.json.JSONArray; -import org.json.JSONObject; - -import java.util.HashMap; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Locale; - -public class Bitfinex extends Market { - - private final static String NAME = "Bitfinex"; - private final static String TTS_NAME = NAME; - private final static String URL = "https://api-pub.bitfinex.com/v2/ticker/%1$s"; - private final static String URL_CURRENCY_PAIRS = "https://api-pub.bitfinex.com/v2/tickers?symbols=ALL"; - private final static HashMap CURRENCY_PAIRS = new LinkedHashMap<>(); - static { - CURRENCY_PAIRS.put(VirtualCurrency.BCC, new String[]{ - VirtualCurrency.BTC, - Currency.USD - }); - CURRENCY_PAIRS.put(VirtualCurrency.BCH, new String[]{ - VirtualCurrency.BTC, - VirtualCurrency.ETH, - Currency.USD - }); - CURRENCY_PAIRS.put(VirtualCurrency.BCU, new String[]{ - VirtualCurrency.BTC, - Currency.USD - }); - CURRENCY_PAIRS.put(VirtualCurrency.BTC, new String[]{ - Currency.USD - }); - CURRENCY_PAIRS.put(VirtualCurrency.DSH, new String[]{ - VirtualCurrency.BTC, - Currency.USD - }); - CURRENCY_PAIRS.put(VirtualCurrency.EOS, new String[]{ - VirtualCurrency.BTC, - VirtualCurrency.ETH, - Currency.USD - }); - CURRENCY_PAIRS.put(VirtualCurrency.ETC, new String[]{ - VirtualCurrency.BTC, - Currency.USD - }); - CURRENCY_PAIRS.put(VirtualCurrency.ETH, new String[]{ - VirtualCurrency.BTC, - Currency.USD - }); - CURRENCY_PAIRS.put(VirtualCurrency.IOT, new String[]{ - VirtualCurrency.BTC, - VirtualCurrency.ETH, - Currency.USD - }); - CURRENCY_PAIRS.put(VirtualCurrency.LTC, new String[]{ - VirtualCurrency.BTC, - Currency.USD - }); - CURRENCY_PAIRS.put(VirtualCurrency.OMG, new String[]{ - VirtualCurrency.BTC, - VirtualCurrency.ETH, - Currency.USD - }); - CURRENCY_PAIRS.put(VirtualCurrency.RRT, new String[]{ - VirtualCurrency.BTC, - Currency.USD - }); - CURRENCY_PAIRS.put(VirtualCurrency.SAN, new String[]{ - VirtualCurrency.BTC, - VirtualCurrency.ETH, - Currency.USD - }); - CURRENCY_PAIRS.put(VirtualCurrency.XMR, new String[]{ - VirtualCurrency.BTC, - Currency.USD - }); - CURRENCY_PAIRS.put(VirtualCurrency.XRP, new String[]{ - VirtualCurrency.BTC, - Currency.USD - }); - CURRENCY_PAIRS.put(VirtualCurrency.ZEC, new String[]{ - VirtualCurrency.BTC, - Currency.USD - }); - } - - public Bitfinex() { - super(NAME, TTS_NAME, CURRENCY_PAIRS); - } - - @Override - public String getUrl(int requestId, CheckerInfo checkerInfo) { - String pairId = checkerInfo.getCurrencyPairId(); - if (pairId == null) { - pairId = String.format("%1$s%2$s", - checkerInfo.getCurrencyBaseLowerCase(), - checkerInfo.getCurrencyCounterLowerCase()); - } - return String.format(URL, pairId); - } - - @Override - protected void parseTicker(int requestId, String responseString, Ticker ticker, CheckerInfo checkerInfo) throws Exception { - JSONArray jsonArray = new JSONArray(responseString); - ticker.bid = jsonArray.getDouble(0); - ticker.ask = jsonArray.getDouble(2); - ticker.last = jsonArray.getDouble(6); - ticker.vol = jsonArray.getDouble(7); - ticker.high = jsonArray.getDouble(8); - ticker.low = jsonArray.getDouble(9); - } - - // ==================== - // Get currency pairs - // ==================== - @Override - public String getCurrencyPairsUrl(int requestId) { - return URL_CURRENCY_PAIRS; - } - - @Override - protected void parseCurrencyPairs(int requestId, String responseString, List pairs) throws Exception { - final JSONArray pairsArray = new JSONArray(responseString); - for (int i = 0; i < pairsArray.length(); ++i) { - final JSONArray pairArray = pairsArray.getJSONArray(i); - final String pairId = pairArray.getString(0); - if (pairId != null && pairId.length() == 7) { - // pairId example "tBTCUSD" - pairs.add(new CurrencyPairInfo( - pairId.substring(1, 4).toUpperCase(Locale.US), - pairId.substring(4).toUpperCase(Locale.US), - pairId)); - } - } - } -} diff --git a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/Bithumb.java b/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/Bithumb.java deleted file mode 100644 index b5e52931..00000000 --- a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/Bithumb.java +++ /dev/null @@ -1,110 +0,0 @@ -package com.mobnetic.coinguardian.model.market; - -import com.mobnetic.coinguardian.model.CheckerInfo; -import com.mobnetic.coinguardian.model.Market; -import com.mobnetic.coinguardian.model.Ticker; -import com.mobnetic.coinguardian.model.currency.Currency; -import com.mobnetic.coinguardian.model.currency.VirtualCurrency; - -import org.json.JSONArray; -import org.json.JSONObject; - -import java.util.HashMap; -import java.util.LinkedHashMap; - -public class Bithumb extends Market { - - private final static String NAME = "Bithumb"; - private final static String TTS_NAME = NAME; - private final static String URL_TICKER = "https://api.bithumb.com/public/ticker/%1$s"; - private final static String URL_ORDERS = "https://api.bithumb.com/public/orderbook/%1$s?count=1"; - private final static HashMap CURRENCY_PAIRS = new LinkedHashMap<>(); - - static { - CURRENCY_PAIRS.put(VirtualCurrency.BTC, new String[]{ - Currency.KRW - }); - CURRENCY_PAIRS.put(VirtualCurrency.ETH, new String[]{ - Currency.KRW - }); - CURRENCY_PAIRS.put(VirtualCurrency.ETC, new String[]{ - Currency.KRW - }); - CURRENCY_PAIRS.put(VirtualCurrency.DASH, new String[]{ - Currency.KRW - }); - CURRENCY_PAIRS.put(VirtualCurrency.LTC, new String[]{ - Currency.KRW - }); - CURRENCY_PAIRS.put(VirtualCurrency.XRP, new String[]{ - Currency.KRW - }); - CURRENCY_PAIRS.put(VirtualCurrency.BCH, new String[]{ - Currency.KRW - }); - CURRENCY_PAIRS.put(VirtualCurrency.XMR, new String[]{ - Currency.KRW - }); - CURRENCY_PAIRS.put(VirtualCurrency.ZEC, new String[]{ - Currency.KRW - }); - CURRENCY_PAIRS.put(VirtualCurrency.QTUM, new String[]{ - Currency.KRW - }); - CURRENCY_PAIRS.put(VirtualCurrency.CON, new String[]{ - Currency.KRW - }); - } - - public Bithumb() { - super(NAME, TTS_NAME, CURRENCY_PAIRS); - } - - @Override - public int getNumOfRequests(CheckerInfo checkerRecord) { - return 2; - } - - @Override - public String getUrl(int requestId, CheckerInfo checkerInfo) { - if (requestId == 0) { - return String.format(URL_TICKER, checkerInfo.getCurrencyBaseLowerCase()); - } else { - return String.format(URL_ORDERS, checkerInfo.getCurrencyBaseLowerCase()); - } - } - - @Override - protected void parseTickerFromJsonObject(int requestId, JSONObject jsonObject, Ticker ticker, - CheckerInfo checkerInfo) throws Exception { - JSONObject dataObject = jsonObject.getJSONObject("data"); - - if (requestId == 0) { - ticker.vol = dataObject.getDouble("units_traded_24H"); - ticker.high = dataObject.getDouble("max_price"); - ticker.low = dataObject.getDouble("min_price"); - ticker.last = dataObject.getDouble("closing_price"); - ticker.timestamp = dataObject.getLong("date"); - } else { - ticker.bid = getFirstPriceFromOrder(dataObject, "bids"); - ticker.ask = getFirstPriceFromOrder(dataObject, "asks"); - } - } - - @Override - protected String parseErrorFromJsonObject(int requestId, JSONObject jsonObject, - CheckerInfo checkerInfo) throws Exception { - return jsonObject.getString("message"); - } - - private double getFirstPriceFromOrder(JSONObject jsonObject, String key) throws Exception { - JSONArray array = jsonObject.getJSONArray(key); - - if (array.length() == 0) { - return Ticker.NO_DATA; - } - - JSONObject first = array.getJSONObject(0); - return first.getDouble("price"); - } -} \ No newline at end of file diff --git a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/BitoEX.java b/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/BitoEX.java deleted file mode 100644 index 79411d24..00000000 --- a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/BitoEX.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.mobnetic.coinguardian.model.market; - -import java.util.HashMap; -import java.util.LinkedHashMap; - -import org.json.JSONArray; - -import com.mobnetic.coinguardian.model.CheckerInfo; -import com.mobnetic.coinguardian.model.Market; -import com.mobnetic.coinguardian.model.Ticker; -import com.mobnetic.coinguardian.model.currency.Currency; -import com.mobnetic.coinguardian.model.currency.VirtualCurrency; - -public class BitoEX extends Market { - - private final static String NAME = "BitoEX"; - private final static String TTS_NAME = NAME; - private final static String URL = "https://www.bitoex.com/sync/dashboard/%1$s"; - private final static HashMap CURRENCY_PAIRS = new LinkedHashMap(); - static { - CURRENCY_PAIRS.put(VirtualCurrency.BTC, new String[]{ - Currency.TWD - }); - } - - public BitoEX() { - super(NAME, TTS_NAME, CURRENCY_PAIRS); - } - - @Override - public String getUrl(int requestId, CheckerInfo checkerInfo) { - return String.format(URL, System.currentTimeMillis()); - } - - @Override - protected void parseTicker(int requestId, String responseString, Ticker ticker, CheckerInfo checkerInfo) throws Exception { - JSONArray jsonArray = new JSONArray(responseString); - ticker.ask = Double.parseDouble(jsonArray.getString(0).replaceAll(",", "")); - ticker.bid = Double.parseDouble(jsonArray.getString(1).replaceAll(",", "")); - ticker.last = ticker.ask; - ticker.timestamp = Long.valueOf(jsonArray.getString(2)); - } -} diff --git a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/Bitorado.java b/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/Bitorado.java deleted file mode 100644 index 7ea09298..00000000 --- a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/Bitorado.java +++ /dev/null @@ -1,66 +0,0 @@ -package com.mobnetic.coinguardian.model.market; - -import java.util.List; - -import org.json.JSONArray; -import org.json.JSONObject; - -import com.mobnetic.coinguardian.model.CheckerInfo; -import com.mobnetic.coinguardian.model.CurrencyPairInfo; -import com.mobnetic.coinguardian.model.Market; -import com.mobnetic.coinguardian.model.Ticker; - -public class Bitorado extends Market -{ - private final static String NAME = "Bitorado"; - private final static String TTS_NAME = NAME; - private final static String URL = "https://www.bitorado.com/api/market/%1$s-%2$s/ticker"; - private final static String URL_CURRENCY_PAIRS = "https://www.bitorado.com/api/ticker"; - - public Bitorado() { - super(NAME, TTS_NAME, null); - } - - @Override - public String getUrl(int requestId, CheckerInfo checkerInfo) { - return String.format(URL, checkerInfo.getCurrencyBase(), checkerInfo.getCurrencyCounter()); - } - - @Override - protected void parseTickerFromJsonObject(int requestId, JSONObject jsonObject, Ticker ticker, CheckerInfo checkerInfo) throws Exception { - final JSONObject resultObject = jsonObject.getJSONObject("result"); - ticker.bid = resultObject.optDouble("buy", Ticker.NO_DATA); - ticker.ask = resultObject.optDouble("sell", Ticker.NO_DATA); - ticker.vol = resultObject.optDouble("vol", Ticker.NO_DATA); - ticker.high = resultObject.optDouble("high", Ticker.NO_DATA); - ticker.low = resultObject.optDouble("low", Ticker.NO_DATA); - ticker.last = resultObject.optDouble("last", 0); - } - - // ==================== - // Get currency pairs - // ==================== - @Override - public String getCurrencyPairsUrl(int requestId) { - return URL_CURRENCY_PAIRS; - } - - @Override - protected void parseCurrencyPairsFromJsonObject(int requestId, JSONObject jsonObject, List pairs) throws Exception { - final JSONObject result = jsonObject.getJSONObject("result"); - final JSONObject markets = result.getJSONObject("markets"); - final JSONArray pairNames = markets.names(); - - for(int i=0; i CURRENCY_PAIRS = new LinkedHashMap<>(); - static { - CURRENCY_PAIRS.put(VirtualCurrency.BTC, new String[]{ - Currency.MXN - }); - CURRENCY_PAIRS.put(VirtualCurrency.ETH, new String[]{ - VirtualCurrency.BTC, - Currency.MXN - }); - CURRENCY_PAIRS.put(VirtualCurrency.XRP, new String[]{ - VirtualCurrency.BTC, - Currency.MXN - }); - CURRENCY_PAIRS.put(VirtualCurrency.BCH, new String[]{ - VirtualCurrency.BTC - }); - CURRENCY_PAIRS.put(VirtualCurrency.LTC, new String[]{ - VirtualCurrency.BTC, - Currency.MXN - }); - } - - public Bitso() { - super(NAME, TTS_NAME, CURRENCY_PAIRS); - } - - @Override - public String getUrl(int requestId, CheckerInfo checkerInfo) { - return URL; - } - - @Override - protected void parseTickerFromJsonObject(int requestId, JSONObject jsonObject, Ticker ticker, CheckerInfo checkerInfo) throws Exception { - String pairId = checkerInfo.getCurrencyPairId(); - if (pairId == null) { - pairId = checkerInfo.getCurrencyBaseLowerCase()+"_"+checkerInfo.getCurrencyCounterLowerCase(); - } - final JSONObject pairJsonObject = jsonObject.getJSONObject(pairId); - ticker.bid = ParseUtils.getDoubleFromString(pairJsonObject, "buy"); - ticker.ask = ParseUtils.getDoubleFromString(pairJsonObject, "sell"); - ticker.vol = ParseUtils.getDoubleFromString(pairJsonObject, "volume"); - ticker.last = ParseUtils.getDoubleFromString(pairJsonObject, "rate"); - } - - // ==================== - // Get currency pairs - // ==================== - @Override - public String getCurrencyPairsUrl(int requestId) { - return URL; - } - - @Override - protected void parseCurrencyPairsFromJsonObject(int requestId, JSONObject jsonObject, List pairs) throws Exception { - final JSONArray pairIds = jsonObject.names(); - for(int i=0; i CURRENCY_PAIRS = new LinkedHashMap(); - static { - CURRENCY_PAIRS.put(VirtualCurrency.BTC, new String[]{ - Currency.EUR, - Currency.USD, - Currency.GBP - }); - CURRENCY_PAIRS.put(VirtualCurrency.BCH, new String[]{ - VirtualCurrency.BTC, - Currency.EUR, - Currency.USD, - Currency.GBP - }); - CURRENCY_PAIRS.put(Currency.EUR, new String[]{ - Currency.USD, - Currency.GBP - }); - CURRENCY_PAIRS.put(Currency.GBP, new String[]{ - Currency.EUR, - Currency.USD - }); - CURRENCY_PAIRS.put(VirtualCurrency.ETH, new String[]{ - VirtualCurrency.BTC, - Currency.EUR, - Currency.USD, - Currency.GBP - }); - CURRENCY_PAIRS.put(VirtualCurrency.LTC, new String[]{ - VirtualCurrency.BTC, - Currency.EUR, - Currency.USD, - Currency.GBP - }); - CURRENCY_PAIRS.put(VirtualCurrency.XLM, new String[]{ - VirtualCurrency.BTC, - Currency.EUR, - Currency.USD, - Currency.GBP - }); - CURRENCY_PAIRS.put(VirtualCurrency.XRP, new String[]{ - VirtualCurrency.BTC, - Currency.EUR, - Currency.USD, - Currency.GBP - }); - } - - public Bitstamp() { - super(NAME, TTS_NAME, CURRENCY_PAIRS); - } - - @Override - public String getUrl(int requestId, CheckerInfo checkerInfo) { - return String.format(URL, checkerInfo.getCurrencyBaseLowerCase(), checkerInfo.getCurrencyCounterLowerCase()); - } - - @Override - protected void parseTickerFromJsonObject(int requestId, JSONObject jsonObject, Ticker ticker, CheckerInfo checkerInfo) throws Exception { - ticker.bid = jsonObject.getDouble("bid"); - ticker.ask = jsonObject.getDouble("ask"); - ticker.vol = jsonObject.getDouble("volume"); - ticker.high = jsonObject.getDouble("high"); - ticker.low = jsonObject.getDouble("low"); - ticker.last = jsonObject.getDouble("last"); - ticker.timestamp = jsonObject.getLong("timestamp"); - } -} diff --git a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/BitxCom.java b/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/BitxCom.java deleted file mode 100644 index 52ba54b0..00000000 --- a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/BitxCom.java +++ /dev/null @@ -1,67 +0,0 @@ -package com.mobnetic.coinguardian.model.market; - -import java.util.HashMap; -import java.util.LinkedHashMap; - -import org.json.JSONObject; - -import com.mobnetic.coinguardian.model.CheckerInfo; -import com.mobnetic.coinguardian.model.Market; -import com.mobnetic.coinguardian.model.Ticker; -import com.mobnetic.coinguardian.model.currency.Currency; -import com.mobnetic.coinguardian.model.currency.VirtualCurrency; - -public class BitxCom extends Market { - - private final static String NAME = "CoinsBank"; - private final static String TTS_NAME = NAME; - private final static String URL = "https://coinsbank.com/api/public/ticker?pair=%1$s%2$s"; - private final static HashMap CURRENCY_PAIRS = new LinkedHashMap(); - static { - CURRENCY_PAIRS.put(VirtualCurrency.BTC, new String[]{ - Currency.EUR, - Currency.GBP, - Currency.USD - }); - CURRENCY_PAIRS.put(VirtualCurrency.LTC, new String[]{ - VirtualCurrency.BTC, - Currency.EUR, - Currency.GBP, - Currency.USD - }); - CURRENCY_PAIRS.put(VirtualCurrency.GHS, new String[]{ - VirtualCurrency.BTC, - Currency.EUR, - Currency.GBP, - VirtualCurrency.LTC, - Currency.USD - }); - CURRENCY_PAIRS.put(Currency.EUR, new String[]{ - Currency.GBP, - Currency.USD - }); - CURRENCY_PAIRS.put(Currency.GBP, new String[]{ - Currency.USD - }); - } - - public BitxCom() { - super(NAME, TTS_NAME, CURRENCY_PAIRS); - } - - @Override - public String getUrl(int requestId, CheckerInfo checkerInfo) { - return String.format(URL, checkerInfo.getCurrencyBase(), checkerInfo.getCurrencyCounter()); - } - - @Override - protected void parseTickerFromJsonObject(int requestId, JSONObject jsonObject, Ticker ticker, CheckerInfo checkerInfo) throws Exception { - final JSONObject dataJsonObject = jsonObject.getJSONObject("data"); - ticker.bid = dataJsonObject.getDouble("buy"); - ticker.ask = dataJsonObject.getDouble("sell"); - ticker.vol = dataJsonObject.getDouble("volume"); - ticker.high = dataJsonObject.getDouble("high"); - ticker.low = dataJsonObject.getDouble("low"); - ticker.last = dataJsonObject.getDouble("last"); - } -} diff --git a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/Bl3p.java b/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/Bl3p.java deleted file mode 100644 index c091f4e1..00000000 --- a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/Bl3p.java +++ /dev/null @@ -1,49 +0,0 @@ -package com.mobnetic.coinguardian.model.market; - -import com.mobnetic.coinguardian.model.CheckerInfo; -import com.mobnetic.coinguardian.model.Market; -import com.mobnetic.coinguardian.model.Ticker; -import com.mobnetic.coinguardian.model.currency.Currency; -import com.mobnetic.coinguardian.model.currency.VirtualCurrency; - -import org.json.JSONObject; - -import java.util.HashMap; -import java.util.LinkedHashMap; - -public class Bl3p extends Market { - - private final static String NAME = "BL3P"; - private final static String TTS_NAME = NAME; - private final static String URL = "https://api.bl3p.eu/1/%1$s%2$s/ticker"; - private final static HashMap CURRENCY_PAIRS = new LinkedHashMap<>(); - - static { - CURRENCY_PAIRS.put(VirtualCurrency.BTC, new String[]{ - Currency.EUR - }); - CURRENCY_PAIRS.put(VirtualCurrency.LTC, new String[]{ - Currency.EUR - }); - } - - public Bl3p() { - super(NAME, TTS_NAME, CURRENCY_PAIRS); - } - - @Override - public String getUrl(int requestId, CheckerInfo checkerInfo) { - return String.format(URL, checkerInfo.getCurrencyBase(), checkerInfo.getCurrencyCounter()); - } - - @Override - protected void parseTickerFromJsonObject(int requestId, JSONObject jsonObject, Ticker ticker, CheckerInfo checkerInfo) throws Exception { - ticker.bid = jsonObject.getDouble("bid"); - ticker.ask = jsonObject.getDouble("ask"); - ticker.vol = jsonObject.getJSONObject("volume").getDouble("24h"); - ticker.high = jsonObject.getDouble("high"); - ticker.low = jsonObject.getDouble("low"); - ticker.last = jsonObject.getDouble("last"); - ticker.timestamp = jsonObject.getLong("timestamp"); - } -} diff --git a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/Bleutrade.java b/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/Bleutrade.java deleted file mode 100644 index 8dd2a727..00000000 --- a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/Bleutrade.java +++ /dev/null @@ -1,73 +0,0 @@ -package com.mobnetic.coinguardian.model.market; - -import java.util.List; - -import org.json.JSONArray; -import org.json.JSONObject; - -import com.mobnetic.coinguardian.model.CheckerInfo; -import com.mobnetic.coinguardian.model.CurrencyPairInfo; -import com.mobnetic.coinguardian.model.Market; -import com.mobnetic.coinguardian.model.Ticker; - -public class Bleutrade extends Market { - - private final static String NAME = "Bleutrade"; - private final static String TTS_NAME = NAME; - private final static String URL = "https://bleutrade.com/api/v2/public/getticker?market=%1$s"; - private final static String URL_CURRENCY_PAIRS = "https://bleutrade.com/api/v2/public/getmarkets"; - - public Bleutrade() { - super(NAME, TTS_NAME, null); - } - - @Override - public String getUrl(int requestId, CheckerInfo checkerInfo) { - return String.format(URL, checkerInfo.getCurrencyPairId()); - } - - @Override - protected void parseTickerFromJsonObject(int requestId, JSONObject jsonObject, Ticker ticker, CheckerInfo checkerInfo) throws Exception { - final Object resultObject = jsonObject.get("result"); - JSONObject resultsJsonObject = null; - if (resultObject instanceof JSONArray) { - resultsJsonObject = ((JSONArray)resultObject).getJSONObject(0); - } else { - resultsJsonObject = (JSONObject)resultObject; - } - ticker.bid = resultsJsonObject.getDouble("Bid"); - ticker.ask = resultsJsonObject.getDouble("Ask"); - ticker.last = resultsJsonObject.getDouble("Last"); - } - - @Override - protected String parseErrorFromJsonObject(int requestId, JSONObject jsonObject, CheckerInfo checkerInfo) throws Exception { - return jsonObject.getString("message"); - } - - // ==================== - // Get currency pairs - // ==================== - @Override - public String getCurrencyPairsUrl(int requestId) { - return URL_CURRENCY_PAIRS; - } - - @Override - protected void parseCurrencyPairsFromJsonObject(int requestId, JSONObject jsonObject, List pairs) throws Exception { - final JSONArray resultsJsonArray = jsonObject.getJSONArray("result"); - for (int i = 0; i < resultsJsonArray.length(); ++i) { - final JSONObject pairJsonObject = resultsJsonArray.getJSONObject(i); - final String pairId = pairJsonObject.getString("MarketName"); - final String currencyBase = pairJsonObject.getString("MarketCurrency"); - final String currencyCounter = pairJsonObject.getString("BaseCurrency"); - if (pairId != null && currencyBase != null && currencyCounter != null) { - pairs.add(new CurrencyPairInfo( - currencyBase, - currencyCounter, - pairId - )); - } - } - } -} \ No newline at end of file diff --git a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/BlinkTrade.java b/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/BlinkTrade.java deleted file mode 100644 index db71d470..00000000 --- a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/BlinkTrade.java +++ /dev/null @@ -1,49 +0,0 @@ -/** - * Author: Jorge Pereira - * Date: Fri Dec 8 15:07:27 -02 2017 - * Desc: Blinktrade market - */ -package com.mobnetic.coinguardian.model.market; - -import java.util.HashMap; -import java.util.LinkedHashMap; - -import org.json.JSONObject; - -import com.mobnetic.coinguardian.model.CheckerInfo; -import com.mobnetic.coinguardian.model.Market; -import com.mobnetic.coinguardian.model.Ticker; -import com.mobnetic.coinguardian.model.currency.Currency; -import com.mobnetic.coinguardian.model.currency.VirtualCurrency; - -public class BlinkTrade extends Market { - - private final static String NAME = "BlinkTrade"; - private final static String TTS_NAME = "Blink Trade"; - private final static String URL = "https://bitcambioapi.blinktrade.com/api/v1/%2$s/ticker?crypto_currency=%1$s"; - private final static HashMap CURRENCY_PAIRS = new LinkedHashMap<>(); - static { - CURRENCY_PAIRS.put(VirtualCurrency.BTC, new String[]{ - Currency.BRL - }); - } - - public BlinkTrade() { - super(NAME, TTS_NAME, CURRENCY_PAIRS); - } - - @Override - public String getUrl(int requestId, CheckerInfo checkerInfo) { - return String.format(URL, checkerInfo.getCurrencyBase(), checkerInfo.getCurrencyCounter()); - } - - @Override - protected void parseTickerFromJsonObject(int requestId, JSONObject jsonObject, Ticker ticker, CheckerInfo checkerInfo) throws Exception { - ticker.bid = jsonObject.getDouble("buy"); - ticker.ask = jsonObject.getDouble("sell"); - ticker.vol = jsonObject.getDouble("vol"); - ticker.high = jsonObject.getDouble("high"); - ticker.low = jsonObject.getDouble("low"); - ticker.last = jsonObject.getDouble("last"); - } -} diff --git a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/Braziliex.java b/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/Braziliex.java deleted file mode 100644 index 27419b51..00000000 --- a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/Braziliex.java +++ /dev/null @@ -1,64 +0,0 @@ -package com.mobnetic.coinguardian.model.market; - -import com.mobnetic.coinguardian.model.CheckerInfo; -import com.mobnetic.coinguardian.model.CurrencyPairInfo; -import com.mobnetic.coinguardian.model.Market; -import com.mobnetic.coinguardian.model.Ticker; - -import org.json.JSONArray; -import org.json.JSONObject; - -import java.util.List; -import java.util.Locale; - -public class Braziliex extends Market { - - private final static String NAME = "Braziliex"; - private final static String TTS_NAME = NAME; - private final static String URL = "https://braziliex.com/api/v1/public/ticker/%1$s"; - private final static String URL_CURRENCY_PAIRS = "https://braziliex.com/api/v1/public/ticker"; - - public Braziliex() { - super(NAME, TTS_NAME, null); - } - - @Override - public String getUrl(int requestId, CheckerInfo checkerInfo) { - return String.format(URL, checkerInfo.getCurrencyPairId()); - } - - @Override - protected void parseTickerFromJsonObject(int requestId, JSONObject jsonObject, Ticker ticker, CheckerInfo checkerInfo) throws Exception { - ticker.bid = jsonObject.getDouble("highestBid"); - ticker.ask = jsonObject.getDouble("lowestAsk"); - ticker.vol = jsonObject.getDouble("baseVolume24"); - ticker.high = jsonObject.getDouble("highestBid24"); - ticker.low = jsonObject.getDouble("lowestAsk24"); - ticker.last = jsonObject.getDouble("last"); - } - - // ==================== - // Get currency pairs - // ==================== - @Override - public String getCurrencyPairsUrl(int requestId) { - return URL_CURRENCY_PAIRS; - } - - @Override - protected void parseCurrencyPairsFromJsonObject(int requestId, JSONObject jsonObject, List pairs) throws Exception { - final JSONArray pairIds = jsonObject.names(); - for(int i=0; i pairs) throws Exception { - final String currencyCounter = getCurrencyCounter(requestId); - final JSONArray currencyBaseList = jsonObject.names(); - for(int i=0; i CURRENCY_PAIRS = new LinkedHashMap(); - static { - CURRENCY_PAIRS.put(VirtualCurrency.BTC, new String[]{ - Currency.JPY - }); - } - - public BtcBox() { - super(NAME, TTS_NAME, CURRENCY_PAIRS); - } - - @Override - public String getUrl(int requestId, CheckerInfo checkerInfo) { - return URL; - } - - @Override - protected void parseTickerFromJsonObject(int requestId, JSONObject jsonObject, Ticker ticker, CheckerInfo checkerInfo) throws Exception { - ticker.bid = jsonObject.getDouble("buy"); - ticker.ask = jsonObject.getDouble("sell"); - ticker.vol = jsonObject.getDouble("vol"); - ticker.high = jsonObject.getDouble("high"); - ticker.low = jsonObject.getDouble("low"); - ticker.last = jsonObject.getDouble("last"); - } -} diff --git a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/BtcMarkets.java b/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/BtcMarkets.java deleted file mode 100644 index ef459cc0..00000000 --- a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/BtcMarkets.java +++ /dev/null @@ -1,62 +0,0 @@ -package com.mobnetic.coinguardian.model.market; - -import java.util.HashMap; -import java.util.LinkedHashMap; - -import org.json.JSONObject; - -import com.mobnetic.coinguardian.model.CheckerInfo; -import com.mobnetic.coinguardian.model.Market; -import com.mobnetic.coinguardian.model.Ticker; -import com.mobnetic.coinguardian.model.currency.Currency; -import com.mobnetic.coinguardian.model.currency.VirtualCurrency; - -public class BtcMarkets extends Market { - - private final static String NAME = "BtcMarkets.net"; - private final static String TTS_NAME = "BTC Markets net"; - private final static String URL = "https://api.btcmarkets.net/market/%1$s/%2$s/tick"; - private final static HashMap CURRENCY_PAIRS = new LinkedHashMap(); - static { - CURRENCY_PAIRS.put(VirtualCurrency.BTC, new String[]{ - Currency.AUD - }); - CURRENCY_PAIRS.put(VirtualCurrency.LTC, new String[]{ - VirtualCurrency.BTC, - Currency.AUD - }); - CURRENCY_PAIRS.put(VirtualCurrency.ETC, new String[]{ - VirtualCurrency.BTC, - Currency.AUD - }); - CURRENCY_PAIRS.put(VirtualCurrency.ETH, new String[]{ - VirtualCurrency.BTC, - Currency.AUD - }); - CURRENCY_PAIRS.put(VirtualCurrency.XRP, new String[]{ - VirtualCurrency.BTC, - Currency.AUD - }); - CURRENCY_PAIRS.put(VirtualCurrency.BCH, new String[]{ - VirtualCurrency.BTC, - Currency.AUD - }); - } - - public BtcMarkets() { - super(NAME, TTS_NAME, CURRENCY_PAIRS); - } - - @Override - public String getUrl(int requestId, CheckerInfo checkerInfo) { - return String.format(URL, checkerInfo.getCurrencyBase(), checkerInfo.getCurrencyCounter()); - } - - @Override - protected void parseTickerFromJsonObject(int requestId, JSONObject jsonObject, Ticker ticker, CheckerInfo checkerInfo) throws Exception { - ticker.bid = jsonObject.getDouble("bestBid"); - ticker.ask = jsonObject.getDouble("bestAsk"); - ticker.last = jsonObject.getDouble("lastPrice"); - ticker.timestamp = jsonObject.getLong("timestamp"); - } -} diff --git a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/BtcXIndia.java b/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/BtcXIndia.java deleted file mode 100644 index 8d960d62..00000000 --- a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/BtcXIndia.java +++ /dev/null @@ -1,45 +0,0 @@ -package com.mobnetic.coinguardian.model.market; - -import java.util.HashMap; -import java.util.LinkedHashMap; - -import org.json.JSONObject; - -import com.mobnetic.coinguardian.model.CheckerInfo; -import com.mobnetic.coinguardian.model.Market; -import com.mobnetic.coinguardian.model.Ticker; -import com.mobnetic.coinguardian.model.currency.Currency; -import com.mobnetic.coinguardian.model.currency.VirtualCurrency; -import com.mobnetic.coinguardian.util.ParseUtils; - -public class BtcXIndia extends Market { - - private final static String NAME = "BTCXIndia"; - private final static String TTS_NAME = "BTC X India"; - private final static String URL = "https://api.btcxindia.com/ticker"; - private final static HashMap CURRENCY_PAIRS = new LinkedHashMap(); - static { - CURRENCY_PAIRS.put(VirtualCurrency.XRP, new String[]{ - Currency.INR - }); - } - - public BtcXIndia() { - super(NAME, TTS_NAME, CURRENCY_PAIRS); - } - - @Override - public String getUrl(int requestId, CheckerInfo checkerInfo) { - return URL; - } - - @Override - protected void parseTickerFromJsonObject(int requestId, JSONObject jsonObject, Ticker ticker, CheckerInfo checkerInfo) throws Exception { - ticker.bid = jsonObject.getDouble("bid"); - ticker.ask = jsonObject.getDouble("ask"); - ticker.vol = jsonObject.getDouble("total_volume_24h"); - ticker.high = ParseUtils.getDoubleFromString(jsonObject, "high"); - ticker.low = ParseUtils.getDoubleFromString(jsonObject, "low"); - ticker.last = jsonObject.getDouble("last_traded_price"); - } -} diff --git a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/Btcturk.java b/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/Btcturk.java deleted file mode 100644 index 345e9434..00000000 --- a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/Btcturk.java +++ /dev/null @@ -1,59 +0,0 @@ -package com.mobnetic.coinguardian.model.market; - -import com.mobnetic.coinguardian.model.CheckerInfo; -import com.mobnetic.coinguardian.model.Market; -import com.mobnetic.coinguardian.model.Ticker; -import com.mobnetic.coinguardian.model.currency.Currency; -import com.mobnetic.coinguardian.model.currency.VirtualCurrency; -import com.mobnetic.coinguardian.util.TimeUtils; - -import org.json.JSONArray; -import org.json.JSONObject; - -import java.util.HashMap; -import java.util.LinkedHashMap; - -public class Btcturk extends Market { - - private final static String NAME = "BtcTurk"; - private final static String TTS_NAME = "Btc Turk"; - private final static String URL = "https://www.btcturk.com/api/ticker"; - private final static HashMap CURRENCY_PAIRS = new LinkedHashMap(); - static { - CURRENCY_PAIRS.put(VirtualCurrency.BTC, new String[]{ - Currency.TRY - }); - CURRENCY_PAIRS.put(VirtualCurrency.ETH, new String[]{ - VirtualCurrency.BTC, - Currency.TRY - }); - } - - public Btcturk() { - super(NAME, TTS_NAME, CURRENCY_PAIRS); - } - - @Override - public String getUrl(int requestId, CheckerInfo checkerInfo) { - return URL; - } - - @Override - protected void parseTicker(int requestId, String responseString, Ticker ticker, CheckerInfo checkerInfo) throws Exception { - final JSONArray tickerJsonArray = new JSONArray(responseString); - final String pairId = checkerInfo.getCurrencyBase()+checkerInfo.getCurrencyCounter(); - for (int i = 0; i < tickerJsonArray.length(); ++i) { - final JSONObject tickerJsonObject = tickerJsonArray.getJSONObject(i); - if (pairId.equals(tickerJsonObject.getString("pair"))) { - ticker.bid = tickerJsonObject.getDouble("bid"); - ticker.ask = tickerJsonObject.getDouble("ask"); - ticker.vol = tickerJsonObject.getDouble("volume"); - ticker.high = tickerJsonObject.getDouble("high"); - ticker.low = tickerJsonObject.getDouble("low"); - ticker.last = tickerJsonObject.getDouble("last"); - ticker.timestamp = (long) (tickerJsonObject.getDouble("timestamp") * TimeUtils.MILLIS_IN_SECOND); - break; - } - } - } -} diff --git a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/Bter.java b/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/Bter.java deleted file mode 100644 index e34ddc01..00000000 --- a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/Bter.java +++ /dev/null @@ -1,64 +0,0 @@ -package com.mobnetic.coinguardian.model.market; - -import java.util.List; -import java.util.Locale; - -import org.json.JSONArray; -import org.json.JSONObject; - -import com.mobnetic.coinguardian.model.CheckerInfo; -import com.mobnetic.coinguardian.model.CurrencyPairInfo; -import com.mobnetic.coinguardian.model.Market; -import com.mobnetic.coinguardian.model.Ticker; - -public class Bter extends Market { - - private final static String NAME = "Gate.io"; - private final static String TTS_NAME = "Gate io"; - private final static String URL = "http://data.gate.io/api2/1/ticker/%1$s_%2$s"; - private final static String URL_CURRENCY_PAIRS = "http://data.gate.io/api2/1/pairs"; - - public Bter() { - super(NAME, TTS_NAME, null); - } - - @Override - public String getUrl(int requestId, CheckerInfo checkerInfo) { - return String.format(URL, checkerInfo.getCurrencyBaseLowerCase(), checkerInfo.getCurrencyCounterLowerCase()); - } - - @Override - protected void parseTickerFromJsonObject(int requestId, JSONObject jsonObject, Ticker ticker, CheckerInfo checkerInfo) throws Exception { - ticker.bid = jsonObject.getDouble("highestBid"); - ticker.ask = jsonObject.getDouble("lowestAsk"); - ticker.vol = jsonObject.getDouble("quoteVolume"); - ticker.high = jsonObject.getDouble("high24hr"); - ticker.low = jsonObject.getDouble("low24hr"); - ticker.last = jsonObject.getDouble("last"); - } - - // ==================== - // Get currency pairs - // ==================== - @Override - public String getCurrencyPairsUrl(int requestId) { - return URL_CURRENCY_PAIRS; - } - - @Override - protected void parseCurrencyPairs(int requestId, String responseString, List pairs) throws Exception { - JSONArray jsonArray = new JSONArray(responseString); - for(int i=0; i CURRENCY_PAIRS = new LinkedHashMap(); - static { - CURRENCY_PAIRS.put(VirtualCurrency.BTC, new String[]{ - Currency.USD - }); - } - - public Buttercoin() { - super(NAME, TTS_NAME, CURRENCY_PAIRS); - } - - @Override - public String getUrl(int requestId, CheckerInfo checkerInfo) { - return URL; - } - - @Override - protected void parseTickerFromJsonObject(int requestId, JSONObject jsonObject, Ticker ticker, CheckerInfo checkerInfo) throws Exception { - ticker.bid = jsonObject.getDouble("bid"); - ticker.ask = jsonObject.getDouble("ask"); - ticker.last = jsonObject.getDouble("last"); - } -} diff --git a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/CCex.java b/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/CCex.java deleted file mode 100644 index af288556..00000000 --- a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/CCex.java +++ /dev/null @@ -1,65 +0,0 @@ -package com.mobnetic.coinguardian.model.market; - -import java.util.List; -import java.util.Locale; - -import org.json.JSONArray; -import org.json.JSONObject; - -import com.mobnetic.coinguardian.model.CheckerInfo; -import com.mobnetic.coinguardian.model.CurrencyPairInfo; -import com.mobnetic.coinguardian.model.Market; -import com.mobnetic.coinguardian.model.Ticker; - -public class CCex extends Market { - - public final static String NAME = "C-CEX"; - public final static String TTS_NAME = "C-Cex"; - public final static String URL = "https://c-cex.com/t/%1$s-%2$s.json"; - public final static String URL_CURRENCY_PAIRS = "https://c-cex.com/t/pairs.json"; - - public CCex() { - super(NAME, TTS_NAME, null); - } - - @Override - public String getUrl(int requestId, CheckerInfo checkerInfo) { - return String.format(URL, checkerInfo.getCurrencyBaseLowerCase(), checkerInfo.getCurrencyCounterLowerCase()); - } - - @Override - protected void parseTickerFromJsonObject(int requestId, JSONObject jsonObject, Ticker ticker, CheckerInfo checkerInfo) throws Exception { - JSONObject tickerObject = jsonObject.getJSONObject("ticker"); - - ticker.bid = tickerObject.getDouble("buy"); - ticker.ask = tickerObject.getDouble("sell"); - ticker.high = tickerObject.getDouble("high"); - ticker.low = tickerObject.getDouble("low"); - ticker.last = tickerObject.getDouble("lastprice"); -// ticker.timestamp = tickerObject.getLong("updated"); // strange date? - } - - // ==================== - // Get currency pairs - // ==================== - @Override - public String getCurrencyPairsUrl(int requestId) { - return URL_CURRENCY_PAIRS; - } - - @Override - protected void parseCurrencyPairsFromJsonObject(int requestId, JSONObject jsonObject, List pairs) throws Exception { - final JSONArray pairsJsonArray = jsonObject.getJSONArray("pairs"); - - for(int i=0; i CURRENCY_PAIRS = new LinkedHashMap(); - static { - CURRENCY_PAIRS.put(VirtualCurrency.BTC, new String[]{ - Currency.USD - }); - } - - public Campbx() { - super(NAME, TTS_NAME, CURRENCY_PAIRS); - } - - @Override - public String getUrl(int requestId, CheckerInfo checkerInfo) { - return URL; - } - - @Override - protected void parseTickerFromJsonObject(int requestId, JSONObject jsonObject, Ticker ticker, CheckerInfo checkerInfo) throws Exception { - ticker.bid = jsonObject.getDouble("Best Bid"); - ticker.ask = jsonObject.getDouble("Best Ask"); - ticker.last = jsonObject.getDouble("Last Trade"); - } -} diff --git a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/CexIO.java b/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/CexIO.java deleted file mode 100644 index 6c6d59c5..00000000 --- a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/CexIO.java +++ /dev/null @@ -1,88 +0,0 @@ -package com.mobnetic.coinguardian.model.market; - -import java.util.HashMap; -import java.util.LinkedHashMap; -import java.util.List; - -import org.json.JSONArray; -import org.json.JSONObject; - -import com.mobnetic.coinguardian.model.CheckerInfo; -import com.mobnetic.coinguardian.model.CurrencyPairInfo; -import com.mobnetic.coinguardian.model.Market; -import com.mobnetic.coinguardian.model.Ticker; -import com.mobnetic.coinguardian.model.currency.Currency; -import com.mobnetic.coinguardian.model.currency.VirtualCurrency; - -public class CexIO extends Market { - - private final static String NAME = "CEX.IO"; - private final static String TTS_NAME = "CEX IO"; - private final static String URL = "https://cex.io/api/ticker/%1$s/%2$s"; - private final static String URL_CURRENCY_PAIRS = "https://cex.io/api/currency_limits"; - private final static HashMap CURRENCY_PAIRS = new LinkedHashMap(); - static { - CURRENCY_PAIRS.put(VirtualCurrency.BTC, new String[]{ - Currency.USD, - Currency.EUR, - Currency.GBP, - Currency.RUB, - }); - CURRENCY_PAIRS.put(VirtualCurrency.ETH, new String[]{ - Currency.USD, - Currency.EUR, - VirtualCurrency.BTC - }); - CURRENCY_PAIRS.put(VirtualCurrency.GHS, new String[]{ - VirtualCurrency.BTC, - }); - } - - public CexIO() { - super(NAME, TTS_NAME, CURRENCY_PAIRS); - } - - @Override - public String getUrl(int requestId, CheckerInfo checkerInfo) { - return String.format(URL, checkerInfo.getCurrencyBase(), checkerInfo.getCurrencyCounter()); - } - - @Override - protected void parseTickerFromJsonObject(int requestId, JSONObject jsonObject, Ticker ticker, CheckerInfo checkerInfo) throws Exception { - if (jsonObject.has("bid")) { - ticker.bid = jsonObject.getDouble("bid"); - } - if (jsonObject.has("ask")) { - ticker.ask = jsonObject.getDouble("ask"); - } - ticker.vol = jsonObject.getDouble("volume"); - ticker.high = jsonObject.getDouble("high"); - ticker.low = jsonObject.getDouble("low"); - ticker.last = jsonObject.getDouble("last"); - } - - // ==================== - // Get currency pairs - // ==================== - @Override - public String getCurrencyPairsUrl(int requestId) { - return URL_CURRENCY_PAIRS; - } - - @Override - protected void parseCurrencyPairsFromJsonObject(int requestId, JSONObject jsonObject, List pairs) throws Exception { - final JSONObject dataJsonObject = jsonObject.getJSONObject("data"); - final JSONArray pairsJsonArray = dataJsonObject.getJSONArray("pairs"); - for(int i=0; i CURRENCY_PAIRS = new LinkedHashMap(); - static { - CURRENCY_PAIRS.put(VirtualCurrency.BTC, new String[]{ - Currency.CLP - }); - } - - public ChileBit() { - super(NAME, TTS_NAME, CURRENCY_PAIRS); - } - - @Override - public String getUrl(int requestId, CheckerInfo checkerInfo) { - return String.format(URL, checkerInfo.getCurrencyBase(), checkerInfo.getCurrencyCounter()); - } - - @Override - protected void parseTickerFromJsonObject(int requestId, JSONObject jsonObject, Ticker ticker, CheckerInfo checkerInfo) throws Exception { - ticker.bid = jsonObject.getDouble("buy"); - ticker.ask = jsonObject.getDouble("sell"); - ticker.vol = jsonObject.getDouble("vol"); - ticker.high = jsonObject.getDouble("high"); - ticker.low = jsonObject.getDouble("low"); - ticker.last = jsonObject.getDouble("last"); - } -} diff --git a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/CleverCoin.java b/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/CleverCoin.java deleted file mode 100644 index f1e7c59d..00000000 --- a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/CleverCoin.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.mobnetic.coinguardian.model.market; - -import java.util.HashMap; -import java.util.LinkedHashMap; -import org.json.JSONObject; - -import com.mobnetic.coinguardian.model.CheckerInfo; -import com.mobnetic.coinguardian.model.Market; -import com.mobnetic.coinguardian.model.Ticker; -import com.mobnetic.coinguardian.model.currency.Currency; -import com.mobnetic.coinguardian.model.currency.VirtualCurrency; - -public class CleverCoin extends Market { - - private final static String NAME = "CleverCoin"; - private final static String TTS_NAME = "Clever Coin"; - private final static String URL = "https://api.clevercoin.com/v1/ticker"; - private final static HashMap CURRENCY_PAIRS = new LinkedHashMap(); - static { - CURRENCY_PAIRS.put(VirtualCurrency.BTC, new String[]{ - Currency.EUR - }); - } - - public CleverCoin() { - super(NAME, TTS_NAME, CURRENCY_PAIRS); - } - - @Override - public String getUrl(int requestId, CheckerInfo checkerInfo) { - return URL; - } - - @Override - protected void parseTickerFromJsonObject(int requestId, JSONObject jsonObject, Ticker ticker, CheckerInfo checkerInfo) throws Exception { - ticker.bid = jsonObject.getDouble("bid"); - ticker.ask = jsonObject.getDouble("ask"); - ticker.vol = jsonObject.getDouble("volume"); - ticker.high = jsonObject.getDouble("high"); - ticker.low = jsonObject.getDouble("low"); - ticker.last = jsonObject.getDouble("last"); - ticker.timestamp = jsonObject.getLong("timestamp"); - } -} diff --git a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/CoinDesk.java b/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/CoinDesk.java deleted file mode 100644 index fdf5c6c9..00000000 --- a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/CoinDesk.java +++ /dev/null @@ -1,54 +0,0 @@ -package com.mobnetic.coinguardian.model.market; - -import java.util.List; - -import org.json.JSONArray; -import org.json.JSONObject; - -import com.mobnetic.coinguardian.model.CheckerInfo; -import com.mobnetic.coinguardian.model.CurrencyPairInfo; -import com.mobnetic.coinguardian.model.Market; -import com.mobnetic.coinguardian.model.Ticker; -import com.mobnetic.coinguardian.model.currency.VirtualCurrency; - -public class CoinDesk extends Market { - - private final static String NAME = "CoinDesk"; - private final static String TTS_NAME = "Coin Desk"; - private final static String URL = "https://api.coindesk.com/v1/bpi/currentprice.json"; - private final static String URL_CURRENCY_PAIRS = URL; - - public CoinDesk() { - super(NAME, TTS_NAME, null); - } - - @Override - public String getUrl(int requestId, CheckerInfo checkerInfo) { - return URL; - } - - @Override - protected void parseTickerFromJsonObject(int requestId, JSONObject jsonObject, Ticker ticker, CheckerInfo checkerInfo) throws Exception { - final JSONObject bpiJsonObject = jsonObject.getJSONObject("bpi"); - final JSONObject pairJsonObject = bpiJsonObject.getJSONObject(checkerInfo.getCurrencyCounter()); - ticker.last = pairJsonObject.getDouble("rate_float"); - } - - // ==================== - // Get currency pairs - // ==================== - @Override - public String getCurrencyPairsUrl(int requestId) { - return URL_CURRENCY_PAIRS; - } - - @Override - protected void parseCurrencyPairsFromJsonObject(int requestId, JSONObject jsonObject, List pairs) throws Exception { - final JSONObject bpiJsonObject = jsonObject.getJSONObject("bpi"); - final JSONArray currencyCounterNames = bpiJsonObject.names(); - - for(int i=0; i CURRENCY_PAIRS = new LinkedHashMap(); - static { - CURRENCY_PAIRS.put(VirtualCurrency.XBT, new String[]{ - Currency.GBP, - Currency.EUR, - Currency.USD - }); - CURRENCY_PAIRS.put(VirtualCurrency.BCH, new String[]{ - Currency.GBP - }); - } - - public CoinFloor() { - super(NAME, TTS_NAME, CURRENCY_PAIRS); - } - - @Override - public String getUrl(int requestId, CheckerInfo checkerInfo) { - return String.format(URL, checkerInfo.getCurrencyBase(), checkerInfo.getCurrencyCounter()); - } - - @Override - protected void parseTickerFromJsonObject(int requestId, JSONObject jsonObject, Ticker ticker, CheckerInfo checkerInfo) throws Exception { - ticker.bid = jsonObject.getDouble("bid"); - ticker.ask = jsonObject.getDouble("ask"); - ticker.vol = jsonObject.getDouble("volume"); - ticker.high = jsonObject.getDouble("high"); - ticker.low = jsonObject.getDouble("low"); - ticker.last = jsonObject.getDouble("last"); - } -} diff --git a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/CoinJar.java b/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/CoinJar.java deleted file mode 100644 index 2e13a60f..00000000 --- a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/CoinJar.java +++ /dev/null @@ -1,61 +0,0 @@ -package com.mobnetic.coinguardian.model.market; - -import com.mobnetic.coinguardian.model.CheckerInfo; -import com.mobnetic.coinguardian.model.CurrencyPairInfo; -import com.mobnetic.coinguardian.model.Market; -import com.mobnetic.coinguardian.model.Ticker; - -import org.json.JSONArray; -import org.json.JSONObject; - -import java.util.List; - -public class CoinJar extends Market { - - private final static String NAME = "CoinJar"; - private final static String TTS_NAME = "Coin Jar"; - private final static String URL = "https://api.coinjar.com/v3/exchange_rates"; - private final static String URL_CURRENCY_PAIRS = URL; - - public CoinJar() { - super(NAME, TTS_NAME, null); - } - - @Override - public String getUrl(int requestId, CheckerInfo checkerInfo) { - return URL; - } - - @Override - protected void parseTickerFromJsonObject(int requestId, JSONObject jsonObject, Ticker ticker, CheckerInfo checkerInfo) throws Exception { - final JSONObject ratesJsonObject = jsonObject.getJSONObject("exchange_rates"); - final JSONObject pairJsonObject = ratesJsonObject.getJSONObject(checkerInfo.getCurrencyPairId()); - ticker.bid = pairJsonObject.getDouble("bid"); - ticker.ask = pairJsonObject.getDouble("ask"); - ticker.last = pairJsonObject.getDouble("midpoint"); - } - - // ==================== - // Get currency pairs - // ==================== - @Override - public String getCurrencyPairsUrl(int requestId) { - return URL_CURRENCY_PAIRS; - } - - @Override - protected void parseCurrencyPairsFromJsonObject(int requestId, JSONObject jsonObject, List pairs) throws Exception { - final JSONObject ratesJsonObject = jsonObject.getJSONObject("exchange_rates"); - final JSONArray namesJsonArray = ratesJsonObject.names(); - - for(int i=0; i< namesJsonArray.length(); ++i) { - final String symbol = namesJsonArray.getString(i); - final JSONObject pairJsonObject = ratesJsonObject.getJSONObject(symbol); - pairs.add(new CurrencyPairInfo( - pairJsonObject.getString("base_currency"), - pairJsonObject.getString("counter_currency"), - symbol - )); - } - } -} diff --git a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/CoinMarketIO.java b/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/CoinMarketIO.java deleted file mode 100644 index e42f1fa7..00000000 --- a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/CoinMarketIO.java +++ /dev/null @@ -1,84 +0,0 @@ -package com.mobnetic.coinguardian.model.market; - -import java.util.HashMap; -import java.util.LinkedHashMap; - -import org.json.JSONObject; - -import com.mobnetic.coinguardian.model.CheckerInfo; -import com.mobnetic.coinguardian.model.Market; -import com.mobnetic.coinguardian.model.Ticker; -import com.mobnetic.coinguardian.model.currency.VirtualCurrency; - -public class CoinMarketIO extends Market { - - private final static String NAME = "CoinMarket.io"; - private final static String TTS_NAME = "Coin Market IO"; - private final static String URL = "https://coinmarket.io/ticker/%1$s%2$s"; - private final static HashMap CURRENCY_PAIRS = new LinkedHashMap(); - static { - CURRENCY_PAIRS.put(VirtualCurrency.LEAF, new String[]{ - VirtualCurrency.BTC - }); - CURRENCY_PAIRS.put(VirtualCurrency.USDE, new String[]{ - VirtualCurrency.BTC - }); - CURRENCY_PAIRS.put(VirtualCurrency.DGB, new String[]{ - VirtualCurrency.BTC - }); - CURRENCY_PAIRS.put(VirtualCurrency.KDC, new String[]{ - VirtualCurrency.BTC - }); - CURRENCY_PAIRS.put(VirtualCurrency.CON, new String[]{ - VirtualCurrency.BTC - }); - CURRENCY_PAIRS.put(VirtualCurrency.NOBL, new String[]{ - VirtualCurrency.BTC - }); - CURRENCY_PAIRS.put(VirtualCurrency.SMC, new String[]{ - VirtualCurrency.BTC - }); -// CURRENCY_PAIRS.put(VirtualCurrency.PRT, new String[]{ -// VirtualCurrency.BTC -// }); - CURRENCY_PAIRS.put(VirtualCurrency.VTC, new String[]{ - VirtualCurrency.BTC - }); - CURRENCY_PAIRS.put(VirtualCurrency.UTC, new String[]{ - VirtualCurrency.BTC - }); - CURRENCY_PAIRS.put(VirtualCurrency.KARM, new String[]{ - VirtualCurrency.BTC - }); - CURRENCY_PAIRS.put(VirtualCurrency.RDD, new String[]{ - VirtualCurrency.BTC - }); - CURRENCY_PAIRS.put(VirtualCurrency.RPD, new String[]{ - VirtualCurrency.BTC - }); - CURRENCY_PAIRS.put(VirtualCurrency.ICN, new String[]{ - VirtualCurrency.BTC - }); - CURRENCY_PAIRS.put(VirtualCurrency.PENG, new String[]{ - VirtualCurrency.BTC - }); - CURRENCY_PAIRS.put(VirtualCurrency.MINT, new String[]{ - VirtualCurrency.BTC - }); - } - - public CoinMarketIO() { - super(NAME, TTS_NAME, CURRENCY_PAIRS); - } - - @Override - public String getUrl(int requestId, CheckerInfo checkerInfo) { - return String.format(URL, checkerInfo.getCurrencyBase(), checkerInfo.getCurrencyCounter()); - } - - @Override - protected void parseTickerFromJsonObject(int requestId, JSONObject jsonObject, Ticker ticker, CheckerInfo checkerInfo) throws Exception { - ticker.vol = jsonObject.getDouble("volume24"); - ticker.last = jsonObject.getDouble("last"); - } -} diff --git a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/CoinMateIO.java b/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/CoinMateIO.java deleted file mode 100644 index d6c01f11..00000000 --- a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/CoinMateIO.java +++ /dev/null @@ -1,51 +0,0 @@ -package com.mobnetic.coinguardian.model.market; - -import java.util.HashMap; -import java.util.LinkedHashMap; - -import org.json.JSONObject; - -import com.mobnetic.coinguardian.model.CheckerInfo; -import com.mobnetic.coinguardian.model.Market; -import com.mobnetic.coinguardian.model.Ticker; -import com.mobnetic.coinguardian.model.currency.Currency; -import com.mobnetic.coinguardian.model.currency.VirtualCurrency; - -public class CoinMateIO extends Market { - - private final static String NAME = "CoinMate.io"; - private final static String TTS_NAME = "Coin Mate"; - private final static String URL = "https://coinmate.io/api/ticker?currencyPair=%1$s_%2$s"; - private final static HashMap CURRENCY_PAIRS = new LinkedHashMap(); - static { - CURRENCY_PAIRS.put(VirtualCurrency.BTC, new String[]{ - Currency.EUR, - Currency.CZK - }); - } - - public CoinMateIO() { - super(NAME, TTS_NAME, CURRENCY_PAIRS); - } - - @Override - public String getUrl(int requestId, CheckerInfo checkerInfo) { - return String.format(URL, checkerInfo.getCurrencyBase(), checkerInfo.getCurrencyCounter()); - } - - @Override - protected void parseTickerFromJsonObject(int requestId, JSONObject jsonObject, Ticker ticker, CheckerInfo checkerInfo) throws Exception { - final JSONObject dataJsonObject = jsonObject.getJSONObject("data"); - ticker.bid = dataJsonObject.getDouble("bid"); - ticker.ask = dataJsonObject.getDouble("ask"); - ticker.vol = dataJsonObject.getDouble("amount"); - ticker.high = dataJsonObject.getDouble("high"); - ticker.low = dataJsonObject.getDouble("low"); - ticker.last = dataJsonObject.getDouble("last"); - } - - @Override - protected String parseErrorFromJsonObject(int requestId, JSONObject jsonObject, CheckerInfo checkerInfo) throws Exception { - return jsonObject.getString("errorMessage"); - } -} diff --git a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/CoinSecure.java b/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/CoinSecure.java deleted file mode 100644 index 769aadeb..00000000 --- a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/CoinSecure.java +++ /dev/null @@ -1,50 +0,0 @@ -package com.mobnetic.coinguardian.model.market; - -import java.util.HashMap; -import java.util.LinkedHashMap; - -import org.json.JSONObject; - -import com.mobnetic.coinguardian.model.CheckerInfo; -import com.mobnetic.coinguardian.model.Market; -import com.mobnetic.coinguardian.model.Ticker; -import com.mobnetic.coinguardian.model.currency.Currency; -import com.mobnetic.coinguardian.model.currency.VirtualCurrency; - -public class CoinSecure extends Market { - - private final static String NAME = "CoinSecure"; - private final static String TTS_NAME = "Coin Secure"; - private final static String URL = "https://api.coinsecure.in/v1/exchange/ticker"; - private final static HashMap CURRENCY_PAIRS = new LinkedHashMap(); - static { - CURRENCY_PAIRS.put(VirtualCurrency.BTC, new String[]{ - Currency.INR - }); - } - - public CoinSecure() { - super(NAME, TTS_NAME, CURRENCY_PAIRS); - } - - @Override - public String getUrl(int requestId, CheckerInfo checkerInfo) { - return URL; - } - - @Override - protected void parseTickerFromJsonObject(int requestId, JSONObject jsonObject, Ticker ticker, CheckerInfo checkerInfo) throws Exception { - final JSONObject messageJsonObject = jsonObject.getJSONObject("message"); - ticker.bid = parsePrice(messageJsonObject.getDouble("bid")); - ticker.ask = parsePrice(messageJsonObject.getDouble("ask")); - ticker.vol = messageJsonObject.getDouble("coinvolume") / 100000000; - ticker.high = parsePrice(messageJsonObject.getDouble("high")); - ticker.low = parsePrice(messageJsonObject.getDouble("low")); - ticker.last = parsePrice(messageJsonObject.getDouble("lastPrice")); -// ticker.timestamp = messageJsonObject.getLong("timestamp"); - } - - private double parsePrice(double price) { - return price/100; - } -} diff --git a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/CoinSwap.java b/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/CoinSwap.java deleted file mode 100644 index 87675fb6..00000000 --- a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/CoinSwap.java +++ /dev/null @@ -1,57 +0,0 @@ -package com.mobnetic.coinguardian.model.market; - -import java.util.List; - -import org.json.JSONArray; -import org.json.JSONObject; - -import com.mobnetic.coinguardian.model.CheckerInfo; -import com.mobnetic.coinguardian.model.CurrencyPairInfo; -import com.mobnetic.coinguardian.model.Market; -import com.mobnetic.coinguardian.model.Ticker; - -public class CoinSwap extends Market { - - private final static String NAME = "Coin-Swap"; - private final static String TTS_NAME = "Coin Swap"; - private final static String URL = "https://api.coin-swap.net/market/stats/%1$s/%2$s"; - private final static String URL_CURRENCY_PAIRS = "http://api.coin-swap.net/market/summary"; - - public CoinSwap() { - super(NAME, TTS_NAME, null); - } - - @Override - public String getUrl(int requestId, CheckerInfo checkerInfo) { - return String.format(URL, checkerInfo.getCurrencyBase(), checkerInfo.getCurrencyCounter()); - } - - @Override - protected void parseTickerFromJsonObject(int requestId, JSONObject jsonObject, Ticker ticker, CheckerInfo checkerInfo) throws Exception { - ticker.bid = jsonObject.getDouble("bid"); - ticker.ask = jsonObject.getDouble("ask"); - ticker.vol = jsonObject.getDouble("dayvolume"); - ticker.high = jsonObject.getDouble("dayhigh"); - ticker.low = jsonObject.getDouble("daylow"); - ticker.last = jsonObject.getDouble("lastprice"); - } - - // ==================== - // Get currency pairs - // ==================== - public String getCurrencyPairsUrl(int requestId) { - return URL_CURRENCY_PAIRS; - } - - protected void parseCurrencyPairs(int requestId, String responseString, List pairs) throws Exception { - final JSONArray marketsJsonArray = new JSONArray(responseString); - - for(int i=0; i CURRENCY_PAIRS = new LinkedHashMap(); - static { - CURRENCY_PAIRS.put(VirtualCurrency.BTC, new String[]{ - Currency.USD, - Currency.CAD - }); - } - - public CoinTraderNet() { - super(NAME, TTS_NAME, CURRENCY_PAIRS); - } - - @Override - public String getUrl(int requestId, CheckerInfo checkerInfo) { - return String.format(URL, checkerInfo.getCurrencyBase(), checkerInfo.getCurrencyCounter()); - } - - @Override - protected void parseTickerFromJsonObject(int requestId, JSONObject jsonObject, Ticker ticker, CheckerInfo checkerInfo) throws Exception { - final JSONObject dataJsonObject = jsonObject.getJSONObject("data"); - final JSONArray dataNamesArray = dataJsonObject.names(); - final JSONObject tickerJsonObject = dataJsonObject.getJSONObject(dataNamesArray.getString(0)); - ticker.bid = tickerJsonObject.getDouble("bid"); - ticker.ask = tickerJsonObject.getDouble("offer"); - ticker.vol = tickerJsonObject.getDouble("volume"); - ticker.high = tickerJsonObject.getDouble("high"); - ticker.low = tickerJsonObject.getDouble("low"); - ticker.last = tickerJsonObject.getDouble("lastTradePrice"); - } -} diff --git a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/CoinTree.java b/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/CoinTree.java deleted file mode 100644 index d973d336..00000000 --- a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/CoinTree.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.mobnetic.coinguardian.model.market; - -import java.util.HashMap; -import java.util.LinkedHashMap; - -import org.json.JSONObject; - -import com.mobnetic.coinguardian.model.CheckerInfo; -import com.mobnetic.coinguardian.model.Market; -import com.mobnetic.coinguardian.model.Ticker; -import com.mobnetic.coinguardian.model.currency.Currency; -import com.mobnetic.coinguardian.model.currency.VirtualCurrency; - -public class CoinTree extends Market { - - private final static String NAME = "CoinTree"; - private final static String TTS_NAME = "Coin Tree"; - private final static String URL = "https://www.cointree.com.au/api/price/btc/aud"; - private final static HashMap CURRENCY_PAIRS = new LinkedHashMap(); - static { - CURRENCY_PAIRS.put(VirtualCurrency.BTC, new String[]{ - Currency.AUD - }); - } - - public CoinTree() { - super(NAME, TTS_NAME, CURRENCY_PAIRS); - } - - @Override - public String getUrl(int requestId, CheckerInfo checkerInfo) { - return URL; - } - - @Override - protected void parseTickerFromJsonObject(int requestId, JSONObject jsonObject, Ticker ticker, CheckerInfo checkerInfo) throws Exception { - ticker.bid = jsonObject.getDouble("Bid"); - ticker.ask = jsonObject.getDouble("Ask"); - ticker.last = jsonObject.getDouble("Spot"); - } -} diff --git a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/Coinapult.java b/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/Coinapult.java deleted file mode 100644 index 8e331637..00000000 --- a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/Coinapult.java +++ /dev/null @@ -1,51 +0,0 @@ -package com.mobnetic.coinguardian.model.market; - -import java.util.HashMap; -import java.util.LinkedHashMap; - -import org.json.JSONObject; - -import com.mobnetic.coinguardian.model.CheckerInfo; -import com.mobnetic.coinguardian.model.Market; -import com.mobnetic.coinguardian.model.Ticker; -import com.mobnetic.coinguardian.model.currency.Currency; -import com.mobnetic.coinguardian.model.currency.VirtualCurrency; -import com.mobnetic.coinguardian.util.TimeUtils; - -public class Coinapult extends Market { - - private final static String NAME = "Coinapult"; - private final static String TTS_NAME = NAME; - private final static String URL = "https://api.coinapult.com/api/ticker?market=%2$s_%1$s"; - private final static HashMap CURRENCY_PAIRS = new LinkedHashMap(); - - static { - CURRENCY_PAIRS.put(VirtualCurrency.BTC, new String[]{ - Currency.USD, - Currency.EUR, - Currency.GBP, - Currency.XAG, - Currency.XAU - }); - } - - public Coinapult() { - super(NAME, TTS_NAME, CURRENCY_PAIRS); - } - - @Override - public String getUrl(int requestId, CheckerInfo checkerInfo) { - return String.format(URL, checkerInfo.getCurrencyBase(), checkerInfo.getCurrencyCounter()); - } - - @Override - protected String parseErrorFromJsonObject(int requestId, JSONObject jsonObject, CheckerInfo checkerInfo) throws Exception { - return jsonObject.getString("error"); - } - - @Override - protected void parseTickerFromJsonObject(int requestId, JSONObject jsonObject, Ticker ticker, CheckerInfo checkerInfo) throws Exception { - ticker.last = jsonObject.getDouble("index"); - ticker.timestamp = jsonObject.getLong("updatetime") * TimeUtils.MILLIS_IN_SECOND; - } -} diff --git a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/Coinbase.java b/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/Coinbase.java deleted file mode 100644 index d063e9c6..00000000 --- a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/Coinbase.java +++ /dev/null @@ -1,79 +0,0 @@ -package com.mobnetic.coinguardian.model.market; - -import com.mobnetic.coinguardian.model.CheckerInfo; -import com.mobnetic.coinguardian.model.CurrencyPairInfo; -import com.mobnetic.coinguardian.model.Market; -import com.mobnetic.coinguardian.model.Ticker; -import com.mobnetic.coinguardian.model.currency.Currency; -import com.mobnetic.coinguardian.model.currency.VirtualCurrency; - -import org.json.JSONArray; -import org.json.JSONObject; - -import java.util.HashMap; -import java.util.LinkedHashMap; -import java.util.List; - -public class Coinbase extends Market { - - private final static String NAME = "Coinbase"; - private final static String TTS_NAME = NAME; - private final static String URL = "https://api.gdax.com/products/%1$s-%2$s/ticker"; - private final static String URL_CURRENCY_PAIRS = "https://api.gdax.com/products/"; - private final static HashMap CURRENCY_PAIRS = new LinkedHashMap<>(); - - static { - CURRENCY_PAIRS.put(VirtualCurrency.BTC, new String[]{ - Currency.USD, - Currency.EUR, - Currency.GBP - }); - CURRENCY_PAIRS.put(VirtualCurrency.LTC, new String[]{ - Currency.USD, - Currency.EUR, - VirtualCurrency.BTC - }); - CURRENCY_PAIRS.put(VirtualCurrency.ETH, new String[]{ - Currency.USD, - Currency.EUR, - VirtualCurrency.BTC - }); - } - - public Coinbase() { - super(NAME, TTS_NAME, CURRENCY_PAIRS); - } - - @Override - public String getUrl(int requestId, CheckerInfo checkerInfo) { - return String.format(URL, checkerInfo.getCurrencyBase(), checkerInfo.getCurrencyCounter()); - } - - @Override - protected void parseTickerFromJsonObject(int requestId, JSONObject jsonObject, Ticker ticker, CheckerInfo checkerInfo) throws Exception { - ticker.bid = jsonObject.getDouble("bid"); - ticker.ask = jsonObject.getDouble("ask"); - ticker.vol = jsonObject.getDouble("volume"); - ticker.last = jsonObject.getDouble("price"); - } - - // ==================== - // Get currency pairs - // ==================== - @Override - public String getCurrencyPairsUrl(int requestId) { - return URL_CURRENCY_PAIRS; - } - - @Override - protected void parseCurrencyPairs(int requestId, String responseString, List pairs) throws Exception { - final JSONArray jsonArray = new JSONArray(responseString); - for (int i = 0; i < jsonArray.length(); ++i) { - final JSONObject pairJsonObject = jsonArray.getJSONObject(i); - pairs.add(new CurrencyPairInfo( - pairJsonObject.getString("base_currency"), - pairJsonObject.getString("quote_currency"), - pairJsonObject.getString("id"))); - } - } -} \ No newline at end of file diff --git a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/Coinnest.java b/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/Coinnest.java deleted file mode 100644 index 5b7793ab..00000000 --- a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/Coinnest.java +++ /dev/null @@ -1,78 +0,0 @@ -package com.mobnetic.coinguardian.model.market; - -import com.mobnetic.coinguardian.model.CheckerInfo; -import com.mobnetic.coinguardian.model.Market; -import com.mobnetic.coinguardian.model.Ticker; -import com.mobnetic.coinguardian.model.currency.Currency; -import com.mobnetic.coinguardian.model.currency.VirtualCurrency; -import com.mobnetic.coinguardian.util.TimeUtils; - -import org.json.JSONObject; - -import java.util.HashMap; -import java.util.LinkedHashMap; - -public class Coinnest extends Market { - - private final static String NAME = "Coinnest"; - private final static String TTS_NAME = NAME; - private final static String URL = "https://api.coinnest.co.kr/api/pub/ticker?coin=%1$s"; - private final static HashMap CURRENCY_PAIRS = new LinkedHashMap<>(); - - static { - CURRENCY_PAIRS.put(VirtualCurrency.BTC, new String[]{ - Currency.KRW - }); - CURRENCY_PAIRS.put(VirtualCurrency.BCC, new String[]{ - Currency.KRW - }); - CURRENCY_PAIRS.put(VirtualCurrency.ETH, new String[]{ - Currency.KRW - }); - CURRENCY_PAIRS.put(VirtualCurrency.ETC, new String[]{ - Currency.KRW - }); - CURRENCY_PAIRS.put(VirtualCurrency.QTUM, new String[]{ - Currency.KRW - }); - CURRENCY_PAIRS.put(VirtualCurrency.NEO, new String[]{ - Currency.KRW - }); - CURRENCY_PAIRS.put(VirtualCurrency.KNC, new String[]{ - Currency.KRW - }); - CURRENCY_PAIRS.put(VirtualCurrency.TSL, new String[]{ - Currency.KRW - }); - CURRENCY_PAIRS.put(VirtualCurrency.OMG, new String[]{ - Currency.KRW - }); - } - - public Coinnest() { - super(NAME, TTS_NAME, CURRENCY_PAIRS); - } - - @Override - public String getUrl(int requestId, CheckerInfo checkerInfo) { - return String.format(URL, checkerInfo.getCurrencyBaseLowerCase()); - } - - @Override - protected void parseTickerFromJsonObject(int requestId, JSONObject jsonObject, Ticker ticker, - CheckerInfo checkerInfo) throws Exception { - ticker.high = jsonObject.getDouble("high"); - ticker.low = jsonObject.getDouble("low"); - ticker.bid = jsonObject.getDouble("buy"); - ticker.ask = jsonObject.getDouble("sell"); - ticker.last = jsonObject.getDouble("last"); - ticker.vol = jsonObject.getDouble("vol"); - ticker.timestamp = jsonObject.getLong("time") * TimeUtils.MILLIS_IN_SECOND; - } - - @Override - protected String parseErrorFromJsonObject(int requestId, JSONObject jsonObject, - CheckerInfo checkerInfo) throws Exception { - return jsonObject.getString("msg"); - } -} diff --git a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/Coinome.java b/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/Coinome.java deleted file mode 100644 index 8665968b..00000000 --- a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/Coinome.java +++ /dev/null @@ -1,62 +0,0 @@ -package com.mobnetic.coinguardian.model.market; - -import com.mobnetic.coinguardian.model.CheckerInfo; -import com.mobnetic.coinguardian.model.CurrencyPairInfo; -import com.mobnetic.coinguardian.model.Market; -import com.mobnetic.coinguardian.model.Ticker; - -import org.json.JSONArray; -import org.json.JSONObject; - -import java.util.List; -import java.util.Locale; - -public class Coinome extends Market { - - private final static String NAME = "Coinome"; - private final static String TTS_NAME = "Coin ome"; - private final static String URL = "https://www.coinome.com/api/v1/ticker.json"; - - public Coinome() { - super(NAME, TTS_NAME, null); - } - - @Override - public String getUrl(int requestId, CheckerInfo checkerInfo) { - return URL; - } - - @Override - protected void parseTickerFromJsonObject(int requestId, JSONObject jsonObject, Ticker ticker, CheckerInfo checkerInfo) throws Exception { - final JSONObject tickerJsonObject = jsonObject.getJSONObject(checkerInfo.getCurrencyPairId()); - ticker.bid = tickerJsonObject.getDouble("highest_bid"); - ticker.ask = tickerJsonObject.getDouble("lowest_ask"); - //ticker.vol = tickerJsonObject.getDouble("24hr_volume"); Currently null - ticker.last = tickerJsonObject.getDouble("last"); - } - - // ==================== - // Get currency pairs - // ==================== - @Override - public String getCurrencyPairsUrl(int requestId) { - return URL; - } - - @Override - protected void parseCurrencyPairsFromJsonObject(int requestId, JSONObject jsonObject, List pairs) throws Exception { - final JSONArray pairArray = jsonObject.names(); - for(int i=0; i= 2){ - pairs.add(new CurrencyPairInfo( - currencies[0].toUpperCase(Locale.US), - currencies[1].toUpperCase(Locale.US), - pairId - )); - } - } - } -} - diff --git a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/Coinone.java b/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/Coinone.java deleted file mode 100644 index 09b6f0a4..00000000 --- a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/Coinone.java +++ /dev/null @@ -1,86 +0,0 @@ -package com.mobnetic.coinguardian.model.market; - -import com.mobnetic.coinguardian.model.CheckerInfo; -import com.mobnetic.coinguardian.model.Market; -import com.mobnetic.coinguardian.model.Ticker; -import com.mobnetic.coinguardian.model.currency.Currency; -import com.mobnetic.coinguardian.model.currency.VirtualCurrency; - -import org.json.JSONArray; -import org.json.JSONObject; - -import java.util.HashMap; -import java.util.LinkedHashMap; - -public class Coinone extends Market { - - private final static String NAME = "Coinone"; - private final static String TTS_NAME = NAME; - private final static String URL_TICKER = "https://api.coinone.co.kr/ticker?currency=%1$s"; - private final static String URL_ORDERS = "https://api.coinone.co.kr/orderbook?currency=%1$s"; - private final static HashMap CURRENCY_PAIRS = new LinkedHashMap<>(); - static { - CURRENCY_PAIRS.put(VirtualCurrency.BTC, new String[]{ - Currency.KRW - }); - CURRENCY_PAIRS.put(VirtualCurrency.ETH, new String[]{ - Currency.KRW - }); - CURRENCY_PAIRS.put(VirtualCurrency.ETC, new String[]{ - Currency.KRW - }); - CURRENCY_PAIRS.put(VirtualCurrency.XRP, new String[]{ - Currency.KRW - }); - CURRENCY_PAIRS.put(VirtualCurrency.BCH, new String[]{ - Currency.KRW - }); - CURRENCY_PAIRS.put(VirtualCurrency.QTUM, new String[]{ - Currency.KRW - }); - } - - public Coinone() { - super(NAME, TTS_NAME, CURRENCY_PAIRS); - } - - @Override - public int getNumOfRequests(CheckerInfo checkerRecord) { - return 2; - } - - @Override - public String getUrl(int requestId, CheckerInfo checkerInfo) { - if (requestId == 0) { - return String.format(URL_TICKER, checkerInfo.getCurrencyBaseLowerCase()); - } else { - return String.format(URL_ORDERS, checkerInfo.getCurrencyBaseLowerCase()); - } - } - - @Override - protected void parseTickerFromJsonObject(int requestId, JSONObject jsonObject, Ticker ticker, - CheckerInfo checkerInfo) throws Exception { - if(requestId == 0) { - ticker.vol = jsonObject.getDouble("volume"); - ticker.high = jsonObject.getDouble("high"); - ticker.low = jsonObject.getDouble("low"); - ticker.last = jsonObject.getDouble("last"); - ticker.timestamp = jsonObject.getLong("timestamp"); - } else { - ticker.bid = getFirstPriceFromOrder(jsonObject, "bid"); - ticker.ask = getFirstPriceFromOrder(jsonObject, "ask"); - } - } - - private double getFirstPriceFromOrder(JSONObject jsonObject, String key) throws Exception { - JSONArray array = jsonObject.getJSONArray(key); - - if(array.length() == 0) { - return Ticker.NO_DATA; - } - - JSONObject first = array.getJSONObject(0); - return first.getDouble("price"); - } -} \ No newline at end of file diff --git a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/Coinse.java b/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/Coinse.java deleted file mode 100644 index 211adfbb..00000000 --- a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/Coinse.java +++ /dev/null @@ -1,111 +0,0 @@ -package com.mobnetic.coinguardian.model.market; - -import java.util.HashMap; -import java.util.LinkedHashMap; - -import org.json.JSONObject; - -import com.mobnetic.coinguardian.model.CheckerInfo; -import com.mobnetic.coinguardian.model.Market; -import com.mobnetic.coinguardian.model.Ticker; -import com.mobnetic.coinguardian.model.currency.VirtualCurrency; -import com.mobnetic.coinguardiandatamodule.R; - -public class Coinse extends Market { - - private final static String NAME = "Coins-E"; - private final static String TTS_NAME = NAME; - private final static String URL = "https://www.coins-e.com/api/v2/markets/data/"; - private final static HashMap CURRENCY_PAIRS = new LinkedHashMap(); - static { - CURRENCY_PAIRS.put(VirtualCurrency.ALP, new String[]{ VirtualCurrency.BTC, VirtualCurrency.LTC }); - CURRENCY_PAIRS.put(VirtualCurrency.AMC, new String[]{ VirtualCurrency.BTC, VirtualCurrency.LTC }); - CURRENCY_PAIRS.put(VirtualCurrency.ANC, new String[]{ VirtualCurrency.BTC, VirtualCurrency.LTC }); - CURRENCY_PAIRS.put(VirtualCurrency.ARG, new String[]{ VirtualCurrency.BTC, VirtualCurrency.LTC }); - CURRENCY_PAIRS.put(VirtualCurrency.BET, new String[]{ VirtualCurrency.BTC, VirtualCurrency.LTC }); - CURRENCY_PAIRS.put(VirtualCurrency.BQC, new String[]{ VirtualCurrency.BTC }); - CURRENCY_PAIRS.put(VirtualCurrency.BTG, new String[]{ VirtualCurrency.BTC }); - CURRENCY_PAIRS.put(VirtualCurrency.CGB, new String[]{ VirtualCurrency.BTC }); - CURRENCY_PAIRS.put(VirtualCurrency.CIN, new String[]{ VirtualCurrency.BTC }); - CURRENCY_PAIRS.put(VirtualCurrency.CMC, new String[]{ VirtualCurrency.BTC }); - CURRENCY_PAIRS.put(VirtualCurrency.COL, new String[]{ VirtualCurrency.LTC }); - CURRENCY_PAIRS.put(VirtualCurrency.CRC, new String[]{ VirtualCurrency.BTC }); - CURRENCY_PAIRS.put(VirtualCurrency.CSC, new String[]{ VirtualCurrency.BTC }); - CURRENCY_PAIRS.put(VirtualCurrency.DEM, new String[]{ VirtualCurrency.BTC, VirtualCurrency.LTC }); - CURRENCY_PAIRS.put(VirtualCurrency.DGC, new String[]{ VirtualCurrency.BTC }); - CURRENCY_PAIRS.put(VirtualCurrency.DMD, new String[]{ VirtualCurrency.BTC }); - CURRENCY_PAIRS.put(VirtualCurrency.DOGE, new String[]{ VirtualCurrency.BTC }); - CURRENCY_PAIRS.put(VirtualCurrency.DTC, new String[]{ VirtualCurrency.BTC }); - CURRENCY_PAIRS.put(VirtualCurrency.ELC, new String[]{ VirtualCurrency.BTC }); - CURRENCY_PAIRS.put(VirtualCurrency.ELP, new String[]{ VirtualCurrency.BTC }); - CURRENCY_PAIRS.put(VirtualCurrency.EMD, new String[]{ VirtualCurrency.BTC }); - CURRENCY_PAIRS.put(VirtualCurrency.EZC, new String[]{ VirtualCurrency.BTC }); - CURRENCY_PAIRS.put(VirtualCurrency.FLO, new String[]{ VirtualCurrency.BTC }); - CURRENCY_PAIRS.put(VirtualCurrency.FRK, new String[]{ VirtualCurrency.BTC, VirtualCurrency.LTC }); - CURRENCY_PAIRS.put(VirtualCurrency.FTC, new String[]{ VirtualCurrency.BTC }); - CURRENCY_PAIRS.put(VirtualCurrency.GDC, new String[]{ VirtualCurrency.BTC }); - CURRENCY_PAIRS.put(VirtualCurrency.GLC, new String[]{ VirtualCurrency.BTC, VirtualCurrency.LTC }); - CURRENCY_PAIRS.put(VirtualCurrency.GLX, new String[]{ VirtualCurrency.BTC }); - CURRENCY_PAIRS.put(VirtualCurrency.HYC, new String[]{ VirtualCurrency.BTC }); - CURRENCY_PAIRS.put(VirtualCurrency.IFC, new String[]{ VirtualCurrency.BTC, VirtualCurrency.LTC, VirtualCurrency.XPM }); - CURRENCY_PAIRS.put(VirtualCurrency.KGC, new String[]{ VirtualCurrency.BTC, VirtualCurrency.LTC }); - CURRENCY_PAIRS.put(VirtualCurrency.LBW, new String[]{ VirtualCurrency.BTC }); - CURRENCY_PAIRS.put(VirtualCurrency.LTC, new String[]{ VirtualCurrency.BTC }); - CURRENCY_PAIRS.put(VirtualCurrency.MEC, new String[]{ VirtualCurrency.BTC }); - CURRENCY_PAIRS.put(VirtualCurrency.NAN, new String[]{ VirtualCurrency.BTC }); - CURRENCY_PAIRS.put(VirtualCurrency.NET, new String[]{ VirtualCurrency.BTC }); - CURRENCY_PAIRS.put(VirtualCurrency.NIB, new String[]{ VirtualCurrency.BTC }); - CURRENCY_PAIRS.put(VirtualCurrency.NRB, new String[]{ VirtualCurrency.BTC }); - CURRENCY_PAIRS.put(VirtualCurrency.NUC, new String[]{ VirtualCurrency.BTC }); - CURRENCY_PAIRS.put(VirtualCurrency.NVC, new String[]{ VirtualCurrency.BTC }); - CURRENCY_PAIRS.put(VirtualCurrency.ORB, new String[]{ VirtualCurrency.BTC, VirtualCurrency.LTC }); - CURRENCY_PAIRS.put(VirtualCurrency.PPC, new String[]{ VirtualCurrency.BTC, VirtualCurrency.XPM }); - CURRENCY_PAIRS.put(VirtualCurrency.PTS, new String[]{ VirtualCurrency.BTC }); - CURRENCY_PAIRS.put(VirtualCurrency.PWC, new String[]{ VirtualCurrency.BTC }); - CURRENCY_PAIRS.put(VirtualCurrency.PXC, new String[]{ VirtualCurrency.BTC, VirtualCurrency.LTC }); - CURRENCY_PAIRS.put(VirtualCurrency.QRK, new String[]{ VirtualCurrency.BTC, VirtualCurrency.LTC, VirtualCurrency.XPM }); - CURRENCY_PAIRS.put(VirtualCurrency.RCH, new String[]{ VirtualCurrency.BTC, VirtualCurrency.LTC }); - CURRENCY_PAIRS.put(VirtualCurrency.REC, new String[]{ VirtualCurrency.BTC, VirtualCurrency.LTC }); - CURRENCY_PAIRS.put(VirtualCurrency.RED, new String[]{ VirtualCurrency.BTC, VirtualCurrency.LTC }); - CURRENCY_PAIRS.put(VirtualCurrency.SBC, new String[]{ VirtualCurrency.BTC, VirtualCurrency.LTC }); - CURRENCY_PAIRS.put(VirtualCurrency.SPT, new String[]{ VirtualCurrency.BTC }); - CURRENCY_PAIRS.put(VirtualCurrency.TAG, new String[]{ VirtualCurrency.BTC }); - CURRENCY_PAIRS.put(VirtualCurrency.TRC, new String[]{ VirtualCurrency.BTC }); - CURRENCY_PAIRS.put(VirtualCurrency.UNO, new String[]{ VirtualCurrency.BTC }); - CURRENCY_PAIRS.put(VirtualCurrency.VLC, new String[]{ VirtualCurrency.BTC, VirtualCurrency.LTC }); - CURRENCY_PAIRS.put(VirtualCurrency.WDC, new String[]{ VirtualCurrency.BTC }); - CURRENCY_PAIRS.put(VirtualCurrency.XNC, new String[]{ VirtualCurrency.BTC, VirtualCurrency.LTC }); - CURRENCY_PAIRS.put(VirtualCurrency.XPM, new String[]{ VirtualCurrency.BTC, VirtualCurrency.LTC }); - CURRENCY_PAIRS.put(VirtualCurrency.ZET, new String[]{ VirtualCurrency.BTC }); - } - - public Coinse() { - super(NAME, TTS_NAME, CURRENCY_PAIRS); - } - - @Override - public int getCautionResId() { - return R.string.market_caution_much_data; - } - - @Override - public String getUrl(int requestId, CheckerInfo checkerInfo) { - return URL; - } - - @Override - protected void parseTickerFromJsonObject(int requestId, JSONObject jsonObject, Ticker ticker, CheckerInfo checkerInfo) throws Exception { - JSONObject marketsObject = jsonObject.getJSONObject("markets"); - JSONObject pairObject = marketsObject.getJSONObject(checkerInfo.getCurrencyBase()+"_"+checkerInfo.getCurrencyCounter()); - - JSONObject marketStatObject = pairObject.getJSONObject("marketstat"); - JSONObject inner24hObject = marketStatObject.getJSONObject("24h"); - - ticker.bid = marketStatObject.getDouble("bid"); - ticker.ask = marketStatObject.getDouble("ask"); - ticker.vol = inner24hObject.getDouble("volume"); - ticker.high = inner24hObject.getDouble("h"); - ticker.low = inner24hObject.getDouble("l"); - ticker.last = marketStatObject.getDouble("ltp"); - } -} diff --git a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/Coinsph.java b/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/Coinsph.java deleted file mode 100644 index c0056ec2..00000000 --- a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/Coinsph.java +++ /dev/null @@ -1,59 +0,0 @@ -package com.mobnetic.coinguardian.model.market; - -import com.mobnetic.coinguardian.model.CheckerInfo; -import com.mobnetic.coinguardian.model.CurrencyPairInfo; -import com.mobnetic.coinguardian.model.Market; -import com.mobnetic.coinguardian.model.Ticker; - -import org.json.JSONArray; -import org.json.JSONObject; - -import java.util.List; - -public class Coinsph extends Market { - - private final static String NAME = "Coins.ph"; - private final static String TTS_NAME = NAME; - private final static String URL = "https://quote.coins.ph/v1/markets/%1$s"; - private final static String URL_CURRENCY_PAIRS = "https://quote.coins.ph/v1/markets"; - - public Coinsph() { - super(NAME, TTS_NAME, null); - } - - @Override - public String getUrl(int requestId, CheckerInfo checkerInfo) { - return String.format(URL, checkerInfo.getCurrencyPairId()); - } - - @Override - protected void parseTickerFromJsonObject(int requestId, JSONObject jsonObject, Ticker ticker, CheckerInfo checkerInfo) throws Exception { - JSONObject marketJsonObject = jsonObject.getJSONObject("market"); - ticker.bid = marketJsonObject.getDouble("bid"); - ticker.ask = marketJsonObject.getDouble("ask"); - ticker.last = ticker.ask; - } - - // ==================== - // Get currency pairs - // ==================== - @Override - public String getCurrencyPairsUrl(int requestId) { - return URL_CURRENCY_PAIRS; - } - - @Override - protected void parseCurrencyPairsFromJsonObject(int requestId, JSONObject jsonObject, List pairs) throws Exception { - final JSONArray marketsJsonArray = jsonObject.getJSONArray("markets"); - for(int i=0; i0) { - return ordersJsonArray.getJSONObject(0).getDouble("price"); - } - return Ticker.NO_DATA; - } - - // ==================== - // Get currency pairs - // ==================== - @Override - public String getCurrencyPairsUrl(int requestId) { - return URL_CURRENCY_PAIRS; - } - - @Override - protected void parseCurrencyPairsFromJsonObject(int requestId, JSONObject jsonObject, List pairs) throws Exception { - final JSONArray marketsJsonArray = jsonObject.getJSONArray("markets"); - - for(int i=0; i pairs) throws Exception { - final JSONArray pairsNamesArray = jsonObject.names(); - - for(int i=0; i=2) { - pairs.add(new CurrencyPairInfo(split[0], split[1], pairName)); - } - } - } -} diff --git a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/CryptoRush.java b/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/CryptoRush.java deleted file mode 100644 index 9bf9afd4..00000000 --- a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/CryptoRush.java +++ /dev/null @@ -1,70 +0,0 @@ -package com.mobnetic.coinguardian.model.market; - -import java.util.List; - -import org.json.JSONArray; -import org.json.JSONObject; - -import com.mobnetic.coinguardian.model.CheckerInfo; -import com.mobnetic.coinguardian.model.CurrencyPairInfo; -import com.mobnetic.coinguardian.model.Market; -import com.mobnetic.coinguardian.model.Ticker; -import com.mobnetic.coinguardiandatamodule.R; - -public class CryptoRush extends Market { - - public final static String NAME = "CryptoRush"; - public final static String TTS_NAME = "Crypto Rush"; - public final static String URL = "https://cryptorush.in/marketdata/all.json"; - private final static String URL_CURRENCY_PAIRS = URL; - - public CryptoRush() { - super(NAME, TTS_NAME, null); - } - - @Override - public int getCautionResId() { - return R.string.market_caution_much_data; - } - - @Override - public String getUrl(int requestId, CheckerInfo checkerInfo) { - return String.format(URL, checkerInfo.getCurrencyBaseLowerCase(), checkerInfo.getCurrencyCounterLowerCase()); - } - - @Override - protected void parseTickerFromJsonObject(int requestId, JSONObject jsonObject, Ticker ticker, CheckerInfo checkerInfo) throws Exception { - final JSONObject pairJsonObject = jsonObject.getJSONObject(checkerInfo.getCurrencyBase()+"/"+checkerInfo.getCurrencyCounter()); - - ticker.bid = pairJsonObject.getDouble("current_bid"); - ticker.ask = pairJsonObject.getDouble("current_ask"); - ticker.vol = pairJsonObject.getDouble("volume_base_24h"); - ticker.high = pairJsonObject.getDouble("highest_24h"); - ticker.low = pairJsonObject.getDouble("lowest_24h"); - ticker.last = pairJsonObject.getDouble("last_trade"); - } - - // ==================== - // Get currency pairs - // ==================== - @Override - public String getCurrencyPairsUrl(int requestId) { - return URL_CURRENCY_PAIRS; - } - - @Override - protected void parseCurrencyPairsFromJsonObject(int requestId, JSONObject jsonObject, List pairs) throws Exception { - final JSONArray pairNames = jsonObject.names(); - - for(int i=0; i CURRENCY_PAIRS = new LinkedHashMap(); - static { - CURRENCY_PAIRS.put(VirtualCurrency.BTC, new String[]{ - Currency.USD, - Currency.EUR - }); - CURRENCY_PAIRS.put(VirtualCurrency.LTC, new String[]{ - Currency.USD, - Currency.EUR, - VirtualCurrency.BTC - }); - CURRENCY_PAIRS.put(VirtualCurrency.NMC, new String[]{ - Currency.USD, - VirtualCurrency.BTC - }); - CURRENCY_PAIRS.put(VirtualCurrency.XPM, new String[]{ - Currency.USD, - VirtualCurrency.BTC, - VirtualCurrency.PPC - }); - CURRENCY_PAIRS.put(VirtualCurrency.PPC, new String[]{ - Currency.USD, - VirtualCurrency.BTC - }); - CURRENCY_PAIRS.put(VirtualCurrency.TRC, new String[]{ - VirtualCurrency.BTC - }); - CURRENCY_PAIRS.put(VirtualCurrency.FTC, new String[]{ - Currency.USD, - VirtualCurrency.BTC - }); - CURRENCY_PAIRS.put(VirtualCurrency.DVC, new String[]{ - VirtualCurrency.BTC - }); - CURRENCY_PAIRS.put(VirtualCurrency.WDC, new String[]{ - Currency.USD, - VirtualCurrency.BTC - }); - CURRENCY_PAIRS.put(VirtualCurrency.DGC, new String[]{ - VirtualCurrency.BTC - }); - CURRENCY_PAIRS.put(VirtualCurrency.UTC, new String[]{ - Currency.USD, - Currency.EUR, - VirtualCurrency.BTC - }); - } - - public CryptoTrade() { - super(NAME, TTS_NAME, CURRENCY_PAIRS); - } - - @Override - public String getUrl(int requestId, CheckerInfo checkerInfo) { - return String.format(URL, checkerInfo.getCurrencyBaseLowerCase(), checkerInfo.getCurrencyCounterLowerCase()); - } - - @Override - protected void parseTickerFromJsonObject(int requestId, JSONObject jsonObject, Ticker ticker, CheckerInfo checkerInfo) throws Exception { - final JSONObject dataObject = jsonObject.getJSONObject("data"); - - ticker.bid = dataObject.getDouble("max_bid"); - ticker.ask = dataObject.getDouble("min_ask"); - ticker.vol = dataObject.getDouble("vol_"+checkerInfo.getCurrencyBaseLowerCase()); - ticker.high = dataObject.getDouble("high"); - ticker.low = dataObject.getDouble("low"); - ticker.last = dataObject.getDouble("last"); - } - - @Override - protected String parseErrorFromJsonObject(int requestId, JSONObject jsonObject, CheckerInfo checkerInfo) throws Exception { - return jsonObject.getString("error"); - } -} diff --git a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/Cryptoine.java b/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/Cryptoine.java deleted file mode 100644 index 360aec34..00000000 --- a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/Cryptoine.java +++ /dev/null @@ -1,72 +0,0 @@ -package com.mobnetic.coinguardian.model.market; - -import java.util.List; -import java.util.Locale; - -import org.json.JSONArray; -import org.json.JSONObject; - -import com.mobnetic.coinguardian.model.CheckerInfo; -import com.mobnetic.coinguardian.model.CurrencyPairInfo; -import com.mobnetic.coinguardian.model.Market; -import com.mobnetic.coinguardian.model.Ticker; - -public class Cryptoine extends Market { - - private final static String NAME = "Cryptoine"; - private final static String TTS_NAME = NAME; - private final static String URL = "https://cryptoine.com/api/1/ticker/%1$s"; - private final static String URL_CURRENCY_PAIRS = "https://cryptoine.com/api/1/markets"; - - public Cryptoine() { - super(NAME, TTS_NAME, null); - } - - @Override - public String getUrl(int requestId, CheckerInfo checkerInfo) { - return String.format(URL, checkerInfo.getCurrencyPairId()); - } - - @Override - protected void parseTickerFromJsonObject(int requestId, JSONObject jsonObject, Ticker ticker, CheckerInfo checkerInfo) throws Exception { - ticker.bid = getDoubleOrZero(jsonObject, "buy"); - ticker.ask = getDoubleOrZero(jsonObject, "sell"); - ticker.vol = getDoubleOrZero(jsonObject, "vol_exchange"); - ticker.high = getDoubleOrZero(jsonObject, "high"); - ticker.low = getDoubleOrZero(jsonObject, "low"); - ticker.last = getDoubleOrZero(jsonObject, "last"); - } - - private double getDoubleOrZero(JSONObject jsonObject, String name) throws Exception { - if(jsonObject.isNull(name)) - return 0; - return jsonObject.getDouble(name); - } - - // ==================== - // Get currency pairs - // ==================== - @Override - public String getCurrencyPairsUrl(int requestId) { - return URL_CURRENCY_PAIRS; - } - - @Override - protected void parseCurrencyPairsFromJsonObject(int requestId, JSONObject jsonObject, List pairs) throws Exception { - final JSONObject dataJsonObject = jsonObject.getJSONObject("data"); - final JSONArray pairNames = dataJsonObject.names(); - - for(int i=0; i pairs) throws Exception { - final JSONArray pairsJsonArray = new JSONArray(responseString); - JSONArray currenciesJsonArray = null; - for(int i=0; i pairs) throws Exception { - final JSONArray dataJsonArray = jsonObject.getJSONArray("Data"); - for(int i=0; i CURRENCY_PAIRS_IDS = new HashMap(151); - static { - // Kept for backward compatibility - CURRENCY_PAIRS_IDS.put("42_BTC", 141); - CURRENCY_PAIRS_IDS.put("ADT_LTC", 94); - CURRENCY_PAIRS_IDS.put("ADT_XPM", 113); - CURRENCY_PAIRS_IDS.put("ALF_BTC", 57); - CURRENCY_PAIRS_IDS.put("AMC_BTC", 43); - CURRENCY_PAIRS_IDS.put("ANC_BTC", 66); - CURRENCY_PAIRS_IDS.put("ANC_LTC", 121); - CURRENCY_PAIRS_IDS.put("ARG_BTC", 48); - CURRENCY_PAIRS_IDS.put("ASC_LTC", 111); - CURRENCY_PAIRS_IDS.put("ASC_XPM", 112); - CURRENCY_PAIRS_IDS.put("AUR_BTC", 160); - CURRENCY_PAIRS_IDS.put("AUR_LTC", 161); - CURRENCY_PAIRS_IDS.put("BCX_BTC", 142); - CURRENCY_PAIRS_IDS.put("BEN_BTC", 157); - CURRENCY_PAIRS_IDS.put("BET_BTC", 129); - CURRENCY_PAIRS_IDS.put("BQC_BTC", 10); - CURRENCY_PAIRS_IDS.put("BTB_BTC", 23); - CURRENCY_PAIRS_IDS.put("BTE_BTC", 49); - CURRENCY_PAIRS_IDS.put("BTG_BTC", 50); - CURRENCY_PAIRS_IDS.put("BUK_BTC", 102); - CURRENCY_PAIRS_IDS.put("CACH_BTC", 154); - CURRENCY_PAIRS_IDS.put("CAP_BTC", 53); - CURRENCY_PAIRS_IDS.put("CASH_BTC", 150); - CURRENCY_PAIRS_IDS.put("CAT_BTC", 136); - CURRENCY_PAIRS_IDS.put("CGB_BTC", 70); - CURRENCY_PAIRS_IDS.put("CGB_LTC", 123); - CURRENCY_PAIRS_IDS.put("CLR_BTC", 95); - CURRENCY_PAIRS_IDS.put("CMC_BTC", 74); - CURRENCY_PAIRS_IDS.put("CNC_BTC", 8); - CURRENCY_PAIRS_IDS.put("CNC_LTC", 17); - CURRENCY_PAIRS_IDS.put("COL_LTC", 109); - CURRENCY_PAIRS_IDS.put("COL_XPM", 110); - CURRENCY_PAIRS_IDS.put("CPR_LTC", 91); - CURRENCY_PAIRS_IDS.put("CRC_BTC", 58); - CURRENCY_PAIRS_IDS.put("CSC_BTC", 68); - CURRENCY_PAIRS_IDS.put("DBL_LTC", 46); - CURRENCY_PAIRS_IDS.put("DEM_BTC", 131); - CURRENCY_PAIRS_IDS.put("DGB_BTC", 167); - CURRENCY_PAIRS_IDS.put("DGC_BTC", 26); - CURRENCY_PAIRS_IDS.put("DGC_LTC", 96); - CURRENCY_PAIRS_IDS.put("DMD_BTC", 72); - CURRENCY_PAIRS_IDS.put("DOGE_BTC", 132); - CURRENCY_PAIRS_IDS.put("DOGE_LTC", 135); - CURRENCY_PAIRS_IDS.put("DRK_BTC", 155); - CURRENCY_PAIRS_IDS.put("DVC_BTC", 40); - CURRENCY_PAIRS_IDS.put("DVC_LTC", 52); - CURRENCY_PAIRS_IDS.put("DVC_XPM", 122); - CURRENCY_PAIRS_IDS.put("EAC_BTC", 139); - CURRENCY_PAIRS_IDS.put("ELC_BTC", 12); - CURRENCY_PAIRS_IDS.put("ELP_LTC", 93); - CURRENCY_PAIRS_IDS.put("EMD_BTC", 69); - CURRENCY_PAIRS_IDS.put("EZC_BTC", 47); - CURRENCY_PAIRS_IDS.put("EZC_LTC", 55); - CURRENCY_PAIRS_IDS.put("FFC_BTC", 138); - CURRENCY_PAIRS_IDS.put("FLAP_BTC", 165); - CURRENCY_PAIRS_IDS.put("FLO_LTC", 61); - CURRENCY_PAIRS_IDS.put("FRC_BTC", 39); - CURRENCY_PAIRS_IDS.put("FRK_BTC", 33); - CURRENCY_PAIRS_IDS.put("FST_BTC", 44); - CURRENCY_PAIRS_IDS.put("FST_LTC", 124); - CURRENCY_PAIRS_IDS.put("FTC_BTC", 5); - CURRENCY_PAIRS_IDS.put("GDC_BTC", 82); - CURRENCY_PAIRS_IDS.put("GLC_BTC", 76); - CURRENCY_PAIRS_IDS.put("GLD_BTC", 30); - CURRENCY_PAIRS_IDS.put("GLD_LTC", 36); - CURRENCY_PAIRS_IDS.put("GLX_BTC", 78); - CURRENCY_PAIRS_IDS.put("GME_LTC", 84); - CURRENCY_PAIRS_IDS.put("HBN_BTC", 80); - CURRENCY_PAIRS_IDS.put("IFC_BTC", 59); - CURRENCY_PAIRS_IDS.put("IFC_LTC", 60); - CURRENCY_PAIRS_IDS.put("IFC_XPM", 105); - CURRENCY_PAIRS_IDS.put("IXC_BTC", 38); - CURRENCY_PAIRS_IDS.put("JKC_BTC", 25); - CURRENCY_PAIRS_IDS.put("JKC_LTC", 35); - CURRENCY_PAIRS_IDS.put("KGC_BTC", 65); - CURRENCY_PAIRS_IDS.put("LEAF_BTC", 148); - CURRENCY_PAIRS_IDS.put("LK7_BTC", 116); - CURRENCY_PAIRS_IDS.put("LKY_BTC", 34); - CURRENCY_PAIRS_IDS.put("LOT_BTC", 137); - CURRENCY_PAIRS_IDS.put("LTC_BTC", 3); - CURRENCY_PAIRS_IDS.put("MAX_BTC", 152); - CURRENCY_PAIRS_IDS.put("MEC_BTC", 45); - CURRENCY_PAIRS_IDS.put("MEC_LTC", 100); - CURRENCY_PAIRS_IDS.put("MEM_LTC", 56); - CURRENCY_PAIRS_IDS.put("MEOW_BTC", 149); - CURRENCY_PAIRS_IDS.put("MINT_BTC", 156); - CURRENCY_PAIRS_IDS.put("MNC_BTC", 7); - CURRENCY_PAIRS_IDS.put("MOON_LTC", 145); - CURRENCY_PAIRS_IDS.put("MST_LTC", 62); - CURRENCY_PAIRS_IDS.put("MZC_BTC", 164); - CURRENCY_PAIRS_IDS.put("NAN_BTC", 64); - CURRENCY_PAIRS_IDS.put("NBL_BTC", 32); - CURRENCY_PAIRS_IDS.put("NEC_BTC", 90); - CURRENCY_PAIRS_IDS.put("NET_BTC", 134); - CURRENCY_PAIRS_IDS.put("NET_LTC", 108); - CURRENCY_PAIRS_IDS.put("NET_XPM", 104); - CURRENCY_PAIRS_IDS.put("NMC_BTC", 29); - CURRENCY_PAIRS_IDS.put("NRB_BTC", 54); - CURRENCY_PAIRS_IDS.put("NVC_BTC", 13); - CURRENCY_PAIRS_IDS.put("NXT_BTC", 159); - CURRENCY_PAIRS_IDS.put("NXT_LTC", 162); - CURRENCY_PAIRS_IDS.put("ORB_BTC", 75); - CURRENCY_PAIRS_IDS.put("OSC_BTC", 144); - CURRENCY_PAIRS_IDS.put("PHS_BTC", 86); - CURRENCY_PAIRS_IDS.put("POINTS_BTC", 120); - CURRENCY_PAIRS_IDS.put("PPC_BTC", 28); - CURRENCY_PAIRS_IDS.put("PPC_LTC", 125); - CURRENCY_PAIRS_IDS.put("PTS_BTC", 119); - CURRENCY_PAIRS_IDS.put("PXC_BTC", 31); - CURRENCY_PAIRS_IDS.put("PXC_LTC", 101); - CURRENCY_PAIRS_IDS.put("PYC_BTC", 92); - CURRENCY_PAIRS_IDS.put("QRK_BTC", 71); - CURRENCY_PAIRS_IDS.put("QRK_LTC", 126); - CURRENCY_PAIRS_IDS.put("RDD_BTC", 169); - CURRENCY_PAIRS_IDS.put("RED_LTC", 87); - CURRENCY_PAIRS_IDS.put("RPC_BTC", 143); - CURRENCY_PAIRS_IDS.put("RYC_BTC", 9); - CURRENCY_PAIRS_IDS.put("RYC_LTC", 37); - CURRENCY_PAIRS_IDS.put("SAT_BTC", 168); - CURRENCY_PAIRS_IDS.put("SBC_BTC", 51); - CURRENCY_PAIRS_IDS.put("SBC_LTC", 128); - CURRENCY_PAIRS_IDS.put("SMC_BTC", 158); - CURRENCY_PAIRS_IDS.put("SPT_BTC", 81); - CURRENCY_PAIRS_IDS.put("SRC_BTC", 88); - CURRENCY_PAIRS_IDS.put("STR_BTC", 83); - CURRENCY_PAIRS_IDS.put("SXC_BTC", 153); - CURRENCY_PAIRS_IDS.put("SXC_LTC", 98); - CURRENCY_PAIRS_IDS.put("TAG_BTC", 117); - CURRENCY_PAIRS_IDS.put("TAK_BTC", 166); - CURRENCY_PAIRS_IDS.put("TEK_BTC", 114); - CURRENCY_PAIRS_IDS.put("TGC_BTC", 130); - CURRENCY_PAIRS_IDS.put("TIPS_LTC", 147); - CURRENCY_PAIRS_IDS.put("TIX_LTC", 107); - CURRENCY_PAIRS_IDS.put("TIX_XPM", 103); - CURRENCY_PAIRS_IDS.put("TRC_BTC", 27); - CURRENCY_PAIRS_IDS.put("UNO_BTC", 133); - CURRENCY_PAIRS_IDS.put("UTC_BTC", 163); - CURRENCY_PAIRS_IDS.put("VTC_BTC", 151); - CURRENCY_PAIRS_IDS.put("WDC_BTC", 14); - CURRENCY_PAIRS_IDS.put("WDC_LTC", 21); - CURRENCY_PAIRS_IDS.put("XJO_BTC", 115); - CURRENCY_PAIRS_IDS.put("XNC_LTC", 67); - CURRENCY_PAIRS_IDS.put("XPM_BTC", 63); - CURRENCY_PAIRS_IDS.put("XPM_LTC", 106); - CURRENCY_PAIRS_IDS.put("YAC_BTC", 11); - CURRENCY_PAIRS_IDS.put("YAC_LTC", 22); - CURRENCY_PAIRS_IDS.put("YBC_BTC", 73); - CURRENCY_PAIRS_IDS.put("ZCC_BTC", 140); - CURRENCY_PAIRS_IDS.put("ZED_BTC", 170); - CURRENCY_PAIRS_IDS.put("ZET_BTC", 85); - CURRENCY_PAIRS_IDS.put("ZET_LTC", 127); - } - - public Cryptsy() { - super(NAME, TTS_NAME, null); - } - - @Override - public String getUrl(int requestId, CheckerInfo checkerInfo) { - if(checkerInfo.getCurrencyPairId()==null) { - final String pairString = String.format("%1$s_%2$s", checkerInfo.getCurrencyBase(), checkerInfo.getCurrencyCounter()); - if(CURRENCY_PAIRS_IDS.containsKey(pairString)) { - return String.format(URL, String.valueOf(CURRENCY_PAIRS_IDS.get(pairString))); - } - } - return String.format(URL, checkerInfo.getCurrencyPairId()); - } - - @Override - protected void parseTickerFromJsonObject(int requestId, JSONObject jsonObject, Ticker ticker, CheckerInfo checkerInfo) throws Exception { - final JSONObject dataJsonObject = jsonObject.getJSONObject("data"); - final JSONObject daySummaryObject = dataJsonObject.getJSONObject("24hr"); - - // ticker.vol = daySummaryObject.getDouble("volume"); TODO enable later when there will be any documentation of real data to test on - ticker.high = daySummaryObject.getDouble("price_high"); - ticker.low = daySummaryObject.getDouble("price_low"); - ticker.last = dataJsonObject.getJSONObject("last_trade").getDouble("price"); - } - - @Override - protected String parseError(int requestId, String responseString, CheckerInfo checkerInfo) throws Exception { - if(checkerInfo.getCurrencyPairId()==null) { - return "Perform sync and re-add this Checker"; - } - return super.parseError(requestId, responseString, checkerInfo); - } - - // ==================== - // Get currency pairs - // ==================== - @Override - public String getCurrencyPairsUrl(int requestId) { - return URL_CURRENCY_PAIRS; - } - - @Override - protected void parseCurrencyPairsFromJsonObject(int requestId, JSONObject jsonObject, List pairs) throws Exception { - final JSONArray dataJsonArray = jsonObject.getJSONArray("data"); - for(int i=0; i CURRENCY_PAIRS = new LinkedHashMap(); - static { - CURRENCY_PAIRS.put(VirtualCurrency.DASH, new String[]{ - Currency.PLN, - Currency.USD - }); - } - - public Dashcurex() { - super(NAME, TTS_NAME, CURRENCY_PAIRS); - } - - @Override - public String getUrl(int requestId, CheckerInfo checkerInfo) { - return String.format(URL, checkerInfo.getCurrencyCounterLowerCase()); - } - - @Override - protected void parseTickerFromJsonObject(int requestId, JSONObject jsonObject, Ticker ticker, CheckerInfo checkerInfo) throws Exception { - ticker.bid = parsePrice(jsonObject.getDouble("best_ask")); - ticker.ask = parsePrice(jsonObject.getDouble("best_bid")); - ticker.vol = parseBTC(jsonObject.getDouble("total_volume")); - ticker.high = parsePrice(jsonObject.getDouble("highest_tx_price")); - ticker.low = parsePrice(jsonObject.getDouble("lowest_tx_price")); - ticker.last = parsePrice(jsonObject.getDouble("last_tx_price")); - } - - private double parsePrice(double price) { - return price/10000; - } - - private double parseBTC(double satoshi) { - return satoshi/100000000; - } -} diff --git a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/DolarBlueNet.java b/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/DolarBlueNet.java deleted file mode 100644 index a5829c36..00000000 --- a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/DolarBlueNet.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.mobnetic.coinguardian.model.market; - -import java.util.HashMap; -import java.util.LinkedHashMap; - -import org.json.JSONObject; - -import com.mobnetic.coinguardian.model.CheckerInfo; -import com.mobnetic.coinguardian.model.Market; -import com.mobnetic.coinguardian.model.Ticker; -import com.mobnetic.coinguardian.model.currency.Currency; - -public class DolarBlueNet extends Market { - - private final static String NAME = "DolarBlue.net"; - private final static String TTS_NAME = "Dolar Blue"; - private final static String URL = "http://dolar.bitplanet.info/api.php"; - private final static HashMap CURRENCY_PAIRS = new LinkedHashMap(); - static { - CURRENCY_PAIRS.put(Currency.USD, new String[]{ - Currency.ARS - }); - } - - public DolarBlueNet() { - super(NAME, TTS_NAME, CURRENCY_PAIRS); - } - - @Override - public String getUrl(int requestId, CheckerInfo checkerInfo) { - return URL; - } - - @Override - protected void parseTickerFromJsonObject(int requestId, JSONObject jsonObject, Ticker ticker, CheckerInfo checkerInfo) throws Exception { - ticker.ask = jsonObject.getDouble("venta"); - ticker.bid = jsonObject.getDouble("compra"); - ticker.last = ticker.ask; - } -} diff --git a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/ETHEXIndia.java b/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/ETHEXIndia.java deleted file mode 100644 index 6ff0401f..00000000 --- a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/ETHEXIndia.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.mobnetic.coinguardian.model.market; - -import java.util.HashMap; -import java.util.LinkedHashMap; -import org.json.JSONObject; - -import com.mobnetic.coinguardian.model.CheckerInfo; -import com.mobnetic.coinguardian.model.Market; -import com.mobnetic.coinguardian.model.Ticker; -import com.mobnetic.coinguardian.model.currency.Currency; -import com.mobnetic.coinguardian.model.currency.VirtualCurrency; - -public class ETHEXIndia extends Market { - - private final static String NAME = "ETHEX India"; - private final static String TTS_NAME = NAME; - private final static String URL = "https://api.ethexindia.com/ticker/"; - private final static HashMap CURRENCY_PAIRS = new LinkedHashMap(); - static { - CURRENCY_PAIRS.put(VirtualCurrency.ETH, new String[]{ - Currency.INR - }); - } - - public ETHEXIndia() { - super(NAME, TTS_NAME, CURRENCY_PAIRS); - } - - @Override - public String getUrl(int requestId, CheckerInfo checkerInfo) { - return URL; - } - - @Override - protected void parseTickerFromJsonObject(int requestId, JSONObject jsonObject, Ticker ticker, CheckerInfo checkerInfo) throws Exception { - ticker.bid = jsonObject.getDouble("bid"); - ticker.ask = jsonObject.getDouble("ask"); - ticker.vol = jsonObject.getDouble("current_volume"); - ticker.high = jsonObject.getDouble("high"); - ticker.low = jsonObject.getDouble("low"); - ticker.last = jsonObject.getDouble("last_traded_price"); - ticker.timestamp = jsonObject.getLong("last_traded_time"); - } -} diff --git a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/Exmo.java b/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/Exmo.java deleted file mode 100644 index 24bda89f..00000000 --- a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/Exmo.java +++ /dev/null @@ -1,63 +0,0 @@ -package com.mobnetic.coinguardian.model.market; - -import com.mobnetic.coinguardian.model.CheckerInfo; -import com.mobnetic.coinguardian.model.CurrencyPairInfo; -import com.mobnetic.coinguardian.model.Market; -import com.mobnetic.coinguardian.model.Ticker; - -import org.json.JSONArray; -import org.json.JSONObject; - -import java.util.List; - -public class Exmo extends Market { - - private final static String NAME = "Exmo"; - private final static String TTS_NAME = NAME; - private final static String URL = "https://api.exmo.com/v1/ticker/"; - private final static String URL_CURRENCY_PAIRS = "https://api.exmo.com/v1/pair_settings/"; - - public Exmo() { - super(NAME, TTS_NAME, null); - } - - @Override - public String getUrl(int requestId, CheckerInfo checkerInfo) { - return URL; - } - - @Override - protected void parseTickerFromJsonObject(int requestId, JSONObject jsonObject, Ticker ticker, CheckerInfo checkerInfo) throws Exception { - final JSONObject pairJsonObject = jsonObject.getJSONObject(checkerInfo.getCurrencyBase()+"_"+checkerInfo.getCurrencyCounter()); - ticker.bid = pairJsonObject.getDouble("buy_price"); - ticker.ask = pairJsonObject.getDouble("sell_price"); - ticker.vol = pairJsonObject.getDouble("vol"); - ticker.high = pairJsonObject.getDouble("high"); - ticker.low = pairJsonObject.getDouble("low"); - ticker.last = pairJsonObject.getDouble("last_trade"); - } - - // ==================== - // Get currency pairs - // ==================== - @Override - public String getCurrencyPairsUrl(int requestId) { - return URL_CURRENCY_PAIRS; - } - - - @Override - protected void parseCurrencyPairsFromJsonObject(int requestId, JSONObject jsonObject, List pairs) throws Exception { - final JSONArray pairIds = jsonObject.names(); - for(int i=0; i CURRENCY_PAIRS = new LinkedHashMap(); - static { - CURRENCY_PAIRS.put(VirtualCurrency.KNC, new String[]{ - Currency.KRW - }); - } - - public FoscEx() { - super(NAME, TTS_NAME, CURRENCY_PAIRS); - } - - @Override - public String getUrl(int requestId, CheckerInfo checkerInfo) { - return URL; - } - - @Override - protected void parseTickerFromJsonObject(int requestId, JSONObject jsonObject, Ticker ticker, CheckerInfo checkerInfo) throws Exception { - ticker.vol = ParseUtils.getDoubleFromString(jsonObject, "volume"); - ticker.last = ParseUtils.getDoubleFromString(jsonObject, "last"); - ticker.timestamp = jsonObject.getLong("timestamp") * TimeUtils.MILLIS_IN_SECOND; - - } - - @Override - protected String parseErrorFromJsonObject(int requestId, JSONObject jsonObject, CheckerInfo checkerInfo) throws Exception { - return jsonObject.getString("error"); - } - -} diff --git a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/Fxbtc.java b/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/Fxbtc.java deleted file mode 100644 index 9ed08af3..00000000 --- a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/Fxbtc.java +++ /dev/null @@ -1,49 +0,0 @@ -package com.mobnetic.coinguardian.model.market; - -import java.util.HashMap; -import java.util.LinkedHashMap; -import org.json.JSONObject; - -import com.mobnetic.coinguardian.model.CheckerInfo; -import com.mobnetic.coinguardian.model.Market; -import com.mobnetic.coinguardian.model.Ticker; -import com.mobnetic.coinguardian.model.currency.Currency; -import com.mobnetic.coinguardian.model.currency.VirtualCurrency; - -public class Fxbtc extends Market { - - private final static String NAME = "FxBtc"; - private final static String TTS_NAME = NAME; - private final static String URL = "https://www.fxbtc.com/jport?op=query&type=ticker&symbol=%1$s_%2$s"; - private final static HashMap CURRENCY_PAIRS = new LinkedHashMap(); - static { - CURRENCY_PAIRS.put(VirtualCurrency.BTC, new String[]{ - Currency.CNY - }); - CURRENCY_PAIRS.put(VirtualCurrency.LTC, new String[]{ - Currency.CNY, - VirtualCurrency.BTC - }); - } - - public Fxbtc() { - super(NAME, TTS_NAME, CURRENCY_PAIRS); - } - - @Override - public String getUrl(int requestId, CheckerInfo checkerInfo) { - return String.format(URL, checkerInfo.getCurrencyBaseLowerCase(), checkerInfo.getCurrencyCounterLowerCase()); - } - - @Override - protected void parseTickerFromJsonObject(int requestId, JSONObject jsonObject, Ticker ticker, CheckerInfo checkerInfo) throws Exception { - final JSONObject tickerObject = jsonObject.getJSONObject("ticker"); - - ticker.bid = tickerObject.getDouble("bid"); - ticker.ask = tickerObject.getDouble("ask"); - ticker.vol = tickerObject.getDouble("vol"); - ticker.high = tickerObject.getDouble("high"); - ticker.low = tickerObject.getDouble("low"); - ticker.last = tickerObject.getDouble("last_rate"); - } -} diff --git a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/FybSE.java b/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/FybSE.java deleted file mode 100644 index c9d670ec..00000000 --- a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/FybSE.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.mobnetic.coinguardian.model.market; - -import java.util.HashMap; -import java.util.LinkedHashMap; -import org.json.JSONObject; - -import com.mobnetic.coinguardian.model.CheckerInfo; -import com.mobnetic.coinguardian.model.Market; -import com.mobnetic.coinguardian.model.Ticker; -import com.mobnetic.coinguardian.model.currency.Currency; -import com.mobnetic.coinguardian.model.currency.VirtualCurrency; - -public class FybSE extends Market { - - private final static String NAME = "FYB-SE"; - private final static String TTS_NAME = "Fyb SE"; - private final static String URL = "https://www.fybse.se/api/%1$s/ticker.json"; - - private final static HashMap CURRENCY_PAIRS = new LinkedHashMap(); - static { - CURRENCY_PAIRS.put(VirtualCurrency.BTC, new String[]{ - Currency.SEK - }); - } - - public FybSE() { - super(NAME, TTS_NAME, CURRENCY_PAIRS); - } - - @Override - public String getUrl(int requestId, CheckerInfo checkerInfo) { - return String.format(URL, checkerInfo.getCurrencyCounter()); - } - - @Override - protected void parseTickerFromJsonObject(int requestId, JSONObject jsonObject, Ticker ticker, CheckerInfo checkerInfo) throws Exception { - ticker.bid = jsonObject.getDouble("bid"); - ticker.ask = jsonObject.getDouble("ask"); - ticker.last = ticker.ask; - } -} diff --git a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/FybSG.java b/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/FybSG.java deleted file mode 100644 index 1945de78..00000000 --- a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/FybSG.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.mobnetic.coinguardian.model.market; - -import java.util.HashMap; -import java.util.LinkedHashMap; -import org.json.JSONObject; - -import com.mobnetic.coinguardian.model.CheckerInfo; -import com.mobnetic.coinguardian.model.Market; -import com.mobnetic.coinguardian.model.Ticker; -import com.mobnetic.coinguardian.model.currency.Currency; -import com.mobnetic.coinguardian.model.currency.VirtualCurrency; - -public class FybSG extends Market { - - private final static String NAME = "FYB-SG"; - private final static String TTS_NAME = "Fyb SG"; - private final static String URL = "https://www.fybsg.com/api/%1$s/ticker.json"; - - private final static HashMap CURRENCY_PAIRS = new LinkedHashMap(); - static { - CURRENCY_PAIRS.put(VirtualCurrency.BTC, new String[]{ - Currency.SGD - }); - } - - public FybSG() { - super(NAME, TTS_NAME, CURRENCY_PAIRS); - } - - @Override - public String getUrl(int requestId, CheckerInfo checkerInfo) { - return String.format(URL, checkerInfo.getCurrencyCounter()); - } - - @Override - protected void parseTickerFromJsonObject(int requestId, JSONObject jsonObject, Ticker ticker, CheckerInfo checkerInfo) throws Exception { - ticker.bid = jsonObject.getDouble("bid"); - ticker.ask = jsonObject.getDouble("ask"); - ticker.last = ticker.ask; - } -} diff --git a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/GateCoin.java b/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/GateCoin.java deleted file mode 100644 index ff94a318..00000000 --- a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/GateCoin.java +++ /dev/null @@ -1,74 +0,0 @@ -package com.mobnetic.coinguardian.model.market; - -import com.mobnetic.coinguardian.model.CheckerInfo; -import com.mobnetic.coinguardian.model.CurrencyPairInfo; -import com.mobnetic.coinguardian.model.Market; -import com.mobnetic.coinguardian.model.Ticker; - -import org.json.JSONArray; -import org.json.JSONObject; - -import java.util.List; - -public class GateCoin extends Market { - - private final static String NAME = "GateCoin"; - private final static String TTS_NAME = "Gate Coin"; - private final static String URL = "https://api.gatecoin.com/Public/LiveTickers"; - - public GateCoin() { - super(NAME, TTS_NAME, null); - } - - @Override - public String getUrl(int requestId, CheckerInfo checkerInfo) { - return URL; - } - - @Override - protected void parseTickerFromJsonObject(int requestId, JSONObject jsonObject, Ticker ticker, CheckerInfo checkerInfo) throws Exception { - final JSONArray pairNames = jsonObject.getJSONArray("tickers"); //returned JSON text is an ARRAY of JSONObjects - String userCurrencyPairChoice = checkerInfo.getCurrencyBase().concat(checkerInfo.getCurrencyCounter()); - //each JSONObject in the Array has a currency pair and its corresponding ticker details - for (int i = 0; i < pairNames.length(); ++i) { - JSONObject tickerDetails = pairNames.getJSONObject(i); - String currentPairId = tickerDetails.getString("currencyPair"); - if (currentPairId.equals(userCurrencyPairChoice)) { - ticker.bid = tickerDetails.getDouble("bid"); - ticker.ask = tickerDetails.getDouble("ask"); - ticker.vol = tickerDetails.getDouble("volume"); - ticker.high = tickerDetails.getDouble("high"); - ticker.low = tickerDetails.getDouble("low"); - ticker.last = tickerDetails.getDouble("last"); - ticker.timestamp = tickerDetails.getLong("createDateTime"); - break; - } - } - } - - // ==================== - // Get currency pairs - // ==================== - @Override - public String getCurrencyPairsUrl(int requestId) { - return URL; - } - - @Override - protected void parseCurrencyPairsFromJsonObject(int requestId, JSONObject jsonObject, List pairs) throws Exception { - final JSONArray pairNames = jsonObject.getJSONArray("tickers"); //returned JSON text is an ARRAY of JSONObjects - for (int i = 0; i < pairNames.length(); ++i) { - //each JSONObject in the Array has a currency pair and its corresponding ticker details - String pairId = pairNames.getJSONObject(i).getString("currencyPair"); - if (pairId == null) - continue; - String[] currencies = new String[2]; - //split by index - use char positions (start, end+1) as index - currencies[0] = pairId.substring(0, 3); //base currency - currencies[1] = pairId.substring(3, 6); //counter currency - if (currencies.length != 2) - continue; - pairs.add(new CurrencyPairInfo(currencies[0], currencies[1], pairId)); - } - } -} diff --git a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/Gemini.java b/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/Gemini.java deleted file mode 100644 index 92eb2592..00000000 --- a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/Gemini.java +++ /dev/null @@ -1,71 +0,0 @@ -package com.mobnetic.coinguardian.model.market; - -import java.util.HashMap; -import java.util.LinkedHashMap; - -import org.json.JSONArray; -import org.json.JSONObject; - -import com.mobnetic.coinguardian.model.CheckerInfo; -import com.mobnetic.coinguardian.model.Market; -import com.mobnetic.coinguardian.model.Ticker; - -import com.mobnetic.coinguardian.model.currency.Currency; -import com.mobnetic.coinguardian.model.currency.VirtualCurrency; - -public class Gemini extends Market { - - private final static String NAME = "Gemini"; - private final static String TTS_NAME = "Gemini"; - private final static String URL = "https://api.gemini.com/v1/book/%1$s%2$s?limit_asks=1&limit_bids=1"; - private final static HashMap CURRENCY_PAIRS = new LinkedHashMap(); - - // Gemini allows dynamic symbol retrieval but returns it in format: [ "btcusd" ] - // This doesn't provide an easy way to programmatically split the currency - // So just define them - static { - CURRENCY_PAIRS.put(VirtualCurrency.BTC, new String[]{ - Currency.USD - }); - CURRENCY_PAIRS.put(VirtualCurrency.ETH, new String[]{ - VirtualCurrency.BTC, - Currency.USD - }); - } - - public Gemini() { - super(NAME, TTS_NAME, CURRENCY_PAIRS); - } - - @Override - public String getUrl(int requestId, CheckerInfo checkerInfo) { - return String.format(URL, checkerInfo.getCurrencyBase(), checkerInfo.getCurrencyCounter()); - } - - @Override - protected void parseTickerFromJsonObject(int requestId, JSONObject jsonObject, Ticker ticker, CheckerInfo checkerInfo) throws Exception { - //Gemini isn't a traditional tracker, rather it seems to return the X last bids and asks - //We could do something like take the average of the last Y prices - //But I will just take the average of the last bid and asking price - - final JSONArray bidsArray = jsonObject.getJSONArray("bids"); - if (bidsArray != null && bidsArray.length() > 0) { - ticker.bid = bidsArray.getJSONObject(0).getDouble("price"); - } - - final JSONArray asksArray = jsonObject.getJSONArray("asks"); - if (asksArray != null && asksArray.length() > 0) { - ticker.ask = asksArray.getJSONObject(0).getDouble("price"); - } - - if (ticker.bid != Ticker.NO_DATA && ticker.ask != Ticker.NO_DATA) { - ticker.last = (ticker.bid + ticker.ask) / 2.0; - } else if (ticker.bid != Ticker.NO_DATA) { - ticker.last = ticker.bid; - } else if (ticker.ask != Ticker.NO_DATA) { - ticker.last = ticker.ask; - } else { - ticker.last = 0; - } - } -} diff --git a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/HitBtc.java b/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/HitBtc.java deleted file mode 100644 index d28d7550..00000000 --- a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/HitBtc.java +++ /dev/null @@ -1,63 +0,0 @@ -package com.mobnetic.coinguardian.model.market; - -import java.util.List; - -import org.json.JSONArray; -import org.json.JSONObject; - -import com.mobnetic.coinguardian.model.CheckerInfo; -import com.mobnetic.coinguardian.model.CurrencyPairInfo; -import com.mobnetic.coinguardian.model.Market; -import com.mobnetic.coinguardian.model.Ticker; -import com.mobnetic.coinguardian.util.ParseUtils; - -public class HitBtc extends Market { - - private final static String NAME = "HitBTC"; - private final static String TTS_NAME = "Hit BTC"; - private final static String URL = "https://api.hitbtc.com/api/1/public/%1$s/ticker"; - private final static String URL_CURRENCY_PAIRS = "https://api.hitbtc.com/api/1/public/symbols"; - - public HitBtc() { - super(NAME, TTS_NAME, null); - } - - @Override - public String getUrl(int requestId, CheckerInfo checkerInfo) { - return String.format(URL, checkerInfo.getCurrencyPairId()); - } - - @Override - protected void parseTickerFromJsonObject(int requestId, JSONObject jsonObject, Ticker ticker, CheckerInfo checkerInfo) throws Exception { - ticker.bid = ParseUtils.getDoubleFromString(jsonObject, "bid"); - ticker.ask = ParseUtils.getDoubleFromString(jsonObject, "ask"); - ticker.vol = ParseUtils.getDoubleFromString(jsonObject, "volume"); - ticker.high = ParseUtils.getDoubleFromString(jsonObject, "high"); - ticker.low = ParseUtils.getDoubleFromString(jsonObject, "low"); - ticker.last = ParseUtils.getDoubleFromString(jsonObject, "last"); - } - - // ==================== - // Get currency pairs - // ==================== - @Override - public String getCurrencyPairsUrl(int requestId) { - return URL_CURRENCY_PAIRS; - } - - @Override - protected void parseCurrencyPairsFromJsonObject(int requestId, JSONObject jsonObject, List pairs) throws Exception { - final JSONArray symbolsJsonArray = jsonObject.getJSONArray("symbols"); - for(int i=0; i pairs) throws Exception { - if("ok".equalsIgnoreCase(jsonObject.getString("status"))) { - final JSONArray data = jsonObject.getJSONArray("data"); - for(int i = 0; i < data.length(); i++) { - final String base = data.getJSONObject(i).getString("base-currency").toUpperCase(Locale.US); - final String counter = data.getJSONObject(i).getString("quote-currency").toUpperCase(Locale.US); - pairs.add(new CurrencyPairInfo(base, counter, null)); - } - } else { - throw new Exception("Parse currency pairs error."); - } - } -} diff --git a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/Igot.java b/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/Igot.java deleted file mode 100644 index d1bd8659..00000000 --- a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/Igot.java +++ /dev/null @@ -1,60 +0,0 @@ -package com.mobnetic.coinguardian.model.market; - -import java.util.List; -import java.util.Locale; - -import org.json.JSONArray; -import org.json.JSONObject; - -import com.mobnetic.coinguardian.model.CheckerInfo; -import com.mobnetic.coinguardian.model.CurrencyPairInfo; -import com.mobnetic.coinguardian.model.Market; -import com.mobnetic.coinguardian.model.Ticker; -import com.mobnetic.coinguardian.model.currency.VirtualCurrency; - -public class Igot extends Market { - - private final static String NAME = "igot"; - private final static String TTS_NAME = "igot"; - private final static String URL = "https://www.igot.com/api/v1/stats/buy"; - private final static String URL_CURRENCY_PAIRS = URL; - - public Igot() { - super(NAME, TTS_NAME, null); - } - - @Override - public String getUrl(int requestId, CheckerInfo checkerInfo) { - return URL; - } - - @Override - protected void parseTickerFromJsonObject(int requestId, JSONObject jsonObject, Ticker ticker, CheckerInfo checkerInfo) throws Exception { - final JSONObject pairJsonObject = jsonObject.getJSONObject(checkerInfo.getCurrencyPairId()); - ticker.high = pairJsonObject.getDouble("highest_today"); - ticker.low = pairJsonObject.getDouble("lowest_today"); - ticker.last = pairJsonObject.getDouble("current_rate"); - } - - // ==================== - // Get currency pairs - // ==================== - @Override - public String getCurrencyPairsUrl(int requestId) { - return URL_CURRENCY_PAIRS; - } - - @Override - protected void parseCurrencyPairsFromJsonObject(int requestId, JSONObject jsonObject, List pairs) throws Exception { - final JSONArray pairsJsonArray = jsonObject.names(); - for(int i=0; i CURRENCY_PAIRS = new LinkedHashMap(); - static { - CURRENCY_PAIRS.put(VirtualCurrency.BTC, new String[]{ - Currency.USD, - Currency.SGD, - Currency.EUR - }); - } - - public ItBit() { - super(NAME, TTS_NAME, CURRENCY_PAIRS); - } - - private String fixCurrency(String currency) { - if (VirtualCurrency.BTC.equals(currency)) return VirtualCurrency.XBT; - return currency; - } - - @Override - public String getUrl(int requestId, CheckerInfo checkerInfo) { - return String.format(URL, fixCurrency(checkerInfo.getCurrencyBase()), checkerInfo.getCurrencyCounter()); - } - - @Override - protected void parseTickerFromJsonObject(int requestId, JSONObject jsonObject, Ticker ticker, CheckerInfo checkerInfo) throws Exception { - ticker.bid = jsonObject.getDouble("bid"); - ticker.ask = jsonObject.getDouble("ask"); - ticker.vol = jsonObject.getDouble("volume24h"); - ticker.high = jsonObject.getDouble("high24h"); - ticker.low = jsonObject.getDouble("low24h"); - ticker.last = jsonObject.getDouble("lastPrice"); - } - - @Override - protected String parseErrorFromJsonObject(int requestId, JSONObject jsonObject, CheckerInfo checkerInfo) throws Exception { - return jsonObject.getString("message"); // not working? - } -} diff --git a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/Justcoin.java b/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/Justcoin.java deleted file mode 100644 index 6c509a75..00000000 --- a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/Justcoin.java +++ /dev/null @@ -1,72 +0,0 @@ -package com.mobnetic.coinguardian.model.market; - -import java.util.HashMap; -import java.util.LinkedHashMap; - -import org.json.JSONObject; - -import com.mobnetic.coinguardian.model.CheckerInfo; -import com.mobnetic.coinguardian.model.Market; -import com.mobnetic.coinguardian.model.Ticker; -import com.mobnetic.coinguardian.model.currency.Currency; -import com.mobnetic.coinguardian.model.currency.VirtualCurrency; - -public class Justcoin extends Market { - - private final static String NAME = "Justcoin"; - private final static String TTS_NAME = "Just coin"; - private final static String URL = "https://justcoin.com/api/2/%1$s%2$s/money/ticker"; - private final static HashMap CURRENCY_PAIRS = new LinkedHashMap(); - static { - CURRENCY_PAIRS.put(VirtualCurrency.BTC, new String[]{ - Currency.USD, - Currency.EUR, - Currency.GBP, - Currency.HKD, - Currency.CHF, - Currency.AUD, - Currency.CAD, - Currency.NZD, - Currency.SGD, - Currency.JPY - }); - CURRENCY_PAIRS.put(VirtualCurrency.LTC, new String[]{ - VirtualCurrency.BTC - }); - CURRENCY_PAIRS.put(VirtualCurrency.DOGE, new String[]{ - VirtualCurrency.BTC - }); - CURRENCY_PAIRS.put(VirtualCurrency.STR, new String[]{ - VirtualCurrency.BTC - }); - CURRENCY_PAIRS.put(VirtualCurrency.XRP, new String[]{ - VirtualCurrency.BTC - }); - } - - public Justcoin() { - super(NAME, TTS_NAME, CURRENCY_PAIRS); - } - - @Override - public String getUrl(int requestId, CheckerInfo checkerInfo) { - return String.format(URL, checkerInfo.getCurrencyBase(), checkerInfo.getCurrencyCounter()); - } - - @Override - protected void parseTickerFromJsonObject(int requestId, JSONObject jsonObject, Ticker ticker, CheckerInfo checkerInfo) throws Exception { - final JSONObject dataObject = jsonObject.getJSONObject("data"); - - ticker.bid = getPriceValueFromObject(dataObject, "buy"); - ticker.ask = getPriceValueFromObject(dataObject, "sell"); - ticker.vol = getPriceValueFromObject(dataObject, "vol"); - ticker.high = getPriceValueFromObject(dataObject, "high"); - ticker.low = getPriceValueFromObject(dataObject, "low"); - ticker.last = getPriceValueFromObject(dataObject, "last"); - } - - private double getPriceValueFromObject(JSONObject jsonObject, String key) throws Exception { - final JSONObject innerObject = jsonObject.getJSONObject(key); - return innerObject.getDouble("value"); - } -} diff --git a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/Koinex.java b/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/Koinex.java deleted file mode 100644 index 2e887842..00000000 --- a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/Koinex.java +++ /dev/null @@ -1,59 +0,0 @@ -package com.mobnetic.coinguardian.model.market; - -import com.mobnetic.coinguardian.model.CheckerInfo; -import com.mobnetic.coinguardian.model.CurrencyPairInfo; -import com.mobnetic.coinguardian.model.Market; -import com.mobnetic.coinguardian.model.Ticker; -import com.mobnetic.coinguardian.model.currency.Currency; - -import org.json.JSONArray; -import org.json.JSONObject; - -import java.util.List; - -public class Koinex extends Market { - - private final static String NAME = "Koinex"; - private final static String TTS_NAME = "Koin ex"; - private final static String URL = "https://koinex.in/api/ticker"; - private final static String URL_CURRENCY_PAIRS = URL; - - public Koinex() { - super(NAME, TTS_NAME, null); - } - - @Override - public String getUrl(int requestId, CheckerInfo checkerInfo) { - return URL; - } - - @Override - protected void parseTickerFromJsonObject(int requestId, JSONObject jsonObject, Ticker ticker, CheckerInfo checkerInfo) throws Exception { - final JSONObject names = jsonObject.getJSONObject("stats"); - JSONObject tickerJsonObject = names.getJSONObject(checkerInfo.getCurrencyBase()); - ticker.bid = tickerJsonObject.getDouble("highest_bid"); - ticker.ask = tickerJsonObject.getDouble("lowest_ask"); - ticker.vol = tickerJsonObject.getDouble("vol_24hrs"); - ticker.high = tickerJsonObject.getDouble("max_24hrs"); - ticker.low = tickerJsonObject.getDouble("min_24hrs"); - ticker.last = tickerJsonObject.getDouble("last_traded_price"); - } - - // ==================== - // Get currency pairs - // ==================== - @Override - public String getCurrencyPairsUrl(int requestId) { - return URL_CURRENCY_PAIRS; - } - - @Override - protected void parseCurrencyPairsFromJsonObject(int requestId, JSONObject jsonObject, List pairs) throws Exception { - final JSONObject currencyJSONObject = jsonObject.getJSONObject("stats"); - final JSONArray currencyArray = currencyJSONObject.names(); - for(int i=0; i CURRENCY_PAIRS = new LinkedHashMap(); - static { - CURRENCY_PAIRS.put(VirtualCurrency.BTC, new String[]{ - Currency.TRY - }); - CURRENCY_PAIRS.put(VirtualCurrency.LTC, new String[]{ - Currency.TRY - }); - } - - public Koinim() { - super(NAME, TTS_NAME, CURRENCY_PAIRS); - } - - @Override - public String getUrl(int requestId, CheckerInfo checkerInfo) { - if(VirtualCurrency.LTC.equals(checkerInfo.getCurrencyBase())) { - return URL_LTC; - } - return URL_BTC; - } - - @Override - protected void parseTickerFromJsonObject(int requestId, JSONObject jsonObject, Ticker ticker, CheckerInfo checkerInfo) throws Exception { - ticker.bid = jsonObject.getDouble("buy"); - ticker.ask = jsonObject.getDouble("sell"); - ticker.vol = jsonObject.getDouble("volume"); - ticker.high = jsonObject.getDouble("high"); - ticker.low = jsonObject.getDouble("low"); - ticker.last = jsonObject.getDouble("last_order"); - } -} diff --git a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/Korbit.java b/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/Korbit.java deleted file mode 100644 index b9416d8a..00000000 --- a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/Korbit.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.mobnetic.coinguardian.model.market; - -import com.mobnetic.coinguardian.model.CheckerInfo; -import com.mobnetic.coinguardian.model.Market; -import com.mobnetic.coinguardian.model.Ticker; -import com.mobnetic.coinguardian.model.currency.Currency; -import com.mobnetic.coinguardian.model.currency.VirtualCurrency; - -import org.json.JSONObject; - -import java.util.HashMap; -import java.util.LinkedHashMap; - -public class Korbit extends Market { - - private final static String NAME = "Korbit"; - private final static String TTS_NAME = NAME; - private final static String URL = "https://api.korbit.co.kr/v1/ticker/detailed?currency_pair=%1$s_%2$s"; - private final static HashMap CURRENCY_PAIRS = new LinkedHashMap<>(); - static { - CURRENCY_PAIRS.put(VirtualCurrency.BTC, new String[]{ - Currency.KRW - }); - CURRENCY_PAIRS.put(VirtualCurrency.ETH, new String[]{ - Currency.KRW - }); - CURRENCY_PAIRS.put(VirtualCurrency.ETC, new String[]{ - Currency.KRW - }); - CURRENCY_PAIRS.put(VirtualCurrency.XRP, new String[]{ - Currency.KRW - }); - } - - public Korbit() { - super(NAME, TTS_NAME, CURRENCY_PAIRS); - } - - @Override - public String getUrl(int requestId, CheckerInfo checkerInfo) { - return String.format(URL, checkerInfo.getCurrencyBaseLowerCase(), - checkerInfo.getCurrencyCounterLowerCase()); - } - - @Override - protected void parseTickerFromJsonObject(int requestId, JSONObject jsonObject, Ticker ticker, CheckerInfo checkerInfo) throws Exception { - ticker.bid = jsonObject.getDouble("bid"); - ticker.ask = jsonObject.getDouble("ask"); - ticker.vol = jsonObject.getDouble("volume"); - ticker.high = jsonObject.getDouble("high"); - ticker.low = jsonObject.getDouble("low"); - ticker.last = jsonObject.getDouble("last"); - ticker.timestamp = jsonObject.getLong("timestamp"); - } -} \ No newline at end of file diff --git a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/Kraken.java b/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/Kraken.java deleted file mode 100644 index 5c93c185..00000000 --- a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/Kraken.java +++ /dev/null @@ -1,99 +0,0 @@ -package com.mobnetic.coinguardian.model.market; - -import com.mobnetic.coinguardian.model.CheckerInfo; -import com.mobnetic.coinguardian.model.CurrencyPairInfo; -import com.mobnetic.coinguardian.model.Market; -import com.mobnetic.coinguardian.model.Ticker; -import com.mobnetic.coinguardian.model.currency.VirtualCurrency; - -import org.json.JSONArray; -import org.json.JSONObject; - -import java.util.List; - -public class Kraken extends Market { - - private final static String NAME = "Kraken"; - private final static String TTS_NAME = NAME; - private final static String URL = "https://api.kraken.com/0/public/Ticker?pair=%1$s"; - private final static String URL_CURRENCY_PAIRS = "https://api.kraken.com/0/public/AssetPairs"; - - public Kraken() { - super(NAME, TTS_NAME, null); - } - - @Override - public String getUrl(int requestId, CheckerInfo checkerInfo) { - if(checkerInfo.getCurrencyPairId()!=null) { - return String.format(URL, checkerInfo.getCurrencyPairId()); - } else { - final String currencyBase = fixCurrency(checkerInfo.getCurrencyBase()); - final String currencyCounter = fixCurrency(checkerInfo.getCurrencyCounter()); - return String.format(URL, currencyBase+currencyCounter); - } - } - - private String fixCurrency(String currency) { - if (VirtualCurrency.BTC.equals(currency)) return VirtualCurrency.XBT; - if (VirtualCurrency.VEN.equals(currency)) return VirtualCurrency.XVN; - if (VirtualCurrency.DOGE.equals(currency)) return VirtualCurrency.XDG; - return currency; - } - - @Override - protected void parseTickerFromJsonObject(int requestId, JSONObject jsonObject, Ticker ticker, CheckerInfo checkerInfo) throws Exception { - final JSONObject resultObject = jsonObject.getJSONObject("result"); - final JSONObject pairObject = resultObject.getJSONObject(resultObject.names().getString(0)); - - ticker.bid = getDoubleFromJsonArrayObject(pairObject, "b"); - ticker.ask = getDoubleFromJsonArrayObject(pairObject, "a"); - ticker.vol = getDoubleFromJsonArrayObject(pairObject, "v"); - ticker.high = getDoubleFromJsonArrayObject(pairObject, "h"); - ticker.low = getDoubleFromJsonArrayObject(pairObject, "l"); - ticker.last = getDoubleFromJsonArrayObject(pairObject, "c"); - } - - private double getDoubleFromJsonArrayObject(JSONObject jsonObject, String arrayKey) throws Exception { - final JSONArray jsonArray = jsonObject.getJSONArray(arrayKey); - return jsonArray!=null && jsonArray.length()>0 ? jsonArray.getDouble(0) : 0; - } - - // ==================== - // Get currency pairs - // ==================== - @Override - public String getCurrencyPairsUrl(int requestId) { - return URL_CURRENCY_PAIRS; - } - - @Override - protected void parseCurrencyPairsFromJsonObject(int requestId, JSONObject jsonObject, List pairs) throws Exception { - final JSONObject result = jsonObject.getJSONObject("result"); - final JSONArray pairNames = result.names(); - - for(int i=0; i=2) { - final char firstChar = currency.charAt(0); - if (firstChar == 'Z' || firstChar == 'X') { - currency = currency.substring(1); - } - } - if (VirtualCurrency.XBT.equals(currency)) return VirtualCurrency.BTC; - if (VirtualCurrency.XVN.equals(currency)) return VirtualCurrency.VEN; - if (VirtualCurrency.XDG.equals(currency)) return VirtualCurrency.DOGE; - return currency; - } -} diff --git a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/Kucoin.java b/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/Kucoin.java deleted file mode 100644 index 021add3d..00000000 --- a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/Kucoin.java +++ /dev/null @@ -1,70 +0,0 @@ -package com.mobnetic.coinguardian.model.market; - -import com.mobnetic.coinguardian.model.CheckerInfo; -import com.mobnetic.coinguardian.model.CurrencyPairInfo; -import com.mobnetic.coinguardian.model.Market; -import com.mobnetic.coinguardian.model.Ticker; -import com.mobnetic.coinguardian.model.currency.Currency; -import com.mobnetic.coinguardian.model.currency.VirtualCurrency; - -import org.json.JSONArray; -import org.json.JSONObject; - -import java.util.HashMap; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Locale; - - -public class Kucoin extends Market { - - private final static String NAME = "Kucoin"; - private final static String TTS_NAME = NAME; - private final static String URL = "https://api.kucoin.com/api/v1/market/stats?symbol=%1$s"; - - private final static String URL_COINS_PAIRS = "https://api.kucoin.com/api/v1/symbols"; - - public Kucoin() { - super(NAME, TTS_NAME, null); - } - - @Override - public String getUrl(int requestId, CheckerInfo checkerInfo) { - return String.format(URL, checkerInfo.getCurrencyPairId()); - } - - @Override - protected void parseTickerFromJsonObject(int requestId, JSONObject jsonObject, Ticker ticker, CheckerInfo checkerInfo) throws Exception { - JSONObject tickerJsonObject = jsonObject.getJSONObject("data"); - ticker.bid = tickerJsonObject.getDouble("buy"); - ticker.ask = tickerJsonObject.getDouble("sell"); - ticker.vol = tickerJsonObject.getDouble("vol"); - ticker.high = tickerJsonObject.getDouble("high"); - ticker.low = tickerJsonObject.getDouble("low"); - ticker.last = tickerJsonObject.getDouble("last"); - ticker.timestamp = tickerJsonObject.getLong("time"); - } - - // ==================== - // Get currency pairs - // ==================== - @Override - public String getCurrencyPairsUrl(int requestId) { - return URL_COINS_PAIRS; - } - - @Override - protected void parseCurrencyPairsFromJsonObject(int requestId, JSONObject jsonObject, List pairs) throws Exception { - final JSONArray data = jsonObject.getJSONArray("data"); - - for(int i=0; i< data.length(); ++i) { - final JSONObject pairJsonObject = data.getJSONObject(i); - pairs.add(new CurrencyPairInfo( - pairJsonObject.getString("baseCurrency"), - pairJsonObject.getString("quoteCurrency"), - pairJsonObject.getString("symbol") - )); - } - } - -} diff --git a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/LakeBTC.java b/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/LakeBTC.java deleted file mode 100644 index e47b4bf6..00000000 --- a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/LakeBTC.java +++ /dev/null @@ -1,67 +0,0 @@ -package com.mobnetic.coinguardian.model.market; - -import java.util.List; -import java.util.Locale; - -import org.json.JSONArray; -import org.json.JSONObject; - -import com.mobnetic.coinguardian.model.CheckerInfo; -import com.mobnetic.coinguardian.model.CurrencyPairInfo; -import com.mobnetic.coinguardian.model.Market; -import com.mobnetic.coinguardian.model.Ticker; -import com.mobnetic.coinguardian.model.currency.VirtualCurrency; - -public class LakeBTC extends Market { - - private final static String NAME = "LakeBTC"; - private final static String TTS_NAME = "Lake BTC"; - private final static String URL = "https://api.lakebtc.com/api_v2/ticker"; - private final static String URL_CURRENCY_PAIRS = URL; - - public LakeBTC() { - super(NAME, TTS_NAME, null); - } - - @Override - public String getUrl(int requestId, CheckerInfo checkerInfo) { - return URL; - } - - @Override - protected void parseTickerFromJsonObject(int requestId, JSONObject jsonObject, Ticker ticker, CheckerInfo checkerInfo) throws Exception { - final String pairId; - if (checkerInfo.getCurrencyPairId() == null) { - pairId = checkerInfo.getCurrencyBaseLowerCase() + checkerInfo.getCurrencyCounterLowerCase(); - } else { - pairId = checkerInfo.getCurrencyPairId(); - } - final JSONObject pairJsonObject = jsonObject.getJSONObject(pairId); - - ticker.bid = pairJsonObject.getDouble("bid"); - ticker.ask = pairJsonObject.getDouble("ask"); - ticker.vol = pairJsonObject.getDouble("volume"); - ticker.high = pairJsonObject.getDouble("high"); - ticker.low = pairJsonObject.getDouble("low"); - ticker.last = pairJsonObject.getDouble("last"); - } - - // ==================== - // Get currency pairs - // ==================== - @Override - public String getCurrencyPairsUrl(int requestId) { - return URL_CURRENCY_PAIRS; - } - - @Override - protected void parseCurrencyPairsFromJsonObject(int requestId, JSONObject jsonObject, List pairs) throws Exception { - final JSONArray pairsJsonArray = jsonObject.names(); - for(int i=0; i pairs) throws Exception { - final JSONObject pairsJsonObject = jsonObject.getJSONObject("pairs"); - final JSONArray pairsNames = pairsJsonObject.names(); - for(int i=0; i pairs) throws Exception { - final JSONArray tickerArray = new JSONArray(responseString); - - for(int i = 0; i < tickerArray.length(); ++i) { - final JSONObject tickerRow = tickerArray.getJSONObject(i); - final String symbol = tickerRow.getString("symbol"); - final String[] currencyNames = symbol.split("/"); - - if(currencyNames != null && currencyNames.length >= 2) { - pairs.add(new CurrencyPairInfo( - currencyNames[0], - currencyNames[1], - symbol)); - } - } - } -} diff --git a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/LocalBitcoins.java b/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/LocalBitcoins.java deleted file mode 100644 index a4b06ba9..00000000 --- a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/LocalBitcoins.java +++ /dev/null @@ -1,59 +0,0 @@ -package com.mobnetic.coinguardian.model.market; - -import java.util.List; - -import org.json.JSONArray; -import org.json.JSONObject; - -import com.mobnetic.coinguardian.model.CheckerInfo; -import com.mobnetic.coinguardian.model.CurrencyPairInfo; -import com.mobnetic.coinguardian.model.Market; -import com.mobnetic.coinguardian.model.Ticker; -import com.mobnetic.coinguardian.model.currency.VirtualCurrency; - -public class LocalBitcoins extends Market { - - private final static String NAME = "LocalBitcoins"; - private final static String TTS_NAME = "Local Bitcoins"; - private final static String URL = "https://localbitcoins.com/bitcoinaverage/ticker-all-currencies/"; - private final static String URL_CURRENCY_PAIRS = URL; - - public LocalBitcoins() { - super(NAME, TTS_NAME, null); - } - - @Override - public String getUrl(int requestId, CheckerInfo checkerInfo) { - return URL; - } - - @Override - protected void parseTickerFromJsonObject(int requestId, JSONObject jsonObject, Ticker ticker, CheckerInfo checkerInfo) throws Exception { - final JSONObject pairJsonObject = jsonObject.getJSONObject(checkerInfo.getCurrencyPairId()); - ticker.vol = pairJsonObject.getDouble("volume_btc"); - final JSONObject ratesJsonObject = pairJsonObject.getJSONObject("rates"); - ticker.last = ratesJsonObject.getDouble("last"); - } - - // ==================== - // Get currency pairs - // ==================== - @Override - public String getCurrencyPairsUrl(int requestId) { - return URL_CURRENCY_PAIRS; - } - - @Override - protected void parseCurrencyPairsFromJsonObject(int requestId, JSONObject jsonObject, List pairs) throws Exception { - final JSONArray pairsJsonArray = jsonObject.names(); - for(int i=0; i pairs) throws Exception { - final JSONArray jsonArray = new JSONArray(responseString); - for (int i = 0; i < jsonArray.length(); ++i) { - final JSONObject pairJsonObject = jsonArray.getJSONObject(i); - pairs.add(new CurrencyPairInfo( - pairJsonObject.getString("baseAssetId"), - pairJsonObject.getString("quotingAssetId"), - pairJsonObject.getString("id"))); - } - } -} \ No newline at end of file diff --git a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/McxNOW.java b/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/McxNOW.java deleted file mode 100644 index 448afd1b..00000000 --- a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/McxNOW.java +++ /dev/null @@ -1,101 +0,0 @@ -package com.mobnetic.coinguardian.model.market; - -import java.io.StringReader; -import java.util.List; - -import javax.xml.parsers.DocumentBuilder; -import javax.xml.parsers.DocumentBuilderFactory; - -import org.w3c.dom.Document; -import org.w3c.dom.Element; -import org.w3c.dom.Node; -import org.w3c.dom.NodeList; -import org.xml.sax.InputSource; - -import android.text.TextUtils; - -import com.mobnetic.coinguardian.model.CheckerInfo; -import com.mobnetic.coinguardian.model.CurrencyPairInfo; -import com.mobnetic.coinguardian.model.Market; -import com.mobnetic.coinguardian.model.Ticker; -import com.mobnetic.coinguardian.model.currency.VirtualCurrency; -import com.mobnetic.coinguardian.util.XmlParserUtils; - -public class McxNOW extends Market { - - private final static String NAME = "McxNOW"; - private final static String TTS_NAME = "MCX now"; - private final static String URL = "https://mcxnow.com/orders?cur=%1$s"; - private final static String URL_CURRENCY_PAIRS = "https://mcxnow.com/current"; - - public McxNOW() { - super(NAME, TTS_NAME, null); - } - - @Override - public String getUrl(int requestId, CheckerInfo checkerInfo) { - return String.format(URL, checkerInfo.getCurrencyBase()); - } - - @Override - protected void parseTicker(int requestId, String responseString, Ticker ticker, CheckerInfo checkerInfo) throws Exception { - DocumentBuilder db = DocumentBuilderFactory.newInstance().newDocumentBuilder(); - InputSource is = new InputSource(); - is.setCharacterStream(new StringReader(responseString)); - Document doc = db.parse(is); - - ticker.bid = getFirstPriceFromOrder(doc, "buy"); - ticker.ask = getFirstPriceFromOrder(doc, "sell"); - ticker.vol = XmlParserUtils.getDoubleNodeValue(XmlParserUtils.getFirstElementByTagName(doc, "curvol")); - ticker.high = XmlParserUtils.getDoubleNodeValue(XmlParserUtils.getFirstElementByTagName(doc, "priceh")); - ticker.low = XmlParserUtils.getDoubleNodeValue(XmlParserUtils.getFirstElementByTagName(doc, "pricel")); - ticker.last = XmlParserUtils.getDoubleNodeValue(XmlParserUtils.getFirstElementByTagName(doc, "lprice")); - } - - private double getFirstPriceFromOrder(Document doc, String arrayName) throws Exception { - Node arrayNode = XmlParserUtils.getFirstElementByTagName(doc, arrayName); - if(arrayNode!=null) { - NodeList orderNodes = ((Element)arrayNode).getElementsByTagName("o"); - if(orderNodes!=null && orderNodes.getLength()>1) { - Node orderNode = orderNodes.item(1); - if(orderNode!=null && orderNode instanceof Element) { - NodeList priceNodes = ((Element)orderNode).getElementsByTagName("p"); - if(priceNodes!=null && priceNodes.getLength()>0) { - return XmlParserUtils.getDoubleNodeValue(priceNodes.item(0)); - } - } - } - } - return Ticker.NO_DATA; - } - - // ==================== - // Get currency pairs - // ==================== - @Override - public String getCurrencyPairsUrl(int requestId) { - return URL_CURRENCY_PAIRS; - } - - @Override - protected void parseCurrencyPairs(int requestId, String responseString, List pairs) throws Exception { - DocumentBuilder db = DocumentBuilderFactory.newInstance().newDocumentBuilder(); - InputSource is = new InputSource(); - is.setCharacterStream(new StringReader(responseString)); - Document doc = db.parse(is); - - - final NodeList nodes = doc.getElementsByTagName("cur"); - Element node = null; - if(nodes!=null) { - for(int i=0; i CURRENCY_PAIRS = new LinkedHashMap<>(); - static { - CURRENCY_PAIRS.put(VirtualCurrency.BTC, new String[]{ - Currency.BRL - }); - CURRENCY_PAIRS.put(VirtualCurrency.BCH, new String[]{ - Currency.BRL - }); - CURRENCY_PAIRS.put(VirtualCurrency.LTC, new String[]{ - Currency.BRL - }); - } - - public Mercado() { - super(NAME, TTS_NAME, CURRENCY_PAIRS); - } - - @Override - public String getUrl(int requestId, CheckerInfo checkerInfo) { - return String.format(URL, checkerInfo.getCurrencyBase()); - } - - @Override - protected void parseTickerFromJsonObject(int requestId, JSONObject jsonObject, Ticker ticker, CheckerInfo checkerInfo) throws Exception { - final JSONObject tickerJsonObject = jsonObject.getJSONObject("ticker"); - - ticker.bid = tickerJsonObject.getDouble("buy"); - ticker.ask = tickerJsonObject.getDouble("sell"); - ticker.vol = tickerJsonObject.getDouble("vol"); - ticker.high = tickerJsonObject.getDouble("high"); - ticker.low = tickerJsonObject.getDouble("low"); - ticker.last = tickerJsonObject.getDouble("last"); - ticker.timestamp = tickerJsonObject.getLong("date")*TimeUtils.MILLIS_IN_SECOND; - } -} diff --git a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/Mexbt.java b/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/Mexbt.java deleted file mode 100644 index 66ace413..00000000 --- a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/Mexbt.java +++ /dev/null @@ -1,45 +0,0 @@ -package com.mobnetic.coinguardian.model.market; - -import java.util.HashMap; -import java.util.LinkedHashMap; - -import org.json.JSONObject; - -import com.mobnetic.coinguardian.model.CheckerInfo; -import com.mobnetic.coinguardian.model.Market; -import com.mobnetic.coinguardian.model.Ticker; -import com.mobnetic.coinguardian.model.currency.Currency; -import com.mobnetic.coinguardian.model.currency.VirtualCurrency; - -public class Mexbt extends Market { - - private final static String NAME = "meXBT"; - private final static String TTS_NAME = "me XBT"; - private final static String URL = "https://data.mexbt.com/ticker/%1$s%2$s"; - private final static HashMap CURRENCY_PAIRS = new LinkedHashMap(); - static { - CURRENCY_PAIRS.put(VirtualCurrency.BTC, new String[]{ - VirtualCurrency.MXN, - Currency.USD, - }); - } - - public Mexbt() { - super(NAME, TTS_NAME, CURRENCY_PAIRS); - } - - @Override - public String getUrl(int requestId, CheckerInfo checkerInfo) { - return String.format(URL, checkerInfo.getCurrencyBaseLowerCase(), checkerInfo.getCurrencyCounterLowerCase()); - } - - @Override - protected void parseTickerFromJsonObject(int requestId, JSONObject jsonObject, Ticker ticker, CheckerInfo checkerInfo) throws Exception { - ticker.bid = jsonObject.getDouble("bid"); - ticker.ask = jsonObject.getDouble("ask"); - ticker.vol = jsonObject.getDouble("volume24Hour"); - ticker.high = jsonObject.getDouble("high"); - ticker.low = jsonObject.getDouble("low"); - ticker.last = jsonObject.getDouble("last"); - } -} diff --git a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/MintPal.java b/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/MintPal.java deleted file mode 100644 index f1b85697..00000000 --- a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/MintPal.java +++ /dev/null @@ -1,62 +0,0 @@ -package com.mobnetic.coinguardian.model.market; - -import java.util.List; - -import org.json.JSONArray; -import org.json.JSONObject; - -import com.mobnetic.coinguardian.model.CheckerInfo; -import com.mobnetic.coinguardian.model.CurrencyPairInfo; -import com.mobnetic.coinguardian.model.Market; -import com.mobnetic.coinguardian.model.Ticker; - -public class MintPal extends Market { - - private final static String NAME = "MintPal"; - private final static String TTS_NAME = "Mint Pal"; - private final static String URL = "https://api.mintpal.com/market/stats/%1$s/%2$s/"; - private final static String URL_CURRENCY_PAIRS = "https://api.mintpal.com/market/summary/"; - - public MintPal() { - super(NAME, TTS_NAME, null); - } - - @Override - public String getUrl(int requestId, CheckerInfo checkerInfo) { - return String.format(URL, checkerInfo.getCurrencyBase(), checkerInfo.getCurrencyCounter()); - } - - @Override - protected void parseTicker(int requestId, String responseString, Ticker ticker, CheckerInfo checkerInfo) throws Exception { - parseTickerFromJsonObject(requestId, new JSONArray(responseString).getJSONObject(0), ticker, checkerInfo); - } - - @Override - protected void parseTickerFromJsonObject(int requestId, JSONObject jsonObject, Ticker ticker, CheckerInfo checkerInfo) throws Exception { - ticker.vol = jsonObject.getDouble("24hvol"); - ticker.high = jsonObject.getDouble("24hhigh"); - ticker.low = jsonObject.getDouble("24hlow"); - ticker.last = jsonObject.getDouble("last_price"); - } - - // ==================== - // Get currency pairs - // ==================== - @Override - public String getCurrencyPairsUrl(int requestId) { - return URL_CURRENCY_PAIRS; - } - - @Override - protected void parseCurrencyPairs(int requestId, String responseString, List pairs) throws Exception { - final JSONArray jsonArray = new JSONArray(responseString); - for(int i=0; i CURRENCY_PAIRS = new LinkedHashMap(); - static { - CURRENCY_PAIRS.put(VirtualCurrency.BTC, new String[]{ - Currency.USD, - Currency.EUR, - Currency.CAD, - Currency.GBP, - Currency.CHF, - Currency.RUB, - Currency.AUD, - Currency.SEK, - Currency.DKK, - Currency.HKD, - Currency.PLN, - Currency.CNY, - Currency.SGD, - Currency.THB, - Currency.NZD, - Currency.JPY - }); - } - - public Mtgox() { - super(NAME, TTS_NAME, CURRENCY_PAIRS); - } - - @Override - public String getUrl(int requestId, CheckerInfo checkerInfo) { - return String.format(URL, checkerInfo.getCurrencyBase(), checkerInfo.getCurrencyCounter()); - } - - @Override - protected void parseTickerFromJsonObject(int requestId, JSONObject jsonObject, Ticker ticker, CheckerInfo checkerInfo) throws Exception { - final JSONObject dataObject = jsonObject.getJSONObject("data"); - - ticker.bid = getPriceValueFromObject(dataObject, "buy"); - ticker.ask = getPriceValueFromObject(dataObject, "sell"); - ticker.vol = getPriceValueFromObject(dataObject, "vol"); - ticker.high = getPriceValueFromObject(dataObject, "high"); - ticker.low = getPriceValueFromObject(dataObject, "low"); - ticker.last = getPriceValueFromObject(dataObject, "last_local"); - ticker.timestamp = dataObject.getLong("now")/TimeUtils.NANOS_IN_MILLIS; - } - - private double getPriceValueFromObject(JSONObject jsonObject, String key) throws Exception { - final JSONObject innerObject = jsonObject.getJSONObject(key); - return innerObject.getDouble("value"); - } -} diff --git a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/NegocieCoins.java b/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/NegocieCoins.java deleted file mode 100644 index fa004f5a..00000000 --- a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/NegocieCoins.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.mobnetic.coinguardian.model.market; - -import com.mobnetic.coinguardian.model.CheckerInfo; -import com.mobnetic.coinguardian.model.Market; -import com.mobnetic.coinguardian.model.Ticker; -import com.mobnetic.coinguardian.model.currency.Currency; -import com.mobnetic.coinguardian.model.currency.VirtualCurrency; - -import org.json.JSONObject; - -import java.util.HashMap; -import java.util.LinkedHashMap; - -public class NegocieCoins extends Market { - - private final static String NAME = "NegocieCoins"; - private final static String TTS_NAME = "Negocie Coins"; - private final static String URL = "https://broker.negociecoins.com.br/api/v3/%1$s%2$s/ticker"; - private final static HashMap CURRENCY_PAIRS = new LinkedHashMap<>(); - static { - CURRENCY_PAIRS.put(VirtualCurrency.BTC, new String[]{ - Currency.BRL - }); - CURRENCY_PAIRS.put(VirtualCurrency.LTC, new String[]{ - Currency.BRL - }); - } - - public NegocieCoins() { - super(NAME, TTS_NAME, CURRENCY_PAIRS); - } - - @Override - public String getUrl(int requestId, CheckerInfo checkerInfo) { - return String.format(URL, checkerInfo.getCurrencyBase(), checkerInfo.getCurrencyCounter()); - } - - @Override - protected void parseTickerFromJsonObject(int requestId, JSONObject jsonObject, Ticker ticker, CheckerInfo checkerInfo) throws Exception { - ticker.bid = jsonObject.getDouble("buy"); - ticker.ask = jsonObject.getDouble("sell"); - ticker.vol = jsonObject.getDouble("vol"); - ticker.high = jsonObject.getDouble("high"); - ticker.low = jsonObject.getDouble("low"); - ticker.last = jsonObject.getDouble("last"); - } -} diff --git a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/Nocks.java b/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/Nocks.java deleted file mode 100644 index 2a52a03c..00000000 --- a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/Nocks.java +++ /dev/null @@ -1,69 +0,0 @@ -package com.mobnetic.coinguardian.model.market; - -import com.mobnetic.coinguardian.model.CheckerInfo; -import com.mobnetic.coinguardian.model.CurrencyPairInfo; -import com.mobnetic.coinguardian.model.Market; -import com.mobnetic.coinguardian.model.Ticker; - -import org.json.JSONArray; -import org.json.JSONObject; - -import java.util.List; - -public class Nocks extends Market { - - private final static String NAME = "Nocks"; - private final static String TTS_NAME = NAME; - private final static String URL = "https://api.nocks.com/api/v2/trade-market/%1$s"; - private final static String URL_CURRENCY_PAIRS = "https://api.nocks.com/api/v2/trade-market"; - - public Nocks() { - super(NAME, TTS_NAME, null); - } - - @Override - public String getUrl(int requestId, CheckerInfo checkerInfo) { - return String.format(URL, checkerInfo.getCurrencyPairId()); - } - - @Override - protected void parseTickerFromJsonObject(int requestId, JSONObject jsonObject, Ticker ticker, CheckerInfo checkerInfo) throws Exception { - final JSONObject dataObject = jsonObject.getJSONObject("data"); - - ticker.bid = getDoubleFromJsonObject(dataObject, "buy"); - ticker.ask = getDoubleFromJsonObject(dataObject, "sell"); - ticker.vol = getDoubleFromJsonObject(dataObject, "volume"); - ticker.high = getDoubleFromJsonObject(dataObject, "high"); - ticker.low = getDoubleFromJsonObject(dataObject, "low"); - ticker.last = getDoubleFromJsonObject(dataObject, "last"); - } - - private double getDoubleFromJsonObject(JSONObject jsonObject, String key) throws Exception { - return jsonObject.getJSONObject(key).getDouble("amount"); - } - - // ==================== - // Get currency pairs - // ==================== - @Override - public String getCurrencyPairsUrl(int requestId) { - return URL_CURRENCY_PAIRS; - } - - @Override - protected void parseCurrencyPairsFromJsonObject(int requestId, JSONObject jsonObject, List pairs) throws Exception { - final JSONArray resultJsonArray = jsonObject.getJSONArray("data"); - - for(int i=0; i= 2) { - pairs.add(new CurrencyPairInfo( - currencies[0], - currencies[1], - pairId)); - } - } - } -} diff --git a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/OKCoinFutures.java b/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/OKCoinFutures.java deleted file mode 100644 index 5e1fcd55..00000000 --- a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/OKCoinFutures.java +++ /dev/null @@ -1,67 +0,0 @@ -package com.mobnetic.coinguardian.model.market; - -import java.util.HashMap; -import java.util.LinkedHashMap; - -import org.json.JSONObject; - -import com.mobnetic.coinguardian.model.CheckerInfo; -import com.mobnetic.coinguardian.model.Futures; -import com.mobnetic.coinguardian.model.FuturesMarket; -import com.mobnetic.coinguardian.model.Ticker; -import com.mobnetic.coinguardian.model.currency.Currency; -import com.mobnetic.coinguardian.model.currency.VirtualCurrency; - -public class OKCoinFutures extends FuturesMarket { - - private final static String NAME = "OKCoin Futures"; - private final static String TTS_NAME = "OK Coin Futures"; - private final static String URL = "https://www.okex.com/api/v1/future_ticker.do?symbol=%1$s_%2$s&contract_type=%3$s"; - private final static HashMap CURRENCY_PAIRS = new LinkedHashMap(); - static { - CURRENCY_PAIRS.put(VirtualCurrency.BTC, new String[]{ - // Currency.CNY, //At this time (2015-09-17) no API exist for www.okcoin.cn. Check https://www.okcoin.cn/about/rest_api.do - Currency.USD - }); - CURRENCY_PAIRS.put(VirtualCurrency.LTC, new String[]{ - // Currency.CNY, //At this time (2015-09-17) no API exist for www.okcoin.cn. Check https://www.okcoin.cn/about/rest_api.do - Currency.USD - }); - } - private final static int[] CONTRACT_TYPES = new int[] { - Futures.CONTRACT_TYPE_WEEKLY, - Futures.CONTRACT_TYPE_BIWEEKLY, - Futures.CONTRACT_TYPE_QUARTERLY - }; - - public OKCoinFutures() { - super(NAME, TTS_NAME, CURRENCY_PAIRS, CONTRACT_TYPES); - } - - @Override - public String getUrl(int requestId, CheckerInfo checkerInfo, int contractType) { - return String.format(URL, checkerInfo.getCurrencyBaseLowerCase(), checkerInfo.getCurrencyCounterLowerCase(), getContractTypeString(contractType)); - } - - private String getContractTypeString(int contractType) { - switch (contractType) { - default: - case Futures.CONTRACT_TYPE_WEEKLY: return "this_week"; - case Futures.CONTRACT_TYPE_BIWEEKLY: return "next_week"; - case Futures.CONTRACT_TYPE_QUARTERLY: return "quarter"; - } - } - - @Override - protected void parseTickerFromJsonObject(int requestId, JSONObject jsonObject, Ticker ticker, CheckerInfo checkerInfo) throws Exception { - final JSONObject tickerJsonObject = jsonObject.getJSONObject("ticker"); - - ticker.bid = tickerJsonObject.getDouble("buy"); - ticker.ask = tickerJsonObject.getDouble("sell"); - ticker.vol = tickerJsonObject.getDouble("vol"); - ticker.high = tickerJsonObject.getDouble("high"); - ticker.low = tickerJsonObject.getDouble("low"); - ticker.last = tickerJsonObject.getDouble("last"); - } - -} diff --git a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/Okcoin.java b/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/Okcoin.java deleted file mode 100644 index 7144c5cf..00000000 --- a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/Okcoin.java +++ /dev/null @@ -1,55 +0,0 @@ -package com.mobnetic.coinguardian.model.market; - -import java.util.HashMap; -import java.util.LinkedHashMap; -import org.json.JSONObject; - -import com.mobnetic.coinguardian.model.CheckerInfo; -import com.mobnetic.coinguardian.model.Market; -import com.mobnetic.coinguardian.model.Ticker; -import com.mobnetic.coinguardian.model.currency.Currency; -import com.mobnetic.coinguardian.model.currency.VirtualCurrency; - -public class Okcoin extends Market { - - private final static String NAME = "OKCoin"; - private final static String TTS_NAME = "OK Coin"; - private final static String URL_USD = "https://www.okcoin.com/api/v1/ticker.do?symbol=%1$s_%2$s"; - private final static String URL_CNY = "https://www.okcoin.cn/api/v1/ticker.do?symbol=%1$s_%2$s"; - private final static HashMap CURRENCY_PAIRS = new LinkedHashMap(); - static { - CURRENCY_PAIRS.put(VirtualCurrency.BTC, new String[]{ - Currency.CNY, - Currency.USD - }); - CURRENCY_PAIRS.put(VirtualCurrency.LTC, new String[]{ - Currency.CNY, - Currency.USD - }); - } - - public Okcoin() { - super(NAME, TTS_NAME, CURRENCY_PAIRS); - } - - @Override - public String getUrl(int requestId, CheckerInfo checkerInfo) { - if(Currency.USD.equals(checkerInfo.getCurrencyCounter())) { - return String.format(URL_USD, checkerInfo.getCurrencyBaseLowerCase(), checkerInfo.getCurrencyCounterLowerCase()); - } else { - return String.format(URL_CNY, checkerInfo.getCurrencyBaseLowerCase(), checkerInfo.getCurrencyCounterLowerCase()); - } - } - - @Override - protected void parseTickerFromJsonObject(int requestId, JSONObject jsonObject, Ticker ticker, CheckerInfo checkerInfo) throws Exception { - final JSONObject tickerJsonObject = jsonObject.getJSONObject("ticker"); - - ticker.bid = tickerJsonObject.getDouble("buy"); - ticker.ask = tickerJsonObject.getDouble("sell"); - ticker.vol = tickerJsonObject.getDouble("vol"); - ticker.high = tickerJsonObject.getDouble("high"); - ticker.low = tickerJsonObject.getDouble("low"); - ticker.last = tickerJsonObject.getDouble("last"); - } -} diff --git a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/OmniTrade.java b/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/OmniTrade.java deleted file mode 100644 index ebfff430..00000000 --- a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/OmniTrade.java +++ /dev/null @@ -1,61 +0,0 @@ -package com.mobnetic.coinguardian.model.market; - -import com.mobnetic.coinguardian.model.CheckerInfo; -import com.mobnetic.coinguardian.model.CurrencyPairInfo; -import com.mobnetic.coinguardian.model.Market; -import com.mobnetic.coinguardian.model.Ticker; - -import org.json.JSONArray; -import org.json.JSONObject; - -import java.util.List; - -public class OmniTrade extends Market { - - private final static String NAME = "OmniTrade"; - private final static String TTS_NAME = "Omni Trade"; - private final static String URL = "https://omnitrade.io/api/v2/tickers/%1$s"; - private final static String URL_CURRENCY_PAIRS = "https://omnitrade.io/api/v2/markets"; - - public OmniTrade() { - super(NAME, TTS_NAME, null); - } - - @Override - public String getUrl(int requestId, CheckerInfo checkerInfo) { - return String.format(URL, checkerInfo.getCurrencyPairId()); - } - - @Override - protected void parseTickerFromJsonObject(int requestId, JSONObject jsonObject, Ticker ticker, CheckerInfo checkerInfo) throws Exception { - final JSONObject dataJsonObject = jsonObject.getJSONObject("ticker"); - - ticker.bid = dataJsonObject.getDouble("buy"); - ticker.ask = dataJsonObject.getDouble("sell"); - ticker.low = dataJsonObject.getDouble("low"); - ticker.high = dataJsonObject.getDouble("high"); - ticker.last = dataJsonObject.getDouble("last"); - ticker.vol = dataJsonObject.getDouble("vol"); - } - - // ==================== - // Get currency pairs - // ==================== - @Override - public String getCurrencyPairsUrl(int requestId) { - return URL_CURRENCY_PAIRS; - } - - @Override - protected void parseCurrencyPairs(int requestId, String responseString, List pairs) throws Exception { - final JSONArray pairsArray = new JSONArray(responseString); - for(int i=0; i CURRENCY_PAIRS = new LinkedHashMap(); - static { - CURRENCY_PAIRS.put(VirtualCurrency.BTC, new String[]{ - Currency.TRY - }); - } - - public Paribu() { - super(NAME, TTS_NAME, CURRENCY_PAIRS); - } - - @Override - public String getUrl(int requestId, CheckerInfo checkerInfo) { - return URL; - } - - @Override - protected void parseTickerFromJsonObject(int requestId, JSONObject jsonObject, Ticker ticker, CheckerInfo checkerInfo) throws Exception { - final JSONObject dataJsonObject = jsonObject.getJSONObject("BTC_TL"); - - ticker.bid = ParseUtils.getDoubleFromString(dataJsonObject, "highestBid"); - ticker.ask = ParseUtils.getDoubleFromString(dataJsonObject, "lowestAsk"); - ticker.vol = ParseUtils.getDoubleFromString(dataJsonObject, "volume"); - ticker.high = ParseUtils.getDoubleFromString(dataJsonObject, "high24hr"); - ticker.low = ParseUtils.getDoubleFromString(dataJsonObject, "low24hr"); - ticker.last = ParseUtils.getDoubleFromString(dataJsonObject, "last"); - } -} diff --git a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/Paymium.java b/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/Paymium.java deleted file mode 100644 index d50f6f26..00000000 --- a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/Paymium.java +++ /dev/null @@ -1,58 +0,0 @@ -package com.mobnetic.coinguardian.model.market; - -import java.util.HashMap; -import java.util.LinkedHashMap; - -import org.json.JSONArray; -import org.json.JSONObject; - -import com.mobnetic.coinguardian.model.CheckerInfo; -import com.mobnetic.coinguardian.model.Market; -import com.mobnetic.coinguardian.model.Ticker; -import com.mobnetic.coinguardian.model.currency.Currency; -import com.mobnetic.coinguardian.model.currency.VirtualCurrency; - -public class Paymium extends Market { - - private final static String NAME = "Paymium"; - private final static String TTS_NAME = NAME; - private final static String URL = "https://paymium.com/api/v1/data/eur/ticker"; - private final static HashMap CURRENCY_PAIRS = new LinkedHashMap(); - static { - CURRENCY_PAIRS.put(VirtualCurrency.BTC, new String[]{ - Currency.EUR - }); - } - - public Paymium() { - super(NAME, TTS_NAME, CURRENCY_PAIRS); - } - - @Override - public String getUrl(int requestId, CheckerInfo checkerInfo) { - return URL; - } - - @Override - protected void parseTickerFromJsonObject(int requestId, JSONObject jsonObject, Ticker ticker, CheckerInfo checkerInfo) throws Exception { - ticker.bid = jsonObject.getDouble("bid"); - ticker.ask = jsonObject.getDouble("ask"); - ticker.vol = jsonObject.getDouble("volume"); - ticker.high = jsonObject.getDouble("high"); - ticker.low = jsonObject.getDouble("low"); - ticker.last = jsonObject.getDouble("price"); - } - - @Override - protected String parseErrorFromJsonObject(int requestId, JSONObject jsonObject, CheckerInfo checkerInfo) throws Exception { - final StringBuilder stringBuilder = new StringBuilder(); - final JSONArray errorsArray = jsonObject.getJSONArray("errors"); - for(int i=0; i pairs) throws Exception { - final JSONArray pairNames = jsonObject.names(); - - for(int i=0; i pairs) throws Exception { - final JSONArray pairingsArray = jsonObject.getJSONArray("pairings"); - final String currencyCounter = jsonObject.getString("from"); - - for(int i=0; i CURRENCY_PAIRS = new LinkedHashMap(); - static { - CURRENCY_PAIRS.put(VirtualCurrency.BCH, new String[]{ - Currency.CAD - }); - CURRENCY_PAIRS.put(VirtualCurrency.BTC, new String[]{ - Currency.CAD, - Currency.USD - }); - CURRENCY_PAIRS.put(VirtualCurrency.BTG, new String[]{ - Currency.CAD - }); - CURRENCY_PAIRS.put(VirtualCurrency.ETH, new String[]{ - VirtualCurrency.BTC, - Currency.CAD - }); - CURRENCY_PAIRS.put(VirtualCurrency.LTC, new String[]{ - Currency.CAD - }); - } - - public QuadrigaCX() { - super(NAME, TTS_NAME, CURRENCY_PAIRS); - } - - @Override - public String getUrl(int requestId, CheckerInfo checkerInfo) { - return String.format(URL, checkerInfo.getCurrencyBaseLowerCase(), checkerInfo.getCurrencyCounterLowerCase()); - } - - @Override - protected void parseTickerFromJsonObject(int requestId, JSONObject jsonObject, Ticker ticker, CheckerInfo checkerInfo) throws Exception { - ticker.bid = jsonObject.getDouble("bid"); - ticker.ask = jsonObject.getDouble("ask"); - ticker.vol = jsonObject.getDouble("volume"); - ticker.high = jsonObject.getDouble("high"); - ticker.low = jsonObject.getDouble("low"); - ticker.last = jsonObject.getDouble("last"); - ticker.timestamp = jsonObject.getLong("timestamp"); - } -} diff --git a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/Quoine.java b/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/Quoine.java deleted file mode 100644 index 4d550f46..00000000 --- a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/Quoine.java +++ /dev/null @@ -1,68 +0,0 @@ -package com.mobnetic.coinguardian.model.market; - -import java.util.List; - -import org.json.JSONArray; -import org.json.JSONObject; - -import com.mobnetic.coinguardian.model.CheckerInfo; -import com.mobnetic.coinguardian.model.CurrencyPairInfo; -import com.mobnetic.coinguardian.model.Market; -import com.mobnetic.coinguardian.model.Ticker; - -public class Quoine extends Market { - - private final static String NAME = "Quoine"; - private final static String TTS_NAME = NAME; - private final static String URL = "https://api.quoine.com/products/code/CASH/%1$s"; - private final static String URL_CURRENCY_PAIRS = "https://api.quoine.com/products/"; - - public Quoine() { - super(NAME, TTS_NAME, null); - } - - @Override - public String getUrl(int requestId, CheckerInfo checkerInfo) { - return String.format(URL, checkerInfo.getCurrencyPairId()); - } - - @Override - protected void parseTickerFromJsonObject(int requestId, JSONObject jsonObject, Ticker ticker, CheckerInfo checkerInfo) throws Exception { - ticker.bid = jsonObject.getDouble("market_bid"); - ticker.ask = jsonObject.getDouble("market_ask"); - ticker.vol = jsonObject.getDouble("volume_24h"); - ticker.high = jsonObject.getDouble("high_market_ask"); - ticker.low = jsonObject.getDouble("low_market_bid"); - ticker.last = jsonObject.getDouble("last_traded_price"); - } - - - // ==================== - // Get currency pairs - // ==================== - @Override - public String getCurrencyPairsUrl(int requestId) { - return URL_CURRENCY_PAIRS; - } - - @Override - protected void parseCurrencyPairs(int requestId, String responseString, List pairs) throws Exception { - final JSONArray pairsJsonArray = new JSONArray(responseString); - for(int i=0; i CURRENCY_PAIRS = new LinkedHashMap(); - static { - CURRENCY_PAIRS.put(VirtualCurrency.BTC, new String[]{ - Currency.ARS - }); - } - - public Ripio() { - super(NAME, TTS_NAME, CURRENCY_PAIRS); - } - - @Override - public String getUrl(int requestId, CheckerInfo checkerInfo) { - return URL; - } - - @Override - protected void parseTickerFromJsonObject(int requestId, JSONObject jsonObject, Ticker ticker, CheckerInfo checkerInfo) throws Exception { - final JSONObject ratesJsonObject = jsonObject.getJSONObject("rates"); - ticker.bid = ratesJsonObject.getDouble("ARS_SELL"); // reversed - ticker.ask = ratesJsonObject.getDouble("ARS_BUY"); // reversed - ticker.last = ticker.ask; - } -} diff --git a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/SatoshiTango.java b/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/SatoshiTango.java deleted file mode 100644 index aab30309..00000000 --- a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/SatoshiTango.java +++ /dev/null @@ -1,51 +0,0 @@ -package com.mobnetic.coinguardian.model.market; - -import com.mobnetic.coinguardian.model.CheckerInfo; -import com.mobnetic.coinguardian.model.Market; -import com.mobnetic.coinguardian.model.Ticker; -import com.mobnetic.coinguardian.model.currency.Currency; -import com.mobnetic.coinguardian.model.currency.VirtualCurrency; - -import org.json.JSONObject; - -import java.util.HashMap; -import java.util.LinkedHashMap; - -public class SatoshiTango extends Market { - - private final static String NAME = "SatoshiTango"; - private final static String TTS_NAME = "Satoshi Tango"; - private final static String URL = "https://api.satoshitango.com/v2/ticker"; - - private final static HashMap CURRENCY_PAIRS = new LinkedHashMap(); - - static { - CURRENCY_PAIRS.put(VirtualCurrency.BTC, new String[]{ - Currency.USD, - Currency.ARS, - Currency.EUR - }); - } - - public SatoshiTango() { - super(NAME, TTS_NAME, CURRENCY_PAIRS); - } - - @Override - public String getUrl(int requestId, CheckerInfo checkerInfo) { - return URL; - } - - @Override - protected void parseTickerFromJsonObject(int requestId, JSONObject jsonObject, Ticker ticker, CheckerInfo checkerInfo) throws Exception { - String currencyCode = checkerInfo.getCurrencyCounterLowerCase() + checkerInfo.getCurrencyBaseLowerCase(); - - final JSONObject tickerJsonObject = jsonObject.getJSONObject("data"); - final JSONObject buyObject = tickerJsonObject.getJSONObject("compra"); - final JSONObject sellObject = tickerJsonObject.getJSONObject("venta"); - - ticker.ask = buyObject.getDouble(currencyCode); - ticker.bid = sellObject.getDouble(currencyCode); - ticker.last = ticker.ask; - } -} diff --git a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/ShapeShift.java b/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/ShapeShift.java deleted file mode 100644 index f2c0f14b..00000000 --- a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/ShapeShift.java +++ /dev/null @@ -1,69 +0,0 @@ -package com.mobnetic.coinguardian.model.market; - -import java.util.ArrayList; -import java.util.List; - -import org.json.JSONArray; -import org.json.JSONObject; - -import com.mobnetic.coinguardian.model.CheckerInfo; -import com.mobnetic.coinguardian.model.CurrencyPairInfo; -import com.mobnetic.coinguardian.model.Market; -import com.mobnetic.coinguardian.model.Ticker; -import com.mobnetic.coinguardian.util.ParseUtils; - -public class ShapeShift extends Market { - - private final static String NAME = "ShapeShift"; - private final static String TTS_NAME = "Shape Shift"; - private final static String URL = "https://shapeshift.io/rate/%1$s_%2$s"; - private final static String URL_CURRENCY_PAIRS = "https://shapeshift.io/getcoins"; - - public ShapeShift() { - super(NAME, TTS_NAME, null); - } - - @Override - public String getUrl(int requestId, CheckerInfo checkerInfo) { - return String.format(URL, checkerInfo.getCurrencyBase(), checkerInfo.getCurrencyCounter()); - } - - @Override - protected void parseTickerFromJsonObject(int requestId, JSONObject jsonObject, Ticker ticker, CheckerInfo checkerInfo) throws Exception { - ticker.last = ParseUtils.getDoubleFromString(jsonObject, "rate"); - } - - // ==================== - // Get currency pairs - // ==================== - @Override - public String getCurrencyPairsUrl(int requestId) { - return URL_CURRENCY_PAIRS; - } - - @Override - protected void parseCurrencyPairsFromJsonObject(int requestId, JSONObject jsonObject, List pairs) throws Exception { - final JSONArray jsonCoinNames = jsonObject.names(); - final List availableCoinNames = new ArrayList(jsonCoinNames.length()); - for(int i=0; i pairs) throws Exception { - final JSONArray marketsJsonArray = jsonObject.getJSONArray("markets"); - - for(int i=0; i CURRENCY_PAIRS = new LinkedHashMap(); - static { - CURRENCY_PAIRS.put(VirtualCurrency.BTC, new String[]{ - Currency.VEF - }); - } - - public SurBitcoin() { - super(NAME, TTS_NAME, CURRENCY_PAIRS); - } - - @Override - public String getUrl(int requestId, CheckerInfo checkerInfo) { - return String.format(URL, checkerInfo.getCurrencyBase(), checkerInfo.getCurrencyCounter()); - } - - @Override - protected void parseTickerFromJsonObject(int requestId, JSONObject jsonObject, Ticker ticker, CheckerInfo checkerInfo) throws Exception { - ticker.bid = jsonObject.getDouble("buy"); - ticker.ask = jsonObject.getDouble("sell"); - ticker.vol = jsonObject.getDouble("vol"); - ticker.high = jsonObject.getDouble("high"); - ticker.low = jsonObject.getDouble("low"); - ticker.last = jsonObject.getDouble("last"); - } -} diff --git a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/SurBtc.java b/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/SurBtc.java deleted file mode 100644 index d3c135d8..00000000 --- a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/SurBtc.java +++ /dev/null @@ -1,61 +0,0 @@ -package com.mobnetic.coinguardian.model.market; - -import com.mobnetic.coinguardian.model.CheckerInfo; -import com.mobnetic.coinguardian.model.CurrencyPairInfo; -import com.mobnetic.coinguardian.model.Market; -import com.mobnetic.coinguardian.model.Ticker; - -import org.json.JSONArray; -import org.json.JSONObject; - -import java.util.List; - -/** - * Implements SurBTC connection to the API - * @author Eduardo Laguna - */ -public class SurBtc extends Market { - - private final static String NAME = "SurBtc"; - private final static String TTS_NAME = "Sur BTC"; - private final static String URL = "https://www.surbtc.com/api/v2/markets/%1$s/ticker.json"; - private final static String URL_CURRENCY_PAIRS = "https://www.surbtc.com/api/v2/markets.json"; - - public SurBtc() { - super(NAME, TTS_NAME, null); - } - - @Override - public String getUrl(int requestId, CheckerInfo checkerInfo) { - return String.format(URL, checkerInfo.getCurrencyPairId()); - } - - @Override - protected void parseTickerFromJsonObject(int requestId, JSONObject jsonObject, Ticker ticker, CheckerInfo checkerInfo) throws Exception { - final JSONObject tickerJsonObject = jsonObject.getJSONObject("ticker"); - ticker.bid = tickerJsonObject.getJSONArray("max_bid").getDouble(0); - ticker.ask = tickerJsonObject.getJSONArray("min_ask").getDouble(0); - ticker.vol = tickerJsonObject.getJSONArray("volume").getDouble(0); - ticker.last = tickerJsonObject.getJSONArray("last_price").getDouble(0); - } - - // ==================== - // Get currency pairs - // ==================== - @Override - public String getCurrencyPairsUrl(int requestId) { - return URL_CURRENCY_PAIRS; - } - - @Override - protected void parseCurrencyPairsFromJsonObject(int requestId, JSONObject jsonObject, List pairs) throws Exception { - final JSONArray marketsJsonArray = jsonObject.getJSONArray("markets"); - for(int i=0; i CURRENCY_PAIRS = new LinkedHashMap(); - static { - CURRENCY_PAIRS.put(VirtualCurrency.BTC, new String[]{ - Currency.EUR, - Currency.USD, - VirtualCurrency.XRP - }); - CURRENCY_PAIRS.put(Currency.EUR, new String[]{ - VirtualCurrency.DOGE, - VirtualCurrency.XRP - }); - CURRENCY_PAIRS.put(VirtualCurrency.LTC, new String[]{ - VirtualCurrency.BTC, - Currency.EUR, - Currency.USD - }); - CURRENCY_PAIRS.put(VirtualCurrency.NMC, new String[]{ - VirtualCurrency.BTC - }); - CURRENCY_PAIRS.put(VirtualCurrency.PPC, new String[]{ - Currency.EUR - }); - CURRENCY_PAIRS.put(Currency.USD, new String[]{ - VirtualCurrency.XRP - }); - } - - public TheRock() { - super(NAME, TTS_NAME, CURRENCY_PAIRS); - } - - @Override - public String getUrl(int requestId, CheckerInfo checkerInfo) { - String pairId = checkerInfo.getCurrencyPairId(); - if (pairId == null) { - pairId = fixCurrency(checkerInfo.getCurrencyBase()) + fixCurrency(checkerInfo.getCurrencyCounter()); - } - return String.format(URL, pairId); - } - - private String fixCurrency(String currency) { - if(VirtualCurrency.DOGE.equals(currency)) { - return VirtualCurrency.DOG; - } - return currency; - } - - @Override - protected void parseTickerFromJsonObject(int requestId, JSONObject jsonObject, Ticker ticker, CheckerInfo checkerInfo) throws Exception { - ticker.bid = jsonObject.getDouble("bid"); - ticker.ask = jsonObject.getDouble("ask"); - ticker.vol = jsonObject.getDouble("volume"); - ticker.high = jsonObject.getDouble("high"); - ticker.low = jsonObject.getDouble("low"); - ticker.last = jsonObject.getDouble("last"); - } - - // ==================== - // Get currency pairs - // ==================== - @Override - public String getCurrencyPairsUrl(int requestId) { - return URL_CURRENCY_PAIRS; - } - - @Override - protected void parseCurrencyPairsFromJsonObject(int requestId, JSONObject jsonObject, List pairs) throws Exception { - final JSONArray fundsJsonArray = jsonObject.getJSONArray("funds"); - for (int i = 0; i < fundsJsonArray.length(); i++) { - final JSONObject pairJsonObject = fundsJsonArray.getJSONObject(i); - pairs.add(new CurrencyPairInfo( - pairJsonObject.getString("trade_currency"), - pairJsonObject.getString("base_currency"), - pairJsonObject.getString("id")) - ); - } - } -} diff --git a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/Unisend.java b/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/Unisend.java deleted file mode 100644 index 881d7d84..00000000 --- a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/Unisend.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.mobnetic.coinguardian.model.market; - -import java.util.HashMap; -import java.util.LinkedHashMap; - -import org.json.JSONObject; - -import com.mobnetic.coinguardian.model.CheckerInfo; -import com.mobnetic.coinguardian.model.Market; -import com.mobnetic.coinguardian.model.Ticker; -import com.mobnetic.coinguardian.model.currency.Currency; -import com.mobnetic.coinguardian.model.currency.VirtualCurrency; - -public class Unisend extends Market { - - private final static String NAME = "Unisend"; - private final static String TTS_NAME = "Uni send"; - private final static String URL = "https://www.unisend.com/api/price/ar/ars_btc"; - private final static HashMap CURRENCY_PAIRS = new LinkedHashMap(); - static { - CURRENCY_PAIRS.put(VirtualCurrency.BTC, new String[]{ - Currency.ARS - }); - } - - public Unisend() { - super(NAME, TTS_NAME, CURRENCY_PAIRS); - } - - @Override - public String getUrl(int requestId, CheckerInfo checkerInfo) { - return String.format(URL, checkerInfo.getCurrencyBase(), checkerInfo.getCurrencyCounter()); - } - - @Override - protected void parseTickerFromJsonObject(int requestId, JSONObject jsonObject, Ticker ticker, CheckerInfo checkerInfo) throws Exception { - final JSONObject pricesJsonObject = jsonObject.getJSONObject("prices"); - ticker.bid = pricesJsonObject.getDouble("sell"); // reversed! - ticker.ask = pricesJsonObject.getDouble("buy"); // reversed! - ticker.last = ticker.ask; - } -} diff --git a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/Unknown.java b/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/Unknown.java deleted file mode 100644 index 30c5ba67..00000000 --- a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/Unknown.java +++ /dev/null @@ -1,34 +0,0 @@ -package com.mobnetic.coinguardian.model.market; - -import java.util.HashMap; -import java.util.LinkedHashMap; - -import com.mobnetic.coinguardian.model.CheckerInfo; -import com.mobnetic.coinguardian.model.Market; -import com.mobnetic.coinguardian.model.currency.VirtualCurrency; -import com.mobnetic.coinguardiandatamodule.R; - -public class Unknown extends Market { - - private final static String NAME = "UNKNOWN"; - private final static String TTS_NAME = NAME; - private final static String URL = ""; - private final static HashMap CURRENCY_PAIRS = new LinkedHashMap(); - static { - CURRENCY_PAIRS.put(VirtualCurrency.BTC, new String[]{ VirtualCurrency.BTC }); - } - - public Unknown() { - super(NAME, TTS_NAME, CURRENCY_PAIRS); - } - - @Override - public int getCautionResId() { - return R.string.market_caution_unknown; - } - - @Override - public String getUrl(int requestId, CheckerInfo checkerInfo) { - return URL; - } -} diff --git a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/Unocoin.java b/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/Unocoin.java deleted file mode 100644 index bedb3d3c..00000000 --- a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/Unocoin.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.mobnetic.coinguardian.model.market; - -import com.mobnetic.coinguardian.model.CheckerInfo; -import com.mobnetic.coinguardian.model.Market; -import com.mobnetic.coinguardian.model.Ticker; -import com.mobnetic.coinguardian.model.currency.Currency; -import com.mobnetic.coinguardian.model.currency.VirtualCurrency; - -import org.json.JSONObject; - -import java.util.HashMap; -import java.util.LinkedHashMap; - -public class Unocoin extends Market { - - private final static String NAME = "Unocoin"; - private final static String TTS_NAME = "Uno Coin"; - private final static String URL = "https://www.unocoin.com/trade?all"; - private final static HashMap CURRENCY_PAIRS = new LinkedHashMap<>(); - static { - CURRENCY_PAIRS.put(VirtualCurrency.BTC, new String[]{ - Currency.INR - }); - } - - public Unocoin() { - super(NAME, TTS_NAME, CURRENCY_PAIRS); - } - - @Override - public String getUrl(int requestId, CheckerInfo checkerInfo) { - return URL; - } - - @Override - protected void parseTickerFromJsonObject(int requestId, JSONObject jsonObject, Ticker ticker, CheckerInfo checkerInfo) throws Exception { - ticker.bid = jsonObject.getDouble("sell"); - ticker.ask = jsonObject.getDouble("buy"); - ticker.last = jsonObject.getDouble("avg"); - } -} diff --git a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/Uphold.java b/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/Uphold.java deleted file mode 100644 index 9469391b..00000000 --- a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/Uphold.java +++ /dev/null @@ -1,71 +0,0 @@ -// @joseccnet contribution. -package com.mobnetic.coinguardian.model.market; - -import java.util.List; - -import org.json.JSONArray; -import org.json.JSONObject; - -import com.mobnetic.coinguardian.model.CheckerInfo; -import com.mobnetic.coinguardian.model.CurrencyPairInfo; -import com.mobnetic.coinguardian.model.Market; -import com.mobnetic.coinguardian.model.Ticker; -import com.mobnetic.coinguardian.util.ParseUtils; - -public class Uphold extends Market { - - private final static String NAME = "Uphold"; - private final static String TTS_NAME = NAME; - private final static String URL = "https://api.uphold.com/v0/ticker/%1$s"; - private final static String URL_CURRENCY_PAIRS = "https://api.uphold.com/v0/ticker"; - - public Uphold() { - super(NAME, TTS_NAME, null); - } - - @Override - public String getUrl(int requestId, CheckerInfo checkerInfo) { - return String.format(URL, checkerInfo.getCurrencyPairId()); - } - - @Override - protected void parseTickerFromJsonObject(int requestId, JSONObject jsonObject, Ticker ticker, CheckerInfo checkerInfo) throws Exception { - ticker.bid = ParseUtils.getDoubleFromString(jsonObject, "bid"); - ticker.ask = ParseUtils.getDoubleFromString(jsonObject, "ask"); - ticker.last = ((ticker.bid+ticker.ask)/2); //This is how Uphold operate on production (as I observed) - } - - // ==================== - // Get currency pairs - // ==================== - @Override - public String getCurrencyPairsUrl(int requestId) { - return URL_CURRENCY_PAIRS; - } - - @Override - protected void parseCurrencyPairs(int requestId, String responseString, List pairs) throws Exception { - final JSONArray pairsJsonArray = new JSONArray(responseString); - - for(int i=0; i CURRENCY_PAIRS = new LinkedHashMap(); - static { - CURRENCY_PAIRS.put(VirtualCurrency.BTC, new String[]{ - Currency.PKR - }); - - } - - public Urdubit() { - super(NAME, TTS_NAME, CURRENCY_PAIRS); - } - - @Override - public String getUrl(int requestId, CheckerInfo checkerInfo) { - return String.format(URL, checkerInfo.getCurrencyBase(), checkerInfo.getCurrencyCounter()); - } - - @Override - protected void parseTickerFromJsonObject(int requestId, JSONObject jsonObject, Ticker ticker, CheckerInfo checkerInfo) throws Exception { - ticker.bid = jsonObject.getDouble("buy"); - ticker.ask = jsonObject.getDouble("sell"); - ticker.vol = jsonObject.getDouble("vol"); - ticker.high = jsonObject.getDouble("high"); - ticker.low = jsonObject.getDouble("low"); - ticker.last = jsonObject.getDouble("last"); - //ticker.timestamp = jsonObject.getLong("timestamp"); - } - -} diff --git a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/VBtc.java b/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/VBtc.java deleted file mode 100644 index 70c874aa..00000000 --- a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/VBtc.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.mobnetic.coinguardian.model.market; - -import com.mobnetic.coinguardian.model.CheckerInfo; -import com.mobnetic.coinguardian.model.Market; -import com.mobnetic.coinguardian.model.Ticker; -import com.mobnetic.coinguardian.model.currency.Currency; -import com.mobnetic.coinguardian.model.currency.VirtualCurrency; - -import org.json.JSONObject; - -import java.util.HashMap; -import java.util.LinkedHashMap; - -public class VBtc extends Market { - - private final static String NAME = "VBTC.vn"; - private final static String TTS_NAME = "V BTC"; - private final static String URL = "https://api.blinktrade.com/api/v1/%2$s/ticker?crypto_currency=%1$s"; - private final static HashMap CURRENCY_PAIRS = new LinkedHashMap(); - static { - CURRENCY_PAIRS.put(VirtualCurrency.BTC, new String[]{ - Currency.VND - }); - } - - public VBtc() { - super(NAME, TTS_NAME, CURRENCY_PAIRS); - } - - @Override - public String getUrl(int requestId, CheckerInfo checkerInfo) { - return String.format(URL, checkerInfo.getCurrencyBase(), checkerInfo.getCurrencyCounter()); - } - - @Override - protected void parseTickerFromJsonObject(int requestId, JSONObject jsonObject, Ticker ticker, CheckerInfo checkerInfo) throws Exception { - ticker.bid = jsonObject.getDouble("buy"); - ticker.ask = jsonObject.getDouble("sell"); - ticker.vol = jsonObject.getDouble("vol"); - ticker.high = jsonObject.getDouble("high"); - ticker.low = jsonObject.getDouble("low"); - ticker.last = jsonObject.getDouble("last"); - } -} diff --git a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/VaultOfSatoshi.java b/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/VaultOfSatoshi.java deleted file mode 100644 index aa2e79d9..00000000 --- a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/VaultOfSatoshi.java +++ /dev/null @@ -1,79 +0,0 @@ -package com.mobnetic.coinguardian.model.market; - -import java.util.ArrayList; -import java.util.List; - -import org.json.JSONArray; -import org.json.JSONObject; - -import com.mobnetic.coinguardian.model.CheckerInfo; -import com.mobnetic.coinguardian.model.CurrencyPairInfo; -import com.mobnetic.coinguardian.model.Market; -import com.mobnetic.coinguardian.model.Ticker; - -public class VaultOfSatoshi extends Market { - - private final static String NAME = "VaultOfSatoshi"; - private final static String TTS_NAME = "Vault Of Satoshi"; - private final static String URL = "https://api.vaultofsatoshi.com/public/ticker?order_currency=%1$s&payment_currency=%2$s"; - private final static String URL_CURRENCY_PAIRS = "https://api.vaultofsatoshi.com/public/currency"; - - public VaultOfSatoshi() { - super(NAME, TTS_NAME, null); - } - - @Override - public String getUrl(int requestId, CheckerInfo checkerInfo) { - return String.format(URL, checkerInfo.getCurrencyBaseLowerCase(), checkerInfo.getCurrencyCounterLowerCase()); - } - - @Override - protected void parseTickerFromJsonObject(int requestId, JSONObject jsonObject, Ticker ticker, CheckerInfo checkerInfo) throws Exception { - final JSONObject dataObject = jsonObject.getJSONObject("data"); - - ticker.vol = getDoubleFromMtgoxFormatObject(dataObject, "volume_1day"); - ticker.high = getDoubleFromMtgoxFormatObject(dataObject, "max_price"); - ticker.low = getDoubleFromMtgoxFormatObject(dataObject, "min_price"); - ticker.last = getDoubleFromMtgoxFormatObject(dataObject, "closing_price"); - ticker.timestamp = dataObject.getLong("date"); - } - - private double getDoubleFromMtgoxFormatObject(JSONObject jsonObject, String key) throws Exception { - final JSONObject innerObject = jsonObject.getJSONObject(key); - return innerObject.getDouble("value"); - } - - // ==================== - // Get currency pairs - // ==================== - @Override - public String getCurrencyPairsUrl(int requestId) { - return URL_CURRENCY_PAIRS; - } - - @Override - protected void parseCurrencyPairsFromJsonObject(int requestId, JSONObject jsonObject, List pairs) throws Exception { - final JSONArray dataJsonArray = jsonObject.getJSONArray("data"); - final ArrayList virtualCurrencies = new ArrayList(); - final ArrayList currencies = new ArrayList(); - for(int i=0; i CURRENCY_PAIRS = new LinkedHashMap(); - static { - CURRENCY_PAIRS.put(Currency.GOLD, new String[]{ - VirtualCurrency.BTC - }); - } - - public Vaultoro() { - super(NAME, TTS_NAME, CURRENCY_PAIRS); - } - - @Override - public String getUrl(int requestId, CheckerInfo checkerInfo) { - return URL; - } - - @Override - protected void parseTicker(int requestId, String responseString, Ticker ticker, CheckerInfo checkerInfo) throws Exception { - ticker.last = Double.parseDouble(responseString); - } -} \ No newline at end of file diff --git a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/Vircurex.java b/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/Vircurex.java deleted file mode 100644 index 79a75032..00000000 --- a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/Vircurex.java +++ /dev/null @@ -1,459 +0,0 @@ -package com.mobnetic.coinguardian.model.market; - -import java.util.HashMap; -import java.util.LinkedHashMap; - -import org.json.JSONObject; - -import com.mobnetic.coinguardian.model.CheckerInfo; -import com.mobnetic.coinguardian.model.Market; -import com.mobnetic.coinguardian.model.Ticker; -import com.mobnetic.coinguardian.model.currency.Currency; -import com.mobnetic.coinguardian.model.currency.VirtualCurrency; - -public class Vircurex extends Market { - - private final static String NAME = "Vircurex"; - private final static String TTS_NAME = NAME; - private final static String URL = "https://api.vircurex.com/api/get_info_for_1_currency.json?base=%1$s&alt=%2$s"; - private final static HashMap CURRENCY_PAIRS = new LinkedHashMap(); - static { - CURRENCY_PAIRS.put(VirtualCurrency.BTC, new String[]{ - Currency.USD, - Currency.EUR, - VirtualCurrency.ANC, - VirtualCurrency.DGC, - VirtualCurrency.DOGE, - VirtualCurrency.DVC, - VirtualCurrency.FRC, - VirtualCurrency.FTC, - VirtualCurrency.I0C, - VirtualCurrency.IXC, - VirtualCurrency.LTC, - VirtualCurrency.NMC, - VirtualCurrency.NVC, - VirtualCurrency.NXT, - VirtualCurrency.PPC, - VirtualCurrency.QRK, - VirtualCurrency.TRC, - VirtualCurrency.VTC, - VirtualCurrency.WDC, - VirtualCurrency.XPM - }); - CURRENCY_PAIRS.put(VirtualCurrency.ANC, new String[]{ - Currency.USD, - Currency.EUR, - VirtualCurrency.BTC, - VirtualCurrency.DGC, - VirtualCurrency.DOGE, - VirtualCurrency.DVC, - VirtualCurrency.FRC, - VirtualCurrency.FTC, - VirtualCurrency.I0C, - VirtualCurrency.IXC, - VirtualCurrency.LTC, - VirtualCurrency.NMC, - VirtualCurrency.NVC, - VirtualCurrency.NXT, - VirtualCurrency.PPC, - VirtualCurrency.QRK, - VirtualCurrency.TRC, - VirtualCurrency.VTC, - VirtualCurrency.WDC, - VirtualCurrency.XPM - }); - CURRENCY_PAIRS.put(VirtualCurrency.DGC, new String[]{ - Currency.USD, - Currency.EUR, - VirtualCurrency.BTC, - VirtualCurrency.ANC, - VirtualCurrency.DOGE, - VirtualCurrency.DVC, - VirtualCurrency.FRC, - VirtualCurrency.FTC, - VirtualCurrency.I0C, - VirtualCurrency.IXC, - VirtualCurrency.LTC, - VirtualCurrency.NMC, - VirtualCurrency.NVC, - VirtualCurrency.NXT, - VirtualCurrency.PPC, - VirtualCurrency.QRK, - VirtualCurrency.TRC, - VirtualCurrency.VTC, - VirtualCurrency.WDC, - VirtualCurrency.XPM - }); - CURRENCY_PAIRS.put(VirtualCurrency.DOGE, new String[]{ - Currency.USD, - Currency.EUR, - VirtualCurrency.BTC, - VirtualCurrency.ANC, - VirtualCurrency.DGC, - VirtualCurrency.DVC, - VirtualCurrency.FRC, - VirtualCurrency.FTC, - VirtualCurrency.I0C, - VirtualCurrency.IXC, - VirtualCurrency.LTC, - VirtualCurrency.NMC, - VirtualCurrency.NVC, - VirtualCurrency.NXT, - VirtualCurrency.PPC, - VirtualCurrency.QRK, - VirtualCurrency.TRC, - VirtualCurrency.VTC, - VirtualCurrency.WDC, - VirtualCurrency.XPM - }); - CURRENCY_PAIRS.put(VirtualCurrency.DVC, new String[]{ - Currency.USD, - Currency.EUR, - VirtualCurrency.BTC, - VirtualCurrency.ANC, - VirtualCurrency.DGC, - VirtualCurrency.DOGE, - VirtualCurrency.FRC, - VirtualCurrency.FTC, - VirtualCurrency.I0C, - VirtualCurrency.IXC, - VirtualCurrency.LTC, - VirtualCurrency.NMC, - VirtualCurrency.NVC, - VirtualCurrency.NXT, - VirtualCurrency.PPC, - VirtualCurrency.QRK, - VirtualCurrency.TRC, - VirtualCurrency.VTC, - VirtualCurrency.WDC, - VirtualCurrency.XPM - }); - CURRENCY_PAIRS.put(VirtualCurrency.FRC, new String[]{ - Currency.USD, - Currency.EUR, - VirtualCurrency.BTC, - VirtualCurrency.ANC, - VirtualCurrency.DGC, - VirtualCurrency.DOGE, - VirtualCurrency.DVC, - VirtualCurrency.FTC, - VirtualCurrency.I0C, - VirtualCurrency.IXC, - VirtualCurrency.LTC, - VirtualCurrency.NMC, - VirtualCurrency.NVC, - VirtualCurrency.NXT, - VirtualCurrency.PPC, - VirtualCurrency.QRK, - VirtualCurrency.TRC, - VirtualCurrency.VTC, - VirtualCurrency.WDC, - VirtualCurrency.XPM - }); - CURRENCY_PAIRS.put(VirtualCurrency.FTC, new String[]{ - Currency.USD, - Currency.EUR, - VirtualCurrency.BTC, - VirtualCurrency.ANC, - VirtualCurrency.DGC, - VirtualCurrency.DOGE, - VirtualCurrency.DVC, - VirtualCurrency.FRC, - VirtualCurrency.I0C, - VirtualCurrency.IXC, - VirtualCurrency.LTC, - VirtualCurrency.NMC, - VirtualCurrency.NVC, - VirtualCurrency.NXT, - VirtualCurrency.PPC, - VirtualCurrency.QRK, - VirtualCurrency.TRC, - VirtualCurrency.VTC, - VirtualCurrency.WDC, - VirtualCurrency.XPM - }); - CURRENCY_PAIRS.put(VirtualCurrency.I0C, new String[]{ - Currency.USD, - Currency.EUR, - VirtualCurrency.BTC, - VirtualCurrency.ANC, - VirtualCurrency.DGC, - VirtualCurrency.DOGE, - VirtualCurrency.DVC, - VirtualCurrency.FRC, - VirtualCurrency.FTC, - VirtualCurrency.IXC, - VirtualCurrency.LTC, - VirtualCurrency.NMC, - VirtualCurrency.NVC, - VirtualCurrency.NXT, - VirtualCurrency.PPC, - VirtualCurrency.QRK, - VirtualCurrency.TRC, - VirtualCurrency.VTC, - VirtualCurrency.WDC, - VirtualCurrency.XPM - }); - CURRENCY_PAIRS.put(VirtualCurrency.IXC, new String[]{ - Currency.USD, - Currency.EUR, - VirtualCurrency.BTC, - VirtualCurrency.ANC, - VirtualCurrency.DGC, - VirtualCurrency.DOGE, - VirtualCurrency.DVC, - VirtualCurrency.FRC, - VirtualCurrency.FTC, - VirtualCurrency.I0C, - VirtualCurrency.LTC, - VirtualCurrency.NMC, - VirtualCurrency.NVC, - VirtualCurrency.NXT, - VirtualCurrency.PPC, - VirtualCurrency.QRK, - VirtualCurrency.TRC, - VirtualCurrency.VTC, - VirtualCurrency.WDC, - VirtualCurrency.XPM - }); - CURRENCY_PAIRS.put(VirtualCurrency.LTC, new String[]{ - Currency.USD, - Currency.EUR, - VirtualCurrency.BTC, - VirtualCurrency.ANC, - VirtualCurrency.DGC, - VirtualCurrency.DOGE, - VirtualCurrency.DVC, - VirtualCurrency.FRC, - VirtualCurrency.FTC, - VirtualCurrency.I0C, - VirtualCurrency.IXC, - VirtualCurrency.NMC, - VirtualCurrency.NVC, - VirtualCurrency.NXT, - VirtualCurrency.PPC, - VirtualCurrency.QRK, - VirtualCurrency.TRC, - VirtualCurrency.VTC, - VirtualCurrency.WDC, - VirtualCurrency.XPM - }); - CURRENCY_PAIRS.put(VirtualCurrency.NMC, new String[]{ - Currency.USD, - Currency.EUR, - VirtualCurrency.BTC, - VirtualCurrency.ANC, - VirtualCurrency.DGC, - VirtualCurrency.DOGE, - VirtualCurrency.DVC, - VirtualCurrency.FRC, - VirtualCurrency.FTC, - VirtualCurrency.I0C, - VirtualCurrency.IXC, - VirtualCurrency.LTC, - VirtualCurrency.NVC, - VirtualCurrency.NXT, - VirtualCurrency.PPC, - VirtualCurrency.QRK, - VirtualCurrency.TRC, - VirtualCurrency.VTC, - VirtualCurrency.WDC, - VirtualCurrency.XPM - }); - CURRENCY_PAIRS.put(VirtualCurrency.NVC, new String[]{ - Currency.USD, - Currency.EUR, - VirtualCurrency.BTC, - VirtualCurrency.ANC, - VirtualCurrency.DGC, - VirtualCurrency.DOGE, - VirtualCurrency.DVC, - VirtualCurrency.FRC, - VirtualCurrency.FTC, - VirtualCurrency.I0C, - VirtualCurrency.IXC, - VirtualCurrency.LTC, - VirtualCurrency.NMC, - VirtualCurrency.NXT, - VirtualCurrency.PPC, - VirtualCurrency.QRK, - VirtualCurrency.TRC, - VirtualCurrency.VTC, - VirtualCurrency.WDC, - VirtualCurrency.XPM - }); - CURRENCY_PAIRS.put(VirtualCurrency.NXT, new String[]{ - Currency.USD, - Currency.EUR, - VirtualCurrency.BTC, - VirtualCurrency.ANC, - VirtualCurrency.DGC, - VirtualCurrency.DOGE, - VirtualCurrency.DVC, - VirtualCurrency.FRC, - VirtualCurrency.FTC, - VirtualCurrency.I0C, - VirtualCurrency.IXC, - VirtualCurrency.LTC, - VirtualCurrency.NMC, - VirtualCurrency.NVC, - VirtualCurrency.PPC, - VirtualCurrency.QRK, - VirtualCurrency.TRC, - VirtualCurrency.VTC, - VirtualCurrency.WDC, - VirtualCurrency.XPM - }); - CURRENCY_PAIRS.put(VirtualCurrency.PPC, new String[]{ - Currency.USD, - Currency.EUR, - VirtualCurrency.BTC, - VirtualCurrency.ANC, - VirtualCurrency.DGC, - VirtualCurrency.DOGE, - VirtualCurrency.DVC, - VirtualCurrency.FRC, - VirtualCurrency.FTC, - VirtualCurrency.I0C, - VirtualCurrency.IXC, - VirtualCurrency.LTC, - VirtualCurrency.NMC, - VirtualCurrency.NVC, - VirtualCurrency.NXT, - VirtualCurrency.QRK, - VirtualCurrency.TRC, - VirtualCurrency.VTC, - VirtualCurrency.WDC, - VirtualCurrency.XPM - }); - CURRENCY_PAIRS.put(VirtualCurrency.QRK, new String[]{ - Currency.USD, - Currency.EUR, - VirtualCurrency.BTC, - VirtualCurrency.ANC, - VirtualCurrency.DGC, - VirtualCurrency.DOGE, - VirtualCurrency.DVC, - VirtualCurrency.FRC, - VirtualCurrency.FTC, - VirtualCurrency.I0C, - VirtualCurrency.IXC, - VirtualCurrency.LTC, - VirtualCurrency.NMC, - VirtualCurrency.NVC, - VirtualCurrency.NXT, - VirtualCurrency.PPC, - VirtualCurrency.TRC, - VirtualCurrency.VTC, - VirtualCurrency.WDC, - VirtualCurrency.XPM - }); - CURRENCY_PAIRS.put(VirtualCurrency.TRC, new String[]{ - Currency.USD, - Currency.EUR, - VirtualCurrency.BTC, - VirtualCurrency.ANC, - VirtualCurrency.DGC, - VirtualCurrency.DOGE, - VirtualCurrency.DVC, - VirtualCurrency.FRC, - VirtualCurrency.FTC, - VirtualCurrency.I0C, - VirtualCurrency.IXC, - VirtualCurrency.LTC, - VirtualCurrency.NMC, - VirtualCurrency.NVC, - VirtualCurrency.NXT, - VirtualCurrency.PPC, - VirtualCurrency.QRK, - VirtualCurrency.VTC, - VirtualCurrency.WDC, - VirtualCurrency.XPM - }); - CURRENCY_PAIRS.put(VirtualCurrency.VTC, new String[]{ - Currency.USD, - Currency.EUR, - VirtualCurrency.BTC, - VirtualCurrency.ANC, - VirtualCurrency.DGC, - VirtualCurrency.DOGE, - VirtualCurrency.DVC, - VirtualCurrency.FRC, - VirtualCurrency.FTC, - VirtualCurrency.I0C, - VirtualCurrency.IXC, - VirtualCurrency.LTC, - VirtualCurrency.NMC, - VirtualCurrency.NVC, - VirtualCurrency.NXT, - VirtualCurrency.PPC, - VirtualCurrency.QRK, - VirtualCurrency.TRC, - VirtualCurrency.WDC, - VirtualCurrency.XPM - }); - CURRENCY_PAIRS.put(VirtualCurrency.WDC, new String[]{ - Currency.USD, - Currency.EUR, - VirtualCurrency.BTC, - VirtualCurrency.ANC, - VirtualCurrency.DGC, - VirtualCurrency.DOGE, - VirtualCurrency.DVC, - VirtualCurrency.FRC, - VirtualCurrency.FTC, - VirtualCurrency.I0C, - VirtualCurrency.IXC, - VirtualCurrency.LTC, - VirtualCurrency.NMC, - VirtualCurrency.NVC, - VirtualCurrency.NXT, - VirtualCurrency.PPC, - VirtualCurrency.QRK, - VirtualCurrency.TRC, - VirtualCurrency.VTC, - VirtualCurrency.XPM - }); - CURRENCY_PAIRS.put(VirtualCurrency.XPM, new String[]{ - Currency.USD, - Currency.EUR, - VirtualCurrency.BTC, - VirtualCurrency.ANC, - VirtualCurrency.DGC, - VirtualCurrency.DOGE, - VirtualCurrency.DVC, - VirtualCurrency.FRC, - VirtualCurrency.FTC, - VirtualCurrency.I0C, - VirtualCurrency.IXC, - VirtualCurrency.LTC, - VirtualCurrency.NMC, - VirtualCurrency.NVC, - VirtualCurrency.NXT, - VirtualCurrency.PPC, - VirtualCurrency.QRK, - VirtualCurrency.TRC, - VirtualCurrency.VTC, - VirtualCurrency.WDC, - }); - } - - public Vircurex() { - super(NAME, TTS_NAME, CURRENCY_PAIRS); - } - - @Override - public String getUrl(int requestId, CheckerInfo checkerInfo) { - return String.format(URL, checkerInfo.getCurrencyBase(), checkerInfo.getCurrencyCounter()); - } - - @Override - protected void parseTickerFromJsonObject(int requestId, JSONObject jsonObject, Ticker ticker, CheckerInfo checkerInfo) throws Exception { - ticker.bid = jsonObject.getDouble("highest_bid"); - ticker.ask = jsonObject.getDouble("lowest_ask"); - ticker.vol = jsonObject.getDouble("volume"); -// ticker.high; -// ticker.low; - ticker.last = jsonObject.getDouble("last_trade"); - } -} diff --git a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/Virtex.java b/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/Virtex.java deleted file mode 100644 index dd157033..00000000 --- a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/Virtex.java +++ /dev/null @@ -1,61 +0,0 @@ -package com.mobnetic.coinguardian.model.market; - -import java.util.HashMap; -import java.util.LinkedHashMap; - -import org.json.JSONObject; - -import com.mobnetic.coinguardian.model.CheckerInfo; -import com.mobnetic.coinguardian.model.Market; -import com.mobnetic.coinguardian.model.Ticker; -import com.mobnetic.coinguardian.model.currency.Currency; -import com.mobnetic.coinguardian.model.currency.VirtualCurrency; - -public class Virtex extends Market { - - private final static String NAME = "CaVirtEx"; - private final static String TTS_NAME = NAME; - private final static String URL = "https://cavirtex.com/api2/ticker.json"; - private final static HashMap CURRENCY_PAIRS = new LinkedHashMap(); - static { - CURRENCY_PAIRS.put(VirtualCurrency.BTC, new String[]{ - Currency.CAD, - VirtualCurrency.LTC - }); - CURRENCY_PAIRS.put(VirtualCurrency.LTC, new String[]{ - Currency.CAD - }); - } - - public Virtex() { - super(NAME, TTS_NAME, CURRENCY_PAIRS); - } - - @Override - public String getUrl(int requestId, CheckerInfo checkerInfo) { - return URL; - } - - @Override - protected void parseTickerFromJsonObject(int requestId, JSONObject jsonObject, Ticker ticker, CheckerInfo checkerInfo) throws Exception { - final JSONObject tickerJsonObject = jsonObject.getJSONObject("ticker"); - final JSONObject pairJsonObject = tickerJsonObject.getJSONObject(checkerInfo.getCurrencyBase()+checkerInfo.getCurrencyCounter()); - - if (!pairJsonObject.isNull("buy")) { - ticker.bid = pairJsonObject.getDouble("buy"); - } - if (!pairJsonObject.isNull("sell")) { - ticker.ask = pairJsonObject.getDouble("sell"); - } - if (!pairJsonObject.isNull("volume")) { - ticker.vol = pairJsonObject.getDouble("volume"); - } - if (!pairJsonObject.isNull("high")) { - ticker.high = pairJsonObject.getDouble("high"); - } - if (!pairJsonObject.isNull("low")) { - ticker.low = pairJsonObject.getDouble("low"); - } - ticker.last = pairJsonObject.getDouble("last"); - } -} diff --git a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/Winkdex.java b/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/Winkdex.java deleted file mode 100644 index 18e938f5..00000000 --- a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/Winkdex.java +++ /dev/null @@ -1,42 +0,0 @@ -package com.mobnetic.coinguardian.model.market; - -import java.util.HashMap; -import java.util.LinkedHashMap; - -import org.json.JSONObject; - -import com.mobnetic.coinguardian.model.CheckerInfo; -import com.mobnetic.coinguardian.model.Market; -import com.mobnetic.coinguardian.model.Ticker; -import com.mobnetic.coinguardian.model.currency.Currency; -import com.mobnetic.coinguardian.model.currency.VirtualCurrency; - -public class Winkdex extends Market { - - private final static String NAME = "Winkdex"; - private final static String TTS_NAME = NAME; - private final static String URL = "http://winkdex.com/static/js/stats.js"; - private final static HashMap CURRENCY_PAIRS = new LinkedHashMap(); - static { - CURRENCY_PAIRS.put(VirtualCurrency.BTC, new String[]{ - Currency.USD - }); - } - - public Winkdex() { - super(NAME, TTS_NAME, CURRENCY_PAIRS); - } - - @Override - public String getUrl(int requestId, CheckerInfo checkerInfo) { - return URL; - } - - @Override - protected void parseTickerFromJsonObject(int requestId, JSONObject jsonObject, Ticker ticker, CheckerInfo checkerInfo) throws Exception { - ticker.vol = jsonObject.getDouble("volume_btc_24h"); - ticker.high = jsonObject.getDouble("winkdex_high_24h"); - ticker.low = jsonObject.getDouble("winkdex_low_24h"); - ticker.last = jsonObject.getDouble("winkdex_usd"); - } -} diff --git a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/YoBit.java b/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/YoBit.java deleted file mode 100644 index d1881f6d..00000000 --- a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/YoBit.java +++ /dev/null @@ -1,75 +0,0 @@ -package com.mobnetic.coinguardian.model.market; - -import java.util.List; -import java.util.Locale; - -import org.json.JSONArray; -import org.json.JSONObject; - -import com.mobnetic.coinguardian.model.CheckerInfo; -import com.mobnetic.coinguardian.model.CurrencyPairInfo; -import com.mobnetic.coinguardian.model.Market; -import com.mobnetic.coinguardian.model.Ticker; -import com.mobnetic.coinguardiandatamodule.R; - -public class YoBit extends Market { - - private final static String NAME = "YoBit"; - private final static String TTS_NAME = NAME; - private final static String URL = "https://yobit.net/api/3/ticker/%1$s"; - private final static String URL_CURRENCY_PAIRS = "https://yobit.net/api/3/info"; - - public YoBit() { - super(NAME, TTS_NAME, null); - } - - @Override - public int getCautionResId() { - return R.string.market_caution_yobit; - } - - @Override - public String getUrl(int requestId, CheckerInfo checkerInfo) { - return String.format(URL, checkerInfo.getCurrencyPairId()); - } - - @Override - protected void parseTickerFromJsonObject(int requestId, JSONObject jsonObject, Ticker ticker, CheckerInfo checkerInfo) throws Exception { - final JSONArray names = jsonObject.names(); - JSONObject tickerJsonObject = jsonObject.getJSONObject(names.getString(0)); - - ticker.bid = tickerJsonObject.getDouble("sell"); - ticker.ask = tickerJsonObject.getDouble("buy"); - ticker.vol = tickerJsonObject.getDouble("vol"); - ticker.high = tickerJsonObject.getDouble("high"); - ticker.low = tickerJsonObject.getDouble("low"); - ticker.last = tickerJsonObject.getDouble("last"); - ticker.timestamp = tickerJsonObject.getLong("updated"); - } - - // ==================== - // Get currency pairs - // ==================== - @Override - public String getCurrencyPairsUrl(int requestId) { - return URL_CURRENCY_PAIRS; - } - - @Override - protected void parseCurrencyPairsFromJsonObject(int requestId, JSONObject jsonObject, List pairs) throws Exception { - final JSONObject pairsJsonObject = jsonObject.getJSONObject("pairs"); - final JSONArray pairsNames = pairsJsonObject.names(); - for(int i=0; i CURRENCY_PAIRS = new LinkedHashMap(); - static { - CURRENCY_PAIRS.put(VirtualCurrency.BTC, new String[]{ - Currency.EUR - }); - } - - public Zaydo() { - super(NAME, TTS_NAME, CURRENCY_PAIRS); - } - - @Override - public String getUrl(int requestId, CheckerInfo checkerInfo) { - return URL; - } - - @Override - protected void parseTickerFromJsonObject(int requestId, JSONObject jsonObject, Ticker ticker, CheckerInfo checkerInfo) throws Exception { - ticker.bid = ParseUtils.getDoubleFromString(jsonObject, "bid"); - ticker.ask = ParseUtils.getDoubleFromString(jsonObject, "ask"); - ticker.vol = ParseUtils.getDoubleFromString(jsonObject, "volume"); - ticker.high = ParseUtils.getDoubleFromString(jsonObject, "high"); - ticker.low = ParseUtils.getDoubleFromString(jsonObject, "low"); - ticker.last = ParseUtils.getDoubleFromString(jsonObject, "last"); - } -} diff --git a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/Zebpay.java b/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/Zebpay.java deleted file mode 100644 index 0e299617..00000000 --- a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/Zebpay.java +++ /dev/null @@ -1,100 +0,0 @@ -package com.mobnetic.coinguardian.model.market; - -import com.mobnetic.coinguardian.model.CheckerInfo; -import com.mobnetic.coinguardian.model.Market; -import com.mobnetic.coinguardian.model.Ticker; -import com.mobnetic.coinguardian.model.currency.Currency; -import com.mobnetic.coinguardian.model.currency.VirtualCurrency; - -import org.json.JSONObject; - -import java.util.HashMap; -import java.util.LinkedHashMap; - -public class Zebpay extends Market { - - private final static String NAME = "Zebpay"; - private final static String TTS_NAME = "Zeb Pay"; - private final static String URL = "https://www.zebapi.com/api/v1/market/ticker-new/%1$s/%2$s"; - private final static HashMap CURRENCY_PAIRS = new LinkedHashMap<>(); - - static { - CURRENCY_PAIRS.put(VirtualCurrency.AE, new String[]{ - VirtualCurrency.BTC - }); - CURRENCY_PAIRS.put(VirtualCurrency.BAT, new String[]{ - VirtualCurrency.BTC - }); - CURRENCY_PAIRS.put(VirtualCurrency.BCH, new String[]{ - VirtualCurrency.BTC - }); - CURRENCY_PAIRS.put(VirtualCurrency.BTC, new String[]{ - VirtualCurrency.TUSD - }); - CURRENCY_PAIRS.put(VirtualCurrency.BTG, new String[]{ - VirtualCurrency.BTC, - VirtualCurrency.TUSD - }); - CURRENCY_PAIRS.put(VirtualCurrency.CMT, new String[]{ - VirtualCurrency.BTC - }); - CURRENCY_PAIRS.put(VirtualCurrency.EOS, new String[]{ - VirtualCurrency.BTC - }); - CURRENCY_PAIRS.put(VirtualCurrency.ETH, new String[]{ - VirtualCurrency.BTC - }); - CURRENCY_PAIRS.put(VirtualCurrency.GNT, new String[]{ - VirtualCurrency.BTC - }); - CURRENCY_PAIRS.put(VirtualCurrency.IOST, new String[]{ - VirtualCurrency.BTC - }); - CURRENCY_PAIRS.put(VirtualCurrency.KNC, new String[]{ - VirtualCurrency.BTC - }); - CURRENCY_PAIRS.put(VirtualCurrency.LTC, new String[]{ - VirtualCurrency.BTC - }); - CURRENCY_PAIRS.put(VirtualCurrency.NCASH, new String[]{ - VirtualCurrency.BTC, - VirtualCurrency.XRP - }); - CURRENCY_PAIRS.put(VirtualCurrency.OMG, new String[]{ - VirtualCurrency.BTC - }); - CURRENCY_PAIRS.put(VirtualCurrency.REP, new String[]{ - VirtualCurrency.BTC - }); - CURRENCY_PAIRS.put(VirtualCurrency.TRX, new String[]{ - VirtualCurrency.BTC, - VirtualCurrency.XRP - }); - CURRENCY_PAIRS.put(VirtualCurrency.XRP, new String[]{ - VirtualCurrency.BTC - }); - CURRENCY_PAIRS.put(VirtualCurrency.ZIL, new String[]{ - VirtualCurrency.BTC - }); - CURRENCY_PAIRS.put(VirtualCurrency.ZRX, new String[]{ - VirtualCurrency.BTC - }); - } - - public Zebpay() { - super(NAME, TTS_NAME, CURRENCY_PAIRS); - } - - @Override - public String getUrl(int requestId, CheckerInfo checkerInfo) { - return String.format(URL, checkerInfo.getCurrencyBaseLowerCase(), checkerInfo.getCurrencyCounterLowerCase()); - } - - @Override - protected void parseTickerFromJsonObject(int requestId, JSONObject jsonObject, Ticker ticker, CheckerInfo checkerInfo) throws Exception { - ticker.bid = jsonObject.getDouble("sell"); - ticker.ask = jsonObject.getDouble("buy"); - ticker.vol = jsonObject.getDouble("volume"); - ticker.last = jsonObject.getDouble("market"); - } -} diff --git a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/example/MarketExample.java b/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/example/MarketExample.java deleted file mode 100644 index 34ab3464..00000000 --- a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/example/MarketExample.java +++ /dev/null @@ -1,49 +0,0 @@ -package com.mobnetic.coinguardian.model.market.example; - -import java.util.HashMap; -import java.util.LinkedHashMap; -import org.json.JSONObject; - -import com.mobnetic.coinguardian.model.CheckerInfo; -import com.mobnetic.coinguardian.model.Market; -import com.mobnetic.coinguardian.model.Ticker; -import com.mobnetic.coinguardian.model.currency.Currency; -import com.mobnetic.coinguardian.model.currency.VirtualCurrency; - -public class MarketExample extends Market { - - private final static String NAME = "Market Example"; - private final static String TTS_NAME = NAME; - private final static String URL = "https://www.marketexample.com/api/%1$s_%2$s/ticker/"; - private final static HashMap CURRENCY_PAIRS = new LinkedHashMap(); - static { - CURRENCY_PAIRS.put(VirtualCurrency.BTC, new String[]{ - Currency.CNY, - Currency.USD - }); - CURRENCY_PAIRS.put(VirtualCurrency.DOGE, new String[]{ - VirtualCurrency.BTC, - Currency.USD - }); - } - - public MarketExample() { - super(NAME, TTS_NAME, CURRENCY_PAIRS); - } - - @Override - public String getUrl(int requestId, CheckerInfo checkerInfo) { - return String.format(URL, checkerInfo.getCurrencyBase(), checkerInfo.getCurrencyCounter()); - } - - @Override - protected void parseTickerFromJsonObject(int requestId, JSONObject jsonObject, Ticker ticker, CheckerInfo checkerInfo) throws Exception { - ticker.bid = jsonObject.getDouble("bid"); - ticker.ask = jsonObject.getDouble("ask"); - ticker.vol = jsonObject.getDouble("volume"); - ticker.high = jsonObject.getDouble("high"); - ticker.low = jsonObject.getDouble("low"); - ticker.last = jsonObject.getDouble("last"); - ticker.timestamp = jsonObject.getLong("timestamp"); - } -} diff --git a/dataModule/src/main/java/com/mobnetic/coinguardian/util/CurrencyPairsMapHelper.java b/dataModule/src/main/java/com/mobnetic/coinguardian/util/CurrencyPairsMapHelper.java deleted file mode 100644 index 672d2d9a..00000000 --- a/dataModule/src/main/java/com/mobnetic/coinguardian/util/CurrencyPairsMapHelper.java +++ /dev/null @@ -1,78 +0,0 @@ -package com.mobnetic.coinguardian.util; - -import java.util.HashMap; -import java.util.LinkedHashMap; -import java.util.List; - -import com.mobnetic.coinguardian.model.CurrencyPairInfo; -import com.mobnetic.coinguardian.model.CurrencyPairsListWithDate; - -public class CurrencyPairsMapHelper { - - private long date; - private final HashMap currencyPairs; - private final HashMap currencyPairsIds; - private int pairsCount = 0; - - public CurrencyPairsMapHelper(CurrencyPairsListWithDate currencyPairsListWithDate) { - currencyPairs = new LinkedHashMap(); - currencyPairsIds = new HashMap(); - - if(currencyPairsListWithDate==null) - return; - - date = currencyPairsListWithDate.date; - List sortedPairs = currencyPairsListWithDate.pairs; - pairsCount = sortedPairs.size(); - - HashMap currencyGroupSizes = new HashMap(); - for(CurrencyPairInfo currencyPairInfo : sortedPairs) { - Integer currentCurrencyGroupSize = currencyGroupSizes.get(currencyPairInfo.getCurrencyBase()); - if(currentCurrencyGroupSize==null) { - currentCurrencyGroupSize = 1; - } else { - ++currentCurrencyGroupSize; - } - currencyGroupSizes.put(currencyPairInfo.getCurrencyBase(), currentCurrencyGroupSize); - } - - int currentGroupPositionToInsert = 0; - for(CurrencyPairInfo currencyPairInfo : sortedPairs) { - CharSequence[] currencyGroup = currencyPairs.get(currencyPairInfo.getCurrencyBase()); - if(currencyGroup==null) { - currencyGroup = new CharSequence[currencyGroupSizes.get(currencyPairInfo.getCurrencyBase())]; - currencyPairs.put(currencyPairInfo.getCurrencyBase(), currencyGroup); - currentGroupPositionToInsert = 0; - } else { - ++currentGroupPositionToInsert; - } - currencyGroup[currentGroupPositionToInsert] = currencyPairInfo.getCurrencyCounter(); - - if(currencyPairInfo.getCurrencyPairId()!=null) { - currencyPairsIds.put( - createCurrencyPairKey(currencyPairInfo.getCurrencyBase(), currencyPairInfo.getCurrencyCounter()), - currencyPairInfo.getCurrencyPairId()); - } - } - } - - public long getDate() { - return date; - } - - public HashMap getCurrencyPairs() { - return currencyPairs; - } - - public String getCurrencyPairId(String currencyBase, String currencyCounter) { - return currencyPairsIds.get(createCurrencyPairKey(currencyBase, currencyCounter)); - } - - public int getPairsCount() { - return pairsCount; - } - - private String createCurrencyPairKey(String currencyBase, String currencyCounter) { - return String.format("%1$s_%2$s", currencyBase, currencyCounter); - } -} diff --git a/dataModule/src/main/java/com/mobnetic/coinguardian/util/CurrencyUtils.java b/dataModule/src/main/java/com/mobnetic/coinguardian/util/CurrencyUtils.java deleted file mode 100644 index f6372cd3..00000000 --- a/dataModule/src/main/java/com/mobnetic/coinguardian/util/CurrencyUtils.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.mobnetic.coinguardian.util; - -import com.mobnetic.coinguardian.model.CurrencySubunit; -import com.mobnetic.coinguardian.model.CurrencySubunitsMap; -import com.mobnetic.coinguardian.model.currency.CurrenciesSubunits; -import com.mobnetic.coinguardian.model.currency.CurrencySymbols; - -public class CurrencyUtils { - - public static String getCurrencySymbol(String currency) { - return CurrencySymbols.CURRENCY_SYMBOLS.containsKey(currency) ? CurrencySymbols.CURRENCY_SYMBOLS.get(currency) : currency; - } - - public static CurrencySubunit getCurrencySubunit(String currency, long subunitToUnit) { - if(CurrenciesSubunits.CURRENCIES_SUBUNITS.containsKey(currency)) { - CurrencySubunitsMap subunits = CurrenciesSubunits.CURRENCIES_SUBUNITS.get(currency); - if(subunits.containsKey(subunitToUnit)) - return subunits.get(subunitToUnit); - } - - return new CurrencySubunit(currency, 1); - } -} diff --git a/dataModule/src/main/java/com/mobnetic/coinguardian/util/FormatUtilsBase.java b/dataModule/src/main/java/com/mobnetic/coinguardian/util/FormatUtilsBase.java deleted file mode 100644 index 437e9945..00000000 --- a/dataModule/src/main/java/com/mobnetic/coinguardian/util/FormatUtilsBase.java +++ /dev/null @@ -1,97 +0,0 @@ -package com.mobnetic.coinguardian.util; - -import java.text.DecimalFormat; -import java.util.Date; - -import android.content.Context; -import android.text.format.DateFormat; -import android.text.format.DateUtils; - -import com.mobnetic.coinguardian.model.CurrencySubunit; - -public class FormatUtilsBase { - - // ==================== - // Double formatting - // ==================== - private final static DecimalFormat FORMAT_TWO_DECIMAL = new DecimalFormat("0.00"); - private final static DecimalFormat FORMAT_FIVE_SIGNIFICANT_AT_MOST = new DecimalFormat("@#####"); - private final static DecimalFormat FORMAT_EIGHT_SIGNIFICANT_AT_MOST = new DecimalFormat("@#######"); - - // ==================== - // Format methods - // ==================== - public static String formatDouble(double value, boolean isPrice) { - return formatDouble(value<1 ? FORMAT_FIVE_SIGNIFICANT_AT_MOST : FORMAT_TWO_DECIMAL, value); - } - - public static String formatDoubleWithFiveMax(double value) { - return formatDouble(FORMAT_FIVE_SIGNIFICANT_AT_MOST, value); - } - - protected static String formatDoubleWithEightMax(double value) { - return formatDouble(FORMAT_EIGHT_SIGNIFICANT_AT_MOST, value); - } - - protected final static String formatDouble(DecimalFormat decimalFormat, double value) { - synchronized (decimalFormat) { - try { - return decimalFormat.format(value); - } catch (Exception e) { - e.printStackTrace(); - } - - return String.valueOf(value); - } - } - - // ==================== - // Price formatting - // ==================== - public static String formatPriceWithCurrency(double price, CurrencySubunit subunitDst) { - return formatPriceWithCurrency(price, subunitDst, true); - } - - protected static String formatPriceWithCurrency(double price, CurrencySubunit subunitDst, boolean showCurrencyDst) { - String priceString = formatPriceValueForSubunit(price, subunitDst, false, false); - if(showCurrencyDst) { - priceString = formatPriceWithCurrency(priceString, subunitDst.name); - } - - return priceString; - } - - public static String formatPriceWithCurrency(double value, String currency) { - return formatPriceWithCurrency(formatDouble(value, true), currency); - } - - public static String formatPriceWithCurrency(String priceString, String currency) { - return priceString+" "+CurrencyUtils.getCurrencySymbol(currency); - } - - public static String formatPriceValueForSubunit(double price, CurrencySubunit subunitDst, boolean forceInteger, boolean skipNoSignificantDecimal) { - price *= subunitDst.subunitToUnit; - if(!subunitDst.allowDecimal || forceInteger) - return String.valueOf((long)(price+0.5f)); - else if(skipNoSignificantDecimal) - return formatDoubleWithEightMax(price); - else - return formatDouble(price, true); - } - - // ==================== - // Date && Time formatting - // ==================== - public static String formatSameDayTimeOrDate(Context context, long time) { - if (DateUtils.isToday(time)) { - return DateFormat.getTimeFormat(context).format(new Date(time)); - } else { - return DateFormat.getDateFormat(context).format(new Date(time)); - } - } - - public static String formatDateTime(Context context, long time) { - final Date date = new Date(time); - return DateFormat.getTimeFormat(context).format(date)+", "+DateFormat.getDateFormat(context).format(date); - } -} diff --git a/dataModule/src/main/java/com/mobnetic/coinguardian/util/MarketsConfigUtils.java b/dataModule/src/main/java/com/mobnetic/coinguardian/util/MarketsConfigUtils.java deleted file mode 100644 index 7d71792c..00000000 --- a/dataModule/src/main/java/com/mobnetic/coinguardian/util/MarketsConfigUtils.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.mobnetic.coinguardian.util; - -import java.util.ArrayList; - -import com.mobnetic.coinguardian.config.MarketsConfig; -import com.mobnetic.coinguardian.model.Market; -import com.mobnetic.coinguardian.model.market.Unknown; - -public class MarketsConfigUtils { - - private final static Market UNKNOWN = new Unknown(); - - public static Market getMarketById(int id) { - synchronized (MarketsConfig.MARKETS) { - if(id>=0 && id(MarketsConfig.MARKETS.values()).get(id); - } - } - return UNKNOWN; - } - - public static Market getMarketByKey(String key) { - synchronized (MarketsConfig.MARKETS) { - if(MarketsConfig.MARKETS.containsKey(key)) - return MarketsConfig.MARKETS.get(key); - } - return UNKNOWN; - } - - public static int getMarketIdByKey(String key) { - int i=0; - for(Market market : MarketsConfig.MARKETS.values()){ - if(market.key.equals(key)) - return i; - ++i; - } - - return 0; - } -} diff --git a/dataModule/src/main/java/com/mobnetic/coinguardian/util/ParseUtils.java b/dataModule/src/main/java/com/mobnetic/coinguardian/util/ParseUtils.java deleted file mode 100644 index 0b6bf48b..00000000 --- a/dataModule/src/main/java/com/mobnetic/coinguardian/util/ParseUtils.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.mobnetic.coinguardian.util; - -import org.json.JSONException; -import org.json.JSONObject; - -public class ParseUtils { - - public static double getDoubleFromString(JSONObject jsonObject, String name) throws NumberFormatException, JSONException { - return Double.parseDouble(jsonObject.getString(name)); - } -} diff --git a/dataModule/src/main/java/com/mobnetic/coinguardian/util/TimeUtils.java b/dataModule/src/main/java/com/mobnetic/coinguardian/util/TimeUtils.java deleted file mode 100644 index 7b60eac8..00000000 --- a/dataModule/src/main/java/com/mobnetic/coinguardian/util/TimeUtils.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.mobnetic.coinguardian.util; - -public class TimeUtils { - - public final static long NANOS_IN_MILLIS = 1000; - public final static long MILLIS_IN_SECOND = 1000; - public final static long MILLIS_IN_MINUTE = 60*MILLIS_IN_SECOND; - public final static long MILLIS_IN_HOUR = 60*MILLIS_IN_MINUTE; - public final static long MILLIS_IN_DAY = 24*MILLIS_IN_HOUR; - private final static long MILLIS_IN_YEAR = 365*MILLIS_IN_DAY; - - public static long parseTimeToMillis(long time) { - if(time5000*MILLIS_IN_YEAR) - return time/1000; - return time; - } -} diff --git a/dataModule/src/main/java/com/mobnetic/coinguardian/util/XmlParserUtils.java b/dataModule/src/main/java/com/mobnetic/coinguardian/util/XmlParserUtils.java deleted file mode 100644 index dd04e89d..00000000 --- a/dataModule/src/main/java/com/mobnetic/coinguardian/util/XmlParserUtils.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.mobnetic.coinguardian.util; - -import org.w3c.dom.Document; -import org.w3c.dom.Node; -import org.w3c.dom.NodeList; - -public class XmlParserUtils { - - public static Node getFirstElementByTagName(Document doc, String name) { - NodeList nodes = doc.getElementsByTagName(name); - if(nodes!=null && nodes.getLength()>0) - return nodes.item(0); - return null; - } - - public static double getDoubleNodeValue(Node node) throws Exception { - return Double.parseDouble(getTextNodeValue(node)); - } - - public static String getTextNodeValue(Node node) throws Exception { - Node child; - if (node != null) { - if (node.hasChildNodes()) { - child = node.getFirstChild(); - while(child != null) { - if (child.getNodeType() == Node.TEXT_NODE) { - return child.getNodeValue(); - } - child = child.getNextSibling(); - } - } - } - return ""; - } -} diff --git a/dataModuleTester/build.gradle b/dataModuleTester/build.gradle index d86e881f..d0f85ddb 100644 --- a/dataModuleTester/build.gradle +++ b/dataModuleTester/build.gradle @@ -1,11 +1,12 @@ apply plugin: 'com.android.application' +apply plugin: 'kotlin-android' android { compileSdkVersion 28 buildToolsVersion "29.0.2" defaultConfig { - applicationId "com.mobnetic.coinguardiandatamodule.tester" + applicationId "com.aneonex.bitcoinchecker.datamodule.tester" minSdkVersion 26 targetSdkVersion 28 } @@ -22,5 +23,9 @@ dependencies { implementation project(':dataModule') implementation 'com.google.code.gson:gson:2.6.2' implementation 'com.android.volley:volley:1.1.0' + implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" // compile files('libs/volley.jar') } +repositories { + mavenCentral() +} diff --git a/dataModuleTester/src/main/AndroidManifest.xml b/dataModuleTester/src/main/AndroidManifest.xml index c3d71231..72088860 100644 --- a/dataModuleTester/src/main/AndroidManifest.xml +++ b/dataModuleTester/src/main/AndroidManifest.xml @@ -1,5 +1,5 @@ @@ -15,7 +15,7 @@ android:label="@string/app_name" android:theme="@style/AppTheme" > - diff --git a/dataModuleTester/src/main/java/com/mobnetic/coinguardiandatamodule/tester/MainActivity.java b/dataModuleTester/src/main/java/com/aneonex/bitcoinchecker/tester/MainActivity.java similarity index 88% rename from dataModuleTester/src/main/java/com/mobnetic/coinguardiandatamodule/tester/MainActivity.java rename to dataModuleTester/src/main/java/com/aneonex/bitcoinchecker/tester/MainActivity.java index 4bd50e9b..9b4915bb 100644 --- a/dataModuleTester/src/main/java/com/mobnetic/coinguardiandatamodule/tester/MainActivity.java +++ b/dataModuleTester/src/main/java/com/aneonex/bitcoinchecker/tester/MainActivity.java @@ -1,4 +1,4 @@ -package com.mobnetic.coinguardiandatamodule.tester; +package com.aneonex.bitcoinchecker.tester; import android.app.Activity; import android.os.Bundle; @@ -18,24 +18,24 @@ import com.android.volley.Request; import com.android.volley.RequestQueue; import com.android.volley.VolleyError; -import com.mobnetic.coinguardian.config.MarketsConfig; -import com.mobnetic.coinguardian.model.CheckerInfo; -import com.mobnetic.coinguardian.model.Futures; -import com.mobnetic.coinguardian.model.FuturesMarket; -import com.mobnetic.coinguardian.model.Market; -import com.mobnetic.coinguardian.model.Ticker; -import com.mobnetic.coinguardian.util.CurrencyPairsMapHelper; -import com.mobnetic.coinguardian.util.FormatUtilsBase; -import com.mobnetic.coinguardian.util.MarketsConfigUtils; -import com.mobnetic.coinguardiandatamodule.tester.dialog.DynamicCurrencyPairsDialog; -import com.mobnetic.coinguardiandatamodule.tester.util.CheckErrorsUtils; -import com.mobnetic.coinguardiandatamodule.tester.util.HttpsHelper; -import com.mobnetic.coinguardiandatamodule.tester.util.MarketCurrencyPairsStore; -import com.mobnetic.coinguardiandatamodule.tester.volley.CheckerErrorParsedError; -import com.mobnetic.coinguardiandatamodule.tester.volley.CheckerVolleyMainRequest; -import com.mobnetic.coinguardiandatamodule.tester.volley.CheckerVolleyMainRequest.TickerWrapper; -import com.mobnetic.coinguardiandatamodule.tester.volley.generic.ResponseErrorListener; -import com.mobnetic.coinguardiandatamodule.tester.volley.generic.ResponseListener; +import com.aneonex.bitcoinchecker.datamodule.config.MarketsConfig; +import com.aneonex.bitcoinchecker.datamodule.model.CheckerInfo; +import com.aneonex.bitcoinchecker.datamodule.model.Futures; +import com.aneonex.bitcoinchecker.datamodule.model.FuturesMarket; +import com.aneonex.bitcoinchecker.datamodule.model.Market; +import com.aneonex.bitcoinchecker.datamodule.model.Ticker; +import com.aneonex.bitcoinchecker.datamodule.util.CurrencyPairsMapHelper; +import com.aneonex.bitcoinchecker.datamodule.util.FormatUtilsBase; +import com.aneonex.bitcoinchecker.datamodule.util.MarketsConfigUtils; +import com.aneonex.bitcoinchecker.tester.dialog.DynamicCurrencyPairsDialog; +import com.aneonex.bitcoinchecker.tester.util.CheckErrorsUtils; +import com.aneonex.bitcoinchecker.tester.util.HttpsHelper; +import com.aneonex.bitcoinchecker.tester.util.MarketCurrencyPairsStore; +import com.aneonex.bitcoinchecker.tester.volley.CheckerErrorParsedError; +import com.aneonex.bitcoinchecker.tester.volley.CheckerVolleyMainRequest; +import com.aneonex.bitcoinchecker.tester.volley.CheckerVolleyMainRequest.TickerWrapper; +import com.aneonex.bitcoinchecker.tester.volley.generic.ResponseErrorListener; +import com.aneonex.bitcoinchecker.tester.volley.generic.ResponseListener; import java.util.HashMap; import java.util.Map; @@ -166,7 +166,7 @@ private int getSelectedContractType(Market market) { if (market instanceof FuturesMarket) { final FuturesMarket futuresMarket = (FuturesMarket) market; int selection = futuresContractTypeSpinner.getSelectedItemPosition(); - return futuresMarket.contractTypes[selection]; + return futuresMarket.getContractTypes()[selection]; } return Futures.CONTRACT_TYPE_WEEKLY; } @@ -231,9 +231,9 @@ private void refreshFuturesContractTypeSpinner(Market market) { SpinnerAdapter spinnerAdapter = null; if (market instanceof FuturesMarket) { final FuturesMarket futuresMarket = (FuturesMarket)market; - CharSequence[] entries = new CharSequence[futuresMarket.contractTypes.length]; - for (int i = 0; i(this, android.R.layout.simple_spinner_dropdown_item, entries); diff --git a/dataModuleTester/src/main/java/com/mobnetic/coinguardiandatamodule/tester/dialog/DynamicCurrencyPairsDialog.java b/dataModuleTester/src/main/java/com/aneonex/bitcoinchecker/tester/dialog/DynamicCurrencyPairsDialog.java similarity index 87% rename from dataModuleTester/src/main/java/com/mobnetic/coinguardiandatamodule/tester/dialog/DynamicCurrencyPairsDialog.java rename to dataModuleTester/src/main/java/com/aneonex/bitcoinchecker/tester/dialog/DynamicCurrencyPairsDialog.java index da5687ef..04b63916 100644 --- a/dataModuleTester/src/main/java/com/mobnetic/coinguardiandatamodule/tester/dialog/DynamicCurrencyPairsDialog.java +++ b/dataModuleTester/src/main/java/com/aneonex/bitcoinchecker/tester/dialog/DynamicCurrencyPairsDialog.java @@ -1,4 +1,4 @@ -package com.mobnetic.coinguardiandatamodule.tester.dialog; +package com.aneonex.bitcoinchecker.tester.dialog; import java.util.Map; @@ -14,15 +14,15 @@ import com.android.volley.NetworkResponse; import com.android.volley.RequestQueue; import com.android.volley.VolleyError; -import com.mobnetic.coinguardian.model.Market; -import com.mobnetic.coinguardian.util.CurrencyPairsMapHelper; -import com.mobnetic.coinguardian.util.FormatUtilsBase; -import com.mobnetic.coinguardiandatamodule.tester.R; -import com.mobnetic.coinguardiandatamodule.tester.util.CheckErrorsUtils; -import com.mobnetic.coinguardiandatamodule.tester.util.HttpsHelper; -import com.mobnetic.coinguardiandatamodule.tester.volley.DynamicCurrencyPairsVolleyMainRequest; -import com.mobnetic.coinguardiandatamodule.tester.volley.generic.ResponseErrorListener; -import com.mobnetic.coinguardiandatamodule.tester.volley.generic.ResponseListener; +import com.aneonex.bitcoinchecker.datamodule.model.Market; +import com.aneonex.bitcoinchecker.datamodule.util.CurrencyPairsMapHelper; +import com.aneonex.bitcoinchecker.datamodule.util.FormatUtilsBase; +import com.aneonex.bitcoinchecker.tester.R; +import com.aneonex.bitcoinchecker.tester.util.CheckErrorsUtils; +import com.aneonex.bitcoinchecker.tester.util.HttpsHelper; +import com.aneonex.bitcoinchecker.tester.volley.DynamicCurrencyPairsVolleyMainRequest; +import com.aneonex.bitcoinchecker.tester.volley.generic.ResponseErrorListener; +import com.aneonex.bitcoinchecker.tester.volley.generic.ResponseListener; public abstract class DynamicCurrencyPairsDialog extends AlertDialog implements OnDismissListener { diff --git a/dataModuleTester/src/main/java/com/mobnetic/coinguardiandatamodule/tester/util/CheckErrorsUtils.java b/dataModuleTester/src/main/java/com/aneonex/bitcoinchecker/tester/util/CheckErrorsUtils.java similarity index 96% rename from dataModuleTester/src/main/java/com/mobnetic/coinguardiandatamodule/tester/util/CheckErrorsUtils.java rename to dataModuleTester/src/main/java/com/aneonex/bitcoinchecker/tester/util/CheckErrorsUtils.java index cb4ccfc6..d632f28a 100644 --- a/dataModuleTester/src/main/java/com/mobnetic/coinguardiandatamodule/tester/util/CheckErrorsUtils.java +++ b/dataModuleTester/src/main/java/com/aneonex/bitcoinchecker/tester/util/CheckErrorsUtils.java @@ -1,4 +1,4 @@ -package com.mobnetic.coinguardiandatamodule.tester.util; +package com.aneonex.bitcoinchecker.tester.util; import java.io.PrintWriter; import java.io.StringWriter; @@ -14,7 +14,7 @@ import com.android.volley.ServerError; import com.android.volley.TimeoutError; import com.android.volley.VolleyError; -import com.mobnetic.coinguardiandatamodule.tester.R; +import com.aneonex.bitcoinchecker.tester.R; public class CheckErrorsUtils { diff --git a/dataModuleTester/src/main/java/com/mobnetic/coinguardiandatamodule/tester/util/HttpsHelper.java b/dataModuleTester/src/main/java/com/aneonex/bitcoinchecker/tester/util/HttpsHelper.java similarity index 95% rename from dataModuleTester/src/main/java/com/mobnetic/coinguardiandatamodule/tester/util/HttpsHelper.java rename to dataModuleTester/src/main/java/com/aneonex/bitcoinchecker/tester/util/HttpsHelper.java index 55865e39..3c2c35e8 100644 --- a/dataModuleTester/src/main/java/com/mobnetic/coinguardiandatamodule/tester/util/HttpsHelper.java +++ b/dataModuleTester/src/main/java/com/aneonex/bitcoinchecker/tester/util/HttpsHelper.java @@ -1,4 +1,4 @@ -package com.mobnetic.coinguardiandatamodule.tester.util; +package com.aneonex.bitcoinchecker.tester.util; import javax.net.ssl.SSLContext; import javax.net.ssl.SSLSocketFactory; diff --git a/dataModuleTester/src/main/java/com/mobnetic/coinguardiandatamodule/tester/util/MarketCurrencyPairsStore.java b/dataModuleTester/src/main/java/com/aneonex/bitcoinchecker/tester/util/MarketCurrencyPairsStore.java similarity index 91% rename from dataModuleTester/src/main/java/com/mobnetic/coinguardiandatamodule/tester/util/MarketCurrencyPairsStore.java rename to dataModuleTester/src/main/java/com/aneonex/bitcoinchecker/tester/util/MarketCurrencyPairsStore.java index fe347d3d..2ac7330c 100644 --- a/dataModuleTester/src/main/java/com/mobnetic/coinguardiandatamodule/tester/util/MarketCurrencyPairsStore.java +++ b/dataModuleTester/src/main/java/com/aneonex/bitcoinchecker/tester/util/MarketCurrencyPairsStore.java @@ -1,10 +1,10 @@ -package com.mobnetic.coinguardiandatamodule.tester.util; +package com.aneonex.bitcoinchecker.tester.util; import android.content.Context; import android.content.SharedPreferences; import com.google.gson.Gson; -import com.mobnetic.coinguardian.model.CurrencyPairsListWithDate; +import com.aneonex.bitcoinchecker.datamodule.model.CurrencyPairsListWithDate; public class MarketCurrencyPairsStore { diff --git a/dataModuleTester/src/main/java/com/mobnetic/coinguardiandatamodule/tester/volley/CheckerErrorParsedError.java b/dataModuleTester/src/main/java/com/aneonex/bitcoinchecker/tester/volley/CheckerErrorParsedError.java similarity index 85% rename from dataModuleTester/src/main/java/com/mobnetic/coinguardiandatamodule/tester/volley/CheckerErrorParsedError.java rename to dataModuleTester/src/main/java/com/aneonex/bitcoinchecker/tester/volley/CheckerErrorParsedError.java index ef3cfa44..1e224752 100644 --- a/dataModuleTester/src/main/java/com/mobnetic/coinguardiandatamodule/tester/volley/CheckerErrorParsedError.java +++ b/dataModuleTester/src/main/java/com/aneonex/bitcoinchecker/tester/volley/CheckerErrorParsedError.java @@ -1,4 +1,4 @@ -package com.mobnetic.coinguardiandatamodule.tester.volley; +package com.aneonex.bitcoinchecker.tester.volley; import com.android.volley.ParseError; diff --git a/dataModuleTester/src/main/java/com/mobnetic/coinguardiandatamodule/tester/volley/CheckerVolleyMainRequest.java b/dataModuleTester/src/main/java/com/aneonex/bitcoinchecker/tester/volley/CheckerVolleyMainRequest.java similarity index 84% rename from dataModuleTester/src/main/java/com/mobnetic/coinguardiandatamodule/tester/volley/CheckerVolleyMainRequest.java rename to dataModuleTester/src/main/java/com/aneonex/bitcoinchecker/tester/volley/CheckerVolleyMainRequest.java index 4c56ee1c..3b0c2341 100644 --- a/dataModuleTester/src/main/java/com/mobnetic/coinguardiandatamodule/tester/volley/CheckerVolleyMainRequest.java +++ b/dataModuleTester/src/main/java/com/aneonex/bitcoinchecker/tester/volley/CheckerVolleyMainRequest.java @@ -1,4 +1,4 @@ -package com.mobnetic.coinguardiandatamodule.tester.volley; +package com.aneonex.bitcoinchecker.tester.volley; import java.util.Map; @@ -8,11 +8,11 @@ import com.android.volley.Response.ErrorListener; import com.android.volley.Response.Listener; import com.android.volley.toolbox.RequestFuture; -import com.mobnetic.coinguardian.model.CheckerInfo; -import com.mobnetic.coinguardian.model.Market; -import com.mobnetic.coinguardian.model.Ticker; -import com.mobnetic.coinguardiandatamodule.tester.volley.CheckerVolleyMainRequest.TickerWrapper; -import com.mobnetic.coinguardiandatamodule.tester.volley.generic.GenericCheckerVolleyRequest; +import com.aneonex.bitcoinchecker.datamodule.model.CheckerInfo; +import com.aneonex.bitcoinchecker.datamodule.model.Market; +import com.aneonex.bitcoinchecker.datamodule.model.Ticker; +import com.aneonex.bitcoinchecker.tester.volley.CheckerVolleyMainRequest.TickerWrapper; +import com.aneonex.bitcoinchecker.tester.volley.generic.GenericCheckerVolleyRequest; public class CheckerVolleyMainRequest extends GenericCheckerVolleyRequest { diff --git a/dataModuleTester/src/main/java/com/mobnetic/coinguardiandatamodule/tester/volley/CheckerVolleyNextRequest.java b/dataModuleTester/src/main/java/com/aneonex/bitcoinchecker/tester/volley/CheckerVolleyNextRequest.java similarity index 69% rename from dataModuleTester/src/main/java/com/mobnetic/coinguardiandatamodule/tester/volley/CheckerVolleyNextRequest.java rename to dataModuleTester/src/main/java/com/aneonex/bitcoinchecker/tester/volley/CheckerVolleyNextRequest.java index 9fc871b2..6eec5391 100644 --- a/dataModuleTester/src/main/java/com/mobnetic/coinguardiandatamodule/tester/volley/CheckerVolleyNextRequest.java +++ b/dataModuleTester/src/main/java/com/aneonex/bitcoinchecker/tester/volley/CheckerVolleyNextRequest.java @@ -1,10 +1,10 @@ -package com.mobnetic.coinguardiandatamodule.tester.volley; +package com.aneonex.bitcoinchecker.tester.volley; import java.util.Map; import com.android.volley.toolbox.RequestFuture; -import com.mobnetic.coinguardian.model.CheckerInfo; -import com.mobnetic.coinguardiandatamodule.tester.volley.generic.GenericCheckerVolleyRequest; +import com.aneonex.bitcoinchecker.datamodule.model.CheckerInfo; +import com.aneonex.bitcoinchecker.tester.volley.generic.GenericCheckerVolleyRequest; public class CheckerVolleyNextRequest extends GenericCheckerVolleyRequest { diff --git a/dataModuleTester/src/main/java/com/mobnetic/coinguardiandatamodule/tester/volley/DynamicCurrencyPairsVolleyMainRequest.java b/dataModuleTester/src/main/java/com/aneonex/bitcoinchecker/tester/volley/DynamicCurrencyPairsVolleyMainRequest.java similarity index 82% rename from dataModuleTester/src/main/java/com/mobnetic/coinguardiandatamodule/tester/volley/DynamicCurrencyPairsVolleyMainRequest.java rename to dataModuleTester/src/main/java/com/aneonex/bitcoinchecker/tester/volley/DynamicCurrencyPairsVolleyMainRequest.java index 45464ef2..15e47952 100644 --- a/dataModuleTester/src/main/java/com/mobnetic/coinguardiandatamodule/tester/volley/DynamicCurrencyPairsVolleyMainRequest.java +++ b/dataModuleTester/src/main/java/com/aneonex/bitcoinchecker/tester/volley/DynamicCurrencyPairsVolleyMainRequest.java @@ -1,4 +1,4 @@ -package com.mobnetic.coinguardiandatamodule.tester.volley; +package com.aneonex.bitcoinchecker.tester.volley; import java.util.ArrayList; import java.util.Collections; @@ -11,12 +11,12 @@ import com.android.volley.Response.ErrorListener; import com.android.volley.Response.Listener; import com.android.volley.toolbox.RequestFuture; -import com.mobnetic.coinguardian.model.CurrencyPairInfo; -import com.mobnetic.coinguardian.model.CurrencyPairsListWithDate; -import com.mobnetic.coinguardian.model.Market; -import com.mobnetic.coinguardian.util.CurrencyPairsMapHelper; -import com.mobnetic.coinguardiandatamodule.tester.util.MarketCurrencyPairsStore; -import com.mobnetic.coinguardiandatamodule.tester.volley.generic.GzipVolleyRequest; +import com.aneonex.bitcoinchecker.datamodule.model.CurrencyPairInfo; +import com.aneonex.bitcoinchecker.datamodule.model.CurrencyPairsListWithDate; +import com.aneonex.bitcoinchecker.datamodule.model.Market; +import com.aneonex.bitcoinchecker.datamodule.util.CurrencyPairsMapHelper; +import com.aneonex.bitcoinchecker.tester.util.MarketCurrencyPairsStore; +import com.aneonex.bitcoinchecker.tester.volley.generic.GzipVolleyRequest; public class DynamicCurrencyPairsVolleyMainRequest extends GzipVolleyRequest { diff --git a/dataModuleTester/src/main/java/com/mobnetic/coinguardiandatamodule/tester/volley/DynamicCurrencyPairsVolleyNextRequest.java b/dataModuleTester/src/main/java/com/aneonex/bitcoinchecker/tester/volley/DynamicCurrencyPairsVolleyNextRequest.java similarity index 75% rename from dataModuleTester/src/main/java/com/mobnetic/coinguardiandatamodule/tester/volley/DynamicCurrencyPairsVolleyNextRequest.java rename to dataModuleTester/src/main/java/com/aneonex/bitcoinchecker/tester/volley/DynamicCurrencyPairsVolleyNextRequest.java index 496f6397..02d13a4a 100644 --- a/dataModuleTester/src/main/java/com/mobnetic/coinguardiandatamodule/tester/volley/DynamicCurrencyPairsVolleyNextRequest.java +++ b/dataModuleTester/src/main/java/com/aneonex/bitcoinchecker/tester/volley/DynamicCurrencyPairsVolleyNextRequest.java @@ -1,9 +1,9 @@ -package com.mobnetic.coinguardiandatamodule.tester.volley; +package com.aneonex.bitcoinchecker.tester.volley; import java.util.Map; import com.android.volley.toolbox.RequestFuture; -import com.mobnetic.coinguardiandatamodule.tester.volley.generic.GzipVolleyRequest; +import com.aneonex.bitcoinchecker.tester.volley.generic.GzipVolleyRequest; public class DynamicCurrencyPairsVolleyNextRequest extends GzipVolleyRequest { diff --git a/dataModuleTester/src/main/java/com/mobnetic/coinguardiandatamodule/tester/volley/UnknownVolleyError.java b/dataModuleTester/src/main/java/com/aneonex/bitcoinchecker/tester/volley/UnknownVolleyError.java similarity index 79% rename from dataModuleTester/src/main/java/com/mobnetic/coinguardiandatamodule/tester/volley/UnknownVolleyError.java rename to dataModuleTester/src/main/java/com/aneonex/bitcoinchecker/tester/volley/UnknownVolleyError.java index b25bc99d..9b97cc23 100644 --- a/dataModuleTester/src/main/java/com/mobnetic/coinguardiandatamodule/tester/volley/UnknownVolleyError.java +++ b/dataModuleTester/src/main/java/com/aneonex/bitcoinchecker/tester/volley/UnknownVolleyError.java @@ -1,4 +1,4 @@ -package com.mobnetic.coinguardiandatamodule.tester.volley; +package com.aneonex.bitcoinchecker.tester.volley; import com.android.volley.VolleyError; diff --git a/dataModuleTester/src/main/java/com/mobnetic/coinguardiandatamodule/tester/volley/generic/GenericCheckerVolleyRequest.java b/dataModuleTester/src/main/java/com/aneonex/bitcoinchecker/tester/volley/generic/GenericCheckerVolleyRequest.java similarity index 78% rename from dataModuleTester/src/main/java/com/mobnetic/coinguardiandatamodule/tester/volley/generic/GenericCheckerVolleyRequest.java rename to dataModuleTester/src/main/java/com/aneonex/bitcoinchecker/tester/volley/generic/GenericCheckerVolleyRequest.java index aed7f800..e62d8ccb 100644 --- a/dataModuleTester/src/main/java/com/mobnetic/coinguardiandatamodule/tester/volley/generic/GenericCheckerVolleyRequest.java +++ b/dataModuleTester/src/main/java/com/aneonex/bitcoinchecker/tester/volley/generic/GenericCheckerVolleyRequest.java @@ -1,8 +1,8 @@ -package com.mobnetic.coinguardiandatamodule.tester.volley.generic; +package com.aneonex.bitcoinchecker.tester.volley.generic; import com.android.volley.Response.ErrorListener; import com.android.volley.Response.Listener; -import com.mobnetic.coinguardian.model.CheckerInfo; +import com.aneonex.bitcoinchecker.datamodule.model.CheckerInfo; public abstract class GenericCheckerVolleyRequest extends GzipVolleyRequest { diff --git a/dataModuleTester/src/main/java/com/mobnetic/coinguardiandatamodule/tester/volley/generic/GzipVolleyRequest.java b/dataModuleTester/src/main/java/com/aneonex/bitcoinchecker/tester/volley/generic/GzipVolleyRequest.java similarity index 95% rename from dataModuleTester/src/main/java/com/mobnetic/coinguardiandatamodule/tester/volley/generic/GzipVolleyRequest.java rename to dataModuleTester/src/main/java/com/aneonex/bitcoinchecker/tester/volley/generic/GzipVolleyRequest.java index b8fee520..b21c93c3 100644 --- a/dataModuleTester/src/main/java/com/mobnetic/coinguardiandatamodule/tester/volley/generic/GzipVolleyRequest.java +++ b/dataModuleTester/src/main/java/com/aneonex/bitcoinchecker/tester/volley/generic/GzipVolleyRequest.java @@ -1,4 +1,4 @@ -package com.mobnetic.coinguardiandatamodule.tester.volley.generic; +package com.aneonex.bitcoinchecker.tester.volley.generic; import java.io.BufferedReader; import java.io.ByteArrayInputStream; @@ -19,8 +19,8 @@ import com.android.volley.Response.Listener; import com.android.volley.VolleyError; import com.android.volley.toolbox.HttpHeaderParser; -import com.mobnetic.coinguardiandatamodule.tester.volley.CheckerErrorParsedError; -import com.mobnetic.coinguardiandatamodule.tester.volley.UnknownVolleyError; +import com.aneonex.bitcoinchecker.tester.volley.CheckerErrorParsedError; +import com.aneonex.bitcoinchecker.tester.volley.UnknownVolleyError; public abstract class GzipVolleyRequest extends Request { diff --git a/dataModuleTester/src/main/java/com/mobnetic/coinguardiandatamodule/tester/volley/generic/ResponseErrorListener.java b/dataModuleTester/src/main/java/com/aneonex/bitcoinchecker/tester/volley/generic/ResponseErrorListener.java similarity index 88% rename from dataModuleTester/src/main/java/com/mobnetic/coinguardiandatamodule/tester/volley/generic/ResponseErrorListener.java rename to dataModuleTester/src/main/java/com/aneonex/bitcoinchecker/tester/volley/generic/ResponseErrorListener.java index cbcc502d..624bb386 100644 --- a/dataModuleTester/src/main/java/com/mobnetic/coinguardiandatamodule/tester/volley/generic/ResponseErrorListener.java +++ b/dataModuleTester/src/main/java/com/aneonex/bitcoinchecker/tester/volley/generic/ResponseErrorListener.java @@ -1,4 +1,4 @@ -package com.mobnetic.coinguardiandatamodule.tester.volley.generic; +package com.aneonex.bitcoinchecker.tester.volley.generic; import java.util.Map; diff --git a/dataModuleTester/src/main/java/com/mobnetic/coinguardiandatamodule/tester/volley/generic/ResponseListener.java b/dataModuleTester/src/main/java/com/aneonex/bitcoinchecker/tester/volley/generic/ResponseListener.java similarity index 87% rename from dataModuleTester/src/main/java/com/mobnetic/coinguardiandatamodule/tester/volley/generic/ResponseListener.java rename to dataModuleTester/src/main/java/com/aneonex/bitcoinchecker/tester/volley/generic/ResponseListener.java index 25b9cf35..05118031 100644 --- a/dataModuleTester/src/main/java/com/mobnetic/coinguardiandatamodule/tester/volley/generic/ResponseListener.java +++ b/dataModuleTester/src/main/java/com/aneonex/bitcoinchecker/tester/volley/generic/ResponseListener.java @@ -1,4 +1,4 @@ -package com.mobnetic.coinguardiandatamodule.tester.volley.generic; +package com.aneonex.bitcoinchecker.tester.volley.generic; import java.util.Map; From fd8937bcc72718bb1cc2abfb1f02985c3b6c55c2 Mon Sep 17 00:00:00 2001 From: Aneonex Software <69394046+aneonex@users.noreply.github.com> Date: Sat, 5 Sep 2020 23:12:57 +0300 Subject: [PATCH 030/183] Fixed links in readme after migration to Kotlin --- README.md | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/README.md b/README.md index eec18efe..6120da53 100644 --- a/README.md +++ b/README.md @@ -63,7 +63,7 @@ The whole tutorial described below refers to the [DataModule](dataModule) projec ## Updating currency pairs on existing exchange: *__Note if particular exchange supports dynamic currency pairs syncing mechanism there is NO need to add pairs manually here.__ * -To update currency pairs on your favourite exchange, you have to find the corresponding exchange class file in the [com.mobnetic.coinguardian.model.market](dataModule/src/main/java/com/mobnetic/coinguardian/model/market) package. +To update currency pairs on your favourite exchange, you have to find the corresponding exchange class file in the [com.aneonex.bitcoinchecker.datamodule.model.market](dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market) package. In every exchange file there is a `CURRENCY_PAIRS` HashMap that contains a base currency (as a key) and a list of counter currencies. Every combination of base and counter currency represents one currency pair. ```java @@ -76,10 +76,10 @@ CURRENCY_PAIRS.put(VirtualCurrency.LTC, // Base currency } ); ``` -This example from [BTC-e](dataModule/src/main/java/com/mobnetic/coinguardian/model/market/Btce.java) represents 4 pairs: `LTC/BTC`, `LTC/USD`, `LTC/RUR` and `LTC/EUR`. +This example from [BTC-e](dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Btce.kt) represents 4 pairs: `LTC/BTC`, `LTC/USD`, `LTC/RUR` and `LTC/EUR`. ### Adding new pair on Cryptsy? -This is generally enough, but while adding a new currency pair on [Cryptsy](dataModule/src/main/java/com/mobnetic/coinguardian/model/market/Cryptsy.java) you also need to provide a special pair ID. Please include it in a map called `CURRENCY_PAIRS_IDS`, as shown here: +This is generally enough, but while adding a new currency pair on [Cryptsy](dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Cryptsy.kt) you also need to provide a special pair ID. Please include it in a map called `CURRENCY_PAIRS_IDS`, as shown here: ```java [...] @@ -94,8 +94,8 @@ The simplest way to find the pair ID is to click or hover on that particular pai Try to keep alphabetical order of base currencies (or even with counter currencies) but sometimes it's also good to mirror the order from the exchange site. While adding new pairs, you should use currency names from these two classes: -- [Currency](dataModule/src/main/java/com/mobnetic/coinguardian/model/currency/Currency.java) - where you can find fiat currencies -- [VirtualCurrency](dataModule/src/main/java/com/mobnetic/coinguardian/model/currency/VirtualCurrency.java) - where all of the crypto/virtual currencies are stored +- [Currency](dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/currency/Currency.java) - where you can find fiat currencies +- [VirtualCurrency](dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/currency/VirtualCurrency.kt) - where all of the crypto/virtual currencies are stored ### Some currencies are missing? You want to add some currency pairs but one currency (or both) is missing in Currency or VirtualCurrency class? @@ -104,12 +104,12 @@ Just add them to the Currency or VirtualCurrency class. Please put all fiat/norm ## Adding new exchange: #### Example: -Please see the example of a class that represents a single exchange here - [MarketExample](dataModule/src/main/java/com/mobnetic/coinguardian/model/market/example/MarketExample.java) +Please see the example of a class that represents a single exchange here - [MarketExample](dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/example/MarketExample.kt) ### 1. New exchange configuration: To add support for a new exchange, you have to provide some constants describing that particular exchange: * `NAME` - name of the exchange that will be displayed in the app. -* `TTS_NAME` - name of the exchange that will be used in spoken announements. Sometimes it's just fine to put `NAME` here (see [Kraken](dataModule/src/main/java/com/mobnetic/coinguardian/model/market/Kraken.java)), but sometimes it's better to provide a more spoken friendly version (like on [McxNOW](dataModule/src/main/java/com/mobnetic/coinguardian/model/market/McxNOW.java) - "MCX now"). +* `TTS_NAME` - name of the exchange that will be used in spoken announements. Sometimes it's just fine to put `NAME` here (see [Kraken](dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Kraken.kt)), but sometimes it's better to provide a more spoken friendly version (like on [McxNOW](dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/McxNOW.kt) - "MCX now"). * `URL` - this field stores the Url for the Ticker API. Most often it contains two parameters, but sometimes it has one (`%1$s` and `%2$s`). These parameters are replaced with currency names or the selected currency pair. Providing a URL is described in the next section. * `CURRENCY_PAIRS` - map of all currencies supported by this exchange - described later. @@ -167,7 +167,7 @@ public String getUrl(int requestId, CheckerInfo checkerInfo) { ``` #### 3a. Providing other parameters in URL (advanced): -Sometimes there is a need to include some kind of pair ID instead of just currency names. Please see [Cryptsy](dataModule/src/main/java/com/mobnetic/coinguardian/model/market/Cryptsy.java) as an example. There is a separate `CURRENCY_PAIRS_IDS` map that holds pair ids: +Sometimes there is a need to include some kind of pair ID instead of just currency names. Please see [Cryptsy](dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Cryptsy.java) as an example. There is a separate `CURRENCY_PAIRS_IDS` map that holds pair ids: ```java [...] @@ -195,7 +195,7 @@ public String getUrl(int requestId, CheckerInfo checkerInfo) { ``` ### 4. Parsing API response: -While parsing the response from the exchange you have to fill the fieds of [Ticker](dataModule/src/main/java/com/mobnetic/coinguardian/model/Ticker.java) object. +While parsing the response from the exchange you have to fill the fieds of [Ticker](dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/Ticker.kt) object. If the API response is just in plain JSON object, you can parse it in the parseTickerFromJsonObject method: ```java @@ -212,7 +212,7 @@ protected void parseTickerFromJsonObject(int requestId, JSONObject jsonObject, T ``` __IMPORTANT:__ The ticker.last field is mandatory; the rest of the fields are optional. -__NOTE:__ Parsing the `timestamp` field (in millis) is not required. If omitted, Bitcoin Checker will fill it with `now` date. If you want to parse this information, please note that some exchanges provide time in different formats (like seconds or nanos) so you have to multiply or divide it to get the time in millis format. You can use `TimeUtils.NANOS_IN_MILLIS` or `TimeUtils.MILLIS_IN_SECOND` constants from [TimeUtils](dataModule/src/main/java/com/mobnetic/coinguardian/util/TimeUtils.java) for that. +__NOTE:__ Parsing the `timestamp` field (in millis) is not required. If omitted, Bitcoin Checker will fill it with `now` date. If you want to parse this information, please note that some exchanges provide time in different formats (like seconds or nanos) so you have to multiply or divide it to get the time in millis format. You can use `TimeUtils.NANOS_IN_MILLIS` or `TimeUtils.MILLIS_IN_SECOND` constants from [TimeUtils](dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/util/TimeUtils.kt) for that. #### 4a. Parsing non JSONObject responses (advanced): Sometimes responses are more complicated than plain JSON, then you should use the `parseTicker` method. The default implementation try to parse received response as a `JSONObject`, but you can parse also other formats by overriding this method: @@ -224,12 +224,12 @@ protected void parseTicker(int requestId, String responseString, Ticker ticker, ``` Here you can find examples of usage: -* [Huobi](dataModule/src/main/java/com/mobnetic/coinguardian/model/market/Huobi.java): "almost" JSON object response, there is a need to trim some characters at the begining and at the end of the response -* [MintPal](dataModule/src/main/java/com/mobnetic/coinguardian/model/market/MintPal.java): JSON array response (instead of JSON object) -* [McxNOW](dataModule/src/main/java/com/mobnetic/coinguardian/model/market/McxNOW.java): XML based response +* [Huobi](dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Huobi.kt): "almost" JSON object response, there is a need to trim some characters at the begining and at the end of the response +* [MintPal](dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/MintPal.kt): JSON array response (instead of JSON object) +* [McxNOW](dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/McxNOW.kt): XML based response ### 5. Parsing error (not required): -Sometimes an exchange is down but with some error message in their API (See [Crypto-Trade](dataModule/src/main/java/com/mobnetic/coinguardian/model/market/CryptoTrade.java) as an example). You can also handle this situation and display an error message directly from the exchange to the user. There are two methods related with it and they are designed in a similar way to parsing a normal response: +Sometimes an exchange is down but with some error message in their API (See [Crypto-Trade](dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/CryptoTrade.kt) as an example). You can also handle this situation and display an error message directly from the exchange to the user. There are two methods related with it and they are designed in a similar way to parsing a normal response: ```java protected String parseErrorFromJsonObject(int requestId, JSONObject jsonObject, CheckerInfo checkerInfo); @@ -241,7 +241,7 @@ protected String parseError(int requestId, String responseString, CheckerInfo ch ### 6. Fetching currency pairs directly from exchange: If there is any API (or other way) to obtain currency pairs directly from exchange (without need to update them manually) you should implement currency pairs fetching functionality instead of providing a static set of currency pairs. -See example on [Basebit](dataModule/src/main/java/com/mobnetic/coinguardian/model/market/Basebit.java). +See example on [Basebit](dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Basebit.kt). Because there are no static currency pairs defined - you should pass a `null` as a last argument in the constructor and do NOT initialize `CURRENCY_PAIRS` at all. You need to provide the url to fetch currency pairs instead: ```java @@ -266,7 +266,7 @@ or protected void parseCurrencyPairs(int requestId, String responseString, List pairs) ``` -While parsing currency pairs you need to create [CurrencyPairInfo](dataModule/src/main/java/com/mobnetic/coinguardian/model/CurrencyPairInfo.java) and add it to `List pairs`. The last argument `pairId` is a unique pair id used on some exchanges. You can just pass `null` if there is no such thing on given exchange. +While parsing currency pairs you need to create [CurrencyPairInfo](dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/CurrencyPairInfo.kt) and add it to `List pairs`. The last argument `pairId` is a unique pair id used on some exchanges. You can just pass `null` if there is no such thing on given exchange. You can also use multiple requests to fetch currency pairs from exchange - it is described in section [Multiple requests while fetching currency pairs](# multiple-requests-while-fetching-currency-pairs). @@ -284,7 +284,7 @@ static { ### Multiple requests per exchange: Some exchanges do not provide a nice ticker api with the all important information (bid, ask, vol, high, low, last), so there is a need to perform a few requests (for example 2) to acquire as much information as possible. These requests will be performed in a sequense and a new price notification will appear when all of these requests are finished. -See the [Poloniex](dataModule/src/main/java/com/mobnetic/coinguardian/model/market/Poloniex.java) exchange as a good example. In order to perform 2 requests you have to override `getNumOfRequests` method: +See the [Poloniex](dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Poloniex.kt) exchange as a good example. In order to perform 2 requests you have to override `getNumOfRequests` method: ```java @Override From 27c8697c691d8feeb71b807cad8456ad363f84a9 Mon Sep 17 00:00:00 2001 From: Aneonex Software <69394046+aneonex@users.noreply.github.com> Date: Sat, 5 Sep 2020 23:14:59 +0300 Subject: [PATCH 031/183] Fixed file extensions in readme (java->kt) --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 6120da53..2fe611cf 100644 --- a/README.md +++ b/README.md @@ -94,12 +94,12 @@ The simplest way to find the pair ID is to click or hover on that particular pai Try to keep alphabetical order of base currencies (or even with counter currencies) but sometimes it's also good to mirror the order from the exchange site. While adding new pairs, you should use currency names from these two classes: -- [Currency](dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/currency/Currency.java) - where you can find fiat currencies +- [Currency](dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/currency/Currency.kt) - where you can find fiat currencies - [VirtualCurrency](dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/currency/VirtualCurrency.kt) - where all of the crypto/virtual currencies are stored ### Some currencies are missing? You want to add some currency pairs but one currency (or both) is missing in Currency or VirtualCurrency class? -Just add them to the Currency or VirtualCurrency class. Please put all fiat/normal currencies in the Currency.java file and all crypto/virtual currencies in VirtualCurrency.java. +Just add them to the Currency or VirtualCurrency class. Please put all fiat/normal currencies in the Currency.kt file and all crypto/virtual currencies in VirtualCurrency.kt. ## Adding new exchange: @@ -167,7 +167,7 @@ public String getUrl(int requestId, CheckerInfo checkerInfo) { ``` #### 3a. Providing other parameters in URL (advanced): -Sometimes there is a need to include some kind of pair ID instead of just currency names. Please see [Cryptsy](dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Cryptsy.java) as an example. There is a separate `CURRENCY_PAIRS_IDS` map that holds pair ids: +Sometimes there is a need to include some kind of pair ID instead of just currency names. Please see [Cryptsy](dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Cryptsy.kt) as an example. There is a separate `CURRENCY_PAIRS_IDS` map that holds pair ids: ```java [...] From ed91993b345e358bd5620c45a559b8063fecfdb2 Mon Sep 17 00:00:00 2001 From: Alexander Biryukov Date: Mon, 14 Sep 2020 12:23:23 +0300 Subject: [PATCH 032/183] Tester app migrated to Kotlin + lint warn fixes --- build.gradle | 2 +- dataModule/build.gradle | 2 +- .../bitcoinchecker/datamodule/model/Market.kt | 19 +- .../datamodule/model/market/AllCoin.kt | 2 +- .../datamodule/model/market/BitMEX.kt | 2 +- .../datamodule/model/market/BitcoinCoId.kt | 2 +- .../model/market/BitcoinVenezuela.kt | 2 +- .../datamodule/model/market/Bithumb.kt | 2 +- .../datamodule/model/market/Bitorado.kt | 2 +- .../datamodule/model/market/Bitso.kt | 2 +- .../datamodule/model/market/Bleutrade.kt | 15 +- .../datamodule/model/market/Braziliex.kt | 2 +- .../datamodule/model/market/Btc38.kt | 2 +- .../datamodule/model/market/CexIO.kt | 10 +- .../datamodule/model/market/CoinDesk.kt | 2 +- .../datamodule/model/market/CoinJar.kt | 4 +- .../datamodule/model/market/CoinTraderNet.kt | 2 +- .../datamodule/model/market/Coinome.kt | 4 +- .../datamodule/model/market/Coinone.kt | 2 +- .../datamodule/model/market/Comkort.kt | 2 +- .../datamodule/model/market/CryptoAltex.kt | 6 +- .../datamodule/model/market/CryptoRush.kt | 2 +- .../datamodule/model/market/Cryptoine.kt | 2 +- .../datamodule/model/market/Cryptonit.kt | 3 +- .../datamodule/model/market/Cryptopia.kt | 10 +- .../datamodule/model/market/Cryptsy.kt | 2 +- .../datamodule/model/market/Exmo.kt | 2 +- .../datamodule/model/market/HitBtc.kt | 1 - .../datamodule/model/market/Igot.kt | 4 +- .../datamodule/model/market/Koinex.kt | 2 +- .../datamodule/model/market/Kraken.kt | 19 +- .../datamodule/model/market/LakeBTC.kt | 2 +- .../datamodule/model/market/Liqui.kt | 4 +- .../datamodule/model/market/Livecoin.kt | 2 +- .../datamodule/model/market/LocalBitcoins.kt | 4 +- .../datamodule/model/market/McxNOW.kt | 3 +- .../datamodule/model/market/Poloniex.kt | 2 +- .../datamodule/model/market/Prelude.kt | 8 +- .../datamodule/model/market/Quoine.kt | 2 +- .../datamodule/model/market/ShapeShift.kt | 2 +- .../datamodule/model/market/Uphold.kt | 2 +- .../datamodule/model/market/YoBit.kt | 4 +- .../datamodule/util/TimeUtils.kt | 2 +- dataModuleTester/build.gradle | 12 +- dataModuleTester/src/main/AndroidManifest.xml | 1 - .../bitcoinchecker/tester/MainActivity.java | 320 ------------------ .../bitcoinchecker/tester/MainActivity.kt | 269 +++++++++++++++ .../dialog/DynamicCurrencyPairsDialog.java | 127 ------- .../dialog/DynamicCurrencyPairsDialog.kt | 102 ++++++ .../tester/util/CheckErrorsUtils.java | 86 ----- .../tester/util/CheckErrorsUtils.kt | 64 ++++ .../tester/util/HttpsHelper.java | 51 --- .../bitcoinchecker/tester/util/HttpsHelper.kt | 45 +++ .../tester/util/MarketCurrencyPairsStore.java | 37 -- .../tester/util/MarketCurrencyPairsStore.kt | 37 ++ .../volley/CheckerErrorParsedError.java | 19 -- .../tester/volley/CheckerErrorParsedError.kt | 10 + .../volley/CheckerVolleyMainRequest.java | 72 ---- .../tester/volley/CheckerVolleyMainRequest.kt | 63 ++++ .../volley/CheckerVolleyNextRequest.java | 19 -- .../tester/volley/CheckerVolleyNextRequest.kt | 12 + ...DynamicCurrencyPairsVolleyMainRequest.java | 70 ---- .../DynamicCurrencyPairsVolleyMainRequest.kt | 49 +++ ...DynamicCurrencyPairsVolleyNextRequest.java | 19 -- .../DynamicCurrencyPairsVolleyNextRequest.kt | 11 + .../tester/volley/UnknownVolleyError.java | 12 - .../tester/volley/UnknownVolleyError.kt | 9 + .../generic/GenericCheckerVolleyRequest.java | 16 - .../generic/GenericCheckerVolleyRequest.kt | 6 + .../volley/generic/GzipVolleyRequest.java | 165 --------- .../volley/generic/GzipVolleyRequest.kt | 133 ++++++++ .../volley/generic/ResponseErrorListener.java | 18 - .../volley/generic/ResponseErrorListener.kt | 12 + .../volley/generic/ResponseListener.java | 16 - .../tester/volley/generic/ResponseListener.kt | 11 + 75 files changed, 918 insertions(+), 1147 deletions(-) delete mode 100644 dataModuleTester/src/main/java/com/aneonex/bitcoinchecker/tester/MainActivity.java create mode 100644 dataModuleTester/src/main/java/com/aneonex/bitcoinchecker/tester/MainActivity.kt delete mode 100644 dataModuleTester/src/main/java/com/aneonex/bitcoinchecker/tester/dialog/DynamicCurrencyPairsDialog.java create mode 100644 dataModuleTester/src/main/java/com/aneonex/bitcoinchecker/tester/dialog/DynamicCurrencyPairsDialog.kt delete mode 100644 dataModuleTester/src/main/java/com/aneonex/bitcoinchecker/tester/util/CheckErrorsUtils.java create mode 100644 dataModuleTester/src/main/java/com/aneonex/bitcoinchecker/tester/util/CheckErrorsUtils.kt delete mode 100644 dataModuleTester/src/main/java/com/aneonex/bitcoinchecker/tester/util/HttpsHelper.java create mode 100644 dataModuleTester/src/main/java/com/aneonex/bitcoinchecker/tester/util/HttpsHelper.kt delete mode 100644 dataModuleTester/src/main/java/com/aneonex/bitcoinchecker/tester/util/MarketCurrencyPairsStore.java create mode 100644 dataModuleTester/src/main/java/com/aneonex/bitcoinchecker/tester/util/MarketCurrencyPairsStore.kt delete mode 100644 dataModuleTester/src/main/java/com/aneonex/bitcoinchecker/tester/volley/CheckerErrorParsedError.java create mode 100644 dataModuleTester/src/main/java/com/aneonex/bitcoinchecker/tester/volley/CheckerErrorParsedError.kt delete mode 100644 dataModuleTester/src/main/java/com/aneonex/bitcoinchecker/tester/volley/CheckerVolleyMainRequest.java create mode 100644 dataModuleTester/src/main/java/com/aneonex/bitcoinchecker/tester/volley/CheckerVolleyMainRequest.kt delete mode 100644 dataModuleTester/src/main/java/com/aneonex/bitcoinchecker/tester/volley/CheckerVolleyNextRequest.java create mode 100644 dataModuleTester/src/main/java/com/aneonex/bitcoinchecker/tester/volley/CheckerVolleyNextRequest.kt delete mode 100644 dataModuleTester/src/main/java/com/aneonex/bitcoinchecker/tester/volley/DynamicCurrencyPairsVolleyMainRequest.java create mode 100644 dataModuleTester/src/main/java/com/aneonex/bitcoinchecker/tester/volley/DynamicCurrencyPairsVolleyMainRequest.kt delete mode 100644 dataModuleTester/src/main/java/com/aneonex/bitcoinchecker/tester/volley/DynamicCurrencyPairsVolleyNextRequest.java create mode 100644 dataModuleTester/src/main/java/com/aneonex/bitcoinchecker/tester/volley/DynamicCurrencyPairsVolleyNextRequest.kt delete mode 100644 dataModuleTester/src/main/java/com/aneonex/bitcoinchecker/tester/volley/UnknownVolleyError.java create mode 100644 dataModuleTester/src/main/java/com/aneonex/bitcoinchecker/tester/volley/UnknownVolleyError.kt delete mode 100644 dataModuleTester/src/main/java/com/aneonex/bitcoinchecker/tester/volley/generic/GenericCheckerVolleyRequest.java create mode 100644 dataModuleTester/src/main/java/com/aneonex/bitcoinchecker/tester/volley/generic/GenericCheckerVolleyRequest.kt delete mode 100644 dataModuleTester/src/main/java/com/aneonex/bitcoinchecker/tester/volley/generic/GzipVolleyRequest.java create mode 100644 dataModuleTester/src/main/java/com/aneonex/bitcoinchecker/tester/volley/generic/GzipVolleyRequest.kt delete mode 100644 dataModuleTester/src/main/java/com/aneonex/bitcoinchecker/tester/volley/generic/ResponseErrorListener.java create mode 100644 dataModuleTester/src/main/java/com/aneonex/bitcoinchecker/tester/volley/generic/ResponseErrorListener.kt delete mode 100644 dataModuleTester/src/main/java/com/aneonex/bitcoinchecker/tester/volley/generic/ResponseListener.java create mode 100644 dataModuleTester/src/main/java/com/aneonex/bitcoinchecker/tester/volley/generic/ResponseListener.kt diff --git a/build.gradle b/build.gradle index 280076a1..b564ec98 100644 --- a/build.gradle +++ b/build.gradle @@ -1,6 +1,6 @@ // Top-level build file where you can add configuration options common to all sub-projects/modules. buildscript { - ext.kotlin_version = '1.4.0' + ext.kotlin_version = '1.4.10' repositories { google() jcenter() diff --git a/dataModule/build.gradle b/dataModule/build.gradle index ac50589c..3ab29754 100644 --- a/dataModule/build.gradle +++ b/dataModule/build.gradle @@ -3,7 +3,7 @@ apply plugin: 'kotlin-android' android { compileSdkVersion 30 - buildToolsVersion "29.0.2" + buildToolsVersion '30.0.2' defaultConfig { minSdkVersion 26 diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/Market.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/Market.kt index 8b3cd26f..f5e5edfb 100644 --- a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/Market.kt +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/Market.kt @@ -5,17 +5,14 @@ import com.aneonex.bitcoinchecker.datamodule.model.currency.CurrencyPairsMap import com.aneonex.bitcoinchecker.datamodule.util.TimeUtils import org.json.JSONObject -abstract class Market(name: String, ttsName: String, currencyPairs: CurrencyPairsMap?) { - @kotlin.jvm.JvmField - val key: String = this.javaClass.simpleName - - @kotlin.jvm.JvmField - val name: String = name - - val ttsName: String = ttsName +abstract class Market( + @kotlin.jvm.JvmField val name: String, + @kotlin.jvm.JvmField val ttsName: String, + @kotlin.jvm.JvmField val currencyPairs: CurrencyPairsMap? + ) { @kotlin.jvm.JvmField - val currencyPairs: CurrencyPairsMap? + val key: String = this.javaClass.simpleName open val cautionResId: Int get() = 0 @@ -91,8 +88,4 @@ abstract class Market(name: String, ttsName: String, currencyPairs: CurrencyPair protected open fun parseCurrencyPairsFromJsonObject(requestId: Int, jsonObject: JSONObject, pairs: MutableList) { // do parsing } - - init { - this.currencyPairs = currencyPairs - } } \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/AllCoin.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/AllCoin.kt index a2ef3375..36e788d9 100644 --- a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/AllCoin.kt +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/AllCoin.kt @@ -42,7 +42,7 @@ class AllCoin : Market(NAME, TTS_NAME, null) { @Throws(Exception::class) override fun parseCurrencyPairsFromJsonObject(requestId: Int, jsonObject: JSONObject, pairs: MutableList) { val dataJsonObject = jsonObject.getJSONObject("data") - val pairsJsonArray = dataJsonObject.names() + val pairsJsonArray = dataJsonObject.names()!! for (i in 0 until pairsJsonArray.length()) { val pairName = pairsJsonArray.getString(i) val marketJsonObject = dataJsonObject.getJSONObject(pairName) diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/BitMEX.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/BitMEX.kt index 11ca54aa..2ad77c77 100644 --- a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/BitMEX.kt +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/BitMEX.kt @@ -45,7 +45,7 @@ class BitMEX : Market(NAME, TTS_NAME, null) { if (!jsonObject.isNull("lowPrice")) ticker.low = jsonObject.getDouble("lowPrice") ticker.last = jsonObject.getDouble("lastPrice") // This is an ISO timestamp representing UTC time - ticker.timestamp = ISO_DATE_FORMAT.parse(jsonObject.getString("timestamp")).time + ticker.timestamp = ISO_DATE_FORMAT.parse(jsonObject.getString("timestamp"))?.time ?: 0 } // ==================== diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/BitcoinCoId.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/BitcoinCoId.kt index 6409d544..b3ac2937 100644 --- a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/BitcoinCoId.kt +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/BitcoinCoId.kt @@ -38,7 +38,7 @@ class BitcoinCoId : Market(NAME, TTS_NAME, null) { @Throws(Exception::class) override fun parseCurrencyPairsFromJsonObject(requestId: Int, jsonObject: JSONObject, pairs: MutableList) { val tickersJsonObject = jsonObject.getJSONObject("tickers") - val tickerNamesArray = tickersJsonObject.names() + val tickerNamesArray = tickersJsonObject.names()!! for (i in 0 until tickerNamesArray.length()) { val pairId = tickerNamesArray.getString(i) ?: continue val currencies = pairId.split("_".toRegex()).toTypedArray() diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/BitcoinVenezuela.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/BitcoinVenezuela.kt index 830c45ce..41f4f72d 100644 --- a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/BitcoinVenezuela.kt +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/BitcoinVenezuela.kt @@ -35,7 +35,7 @@ class BitcoinVenezuela : Market(NAME, TTS_NAME, null) { private fun parseCurrencyPairsFromCurrencyBase(currencyBase: String, jsonObject: JSONObject, pairs: MutableList) { if (!jsonObject.has(currencyBase)) return val currencyBaseJsonObject = jsonObject.getJSONObject(currencyBase) - val counterCurrencyNames = currencyBaseJsonObject.names() + val counterCurrencyNames = currencyBaseJsonObject.names()!! for (i in 0 until counterCurrencyNames.length()) { pairs.add(CurrencyPairInfo( currencyBase, diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Bithumb.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Bithumb.kt index c5fe89bb..c3a8ce92 100644 --- a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Bithumb.kt +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Bithumb.kt @@ -53,7 +53,7 @@ class Bithumb : Market(NAME, TTS_NAME, CURRENCY_PAIRS) { } } - override fun getNumOfRequests(checkerRecord: CheckerInfo?): Int { + override fun getNumOfRequests(checkerInfo: CheckerInfo?): Int { return 2 } diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Bitorado.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Bitorado.kt index 281181fc..d8aabff4 100644 --- a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Bitorado.kt +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Bitorado.kt @@ -33,7 +33,7 @@ class Bitorado : Market(NAME, TTS_NAME, null) { override fun parseCurrencyPairsFromJsonObject(requestId: Int, jsonObject: JSONObject, pairs: MutableList) { val result = jsonObject.getJSONObject("result") val markets = result.getJSONObject("markets") - val pairNames = markets.names() + val pairNames = markets.names()!! for (i in 0 until pairNames.length()) { val pairId = pairNames.getString(i) ?: continue val currencies = pairId.split("-".toRegex()).toTypedArray() diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Bitso.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Bitso.kt index f53616a6..52a3a511 100644 --- a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Bitso.kt +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Bitso.kt @@ -66,7 +66,7 @@ class Bitso : Market(NAME, TTS_NAME, CURRENCY_PAIRS) { @Throws(Exception::class) override fun parseCurrencyPairsFromJsonObject(requestId: Int, jsonObject: JSONObject, pairs: MutableList) { - val pairIds = jsonObject.names() + val pairIds = jsonObject.names()!! for (i in 0 until pairIds.length()) { val pairId = pairIds.getString(i) ?: continue val currencies = pairId.split("_".toRegex()).toTypedArray() diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Bleutrade.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Bleutrade.kt index 686caa78..5d959c97 100644 --- a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Bleutrade.kt +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Bleutrade.kt @@ -15,8 +15,7 @@ class Bleutrade : Market(NAME, TTS_NAME, null) { @Throws(Exception::class) override fun parseTickerFromJsonObject(requestId: Int, jsonObject: JSONObject, ticker: Ticker, checkerInfo: CheckerInfo) { val resultObject = jsonObject["result"] - var resultsJsonObject: JSONObject? = null - resultsJsonObject = if (resultObject is JSONArray) { + val resultsJsonObject = if (resultObject is JSONArray) { resultObject.getJSONObject(0) } else { resultObject as JSONObject @@ -46,13 +45,11 @@ class Bleutrade : Market(NAME, TTS_NAME, null) { val pairId = pairJsonObject.getString("MarketName") val currencyBase = pairJsonObject.getString("MarketCurrency") val currencyCounter = pairJsonObject.getString("BaseCurrency") - if (pairId != null && currencyBase != null && currencyCounter != null) { - pairs.add(CurrencyPairInfo( - currencyBase, - currencyCounter, - pairId - )) - } + pairs.add(CurrencyPairInfo( + currencyBase, + currencyCounter, + pairId + )) } } diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Braziliex.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Braziliex.kt index 9b8243fa..1e8ff923 100644 --- a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Braziliex.kt +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Braziliex.kt @@ -31,7 +31,7 @@ class Braziliex : Market(NAME, TTS_NAME, null) { @Throws(Exception::class) override fun parseCurrencyPairsFromJsonObject(requestId: Int, jsonObject: JSONObject, pairs: MutableList) { - val pairIds = jsonObject.names() + val pairIds = jsonObject.names()!! for (i in 0 until pairIds.length()) { val pairId = pairIds.getString(i) ?: continue val currencies = pairId.split("_".toRegex()).toTypedArray() diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Btc38.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Btc38.kt index fcea9559..c3ea418b 100644 --- a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Btc38.kt +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Btc38.kt @@ -42,7 +42,7 @@ class Btc38 : Market(NAME, TTS_NAME, null) { @Throws(Exception::class) override fun parseCurrencyPairsFromJsonObject(requestId: Int, jsonObject: JSONObject, pairs: MutableList) { val currencyCounter = getCurrencyCounter(requestId) - val currencyBaseList = jsonObject.names() + val currencyBaseList = jsonObject.names()!! for (i in 0 until currencyBaseList.length()) { pairs.add(CurrencyPairInfo( currencyBaseList.getString(i).toUpperCase(Locale.ENGLISH), diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/CexIO.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/CexIO.kt index 7a55c39a..40f16d91 100644 --- a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/CexIO.kt +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/CexIO.kt @@ -66,12 +66,10 @@ class CexIO : Market(NAME, TTS_NAME, CURRENCY_PAIRS) { val pairJsonObject = pairsJsonArray.getJSONObject(i) val currencyBase = pairJsonObject.getString("symbol1") val currencyCounter = pairJsonObject.getString("symbol2") - if (currencyBase != null && currencyCounter != null) { - pairs.add(CurrencyPairInfo( - currencyBase, - currencyCounter, - null)) - } + pairs.add(CurrencyPairInfo( + currencyBase, + currencyCounter, + null)) } } } \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/CoinDesk.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/CoinDesk.kt index 7db3b1bb..e570f789 100644 --- a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/CoinDesk.kt +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/CoinDesk.kt @@ -29,7 +29,7 @@ class CoinDesk : Market(NAME, TTS_NAME, null) { @Throws(Exception::class) override fun parseCurrencyPairsFromJsonObject(requestId: Int, jsonObject: JSONObject, pairs: MutableList) { val bpiJsonObject = jsonObject.getJSONObject("bpi") - val currencyCounterNames = bpiJsonObject.names() + val currencyCounterNames = bpiJsonObject.names()!! for (i in 0 until currencyCounterNames.length()) { pairs.add(CurrencyPairInfo(VirtualCurrency.BTC, currencyCounterNames.getString(i), null)) } diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/CoinJar.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/CoinJar.kt index af19e5c5..de0dcc11 100644 --- a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/CoinJar.kt +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/CoinJar.kt @@ -14,7 +14,7 @@ class CoinJar : Market(NAME, TTS_NAME, null) { @Throws(Exception::class) override fun parseTickerFromJsonObject(requestId: Int, jsonObject: JSONObject, ticker: Ticker, checkerInfo: CheckerInfo) { val ratesJsonObject = jsonObject.getJSONObject("exchange_rates") - val pairJsonObject = ratesJsonObject.getJSONObject(checkerInfo.currencyPairId) + val pairJsonObject = ratesJsonObject.getJSONObject(checkerInfo.currencyPairId!!) ticker.bid = pairJsonObject.getDouble("bid") ticker.ask = pairJsonObject.getDouble("ask") ticker.last = pairJsonObject.getDouble("midpoint") @@ -30,7 +30,7 @@ class CoinJar : Market(NAME, TTS_NAME, null) { @Throws(Exception::class) override fun parseCurrencyPairsFromJsonObject(requestId: Int, jsonObject: JSONObject, pairs: MutableList) { val ratesJsonObject = jsonObject.getJSONObject("exchange_rates") - val namesJsonArray = ratesJsonObject.names() + val namesJsonArray = ratesJsonObject.names()!! for (i in 0 until namesJsonArray.length()) { val symbol = namesJsonArray.getString(i) val pairJsonObject = ratesJsonObject.getJSONObject(symbol) diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/CoinTraderNet.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/CoinTraderNet.kt index 0cd30e9f..3756040a 100644 --- a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/CoinTraderNet.kt +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/CoinTraderNet.kt @@ -30,7 +30,7 @@ class CoinTraderNet : Market(NAME, TTS_NAME, CURRENCY_PAIRS) { @Throws(Exception::class) override fun parseTickerFromJsonObject(requestId: Int, jsonObject: JSONObject, ticker: Ticker, checkerInfo: CheckerInfo) { val dataJsonObject = jsonObject.getJSONObject("data") - val dataNamesArray = dataJsonObject.names() + val dataNamesArray = dataJsonObject.names()!! val tickerJsonObject = dataJsonObject.getJSONObject(dataNamesArray.getString(0)) ticker.bid = tickerJsonObject.getDouble("bid") ticker.ask = tickerJsonObject.getDouble("offer") diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Coinome.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Coinome.kt index d591c2ab..18d5d702 100644 --- a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Coinome.kt +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Coinome.kt @@ -14,7 +14,7 @@ class Coinome : Market(NAME, TTS_NAME, null) { @Throws(Exception::class) override fun parseTickerFromJsonObject(requestId: Int, jsonObject: JSONObject, ticker: Ticker, checkerInfo: CheckerInfo) { - val tickerJsonObject = jsonObject.getJSONObject(checkerInfo.currencyPairId) + val tickerJsonObject = jsonObject.getJSONObject(checkerInfo.currencyPairId!!) ticker.bid = tickerJsonObject.getDouble("highest_bid") ticker.ask = tickerJsonObject.getDouble("lowest_ask") //ticker.vol = tickerJsonObject.getDouble("24hr_volume"); Currently null @@ -30,7 +30,7 @@ class Coinome : Market(NAME, TTS_NAME, null) { @Throws(Exception::class) override fun parseCurrencyPairsFromJsonObject(requestId: Int, jsonObject: JSONObject, pairs: MutableList) { - val pairArray = jsonObject.names() + val pairArray = jsonObject.names()!! for (i in 0 until pairArray.length()) { val pairId = pairArray.getString(i) val currencies = pairId.split("-".toRegex()).toTypedArray() diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Coinone.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Coinone.kt index 80ff2256..acfd23f3 100644 --- a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Coinone.kt +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Coinone.kt @@ -38,7 +38,7 @@ class Coinone : Market(NAME, TTS_NAME, CURRENCY_PAIRS) { } } - override fun getNumOfRequests(checkerRecord: CheckerInfo?): Int { + override fun getNumOfRequests(checkerInfo: CheckerInfo?): Int { return 2 } diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Comkort.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Comkort.kt index 5df948fd..9399690c 100644 --- a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Comkort.kt +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Comkort.kt @@ -14,7 +14,7 @@ class Comkort : Market(NAME, TTS_NAME, null) { @Throws(Exception::class) override fun parseTickerFromJsonObject(requestId: Int, jsonObject: JSONObject, ticker: Ticker, checkerInfo: CheckerInfo) { val marketsJsonObject = jsonObject.getJSONObject("markets") - val marketNames = marketsJsonObject.names() + val marketNames = marketsJsonObject.names()!! val marketJsonObject = marketsJsonObject.getJSONObject(marketNames.getString(0)) ticker.bid = getFirstOrderFrom(marketJsonObject, "buy_orders") ticker.ask = getFirstOrderFrom(marketJsonObject, "sell_orders") diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/CryptoAltex.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/CryptoAltex.kt index daa77127..b57b739e 100644 --- a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/CryptoAltex.kt +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/CryptoAltex.kt @@ -13,7 +13,7 @@ class CryptoAltex : Market(NAME, TTS_NAME, null) { @Throws(Exception::class) override fun parseTickerFromJsonObject(requestId: Int, jsonObject: JSONObject, ticker: Ticker, checkerInfo: CheckerInfo) { - val pairObject = jsonObject.getJSONObject(checkerInfo.currencyPairId) + val pairObject = jsonObject.getJSONObject(checkerInfo.currencyPairId!!) ticker.vol = pairObject.getDouble("24_hours_volume") ticker.high = pairObject.getDouble("24_hours_price_high") ticker.low = pairObject.getDouble("24_hours_price_low") @@ -29,11 +29,11 @@ class CryptoAltex : Market(NAME, TTS_NAME, null) { @Throws(Exception::class) override fun parseCurrencyPairsFromJsonObject(requestId: Int, jsonObject: JSONObject, pairs: MutableList) { - val pairsNamesArray = jsonObject.names() + val pairsNamesArray = jsonObject.names()!! for (i in 0 until pairsNamesArray.length()) { val pairName = pairsNamesArray.getString(i) val split = pairName.split("/".toRegex()).toTypedArray() - if (split != null && split.size >= 2) { + if (split.size >= 2) { pairs.add(CurrencyPairInfo(split[0], split[1], pairName)) } } diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/CryptoRush.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/CryptoRush.kt index 598bb722..36b031a0 100644 --- a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/CryptoRush.kt +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/CryptoRush.kt @@ -35,7 +35,7 @@ class CryptoRush : Market(NAME, TTS_NAME, null) { @Throws(Exception::class) override fun parseCurrencyPairsFromJsonObject(requestId: Int, jsonObject: JSONObject, pairs: MutableList) { - val pairNames = jsonObject.names() + val pairNames = jsonObject.names()!! for (i in 0 until pairNames.length()) { val pairId = pairNames.getString(i) ?: continue val currencies = pairId.split("/".toRegex()).toTypedArray() diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Cryptoine.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Cryptoine.kt index 38af5b60..db163539 100644 --- a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Cryptoine.kt +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Cryptoine.kt @@ -37,7 +37,7 @@ class Cryptoine : Market(NAME, TTS_NAME, null) { @Throws(Exception::class) override fun parseCurrencyPairsFromJsonObject(requestId: Int, jsonObject: JSONObject, pairs: MutableList) { val dataJsonObject = jsonObject.getJSONObject("data") - val pairNames = dataJsonObject.names() + val pairNames = dataJsonObject.names()!! for (i in 0 until pairNames.length()) { val pairId = pairNames.getString(i) ?: continue val currencies = pairId.split("_".toRegex()).toTypedArray() diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Cryptonit.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Cryptonit.kt index 9a32d957..4cbc202f 100644 --- a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Cryptonit.kt +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Cryptonit.kt @@ -38,9 +38,8 @@ class Cryptonit : Market(NAME, TTS_NAME, null) { @Throws(Exception::class) override fun parseCurrencyPairs(requestId: Int, responseString: String, pairs: MutableList) { val pairsJsonArray = JSONArray(responseString) - var currenciesJsonArray: JSONArray? = null for (i in 0 until pairsJsonArray.length()) { - currenciesJsonArray = pairsJsonArray.getJSONArray(i) + val currenciesJsonArray = pairsJsonArray.getJSONArray(i) if (currenciesJsonArray.length() != 2) continue val currencyBase = currenciesJsonArray.getString(1) // reversed pairs! val currencyCounter = currenciesJsonArray.getString(0) // reversed pairs! diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Cryptopia.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Cryptopia.kt index 48513630..d1ee15c3 100644 --- a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Cryptopia.kt +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Cryptopia.kt @@ -42,12 +42,10 @@ class Cryptopia : Market(NAME, TTS_NAME, null) { val currencyBase = pairJsonObject.getString("Symbol") val currencyCounter = pairJsonObject.getString("BaseSymbol") val pairId = pairJsonObject.getString("Id") - if (currencyCounter != null && currencyCounter != null && pairId != null) { - pairs.add(CurrencyPairInfo( - currencyBase, - currencyCounter, - pairId)) - } + pairs.add(CurrencyPairInfo( + currencyBase, + currencyCounter, + pairId)) } } diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Cryptsy.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Cryptsy.kt index eda9f9a3..1d12ba6c 100644 --- a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Cryptsy.kt +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Cryptsy.kt @@ -213,7 +213,7 @@ class Cryptsy : Market(NAME, TTS_NAME, null) { val marketObject = dataJsonArray.getJSONObject(i) val currencyPair = marketObject.getString("label") ?: continue val currencies: Array = currencyPair.split("/".toRegex()).toTypedArray() - if (currencies.size != 2 || currencies[0] == null || currencies[1] == null) continue + if (currencies.size != 2) continue pairs.add(CurrencyPairInfo( currencies[0], currencies[1], diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Exmo.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Exmo.kt index eb0c04f4..025ee5fe 100644 --- a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Exmo.kt +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Exmo.kt @@ -31,7 +31,7 @@ class Exmo : Market(NAME, TTS_NAME, null) { @Throws(Exception::class) override fun parseCurrencyPairsFromJsonObject(requestId: Int, jsonObject: JSONObject, pairs: MutableList) { - val pairIds = jsonObject.names() + val pairIds = jsonObject.names()!! for (i in 0 until pairIds.length()) { val pairId = pairIds.getString(i) ?: continue val currencies = pairId.split("_".toRegex()).toTypedArray() diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/HitBtc.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/HitBtc.kt index ca446827..297d27e9 100644 --- a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/HitBtc.kt +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/HitBtc.kt @@ -37,7 +37,6 @@ class HitBtc : Market(NAME, TTS_NAME, null) { val currencyBase = pairJsonObject.getString("commodity") val currencyCounter = pairJsonObject.getString("currency") val currencyPairId = pairJsonObject.getString("symbol") - if (currencyBase == null || currencyCounter == null || currencyPairId == null) continue pairs.add(CurrencyPairInfo(currencyBase, currencyCounter, currencyPairId)) } } diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Igot.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Igot.kt index 600f99a6..e17123fa 100644 --- a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Igot.kt +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Igot.kt @@ -15,7 +15,7 @@ class Igot : Market(NAME, TTS_NAME, null) { @Throws(Exception::class) override fun parseTickerFromJsonObject(requestId: Int, jsonObject: JSONObject, ticker: Ticker, checkerInfo: CheckerInfo) { - val pairJsonObject = jsonObject.getJSONObject(checkerInfo.currencyPairId) + val pairJsonObject = jsonObject.getJSONObject(checkerInfo.currencyPairId!!) ticker.high = pairJsonObject.getDouble("highest_today") ticker.low = pairJsonObject.getDouble("lowest_today") ticker.last = pairJsonObject.getDouble("current_rate") @@ -30,7 +30,7 @@ class Igot : Market(NAME, TTS_NAME, null) { @Throws(Exception::class) override fun parseCurrencyPairsFromJsonObject(requestId: Int, jsonObject: JSONObject, pairs: MutableList) { - val pairsJsonArray = jsonObject.names() + val pairsJsonArray = jsonObject.names()!! for (i in 0 until pairsJsonArray.length()) { val currencyCounter = pairsJsonArray.getString(i) if (currencyCounter != null) { diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Koinex.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Koinex.kt index 811bd101..25327de3 100644 --- a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Koinex.kt +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Koinex.kt @@ -34,7 +34,7 @@ class Koinex : Market(NAME, TTS_NAME, null) { @Throws(Exception::class) override fun parseCurrencyPairsFromJsonObject(requestId: Int, jsonObject: JSONObject, pairs: MutableList) { val currencyJSONObject = jsonObject.getJSONObject("stats") - val currencyArray = currencyJSONObject.names() + val currencyArray = currencyJSONObject.names()!! for (i in 0 until currencyArray.length()) { pairs.add(CurrencyPairInfo(currencyArray.getString(i), Currency.INR, null)) } diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Kraken.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Kraken.kt index 8b18baf4..afb8c7a8 100644 --- a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Kraken.kt +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Kraken.kt @@ -27,7 +27,7 @@ class Kraken : Market(NAME, TTS_NAME, null) { @Throws(Exception::class) override fun parseTickerFromJsonObject(requestId: Int, jsonObject: JSONObject, ticker: Ticker, checkerInfo: CheckerInfo) { val resultObject = jsonObject.getJSONObject("result") - val pairObject = resultObject.getJSONObject(resultObject.names().getString(0)) + val pairObject = resultObject.getJSONObject(resultObject.names()!!.getString(0)) ticker.bid = getDoubleFromJsonArrayObject(pairObject, "b") ticker.ask = getDoubleFromJsonArrayObject(pairObject, "a") ticker.vol = getDoubleFromJsonArrayObject(pairObject, "v") @@ -52,7 +52,7 @@ class Kraken : Market(NAME, TTS_NAME, null) { @Throws(Exception::class) override fun parseCurrencyPairsFromJsonObject(requestId: Int, jsonObject: JSONObject, pairs: MutableList) { val result = jsonObject.getJSONObject("result") - val pairNames = result.names() + val pairNames = result.names()!! for (i in 0 until pairNames.length()) { val pairId = pairNames.getString(i) if (pairId != null && pairId.indexOf('.') == -1) { @@ -66,16 +66,19 @@ class Kraken : Market(NAME, TTS_NAME, null) { } private fun parseCurrency(currency: String): String { - var currency = currency - if (currency != null && currency.length >= 2) { + var resultCurrency = currency + + if (currency.length >= 2) { val firstChar = currency[0] if (firstChar == 'Z' || firstChar == 'X') { - currency = currency.substring(1) + resultCurrency = currency.substring(1) } } - if (VirtualCurrency.XBT == currency) return VirtualCurrency.BTC - if (VirtualCurrency.XVN == currency) return VirtualCurrency.VEN - return if (VirtualCurrency.XDG == currency) VirtualCurrency.DOGE else currency + + if (VirtualCurrency.XBT == resultCurrency) return VirtualCurrency.BTC + if (VirtualCurrency.XVN == resultCurrency) return VirtualCurrency.VEN + if (VirtualCurrency.XDG == resultCurrency) return VirtualCurrency.DOGE + return resultCurrency } companion object { diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/LakeBTC.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/LakeBTC.kt index 4e09b7c6..81d3fe3c 100644 --- a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/LakeBTC.kt +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/LakeBTC.kt @@ -35,7 +35,7 @@ class LakeBTC : Market(NAME, TTS_NAME, null) { @Throws(Exception::class) override fun parseCurrencyPairsFromJsonObject(requestId: Int, jsonObject: JSONObject, pairs: MutableList) { - val pairsJsonArray = jsonObject.names() + val pairsJsonArray = jsonObject.names()!! for (i in 0 until pairsJsonArray.length()) { val pairId = pairsJsonArray.getString(i) val currencyBase = pairId.substring(0, 3).toUpperCase(Locale.ENGLISH) diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Liqui.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Liqui.kt index 3c732eef..f17ab26a 100644 --- a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Liqui.kt +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Liqui.kt @@ -18,7 +18,7 @@ class Liqui : Market(NAME, TTS_NAME, null) { @Throws(Exception::class) override fun parseTickerFromJsonObject(requestId: Int, jsonObject: JSONObject, ticker: Ticker, checkerInfo: CheckerInfo) { - val names = jsonObject.names() + val names = jsonObject.names()!! val tickerJsonObject = jsonObject.getJSONObject(names.getString(0)) ticker.bid = tickerJsonObject.getDouble("sell") // REVERSED! ticker.ask = tickerJsonObject.getDouble("buy") // REVERSED! @@ -39,7 +39,7 @@ class Liqui : Market(NAME, TTS_NAME, null) { @Throws(Exception::class) override fun parseCurrencyPairsFromJsonObject(requestId: Int, jsonObject: JSONObject, pairs: MutableList) { val pairsJsonObject = jsonObject.getJSONObject("pairs") - val pairsNames = pairsJsonObject.names() + val pairsNames = pairsJsonObject.names()!! for (i in 0 until pairsNames.length()) { val pairId = pairsNames.getString(i) ?: continue val currencies = pairId.split("_".toRegex()).toTypedArray() diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Livecoin.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Livecoin.kt index cfc3dad4..91d25249 100644 --- a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Livecoin.kt +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Livecoin.kt @@ -43,7 +43,7 @@ class Livecoin : Market(NAME, TTS_NAME, null) { val tickerRow = tickerArray.getJSONObject(i) val symbol = tickerRow.getString("symbol") val currencyNames = symbol.split("/".toRegex()).toTypedArray() - if (currencyNames != null && currencyNames.size >= 2) { + if (currencyNames.size >= 2) { pairs.add(CurrencyPairInfo( currencyNames[0], currencyNames[1], diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/LocalBitcoins.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/LocalBitcoins.kt index 7e91fc4b..3ab756a7 100644 --- a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/LocalBitcoins.kt +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/LocalBitcoins.kt @@ -14,7 +14,7 @@ class LocalBitcoins : Market(NAME, TTS_NAME, null) { @Throws(Exception::class) override fun parseTickerFromJsonObject(requestId: Int, jsonObject: JSONObject, ticker: Ticker, checkerInfo: CheckerInfo) { - val pairJsonObject = jsonObject.getJSONObject(checkerInfo.currencyPairId) + val pairJsonObject = jsonObject.getJSONObject(checkerInfo.currencyPairId!!) ticker.vol = pairJsonObject.getDouble("volume_btc") val ratesJsonObject = pairJsonObject.getJSONObject("rates") ticker.last = ratesJsonObject.getDouble("last") @@ -29,7 +29,7 @@ class LocalBitcoins : Market(NAME, TTS_NAME, null) { @Throws(Exception::class) override fun parseCurrencyPairsFromJsonObject(requestId: Int, jsonObject: JSONObject, pairs: MutableList) { - val pairsJsonArray = jsonObject.names() + val pairsJsonArray = jsonObject.names()!! for (i in 0 until pairsJsonArray.length()) { val currencyCounter = pairsJsonArray.getString(i) if (currencyCounter != null) { diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/McxNOW.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/McxNOW.kt index 1b02bd04..6b3afd22 100644 --- a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/McxNOW.kt +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/McxNOW.kt @@ -64,10 +64,9 @@ class McxNOW : Market(NAME, TTS_NAME, null) { `is`.characterStream = StringReader(responseString) val doc = db.parse(`is`) val nodes = doc.getElementsByTagName("cur") - var node: Element? = null if (nodes != null) { for (i in 0 until nodes.length) { - node = nodes.item(i) as Element + val node = nodes.item(i) as Element? if (node != null) { val currency = node.getAttribute("tla") if (!TextUtils.isEmpty(currency) && VirtualCurrency.BTC != currency) pairs.add(CurrencyPairInfo(currency, VirtualCurrency.BTC, null)) diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Poloniex.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Poloniex.kt index baac623d..50916d25 100644 --- a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Poloniex.kt +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Poloniex.kt @@ -29,7 +29,7 @@ class Poloniex : Market(NAME, TTS_NAME, null) { @Throws(Exception::class) override fun parseCurrencyPairsFromJsonObject(requestId: Int, jsonObject: JSONObject, pairs: MutableList) { - val pairNames = jsonObject.names() + val pairNames = jsonObject.names()!! for (i in 0 until pairNames.length()) { val pairId = pairNames.getString(i) ?: continue val currencies = pairId.split("_".toRegex()).toTypedArray() diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Prelude.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Prelude.kt index cece5fb4..8ebfb7d3 100644 --- a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Prelude.kt +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Prelude.kt @@ -35,15 +35,15 @@ class Prelude : Market(NAME, TTS_NAME, null) { val pairing = pairings.getJSONObject(i) val pair = pairing.getString("pair") if (checkerInfo.currencyBase == pair) { - ticker.last = numberFormat.parse(pairing.getJSONObject("last_trade").getString("rate")).toDouble() + ticker.last = numberFormat.parse(pairing.getJSONObject("last_trade").getString("rate"))!!.toDouble() return } } } else { val statistics = jsonObject.getJSONObject("statistics") - ticker.vol = numberFormat.parse(statistics.getString("volume")).toDouble() - ticker.high = numberFormat.parse(statistics.getString("high")).toDouble() - ticker.low = numberFormat.parse(statistics.getString("low")).toDouble() + ticker.vol = numberFormat.parse(statistics.getString("volume"))!!.toDouble() + ticker.high = numberFormat.parse(statistics.getString("high"))!!.toDouble() + ticker.low = numberFormat.parse(statistics.getString("low"))!!.toDouble() } } diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Quoine.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Quoine.kt index e1d656a6..2da6ee4f 100644 --- a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Quoine.kt +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Quoine.kt @@ -39,7 +39,7 @@ class Quoine : Market(NAME, TTS_NAME, null) { } val currencyCounter = pairJsonObject.getString("currency") val pairName = pairJsonObject.getString("currency_pair_code") - if (pairName != null && currencyCounter != null && pairName.endsWith(currencyCounter)) { + if (pairName.endsWith(currencyCounter)) { val currencyBase = pairName.substring(0, pairName.length - currencyCounter.length) pairs.add(CurrencyPairInfo( currencyBase, diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/ShapeShift.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/ShapeShift.kt index 1e62ef7e..80df4de3 100644 --- a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/ShapeShift.kt +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/ShapeShift.kt @@ -27,7 +27,7 @@ class ShapeShift : Market(NAME, TTS_NAME, null) { @Throws(Exception::class) override fun parseCurrencyPairsFromJsonObject(requestId: Int, jsonObject: JSONObject, pairs: MutableList) { - val jsonCoinNames = jsonObject.names() + val jsonCoinNames = jsonObject.names()!! val availableCoinNames: MutableList = ArrayList(jsonCoinNames.length()) for (i in 0 until jsonCoinNames.length()) { val coinJsonObject = jsonObject.getJSONObject(jsonCoinNames.getString(i)) diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Uphold.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Uphold.kt index 60c461dc..12e77553 100644 --- a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Uphold.kt +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Uphold.kt @@ -35,7 +35,7 @@ class Uphold : Market(NAME, TTS_NAME, null) { val pairJsonObject = pairsJsonArray.getJSONObject(i) val pairId = pairJsonObject.getString("pair") val currencyCounter = pairJsonObject.getString("currency") - if (currencyCounter != null && pairId != null && pairId.endsWith(currencyCounter)) { + if (pairId.endsWith(currencyCounter)) { val currencyBase = pairId.substring(0, pairId.length - currencyCounter.length) if (currencyCounter != currencyBase) { // normal pair diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/YoBit.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/YoBit.kt index 78bf57ea..9e605575 100644 --- a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/YoBit.kt +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/YoBit.kt @@ -18,7 +18,7 @@ class YoBit : Market(NAME, TTS_NAME, null) { @Throws(Exception::class) override fun parseTickerFromJsonObject(requestId: Int, jsonObject: JSONObject, ticker: Ticker, checkerInfo: CheckerInfo) { - val names = jsonObject.names() + val names = jsonObject.names()!! val tickerJsonObject = jsonObject.getJSONObject(names.getString(0)) ticker.bid = tickerJsonObject.getDouble("sell") ticker.ask = tickerJsonObject.getDouble("buy") @@ -39,7 +39,7 @@ class YoBit : Market(NAME, TTS_NAME, null) { @Throws(Exception::class) override fun parseCurrencyPairsFromJsonObject(requestId: Int, jsonObject: JSONObject, pairs: MutableList) { val pairsJsonObject = jsonObject.getJSONObject("pairs") - val pairsNames = pairsJsonObject.names() + val pairsNames = pairsJsonObject.names()!! for (i in 0 until pairsNames.length()) { val pairId = pairsNames.getString(i) ?: continue val currencies = pairId.split("_".toRegex()).toTypedArray() diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/util/TimeUtils.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/util/TimeUtils.kt index 9b149e83..447456f2 100644 --- a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/util/TimeUtils.kt +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/util/TimeUtils.kt @@ -6,7 +6,7 @@ object TimeUtils { const val MILLIS_IN_MINUTE = 60 * MILLIS_IN_SECOND const val MILLIS_IN_HOUR = 60 * MILLIS_IN_MINUTE const val MILLIS_IN_DAY = 24 * MILLIS_IN_HOUR - private const val MILLIS_IN_YEAR = 365 * MILLIS_IN_DAY + const val MILLIS_IN_YEAR = 365 * MILLIS_IN_DAY fun parseTimeToMillis(time: Long): Long { if (time < MILLIS_IN_YEAR) return time * MILLIS_IN_SECOND else if (time > 5000 * MILLIS_IN_YEAR) return time / 1000 return time diff --git a/dataModuleTester/build.gradle b/dataModuleTester/build.gradle index d0f85ddb..e3d29b79 100644 --- a/dataModuleTester/build.gradle +++ b/dataModuleTester/build.gradle @@ -2,13 +2,13 @@ apply plugin: 'com.android.application' apply plugin: 'kotlin-android' android { - compileSdkVersion 28 - buildToolsVersion "29.0.2" + compileSdkVersion 30 + buildToolsVersion '30.0.2' defaultConfig { applicationId "com.aneonex.bitcoinchecker.datamodule.tester" minSdkVersion 26 - targetSdkVersion 28 + targetSdkVersion 30 } buildTypes { @@ -21,9 +21,9 @@ android { dependencies { implementation project(':dataModule') - implementation 'com.google.code.gson:gson:2.6.2' - implementation 'com.android.volley:volley:1.1.0' - implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version" + implementation 'com.google.code.gson:gson:2.8.6' + implementation 'com.android.volley:volley:1.1.1' + implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:${kotlin_version}" // compile files('libs/volley.jar') } repositories { diff --git a/dataModuleTester/src/main/AndroidManifest.xml b/dataModuleTester/src/main/AndroidManifest.xml index 72088860..8f7557e9 100644 --- a/dataModuleTester/src/main/AndroidManifest.xml +++ b/dataModuleTester/src/main/AndroidManifest.xml @@ -10,7 +10,6 @@ android:targetSdkVersion="18" /--> diff --git a/dataModuleTester/src/main/java/com/aneonex/bitcoinchecker/tester/MainActivity.java b/dataModuleTester/src/main/java/com/aneonex/bitcoinchecker/tester/MainActivity.java deleted file mode 100644 index 9b4915bb..00000000 --- a/dataModuleTester/src/main/java/com/aneonex/bitcoinchecker/tester/MainActivity.java +++ /dev/null @@ -1,320 +0,0 @@ -package com.aneonex.bitcoinchecker.tester; - -import android.app.Activity; -import android.os.Bundle; -import android.text.SpannableStringBuilder; -import android.text.TextUtils; -import android.view.View; -import android.view.View.OnClickListener; -import android.widget.AdapterView; -import android.widget.AdapterView.OnItemSelectedListener; -import android.widget.ArrayAdapter; -import android.widget.ProgressBar; -import android.widget.Spinner; -import android.widget.SpinnerAdapter; -import android.widget.TextView; - -import com.android.volley.NetworkResponse; -import com.android.volley.Request; -import com.android.volley.RequestQueue; -import com.android.volley.VolleyError; -import com.aneonex.bitcoinchecker.datamodule.config.MarketsConfig; -import com.aneonex.bitcoinchecker.datamodule.model.CheckerInfo; -import com.aneonex.bitcoinchecker.datamodule.model.Futures; -import com.aneonex.bitcoinchecker.datamodule.model.FuturesMarket; -import com.aneonex.bitcoinchecker.datamodule.model.Market; -import com.aneonex.bitcoinchecker.datamodule.model.Ticker; -import com.aneonex.bitcoinchecker.datamodule.util.CurrencyPairsMapHelper; -import com.aneonex.bitcoinchecker.datamodule.util.FormatUtilsBase; -import com.aneonex.bitcoinchecker.datamodule.util.MarketsConfigUtils; -import com.aneonex.bitcoinchecker.tester.dialog.DynamicCurrencyPairsDialog; -import com.aneonex.bitcoinchecker.tester.util.CheckErrorsUtils; -import com.aneonex.bitcoinchecker.tester.util.HttpsHelper; -import com.aneonex.bitcoinchecker.tester.util.MarketCurrencyPairsStore; -import com.aneonex.bitcoinchecker.tester.volley.CheckerErrorParsedError; -import com.aneonex.bitcoinchecker.tester.volley.CheckerVolleyMainRequest; -import com.aneonex.bitcoinchecker.tester.volley.CheckerVolleyMainRequest.TickerWrapper; -import com.aneonex.bitcoinchecker.tester.volley.generic.ResponseErrorListener; -import com.aneonex.bitcoinchecker.tester.volley.generic.ResponseListener; - -import java.util.HashMap; -import java.util.Map; - -public class MainActivity extends Activity { - - private class MarketEntry implements Comparable { - public String key; - public String name; - - public MarketEntry(String key, String name) { - this.key = key; - this.name = name; - } - - @Override - public String toString() { - return name; - } - - @Override - public int compareTo(MarketEntry o) { - return name.compareTo(o.name); - } - } - - private RequestQueue requestQueue; - private Spinner marketSpinner; - private View currencySpinnersWrapper; - private View dynamicCurrencyPairsWarningView; - private View dynamicCurrencyPairsInfoView; - private Spinner currencyBaseSpinner; - private Spinner currencyCounterSpinner; - private Spinner futuresContractTypeSpinner; - private View getResultButton; - private ProgressBar progressBar; - private TextView resultView; - - private CurrencyPairsMapHelper currencyPairsMapHelper; - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - - requestQueue = HttpsHelper.newRequestQueue(this); - - setContentView(R.layout.main_activity); - - marketSpinner = (Spinner)findViewById(R.id.marketSpinner); - currencySpinnersWrapper = findViewById(R.id.currencySpinnersWrapper); - dynamicCurrencyPairsWarningView = findViewById(R.id.dynamicCurrencyPairsWarningView); - dynamicCurrencyPairsInfoView = findViewById(R.id.dynamicCurrencyPairsInfoView); - currencyBaseSpinner = (Spinner)findViewById(R.id.currencyBaseSpinner); - currencyCounterSpinner = (Spinner)findViewById(R.id.currencyCounterSpinner); - futuresContractTypeSpinner = (Spinner)findViewById(R.id.futuresContractTypeSpinner); - getResultButton = findViewById(R.id.getResultButton); - progressBar = (ProgressBar)findViewById(R.id.progressBar); - resultView = (TextView)findViewById(R.id.resultView); - - refreshMarketSpinner(); - Market market = getSelectedMarket(); - currencyPairsMapHelper = new CurrencyPairsMapHelper(MarketCurrencyPairsStore.getPairsForMarket(this, getSelectedMarket().key)); - refreshCurrencySpinners(market); - refreshFuturesContractTypeSpinner(market); - showResultView(true); - - marketSpinner.setOnItemSelectedListener(new OnItemSelectedListener() { - public void onItemSelected(AdapterView arg0, View arg1, int arg2, long arg3) { - final Market selectedMarket = getSelectedMarket(); - currencyPairsMapHelper = new CurrencyPairsMapHelper(MarketCurrencyPairsStore.getPairsForMarket(MainActivity.this, selectedMarket.key)); - refreshCurrencySpinners(selectedMarket); - refreshFuturesContractTypeSpinner(selectedMarket); - } - public void onNothingSelected(AdapterView arg0) { - // do nothing - } - }); - - dynamicCurrencyPairsInfoView.setOnClickListener(new View.OnClickListener() { - public void onClick(View v) { - new DynamicCurrencyPairsDialog(MainActivity.this, getSelectedMarket(), currencyPairsMapHelper) { - public void onPairsUpdated(Market market, CurrencyPairsMapHelper currencyPairsMapHelper) { - MainActivity.this.currencyPairsMapHelper = currencyPairsMapHelper; - refreshCurrencySpinners(market); - } - }.show(); - } - }); - - currencyBaseSpinner.setOnItemSelectedListener(new OnItemSelectedListener() { - public void onItemSelected(AdapterView arg0, View arg1, int arg2, long arg3) { - refreshCurrencyCounterSpinner(getSelectedMarket()); - } - public void onNothingSelected(AdapterView arg0) { - // do nothing - } - }); - - getResultButton.setOnClickListener(new OnClickListener() { - public void onClick(View v) { - getNewResult(); - } - }); - } - - - // ==================== - // Get selected items - // ==================== - private Market getSelectedMarket() { - MarketEntry marketEntry = (MarketEntry)marketSpinner.getSelectedItem(); - return MarketsConfigUtils.getMarketByKey(marketEntry.key); - } - - private String getSelectedCurrencyBase() { - if(currencyBaseSpinner.getAdapter()==null) - return null; - return String.valueOf(currencyBaseSpinner.getSelectedItem()); - } - - private String getSelectedCurrencyCounter() { - if(currencyCounterSpinner.getAdapter()==null) - return null; - return String.valueOf(currencyCounterSpinner.getSelectedItem()); - } - - private int getSelectedContractType(Market market) { - if (market instanceof FuturesMarket) { - final FuturesMarket futuresMarket = (FuturesMarket) market; - int selection = futuresContractTypeSpinner.getSelectedItemPosition(); - return futuresMarket.getContractTypes()[selection]; - } - return Futures.CONTRACT_TYPE_WEEKLY; - } - - // ==================== - // Refreshing UI - // ==================== - private void refreshMarketSpinner() { - final MarketEntry[] entries = new MarketEntry[MarketsConfig.MARKETS.size()]; - int i = entries.length - 1; - for(Market market : MarketsConfig.MARKETS.values()) { - MarketEntry marketEntry = new MarketEntry(market.key, market.name); - entries[i--] = marketEntry;// market.name; - } - - java.util.Arrays.sort(entries); - - marketSpinner.setAdapter(new ArrayAdapter(this, android.R.layout.simple_spinner_dropdown_item, entries)); - } - - private void refreshCurrencySpinners(Market market) { - refreshCurrencyBaseSpinner(market); - refreshCurrencyCounterSpinner(market); - refreshDynamicCurrencyPairsView(market); - - final boolean isCurrencyEmpty = getSelectedCurrencyBase()==null || getSelectedCurrencyCounter()==null; - currencySpinnersWrapper.setVisibility(isCurrencyEmpty ? View.GONE : View.VISIBLE); - dynamicCurrencyPairsWarningView.setVisibility(isCurrencyEmpty ? View.VISIBLE : View.GONE); - getResultButton.setVisibility(isCurrencyEmpty ? View.GONE : View.VISIBLE); - } - - private void refreshDynamicCurrencyPairsView(Market market) { - dynamicCurrencyPairsInfoView.setVisibility(market.getCurrencyPairsUrl(0)!=null ? View.VISIBLE : View.GONE); - } - - private void refreshCurrencyBaseSpinner(Market market) { - final HashMap currencyPairs = getProperCurrencyPairs(market); - if(currencyPairs!=null && currencyPairs.size()>0) { - final CharSequence[] entries = new CharSequence[currencyPairs.size()]; - int i=0; - for(String currency : currencyPairs.keySet()) { - entries[i++] = currency; - } - currencyBaseSpinner.setAdapter(new ArrayAdapter(this, android.R.layout.simple_spinner_dropdown_item, entries)); - } else { - currencyBaseSpinner.setAdapter(null); - } - } - - private void refreshCurrencyCounterSpinner(Market market) { - final HashMap currencyPairs = getProperCurrencyPairs(market); - if(currencyPairs!=null && currencyPairs.size()>0) { - final String selectedCurrencyBase = getSelectedCurrencyBase(); - final CharSequence[] entries = currencyPairs.get(selectedCurrencyBase).clone(); - currencyCounterSpinner.setAdapter(new ArrayAdapter(this, android.R.layout.simple_spinner_dropdown_item, entries)); - } else { - currencyCounterSpinner.setAdapter(null); - } - } - - private void refreshFuturesContractTypeSpinner(Market market) { - SpinnerAdapter spinnerAdapter = null; - if (market instanceof FuturesMarket) { - final FuturesMarket futuresMarket = (FuturesMarket)market; - CharSequence[] entries = new CharSequence[futuresMarket.getContractTypes().length]; - for (int i = 0; i(this, android.R.layout.simple_spinner_dropdown_item, entries); - } - futuresContractTypeSpinner.setAdapter(spinnerAdapter); - futuresContractTypeSpinner.setVisibility(spinnerAdapter != null ? View.VISIBLE : View.GONE); - } - - private void showResultView(boolean showResultView) { - getResultButton.setEnabled(showResultView); - progressBar.setVisibility(showResultView ? View.GONE : View.VISIBLE); - resultView.setVisibility(showResultView ? View.VISIBLE : View.GONE); - } - - private HashMap getProperCurrencyPairs(Market market) { - if(currencyPairsMapHelper!=null && currencyPairsMapHelper.getCurrencyPairs()!=null && currencyPairsMapHelper.getCurrencyPairs().size()>0) - return currencyPairsMapHelper.getCurrencyPairs(); - else - return market.currencyPairs; - } - - // ==================== - // Get && display results - // ==================== - private void getNewResult() { - final Market market = getSelectedMarket(); - final String currencyBase = getSelectedCurrencyBase(); - final String currencyCounter = getSelectedCurrencyCounter(); - final String pairId = currencyPairsMapHelper!=null ? currencyPairsMapHelper.getCurrencyPairId(currencyBase, currencyCounter) : null; - final int contractType = getSelectedContractType(market); - final CheckerInfo checkerInfo = new CheckerInfo(currencyBase, currencyCounter, pairId, contractType); - Request request = new CheckerVolleyMainRequest(market, checkerInfo, new ResponseListener() { - @Override - public void onResponse(String url, Map requestHeaders, NetworkResponse networkResponse, String responseString, TickerWrapper tickerWrapper) { - handleNewResult(checkerInfo, tickerWrapper.ticker, url, requestHeaders, networkResponse, responseString, null, null); - } - }, new ResponseErrorListener() { - @Override - public void onErrorResponse(String url, Map requestHeaders, NetworkResponse networkResponse, String responseString, VolleyError error) { - error.printStackTrace(); - - String errorMsg = null; - if(error instanceof CheckerErrorParsedError) { - errorMsg = ((CheckerErrorParsedError)error).getErrorMsg(); - } - - if(TextUtils.isEmpty(errorMsg)) - errorMsg = CheckErrorsUtils.parseVolleyErrorMsg(MainActivity.this, error); - - handleNewResult(checkerInfo, null, url, requestHeaders, networkResponse, responseString, errorMsg, error); - } - }); - requestQueue.add(request); - showResultView(false); - } - - private void handleNewResult(CheckerInfo checkerInfo, Ticker ticker, String url, Map requestHeaders, NetworkResponse networkResponse, String rawResponse, String errorMsg, VolleyError error) { - showResultView(true); - SpannableStringBuilder ssb = new SpannableStringBuilder(); - - if (ticker!=null) { - ssb.append(getString(R.string.ticker_last, FormatUtilsBase.formatPriceWithCurrency(ticker.last, checkerInfo.getCurrencyCounter()))); - ssb.append(createNewPriceLineIfNeeded(R.string.ticker_high, ticker.high, checkerInfo.getCurrencyCounter())); - ssb.append(createNewPriceLineIfNeeded(R.string.ticker_low, ticker.low, checkerInfo.getCurrencyCounter())); - ssb.append(createNewPriceLineIfNeeded(R.string.ticker_bid, ticker.bid, checkerInfo.getCurrencyCounter())); - ssb.append(createNewPriceLineIfNeeded(R.string.ticker_ask, ticker.ask, checkerInfo.getCurrencyCounter())); - ssb.append(createNewPriceLineIfNeeded(R.string.ticker_vol, ticker.vol, checkerInfo.getCurrencyBase())); - ssb.append("\n"+getString(R.string.ticker_timestamp, FormatUtilsBase.formatSameDayTimeOrDate(this, ticker.timestamp))); - } else { - ssb.append(getString(R.string.check_error_generic_prefix, errorMsg!=null ? errorMsg : "UNKNOWN")); - } - - CheckErrorsUtils.formatResponseDebug(this, ssb, url, requestHeaders, networkResponse, rawResponse, error); - - resultView.setText(ssb); - } - - private String createNewPriceLineIfNeeded(int textResId, double price, String currency) { - if(price<=Ticker.NO_DATA) - return ""; - - return "\n"+getString(textResId, FormatUtilsBase.formatPriceWithCurrency(price, currency)); - } -} diff --git a/dataModuleTester/src/main/java/com/aneonex/bitcoinchecker/tester/MainActivity.kt b/dataModuleTester/src/main/java/com/aneonex/bitcoinchecker/tester/MainActivity.kt new file mode 100644 index 00000000..f8aee19f --- /dev/null +++ b/dataModuleTester/src/main/java/com/aneonex/bitcoinchecker/tester/MainActivity.kt @@ -0,0 +1,269 @@ +package com.aneonex.bitcoinchecker.tester + +import android.app.Activity +import android.os.Bundle +import android.text.SpannableStringBuilder +import android.text.TextUtils +import android.view.View +import android.widget.* +import android.widget.AdapterView.OnItemSelectedListener +import com.android.volley.NetworkResponse +import com.android.volley.Request +import com.android.volley.RequestQueue +import com.android.volley.VolleyError +import com.aneonex.bitcoinchecker.datamodule.config.MarketsConfig +import com.aneonex.bitcoinchecker.datamodule.model.* +import com.aneonex.bitcoinchecker.datamodule.model.Futures.getContractTypeShortName +import com.aneonex.bitcoinchecker.datamodule.util.CurrencyPairsMapHelper +import com.aneonex.bitcoinchecker.datamodule.util.FormatUtilsBase.formatPriceWithCurrency +import com.aneonex.bitcoinchecker.datamodule.util.FormatUtilsBase.formatSameDayTimeOrDate +import com.aneonex.bitcoinchecker.datamodule.util.MarketsConfigUtils.getMarketByKey +import com.aneonex.bitcoinchecker.tester.dialog.DynamicCurrencyPairsDialog +import com.aneonex.bitcoinchecker.tester.util.CheckErrorsUtils +import com.aneonex.bitcoinchecker.tester.util.HttpsHelper +import com.aneonex.bitcoinchecker.tester.util.MarketCurrencyPairsStore +import com.aneonex.bitcoinchecker.tester.volley.CheckerErrorParsedError +import com.aneonex.bitcoinchecker.tester.volley.CheckerVolleyMainRequest +import com.aneonex.bitcoinchecker.tester.volley.CheckerVolleyMainRequest.TickerWrapper +import com.aneonex.bitcoinchecker.tester.volley.generic.ResponseErrorListener +import com.aneonex.bitcoinchecker.tester.volley.generic.ResponseListener +import java.util.* + +class MainActivity : Activity() { + private inner class MarketEntry(var key: String, var name: String) : Comparable { + override fun toString(): String { + return name + } + + override fun compareTo(other: MarketEntry): Int { + return name.compareTo(other.name) + } + } + + private lateinit var requestQueue: RequestQueue + private lateinit var marketSpinner: Spinner + private lateinit var currencySpinnersWrapper: View + private lateinit var dynamicCurrencyPairsWarningView: View + private lateinit var dynamicCurrencyPairsInfoView: View + private lateinit var currencyBaseSpinner: Spinner + private lateinit var currencyCounterSpinner: Spinner + private lateinit var futuresContractTypeSpinner: Spinner + private lateinit var getResultButton: View + private lateinit var progressBar: ProgressBar + private lateinit var resultView: TextView + + private var currencyPairsMapHelper: CurrencyPairsMapHelper? = null + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + requestQueue = HttpsHelper.newRequestQueue(this) + setContentView(R.layout.main_activity) + marketSpinner = findViewById(R.id.marketSpinner) as Spinner + currencySpinnersWrapper = findViewById(R.id.currencySpinnersWrapper) + dynamicCurrencyPairsWarningView = findViewById(R.id.dynamicCurrencyPairsWarningView) + dynamicCurrencyPairsInfoView = findViewById(R.id.dynamicCurrencyPairsInfoView) + currencyBaseSpinner = findViewById(R.id.currencyBaseSpinner) as Spinner + currencyCounterSpinner = findViewById(R.id.currencyCounterSpinner) as Spinner + futuresContractTypeSpinner = findViewById(R.id.futuresContractTypeSpinner) as Spinner + getResultButton = findViewById(R.id.getResultButton) + progressBar = findViewById(R.id.progressBar) as ProgressBar + resultView = findViewById(R.id.resultView) as TextView + refreshMarketSpinner() + val market = selectedMarket + currencyPairsMapHelper = CurrencyPairsMapHelper(MarketCurrencyPairsStore.getPairsForMarket(this, selectedMarket.key)) + refreshCurrencySpinners(market) + refreshFuturesContractTypeSpinner(market) + showResultView(true) + marketSpinner.onItemSelectedListener = object : OnItemSelectedListener { + override fun onItemSelected(arg0: AdapterView<*>?, arg1: View, arg2: Int, arg3: Long) { + val selectedMarket = selectedMarket + currencyPairsMapHelper = CurrencyPairsMapHelper(MarketCurrencyPairsStore.getPairsForMarket(this@MainActivity, selectedMarket.key)) + refreshCurrencySpinners(selectedMarket) + refreshFuturesContractTypeSpinner(selectedMarket) + } + + override fun onNothingSelected(arg0: AdapterView<*>?) { + // do nothing + } + } + dynamicCurrencyPairsInfoView.setOnClickListener { + object : DynamicCurrencyPairsDialog(this@MainActivity, selectedMarket, currencyPairsMapHelper) { + override fun onPairsUpdated(market: Market, currencyPairsMapHelper: CurrencyPairsMapHelper?) { + + this@MainActivity.currencyPairsMapHelper = currencyPairsMapHelper + refreshCurrencySpinners(market) + } + }.show() + } + currencyBaseSpinner.onItemSelectedListener = object : OnItemSelectedListener { + override fun onItemSelected(arg0: AdapterView<*>?, arg1: View, arg2: Int, arg3: Long) { + refreshCurrencyCounterSpinner(selectedMarket) + } + + override fun onNothingSelected(arg0: AdapterView<*>?) { + // do nothing + } + } + getResultButton.setOnClickListener { newResult } + } + + // ==================== + // Get selected items + // ==================== + private val selectedMarket: Market + get() { + val marketEntry = marketSpinner.selectedItem as MarketEntry + return getMarketByKey(marketEntry.key) + } + private val selectedCurrencyBase: String? + get() = if (currencyBaseSpinner.adapter == null) null else currencyBaseSpinner.selectedItem.toString() + private val selectedCurrencyCounter: String? + get() = if (currencyCounterSpinner.adapter == null) null else currencyCounterSpinner.selectedItem.toString() + + private fun getSelectedContractType(market: Market): Int { + if (market is FuturesMarket) { + val selection = futuresContractTypeSpinner.selectedItemPosition + return market.contractTypes[selection] + } + return Futures.CONTRACT_TYPE_WEEKLY + } + + // ==================== + // Refreshing UI + // ==================== + private fun refreshMarketSpinner() { + val entries = arrayOfNulls(MarketsConfig.MARKETS.size) + var i = entries.size - 1 + for (market in MarketsConfig.MARKETS.values) { + val marketEntry = MarketEntry(market.key, market.name) + entries[i--] = marketEntry // market.name; + } + Arrays.sort(entries) + marketSpinner.adapter = ArrayAdapter(this, android.R.layout.simple_spinner_dropdown_item, entries) + } + + private fun refreshCurrencySpinners(market: Market) { + refreshCurrencyBaseSpinner(market) + refreshCurrencyCounterSpinner(market) + refreshDynamicCurrencyPairsView(market) + val isCurrencyEmpty = selectedCurrencyBase == null || selectedCurrencyCounter == null + currencySpinnersWrapper.visibility = if (isCurrencyEmpty) View.GONE else View.VISIBLE + dynamicCurrencyPairsWarningView.visibility = if (isCurrencyEmpty) View.VISIBLE else View.GONE + getResultButton.visibility = if (isCurrencyEmpty) View.GONE else View.VISIBLE + } + + private fun refreshDynamicCurrencyPairsView(market: Market) { + dynamicCurrencyPairsInfoView.visibility = if (market.getCurrencyPairsUrl(0) != null) View.VISIBLE else View.GONE + } + + private fun refreshCurrencyBaseSpinner(market: Market) { + val currencyPairs = getProperCurrencyPairs(market) + if (currencyPairs != null && currencyPairs.size > 0) { + val entries = arrayOfNulls(currencyPairs.size) + var i = 0 + for (currency in currencyPairs.keys) { + entries[i++] = currency + } + currencyBaseSpinner.adapter = ArrayAdapter(this, android.R.layout.simple_spinner_dropdown_item, entries) + } else { + currencyBaseSpinner.adapter = null + } + } + + private fun refreshCurrencyCounterSpinner(market: Market) { + val currencyPairs = getProperCurrencyPairs(market) + if (currencyPairs != null && currencyPairs.size > 0) { + val selectedCurrencyBase = selectedCurrencyBase + val entries = currencyPairs[selectedCurrencyBase]!!.clone() + currencyCounterSpinner.adapter = ArrayAdapter(this, android.R.layout.simple_spinner_dropdown_item, entries) + } else { + currencyCounterSpinner.adapter = null + } + } + + private fun refreshFuturesContractTypeSpinner(market: Market) { + var spinnerAdapter: SpinnerAdapter? = null + if (market is FuturesMarket) { + val entries = arrayOfNulls(market.contractTypes.size) + for (i in market.contractTypes.indices) { + val contractType = market.contractTypes[i] + entries[i] = getContractTypeShortName(contractType) + } + spinnerAdapter = ArrayAdapter(this, android.R.layout.simple_spinner_dropdown_item, entries) + } + futuresContractTypeSpinner.adapter = spinnerAdapter + futuresContractTypeSpinner.visibility = if (spinnerAdapter != null) View.VISIBLE else View.GONE + } + + private fun showResultView(showResultView: Boolean) { + getResultButton.isEnabled = showResultView + progressBar.visibility = if (showResultView) View.GONE else View.VISIBLE + resultView.visibility = if (showResultView) View.VISIBLE else View.GONE + } + + private fun getProperCurrencyPairs(market: Market): HashMap>? { + val currencyPairsMapHelper = currencyPairsMapHelper + return if (currencyPairsMapHelper?.currencyPairs != null && currencyPairsMapHelper.currencyPairs.size > 0) + currencyPairsMapHelper.currencyPairs + else market.currencyPairs + } + + // ==================== + // Get && display results + // ==================== + private val newResult: Unit + get() { + val market = selectedMarket + val currencyBase = selectedCurrencyBase + val currencyCounter = selectedCurrencyCounter + val pairId = if (currencyPairsMapHelper != null) currencyPairsMapHelper!!.getCurrencyPairId(currencyBase, currencyCounter) else null + val contractType = getSelectedContractType(market) + val checkerInfo = CheckerInfo(currencyBase!!, currencyCounter!!, pairId, contractType) + val request: Request<*> = CheckerVolleyMainRequest(market, checkerInfo, + object : ResponseListener() { + override fun onResponse(url: String?, requestHeaders: Map?, networkResponse: NetworkResponse?, responseString: String?, response: TickerWrapper?) { + handleNewResult(checkerInfo, response?.ticker, url, requestHeaders, networkResponse, responseString, null, null) + } + }, object : ResponseErrorListener() { + override fun onErrorResponse(url: String?, requestHeaders: Map?, networkResponse: NetworkResponse?, responseString: String?, error: VolleyError) { + error.printStackTrace() + var errorMsg: String? = null + if (error is CheckerErrorParsedError) { + errorMsg = error.errorMsg + } + if (TextUtils.isEmpty(errorMsg)) errorMsg = CheckErrorsUtils.parseVolleyErrorMsg(this@MainActivity, error) + handleNewResult(checkerInfo, null, url, requestHeaders, networkResponse, responseString, errorMsg, error) + } + }) + requestQueue.add(request) + showResultView(false) + } + + private fun handleNewResult(checkerInfo: CheckerInfo, ticker: Ticker?, url: String?, requestHeaders: Map?, networkResponse: NetworkResponse?, rawResponse: String?, errorMsg: String?, error: VolleyError?) { + showResultView(true) + val ssb = SpannableStringBuilder() + if (ticker != null) { + ssb.append(getString(R.string.ticker_last, formatPriceWithCurrency(ticker.last, checkerInfo.currencyCounter))) + ssb.append(createNewPriceLineIfNeeded(R.string.ticker_high, ticker.high, checkerInfo.currencyCounter)) + ssb.append(createNewPriceLineIfNeeded(R.string.ticker_low, ticker.low, checkerInfo.currencyCounter)) + ssb.append(createNewPriceLineIfNeeded(R.string.ticker_bid, ticker.bid, checkerInfo.currencyCounter)) + ssb.append(createNewPriceLineIfNeeded(R.string.ticker_ask, ticker.ask, checkerInfo.currencyCounter)) + ssb.append(createNewPriceLineIfNeeded(R.string.ticker_vol, ticker.vol, checkerInfo.currencyBase)) + ssb.append(""" + + ${getString(R.string.ticker_timestamp, formatSameDayTimeOrDate(this, ticker.timestamp))} + """.trimIndent()) + } else { + ssb.append(getString(R.string.check_error_generic_prefix, errorMsg ?: "UNKNOWN")) + } + CheckErrorsUtils.formatResponseDebug(this, ssb, url, requestHeaders, networkResponse, rawResponse, error) + resultView.text = ssb + } + + private fun createNewPriceLineIfNeeded(textResId: Int, price: Double, currency: String): String { + return if (price <= Ticker.NO_DATA) "" else """ + + ${getString(textResId, formatPriceWithCurrency(price, currency))} + """.trimIndent() + } +} \ No newline at end of file diff --git a/dataModuleTester/src/main/java/com/aneonex/bitcoinchecker/tester/dialog/DynamicCurrencyPairsDialog.java b/dataModuleTester/src/main/java/com/aneonex/bitcoinchecker/tester/dialog/DynamicCurrencyPairsDialog.java deleted file mode 100644 index 04b63916..00000000 --- a/dataModuleTester/src/main/java/com/aneonex/bitcoinchecker/tester/dialog/DynamicCurrencyPairsDialog.java +++ /dev/null @@ -1,127 +0,0 @@ -package com.aneonex.bitcoinchecker.tester.dialog; - -import java.util.Map; - -import android.app.AlertDialog; -import android.content.Context; -import android.content.DialogInterface; -import android.content.DialogInterface.OnDismissListener; -import android.text.SpannableStringBuilder; -import android.view.LayoutInflater; -import android.view.View; -import android.widget.TextView; - -import com.android.volley.NetworkResponse; -import com.android.volley.RequestQueue; -import com.android.volley.VolleyError; -import com.aneonex.bitcoinchecker.datamodule.model.Market; -import com.aneonex.bitcoinchecker.datamodule.util.CurrencyPairsMapHelper; -import com.aneonex.bitcoinchecker.datamodule.util.FormatUtilsBase; -import com.aneonex.bitcoinchecker.tester.R; -import com.aneonex.bitcoinchecker.tester.util.CheckErrorsUtils; -import com.aneonex.bitcoinchecker.tester.util.HttpsHelper; -import com.aneonex.bitcoinchecker.tester.volley.DynamicCurrencyPairsVolleyMainRequest; -import com.aneonex.bitcoinchecker.tester.volley.generic.ResponseErrorListener; -import com.aneonex.bitcoinchecker.tester.volley.generic.ResponseListener; - -public abstract class DynamicCurrencyPairsDialog extends AlertDialog implements OnDismissListener { - - private final RequestQueue requestQueue; - private final Market market; - private CurrencyPairsMapHelper currencyPairsMapHelper; - - private View refreshImageView; - private TextView statusView; - private TextView errorView; - - protected DynamicCurrencyPairsDialog(Context context, Market market, CurrencyPairsMapHelper currencyPairsMapHelper) { - super(context); - setInverseBackgroundForced(true); - - this.requestQueue = HttpsHelper.newRequestQueue(context); - this.market = market; - this.currencyPairsMapHelper = currencyPairsMapHelper; - - setTitle(R.string.checker_add_dynamic_currency_pairs_dialog_title); - setOnDismissListener(this); - setButton(BUTTON_NEUTRAL, context.getString(android.R.string.ok), (OnClickListener)null); - - View view = LayoutInflater.from(context).inflate(R.layout.dynamic_currency_pairs_dialog, null); - refreshImageView = view.findViewById(R.id.refreshImageView); - statusView = (TextView)view.findViewById(R.id.statusView); - errorView = (TextView)view.findViewById(R.id.errorView); - refreshImageView.setOnClickListener(new View.OnClickListener() { - public void onClick(View v) { - startRefreshing(); - } - }); - refreshStatusView(null, null, null, null, null, null); - - setView(view); - } - - @Override - public void onDismiss(DialogInterface dialog) { - requestQueue.cancelAll(this); - currencyPairsMapHelper = null; - } - - private void startRefreshing() { - setCancelable(false); - startRefreshingAnim(); - DynamicCurrencyPairsVolleyMainRequest request = new DynamicCurrencyPairsVolleyMainRequest(getContext(), market, - new ResponseListener() { - @Override - public void onResponse(String url, Map requestHeaders, NetworkResponse networkResponse, String responseString, CurrencyPairsMapHelper currencyPairsMapHelper) { - DynamicCurrencyPairsDialog.this.currencyPairsMapHelper = currencyPairsMapHelper; - refreshStatusView(url, requestHeaders, networkResponse, responseString, null, null); - stopRefreshingAnim(); - onPairsUpdated(market, currencyPairsMapHelper); -// dismiss(); - } - }, new ResponseErrorListener() { - @Override - public void onErrorResponse(String url, Map requestHeaders, NetworkResponse networkResponse, String responseString, VolleyError error) { - error.printStackTrace(); - refreshStatusView(url, requestHeaders, networkResponse, responseString, CheckErrorsUtils.parseVolleyErrorMsg(getContext(), error), error); - stopRefreshingAnim(); - } - }); - request.setTag(this); - requestQueue.add(request); - } - - private void refreshStatusView(String url, Map requestHeaders, NetworkResponse networkResponse, String responseString, String errorMsg, VolleyError error) { - String dateString; - if(currencyPairsMapHelper!=null && currencyPairsMapHelper.getDate()>0) - dateString = FormatUtilsBase.formatSameDayTimeOrDate(getContext(), currencyPairsMapHelper.getDate()); - else - dateString = getContext().getString(R.string.checker_add_dynamic_currency_pairs_dialog_last_sync_never); - - statusView.setText(getContext().getString(R.string.checker_add_dynamic_currency_pairs_dialog_last_sync, dateString)); - if(currencyPairsMapHelper!=null && currencyPairsMapHelper.getPairsCount()>0) - statusView.append("\n"+getContext().getString(R.string.checker_add_dynamic_currency_pairs_dialog_pairs, currencyPairsMapHelper.getPairsCount())); - - SpannableStringBuilder ssb = new SpannableStringBuilder(); - - if(errorMsg!=null) { - ssb.append("\n"); - ssb.append(getContext().getString(R.string.check_error_generic_prefix, errorMsg)); - } - - CheckErrorsUtils.formatResponseDebug(getContext(), ssb, url, requestHeaders, networkResponse, responseString, error); - errorView.setText(ssb); - } - - public void startRefreshingAnim() { - setCancelable(false); - refreshImageView.setEnabled(false); - } - - public void stopRefreshingAnim() { - setCancelable(true); - refreshImageView.setEnabled(true); - } - - public abstract void onPairsUpdated(Market market, CurrencyPairsMapHelper currencyPairsMapHelper); -} diff --git a/dataModuleTester/src/main/java/com/aneonex/bitcoinchecker/tester/dialog/DynamicCurrencyPairsDialog.kt b/dataModuleTester/src/main/java/com/aneonex/bitcoinchecker/tester/dialog/DynamicCurrencyPairsDialog.kt new file mode 100644 index 00000000..93d0daf5 --- /dev/null +++ b/dataModuleTester/src/main/java/com/aneonex/bitcoinchecker/tester/dialog/DynamicCurrencyPairsDialog.kt @@ -0,0 +1,102 @@ +package com.aneonex.bitcoinchecker.tester.dialog + +import android.app.AlertDialog +import android.content.Context +import android.content.DialogInterface +import android.text.SpannableStringBuilder +import android.view.LayoutInflater +import android.view.View +import android.widget.TextView +import com.android.volley.NetworkResponse +import com.android.volley.RequestQueue +import com.android.volley.VolleyError +import com.aneonex.bitcoinchecker.datamodule.model.Market +import com.aneonex.bitcoinchecker.datamodule.util.CurrencyPairsMapHelper +import com.aneonex.bitcoinchecker.datamodule.util.FormatUtilsBase.formatSameDayTimeOrDate +import com.aneonex.bitcoinchecker.tester.R +import com.aneonex.bitcoinchecker.tester.util.CheckErrorsUtils +import com.aneonex.bitcoinchecker.tester.util.HttpsHelper +import com.aneonex.bitcoinchecker.tester.volley.DynamicCurrencyPairsVolleyMainRequest +import com.aneonex.bitcoinchecker.tester.volley.generic.ResponseErrorListener +import com.aneonex.bitcoinchecker.tester.volley.generic.ResponseListener + +abstract class DynamicCurrencyPairsDialog protected constructor(context: Context, market: Market, currencyPairsMapHelper: CurrencyPairsMapHelper?) : AlertDialog(context), DialogInterface.OnDismissListener { + private val requestQueue: RequestQueue? + private val market: Market + private var currencyPairsMapHelper: CurrencyPairsMapHelper? + private val refreshImageView: View + private val statusView: TextView + private val errorView: TextView + override fun onDismiss(dialog: DialogInterface) { + requestQueue!!.cancelAll(this) + currencyPairsMapHelper = null + } + + private fun startRefreshing() { + setCancelable(false) + startRefreshingAnim() + val request = DynamicCurrencyPairsVolleyMainRequest(context, market, + object : ResponseListener() { + override fun onResponse(url: String?, requestHeaders: Map?, networkResponse: NetworkResponse?, responseString: String?, currencyPairsMapHelper: CurrencyPairsMapHelper?) { + this@DynamicCurrencyPairsDialog.currencyPairsMapHelper = currencyPairsMapHelper + refreshStatusView(url, requestHeaders, networkResponse, responseString, null, null) + stopRefreshingAnim() + onPairsUpdated(market, currencyPairsMapHelper) + // dismiss(); + } + }, object : ResponseErrorListener() { + override fun onErrorResponse(url: String?, requestHeaders: Map?, networkResponse: NetworkResponse?, responseString: String?, error: VolleyError) { + error.printStackTrace() + refreshStatusView(url, requestHeaders, networkResponse, responseString, CheckErrorsUtils.parseVolleyErrorMsg(context, error), error) + stopRefreshingAnim() + } + }) + request.tag = this + requestQueue!!.add(request) + } + + private fun refreshStatusView(url: String?, requestHeaders: Map?, networkResponse: NetworkResponse?, responseString: String?, errorMsg: String?, error: VolleyError?) { + val dateString = if (currencyPairsMapHelper != null && currencyPairsMapHelper!!.date > 0) formatSameDayTimeOrDate(context, currencyPairsMapHelper!!.date) else context.getString(R.string.checker_add_dynamic_currency_pairs_dialog_last_sync_never) + statusView.text = context.getString(R.string.checker_add_dynamic_currency_pairs_dialog_last_sync, dateString) + if (currencyPairsMapHelper != null && currencyPairsMapHelper!!.pairsCount > 0) statusView.append(""" + + ${context.getString(R.string.checker_add_dynamic_currency_pairs_dialog_pairs, currencyPairsMapHelper!!.pairsCount)} + """.trimIndent()) + val ssb = SpannableStringBuilder() + if (errorMsg != null) { + ssb.append("\n") + ssb.append(context.getString(R.string.check_error_generic_prefix, errorMsg)) + } + CheckErrorsUtils.formatResponseDebug(context, ssb, url, requestHeaders, networkResponse, responseString, error) + errorView.text = ssb + } + + private fun startRefreshingAnim() { + setCancelable(false) + refreshImageView.isEnabled = false + } + + fun stopRefreshingAnim() { + setCancelable(true) + refreshImageView.isEnabled = true + } + + abstract fun onPairsUpdated(market: Market, currencyPairsMapHelper: CurrencyPairsMapHelper?) + + init { + setInverseBackgroundForced(true) + requestQueue = HttpsHelper.newRequestQueue(context) + this.market = market + this.currencyPairsMapHelper = currencyPairsMapHelper + setTitle(R.string.checker_add_dynamic_currency_pairs_dialog_title) + setOnDismissListener(this) + setButton(BUTTON_NEUTRAL, context.getString(android.R.string.ok), null as DialogInterface.OnClickListener?) + val view = LayoutInflater.from(context).inflate(R.layout.dynamic_currency_pairs_dialog, null) + refreshImageView = view.findViewById(R.id.refreshImageView) + statusView = view.findViewById(R.id.statusView) as TextView + errorView = view.findViewById(R.id.errorView) as TextView + refreshImageView.setOnClickListener { startRefreshing() } + refreshStatusView(null, null, null, null, null, null) + setView(view) + } +} \ No newline at end of file diff --git a/dataModuleTester/src/main/java/com/aneonex/bitcoinchecker/tester/util/CheckErrorsUtils.java b/dataModuleTester/src/main/java/com/aneonex/bitcoinchecker/tester/util/CheckErrorsUtils.java deleted file mode 100644 index d632f28a..00000000 --- a/dataModuleTester/src/main/java/com/aneonex/bitcoinchecker/tester/util/CheckErrorsUtils.java +++ /dev/null @@ -1,86 +0,0 @@ -package com.aneonex.bitcoinchecker.tester.util; - -import java.io.PrintWriter; -import java.io.StringWriter; -import java.util.Map; - -import android.content.Context; -import android.text.Html; -import android.text.SpannableStringBuilder; - -import com.android.volley.NetworkError; -import com.android.volley.NetworkResponse; -import com.android.volley.ParseError; -import com.android.volley.ServerError; -import com.android.volley.TimeoutError; -import com.android.volley.VolleyError; -import com.aneonex.bitcoinchecker.tester.R; - -public class CheckErrorsUtils { - - private final static int RAW_RESPONSE_CHARS_LIMIT = 5000; - - public final static String parseVolleyErrorMsg(Context context, VolleyError error) { - if(error instanceof NetworkError) - return context.getString(R.string.check_error_network); - else if(error instanceof TimeoutError) - return context.getString(R.string.check_error_timeout); - else if(error instanceof ServerError) - return context.getString(R.string.check_error_server); - else if(error instanceof ParseError) - return context.getString(R.string.check_error_parse); - else - return context.getString(R.string.check_error_unknown); - } - - public final static String formatError(Context context, String errorMsg) { - return context.getString(R.string.check_error_generic_prefix, errorMsg!=null ? errorMsg : "UNKNOWN"); - } - - private static String formatMapToHtmlString(Map headers) { - String output = ""; - for (Map.Entry entry : headers.entrySet()) { - output += String.format("%1$s = %2$s", entry.getKey(), entry.getValue()); - } - return output; - } - - public static SpannableStringBuilder formatResponseDebug(Context context, SpannableStringBuilder ssb, String url, Map requestHeaders, NetworkResponse networkResponse, String rawResponse, Exception exception) { - if(url!=null){ - ssb.append("\n\n"); - ssb.append(context.getString(R.string.ticker_raw_url, url)); - } - - if(requestHeaders!=null){ - ssb.append("\n\n"); - ssb.append(Html.fromHtml(context.getString(R.string.ticker_raw_request_headers)+""+CheckErrorsUtils.formatMapToHtmlString(requestHeaders)+"")); - } - - if(networkResponse!=null){ - ssb.append("\n\n"); - ssb.append(context.getString(R.string.ticker_raw_response_code, String.valueOf(networkResponse.statusCode))); - ssb.append("\n\n"); - ssb.append(Html.fromHtml(context.getString(R.string.ticker_raw_response_headers)+""+CheckErrorsUtils.formatMapToHtmlString(networkResponse.headers)+"")); - } - if(rawResponse!=null){ - ssb.append("\n\n"); - String limitedRawResponse = rawResponse; - if(rawResponse.length() > RAW_RESPONSE_CHARS_LIMIT) { - limitedRawResponse = rawResponse.substring(0, RAW_RESPONSE_CHARS_LIMIT)+"..."; - } - ssb.append(Html.fromHtml(context.getString(R.string.ticker_raw_response)+""+limitedRawResponse+"")); - } - if(exception!=null){ - ssb.append("\n\n"); - ssb.append(Html.fromHtml(context.getString(R.string.ticker_raw_stacktrace)+""+printException(exception)+"")); - } - - return ssb; - } - - private static String printException(Exception e) { - StringWriter errors = new StringWriter(); - e.printStackTrace(new PrintWriter(errors)); - return errors.toString(); - } -} diff --git a/dataModuleTester/src/main/java/com/aneonex/bitcoinchecker/tester/util/CheckErrorsUtils.kt b/dataModuleTester/src/main/java/com/aneonex/bitcoinchecker/tester/util/CheckErrorsUtils.kt new file mode 100644 index 00000000..7b032e2b --- /dev/null +++ b/dataModuleTester/src/main/java/com/aneonex/bitcoinchecker/tester/util/CheckErrorsUtils.kt @@ -0,0 +1,64 @@ +package com.aneonex.bitcoinchecker.tester.util + +import android.content.Context +import android.text.Html +import android.text.SpannableStringBuilder +import com.android.volley.* +import com.aneonex.bitcoinchecker.tester.R +import java.io.PrintWriter +import java.io.StringWriter + +object CheckErrorsUtils { + private const val RAW_RESPONSE_CHARS_LIMIT = 5000 + fun parseVolleyErrorMsg(context: Context, error: VolleyError?): String { + return if (error is NetworkError) context.getString(R.string.check_error_network) else if (error is TimeoutError) context.getString(R.string.check_error_timeout) else if (error is ServerError) context.getString(R.string.check_error_server) else if (error is ParseError) context.getString(R.string.check_error_parse) else context.getString(R.string.check_error_unknown) + } + + fun formatError(context: Context, errorMsg: String?): String { + return context.getString(R.string.check_error_generic_prefix, errorMsg ?: "UNKNOWN") + } + + private fun formatMapToHtmlString(headers: Map): String { + var output = "" + for ((key, value) in headers) { + output += String.format("%1\$s = %2\$s", key, value) + } + return output + } + + fun formatResponseDebug(context: Context, ssb: SpannableStringBuilder, url: String?, requestHeaders: Map?, networkResponse: NetworkResponse?, rawResponse: String?, exception: Exception?): SpannableStringBuilder { + if (url != null) { + ssb.append("\n\n") + ssb.append(context.getString(R.string.ticker_raw_url, url)) + } + if (requestHeaders != null) { + ssb.append("\n\n") + ssb.append(Html.fromHtml(context.getString(R.string.ticker_raw_request_headers) + "" + formatMapToHtmlString(requestHeaders) + "")) + } + if (networkResponse != null) { + ssb.append("\n\n") + ssb.append(context.getString(R.string.ticker_raw_response_code, networkResponse.statusCode.toString())) + ssb.append("\n\n") + ssb.append(Html.fromHtml(context.getString(R.string.ticker_raw_response_headers) + "" + formatMapToHtmlString(networkResponse.headers) + "")) + } + if (rawResponse != null) { + ssb.append("\n\n") + var limitedRawResponse: String = rawResponse + if (rawResponse.length > RAW_RESPONSE_CHARS_LIMIT) { + limitedRawResponse = rawResponse.substring(0, RAW_RESPONSE_CHARS_LIMIT) + "..." + } + ssb.append(Html.fromHtml(context.getString(R.string.ticker_raw_response) + "" + limitedRawResponse + "")) + } + if (exception != null) { + ssb.append("\n\n") + ssb.append(Html.fromHtml(context.getString(R.string.ticker_raw_stacktrace) + "" + printException(exception) + "")) + } + return ssb + } + + private fun printException(e: Exception): String { + val errors = StringWriter() + e.printStackTrace(PrintWriter(errors)) + return errors.toString() + } +} \ No newline at end of file diff --git a/dataModuleTester/src/main/java/com/aneonex/bitcoinchecker/tester/util/HttpsHelper.java b/dataModuleTester/src/main/java/com/aneonex/bitcoinchecker/tester/util/HttpsHelper.java deleted file mode 100644 index 3c2c35e8..00000000 --- a/dataModuleTester/src/main/java/com/aneonex/bitcoinchecker/tester/util/HttpsHelper.java +++ /dev/null @@ -1,51 +0,0 @@ -package com.aneonex.bitcoinchecker.tester.util; - -import javax.net.ssl.SSLContext; -import javax.net.ssl.SSLSocketFactory; -import javax.net.ssl.TrustManager; -import javax.net.ssl.X509TrustManager; - -import android.content.Context; - -import com.android.volley.RequestQueue; -import com.android.volley.toolbox.HurlStack; -import com.android.volley.toolbox.Volley; - - -public class HttpsHelper { - - public final static RequestQueue newRequestQueue(Context context) { - return Volley.newRequestQueue(context, new HurlStack(null, HttpsHelper.getMySSLSocketFactory())); - } - - public static SSLSocketFactory getMySSLSocketFactory() { - try { - SSLContext sslContext = SSLContext.getInstance("TLS"); - TrustManager tm = new X509TrustManager() { - @Override - public void checkClientTrusted( - java.security.cert.X509Certificate[] chain, - String authType) - throws java.security.cert.CertificateException { - } - - @Override - public void checkServerTrusted( - java.security.cert.X509Certificate[] chain, - String authType) - throws java.security.cert.CertificateException { - } - - @Override - public java.security.cert.X509Certificate[] getAcceptedIssuers() { - return null; - } - }; - sslContext.init(null, new TrustManager[] { tm }, null); - return sslContext.getSocketFactory(); - } catch (Exception e) { - e.printStackTrace(); - return null; - } - } -} diff --git a/dataModuleTester/src/main/java/com/aneonex/bitcoinchecker/tester/util/HttpsHelper.kt b/dataModuleTester/src/main/java/com/aneonex/bitcoinchecker/tester/util/HttpsHelper.kt new file mode 100644 index 00000000..7d6661ea --- /dev/null +++ b/dataModuleTester/src/main/java/com/aneonex/bitcoinchecker/tester/util/HttpsHelper.kt @@ -0,0 +1,45 @@ +package com.aneonex.bitcoinchecker.tester.util + +import android.content.Context +import com.android.volley.RequestQueue +import com.android.volley.toolbox.HurlStack +import com.android.volley.toolbox.Volley +import java.security.cert.CertificateException +import java.security.cert.X509Certificate +import javax.net.ssl.SSLContext +import javax.net.ssl.SSLSocketFactory +import javax.net.ssl.TrustManager +import javax.net.ssl.X509TrustManager + +object HttpsHelper { + fun newRequestQueue(context: Context?): RequestQueue { + return Volley.newRequestQueue(context, HurlStack(null, mySSLSocketFactory)) + } + + private val mySSLSocketFactory: SSLSocketFactory? + get() = try { + val sslContext = SSLContext.getInstance("TLS") + val tm: TrustManager = object : X509TrustManager { + @Throws(CertificateException::class) + override fun checkClientTrusted( + chain: Array, + authType: String) { + } + + @Throws(CertificateException::class) + override fun checkServerTrusted( + chain: Array, + authType: String) { + } + + override fun getAcceptedIssuers(): Array? { + return null + } + } + sslContext.init(null, arrayOf(tm), null) + sslContext.socketFactory + } catch (e: Exception) { + e.printStackTrace() + null + } +} \ No newline at end of file diff --git a/dataModuleTester/src/main/java/com/aneonex/bitcoinchecker/tester/util/MarketCurrencyPairsStore.java b/dataModuleTester/src/main/java/com/aneonex/bitcoinchecker/tester/util/MarketCurrencyPairsStore.java deleted file mode 100644 index 2ac7330c..00000000 --- a/dataModuleTester/src/main/java/com/aneonex/bitcoinchecker/tester/util/MarketCurrencyPairsStore.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.aneonex.bitcoinchecker.tester.util; - -import android.content.Context; -import android.content.SharedPreferences; - -import com.google.gson.Gson; -import com.aneonex.bitcoinchecker.datamodule.model.CurrencyPairsListWithDate; - -public class MarketCurrencyPairsStore { - - private static SharedPreferences getSharedPreferences(Context context) { - return context.getApplicationContext().getSharedPreferences("MARKET_CURRENCIY_PAIRS", Context.MODE_PRIVATE); - } - - public final static void savePairsForMarket(Context context, String marketKey, CurrencyPairsListWithDate currencyPairsListWithDate) { - try { - savePairsStringForMarket(context, marketKey, new Gson().toJson(currencyPairsListWithDate)); - } catch (Exception e) { - e.printStackTrace(); - } - } - private final static void savePairsStringForMarket(Context context, String marketKey, String jsonString) { - getSharedPreferences(context).edit().putString(marketKey, jsonString).commit(); - } - - public final static CurrencyPairsListWithDate getPairsForMarket(Context context, String marketKey) { - try { - return new Gson().fromJson(getPairsStringForMarket(context, marketKey), CurrencyPairsListWithDate.class); - } catch (Exception e){ - e.printStackTrace(); - return null; - } - } - private final static String getPairsStringForMarket(Context context, String marketKey) { - return getSharedPreferences(context).getString(marketKey, null); - } -} diff --git a/dataModuleTester/src/main/java/com/aneonex/bitcoinchecker/tester/util/MarketCurrencyPairsStore.kt b/dataModuleTester/src/main/java/com/aneonex/bitcoinchecker/tester/util/MarketCurrencyPairsStore.kt new file mode 100644 index 00000000..d4fc1e01 --- /dev/null +++ b/dataModuleTester/src/main/java/com/aneonex/bitcoinchecker/tester/util/MarketCurrencyPairsStore.kt @@ -0,0 +1,37 @@ +package com.aneonex.bitcoinchecker.tester.util + +import android.content.Context +import android.content.SharedPreferences +import com.aneonex.bitcoinchecker.datamodule.model.CurrencyPairsListWithDate +import com.google.gson.Gson + +object MarketCurrencyPairsStore { + private fun getSharedPreferences(context: Context): SharedPreferences { + return context.applicationContext.getSharedPreferences("MARKET_CURRENCIY_PAIRS", Context.MODE_PRIVATE) + } + + fun savePairsForMarket(context: Context, marketKey: String, currencyPairsListWithDate: CurrencyPairsListWithDate?) { + try { + savePairsStringForMarket(context, marketKey, Gson().toJson(currencyPairsListWithDate)) + } catch (e: Exception) { + e.printStackTrace() + } + } + + private fun savePairsStringForMarket(context: Context, marketKey: String, jsonString: String) { + getSharedPreferences(context).edit().putString(marketKey, jsonString).commit() + } + + fun getPairsForMarket(context: Context, marketKey: String): CurrencyPairsListWithDate? { + return try { + Gson().fromJson(getPairsStringForMarket(context, marketKey), CurrencyPairsListWithDate::class.java) + } catch (e: Exception) { + e.printStackTrace() + null + } + } + + private fun getPairsStringForMarket(context: Context, marketKey: String): String? { + return getSharedPreferences(context).getString(marketKey, null) + } +} \ No newline at end of file diff --git a/dataModuleTester/src/main/java/com/aneonex/bitcoinchecker/tester/volley/CheckerErrorParsedError.java b/dataModuleTester/src/main/java/com/aneonex/bitcoinchecker/tester/volley/CheckerErrorParsedError.java deleted file mode 100644 index 1e224752..00000000 --- a/dataModuleTester/src/main/java/com/aneonex/bitcoinchecker/tester/volley/CheckerErrorParsedError.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.aneonex.bitcoinchecker.tester.volley; - -import com.android.volley.ParseError; - -public class CheckerErrorParsedError extends ParseError { - - private final String errorMsg; - - private static final long serialVersionUID = -8541129282633613311L; - - public CheckerErrorParsedError(String errorMsg) { - super(); - this.errorMsg = errorMsg; - } - - public String getErrorMsg() { - return errorMsg; - } -} diff --git a/dataModuleTester/src/main/java/com/aneonex/bitcoinchecker/tester/volley/CheckerErrorParsedError.kt b/dataModuleTester/src/main/java/com/aneonex/bitcoinchecker/tester/volley/CheckerErrorParsedError.kt new file mode 100644 index 00000000..d575ad77 --- /dev/null +++ b/dataModuleTester/src/main/java/com/aneonex/bitcoinchecker/tester/volley/CheckerErrorParsedError.kt @@ -0,0 +1,10 @@ +package com.aneonex.bitcoinchecker.tester.volley + +import com.android.volley.ParseError + +class CheckerErrorParsedError(val errorMsg: String?) : ParseError() { + + companion object { + private const val serialVersionUID = -8541129282633613311L + } +} \ No newline at end of file diff --git a/dataModuleTester/src/main/java/com/aneonex/bitcoinchecker/tester/volley/CheckerVolleyMainRequest.java b/dataModuleTester/src/main/java/com/aneonex/bitcoinchecker/tester/volley/CheckerVolleyMainRequest.java deleted file mode 100644 index 3b0c2341..00000000 --- a/dataModuleTester/src/main/java/com/aneonex/bitcoinchecker/tester/volley/CheckerVolleyMainRequest.java +++ /dev/null @@ -1,72 +0,0 @@ -package com.aneonex.bitcoinchecker.tester.volley; - -import java.util.Map; - -import android.text.TextUtils; - -import com.android.volley.DefaultRetryPolicy; -import com.android.volley.Response.ErrorListener; -import com.android.volley.Response.Listener; -import com.android.volley.toolbox.RequestFuture; -import com.aneonex.bitcoinchecker.datamodule.model.CheckerInfo; -import com.aneonex.bitcoinchecker.datamodule.model.Market; -import com.aneonex.bitcoinchecker.datamodule.model.Ticker; -import com.aneonex.bitcoinchecker.tester.volley.CheckerVolleyMainRequest.TickerWrapper; -import com.aneonex.bitcoinchecker.tester.volley.generic.GenericCheckerVolleyRequest; - -public class CheckerVolleyMainRequest extends GenericCheckerVolleyRequest { - - private final Market market; - - public CheckerVolleyMainRequest(Market market, CheckerInfo checkerInfo, Listener listener, ErrorListener errorListener) { - super(market.getUrl(0, checkerInfo), checkerInfo, listener, errorListener); - setRetryPolicy(new DefaultRetryPolicy(5000, 3, 1.5f)); - this.market = market; - } - - @Override - protected TickerWrapper parseNetworkResponse(Map headers, String responseString) throws Exception { - TickerWrapper tickerWrapper = new TickerWrapper(); - try { - tickerWrapper.ticker = market.parseTickerMain(0, responseString, new Ticker(), checkerInfo); - } catch (Exception e) { - e.printStackTrace(); - tickerWrapper.ticker = null; - } - - if(tickerWrapper.ticker==null || tickerWrapper.ticker.last<=Ticker.NO_DATA) { - String errorMsg; - try { - errorMsg = market.parseErrorMain(0, responseString, checkerInfo); - } catch (Exception e) { - errorMsg = null; - } - throw new CheckerErrorParsedError(errorMsg); - } - - final int numOfRequests = market.getNumOfRequests(checkerInfo); - if(numOfRequests>1) { - for(int requestId=1; requestId future = RequestFuture.newFuture(); - final String nextUrl = market.getUrl(requestId, checkerInfo); - if(!TextUtils.isEmpty(nextUrl)) { - CheckerVolleyNextRequest request = new CheckerVolleyNextRequest(nextUrl, checkerInfo, future); - getRequestQueue().add(request); - String nextResponse = future.get(); // this will block - market.parseTickerMain(requestId, nextResponse, tickerWrapper.ticker, checkerInfo); - } - } catch (Exception e) { - e.printStackTrace(); - } - } - } - return tickerWrapper; - } - - public class TickerWrapper { - - public Ticker ticker; - - } -} diff --git a/dataModuleTester/src/main/java/com/aneonex/bitcoinchecker/tester/volley/CheckerVolleyMainRequest.kt b/dataModuleTester/src/main/java/com/aneonex/bitcoinchecker/tester/volley/CheckerVolleyMainRequest.kt new file mode 100644 index 00000000..bef6a397 --- /dev/null +++ b/dataModuleTester/src/main/java/com/aneonex/bitcoinchecker/tester/volley/CheckerVolleyMainRequest.kt @@ -0,0 +1,63 @@ +package com.aneonex.bitcoinchecker.tester.volley + +import android.text.TextUtils +import com.android.volley.DefaultRetryPolicy +import com.android.volley.Response +import com.android.volley.toolbox.RequestFuture +import com.aneonex.bitcoinchecker.datamodule.model.CheckerInfo +import com.aneonex.bitcoinchecker.datamodule.model.Market +import com.aneonex.bitcoinchecker.datamodule.model.Ticker +import com.aneonex.bitcoinchecker.tester.volley.CheckerVolleyMainRequest.TickerWrapper +import com.aneonex.bitcoinchecker.tester.volley.generic.GenericCheckerVolleyRequest + +class CheckerVolleyMainRequest(market: Market, checkerInfo: CheckerInfo, listener: Response.Listener, errorListener: Response.ErrorListener) + : GenericCheckerVolleyRequest(market.getUrl(0, checkerInfo), checkerInfo, listener, errorListener) { + + private val market: Market + @Throws(Exception::class) + override fun parseNetworkResponse(headers: Map?, responseString: String?): TickerWrapper? { + val tickerWrapper = TickerWrapper() + try { + tickerWrapper.ticker = market.parseTickerMain(0, responseString!!, Ticker(), checkerInfo) + } catch (e: Exception) { + e.printStackTrace() + tickerWrapper.ticker = null + } + if (tickerWrapper.ticker == null || tickerWrapper.ticker!!.last <= Ticker.NO_DATA) { + val errorMsg: String? = try { + market.parseErrorMain(0, responseString!!, checkerInfo) + } catch (e: Exception) { + null + } + throw CheckerErrorParsedError(errorMsg) + } + + val numOfRequests = market.getNumOfRequests(checkerInfo) + if (numOfRequests > 1) { + for (requestId in 1 until numOfRequests) { + try { + val future = RequestFuture.newFuture() + val nextUrl = market.getUrl(requestId, checkerInfo) + if (!TextUtils.isEmpty(nextUrl)) { + val request = CheckerVolleyNextRequest(nextUrl, checkerInfo, future) + requestQueue!!.add(request) + val nextResponse = future.get() // this will block + market.parseTickerMain(requestId, nextResponse, tickerWrapper.ticker!!, checkerInfo) + } + } catch (e: Exception) { + e.printStackTrace() + } + } + } + return tickerWrapper + } + + inner class TickerWrapper { + var ticker: Ticker? = null + } + + init { + retryPolicy = DefaultRetryPolicy(5000, 3, 1.5f) + this.market = market + } +} \ No newline at end of file diff --git a/dataModuleTester/src/main/java/com/aneonex/bitcoinchecker/tester/volley/CheckerVolleyNextRequest.java b/dataModuleTester/src/main/java/com/aneonex/bitcoinchecker/tester/volley/CheckerVolleyNextRequest.java deleted file mode 100644 index 6eec5391..00000000 --- a/dataModuleTester/src/main/java/com/aneonex/bitcoinchecker/tester/volley/CheckerVolleyNextRequest.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.aneonex.bitcoinchecker.tester.volley; - -import java.util.Map; - -import com.android.volley.toolbox.RequestFuture; -import com.aneonex.bitcoinchecker.datamodule.model.CheckerInfo; -import com.aneonex.bitcoinchecker.tester.volley.generic.GenericCheckerVolleyRequest; - -public class CheckerVolleyNextRequest extends GenericCheckerVolleyRequest { - - public CheckerVolleyNextRequest(String url, CheckerInfo checkerInfo, RequestFuture future) { - super(url, checkerInfo, future, future); - } - - @Override - protected String parseNetworkResponse(Map headers, String responseString) throws Exception { - return responseString; - } -} diff --git a/dataModuleTester/src/main/java/com/aneonex/bitcoinchecker/tester/volley/CheckerVolleyNextRequest.kt b/dataModuleTester/src/main/java/com/aneonex/bitcoinchecker/tester/volley/CheckerVolleyNextRequest.kt new file mode 100644 index 00000000..a1237580 --- /dev/null +++ b/dataModuleTester/src/main/java/com/aneonex/bitcoinchecker/tester/volley/CheckerVolleyNextRequest.kt @@ -0,0 +1,12 @@ +package com.aneonex.bitcoinchecker.tester.volley + +import com.android.volley.toolbox.RequestFuture +import com.aneonex.bitcoinchecker.datamodule.model.CheckerInfo +import com.aneonex.bitcoinchecker.tester.volley.generic.GenericCheckerVolleyRequest + +class CheckerVolleyNextRequest(url: String?, checkerInfo: CheckerInfo, future: RequestFuture) : GenericCheckerVolleyRequest(url, checkerInfo, future, future) { + @Throws(Exception::class) + override fun parseNetworkResponse(headers: Map?, responseString: String?): String? { + return responseString + } +} \ No newline at end of file diff --git a/dataModuleTester/src/main/java/com/aneonex/bitcoinchecker/tester/volley/DynamicCurrencyPairsVolleyMainRequest.java b/dataModuleTester/src/main/java/com/aneonex/bitcoinchecker/tester/volley/DynamicCurrencyPairsVolleyMainRequest.java deleted file mode 100644 index 15e47952..00000000 --- a/dataModuleTester/src/main/java/com/aneonex/bitcoinchecker/tester/volley/DynamicCurrencyPairsVolleyMainRequest.java +++ /dev/null @@ -1,70 +0,0 @@ -package com.aneonex.bitcoinchecker.tester.volley; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.Map; - -import android.content.Context; -import android.text.TextUtils; - -import com.android.volley.Response.ErrorListener; -import com.android.volley.Response.Listener; -import com.android.volley.toolbox.RequestFuture; -import com.aneonex.bitcoinchecker.datamodule.model.CurrencyPairInfo; -import com.aneonex.bitcoinchecker.datamodule.model.CurrencyPairsListWithDate; -import com.aneonex.bitcoinchecker.datamodule.model.Market; -import com.aneonex.bitcoinchecker.datamodule.util.CurrencyPairsMapHelper; -import com.aneonex.bitcoinchecker.tester.util.MarketCurrencyPairsStore; -import com.aneonex.bitcoinchecker.tester.volley.generic.GzipVolleyRequest; - -public class DynamicCurrencyPairsVolleyMainRequest extends GzipVolleyRequest { - - private final Context context; - private final Market market; - - public DynamicCurrencyPairsVolleyMainRequest(Context context, Market market, Listener listener, ErrorListener errorListener) { - super(market.getCurrencyPairsUrl(0), listener, errorListener); - - - this.context = context; - this.market = market; - } - - @Override - protected CurrencyPairsMapHelper parseNetworkResponse(Map headers, String responseString) throws Exception { - final List pairs = new ArrayList(); - market.parseCurrencyPairsMain(0, responseString, pairs); - - final int numOfRequests = market.getCurrencyPairsNumOfRequests(); - if(numOfRequests>1) { - final List nextPairs = new ArrayList(); - for(int requestId=1; requestId future = RequestFuture.newFuture(); - final String nextUrl = market.getCurrencyPairsUrl(requestId); - if(!TextUtils.isEmpty(nextUrl)) { - DynamicCurrencyPairsVolleyNextRequest request = new DynamicCurrencyPairsVolleyNextRequest(nextUrl, future); - getRequestQueue().add(request); - String nextResponse = future.get(); // this will block - nextPairs.clear(); - market.parseCurrencyPairsMain(requestId, nextResponse, nextPairs); - pairs.addAll(nextPairs); - } - } catch (Exception e) { - e.printStackTrace(); - } - } - } - - Collections.sort(pairs); - CurrencyPairsListWithDate currencyPairsListWithDate = new CurrencyPairsListWithDate(); - currencyPairsListWithDate.date = System.currentTimeMillis(); - currencyPairsListWithDate.pairs = pairs; - - if(pairs!=null && pairs.size()>0) - MarketCurrencyPairsStore.savePairsForMarket(context, market.key, currencyPairsListWithDate); - - return new CurrencyPairsMapHelper(currencyPairsListWithDate); - } -} diff --git a/dataModuleTester/src/main/java/com/aneonex/bitcoinchecker/tester/volley/DynamicCurrencyPairsVolleyMainRequest.kt b/dataModuleTester/src/main/java/com/aneonex/bitcoinchecker/tester/volley/DynamicCurrencyPairsVolleyMainRequest.kt new file mode 100644 index 00000000..4de432e3 --- /dev/null +++ b/dataModuleTester/src/main/java/com/aneonex/bitcoinchecker/tester/volley/DynamicCurrencyPairsVolleyMainRequest.kt @@ -0,0 +1,49 @@ +package com.aneonex.bitcoinchecker.tester.volley + +import android.content.Context +import android.text.TextUtils +import com.android.volley.Response +import com.android.volley.toolbox.RequestFuture +import com.aneonex.bitcoinchecker.datamodule.model.CurrencyPairInfo +import com.aneonex.bitcoinchecker.datamodule.model.CurrencyPairsListWithDate +import com.aneonex.bitcoinchecker.datamodule.model.Market +import com.aneonex.bitcoinchecker.datamodule.util.CurrencyPairsMapHelper +import com.aneonex.bitcoinchecker.tester.util.MarketCurrencyPairsStore +import com.aneonex.bitcoinchecker.tester.volley.generic.GzipVolleyRequest +import java.util.* + +class DynamicCurrencyPairsVolleyMainRequest(private val context: Context, private val market: Market, listener: Response.Listener, errorListener: Response.ErrorListener) + : GzipVolleyRequest(market.getCurrencyPairsUrl(0), listener, errorListener) { + + @Throws(Exception::class) + override fun parseNetworkResponse(headers: Map?, responseString: String?): CurrencyPairsMapHelper { + val pairs: MutableList = ArrayList() + market.parseCurrencyPairsMain(0, responseString!!, pairs) + val numOfRequests = market.currencyPairsNumOfRequests + if (numOfRequests > 1) { + val nextPairs: MutableList = ArrayList() + for (requestId in 1 until numOfRequests) { + try { + val future = RequestFuture.newFuture() + val nextUrl = market.getCurrencyPairsUrl(requestId) + if (!TextUtils.isEmpty(nextUrl)) { + val request = DynamicCurrencyPairsVolleyNextRequest(nextUrl, future) + requestQueue!!.add(request) + val nextResponse = future.get() // this will block + nextPairs.clear() + market.parseCurrencyPairsMain(requestId, nextResponse, nextPairs) + pairs.addAll(nextPairs) + } + } catch (e: Exception) { + e.printStackTrace() + } + } + } + pairs.sort() + val currencyPairsListWithDate = CurrencyPairsListWithDate() + currencyPairsListWithDate.date = System.currentTimeMillis() + currencyPairsListWithDate.pairs = pairs + if (pairs.size > 0) MarketCurrencyPairsStore.savePairsForMarket(context, market.key, currencyPairsListWithDate) + return CurrencyPairsMapHelper(currencyPairsListWithDate) + } +} \ No newline at end of file diff --git a/dataModuleTester/src/main/java/com/aneonex/bitcoinchecker/tester/volley/DynamicCurrencyPairsVolleyNextRequest.java b/dataModuleTester/src/main/java/com/aneonex/bitcoinchecker/tester/volley/DynamicCurrencyPairsVolleyNextRequest.java deleted file mode 100644 index 02d13a4a..00000000 --- a/dataModuleTester/src/main/java/com/aneonex/bitcoinchecker/tester/volley/DynamicCurrencyPairsVolleyNextRequest.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.aneonex.bitcoinchecker.tester.volley; - -import java.util.Map; - -import com.android.volley.toolbox.RequestFuture; -import com.aneonex.bitcoinchecker.tester.volley.generic.GzipVolleyRequest; - -public class DynamicCurrencyPairsVolleyNextRequest extends GzipVolleyRequest { - - public DynamicCurrencyPairsVolleyNextRequest(String url, RequestFuture future) { - super(url, future, future); - } - - @Override - protected String parseNetworkResponse(Map headers, String responseString) throws Exception { - return responseString; - } - -} diff --git a/dataModuleTester/src/main/java/com/aneonex/bitcoinchecker/tester/volley/DynamicCurrencyPairsVolleyNextRequest.kt b/dataModuleTester/src/main/java/com/aneonex/bitcoinchecker/tester/volley/DynamicCurrencyPairsVolleyNextRequest.kt new file mode 100644 index 00000000..bc0d88b3 --- /dev/null +++ b/dataModuleTester/src/main/java/com/aneonex/bitcoinchecker/tester/volley/DynamicCurrencyPairsVolleyNextRequest.kt @@ -0,0 +1,11 @@ +package com.aneonex.bitcoinchecker.tester.volley + +import com.android.volley.toolbox.RequestFuture +import com.aneonex.bitcoinchecker.tester.volley.generic.GzipVolleyRequest + +class DynamicCurrencyPairsVolleyNextRequest(url: String?, future: RequestFuture) : GzipVolleyRequest(url, future, future) { + @Throws(Exception::class) + override fun parseNetworkResponse(headers: Map?, responseString: String?): String? { + return responseString + } +} \ No newline at end of file diff --git a/dataModuleTester/src/main/java/com/aneonex/bitcoinchecker/tester/volley/UnknownVolleyError.java b/dataModuleTester/src/main/java/com/aneonex/bitcoinchecker/tester/volley/UnknownVolleyError.java deleted file mode 100644 index 9b97cc23..00000000 --- a/dataModuleTester/src/main/java/com/aneonex/bitcoinchecker/tester/volley/UnknownVolleyError.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.aneonex.bitcoinchecker.tester.volley; - -import com.android.volley.VolleyError; - -public class UnknownVolleyError extends VolleyError { - - private static final long serialVersionUID = -8541129282633613311L; - - public UnknownVolleyError(Throwable cause) { - super(cause); - } -} diff --git a/dataModuleTester/src/main/java/com/aneonex/bitcoinchecker/tester/volley/UnknownVolleyError.kt b/dataModuleTester/src/main/java/com/aneonex/bitcoinchecker/tester/volley/UnknownVolleyError.kt new file mode 100644 index 00000000..505d4e72 --- /dev/null +++ b/dataModuleTester/src/main/java/com/aneonex/bitcoinchecker/tester/volley/UnknownVolleyError.kt @@ -0,0 +1,9 @@ +package com.aneonex.bitcoinchecker.tester.volley + +import com.android.volley.VolleyError + +class UnknownVolleyError(cause: Throwable?) : VolleyError(cause) { + companion object { + private const val serialVersionUID = -8541129282633613311L + } +} \ No newline at end of file diff --git a/dataModuleTester/src/main/java/com/aneonex/bitcoinchecker/tester/volley/generic/GenericCheckerVolleyRequest.java b/dataModuleTester/src/main/java/com/aneonex/bitcoinchecker/tester/volley/generic/GenericCheckerVolleyRequest.java deleted file mode 100644 index e62d8ccb..00000000 --- a/dataModuleTester/src/main/java/com/aneonex/bitcoinchecker/tester/volley/generic/GenericCheckerVolleyRequest.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.aneonex.bitcoinchecker.tester.volley.generic; - -import com.android.volley.Response.ErrorListener; -import com.android.volley.Response.Listener; -import com.aneonex.bitcoinchecker.datamodule.model.CheckerInfo; - -public abstract class GenericCheckerVolleyRequest extends GzipVolleyRequest { - - protected final CheckerInfo checkerInfo; - - public GenericCheckerVolleyRequest(String url, CheckerInfo checkerInfo, Listener listener, ErrorListener errorListener) { - super(url, listener, errorListener); - - this.checkerInfo = checkerInfo; - } -} diff --git a/dataModuleTester/src/main/java/com/aneonex/bitcoinchecker/tester/volley/generic/GenericCheckerVolleyRequest.kt b/dataModuleTester/src/main/java/com/aneonex/bitcoinchecker/tester/volley/generic/GenericCheckerVolleyRequest.kt new file mode 100644 index 00000000..103cde98 --- /dev/null +++ b/dataModuleTester/src/main/java/com/aneonex/bitcoinchecker/tester/volley/generic/GenericCheckerVolleyRequest.kt @@ -0,0 +1,6 @@ +package com.aneonex.bitcoinchecker.tester.volley.generic + +import com.android.volley.Response +import com.aneonex.bitcoinchecker.datamodule.model.CheckerInfo + +abstract class GenericCheckerVolleyRequest(url: String?, protected val checkerInfo: CheckerInfo, listener: Response.Listener, errorListener: Response.ErrorListener) : GzipVolleyRequest(url, listener, errorListener) \ No newline at end of file diff --git a/dataModuleTester/src/main/java/com/aneonex/bitcoinchecker/tester/volley/generic/GzipVolleyRequest.java b/dataModuleTester/src/main/java/com/aneonex/bitcoinchecker/tester/volley/generic/GzipVolleyRequest.java deleted file mode 100644 index b21c93c3..00000000 --- a/dataModuleTester/src/main/java/com/aneonex/bitcoinchecker/tester/volley/generic/GzipVolleyRequest.java +++ /dev/null @@ -1,165 +0,0 @@ -package com.aneonex.bitcoinchecker.tester.volley.generic; - -import java.io.BufferedReader; -import java.io.ByteArrayInputStream; -import java.io.InputStreamReader; -import java.net.HttpURLConnection; -import java.util.HashMap; -import java.util.Map; -import java.util.zip.GZIPInputStream; - -import com.android.volley.AuthFailureError; -import com.android.volley.Cache.Entry; -import com.android.volley.NetworkResponse; -import com.android.volley.ParseError; -import com.android.volley.Request; -import com.android.volley.RequestQueue; -import com.android.volley.Response; -import com.android.volley.Response.ErrorListener; -import com.android.volley.Response.Listener; -import com.android.volley.VolleyError; -import com.android.volley.toolbox.HttpHeaderParser; -import com.aneonex.bitcoinchecker.tester.volley.CheckerErrorParsedError; -import com.aneonex.bitcoinchecker.tester.volley.UnknownVolleyError; - -public abstract class GzipVolleyRequest extends Request { - - private final Listener listener; - private final ErrorListener errorListener; - private final Map headers; - - private RequestQueue requestQueue; - private String redirectionUrl = null; - private int redirectionCount; - - private Map requestHeaders; - private NetworkResponse networkResponse; - private String responseString; - - private final static int MAX_REDIRECTION_COUNT = 3; - - public GzipVolleyRequest(String url, Listener listener, ErrorListener errorListener) { - super(Method.GET, url, errorListener); - - this.listener = listener; - this.errorListener = errorListener; - - this.headers = new HashMap(); - this.headers.put("Accept-Encoding", "gzip"); - this.headers.put("User-Agent", "Bitcoin Checker (gzip)"); - } - - public RequestQueue getRequestQueue() { - return requestQueue; - } - - @Override - public String getUrl() { - if(redirectionUrl!=null) - return redirectionUrl; - return super.getUrl(); - } - - @Override - public Map getHeaders() throws AuthFailureError { - requestHeaders = headers!=null ? headers : super.getHeaders(); - return requestHeaders; - } - - @Override - public Request setRequestQueue(RequestQueue requestQueue) { - this.requestQueue = requestQueue; - return super.setRequestQueue(requestQueue); - } - - @Override - public void deliverError(VolleyError error) { - if(error!=null && error.networkResponse!=null) { - final int statusCode = error.networkResponse.statusCode; - if(statusCode==HttpURLConnection.HTTP_MOVED_PERM || statusCode==HttpURLConnection.HTTP_MOVED_TEMP) { - String location = error.networkResponse.headers.get("Location"); - if(location!=null && redirectionCount)listener).onResponse(getUrl(), requestHeaders, networkResponse, responseString, response); - else - listener.onResponse(response); - } - - protected abstract T parseNetworkResponse(Map headers, String responseString) throws Exception; - - @Override - protected Response parseNetworkResponse(NetworkResponse response) { - try { - networkResponse = response; - String responseString = ""; - final String encoding = response.headers.get("Content-Encoding"); - if(encoding!=null && encoding.contains("gzip")) { - responseString = decodeGZip(response.data); - } else { - responseString = new String(response.data, HttpHeaderParser.parseCharset(response.headers)); - } - this.responseString = responseString; - final Map headers = response.headers; - final Entry cacheHeaders = HttpHeaderParser.parseCacheHeaders(response); - response = null; - return Response.success(parseNetworkResponse(headers, responseString), cacheHeaders); - } catch (CheckerErrorParsedError checkerErrorParsedError) { - return Response.error(checkerErrorParsedError); - } catch (Exception e) { - return Response.error(new ParseError(e)); - } catch (Throwable e) { - return Response.error(new UnknownVolleyError(e)); - } - } - - private String decodeGZip(byte[] data) throws Exception { - String responseString = ""; - - ByteArrayInputStream bais = null; - GZIPInputStream gzis = null; - InputStreamReader reader = null; - BufferedReader in = null; - - try { - bais = new ByteArrayInputStream(data); - gzis = new GZIPInputStream(bais); - reader = new InputStreamReader(gzis); - in = new BufferedReader(reader); - - String readed; - while ((readed = in.readLine()) != null) { - responseString += readed+"\n"; - } - } catch (Exception e) { - throw e; - } finally { - try { - if(bais!=null) - bais.close(); - if(gzis!=null) - gzis.close(); - if(reader!=null) - reader.close(); - if(in!=null) - in.close(); - } catch (Exception e) {}; - } - - return responseString; - } -} diff --git a/dataModuleTester/src/main/java/com/aneonex/bitcoinchecker/tester/volley/generic/GzipVolleyRequest.kt b/dataModuleTester/src/main/java/com/aneonex/bitcoinchecker/tester/volley/generic/GzipVolleyRequest.kt new file mode 100644 index 00000000..d5ca49b4 --- /dev/null +++ b/dataModuleTester/src/main/java/com/aneonex/bitcoinchecker/tester/volley/generic/GzipVolleyRequest.kt @@ -0,0 +1,133 @@ +package com.aneonex.bitcoinchecker.tester.volley.generic + +import com.android.volley.* +import com.android.volley.toolbox.HttpHeaderParser +import com.aneonex.bitcoinchecker.tester.volley.CheckerErrorParsedError +import com.aneonex.bitcoinchecker.tester.volley.UnknownVolleyError +import java.io.BufferedReader +import java.io.ByteArrayInputStream +import java.io.InputStreamReader +import java.net.HttpURLConnection +import java.util.* +import java.util.zip.GZIPInputStream + +abstract class GzipVolleyRequest(url: String?, private val listener: Response.Listener, errorListener: Response.ErrorListener) + : Request(Method.GET, url, errorListener) { + + private val initialErrorListener = errorListener + private val headers: MutableMap? + var requestQueue: RequestQueue? = null + private set + private var redirectionUrl: String? = null + private var redirectionCount = 0 + private var requestHeaders: Map? = null + private var networkResponse: NetworkResponse? = null + private var responseString: String? = null + + override fun getUrl(): String { + return if (redirectionUrl != null) redirectionUrl.toString() else super.getUrl() + } + + @Throws(AuthFailureError::class) + override fun getHeaders(): Map { + requestHeaders = headers ?: super.getHeaders() + return requestHeaders!! + } + + override fun setRequestQueue(requestQueue: RequestQueue): Request<*> { + this.requestQueue = requestQueue + return super.setRequestQueue(requestQueue) + } + + override fun deliverError(error: VolleyError) { + if (error.networkResponse != null) { + val statusCode = error.networkResponse.statusCode + if (statusCode == HttpURLConnection.HTTP_MOVED_PERM || statusCode == HttpURLConnection.HTTP_MOVED_TEMP) { + val location = error.networkResponse.headers["Location"] + if (location != null && redirectionCount < MAX_REDIRECTION_COUNT) { + ++redirectionCount + redirectionUrl = location + requestQueue!!.add(this) + return + } + } + } + if (initialErrorListener is ResponseErrorListener) + initialErrorListener.onErrorResponse(url, requestHeaders, networkResponse, responseString, error) + else super.deliverError(error) + } + + override fun deliverResponse(response: T) { + if (listener is ResponseListener<*>) (listener as ResponseListener).onResponse(url, requestHeaders, networkResponse, responseString, response) else listener.onResponse(response) + } + + @Throws(Exception::class) + protected abstract fun parseNetworkResponse(headers: Map?, responseString: String?): T? + + override fun parseNetworkResponse(response: NetworkResponse): Response { +// var response: NetworkResponse? = response + return try { + networkResponse = response + val encoding = response.headers["Content-Encoding"] + val responseString = if (encoding != null && encoding.contains("gzip")) { + decodeGZip(response.data) + } else { + String(response.data, charset(HttpHeaderParser.parseCharset(response.headers))) + } + this.responseString = responseString + val headers = response.headers + val cacheHeaders = HttpHeaderParser.parseCacheHeaders(response) +// response = null + Response.success(parseNetworkResponse(headers, responseString), cacheHeaders) + } catch (checkerErrorParsedError: CheckerErrorParsedError) { + Response.error(checkerErrorParsedError) + } catch (e: Exception) { + Response.error(ParseError(e)) + } catch (e: Throwable) { + Response.error(UnknownVolleyError(e)) + } + } + + @Throws(Exception::class) + private fun decodeGZip(data: ByteArray): String { + var responseString = "" + var bais: ByteArrayInputStream? = null + var gzis: GZIPInputStream? = null + var reader: InputStreamReader? = null + var bufReader: BufferedReader? = null + try { + bais = ByteArrayInputStream(data) + gzis = GZIPInputStream(bais) + reader = InputStreamReader(gzis) + bufReader = BufferedReader(reader) + var readed: String? + while (bufReader.readLine().also { readed = it } != null) { + responseString += """ + $readed + + """.trimIndent() + } + } catch (e: Exception) { + throw e + } finally { + try { + bais?.close() + gzis?.close() + reader?.close() + bufReader?.close() + } catch (e: Exception) { + } + } + return responseString + } + + companion object { + private const val MAX_REDIRECTION_COUNT = 3 + } + + init { + headers = HashMap() + headers["Accept-Encoding"] = "gzip" + headers["User-Agent"] = "Bitcoin Checker (gzip)" + } +} \ No newline at end of file diff --git a/dataModuleTester/src/main/java/com/aneonex/bitcoinchecker/tester/volley/generic/ResponseErrorListener.java b/dataModuleTester/src/main/java/com/aneonex/bitcoinchecker/tester/volley/generic/ResponseErrorListener.java deleted file mode 100644 index 624bb386..00000000 --- a/dataModuleTester/src/main/java/com/aneonex/bitcoinchecker/tester/volley/generic/ResponseErrorListener.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.aneonex.bitcoinchecker.tester.volley.generic; - -import java.util.Map; - -import com.android.volley.NetworkResponse; -import com.android.volley.Response.ErrorListener; -import com.android.volley.VolleyError; - -public abstract class ResponseErrorListener implements ErrorListener { - - public abstract void onErrorResponse(String url, Map requestHeaders, NetworkResponse networkResponse, String responseString, VolleyError error); - - @Override - public void onErrorResponse(VolleyError error) { - onErrorResponse(null, null, null, null, error); - } - -} diff --git a/dataModuleTester/src/main/java/com/aneonex/bitcoinchecker/tester/volley/generic/ResponseErrorListener.kt b/dataModuleTester/src/main/java/com/aneonex/bitcoinchecker/tester/volley/generic/ResponseErrorListener.kt new file mode 100644 index 00000000..9786fa30 --- /dev/null +++ b/dataModuleTester/src/main/java/com/aneonex/bitcoinchecker/tester/volley/generic/ResponseErrorListener.kt @@ -0,0 +1,12 @@ +package com.aneonex.bitcoinchecker.tester.volley.generic + +import com.android.volley.NetworkResponse +import com.android.volley.Response +import com.android.volley.VolleyError + +abstract class ResponseErrorListener : Response.ErrorListener { + abstract fun onErrorResponse(url: String?, requestHeaders: Map?, networkResponse: NetworkResponse?, responseString: String?, error: VolleyError) + override fun onErrorResponse(error: VolleyError) { + onErrorResponse(null, null, null, null, error) + } +} \ No newline at end of file diff --git a/dataModuleTester/src/main/java/com/aneonex/bitcoinchecker/tester/volley/generic/ResponseListener.java b/dataModuleTester/src/main/java/com/aneonex/bitcoinchecker/tester/volley/generic/ResponseListener.java deleted file mode 100644 index 05118031..00000000 --- a/dataModuleTester/src/main/java/com/aneonex/bitcoinchecker/tester/volley/generic/ResponseListener.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.aneonex.bitcoinchecker.tester.volley.generic; - -import java.util.Map; - -import com.android.volley.NetworkResponse; -import com.android.volley.Response.Listener; - -public abstract class ResponseListener implements Listener { - - public abstract void onResponse(String url, Map requestHeaders, NetworkResponse networkResponse, String responseString, T response); - - @Override - public void onResponse(T response) { - onResponse(null, null, null, null, response); - } -} diff --git a/dataModuleTester/src/main/java/com/aneonex/bitcoinchecker/tester/volley/generic/ResponseListener.kt b/dataModuleTester/src/main/java/com/aneonex/bitcoinchecker/tester/volley/generic/ResponseListener.kt new file mode 100644 index 00000000..fd2440b5 --- /dev/null +++ b/dataModuleTester/src/main/java/com/aneonex/bitcoinchecker/tester/volley/generic/ResponseListener.kt @@ -0,0 +1,11 @@ +package com.aneonex.bitcoinchecker.tester.volley.generic + +import com.android.volley.NetworkResponse +import com.android.volley.Response + +abstract class ResponseListener : Response.Listener { + abstract fun onResponse(url: String?, requestHeaders: Map?, networkResponse: NetworkResponse?, responseString: String?, response: T) + override fun onResponse(response: T) { + onResponse(null, null, null, null, response) + } +} \ No newline at end of file From 0420b9a3333cfd08b159b3b8e0838f36b0b01fa9 Mon Sep 17 00:00:00 2001 From: Alexander Biryukov Date: Mon, 14 Sep 2020 15:27:43 +0300 Subject: [PATCH 033/183] Fix warning (condition always 'true') (#7) * Minor fix (condition always 'true') --- .../aneonex/bitcoinchecker/datamodule/model/market/Gemini.kt | 4 ++-- .../aneonex/bitcoinchecker/datamodule/model/market/Kraken.kt | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Gemini.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Gemini.kt index 5756468e..8d4b8cbb 100644 --- a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Gemini.kt +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Gemini.kt @@ -39,11 +39,11 @@ class Gemini : Market(NAME, TTS_NAME, CURRENCY_PAIRS) { //We could do something like take the average of the last Y prices //But I will just take the average of the last bid and asking price val bidsArray = jsonObject.getJSONArray("bids") - if (bidsArray != null && bidsArray.length() > 0) { + if (bidsArray.length() > 0) { ticker.bid = bidsArray.getJSONObject(0).getDouble("price") } val asksArray = jsonObject.getJSONArray("asks") - if (asksArray != null && asksArray.length() > 0) { + if (asksArray.length() > 0) { ticker.ask = asksArray.getJSONObject(0).getDouble("price") } if (ticker.bid != Ticker.NO_DATA.toDouble() && ticker.ask != Ticker.NO_DATA.toDouble()) { diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Kraken.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Kraken.kt index afb8c7a8..c6856ad8 100644 --- a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Kraken.kt +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Kraken.kt @@ -39,7 +39,7 @@ class Kraken : Market(NAME, TTS_NAME, null) { @Throws(Exception::class) private fun getDoubleFromJsonArrayObject(jsonObject: JSONObject, arrayKey: String): Double { val jsonArray = jsonObject.getJSONArray(arrayKey) - return if (jsonArray != null && jsonArray.length() > 0) jsonArray.getDouble(0) else 0.0 + return if (jsonArray.length() > 0) jsonArray.getDouble(0) else 0.0 } // ==================== From 42db23249d7a7e2bcd58f8669f715616054a00a1 Mon Sep 17 00:00:00 2001 From: Alexander Biryukov Date: Sun, 20 Sep 2020 18:36:11 +0300 Subject: [PATCH 034/183] Bitfinex: removed obsolete currencies --- .../datamodule/model/market/Bitfinex.kt | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Bitfinex.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Bitfinex.kt index d807246b..32478439 100644 --- a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Bitfinex.kt +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Bitfinex.kt @@ -19,19 +19,6 @@ class Bitfinex : Market(NAME, TTS_NAME, CURRENCY_PAIRS) { private val CURRENCY_PAIRS: CurrencyPairsMap = CurrencyPairsMap() init { - CURRENCY_PAIRS[VirtualCurrency.BCC] = arrayOf( - VirtualCurrency.BTC, - Currency.USD - ) - CURRENCY_PAIRS[VirtualCurrency.BCH] = arrayOf( - VirtualCurrency.BTC, - VirtualCurrency.ETH, - Currency.USD - ) - CURRENCY_PAIRS[VirtualCurrency.BCU] = arrayOf( - VirtualCurrency.BTC, - Currency.USD - ) CURRENCY_PAIRS[VirtualCurrency.BTC] = arrayOf( Currency.USD ) From 4fa73fb90d575d67b47f1a119b4e8a9c53c2a451 Mon Sep 17 00:00:00 2001 From: Alexander Biryukov Date: Sun, 20 Sep 2020 18:36:11 +0300 Subject: [PATCH 035/183] Bitfinex: removed obsolete currencies --- .../datamodule/model/market/Bitfinex.kt | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Bitfinex.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Bitfinex.kt index d807246b..32478439 100644 --- a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Bitfinex.kt +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Bitfinex.kt @@ -19,19 +19,6 @@ class Bitfinex : Market(NAME, TTS_NAME, CURRENCY_PAIRS) { private val CURRENCY_PAIRS: CurrencyPairsMap = CurrencyPairsMap() init { - CURRENCY_PAIRS[VirtualCurrency.BCC] = arrayOf( - VirtualCurrency.BTC, - Currency.USD - ) - CURRENCY_PAIRS[VirtualCurrency.BCH] = arrayOf( - VirtualCurrency.BTC, - VirtualCurrency.ETH, - Currency.USD - ) - CURRENCY_PAIRS[VirtualCurrency.BCU] = arrayOf( - VirtualCurrency.BTC, - Currency.USD - ) CURRENCY_PAIRS[VirtualCurrency.BTC] = arrayOf( Currency.USD ) From f9969bc16d5fc14353fc20d9176d9d238bd1a477 Mon Sep 17 00:00:00 2001 From: Alexander Biryukov Date: Mon, 5 Oct 2020 02:23:06 +0300 Subject: [PATCH 036/183] Deleted obsolete exchanges --- .../datamodule/config/MarketsConfig.kt | 39 +- .../model/market/{BitoEX.kt => BitoPro.kt} | 26 +- .../datamodule/model/market/BtcXIndia.kt | 39 -- .../datamodule/model/market/Campbx.kt | 35 -- .../datamodule/model/market/CleverCoin.kt | 39 -- .../datamodule/model/market/CoinMarketIO.kt | 78 --- .../datamodule/model/market/CoinSecure.kt | 44 -- .../datamodule/model/market/CoinTraderNet.kt | 42 -- .../datamodule/model/market/Coinse.kt | 101 ---- .../datamodule/model/market/CryptoTrade.kt | 85 ---- .../datamodule/model/market/DolarBlueNet.kt | 34 -- .../datamodule/model/market/Fxbtc.kt | 43 -- .../datamodule/model/market/FybSE.kt | 35 -- .../datamodule/model/market/Justcoin.kt | 66 --- .../datamodule/model/market/Mexbt.kt | 38 -- .../datamodule/model/market/Unisend.kt | 36 -- .../datamodule/model/market/Vircurex.kt | 452 ------------------ .../datamodule/model/market/Virtex.kt | 54 --- .../datamodule/model/market/Winkdex.kt | 36 -- .../datamodule/model/market/Zaydo.kt | 39 -- 20 files changed, 41 insertions(+), 1320 deletions(-) rename dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/{BitoEX.kt => BitoPro.kt} (59%) delete mode 100644 dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/BtcXIndia.kt delete mode 100644 dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Campbx.kt delete mode 100644 dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/CleverCoin.kt delete mode 100644 dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/CoinMarketIO.kt delete mode 100644 dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/CoinSecure.kt delete mode 100644 dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/CoinTraderNet.kt delete mode 100644 dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Coinse.kt delete mode 100644 dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/CryptoTrade.kt delete mode 100644 dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/DolarBlueNet.kt delete mode 100644 dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Fxbtc.kt delete mode 100644 dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/FybSE.kt delete mode 100644 dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Justcoin.kt delete mode 100644 dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Mexbt.kt delete mode 100644 dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Unisend.kt delete mode 100644 dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Vircurex.kt delete mode 100644 dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Virtex.kt delete mode 100644 dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Winkdex.kt delete mode 100644 dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Zaydo.kt diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/config/MarketsConfig.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/config/MarketsConfig.kt index 5864096a..50e7e0ca 100644 --- a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/config/MarketsConfig.kt +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/config/MarketsConfig.kt @@ -19,32 +19,32 @@ object MarketsConfig { addMarket(Okcoin()) addMarket(Cryptsy()) addMarket(Coinbase()) - addMarket(Vircurex()) - addMarket(Fxbtc()) +// addMarket(Vircurex()) +// addMarket(Fxbtc()) addMarket(Bter()) - addMarket(Justcoin()) +// addMarket(Justcoin()) addMarket(Btcturk()) - addMarket(Coinse()) - addMarket(Campbx()) +// addMarket(Coinse()) +// addMarket(Campbx()) addMarket(TheRock()) addMarket(CexIO()) - addMarket(Virtex()) +// addMarket(Virtex()) addMarket(Huobi()) addMarket(VaultOfSatoshi()) - addMarket(CoinMarketIO()) +// addMarket(CoinMarketIO()) addMarket(McxNOW()) - addMarket(CryptoTrade()) +// addMarket(CryptoTrade()) addMarket(MintPal()) addMarket(CoinJar()) addMarket(Poloniex()) - addMarket(Winkdex()) +// addMarket(Winkdex()) addMarket(BitX()) addMarket(CCex()) addMarket(Bitorado()) addMarket(CryptoRush()) addMarket(CoinDesk()) addMarket(Koinim()) - addMarket(FybSE()) +// addMarket(FybSE()) addMarket(FybSG()) addMarket(Prelude()) addMarket(BitKonan()) @@ -55,17 +55,17 @@ object MarketsConfig { addMarket(BtcMarkets()) addMarket(Bleutrade()) addMarket(ShareXcoin()) - addMarket(Unisend()) +// addMarket(Unisend()) addMarket(BitcoinVenezuela()) addMarket(Korbit()) addMarket(CoinTree()) addMarket(Cryptonit()) addMarket(LakeBTC()) addMarket(BitMaszyna()) - addMarket(Zaydo()) +// addMarket(Zaydo()) addMarket(AllCoin()) addMarket(Ripio()) - addMarket(DolarBlueNet()) +// addMarket(DolarBlueNet()) addMarket(CoinSwap()) addMarket(Paymium()) addMarket(Bitso()) @@ -75,27 +75,27 @@ object MarketsConfig { addMarket(ItBit()) addMarket(BitcoinCoId()) addMarket(HitBtc()) - addMarket(CleverCoin()) +// addMarket(CleverCoin()) addMarket(BitBay()) addMarket(QuadrigaCX()) addMarket(CoinMateIO()) addMarket(Buttercoin()) - addMarket(CoinTraderNet()) +// addMarket(CoinTraderNet()) addMarket(LocalBitcoins()) addMarket(Cryptopia()) addMarket(Igot()) - addMarket(Mexbt()) +// addMarket(Mexbt()) addMarket(Vaultoro()) addMarket(BitxCom()) addMarket(BtcBox()) - addMarket(BtcXIndia()) +// addMarket(BtcXIndia()) addMarket(Uphold()) addMarket(YoBit()) addMarket(ShapeShift()) - addMarket(BitoEX()) +// addMarket(BitoEx()) addMarket(OKCoinFutures()) // addMarket(new FoscEx()); - addMarket(CoinSecure()) +// addMarket(CoinSecure()) addMarket(Dashcurex()) addMarket(Quoine()) addMarket(Livecoin()) @@ -136,5 +136,6 @@ object MarketsConfig { addMarket(OmniTrade()) addMarket(Coinome()) addMarket(Nocks()) + addMarket(BitoPro()) } } \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/BitoEX.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/BitoPro.kt similarity index 59% rename from dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/BitoEX.kt rename to dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/BitoPro.kt index a508213e..68669240 100644 --- a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/BitoEX.kt +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/BitoPro.kt @@ -1,23 +1,39 @@ package com.aneonex.bitcoinchecker.datamodule.model.market import com.aneonex.bitcoinchecker.datamodule.model.CheckerInfo +import com.aneonex.bitcoinchecker.datamodule.model.CurrencyPairInfo import com.aneonex.bitcoinchecker.datamodule.model.Market import com.aneonex.bitcoinchecker.datamodule.model.Ticker import com.aneonex.bitcoinchecker.datamodule.model.currency.Currency import com.aneonex.bitcoinchecker.datamodule.model.currency.VirtualCurrency import com.aneonex.bitcoinchecker.datamodule.model.currency.CurrencyPairsMap import org.json.JSONArray +import org.json.JSONObject class BitoEX : Market(NAME, TTS_NAME, CURRENCY_PAIRS) { companion object { - private const val NAME = "BitoEX" + private const val NAME = "BitoPro" private const val TTS_NAME = NAME private const val URL = "https://www.bitoex.com/sync/dashboard/%1\$s" - private val CURRENCY_PAIRS: CurrencyPairsMap = CurrencyPairsMap() + private const val URL_CURRENCY_PAIRS = "https://api.bitopro.com/v3/provisioning/trading-pairs" + } + + override fun getCurrencyPairsUrl(requestId: Int): String? { + return URL_CURRENCY_PAIRS + } + + override fun parseCurrencyPairsFromJsonObject(requestId: Int, jsonObject: JSONObject, pairs: MutableList) { + val dataJson = jsonObject.getJSONArray("data") + for(i in 0 until dataJson.length()){ + val pairJson = dataJson.getJSONObject(i) + if(!pairJson.getBoolean("maintain")) + continue - init { - CURRENCY_PAIRS[VirtualCurrency.BTC] = arrayOf( - Currency.TWD + pairs.add(CurrencyPairInfo( + pairJson.getString("base"), + pairJson.getString("quote"), + pairJson.getString("pair") + ) ) } } diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/BtcXIndia.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/BtcXIndia.kt deleted file mode 100644 index f51998e2..00000000 --- a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/BtcXIndia.kt +++ /dev/null @@ -1,39 +0,0 @@ -package com.aneonex.bitcoinchecker.datamodule.model.market - -import com.aneonex.bitcoinchecker.datamodule.model.CheckerInfo -import com.aneonex.bitcoinchecker.datamodule.model.Market -import com.aneonex.bitcoinchecker.datamodule.model.Ticker -import com.aneonex.bitcoinchecker.datamodule.model.currency.Currency -import com.aneonex.bitcoinchecker.datamodule.model.currency.VirtualCurrency -import com.aneonex.bitcoinchecker.datamodule.model.currency.CurrencyPairsMap -import com.aneonex.bitcoinchecker.datamodule.util.ParseUtils -import org.json.JSONObject - -class BtcXIndia : Market(NAME, TTS_NAME, CURRENCY_PAIRS) { - companion object { - private const val NAME = "BTCXIndia" - private const val TTS_NAME = "BTC X India" - private const val URL = "https://api.btcxindia.com/ticker" - private val CURRENCY_PAIRS: CurrencyPairsMap = CurrencyPairsMap() - - init { - CURRENCY_PAIRS[VirtualCurrency.XRP] = arrayOf( - Currency.INR - ) - } - } - - override fun getUrl(requestId: Int, checkerInfo: CheckerInfo): String { - return URL - } - - @Throws(Exception::class) - override fun parseTickerFromJsonObject(requestId: Int, jsonObject: JSONObject, ticker: Ticker, checkerInfo: CheckerInfo) { - ticker.bid = jsonObject.getDouble("bid") - ticker.ask = jsonObject.getDouble("ask") - ticker.vol = jsonObject.getDouble("total_volume_24h") - ticker.high = ParseUtils.getDoubleFromString(jsonObject, "high") - ticker.low = ParseUtils.getDoubleFromString(jsonObject, "low") - ticker.last = jsonObject.getDouble("last_traded_price") - } -} \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Campbx.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Campbx.kt deleted file mode 100644 index 31765759..00000000 --- a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Campbx.kt +++ /dev/null @@ -1,35 +0,0 @@ -package com.aneonex.bitcoinchecker.datamodule.model.market - -import com.aneonex.bitcoinchecker.datamodule.model.CheckerInfo -import com.aneonex.bitcoinchecker.datamodule.model.Market -import com.aneonex.bitcoinchecker.datamodule.model.Ticker -import com.aneonex.bitcoinchecker.datamodule.model.currency.Currency -import com.aneonex.bitcoinchecker.datamodule.model.currency.VirtualCurrency -import com.aneonex.bitcoinchecker.datamodule.model.currency.CurrencyPairsMap -import org.json.JSONObject - -class Campbx : Market(NAME, TTS_NAME, CURRENCY_PAIRS) { - companion object { - private const val NAME = "CampBX" - private const val TTS_NAME = "Camp BX" - private const val URL = "http://campbx.com/api/xticker.php" - private val CURRENCY_PAIRS: CurrencyPairsMap = CurrencyPairsMap() - - init { - CURRENCY_PAIRS[VirtualCurrency.BTC] = arrayOf( - Currency.USD - ) - } - } - - override fun getUrl(requestId: Int, checkerInfo: CheckerInfo): String { - return URL - } - - @Throws(Exception::class) - override fun parseTickerFromJsonObject(requestId: Int, jsonObject: JSONObject, ticker: Ticker, checkerInfo: CheckerInfo) { - ticker.bid = jsonObject.getDouble("Best Bid") - ticker.ask = jsonObject.getDouble("Best Ask") - ticker.last = jsonObject.getDouble("Last Trade") - } -} \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/CleverCoin.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/CleverCoin.kt deleted file mode 100644 index c03dc16b..00000000 --- a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/CleverCoin.kt +++ /dev/null @@ -1,39 +0,0 @@ -package com.aneonex.bitcoinchecker.datamodule.model.market - -import com.aneonex.bitcoinchecker.datamodule.model.CheckerInfo -import com.aneonex.bitcoinchecker.datamodule.model.Market -import com.aneonex.bitcoinchecker.datamodule.model.Ticker -import com.aneonex.bitcoinchecker.datamodule.model.currency.Currency -import com.aneonex.bitcoinchecker.datamodule.model.currency.CurrencyPairsMap -import com.aneonex.bitcoinchecker.datamodule.model.currency.VirtualCurrency -import org.json.JSONObject - -class CleverCoin : Market(NAME, TTS_NAME, CURRENCY_PAIRS) { - companion object { - private const val NAME = "CleverCoin" - private const val TTS_NAME = "Clever Coin" - private const val URL = "https://api.clevercoin.com/v1/ticker" - private val CURRENCY_PAIRS: CurrencyPairsMap = CurrencyPairsMap() - - init { - CURRENCY_PAIRS[VirtualCurrency.BTC] = arrayOf( - Currency.EUR - ) - } - } - - override fun getUrl(requestId: Int, checkerInfo: CheckerInfo): String { - return URL - } - - @Throws(Exception::class) - override fun parseTickerFromJsonObject(requestId: Int, jsonObject: JSONObject, ticker: Ticker, checkerInfo: CheckerInfo) { - ticker.bid = jsonObject.getDouble("bid") - ticker.ask = jsonObject.getDouble("ask") - ticker.vol = jsonObject.getDouble("volume") - ticker.high = jsonObject.getDouble("high") - ticker.low = jsonObject.getDouble("low") - ticker.last = jsonObject.getDouble("last") - ticker.timestamp = jsonObject.getLong("timestamp") - } -} \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/CoinMarketIO.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/CoinMarketIO.kt deleted file mode 100644 index cba9cedf..00000000 --- a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/CoinMarketIO.kt +++ /dev/null @@ -1,78 +0,0 @@ -package com.aneonex.bitcoinchecker.datamodule.model.market - -import com.aneonex.bitcoinchecker.datamodule.model.CheckerInfo -import com.aneonex.bitcoinchecker.datamodule.model.Market -import com.aneonex.bitcoinchecker.datamodule.model.Ticker -import com.aneonex.bitcoinchecker.datamodule.model.currency.CurrencyPairsMap -import com.aneonex.bitcoinchecker.datamodule.model.currency.VirtualCurrency -import org.json.JSONObject - -class CoinMarketIO : Market(NAME, TTS_NAME, CURRENCY_PAIRS) { - companion object { - private const val NAME = "CoinMarket.io" - private const val TTS_NAME = "Coin Market IO" - private const val URL = "https://coinmarket.io/ticker/%1\$s%2\$s" - private val CURRENCY_PAIRS: CurrencyPairsMap = CurrencyPairsMap() - - init { - CURRENCY_PAIRS[VirtualCurrency.LEAF] = arrayOf( - VirtualCurrency.BTC - ) - CURRENCY_PAIRS[VirtualCurrency.USDE] = arrayOf( - VirtualCurrency.BTC - ) - CURRENCY_PAIRS[VirtualCurrency.DGB] = arrayOf( - VirtualCurrency.BTC - ) - CURRENCY_PAIRS[VirtualCurrency.KDC] = arrayOf( - VirtualCurrency.BTC - ) - CURRENCY_PAIRS[VirtualCurrency.CON] = arrayOf( - VirtualCurrency.BTC - ) - CURRENCY_PAIRS[VirtualCurrency.NOBL] = arrayOf( - VirtualCurrency.BTC - ) - CURRENCY_PAIRS[VirtualCurrency.SMC] = arrayOf( - VirtualCurrency.BTC - ) - // CURRENCY_PAIRS.put(VirtualCurrency.PRT, new String[]{ -// VirtualCurrency.BTC -// }); - CURRENCY_PAIRS[VirtualCurrency.VTC] = arrayOf( - VirtualCurrency.BTC - ) - CURRENCY_PAIRS[VirtualCurrency.UTC] = arrayOf( - VirtualCurrency.BTC - ) - CURRENCY_PAIRS[VirtualCurrency.KARM] = arrayOf( - VirtualCurrency.BTC - ) - CURRENCY_PAIRS[VirtualCurrency.RDD] = arrayOf( - VirtualCurrency.BTC - ) - CURRENCY_PAIRS[VirtualCurrency.RPD] = arrayOf( - VirtualCurrency.BTC - ) - CURRENCY_PAIRS[VirtualCurrency.ICN] = arrayOf( - VirtualCurrency.BTC - ) - CURRENCY_PAIRS[VirtualCurrency.PENG] = arrayOf( - VirtualCurrency.BTC - ) - CURRENCY_PAIRS[VirtualCurrency.MINT] = arrayOf( - VirtualCurrency.BTC - ) - } - } - - override fun getUrl(requestId: Int, checkerInfo: CheckerInfo): String { - return String.format(URL, checkerInfo.currencyBase, checkerInfo.currencyCounter) - } - - @Throws(Exception::class) - override fun parseTickerFromJsonObject(requestId: Int, jsonObject: JSONObject, ticker: Ticker, checkerInfo: CheckerInfo) { - ticker.vol = jsonObject.getDouble("volume24") - ticker.last = jsonObject.getDouble("last") - } -} \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/CoinSecure.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/CoinSecure.kt deleted file mode 100644 index a518a843..00000000 --- a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/CoinSecure.kt +++ /dev/null @@ -1,44 +0,0 @@ -package com.aneonex.bitcoinchecker.datamodule.model.market - -import com.aneonex.bitcoinchecker.datamodule.model.CheckerInfo -import com.aneonex.bitcoinchecker.datamodule.model.Market -import com.aneonex.bitcoinchecker.datamodule.model.Ticker -import com.aneonex.bitcoinchecker.datamodule.model.currency.Currency -import com.aneonex.bitcoinchecker.datamodule.model.currency.CurrencyPairsMap -import com.aneonex.bitcoinchecker.datamodule.model.currency.VirtualCurrency -import org.json.JSONObject - -class CoinSecure : Market(NAME, TTS_NAME, CURRENCY_PAIRS) { - companion object { - private const val NAME = "CoinSecure" - private const val TTS_NAME = "Coin Secure" - private const val URL = "https://api.coinsecure.in/v1/exchange/ticker" - private val CURRENCY_PAIRS: CurrencyPairsMap = CurrencyPairsMap() - - init { - CURRENCY_PAIRS[VirtualCurrency.BTC] = arrayOf( - Currency.INR - ) - } - } - - override fun getUrl(requestId: Int, checkerInfo: CheckerInfo): String { - return URL - } - - @Throws(Exception::class) - override fun parseTickerFromJsonObject(requestId: Int, jsonObject: JSONObject, ticker: Ticker, checkerInfo: CheckerInfo) { - val messageJsonObject = jsonObject.getJSONObject("message") - ticker.bid = parsePrice(messageJsonObject.getDouble("bid")) - ticker.ask = parsePrice(messageJsonObject.getDouble("ask")) - ticker.vol = messageJsonObject.getDouble("coinvolume") / 100000000 - ticker.high = parsePrice(messageJsonObject.getDouble("high")) - ticker.low = parsePrice(messageJsonObject.getDouble("low")) - ticker.last = parsePrice(messageJsonObject.getDouble("lastPrice")) - // ticker.timestamp = messageJsonObject.getLong("timestamp"); - } - - private fun parsePrice(price: Double): Double { - return price / 100 - } -} \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/CoinTraderNet.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/CoinTraderNet.kt deleted file mode 100644 index 3756040a..00000000 --- a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/CoinTraderNet.kt +++ /dev/null @@ -1,42 +0,0 @@ -package com.aneonex.bitcoinchecker.datamodule.model.market - -import com.aneonex.bitcoinchecker.datamodule.model.CheckerInfo -import com.aneonex.bitcoinchecker.datamodule.model.Market -import com.aneonex.bitcoinchecker.datamodule.model.Ticker -import com.aneonex.bitcoinchecker.datamodule.model.currency.Currency -import com.aneonex.bitcoinchecker.datamodule.model.currency.CurrencyPairsMap -import com.aneonex.bitcoinchecker.datamodule.model.currency.VirtualCurrency -import org.json.JSONObject - -class CoinTraderNet : Market(NAME, TTS_NAME, CURRENCY_PAIRS) { - companion object { - private const val NAME = "CoinTrader.net" - private const val TTS_NAME = "Coin Trader" - private const val URL = "https://www.cointrader.net/api4/stats/daily/%1\$s%2\$s" - private val CURRENCY_PAIRS: CurrencyPairsMap = CurrencyPairsMap() - - init { - CURRENCY_PAIRS[VirtualCurrency.BTC] = arrayOf( - Currency.USD, - Currency.CAD - ) - } - } - - override fun getUrl(requestId: Int, checkerInfo: CheckerInfo): String { - return String.format(URL, checkerInfo.currencyBase, checkerInfo.currencyCounter) - } - - @Throws(Exception::class) - override fun parseTickerFromJsonObject(requestId: Int, jsonObject: JSONObject, ticker: Ticker, checkerInfo: CheckerInfo) { - val dataJsonObject = jsonObject.getJSONObject("data") - val dataNamesArray = dataJsonObject.names()!! - val tickerJsonObject = dataJsonObject.getJSONObject(dataNamesArray.getString(0)) - ticker.bid = tickerJsonObject.getDouble("bid") - ticker.ask = tickerJsonObject.getDouble("offer") - ticker.vol = tickerJsonObject.getDouble("volume") - ticker.high = tickerJsonObject.getDouble("high") - ticker.low = tickerJsonObject.getDouble("low") - ticker.last = tickerJsonObject.getDouble("lastTradePrice") - } -} \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Coinse.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Coinse.kt deleted file mode 100644 index 8c42c73b..00000000 --- a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Coinse.kt +++ /dev/null @@ -1,101 +0,0 @@ -package com.aneonex.bitcoinchecker.datamodule.model.market - -import com.aneonex.bitcoinchecker.datamodule.R -import com.aneonex.bitcoinchecker.datamodule.model.CheckerInfo -import com.aneonex.bitcoinchecker.datamodule.model.Market -import com.aneonex.bitcoinchecker.datamodule.model.Ticker -import com.aneonex.bitcoinchecker.datamodule.model.currency.CurrencyPairsMap -import com.aneonex.bitcoinchecker.datamodule.model.currency.VirtualCurrency -import org.json.JSONObject - -class Coinse : Market(NAME, TTS_NAME, CURRENCY_PAIRS) { - companion object { - private const val NAME = "Coins-E" - private const val TTS_NAME = NAME - private const val URL = "https://www.coins-e.com/api/v2/markets/data/" - private val CURRENCY_PAIRS: CurrencyPairsMap = CurrencyPairsMap() - - init { - CURRENCY_PAIRS[VirtualCurrency.ALP] = arrayOf(VirtualCurrency.BTC, VirtualCurrency.LTC) - CURRENCY_PAIRS[VirtualCurrency.AMC] = arrayOf(VirtualCurrency.BTC, VirtualCurrency.LTC) - CURRENCY_PAIRS[VirtualCurrency.ANC] = arrayOf(VirtualCurrency.BTC, VirtualCurrency.LTC) - CURRENCY_PAIRS[VirtualCurrency.ARG] = arrayOf(VirtualCurrency.BTC, VirtualCurrency.LTC) - CURRENCY_PAIRS[VirtualCurrency.BET] = arrayOf(VirtualCurrency.BTC, VirtualCurrency.LTC) - CURRENCY_PAIRS[VirtualCurrency.BQC] = arrayOf(VirtualCurrency.BTC) - CURRENCY_PAIRS[VirtualCurrency.BTG] = arrayOf(VirtualCurrency.BTC) - CURRENCY_PAIRS[VirtualCurrency.CGB] = arrayOf(VirtualCurrency.BTC) - CURRENCY_PAIRS[VirtualCurrency.CIN] = arrayOf(VirtualCurrency.BTC) - CURRENCY_PAIRS[VirtualCurrency.CMC] = arrayOf(VirtualCurrency.BTC) - CURRENCY_PAIRS[VirtualCurrency.COL] = arrayOf(VirtualCurrency.LTC) - CURRENCY_PAIRS[VirtualCurrency.CRC] = arrayOf(VirtualCurrency.BTC) - CURRENCY_PAIRS[VirtualCurrency.CSC] = arrayOf(VirtualCurrency.BTC) - CURRENCY_PAIRS[VirtualCurrency.DEM] = arrayOf(VirtualCurrency.BTC, VirtualCurrency.LTC) - CURRENCY_PAIRS[VirtualCurrency.DGC] = arrayOf(VirtualCurrency.BTC) - CURRENCY_PAIRS[VirtualCurrency.DMD] = arrayOf(VirtualCurrency.BTC) - CURRENCY_PAIRS[VirtualCurrency.DOGE] = arrayOf(VirtualCurrency.BTC) - CURRENCY_PAIRS[VirtualCurrency.DTC] = arrayOf(VirtualCurrency.BTC) - CURRENCY_PAIRS[VirtualCurrency.ELC] = arrayOf(VirtualCurrency.BTC) - CURRENCY_PAIRS[VirtualCurrency.ELP] = arrayOf(VirtualCurrency.BTC) - CURRENCY_PAIRS[VirtualCurrency.EMD] = arrayOf(VirtualCurrency.BTC) - CURRENCY_PAIRS[VirtualCurrency.EZC] = arrayOf(VirtualCurrency.BTC) - CURRENCY_PAIRS[VirtualCurrency.FLO] = arrayOf(VirtualCurrency.BTC) - CURRENCY_PAIRS[VirtualCurrency.FRK] = arrayOf(VirtualCurrency.BTC, VirtualCurrency.LTC) - CURRENCY_PAIRS[VirtualCurrency.FTC] = arrayOf(VirtualCurrency.BTC) - CURRENCY_PAIRS[VirtualCurrency.GDC] = arrayOf(VirtualCurrency.BTC) - CURRENCY_PAIRS[VirtualCurrency.GLC] = arrayOf(VirtualCurrency.BTC, VirtualCurrency.LTC) - CURRENCY_PAIRS[VirtualCurrency.GLX] = arrayOf(VirtualCurrency.BTC) - CURRENCY_PAIRS[VirtualCurrency.HYC] = arrayOf(VirtualCurrency.BTC) - CURRENCY_PAIRS[VirtualCurrency.IFC] = arrayOf(VirtualCurrency.BTC, VirtualCurrency.LTC, VirtualCurrency.XPM) - CURRENCY_PAIRS[VirtualCurrency.KGC] = arrayOf(VirtualCurrency.BTC, VirtualCurrency.LTC) - CURRENCY_PAIRS[VirtualCurrency.LBW] = arrayOf(VirtualCurrency.BTC) - CURRENCY_PAIRS[VirtualCurrency.LTC] = arrayOf(VirtualCurrency.BTC) - CURRENCY_PAIRS[VirtualCurrency.MEC] = arrayOf(VirtualCurrency.BTC) - CURRENCY_PAIRS[VirtualCurrency.NAN] = arrayOf(VirtualCurrency.BTC) - CURRENCY_PAIRS[VirtualCurrency.NET] = arrayOf(VirtualCurrency.BTC) - CURRENCY_PAIRS[VirtualCurrency.NIB] = arrayOf(VirtualCurrency.BTC) - CURRENCY_PAIRS[VirtualCurrency.NRB] = arrayOf(VirtualCurrency.BTC) - CURRENCY_PAIRS[VirtualCurrency.NUC] = arrayOf(VirtualCurrency.BTC) - CURRENCY_PAIRS[VirtualCurrency.NVC] = arrayOf(VirtualCurrency.BTC) - CURRENCY_PAIRS[VirtualCurrency.ORB] = arrayOf(VirtualCurrency.BTC, VirtualCurrency.LTC) - CURRENCY_PAIRS[VirtualCurrency.PPC] = arrayOf(VirtualCurrency.BTC, VirtualCurrency.XPM) - CURRENCY_PAIRS[VirtualCurrency.PTS] = arrayOf(VirtualCurrency.BTC) - CURRENCY_PAIRS[VirtualCurrency.PWC] = arrayOf(VirtualCurrency.BTC) - CURRENCY_PAIRS[VirtualCurrency.PXC] = arrayOf(VirtualCurrency.BTC, VirtualCurrency.LTC) - CURRENCY_PAIRS[VirtualCurrency.QRK] = arrayOf(VirtualCurrency.BTC, VirtualCurrency.LTC, VirtualCurrency.XPM) - CURRENCY_PAIRS[VirtualCurrency.RCH] = arrayOf(VirtualCurrency.BTC, VirtualCurrency.LTC) - CURRENCY_PAIRS[VirtualCurrency.REC] = arrayOf(VirtualCurrency.BTC, VirtualCurrency.LTC) - CURRENCY_PAIRS[VirtualCurrency.RED] = arrayOf(VirtualCurrency.BTC, VirtualCurrency.LTC) - CURRENCY_PAIRS[VirtualCurrency.SBC] = arrayOf(VirtualCurrency.BTC, VirtualCurrency.LTC) - CURRENCY_PAIRS[VirtualCurrency.SPT] = arrayOf(VirtualCurrency.BTC) - CURRENCY_PAIRS[VirtualCurrency.TAG] = arrayOf(VirtualCurrency.BTC) - CURRENCY_PAIRS[VirtualCurrency.TRC] = arrayOf(VirtualCurrency.BTC) - CURRENCY_PAIRS[VirtualCurrency.UNO] = arrayOf(VirtualCurrency.BTC) - CURRENCY_PAIRS[VirtualCurrency.VLC] = arrayOf(VirtualCurrency.BTC, VirtualCurrency.LTC) - CURRENCY_PAIRS[VirtualCurrency.WDC] = arrayOf(VirtualCurrency.BTC) - CURRENCY_PAIRS[VirtualCurrency.XNC] = arrayOf(VirtualCurrency.BTC, VirtualCurrency.LTC) - CURRENCY_PAIRS[VirtualCurrency.XPM] = arrayOf(VirtualCurrency.BTC, VirtualCurrency.LTC) - CURRENCY_PAIRS[VirtualCurrency.ZET] = arrayOf(VirtualCurrency.BTC) - } - } - - override val cautionResId: Int - get() = R.string.market_caution_much_data - - override fun getUrl(requestId: Int, checkerInfo: CheckerInfo): String { - return URL - } - - @Throws(Exception::class) - override fun parseTickerFromJsonObject(requestId: Int, jsonObject: JSONObject, ticker: Ticker, checkerInfo: CheckerInfo) { - val marketsObject = jsonObject.getJSONObject("markets") - val pairObject = marketsObject.getJSONObject(checkerInfo.currencyBase + "_" + checkerInfo.currencyCounter) - val marketStatObject = pairObject.getJSONObject("marketstat") - val inner24hObject = marketStatObject.getJSONObject("24h") - ticker.bid = marketStatObject.getDouble("bid") - ticker.ask = marketStatObject.getDouble("ask") - ticker.vol = inner24hObject.getDouble("volume") - ticker.high = inner24hObject.getDouble("h") - ticker.low = inner24hObject.getDouble("l") - ticker.last = marketStatObject.getDouble("ltp") - } -} \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/CryptoTrade.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/CryptoTrade.kt deleted file mode 100644 index ce4fcfc7..00000000 --- a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/CryptoTrade.kt +++ /dev/null @@ -1,85 +0,0 @@ -package com.aneonex.bitcoinchecker.datamodule.model.market - -import com.aneonex.bitcoinchecker.datamodule.model.CheckerInfo -import com.aneonex.bitcoinchecker.datamodule.model.Market -import com.aneonex.bitcoinchecker.datamodule.model.Ticker -import com.aneonex.bitcoinchecker.datamodule.model.currency.Currency -import com.aneonex.bitcoinchecker.datamodule.model.currency.CurrencyPairsMap -import com.aneonex.bitcoinchecker.datamodule.model.currency.VirtualCurrency -import org.json.JSONObject - -class CryptoTrade : Market(NAME, TTS_NAME, CURRENCY_PAIRS) { - companion object { - private const val NAME = "Crypto-Trade" - private const val TTS_NAME = "Crypto Trade" - private const val URL = "https://crypto-trade.com/api/1/ticker/%1\$s_%2\$s" - private val CURRENCY_PAIRS: CurrencyPairsMap = CurrencyPairsMap() - - init { - CURRENCY_PAIRS[VirtualCurrency.BTC] = arrayOf( - Currency.USD, - Currency.EUR - ) - CURRENCY_PAIRS[VirtualCurrency.LTC] = arrayOf( - Currency.USD, - Currency.EUR, - VirtualCurrency.BTC - ) - CURRENCY_PAIRS[VirtualCurrency.NMC] = arrayOf( - Currency.USD, - VirtualCurrency.BTC - ) - CURRENCY_PAIRS[VirtualCurrency.XPM] = arrayOf( - Currency.USD, - VirtualCurrency.BTC, - VirtualCurrency.PPC - ) - CURRENCY_PAIRS[VirtualCurrency.PPC] = arrayOf( - Currency.USD, - VirtualCurrency.BTC - ) - CURRENCY_PAIRS[VirtualCurrency.TRC] = arrayOf( - VirtualCurrency.BTC - ) - CURRENCY_PAIRS[VirtualCurrency.FTC] = arrayOf( - Currency.USD, - VirtualCurrency.BTC - ) - CURRENCY_PAIRS[VirtualCurrency.DVC] = arrayOf( - VirtualCurrency.BTC - ) - CURRENCY_PAIRS[VirtualCurrency.WDC] = arrayOf( - Currency.USD, - VirtualCurrency.BTC - ) - CURRENCY_PAIRS[VirtualCurrency.DGC] = arrayOf( - VirtualCurrency.BTC - ) - CURRENCY_PAIRS[VirtualCurrency.UTC] = arrayOf( - Currency.USD, - Currency.EUR, - VirtualCurrency.BTC - ) - } - } - - override fun getUrl(requestId: Int, checkerInfo: CheckerInfo): String { - return String.format(URL, checkerInfo.currencyBaseLowerCase, checkerInfo.currencyCounterLowerCase) - } - - @Throws(Exception::class) - override fun parseTickerFromJsonObject(requestId: Int, jsonObject: JSONObject, ticker: Ticker, checkerInfo: CheckerInfo) { - val dataObject = jsonObject.getJSONObject("data") - ticker.bid = dataObject.getDouble("max_bid") - ticker.ask = dataObject.getDouble("min_ask") - ticker.vol = dataObject.getDouble("vol_" + checkerInfo.currencyBaseLowerCase) - ticker.high = dataObject.getDouble("high") - ticker.low = dataObject.getDouble("low") - ticker.last = dataObject.getDouble("last") - } - - @Throws(Exception::class) - override fun parseErrorFromJsonObject(requestId: Int, jsonObject: JSONObject, checkerInfo: CheckerInfo?): String? { - return jsonObject.getString("error") - } -} \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/DolarBlueNet.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/DolarBlueNet.kt deleted file mode 100644 index e4d8e7de..00000000 --- a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/DolarBlueNet.kt +++ /dev/null @@ -1,34 +0,0 @@ -package com.aneonex.bitcoinchecker.datamodule.model.market - -import com.aneonex.bitcoinchecker.datamodule.model.CheckerInfo -import com.aneonex.bitcoinchecker.datamodule.model.Market -import com.aneonex.bitcoinchecker.datamodule.model.Ticker -import com.aneonex.bitcoinchecker.datamodule.model.currency.Currency -import com.aneonex.bitcoinchecker.datamodule.model.currency.CurrencyPairsMap -import org.json.JSONObject - -class DolarBlueNet : Market(NAME, TTS_NAME, CURRENCY_PAIRS) { - companion object { - private const val NAME = "DolarBlue.net" - private const val TTS_NAME = "Dolar Blue" - private const val URL = "http://dolar.bitplanet.info/api.php" - private val CURRENCY_PAIRS: CurrencyPairsMap = CurrencyPairsMap() - - init { - CURRENCY_PAIRS[Currency.USD] = arrayOf( - Currency.ARS - ) - } - } - - override fun getUrl(requestId: Int, checkerInfo: CheckerInfo): String { - return URL - } - - @Throws(Exception::class) - override fun parseTickerFromJsonObject(requestId: Int, jsonObject: JSONObject, ticker: Ticker, checkerInfo: CheckerInfo) { - ticker.ask = jsonObject.getDouble("venta") - ticker.bid = jsonObject.getDouble("compra") - ticker.last = ticker.ask - } -} \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Fxbtc.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Fxbtc.kt deleted file mode 100644 index 44f026ed..00000000 --- a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Fxbtc.kt +++ /dev/null @@ -1,43 +0,0 @@ -package com.aneonex.bitcoinchecker.datamodule.model.market - -import com.aneonex.bitcoinchecker.datamodule.model.CheckerInfo -import com.aneonex.bitcoinchecker.datamodule.model.Market -import com.aneonex.bitcoinchecker.datamodule.model.Ticker -import com.aneonex.bitcoinchecker.datamodule.model.currency.Currency -import com.aneonex.bitcoinchecker.datamodule.model.currency.CurrencyPairsMap -import com.aneonex.bitcoinchecker.datamodule.model.currency.VirtualCurrency -import org.json.JSONObject - -class Fxbtc : Market(NAME, TTS_NAME, CURRENCY_PAIRS) { - companion object { - private const val NAME = "FxBtc" - private const val TTS_NAME = NAME - private const val URL = "https://www.fxbtc.com/jport?op=query&type=ticker&symbol=%1\$s_%2\$s" - private val CURRENCY_PAIRS: CurrencyPairsMap = CurrencyPairsMap() - - init { - CURRENCY_PAIRS[VirtualCurrency.BTC] = arrayOf( - Currency.CNY - ) - CURRENCY_PAIRS[VirtualCurrency.LTC] = arrayOf( - Currency.CNY, - VirtualCurrency.BTC - ) - } - } - - override fun getUrl(requestId: Int, checkerInfo: CheckerInfo): String { - return String.format(URL, checkerInfo.currencyBaseLowerCase, checkerInfo.currencyCounterLowerCase) - } - - @Throws(Exception::class) - override fun parseTickerFromJsonObject(requestId: Int, jsonObject: JSONObject, ticker: Ticker, checkerInfo: CheckerInfo) { - val tickerObject = jsonObject.getJSONObject("ticker") - ticker.bid = tickerObject.getDouble("bid") - ticker.ask = tickerObject.getDouble("ask") - ticker.vol = tickerObject.getDouble("vol") - ticker.high = tickerObject.getDouble("high") - ticker.low = tickerObject.getDouble("low") - ticker.last = tickerObject.getDouble("last_rate") - } -} \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/FybSE.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/FybSE.kt deleted file mode 100644 index 97752f4f..00000000 --- a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/FybSE.kt +++ /dev/null @@ -1,35 +0,0 @@ -package com.aneonex.bitcoinchecker.datamodule.model.market - -import com.aneonex.bitcoinchecker.datamodule.model.CheckerInfo -import com.aneonex.bitcoinchecker.datamodule.model.Market -import com.aneonex.bitcoinchecker.datamodule.model.Ticker -import com.aneonex.bitcoinchecker.datamodule.model.currency.Currency -import com.aneonex.bitcoinchecker.datamodule.model.currency.CurrencyPairsMap -import com.aneonex.bitcoinchecker.datamodule.model.currency.VirtualCurrency -import org.json.JSONObject - -class FybSE : Market(NAME, TTS_NAME, CURRENCY_PAIRS) { - companion object { - private const val NAME = "FYB-SE" - private const val TTS_NAME = "Fyb SE" - private const val URL = "https://www.fybse.se/api/%1\$s/ticker.json" - private val CURRENCY_PAIRS: CurrencyPairsMap = CurrencyPairsMap() - - init { - CURRENCY_PAIRS[VirtualCurrency.BTC] = arrayOf( - Currency.SEK - ) - } - } - - override fun getUrl(requestId: Int, checkerInfo: CheckerInfo): String { - return String.format(URL, checkerInfo.currencyCounter) - } - - @Throws(Exception::class) - override fun parseTickerFromJsonObject(requestId: Int, jsonObject: JSONObject, ticker: Ticker, checkerInfo: CheckerInfo) { - ticker.bid = jsonObject.getDouble("bid") - ticker.ask = jsonObject.getDouble("ask") - ticker.last = ticker.ask - } -} \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Justcoin.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Justcoin.kt deleted file mode 100644 index 40f0bc13..00000000 --- a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Justcoin.kt +++ /dev/null @@ -1,66 +0,0 @@ -package com.aneonex.bitcoinchecker.datamodule.model.market - -import com.aneonex.bitcoinchecker.datamodule.model.CheckerInfo -import com.aneonex.bitcoinchecker.datamodule.model.Market -import com.aneonex.bitcoinchecker.datamodule.model.Ticker -import com.aneonex.bitcoinchecker.datamodule.model.currency.Currency -import com.aneonex.bitcoinchecker.datamodule.model.currency.CurrencyPairsMap -import com.aneonex.bitcoinchecker.datamodule.model.currency.VirtualCurrency -import org.json.JSONObject - -class Justcoin : Market(NAME, TTS_NAME, CURRENCY_PAIRS) { - companion object { - private const val NAME = "Justcoin" - private const val TTS_NAME = "Just coin" - private const val URL = "https://justcoin.com/api/2/%1\$s%2\$s/money/ticker" - private val CURRENCY_PAIRS: CurrencyPairsMap = CurrencyPairsMap() - - init { - CURRENCY_PAIRS[VirtualCurrency.BTC] = arrayOf( - Currency.USD, - Currency.EUR, - Currency.GBP, - Currency.HKD, - Currency.CHF, - Currency.AUD, - Currency.CAD, - Currency.NZD, - Currency.SGD, - Currency.JPY - ) - CURRENCY_PAIRS[VirtualCurrency.LTC] = arrayOf( - VirtualCurrency.BTC - ) - CURRENCY_PAIRS[VirtualCurrency.DOGE] = arrayOf( - VirtualCurrency.BTC - ) - CURRENCY_PAIRS[VirtualCurrency.STR] = arrayOf( - VirtualCurrency.BTC - ) - CURRENCY_PAIRS[VirtualCurrency.XRP] = arrayOf( - VirtualCurrency.BTC - ) - } - } - - override fun getUrl(requestId: Int, checkerInfo: CheckerInfo): String { - return String.format(URL, checkerInfo.currencyBase, checkerInfo.currencyCounter) - } - - @Throws(Exception::class) - override fun parseTickerFromJsonObject(requestId: Int, jsonObject: JSONObject, ticker: Ticker, checkerInfo: CheckerInfo) { - val dataObject = jsonObject.getJSONObject("data") - ticker.bid = getPriceValueFromObject(dataObject, "buy") - ticker.ask = getPriceValueFromObject(dataObject, "sell") - ticker.vol = getPriceValueFromObject(dataObject, "vol") - ticker.high = getPriceValueFromObject(dataObject, "high") - ticker.low = getPriceValueFromObject(dataObject, "low") - ticker.last = getPriceValueFromObject(dataObject, "last") - } - - @Throws(Exception::class) - private fun getPriceValueFromObject(jsonObject: JSONObject, key: String): Double { - val innerObject = jsonObject.getJSONObject(key) - return innerObject.getDouble("value") - } -} \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Mexbt.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Mexbt.kt deleted file mode 100644 index 908b1daf..00000000 --- a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Mexbt.kt +++ /dev/null @@ -1,38 +0,0 @@ -package com.aneonex.bitcoinchecker.datamodule.model.market - -import com.aneonex.bitcoinchecker.datamodule.model.CheckerInfo -import com.aneonex.bitcoinchecker.datamodule.model.Market -import com.aneonex.bitcoinchecker.datamodule.model.Ticker -import com.aneonex.bitcoinchecker.datamodule.model.currency.Currency -import com.aneonex.bitcoinchecker.datamodule.model.currency.CurrencyPairsMap -import com.aneonex.bitcoinchecker.datamodule.model.currency.VirtualCurrency -import org.json.JSONObject - -class Mexbt : Market(NAME, TTS_NAME, CURRENCY_PAIRS) { - companion object { - private const val NAME = "meXBT" - private const val TTS_NAME = "me XBT" - private const val URL = "https://data.mexbt.com/ticker/%1\$s%2\$s" - private val CURRENCY_PAIRS: CurrencyPairsMap = CurrencyPairsMap() - - init { - CURRENCY_PAIRS[VirtualCurrency.BTC] = arrayOf( - VirtualCurrency.MXN, - Currency.USD) - } - } - - override fun getUrl(requestId: Int, checkerInfo: CheckerInfo): String { - return String.format(URL, checkerInfo.currencyBaseLowerCase, checkerInfo.currencyCounterLowerCase) - } - - @Throws(Exception::class) - override fun parseTickerFromJsonObject(requestId: Int, jsonObject: JSONObject, ticker: Ticker, checkerInfo: CheckerInfo) { - ticker.bid = jsonObject.getDouble("bid") - ticker.ask = jsonObject.getDouble("ask") - ticker.vol = jsonObject.getDouble("volume24Hour") - ticker.high = jsonObject.getDouble("high") - ticker.low = jsonObject.getDouble("low") - ticker.last = jsonObject.getDouble("last") - } -} \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Unisend.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Unisend.kt deleted file mode 100644 index d6c9b8bd..00000000 --- a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Unisend.kt +++ /dev/null @@ -1,36 +0,0 @@ -package com.aneonex.bitcoinchecker.datamodule.model.market - -import com.aneonex.bitcoinchecker.datamodule.model.CheckerInfo -import com.aneonex.bitcoinchecker.datamodule.model.Market -import com.aneonex.bitcoinchecker.datamodule.model.Ticker -import com.aneonex.bitcoinchecker.datamodule.model.currency.Currency -import com.aneonex.bitcoinchecker.datamodule.model.currency.CurrencyPairsMap -import com.aneonex.bitcoinchecker.datamodule.model.currency.VirtualCurrency -import org.json.JSONObject - -class Unisend : Market(NAME, TTS_NAME, CURRENCY_PAIRS) { - companion object { - private const val NAME = "Unisend" - private const val TTS_NAME = "Uni send" - private const val URL = "https://www.unisend.com/api/price/ar/ars_btc" - private val CURRENCY_PAIRS: CurrencyPairsMap = CurrencyPairsMap() - - init { - CURRENCY_PAIRS[VirtualCurrency.BTC] = arrayOf( - Currency.ARS - ) - } - } - - override fun getUrl(requestId: Int, checkerInfo: CheckerInfo): String { - return String.format(URL, checkerInfo.currencyBase, checkerInfo.currencyCounter) - } - - @Throws(Exception::class) - override fun parseTickerFromJsonObject(requestId: Int, jsonObject: JSONObject, ticker: Ticker, checkerInfo: CheckerInfo) { - val pricesJsonObject = jsonObject.getJSONObject("prices") - ticker.bid = pricesJsonObject.getDouble("sell") // reversed! - ticker.ask = pricesJsonObject.getDouble("buy") // reversed! - ticker.last = ticker.ask - } -} \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Vircurex.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Vircurex.kt deleted file mode 100644 index 03d8e9df..00000000 --- a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Vircurex.kt +++ /dev/null @@ -1,452 +0,0 @@ -package com.aneonex.bitcoinchecker.datamodule.model.market - -import com.aneonex.bitcoinchecker.datamodule.model.CheckerInfo -import com.aneonex.bitcoinchecker.datamodule.model.Market -import com.aneonex.bitcoinchecker.datamodule.model.Ticker -import com.aneonex.bitcoinchecker.datamodule.model.currency.Currency -import com.aneonex.bitcoinchecker.datamodule.model.currency.CurrencyPairsMap -import com.aneonex.bitcoinchecker.datamodule.model.currency.VirtualCurrency -import org.json.JSONObject - -class Vircurex : Market(NAME, TTS_NAME, CURRENCY_PAIRS) { - companion object { - private const val NAME = "Vircurex" - private const val TTS_NAME = NAME - private const val URL = "https://api.vircurex.com/api/get_info_for_1_currency.json?base=%1\$s&alt=%2\$s" - private val CURRENCY_PAIRS: CurrencyPairsMap = CurrencyPairsMap() - - init { - CURRENCY_PAIRS[VirtualCurrency.BTC] = arrayOf( - Currency.USD, - Currency.EUR, - VirtualCurrency.ANC, - VirtualCurrency.DGC, - VirtualCurrency.DOGE, - VirtualCurrency.DVC, - VirtualCurrency.FRC, - VirtualCurrency.FTC, - VirtualCurrency.I0C, - VirtualCurrency.IXC, - VirtualCurrency.LTC, - VirtualCurrency.NMC, - VirtualCurrency.NVC, - VirtualCurrency.NXT, - VirtualCurrency.PPC, - VirtualCurrency.QRK, - VirtualCurrency.TRC, - VirtualCurrency.VTC, - VirtualCurrency.WDC, - VirtualCurrency.XPM - ) - CURRENCY_PAIRS[VirtualCurrency.ANC] = arrayOf( - Currency.USD, - Currency.EUR, - VirtualCurrency.BTC, - VirtualCurrency.DGC, - VirtualCurrency.DOGE, - VirtualCurrency.DVC, - VirtualCurrency.FRC, - VirtualCurrency.FTC, - VirtualCurrency.I0C, - VirtualCurrency.IXC, - VirtualCurrency.LTC, - VirtualCurrency.NMC, - VirtualCurrency.NVC, - VirtualCurrency.NXT, - VirtualCurrency.PPC, - VirtualCurrency.QRK, - VirtualCurrency.TRC, - VirtualCurrency.VTC, - VirtualCurrency.WDC, - VirtualCurrency.XPM - ) - CURRENCY_PAIRS[VirtualCurrency.DGC] = arrayOf( - Currency.USD, - Currency.EUR, - VirtualCurrency.BTC, - VirtualCurrency.ANC, - VirtualCurrency.DOGE, - VirtualCurrency.DVC, - VirtualCurrency.FRC, - VirtualCurrency.FTC, - VirtualCurrency.I0C, - VirtualCurrency.IXC, - VirtualCurrency.LTC, - VirtualCurrency.NMC, - VirtualCurrency.NVC, - VirtualCurrency.NXT, - VirtualCurrency.PPC, - VirtualCurrency.QRK, - VirtualCurrency.TRC, - VirtualCurrency.VTC, - VirtualCurrency.WDC, - VirtualCurrency.XPM - ) - CURRENCY_PAIRS[VirtualCurrency.DOGE] = arrayOf( - Currency.USD, - Currency.EUR, - VirtualCurrency.BTC, - VirtualCurrency.ANC, - VirtualCurrency.DGC, - VirtualCurrency.DVC, - VirtualCurrency.FRC, - VirtualCurrency.FTC, - VirtualCurrency.I0C, - VirtualCurrency.IXC, - VirtualCurrency.LTC, - VirtualCurrency.NMC, - VirtualCurrency.NVC, - VirtualCurrency.NXT, - VirtualCurrency.PPC, - VirtualCurrency.QRK, - VirtualCurrency.TRC, - VirtualCurrency.VTC, - VirtualCurrency.WDC, - VirtualCurrency.XPM - ) - CURRENCY_PAIRS[VirtualCurrency.DVC] = arrayOf( - Currency.USD, - Currency.EUR, - VirtualCurrency.BTC, - VirtualCurrency.ANC, - VirtualCurrency.DGC, - VirtualCurrency.DOGE, - VirtualCurrency.FRC, - VirtualCurrency.FTC, - VirtualCurrency.I0C, - VirtualCurrency.IXC, - VirtualCurrency.LTC, - VirtualCurrency.NMC, - VirtualCurrency.NVC, - VirtualCurrency.NXT, - VirtualCurrency.PPC, - VirtualCurrency.QRK, - VirtualCurrency.TRC, - VirtualCurrency.VTC, - VirtualCurrency.WDC, - VirtualCurrency.XPM - ) - CURRENCY_PAIRS[VirtualCurrency.FRC] = arrayOf( - Currency.USD, - Currency.EUR, - VirtualCurrency.BTC, - VirtualCurrency.ANC, - VirtualCurrency.DGC, - VirtualCurrency.DOGE, - VirtualCurrency.DVC, - VirtualCurrency.FTC, - VirtualCurrency.I0C, - VirtualCurrency.IXC, - VirtualCurrency.LTC, - VirtualCurrency.NMC, - VirtualCurrency.NVC, - VirtualCurrency.NXT, - VirtualCurrency.PPC, - VirtualCurrency.QRK, - VirtualCurrency.TRC, - VirtualCurrency.VTC, - VirtualCurrency.WDC, - VirtualCurrency.XPM - ) - CURRENCY_PAIRS[VirtualCurrency.FTC] = arrayOf( - Currency.USD, - Currency.EUR, - VirtualCurrency.BTC, - VirtualCurrency.ANC, - VirtualCurrency.DGC, - VirtualCurrency.DOGE, - VirtualCurrency.DVC, - VirtualCurrency.FRC, - VirtualCurrency.I0C, - VirtualCurrency.IXC, - VirtualCurrency.LTC, - VirtualCurrency.NMC, - VirtualCurrency.NVC, - VirtualCurrency.NXT, - VirtualCurrency.PPC, - VirtualCurrency.QRK, - VirtualCurrency.TRC, - VirtualCurrency.VTC, - VirtualCurrency.WDC, - VirtualCurrency.XPM - ) - CURRENCY_PAIRS[VirtualCurrency.I0C] = arrayOf( - Currency.USD, - Currency.EUR, - VirtualCurrency.BTC, - VirtualCurrency.ANC, - VirtualCurrency.DGC, - VirtualCurrency.DOGE, - VirtualCurrency.DVC, - VirtualCurrency.FRC, - VirtualCurrency.FTC, - VirtualCurrency.IXC, - VirtualCurrency.LTC, - VirtualCurrency.NMC, - VirtualCurrency.NVC, - VirtualCurrency.NXT, - VirtualCurrency.PPC, - VirtualCurrency.QRK, - VirtualCurrency.TRC, - VirtualCurrency.VTC, - VirtualCurrency.WDC, - VirtualCurrency.XPM - ) - CURRENCY_PAIRS[VirtualCurrency.IXC] = arrayOf( - Currency.USD, - Currency.EUR, - VirtualCurrency.BTC, - VirtualCurrency.ANC, - VirtualCurrency.DGC, - VirtualCurrency.DOGE, - VirtualCurrency.DVC, - VirtualCurrency.FRC, - VirtualCurrency.FTC, - VirtualCurrency.I0C, - VirtualCurrency.LTC, - VirtualCurrency.NMC, - VirtualCurrency.NVC, - VirtualCurrency.NXT, - VirtualCurrency.PPC, - VirtualCurrency.QRK, - VirtualCurrency.TRC, - VirtualCurrency.VTC, - VirtualCurrency.WDC, - VirtualCurrency.XPM - ) - CURRENCY_PAIRS[VirtualCurrency.LTC] = arrayOf( - Currency.USD, - Currency.EUR, - VirtualCurrency.BTC, - VirtualCurrency.ANC, - VirtualCurrency.DGC, - VirtualCurrency.DOGE, - VirtualCurrency.DVC, - VirtualCurrency.FRC, - VirtualCurrency.FTC, - VirtualCurrency.I0C, - VirtualCurrency.IXC, - VirtualCurrency.NMC, - VirtualCurrency.NVC, - VirtualCurrency.NXT, - VirtualCurrency.PPC, - VirtualCurrency.QRK, - VirtualCurrency.TRC, - VirtualCurrency.VTC, - VirtualCurrency.WDC, - VirtualCurrency.XPM - ) - CURRENCY_PAIRS[VirtualCurrency.NMC] = arrayOf( - Currency.USD, - Currency.EUR, - VirtualCurrency.BTC, - VirtualCurrency.ANC, - VirtualCurrency.DGC, - VirtualCurrency.DOGE, - VirtualCurrency.DVC, - VirtualCurrency.FRC, - VirtualCurrency.FTC, - VirtualCurrency.I0C, - VirtualCurrency.IXC, - VirtualCurrency.LTC, - VirtualCurrency.NVC, - VirtualCurrency.NXT, - VirtualCurrency.PPC, - VirtualCurrency.QRK, - VirtualCurrency.TRC, - VirtualCurrency.VTC, - VirtualCurrency.WDC, - VirtualCurrency.XPM - ) - CURRENCY_PAIRS[VirtualCurrency.NVC] = arrayOf( - Currency.USD, - Currency.EUR, - VirtualCurrency.BTC, - VirtualCurrency.ANC, - VirtualCurrency.DGC, - VirtualCurrency.DOGE, - VirtualCurrency.DVC, - VirtualCurrency.FRC, - VirtualCurrency.FTC, - VirtualCurrency.I0C, - VirtualCurrency.IXC, - VirtualCurrency.LTC, - VirtualCurrency.NMC, - VirtualCurrency.NXT, - VirtualCurrency.PPC, - VirtualCurrency.QRK, - VirtualCurrency.TRC, - VirtualCurrency.VTC, - VirtualCurrency.WDC, - VirtualCurrency.XPM - ) - CURRENCY_PAIRS[VirtualCurrency.NXT] = arrayOf( - Currency.USD, - Currency.EUR, - VirtualCurrency.BTC, - VirtualCurrency.ANC, - VirtualCurrency.DGC, - VirtualCurrency.DOGE, - VirtualCurrency.DVC, - VirtualCurrency.FRC, - VirtualCurrency.FTC, - VirtualCurrency.I0C, - VirtualCurrency.IXC, - VirtualCurrency.LTC, - VirtualCurrency.NMC, - VirtualCurrency.NVC, - VirtualCurrency.PPC, - VirtualCurrency.QRK, - VirtualCurrency.TRC, - VirtualCurrency.VTC, - VirtualCurrency.WDC, - VirtualCurrency.XPM - ) - CURRENCY_PAIRS[VirtualCurrency.PPC] = arrayOf( - Currency.USD, - Currency.EUR, - VirtualCurrency.BTC, - VirtualCurrency.ANC, - VirtualCurrency.DGC, - VirtualCurrency.DOGE, - VirtualCurrency.DVC, - VirtualCurrency.FRC, - VirtualCurrency.FTC, - VirtualCurrency.I0C, - VirtualCurrency.IXC, - VirtualCurrency.LTC, - VirtualCurrency.NMC, - VirtualCurrency.NVC, - VirtualCurrency.NXT, - VirtualCurrency.QRK, - VirtualCurrency.TRC, - VirtualCurrency.VTC, - VirtualCurrency.WDC, - VirtualCurrency.XPM - ) - CURRENCY_PAIRS[VirtualCurrency.QRK] = arrayOf( - Currency.USD, - Currency.EUR, - VirtualCurrency.BTC, - VirtualCurrency.ANC, - VirtualCurrency.DGC, - VirtualCurrency.DOGE, - VirtualCurrency.DVC, - VirtualCurrency.FRC, - VirtualCurrency.FTC, - VirtualCurrency.I0C, - VirtualCurrency.IXC, - VirtualCurrency.LTC, - VirtualCurrency.NMC, - VirtualCurrency.NVC, - VirtualCurrency.NXT, - VirtualCurrency.PPC, - VirtualCurrency.TRC, - VirtualCurrency.VTC, - VirtualCurrency.WDC, - VirtualCurrency.XPM - ) - CURRENCY_PAIRS[VirtualCurrency.TRC] = arrayOf( - Currency.USD, - Currency.EUR, - VirtualCurrency.BTC, - VirtualCurrency.ANC, - VirtualCurrency.DGC, - VirtualCurrency.DOGE, - VirtualCurrency.DVC, - VirtualCurrency.FRC, - VirtualCurrency.FTC, - VirtualCurrency.I0C, - VirtualCurrency.IXC, - VirtualCurrency.LTC, - VirtualCurrency.NMC, - VirtualCurrency.NVC, - VirtualCurrency.NXT, - VirtualCurrency.PPC, - VirtualCurrency.QRK, - VirtualCurrency.VTC, - VirtualCurrency.WDC, - VirtualCurrency.XPM - ) - CURRENCY_PAIRS[VirtualCurrency.VTC] = arrayOf( - Currency.USD, - Currency.EUR, - VirtualCurrency.BTC, - VirtualCurrency.ANC, - VirtualCurrency.DGC, - VirtualCurrency.DOGE, - VirtualCurrency.DVC, - VirtualCurrency.FRC, - VirtualCurrency.FTC, - VirtualCurrency.I0C, - VirtualCurrency.IXC, - VirtualCurrency.LTC, - VirtualCurrency.NMC, - VirtualCurrency.NVC, - VirtualCurrency.NXT, - VirtualCurrency.PPC, - VirtualCurrency.QRK, - VirtualCurrency.TRC, - VirtualCurrency.WDC, - VirtualCurrency.XPM - ) - CURRENCY_PAIRS[VirtualCurrency.WDC] = arrayOf( - Currency.USD, - Currency.EUR, - VirtualCurrency.BTC, - VirtualCurrency.ANC, - VirtualCurrency.DGC, - VirtualCurrency.DOGE, - VirtualCurrency.DVC, - VirtualCurrency.FRC, - VirtualCurrency.FTC, - VirtualCurrency.I0C, - VirtualCurrency.IXC, - VirtualCurrency.LTC, - VirtualCurrency.NMC, - VirtualCurrency.NVC, - VirtualCurrency.NXT, - VirtualCurrency.PPC, - VirtualCurrency.QRK, - VirtualCurrency.TRC, - VirtualCurrency.VTC, - VirtualCurrency.XPM - ) - CURRENCY_PAIRS[VirtualCurrency.XPM] = arrayOf( - Currency.USD, - Currency.EUR, - VirtualCurrency.BTC, - VirtualCurrency.ANC, - VirtualCurrency.DGC, - VirtualCurrency.DOGE, - VirtualCurrency.DVC, - VirtualCurrency.FRC, - VirtualCurrency.FTC, - VirtualCurrency.I0C, - VirtualCurrency.IXC, - VirtualCurrency.LTC, - VirtualCurrency.NMC, - VirtualCurrency.NVC, - VirtualCurrency.NXT, - VirtualCurrency.PPC, - VirtualCurrency.QRK, - VirtualCurrency.TRC, - VirtualCurrency.VTC, - VirtualCurrency.WDC) - } - } - - override fun getUrl(requestId: Int, checkerInfo: CheckerInfo): String { - return String.format(URL, checkerInfo.currencyBase, checkerInfo.currencyCounter) - } - - @Throws(Exception::class) - override fun parseTickerFromJsonObject(requestId: Int, jsonObject: JSONObject, ticker: Ticker, checkerInfo: CheckerInfo) { - ticker.bid = jsonObject.getDouble("highest_bid") - ticker.ask = jsonObject.getDouble("lowest_ask") - ticker.vol = jsonObject.getDouble("volume") - // ticker.high; -// ticker.low; - ticker.last = jsonObject.getDouble("last_trade") - } -} \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Virtex.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Virtex.kt deleted file mode 100644 index e448dc57..00000000 --- a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Virtex.kt +++ /dev/null @@ -1,54 +0,0 @@ -package com.aneonex.bitcoinchecker.datamodule.model.market - -import com.aneonex.bitcoinchecker.datamodule.model.CheckerInfo -import com.aneonex.bitcoinchecker.datamodule.model.Market -import com.aneonex.bitcoinchecker.datamodule.model.Ticker -import com.aneonex.bitcoinchecker.datamodule.model.currency.Currency -import com.aneonex.bitcoinchecker.datamodule.model.currency.CurrencyPairsMap -import com.aneonex.bitcoinchecker.datamodule.model.currency.VirtualCurrency -import org.json.JSONObject - -class Virtex : Market(NAME, TTS_NAME, CURRENCY_PAIRS) { - companion object { - private const val NAME = "CaVirtEx" - private const val TTS_NAME = NAME - private const val URL = "https://cavirtex.com/api2/ticker.json" - private val CURRENCY_PAIRS: CurrencyPairsMap = CurrencyPairsMap() - - init { - CURRENCY_PAIRS[VirtualCurrency.BTC] = arrayOf( - Currency.CAD, - VirtualCurrency.LTC - ) - CURRENCY_PAIRS[VirtualCurrency.LTC] = arrayOf( - Currency.CAD - ) - } - } - - override fun getUrl(requestId: Int, checkerInfo: CheckerInfo): String { - return URL - } - - @Throws(Exception::class) - override fun parseTickerFromJsonObject(requestId: Int, jsonObject: JSONObject, ticker: Ticker, checkerInfo: CheckerInfo) { - val tickerJsonObject = jsonObject.getJSONObject("ticker") - val pairJsonObject = tickerJsonObject.getJSONObject(checkerInfo.currencyBase + checkerInfo.currencyCounter) - if (!pairJsonObject.isNull("buy")) { - ticker.bid = pairJsonObject.getDouble("buy") - } - if (!pairJsonObject.isNull("sell")) { - ticker.ask = pairJsonObject.getDouble("sell") - } - if (!pairJsonObject.isNull("volume")) { - ticker.vol = pairJsonObject.getDouble("volume") - } - if (!pairJsonObject.isNull("high")) { - ticker.high = pairJsonObject.getDouble("high") - } - if (!pairJsonObject.isNull("low")) { - ticker.low = pairJsonObject.getDouble("low") - } - ticker.last = pairJsonObject.getDouble("last") - } -} \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Winkdex.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Winkdex.kt deleted file mode 100644 index 373a40ff..00000000 --- a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Winkdex.kt +++ /dev/null @@ -1,36 +0,0 @@ -package com.aneonex.bitcoinchecker.datamodule.model.market - -import com.aneonex.bitcoinchecker.datamodule.model.CheckerInfo -import com.aneonex.bitcoinchecker.datamodule.model.Market -import com.aneonex.bitcoinchecker.datamodule.model.Ticker -import com.aneonex.bitcoinchecker.datamodule.model.currency.Currency -import com.aneonex.bitcoinchecker.datamodule.model.currency.VirtualCurrency -import com.aneonex.bitcoinchecker.datamodule.model.currency.CurrencyPairsMap -import org.json.JSONObject - -class Winkdex : Market(NAME, TTS_NAME, CURRENCY_PAIRS) { - companion object { - private const val NAME = "Winkdex" - private const val TTS_NAME = NAME - private const val URL = "http://winkdex.com/static/js/stats.js" - private val CURRENCY_PAIRS: CurrencyPairsMap = CurrencyPairsMap() - - init { - CURRENCY_PAIRS[VirtualCurrency.BTC] = arrayOf( - Currency.USD - ) - } - } - - override fun getUrl(requestId: Int, checkerInfo: CheckerInfo): String { - return URL - } - - @Throws(Exception::class) - override fun parseTickerFromJsonObject(requestId: Int, jsonObject: JSONObject, ticker: Ticker, checkerInfo: CheckerInfo) { - ticker.vol = jsonObject.getDouble("volume_btc_24h") - ticker.high = jsonObject.getDouble("winkdex_high_24h") - ticker.low = jsonObject.getDouble("winkdex_low_24h") - ticker.last = jsonObject.getDouble("winkdex_usd") - } -} \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Zaydo.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Zaydo.kt deleted file mode 100644 index 9b1355f0..00000000 --- a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Zaydo.kt +++ /dev/null @@ -1,39 +0,0 @@ -package com.aneonex.bitcoinchecker.datamodule.model.market - -import com.aneonex.bitcoinchecker.datamodule.model.CheckerInfo -import com.aneonex.bitcoinchecker.datamodule.model.Market -import com.aneonex.bitcoinchecker.datamodule.model.Ticker -import com.aneonex.bitcoinchecker.datamodule.model.currency.Currency -import com.aneonex.bitcoinchecker.datamodule.model.currency.CurrencyPairsMap -import com.aneonex.bitcoinchecker.datamodule.model.currency.VirtualCurrency -import com.aneonex.bitcoinchecker.datamodule.util.ParseUtils -import org.json.JSONObject - -class Zaydo : Market(NAME, TTS_NAME, CURRENCY_PAIRS) { - companion object { - private const val NAME = "Zaydo" - private const val TTS_NAME = NAME - private const val URL = "http://chart.zyado.com/ticker.json" - private val CURRENCY_PAIRS: CurrencyPairsMap = CurrencyPairsMap() - - init { - CURRENCY_PAIRS[VirtualCurrency.BTC] = arrayOf( - Currency.EUR - ) - } - } - - override fun getUrl(requestId: Int, checkerInfo: CheckerInfo): String { - return URL - } - - @Throws(Exception::class) - override fun parseTickerFromJsonObject(requestId: Int, jsonObject: JSONObject, ticker: Ticker, checkerInfo: CheckerInfo) { - ticker.bid = ParseUtils.getDoubleFromString(jsonObject, "bid") - ticker.ask = ParseUtils.getDoubleFromString(jsonObject, "ask") - ticker.vol = ParseUtils.getDoubleFromString(jsonObject, "volume") - ticker.high = ParseUtils.getDoubleFromString(jsonObject, "high") - ticker.low = ParseUtils.getDoubleFromString(jsonObject, "low") - ticker.last = ParseUtils.getDoubleFromString(jsonObject, "last") - } -} \ No newline at end of file From 19ff5fc7d44fb4925d2fb212078cfb93b566aa22 Mon Sep 17 00:00:00 2001 From: Alexander Biryukov Date: Mon, 5 Oct 2020 02:25:17 +0300 Subject: [PATCH 037/183] Updated exchandes API: BitBay, BitoPro, BtcTurk, Okcoin, Vaultoro --- .../model/currency/CurrencyPairsMap.kt | 2 +- .../datamodule/model/market/BitBay.kt | 55 +++++++++++++++-- .../datamodule/model/market/BitoPro.kt | 31 ++++------ .../datamodule/model/market/Btcturk.kt | 59 +++++++++++++------ .../datamodule/model/market/Okcoin.kt | 56 ++++++++++++------ .../datamodule/model/market/Vaultoro.kt | 28 +++++++-- 6 files changed, 166 insertions(+), 65 deletions(-) diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/currency/CurrencyPairsMap.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/currency/CurrencyPairsMap.kt index 3643ee40..6fdc6f41 100644 --- a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/currency/CurrencyPairsMap.kt +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/currency/CurrencyPairsMap.kt @@ -1,3 +1,3 @@ package com.aneonex.bitcoinchecker.datamodule.model.currency -class CurrencyPairsMap: LinkedHashMap>() \ No newline at end of file +class CurrencyPairsMap: LinkedHashMap>() \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/BitBay.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/BitBay.kt index df540255..661e56e0 100644 --- a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/BitBay.kt +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/BitBay.kt @@ -20,12 +20,14 @@ class BitBay : Market(NAME, TTS_NAME, CURRENCY_PAIRS) { VirtualCurrency.BTC, Currency.PLN, Currency.USD, - Currency.EUR + Currency.EUR, + Currency.GBP ) CURRENCY_PAIRS[VirtualCurrency.BTC] = arrayOf( Currency.PLN, Currency.USD, - Currency.EUR + Currency.EUR, + Currency.GBP ) CURRENCY_PAIRS[VirtualCurrency.DASH] = arrayOf( VirtualCurrency.BTC, @@ -43,13 +45,15 @@ class BitBay : Market(NAME, TTS_NAME, CURRENCY_PAIRS) { VirtualCurrency.BTC, Currency.PLN, Currency.USD, - Currency.EUR + Currency.EUR, + Currency.GBP ) CURRENCY_PAIRS[VirtualCurrency.ETH] = arrayOf( VirtualCurrency.BTC, Currency.PLN, Currency.USD, - Currency.EUR + Currency.EUR, + Currency.GBP ) CURRENCY_PAIRS[VirtualCurrency.LSK] = arrayOf( VirtualCurrency.BTC, @@ -57,6 +61,43 @@ class BitBay : Market(NAME, TTS_NAME, CURRENCY_PAIRS) { Currency.USD, Currency.EUR ) + CURRENCY_PAIRS[VirtualCurrency.XRP] = arrayOf( + VirtualCurrency.BTC, + Currency.PLN, + Currency.USD, + Currency.EUR, + Currency.GBP + ) + CURRENCY_PAIRS[VirtualCurrency.OMG] = arrayOf( + VirtualCurrency.BTC, + Currency.PLN, + Currency.USD, + Currency.EUR + ) + CURRENCY_PAIRS[VirtualCurrency.BTG] = arrayOf( + VirtualCurrency.BTC, + Currency.PLN, + Currency.USD, + Currency.EUR + ) + CURRENCY_PAIRS[VirtualCurrency.BAT] = arrayOf( + VirtualCurrency.BTC, + Currency.PLN, + Currency.USD, + Currency.EUR + ) + CURRENCY_PAIRS[VirtualCurrency.XLM] = arrayOf( + VirtualCurrency.BTC, + Currency.PLN, + Currency.USD, + Currency.EUR + ) + CURRENCY_PAIRS[VirtualCurrency.TRX] = arrayOf( + VirtualCurrency.BTC, + Currency.PLN, + Currency.USD, + Currency.EUR + ) } } @@ -69,8 +110,10 @@ class BitBay : Market(NAME, TTS_NAME, CURRENCY_PAIRS) { ticker.bid = jsonObject.getDouble("bid") ticker.ask = jsonObject.getDouble("ask") ticker.vol = jsonObject.getDouble("volume") - ticker.high = jsonObject.getDouble("max") - ticker.low = jsonObject.getDouble("min") + if(jsonObject.has("max")) + ticker.high = jsonObject.getDouble("max") + if(jsonObject.has("min")) + ticker.low = jsonObject.getDouble("min") ticker.last = jsonObject.getDouble("last") } } \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/BitoPro.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/BitoPro.kt index 68669240..56ffd594 100644 --- a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/BitoPro.kt +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/BitoPro.kt @@ -4,17 +4,14 @@ import com.aneonex.bitcoinchecker.datamodule.model.CheckerInfo import com.aneonex.bitcoinchecker.datamodule.model.CurrencyPairInfo import com.aneonex.bitcoinchecker.datamodule.model.Market import com.aneonex.bitcoinchecker.datamodule.model.Ticker -import com.aneonex.bitcoinchecker.datamodule.model.currency.Currency -import com.aneonex.bitcoinchecker.datamodule.model.currency.VirtualCurrency -import com.aneonex.bitcoinchecker.datamodule.model.currency.CurrencyPairsMap -import org.json.JSONArray import org.json.JSONObject +import java.util.* -class BitoEX : Market(NAME, TTS_NAME, CURRENCY_PAIRS) { +class BitoPro : Market(NAME, TTS_NAME, null) { companion object { private const val NAME = "BitoPro" private const val TTS_NAME = NAME - private const val URL = "https://www.bitoex.com/sync/dashboard/%1\$s" + private const val URL = "https://api.bitopro.com/v3/tickers/%1\$s" private const val URL_CURRENCY_PAIRS = "https://api.bitopro.com/v3/provisioning/trading-pairs" } @@ -26,12 +23,10 @@ class BitoEX : Market(NAME, TTS_NAME, CURRENCY_PAIRS) { val dataJson = jsonObject.getJSONArray("data") for(i in 0 until dataJson.length()){ val pairJson = dataJson.getJSONObject(i) - if(!pairJson.getBoolean("maintain")) - continue - +// if(!pairJson.getBoolean("maintain")) continue pairs.add(CurrencyPairInfo( - pairJson.getString("base"), - pairJson.getString("quote"), + pairJson.getString("base").toUpperCase(Locale.ROOT), + pairJson.getString("quote").toUpperCase(Locale.ROOT), pairJson.getString("pair") ) ) @@ -39,15 +34,15 @@ class BitoEX : Market(NAME, TTS_NAME, CURRENCY_PAIRS) { } override fun getUrl(requestId: Int, checkerInfo: CheckerInfo): String { - return String.format(URL, System.currentTimeMillis()) + return String.format(URL, checkerInfo.currencyPairId) } @Throws(Exception::class) - override fun parseTicker(requestId: Int, responseString: String, ticker: Ticker, checkerInfo: CheckerInfo) { - val jsonArray = JSONArray(responseString) - ticker.ask = jsonArray.getString(0).replace(",".toRegex(), "").toDouble() - ticker.bid = jsonArray.getString(1).replace(",".toRegex(), "").toDouble() - ticker.last = ticker.ask - ticker.timestamp = java.lang.Long.valueOf(jsonArray.getString(2)) + override fun parseTickerFromJsonObject(requestId: Int, jsonObject: JSONObject, ticker: Ticker, checkerInfo: CheckerInfo) { + val dataJson = jsonObject.getJSONObject("data") + ticker.vol = dataJson.getDouble("volume24hr") + ticker.high = dataJson.getDouble("high24hr") + ticker.low = dataJson.getDouble("low24hr") + ticker.last = dataJson.getDouble("lastPrice") } } \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Btcturk.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Btcturk.kt index 8586de7b..d8788919 100644 --- a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Btcturk.kt +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Btcturk.kt @@ -1,19 +1,21 @@ package com.aneonex.bitcoinchecker.datamodule.model.market import com.aneonex.bitcoinchecker.datamodule.model.CheckerInfo +import com.aneonex.bitcoinchecker.datamodule.model.CurrencyPairInfo import com.aneonex.bitcoinchecker.datamodule.model.Market import com.aneonex.bitcoinchecker.datamodule.model.Ticker import com.aneonex.bitcoinchecker.datamodule.model.currency.Currency -import com.aneonex.bitcoinchecker.datamodule.model.currency.VirtualCurrency import com.aneonex.bitcoinchecker.datamodule.model.currency.CurrencyPairsMap +import com.aneonex.bitcoinchecker.datamodule.model.currency.VirtualCurrency import com.aneonex.bitcoinchecker.datamodule.util.TimeUtils -import org.json.JSONArray +import org.json.JSONObject class Btcturk : Market(NAME, TTS_NAME, CURRENCY_PAIRS) { companion object { private const val NAME = "BtcTurk" private const val TTS_NAME = "Btc Turk" - private const val URL = "https://www.btcturk.com/api/ticker" + private const val URL = "https://api.btcturk.com/api/v2/ticker?pairSymbol=%1\$s" + private const val URL_CURRENCY_PAIRS = "https://api.btcturk.com/api/v2/ticker" private val CURRENCY_PAIRS: CurrencyPairsMap = CurrencyPairsMap() init { @@ -27,26 +29,47 @@ class Btcturk : Market(NAME, TTS_NAME, CURRENCY_PAIRS) { } } + override fun getCurrencyPairsUrl(requestId: Int): String? { + return URL_CURRENCY_PAIRS + } + + @Throws(Exception::class) + override fun parseCurrencyPairs(requestId: Int, responseString: String, pairs: MutableList) { + val pairsArray = JSONObject(responseString).getJSONArray("data") + + for (i in 0 until pairsArray.length()) { + val pairJson = pairsArray.getJSONObject(i) + pairs.add(CurrencyPairInfo( + pairJson.getString("numeratorSymbol"), + pairJson.getString("denominatorSymbol"), + pairJson.getString("pairNormalized") + ) + ) + } + } + override fun getUrl(requestId: Int, checkerInfo: CheckerInfo): String { - return URL + var pairId = checkerInfo.currencyPairId + if (pairId == null) { + pairId = "${checkerInfo.currencyBase}_${checkerInfo.currencyCounter}"; + } + + return String.format(URL, pairId) } @Throws(Exception::class) override fun parseTicker(requestId: Int, responseString: String, ticker: Ticker, checkerInfo: CheckerInfo) { - val tickerJsonArray = JSONArray(responseString) - val pairId = checkerInfo.currencyBase + checkerInfo.currencyCounter - for (i in 0 until tickerJsonArray.length()) { - val tickerJsonObject = tickerJsonArray.getJSONObject(i) - if (pairId == tickerJsonObject.getString("pair")) { - ticker.bid = tickerJsonObject.getDouble("bid") - ticker.ask = tickerJsonObject.getDouble("ask") - ticker.vol = tickerJsonObject.getDouble("volume") - ticker.high = tickerJsonObject.getDouble("high") - ticker.low = tickerJsonObject.getDouble("low") - ticker.last = tickerJsonObject.getDouble("last") - ticker.timestamp = (tickerJsonObject.getDouble("timestamp") * TimeUtils.MILLIS_IN_SECOND).toLong() - break - } + val tickerJson = JSONObject(responseString) + val dataJsonArray = tickerJson.getJSONArray("data") + + dataJsonArray.getJSONObject(0).let{ + ticker.bid = it.getDouble("bid") + ticker.ask = it.getDouble("ask") + ticker.vol = it.getDouble("volume") + ticker.high = it.getDouble("high") + ticker.low = it.getDouble("low") + ticker.last = it.getDouble("last") + ticker.timestamp = (it.getDouble("timestamp") * TimeUtils.MILLIS_IN_SECOND).toLong() } } } \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Okcoin.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Okcoin.kt index a1b3fb7d..2e5ad16f 100644 --- a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Okcoin.kt +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Okcoin.kt @@ -1,49 +1,71 @@ package com.aneonex.bitcoinchecker.datamodule.model.market import com.aneonex.bitcoinchecker.datamodule.model.CheckerInfo +import com.aneonex.bitcoinchecker.datamodule.model.CurrencyPairInfo import com.aneonex.bitcoinchecker.datamodule.model.Market import com.aneonex.bitcoinchecker.datamodule.model.Ticker import com.aneonex.bitcoinchecker.datamodule.model.currency.Currency import com.aneonex.bitcoinchecker.datamodule.model.currency.CurrencyPairsMap import com.aneonex.bitcoinchecker.datamodule.model.currency.VirtualCurrency +import org.json.JSONArray import org.json.JSONObject class Okcoin : Market(NAME, TTS_NAME, CURRENCY_PAIRS) { companion object { private const val NAME = "OKCoin" private const val TTS_NAME = "OK Coin" - private const val URL_USD = "https://www.okcoin.com/api/v1/ticker.do?symbol=%1\$s_%2\$s" - private const val URL_CNY = "https://www.okcoin.cn/api/v1/ticker.do?symbol=%1\$s_%2\$s" + private const val URL = "https://www.okcoin.com/api/spot/v3/instruments/%1\$s/ticker" + private const val URL_CURRENCY_PAIRS = "https://www.okcoin.com/api/spot/v3/instruments" private val CURRENCY_PAIRS: CurrencyPairsMap = CurrencyPairsMap() init { CURRENCY_PAIRS[VirtualCurrency.BTC] = arrayOf( - Currency.CNY, - Currency.USD + Currency.USD, + Currency.EUR + ) + CURRENCY_PAIRS[VirtualCurrency.ETH] = arrayOf( + Currency.USD, + Currency.EUR ) CURRENCY_PAIRS[VirtualCurrency.LTC] = arrayOf( - Currency.CNY, - Currency.USD + Currency.USD, + Currency.EUR ) } } + override fun getCurrencyPairsUrl(requestId: Int): String? { + return URL_CURRENCY_PAIRS + } + + @Throws(Exception::class) + override fun parseCurrencyPairs(requestId: Int, responseString: String, pairs: MutableList) { + val pairsArray = JSONArray(responseString) + for (i in 0 until pairsArray.length()) { + val pairJson = pairsArray.getJSONObject(i) + pairs.add(CurrencyPairInfo( + pairJson.getString("base_currency"), + pairJson.getString("quote_currency"), + pairJson.getString("instrument_id"))) + } + } + override fun getUrl(requestId: Int, checkerInfo: CheckerInfo): String { - return if (Currency.USD == checkerInfo.currencyCounter) { - String.format(URL_USD, checkerInfo.currencyBaseLowerCase, checkerInfo.currencyCounterLowerCase) - } else { - String.format(URL_CNY, checkerInfo.currencyBaseLowerCase, checkerInfo.currencyCounterLowerCase) + var pairId = checkerInfo.currencyPairId + if(pairId == null){ + pairId = "${checkerInfo.currencyBase}-${checkerInfo.currencyCounter}" } + return String.format(URL, pairId) } @Throws(Exception::class) override fun parseTickerFromJsonObject(requestId: Int, jsonObject: JSONObject, ticker: Ticker, checkerInfo: CheckerInfo) { - val tickerJsonObject = jsonObject.getJSONObject("ticker") - ticker.bid = tickerJsonObject.getDouble("buy") - ticker.ask = tickerJsonObject.getDouble("sell") - ticker.vol = tickerJsonObject.getDouble("vol") - ticker.high = tickerJsonObject.getDouble("high") - ticker.low = tickerJsonObject.getDouble("low") - ticker.last = tickerJsonObject.getDouble("last") +// val tickerJsonObject = jsonObject.getJSONObject("ticker") + ticker.bid = jsonObject.getDouble("bid") + ticker.ask = jsonObject.getDouble("ask") + ticker.vol = jsonObject.getDouble("base_volume_24h") + ticker.high = jsonObject.getDouble("high_24h") + ticker.low = jsonObject.getDouble("low_24h") + ticker.last = jsonObject.getDouble("last") } } \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Vaultoro.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Vaultoro.kt index a60cb437..30ff25d4 100644 --- a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Vaultoro.kt +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Vaultoro.kt @@ -6,27 +6,45 @@ import com.aneonex.bitcoinchecker.datamodule.model.Ticker import com.aneonex.bitcoinchecker.datamodule.model.currency.Currency import com.aneonex.bitcoinchecker.datamodule.model.currency.CurrencyPairsMap import com.aneonex.bitcoinchecker.datamodule.model.currency.VirtualCurrency +import org.json.JSONObject +import java.util.* +import java.util.concurrent.TimeUnit class Vaultoro : Market(NAME, TTS_NAME, CURRENCY_PAIRS) { companion object { private const val NAME = "Vaultoro" private const val TTS_NAME = NAME - private const val URL = "https://api.vaultoro.com/latest/" + private const val URL = "https://api.vaultoro.com/v1/public/ohlc?pair=%1\$s&since=%2\$s" private val CURRENCY_PAIRS: CurrencyPairsMap = CurrencyPairsMap() init { CURRENCY_PAIRS[Currency.GOLD] = arrayOf( - VirtualCurrency.BTC + VirtualCurrency.BTC, + VirtualCurrency.DASH ) } } override fun getUrl(requestId: Int, checkerInfo: CheckerInfo): String { - return URL + var pairId = checkerInfo.currencyPairId + if(pairId == null){ + pairId = "${checkerInfo.currencyBase}${checkerInfo.currencyCounter}" + } + + val sinceLastWeekTime = (System.currentTimeMillis() - TimeUnit.DAYS.toMillis(7)) / 1000 + return String.format(URL, pairId, sinceLastWeekTime) } @Throws(Exception::class) - override fun parseTicker(requestId: Int, responseString: String, ticker: Ticker, checkerInfo: CheckerInfo) { - ticker.last = responseString.toDouble() + override fun parseTickerFromJsonObject(requestId: Int, jsonObject: JSONObject, ticker: Ticker, checkerInfo: CheckerInfo) { + val dataJson = jsonObject.getJSONArray("data") + if(dataJson.length() == 0) throw java.lang.Exception("No data") + + val tickerJson = dataJson.getJSONObject(0) + ticker.last = tickerJson.getDouble("close") + ticker.high = tickerJson.getDouble("high") + ticker.low = tickerJson.getDouble("low") + ticker.vol = tickerJson.getDouble("volume") + ticker.timestamp = tickerJson.getLong("createdAt") * 1000 } } \ No newline at end of file From 979c9490ab751f1924b159f0baafedeeaa046ef5 Mon Sep 17 00:00:00 2001 From: Alexander Biryukov Date: Mon, 5 Oct 2020 02:28:02 +0300 Subject: [PATCH 038/183] Added debug test for all exchanges --- .../bitcoinchecker/tester/MainActivity.kt | 78 ++++++++++++++++++- .../src/main/res/layout/main_activity.xml | 41 +++++++--- 2 files changed, 106 insertions(+), 13 deletions(-) diff --git a/dataModuleTester/src/main/java/com/aneonex/bitcoinchecker/tester/MainActivity.kt b/dataModuleTester/src/main/java/com/aneonex/bitcoinchecker/tester/MainActivity.kt index f8aee19f..4caf7276 100644 --- a/dataModuleTester/src/main/java/com/aneonex/bitcoinchecker/tester/MainActivity.kt +++ b/dataModuleTester/src/main/java/com/aneonex/bitcoinchecker/tester/MainActivity.kt @@ -4,6 +4,7 @@ import android.app.Activity import android.os.Bundle import android.text.SpannableStringBuilder import android.text.TextUtils +import android.util.Log import android.view.View import android.widget.* import android.widget.AdapterView.OnItemSelectedListener @@ -30,6 +31,8 @@ import com.aneonex.bitcoinchecker.tester.volley.generic.ResponseListener import java.util.* class MainActivity : Activity() { + private val TAG = MainActivity::class.simpleName + private inner class MarketEntry(var key: String, var name: String) : Comparable { override fun toString(): String { return name @@ -49,6 +52,7 @@ class MainActivity : Activity() { private lateinit var currencyCounterSpinner: Spinner private lateinit var futuresContractTypeSpinner: Spinner private lateinit var getResultButton: View + private lateinit var testAllButton: View private lateinit var progressBar: ProgressBar private lateinit var resultView: TextView @@ -66,6 +70,7 @@ class MainActivity : Activity() { currencyCounterSpinner = findViewById(R.id.currencyCounterSpinner) as Spinner futuresContractTypeSpinner = findViewById(R.id.futuresContractTypeSpinner) as Spinner getResultButton = findViewById(R.id.getResultButton) + testAllButton = findViewById(R.id.testAllButton) progressBar = findViewById(R.id.progressBar) as ProgressBar resultView = findViewById(R.id.resultView) as TextView refreshMarketSpinner() @@ -105,6 +110,7 @@ class MainActivity : Activity() { } } getResultButton.setOnClickListener { newResult } + testAllButton.setOnClickListener { testAllExchanges() } } // ==================== @@ -201,9 +207,10 @@ class MainActivity : Activity() { resultView.visibility = if (showResultView) View.VISIBLE else View.GONE } - private fun getProperCurrencyPairs(market: Market): HashMap>? { + private fun getProperCurrencyPairs(market: Market): HashMap>? { val currencyPairsMapHelper = currencyPairsMapHelper - return if (currencyPairsMapHelper?.currencyPairs != null && currencyPairsMapHelper.currencyPairs.size > 0) + + return if (currencyPairsMapHelper != null && !currencyPairsMapHelper.currencyPairs.isNullOrEmpty()) currencyPairsMapHelper.currencyPairs else market.currencyPairs } @@ -263,7 +270,70 @@ class MainActivity : Activity() { private fun createNewPriceLineIfNeeded(textResId: Int, price: Double, currency: String): String { return if (price <= Ticker.NO_DATA) "" else """ - ${getString(textResId, formatPriceWithCurrency(price, currency))} - """.trimIndent() + ${getString(textResId, formatPriceWithCurrency(price, currency))} + """.trimIndent() + } + + private fun testAllExchanges(){ + Toast.makeText(this, "Test all", Toast.LENGTH_SHORT).show() + + for (market in MarketsConfig.MARKETS.values) { + Log.d(TAG, "*** Checking: ${market.name} (${market.key}) ***") + + if(market.currencyPairs.isNullOrEmpty()){ + Log.d(TAG, "No pairs") + continue + } + + val map = market.currencyPairs!! + val currencyBase = map.keys.first() + val currencyCounter = map[currencyBase]!!.first() + + Log.d(TAG, "First pair: $currencyBase/$currencyCounter") + + val currencyPairsMapHelper = CurrencyPairsMapHelper(MarketCurrencyPairsStore.getPairsForMarket(this, market.key)) + val pairId = currencyPairsMapHelper.getCurrencyPairId(currencyBase, currencyCounter) + + val contractType = if (market is FuturesMarket) + market.contractTypes[0] + else Futures.CONTRACT_TYPE_WEEKLY + + val checkerInfo = CheckerInfo(currencyBase, currencyCounter, pairId, contractType) + val request: Request<*> = CheckerVolleyMainRequest(market, checkerInfo, + object : ResponseListener() { + override fun onResponse(url: String?, requestHeaders: Map?, networkResponse: NetworkResponse?, responseString: String?, response: TickerWrapper?) { + handleTestExchange(market.name, checkerInfo, response?.ticker, url, requestHeaders, networkResponse, responseString, null, null) + } + }, object : ResponseErrorListener() { + override fun onErrorResponse(url: String?, requestHeaders: Map?, networkResponse: NetworkResponse?, responseString: String?, error: VolleyError) { + error.printStackTrace() + var errorMsg: String? = null + if (error is CheckerErrorParsedError) { + errorMsg = error.errorMsg + } + if (TextUtils.isEmpty(errorMsg)) errorMsg = CheckErrorsUtils.parseVolleyErrorMsg(this@MainActivity, error) + handleTestExchange(market.name, checkerInfo, null, url, requestHeaders, networkResponse, responseString, errorMsg, error) + } + }) + requestQueue.add(request) + } + } + + private fun handleTestExchange(marketName: String, checkerInfo: CheckerInfo, ticker: Ticker?, url: String?, requestHeaders: Map?, networkResponse: NetworkResponse?, rawResponse: String?, errorMsg: String?, error: VolleyError?) { +// showResultView(true) + + val sb = StringBuilder() + + sb.append("TEST_RESULT [$marketName]: ") + + if(ticker != null) + sb.append("Success") + else + sb.append("FAILED") + + sb.append(": ") + sb.append(url ?: "Unknown uri") + + Log.d(TAG, sb.toString()) } } \ No newline at end of file diff --git a/dataModuleTester/src/main/res/layout/main_activity.xml b/dataModuleTester/src/main/res/layout/main_activity.xml index 437d2d63..f89d76e7 100644 --- a/dataModuleTester/src/main/res/layout/main_activity.xml +++ b/dataModuleTester/src/main/res/layout/main_activity.xml @@ -69,15 +69,38 @@ android:layout_height="wrap_content" android:spinnerMode="dialog" /> - -