From fa13a2874e43a2cbbcf90f0b64b5b52423243b47 Mon Sep 17 00:00:00 2001 From: "nicolas.dorier" Date: Fri, 8 Dec 2017 15:04:47 +0900 Subject: [PATCH] Estimate rate with BTCPay if BitcoinAverage stops works --- BTCPayServer/BTCPayServer.csproj | 2 +- BTCPayServer/Hosting/BTCPayServerServices.cs | 4 +- .../Services/Rates/FallbackRateProvider.cs | 43 +++++++++++++++++++ 3 files changed, 47 insertions(+), 2 deletions(-) create mode 100644 BTCPayServer/Services/Rates/FallbackRateProvider.cs diff --git a/BTCPayServer/BTCPayServer.csproj b/BTCPayServer/BTCPayServer.csproj index fc422f0a8..f0d9b42fa 100644 --- a/BTCPayServer/BTCPayServer.csproj +++ b/BTCPayServer/BTCPayServer.csproj @@ -2,7 +2,7 @@ Exe netcoreapp2.0 - 1.0.0.38 + 1.0.0.39 diff --git a/BTCPayServer/Hosting/BTCPayServerServices.cs b/BTCPayServer/Hosting/BTCPayServerServices.cs index c970ef178..756923dd2 100644 --- a/BTCPayServer/Hosting/BTCPayServerServices.cs +++ b/BTCPayServer/Hosting/BTCPayServerServices.cs @@ -141,7 +141,9 @@ namespace BTCPayServer.Hosting }); services.TryAddSingleton(o => { - return new CachedRateProvider(new CoinAverageRateProvider(), o.GetRequiredService()) { CacheSpan = TimeSpan.FromMinutes(1.0) }; + var coinaverage = new CoinAverageRateProvider(); + var bitpay = new BitpayRateProvider(new Bitpay(new Key(), new Uri("https://bitpay.com/"))); + return new CachedRateProvider(new FallbackRateProvider(new IRateProvider[] { coinaverage, bitpay }), o.GetRequiredService()) { CacheSpan = TimeSpan.FromMinutes(1.0) }; }); services.TryAddSingleton(); services.TryAddSingleton(); diff --git a/BTCPayServer/Services/Rates/FallbackRateProvider.cs b/BTCPayServer/Services/Rates/FallbackRateProvider.cs new file mode 100644 index 000000000..59e57c0f3 --- /dev/null +++ b/BTCPayServer/Services/Rates/FallbackRateProvider.cs @@ -0,0 +1,43 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; + +namespace BTCPayServer.Services.Rates +{ + public class FallbackRateProvider : IRateProvider + { + IRateProvider[] _Providers; + public FallbackRateProvider(IRateProvider[] providers) + { + if (providers == null) + throw new ArgumentNullException(nameof(providers)); + _Providers = providers; + } + public async Task GetRateAsync(string currency) + { + foreach(var p in _Providers) + { + try + { + return await p.GetRateAsync(currency).ConfigureAwait(false); + } + catch { } + } + throw new RateUnavailableException(currency); + } + + public async Task> GetRatesAsync() + { + foreach (var p in _Providers) + { + try + { + return await p.GetRatesAsync().ConfigureAwait(false); + } + catch { } + } + throw new RateUnavailableException("ALL"); + } + } +}