conditional buys: get a download link when paying over x.

This commit is contained in:
fiatjaf
2020-11-23 23:03:37 -03:00
parent a3fbcd46cd
commit 42cf70e158
2 changed files with 19 additions and 10 deletions

View File

@@ -21,9 +21,9 @@ async def lnurl_response(ls_id):
resp = LnurlPayResponse( resp = LnurlPayResponse(
callback=url_for("livestream.lnurl_callback", track_id=track.id, _external=True), callback=url_for("livestream.lnurl_callback", track_id=track.id, _external=True),
min_sendable=track.price_msat, min_sendable=min(100000, track.price_msat),
max_sendable=track.price_msat * 5, max_sendable=track.price_msat * 5,
metadata=await track.lnurlpay_metadata, metadata=await track.lnurlpay_metadata(),
) )
params = resp.dict() params = resp.dict()
@@ -68,14 +68,19 @@ async def lnurl_callback(track_id):
payment_hash, payment_request = await create_invoice( payment_hash, payment_request = await create_invoice(
wallet_id=ls.wallet, wallet_id=ls.wallet,
amount=int(amount_received / 1000), amount=int(amount_received / 1000),
memo=await track.description(), memo=await track.fullname(),
description_hash=hashlib.sha256((await track.lnurlpay_metadata).encode("utf-8")).digest(), description_hash=hashlib.sha256((await track.lnurlpay_metadata()).encode("utf-8")).digest(),
extra={"tag": "livestream", "track": track.id, "comment": comment}, extra={"tag": "livestream", "track": track.id, "comment": comment},
) )
if amount_received < track.price_msat:
success_action = None
else:
success_action = track.success_action(payment_hash)
resp = LnurlPayActionResponse( resp = LnurlPayActionResponse(
pr=payment_request, pr=payment_request,
success_action=track.success_action(payment_hash), success_action=success_action,
routes=[], routes=[],
) )

View File

@@ -25,7 +25,7 @@ class Track(NamedTuple):
name: str name: str
producer: int producer: int
async def description(self) -> str: async def fullname(self) -> str:
from .crud import get_producer from .crud import get_producer
producer = await get_producer(self.producer) producer = await get_producer(self.producer)
@@ -34,18 +34,22 @@ class Track(NamedTuple):
else: else:
producer_name = "unknown author" producer_name = "unknown author"
return f"Track '{self.name}', from {producer_name}. {round(self.price_msat/1000)} sat." return f"'{self.name}', from {producer_name}."
@property
async def lnurlpay_metadata(self) -> LnurlPayMetadata: async def lnurlpay_metadata(self) -> LnurlPayMetadata:
return LnurlPayMetadata(json.dumps([["text/plain", await self.description()]])) description = (await self.fullname()) + " Like this track? Send some sats in appreciation."
if self.download_url:
description += f" Send {round(self.price_msat/1000)} sats or more and you can download it at 320kbps."
return LnurlPayMetadata(json.dumps([["text/plain", description]]))
def success_action(self, payment_hash: str) -> Optional[LnurlPaySuccessAction]: def success_action(self, payment_hash: str) -> Optional[LnurlPaySuccessAction]:
if not self.download_url: if not self.download_url:
return None return None
return UrlAction( return UrlAction(
url=url_for("livestream.track_redirect_download", track_id=self.id, p=payment_hash, _external=True), url=url_for("livestream.track_redirect_download", track_id=self.id, p=payment_hash[:5], _external=True),
description=f"Download the track {self.name}!", description=f"Download the track {self.name}!",
) )