using System; using System.Collections.Generic; using System.Globalization; using System.Linq; using System.Net.Http; using System.Text; using System.Threading; using System.Threading.Tasks; using BTCPayServer.Rating; using Newtonsoft.Json.Linq; namespace BTCPayServer.Services.Rates { public class RipioExchangeProvider : IRateProvider { public RateSourceInfo RateSourceInfo => new("ripio", "Ripio", "https://api.exchange.ripio.com/api/v1/rate/all/"); private readonly HttpClient _httpClient; public RipioExchangeProvider(HttpClient httpClient) { _httpClient = httpClient ?? new HttpClient(); } public async Task GetRatesAsync(CancellationToken cancellationToken) { var response = await _httpClient.GetAsync("https://api.exchange.ripio.com/api/v1/rate/all/", cancellationToken); response.EnsureSuccessStatusCode(); var jarray = (JArray)(await response.Content.ReadAsAsync(cancellationToken)); return jarray .Children() .Select(jobj => ParsePair(jobj)) .Where(p => p != null) .ToArray(); } private PairRate ParsePair(JObject jobj) { var pair = CurrencyPair.Parse(jobj["pair"].Value()); var bid = decimal.Parse(jobj["bid"].Value(), System.Globalization.NumberStyles.Any, CultureInfo.InvariantCulture); var ask = decimal.Parse(jobj["ask"].Value(), System.Globalization.NumberStyles.Any, CultureInfo.InvariantCulture); if (bid > ask) return null; return new PairRate(pair, new BidAsk(bid, ask)); } } }