diff --git a/Makefile b/Makefile index 2faac1cd8..9b1a9da2e 100644 --- a/Makefile +++ b/Makefile @@ -248,10 +248,12 @@ check-markdown: check-spelling: @tools/check-spelling.sh +PYSRC=$(shell git ls-files "*.py") contrib/pylightning/lightning-pay + check-python: @# E501 line too long (N > 79 characters) @# E731 do not assign a lambda expression, use a def - @git ls-files "*.py" | xargs flake8 --ignore=E501,E731 --exclude=contrib/pylightning/lightning/__init__.py + @flake8 --ignore=E501,E731 --exclude=contrib/pylightning/lightning/__init__.py ${PYSRC} check-source: check-makefile check-source-bolt check-whitespace check-markdown check-spelling check-python diff --git a/contrib/lightning-pay b/contrib/lightning-pay deleted file mode 100755 index 7400aeada..000000000 --- a/contrib/lightning-pay +++ /dev/null @@ -1,32 +0,0 @@ -#! /bin/sh -e -# A terrible script to make a payment. - -if [ $# -ne 3 ]; then - echo "Usage: " >&2 - exit 1 -fi -DEST="$1" -AMOUNT="$2" -PHASH="$3" - -if ROUTE=`cli/lightning-cli getroute $DEST $AMOUNT 1`; then - # Strip down to raw array. - ROUTE=`echo $ROUTE | sed 's/^{ "route" : \(.*\) }$/\1/'` - # Get first amount. - PAID=`echo $ROUTE | tr , '\012' | sed -n 's/.*msatoshi[^0-9]*\([0-9]*\).*/\1/p' | head -n1` - echo -n "Paying fee $(($PAID - $AMOUNT)) on $AMOUNT ("`echo "scale=3; ($PAID - $AMOUNT) * 100 / $AMOUNT" | bc`"%). Send [Y/n]? " - read REPLY - case $REPLY in - ""|y*|Y) - cli/lightning-cli sendpay "$ROUTE" "$PHASH" - exit - ;; - *) - echo Not sending. - exit 1 - ;; - esac -else - echo Routing failed >&2 - exit 1 -fi diff --git a/contrib/pylightning/lightning-pay b/contrib/pylightning/lightning-pay new file mode 100755 index 000000000..8ba33ea19 --- /dev/null +++ b/contrib/pylightning/lightning-pay @@ -0,0 +1,54 @@ +#!/usr/bin/env python3 + +import argparse +import os +import sys +from lightning import LightningRpc + +parser = argparse.ArgumentParser(formatter_class=argparse.ArgumentDefaultsHelpFormatter) +parser.add_argument("bolt11_or_destination_id") +parser.add_argument("amount_in_milli_satoshi", default=None, type=int, nargs="?") +parser.add_argument("payment_hash", nargs="?") +args = parser.parse_args() + + +def default_configdir(): + home = os.getenv("HOME") + if home: + return os.path.join(home, ".lightning") + return "." + + +rpc_path = os.path.join(default_configdir(), "lightning-rpc") +ld = LightningRpc(rpc_path) + +assert len(args.bolt11_or_destination_id) > 2, "argument bolt11_or_destination_id is invalid" +prefix = args.bolt11_or_destination_id[:2] + +if prefix == "ln": + bolt11 = ld.decodepay(args.bolt11_or_destination_id) + id_ = bolt11["payee"] + payment_hash = bolt11["payment_hash"] + if "msatoshi" in bolt11: + amount = bolt11["msatoshi"] + else: + assert args.amount_in_milli_satoshi, "need argument amount_in_milli_satoshi" + amount = args.amount_in_milli_satoshi +else: + assert args.amount_in_milli_satoshi, "need argument amount_in_milli_satoshi" + assert args.payment_hash, "need argument payment_hash" + amount = args.amount_in_milli_satoshi + id_ = args.bolt11_or_destination_id + payment_hash = args.payment_hash + +route = ld.getroute(id_, amount, 1) + +fee = route["route"][0]["msatoshi"] - amount + +reply = input("Paying fee %s on amount %s (%.3f%%). Send [Y/n]?" % (fee, amount, fee / amount * 100.0)) + +if reply in ["y", "Y"]: + ld.sendpay(route["route"], payment_hash) +else: + print("Not sending.") + sys.exit(1) diff --git a/contrib/pylightning/setup.py b/contrib/pylightning/setup.py index 3ec4b443a..af902f150 100644 --- a/contrib/pylightning/setup.py +++ b/contrib/pylightning/setup.py @@ -8,4 +8,5 @@ setup(name='pylightning', author_email='decker.christian@gmail.com', license='MIT', packages=['lightning'], + scripts=['lightning-pay'], zip_safe=True)