mirror of
https://github.com/aljazceru/BTCPayServerPlugins.git
synced 2025-12-17 07:34:24 +01:00
Make nostr great again
This commit is contained in:
@@ -11,7 +11,7 @@
|
||||
<PropertyGroup>
|
||||
<Product>Nostr </Product>
|
||||
<Description>Allows you to verify your nostr account with NIP5 and zap like the rest of the crazies</Description>
|
||||
<Version>1.0.16</Version>
|
||||
<Version>1.1.0</Version>
|
||||
</PropertyGroup>
|
||||
<!-- Plugin development properties -->
|
||||
<PropertyGroup>
|
||||
|
||||
@@ -47,11 +47,7 @@ public class LnurlDescriptionFilter : PluginHookFilter<string>
|
||||
var username = metadata
|
||||
.FirstOrDefault(strings => strings.FirstOrDefault()?.Equals("text/identifier") is true)
|
||||
?.ElementAtOrDefault(1)?.ToLowerInvariant().Split("@")[0];
|
||||
if (string.IsNullOrEmpty(username))
|
||||
{
|
||||
return arg;
|
||||
}
|
||||
else
|
||||
if (!string.IsNullOrEmpty(username))
|
||||
{
|
||||
var lnAddress = await _lightningAddressService.ResolveByAddress(username);
|
||||
if (lnAddress is null)
|
||||
@@ -59,9 +55,6 @@ public class LnurlDescriptionFilter : PluginHookFilter<string>
|
||||
return arg;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
var parsedNote = System.Text.Json.JsonSerializer.Deserialize<NostrEvent>(nostr);
|
||||
if (parsedNote?.Kind != 9734)
|
||||
{
|
||||
|
||||
@@ -23,20 +23,21 @@ public class LnurlFilter : PluginHookFilter<LNURLPayRequest>
|
||||
{
|
||||
var name = arg.ParsedMetadata.FirstOrDefault(pair => pair.Key == "text/identifier").Value
|
||||
?.ToLowerInvariant().Split("@")[0];
|
||||
if (string.IsNullOrEmpty(name))
|
||||
if (!string.IsNullOrEmpty(name))
|
||||
{
|
||||
return arg;
|
||||
var lnAddress = await _lightningAddressService.ResolveByAddress(name);
|
||||
if (lnAddress is null)
|
||||
{
|
||||
return arg;
|
||||
}
|
||||
var nip5 = await _nip5Controller.GetForStore(lnAddress.StoreDataId);
|
||||
arg.NostrPubkey = nip5?.PubKey;
|
||||
}
|
||||
|
||||
var lnAddress = await _lightningAddressService.ResolveByAddress(name);
|
||||
if (lnAddress is null)
|
||||
{
|
||||
return arg;
|
||||
}
|
||||
|
||||
|
||||
var nip5 = await _nip5Controller.GetForStore(lnAddress.StoreDataId);
|
||||
|
||||
arg.NostrPubkey = nip5?.PubKey ?? (await _zapper.GetSettings()).ZappingPublicKeyHex;
|
||||
arg.NostrPubkey ??= (await _zapper.GetSettings()).ZappingPublicKeyHex;
|
||||
arg.AllowsNostr = true;
|
||||
return arg;
|
||||
}
|
||||
|
||||
@@ -2,14 +2,18 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Net.Http;
|
||||
using System.Threading.Tasks;
|
||||
using BTCPayServer.Abstractions.Constants;
|
||||
using BTCPayServer.Client;
|
||||
using BTCPayServer.Filters;
|
||||
using BTCPayServer.Services.Stores;
|
||||
using LNURL;
|
||||
using Microsoft.AspNetCore.Authorization;
|
||||
using Microsoft.AspNetCore.Cors;
|
||||
using Microsoft.AspNetCore.Mvc;
|
||||
using Microsoft.Extensions.Caching.Memory;
|
||||
using NBitcoin;
|
||||
using NBitcoin.DataEncoders;
|
||||
using NBitcoin.Secp256k1;
|
||||
using NNostr.Client;
|
||||
@@ -205,4 +209,33 @@ public class Nip5Controller : Controller
|
||||
: null
|
||||
});
|
||||
}
|
||||
|
||||
[CheatModeRoute]
|
||||
[HttpGet("~/nostr-fake")]
|
||||
[EnableCors(CorsPolicies.All)]
|
||||
[IgnoreAntiforgeryToken]
|
||||
[AllowAnonymous]
|
||||
public async Task<IActionResult> FakeNostr(string lnurl)
|
||||
{
|
||||
if (lnurl.Contains("@"))
|
||||
{
|
||||
lnurl = LNURL.LNURL.ExtractUriFromInternetIdentifier(lnurl).ToString();
|
||||
}
|
||||
var lnurlRequest = (LNURLPayRequest) await LNURL.LNURL.FetchInformation(new Uri(lnurl), new HttpClient());
|
||||
var nKey = ECPrivKey.Create(RandomUtils.GetBytes(32));
|
||||
var nostrEvent = new NostrEvent()
|
||||
{
|
||||
Kind = 9734,
|
||||
Content = "",
|
||||
|
||||
};
|
||||
var lnurlBech32x = LNURL.LNURL.EncodeBech32(new Uri(lnurl));
|
||||
nostrEvent.SetTag("relays", "wss://btcpay.kukks.org/nostr");
|
||||
nostrEvent.SetTag("lnurl", lnurlBech32x);
|
||||
nostrEvent.SetTag("amount", lnurlRequest.MinSendable.MilliSatoshi.ToString());
|
||||
nostrEvent = await nostrEvent.ComputeIdAndSignAsync(nKey);
|
||||
var response = await new HttpClient().GetAsync(lnurlRequest.Callback + "?amount=" + lnurlRequest.MinSendable.MilliSatoshi +
|
||||
"&nostr=" +System.Text.Json.JsonSerializer.Serialize(nostrEvent));
|
||||
return Content(await response.Content.ReadAsStringAsync());
|
||||
}
|
||||
}
|
||||
@@ -5,8 +5,10 @@ using System.Linq;
|
||||
using System.Threading;
|
||||
using System.Threading.Tasks;
|
||||
using BTCPayServer.Events;
|
||||
using BTCPayServer.Models.InvoicingModels;
|
||||
using BTCPayServer.Payments;
|
||||
using BTCPayServer.Services;
|
||||
using BTCPayServer.Services.Invoices;
|
||||
using BTCPayServer.Services.Stores;
|
||||
using Microsoft.Extensions.Caching.Memory;
|
||||
using Microsoft.Extensions.Hosting;
|
||||
@@ -49,6 +51,7 @@ public class Zapper : IHostedService
|
||||
private readonly IMemoryCache _memoryCache;
|
||||
private readonly ILogger<Zapper> _logger;
|
||||
private readonly SettingsRepository _settingsRepository;
|
||||
private readonly InvoiceRepository _invoiceRepository;
|
||||
private IEventAggregatorSubscription _subscription;
|
||||
private readonly ConcurrentBag<PendingZapEvent> _pendingZapEvents = new();
|
||||
|
||||
@@ -70,13 +73,18 @@ public class Zapper : IHostedService
|
||||
|
||||
|
||||
public Zapper(EventAggregator eventAggregator,
|
||||
Nip5Controller nip5Controller, IMemoryCache memoryCache, ILogger<Zapper> logger, SettingsRepository settingsRepository, StoreRepository storeRepository)
|
||||
Nip5Controller nip5Controller,
|
||||
IMemoryCache memoryCache,
|
||||
ILogger<Zapper> logger,
|
||||
SettingsRepository settingsRepository,
|
||||
InvoiceRepository invoiceRepository)
|
||||
{
|
||||
_eventAggregator = eventAggregator;
|
||||
_nip5Controller = nip5Controller;
|
||||
_memoryCache = memoryCache;
|
||||
_logger = logger;
|
||||
_settingsRepository = settingsRepository;
|
||||
_invoiceRepository = invoiceRepository;
|
||||
}
|
||||
|
||||
public Task StartAsync(CancellationToken cancellationToken)
|
||||
@@ -202,9 +210,16 @@ public class Zapper : IHostedService
|
||||
Tags = tags
|
||||
};
|
||||
|
||||
|
||||
await zapReceipt.ComputeIdAndSignAsync(key);
|
||||
_pendingZapEvents.Add(new PendingZapEvent(relays.Concat(userNostrSettings?.Relays?? Array.Empty<string>()).Distinct().ToArray(), zapReceipt));
|
||||
zapReceipt = await zapReceipt.ComputeIdAndSignAsync(key);
|
||||
relays = relays.Concat(userNostrSettings?.Relays ?? Array.Empty<string>()).Distinct().ToArray();
|
||||
arg.Invoice.Metadata.SetAdditionalData("Nostr", new Dictionary<string,string>()
|
||||
{
|
||||
{"Zap Request", zapRequestEvent.Id},
|
||||
{"Zap Receipt", zapReceipt.Id},
|
||||
{"Relays", string.Join(',', relays)}
|
||||
});
|
||||
await _invoiceRepository.UpdateInvoiceMetadata(arg.InvoiceId, arg.Invoice.StoreId, arg.Invoice.Metadata.ToJObject());
|
||||
_pendingZapEvents.Add(new PendingZapEvent(relays, zapReceipt));
|
||||
}
|
||||
|
||||
public Task StopAsync(CancellationToken cancellationToken)
|
||||
|
||||
Reference in New Issue
Block a user