From 4e6466cd954117638713b4b23de81d981509b9f0 Mon Sep 17 00:00:00 2001 From: ben Date: Fri, 9 Dec 2022 14:10:10 +0000 Subject: [PATCH 01/15] Started adding ability to forward by tag --- .../splitpayments/static/js/index.js | 2 +- .../templates/splitpayments/index.html | 20 +++++++++++++++++-- 2 files changed, 19 insertions(+), 3 deletions(-) diff --git a/lnbits/extensions/splitpayments/static/js/index.js b/lnbits/extensions/splitpayments/static/js/index.js index 5d326231..0cd24920 100644 --- a/lnbits/extensions/splitpayments/static/js/index.js +++ b/lnbits/extensions/splitpayments/static/js/index.js @@ -56,7 +56,7 @@ new Vue({ this.selectedWallet = wallet this.getTargets() }, - targetChanged(isPercent, index) { + percentageChanged(isPercent, index) { // fix percent min and max range if (isPercent) { if (this.targets[index].percent > 100) this.targets[index].percent = 100 diff --git a/lnbits/extensions/splitpayments/templates/splitpayments/index.html b/lnbits/extensions/splitpayments/templates/splitpayments/index.html index 1cceb7ba..acf6109a 100644 --- a/lnbits/extensions/splitpayments/templates/splitpayments/index.html +++ b/lnbits/extensions/splitpayments/templates/splitpayments/index.html @@ -31,6 +31,13 @@ style="flex-wrap: nowrap" v-for="(target, t) in targets" > + + +
From 52d490d6879e69d25868e929d0d7b410597f354b Mon Sep 17 00:00:00 2001 From: ben Date: Mon, 12 Dec 2022 12:44:58 +0000 Subject: [PATCH 02/15] struggling with ui --- lnbits/extensions/splitpayments/static/js/index.js | 4 +++- .../splitpayments/templates/splitpayments/index.html | 3 ++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/lnbits/extensions/splitpayments/static/js/index.js b/lnbits/extensions/splitpayments/static/js/index.js index 0cd24920..32fe20c7 100644 --- a/lnbits/extensions/splitpayments/static/js/index.js +++ b/lnbits/extensions/splitpayments/static/js/index.js @@ -20,7 +20,9 @@ new Vue({ return { selectedWallet: null, currentHash: '', // a string that must match if the edit data is unchanged - targets: [] + targets: [{ + method: "split" + }] } }, computed: { diff --git a/lnbits/extensions/splitpayments/templates/splitpayments/index.html b/lnbits/extensions/splitpayments/templates/splitpayments/index.html index acf6109a..e86842e9 100644 --- a/lnbits/extensions/splitpayments/templates/splitpayments/index.html +++ b/lnbits/extensions/splitpayments/templates/splitpayments/index.html @@ -33,10 +33,11 @@ > Date: Tue, 13 Dec 2022 13:42:09 +0000 Subject: [PATCH 03/15] Added tag --- .../splitpayments/static/js/index.js | 10 ++- .../templates/splitpayments/index.html | 75 +++++++++++-------- 2 files changed, 51 insertions(+), 34 deletions(-) diff --git a/lnbits/extensions/splitpayments/static/js/index.js b/lnbits/extensions/splitpayments/static/js/index.js index 32fe20c7..94ece07b 100644 --- a/lnbits/extensions/splitpayments/static/js/index.js +++ b/lnbits/extensions/splitpayments/static/js/index.js @@ -63,8 +63,14 @@ new Vue({ if (isPercent) { if (this.targets[index].percent > 100) this.targets[index].percent = 100 if (this.targets[index].percent < 0) this.targets[index].percent = 0 + this.targets[index].tag = '' } + // not percentage + if (!isPercent) { + this.targets[index].percent = 0 + } + // remove empty lines (except last) if (this.targets.length >= 2) { for (let i = this.targets.length - 2; i >= 0; i--) { @@ -72,6 +78,7 @@ new Vue({ if ( (!target.wallet || target.wallet.trim() === '') && (!target.alias || target.alias.trim() === '') && + (!target.tag || target.tag.trim() === '') && !target.percent ) { this.targets.splice(i, 1) @@ -81,7 +88,7 @@ new Vue({ // add a line at the end if the last one is filled let last = this.targets[this.targets.length - 1] - if (last.wallet && last.wallet.trim() !== '' && last.percent > 0) { + if (last.wallet && last.wallet.trim() !== '') { this.targets.push({}) } @@ -113,6 +120,7 @@ new Vue({ // overwrite so changes appear this.targets = this.targets + console.log(this.targets) }, saveTargets() { LNbits.api diff --git a/lnbits/extensions/splitpayments/templates/splitpayments/index.html b/lnbits/extensions/splitpayments/templates/splitpayments/index.html index e86842e9..7ea76339 100644 --- a/lnbits/extensions/splitpayments/templates/splitpayments/index.html +++ b/lnbits/extensions/splitpayments/templates/splitpayments/index.html @@ -31,54 +31,63 @@ style="flex-wrap: nowrap" v-for="(target, t) in targets" > - - - + + + + + + + - +
From d69c2e9170591464744ad897ca2fa214d50e34bf Mon Sep 17 00:00:00 2001 From: ben Date: Tue, 13 Dec 2022 14:25:18 +0000 Subject: [PATCH 04/15] moved to tag changed --- .../splitpayments/static/js/index.js | 36 +++++++++++++++---- .../templates/splitpayments/index.html | 7 ++-- 2 files changed, 32 insertions(+), 11 deletions(-) diff --git a/lnbits/extensions/splitpayments/static/js/index.js b/lnbits/extensions/splitpayments/static/js/index.js index 94ece07b..567b8672 100644 --- a/lnbits/extensions/splitpayments/static/js/index.js +++ b/lnbits/extensions/splitpayments/static/js/index.js @@ -58,17 +58,40 @@ new Vue({ this.selectedWallet = wallet this.getTargets() }, + tagChanged(isTag, index) { + // fix percent min and max range + if (isTag) { + this.targets[index].percent = null + this.targets[index].tag.trim() + } + + // remove empty lines (except last) + if (this.targets.length >= 2) { + for (let i = this.targets.length - 2; i >= 0; i--) { + let target = this.targets[i] + if ( + (!target.wallet || target.wallet.trim() === '') && + (!target.alias || target.alias.trim() === '') && + !target.percent + ) { + this.targets.splice(i, 1) + } + } + } + }, + clearChanged(index) { + if(this.targets[index].method == 'split'){ + this.targets[index].tag = null + } + else{ + this.targets[index].percent = null + } + }, percentageChanged(isPercent, index) { // fix percent min and max range if (isPercent) { if (this.targets[index].percent > 100) this.targets[index].percent = 100 if (this.targets[index].percent < 0) this.targets[index].percent = 0 - this.targets[index].tag = '' - } - - // not percentage - if (!isPercent) { - this.targets[index].percent = 0 } // remove empty lines (except last) @@ -78,7 +101,6 @@ new Vue({ if ( (!target.wallet || target.wallet.trim() === '') && (!target.alias || target.alias.trim() === '') && - (!target.tag || target.tag.trim() === '') && !target.percent ) { this.targets.splice(i, 1) diff --git a/lnbits/extensions/splitpayments/templates/splitpayments/index.html b/lnbits/extensions/splitpayments/templates/splitpayments/index.html index 7ea76339..5a3f7895 100644 --- a/lnbits/extensions/splitpayments/templates/splitpayments/index.html +++ b/lnbits/extensions/splitpayments/templates/splitpayments/index.html @@ -37,7 +37,6 @@ v-model="target.alias" label="Alias" :hint="t === targets.length - 1 ? 'A name to identify this target wallet locally.' : undefined" - @input="targetChanged(false)" style="width: 150px" > @@ -46,7 +45,6 @@ v-model="target.wallet" label="Wallet" :hint="t === targets.length - 1 ? 'A wallet ID or invoice key.' : undefined" - @input="targetChanged(false)" option-label="name" style="width: 300px" new-value-mode="add-unique" @@ -64,7 +62,8 @@ style="width: 180px" v-model="target.method" :label="`${target.method}` === 'tag' ? 'Send funds by tag' : `${target.method}` === 'split' ? 'Split funds by %' : 'Split/tag?'" - > + @input="clearChanged(t)" + > Date: Tue, 13 Dec 2022 20:01:05 +0000 Subject: [PATCH 05/15] Seems to be working --- lnbits/extensions/splitpayments/crud.py | 8 ++-- lnbits/extensions/splitpayments/migrations.py | 42 ++++++++++++++++ lnbits/extensions/splitpayments/models.py | 4 +- .../splitpayments/static/js/index.js | 48 +++++++++---------- lnbits/extensions/splitpayments/tasks.py | 9 +++- .../templates/splitpayments/index.html | 21 +++++--- lnbits/extensions/splitpayments/views_api.py | 16 ++++--- 7 files changed, 105 insertions(+), 43 deletions(-) diff --git a/lnbits/extensions/splitpayments/crud.py b/lnbits/extensions/splitpayments/crud.py index ef10add4..67ca9dfe 100644 --- a/lnbits/extensions/splitpayments/crud.py +++ b/lnbits/extensions/splitpayments/crud.py @@ -2,6 +2,7 @@ from typing import List from . import db from .models import Target +from loguru import logger async def get_targets(source_wallet: str) -> List[Target]: @@ -12,6 +13,7 @@ async def get_targets(source_wallet: str) -> List[Target]: async def set_targets(source_wallet: str, targets: List[Target]): + logger.debug(targets) async with db.connect() as conn: await conn.execute( "DELETE FROM splitpayments.targets WHERE source = ?", (source_wallet,) @@ -20,8 +22,8 @@ async def set_targets(source_wallet: str, targets: List[Target]): await conn.execute( """ INSERT INTO splitpayments.targets - (source, wallet, percent, alias) - VALUES (?, ?, ?, ?) + (source, wallet, percent, tag, alias) + VALUES (?, ?, ?, ?, ?) """, - (source_wallet, target.wallet, target.percent, target.alias), + (source_wallet, target.wallet, target.percent, target.tag, target.alias), ) diff --git a/lnbits/extensions/splitpayments/migrations.py b/lnbits/extensions/splitpayments/migrations.py index b3921c42..d9ead03f 100644 --- a/lnbits/extensions/splitpayments/migrations.py +++ b/lnbits/extensions/splitpayments/migrations.py @@ -1,3 +1,5 @@ +from lnbits.helpers import urlsafe_short_hash + async def m001_initial(db): """ Initial split payment table. @@ -52,3 +54,43 @@ async def m002_float_percent(db): ) await db.execute("DROP TABLE splitpayments.splitpayments_old") + + +async def m003_float_percent(db): + """ + Add float percent and migrates the existing data. + """ + await db.execute("ALTER TABLE splitpayments.targets RENAME TO splitpayments_old") + await db.execute( + """ + CREATE TABLE splitpayments.targets ( + wallet TEXT NOT NULL, + source TEXT NOT NULL, + percent INT, + alias TEXT, + + UNIQUE (source, wallet) + ); + """ + ) + + for row in [ + list(row) + for row in await db.fetchall("SELECT * FROM splitpayments.splitpayments_old") + ]: + await db.execute( + """ + INSERT INTO splitpayments.targets ( + id + wallet, + source, + percent, + tag, + alias + ) + VALUES (?, ?, ?, ?) + """, + (urlsafe_short_hash(), row[0], row[1], row[2], '', row[3]), + ) + + await db.execute("DROP TABLE splitpayments.splitpayments_old") \ No newline at end of file diff --git a/lnbits/extensions/splitpayments/models.py b/lnbits/extensions/splitpayments/models.py index 6338d97f..88f98888 100644 --- a/lnbits/extensions/splitpayments/models.py +++ b/lnbits/extensions/splitpayments/models.py @@ -8,13 +8,15 @@ class Target(BaseModel): wallet: str source: str percent: float + tag: str alias: Optional[str] class TargetPutList(BaseModel): wallet: str = Query(...) alias: str = Query("") - percent: float = Query(..., ge=0.01, lt=100) + percent: float = Query(..., ge=0, lt=100) + tag: str = Query("") class TargetPut(BaseModel): diff --git a/lnbits/extensions/splitpayments/static/js/index.js b/lnbits/extensions/splitpayments/static/js/index.js index 567b8672..9426b41a 100644 --- a/lnbits/extensions/splitpayments/static/js/index.js +++ b/lnbits/extensions/splitpayments/static/js/index.js @@ -10,7 +10,7 @@ function hashTargets(targets) { } function isTargetComplete(target) { - return target.wallet && target.wallet.trim() !== '' && target.percent > 0 + return target.wallet && target.wallet.trim() !== '' && (target.percent > 0 || target.tag != '') } new Vue({ @@ -52,33 +52,15 @@ new Vue({ .then(response => { this.currentHash = hashTargets(response.data) this.targets = response.data.concat({}) + for (let i = 0; i < this.targets.length; i++) { + if(this.targets[i].tag != + } }) }, changedWallet(wallet) { this.selectedWallet = wallet this.getTargets() }, - tagChanged(isTag, index) { - // fix percent min and max range - if (isTag) { - this.targets[index].percent = null - this.targets[index].tag.trim() - } - - // remove empty lines (except last) - if (this.targets.length >= 2) { - for (let i = this.targets.length - 2; i >= 0; i--) { - let target = this.targets[i] - if ( - (!target.wallet || target.wallet.trim() === '') && - (!target.alias || target.alias.trim() === '') && - !target.percent - ) { - this.targets.splice(i, 1) - } - } - } - }, clearChanged(index) { if(this.targets[index].method == 'split'){ this.targets[index].tag = null @@ -87,12 +69,18 @@ new Vue({ this.targets[index].percent = null } }, - percentageChanged(isPercent, index) { + targetChanged(index) { // fix percent min and max range - if (isPercent) { + console.log(this.targets) + if (this.targets[index].percent) { if (this.targets[index].percent > 100) this.targets[index].percent = 100 if (this.targets[index].percent < 0) this.targets[index].percent = 0 } + + // not percentage + if (!this.targets[index].percent) { + this.targets[index].percent = 0 + } // remove empty lines (except last) if (this.targets.length >= 2) { @@ -101,6 +89,7 @@ new Vue({ if ( (!target.wallet || target.wallet.trim() === '') && (!target.alias || target.alias.trim() === '') && + (!target.tag || target.tag.trim() === '') && !target.percent ) { this.targets.splice(i, 1) @@ -145,6 +134,15 @@ new Vue({ console.log(this.targets) }, saveTargets() { + console.log(this.targets) + for (let i = 0; i < this.targets.length; i++) { + if (this.targets[i].tag){ + this.targets[i].percent = 0 + } + else{ + this.targets[i].tag = '' + } + } LNbits.api .request( 'PUT', @@ -153,7 +151,7 @@ new Vue({ { targets: this.targets .filter(isTargetComplete) - .map(({wallet, percent, alias}) => ({wallet, percent, alias})) + .map(({wallet, percent, tag, alias}) => ({wallet, percent, tag, alias})) } ) .then(response => { diff --git a/lnbits/extensions/splitpayments/tasks.py b/lnbits/extensions/splitpayments/tasks.py index 53378b20..c5cac4a6 100644 --- a/lnbits/extensions/splitpayments/tasks.py +++ b/lnbits/extensions/splitpayments/tasks.py @@ -37,7 +37,14 @@ async def on_invoice_paid(payment: Payment) -> None: logger.debug(f"performing split payments to {len(targets)} targets") for target in targets: - amount = int(payment.amount * target.percent / 100) # msats + + if target.tag and payment.extra.get("tag") == target.tag: + amount = int(payment.amount) + elif target.percent: + amount = int(payment.amount * target.percent / 100) # msats + else: + return + payment_hash, payment_request = await create_invoice( wallet_id=target.wallet, amount=int(amount / 1000), # sats diff --git a/lnbits/extensions/splitpayments/templates/splitpayments/index.html b/lnbits/extensions/splitpayments/templates/splitpayments/index.html index 5a3f7895..86a711f0 100644 --- a/lnbits/extensions/splitpayments/templates/splitpayments/index.html +++ b/lnbits/extensions/splitpayments/templates/splitpayments/index.html @@ -59,6 +59,7 @@ :true-value="'tag'" color="primary" label="" + value="True" style="width: 180px" v-model="target.method" :label="`${target.method}` === 'tag' ? 'Send funds by tag' : `${target.method}` === 'split' ? 'Split funds by %' : 'Split/tag?'" @@ -66,14 +67,13 @@ > + + Add more +
-
@@ -101,7 +110,7 @@ unelevated color="primary" type="submit" - :disabled="!isDirty" + :disabled="targets.length < 2" > Save Targets diff --git a/lnbits/extensions/splitpayments/views_api.py b/lnbits/extensions/splitpayments/views_api.py index 8b5a282a..1599d336 100644 --- a/lnbits/extensions/splitpayments/views_api.py +++ b/lnbits/extensions/splitpayments/views_api.py @@ -11,6 +11,8 @@ from . import splitpayments_ext from .crud import get_targets, set_targets from .models import Target, TargetPut +from loguru import logger + @splitpayments_ext.get("/api/v1/targets") async def api_targets_get(wallet: WalletTypeInfo = Depends(require_admin_key)): @@ -25,6 +27,7 @@ async def api_targets_set( body = await req.json() targets = [] data = TargetPut.parse_obj(body["targets"]) + logger.debug(data) for entry in data.__root__: wallet = await get_wallet(entry.wallet) if not wallet: @@ -50,16 +53,15 @@ async def api_targets_set( Target( wallet=wallet.id, source=wal.wallet.id, + tag=entry.tag, percent=entry.percent, alias=entry.alias, ) ) - - percent_sum = sum([target.percent for target in targets]) - if percent_sum > 100: - raise HTTPException( - status_code=HTTPStatus.BAD_REQUEST, detail="Splitting over 100%." - ) - + percent_sum = sum([target.percent for target in targets]) + if percent_sum > 100: + raise HTTPException( + status_code=HTTPStatus.BAD_REQUEST, detail="Splitting over 100%." + ) await set_targets(wal.wallet.id, targets) return "" From 100cf17e4b86d33573051ec19e84f6908a181bb2 Mon Sep 17 00:00:00 2001 From: ben Date: Tue, 13 Dec 2022 20:07:16 +0000 Subject: [PATCH 06/15] fixed percent --- lnbits/extensions/splitpayments/migrations.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lnbits/extensions/splitpayments/migrations.py b/lnbits/extensions/splitpayments/migrations.py index d9ead03f..58ca90bc 100644 --- a/lnbits/extensions/splitpayments/migrations.py +++ b/lnbits/extensions/splitpayments/migrations.py @@ -56,7 +56,7 @@ async def m002_float_percent(db): await db.execute("DROP TABLE splitpayments.splitpayments_old") -async def m003_float_percent(db): +async def m003_add_id_and_tag(db): """ Add float percent and migrates the existing data. """ @@ -66,7 +66,7 @@ async def m003_float_percent(db): CREATE TABLE splitpayments.targets ( wallet TEXT NOT NULL, source TEXT NOT NULL, - percent INT, + percent REAL NOT NULL CHECK (percent >= 0 AND percent <= 100), alias TEXT, UNIQUE (source, wallet) From e161c5d1168dbf54067ec4222c4dba39b6034c7f Mon Sep 17 00:00:00 2001 From: ben Date: Tue, 13 Dec 2022 20:11:07 +0000 Subject: [PATCH 07/15] fixed migration --- lnbits/extensions/splitpayments/migrations.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lnbits/extensions/splitpayments/migrations.py b/lnbits/extensions/splitpayments/migrations.py index 58ca90bc..4163062f 100644 --- a/lnbits/extensions/splitpayments/migrations.py +++ b/lnbits/extensions/splitpayments/migrations.py @@ -64,9 +64,11 @@ async def m003_add_id_and_tag(db): await db.execute( """ CREATE TABLE splitpayments.targets ( + id TEXT PRIMARY KEY, wallet TEXT NOT NULL, source TEXT NOT NULL, percent REAL NOT NULL CHECK (percent >= 0 AND percent <= 100), + tag TEXT NOT NULL, alias TEXT, UNIQUE (source, wallet) @@ -81,7 +83,7 @@ async def m003_add_id_and_tag(db): await db.execute( """ INSERT INTO splitpayments.targets ( - id + id, wallet, source, percent, From c91b5031bfb69cf0b0c9a499bfb516afb3d4f1b9 Mon Sep 17 00:00:00 2001 From: ben Date: Tue, 13 Dec 2022 20:17:52 +0000 Subject: [PATCH 08/15] migration working --- lnbits/extensions/splitpayments/migrations.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lnbits/extensions/splitpayments/migrations.py b/lnbits/extensions/splitpayments/migrations.py index 4163062f..cb72b990 100644 --- a/lnbits/extensions/splitpayments/migrations.py +++ b/lnbits/extensions/splitpayments/migrations.py @@ -90,7 +90,7 @@ async def m003_add_id_and_tag(db): tag, alias ) - VALUES (?, ?, ?, ?) + VALUES (?, ?, ?, ?, ?, ?) """, (urlsafe_short_hash(), row[0], row[1], row[2], '', row[3]), ) From 5f53eb8e4e77bdb146c82698d60207b853d75f95 Mon Sep 17 00:00:00 2001 From: ben Date: Tue, 13 Dec 2022 23:41:40 +0000 Subject: [PATCH 09/15] tagged working --- lnbits/extensions/splitpayments/models.py | 2 +- .../splitpayments/static/js/index.js | 31 +++++++--- lnbits/extensions/splitpayments/tasks.py | 62 ++++++++++++------- .../templates/splitpayments/index.html | 3 +- 4 files changed, 67 insertions(+), 31 deletions(-) diff --git a/lnbits/extensions/splitpayments/models.py b/lnbits/extensions/splitpayments/models.py index 88f98888..fc3db2c6 100644 --- a/lnbits/extensions/splitpayments/models.py +++ b/lnbits/extensions/splitpayments/models.py @@ -16,7 +16,7 @@ class TargetPutList(BaseModel): wallet: str = Query(...) alias: str = Query("") percent: float = Query(..., ge=0, lt=100) - tag: str = Query("") + tag: str class TargetPut(BaseModel): diff --git a/lnbits/extensions/splitpayments/static/js/index.js b/lnbits/extensions/splitpayments/static/js/index.js index 9426b41a..9d7eb409 100644 --- a/lnbits/extensions/splitpayments/static/js/index.js +++ b/lnbits/extensions/splitpayments/static/js/index.js @@ -39,6 +39,15 @@ new Vue({ timeout: 500 }) }, + clearTarget(index) { + this.targets.splice(index, 1) + console.log(this.targets) + this.$q.notify({ + message: + 'Removed item. You must click to save manually.', + timeout: 500 + }) + }, getTargets() { LNbits.api .request( @@ -52,8 +61,17 @@ new Vue({ .then(response => { this.currentHash = hashTargets(response.data) this.targets = response.data.concat({}) - for (let i = 0; i < this.targets.length; i++) { - if(this.targets[i].tag != + for (let i = 0; i < this.targets.length; i++) { + if(this.targets[i].tag.length > 0){ + this.targets[i].method = "tag" + } + else if (this.targets[i].percent.length > 0){ + this.targets[i].method = "split" + } + else{ + this.targets[i].method = "" + } + } }) }, @@ -64,17 +82,19 @@ new Vue({ clearChanged(index) { if(this.targets[index].method == 'split'){ this.targets[index].tag = null + this.targets[index].method = 'split' } else{ this.targets[index].percent = null + this.targets[index].method = 'tag' } }, targetChanged(index) { // fix percent min and max range - console.log(this.targets) if (this.targets[index].percent) { if (this.targets[index].percent > 100) this.targets[index].percent = 100 if (this.targets[index].percent < 0) this.targets[index].percent = 0 + this.targets[index].tag = "" } // not percentage @@ -128,15 +148,12 @@ new Vue({ if (t !== index) target.percent -= +(diff * target.percent).toFixed(2) }) } - // overwrite so changes appear this.targets = this.targets - console.log(this.targets) }, saveTargets() { - console.log(this.targets) for (let i = 0; i < this.targets.length; i++) { - if (this.targets[i].tag){ + if (this.targets[i].tag != ''){ this.targets[i].percent = 0 } else{ diff --git a/lnbits/extensions/splitpayments/tasks.py b/lnbits/extensions/splitpayments/tasks.py index c5cac4a6..2bbefd1d 100644 --- a/lnbits/extensions/splitpayments/tasks.py +++ b/lnbits/extensions/splitpayments/tasks.py @@ -25,7 +25,7 @@ async def on_invoice_paid(payment: Payment) -> None: return targets = await get_targets(payment.wallet_id) - + logger.debug(targets) if not targets: return @@ -35,28 +35,46 @@ async def on_invoice_paid(payment: Payment) -> None: logger.error("splitpayment failure: total percent adds up to more than 100%") return - logger.debug(f"performing split payments to {len(targets)} targets") + logger.debug(f"checking if tagged for {len(targets)} targets") + tagged = False for target in targets: - - if target.tag and payment.extra.get("tag") == target.tag: - amount = int(payment.amount) - elif target.percent: + if payment.extra.get("tag") == target.tag: + tagged = True + payment_hash, payment_request = await create_invoice( + wallet_id=target.wallet, + amount=int(payment.amount / 1000), # sats + internal=True, + memo=f"Pushed tagged payment to {target.alias}", + extra={"tag": "splitpayments"}, + ) + logger.debug(f"created split invoice: {payment_hash}") + + checking_id = await pay_invoice( + payment_request=payment_request, + wallet_id=payment.wallet_id, + extra={"tag": "splitpayments"}, + ) + logger.debug(f"paid split invoice: {checking_id}") + + logger.debug(f"performing split to {len(targets)} targets") + logger.debug("pitbull") + if tagged == False: + for target in targets: amount = int(payment.amount * target.percent / 100) # msats - else: - return + payment_hash, payment_request = await create_invoice( + wallet_id=target.wallet, + amount=int(amount / 1000), # sats + internal=True, + memo=f"split payment: {target.percent}% for {target.alias or target.wallet}", + extra={"tag": "splitpayments"}, + ) + logger.debug(f"created split invoice: {payment_hash}") + + checking_id = await pay_invoice( + payment_request=payment_request, + wallet_id=payment.wallet_id, + extra={"tag": "splitpayments"}, + ) + logger.debug(f"paid split invoice: {checking_id}") - payment_hash, payment_request = await create_invoice( - wallet_id=target.wallet, - amount=int(amount / 1000), # sats - internal=True, - memo=f"split payment: {target.percent}% for {target.alias or target.wallet}", - extra={"tag": "splitpayments"}, - ) - logger.debug(f"created split invoice: {payment_hash}") - checking_id = await pay_invoice( - payment_request=payment_request, - wallet_id=payment.wallet_id, - extra={"tag": "splitpayments"}, - ) - logger.debug(f"paid split invoice: {checking_id}") diff --git a/lnbits/extensions/splitpayments/templates/splitpayments/index.html b/lnbits/extensions/splitpayments/templates/splitpayments/index.html index 86a711f0..8154f4c7 100644 --- a/lnbits/extensions/splitpayments/templates/splitpayments/index.html +++ b/lnbits/extensions/splitpayments/templates/splitpayments/index.html @@ -67,7 +67,7 @@ > Add more +
From f506b010f60533b3fd98591d624b54e9674d98b6 Mon Sep 17 00:00:00 2001 From: ben Date: Wed, 14 Dec 2022 00:04:03 +0000 Subject: [PATCH 10/15] Working --- lnbits/extensions/splitpayments/tasks.py | 33 ++++++++++++------------ 1 file changed, 17 insertions(+), 16 deletions(-) diff --git a/lnbits/extensions/splitpayments/tasks.py b/lnbits/extensions/splitpayments/tasks.py index 2bbefd1d..08931a20 100644 --- a/lnbits/extensions/splitpayments/tasks.py +++ b/lnbits/extensions/splitpayments/tasks.py @@ -57,24 +57,25 @@ async def on_invoice_paid(payment: Payment) -> None: logger.debug(f"paid split invoice: {checking_id}") logger.debug(f"performing split to {len(targets)} targets") - logger.debug("pitbull") + if tagged == False: for target in targets: - amount = int(payment.amount * target.percent / 100) # msats - payment_hash, payment_request = await create_invoice( - wallet_id=target.wallet, - amount=int(amount / 1000), # sats - internal=True, - memo=f"split payment: {target.percent}% for {target.alias or target.wallet}", - extra={"tag": "splitpayments"}, - ) - logger.debug(f"created split invoice: {payment_hash}") + if target.percent > 0: + amount = int(payment.amount * target.percent / 100) # msats + payment_hash, payment_request = await create_invoice( + wallet_id=target.wallet, + amount=int(amount / 1000), # sats + internal=True, + memo=f"split payment: {target.percent}% for {target.alias or target.wallet}", + extra={"tag": "splitpayments"}, + ) + logger.debug(f"created split invoice: {payment_hash}") - checking_id = await pay_invoice( - payment_request=payment_request, - wallet_id=payment.wallet_id, - extra={"tag": "splitpayments"}, - ) - logger.debug(f"paid split invoice: {checking_id}") + checking_id = await pay_invoice( + payment_request=payment_request, + wallet_id=payment.wallet_id, + extra={"tag": "splitpayments"}, + ) + logger.debug(f"paid split invoice: {checking_id}") From 75e6252d23504c5e6c7a8cac885c2acc8116ff48 Mon Sep 17 00:00:00 2001 From: ben Date: Wed, 14 Dec 2022 00:06:36 +0000 Subject: [PATCH 11/15] formatted --- lnbits/extensions/splitpayments/crud.py | 10 +++- lnbits/extensions/splitpayments/migrations.py | 5 +- .../splitpayments/static/js/index.js | 55 ++++++++++--------- lnbits/extensions/splitpayments/tasks.py | 6 +- .../templates/splitpayments/index.html | 34 +++++++----- lnbits/extensions/splitpayments/views_api.py | 3 - 6 files changed, 62 insertions(+), 51 deletions(-) diff --git a/lnbits/extensions/splitpayments/crud.py b/lnbits/extensions/splitpayments/crud.py index 67ca9dfe..65908ad4 100644 --- a/lnbits/extensions/splitpayments/crud.py +++ b/lnbits/extensions/splitpayments/crud.py @@ -2,7 +2,6 @@ from typing import List from . import db from .models import Target -from loguru import logger async def get_targets(source_wallet: str) -> List[Target]: @@ -13,7 +12,6 @@ async def get_targets(source_wallet: str) -> List[Target]: async def set_targets(source_wallet: str, targets: List[Target]): - logger.debug(targets) async with db.connect() as conn: await conn.execute( "DELETE FROM splitpayments.targets WHERE source = ?", (source_wallet,) @@ -25,5 +23,11 @@ async def set_targets(source_wallet: str, targets: List[Target]): (source, wallet, percent, tag, alias) VALUES (?, ?, ?, ?, ?) """, - (source_wallet, target.wallet, target.percent, target.tag, target.alias), + ( + source_wallet, + target.wallet, + target.percent, + target.tag, + target.alias, + ), ) diff --git a/lnbits/extensions/splitpayments/migrations.py b/lnbits/extensions/splitpayments/migrations.py index cb72b990..eb72387e 100644 --- a/lnbits/extensions/splitpayments/migrations.py +++ b/lnbits/extensions/splitpayments/migrations.py @@ -1,5 +1,6 @@ from lnbits.helpers import urlsafe_short_hash + async def m001_initial(db): """ Initial split payment table. @@ -92,7 +93,7 @@ async def m003_add_id_and_tag(db): ) VALUES (?, ?, ?, ?, ?, ?) """, - (urlsafe_short_hash(), row[0], row[1], row[2], '', row[3]), + (urlsafe_short_hash(), row[0], row[1], row[2], "", row[3]), ) - await db.execute("DROP TABLE splitpayments.splitpayments_old") \ No newline at end of file + await db.execute("DROP TABLE splitpayments.splitpayments_old") diff --git a/lnbits/extensions/splitpayments/static/js/index.js b/lnbits/extensions/splitpayments/static/js/index.js index 9d7eb409..f5f16276 100644 --- a/lnbits/extensions/splitpayments/static/js/index.js +++ b/lnbits/extensions/splitpayments/static/js/index.js @@ -10,7 +10,11 @@ function hashTargets(targets) { } function isTargetComplete(target) { - return target.wallet && target.wallet.trim() !== '' && (target.percent > 0 || target.tag != '') + return ( + target.wallet && + target.wallet.trim() !== '' && + (target.percent > 0 || target.tag != '') + ) } new Vue({ @@ -20,9 +24,11 @@ new Vue({ return { selectedWallet: null, currentHash: '', // a string that must match if the edit data is unchanged - targets: [{ - method: "split" - }] + targets: [ + { + method: 'split' + } + ] } }, computed: { @@ -43,8 +49,7 @@ new Vue({ this.targets.splice(index, 1) console.log(this.targets) this.$q.notify({ - message: - 'Removed item. You must click to save manually.', + message: 'Removed item. You must click to save manually.', timeout: 500 }) }, @@ -61,17 +66,14 @@ new Vue({ .then(response => { this.currentHash = hashTargets(response.data) this.targets = response.data.concat({}) - for (let i = 0; i < this.targets.length; i++) { - if(this.targets[i].tag.length > 0){ - this.targets[i].method = "tag" + for (let i = 0; i < this.targets.length; i++) { + if (this.targets[i].tag.length > 0) { + this.targets[i].method = 'tag' + } else if (this.targets[i].percent.length > 0) { + this.targets[i].method = 'split' + } else { + this.targets[i].method = '' } - else if (this.targets[i].percent.length > 0){ - this.targets[i].method = "split" - } - else{ - this.targets[i].method = "" - } - } }) }, @@ -80,11 +82,10 @@ new Vue({ this.getTargets() }, clearChanged(index) { - if(this.targets[index].method == 'split'){ + if (this.targets[index].method == 'split') { this.targets[index].tag = null this.targets[index].method = 'split' - } - else{ + } else { this.targets[index].percent = null this.targets[index].method = 'tag' } @@ -94,14 +95,14 @@ new Vue({ if (this.targets[index].percent) { if (this.targets[index].percent > 100) this.targets[index].percent = 100 if (this.targets[index].percent < 0) this.targets[index].percent = 0 - this.targets[index].tag = "" + this.targets[index].tag = '' } // not percentage if (!this.targets[index].percent) { this.targets[index].percent = 0 } - + // remove empty lines (except last) if (this.targets.length >= 2) { for (let i = this.targets.length - 2; i >= 0; i--) { @@ -153,10 +154,9 @@ new Vue({ }, saveTargets() { for (let i = 0; i < this.targets.length; i++) { - if (this.targets[i].tag != ''){ + if (this.targets[i].tag != '') { this.targets[i].percent = 0 - } - else{ + } else { this.targets[i].tag = '' } } @@ -168,7 +168,12 @@ new Vue({ { targets: this.targets .filter(isTargetComplete) - .map(({wallet, percent, tag, alias}) => ({wallet, percent, tag, alias})) + .map(({wallet, percent, tag, alias}) => ({ + wallet, + percent, + tag, + alias + })) } ) .then(response => { diff --git a/lnbits/extensions/splitpayments/tasks.py b/lnbits/extensions/splitpayments/tasks.py index 08931a20..a1832b63 100644 --- a/lnbits/extensions/splitpayments/tasks.py +++ b/lnbits/extensions/splitpayments/tasks.py @@ -55,9 +55,9 @@ async def on_invoice_paid(payment: Payment) -> None: extra={"tag": "splitpayments"}, ) logger.debug(f"paid split invoice: {checking_id}") - + logger.debug(f"performing split to {len(targets)} targets") - + if tagged == False: for target in targets: if target.percent > 0: @@ -77,5 +77,3 @@ async def on_invoice_paid(payment: Payment) -> None: extra={"tag": "splitpayments"}, ) logger.debug(f"paid split invoice: {checking_id}") - - diff --git a/lnbits/extensions/splitpayments/templates/splitpayments/index.html b/lnbits/extensions/splitpayments/templates/splitpayments/index.html index 8154f4c7..b105bf2c 100644 --- a/lnbits/extensions/splitpayments/templates/splitpayments/index.html +++ b/lnbits/extensions/splitpayments/templates/splitpayments/index.html @@ -31,7 +31,7 @@ style="flex-wrap: nowrap" v-for="(target, t) in targets" > - - + - - + Add more - +
diff --git a/lnbits/extensions/splitpayments/views_api.py b/lnbits/extensions/splitpayments/views_api.py index 1599d336..41a11c94 100644 --- a/lnbits/extensions/splitpayments/views_api.py +++ b/lnbits/extensions/splitpayments/views_api.py @@ -11,8 +11,6 @@ from . import splitpayments_ext from .crud import get_targets, set_targets from .models import Target, TargetPut -from loguru import logger - @splitpayments_ext.get("/api/v1/targets") async def api_targets_get(wallet: WalletTypeInfo = Depends(require_admin_key)): @@ -27,7 +25,6 @@ async def api_targets_set( body = await req.json() targets = [] data = TargetPut.parse_obj(body["targets"]) - logger.debug(data) for entry in data.__root__: wallet = await get_wallet(entry.wallet) if not wallet: From 4c3db72afcffd0b4491b8794d8f849ee5ce2b298 Mon Sep 17 00:00:00 2001 From: ben Date: Wed, 14 Dec 2022 00:31:09 +0000 Subject: [PATCH 12/15] Added ID --- lnbits/extensions/splitpayments/crud.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/lnbits/extensions/splitpayments/crud.py b/lnbits/extensions/splitpayments/crud.py index 65908ad4..2b556f87 100644 --- a/lnbits/extensions/splitpayments/crud.py +++ b/lnbits/extensions/splitpayments/crud.py @@ -3,6 +3,8 @@ from typing import List from . import db from .models import Target +from lnbits.helpers import urlsafe_short_hash + async def get_targets(source_wallet: str) -> List[Target]: rows = await db.fetchall( @@ -20,10 +22,11 @@ async def set_targets(source_wallet: str, targets: List[Target]): await conn.execute( """ INSERT INTO splitpayments.targets - (source, wallet, percent, tag, alias) - VALUES (?, ?, ?, ?, ?) + (id, source, wallet, percent, tag, alias) + VALUES (?, ?, ?, ?, ?, ?) """, ( + urlsafe_short_hash(), source_wallet, target.wallet, target.percent, From 59c6469bd1dedbd07b5e515a3101fa2215dcda12 Mon Sep 17 00:00:00 2001 From: ben Date: Wed, 14 Dec 2022 14:43:41 +0000 Subject: [PATCH 13/15] generalised tag search --- lnbits/extensions/splitpayments/tasks.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lnbits/extensions/splitpayments/tasks.py b/lnbits/extensions/splitpayments/tasks.py index a1832b63..33768805 100644 --- a/lnbits/extensions/splitpayments/tasks.py +++ b/lnbits/extensions/splitpayments/tasks.py @@ -38,7 +38,7 @@ async def on_invoice_paid(payment: Payment) -> None: logger.debug(f"checking if tagged for {len(targets)} targets") tagged = False for target in targets: - if payment.extra.get("tag") == target.tag: + if target.tag in payment.extra: tagged = True payment_hash, payment_request = await create_invoice( wallet_id=target.wallet, From 60a01cd89a954a952ff9284f36b26a0f783ad765 Mon Sep 17 00:00:00 2001 From: ben Date: Wed, 14 Dec 2022 14:53:09 +0000 Subject: [PATCH 14/15] fomrat --- lnbits/extensions/splitpayments/crud.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lnbits/extensions/splitpayments/crud.py b/lnbits/extensions/splitpayments/crud.py index 2b556f87..d7ac329c 100644 --- a/lnbits/extensions/splitpayments/crud.py +++ b/lnbits/extensions/splitpayments/crud.py @@ -1,9 +1,11 @@ from typing import List +from lnbits.helpers import urlsafe_short_hash + from . import db from .models import Target -from lnbits.helpers import urlsafe_short_hash + async def get_targets(source_wallet: str) -> List[Target]: From 475ff47f5b9b756445a992a18964c5e3e84cc728 Mon Sep 17 00:00:00 2001 From: ben Date: Wed, 14 Dec 2022 14:56:04 +0000 Subject: [PATCH 15/15] isort --- lnbits/extensions/splitpayments/crud.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/lnbits/extensions/splitpayments/crud.py b/lnbits/extensions/splitpayments/crud.py index d7ac329c..de4e0822 100644 --- a/lnbits/extensions/splitpayments/crud.py +++ b/lnbits/extensions/splitpayments/crud.py @@ -6,8 +6,6 @@ from . import db from .models import Target - - async def get_targets(source_wallet: str) -> List[Target]: rows = await db.fetchall( "SELECT * FROM splitpayments.targets WHERE source = ?", (source_wallet,)