#if ALTCOINS using System; using System.Linq; using System.Net; using System.Net.Http; using BTCPayServer.Abstractions.Contracts; using BTCPayServer.Abstractions.Services; using BTCPayServer.Configuration; using BTCPayServer.Payments; using BTCPayServer.Plugins.Altcoins; using BTCPayServer.Services.Altcoins.Monero.Configuration; using BTCPayServer.Services.Altcoins.Monero.Payments; using BTCPayServer.Services.Altcoins.Monero.Services; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; namespace BTCPayServer.Services.Altcoins.Monero { public static class MoneroLikeExtensions { public static IServiceCollection AddMoneroLike(this IServiceCollection serviceCollection) { serviceCollection.AddSingleton(provider => provider.ConfigureMoneroLikeConfiguration()); serviceCollection.AddHttpClient("XMRclient") .ConfigurePrimaryHttpMessageHandler(provider => { var configuration = provider.GetRequiredService(); if(!configuration.MoneroLikeConfigurationItems.TryGetValue("XMR", out var xmrConfig) || xmrConfig.Username is null || xmrConfig.Password is null){ return new HttpClientHandler(); } return new HttpClientHandler { Credentials = new NetworkCredential(xmrConfig.Username, xmrConfig.Password), PreAuthenticate = true }; }); serviceCollection.AddSingleton(); serviceCollection.AddHostedService(); serviceCollection.AddHostedService(); serviceCollection.AddSingleton(); serviceCollection.AddSingleton(provider => provider.GetService()); serviceCollection.AddSingleton(new UIExtension("Monero/StoreNavMoneroExtension", "store-nav")); serviceCollection.AddSingleton(new UIExtension("Monero/StoreWalletsNavMoneroExtension", "store-wallets-nav")); serviceCollection.AddSingleton(); return serviceCollection; } private static MoneroLikeConfiguration ConfigureMoneroLikeConfiguration(this IServiceProvider serviceProvider) { var configuration = serviceProvider.GetService(); var btcPayNetworkProvider = serviceProvider.GetService(); var result = new MoneroLikeConfiguration(); var supportedNetworks = btcPayNetworkProvider.GetAll() .OfType(); foreach (var moneroLikeSpecificBtcPayNetwork in supportedNetworks) { var daemonUri = configuration.GetOrDefault($"{moneroLikeSpecificBtcPayNetwork.CryptoCode}_daemon_uri", null); var walletDaemonUri = configuration.GetOrDefault( $"{moneroLikeSpecificBtcPayNetwork.CryptoCode}_wallet_daemon_uri", null); var walletDaemonWalletDirectory = configuration.GetOrDefault( $"{moneroLikeSpecificBtcPayNetwork.CryptoCode}_wallet_daemon_walletdir", null); var daemonUsername = configuration.GetOrDefault( $"{moneroLikeSpecificBtcPayNetwork.CryptoCode}_daemon_username", null); var daemonPassword = configuration.GetOrDefault( $"{moneroLikeSpecificBtcPayNetwork.CryptoCode}_daemon_password", null); if (daemonUri == null || walletDaemonUri == null || walletDaemonWalletDirectory == null) { throw new ConfigException($"{moneroLikeSpecificBtcPayNetwork.CryptoCode} is misconfigured"); } result.MoneroLikeConfigurationItems.Add(moneroLikeSpecificBtcPayNetwork.CryptoCode, new MoneroLikeConfigurationItem() { DaemonRpcUri = daemonUri, Username = daemonUsername, Password = daemonPassword, InternalWalletRpcUri = walletDaemonUri, WalletDirectory = walletDaemonWalletDirectory }); } return result; } } } #endif