Astroport.ONE/tools/jaklis/MORE.md

16 KiB

Ensemble de scripts Python pour un client CLI (Command Line Interface) appelé "Jaklis" qui interagit avec les services Cesium+ et Ğchange, ainsi qu'avec le réseau Duniter pour la monnaie libre Ğ1. Voici une analyse détaillée de ce code :

Structure Générale

Le code est organisé en plusieurs fichiers Python, chacun ayant une responsabilité spécifique. Voici un aperçu des principaux fichiers et de leurs fonctions :

1. paiements.py

Ce fichier gère les paiements en Ğ1 via une interface graphique utilisant PySimpleGUI. Il permet de saisir les informations de paiement (destinataire, montant, commentaire) et d'envoyer la transaction.

2. gva.py

Ce fichier contient la classe GvaApi qui fournit des méthodes pour interagir avec le nœud GVA (GraphQL API) de Duniter. Les principales méthodes incluent :

  • pay: pour effectuer un paiement.
  • history: pour récupérer l'historique des transactions.
  • balance: pour obtenir le solde d'un compte.
  • id: pour obtenir l'identité d'un utilisateur.
  • currentUd: pour obtenir la valeur actuelle du Dividende Universel (DU).

3. gvaPay.py

Ce fichier définit la classe Transaction qui gère la génération, la vérification, la signature et l'envoi des documents de transaction pour les paiements en Ğ1.

4. gvaHistory.py

Ce fichier contient la classe History qui permet de récupérer et de parser l'historique des transactions d'un compte Ğ1.

5. messaging.py

Ce fichier gère l'envoi et la réception de messages via Cesium+. Il contient des classes pour lire (ReadFromCesium), envoyer (SendToCesium), et supprimer (DeleteFromCesium) des messages.

6. profiles.py

Ce fichier gère les profils utilisateurs sur Cesium+. Il contient des méthodes pour configurer (configDocSet), obtenir (configDocGet), et effacer (configDocErase) des profils.

7. currentUd.py

Ce fichier contient une classe pour récupérer la valeur actuelle du Dividende Universel (DU) via une requête GraphQL.

8. cesiumCommon.py

Ce fichier contient des fonctions et des classes communes utilisées par d'autres modules, notamment pour la gestion des clés publiques et privées, la signature de documents, et l'envoi de requêtes HTTP.

9. natools.py

Ce fichier fournit des outils pour la cryptographie, y compris le chiffrement, le déchiffrement, la signature et la vérification de données.

10. jaklis.py

Ce fichier est le point d'entrée principal du client CLI. Il utilise argparse pour parser les arguments de la ligne de commande et appelle les fonctions appropriées en fonction des commandes fournies par l'utilisateur.

Fonctionnalités Clés

Paiements en Ğ1

Le script paiements.py permet d'effectuer des paiements en Ğ1 via une interface graphique. Il utilise la classe GvaApi pour interagir avec le nœud GVA et envoyer des transactions.

Gestion des Messages

Les scripts dans messaging.py permettent de lire, envoyer et supprimer des messages via Cesium+. Les messages sont chiffrés et déchiffrés en utilisant des clés publiques et privées.

Gestion des Profils

Le script profiles.py permet de configurer, obtenir et effacer des profils utilisateurs sur Cesium+. Les profils peuvent inclure des informations telles que le nom, la description, la ville, l'adresse, et des liens vers des réseaux sociaux.

Historique des Transactions

Le script gvaHistory.py permet de récupérer et de parser l'historique des transactions d'un compte Ğ1. Les transactions sont affichées avec des détails tels que la date, le montant, le destinataire, et les commentaires.

Cryptographie

Le script natools.py fournit des outils pour la cryptographie, y compris le chiffrement et le déchiffrement de données, ainsi que la signature et la vérification de documents.

Conclusion

Le code de Jaklis est un ensemble complet de scripts Python pour interagir avec les services Cesium+ et Ğchange, ainsi qu'avec le réseau Duniter pour la monnaie libre Ğ1. Il offre des fonctionnalités pour les paiements, la gestion des messages et des profils, la récupération de l'historique des transactions, et des outils de cryptographie. Le tout est bien structuré et utilise des bibliothèques telles que PySimpleGUI, requests, json, et gql pour faciliter les interactions avec les API et les interfaces utilisateur.

Citations: [1] https://ppl-ai-file-upload.s3.amazonaws.com/web/direct-files/12445647/f03d4521-c0f7-4af2-a8b2-bf73a9df3280/paste.txt


Pour ajouter la possibilité de recherche historique entre deux dates dans le script gvaHistory.py, vous devez modifier la méthode sendDoc pour accepter des paramètres de date de début et de fin, et ajuster la requête GraphQL en conséquence. Voici les étapes détaillées pour effectuer cette modification :

1. Modifier la méthode sendDoc pour accepter les dates de début et de fin

Ajoutez les paramètres start_date et end_date à la méthode sendDoc de la classe History :

def sendDoc(self, number, start_date=None, end_date=None):
    # Build history generation document
    queryBuild = gql(
        """
        query ($pubkey: PubKeyGva!, $script: PkOrScriptGva!, $number: Int!, $start_date: DateTime, $end_date: DateTime){
            txsHistoryBc(
                script: $script
                pagination: { pageSize: $number, ord: DESC }
                filter: { writtenTime: { gte: $start_date, lte: $end_date } }
            ) {
                both {
                    pageInfo { hasPreviousPage hasNextPage }
                    edges {
                        direction
                        node {
                            currency issuers outputs comment writtenTime
                        }
                    }
                }
            }
            txsHistoryMp(pubkey: $pubkey) {
                receiving { currency issuers comment outputs receivedTime }
                receiving { currency issuers comment outputs receivedTime }
            }
            balance(script: $script) { amount base }
            node { peer { currency } }
            currentUd { amount base }
        }
        """
    )
    paramsBuild = {
        "pubkey": self.pubkey,
        "number": number,
        "script": f"SIG({self.pubkey})",
        "start_date": start_date,
        "end_date": end_date,
    }
    # Send history document
    try:
        self.historyDoc = self.client.execute(queryBuild, variable_values=paramsBuild)
    except Exception as e:
        message = ast.literal_eval(str(e))["message"]
        sys.stderr.write("Echec de récupération de l'historique:\n" + message + "\n")
        sys.exit(1)

2. Adapter l'appel de la méthode sendDoc dans la classe GvaApi

Modifiez la méthode history de la classe GvaApi pour accepter les dates de début et de fin et les passer à la méthode sendDoc :

def history(self, isJSON=False, noColors=False, number=10, start_date=None, end_date=None):
    gva = History(self.dunikey, self.node, self.destPubkey)
    gva.sendDoc(number, start_date, end_date)
    transList = gva.parseHistory()
    if isJSON:
        transJson = gva.jsonHistory(transList)
        print(transJson)
    else:
        gva.printHistory(transList, noColors)

3. Modifier le script principal jaklis.py pour accepter les dates de début et de fin en tant qu'arguments

Ajoutez les arguments --start-date et --end-date à la commande history dans le script principal jaklis.py :

history_cmd.add_argument('-p', '--pubkey', help="Clé publique du compte visé")
history_cmd.add_argument('-n', '--number', type=int, default=10, help="Affiche les NUMBER dernières transactions")
history_cmd.add_argument('-j', '--json', action='store_true', help="Affiche le résultat en format JSON")
history_cmd.add_argument('--nocolors', action='store_true', help="Affiche le résultat en noir et blanc")
history_cmd.add_argument('--start-date', help="Date de début pour la recherche historique (format ISO 8601)")
history_cmd.add_argument('--end-date', help="Date de fin pour la recherche historique (format ISO 8601)")

4. Passer les dates de début et de fin aux méthodes appropriées

Modifiez l'appel de la méthode history dans le script principal pour inclure les dates de début et de fin :

elif cmd == "history":
    gva.history(args.json, args.nocolors, args.number, args.start_date, args.end_date)

Exemple Complet

Voici un exemple complet de la méthode sendDoc modifiée dans gvaHistory.py :

def sendDoc(self, number, start_date=None, end_date=None):
    queryBuild = gql(
        """
        query ($pubkey: PubKeyGva!, $script: PkOrScriptGva!, $number: Int!, $start_date: DateTime, $end_date: DateTime){
            txsHistoryBc(
                script: $script
                pagination: { pageSize: $number, ord: DESC }
                filter: { writtenTime: { gte: $start_date, lte: $end_date } }
            ) {
                both {
                    pageInfo { hasPreviousPage hasNextPage }
                    edges {
                        direction
                        node {
                            currency issuers outputs comment writtenTime
                        }
                    }
                }
            }
            txsHistoryMp(pubkey: $pubkey) {
                receiving { currency issuers comment outputs receivedTime }
                receiving { currency issuers comment outputs receivedTime }
            }
            balance(script: $script) { amount base }
            node { peer { currency } }
            currentUd { amount base }
        }
        """
    )
    paramsBuild = {
        "pubkey": self.pubkey,
        "number": number,
        "script": f"SIG({self.pubkey})",
        "start_date": start_date,
        "end_date": end_date,
    }
    try:
        self.historyDoc = self.client.execute(queryBuild, variable_values=paramsBuild)
    except Exception as e:
        message = ast.literal_eval(str(e))["message"]
        sys.stderr.write("Echec de récupération de l'historique:\n" + message + "\n")
        sys.exit(1)

En suivant ces étapes, vous pouvez ajouter la fonctionnalité de recherche historique entre deux dates dans votre script gvaHistory.py.

Citations: [1] https://ppl-ai-file-upload.s3.amazonaws.com/web/direct-files/12445647/f03d4521-c0f7-4af2-a8b2-bf73a9df3280/paste.txt


Pour ajouter la possibilité de recherche historique entre deux dates dans le script gvaHistory.py, vous devez modifier la méthode sendDoc pour accepter des paramètres de date de début et de fin, et ajuster la requête GraphQL en conséquence. Voici les étapes détaillées pour effectuer cette modification :

1. Modifier la méthode sendDoc pour accepter les dates de début et de fin

Ajoutez les paramètres start_date et end_date à la méthode sendDoc de la classe History :

def sendDoc(self, number, start_date=None, end_date=None):
    # Build history generation document
    queryBuild = gql(
        """
        query ($pubkey: PubKeyGva!, $script: PkOrScriptGva!, $number: Int!, $start_date: DateTime, $end_date: DateTime){
            txsHistoryBc(
                script: $script
                pagination: { pageSize: $number, ord: DESC }
                filter: { writtenTime: { gte: $start_date, lte: $end_date } }
            ) {
                both {
                    pageInfo { hasPreviousPage hasNextPage }
                    edges {
                        direction
                        node {
                            currency issuers outputs comment writtenTime
                        }
                    }
                }
            }
            txsHistoryMp(pubkey: $pubkey) {
                receiving { currency issuers comment outputs receivedTime }
                receiving { currency issuers comment outputs receivedTime }
            }
            balance(script: $script) { amount base }
            node { peer { currency } }
            currentUd { amount base }
        }
        """
    )
    paramsBuild = {
        "pubkey": self.pubkey,
        "number": number,
        "script": f"SIG({self.pubkey})",
        "start_date": start_date,
        "end_date": end_date,
    }
    # Send history document
    try:
        self.historyDoc = self.client.execute(queryBuild, variable_values=paramsBuild)
    except Exception as e:
        message = ast.literal_eval(str(e))["message"]
        sys.stderr.write("Echec de récupération de l'historique:\n" + message + "\n")
        sys.exit(1)

2. Adapter l'appel de la méthode sendDoc dans la classe GvaApi

Modifiez la méthode history de la classe GvaApi pour accepter les dates de début et de fin et les passer à la méthode sendDoc :

def history(self, isJSON=False, noColors=False, number=10, start_date=None, end_date=None):
    gva = History(self.dunikey, self.node, self.destPubkey)
    gva.sendDoc(number, start_date, end_date)
    transList = gva.parseHistory()
    if isJSON:
        transJson = gva.jsonHistory(transList)
        print(transJson)
    else:
        gva.printHistory(transList, noColors)

3. Modifier le script principal jaklis.py pour accepter les dates de début et de fin en tant qu'arguments

Ajoutez les arguments --start-date et --end-date à la commande history dans le script principal jaklis.py :

history_cmd.add_argument('-p', '--pubkey', help="Clé publique du compte visé")
history_cmd.add_argument('-n', '--number', type=int, default=10, help="Affiche les NUMBER dernières transactions")
history_cmd.add_argument('-j', '--json', action='store_true', help="Affiche le résultat en format JSON")
history_cmd.add_argument('--nocolors', action='store_true', help="Affiche le résultat en noir et blanc")
history_cmd.add_argument('--start-date', help="Date de début pour la recherche historique (format ISO 8601)")
history_cmd.add_argument('--end-date', help="Date de fin pour la recherche historique (format ISO 8601)")

4. Passer les dates de début et de fin aux méthodes appropriées

Modifiez l'appel de la méthode history dans le script principal pour inclure les dates de début et de fin :

elif cmd == "history":
    gva.history(args.json, args.nocolors, args.number, args.start_date, args.end_date)

Exemple Complet

Voici un exemple complet de la méthode sendDoc modifiée dans gvaHistory.py :

def sendDoc(self, number, start_date=None, end_date=None):
    queryBuild = gql(
        """
        query ($pubkey: PubKeyGva!, $script: PkOrScriptGva!, $number: Int!, $start_date: DateTime, $end_date: DateTime){
            txsHistoryBc(
                script: $script
                pagination: { pageSize: $number, ord: DESC }
                filter: { writtenTime: { gte: $start_date, lte: $end_date } }
            ) {
                both {
                    pageInfo { hasPreviousPage hasNextPage }
                    edges {
                        direction
                        node {
                            currency issuers outputs comment writtenTime
                        }
                    }
                }
            }
            txsHistoryMp(pubkey: $pubkey) {
                receiving { currency issuers comment outputs receivedTime }
                receiving { currency issuers comment outputs receivedTime }
            }
            balance(script: $script) { amount base }
            node { peer { currency } }
            currentUd { amount base }
        }
        """
    )
    paramsBuild = {
        "pubkey": self.pubkey,
        "number": number,
        "script": f"SIG({self.pubkey})",
        "start_date": start_date,
        "end_date": end_date,
    }
    try:
        self.historyDoc = self.client.execute(queryBuild, variable_values=paramsBuild)
    except Exception as e:
        message = ast.literal_eval(str(e))["message"]
        sys.stderr.write("Echec de récupération de l'historique:\n" + message + "\n")
        sys.exit(1)

En suivant ces étapes, vous pouvez ajouter la fonctionnalité de recherche historique entre deux dates dans votre script gvaHistory.py.

Citations: [1] https://ppl-ai-file-upload.s3.amazonaws.com/web/direct-files/12445647/f03d4521-c0f7-4af2-a8b2-bf73a9df3280/paste.txt