diff --git a/.github/workflows/gradle.yml b/.github/workflows/gradle.yml new file mode 100644 index 00000000..5ace1be2 --- /dev/null +++ b/.github/workflows/gradle.yml @@ -0,0 +1,32 @@ +# 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: Android CI + +on: + push: + branches: [ '*' ] + pull_request: + branches: [ master ] + +jobs: + build: + + runs-on: ubuntu-latest + + steps: + - name: Checkout source code + uses: actions/checkout@v2 + + - name: Set up JDK 11 + uses: actions/setup-java@v2 + with: + java-version: '11' + distribution: 'adopt' + cache: gradle + + - name: Grant execute permission for gradlew + run: chmod +x gradlew + + - name: Build with Gradle + run: ./gradlew build 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/.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/README.md b/README.md index 525eb4c8..b280a49d 100644 --- a/README.md +++ b/README.md @@ -1,326 +1,34 @@ # Bitcoin Checker +

+The app screenshot +   + Get it on Google Play +

+ +> Notice: This project continues the development of the [previous inactive project Bitcoin Checker](https://github.com/mobnetic/BitcoinChecker). + +## About __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). -As you know, the number of virtual currencies is increasing very fast. Currency pairs set on existing exchanges change almost every day and there is also a need to add newer and newer exchanges over time. -_We proudly announce_ that [DataModule](dataModule) (containing exchanges and currency pairs) for Bitcoin Checker app is now _OPEN_ for our users to make this application _even better_! This means that _anyone_ can now: +This Github project contains open [DataModule](dataModule) (containing exchanges and currency pairs) for Bitcoin Checker app. It is _OPEN_ for our users to make this application _even better_! This means that _anyone_ can now: * Add support for a new exchange * 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. - -##### 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 - -- [Introduction](#introduction) - - [Updating currency pairs on existing exchange:](#updating-currency-pairs-on-existing-exchange) - - [Adding new pair on Cryptsy?](#adding-new-pair-on-cryptsy) - - [Good practise:](#good-practise) - - [Some currencies are missing?](#some-currencies-are-missing) - - [Adding new exchange:](#adding-new-exchange) - - [Example:](#example) - - [1. New exchange configuration:](#1-new-exchange-configuration) - - [2. Providing currency pairs:](#2-providing-currency-pairs) - - [3. Providing API Url:](#3-providing-api-url) - - [3a. Providing other parameters in URL (advanced):](#3a-providing-other-parameters-in-url-advanced) - - [4. Parsing API response:](#4-parsing-api-response) - - [4a. Parsing non JSONObject responses (advanced):](#4a-parsing-non-jsonobject-responses-advanced) - - [5. Parsing error (not required):](#5-parsing-error-not-required) - - [6. Fetching currency pairs directly from exchange:](#6-fetching-currency-pairs-directly-from-exchange) - - [7. Enabling exchange:](#7-enabling-exchange) - - [Advanced things](#advanced-things) - - [Multiple requests per exchange:](#multiple-requests-per-exchange) - - [Multiple requests while fetching currency pairs](#multiple-requests-while-fetching-currency-pairs) - - - - - -# Introduction -To start working, you should fork this repo. It basically contains two projects: -* [DataModule](/dataModule): Library project that stores information about exchanges and currencies used in Bitcoin Checker. This is the project that you will work with. -* [DataModuleTester](/dataModuleTester): Simple project that provides minimal interface in order to launch and test your changes - to see if they will work :) - -The whole tutorial described below refers to the [DataModule](dataModule) project because only this project is meant to be edited by users. After making your changes, please create a pull request to the original repo. - - -## 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. -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 -CURRENCY_PAIRS.put(VirtualCurrency.LTC, // Base currency - new String[]{ - VirtualCurrency.BTC, // Counter currency - Currency.USD, // Counter currency - Currency.RUR, // Counter currency - Currency.EUR // Counter 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`. - -### 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: - -```java -[...] -CURRENCY_PAIRS_IDS.put("DOGE_BTC", 132); -CURRENCY_PAIRS_IDS.put("DOGE_LTC", 135); -[...] -``` - -The simplest way to find the pair ID is to click or hover on that particular pair in the trading section on the Cryptsy website. The number at the end of the page url represents the ID of that particular pair: https://www.cryptsy.com/markets/view/132 - -### Good practise: -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 - -### 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. - - -## 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) - -### 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"). -* `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. - -These constants (without `URL`) should be provided in the default constructor: - -```java -public MarketExample() { - super(NAME, TTS_NAME, CURRENCY_PAIRS); -} -``` - -### 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. - -### 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. -See examples below: - -##### Example without parameters: -* API example: https://www.bitstamp.net/api/ticker/ -* URL field: https://www.bitstamp.net/api/ticker/ - -```java -@Override -public String getUrl(int requestId, CheckerInfo checkerInfo) { - return URL; -} -``` - -##### Example with arguments - for given currency pair: -* API example: https://anxpro.com/main/stats?ccyPair=BTCUSD -* URL field: https://anxpro.com/main/stats?ccyPair=%1$s%2$s - -```java -@Override -public String getUrl(int requestId, CheckerInfo checkerInfo) { - return String.format(URL, checkerInfo.getCurrencyBase(), checkerInfo.getCurrencyCounter()); -} -``` - - -Note that currency names are always in uppercase; however, some APIs requires them to be in lowercase. - -##### Example with lowercase currency parameters: -* API example: https://bter.com/api/1/ticker/btc_cny -* URL field: https://bter.com/api/1/ticker/%1$s_%2$s - -```java -@Override -public String getUrl(int requestId, CheckerInfo checkerInfo) { - return String.format(URL, checkerInfo.getCurrencyBaseLowerCase(), checkerInfo.getCurrencyCounterLowerCase()); -} -``` - -#### 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: - -```java -[...] -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("DVC_BTC", 40); -[...] -``` - -While providing the URL, we need to obtain the proper ID that is associated with this pair: - -##### Example for DOGE/BTC (id=132) on Cryptsy: -* API example: http://pubapi.cryptsy.com/api.php?method=singlemarketdata&marketid=132 -* URL field: http://pubapi.cryptsy.com/api.php?method=singlemarketdata&marketid=%1$s - -```java -@Override -public String getUrl(int requestId, CheckerInfo checkerInfo) { - 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 URL; -} -``` - -### 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. -If the API response is just in plain JSON object, you can parse it in the parseTickerFromJsonObject method: - -```java -@Override -protected void parseTickerFromJsonObject(int requestId, JSONObject jsonObject, Ticker ticker, CheckerInfo checkerRecord) 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"); -} -``` - -__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. - -#### 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: - -```java -protected void parseTicker(int requestId, String responseString, Ticker ticker, CheckerInfo checkerInfo) throws Exception { - parseTickerFromJsonObject(requestId, new JSONObject(responseString), ticker, checkerInfo); -} -``` - -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 - -### 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: - -```java -protected String parseErrorFromJsonObject(int requestId, JSONObject jsonObject, CheckerInfo checkerInfo); -``` -or if JSONObject is not suitable, you can override following method: -```java -protected String parseError(int requestId, String responseString, CheckerInfo checkerInfo); -``` - -### 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). -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 -private final static String URL_CURRENCY_PAIRS = "http://pubapi.cryptsy.com/api.php?method=marketdatav2"; - -public SampleExchange() { - super(NAME, TTS_NAME, null); // <- null intead of CURRENCY_PAIRS map -} - -[...] - -@Override -public String getCurrencyPairsUrl(int requestId) { - return URL_CURRENCY_PAIRS; -} -``` -Then you need to do parsing in: - -```java -protected void parseCurrencyPairsFromJsonObject(int requestId, JSONObject jsonObject, List pairs) -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. - -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). - -### 7. Enabling exchange: -To enable a newly created exchange, you should add the corresponding line at the bottom of `MarketsConfig` file: - -```java -static { - [...] - addMarket(new MyNewExchangeClass()); -} -``` - -## Advanced things -### 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: - -```java -@Override -public int getNumOfRequests(CheckerInfo checkerRecord) { - return 2; -} -``` +See the [Development guide](docs/development.md) for contributing. -Then make use of requestId variable passed to `getUrl` and `parseTickerFromJsonObject` methods. -`requestId` variable is incremented from `0` to `numOfRequests-1` for every new request made. -From the first request, we are able to obtain only the `last` price. We want to obtain also the `bid` and `ask` values, so we do another request for the orders list: +## Issues +Please submit all requests for new exchanges or bugs in Bitcoin Checker apps in the [Issues](../../issues/) section. -```java -@Override -public String getUrl(int requestId, CheckerInfo checkerInfo) { - if(requestId==0) - return URL; - else - return String.format(URL_ORDERS, checkerInfo.getCurrencyCounter(), checkerInfo.getCurrencyBase()); // Reversed currencies -} +## Install +Bitcoin Checker app available on Google Play: https://play.google.com/store/apps/details?id=com.aneonex.bitcoinchecker -@Override -protected void parseTickerFromJsonObject(int requestId, JSONObject jsonObject, Ticker ticker, CheckerInfo checkerInfo) throws Exception { - if(requestId==0) { - ticker.last = jsonObject.getDouble(checkerInfo.getCurrencyCounter()+"_"+checkerInfo.getCurrencyBase()); // Reversed currencies - } else { - ticker.bid = getFirstPriceFromOrder(jsonObject, "bids"); - ticker.ask = getFirstPriceFromOrder(jsonObject, "asks"); - } -} -``` +## Donate ⭐ +If you like Bitcoin Checker, you can donate for the development and support of the application: -### Multiple requests while fetching currency pairs -You can also use multiple requests support for fetching currency pairs from exchange. The implementation is almost identical - just override following method: +| | donation address | +| --- | --- | +| BTC | 1ADwViiQWaiw5ghkcNnSRA5KDZhdhgGvR1 | +| ETH | 0x39F4C57F0136FB7F660c93E9d22c99E451627967 | -```java -@Override -public int getCurrencyPairsNumOfRequests() { - return 2; -} -``` -Then use the `requestId` argument in the same way as in previous section. +Thank you! diff --git a/build.gradle b/build.gradle index 2e369803..5da5807b 100644 --- a/build.gradle +++ b/build.gradle @@ -1,15 +1,32 @@ // Top-level build file where you can add configuration options common to all sub-projects/modules. buildscript { + ext { + compile_sdk_version = 31 + min_sdk_version = 26 + build_tools_version = '30.0.3' + + kotlin_version = '1.6.10' + core_ktx_version = '1.7.0' + } + repositories { - jcenter() + google() + mavenCentral() } + dependencies { - classpath 'com.android.tools.build:gradle:2.2.3' + classpath 'com.android.tools.build:gradle:7.0.4' + classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version" } } allprojects { repositories { - jcenter() + google() + mavenCentral() } } + +task clean(type: Delete) { + delete rootProject.buildDir +} \ No newline at end of file diff --git a/dataModule/build.gradle b/dataModule/build.gradle index 34cf2fcc..fadecd0e 100644 --- a/dataModule/build.gradle +++ b/dataModule/build.gradle @@ -1,18 +1,36 @@ -apply plugin: 'com.android.library' +plugins { + id 'com.android.library' + id 'kotlin-android' +} android { - compileSdkVersion 23 - buildToolsVersion "24.0.3" + compileSdkVersion compile_sdk_version + buildToolsVersion build_tools_version defaultConfig { - minSdkVersion 9 - targetSdkVersion 18 + minSdkVersion min_sdk_version + targetSdkVersion compile_sdk_version } buildTypes { release { minifyEnabled false - proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt' + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } } -} + + compileOptions { + sourceCompatibility JavaVersion.VERSION_11 + targetCompatibility JavaVersion.VERSION_11 + } + + kotlinOptions { + jvmTarget = '11' + } + + lintOptions { + abortOnError true + checkReleaseBuilds true + checkDependencies true + } +} \ No newline at end of file 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/proguard-rules.pro b/dataModule/proguard-rules.pro new file mode 100644 index 00000000..481bb434 --- /dev/null +++ b/dataModule/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/dataModule/src/main/AndroidManifest.xml b/dataModule/src/main/AndroidManifest.xml index b0c8e0f3..d416a153 100644 --- a/dataModule/src/main/AndroidManifest.xml +++ b/dataModule/src/main/AndroidManifest.xml @@ -1,10 +1,6 @@ - - + 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..d2169c88 --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/config/MarketsConfig.kt @@ -0,0 +1,203 @@ +package com.aneonex.bitcoinchecker.datamodule.config + +import com.aneonex.bitcoinchecker.datamodule.model.Market +import com.aneonex.bitcoinchecker.datamodule.model.market.* + +object MarketsConfig { + private val registeredMarkets = arrayOf( + Coinbase(), // Default market + + Bitstamp(), + Mercado(), + + Kraken(), + Bitfinex(), + Okcoin(), +// Cryptsy(), +// Vircurex(), +// Fxbtc(), + GateIo(), +// Justcoin(), + Btcturk(), +// Coinse(), +// Campbx(), + TheRock(), + CexIO(), +// Virtex(), + Huobi(), +// VaultOfSatoshi(), +// CoinMarketIO(), +// McxNOW(), +// CryptoTrade(), +// MintPal(), + CoinJar(), + Poloniex(), +// Winkdex(), + BitX(), +// CCex(), +// Bitorado(), + CoinDesk(), + Koinim(), +// FybSE(), + FybSG(), +// Prelude(), + BitKonan(), + Bittrex(), +// Comkort(), + Bit2c(), +// CryptoAltex(), + BtcMarkets(), + Bleutrade(), +// ShareXcoin(), +// Unisend(), + BitcoinVenezuela(), + Korbit(), + CoinTree(), +// Cryptonit(), + LakeBTC(), + BitMaszyna(), +// Zaydo(), +// AllCoin(), + Ripio(), +// DolarBlueNet(), +// CoinSwap(), + Paymium(), + Bitso(), +// Cryptoine(), + BitcoinToYou(), + BitexLa(), + ItBit(), + BitcoinCoId(), + HitBtc(), +// CleverCoin(), + BitBay(), +// QuadrigaCX(), + CoinMateIO(), +// Buttercoin(), +// CoinTraderNet(), + LocalBitcoins(), +// Cryptopia(), +// Igot(), +// Mexbt(), + Vaultoro(), +// BitxCom(), + BtcBox(), +// BtcXIndia(), + Uphold(), + YoBit(), + ShapeShift(), +// BitoEx(), +// new FoscEx(), +// CoinSecure(), +// Dashcurex(), +// Quoine(), + Livecoin(), + Gemini(), +// Coinapult(), +// Btc38(), +// ETHEXIndia(), +// GateCoin(), +// Liqui(), + ChileBit(), + SurBitcoin(), + VBtc(), + Urdubit(), + NegocieCoins(), + BitMEX(), + BitFlyer(), + Coinone(), + Bithumb(), + Coinsph(), + Bl3p(), +// SurBtc(), + CoinFloor(), + Lykke(), +// Coinnest(), +// Braziliex(), +// Abucoins(), +// Zebpay(), + Paribu(), + SatoshiTango(), +// Koinex(), +// Unocoin(), + BlinkTrade(), + Exmo(), + Binance(), + Kucoin(), + BitcoinTrade(), + OmniTrade(), +// Coinome(), +// Nocks(), + BitoPro(), + Ftx(), + Okex(), + OkexFutures(), + ZgCom(), + Upbit(), + CoinEx(), + BitpandaPro(), + Indodax(), + Liquid(), + WazirX(), + Pdax(), + Exrates(), + Coinsbit(), + Coineal(), + Bkex(), + Mxc(), + + Biki(), + Bybit(), + BitZ(), + Hbtc(), + Hydax(), + Mexo(), + XthetaGlobal(), + + UniswapV2(), + IndependentReserve(), + CapeCrypto(), + + BinanceFutures(), + Bitvavo(), + AscendEX(), + + BitPay(), + Hotbit(), + + BitCambio(), + BwCom(), + EXX(), + CoinTiger(), + LiteBit(), + OceanEx(), + BitMart(), + BigONE(), + Tokok(), + + Orionx(), + BudaCom(), + CryptoMarket(), + + ProBit(), + CryptoCom(), + Foxbit(), + + Bitkub(), + + CoinJarExchange(), + CoinEgg(), + Phemex(), + + FtxFutures(), + HuobiFutures(), + + Latoken(), + Bitrue(), + FtxUs(), + BinanceUs(), + Mexc(), + ) + + val MARKETS: Map = registeredMarkets.map{it.key to it}.toMap() +} diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/exceptions/MarketParseException.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/exceptions/MarketParseException.kt new file mode 100644 index 00000000..f246ba8d --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/exceptions/MarketParseException.kt @@ -0,0 +1,3 @@ +package com.aneonex.bitcoinchecker.datamodule.exceptions + +class MarketParseException(message: String) : Exception(message) \ 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..1619736d --- /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?, contractType: FuturesContractType) + : CurrencyPairInfo(currencyBase, currencyCounter, currencyPairId, contractType) { + val currencyBaseLowerCase: String + get() = currencyBase.lowercase(Locale.US) + val currencyCounterLowerCase: String + get() = currencyCounter.lowercase(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..15da637f --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/CurrencyPairInfo.kt @@ -0,0 +1,36 @@ +package com.aneonex.bitcoinchecker.datamodule.model + +open class CurrencyPairInfo( + val currencyBase: String, + val currencyCounter: String, + val currencyPairId: String?, + val contractType: FuturesContractType = FuturesContractType.NONE +) : Comparable { + + @Suppress("unused") // Used by Gson + private constructor() : this("", "", null) + + @Throws(NullPointerException::class) + override fun compareTo(other: CurrencyPairInfo): Int { + var compBase = currencyBase.compareTo(other.currencyBase, ignoreCase = true) + if (compBase != 0) return compBase + + compBase = currencyCounter.compareTo( + other.currencyCounter, + ignoreCase = true + ) + if (compBase != 0) return compBase + + return contractType.compareTo(other.contractType) + } + + override fun toString(): String { + fun tryGetContactName(): String { + val resultName = FuturesContractType.getShortName(contractType) + return if(resultName == null) "" else ":$resultName" + } + + return currencyPairId ?: + "$currencyBase:$currencyCounter" + tryGetContactName() + } +} \ 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..3c51141f --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/CurrencyPairsListWithDate.kt @@ -0,0 +1,6 @@ +package com.aneonex.bitcoinchecker.datamodule.model + +class CurrencyPairsListWithDate( + var date: Long = 0, + 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..2691a765 --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/CurrencySubunit.kt @@ -0,0 +1,7 @@ +package com.aneonex.bitcoinchecker.datamodule.model + +class CurrencySubunit( + 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..85eaa067 --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/CurrencySubunitsMap.kt @@ -0,0 +1,7 @@ +package com.aneonex.bitcoinchecker.datamodule.model + +class CurrencySubunitsMap(vararg currencySubunits: CurrencySubunit) : LinkedHashMap() { + 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/FuturesContractType.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/FuturesContractType.kt new file mode 100644 index 00000000..105b43c4 --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/FuturesContractType.kt @@ -0,0 +1,75 @@ +package com.aneonex.bitcoinchecker.datamodule.model + +import java.time.DayOfWeek +import java.time.LocalDate +import java.time.ZoneOffset +import java.time.temporal.TemporalAdjusters + +enum class FuturesContractType(val value: Int) { + NONE(0), + PERPETUAL(1), + WEEKLY(2), + BIWEEKLY(3), + MONTHLY(4), + BIMONTHLY(5), + QUARTERLY(6), + BIQUARTERLY(7); + + override fun toString(): String { + return getShortName(this) ?: "None" + } + + companion object { + fun fromInt(value: Int): FuturesContractType = values().firstOrNull { it.value == value } ?: NONE + + fun getShortName(contractType: FuturesContractType): String? = + when (contractType) { + NONE -> null + PERPETUAL -> + @Suppress("SpellCheckingInspection") + "Perp" + WEEKLY -> "1W" + BIWEEKLY -> "2W" + MONTHLY -> "1M" + BIMONTHLY -> "2M" + QUARTERLY -> "1Q" + BIQUARTERLY -> "2Q" + } + + fun getDeliveryDate(contractType: FuturesContractType): LocalDate? { + fun getCurrentDate() = LocalDate.now(ZoneOffset.UTC) + + return when(contractType) { + NONE, + PERPETUAL -> + null + + WEEKLY -> getEndOfWeek(getCurrentDate()) + BIWEEKLY -> getEndOfWeek(getCurrentDate().plusWeeks(1)) + + MONTHLY -> getEndOfMonth(getCurrentDate()) + BIMONTHLY -> getEndOfMonth(getCurrentDate().plusMonths(1)) + + QUARTERLY -> getEndOfQuarter(getCurrentDate()) + BIQUARTERLY -> getEndOfQuarter(getCurrentDate().plusMonths(3)) +// else -> throw MarketParseException("Unexpected contact type") + } + } + + private fun getEndOfWeek(currentDate: LocalDate): LocalDate = + if(currentDate.dayOfWeek == DayOfWeek.FRIDAY) currentDate + else currentDate.with(TemporalAdjusters.next(DayOfWeek.FRIDAY)) + + private fun getEndOfMonth(currentDate: LocalDate): LocalDate = + currentDate.with(TemporalAdjusters.lastInMonth(DayOfWeek.FRIDAY)) + + private fun getEndOfQuarter(currentDate: LocalDate): LocalDate { + val firstDayOfQuarter: LocalDate = + currentDate.with(currentDate.month.firstMonthOfQuarter()) + .with(TemporalAdjusters.firstDayOfMonth()) + + return firstDayOfQuarter.plusMonths(2) + .with(TemporalAdjusters.lastInMonth(DayOfWeek.FRIDAY)) + } + } +} \ 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..10147770 --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/Market.kt @@ -0,0 +1,107 @@ +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( + val name: String, + val ttsName: String, + val currencyPairs: CurrencyPairsMap? +) { + + val key: String = this.javaClass.simpleName + + open val cautionResId: Int + get() = 0 + + // ==================== + // Parse Ticker + // ==================== + open fun getNumOfRequests(checkerInfo: CheckerInfo?): Int { + return 1 + } + + abstract fun getUrl(requestId: Int, checkerInfo: CheckerInfo): String + + // When the body is set, the HTTP POST request is used + // By default is HTTP GET + open fun getPostRequestInfo(requestId: Int, checkerInfo: CheckerInfo): PostRequestInfo? { + return null + } + + @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 + } + + // If body defined than used HTTP POST request + open fun getCurrencyPairsPostRequestInfo(requestId: Int): PostRequestInfo? { + 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 + } +} \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/PostRequestInfo.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/PostRequestInfo.kt new file mode 100644 index 00000000..0ed45b75 --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/PostRequestInfo.kt @@ -0,0 +1,3 @@ +package com.aneonex.bitcoinchecker.datamodule.model + +class PostRequestInfo(val body: String, val headers: Map? = null) \ 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..dac54c4f --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/Ticker.kt @@ -0,0 +1,16 @@ +package com.aneonex.bitcoinchecker.datamodule.model + +interface Ticker { + var bid: Double + var ask: Double + var vol: Double + var volQuote: Double + var high: Double + var low: Double + var last: Double + var timestamp: Long + + companion object { + const val NO_DATA = -1 + } +} \ 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..853964a0 --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/currency/CurrenciesSubunits.kt @@ -0,0 +1,19 @@ +package com.aneonex.bitcoinchecker.datamodule.model.currency + +import com.aneonex.bitcoinchecker.datamodule.model.CurrencySubunit +import com.aneonex.bitcoinchecker.datamodule.model.CurrencySubunitsMap + +object CurrenciesSubunits { + val CURRENCIES_SUBUNITS = mapOf( + VirtualCurrency.BTC to CurrencySubunitsMap( + CurrencySubunit(VirtualCurrency.BTC, 1), + CurrencySubunit(VirtualCurrency.mBTC, 1000), +// CurrencySubunit(VirtualCurrency.uBTC, 1000000), + CurrencySubunit(VirtualCurrency.Satoshi, 100000000, false) + ), + VirtualCurrency.LTC to 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..12d14ac1 --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/currency/Currency.kt @@ -0,0 +1,168 @@ +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 VES = "VES" + 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..6fdc6f41 --- /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..ad28001b --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/currency/CurrencySymbols.kt @@ -0,0 +1,78 @@ +package com.aneonex.bitcoinchecker.datamodule.model.currency + +object CurrencySymbols { + val CURRENCY_SYMBOLS = mapOf( + Currency.USD to "$", + Currency.PLN to "zł", + Currency.CNY to "¥", + Currency.EUR to "€", +// CURRENCY_SYMBOLS.put(CAD, "$"), + Currency.GBP to "£", + Currency.CHF to "Fr", + Currency.RUB to "₽", + Currency.RUR to "₽", +// Currency.AUD to "$", + Currency.SEK to "kr", + Currency.DKK to "kr", +// Currency.HKD to "$", +// Currency.SGD to "$", + Currency.THB to "฿", +// Currency.NZD to "$", + Currency.JPY to "¥", + Currency.BRL to "R$", + Currency.KRW to "₩", + Currency.AFN to "؋", + Currency.ALL to "L", + Currency.DZD to "د.ج", + Currency.AOA to "Kz", +// Currency.ARS to "$", + Currency.AMD to "֏", + Currency.AWG to "ƒ", + Currency.AZN to "m", +// Currency.BSD to "$", + Currency.BHD to "ب.د", + Currency.BDT to "৳", +// Currency.BBD to "$", + Currency.BYR to "Br", +// Currency.BZD to "$", +// Currency.BMD to "$", + Currency.BTN to "Nu.", + Currency.BOB to "Bs.", + Currency.BAM to "КМ", + Currency.BWP to "P", +// Currency.BND to "$", + Currency.BGN to "лв", + Currency.BIF to "Fr", + Currency.TRY to "TL", + Currency.ZAR to "R", + Currency.IDR to "Rp", +// Currency.VND to "₫", + Currency.GEL to "₾", +// Currency.IRR to "﷼", + Currency.HUF to "Ft", +// Currency.ILS to "₪", + Currency.INR to "₹", + Currency.JOD to "JD", + Currency.ISK to "kr", + Currency.KZT to "₸", +// Currency.KHR to "៛", +// Currency.QAR to "﷼", + Currency.KES to "KSH", +// Currency.KGS to "с", + Currency.CRC to "₡", + Currency.CHF to "₣", + Currency.MYR to "RM", + Currency.MAD to "Dh", + Currency.MNT to "₮", + Currency.NGN to "₦", + Currency.AED to "Dh", + Currency.PEN to "S/", + Currency.RON to "L", + Currency.SAR to "SR", + Currency.RSD to "din.", + Currency.TZS to "TSh", +// Currency.UAH to "₴", + Currency.PHP to "₱", + Currency.CZK to "Kč", + ) +} \ 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..58bfb797 --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/currency/VirtualCurrency.kt @@ -0,0 +1,376 @@ +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 LINK = "LINK" + 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 SOL = "SOL" + 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 USDC = "USDC" + 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/AscendEX.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/AscendEX.kt new file mode 100644 index 00000000..bac45c91 --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/AscendEX.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 com.aneonex.bitcoinchecker.datamodule.util.forEachJSONObject +import org.json.JSONObject + +class AscendEX : Market(NAME, TTS_NAME, null) { + companion object { + private const val NAME = "AscendEX (Bitmax)" + private const val TTS_NAME = "AscendEx" + private const val URL = "https://ascendex.com/api/pro/v1/ticker?symbol=%1\$s" + private const val URL_CURRENCY_PAIRS = "https://ascendex.com/api/pro/v1/products" + } + + override fun getCurrencyPairsUrl(requestId: Int): String { + return URL_CURRENCY_PAIRS + } + + override fun parseCurrencyPairsFromJsonObject(requestId: Int, jsonObject: JSONObject, pairs: MutableList) { + jsonObject.getJSONArray("data").forEachJSONObject { market -> + if(market.getString("status") == "Normal") { + + val symbol = market.getString("symbol") + val baseAsset = if(symbol.endsWith("-PERP")) symbol else market.getString("baseAsset") + + pairs.add(CurrencyPairInfo( + baseAsset, + market.getString("quoteAsset"), + symbol + )) + } + } + } + + override fun getUrl(requestId: Int, checkerInfo: CheckerInfo): String { + return String.format(URL, checkerInfo.currencyPairId) + } + + override fun parseTickerFromJsonObject(requestId: Int, jsonObject: JSONObject, ticker: Ticker, checkerInfo: CheckerInfo) { + jsonObject.getJSONObject("data").let { + ticker.high = it.getDouble("high") + ticker.low = it.getDouble("low") + ticker.last = it.getDouble("close") + ticker.vol = it.getDouble("volume") + + it.getJSONArray("bid").let { bids -> + if(bids.length() == 2) ticker.bid = bids.getDouble(0) + } + it.getJSONArray("ask").let { asks -> + if(asks.length() == 2) ticker.ask = asks.getDouble(0) + } + } + } +} \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/BigONE.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/BigONE.kt new file mode 100644 index 00000000..2cbe547c --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/BigONE.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.CurrencyPairInfo +import com.aneonex.bitcoinchecker.datamodule.model.Ticker +import com.aneonex.bitcoinchecker.datamodule.model.market.generic.SimpleMarket +import com.aneonex.bitcoinchecker.datamodule.util.forEachJSONObject +import org.json.JSONObject + +class BigONE : SimpleMarket( + "BigONE", + "https://big.one/api/v3/asset_pairs", + "https://big.one/api/v3/asset_pairs/%1\$s/ticker", + "Big One" + ) { + + override fun parseCurrencyPairsFromJsonObject(requestId: Int, jsonObject: JSONObject, pairs: MutableList) { + jsonObject.getJSONArray("data").forEachJSONObject { market -> + pairs.add(CurrencyPairInfo( + market.getJSONObject("base_asset").getString("symbol"), + market.getJSONObject("quote_asset").getString("symbol"), + market.getString("name") + )) + } + } + + override fun parseTickerFromJsonObject(requestId: Int, jsonObject: JSONObject, ticker: Ticker, checkerInfo: CheckerInfo) { + jsonObject + .getJSONObject("data") + .let { + ticker.last = it.getDouble("close") + ticker.high = it.getDouble("high") + ticker.low = it.getDouble("low") + ticker.vol = it.getDouble("volume") + + ticker.bid = it.getJSONObject("bid").getDouble("price") + ticker.ask = it.getJSONObject("ask").getDouble("price") + } + } +} \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Biki.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Biki.kt new file mode 100644 index 00000000..d2ffd817 --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Biki.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 com.aneonex.bitcoinchecker.datamodule.util.forEachJSONObject +import org.json.JSONObject + +class Biki : Market(NAME, TTS_NAME, null) { + companion object { + private const val NAME = "BiKi" + private const val TTS_NAME = NAME + private const val URL = "https://openapi.biki.cc/open/api/get_ticker?symbol=%1\$s" + private const val URL_CURRENCY_PAIRS = "https://openapi.biki.cc/open/api/common/symbols" + } + + override fun getCurrencyPairsUrl(requestId: Int): String { + return URL_CURRENCY_PAIRS + } + + override fun parseCurrencyPairsFromJsonObject(requestId: Int, jsonObject: JSONObject, pairs: MutableList) { + jsonObject.getJSONArray("data").forEachJSONObject { market-> + pairs.add( CurrencyPairInfo( + market.getString("base_coin"), + market.getString("count_coin"), + market.getString("symbol") + )) + } + } + + override fun getUrl(requestId: Int, checkerInfo: CheckerInfo): String { + return String.format(URL, checkerInfo.currencyPairId) + } + + override fun parseTickerFromJsonObject(requestId: Int, jsonObject: JSONObject, ticker: Ticker, checkerInfo: CheckerInfo) { + jsonObject.getJSONObject("data").apply { + ticker.ask = getDouble("sell") + ticker.bid = getDouble("buy") + ticker.high = getDouble("high") + ticker.low = getDouble("low") + ticker.last = getDouble("last") + ticker.vol = getDouble("vol") + ticker.timestamp = getLong("time") + } + } +} \ 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..7ad0350f --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Binance.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.market.generic.SimpleMarket +import com.aneonex.bitcoinchecker.datamodule.util.forEachJSONObject +import org.json.JSONObject + +class Binance: BinanceBase("Binance", "com") +class BinanceUs: BinanceBase("Binance.US", "us") + +open class BinanceBase(name: String, domain: String) : SimpleMarket( + name, + "https://api.binance.$domain/api/v3/exchangeInfo", + "https://api.binance.$domain/api/v3/ticker/24hr?symbol=%1\$s" +) { + @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.volQuote = jsonObject.getDouble("quoteVolume") + + ticker.high = jsonObject.getDouble("highPrice") + ticker.low = jsonObject.getDouble("lowPrice") + + ticker.last = jsonObject.getDouble("lastPrice") + ticker.timestamp = jsonObject.getLong("closeTime") + } + + @Throws(Exception::class) + override fun parseCurrencyPairsFromJsonObject(requestId: Int, jsonObject: JSONObject, pairs: MutableList) { + jsonObject.getJSONArray("symbols").forEachJSONObject { marketJsonObject -> + if (marketJsonObject.getString("status") != "TRADING") { + return@forEachJSONObject + } + + val symbol = marketJsonObject.getString("symbol") + val baseAsset = marketJsonObject.getString("baseAsset") + val quoteAsset = marketJsonObject.getString("quoteAsset") + pairs.add( + CurrencyPairInfo( + baseAsset, + quoteAsset, + symbol + ) + ) + } + } +} \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/BinanceFutures.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/BinanceFutures.kt new file mode 100644 index 00000000..75fe5f80 --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/BinanceFutures.kt @@ -0,0 +1,111 @@ +package com.aneonex.bitcoinchecker.datamodule.model.market + +import com.aneonex.bitcoinchecker.datamodule.model.* +import com.aneonex.bitcoinchecker.datamodule.util.forEachJSONObject +import org.json.JSONArray +import org.json.JSONObject +import java.time.format.DateTimeFormatter +import java.util.* + +class BinanceFutures : Market(NAME, TTS_NAME, null) { + companion object { + private const val NAME = "Binance Futures" + private const val TTS_NAME = NAME + + private const val URL_USD_M = "https://fapi.binance.com/fapi/v1/ticker/24hr?symbol=%1\$s" + private const val URL_CURRENCY_PAIRS_USD_M = "https://fapi.binance.com/fapi/v1/exchangeInfo" + + private const val URL_COIN_M = "https://dapi.binance.com/dapi/v1/ticker/24hr?symbol=%1\$s" + private const val URL_CURRENCY_PAIRS_COIN_M = "https://dapi.binance.com/dapi/v1/exchangeInfo" + + private const val COIN_M_PREFIX = "2:" + + private fun isCoinMPair(pairId: String) = pairId.startsWith(COIN_M_PREFIX) + + private val FUTURES_DATE_FORMAT = DateTimeFormatter.ofPattern("yyMMdd", Locale.ROOT) + + private fun parseTicker(jsonObject: JSONObject, ticker: Ticker) { + jsonObject.apply { + ticker.vol = getDouble("volume") + ticker.high = getDouble("highPrice") + ticker.low = getDouble("lowPrice") + ticker.last = getDouble("lastPrice") + ticker.timestamp = getLong("closeTime") + + // Optional + ticker.volQuote = optDouble("quoteVolume", ticker.volQuote) + } + } + } + + override fun getUrl(requestId: Int, checkerInfo: CheckerInfo): String { + val utlTemplate: String + val pairId: String + + if(isCoinMPair(checkerInfo.currencyPairId!!)) { + pairId = checkerInfo.currencyPairId.substring(COIN_M_PREFIX.length) + // String.format(URL_COIN_M, pairId) + utlTemplate = URL_COIN_M + } + else { +// String.format(URL_USD_M, checkerInfo.currencyPairId) + pairId = checkerInfo.currencyPairId + utlTemplate = URL_USD_M + } + + val deliveryDate = FuturesContractType.getDeliveryDate(checkerInfo.contractType) ?: + return String.format(utlTemplate, pairId) + + val pairIdWithDeliveryDate = "${checkerInfo.currencyBase}${checkerInfo.currencyCounter}_${FUTURES_DATE_FORMAT.format(deliveryDate)}" + return String.format(utlTemplate, pairIdWithDeliveryDate) + } + + override fun parseTicker( + requestId: Int, + responseString: String, + ticker: Ticker, + checkerInfo: CheckerInfo + ) { + if(isCoinMPair(checkerInfo.currencyPairId!!)) + parseTicker(JSONArray(responseString).getJSONObject(0), ticker) + else + parseTicker(JSONObject(responseString), ticker) + } + + override val currencyPairsNumOfRequests: Int + get() = 2 + + override fun getCurrencyPairsUrl(requestId: Int): String = + if(requestId == 0) URL_CURRENCY_PAIRS_USD_M else URL_CURRENCY_PAIRS_COIN_M + + @Throws(Exception::class) + override fun parseCurrencyPairsFromJsonObject(requestId: Int, jsonObject: JSONObject, pairs: MutableList) { + fun parseContractType(value: String): FuturesContractType? = + when(value) { + "PERPETUAL" -> FuturesContractType.PERPETUAL + "CURRENT_QUARTER" -> FuturesContractType.QUARTERLY + "NEXT_QUARTER" -> FuturesContractType.BIQUARTERLY + else -> null + } + + jsonObject.getJSONArray("symbols").forEachJSONObject { marketJsonObject -> + // Tha app UI supports only perpetual futures + val contractType = parseContractType(marketJsonObject.getString("contractType")) + ?: return@forEachJSONObject + //if(marketJsonObject.getString("contractType") != "PERPETUAL") + // return@forEachJSONObject + + val symbol = marketJsonObject.getString("symbol").let { + if(requestId > 0) COIN_M_PREFIX + it else it + } + val baseAsset = marketJsonObject.getString("baseAsset") + val quoteAsset = marketJsonObject.getString("quoteAsset") + + pairs.add(CurrencyPairInfo( + baseAsset, + quoteAsset, + symbol, + contractType)) + } + } +} \ 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..c626d6eb --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/BitBay.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 BitBay : Market(NAME, TTS_NAME, null) { + 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 const val URL_CURRENCY_PAIRS = "https://api.bitbay.net/rest/trading/ticker" + } + + override fun getCurrencyPairsUrl(requestId: Int): String { + return URL_CURRENCY_PAIRS + } + + override fun parseCurrencyPairsFromJsonObject(requestId: Int, jsonObject: JSONObject, pairs: MutableList) { + val itemsJson = jsonObject.getJSONObject("items") + itemsJson.keys().forEach { + val coins = it.split('-') + if(coins.size == 2){ + pairs.add( CurrencyPairInfo( + coins[0], // base + coins[1], // quote + 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") + 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/BitCambio.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/BitCambio.kt new file mode 100644 index 00000000..b5aebcbc --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/BitCambio.kt @@ -0,0 +1,54 @@ +/** + * Author: Jorge Pereira + * Date: Fri Feb 12 20:33:40 -03 2021 + * Desc: BitCambio market + */ + 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.forEachJSONObject +import org.json.JSONObject + +class BitCambio : Market(NAME, TTS_NAME, null) { + companion object { + private const val NAME = "BitCambio" + private const val TTS_NAME = "BitCambio Trade" + private const val URL = "https://nova.bitcambio.com.br/api/v3/public/getmarketsummary?market=%1\$s" + private const val URL_CURRENCY_PAIRS = "https://nova.bitcambio.com.br/api/v3/public/getmarkets" + } + + override fun getCurrencyPairsUrl(requestId: Int): String { + return URL_CURRENCY_PAIRS + } + + override fun parseCurrencyPairsFromJsonObject(requestId: Int, jsonObject: JSONObject, pairs: MutableList) { + jsonObject.getJSONArray("result").forEachJSONObject { market -> + if(market.getBoolean("IsActive")){ + pairs.add( CurrencyPairInfo( + market.getString("MarketAsset"), + market.getString("BaseAsset"), + market.getString("MarketName") + )) + } + } + } + + override fun getUrl(requestId: Int, checkerInfo: CheckerInfo): String { + val pairId: String = checkerInfo.currencyPairId ?: "${checkerInfo.currencyBase}_${checkerInfo.currencyCounter}" + return String.format(URL, pairId) + } + + @Throws(Exception::class) + override fun parseTickerFromJsonObject(requestId: Int, jsonObject: JSONObject, ticker: Ticker, checkerInfo: CheckerInfo) { + val resultJsonObject = jsonObject.getJSONObject("result") + ticker.ask = resultJsonObject.getDouble("Ask") + ticker.bid = resultJsonObject.getDouble("Bid") + ticker.last = resultJsonObject.getDouble("Last") + ticker.vol = resultJsonObject.getDouble("Volume") + ticker.high = resultJsonObject.getDouble("High") + ticker.low = resultJsonObject.getDouble("Low") + } +} 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..b02dcf80 --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/BitFlyer.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 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(Currency.JPY, VirtualCurrency.BTC) + CURRENCY_PAIRS[VirtualCurrency.XRP] = arrayOf(Currency.JPY) + CURRENCY_PAIRS["MONA"] = arrayOf(Currency.JPY) + CURRENCY_PAIRS[VirtualCurrency.BCH] = 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/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..494f6c2d --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/BitMEX.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.util.TimeUtils +import com.aneonex.bitcoinchecker.datamodule.util.forEachJSONObject +import org.json.JSONArray +import org.json.JSONObject + +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 fun getDisplaySymbol(internalSymbol: String): String { + return when(internalSymbol) { + "XBT" -> "BTC" + else -> internalSymbol + } + } + } + + 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 = TimeUtils.convertISODateToTimestamp(jsonObject.getString("timestamp")) + } + + // ==================== + // 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) { + JSONArray(responseString).forEachJSONObject { instrument -> + parseCurrencyPairsFromJsonObject(requestId, instrument, 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(getDisplaySymbol(base), getDisplaySymbol(quote), id)) + } +} \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/BitMart.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/BitMart.kt new file mode 100644 index 00000000..70084f5b --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/BitMart.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.Ticker +import com.aneonex.bitcoinchecker.datamodule.model.market.generic.SimpleMarket +import org.json.JSONObject + +class BitMart : SimpleMarket( + "BitMart", + "https://api-cloud.bitmart.com/spot/v1/symbols", + "https://api-cloud.bitmart.com/spot/v1/ticker?symbol=%1\$s" + ) { + + override fun parseCurrencyPairsFromJsonObject(requestId: Int, jsonObject: JSONObject, pairs: MutableList) { + val markets = jsonObject.getJSONObject("data").getJSONArray("symbols") + + for (i in 0 until markets.length()) { + val market = markets.getString(i) + + val assets = market.split('_') + if(assets.size != 2) continue + + pairs.add(CurrencyPairInfo( + assets[0], // Base currency + assets[1], // Quote currency + market + )) + } + } + + override fun parseTickerFromJsonObject(requestId: Int, jsonObject: JSONObject, ticker: Ticker, checkerInfo: CheckerInfo) { + jsonObject + .getJSONObject("data") + .getJSONArray("tickers") + .getJSONObject(0) + .let { + ticker.last = it.getDouble("last_price") + ticker.high = it.getDouble("high_24h") + ticker.low = it.getDouble("low_24h") + ticker.vol = it.getDouble("base_volume_24h") + + ticker.bid = it.getDouble("best_bid") + ticker.ask = it.getDouble("best_ask") + } + } +} \ 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/BitPay.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/BitPay.kt new file mode 100644 index 00000000..b5dda00f --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/BitPay.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.util.forEachJSONObject +import org.json.JSONArray +import org.json.JSONObject + +class BitPay : Market(NAME, TTS_NAME, null) { + companion object { + private const val NAME = "BitPay" + private const val TTS_NAME = "Bit Pay" + private const val URL = "https://bitpay.com/api/rates/%1\$s/%2\$s" + private const val URL_CURRENCY_PAIRS = "https://bitpay.com/api/rates/%1\$s" + + private val supportedBaseCurrencies = arrayOf("BTC", "ETH", "XRP", "BCH") + } + + override val currencyPairsNumOfRequests: Int + get() = supportedBaseCurrencies.size + + override fun getCurrencyPairsUrl(requestId: Int): String { + return String.format(URL_CURRENCY_PAIRS, supportedBaseCurrencies[requestId]) + } + + override fun parseCurrencyPairs(requestId: Int, responseString: String, pairs: MutableList) { + val baseCurrency = supportedBaseCurrencies[requestId] + + JSONArray(responseString).forEachJSONObject { quoteCurrencyJson -> + val quoteCurrency = quoteCurrencyJson.getString("code") + if(quoteCurrency != baseCurrency){ + pairs.add( CurrencyPairInfo( + baseCurrency, + quoteCurrency, + null + )) + } + } + } + + override fun getUrl(requestId: Int, checkerInfo: CheckerInfo): String { + return String.format(URL, checkerInfo.currencyBase, checkerInfo.currencyCounter) + } + + override fun parseTickerFromJsonObject(requestId: Int, jsonObject: JSONObject, ticker: Ticker, checkerInfo: CheckerInfo) { + ticker.last = jsonObject.getDouble("rate") + } +} \ 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..982fdc85 --- /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/BitZ.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/BitZ.kt new file mode 100644 index 00000000..483f1caa --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/BitZ.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 BitZ : Market(NAME, TTS_NAME, null) { + companion object { + private const val NAME = "BitZ" + private const val TTS_NAME = NAME + private const val URL = "https://apiv2.bitz.com/Market/ticker?symbol=%1\$s" + private const val URL_CURRENCY_PAIRS = "https://apiv2.bitz.com/Market/symbolList" + } + + override fun getCurrencyPairsUrl(requestId: Int): String { + return URL_CURRENCY_PAIRS + } + + override fun parseCurrencyPairsFromJsonObject(requestId: Int, jsonObject: JSONObject, pairs: MutableList) { + val marketsJson = jsonObject.getJSONObject("data") + + marketsJson.keys().forEach { + val market = marketsJson.getJSONObject(it) + pairs.add( CurrencyPairInfo( + market.getString("coinFrom").uppercase(Locale.ROOT), + market.getString("coinTo").uppercase(Locale.ROOT), + market.getString("name"), + )) + } + } + + override fun getUrl(requestId: Int, checkerInfo: CheckerInfo): String { + return String.format(URL, checkerInfo.currencyPairId) + } + + override fun parseTickerFromJsonObject(requestId: Int, jsonObject: JSONObject, ticker: Ticker, checkerInfo: CheckerInfo) { + jsonObject.getJSONObject("data").apply { + ticker.ask = getDouble("askPrice") + ticker.bid = getDouble("bidPrice") + ticker.high = getDouble("high") + ticker.low = getDouble("low") + ticker.last = getDouble("now") + ticker.vol = getDouble("volume") + } + ticker.timestamp = jsonObject.getLong("time") + } +} \ 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..2d57b080 --- /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].uppercase(Locale.ENGLISH) + val currencyCounter = currencies[1].uppercase(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..5b2a8d76 --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/BitcoinToYou.kt @@ -0,0 +1,77 @@ +package com.aneonex.bitcoinchecker.datamodule.model.market + +import com.aneonex.bitcoinchecker.datamodule.exceptions.MarketParseException +import com.aneonex.bitcoinchecker.datamodule.model.CheckerInfo +import com.aneonex.bitcoinchecker.datamodule.model.CurrencyPairInfo +import com.aneonex.bitcoinchecker.datamodule.model.Ticker +import com.aneonex.bitcoinchecker.datamodule.model.market.generic.SimpleMarket +import com.aneonex.bitcoinchecker.datamodule.util.forEachJSONObject +import org.json.JSONArray +import org.json.JSONObject + +class BitcoinToYou : SimpleMarket( + "BitcoinToYou", + "https://back.bitcointoyou.com/api/v2/pair/getPairList", + "https://back.bitcointoyou.com/api/v2/ticker?pair=%1\$s", + "Bitcoin To You" +) { + + override fun getPairId(checkerInfo: CheckerInfo): String? { + return if (checkerInfo.currencyPairId == null) + with(checkerInfo) { "${currencyBase}_${currencyCounter}C" } + else + super.getPairId(checkerInfo) + } + + override fun parseCurrencyPairs( + requestId: Int, + responseString: String, + pairs: MutableList + ) { + fun getDisplaySymbol(symbolString: String): String { + @Suppress("SpellCheckingInspection") + return when(symbolString){ + "CBRL" -> "BRL" + "BRLC" -> "BRL" + else -> symbolString + } + } + + val data = JSONArray(responseString) + data.forEachJSONObject { + val symbol = it.getString("symbol") + val assets = symbol.split('_') + if(assets.size == 2) { + pairs.add( + CurrencyPairInfo( + getDisplaySymbol(assets[0]), + getDisplaySymbol(assets[1]), + symbol + ) + ) + } + } + } + + @Throws(Exception::class) + override fun parseTickerFromJsonObject(requestId: Int, jsonObject: JSONObject, ticker: Ticker, checkerInfo: CheckerInfo) { + jsonObject.getJSONObject("summary").also { data -> + ticker.vol = data.getDouble("amount") + if(ticker.vol <= 0) + throw MarketParseException("No trading volume") + + ticker.volQuote = data.getDouble("quote_volume") + ticker.high = data.getDouble("high") + ticker.low = data.getDouble("low") + ticker.last = data.getDouble("last") + } + } + + override fun parseErrorFromJsonObject( + requestId: Int, + jsonObject: JSONObject, + checkerInfo: CheckerInfo? + ): String? { + return jsonObject.getJSONObject("data").getString("message") + } +} \ 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..b87e5257 --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/BitcoinVenezuela.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.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.forEachString +import org.json.JSONObject + +class BitcoinVenezuela : Market(NAME, TTS_NAME, 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/" + } + + 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.XMR, jsonObject, pairs) + parseCurrencyPairsFromCurrencyBase(VirtualCurrency.ETH, jsonObject, pairs) + } + + @Throws(Exception::class) + private fun parseCurrencyPairsFromCurrencyBase(currencyBase: String, jsonObject: JSONObject, pairs: MutableList) { + if (!jsonObject.has(currencyBase)) return + jsonObject.getJSONObject(currencyBase).names()!!.forEachString { quoteCurrencyName -> + pairs.add( + CurrencyPairInfo( + currencyBase, + quoteCurrencyName, + null + ) + ) + } + } +} \ 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..d0c8bbb1 --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Bitfinex.kt @@ -0,0 +1,107 @@ +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.forEachJSONArray +import com.aneonex.bitcoinchecker.datamodule.util.forEachString +import org.json.JSONArray +import java.util.* + +class Bitfinex : Market(NAME, TTS_NAME, null) { + 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_SYMBOLS = "https://api-pub.bitfinex.com/v2/conf/pub:map:currency:sym" + private const val URL_CURRENCY_PAIRS = "https://api-pub.bitfinex.com/v2/conf/pub:list:pair:exchange" + } + + private val symbolsMap = mutableMapOf() + + override val currencyPairsNumOfRequests: Int + get() = 2 // 1) symbol map, 2) pairs + + 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.uppercase(Locale.ROOT), + checkerInfo.currencyCounter.uppercase(Locale.ROOT) + ) + } + return String.format(URL, pairId) + } + + @Throws(Exception::class) + override fun parseTicker(requestId: Int, responseString: String, ticker: Ticker, checkerInfo: CheckerInfo) { + // Ticker array format: https://docs.bitfinex.com/reference#rest-public-ticker + // [ BID, BID_SIZE, ASK, ASK_SIZE, DAILY_CHANGE, DAILY_CHANGE_RELATIVE, LAST_PRICE, VOLUME, HIGH, LOW ], + + 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 = + if (requestId == 0) URL_CURRENCY_SYMBOLS else URL_CURRENCY_PAIRS + + override fun parseCurrencyPairs(requestId: Int, responseString: String, pairs: MutableList) { + val dataArray = JSONArray(responseString) + + // Get symbols map + if(requestId == 0) { + symbolsMap.clear() + + if(dataArray.length() > 0){ + dataArray.getJSONArray(0).also { currencyArray -> + currencyArray.forEachJSONArray{ codeToSymbol -> + symbolsMap[codeToSymbol.getString(0)] = codeToSymbol.getString(1) + } + } + } + } + // Get pairs + else { + fun getCurrencyDisplayName(currencyCode: String) = symbolsMap[currencyCode] ?: currencyCode + + val pairsArray = dataArray.getJSONArray(0) + pairsArray.forEachString { pairId -> + val currencyBase: String + val currencyCounter: String + + val splitPair = pairId.split(':') + if (splitPair.size == 2) { + // pairId example "LINK:USD" + currencyBase = getCurrencyDisplayName(splitPair[0]) + currencyCounter = getCurrencyDisplayName(splitPair[1]) + } else { + if (pairId.length != 6) return@forEachString + // pairId example "BTCUSD" + currencyBase = getCurrencyDisplayName(pairId.substring(0, 3)) + currencyCounter = getCurrencyDisplayName(pairId.substring(3)) + } + + pairs.add( + CurrencyPairInfo( + currencyBase, + currencyCounter, + "t$pairId" + ) + ) + } + + // Clear cache + symbolsMap.clear() + } + } +} \ 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..d3c52b64 --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Bithumb.kt @@ -0,0 +1,102 @@ +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 { + val marketAll = arrayOf(Currency.KRW, VirtualCurrency.BTC) + val marketKrw = arrayOf(Currency.KRW) + val marketBtc = arrayOf(VirtualCurrency.BTC) + + CURRENCY_PAIRS[VirtualCurrency.BTC] = marketKrw + CURRENCY_PAIRS[VirtualCurrency.ETH] = marketAll + CURRENCY_PAIRS[VirtualCurrency.ETC] = marketAll + CURRENCY_PAIRS[VirtualCurrency.LTC] = marketAll + CURRENCY_PAIRS[VirtualCurrency.XRP] = marketAll + CURRENCY_PAIRS[VirtualCurrency.BCH] = marketAll + CURRENCY_PAIRS[VirtualCurrency.DOGE] = marketAll + CURRENCY_PAIRS[VirtualCurrency.SOL] = marketAll + + CURRENCY_PAIRS[VirtualCurrency.QTUM] = marketKrw + CURRENCY_PAIRS[VirtualCurrency.CON] = marketKrw + CURRENCY_PAIRS[VirtualCurrency.TRX] = marketKrw + + CURRENCY_PAIRS["LN"] = marketBtc + CURRENCY_PAIRS["IBP"] = marketBtc + CURRENCY_PAIRS["BFC"] = marketAll + + CURRENCY_PAIRS[VirtualCurrency.EOS] = marketAll + CURRENCY_PAIRS[VirtualCurrency.LINK] = marketKrw + + CURRENCY_PAIRS["WEMIX"] = marketKrw + CURRENCY_PAIRS["BORA"] = marketKrw + CURRENCY_PAIRS["ASM"] = marketKrw + CURRENCY_PAIRS["SAND"] = marketKrw + CURRENCY_PAIRS["MANA"] = marketKrw + CURRENCY_PAIRS["YFI"] = marketKrw + CURRENCY_PAIRS["DVI"] = marketKrw + CURRENCY_PAIRS["ETC"] = marketKrw + CURRENCY_PAIRS["DOT"] = marketKrw + CURRENCY_PAIRS["LUNA"] = marketKrw + } + } + + override fun getNumOfRequests(checkerInfo: CheckerInfo?): Int { + return 2 + } + + override fun getUrl(requestId: Int, checkerInfo: CheckerInfo): String { + val pairId = "${checkerInfo.currencyBaseLowerCase}_${checkerInfo.currencyCounterLowerCase}" + + return if (requestId == 0) { + String.format(URL_TICKER, pairId) + } else { + String.format(URL_ORDERS, pairId) + } + } + + @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/Bitkub.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Bitkub.kt new file mode 100644 index 00000000..7f7f02dc --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Bitkub.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.Ticker +import com.aneonex.bitcoinchecker.datamodule.model.market.generic.SimpleMarket +import com.aneonex.bitcoinchecker.datamodule.util.forEachJSONObject +import org.json.JSONObject + +class Bitkub : SimpleMarket( + "Bitkub", + "https://api.bitkub.com/api/market/symbols", + "https://api.bitkub.com/api/market/ticker?sym=%1\$s" + ) { + + override fun parseCurrencyPairsFromJsonObject(requestId: Int, jsonObject: JSONObject, pairs: MutableList) { + jsonObject.getJSONArray("result").forEachJSONObject { market -> + val symbol = market.getString("symbol") + val assets = symbol.split('_') + if(assets.size == 2) { + pairs.add( + CurrencyPairInfo( + assets[1], + assets[0], + symbol + ) + ) + } + } + } + + override fun parseTickerFromJsonObject(requestId: Int, jsonObject: JSONObject, ticker: Ticker, checkerInfo: CheckerInfo) { + jsonObject + .getJSONObject(checkerInfo.currencyPairId!!) + .let { + ticker.last = it.getDouble("last") + + ticker.high = it.getDouble("high24hr") + ticker.low = it.getDouble("low24hr") + + ticker.vol = it.getDouble("baseVolume") + ticker.volQuote = it.getDouble("quoteVolume") + + ticker.bid = it.getDouble("highestBid") + ticker.ask = it.getDouble("lowestAsk") + } + } +} \ 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 new file mode 100644 index 00000000..951c79aa --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/BitoPro.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 +import java.util.* + +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://api.bitopro.com/v3/tickers/%1\$s" + 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 + pairs.add( + CurrencyPairInfo( + pairJson.getString("base").uppercase(Locale.ROOT), + pairJson.getString("quote").uppercase(Locale.ROOT), + pairJson.getString("pair") + ) + ) + } + } + + 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 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/BitpandaPro.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/BitpandaPro.kt new file mode 100644 index 00000000..8f330d5f --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/BitpandaPro.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.TimeUtils +import org.json.JSONArray +import org.json.JSONObject + +class BitpandaPro : Market(NAME, TTS_NAME, null) { + companion object { + private const val NAME = "Bitpanda Pro" + private const val TTS_NAME = "Bit panda pro" + private const val URL = "https://api.exchange.bitpanda.com/public/v1/market-ticker/%1\$s" + private const val URL_CURRENCY_PAIRS = "https://api.exchange.bitpanda.com/public/v1/market-ticker" + } + + override fun getCurrencyPairsUrl(requestId: Int): String { + return URL_CURRENCY_PAIRS + } + + override fun parseCurrencyPairs(requestId: Int, responseString: String, pairs: MutableList) { + val marketsJson = JSONArray(responseString) + for (i in 0 until marketsJson.length()) { + val market = marketsJson.getJSONObject(i) + + val pairId = market.getString("instrument_code") + val assets = pairId.split('_') + + if(assets.size != 2) + continue + + pairs.add( + CurrencyPairInfo( + assets[0], // Base + assets[1], // Quoting + pairId + ) + ) + } + } + + override fun getUrl(requestId: Int, checkerInfo: CheckerInfo): String { + return String.format(URL, checkerInfo.currencyPairId) + } + + override fun parseTickerFromJsonObject(requestId: Int, jsonObject: JSONObject, ticker: Ticker, checkerInfo: CheckerInfo) { + jsonObject.apply { + ticker.bid = getDouble("best_bid") + ticker.ask = getDouble("best_ask") + ticker.high = getDouble("high") + ticker.low = getDouble("low") + ticker.last = getDouble("last_price") + ticker.vol = getDouble("base_volume") + ticker.timestamp = TimeUtils.convertISODateToTimestamp(getString("time")) + } + } +} \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Bitrue.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Bitrue.kt new file mode 100644 index 00000000..fe064da9 --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Bitrue.kt @@ -0,0 +1,61 @@ +package com.aneonex.bitcoinchecker.datamodule.model.market + +import com.aneonex.bitcoinchecker.datamodule.exceptions.MarketParseException +import com.aneonex.bitcoinchecker.datamodule.model.CheckerInfo +import com.aneonex.bitcoinchecker.datamodule.model.CurrencyPairInfo +import com.aneonex.bitcoinchecker.datamodule.model.Ticker +import com.aneonex.bitcoinchecker.datamodule.model.market.generic.SimpleMarket +import com.aneonex.bitcoinchecker.datamodule.util.forEachJSONObject +import org.json.JSONArray +import org.json.JSONObject + +class Bitrue : SimpleMarket( + "Bitrue", + "https://openapi.bitrue.com/api/v1/exchangeInfo", + "https://openapi.bitrue.com/api/v1/ticker/24hr?symbol=%1\$s" + ) { + + override fun parseCurrencyPairsFromJsonObject(requestId: Int, jsonObject: JSONObject, pairs: MutableList) { + jsonObject + .getJSONArray("symbols") + .forEachJSONObject { market -> + if(market.getString("status") == "TRADING") { + pairs.add( + CurrencyPairInfo( + market.getString("baseAsset").uppercase(), + market.getString("quoteAsset").uppercase(), + market.getString("symbol") + ) + ) + } + } + } + + override fun parseTicker( + requestId: Int, + responseString: String, + ticker: Ticker, + checkerInfo: CheckerInfo + ) { + val jsonObject = JSONArray(responseString).let { + if(it.length() != 1) + throw MarketParseException("No data") + + it.getJSONObject(0) + } + + jsonObject + .also { + ticker.last = it.getDouble("lastPrice") + + ticker.high = it.getDouble("highPrice") + ticker.low = it.getDouble("lowPrice") + + // ticker.vol = it.getDouble("volume") // Returns same as quoteVolume (exchange bug?) + ticker.volQuote = it.getDouble("quoteVolume") + + ticker.bid = it.optDouble("bidPrice", ticker.bid) + ticker.ask = it.optDouble("askPrice", ticker.ask) + } + } +} \ 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..6d9d202d --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Bitso.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 com.aneonex.bitcoinchecker.datamodule.util.TimeUtils +import com.aneonex.bitcoinchecker.datamodule.util.forEachJSONObject +import org.json.JSONObject +import java.util.* + +class Bitso : Market(NAME, TTS_NAME, null) { + companion object { + private const val NAME = "Bitso" + private const val TTS_NAME = NAME + private const val URL = "https://api.bitso.com/v3/ticker?book=%1\$s" + private const val URL_CURRENCY_PAIRS = "https://api.bitso.com/v3/available_books/" + } + + override fun getCurrencyPairsUrl(requestId: Int): String { + return URL_CURRENCY_PAIRS + } + + @Throws(Exception::class) + override fun parseCurrencyPairsFromJsonObject(requestId: Int, jsonObject: JSONObject, pairs: MutableList) { + jsonObject.getJSONArray("payload").forEachJSONObject { books -> + val pairId = books.getString("book") + val currencies = pairId.split("_".toRegex()).toTypedArray() + if (currencies.size != 2) return@forEachJSONObject + pairs.add( + CurrencyPairInfo( + currencies[0].uppercase(Locale.ROOT), + currencies[1].uppercase(Locale.ROOT), + pairId + )) + } + } + + override fun getUrl(requestId: Int, checkerInfo: CheckerInfo): String { + // Compatibility with previous version + val pairId: String = checkerInfo.currencyPairId ?: "${checkerInfo.currencyBaseLowerCase}_${checkerInfo.currencyCounterLowerCase}" + return String.format(URL, pairId) + } + + @Throws(Exception::class) + override fun parseTickerFromJsonObject(requestId: Int, jsonObject: JSONObject, ticker: Ticker, checkerInfo: CheckerInfo) { + jsonObject.getJSONObject("payload").let { + ticker.high = it.getDouble("high") + ticker.low = it.getDouble("low") + + ticker.bid = it.getDouble("bid") + ticker.ask = it.getDouble("ask") + + ticker.vol = it.getDouble("volume") + ticker.last = it.getDouble("last") + + ticker.timestamp = TimeUtils.convertISODateToTimestamp(it.getString("created_at")) + } + } + + @Throws(Exception::class) + override fun parseErrorFromJsonObject(requestId: Int, jsonObject: JSONObject, checkerInfo: CheckerInfo?): String? { + return jsonObject.getJSONObject("error").getString("message") + } +} \ 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..28a2408c --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Bitstamp.kt @@ -0,0 +1,107 @@ +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.forEachJSONObject +import org.json.JSONArray +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_TICKER = "https://www.bitstamp.net/api/v2/ticker/%1\$s" + private const val URL_CURRENCY_PAIRS = "https://www.bitstamp.net/api/v2/trading-pairs-info/" + + 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 getCurrencyPairsUrl(requestId: Int): String { + return URL_CURRENCY_PAIRS + } + + override fun parseCurrencyPairs(requestId: Int, responseString: String, pairs: MutableList) { + JSONArray(responseString).forEachJSONObject { market -> + if(market.getString("trading") == "Enabled") { + val assetsInPair = market.getString("name").split('/') + if (assetsInPair.size == 2) { + pairs.add( + CurrencyPairInfo( + assetsInPair[0], // base + assetsInPair[1], // quote + market.getString("url_symbol") + ) + ) + } + } + } + } + + override fun getUrl(requestId: Int, checkerInfo: CheckerInfo): String { + // Compatibility with old pairs + val pairId = checkerInfo.currencyPairId ?: (checkerInfo.currencyBaseLowerCase + checkerInfo.currencyCounterLowerCase) + return String.format(URL_TICKER, pairId) + } + + @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/Bittrex.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Bittrex.kt new file mode 100644 index 00000000..317d07ea --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Bittrex.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 com.aneonex.bitcoinchecker.datamodule.util.forEachJSONObject +import org.json.JSONObject + +class Bittrex : Market(NAME, TTS_NAME, null) { + companion object { + private const val NAME = "Bittrex" + private const val TTS_NAME = NAME + 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" + } + + 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) { + jsonObject.getJSONArray("result").forEachJSONObject { marketJsonObject -> + pairs.add(CurrencyPairInfo( + marketJsonObject.getString("MarketCurrency"), // reversed + marketJsonObject.getString("BaseCurrency"), // reversed + marketJsonObject.getString("MarketName"))) + } + } +} \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Bitvavo.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Bitvavo.kt new file mode 100644 index 00000000..7fd6e779 --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Bitvavo.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.JSONArray +import org.json.JSONObject + +class Bitvavo : Market(NAME, TTS_NAME, null) { + companion object { + private const val NAME = "Bitvavo" + private const val TTS_NAME = NAME + private const val URL = "https://api.bitvavo.com/v2/ticker/24h?market=%1\$s" + private const val URL_CURRENCY_PAIRS = "https://api.bitvavo.com/v2/markets" + } + + override fun getCurrencyPairsUrl(requestId: Int): String { + return URL_CURRENCY_PAIRS + } + + override fun parseCurrencyPairs(requestId: Int, responseString: String, pairs: MutableList) { + val markets = JSONArray(responseString) + for(i in 0 until markets.length()){ + val market = markets.getJSONObject(i) + if(market.getString("status") == "trading") { + pairs.add(CurrencyPairInfo( + market.getString("base"), + market.getString("quote"), + market.getString("market") + )) + } + } + } + + override fun getUrl(requestId: Int, checkerInfo: CheckerInfo): String { + return String.format(URL, checkerInfo.currencyPairId) + } + + override fun parseTickerFromJsonObject(requestId: Int, jsonObject: JSONObject, ticker: Ticker, checkerInfo: CheckerInfo) { + jsonObject.apply { + ticker.ask = getDouble("ask") + ticker.bid = getDouble("bid") + ticker.high = getDouble("high") + ticker.low = getDouble("low") + ticker.last = getDouble("last") + ticker.vol = getDouble("volume") + ticker.timestamp = getLong("timestamp") + } + } +} \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Bkex.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Bkex.kt new file mode 100644 index 00000000..fbcd20a1 --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Bkex.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.Ticker +import com.aneonex.bitcoinchecker.datamodule.model.market.generic.SimpleMarket +import org.json.JSONObject + +class Bkex : SimpleMarket( + "BKEX", + "https://api.bkex.com/v2/common/symbols", + "https://api.bkex.com/v2/q/tickers?symbol=%1\$s" +) { + override fun parseCurrencyPairsFromJsonObject(requestId: Int, jsonObject: JSONObject, pairs: MutableList) { + val markets = jsonObject.getJSONArray("data") + for(i in 0 until markets.length()){ + val market = markets.getJSONObject(i) + + if(!market.getBoolean("supportTrade")) + continue + + val pairId = market.getString("symbol") + + // Split pairs like BTC_USDT + val assets = pairId.split('_') + + if(assets.size != 2) + continue + + pairs.add( CurrencyPairInfo( + assets[0], + assets[1], + pairId, + )) + } + } + + override fun parseTickerFromJsonObject(requestId: Int, jsonObject: JSONObject, ticker: Ticker, checkerInfo: CheckerInfo) { + jsonObject + .getJSONArray("data") + .getJSONObject(0) + .also { + ticker.high = it.getDouble("high") + ticker.low = it.getDouble("low") + ticker.last = it.getDouble("close") + ticker.vol = it.getDouble("volume") + ticker.timestamp = it.getLong("ts") + } + } +} \ 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..d7efaa05 --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Bleutrade.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 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"] + val 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") + 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/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..bb8cb277 --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/BtcMarkets.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.Ticker +import com.aneonex.bitcoinchecker.datamodule.model.market.generic.SimpleMarket +import com.aneonex.bitcoinchecker.datamodule.util.TimeUtils +import com.aneonex.bitcoinchecker.datamodule.util.forEachJSONObject +import org.json.JSONArray +import org.json.JSONObject + +class BtcMarkets : SimpleMarket( + "BtcMarkets.net", + "https://api.btcmarkets.net/v3/markets", + "https://api.btcmarkets.net/v3/markets/%1\$s/ticker", + "BTC Markets net" +) { + override fun getPairId(checkerInfo: CheckerInfo): String { + // Compatibility with old app version + return checkerInfo.currencyPairId ?: "${checkerInfo.currencyBase}-${checkerInfo.currencyCounter}" + } + + override fun parseCurrencyPairs(requestId: Int, responseString: String, pairs: MutableList) { + JSONArray(responseString).forEachJSONObject { market -> + pairs.add(CurrencyPairInfo( + market.getString("baseAssetName"), + market.getString("quoteAssetName"), + market.getString("marketId") + )) + } + } + + @Throws(Exception::class) + override fun parseTickerFromJsonObject(requestId: Int, jsonObject: JSONObject, ticker: Ticker, checkerInfo: CheckerInfo) { + ticker.apply { + last = jsonObject.getDouble("lastPrice") + + bid = jsonObject.getDouble("bestBid") + ask = jsonObject.getDouble("bestAsk") + + low = jsonObject.getDouble("low24h") + high = jsonObject.getDouble("high24h") + + vol = jsonObject.getDouble("volume24h") + volQuote = jsonObject.getDouble("volumeQte24h") + + timestamp = TimeUtils.convertISODateToTimestamp(jsonObject.getString("timestamp")) + } + } +} 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..39e40231 --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Btcturk.kt @@ -0,0 +1,73 @@ +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 com.aneonex.bitcoinchecker.datamodule.util.TimeUtils +import com.aneonex.bitcoinchecker.datamodule.util.forEachJSONObject +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://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 { + CURRENCY_PAIRS[VirtualCurrency.BTC] = arrayOf( + Currency.TRY + ) + CURRENCY_PAIRS[VirtualCurrency.ETH] = arrayOf( + VirtualCurrency.BTC, + Currency.TRY + ) + } + } + + override fun getCurrencyPairsUrl(requestId: Int): String { + return URL_CURRENCY_PAIRS + } + + @Throws(Exception::class) + override fun parseCurrencyPairs(requestId: Int, responseString: String, pairs: MutableList) { + JSONObject(responseString).getJSONArray("data").forEachJSONObject { pairJson -> + pairs.add(CurrencyPairInfo( + pairJson.getString("numeratorSymbol"), + pairJson.getString("denominatorSymbol"), + pairJson.getString("pairNormalized") + ) + ) + } + } + + override fun getUrl(requestId: Int, checkerInfo: CheckerInfo): String { + 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 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/BudaCom.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/BudaCom.kt new file mode 100644 index 00000000..bcbc92c0 --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/BudaCom.kt @@ -0,0 +1,67 @@ +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 BudaCom : Market(NAME, TTS_NAME, CURRENCY_PAIRS) { + companion object { + private const val NAME = "Buda.com" + private const val TTS_NAME = NAME + private const val URL = "https://www.buda.com/api/v2/markets/%1\$s-%2\$s/ticker" + + private val CURRENCY_PAIRS: CurrencyPairsMap = CurrencyPairsMap() + + init { + CURRENCY_PAIRS[VirtualCurrency.BCH] = arrayOf( + VirtualCurrency.BTC, + Currency.ARS, + Currency.CLP, + Currency.COP, + Currency.PEN, + ) + CURRENCY_PAIRS[VirtualCurrency.BTC] = arrayOf( + Currency.ARS, + Currency.CLP, + Currency.COP, + Currency.PEN, + ) + CURRENCY_PAIRS[VirtualCurrency.ETH] = arrayOf( + VirtualCurrency.BTC, + Currency.ARS, + Currency.CLP, + Currency.COP, + Currency.PEN, + ) + CURRENCY_PAIRS[VirtualCurrency.LTC] = arrayOf( + VirtualCurrency.BTC, + Currency.ARS, + Currency.CLP, + Currency.COP, + Currency.PEN + ) + } + } + + 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 tickerJson = jsonObject.getJSONObject("ticker") + + fun getFieldValue(fieldName: String): Double { + return tickerJson.getJSONArray(fieldName).getDouble(0) + } + + ticker.last = getFieldValue("last_price") + ticker.ask = getFieldValue("min_ask") + ticker.bid = getFieldValue("max_bid") + ticker.vol = getFieldValue("volume") + } +} \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/BwCom.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/BwCom.kt new file mode 100644 index 00000000..572025e9 --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/BwCom.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.Ticker +import com.aneonex.bitcoinchecker.datamodule.model.market.generic.SimpleMarket +import org.json.JSONObject +import java.util.* + +class BwCom : SimpleMarket( + "BW.com", + "https://www.bw.com/exchange/config/controller/website/marketcontroller/getByWebId", + "https://www.bw.com/api/data/v1/ticker?marketId=%1\$s" + ) { + + override fun parseCurrencyPairsFromJsonObject(requestId: Int, jsonObject: JSONObject, pairs: MutableList) { + val markets = jsonObject.getJSONArray("datas") + for (i in 0 until markets.length()) { + val market = markets.getJSONObject(i) + + val assets = market.getString("name").uppercase(Locale.ROOT).split('_') + if (assets.size != 2) continue + + pairs.add( + CurrencyPairInfo( + assets[0], // Base currency + assets[1], // Quote currency + market.getString("marketId") + ) + ) + } + } + + override fun parseErrorFromJsonObject(requestId: Int, jsonObject: JSONObject, checkerInfo: CheckerInfo?): String? { + return jsonObject.getJSONObject("resMsg").getString("message") + } + + override fun parseTickerFromJsonObject(requestId: Int, jsonObject: JSONObject, ticker: Ticker, checkerInfo: CheckerInfo) { + jsonObject.getJSONArray("datas").let { + ticker.last = it.getDouble(1) + ticker.high = it.getDouble(2) + ticker.low = it.getDouble(3) + ticker.vol = it.getDouble(4) + + ticker.bid = it.getDouble(7) + ticker.ask = it.getDouble(8) + } + } +} \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Bybit.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Bybit.kt new file mode 100644 index 00000000..61770111 --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Bybit.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.CurrencyPairInfo +import com.aneonex.bitcoinchecker.datamodule.model.Market +import com.aneonex.bitcoinchecker.datamodule.model.Ticker +import com.aneonex.bitcoinchecker.datamodule.util.forEachJSONObject +import org.json.JSONObject + +class Bybit : Market(NAME, TTS_NAME, null) { + companion object { + private const val NAME = "Bybit" + private const val TTS_NAME = NAME + private const val URL = "https://api.bybit.com/v2/public/tickers?symbol=%1\$s" + private const val URL_CURRENCY_PAIRS = "https://api.bybit.com/v2/public/symbols" + } + + override fun getCurrencyPairsUrl(requestId: Int): String { + return URL_CURRENCY_PAIRS + } + + override fun parseCurrencyPairsFromJsonObject(requestId: Int, jsonObject: JSONObject, pairs: MutableList) { + jsonObject.getJSONArray("result").forEachJSONObject { market -> + val instrumentName = market.getString("name") + val quoteCurrency = market.getString("quote_currency") + var baseCurrency = market.getString("base_currency") + + // Detect futures + if(!instrumentName.endsWith(quoteCurrency)) { + baseCurrency = market.getString("alias").replace(quoteCurrency, "-") + } + + pairs.add( CurrencyPairInfo( + baseCurrency, + quoteCurrency, + instrumentName + )) + } + } + + override fun getUrl(requestId: Int, checkerInfo: CheckerInfo): String { + return String.format(URL, checkerInfo.currencyPairId) + } + + override fun parseTickerFromJsonObject(requestId: Int, jsonObject: JSONObject, ticker: Ticker, checkerInfo: CheckerInfo) { + jsonObject.getJSONArray("result").getJSONObject(0).apply { + ticker.ask = getDouble("ask_price") + ticker.bid = getDouble("bid_price") + ticker.high = getDouble("high_price_24h") + ticker.low = getDouble("low_price_24h") + ticker.last = getDouble("last_price") + ticker.vol = getDouble("turnover_24h") +// ticker.timestamp = getLong("ts") + } + } +} \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/CapeCrypto.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/CapeCrypto.kt new file mode 100644 index 00000000..187c2d69 --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/CapeCrypto.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.JSONArray +import org.json.JSONObject + + +class CapeCrypto : Market(NAME, TTS_NAME, CURRENCY_PAIRS) { + companion object { + private const val NAME = "Cape Crypto" + private const val TTS_NAME = NAME + // private const val URL_TICKER = "https://trade.capecrypto.com/api/v2/peatio/public/markets/btczar/tickers" + private const val URL_TICKER = "https://trade.capecrypto.com/api/v2/peatio/public/markets/%1\$s%2\$s/tickers" + private const val URL_ORDERS = "https://trade.capecrypto.com/api/v2/peatio/public/markets/%1\$s%2\$s/order-book?asks_limit=1&bids_limit=1" + private val CURRENCY_PAIRS: CurrencyPairsMap = CurrencyPairsMap() + + init { + CURRENCY_PAIRS[VirtualCurrency.BTC] = arrayOf( + Currency.ZAR + ) + } + } + + override fun getNumOfRequests(checkerInfo: CheckerInfo?): Int { + return 2 + } + + override fun getUrl(requestId: Int, checkerInfo: CheckerInfo): String { + return if (requestId == 0) { + String.format(URL_TICKER, checkerInfo.currencyBaseLowerCase, checkerInfo.currencyCounterLowerCase) + } else { + String.format(URL_ORDERS, checkerInfo.currencyBaseLowerCase, checkerInfo.currencyCounterLowerCase) + } + } + + @Throws(Exception::class) + override fun parseTickerFromJsonObject(requestId: Int, jsonObject: JSONObject, ticker: Ticker, + checkerInfo: CheckerInfo) { + + if (requestId == 0) { + ticker.vol = jsonObject.getJSONObject("ticker").getDouble("vol") + ticker.high = jsonObject.getJSONObject("ticker").getDouble("high") + ticker.low = jsonObject.getJSONObject("ticker").getDouble("low") + ticker.last = jsonObject.getJSONObject("ticker").getDouble("last") + ticker.timestamp = jsonObject.getLong("at") + } else { + val jArrayBids: JSONArray = jsonObject.getJSONArray("bids") + val jArrayAsks: JSONArray = jsonObject.getJSONArray("asks") + val jResultBids = jArrayBids.getJSONObject(0) + val jResultAsks = jArrayAsks.getJSONObject(0) + ticker.bid = jResultBids.getDouble("price") + ticker.ask = jResultAsks.getDouble("price") + } + } + + @Throws(Exception::class) + override fun parseErrorFromJsonObject(requestId: Int, jsonObject: JSONObject, + checkerInfo: CheckerInfo?): String? { + return jsonObject.getString("message") + } +} 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..0b926d0a --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/CexIO.kt @@ -0,0 +1,75 @@ +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") + 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/CoinDesk.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/CoinDesk.kt new file mode 100644 index 00000000..5231d9de --- /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 com.aneonex.bitcoinchecker.datamodule.util.forEachString +import org.json.JSONObject + +class CoinDesk : Market(NAME, TTS_NAME, 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 + } + + 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") + bpiJsonObject.names()!!.forEachString { quoteCurrencyName -> + pairs.add(CurrencyPairInfo(VirtualCurrency.BTC, quoteCurrencyName, null)) + } + } +} \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/CoinEgg.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/CoinEgg.kt new file mode 100644 index 00000000..834f2cf2 --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/CoinEgg.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.Ticker +import com.aneonex.bitcoinchecker.datamodule.model.market.generic.SimpleMarket +import com.aneonex.bitcoinchecker.datamodule.util.forEachJSONObject +import org.json.JSONObject + +class CoinEgg : SimpleMarket( + "CoinEgg", + "https://api.coinegg.fun/openapi/brokerInfo?type=token", + "https://api.coinegg.fun/openapi/quote/v1/ticker/24hr?symbol=%1\$s", + "Coin egg" +) { + + override fun parseCurrencyPairsFromJsonObject( + requestId: Int, + jsonObject: JSONObject, + pairs: MutableList + ) { + jsonObject.getJSONArray("symbols") + .forEachJSONObject { market -> + if (market.getString("status") == "TRADING") { + pairs.add( + CurrencyPairInfo( + market.getString("baseAssetName"), + market.getString("quoteAssetName"), + market.getString("symbol") + ) + ) + } + } + } + + override fun parseTickerFromJsonObject( + requestId: Int, + jsonObject: JSONObject, + ticker: Ticker, + checkerInfo: CheckerInfo + ) { + ticker.apply { + last = jsonObject.getDouble("lastPrice") + + high = jsonObject.getDouble("lastPrice") + low = jsonObject.getDouble("lastPrice") + + vol = jsonObject.getDouble("volume") + volQuote = jsonObject.getDouble("quoteVolume") + + bid = jsonObject.getDouble("bestBidPrice") + ask = jsonObject.getDouble("bestAskPrice") + + timestamp = jsonObject.getLong("time") + } + } +} \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/CoinEx.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/CoinEx.kt new file mode 100644 index 00000000..0d3627d7 --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/CoinEx.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 CoinEx : Market(NAME, TTS_NAME, null) { + companion object { + private const val NAME = "CoinEx" + private const val TTS_NAME = "Coin ex" + private const val URL = "https://api.coinex.com/v1/market/ticker?market=%1\$s" + private const val URL_CURRENCY_PAIRS = "https://api.coinex.com/v1/market/info" + } + + override fun getCurrencyPairsUrl(requestId: Int): String { + return URL_CURRENCY_PAIRS + } + + override fun parseCurrencyPairsFromJsonObject(requestId: Int, jsonObject: JSONObject, pairs: MutableList) { + val marketsJson = jsonObject.getJSONObject("data") + + marketsJson.keys().forEach { + val market = marketsJson.getJSONObject(it) + pairs.add( CurrencyPairInfo( + market.getString("trading_name"), + market.getString("pricing_name"), + market.getString("name"), + )) + } + } + + override fun getUrl(requestId: Int, checkerInfo: CheckerInfo): String { + return String.format(URL, checkerInfo.currencyPairId) + } + + override fun parseTickerFromJsonObject(requestId: Int, jsonObject: JSONObject, ticker: Ticker, checkerInfo: CheckerInfo) { + val dataJson = jsonObject.getJSONObject("data") + ticker.timestamp = dataJson.getLong("date") + + dataJson.getJSONObject("ticker").apply { + ticker.bid = getDouble("buy") + ticker.ask = getDouble("sell") + ticker.high = getDouble("high") + ticker.low = getDouble("low") + ticker.last = getDouble("last") + ticker.vol = getDouble("vol") + } + } +} \ 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..21bd7b42 --- /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) { + // API info: https://github.com/coinfloor/API/blob/master/BIST_v2.md + companion object { + private const val NAME = "Coinfloor" + private const val TTS_NAME = "Coin Floor" + private const val URL = "https://webapi.coinfloor.co.uk/v2/bist/%1\$s/%2\$s/ticker/" + private val CURRENCY_PAIRS: CurrencyPairsMap = CurrencyPairsMap() + + init { + CURRENCY_PAIRS[VirtualCurrency.XBT] = arrayOf( + Currency.GBP, + Currency.EUR, +// 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.apply { + bid = jsonObject.getDouble("bid") + ask = jsonObject.getDouble("ask") + vol = jsonObject.getDouble("volume") + high = jsonObject.getDouble("high") + low = jsonObject.getDouble("low") + 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..ed8f0af0 --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/CoinJar.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 com.aneonex.bitcoinchecker.datamodule.util.forEachName +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) { + jsonObject + .getJSONObject("exchange_rates") + .getJSONObject(checkerInfo.currencyPairId!!).also { + ticker.bid = it.optDouble("bid", ticker.bid) + ticker.ask = it.optDouble("ask", ticker.ask) + ticker.last = it.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) { + jsonObject + .getJSONObject("exchange_rates") + .forEachName{ symbol, item -> + pairs.add(CurrencyPairInfo( + item.getString("base_currency"), + item.getString("counter_currency"), + symbol + )) + } + } + + companion object { + private const val NAME = "CoinJar Prices" + private const val TTS_NAME = "Coin Jar prices" + 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/CoinJarExchange.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/CoinJarExchange.kt new file mode 100644 index 00000000..160ac86e --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/CoinJarExchange.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 com.aneonex.bitcoinchecker.datamodule.model.market.generic.SimpleMarket +import com.aneonex.bitcoinchecker.datamodule.util.TimeUtils +import com.aneonex.bitcoinchecker.datamodule.util.forEachJSONObject +import org.json.JSONArray +import org.json.JSONObject + +class CoinJarExchange : SimpleMarket( + "CoinJar Exchange", + "https://api.exchange.coinjar.com/products", + "https://data.exchange.coinjar.com/products/%1\$s/ticker", + "Coin Jar exchange") { + + override fun parseTickerFromJsonObject(requestId: Int, jsonObject: JSONObject, ticker: Ticker, checkerInfo: CheckerInfo) { + ticker.apply { + bid = jsonObject.getDouble("bid") + ask = jsonObject.getDouble("ask") + last = jsonObject.getDouble("last") + vol = jsonObject.getDouble("volume_24h") + timestamp = TimeUtils.convertISODateToTimestamp(jsonObject.getString("current_time")) + } + } + + override fun parseCurrencyPairs( + requestId: Int, + responseString: String, + pairs: MutableList + ) { + JSONArray(responseString).forEachJSONObject { + val assets = it.getString("name").split('/') + if(assets.size == 2) { + pairs.add( + CurrencyPairInfo( + assets[0], + assets[1], + it.getString("id") + ) + ) + } + } + } +} \ 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..8ad81962 --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/CoinMateIO.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.Ticker +import com.aneonex.bitcoinchecker.datamodule.model.market.generic.SimpleMarket +import com.aneonex.bitcoinchecker.datamodule.util.forEachJSONObject +import org.json.JSONObject + +class CoinMateIO : SimpleMarket( + "CoinMate.io", + "https://coinmate.io/api/tradingPairs", + "https://coinmate.io/api/ticker?currencyPair=%1\$s", + "Coin Mate" +) { + override fun getPairId(checkerInfo: CheckerInfo): String = + checkerInfo.currencyPairId ?: "${checkerInfo.currencyBase}_${checkerInfo.currencyCounter}" + + override fun parseCurrencyPairsFromJsonObject( + requestId: Int, + jsonObject: JSONObject, + pairs: MutableList + ) { + jsonObject.getJSONArray("data").forEachJSONObject { market -> + pairs.add(CurrencyPairInfo( + market.getString("firstCurrency"), + market.getString("secondCurrency"), + market.getString("name") + )) + } + } + + @Throws(Exception::class) + override fun parseTickerFromJsonObject(requestId: Int, jsonObject: JSONObject, ticker: Ticker, checkerInfo: CheckerInfo) { + jsonObject.getJSONObject("data").also { + ticker.bid = it.getDouble("bid") + ticker.ask = it.getDouble("ask") + + ticker.high = it.getDouble("high") + ticker.low = it.getDouble("low") + + ticker.vol = it.getDouble("amount") + ticker.last = it.getDouble("last") + + ticker.timestamp = it.getLong("timestamp") + } + } + + @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/CoinTiger.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/CoinTiger.kt new file mode 100644 index 00000000..892812e8 --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/CoinTiger.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.Ticker +import com.aneonex.bitcoinchecker.datamodule.model.market.generic.SimpleMarket +import org.json.JSONObject +import java.util.* + +class CoinTiger : SimpleMarket( + "CoinTiger", + "https://api.cointiger.com/exchange/trading/api/v2/currencys/v2", + "https://api.cointiger.com/exchange/trading/api/market/detail?symbol=%1\$s" + ) { + + override fun parseCurrencyPairsFromJsonObject(requestId: Int, jsonObject: JSONObject, pairs: MutableList) { + val marketSections = jsonObject.getJSONObject("data") + for (marketSectionKey in marketSections.keys()) { + val marketSection = marketSections.getJSONArray(marketSectionKey) + for (i in 0 until marketSection.length()) { + val market = marketSection.getJSONObject(i) + + pairs.add( + CurrencyPairInfo( + market.getString("baseCurrency").uppercase(Locale.ROOT), + market.getString("quoteCurrency").uppercase(Locale.ROOT), + null + )) + } + } + } + + override fun getPairId(checkerInfo: CheckerInfo): String { + return (checkerInfo.currencyBase + checkerInfo.currencyCounter).lowercase(Locale.ROOT) + } + + override fun parseTickerFromJsonObject(requestId: Int, jsonObject: JSONObject, ticker: Ticker, checkerInfo: CheckerInfo) { + val tickerData = jsonObject.getJSONObject("data").getJSONObject("trade_ticker_data") + + ticker.timestamp = tickerData.getLong("ts") + tickerData.getJSONObject("tick").let { + ticker.last = it.getDouble("close") + ticker.high = it.getDouble("high") + ticker.low = it.getDouble("low") + ticker.vol = it.getDouble("vol") + } + } +} \ 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/Coinbase.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Coinbase.kt new file mode 100644 index 00000000..c3acff49 --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Coinbase.kt @@ -0,0 +1,96 @@ +package com.aneonex.bitcoinchecker.datamodule.model.market + +import com.aneonex.bitcoinchecker.datamodule.exceptions.MarketParseException +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.CurrencyPairsMap +import com.aneonex.bitcoinchecker.datamodule.util.TimeUtils +import com.aneonex.bitcoinchecker.datamodule.util.forEachJSONObject +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_TICKER = "https://api.pro.coinbase.com/products/%1\$s/ticker" + private const val URL_STATS = "https://api.pro.coinbase.com/products/%1\$s/stats" + private const val URL_CURRENCY_PAIRS = "https://api.pro.coinbase.com/products" + + private val CURRENCY_PAIRS: CurrencyPairsMap = CurrencyPairsMap() + } + + init { + CURRENCY_PAIRS["1INCH"] = arrayOf("BTC", "EUR", "GBP", "USD") + CURRENCY_PAIRS["AAVE"] = arrayOf("BTC", "EUR", "GBP", "USD") + CURRENCY_PAIRS["ADA"] = arrayOf("BTC", "ETH", "EUR", "GBP", "USD", "USDC") + CURRENCY_PAIRS["ATOM"] = arrayOf("BTC", "USD") + CURRENCY_PAIRS["BAT"] = arrayOf("BTC", "ETH", "EUR", "USD", "USDC") + CURRENCY_PAIRS["BTC"] = arrayOf("EUR", "GBP", "USDC", "USD", "USDT") + CURRENCY_PAIRS["DAI"] = arrayOf("USD", "USDC") + CURRENCY_PAIRS["DASH"] = arrayOf("BTC", "USD") + CURRENCY_PAIRS["DOGE"] = arrayOf("BTC", "EUR", "GBP", "USD", "USDT") + CURRENCY_PAIRS["DOT"] = arrayOf("BTC", "EUR", "GBP", "USD", "USDT") + CURRENCY_PAIRS["EOS"] = arrayOf("BTC", "EUR", "USD") + CURRENCY_PAIRS["ETC"] = arrayOf("BTC", "EUR", "GBP", "USD") + CURRENCY_PAIRS["ETH"] = arrayOf("BTC", "DAI", "EUR", "GBP", "USD", "USDT", "USDC") + CURRENCY_PAIRS["FIL"] = arrayOf("BTC", "EUR", "GBP", "USD") + CURRENCY_PAIRS["LINK"] = arrayOf("BTC", "ETH", "EUR", "GBP", "USD") + CURRENCY_PAIRS["LTC"] = arrayOf("BTC", "EUR", "GBP", "USD") + CURRENCY_PAIRS["OMG"] = arrayOf("BTC", "EUR", "GBP", "USD") + CURRENCY_PAIRS["STORJ"] = arrayOf("BTC", "USD") + CURRENCY_PAIRS["SUSHI"] = arrayOf("BTC", "ETH", "EUR", "GBP", "USD") + CURRENCY_PAIRS["USDC"] = arrayOf("EUR", "GBP") + CURRENCY_PAIRS["USDT"] = arrayOf("EUR", "GBP", "USD", "USDC") + CURRENCY_PAIRS["XLM"] = arrayOf("BTC", "EUR", "USD") + CURRENCY_PAIRS["ZEC"] = arrayOf("BTC", "USD", "USDC") + } + + override fun getNumOfRequests(checkerInfo: CheckerInfo?): Int { + return 2 + } + + override fun getUrl(requestId: Int, checkerInfo: CheckerInfo): String { + val pairId = checkerInfo.currencyPairId ?: "${checkerInfo.currencyBase}-${checkerInfo.currencyCounter}" + + if(requestId == 0) + return String.format(URL_TICKER, pairId) + + return String.format(URL_STATS, pairId) + } + + @Throws(Exception::class) + override fun parseTickerFromJsonObject(requestId: Int, jsonObject: JSONObject, ticker: Ticker, checkerInfo: CheckerInfo) { + if(requestId == 0) { + ticker.vol = jsonObject.getDouble("volume").also { + if(it <= 0) + throw MarketParseException("No trading volume") + } + + ticker.bid = jsonObject.getDouble("bid") + ticker.ask = jsonObject.getDouble("ask") + ticker.last = jsonObject.getDouble("price") + ticker.timestamp = TimeUtils.convertISODateToTimestamp(jsonObject.getString("time")) + } + else { + ticker.high = jsonObject.getDouble("high") + ticker.low = jsonObject.getDouble("low") + } + } + + override fun getCurrencyPairsUrl(requestId: Int): String { + return URL_CURRENCY_PAIRS + } + + @Throws(Exception::class) + override fun parseCurrencyPairs(requestId: Int, responseString: String, pairs: MutableList) { + JSONArray(responseString).forEachJSONObject { pairJsonObject -> + 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/Coineal.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Coineal.kt new file mode 100644 index 00000000..6b5bcdfa --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Coineal.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 Coineal : Market(NAME, TTS_NAME, null) { + companion object { + private const val NAME = "Coineal" + private const val TTS_NAME = NAME + private const val URL = "https://exchange-open-api.coineal.com/open/api/get_ticker?symbol=%1\$s" + private const val URL_CURRENCY_PAIRS = "https://exchange-open-api.coineal.com/open/api/common/symbols" + } + + override fun getCurrencyPairsUrl(requestId: Int): String { + return URL_CURRENCY_PAIRS + } + + override fun parseCurrencyPairsFromJsonObject(requestId: Int, jsonObject: JSONObject, pairs: MutableList) { + val markets = jsonObject.getJSONArray("data") + for(i in 0 until markets.length()){ + val market = markets.getJSONObject(i) + pairs.add( + CurrencyPairInfo( + market.getString("base_coin").uppercase(Locale.ROOT), + market.getString("count_coin").uppercase(Locale.ROOT), + market.getString("symbol"), + )) + } + } + + override fun getUrl(requestId: Int, checkerInfo: CheckerInfo): String { + return String.format(URL, checkerInfo.currencyPairId) + } + + override fun parseTickerFromJsonObject(requestId: Int, jsonObject: JSONObject, ticker: Ticker, checkerInfo: CheckerInfo) { + jsonObject.getJSONObject("data").apply { + ticker.bid = getDouble("buy") + ticker.ask = getDouble("sell") + ticker.high = getDouble("high") + ticker.low = getDouble("low") + ticker.last = getDouble("last") +// ticker.vol = getDouble("volume") + ticker.timestamp = getLong("time") + } + } +} \ 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..acfd23f3 --- /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(checkerInfo: 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/Coinsbit.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Coinsbit.kt new file mode 100644 index 00000000..b7599222 --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Coinsbit.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.JSONObject + +class Coinsbit : Market(NAME, TTS_NAME, null) { + companion object { + private const val NAME = "Coinsbit" + private const val TTS_NAME = NAME + private const val URL = "https://coinsbit.io/api/v1/public/ticker?market=%1\$s" + private const val URL_CURRENCY_PAIRS = "https://coinsbit.io/api/v1/public/markets" + } + + override fun getCurrencyPairsUrl(requestId: Int): String { + return URL_CURRENCY_PAIRS + } + + override fun parseCurrencyPairsFromJsonObject(requestId: Int, jsonObject: JSONObject, pairs: MutableList) { + val markets = jsonObject.getJSONArray("result") + for(i in 0 until markets.length()){ + val market = markets.getJSONObject(i) + pairs.add( CurrencyPairInfo( + market.getString("stock"), + market.getString("money"), + market.getString("name"), + )) + } + } + + override fun getUrl(requestId: Int, checkerInfo: CheckerInfo): String { + return String.format(URL, checkerInfo.currencyPairId) + } + + override fun parseTickerFromJsonObject(requestId: Int, jsonObject: JSONObject, ticker: Ticker, checkerInfo: CheckerInfo) { + jsonObject.getJSONObject("result").apply { + ticker.bid = getDouble("bid") + ticker.ask = getDouble("ask") + ticker.high = getDouble("high") + ticker.low = getDouble("low") + ticker.last = getDouble("last") + ticker.vol = getDouble("volume") +// ticker.timestamp = getLong("timestamp") + } + } +} \ 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..57b3cff8 --- /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/CryptoCom.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/CryptoCom.kt new file mode 100644 index 00000000..9864adfb --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/CryptoCom.kt @@ -0,0 +1,51 @@ +package com.aneonex.bitcoinchecker.datamodule.model.market + +import com.aneonex.bitcoinchecker.datamodule.exceptions.MarketParseException +import com.aneonex.bitcoinchecker.datamodule.model.CheckerInfo +import com.aneonex.bitcoinchecker.datamodule.model.CurrencyPairInfo +import com.aneonex.bitcoinchecker.datamodule.model.Ticker +import com.aneonex.bitcoinchecker.datamodule.model.market.generic.SimpleMarket +import org.json.JSONObject + +class CryptoCom : SimpleMarket( + "Crypto.com", + "https://api.crypto.com/v2/public/get-instruments", + "https://api.crypto.com/v2/public/get-ticker?instrument_name=%1\$s" + ) { + + override fun parseCurrencyPairsFromJsonObject(requestId: Int, jsonObject: JSONObject, pairs: MutableList) { + val markets = jsonObject + .getJSONObject("result") + .getJSONArray("instruments") + + for (i in 0 until markets.length()) { + val market = markets.getJSONObject(i) + + pairs.add(CurrencyPairInfo( + market.getString("base_currency"), + market.getString("quote_currency"), + market.getString("instrument_name") + )) + } + } + + override fun parseTickerFromJsonObject(requestId: Int, jsonObject: JSONObject, ticker: Ticker, checkerInfo: CheckerInfo) { + jsonObject + .getJSONObject("result") + .getJSONObject("data") + .let { + ticker.vol = it.getDouble("v") + if(ticker.vol <= 0) + throw MarketParseException("No trading volume") + + ticker.last = it.getDouble("a") + ticker.high = it.getDouble("h") + ticker.low = it.getDouble("l") + + ticker.bid = it.getDouble("b") + ticker.ask = it.getDouble("k") + + ticker.timestamp = it.getLong("t") + } + } +} \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/CryptoMarket.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/CryptoMarket.kt new file mode 100644 index 00000000..c97b15a0 --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/CryptoMarket.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.Ticker +import com.aneonex.bitcoinchecker.datamodule.model.market.generic.SimpleMarket +import com.aneonex.bitcoinchecker.datamodule.util.TimeUtils +import org.json.JSONObject + +class CryptoMarket : SimpleMarket( + "CryptoMarket", + "https://api.cryptomkt.com/v1/market", + "https://api.cryptomkt.com/v1/ticker?market=%1\$s", + "Crypto Market" + ) { + + companion object{ + private val templateAssets = arrayOf("BTC", "ETH", "EUR", "MXN", "BRL", "ARS", "CLP") + + private fun tryParseCurrencyPair(pairCode: String): Array { + for(templateAsset in templateAssets){ + if(pairCode.endsWith(templateAsset)) { + return arrayOf( + pairCode.substring(0, pairCode.length-templateAsset.length), // base asset + templateAsset // quote asset + ) + } else + if (pairCode.startsWith(templateAsset)){ + return arrayOf( + templateAsset, // base asset + pairCode.substring(templateAsset.length, pairCode.length) // quote asset + ) + } + } + + return arrayOf() + } + } + + override fun parseCurrencyPairsFromJsonObject(requestId: Int, jsonObject: JSONObject, pairs: MutableList) { + val markets = jsonObject.getJSONArray("data") + + for (i in 0 until markets.length()) { + val market = markets.getString(i) + val assets = tryParseCurrencyPair(market) + if(assets.size == 2) { + pairs.add(CurrencyPairInfo( + assets[0], // base + assets[1], // quote + market + )) + } + } + } + + override fun parseTickerFromJsonObject(requestId: Int, jsonObject: JSONObject, ticker: Ticker, checkerInfo: CheckerInfo) { + jsonObject + .getJSONArray("data").getJSONObject(0) + .let { + ticker.timestamp = TimeUtils.convertISODateToTimestamp(it.getString("timestamp") + "Z") + ticker.last = it.getDouble("last_price") + ticker.high = it.getDouble("high") + ticker.low = it.getDouble("low") + ticker.vol = it.getDouble("volume") + + ticker.bid = it.getDouble("bid") + ticker.ask = it.getDouble("ask") + } + } +} \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/EXX.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/EXX.kt new file mode 100644 index 00000000..33888fe8 --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/EXX.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.Ticker +import com.aneonex.bitcoinchecker.datamodule.model.market.generic.SimpleMarket +import org.json.JSONObject +import java.util.* + +class EXX : SimpleMarket( + "EXX", + "https://api.exx.com/data/v1/markets", + "https://api.exx.com/data/v1/ticker?currency=%1\$s" + ) { + + override fun parseCurrencyPairsFromJsonObject(requestId: Int, jsonObject: JSONObject, pairs: MutableList) { + for (marketKey in jsonObject.keys()) { + val assets = marketKey.uppercase(Locale.ROOT).split('_') + if (assets.size != 2) continue + + pairs.add( + CurrencyPairInfo( + assets[0], // Base currency + assets[1], // Quote currency + marketKey + ) + ) + } + } + + override fun parseTickerFromJsonObject(requestId: Int, jsonObject: JSONObject, ticker: Ticker, checkerInfo: CheckerInfo) { + ticker.timestamp = jsonObject.getLong("date") + + jsonObject.getJSONObject("ticker").let { + ticker.last = it.getDouble("last") + ticker.high = it.getDouble("high") + ticker.low = it.getDouble("low") + ticker.vol = it.getDouble("vol") + + ticker.bid = it.getDouble("buy") + ticker.ask = it.getDouble("sell") + } + } +} \ 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..65f32172 --- /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 com.aneonex.bitcoinchecker.datamodule.util.forEachString +import org.json.JSONObject + +class Exmo : Market(NAME, TTS_NAME, null) { + 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/" + } + + 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) { + jsonObject.names()!!.forEachString { pairId -> + val currencies = pairId.split("_".toRegex()).toTypedArray() + if (currencies.size == 2) { + pairs.add(CurrencyPairInfo(currencies[0], currencies[1], pairId)) + } + } + } +} \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Exrates.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Exrates.kt new file mode 100644 index 00000000..0c9c9a39 --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Exrates.kt @@ -0,0 +1,48 @@ +package com.aneonex.bitcoinchecker.datamodule.model.market + +import com.aneonex.bitcoinchecker.datamodule.exceptions.MarketParseException +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 Exrates : Market(NAME, TTS_NAME, null) { + companion object { + private const val NAME = "Exrates" + private const val TTS_NAME = NAME + private const val URL = "https://api.exrates.me/v1/public/ticker?pair=%1\$s" + private const val URL_CURRENCY_PAIRS = "https://api.exrates.me/v1/public/symbols" + } + + 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 market = dataJson.getJSONObject(i) + pairs.add( CurrencyPairInfo( + market.getString("base"), + market.getString("quote"), + market.getString("pair"), + )) + } + } + + override fun getUrl(requestId: Int, checkerInfo: CheckerInfo): String { + return String.format(URL, checkerInfo.currencyPairId) + } + + override fun parseTickerFromJsonObject(requestId: Int, jsonObject: JSONObject, ticker: Ticker, checkerInfo: CheckerInfo) { + jsonObject.getJSONObject("data").apply { + ticker.high = getDouble("high") + ticker.low = getDouble("low") + ticker.last = getDouble("last") + ticker.vol = getDouble("volume_24H") + } + + if(ticker.last <= 0) throw MarketParseException("No data") + } +} \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Foxbit.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Foxbit.kt new file mode 100644 index 00000000..4a6df3b0 --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Foxbit.kt @@ -0,0 +1,73 @@ +package com.aneonex.bitcoinchecker.datamodule.model.market + +import com.aneonex.bitcoinchecker.datamodule.exceptions.MarketParseException +import com.aneonex.bitcoinchecker.datamodule.model.CheckerInfo +import com.aneonex.bitcoinchecker.datamodule.model.CurrencyPairInfo +import com.aneonex.bitcoinchecker.datamodule.model.Ticker +import com.aneonex.bitcoinchecker.datamodule.model.market.generic.SimpleMarket +import com.aneonex.bitcoinchecker.datamodule.util.TimeUtils +import com.aneonex.bitcoinchecker.datamodule.util.forEachJSONObject +import org.json.JSONArray +import org.json.JSONObject + +class Foxbit : SimpleMarket( + "Foxbit", + "https://watcher.foxbit.com.br/api/Ticker", + "https://watcher.foxbit.com.br/api/Ticker?exchange=Foxbit&Pair=%1\$s" + ) { + + override fun parseCurrencyPairs( + requestId: Int, + responseString: String, + pairs: MutableList + ) { + JSONArray(responseString).forEachJSONObject { market -> + if(market.getString("exchange") != "Foxbit") + return@forEachJSONObject + + val pairId = market.getString("currency") + val separatorIndex = pairId.indexOf('X') + if(separatorIndex <= 0) + return@forEachJSONObject + + val asset1 = pairId.substring(0, separatorIndex) + val asset2 = pairId.substring(separatorIndex+1, pairId.length) + + val firstAssetIsQuoteCurrency: Boolean = + when{ + asset1 == "BRL" -> true + asset2 == "BRL" -> false + asset2 == "USDT" -> false + asset2 == "BTC" -> false + else -> return@forEachJSONObject // Unknown pair format + } + + val baseCurrency = if(firstAssetIsQuoteCurrency) asset2 else asset1 + val quoteCurrency = if(firstAssetIsQuoteCurrency) asset1 else asset2 + + pairs.add(CurrencyPairInfo( + baseCurrency, + quoteCurrency, + pairId + )) + } + } + + override fun parseTickerFromJsonObject(requestId: Int, jsonObject: JSONObject, ticker: Ticker, checkerInfo: CheckerInfo) { + jsonObject + .let { + ticker.vol = it.getDouble("vol") + if(ticker.vol <= 0) + throw throw MarketParseException("No trading volume") + + ticker.last = it.getDouble("last") + ticker.high = it.getDouble("high") + ticker.low = it.getDouble("low") + + ticker.bid = it.getDouble("buyPrice") + ticker.ask = it.getDouble("sellPrice") + + ticker.timestamp = TimeUtils.convertISODateToTimestamp(it.getString("createdDate") + "Z") + } + } +} \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Ftx.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Ftx.kt new file mode 100644 index 00000000..6d6b80f0 --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Ftx.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.Ticker +import com.aneonex.bitcoinchecker.datamodule.model.market.generic.SimpleMarket +import com.aneonex.bitcoinchecker.datamodule.util.forEachJSONObject +import org.json.JSONObject + +class Ftx : FtxBase( + "FTX", + "com" +) + +class FtxUs : FtxBase( + "FTX US", + "us" +) + +open class FtxBase(name: String, domain: String) : SimpleMarket( + name, + "https://ftx.$domain/api/markets", + "https://ftx.$domain/api/markets/%1\$s" +) { + override fun parseCurrencyPairsFromJsonObject(requestId: Int, jsonObject: JSONObject, pairs: MutableList) { + jsonObject.getJSONArray("result").forEachJSONObject { market -> + if(market.getString("type") != "spot") return@forEachJSONObject + + pairs.add( CurrencyPairInfo( + market.getString("baseCurrency"), + market.getString("quoteCurrency"), + market.getString("name"), + )) + } + } + + override fun parseTickerFromJsonObject(requestId: Int, jsonObject: JSONObject, ticker: Ticker, checkerInfo: CheckerInfo) { + val market = jsonObject.getJSONObject("result") + + ticker.bid = market.getDouble("bid") + ticker.ask = market.getDouble("ask") + ticker.last = market.getDouble("last") + + if(ticker.last > 0) { + ticker.volQuote = market.getDouble("quoteVolume24h") + ticker.vol = ticker.volQuote / ticker.last // Calculated base volume + } + } +} \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/FtxFutures.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/FtxFutures.kt new file mode 100644 index 00000000..635c33f5 --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/FtxFutures.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.CurrencyPairInfo +import com.aneonex.bitcoinchecker.datamodule.model.FuturesContractType +import com.aneonex.bitcoinchecker.datamodule.model.Ticker +import com.aneonex.bitcoinchecker.datamodule.model.market.generic.SimpleMarket +import com.aneonex.bitcoinchecker.datamodule.util.forEachJSONObject +import org.json.JSONObject + +class FtxFutures : SimpleMarket( + "FTX Futures", + "https://ftx.com/api/futures", + "https://ftx.com/api/futures/%1\$s" +) { + override fun parseCurrencyPairsFromJsonObject(requestId: Int, jsonObject: JSONObject, pairs: MutableList) { + jsonObject.getJSONArray("result").forEachJSONObject { market -> + if(market.getString("type") != "perpetual") + return@forEachJSONObject + + pairs.add( CurrencyPairInfo( + market.getString("underlying"), + "USD", + market.getString("name"), + FuturesContractType.PERPETUAL + )) + } + } + + override fun parseTickerFromJsonObject(requestId: Int, jsonObject: JSONObject, ticker: Ticker, checkerInfo: CheckerInfo) { + jsonObject.getJSONObject("result").also { market -> + ticker.bid = market.getDouble("bid") + ticker.ask = market.getDouble("ask") + ticker.last = market.getDouble("last") + + if(ticker.last > 0) { + ticker.volQuote = market.getDouble("volumeUsd24h") + ticker.vol = ticker.volQuote / ticker.last // Calculated base volume + } + } + } +} \ 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/GateIo.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/GateIo.kt new file mode 100644 index 00000000..2764397b --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/GateIo.kt @@ -0,0 +1,60 @@ +package com.aneonex.bitcoinchecker.datamodule.model.market + +import com.aneonex.bitcoinchecker.datamodule.exceptions.MarketParseException +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 + +class GateIo : Market(NAME, TTS_NAME, null) { + + companion object { + private const val NAME = "Gate.io" + private const val TTS_NAME = "Gate io" + private const val URL = "https://api.gateio.ws/api/v4/spot/tickers?currency_pair=%1\$s" + private const val URL_CURRENCY_PAIRS = "https://api.gateio.ws/api/v4/spot/currency_pairs" + } + + override fun getUrl(requestId: Int, checkerInfo: CheckerInfo): String { + return String.format(URL, checkerInfo.currencyPairId) + } + + override fun parseTicker(requestId: Int, responseString: String, ticker: Ticker, checkerInfo: CheckerInfo) { + val jsonArray = JSONArray(responseString) + if(jsonArray.length() < 1) throw MarketParseException("No data") + + val jsonObject = jsonArray.getJSONObject(0) + + ticker.bid = jsonObject.getDouble("highest_bid") + ticker.ask = jsonObject.getDouble("lowest_ask") + ticker.vol = jsonObject.getDouble("base_volume") + ticker.high = jsonObject.getDouble("high_24h") + ticker.low = jsonObject.getDouble("low_24h") + 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 pairJson = jsonArray.getJSONObject(i) + + if(pairJson.getString("trade_status") != "tradable") continue + + pairs.add(CurrencyPairInfo( + pairJson.getString("base"), + pairJson.getString("quote"), + pairJson.getString("id") + )) + } + } +} \ 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..5e3dc726 --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Gemini.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.CurrencyPairInfo +import com.aneonex.bitcoinchecker.datamodule.model.Market +import com.aneonex.bitcoinchecker.datamodule.model.Ticker +import com.aneonex.bitcoinchecker.datamodule.util.forEachString +import org.json.JSONArray +import org.json.JSONObject +import java.util.* + +class Gemini : Market(NAME, TTS_NAME, null) { + companion object { + private const val NAME = "Gemini" + private const val TTS_NAME = "Gemini" + private const val URL = "https://api.gemini.com/v1/pubticker/%1\$s" + private const val URL_CURRENCY_PAIRS = "https://api.gemini.com/v1/symbols" + } + + override fun getCurrencyPairsUrl(requestId: Int): String { + return URL_CURRENCY_PAIRS + } + + override fun parseCurrencyPairs(requestId: Int, responseString: String, pairs: MutableList) { + val quoteCurrencyLength = 3 + + JSONArray(responseString).forEachString { market -> + pairs.add( + CurrencyPairInfo( + market.substring(0, market.length - quoteCurrencyLength).uppercase(Locale.ROOT), + market.substring(market.length - quoteCurrencyLength).uppercase(Locale.ROOT), + market + )) + } + } + + override fun getUrl(requestId: Int, checkerInfo: CheckerInfo): String { + // Compatibility with old pre-installed pairs + val pairId = checkerInfo.currencyPairId ?: (checkerInfo.currencyBase + checkerInfo.currencyCounter) + return String.format(URL, pairId) + } + + @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") + jsonObject.getJSONObject("volume").apply { + ticker.vol = getDouble(checkerInfo.currencyBase) + + // The end of the 24-hour period over which volume was measured + // This is not the last price time + // ticker.timestamp = getLong("timestamp") + } + } +} \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Hbtc.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Hbtc.kt new file mode 100644 index 00000000..155fcc7b --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Hbtc.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 Hbtc : Market(NAME, TTS_NAME, null) { + companion object { + private const val NAME = "HBTC" + private const val TTS_NAME = NAME + private const val URL = "https://api.hbtc.com/openapi/quote/v1/ticker/24hr?symbol=%1\$s" + private const val URL_CURRENCY_PAIRS = "https://api.hbtc.com/openapi/v1/pairs" + } + + override fun getCurrencyPairsUrl(requestId: Int): String { + return URL_CURRENCY_PAIRS + } + + override fun parseCurrencyPairs(requestId: Int, responseString: String, pairs: MutableList) { + val markets = JSONArray(responseString) + for(i in 0 until markets.length()){ + val market = markets.getJSONObject(i) + + pairs.add( CurrencyPairInfo( + market.getString("baseToken"), + market.getString("quoteToken"), + market.getString("symbol") + )) + } + } + + override fun getUrl(requestId: Int, checkerInfo: CheckerInfo): String { + return String.format(URL, checkerInfo.currencyPairId) + } + + override fun parseTickerFromJsonObject(requestId: Int, jsonObject: JSONObject, ticker: Ticker, checkerInfo: CheckerInfo) { + jsonObject.apply { + ticker.ask = getDouble("bestAskPrice") + ticker.bid = getDouble("bestBidPrice") + ticker.high = getDouble("highPrice") + ticker.low = getDouble("lowPrice") + ticker.last = getDouble("lastPrice") + ticker.vol = getDouble("volume") + ticker.timestamp = getLong("time") + } + } +} \ 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..4d650a64 --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/HitBtc.kt @@ -0,0 +1,41 @@ +package com.aneonex.bitcoinchecker.datamodule.model.market + +import com.aneonex.bitcoinchecker.datamodule.exceptions.MarketParseException +import com.aneonex.bitcoinchecker.datamodule.model.CheckerInfo +import com.aneonex.bitcoinchecker.datamodule.model.CurrencyPairInfo +import com.aneonex.bitcoinchecker.datamodule.model.Ticker +import com.aneonex.bitcoinchecker.datamodule.model.market.generic.SimpleMarket +import com.aneonex.bitcoinchecker.datamodule.util.TimeUtils +import com.aneonex.bitcoinchecker.datamodule.util.forEachJSONObject +import org.json.JSONArray + +class HitBtc : SimpleMarket( + "HitBTC", + "https://api.hitbtc.com/api/2/public/symbol", + "https://api.hitbtc.com/api/2/public/ticker?symbols=%1\$s", + "Hit BTC") { + + override fun parseCurrencyPairs(requestId: Int, responseString: String, pairs: MutableList) { + JSONArray(responseString).forEachJSONObject { market -> + pairs.add(CurrencyPairInfo( + market.getString("baseCurrency"), + market.getString("quoteCurrency"), + market.getString("id"))) + } + } + + @Throws(Exception::class) + override fun parseTicker(requestId: Int, responseString: String, ticker: Ticker, checkerInfo: CheckerInfo) { + val tickers = JSONArray(responseString) + if(tickers.length() == 0) throw MarketParseException("No data") + tickers.getJSONObject(0).apply { + ticker.bid = getDouble("bid") + ticker.ask = getDouble("ask") + ticker.vol = getDouble("volume") + ticker.high = getDouble("high") + ticker.low = getDouble("low") + ticker.last = getDouble("last") + ticker.timestamp = TimeUtils.convertISODateToTimestamp(getString("timestamp")) + } + } +} \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Hotbit.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Hotbit.kt new file mode 100644 index 00000000..1a703ed5 --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Hotbit.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.CurrencyPairInfo +import com.aneonex.bitcoinchecker.datamodule.model.Ticker +import com.aneonex.bitcoinchecker.datamodule.model.market.generic.SimpleMarket +import com.aneonex.bitcoinchecker.datamodule.util.forEachJSONObject +import org.json.JSONObject + +class Hotbit : SimpleMarket( + "Hotbit", + "https://api.hotbit.io/api/v1/market.list", + "https://api.hotbit.io/api/v1/market.status?market=%1\$s&period=86400" // 24 hours status + ) { + + override fun parseCurrencyPairsFromJsonObject(requestId: Int, jsonObject: JSONObject, pairs: MutableList) { + jsonObject.getJSONArray("result").forEachJSONObject { market -> + pairs.add(CurrencyPairInfo( + market.getString("stock"), + market.getString("money"), + null)) + } + } + + override fun getPairId(checkerInfo: CheckerInfo): String { + return "${checkerInfo.currencyBase}/${checkerInfo.currencyCounter}" + } + + override fun parseErrorFromJsonObject(requestId: Int, jsonObject: JSONObject, checkerInfo: CheckerInfo?): String? { + return jsonObject.getJSONObject("error").getString("message") + } + + override fun parseTickerFromJsonObject(requestId: Int, jsonObject: JSONObject, ticker: Ticker, checkerInfo: CheckerInfo) { + jsonObject.getJSONObject("result").let { + ticker.vol = it.getDouble("volume") + ticker.high = it.getDouble("high") + ticker.low = it.getDouble("low") + ticker.last = it.getDouble("last") + } + } +} \ 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..fe29fdab --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Huobi.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.Ticker +import com.aneonex.bitcoinchecker.datamodule.model.market.generic.SimpleMarket +import com.aneonex.bitcoinchecker.datamodule.util.forEachJSONObject +import org.json.JSONObject +import java.util.* + +class Huobi : SimpleMarket( + "Huobi", + "https://api.huobi.pro/v1/common/symbols", + "https://api.huobi.pro/market/detail/merged?symbol=%1\$s" +) { + + override fun getPairId(checkerInfo: CheckerInfo): String { + return checkerInfo.currencyPairId ?: checkerInfo.currencyBaseLowerCase + checkerInfo.currencyCounterLowerCase + } + + @Throws(Exception::class) + override fun parseTickerFromJsonObject(requestId: Int, jsonObject: JSONObject, ticker: Ticker, checkerInfo: CheckerInfo) { + jsonObject.getJSONObject("tick").also { + ticker.bid = it.getJSONArray("bid").getDouble(0) + ticker.ask = it.getJSONArray("ask").getDouble(0) + ticker.vol = it.getDouble("amount") + ticker.volQuote = it.getDouble("vol") + ticker.high = it.getDouble("high") + ticker.low = it.getDouble("low") + ticker.last = it.getDouble("close") + } + } + + @Throws(Exception::class) + override fun parseCurrencyPairsFromJsonObject(requestId: Int, jsonObject: JSONObject, pairs: MutableList) { + if ("ok".equals(jsonObject.getString("status"), ignoreCase = true)) { + jsonObject.getJSONArray("data") + .forEachJSONObject { market -> + pairs.add(CurrencyPairInfo( + market.getString("base-currency").uppercase(Locale.ROOT), + market.getString("quote-currency").uppercase(Locale.ROOT), + market.getString("symbol"))) + } + } else { + throw Exception("Parse currency pairs error.") + } + } +} \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/HuobiFutures.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/HuobiFutures.kt new file mode 100644 index 00000000..0d65a78f --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/HuobiFutures.kt @@ -0,0 +1,136 @@ +package com.aneonex.bitcoinchecker.datamodule.model.market + +import com.aneonex.bitcoinchecker.datamodule.exceptions.MarketParseException +import com.aneonex.bitcoinchecker.datamodule.model.* +import com.aneonex.bitcoinchecker.datamodule.model.currency.Currency +import com.aneonex.bitcoinchecker.datamodule.model.currency.VirtualCurrency +import com.aneonex.bitcoinchecker.datamodule.util.forEachJSONObject +import org.json.JSONObject +import java.util.* + +class HuobiFutures : Market( + MARKET_NAME, + MARKET_NAME, + null +) { + + override val currencyPairsNumOfRequests: Int + get() = 3 + + override fun getCurrencyPairsUrl(requestId: Int): String { + return when(requestId) { + REQUEST_SWAP_COIN -> URL_PAIRS_SWAP_COIN + REQUEST_SWAP_USDT -> URL_PAIRS_SWAP_USDT + + // REQUEST_FUTURES + else -> URL_PAIRS_FUTURES + } + } + + override fun getUrl(requestId: Int, checkerInfo: CheckerInfo): String { + val utlTemplate: String = + if(checkerInfo.contractType <= FuturesContractType.PERPETUAL) { + if(checkerInfo.currencyCounter == VirtualCurrency.USDT) URL_TICKER_SWAP_USDT + else + URL_TICKER_SWAP_COIN + } + else URL_TICKER_FUTURES + + return String.format(utlTemplate, getPairId(checkerInfo)) + } + + private fun getPairId(checkerInfo: CheckerInfo): String? { + return when(checkerInfo.contractType) { + FuturesContractType.NONE, + FuturesContractType.PERPETUAL -> checkerInfo.currencyPairId + + FuturesContractType.WEEKLY -> "${checkerInfo.currencyBase}_CW" + FuturesContractType.BIWEEKLY -> "${checkerInfo.currencyBase}_NW" + + FuturesContractType.QUARTERLY -> "${checkerInfo.currencyBase}_CQ" + FuturesContractType.BIQUARTERLY -> "${checkerInfo.currencyBase}_NQ" + + else -> + throw MarketParseException("Unexpected contract type") + } + } + + @Throws(Exception::class) + override fun parseTickerFromJsonObject(requestId: Int, jsonObject: JSONObject, ticker: Ticker, checkerInfo: CheckerInfo) { + jsonObject.getJSONObject("tick").also { + ticker.bid = it.getJSONArray("bid").getDouble(0) + ticker.ask = it.getJSONArray("ask").getDouble(0) + ticker.vol = it.getDouble("amount") + ticker.volQuote = it.getDouble("vol") + ticker.high = it.getDouble("high") + ticker.low = it.getDouble("low") + ticker.last = it.getDouble("close") + } + } + + @Throws(Exception::class) + override fun parseCurrencyPairsFromJsonObject(requestId: Int, jsonObject: JSONObject, pairs: MutableList) { + fun parseContractType(value: String): FuturesContractType? = + when(value) { + "this_week" -> FuturesContractType.WEEKLY + "next_week" -> FuturesContractType.BIWEEKLY + "quarter" -> FuturesContractType.QUARTERLY + "next_quarter" -> FuturesContractType.BIQUARTERLY + else -> null + } + + if ("ok".equals(jsonObject.getString("status"), ignoreCase = true)) { + + jsonObject.getJSONArray("data") + .forEachJSONObject { market -> + val contractType: FuturesContractType + val quoteAsset: String + + when(requestId) { + REQUEST_SWAP_COIN -> { + contractType = FuturesContractType.PERPETUAL + quoteAsset = Currency.USD + } + REQUEST_SWAP_USDT -> { + contractType = FuturesContractType.PERPETUAL + quoteAsset = VirtualCurrency.USDT + } + + // REQUEST_FUTURES + else -> { + contractType = parseContractType(market.getString("contract_type")) + ?: return@forEachJSONObject + quoteAsset = Currency.USD + } + } + + pairs.add(CurrencyPairInfo( + market.getString("symbol"), + quoteAsset, + market.getString("contract_code"), + contractType + )) + } + } else { + throw Exception("Parse currency pairs error.") + } + } + + companion object { + private const val MARKET_NAME = "Huobi Futures" + + // private const val REQUEST_FUTURES = 0 + private const val REQUEST_SWAP_COIN = 1 + private const val REQUEST_SWAP_USDT = 2 + + private const val URL_PAIRS_FUTURES = "https://api.hbdm.com/api/v1/contract_contract_info" + private const val URL_TICKER_FUTURES = "https://api.hbdm.com/market/detail/merged?symbol=%1\$s" + + private const val URL_PAIRS_SWAP_COIN = "https://api.hbdm.com/swap-api/v1/swap_contract_info" + private const val URL_TICKER_SWAP_COIN = "https://api.hbdm.com/swap-ex/market/detail/merged?contract_code=%1\$s" + + private const val URL_PAIRS_SWAP_USDT = "https://api.hbdm.com/linear-swap-api/v1/swap_contract_info" + private const val URL_TICKER_SWAP_USDT = "https://api.hbdm.com/linear-swap-ex/market/detail/merged?contract_code=%1\$s" + + } +} \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Hydax.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Hydax.kt new file mode 100644 index 00000000..234537a4 --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Hydax.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 Hydax : Market(NAME, TTS_NAME, null) { + companion object { + private const val NAME = "Hydax" + private const val TTS_NAME = NAME + private const val URL = "https://api.hydax.com/openapi/quote/v1/ticker/24hr?symbol=%1\$s" + private const val URL_CURRENCY_PAIRS = "https://api.hydax.com/openapi/v1/brokerInfo" + } + + override fun getCurrencyPairsUrl(requestId: Int): String { + return URL_CURRENCY_PAIRS + } + + override fun parseCurrencyPairsFromJsonObject(requestId: Int, jsonObject: JSONObject, pairs: MutableList) { + val markets = jsonObject.getJSONArray("symbols") + for(i in 0 until markets.length()){ + val market = markets.getJSONObject(i) + + pairs.add( CurrencyPairInfo( + market.getString("baseAsset"), + market.getString("quoteAsset"), + market.getString("symbol") + )) + } + } + + override fun getUrl(requestId: Int, checkerInfo: CheckerInfo): String { + return String.format(URL, checkerInfo.currencyPairId) + } + + override fun parseTickerFromJsonObject(requestId: Int, jsonObject: JSONObject, ticker: Ticker, checkerInfo: CheckerInfo) { + jsonObject.apply { + ticker.ask = getDouble("bestAskPrice") + ticker.bid = getDouble("bestBidPrice") + ticker.high = getDouble("highPrice") + ticker.low = getDouble("lowPrice") + ticker.last = getDouble("lastPrice") + ticker.vol = getDouble("volume") + ticker.timestamp = getLong("time") + } + } +} \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/IndependentReserve.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/IndependentReserve.kt new file mode 100644 index 00000000..48668473 --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/IndependentReserve.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.VirtualCurrency +import org.json.JSONArray +import org.json.JSONObject +import java.time.Instant +import java.util.* + +class IndependentReserve : Market(NAME, TTS_NAME, null) { + companion object { + private const val NAME = "Independent Reserve" + private const val TTS_NAME = NAME + private const val URL_TICKER = "https://api.independentreserve.com/Public/GetMarketSummary?primaryCurrencyCode=%1\$s&secondaryCurrencyCode=%2\$s" + private const val URL_CURRENCY_PRIMARY_CODES = "https://api.independentreserve.com/Public/GetValidPrimaryCurrencyCodes" + private const val URL_CURRENCY_SECONDARY_CODES = "https://api.independentreserve.com/Public/GetValidSecondaryCurrencyCodes" + + private fun getCurrencyPublicName(currency: String): String{ + return if(currency == "XBT") VirtualCurrency.BTC else currency + } + } + + private val latestPrimaryCurrencies = mutableListOf() + + override val currencyPairsNumOfRequests: Int = 2 + + override fun getCurrencyPairsUrl(requestId: Int): String { + return if (requestId == 0) URL_CURRENCY_PRIMARY_CODES else URL_CURRENCY_SECONDARY_CODES + } + + + override fun parseCurrencyPairs(requestId: Int, responseString: String, pairs: MutableList) { + val currencyCodes = JSONArray(responseString) + + // Handling primary currencies + if (requestId == 0) { + latestPrimaryCurrencies.clear() + + for (i in 0 until currencyCodes.length()) { + latestPrimaryCurrencies.add(currencyCodes.getString(i)) + } + } + // Handling secondary currencies + else { + for (i in 0 until currencyCodes.length()) { + val secondaryCurrencyCode = currencyCodes.getString(i) + + latestPrimaryCurrencies.forEach { primaryCurrency -> + pairs.add( + CurrencyPairInfo( + getCurrencyPublicName(primaryCurrency.uppercase(Locale.ROOT)), + secondaryCurrencyCode.uppercase(Locale.ROOT), + null + )) + } + } + + latestPrimaryCurrencies.clear() + } + } + + override fun getUrl(requestId: Int, checkerInfo: CheckerInfo): String { + return String.format(URL_TICKER, checkerInfo.currencyBase, checkerInfo.currencyCounter) + } + + @Throws(Exception::class) + override fun parseTickerFromJsonObject(requestId: Int, jsonObject: JSONObject, ticker: Ticker, checkerInfo: CheckerInfo) { + ticker.bid = jsonObject.getDouble("CurrentHighestBidPrice") + ticker.ask = jsonObject.getDouble("CurrentLowestOfferPrice") + + ticker.high = jsonObject.getDouble("DayHighestPrice") + ticker.low = jsonObject.getDouble("DayLowestPrice") + + ticker.last = jsonObject.getDouble("LastPrice") + @Suppress("SpellCheckingInspection") + ticker.vol = jsonObject.getDouble("DayVolumeXbtInSecondaryCurrrency") + + ticker.timestamp = Instant.parse(jsonObject.getString("CreatedTimestampUtc")).toEpochMilli() + } +} diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Indodax.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Indodax.kt new file mode 100644 index 00000000..8ee90868 --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Indodax.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.util.forEachJSONObject +import org.json.JSONArray +import org.json.JSONObject +import java.util.* + +class Indodax : Market(NAME, TTS_NAME, null) { + companion object { + private const val NAME = "Indodax" + private const val TTS_NAME = NAME + private const val URL = "https://indodax.com/api/ticker/%1\$s" + private const val URL_CURRENCY_PAIRS = "https://indodax.com/api/pairs" + } + + override fun getCurrencyPairsUrl(requestId: Int): String { + return URL_CURRENCY_PAIRS + } + + override fun parseCurrencyPairs(requestId: Int, responseString: String, pairs: MutableList) { + JSONArray(responseString).forEachJSONObject { market -> + pairs.add( + CurrencyPairInfo( + market.getString("traded_currency").uppercase(Locale.ROOT), // Base currency + market.getString("base_currency") + .uppercase(Locale.ROOT), // base_currency is real quoting + market.getString("id") + ) + ) + } + } + + override fun getUrl(requestId: Int, checkerInfo: CheckerInfo): String { + return String.format(URL, checkerInfo.currencyPairId) + } + + override fun parseTickerFromJsonObject(requestId: Int, jsonObject: JSONObject, ticker: Ticker, checkerInfo: CheckerInfo) { + jsonObject.getJSONObject("ticker").apply { + ticker.bid = getDouble("buy") + ticker.ask = getDouble("sell") + ticker.high = getDouble("high") + ticker.low = getDouble("low") + ticker.last = getDouble("last") + ticker.timestamp = getLong("server_time") + + ticker.vol = getDouble("vol_${checkerInfo.currencyBaseLowerCase}") + } + } +} \ 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/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..57478c10 --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Kraken.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.VirtualCurrency +import com.aneonex.bitcoinchecker.datamodule.util.forEachString +import org.json.JSONObject + +class Kraken : Market(NAME, TTS_NAME, null) { + 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" + } + + 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.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") + result.names()!!.forEachString { pairId -> + if (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 resultCurrency = currency + + if (currency.length >= 2) { + val firstChar = currency[0] + if (firstChar == 'Z' || firstChar == 'X') { + resultCurrency = currency.substring(1) + } + } + + if (VirtualCurrency.XBT == resultCurrency) return VirtualCurrency.BTC + if (VirtualCurrency.XVN == resultCurrency) return VirtualCurrency.VEN + if (VirtualCurrency.XDG == resultCurrency) return VirtualCurrency.DOGE + + return resultCurrency + } +} \ 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..7c662660 --- /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..4d98aaa6 --- /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).uppercase(Locale.ENGLISH) + val currencyCounter = pairId.substring(3).uppercase(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/Latoken.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Latoken.kt new file mode 100644 index 00000000..3a851f42 --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Latoken.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.CurrencyPairInfo +import com.aneonex.bitcoinchecker.datamodule.model.Ticker +import com.aneonex.bitcoinchecker.datamodule.model.market.generic.SimpleMarket +import com.aneonex.bitcoinchecker.datamodule.util.forEachJSONObject +import org.json.JSONArray +import org.json.JSONObject + +class Latoken : SimpleMarket( + "LATOKEN", + "https://api.latoken.com/v2/ticker", + "https://api.latoken.com/v2/ticker/%1\$s", + "Latoken" + ) { + + override fun parseCurrencyPairs( + requestId: Int, + responseString: String, + pairs: MutableList + ) { + val pairsJson = JSONArray(responseString) + pairsJson.forEachJSONObject { + val symbol = it.getString("symbol") + val assets = symbol.split('/') + if(assets.size == 2) { + val baseAsset = assets[0] + val quoteAsset = assets[1] + + pairs.add( + CurrencyPairInfo( + baseAsset, + quoteAsset, + symbol + ) + ) + } + } + } + + override fun parseTickerFromJsonObject(requestId: Int, jsonObject: JSONObject, ticker: Ticker, checkerInfo: CheckerInfo) { + jsonObject + .let { + ticker.last = it.getDouble("lastPrice") + + ticker.vol = it.getDouble("amount24h") + ticker.volQuote = it.getDouble("volume24h") + + ticker.bid = it.getDouble("bestBid") + ticker.ask = it.getDouble("bestAsk") + + ticker.timestamp = it.getLong("updateTimestamp") + } + } +} \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Liquid.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Liquid.kt new file mode 100644 index 00000000..6a769255 --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Liquid.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 Liquid : Market(NAME, TTS_NAME, null) { + companion object { + private const val NAME = "Liquid" + private const val TTS_NAME = NAME + private const val URL = "https://api.liquid.com/products/%1\$s" + private const val URL_CURRENCY_PAIRS = "https://api.liquid.com/products" + } + + override fun getCurrencyPairsUrl(requestId: Int): String { + return URL_CURRENCY_PAIRS + } + + override fun parseCurrencyPairs(requestId: Int, responseString: String, pairs: MutableList) { + val marketsJson = JSONArray(responseString) + for (i in 0 until marketsJson.length()) { + val market = marketsJson.getJSONObject(i) + + pairs.add( + CurrencyPairInfo( + market.getString("base_currency"), + market.getString("quoted_currency"), + market.getString("id") + ) + ) + } + } + + override fun getUrl(requestId: Int, checkerInfo: CheckerInfo): String { + return String.format(URL, checkerInfo.currencyPairId) + } + + override fun parseTickerFromJsonObject(requestId: Int, jsonObject: JSONObject, ticker: Ticker, checkerInfo: CheckerInfo) { + jsonObject.apply { + ticker.bid = getDouble("market_bid") + ticker.ask = getDouble("market_ask") + ticker.high = getDouble("high_market_ask") + ticker.low = getDouble("low_market_bid") + ticker.last = getDouble("last_traded_price") + ticker.vol = getDouble("volume_24h") + + // Convert "1603044568.009619132" to "1603044568" + ticker.timestamp = (getString("last_event_timestamp").split('.')[0]).toLong() + } + } +} \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/LiteBit.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/LiteBit.kt new file mode 100644 index 00000000..2bdf8912 --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/LiteBit.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.CurrencyPairInfo +import com.aneonex.bitcoinchecker.datamodule.model.Ticker +import com.aneonex.bitcoinchecker.datamodule.model.currency.Currency +import com.aneonex.bitcoinchecker.datamodule.model.market.generic.SimpleMarket +import org.json.JSONObject +import java.util.* + +class LiteBit : SimpleMarket( + "LiteBit.eu", + "https://api.litebit.eu/markets", + "https://api.litebit.eu/market/%1\$s", + "Lite Bit" + ) { + + override fun parseCurrencyPairsFromJsonObject(requestId: Int, jsonObject: JSONObject, pairs: MutableList) { + val data = jsonObject.getJSONObject("result") + for (key in data.keys()) { + val market = data.getJSONObject(key) + + pairs.add( + CurrencyPairInfo( + market.getString("abbr").uppercase(Locale.ROOT), + Currency.EUR, + key + )) + } + } + + override fun parseTickerFromJsonObject(requestId: Int, jsonObject: JSONObject, ticker: Ticker, checkerInfo: CheckerInfo) { + jsonObject.getJSONObject("result").let { + ticker.last = it.getDouble("buy") // last is not available. Using "buy" like at CoinMarketCap.com + ticker.vol = it.getDouble("volume") + + ticker.bid = it.getDouble("sell") + ticker.ask = it.getDouble("buy") + } + } +} \ 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..82eaf116 --- /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.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..ac0bf605 --- /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..cf87f022 --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Lykke.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 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) + + // Parsing assets from pair in format "BTC/USD" + val pair = pairJsonObject.getString("name").split('/') + if(pair.size != 2) + continue + + pairs.add(CurrencyPairInfo( + pair[0], // Base + pair[1], // Quoting + 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/Mercado.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Mercado.kt new file mode 100644 index 00000000..31996eee --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Mercado.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 Mercado : Market(NAME, TTS_NAME, getCurrencyPairs()) { + companion object { + private const val NAME = "Mercado Bitcoin" + private const val TTS_NAME = "Mercado" + private const val URL = "https://www.mercadobitcoin.net/api/%1\$s/ticker/" + + @Suppress("SpellCheckingInspection") + private fun getCurrencyPairs(): CurrencyPairsMap { + // API Doc: https://www.mercadobitcoin.com.br/api-doc/ + val baseCurrencies = arrayOf( + "ASRFT", + "ATMFT", + VirtualCurrency.BCH, + VirtualCurrency.BTC, + "CAIFT", + "CHZ", + VirtualCurrency.ETH, + "GALFT", + "IMOB01", + "JUVFT", + VirtualCurrency.LINK, + VirtualCurrency.LTC, + "MBCONS01", + "MBCONS02", + "MBFP01", + "MBVASCO01", + + "MBPRK01", + "MBPRK02", + "MBPRK03", + "MBPRK04", + + "PAXG", + "PSGFT", + VirtualCurrency.USDC, + "WBX", + VirtualCurrency.XRP, + ) + + val quoteCurrencies = arrayOf(Currency.BRL) + return baseCurrencies.associateTo(CurrencyPairsMap()) { it to quoteCurrencies } + } + } + + 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/Mexc.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Mexc.kt new file mode 100644 index 00000000..f3eab7ab --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Mexc.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.Ticker +import com.aneonex.bitcoinchecker.datamodule.model.market.generic.SimpleMarket +import com.aneonex.bitcoinchecker.datamodule.util.forEachJSONObject +import org.json.JSONObject + +class Mexc : SimpleMarket( + "MEXC Global", + "https://www.mexc.com/open/api/v2/market/symbols", + "https://www.mexc.com/open/api/v2/market/ticker?symbol=%1\$s", + "Mexc" +) { + + override fun parseCurrencyPairsFromJsonObject( + requestId: Int, + jsonObject: JSONObject, + pairs: MutableList + ) { + jsonObject + .getJSONArray("data") + .forEachJSONObject { market -> + if (market.getString("state") == "ENABLED") { + val symbol = market.getString("symbol") + val assets = symbol.split('_') + if (assets.size == 2) { + pairs.add( + CurrencyPairInfo( + assets[0], // Base + assets[1], // Quote + symbol + ) + ) + } + } + } + } + + override fun parseTickerFromJsonObject( + requestId: Int, + jsonObject: JSONObject, + ticker: Ticker, + checkerInfo: CheckerInfo + ) { + jsonObject + .getJSONArray("data") + .getJSONObject(0) + .also { + ticker.last = it.getDouble("last") + ticker.vol = it.getDouble("volume") + + ticker.timestamp = it.getLong("time") + + ticker.high = it.getDouble("high") + ticker.low = it.getDouble("low") + + ticker.bid = it.getDouble("bid") + ticker.ask = it.getDouble("ask") + } + } +} \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Mexo.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Mexo.kt new file mode 100644 index 00000000..8d71e943 --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Mexo.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.CurrencyPairInfo +import com.aneonex.bitcoinchecker.datamodule.model.Ticker +import com.aneonex.bitcoinchecker.datamodule.model.market.generic.SimpleMarket +import org.json.JSONObject + +class Mexo : SimpleMarket( + "Mexo", + "https://api.mexo.io/openapi/v1/brokerInfo", + "https://api.mexo.io/openapi/quote/v1/ticker/24hr?symbol=%1\$s" +) { + override fun parseCurrencyPairsFromJsonObject(requestId: Int, jsonObject: JSONObject, pairs: MutableList) { + val markets = jsonObject.getJSONArray("symbols") + for(i in 0 until markets.length()){ + val market = markets.getJSONObject(i) + + pairs.add( CurrencyPairInfo( + market.getString("baseAsset"), + market.getString("quoteAsset"), + market.getString("symbol") + )) + } + } + + override fun parseTickerFromJsonObject(requestId: Int, jsonObject: JSONObject, ticker: Ticker, checkerInfo: CheckerInfo) { + with(jsonObject) { + ticker.ask = getDouble("bestAskPrice") + ticker.bid = getDouble("bestBidPrice") + + ticker.high = getDouble("highPrice") + ticker.low = getDouble("lowPrice") + + ticker.last = getDouble("lastPrice") + ticker.vol = getDouble("volume") + ticker.timestamp = getLong("time") + } + } +} \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Mxc.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Mxc.kt new file mode 100644 index 00000000..940eed3d --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Mxc.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 Mxc : Market(NAME, TTS_NAME, null) { + companion object { + private const val NAME = "MXC" + private const val TTS_NAME = NAME + private const val URL = "https://www.mxc.com/open/api/v1/data/ticker?market=%1\$s" + private const val URL_CURRENCY_PAIRS = "https://www.mxc.com/open/api/v1/data/markets" + } + + override fun getCurrencyPairsUrl(requestId: Int): String { + return URL_CURRENCY_PAIRS + } + + override fun parseCurrencyPairsFromJsonObject(requestId: Int, jsonObject: JSONObject, pairs: MutableList) { + val markets = jsonObject.getJSONArray("data") + for(i in 0 until markets.length()){ + val pairId = markets.getString(i) + + // Split pairs like BTC_USDT + val assets = pairId.split('_') + + if(assets.size != 2) + continue + + pairs.add( + CurrencyPairInfo( + assets[0].uppercase(Locale.ROOT), + assets[1].uppercase(Locale.ROOT), + pairId, + )) + } + } + + override fun getUrl(requestId: Int, checkerInfo: CheckerInfo): String { + return String.format(URL, checkerInfo.currencyPairId) + } + + override fun parseTickerFromJsonObject(requestId: Int, jsonObject: JSONObject, ticker: Ticker, checkerInfo: CheckerInfo) { + jsonObject.getJSONObject("data").apply { + ticker.ask = getDouble("sell") + ticker.bid = getDouble("buy") + ticker.high = getDouble("high") + ticker.low = getDouble("low") + ticker.last = getDouble("last") + ticker.vol = getDouble("volume") +// ticker.timestamp = getLong("ts") + } + } +} \ 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/OceanEx.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/OceanEx.kt new file mode 100644 index 00000000..58a483cf --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/OceanEx.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.Ticker +import com.aneonex.bitcoinchecker.datamodule.model.market.generic.SimpleMarket +import org.json.JSONObject + +class OceanEx : SimpleMarket( + "OceanEx", + "https://api.oceanex.pro/v1/markets", + "https://api.oceanex.pro/v1/tickers/%1\$s" + ) { + + override fun parseCurrencyPairsFromJsonObject(requestId: Int, jsonObject: JSONObject, pairs: MutableList) { + val data = jsonObject.getJSONArray("data") + + for (i in 0 until data.length()) { + val market = data.getJSONObject(i) + + val assets = market.getString("name").split('/') + if(assets.size != 2) continue + + pairs.add(CurrencyPairInfo( + assets[0], // Base currency + assets[1], // Quote currency + market.getString("id") + )) + } + } + + override fun parseTickerFromJsonObject(requestId: Int, jsonObject: JSONObject, ticker: Ticker, checkerInfo: CheckerInfo) { + val data = jsonObject.getJSONObject("data") + ticker.timestamp = data.getLong("at") + + data.getJSONObject("ticker").let { + ticker.last = it.getDouble("last") + ticker.high = it.getDouble("high") + ticker.low = it.getDouble("low") + ticker.vol = it.getDouble("vol") + + ticker.bid = it.getDouble("buy") + ticker.ask = it.getDouble("sell") + } + } +} \ 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..a6cddf24 --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Okcoin.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.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 = "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.USD, + Currency.EUR + ) + CURRENCY_PAIRS[VirtualCurrency.ETH] = arrayOf( + Currency.USD, + Currency.EUR + ) + CURRENCY_PAIRS[VirtualCurrency.LTC] = arrayOf( + 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 { + 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 = 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/Okex.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Okex.kt new file mode 100644 index 00000000..70cca43b --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Okex.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.util.TimeUtils +import org.json.JSONArray +import org.json.JSONObject + +class Okex : Market(NAME, TTS_NAME, null) { + companion object { + private const val NAME = "OKEx" + private const val TTS_NAME = "OKEX" + private const val URL = "https://www.okex.com/api/spot/v3/instruments/%1\$s/ticker" + private const val URL_CURRENCY_PAIRS = "https://www.okex.com/api/spot/v3/instruments" + } + + 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 { + 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) { + 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") + ticker.timestamp = TimeUtils.convertISODateToTimestamp(jsonObject.getString("timestamp")) + } +} \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/OkexFutures.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/OkexFutures.kt new file mode 100644 index 00000000..aee607b9 --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/OkexFutures.kt @@ -0,0 +1,88 @@ +package com.aneonex.bitcoinchecker.datamodule.model.market + +import com.aneonex.bitcoinchecker.datamodule.model.* +import com.aneonex.bitcoinchecker.datamodule.util.TimeUtils +import com.aneonex.bitcoinchecker.datamodule.util.forEachJSONObject +import org.json.JSONArray +import org.json.JSONObject +import java.time.format.DateTimeFormatter +import java.util.* + +class OkexFutures : Market( + "OKEx Futures", + "Okex Futures", + null +) { + + override val currencyPairsNumOfRequests: Int + get() = 2 + + override fun getCurrencyPairsUrl(requestId: Int): String = + if(requestId == 0) URL_PAIRS_PERPETUAL else URL_PAIRS_FUTURES + + override fun getUrl(requestId: Int, checkerInfo: CheckerInfo): String { + val urlTemplate = if(checkerInfo.contractType <= FuturesContractType.PERPETUAL) + URL_TICKER_PERPETUAL + else + URL_TICKER_FUTURES + + return String.format(urlTemplate, calculateFuturesPairId(checkerInfo)) + } + + override fun parseCurrencyPairs(requestId: Int, responseString: String, pairs: MutableList) { + fun parseContractType(value: String): FuturesContractType? = + when(value) { + "this_week" -> FuturesContractType.WEEKLY + "next_week" -> FuturesContractType.BIWEEKLY + "quarter" -> FuturesContractType.QUARTERLY + "bi_quarter" -> FuturesContractType.BIQUARTERLY + else -> null + } + + JSONArray(responseString) + .forEachJSONObject { +// val deliveryType = parseFuturesType(it.getString("alias")) ?: return@forEachJSONObject + + val contractType: FuturesContractType = + if(requestId == 0) FuturesContractType.PERPETUAL + else parseContractType(it.getString("alias")) ?: return@forEachJSONObject + + pairs.add( + CurrencyPairInfo( + it.getString("base_currency"), + it.getString("quote_currency"), + it.getString("instrument_id"), + contractType + ) + ) + } + } + + 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_token_24h") + ticker.high = jsonObject.getDouble("high_24h") + ticker.low = jsonObject.getDouble("low_24h") + ticker.last = jsonObject.getDouble("last") + ticker.timestamp = TimeUtils.convertISODateToTimestamp(jsonObject.getString("timestamp")) + } + + companion object { + private const val URL_PAIRS_PERPETUAL = "https://www.okex.com/api/swap/v3/instruments" + private const val URL_PAIRS_FUTURES = "https://www.okex.com/api/futures/v3/instruments" + + private const val URL_TICKER_PERPETUAL = "https://www.okex.com/api/swap/v3/instruments/%1\$s/ticker" + private const val URL_TICKER_FUTURES = "https://www.okex.com/api/futures/v3/instruments/%1\$s/ticker" + + //private val FUTURES_DATE_FORMAT = SimpleDateFormat("yyMMdd", Locale.ROOT) + private val FUTURES_DATE_FORMAT = DateTimeFormatter.ofPattern("yyMMdd", Locale.ROOT) + + private fun calculateFuturesPairId(checkerInfo: CheckerInfo): String? { + val targetDate = FuturesContractType.getDeliveryDate(checkerInfo.contractType) + ?: return checkerInfo.currencyPairId + + return with(checkerInfo){ "$currencyBase-$currencyCounter-${FUTURES_DATE_FORMAT.format(targetDate)}" } + } + } +} \ 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..780f2b72 --- /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/Orionx.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Orionx.kt new file mode 100644 index 00000000..abac0996 --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Orionx.kt @@ -0,0 +1,91 @@ +package com.aneonex.bitcoinchecker.datamodule.model.market + +import com.aneonex.bitcoinchecker.datamodule.exceptions.MarketParseException +import com.aneonex.bitcoinchecker.datamodule.model.* +import org.json.JSONObject +import kotlin.math.pow + +class Orionx : Market(NAME, TTS_NAME, null) { + companion object { + private const val NAME = "Orionx" + private const val TTS_NAME = NAME + private const val URL_GRAPHQL = "https://client.orionx.com/graphql" + private val requestHeaders = mapOf( "fingerprint" to "cualquierfingerprint") + } + + override fun getCurrencyPairsUrl(requestId: Int): String { + return URL_GRAPHQL + } + + // Get top liquid pairs GraphQl query + override fun getCurrencyPairsPostRequestInfo(requestId: Int): PostRequestInfo { + val query = + "{\"query\":\""+ + "query {markets{ code mainCurrency {code} secondaryCurrency {code} }}" + + "\"}" + + return PostRequestInfo(query, requestHeaders) + } + + override fun parseCurrencyPairsFromJsonObject(requestId: Int, jsonObject: JSONObject, pairs: MutableList) { + val markets = jsonObject.getJSONObject("data").getJSONArray("markets") + + for(i in 0 until markets.length()){ + val market = markets.getJSONObject(i) + + val mainCurrency = market.getJSONObject("mainCurrency").getString("code") + val secondaryCurrency = market.getJSONObject("secondaryCurrency").getString("code") + + pairs.add( CurrencyPairInfo( + mainCurrency, + secondaryCurrency, + market.getString("code") + )) + } + } + + override fun getUrl(requestId: Int, checkerInfo: CheckerInfo): String { + return URL_GRAPHQL + } + + // Get pair ticker GraphQl query + override fun getPostRequestInfo(requestId: Int, checkerInfo: CheckerInfo): PostRequestInfo { + val query = + "{\"query\":\" query getTicker(\$marketCode: ID!){" + + " marketCurrentStats(marketCode: \$marketCode, aggregation: d1) {close high low volume }" + + " market(code: \$marketCode){ mainCurrency{units} secondaryCurrency{units} }" + + "}\"" + + ",\"variables\":{\"marketCode\":\"${checkerInfo.currencyPairId}\"}"+ + "}" + + return PostRequestInfo(query, requestHeaders) + } + + override fun parseTickerFromJsonObject(requestId: Int, jsonObject: JSONObject, ticker: Ticker, checkerInfo: CheckerInfo) { + val dataJson = jsonObject.getJSONObject("data") + val marketJson = dataJson.getJSONObject("market") + + fun getCurrencyDecimals(currencyType: String): Double{ + return marketJson + .getJSONObject(currencyType) + .getInt("units") + .let { + 10.0.pow(it.toDouble()) + } + } + + val baseCurrencyDecimals = getCurrencyDecimals("mainCurrency") + val quoteCurrencyDecimals = getCurrencyDecimals("secondaryCurrency") + + dataJson + .getJSONObject("marketCurrentStats") + .apply { + ticker.vol = getLong("volume").also { + if(it <= 0) throw MarketParseException("No trading volume") + } / baseCurrencyDecimals + ticker.last = getLong("close") / quoteCurrencyDecimals + ticker.high = getLong("high") / quoteCurrencyDecimals + ticker.low = getLong("low") / quoteCurrencyDecimals + } + } +} \ 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..6bad1bbd --- /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/Pdax.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Pdax.kt new file mode 100644 index 00000000..100d0489 --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Pdax.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.VirtualCurrency +import com.aneonex.bitcoinchecker.datamodule.model.currency.CurrencyPairsMap +import org.json.JSONObject + +class Pdax : Market(NAME, TTS_NAME, CURRENCY_PAIRS) { + companion object { + private const val NAME = "PDAX" + private const val TTS_NAME = NAME + private const val URL = "https://trade.pdax.ph/moon/v1/market/tick/ANX/%1\$s%2\$s" + private val CURRENCY_PAIRS: CurrencyPairsMap = CurrencyPairsMap() + + init { + CURRENCY_PAIRS[VirtualCurrency.BTC] = arrayOf(Currency.PHP) + CURRENCY_PAIRS[VirtualCurrency.BCH] = arrayOf(Currency.PHP) + CURRENCY_PAIRS[VirtualCurrency.ETH] = arrayOf(Currency.PHP, VirtualCurrency.BTC) + CURRENCY_PAIRS[VirtualCurrency.XRP] = arrayOf(Currency.PHP, VirtualCurrency.BTC) + CURRENCY_PAIRS[VirtualCurrency.LTC] = arrayOf(Currency.PHP) + CURRENCY_PAIRS[VirtualCurrency.USDT] = arrayOf(Currency.PHP) + } + } + + 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 pairId = "${checkerInfo.currencyBase}${checkerInfo.currencyCounter}" + + jsonObject + .getJSONArray("data") + .getJSONObject(0) + .getJSONObject(pairId) + .let { + ticker.last = it.getDouble("last") + ticker.vol = it.getDouble("volume") + + ticker.high = it.getDouble("high") + ticker.low = it.getDouble("low") + + // bid and ask is not real time in the response + // ticker.bid = it.getDouble("bid") + // ticker.ask = it.getDouble("ask") + + ticker.timestamp = it.getLong("timestampMillis") + } + } +} \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Phemex.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Phemex.kt new file mode 100644 index 00000000..dbc6e332 --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Phemex.kt @@ -0,0 +1,68 @@ +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.Ticker +import com.aneonex.bitcoinchecker.datamodule.model.market.generic.SimpleMarket +import com.aneonex.bitcoinchecker.datamodule.util.forEachJSONObject +import org.json.JSONObject + +class Phemex : SimpleMarket( + "Phemex", + "https://api.phemex.com/exchange/public/cfg/v2/products", + "https://api.phemex.com/md/spot/ticker/24hr?symbol=%1\$s" +) { + + override fun parseCurrencyPairsFromJsonObject( + requestId: Int, + jsonObject: JSONObject, + pairs: MutableList + ) { + jsonObject + .getJSONObject("data") + .getJSONArray("products") + .forEachJSONObject { market -> + if (market.getString("type") == "Spot") { + pairs.add( + CurrencyPairInfo( + market.getString("baseCurrency"), + market.getString("quoteCurrency"), + market.getString("symbol") + ) + ) + } + } + } + + override fun parseTickerFromJsonObject( + requestId: Int, + jsonObject: JSONObject, + ticker: Ticker, + checkerInfo: CheckerInfo + ) { + jsonObject + .getJSONObject("result") + .let { jsonTicker -> + ticker.apply { + last = jsonTicker.getValueEp("lastEp") + + high = jsonTicker.getValueEp("highEp") + low = jsonTicker.getValueEp("lowEp") + + vol = jsonTicker.getValueEp("volumeEv") + volQuote = jsonTicker.getValueEp("turnoverEv") + + bid = jsonTicker.getValueEp("bidEp") + ask = jsonTicker.getValueEp("askEp") + + timestamp = jsonTicker.getLong("timestamp") / 1_000_000 + } + } + } + + companion object { + private fun JSONObject.getValueEp(name: String): Double { + return getLong(name) / 100_000_000.0 + } + } +} \ 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..1ec0559e --- /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 com.aneonex.bitcoinchecker.datamodule.util.forEachString +import org.json.JSONObject + +class Poloniex : Market(NAME, TTS_NAME, null) { + companion object { + private const val NAME = "Poloniex" + private const val TTS_NAME = NAME + private const val URL = "https://poloniex.com/public?command=returnTicker" + } + + 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) { + jsonObject.names()!!.forEachString { pairId -> + val currencies = pairId.split('_') + if (currencies.size == 2) { + pairs.add(CurrencyPairInfo(currencies[1], currencies[0], pairId)) //reversed pairs + } + } + } +} \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/ProBit.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/ProBit.kt new file mode 100644 index 00000000..4c32f31e --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/ProBit.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.Ticker +import com.aneonex.bitcoinchecker.datamodule.model.market.generic.SimpleMarket +import com.aneonex.bitcoinchecker.datamodule.util.TimeUtils +import org.json.JSONObject + +class ProBit : SimpleMarket( + "ProBit", + "https://api.probit.com/api/exchange/v1/market", + "https://api.probit.com/api/exchange/v1/ticker?market_ids=%1\$s" + ) { + + override fun parseCurrencyPairsFromJsonObject(requestId: Int, jsonObject: JSONObject, pairs: MutableList) { + val markets = jsonObject.getJSONArray("data") + + for (i in 0 until markets.length()) { + val market = markets.getJSONObject(i) + + if(market.getBoolean("closed")) + continue + + pairs.add(CurrencyPairInfo( + market.getString("base_currency_id"), + market.getString("quote_currency_id"), + market.getString("id") + )) + } + } + + override fun parseTickerFromJsonObject(requestId: Int, jsonObject: JSONObject, ticker: Ticker, checkerInfo: CheckerInfo) { + jsonObject + .getJSONArray("data") + .getJSONObject(0) + .let { + ticker.last = it.getDouble("last") + ticker.high = it.getDouble("high") + ticker.low = it.getDouble("low") + ticker.vol = it.getDouble("base_volume") + + ticker.timestamp = TimeUtils.convertISODateToTimestamp(it.getString("time")) + } + } +} \ 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..e1f7be88 --- /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/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/TheRock.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/TheRock.kt new file mode 100644 index 00000000..621cf117 --- /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/Tokok.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Tokok.kt new file mode 100644 index 00000000..21b989ac --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Tokok.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.Ticker +import com.aneonex.bitcoinchecker.datamodule.model.market.generic.SimpleMarket +import org.json.JSONObject +import java.util.* + +class Tokok : SimpleMarket( + "TOKOK", + "https://www.tokok.com/api/v1/tickers", + "https://www.tokok.com/api/v1/ticker?symbol=%1\$s", + "Tokok" + ) { + + override fun parseCurrencyPairsFromJsonObject(requestId: Int, jsonObject: JSONObject, pairs: MutableList) { + val markets = jsonObject.getJSONArray("ticker") + + for (i in 0 until markets.length()) { + val market = markets.getJSONObject(i) + + val symbol = market.getString("symbol") + val assets = symbol.split('_') + if(assets.size != 2) continue + + pairs.add(CurrencyPairInfo( + assets[0], // Base currency + assets[1], // Quote currency + symbol.lowercase(Locale.ROOT) + )) + } + } + + override fun parseTickerFromJsonObject(requestId: Int, jsonObject: JSONObject, ticker: Ticker, checkerInfo: CheckerInfo) { + ticker.timestamp = jsonObject.getLong("timestamp") + + jsonObject + .getJSONObject("ticker") + .let { + ticker.last = it.getDouble("last") + ticker.high = it.getDouble("high") + ticker.low = it.getDouble("low") + ticker.vol = it.getDouble("vol") + + ticker.bid = it.getDouble("buy") + ticker.ask = it.getDouble("sell") + } + } +} \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/UniswapV2.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/UniswapV2.kt new file mode 100644 index 00000000..92f1fda9 --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/UniswapV2.kt @@ -0,0 +1,101 @@ +package com.aneonex.bitcoinchecker.datamodule.model.market + +import com.aneonex.bitcoinchecker.datamodule.R +import com.aneonex.bitcoinchecker.datamodule.model.* +import com.aneonex.bitcoinchecker.datamodule.util.forEachJSONObject +import org.json.JSONObject + +class UniswapV2 : Market(NAME, TTS_NAME, null) { + companion object { + private const val NAME = "Uniswap (v2)" + private const val TTS_NAME = "Uniswap v2" + private const val URL = "https://api.thegraph.com/subgraphs/name/uniswap/uniswap-v2" + private const val URL_CURRENCY_PAIRS = URL + + private fun getStableCoinWeight(symbol: String): Int { + return when(symbol){ + "WETH", "WBTC" -> 1 + "USDC", "USDT", "EURS" -> 2 + else -> 0 + } + } + } + + override val cautionResId: Int get() = R.string.market_caution_uniswap + + override fun getCurrencyPairsUrl(requestId: Int): String { + return URL_CURRENCY_PAIRS + } + + // Get top liquid pairs GraphQl query + override fun getCurrencyPairsPostRequestInfo(requestId: Int): PostRequestInfo { + val body = "{\"query\":\"{pairs(first: 500, orderBy:reserveUSD, orderDirection:desc) {id token0{symbol} token1{symbol}}}\"}" + return PostRequestInfo( body ) + } + + override fun parseCurrencyPairsFromJsonObject(requestId: Int, jsonObject: JSONObject, pairs: MutableList) { + val addedPairs = HashSet() + + jsonObject + .getJSONObject("data") + .getJSONArray("pairs") + .forEachJSONObject { market -> + + val token0 = market.getJSONObject("token0").getString("symbol") + val token1 = market.getJSONObject("token1").getString("symbol") + + val token0BaseWeight = getStableCoinWeight(token0) + val token1BaseWeight = getStableCoinWeight(token1) + + val pairId = market.getString("id") + + val baseSymbol = if(token1BaseWeight < token0BaseWeight) token1 else token0 + val quoteSymbol = if(token1BaseWeight < token0BaseWeight) token0 else token1 + + if(!addedPairs.add("$baseSymbol:$quoteSymbol")) + return@forEachJSONObject // already added most liquid version + + pairs.add( CurrencyPairInfo(baseSymbol, quoteSymbol, pairId)) + + if(token1BaseWeight == token0BaseWeight) { + // Adding reverse pair + + if(!addedPairs.add("$quoteSymbol:$baseSymbol")) + return@forEachJSONObject // already added most liquid version + + pairs.add(CurrencyPairInfo(quoteSymbol, baseSymbol, pairId)) + } + } + } + + override fun getUrl(requestId: Int, checkerInfo: CheckerInfo): String { + return URL + } + + // Get pair ticker GraphQl query + override fun getPostRequestInfo(requestId: Int, checkerInfo: CheckerInfo): PostRequestInfo { + val body = "{\"query\":\"{"+ + // Get pair price + "pair(id: \\\"${checkerInfo.currencyPairId}\\\"){token0{symbol} token1Price token0Price} " + + // Get pair timestamp + "swaps(first: 1, where: { pair: \\\"${checkerInfo.currencyPairId}\\\" } orderBy: timestamp, orderDirection: desc) {timestamp}"+ + "}\"}" + + return PostRequestInfo(body) + } + + override fun parseTickerFromJsonObject(requestId: Int, jsonObject: JSONObject, ticker: Ticker, checkerInfo: CheckerInfo) { + val dataJson = jsonObject.getJSONObject("data") + val pairJson = dataJson.getJSONObject("pair") + + val token0 = pairJson.getJSONObject("token0").getString("symbol") + val isReversePair = token0 != checkerInfo.currencyBase + + ticker.last = if(isReversePair) pairJson.getDouble("token0Price") else pairJson.getDouble("token1Price") + + val swaps = dataJson.getJSONArray("swaps") + if(swaps.length() > 0) { + ticker.timestamp = swaps.getJSONObject(0).getLong("timestamp") + } + } +} \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/UnknownMarket.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/UnknownMarket.kt new file mode 100644 index 00000000..f6858bef --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/UnknownMarket.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 UnknownMarket : 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/Upbit.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Upbit.kt new file mode 100644 index 00000000..29c7ee94 --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Upbit.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 + +class Upbit : Market(NAME, TTS_NAME, null) { + companion object { + private const val NAME = "Upbit" + private const val TTS_NAME = "Up bit" + private const val URL = "https://api.upbit.com/v1/ticker?markets=%1\$s" + private const val URL_CURRENCY_PAIRS = "https://api.upbit.com/v1/market/all?isDetails=false" + } + + override fun getCurrencyPairsUrl(requestId: Int): String { + return URL_CURRENCY_PAIRS + } + + override fun parseCurrencyPairs(requestId: Int, responseString: String, pairs: MutableList) { + val markets = JSONArray(responseString) + + for(i in 0 until markets.length()){ + val market = markets.getJSONObject(i) + + val marketId = market.getString("market") + val assets = marketId.split("-") + if(assets.size != 2) continue + + pairs.add( CurrencyPairInfo( + assets[1], + assets[0], + marketId, + )) + } + } + + override fun getUrl(requestId: Int, checkerInfo: CheckerInfo): String { + return String.format(URL, checkerInfo.currencyPairId) + } + + override fun parseTicker(requestId: Int, responseString: String, ticker: Ticker, checkerInfo: CheckerInfo) { + val jsonArray = JSONArray(responseString) + + jsonArray.getJSONObject(0).apply { + ticker.high = getDouble("high_price") + ticker.low = getDouble("low_price") + ticker.last = getDouble("trade_price") + ticker.vol = getDouble("acc_trade_volume") + ticker.timestamp = getLong("timestamp") + } + } +} \ 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..b464b91b --- /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 (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/Vaultoro.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Vaultoro.kt new file mode 100644 index 00000000..b029f311 --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/Vaultoro.kt @@ -0,0 +1,50 @@ +package com.aneonex.bitcoinchecker.datamodule.model.market + +import com.aneonex.bitcoinchecker.datamodule.exceptions.MarketParseException +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 +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/v1/public/ohlc?pair=%1\$s&since=%2\$s" + private val CURRENCY_PAIRS: CurrencyPairsMap = CurrencyPairsMap() + + init { + CURRENCY_PAIRS[Currency.GOLD] = arrayOf( + VirtualCurrency.BTC, + VirtualCurrency.DASH + ) + } + } + + override fun getUrl(requestId: Int, checkerInfo: CheckerInfo): String { + 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 parseTickerFromJsonObject(requestId: Int, jsonObject: JSONObject, ticker: Ticker, checkerInfo: CheckerInfo) { + val dataJson = jsonObject.getJSONArray("data") + if(dataJson.length() == 0) throw MarketParseException("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 diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/WazirX.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/WazirX.kt new file mode 100644 index 00000000..98d26806 --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/WazirX.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 WazirX : Market(NAME, TTS_NAME, null) { + companion object { + private const val NAME = "WazirX" + private const val TTS_NAME = "Wazir X" + private const val URL = "https://api.wazirx.com/api/v2/tickers/%1\$s" + private const val URL_CURRENCY_PAIRS = "https://api.wazirx.com/api/v2/market-status" + } + + override fun getCurrencyPairsUrl(requestId: Int): String { + return URL_CURRENCY_PAIRS + } + + override fun parseCurrencyPairsFromJsonObject(requestId: Int, jsonObject: JSONObject, pairs: MutableList) { + val marketsJson = jsonObject.getJSONArray("markets") + for (i in 0 until marketsJson.length()) { + val market = marketsJson.getJSONObject(i) + + val baseCurrency = market.getString("baseMarket") + val qouteCurrency = market.getString("quoteMarket") + val pairId = "$baseCurrency$qouteCurrency" + + pairs.add( + CurrencyPairInfo( + baseCurrency.uppercase(Locale.ROOT), + qouteCurrency.uppercase(Locale.ROOT), + pairId + ) + ) + } + } + + override fun getUrl(requestId: Int, checkerInfo: CheckerInfo): String { + return String.format(URL, checkerInfo.currencyPairId) + } + + override fun parseTickerFromJsonObject(requestId: Int, jsonObject: JSONObject, ticker: Ticker, checkerInfo: CheckerInfo) { + jsonObject.apply { + getJSONObject("ticker").apply { + ticker.bid = getDouble("buy") + ticker.ask = getDouble("sell") + ticker.high = getDouble("high") + ticker.low = getDouble("low") + ticker.last = getDouble("last") + ticker.vol = getDouble("vol") + } + ticker.timestamp = getLong("at") + } + } +} \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/XthetaGlobal.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/XthetaGlobal.kt new file mode 100644 index 00000000..94d686d3 --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/XthetaGlobal.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 + +class XthetaGlobal : Market(NAME, TTS_NAME, null) { + companion object { + private const val NAME = "Xtheta Global" + private const val TTS_NAME = NAME + private const val URL = "https://api.xthetaglobal.com/openapi/quote/v1/ticker/24hr?symbol=%1\$s" + private const val URL_CURRENCY_PAIRS = "https://api.xthetaglobal.com/openapi/quote/v1/ticker/24hr" + + + private val templateAssets = arrayOf("BTC", "ETH", "USDT") + + private fun tryParseSymbol(symbol: String): Array { + for(templateAsset in templateAssets){ + if(symbol.endsWith(templateAsset)) { + return arrayOf( + symbol.substring(0, symbol.length-templateAsset.length), // base asset + templateAsset // quote asset + ) + } else + if (symbol.startsWith(templateAsset)){ + return arrayOf( + templateAsset, // base asset + symbol.substring(templateAsset.length, symbol.length) // quote asset + ) + } + } + + return arrayOf() + } + } + + override fun getCurrencyPairsUrl(requestId: Int): String { + return URL_CURRENCY_PAIRS + } + + override fun parseCurrencyPairs(requestId: Int, responseString: String, pairs: MutableList) { + val markets = JSONArray(responseString) + + for(i in 0 until markets.length()){ + val market = markets.getJSONObject(i) + + val symbol = market.getString("symbol") + + val assets = tryParseSymbol(symbol) + if(assets.size != 2) + continue + + pairs.add( CurrencyPairInfo( + assets[0], // Base asset + assets[1], // Quote asset + symbol + )) + } + } + + override fun getUrl(requestId: Int, checkerInfo: CheckerInfo): String { + return String.format(URL, checkerInfo.currencyPairId) + } + + override fun parseTickerFromJsonObject(requestId: Int, jsonObject: JSONObject, ticker: Ticker, checkerInfo: CheckerInfo) { + jsonObject.apply { + ticker.ask = getDouble("bestAskPrice") + ticker.bid = getDouble("bestBidPrice") + ticker.high = getDouble("highPrice") + ticker.low = getDouble("lowPrice") + ticker.last = getDouble("lastPrice") + ticker.vol = getDouble("volume") + ticker.timestamp = getLong("time") + } + } +} \ 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..00701bbf --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/YoBit.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.R +import com.aneonex.bitcoinchecker.datamodule.util.forEachString +import org.json.JSONObject +import java.util.* + +class YoBit : Market(NAME, TTS_NAME, null) { + 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" + } + + 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) { + jsonObject.getJSONObject("pairs").names()!!.forEachString { pairId -> + val currencies = pairId.split('_') + if (currencies.size == 2) { + val currencyBase = currencies[0].uppercase(Locale.ROOT) + val currencyCounter = currencies[1].uppercase(Locale.ROOT) + pairs.add(CurrencyPairInfo(currencyBase, currencyCounter, pairId)) + } + } + } +} \ No newline at end of file diff --git a/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/ZgCom.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/ZgCom.kt new file mode 100644 index 00000000..d0574eb9 --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/ZgCom.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.util.forEachJSONObject +import org.json.JSONObject + +class ZgCom : Market(NAME, TTS_NAME, null) { + companion object { + private const val NAME = "ZG.com" + private const val TTS_NAME = "ZG dot com" + private const val URL = "https://api.zg.com/openapi/quote/v1/ticker/24hr?symbol=%1\$s" + private const val URL_CURRENCY_PAIRS = "https://api.zg.com/openapi/v1/brokerInfo" + } + + override fun getCurrencyPairsUrl(requestId: Int): String { + return URL_CURRENCY_PAIRS + } + + override fun parseCurrencyPairsFromJsonObject(requestId: Int, jsonObject: JSONObject, pairs: MutableList) { + jsonObject.getJSONArray("symbols").forEachJSONObject { market -> + if(market.getString("status") != "TRADING") return@forEachJSONObject + + pairs.add( CurrencyPairInfo( + market.getString("baseAsset"), + market.getString("quoteAsset"), + market.getString("symbol"), + )) + } + } + + override fun getUrl(requestId: Int, checkerInfo: CheckerInfo): String { + return String.format(URL, checkerInfo.currencyPairId) + } + + override fun parseTickerFromJsonObject(requestId: Int, jsonObject: JSONObject, ticker: Ticker, checkerInfo: CheckerInfo) { + jsonObject.apply { + ticker.bid = getDouble("bestBidPrice") + ticker.ask = getDouble("bestAskPrice") + ticker.high = getDouble("highPrice") + ticker.low = getDouble("lowPrice") + ticker.last = getDouble("lastPrice") + ticker.vol = getDouble("volume") + ticker.timestamp = getLong("time") + } + } +} \ 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/model/market/generic/SimpleMarket.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/generic/SimpleMarket.kt new file mode 100644 index 00000000..d0f46cdf --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/model/market/generic/SimpleMarket.kt @@ -0,0 +1,24 @@ +package com.aneonex.bitcoinchecker.datamodule.model.market.generic + +import com.aneonex.bitcoinchecker.datamodule.model.CheckerInfo +import com.aneonex.bitcoinchecker.datamodule.model.Market + +abstract class SimpleMarket( + name: String, + private val pairsUrl: String, + private val tickerUrl: String, + ttsName: String = name + ): Market(name, ttsName, null) { + + override fun getCurrencyPairsUrl(requestId: Int): String { + return pairsUrl + } + + override fun getUrl(requestId: Int, checkerInfo: CheckerInfo): String { + return String.format(tickerUrl, getPairId(checkerInfo)) + } + + open fun getPairId(checkerInfo: CheckerInfo): String? { + return checkerInfo.currencyPairId + } +} \ 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..7cc5ea51 --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/util/CurrencyPairsMapHelper.kt @@ -0,0 +1,58 @@ +package com.aneonex.bitcoinchecker.datamodule.util + +import com.aneonex.bitcoinchecker.datamodule.model.CurrencyPairInfo +import com.aneonex.bitcoinchecker.datamodule.model.CurrencyPairsListWithDate +import com.aneonex.bitcoinchecker.datamodule.model.FuturesContractType +import com.aneonex.bitcoinchecker.datamodule.model.currency.CurrencyPairsMap + +class CurrencyPairsMapHelper(currencyPairsListWithDate: CurrencyPairsListWithDate?) { + constructor(currencyMap: CurrencyPairsMap?): this(convertPairsMapToPairList(currencyMap)) + + val date: Long = currencyPairsListWithDate?.date ?: 0 + private val pairs: List = currencyPairsListWithDate?.pairs?.sorted() ?: listOf() + + fun isEmpty() = pairs.isEmpty() + val size: Int get() = pairs.size + + val baseAssets: Iterable get() = + pairs + .map { it.currencyBase } + .distinct() + + fun getQuoteAssets(baseAsset: String): Iterable = + pairs + .filter { it.currencyBase == baseAsset } + .map { it.currencyCounter } + .distinct() + + fun getCurrencyPairId(baseAsset: String?, quoteAsset: String?, contractType: FuturesContractType): String? { + if(baseAsset == null || quoteAsset == null) return null + return pairs + .firstOrNull { it.currencyBase == baseAsset + && it.currencyCounter == quoteAsset + && it.contractType == contractType} + ?.currencyPairId + } + + fun getAvailableFuturesContractsTypes(baseAsset: String?, quoteAsset: String?): List { + if(baseAsset == null || quoteAsset == null) return listOf() + + return pairs + .filter { it.currencyBase == baseAsset && it.currencyCounter == quoteAsset } + .map { it.contractType } + } + + companion object { + private fun convertPairsMapToPairList(currencyMap: CurrencyPairsMap?): CurrencyPairsListWithDate? { + if(currencyMap == null) return null + + return CurrencyPairsListWithDate(0, + currencyMap.flatMap { item -> + item.value.map { quoteAsset -> + CurrencyPairInfo(item.key, quoteAsset, null) + } + } + ) + } + } +} \ 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..f9343d77 --- /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 CurrencySymbols.CURRENCY_SYMBOLS[currency] ?: currency + } + + fun getCurrencySubunit(currency: String?, subunitToUnit: Long): CurrencySubunit { + val subunits = CurrenciesSubunits.CURRENCIES_SUBUNITS[currency] + if (subunits != null) { + if (subunits.containsKey(subunitToUnit)) return subunits.getValue(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..3ac64a72 --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/util/FormatUtilsBase.kt @@ -0,0 +1,98 @@ +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_NO_DECIMAL = DecimalFormat("#,###") + private val FORMAT_TWO_DECIMAL = DecimalFormat("#,###.00") + private val FORMAT_FOUR_SIGNIFICANT_AT_MOST = DecimalFormat("@###") + private val FORMAT_EIGHT_SIGNIFICANT_AT_MOST = DecimalFormat("@#######") + + // ==================== + // Format methods + // ==================== + fun formatDouble(value: Double/*, isPrice: Boolean*/): String { + val decimalFormat: DecimalFormat = when { + value < 10 -> FORMAT_FOUR_SIGNIFICANT_AT_MOST + value < 10000 -> FORMAT_TWO_DECIMAL + else -> FORMAT_NO_DECIMAL + } + + return formatDouble(decimalFormat, value) + } + + @Suppress("unused") + fun formatDoubleWithEightMax(value: Double): String { + return formatDouble(FORMAT_EIGHT_SIGNIFICANT_AT_MOST, value) + } + + @Suppress("unused") + fun formatDoubleWithFourMax(value: Double): String { + return formatDouble(FORMAT_FOUR_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 + } + + 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/JsonUtils.kt b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/util/JsonUtils.kt new file mode 100644 index 00000000..2acfddda --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/util/JsonUtils.kt @@ -0,0 +1,32 @@ +package com.aneonex.bitcoinchecker.datamodule.util + +import org.json.JSONArray +import org.json.JSONObject + + +fun JSONArray.forEachString(function: (item: String) -> Unit) { + for(i in 0 until this.length()) { + function(this.getString(i)) + } +} + +fun JSONArray.forEachJSONObject(function: (item: JSONObject) -> Unit) { + for(i in 0 until this.length()) { + function(this.getJSONObject(i)) + } +} + +fun JSONArray.forEachJSONArray(function: (item: JSONArray) -> Unit) { + for(i in 0 until this.length()) { + function(this.getJSONArray(i)) + } +} + +fun JSONObject.forEachName(function: (name: String, item: JSONObject) -> Unit) { + val namesJsonArray = this.names()!! + for (i in 0 until namesJsonArray.length()) { + val name = namesJsonArray.getString(i) + val item = this.getJSONObject(name) + function(name, item) + } +} 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..c807dbfa --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/util/MarketsConfigUtils.kt @@ -0,0 +1,26 @@ +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.UnknownMarket + +object MarketsConfigUtils { + private val UNKNOWN_MARKET: Market = UnknownMarket() + + @Suppress("unused") + val defaultMarket: Market = MarketsConfig.MARKETS.values.first() + + fun getMarketByKey(key: String?): Market { + synchronized(MarketsConfig.MARKETS) { + return MarketsConfig.MARKETS.getOrDefault(key, null) ?: UNKNOWN_MARKET + } + } +/* + 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..3d6bd0ef --- /dev/null +++ b/dataModule/src/main/java/com/aneonex/bitcoinchecker/datamodule/util/TimeUtils.kt @@ -0,0 +1,29 @@ +package com.aneonex.bitcoinchecker.datamodule.util + +import java.time.ZonedDateTime +import java.time.format.DateTimeFormatter + +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 + 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 + } + + // Parsing string and converting to timestamp (in milliseconds). + // Returns 0 if parsing failed + fun convertISODateToTimestamp(isoDateString: String): Long { + return ZonedDateTime.parse(isoDateString, DateTimeFormatter.ISO_DATE_TIME).toEpochSecond() * MILLIS_IN_SECOND + } +} \ 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 9e9ee2f5..00000000 --- a/dataModule/src/main/java/com/mobnetic/coinguardian/config/MarketsConfig.java +++ /dev/null @@ -1,152 +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 Btcchina()); - addMarket(new Btce()); - addMarket(new Bitcurex()); - 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 BitcoinAverage()); - 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 Anxpro()); - addMarket(new BitX()); - addMarket(new CCex()); - addMarket(new BitMarketPL()); - 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 SwissCex()); - 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 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()); - 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 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()); - 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 76466dbe..00000000 --- a/dataModule/src/main/java/com/mobnetic/coinguardian/model/currency/VirtualCurrency.java +++ /dev/null @@ -1,373 +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 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 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/Binance.java b/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/Binance.java deleted file mode 100644 index c905e8d9..00000000 --- a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/Binance.java +++ /dev/null @@ -1,73 +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 Binance extends Market { - - private final static String NAME = "Binance"; - private final static String TTS_NAME = NAME; - private final static String URL = "https://api.binance.com/api/v1/ticker/24hr?symbol=%1$s"; - private final static String URL_CURRENCY_PAIRS = "https://api.binance.com/api/v1/ticker/allPrices"; - - private final static String[] COUNTER_CURRENCIES = { - VirtualCurrency.BNB, - VirtualCurrency.BTC, - VirtualCurrency.ETH, - VirtualCurrency.USDT - }; - - public Binance() { - 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("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 - public String getCurrencyPairsUrl(int requestId) { - return URL_CURRENCY_PAIRS; - } - - @Override - protected void parseCurrencyPairs(int requestId, String responseString, List pairs) throws Exception { - final JSONArray resultJsonArray = new JSONArray(responseString); - - 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/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/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/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/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.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[]{ - 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) { - return URL; - } - - @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/BitcoinTrade.java b/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/BitcoinTrade.java deleted file mode 100644 index 35e10b2e..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/v1/public/%1$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.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 fc427b93..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 = "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/"; - - 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.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/BitexLa.java b/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/BitexLa.java deleted file mode 100644 index 271e76f5..00000000 --- a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/BitexLa.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 BitexLa extends Market { - - private final static String NAME = "Bitex.la"; - private final static String TTS_NAME = "Bitex"; - private final static String URL = "https://bitex.la/api-v1/rest/btc/market/ticker"; - private final static HashMap 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 9ed34cb2..00000000 --- a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/Bitfinex.java +++ /dev/null @@ -1,145 +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.bitfinex.com/v1/pubticker/%1$s"; - private final static String URL_CURRENCY_PAIRS = "https://api.bitfinex.com/v1/symbols"; - 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 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); - } - - // ==================== - // 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 String pairId = pairsArray.getString(i); - if (pairId != null && pairId.length() == 6) { - pairs.add(new CurrencyPairInfo( - pairId.substring(0, 3).toUpperCase(Locale.US), - pairId.substring(3).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 dc7a5167..00000000 --- a/dataModule/src/main/java/com/mobnetic/coinguardian/model/market/Bithumb.java +++ /dev/null @@ -1,107 +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 - }); - } - - 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("volume_1day"); - 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_PAIRS.put(VirtualCurrency.BCH, new String[]{ - VirtualCurrency.BTC, - Currency.EUR, - Currency.USD - }); - CURRENCY_PAIRS.put(Currency.EUR, new String[]{ - Currency.USD - }); - CURRENCY_PAIRS.put(VirtualCurrency.ETH, new String[]{ - VirtualCurrency.BTC, - Currency.EUR, - Currency.USD - }); - CURRENCY_PAIRS.put(VirtualCurrency.LTC, new String[]{ - VirtualCurrency.BTC, - Currency.EUR, - Currency.USD - }); - CURRENCY_PAIRS.put(VirtualCurrency.XRP, new String[]{ - VirtualCurrency.BTC, - Currency.EUR, - Currency.USD - }); - } - - 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 b1944017..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://bitcambio_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.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/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 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 817b64de..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/v1/open/tick?symbol=%1$s"; - - private final static String URL_COINS_PAIRS = "https://api.kucoin.com/v1/market/open/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("lastDealPrice"); - ticker.timestamp = tickerJsonObject.getLong("datetime"); - } - - // ==================== - // 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("coinType"), - pairJsonObject.getString("coinTypePair"), - 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/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 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 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.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 b359a311..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_THREE_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); - } - - public static String formatDoubleWithThreeMax(double value) { - return formatDouble(FORMAT_THREE_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 8c8260fb..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/dataModule/src/main/res/values/market_cautions.xml b/dataModule/src/main/res/values/market_cautions.xml index 52d37863..885aeedf 100644 --- a/dataModule/src/main/res/values/market_cautions.xml +++ b/dataModule/src/main/res/values/market_cautions.xml @@ -2,8 +2,11 @@ Selected market was probably removed and does not exist. Please choose another one. - 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. - This exchange has limit for 3000 requests per hour. Make sure you don\'t exceed the limit:) - This exchange has limit for 100 requests per minute. Make sure you don\'t exceed the limit:) - + Caution: Due to this exchange\'s specification, checking the price on it may consume a lot of mobile data (while on mobile network). Be sure that you understand the possible consequences. + This exchange has a limit of 3000 requests per hour. Make sure you don\'t exceed the limit:) + This exchange has a limit of 100 requests per minute. Make sure you don\'t exceed the limit:) + This is a decentralized exchange (DEX). + The price is obtained via the third party resource TheGraph.com. + Only top 500 most liquid pairs are used. + diff --git a/dataModuleTester/build.gradle b/dataModuleTester/build.gradle index 0f5061a7..32037bbf 100644 --- a/dataModuleTester/build.gradle +++ b/dataModuleTester/build.gradle @@ -1,25 +1,55 @@ -apply plugin: 'com.android.application' +plugins { + id 'com.android.application' + id 'kotlin-android' +} android { - compileSdkVersion 23 - buildToolsVersion "24.0.3" + compileSdkVersion compile_sdk_version + buildToolsVersion build_tools_version + + buildFeatures { + viewBinding true + } defaultConfig { - applicationId "com.mobnetic.coinguardiandatamodule.tester" - minSdkVersion 9 - targetSdkVersion 18 + applicationId "com.aneonex.bitcoinchecker.tester" + minSdkVersion min_sdk_version + targetSdkVersion compile_sdk_version + + versionCode 1 + versionName "1.0" } buildTypes { release { minifyEnabled false - proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt' + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } } + + compileOptions { + sourceCompatibility JavaVersion.VERSION_11 + targetCompatibility JavaVersion.VERSION_11 + } + + kotlinOptions { + jvmTarget = '11' + } + + lintOptions { + abortOnError true + disable 'MissingTranslation' + } } 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.8.8' + implementation 'com.android.volley:volley:1.2.1' + + // AndroidX + implementation "androidx.core:core-ktx:$core_ktx_version" + + implementation "androidx.appcompat:appcompat:1.4.0" + implementation 'com.google.android.material:material:1.4.0' +} \ No newline at end of file diff --git a/dataModuleTester/libs/volley.jar b/dataModuleTester/libs/volley.jar deleted file mode 100644 index 0a6b8ea5..00000000 Binary files a/dataModuleTester/libs/volley.jar and /dev/null differ diff --git a/dataModuleTester/proguard-rules.pro b/dataModuleTester/proguard-rules.pro new file mode 100644 index 00000000..481bb434 --- /dev/null +++ b/dataModuleTester/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/dataModuleTester/src/main/AndroidManifest.xml b/dataModuleTester/src/main/AndroidManifest.xml index 986dcfea..72a07665 100644 --- a/dataModuleTester/src/main/AndroidManifest.xml +++ b/dataModuleTester/src/main/AndroidManifest.xml @@ -1,22 +1,17 @@ + package="com.aneonex.bitcoinchecker.tester"> - - + android:theme="@style/AppTheme" + android:allowBackup="false"> - + 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..f1b4fb35 --- /dev/null +++ b/dataModuleTester/src/main/java/com/aneonex/bitcoinchecker/tester/MainActivity.kt @@ -0,0 +1,354 @@ +package com.aneonex.bitcoinchecker.tester + +import android.content.Context +import android.os.Bundle +import android.text.SpannableStringBuilder +import android.view.View +import android.widget.* +import android.widget.AdapterView.OnItemSelectedListener +import androidx.appcompat.app.AppCompatActivity +import androidx.core.view.isVisible +import com.android.volley.NetworkResponse +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.util.CurrencyPairsMapHelper +import com.aneonex.bitcoinchecker.datamodule.util.FormatUtilsBase +import com.aneonex.bitcoinchecker.datamodule.util.MarketsConfigUtils.getMarketByKey +import com.aneonex.bitcoinchecker.tester.databinding.MainActivityBinding +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 : AppCompatActivity() { + private lateinit var binding: MainActivityBinding + + private inner class MarketEntry(var key: String, var name: String) { + override fun toString(): String { + return name + } + } + + private lateinit var requestQueue: RequestQueue + private lateinit var currencyPairsMapHelper: CurrencyPairsMapHelper + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + + binding = MainActivityBinding.inflate(layoutInflater) + setContentView(binding.root) + + requestQueue = HttpsHelper.newRequestQueue(this) + + refreshMarketSpinner() + currencyPairsMapHelper = createCurrencyPairsMapHelper(this@MainActivity, selectedMarket) + refreshCurrencySpinners() + showResultView(true) + binding.marketSpinner.onItemSelectedListener = object : OnItemSelectedListener { + override fun onItemSelected(arg0: AdapterView<*>?, arg1: View?, arg2: Int, arg3: Long) { + currencyPairsMapHelper = createCurrencyPairsMapHelper(this@MainActivity, selectedMarket) + binding.resultView.text = "" + refreshCurrencySpinners() + } + + override fun onNothingSelected(arg0: AdapterView<*>?) { + // do nothing + } + } + binding.dynamicCurrencyPairsInfoView.setOnClickListener { + object : DynamicCurrencyPairsDialog(this@MainActivity, selectedMarket, currencyPairsMapHelper) { + override fun onPairsUpdated(market: Market, currencyPairsMapHelper: CurrencyPairsMapHelper?) { + this@MainActivity.currencyPairsMapHelper = currencyPairsMapHelper ?: createCurrencyPairsMapHelper(this@MainActivity, selectedMarket) + refreshCurrencySpinners() + } + }.show() + } + binding.currencyBaseSpinner.onItemSelectedListener = object : OnItemSelectedListener { + override fun onItemSelected(arg0: AdapterView<*>?, arg1: View?, arg2: Int, arg3: Long) { + refreshCurrencyCounterSpinner() + } + + override fun onNothingSelected(arg0: AdapterView<*>?) { + // do nothing + } + } + binding.currencyCounterSpinner.onItemSelectedListener = object : OnItemSelectedListener { + override fun onItemSelected(arg0: AdapterView<*>?, arg1: View?, arg2: Int, arg3: Long) { + refreshFuturesContractTypeSpinner() + } + + override fun onNothingSelected(arg0: AdapterView<*>?) { + // do nothing + } + } + + binding.getResultButton.setOnClickListener { newResult } + // binding.testAllButton.setOnClickListener { testAllExchanges() } + } + + // ==================== + // Get selected items + // ==================== + private val selectedMarket: Market + get() { + val marketEntry = binding.marketSpinner.selectedItem as MarketEntry + return getMarketByKey(marketEntry.key) + } + + private val selectedCurrencyBase: String? + get() = if (binding.currencyBaseSpinner.adapter == null) null else binding.currencyBaseSpinner.selectedItem.toString() + private val selectedCurrencyCounter: String? + get() = if (binding.currencyCounterSpinner.adapter == null) null else binding.currencyCounterSpinner.selectedItem.toString() + private val selectedFuturesContractType: FuturesContractType + get() = if (binding.currencyCounterSpinner.adapter == null || !binding.futuresContractTypeSpinner.isVisible) FuturesContractType.NONE + else binding.futuresContractTypeSpinner.selectedItem as FuturesContractType + + // ==================== + // 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; + } +*/ + val entries = MarketsConfig.MARKETS.values + .sortedBy { market -> market.name.uppercase() } + .map { market -> MarketEntry(market.key, market.name) } + + binding.marketSpinner.adapter = ArrayAdapter(this, android.R.layout.simple_spinner_dropdown_item, entries) + } + + private fun refreshCurrencySpinners() { + refreshCurrencyBaseSpinner() + refreshCurrencyCounterSpinner() + refreshDynamicCurrencyPairsView() + val isCurrencyEmpty = selectedCurrencyBase == null || selectedCurrencyCounter == null + binding.currencySpinnersWrapper.isVisible = !isCurrencyEmpty + binding.dynamicCurrencyPairsWarningView.isVisible = isCurrencyEmpty + binding.getResultButton.isVisible = !isCurrencyEmpty + } + + private fun refreshDynamicCurrencyPairsView() { + binding.dynamicCurrencyPairsInfoView.isEnabled = selectedMarket.getCurrencyPairsUrl(0) != null + } + + private fun refreshCurrencyBaseSpinner() { + if (!currencyPairsMapHelper.isEmpty()) { + binding.currencyBaseSpinner.adapter = ArrayAdapter( + this, + android.R.layout.simple_spinner_dropdown_item, + currencyPairsMapHelper.baseAssets.toList() + ) + } else { + binding.currencyBaseSpinner.adapter = null + } + } + + private fun refreshCurrencyCounterSpinner() { + val baseAsset = selectedCurrencyBase + if (!currencyPairsMapHelper.isEmpty() && !baseAsset.isNullOrEmpty()) { + binding.currencyCounterSpinner.adapter = ArrayAdapter( + this, + android.R.layout.simple_spinner_dropdown_item, + currencyPairsMapHelper.getQuoteAssets(baseAsset).toList() + ) + } else { + binding.currencyCounterSpinner.adapter = null + } + + refreshFuturesContractTypeSpinner() + } + + private fun refreshFuturesContractTypeSpinner() { + val availableContractTypes = currencyPairsMapHelper.getAvailableFuturesContractsTypes(selectedCurrencyBase, selectedCurrencyCounter) + var spinnerAdapter: SpinnerAdapter? = null + if (availableContractTypes.any { it != FuturesContractType.NONE }) { +/* + 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, availableContractTypes.toTypedArray()) + } + binding.futuresContractTypeSpinner.adapter = spinnerAdapter + binding.futuresContractTypeSpinner.isVisible = spinnerAdapter != null + } + + private fun showResultView(showResultView: Boolean) { + binding.getResultButton.isEnabled = showResultView + binding.progressBar.isVisible = !showResultView + binding.resultView.isVisible = showResultView + } +/* + private fun getProperCurrencyPairs(market: Market): HashMap>? { + val currencyPairsMapHelper = currencyPairsMapHelper + + return if (!currencyPairsMapHelper.isEmpty()) + currencyPairsMapHelper.pa + else market.currencyPairs + } +*/ + + // ==================== + // Get && display results + // ==================== + private val newResult: Unit + get() { + val market = selectedMarket + val currencyBase = selectedCurrencyBase + val currencyCounter = selectedCurrencyCounter + // val contractType = getSelectedContractType(market) + val contractType = selectedFuturesContractType + val pairId = currencyPairsMapHelper.getCurrencyPairId(currencyBase, currencyCounter, contractType) + val checkerInfo = CheckerInfo(currencyBase!!, currencyCounter!!, pairId, contractType) + val 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 (errorMsg.isNullOrEmpty()) 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, FormatUtilsBase.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_base, ticker.vol, checkerInfo.currencyBase)) + ssb.append(createNewPriceLineIfNeeded(R.string.ticker_vol_quote, ticker.volQuote, checkerInfo.currencyCounter)) + ssb.append(""" + + ${getString(R.string.ticker_timestamp, FormatUtilsBase.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) + binding.resultView.text = ssb + } + + private fun createNewPriceLineIfNeeded(textResId: Int, price: Double, currency: String): String { + return if (price <= Ticker.NO_DATA) "" else """ + + ${getString(textResId, FormatUtilsBase.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, queue updating...") + requestQueue.add(createRequestDynamicCurrencyPairs(this, market)) + + 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 = CheckerVolleyMainRequest(market, checkerInfo, + object : ResponseListener() { + override fun onResponse(url: String?, requestHeaders: Map?, networkResponse: NetworkResponse?, responseString: String?, response: TickerWrapper?) { + handleTestExchange(market.name, url, null) + } + }, object : ResponseErrorListener() { + override fun onErrorResponse(url: String?, requestHeaders: Map?, networkResponse: NetworkResponse?, responseString: String?, error: VolleyError) { +// error.printStackTrace() + handleTestExchange(market.name, url, error) + } + }) + requestQueue.add(request) + } + } + + private fun handleTestExchange(marketName: String, url: String?, error: VolleyError?) { +// showResultView(true) + + val sb = StringBuilder() + + sb.append("TEST_RESULT [$marketName]: ") + + if(error == null) + sb.append("Success") + else + sb.append("FAILED") + + sb.append(": ") + sb.append(url ?: "Unknown uri") + + if(error?.cause != null) + sb.append("\nDetails: ${error.cause}") + + Log.d(tag, sb.toString()) + } + + private fun createRequestDynamicCurrencyPairs(context: Context, market: Market): DynamicCurrencyPairsVolleyMainRequest { + return DynamicCurrencyPairsVolleyMainRequest(context, market, + object : ResponseListener() { + override fun onResponse(url: String?, requestHeaders: Map?, networkResponse: NetworkResponse?, responseString: String?, response: CurrencyPairsMapHelper?) { + handleTestExchange(market.name, url, null) + } + }, object : ResponseErrorListener() { + override fun onErrorResponse(url: String?, requestHeaders: Map?, networkResponse: NetworkResponse?, responseString: String?, error: VolleyError) { + handleTestExchange(market.name, url, error) + } + }) + } + */ + + companion object { + private fun createCurrencyPairsMapHelper(context: Context, market: Market): CurrencyPairsMapHelper { + val pairsFromStore = MarketCurrencyPairsStore.getPairsForMarket(context, market.key) + return if(pairsFromStore != null) + CurrencyPairsMapHelper(pairsFromStore) + else + CurrencyPairsMapHelper(market.currencyPairs) + } + } +} \ No newline at end of file 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..8395901f --- /dev/null +++ b/dataModuleTester/src/main/java/com/aneonex/bitcoinchecker/tester/dialog/DynamicCurrencyPairsDialog.kt @@ -0,0 +1,96 @@ +package com.aneonex.bitcoinchecker.tester.dialog + +import android.content.Context +import android.content.DialogInterface +import android.text.SpannableStringBuilder +import android.view.LayoutInflater +import androidx.appcompat.app.AlertDialog +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.databinding.DynamicCurrencyPairsDialogBinding +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, val market: Market, currencyPairsMapHelper: CurrencyPairsMapHelper?) : AlertDialog(context), DialogInterface.OnDismissListener { + private val binding = DynamicCurrencyPairsDialogBinding.inflate(LayoutInflater.from(context)) + private val requestQueue: RequestQueue = HttpsHelper.newRequestQueue(context) + private var currencyPairsMapHelper: CurrencyPairsMapHelper? + + 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?, response: CurrencyPairsMapHelper?) { + this@DynamicCurrencyPairsDialog.currencyPairsMapHelper = response + 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) + binding.statusView.text = context.getString(R.string.checker_add_dynamic_currency_pairs_dialog_last_sync, dateString) + if (currencyPairsMapHelper != null && currencyPairsMapHelper!!.size > 0) binding.statusView.append(""" + + ${context.getString(R.string.checker_add_dynamic_currency_pairs_dialog_pairs, currencyPairsMapHelper!!.size)} + """.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) + binding.errorView.text = ssb + } + + private fun startRefreshingAnim() { + setCancelable(false) + binding.refreshImageView.isEnabled = false + } + + fun stopRefreshingAnim() { + setCancelable(true) + binding.refreshImageView.isEnabled = true + } + + abstract fun onPairsUpdated(market: Market, currencyPairsMapHelper: CurrencyPairsMapHelper?) + + init { + // setInverseBackgroundForced(true) + 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?) + + binding.refreshImageView.setOnClickListener { startRefreshing() } + refreshStatusView(null, null, null, null, null, null) + + setView(binding.root) + } +} \ No newline at end of file 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..b05f0c1e --- /dev/null +++ b/dataModuleTester/src/main/java/com/aneonex/bitcoinchecker/tester/util/CheckErrorsUtils.kt @@ -0,0 +1,75 @@ +package com.aneonex.bitcoinchecker.tester.util + +import android.content.Context +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 when (error) { + is NetworkError -> context.getString(R.string.check_error_network) + is TimeoutError -> context.getString(R.string.check_error_timeout) + is ClientError -> context.getString(R.string.check_error_client) + is ServerError -> context.getString(R.string.check_error_server) + 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 = "" + if(headers != null) { + 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(SpannableUtils.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(SpannableUtils.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(SpannableUtils.fromHtml(context.getString(R.string.ticker_raw_response) + "" + limitedRawResponse + "")) + } + if (exception != null) { + ssb.append("\n\n") + ssb.append(SpannableUtils.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.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.kt b/dataModuleTester/src/main/java/com/aneonex/bitcoinchecker/tester/util/MarketCurrencyPairsStore.kt new file mode 100644 index 00000000..74300668 --- /dev/null +++ b/dataModuleTester/src/main/java/com/aneonex/bitcoinchecker/tester/util/MarketCurrencyPairsStore.kt @@ -0,0 +1,39 @@ +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_CURRENCY_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).apply() + } + + fun getPairsForMarket(context: Context, marketKey: String): CurrencyPairsListWithDate? { + val pairsJson = getPairsStringForMarket(context, marketKey) ?: return null + + return try { + Gson().fromJson(pairsJson, 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/util/SpannableUtils.kt b/dataModuleTester/src/main/java/com/aneonex/bitcoinchecker/tester/util/SpannableUtils.kt new file mode 100644 index 00000000..ce6293f3 --- /dev/null +++ b/dataModuleTester/src/main/java/com/aneonex/bitcoinchecker/tester/util/SpannableUtils.kt @@ -0,0 +1,10 @@ +package com.aneonex.bitcoinchecker.tester.util + +import android.text.Spanned +import androidx.core.text.HtmlCompat + +object SpannableUtils { + fun fromHtml(source: String): Spanned { + return HtmlCompat.fromHtml(source, HtmlCompat.FROM_HTML_MODE_COMPACT) + } +} \ No newline at end of file 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.kt b/dataModuleTester/src/main/java/com/aneonex/bitcoinchecker/tester/volley/CheckerVolleyMainRequest.kt new file mode 100644 index 00000000..77734009 --- /dev/null +++ b/dataModuleTester/src/main/java/com/aneonex/bitcoinchecker/tester/volley/CheckerVolleyMainRequest.kt @@ -0,0 +1,66 @@ +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), market.getPostRequestInfo(0, checkerInfo), checkerInfo, listener, errorListener) { + + private val market: Market + @Throws(Exception::class) + override fun parseNetworkResponse(headers: Map?, responseString: String?): TickerWrapper { + val tickerWrapper = TickerWrapper() + var tickerParseException: Exception? = null + try { + tickerWrapper.ticker = market.parseTickerMain(0, responseString!!, TickerImpl(), checkerInfo) + } catch (e: Exception) { + e.printStackTrace() + tickerParseException = e + 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) { + tickerParseException?.message + } + 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) + val nextPostRequestInfo = market.getPostRequestInfo(requestId, checkerInfo) + if (!TextUtils.isEmpty(nextUrl)) { + val request = CheckerVolleyNextRequest(nextUrl, nextPostRequestInfo, 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.kt b/dataModuleTester/src/main/java/com/aneonex/bitcoinchecker/tester/volley/CheckerVolleyNextRequest.kt new file mode 100644 index 00000000..8e922361 --- /dev/null +++ b/dataModuleTester/src/main/java/com/aneonex/bitcoinchecker/tester/volley/CheckerVolleyNextRequest.kt @@ -0,0 +1,14 @@ +package com.aneonex.bitcoinchecker.tester.volley + +import com.android.volley.toolbox.RequestFuture +import com.aneonex.bitcoinchecker.datamodule.model.CheckerInfo +import com.aneonex.bitcoinchecker.datamodule.model.PostRequestInfo +import com.aneonex.bitcoinchecker.tester.volley.generic.GenericCheckerVolleyRequest + +class CheckerVolleyNextRequest(url: String?, postRequestInfo: PostRequestInfo?, checkerInfo: CheckerInfo, future: RequestFuture) + : GenericCheckerVolleyRequest(url, postRequestInfo, 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.kt b/dataModuleTester/src/main/java/com/aneonex/bitcoinchecker/tester/volley/DynamicCurrencyPairsVolleyMainRequest.kt new file mode 100644 index 00000000..f6fb407c --- /dev/null +++ b/dataModuleTester/src/main/java/com/aneonex/bitcoinchecker/tester/volley/DynamicCurrencyPairsVolleyMainRequest.kt @@ -0,0 +1,68 @@ +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), + market.getCurrencyPairsPostRequestInfo(0), + listener, + errorListener) { + + @Throws(Exception::class) + override fun parseNetworkResponse(headers: Map?, responseString: String?): CurrencyPairsMapHelper { + if (isCanceled) + return CurrencyPairsMapHelper(CurrencyPairsListWithDate()) + + 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) + val nextRequestInfo = market.getCurrencyPairsPostRequestInfo(requestId) + + if (!TextUtils.isEmpty(nextUrl)) { + val request = DynamicCurrencyPairsVolleyNextRequest(nextUrl, nextRequestInfo, 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().also { + it.date = System.currentTimeMillis() + it.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.kt b/dataModuleTester/src/main/java/com/aneonex/bitcoinchecker/tester/volley/DynamicCurrencyPairsVolleyNextRequest.kt new file mode 100644 index 00000000..71a8b985 --- /dev/null +++ b/dataModuleTester/src/main/java/com/aneonex/bitcoinchecker/tester/volley/DynamicCurrencyPairsVolleyNextRequest.kt @@ -0,0 +1,12 @@ +package com.aneonex.bitcoinchecker.tester.volley + +import com.android.volley.toolbox.RequestFuture +import com.aneonex.bitcoinchecker.datamodule.model.PostRequestInfo +import com.aneonex.bitcoinchecker.tester.volley.generic.GzipVolleyRequest + +class DynamicCurrencyPairsVolleyNextRequest(url: String?, postRequestInfo: PostRequestInfo?, future: RequestFuture) : GzipVolleyRequest(url, postRequestInfo, 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/TickerImpl.kt b/dataModuleTester/src/main/java/com/aneonex/bitcoinchecker/tester/volley/TickerImpl.kt new file mode 100644 index 00000000..a50a3f25 --- /dev/null +++ b/dataModuleTester/src/main/java/com/aneonex/bitcoinchecker/tester/volley/TickerImpl.kt @@ -0,0 +1,15 @@ +package com.aneonex.bitcoinchecker.tester.volley + +import com.aneonex.bitcoinchecker.datamodule.model.Ticker +import com.aneonex.bitcoinchecker.datamodule.model.Ticker.Companion.NO_DATA + +internal class TickerImpl: Ticker { + override var bid: Double = NO_DATA.toDouble() + override var ask: Double = NO_DATA.toDouble() + override var vol: Double = NO_DATA.toDouble() + override var volQuote: Double = NO_DATA.toDouble() + override var high: Double = NO_DATA.toDouble() + override var low: Double = NO_DATA.toDouble() + override var last: Double = NO_DATA.toDouble() + override var timestamp: Long = NO_DATA.toLong() +} \ No newline at end of file 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.kt b/dataModuleTester/src/main/java/com/aneonex/bitcoinchecker/tester/volley/generic/GenericCheckerVolleyRequest.kt new file mode 100644 index 00000000..26afe781 --- /dev/null +++ b/dataModuleTester/src/main/java/com/aneonex/bitcoinchecker/tester/volley/generic/GenericCheckerVolleyRequest.kt @@ -0,0 +1,8 @@ +package com.aneonex.bitcoinchecker.tester.volley.generic + +import com.android.volley.Response +import com.aneonex.bitcoinchecker.datamodule.model.CheckerInfo +import com.aneonex.bitcoinchecker.datamodule.model.PostRequestInfo + +abstract class GenericCheckerVolleyRequest(url: String?, postRequestInfo: PostRequestInfo?, protected val checkerInfo: CheckerInfo, listener: Response.Listener, errorListener: Response.ErrorListener) + : GzipVolleyRequest(url, postRequestInfo, listener, errorListener) \ No newline at end of file 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..f3597f21 --- /dev/null +++ b/dataModuleTester/src/main/java/com/aneonex/bitcoinchecker/tester/volley/generic/GzipVolleyRequest.kt @@ -0,0 +1,156 @@ +package com.aneonex.bitcoinchecker.tester.volley.generic + +import com.android.volley.* +import com.android.volley.toolbox.HttpHeaderParser +import com.aneonex.bitcoinchecker.datamodule.model.PostRequestInfo +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.zip.GZIPInputStream + +abstract class GzipVolleyRequest(url: String?, private val postRequestInfo: PostRequestInfo?, private val listener: Response.Listener, errorListener: Response.ErrorListener) + : Request(if (postRequestInfo == null) Method.GET else Method.POST, url, errorListener) { + + companion object { + private const val MAX_REDIRECTION_COUNT = 3 + + /** Default charset for JSON request. */ + private val PROTOCOL_CHARSET = Charsets.UTF_8 + } + + private val initialErrorListener = errorListener + private val headers: Map + 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 + + init { + if(method == Method.POST && postRequestInfo == null) throw IllegalArgumentException("Invalid arguments: postRequestInfo cannot be null for POST method") + + headers = mutableMapOf ( + "Accept-Encoding" to "gzip", + "User-Agent" to "Bitcoin Checker (gzip)" + ) + + postRequestInfo?.headers?.let { + for (item in it){ + headers[item.key] = item.value + } + } + + // Disable cache for volley requests + setShouldCache(false) + } + + override fun getUrl(): String { + return if (redirectionUrl != null) redirectionUrl.toString() else super.getUrl() + } + + override fun getBodyContentType(): String { + return if(postRequestInfo != null) "application/json; charset=$PROTOCOL_CHARSET" else super.getBodyContentType() + } + + override fun getBody(): ByteArray { + return if(postRequestInfo != null) return postRequestInfo.body.toByteArray(PROTOCOL_CHARSET) else super.getBody() + } + + @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?.get("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?.get("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 + } +} \ No newline at end of file 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.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 diff --git a/dataModuleTester/src/main/java/com/mobnetic/coinguardiandatamodule/tester/MainActivity.java b/dataModuleTester/src/main/java/com/mobnetic/coinguardiandatamodule/tester/MainActivity.java deleted file mode 100644 index 3e66139f..00000000 --- a/dataModuleTester/src/main/java/com/mobnetic/coinguardiandatamodule/tester/MainActivity.java +++ /dev/null @@ -1,299 +0,0 @@ -package com.mobnetic.coinguardiandatamodule.tester; - -import java.util.HashMap; -import java.util.Map; - -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.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; - -public class MainActivity extends Activity { - - 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() { - int size = MarketsConfig.MARKETS.size(); - int idx = (size - 1) - marketSpinner.getSelectedItemPosition(); - return MarketsConfigUtils.getMarketById(idx); - } - - 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.contractTypes[selection]; - } - return Futures.CONTRACT_TYPE_WEEKLY; - } - - - // ==================== - // Refreshing UI - // ==================== - private void refreshMarketSpinner() { - final CharSequence[] entries = new String[MarketsConfig.MARKETS.size()]; - int i = entries.length - 1; - for(Market market : MarketsConfig.MARKETS.values()) { - entries[i--] = market.name; - } - - 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.contractTypes.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/mobnetic/coinguardiandatamodule/tester/dialog/DynamicCurrencyPairsDialog.java b/dataModuleTester/src/main/java/com/mobnetic/coinguardiandatamodule/tester/dialog/DynamicCurrencyPairsDialog.java deleted file mode 100644 index da5687ef..00000000 --- a/dataModuleTester/src/main/java/com/mobnetic/coinguardiandatamodule/tester/dialog/DynamicCurrencyPairsDialog.java +++ /dev/null @@ -1,127 +0,0 @@ -package com.mobnetic.coinguardiandatamodule.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.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; - -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/mobnetic/coinguardiandatamodule/tester/util/CheckErrorsUtils.java b/dataModuleTester/src/main/java/com/mobnetic/coinguardiandatamodule/tester/util/CheckErrorsUtils.java deleted file mode 100644 index cb4ccfc6..00000000 --- a/dataModuleTester/src/main/java/com/mobnetic/coinguardiandatamodule/tester/util/CheckErrorsUtils.java +++ /dev/null @@ -1,86 +0,0 @@ -package com.mobnetic.coinguardiandatamodule.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.mobnetic.coinguardiandatamodule.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/mobnetic/coinguardiandatamodule/tester/util/HttpsHelper.java b/dataModuleTester/src/main/java/com/mobnetic/coinguardiandatamodule/tester/util/HttpsHelper.java deleted file mode 100644 index 55865e39..00000000 --- a/dataModuleTester/src/main/java/com/mobnetic/coinguardiandatamodule/tester/util/HttpsHelper.java +++ /dev/null @@ -1,51 +0,0 @@ -package com.mobnetic.coinguardiandatamodule.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/mobnetic/coinguardiandatamodule/tester/util/MarketCurrencyPairsStore.java b/dataModuleTester/src/main/java/com/mobnetic/coinguardiandatamodule/tester/util/MarketCurrencyPairsStore.java deleted file mode 100644 index fe347d3d..00000000 --- a/dataModuleTester/src/main/java/com/mobnetic/coinguardiandatamodule/tester/util/MarketCurrencyPairsStore.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.mobnetic.coinguardiandatamodule.tester.util; - -import android.content.Context; -import android.content.SharedPreferences; - -import com.google.gson.Gson; -import com.mobnetic.coinguardian.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/mobnetic/coinguardiandatamodule/tester/volley/CheckerErrorParsedError.java b/dataModuleTester/src/main/java/com/mobnetic/coinguardiandatamodule/tester/volley/CheckerErrorParsedError.java deleted file mode 100644 index ef3cfa44..00000000 --- a/dataModuleTester/src/main/java/com/mobnetic/coinguardiandatamodule/tester/volley/CheckerErrorParsedError.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.mobnetic.coinguardiandatamodule.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/mobnetic/coinguardiandatamodule/tester/volley/CheckerVolleyMainRequest.java b/dataModuleTester/src/main/java/com/mobnetic/coinguardiandatamodule/tester/volley/CheckerVolleyMainRequest.java deleted file mode 100644 index 4c56ee1c..00000000 --- a/dataModuleTester/src/main/java/com/mobnetic/coinguardiandatamodule/tester/volley/CheckerVolleyMainRequest.java +++ /dev/null @@ -1,72 +0,0 @@ -package com.mobnetic.coinguardiandatamodule.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.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; - -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/mobnetic/coinguardiandatamodule/tester/volley/CheckerVolleyNextRequest.java b/dataModuleTester/src/main/java/com/mobnetic/coinguardiandatamodule/tester/volley/CheckerVolleyNextRequest.java deleted file mode 100644 index 9fc871b2..00000000 --- a/dataModuleTester/src/main/java/com/mobnetic/coinguardiandatamodule/tester/volley/CheckerVolleyNextRequest.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.mobnetic.coinguardiandatamodule.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; - -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/mobnetic/coinguardiandatamodule/tester/volley/DynamicCurrencyPairsVolleyMainRequest.java b/dataModuleTester/src/main/java/com/mobnetic/coinguardiandatamodule/tester/volley/DynamicCurrencyPairsVolleyMainRequest.java deleted file mode 100644 index 45464ef2..00000000 --- a/dataModuleTester/src/main/java/com/mobnetic/coinguardiandatamodule/tester/volley/DynamicCurrencyPairsVolleyMainRequest.java +++ /dev/null @@ -1,70 +0,0 @@ -package com.mobnetic.coinguardiandatamodule.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.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; - -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/mobnetic/coinguardiandatamodule/tester/volley/DynamicCurrencyPairsVolleyNextRequest.java b/dataModuleTester/src/main/java/com/mobnetic/coinguardiandatamodule/tester/volley/DynamicCurrencyPairsVolleyNextRequest.java deleted file mode 100644 index 496f6397..00000000 --- a/dataModuleTester/src/main/java/com/mobnetic/coinguardiandatamodule/tester/volley/DynamicCurrencyPairsVolleyNextRequest.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.mobnetic.coinguardiandatamodule.tester.volley; - -import java.util.Map; - -import com.android.volley.toolbox.RequestFuture; -import com.mobnetic.coinguardiandatamodule.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/mobnetic/coinguardiandatamodule/tester/volley/UnknownVolleyError.java b/dataModuleTester/src/main/java/com/mobnetic/coinguardiandatamodule/tester/volley/UnknownVolleyError.java deleted file mode 100644 index b25bc99d..00000000 --- a/dataModuleTester/src/main/java/com/mobnetic/coinguardiandatamodule/tester/volley/UnknownVolleyError.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.mobnetic.coinguardiandatamodule.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/mobnetic/coinguardiandatamodule/tester/volley/generic/GenericCheckerVolleyRequest.java b/dataModuleTester/src/main/java/com/mobnetic/coinguardiandatamodule/tester/volley/generic/GenericCheckerVolleyRequest.java deleted file mode 100644 index aed7f800..00000000 --- a/dataModuleTester/src/main/java/com/mobnetic/coinguardiandatamodule/tester/volley/generic/GenericCheckerVolleyRequest.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.mobnetic.coinguardiandatamodule.tester.volley.generic; - -import com.android.volley.Response.ErrorListener; -import com.android.volley.Response.Listener; -import com.mobnetic.coinguardian.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/mobnetic/coinguardiandatamodule/tester/volley/generic/GzipVolleyRequest.java b/dataModuleTester/src/main/java/com/mobnetic/coinguardiandatamodule/tester/volley/generic/GzipVolleyRequest.java deleted file mode 100644 index b8fee520..00000000 --- a/dataModuleTester/src/main/java/com/mobnetic/coinguardiandatamodule/tester/volley/generic/GzipVolleyRequest.java +++ /dev/null @@ -1,165 +0,0 @@ -package com.mobnetic.coinguardiandatamodule.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.mobnetic.coinguardiandatamodule.tester.volley.CheckerErrorParsedError; -import com.mobnetic.coinguardiandatamodule.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/mobnetic/coinguardiandatamodule/tester/volley/generic/ResponseErrorListener.java b/dataModuleTester/src/main/java/com/mobnetic/coinguardiandatamodule/tester/volley/generic/ResponseErrorListener.java deleted file mode 100644 index cbcc502d..00000000 --- a/dataModuleTester/src/main/java/com/mobnetic/coinguardiandatamodule/tester/volley/generic/ResponseErrorListener.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.mobnetic.coinguardiandatamodule.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/mobnetic/coinguardiandatamodule/tester/volley/generic/ResponseListener.java b/dataModuleTester/src/main/java/com/mobnetic/coinguardiandatamodule/tester/volley/generic/ResponseListener.java deleted file mode 100644 index 25b9cf35..00000000 --- a/dataModuleTester/src/main/java/com/mobnetic/coinguardiandatamodule/tester/volley/generic/ResponseListener.java +++ /dev/null @@ -1,16 +0,0 @@ -package com.mobnetic.coinguardiandatamodule.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/res/layout/dynamic_currency_pairs_dialog.xml b/dataModuleTester/src/main/res/layout/dynamic_currency_pairs_dialog.xml index 3af7d426..f5e44c07 100644 --- a/dataModuleTester/src/main/res/layout/dynamic_currency_pairs_dialog.xml +++ b/dataModuleTester/src/main/res/layout/dynamic_currency_pairs_dialog.xml @@ -24,7 +24,7 @@ diff --git a/dataModuleTester/src/main/res/layout/main_activity.xml b/dataModuleTester/src/main/res/layout/main_activity.xml index 437d2d63..89b44443 100644 --- a/dataModuleTester/src/main/res/layout/main_activity.xml +++ b/dataModuleTester/src/main/res/layout/main_activity.xml @@ -1,99 +1,155 @@ - - - - - - - - - - - - - - - - - -