Add debug outputs; Add new GUI

This commit is contained in:
poka 2020-11-25 08:02:21 +01:00
parent 21bda9d646
commit 283e6c47c5
4 changed files with 99 additions and 113 deletions

View File

@ -1,101 +0,0 @@
#!/usr/bin/env python3
"""
ZetCode Tkinter tutorial
In this example, we use the pack
manager to create a review example.
Author: Jan Bodnar
Website: www.zetcode.com
"""
from tkinter import Tk, Text, TOP, BOTH, X, N, LEFT
from tkinter.ttk import Frame, Label, Entry, Button
from libs.paylib import Transaction
import sys, threading
class StdoutRedirector(object):
def __init__(self, text_widget):
self.text_widget = text_widget
def write(self, s):
self.text_widget.insert('end', s)
self.text_widget.see('end')
def flush(self):
pass
class Pay(Frame):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
self.master.title("Paiement Ḡ1")
self.pack(fill=X)
frame1 = Frame(self)
frame1.pack(fill=X)
recipientLabel = Label(frame1, text="Destinataire:", width=12)
recipientLabel.pack(side=LEFT, padx=5, pady=5)
self.recipientEntry = Entry(frame1)
self.recipientEntry.pack(fill=X, padx=5, expand=True)
frame2 = Frame(self)
frame2.pack(fill=X)
AmountLabel = Label(frame2, text="Montant:", width=12)
AmountLabel.pack(side=LEFT, padx=5, pady=5)
self.AmountEntry = Entry(frame2, width=7)
self.AmountEntry.pack(side=LEFT, padx=5)
frame3 = Frame(self)
frame3.pack(fill=X)
commentLabel = Label(frame3, text="Commentaire:", width=12)
commentLabel.pack(side=LEFT, padx=5, pady=5)
self.commentEntry = Entry(frame3)
self.commentEntry.pack(fill=X, padx=5, expand=True)
frame4 = Frame(self)
frame4.pack()
self.sendButton = Button(frame4, text="Envoyer", command=self.ProceedPaiement)
self.sendButton.pack(side=LEFT, padx=5, pady=5, expand=True)
frame5 = Frame(self, width=200, height=300)
frame5.pack()
self.textbox = Text(frame5, wrap='word')
self.textbox.pack()
sys.stdout = StdoutRedirector(self.textbox)
def ProceedPaiement(self):
try:
recipient = str(self.recipientEntry.get())
amount = int(self.AmountEntry.get())
except:
print("Please enter the recipient's public and the amount\n")
else:
comment = str(self.commentEntry.get())
print("Paiement en cours ... " + recipient)
trans = Transaction(recipient, amount, comment)
trans.send()
recipient = amount = comment = None
def main():
def starter():
root = Tk()
root.geometry("500x300+300+300")
app = Pay()
root.mainloop()
thread = threading.Thread(target=starter)
thread.start()
if __name__ == '__main__':
main()

View File

@ -13,20 +13,29 @@ class Transaction:
def __init__(self, dunikey, node, recipient, amount, comment='', useMempool=False, verbose=False):
self.dunikey = dunikey
self.recipient = recipient
self.amount = amount
self.amount = int(amount)
self.comment = comment
self.issuer = get_privkey(dunikey, "pubsec").pubkey
self.useMempool = useMempool
self.verbose = verbose
self.node = node
self._isChange = False
if not re.match(PUBKEY_REGEX, recipient) or len(recipient) > 45:
try:
if not re.match(PUBKEY_REGEX, recipient) or len(recipient) > 45:
raise ValueError("La clé publique n'est pas au bon format.")
except:
sys.stderr.write("La clé publique n'est pas au bon format.\n")
sys.exit(1)
raise
if recipient == self.issuer:
try:
if recipient == self.issuer:
raise ValueError('Le destinataire ne peut pas être vous même.')
except:
sys.stderr.write("Le destinataire ne peut pas être vous même.\n")
sys.exit(1)
raise
# Define Duniter GVA node
transport = AIOHTTPTransport(url=node)
@ -34,7 +43,7 @@ class Transaction:
def genDoc(self):
# Build TX generation document
# print(self.useMempool)
print("useMempool:", str(self.useMempool))
queryBuild = gql(
"""
query ($recipient: String!, $issuer: String!, $amount: Int!, $comment: String!, $useMempool: Boolean!){ genTxs(
@ -50,7 +59,7 @@ class Transaction:
paramsBuild = {
"recipient": self.recipient,
"issuer": self.issuer,
"amount": self.amount,
"amount": int(self.amount),
"comment": self.comment,
"useMempool": self.useMempool
}
@ -62,7 +71,7 @@ class Transaction:
except Exception as e:
message = ast.literal_eval(str(e))["message"]
sys.stderr.write("Echec de la génération du document:\n" + message + "\n")
sys.exit(1)
raise
# Check document
@ -81,15 +90,15 @@ class Transaction:
if re.search("Comment:", line):
commentRaw[i:] = [line.split(': ', 1)[1]]
# Check if is only change transaction
# Check if it's only a change transaction
if all(i == self.issuer for i in outPubkey):
print("Le document contient une transaction de change")
self.isChange = True
# Check validity of the document
elif issuerRaw[0] != self.issuer or outAmount[0] != self.amount or outPubkey[0] != self.recipient or commentRaw[0] != self.comment:
sys.stderr.write(colored("Le document généré est corrompu !\nNe fait plus confiance au noeud " + node + "\n", 'red'))
sys.stderr.write(colored("Le document généré est corrompu !\nLe noeud " + self.node + "a peut être un dysfonctionnement.\n", 'red'))
sys.stderr.write(colored(issuerRaw[0] + " envoi " + str(outAmount[0]) + " vers " + outPubkey[0] + " with comment: " + commentRaw[0] + "\n", "yellow"))
sys.exit(1)
raise ValueError('Le document généré est corrompu !')
else:
print("Le document généré est conforme.")
self.isChange = False
@ -133,7 +142,7 @@ class Transaction:
sys.stderr.write("Echec de la transaction:\n" + message + "\n")
if self.verbose:
sys.stderr.write("Document final:\n" + docs)
sys.exit(1)
raise ValueError(message)
else:
if self.isChange:
self.send()
@ -148,6 +157,7 @@ class Transaction:
def _getIsChange(self):
return self._isChange
def _setIsChange(self, newChange):
print("_setIsChange: ", str(newChange))
self._isChange = newChange
if newChange: self.useMempool == True
isChange = property(_getIsChange, _setIsChange)

76
paiements.py Executable file
View File

@ -0,0 +1,76 @@
#!/usr/bin/env python3
"""
ZetCode Tkinter tutorial
In this example, we use the pack
manager to create a review example.
Author: Jan Bodnar
Website: www.zetcode.com
"""
import PySimpleGUI as sg
from lib.paylib import Transaction
import sys, os, threading
from shutil import copyfile
from os.path import join, dirname
from dotenv import load_dotenv
from lib.natools import get_privkey
class StdoutRedirector(object):
def __init__(self, text_widget):
self.text_widget = text_widget
def write(self, s):
self.text_widget.insert('end', s)
self.text_widget.see('end')
def flush(self):
pass
# Get variables environment
if not os.path.isfile('.env'):
copyfile(".env.template", ".env")
dotenv_path = join(dirname(__file__), '.env')
load_dotenv(dotenv_path)
dunikey = os.getenv('DUNIKEY')
node = os.getenv('NODE')
issuer = get_privkey(dunikey, "pubsec").pubkey
if not dunikey or not node:
sys.stderr.write("Please fill the path of your private key (PubSec), and a Duniter node in .env file\n")
sys.exit(1)
def ProceedPaiement(recipient, amount, comment):
print("Paiement en cours vers", recipient)
trans = Transaction(dunikey, node, recipient, amount, comment)
trans.send()
recipient = amount = comment = None
sg.theme('DarkGrey2')
layout = [ [sg.Text('Noeud utilisé: ' + node)],
[sg.Text('Votre clé publique: ' + issuer)],
[sg.Text('')],
[sg.Text('Destinataire: '), sg.InputText(size=(50, None))],
[sg.Text('Montant: '), sg.InputText(size=(7, None))],
[sg.Text('Commentaire:'), sg.InputText(size=(50, None))],
[sg.Button('Envoyer'), sg.Button('Annuler')] ]
# Create the Window
window = sg.Window('Paiement Ḡ1 - GVA', layout)
while True:
try:
event, values = window.read()
if event == sg.WIN_CLOSED or event == 'Cancel':
break
ProceedPaiement(values[0], values[1], values[2])
except Exception as e:
sg.popup(f'Une erreur est survenu', e, title="Erreur")
else:
sg.popup(f'Transaction effectué avec succès !', title="Envoyé")
window.close()

1
pay.py
View File

@ -50,3 +50,4 @@ result = trans.send()
if args.verbose:
print(str(result))