mirror of
https://github.com/lnbits/lnbits.git
synced 2025-10-02 14:09:26 +02:00
conditional buys: get a download link when paying over x.
This commit is contained in:
@@ -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=[],
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@@ -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}!",
|
||||||
)
|
)
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user