using System; using System.Collections.Generic; using System.Linq; using System.Net.Http; using System.Text; using System.Threading; using System.Threading.Tasks; using BTCPayServer.Services.Rates; using Newtonsoft.Json.Linq; namespace BTCPayServer.Rating { public class HitBTCRateProvider : IRateProvider { private readonly HttpClient _httpClient; public HitBTCRateProvider(HttpClient httpClient) { _httpClient = httpClient ?? new HttpClient(); } public async Task GetRatesAsync(CancellationToken cancellationToken) { var response = await _httpClient.GetAsync("https://api.hitbtc.com/api/2/public/ticker", cancellationToken); var jarray = await response.Content.ReadAsAsync(cancellationToken); return jarray .Children() .Select(p => { CurrencyPair.TryParse(p["symbol"].Value(), out var currency); var bidask = CreateBidAsk(p); return (currency, bidask); }) .Where(p => p.currency != null && p.bidask != null) .Select(p => new PairRate(p.currency, p.bidask)) .ToArray(); } private BidAsk CreateBidAsk(JObject p) { if (p["bid"].Type != JTokenType.String || p["ask"].Type != JTokenType.String) return null; var bid = p["bid"].Value(); var ask = p["ask"].Value(); return new BidAsk(bid, ask); } } }