SatSale

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | README | LICENSE

commit c19edfb549084be1eb329357c627708bc1145804
parent dac317dbc499388a09c059780a81663b47fe80dc
Author: NicholasFarrow <nicholas.w.farrow@gmail.com>
Date:   Wed, 23 Dec 2020 23:12:31 +1100

Code restructuring, invoice & payment inheritance, exception handling for connections, payment logic

Diffstat:
Minvoice/__init__.py | 18------------------
Ainvoice/payment_invoice.py | 18++++++++++++++++++
Minvoice/price_feed.py | 29+++++++++++++++++++----------
Mpay/bitcoind.py | 38+++++++++++++++++++++++---------------
Mserver.py | 9++++++---
Astatic/server_connection.js | 24++++++++++++++++++++++++
Mtemplates/index.html | 58+++++++++++++++++++++++++++++++---------------------------
7 files changed, 121 insertions(+), 73 deletions(-)

diff --git a/invoice/__init__.py b/invoice/__init__.py @@ -1,18 +0,0 @@ -import uuid - -import config -from .price_feed import get_btc_value - - -class invoice(): - def __init__(self, dollar_value, currency, label): - self.dollar_value = dollar_value - self.currency = currency - self.value = get_btc_value(dollar_value, currency) - self.label = label - self.id = str(uuid.uuid4) - self.status = 'Payment initialised.' - self.response = '' - self.time_left = config.payment_timeout - self.confirmed_paid = 0 - self.unconfirmed_paid = 0 diff --git a/invoice/payment_invoice.py b/invoice/payment_invoice.py @@ -0,0 +1,18 @@ +import uuid + +import config +from .price_feed import get_btc_value + + +class invoice: + def __init__(self, dollar_value, currency, label): + self.dollar_value = dollar_value + self.currency = currency + self.value = get_btc_value(dollar_value, currency) + self.label = label + self.id = str(uuid.uuid4()) + self.status = 'Payment initialised.' + self.response = '' + self.time_left = config.payment_timeout + self.confirmed_paid = 0 + self.unconfirmed_paid = 0 diff --git a/invoice/price_feed.py b/invoice/price_feed.py @@ -1,28 +1,37 @@ import requests +import config + def get_price(currency): price_feed = "https://api.coindesk.com/v1/bpi/currentprice.json" r = requests.get(price_feed) - - try: - price_data = r.json() - prices = price_data['bpi'] - except: - print("Failed to reach {}.".format(price_feed)) - return None + + for i in range(config.connection_attempts): + try: + price_data = r.json() + prices = price_data['bpi'] + break + + except Exception as e: + print(e) + print("Attempting again... {}/{}...".format(i+1, config.connection_attempts)) + + else: + raise("Failed to reach {}.".format(price_feed)) + try: price = prices[currency]['rate'].replace(',', '') + return price + except: print("Failed to find currency {} from {}.".format(currency, price_feed)) return None - return price - def get_btc_value(dollar_value, currency): if (price := get_price(currency)) is not None: - + try: float_value = dollar_value / float(price) if not isinstance(float_value, float): diff --git a/pay/bitcoind.py b/pay/bitcoind.py @@ -1,27 +1,30 @@ import config import subprocess +from invoice.payment_invoice import invoice -class btcd: - def __init__(self, invoice): - self.__dict__ = invoice.__dict__.copy() +class btcd(invoice): + def __init__(self, dollar_value, currency, label): + super().__init__(dollar_value, currency, label) + print(self.__dict__) + # self.__dict__ = invoice.__dict__.copy() from bitcoinrpc.authproxy import AuthServiceProxy connection_str = "http://{}:{}@{}:{}".format(config.username, config.password, config.host, config.rpcport) print("Attempting to connect to {}.".format(connection_str)) - try: - self.rpc = AuthServiceProxy(connection_str) - # info = self.rpc.getblockchaininfo() - # info = self.rpc.help() + for i in range(config.connection_attempts): + try: + self.rpc = AuthServiceProxy(connection_str) + info = self.rpc.getblockchaininfo() + print("Successfully contacted bitcoind.") + break - print("Successfully contacted bitcoind.") - print("-"*10) - #print(info) - print("-"*10) - - except Exception as e: - print(e) + except Exception as e: + print(e) + print("Attempting again... {}/{}...".format(i+1, config.connection_attempts)) + else: + raise Exception("Could not connect to bitcoind. Check your RPC / port tunneling settings and try again.") def check_payment(self): self.address = "bc1qwxlwghumfmhwdc2deyn7h42syp2t496penax2y" @@ -39,5 +42,10 @@ class btcd: return conf_paid, unconf_paid def get_address(self): - self.address = self.rpc.getnewaddress(self.label) + for i in range(config.connection_attempts): + try: + self.address = self.rpc.getnewaddress(self.label) + except Exception as e: + print(e) + print("Attempting again... {}/{}...".format(i+1, config.connection_attempts)) return diff --git a/server.py b/server.py @@ -61,9 +61,10 @@ def make_payment(payload): # Nothing? # Run custom script? -def create_invoice(amount, currency, label): - payment_invoice = invoice.invoice(amount, currency, label) - payment = bitcoind.btcd(payment_invoice) +def create_invoice(dollar_amount, currency, label): + # payment_invoice = invoice.invoice(amount, currency, label) + payment = bitcoind.btcd(dollar_amount, currency, label) + # payment = bitcoind.btcd(payment_invoice) payment.get_address() return payment @@ -89,6 +90,8 @@ def make_payment(payment): while (time_left := config.payment_timeout - (time.time() - payment.start_time)) > 0: payment.time_left = time_left payment.confirmed_paid, payment.unconfirmed_paid = payment.check_payment() + print() + print(payment.__dict__) if payment.confirmed_paid > payment.value: payment.paid = True diff --git a/static/server_connection.js b/static/server_connection.js @@ -0,0 +1,24 @@ +$(document).ready(function() { + namespace = '/pay'; + var socket = io(namespace); + + socket.on('connect', function() { + socket.emit('initialise', {'data': 'initialising payment...'}); + }); + + socket.on('payresponse', function(msg, cb) { + console.log(msg.response); + $('#status').text(msg.status).html(); + $('#address').text(msg.address).html(); + $('#amount').text(msg.amount).html(); + $('#log').append('<br>' + $('<div/>').text(msg.response).html()); + $('#timer').text(msg.time_left).html(); + if (cb) + cb(); + }); + + $('form#pay').submit(function(event) { + socket.emit('payment', {'amount': $('#pay_data').val(), 'label' : null}); + return false; + }); +}); diff --git a/templates/index.html b/templates/index.html @@ -4,34 +4,35 @@ <title>BTCPyServer</title> <script src="//code.jquery.com/jquery-1.12.4.min.js"></script> <script src="//cdnjs.cloudflare.com/ajax/libs/socket.io/3.0.4/socket.io.js"></script> - <script type="text/javascript" charset="utf-8"> - $(document).ready(function() { - namespace = '/pay'; - var socket = io(namespace); - - socket.on('connect', function() { - socket.emit('initialise', {'data': 'initialising payment...'}); - }); - - socket.on('payresponse', function(msg, cb) { - console.log(msg.response); - $('#status').text(msg.status).html(); - $('#address').text(msg.address).html(); - $('#amount').text(msg.amount).html(); - $('#log').append('<br>' + $('<div/>').text(msg.response).html()); - $('#timer').text(msg.time_left).html(); - if (cb) - cb(); - }); - - $('form#pay').submit(function(event) { - socket.emit('payment', {'amount': $('#pay_data').val(), 'label' : null}); - return false; - }); + <script src="{{ url_for('static', filename='server_connection.js') }}"></script> + <!-- <script type="text/javascript" charset="utf-8"> + $(document).ready(function() { + namespace = '/pay'; + var socket = io(namespace); + + socket.on('connect', function() { + socket.emit('initialise', {'data': 'initialising payment...'}); + }); + + socket.on('payresponse', function(msg, cb) { + console.log(msg.response); + $('#status').text(msg.status).html(); + $('#address').text(msg.address).html(); + $('#amount').text(msg.amount).html(); + $('#log').append('<br>' + $('<div/>').text(msg.response).html()); + $('#timer').text(msg.time_left).html(); + if (cb) + cb(); }); - </script> - <script type="text/javascript" charset="utf-8"> + $('form#pay').submit(function(event) { + socket.emit('payment', {'amount': $('#pay_data').val(), 'label' : null}); + return false; + }); + }); + </script> --> + + <!-- <script type="text/javascript" charset="utf-8"> intervalTimer = setInterval(function () { var currentTime = document.getElementById('timer').innerHTML; if (currentTime <= 0) { @@ -39,7 +40,7 @@ } document.getElementById('timer').innerHTML = Math.round(currentTime - 1); }, 1000) - </script> + </script> --> </head> <body style="background-color:white;"> @@ -57,5 +58,8 @@ <p>Amount: <span id="amount"></span> BTC</p> <p><span id="timer"></span> seconds left.<p> <div id="log" ></div> + + <div id="paybutton"></div> + <script </body> </html>