From c43721d489034ba0b94e1c9d5edfa297dcdcb935 Mon Sep 17 00:00:00 2001 From: "nicolas.dorier" Date: Mon, 14 Oct 2024 21:13:43 +0900 Subject: [PATCH] Pretty names of payment methods isn't provided by CheckoutExtensions --- BTCPayServer/Extensions.cs | 4 ++++ BTCPayServer/Hosting/BTCPayServerServices.cs | 10 +++++++++- .../Bitcoin/BitcoinCheckoutModelExtension.cs | 4 ---- BTCPayServer/Payments/ICheckoutModelExtension.cs | 1 - .../LNURLPay/LNURLCheckoutModelExtension.cs | 2 -- .../Lightning/LNCheckoutModelExtension.cs | 6 +----- .../Altcoins/Monero/AltcoinsPlugin.Monero.cs | 1 + .../Altcoins/Zcash/AltcoinsPlugin.Zcash.cs | 1 + .../Payments/MoneroCheckoutModelExtension.cs | 2 -- .../Zcash/Payments/ZcashCheckoutModelExtension.cs | 2 -- BTCPayServer/Services/PrettyNameProvider.cs | 15 ++++++++++----- 11 files changed, 26 insertions(+), 22 deletions(-) diff --git a/BTCPayServer/Extensions.cs b/BTCPayServer/Extensions.cs index 67c8c7508..5b326c045 100644 --- a/BTCPayServer/Extensions.cs +++ b/BTCPayServer/Extensions.cs @@ -297,6 +297,10 @@ namespace BTCPayServer { return services.AddDefaultTransactions(keyValues.Select(k => KeyValuePair.Create(k, string.Empty)).ToArray()); } + public static IServiceCollection AddDefaultPrettyName(this IServiceCollection services, PaymentMethodId paymentMethodId, string defaultPrettyName) + { + return services.AddDefaultTransactions(KeyValuePair.Create(PrettyNameProvider.GetTranslationKey(paymentMethodId), defaultPrettyName)); + } public static IServiceCollection AddDefaultTransactions(this IServiceCollection services, params KeyValuePair[] keyValues) { services.AddSingleton(new InMemoryDefaultTransactionProvider(keyValues)); diff --git a/BTCPayServer/Hosting/BTCPayServerServices.cs b/BTCPayServer/Hosting/BTCPayServerServices.cs index cfefe8ccb..9745a331f 100644 --- a/BTCPayServer/Hosting/BTCPayServerServices.cs +++ b/BTCPayServer/Hosting/BTCPayServerServices.cs @@ -624,6 +624,7 @@ o.GetRequiredService>().ToDictionary(o => o.P // BTC { var pmi = PaymentTypes.CHAIN.GetPaymentMethodId(network.CryptoCode); + services.AddDefaultPrettyName(pmi, network.DisplayName); services.AddSingleton(network); services.AddSingleton(provider => (BitcoinLikePaymentHandler)ActivatorUtilities.CreateInstance(provider, typeof(BitcoinLikePaymentHandler), new object[] { network, pmi })); @@ -631,7 +632,6 @@ o.GetRequiredService>().ToDictionary(o => o.P (IPaymentLinkExtension)ActivatorUtilities.CreateInstance(provider, typeof(BitcoinPaymentLinkExtension), new object[] { network, pmi })); services.AddSingleton(provider => (BitcoinCheckoutModelExtension)ActivatorUtilities.CreateInstance(provider, typeof(BitcoinCheckoutModelExtension), new object[] { network, pmi })); - services.AddDefaultTransactions(network.DisplayName); services.AddSingleton(provider => (IPaymentMethodBitpayAPIExtension)ActivatorUtilities.CreateInstance(provider, typeof(BitcoinPaymentMethodBitpayAPIExtension), new object[] { pmi })); @@ -647,6 +647,10 @@ o.GetRequiredService>().ToDictionary(o => o.P // LN { var pmi = PaymentTypes.LN.GetPaymentMethodId(network.CryptoCode); + if (network.IsBTC) + services.AddDefaultPrettyName(pmi, "Lightning"); + else + services.AddDefaultPrettyName(pmi, $"Lightning ({network.DisplayName})"); services.AddSingleton(provider => (LightningLikePaymentHandler)ActivatorUtilities.CreateInstance(provider, typeof(LightningLikePaymentHandler), new object[] { network, pmi })); services.AddSingleton(provider => @@ -662,6 +666,10 @@ o.GetRequiredService>().ToDictionary(o => o.P // LNURL { var pmi = PaymentTypes.LNURL.GetPaymentMethodId(network.CryptoCode); + if (network.IsBTC) + services.AddDefaultPrettyName(pmi, "Lightning (via LNURL)"); + else + services.AddDefaultPrettyName(pmi, $"Lightning ({network.DisplayName} via LNURL)"); services.AddSingleton(provider => (LNURLPayPaymentHandler)ActivatorUtilities.CreateInstance(provider, typeof(LNURLPayPaymentHandler), new object[] { network, pmi })); services.AddSingleton(provider => diff --git a/BTCPayServer/Payments/Bitcoin/BitcoinCheckoutModelExtension.cs b/BTCPayServer/Payments/Bitcoin/BitcoinCheckoutModelExtension.cs index cc34a2fcb..fcea6109a 100644 --- a/BTCPayServer/Payments/Bitcoin/BitcoinCheckoutModelExtension.cs +++ b/BTCPayServer/Payments/Bitcoin/BitcoinCheckoutModelExtension.cs @@ -18,7 +18,6 @@ namespace BTCPayServer.Payments.Bitcoin public const string CheckoutBodyComponentName = "BitcoinCheckoutBody"; private readonly PaymentMethodHandlerDictionary _handlers; private readonly BTCPayNetwork _Network; - private readonly IStringLocalizer StringLocalizer; private readonly DisplayFormatter _displayFormatter; private readonly IPaymentLinkExtension paymentLinkExtension; private readonly IPaymentLinkExtension? lnPaymentLinkExtension; @@ -28,7 +27,6 @@ namespace BTCPayServer.Payments.Bitcoin public BitcoinCheckoutModelExtension( PaymentMethodId paymentMethodId, BTCPayNetwork network, - IStringLocalizer stringLocalizer, IEnumerable paymentLinkExtensions, DisplayFormatter displayFormatter, PaymentMethodHandlerDictionary handlers) @@ -36,7 +34,6 @@ namespace BTCPayServer.Payments.Bitcoin PaymentMethodId = paymentMethodId; _handlers = handlers; _Network = network; - StringLocalizer = stringLocalizer; _displayFormatter = displayFormatter; paymentLinkExtension = paymentLinkExtensions.Single(p => p.PaymentMethodId == PaymentMethodId); var lnPmi = PaymentTypes.LN.GetPaymentMethodId(network.CryptoCode); @@ -45,7 +42,6 @@ namespace BTCPayServer.Payments.Bitcoin lnurlPaymentLinkExtension = paymentLinkExtensions.SingleOrDefault(p => p.PaymentMethodId == lnurlPmi); _bech32Prefix = network.NBitcoinNetwork.GetBech32Encoder(Bech32Type.WITNESS_PUBKEY_ADDRESS, false) is { } enc ? Encoders.ASCII.EncodeData(enc.HumanReadablePart) : null; } - public string DisplayName => StringLocalizer[_Network.DisplayName]; public string Image => _Network.CryptoImagePath; public string Badge => ""; public PaymentMethodId PaymentMethodId { get; } diff --git a/BTCPayServer/Payments/ICheckoutModelExtension.cs b/BTCPayServer/Payments/ICheckoutModelExtension.cs index 8567c2f8a..29a39ccc6 100644 --- a/BTCPayServer/Payments/ICheckoutModelExtension.cs +++ b/BTCPayServer/Payments/ICheckoutModelExtension.cs @@ -15,7 +15,6 @@ namespace BTCPayServer.Payments public interface ICheckoutModelExtension { public PaymentMethodId PaymentMethodId { get; } - string DisplayName { get; } string Image { get; } string Badge { get; } void ModifyCheckoutModel(CheckoutModelContext context); diff --git a/BTCPayServer/Payments/LNURLPay/LNURLCheckoutModelExtension.cs b/BTCPayServer/Payments/LNURLPay/LNURLCheckoutModelExtension.cs index 27ab08065..f60beabde 100644 --- a/BTCPayServer/Payments/LNURLPay/LNURLCheckoutModelExtension.cs +++ b/BTCPayServer/Payments/LNURLPay/LNURLCheckoutModelExtension.cs @@ -23,7 +23,6 @@ namespace BTCPayServer.Payments.LNURLPay paymentLinkExtension = paymentLinkExtensions.Single(p => p.PaymentMethodId == PaymentMethodId); handler = (LNURLPayPaymentHandler)handlers[PaymentMethodId]; var isBTC = PaymentTypes.LNURL.GetPaymentMethodId("BTC") == paymentMethodId; - DisplayName = isBTC ? "Lightning (via LNURL)" : $"Lightning ({network.DisplayName} via LNURL)"; } public PaymentMethodId PaymentMethodId { get; } @@ -32,7 +31,6 @@ namespace BTCPayServer.Payments.LNURLPay private readonly IPaymentLinkExtension paymentLinkExtension; private readonly LNURLPayPaymentHandler handler; - public string DisplayName { get; } public string Image => _network.LightningImagePath; public string Badge => "⚡"; diff --git a/BTCPayServer/Payments/Lightning/LNCheckoutModelExtension.cs b/BTCPayServer/Payments/Lightning/LNCheckoutModelExtension.cs index 539a10dee..e6899304b 100644 --- a/BTCPayServer/Payments/Lightning/LNCheckoutModelExtension.cs +++ b/BTCPayServer/Payments/Lightning/LNCheckoutModelExtension.cs @@ -15,7 +15,6 @@ namespace BTCPayServer.Payments.Lightning public const string CheckoutBodyComponentName = "LightningCheckoutBody"; private readonly DisplayFormatter _displayFormatter; IPaymentLinkExtension _PaymentLinkExtension; - private readonly bool isBTC; public LNCheckoutModelExtension( PaymentMethodId paymentMethodId, @@ -31,7 +30,6 @@ namespace BTCPayServer.Payments.Lightning Handlers = handlers; PaymentMethodId = paymentMethodId; _PaymentLinkExtension = paymentLinkExtensions.Single(p => p.PaymentMethodId == PaymentMethodId); - isBTC = PaymentTypes.LN.GetPaymentMethodId("BTC") == paymentMethodId; } public BTCPayNetwork Network { get; } @@ -39,8 +37,6 @@ namespace BTCPayServer.Payments.Lightning public PaymentMethodHandlerDictionary Handlers { get; } public PaymentMethodId PaymentMethodId { get; } - public string DisplayName => isBTC ? StringLocalizer["Lightning"] : StringLocalizer["Lightning ({0})", Network.DisplayName]; - public string Image => Network.LightningImagePath; public string Badge => "⚡"; public void ModifyCheckoutModel(CheckoutModelContext context) @@ -55,7 +51,7 @@ namespace BTCPayServer.Payments.Lightning if (context.Model.InvoiceBitcoinUrl is not null) context.Model.InvoiceBitcoinUrlQR = $"lightning:{context.Model.InvoiceBitcoinUrl.ToUpperInvariant()?.Substring("LIGHTNING:".Length)}"; context.Model.PeerInfo = handler.ParsePaymentPromptDetails(paymentPrompt.Details).NodeInfo; - if (context.StoreBlob.LightningAmountInSatoshi && isBTC) + if (context.StoreBlob.LightningAmountInSatoshi && Network.IsBTC) { BitcoinCheckoutModelExtension.PreparePaymentModelForAmountInSats(context.Model, paymentPrompt.Rate, _displayFormatter); } diff --git a/BTCPayServer/Plugins/Altcoins/Monero/AltcoinsPlugin.Monero.cs b/BTCPayServer/Plugins/Altcoins/Monero/AltcoinsPlugin.Monero.cs index af0ce5568..3736e21e8 100644 --- a/BTCPayServer/Plugins/Altcoins/Monero/AltcoinsPlugin.Monero.cs +++ b/BTCPayServer/Plugins/Altcoins/Monero/AltcoinsPlugin.Monero.cs @@ -40,6 +40,7 @@ public partial class AltcoinsPlugin ? "https://www.exploremonero.com/transaction/{0}" : "https://testnet.xmrchain.net/tx/{0}"; var pmi = PaymentTypes.CHAIN.GetPaymentMethodId("XMR"); + services.AddDefaultPrettyName(pmi, network.DisplayName); services.AddBTCPayNetwork(network) .AddTransactionLinkProvider(pmi, new SimpleTransactionLinkProvider(blockExplorerLink)); diff --git a/BTCPayServer/Plugins/Altcoins/Zcash/AltcoinsPlugin.Zcash.cs b/BTCPayServer/Plugins/Altcoins/Zcash/AltcoinsPlugin.Zcash.cs index 34ddaf263..5ac5dc5f1 100644 --- a/BTCPayServer/Plugins/Altcoins/Zcash/AltcoinsPlugin.Zcash.cs +++ b/BTCPayServer/Plugins/Altcoins/Zcash/AltcoinsPlugin.Zcash.cs @@ -41,6 +41,7 @@ public partial class AltcoinsPlugin ? "https://www.exploreZcash.com/transaction/{0}" : "https://testnet.xmrchain.net/tx/{0}"; var pmi = PaymentTypes.CHAIN.GetPaymentMethodId("ZEC"); + services.AddDefaultPrettyName(pmi, network.DisplayName); services.AddBTCPayNetwork(network) .AddTransactionLinkProvider(pmi, new SimpleTransactionLinkProvider(blockExplorerLink)); diff --git a/BTCPayServer/Services/Altcoins/Monero/Payments/MoneroCheckoutModelExtension.cs b/BTCPayServer/Services/Altcoins/Monero/Payments/MoneroCheckoutModelExtension.cs index 4104812c2..7d00784b0 100644 --- a/BTCPayServer/Services/Altcoins/Monero/Payments/MoneroCheckoutModelExtension.cs +++ b/BTCPayServer/Services/Altcoins/Monero/Payments/MoneroCheckoutModelExtension.cs @@ -27,8 +27,6 @@ namespace BTCPayServer.Services.Altcoins.Monero.Payments } public PaymentMethodId PaymentMethodId { get; } - public string DisplayName => _network.DisplayName; - public string Image => _network.CryptoImagePath; public string Badge => ""; diff --git a/BTCPayServer/Services/Altcoins/Zcash/Payments/ZcashCheckoutModelExtension.cs b/BTCPayServer/Services/Altcoins/Zcash/Payments/ZcashCheckoutModelExtension.cs index ae7129845..3d17be1c8 100644 --- a/BTCPayServer/Services/Altcoins/Zcash/Payments/ZcashCheckoutModelExtension.cs +++ b/BTCPayServer/Services/Altcoins/Zcash/Payments/ZcashCheckoutModelExtension.cs @@ -27,8 +27,6 @@ namespace BTCPayServer.Services.Altcoins.Zcash.Payments } public PaymentMethodId PaymentMethodId { get; } - public string DisplayName => _network.DisplayName; - public string Image => _network.CryptoImagePath; public string Badge => ""; diff --git a/BTCPayServer/Services/PrettyNameProvider.cs b/BTCPayServer/Services/PrettyNameProvider.cs index 71b65140e..30c5409f8 100644 --- a/BTCPayServer/Services/PrettyNameProvider.cs +++ b/BTCPayServer/Services/PrettyNameProvider.cs @@ -1,23 +1,28 @@ #nullable enable using System.Collections.Generic; using BTCPayServer.Payments; +using Microsoft.Extensions.Localization; namespace BTCPayServer.Services { public class PrettyNameProvider { - private readonly Dictionary _extensions; + public static string GetTranslationKey(PaymentMethodId paymentMethodId) => $"PrettyName({paymentMethodId})"; + private readonly IStringLocalizer _stringLocalizer; - public PrettyNameProvider(Dictionary extensions) + public PrettyNameProvider(IStringLocalizer stringLocalizer) { - _extensions = extensions; + _stringLocalizer = stringLocalizer; } public string PrettyName(PaymentMethodId paymentMethodId) { if (paymentMethodId is null) return ""; - _extensions.TryGetValue(paymentMethodId, out var n); - return n?.DisplayName ?? paymentMethodId.ToString(); + var key = GetTranslationKey(paymentMethodId); + var result = _stringLocalizer[key]?.Value; + if (string.IsNullOrEmpty(result) || result == key) + return paymentMethodId.ToString(); + return result; } } }