Jan17392/asianodds

View on GitHub
README.md

Summary

Maintainability
Test Coverage
# :soccer: Asianodds - Automated Sports Trading

[![Gem Version](https://badge.fury.io/rb/asianodds.svg)](https://badge.fury.io/rb/asianodds) [![Code Climate](https://codeclimate.com/github/Jan17392/asianodds/badges/gpa.svg)](https://codeclimate.com/github/Jan17392/asianodds)

This gem is a wrapper for the Asianodds Web API.
In order to use this gem you need to apply for a Web API account with Asianodds (api@asianodds88.com). Please keep in mind that your regular Asianodds user (for the Web Interface) does not work for your API account and vice versa.

The purpose of the gem is to pre-configure all API calls to make your life as easy as just calling one method. You won't need to MD5 hash your password (as Asianodds requests) and the gem assumes smart pre-configs for your calls, so they will work even without passing in required parameters. Still, it has the same flexibility as the original API without limitations.

With just three lines of code you will be able to start placing real-time bets with multiple bookmakers and automate your trading strategies.

For any bugs, ideas or feature requests don't hesitate to open an issue.

*Disclaimer: This gem is not officially developed by Asianodds and does not belong in any way to the Asianodds service, nor is it supported by their development team and all rights to accept or deny bets made with this gem remain with Asianodds.*


## Installation

Add this line to your application's Gemfile:

```ruby
gem 'asianodds'
```

And then execute:

    $ bundle install

Or install it yourself as:

    $ gem install asianodds

## Usage

All returned objects from the gem are in the form of Ruby Hashes (or plain booleans if specified) with all Keys converted to Symbols.



### Login

Create a new user instance and provide your username and raw password (not hashed):

```ruby
asianodds = Asianodds::Login.new('dagobert_duck', 'secure_password')
#
```
The returned response / initiated user will contain the following keys:

|Key|Value|Description|
|---|-----|-----------|
|@user|dagobert_duck|This is your username|
|@password|secure_password|This is your password|
|@password_md5|hashed MD5 password|The password actually used to login|
|@ao_token|random string ('2220749911057835565404619834') or ('')|Token passed to execute all methods|
|@ao_key|random string ('3c81574f865d1d892d52d7cbc78a18dd') or (nil)|Key used once to register - only valid for 60s|
|@base_url|https://webapi.asianodds88.com/AsianOddsService|Used url base to access the Asianodds service|
|@code|0 or -1|Indicator whether current action was successful: 0 = true, -1 = false|
|@successful_login|boolean|Shows whether user is logged in successfully|
|@message|string ('Successfully Registered.')|Verbose description of the current user status|


### Register

With the instantiation of the login call, you will automatically get registered to the app. There is no need to call the register method separately. The registration message can be read from the current users @message.


### Login Check

You can check whether you are logged in to the service with the isloggedin? method. It returns either true if logged in or false if not.

```ruby
asianodds.isloggedin?
# returns true or false
```

This method is automatically called on each subsequent method to ensure you will be re-registered in case you are not logged in anymore. No need to manually check the logged in status.



### Logout

After finishing all transactions and business logic, it is wise to logout and unregister (happens automatically after 30 min of inactivity) with the logout method

```ruby
asianodds.logout
# { Code: -1, Message: null, Result: "Failed Logout. Have you logged in before ?" }
```
|Key|Value|Description|
|---|-----|-----------|
|@code|0 or -1|Indicator whether current action was successful: 0 = true, -1 = false|
|@message|-|Can be omitted|
|@result|string ('Failed Logout. Have you logged in before ?')|Verbose description of the action result|


### Get Match Feeds

The get_feeds method returns all matches with their respective feed information, (such as running minute, home team, away team etc.) filtered by optional parameters. Parameters have to communicated via a hash. Accepted parameters are:

|Key|Value|Description|
|---|-----|-----------|
|sports_type|see get_sports|Which sports to show (default 1 - football)|
|market_type|0 - Live, 1 - Today, 2 - Early|What betting market to receive (default 1 - Today)|
|bookies|see get_bookies|From which bookies to show odds (default ALL)|
|leagues|see get_leagues|From which leagues to receive matches (default ALL)|
|odds_format|MY - Malaysian, 00 - European, HK - Hong Kong|What oddsformat to show (default 00 - European)|
|since|tbd|Show only match feeds since the timestamp (default none)|

```ruby
asianodds.get_feeds({ sports_type: 1, market_type: 1, bookies: "ALL", leagues: "ALL", odds_format: "00" })
# Works as well and returns the same result (due to auto-filters):
asianodds.get_feeds({})

=begin
Response:
{
  Code: 0,
  Message: "",
  Result: {
    Since: 1493301694214,
    Sports: [
      {
        MatchGames: [
          {
            AwayTeam: {
              Name: "Qaradag Lokbatan",
              RedCards: 0,
              Score: 1
            },
            ExpectedLength: 45,
            Favoured: 1,
            FullTimeHdp: {
              BookieOdds: "IBC=0.530,-0.730;BEST=IBC 0.530,IBC -0.730",
              Handicap: "0.0"
            },
            FullTimeOneXTwo: {
              BookieOdds: ""
            },
            FullTimeOu: {
              BookieOdds: "IBC=-0.310,0.090;BEST=IBC -0.310,IBC 0.090",
              Goal: "3.5"
            },
            GameId: -1895622898,
            HalfTimeHdp: {
              BookieOdds: "",
              Handicap: ""
            },
            HalfTimeOneXTwo: {
              BookieOdds: ""
            },
            HalfTimeOu: {
              BookieOdds: "",
              Goal: ""
            },
            HomeTeam: {
              Name: "PFC Turan Tovuz",
              RedCards: 0,
              Score: 2
            },
            InGameMinutes: 168,
            IsActive: false,
            IsLive: 1,
            LeagueId: 922171774,
            LeagueName: "AZERBAIJAN DIVISION 1",
            MarketType: "Live",
            MarketTypeId: 0,
            MatchId: -1898629925,
            StartTime: 1493294400000,
            StartsOn: "04/27/2017 12:00:00.000 PM",
            ToBeRemovedOn: 1493301984351,
            UpdatedDateTime: 1493301684351,
            WillBeRemoved: true
          }
        ],
        SportsType: 1
      }
    ]
  }
}
=end
```

### Get Bets

With the get_bets method all (max. 150) outstanding bets of the instantiated user are retrieved

```ruby
asianodds.get_bets
```



### Get a Single Bet by its Reference

This method is very useful and should be used to validate that a bet has been accepted by the bookmaker after the place_bet method. It can be called with a single parameter which is provided by the place_bet method

```ruby
asianodds.get_bet_by_reference("WA-1493188766490")
```


### Get Running Bets

This is a subset of the get_bets method which returns only the currently running bets

```ruby
asianodds.get_running_bets
```


### Get Non-Running Bets

This is a subset of the get_bets method which returns only the currently not running bets

```ruby
asianodds.get_non_running_bets
```


### Get Account Summary

Getting the account summary of the current user helps to see the current credit, currency and P&L. No additional parameters need to be passed in if logged in.

```ruby
asianodds.get_account_summary

=begin
{
  Code: 0,
  Message: null,
  Result: {
    Credit: 344.69,
    CreditCurrency: 'EUR',
    Message: 'Showing Account Summary for User WEBAPIUSER13',
    Outstanding: 0,
    OutstandingCurrency: 'EUR',
    TodayPnL: 0,
    TodayPnLCurrency: 'EUR',
    YesterdayPnL: 44.69,
    YesterdayPnLCurrency: 'EUR'
  }
}
=end
```


### Get History Statement

```ruby
asianodds.get_history_statement
```


### Get Bookies

This method returns all bookies offered on the Asianodds books with their name and shortname/id. In all other methods a bookie is only referenced by its shortname (such as IBC).

```ruby
asianodds.get_bookies
# { Code: 0, Data: [{ Id: IBC, IsFeedAvailable: true, Name: "IBCBET"}, {...}], Message: "" }
```


### Get Leagues

The get_leagues method returns all leagues offered on the Asianodds books, including the corresponding sports_type as well as an array of bookies offering bets in this league.

```ruby
asianodds.get_leagues

=begin
{
  Code: 0,
  Message: "",
  Result: {
    Sports: [
      {
        League: [
          {
            Bookies: [
              "IBC",
              "PIN",
              "ISN",
              "SIN",
              "SBO"
            ],
            LeagueId: 350374160,
            LeagueName: "EGYPT PREMIER LEAGUE",
            MarketTypeId: 0,
            Since: 1493305406042
          }
        ],
        SportsType: 1
      }
    ]
  }
}
=end
```


### Get Sports

This method returns all the sports offered on the Asianodds books. Currently Football (Soccer) and Basketball are offered. All sports are stored as hashes in the data array.

```ruby
asianodds.get_sports
# { Code: 0, Data: [{ Id: 1, Name: "Football" }, { Id: 2, Name: "Basketball" }], Message: "" }
```


### Get User Information

```ruby
asianodds.get_user_information

=begin
{
  Code: 0,
  Message: "",
  Result: {
    ActiveBookies: [
      "IBC",
      "SBO",
      "SIN",
      "ISN",
      "PIN",
      "GA"
    ],
    BaseCurrency: null,
    CreationDate: 1472636844000,
    DefaultStake: 0,
    ExpiryDate: 4102444800000,
    ExternalIp: "88.72.3.57",
    OddsType: "MY",
    Status: "Active",
    UserId: "WEBAPIUSER13"
  }
}
=end
```


### Get Bet History Summary

```ruby
asianodds.get_bet_history_summary
```


### Get Matches

```ruby
asianodds.get_matches
```


### Get Placement Info

```ruby
asianodds.get_placement_info

=begin
{
  Code: 0,
  Message: "",
  Result: {
    OddsPlacementData: [
      {
        AwayName: "Manchester United",
        AwayScore: 0,
        Bookie: "IBC",
        Code: 0,
        Currency: "EUR",
        GameType: "X",
        HDPorGoal: "",
        HomeName: "Manchester City",
        HomeOrAwayOrDraw: "H",
        HomeScore: 0,
        IsFullTime: true,
        LeagueName: "*ENGLISH PREMIER LEAGUE",
        MarketTypeId: 1,
        MaximumAmount: 5491,
        Message: null,
        MinimumAmount: 4,
        OddPlacementId: "1297190352",
        Odds: 1.92,
        OddsFormat: "00",
        Rejected: false,
        SportsType: 1
      },
      {...}
    ]
  }
}
=end
```


### Place a New Bet

```ruby
asianodds.place_bet
```



## Original API Documentation

For more information on the original API, please refer to the full documentation: https://asianodds88.com/documentation/


## Examples

Please get in contact to showcase your examples here.


## TODOS

- [ ] Develop logic to re-signin automatically if logout is discovered
- [ ] Write proper mini-tests to ensure test coverage & error-handling
- [ ] Enable custom IDs for easier get_bet_by_reference lookup
- [ ] Improving get_feeds response to format odds and providers nicely (currently string)
- [ ] Improve the get and place bet workflow
- [ ] Enable full date hand-overs for the "since" parameter and convert into milliseconds
- [x] Wait for more feature requests


## Contributing

Bug reports and pull requests are welcome on GitHub at https://github.com/Jan17392/asianodds.


## Copyright

MIT License

Copyright (c) 2017 Jan Runo

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:

The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.