feat: add lud17 support for wallet parse dialog (#3289)
This commit is contained in:
parent
bdfefc2506
commit
0d2ff2e663
3 changed files with 44 additions and 13 deletions
|
|
@ -14,3 +14,7 @@ class CreateLnurlPayment(BaseModel):
|
||||||
|
|
||||||
class CreateLnurlWithdraw(BaseModel):
|
class CreateLnurlWithdraw(BaseModel):
|
||||||
lnurl_w: Lnurl
|
lnurl_w: Lnurl
|
||||||
|
|
||||||
|
|
||||||
|
class LnurlScan(BaseModel):
|
||||||
|
lnurl: Lnurl
|
||||||
|
|
|
||||||
|
|
@ -23,7 +23,7 @@ from lnurl.models import (
|
||||||
from loguru import logger
|
from loguru import logger
|
||||||
|
|
||||||
from lnbits.core.models import CreateLnurlWithdraw, Payment
|
from lnbits.core.models import CreateLnurlWithdraw, Payment
|
||||||
from lnbits.core.models.lnurl import CreateLnurlPayment
|
from lnbits.core.models.lnurl import CreateLnurlPayment, LnurlScan
|
||||||
from lnbits.decorators import (
|
from lnbits.decorators import (
|
||||||
WalletTypeInfo,
|
WalletTypeInfo,
|
||||||
require_admin_key,
|
require_admin_key,
|
||||||
|
|
@ -40,6 +40,7 @@ lnurl_router = APIRouter(tags=["LNURL"])
|
||||||
@lnurl_router.get(
|
@lnurl_router.get(
|
||||||
"/api/v1/lnurlscan/{code}",
|
"/api/v1/lnurlscan/{code}",
|
||||||
dependencies=[Depends(require_invoice_key)],
|
dependencies=[Depends(require_invoice_key)],
|
||||||
|
deprecated=True,
|
||||||
response_model=LnurlPayResponse
|
response_model=LnurlPayResponse
|
||||||
| LnurlWithdrawResponse
|
| LnurlWithdrawResponse
|
||||||
| LnurlAuthResponse
|
| LnurlAuthResponse
|
||||||
|
|
@ -58,6 +59,24 @@ async def api_lnurlscan(code: str) -> LnurlResponseModel:
|
||||||
return res
|
return res
|
||||||
|
|
||||||
|
|
||||||
|
@lnurl_router.post(
|
||||||
|
"/api/v1/lnurlscan",
|
||||||
|
dependencies=[Depends(require_invoice_key)],
|
||||||
|
response_model=LnurlPayResponse
|
||||||
|
| LnurlWithdrawResponse
|
||||||
|
| LnurlAuthResponse
|
||||||
|
| LnurlErrorResponse,
|
||||||
|
)
|
||||||
|
async def api_lnurlscan_post(scan: LnurlScan) -> LnurlResponseModel:
|
||||||
|
try:
|
||||||
|
res = await lnurl_handle(scan.lnurl, user_agent=settings.user_agent, timeout=5)
|
||||||
|
except LnurlResponseException as exc:
|
||||||
|
raise HTTPException(
|
||||||
|
status_code=HTTPStatus.BAD_REQUEST, detail=str(exc)
|
||||||
|
) from exc
|
||||||
|
return res
|
||||||
|
|
||||||
|
|
||||||
@lnurl_router.post("/api/v1/lnurlauth")
|
@lnurl_router.post("/api/v1/lnurlauth")
|
||||||
async def api_perform_lnurlauth(
|
async def api_perform_lnurlauth(
|
||||||
data: LnurlAuthResponse, key_type: WalletTypeInfo = Depends(require_admin_key)
|
data: LnurlAuthResponse, key_type: WalletTypeInfo = Depends(require_admin_key)
|
||||||
|
|
|
||||||
|
|
@ -352,11 +352,9 @@ window.WalletPageLogic = {
|
||||||
},
|
},
|
||||||
lnurlScan() {
|
lnurlScan() {
|
||||||
LNbits.api
|
LNbits.api
|
||||||
.request(
|
.request('POST', '/api/v1/lnurlscan', this.g.wallet.adminkey, {
|
||||||
'GET',
|
lnurl: this.parse.data.request
|
||||||
'/api/v1/lnurlscan/' + this.parse.data.request,
|
})
|
||||||
this.g.wallet.adminkey
|
|
||||||
)
|
|
||||||
.then(response => {
|
.then(response => {
|
||||||
const data = response.data
|
const data = response.data
|
||||||
if (data.status === 'ERROR') {
|
if (data.status === 'ERROR') {
|
||||||
|
|
@ -404,19 +402,29 @@ window.WalletPageLogic = {
|
||||||
this.decodeRequest()
|
this.decodeRequest()
|
||||||
this.parse.camera.show = false
|
this.parse.camera.show = false
|
||||||
},
|
},
|
||||||
|
isLnurl(req) {
|
||||||
|
return (
|
||||||
|
req.toLowerCase().startsWith('lnurl1') ||
|
||||||
|
req.startsWith('lnurlp://') ||
|
||||||
|
req.startsWith('lnurlw://') ||
|
||||||
|
req.startsWith('lnurlauth://') ||
|
||||||
|
req.match(/[\w.+-~_]+@[\w.+-~_]/)
|
||||||
|
)
|
||||||
|
},
|
||||||
decodeRequest() {
|
decodeRequest() {
|
||||||
this.parse.show = true
|
this.parse.show = true
|
||||||
this.parse.data.request = this.parse.data.request.trim().toLowerCase()
|
this.parse.data.request = this.parse.data.request.trim()
|
||||||
let req = this.parse.data.request
|
const req = this.parse.data.request.toLowerCase()
|
||||||
if (req.startsWith('lightning:')) {
|
if (req.startsWith('lightning:')) {
|
||||||
this.parse.data.request = req.slice(10)
|
this.parse.data.request = this.parse.data.request.slice(10)
|
||||||
} else if (req.startsWith('lnurl:')) {
|
} else if (req.startsWith('lnurl:')) {
|
||||||
this.parse.data.request = req.slice(6)
|
this.parse.data.request = this.parse.data.request.slice(6)
|
||||||
} else if (req.includes('lightning=lnurl1')) {
|
} else if (req.includes('lightning=lnurl1')) {
|
||||||
this.parse.data.request = req.split('lightning=')[1].split('&')[0]
|
this.parse.data.request = this.parse.data.request
|
||||||
|
.split('lightning=')[1]
|
||||||
|
.split('&')[0]
|
||||||
}
|
}
|
||||||
req = this.parse.data.request
|
if (this.isLnurl(this.parse.data.request)) {
|
||||||
if (req.startsWith('lnurl1') || req.match(/[\w.+-~_]+@[\w.+-~_]/)) {
|
|
||||||
this.lnurlScan()
|
this.lnurlScan()
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue