diff --git a/gui-tkinter.py b/gui-tkinter.py deleted file mode 100755 index d50f30d..0000000 --- a/gui-tkinter.py +++ /dev/null @@ -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() diff --git a/lib/paylib.py b/lib/paylib.py index 1aba591..38caf93 100644 --- a/lib/paylib.py +++ b/lib/paylib.py @@ -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) diff --git a/paiements.py b/paiements.py new file mode 100755 index 0000000..16802aa --- /dev/null +++ b/paiements.py @@ -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() diff --git a/pay.py b/pay.py index 0e2bf45..4a0323a 100755 --- a/pay.py +++ b/pay.py @@ -50,3 +50,4 @@ result = trans.send() if args.verbose: print(str(result)) +