#!/usr/bin/env python3 import sys import re, time import os.path import json import ast from termcolor import colored from lib.natools import fmt, sign, get_privkey from gql import gql, Client from gql.transport.aiohttp import AIOHTTPTransport PUBKEY_REGEX = "(?![OIl])[1-9A-Za-z]{42,45}" class ListWallets: def __init__(self, node, brut, mbr, nonMbr, larf): self.mbr = mbr self.larf = larf self.nonMbr = nonMbr self.brut = brut # Define Duniter GVA node transport = AIOHTTPTransport(url=node) self.client = Client(transport=transport, fetch_schema_from_transport=True) self.count = 0 def sendDoc(self, jsonBrut=[], cursor=None): # Build wallets generation document queryBuild = gql( """ query ($cursor: String!) { wallets(pagination: { cursor: $cursor, ord: ASC, pageSize: 999 }) { pageInfo { hasNextPage endCursor } edges { node { script balance { amount base } idty { isMember username } } } } } """ ) paramsBuild = { "cursor": cursor, } # Send wallets document try: queryResult = self.client.execute(queryBuild, variable_values=paramsBuild) except Exception as e: sys.stderr.write("Echec de récupération de la liste:\n" + str(e) + "\n") sys.exit(1) # Merge result jsonBrut.extend(queryResult["wallets"]["edges"]) # Check pagination endCursor = queryResult["wallets"]["pageInfo"]["endCursor"] hasNextPage = queryResult["wallets"]["pageInfo"]["hasNextPage"] if hasNextPage: # print(jsonBrut[-1:][0]["node"]["script"]) print(self.count) print(endCursor) print(len(jsonBrut)) # print("---") # if self.count % 3 == 1 and self.count != 0: # time.sleep(3) self.count += 1 self.sendDoc(jsonBrut, endCursor) else: return self.transformData(jsonBrut) def transformData(self, jsonBrut): walletList = [] for i, trans in enumerate(jsonBrut): dataWork = trans["node"] if self.mbr and ( dataWork["idty"] == None or dataWork["idty"]["isMember"] == False ): continue if self.nonMbr and ( dataWork["idty"] == None or dataWork["idty"]["isMember"] == True ): continue if self.larf and (dataWork["idty"] != None): continue walletList.append( { "pubkey": dataWork["script"], "balance": dataWork["balance"]["amount"] / 100, "id": dataWork["idty"], } ) if self.brut: names = [] for dataWork in walletList: if self.mbr or self.nonMbr: names.append(dataWork["pubkey"] + " " + dataWork["id"]["username"]) else: names.append(dataWork["pubkey"]) return "\n".join(names) else: return json.dumps(walletList, indent=2)