jaklis/lib/gvaWallets.py

101 lines
3.4 KiB
Python
Raw Permalink Normal View History

2021-08-27 05:02:16 +02:00
#!/usr/bin/env python3
2023-09-10 01:53:38 +02:00
import sys
import json
2021-08-27 05:02:16 +02:00
from gql import gql, Client
from gql.transport.aiohttp import AIOHTTPTransport
2023-09-10 01:53:38 +02:00
from lib.natools import fmt, sign, get_privkey
2021-08-27 05:02:16 +02:00
2023-09-09 09:38:22 +02:00
class ListWallets:
2023-09-10 01:53:38 +02:00
def __init__(
self, node=False, brut=False, mbr=False, nonMbr=False, larf=False, map=False
):
# Initialize the ListWallets class with optional filters
self.mbr = mbr # Filter for members
self.larf = larf # Filter for non-empty identities
self.nonMbr = nonMbr # Filter for non-members
self.brut = brut # Output format flag (brut or JSON)
self.map = map # Output format flag (map or list)
2021-08-27 05:02:16 +02:00
# Define Duniter GVA node
transport = AIOHTTPTransport(url=node)
self.client = Client(transport=transport, fetch_schema_from_transport=True)
2021-08-28 02:47:20 +02:00
def sendDoc(self):
2023-09-10 01:53:38 +02:00
# Define the GraphQL query to retrieve wallet information
2021-08-27 05:02:16 +02:00
queryBuild = gql(
"""
{
2021-08-27 23:08:38 +02:00
wallets(pagination: { cursor: null, ord: ASC, pageSize: 0 }) {
2021-08-27 05:02:16 +02:00
pageInfo {
hasNextPage
endCursor
}
edges {
node {
script
balance {
amount
base
}
idty {
isMember
username
}
}
}
}
}
2023-09-10 01:53:38 +02:00
"""
2023-09-09 09:38:22 +02:00
)
2021-08-27 05:02:16 +02:00
try:
2023-09-10 01:53:38 +02:00
# Execute the GraphQL query
2021-08-27 05:02:16 +02:00
queryResult = self.client.execute(queryBuild)
except Exception as e:
2023-09-10 01:53:38 +02:00
# Handle any exceptions that occur during the query
sys.stderr.write("Failed to retrieve the list:\n" + str(e) + "\n")
2021-08-27 05:02:16 +02:00
sys.exit(1)
2023-09-09 09:38:22 +02:00
jsonBrut = queryResult["wallets"]["edges"]
2023-09-09 10:14:31 +02:00
walletList = []
2023-09-09 09:38:22 +02:00
walletMap = {}
2023-09-10 01:53:38 +02:00
2021-08-28 02:47:20 +02:00
for i, trans in enumerate(jsonBrut):
2023-09-09 09:38:22 +02:00
dataWork = trans["node"]
2023-09-10 01:53:38 +02:00
identity = dataWork["idty"]
is_member = identity and identity["isMember"]
# Apply filters based on member status and larf flag
member_filter = self.mbr and not is_member
non_member_filter = self.nonMbr and is_member
larf_filter = self.larf and identity
if member_filter or non_member_filter or larf_filter:
2023-09-09 09:38:22 +02:00
continue
2023-09-09 10:14:31 +02:00
2023-09-10 01:53:38 +02:00
wallet_data = {
"pubkey": dataWork["script"],
"balance": dataWork["balance"]["amount"] / 100,
"id": identity,
}
2023-09-09 10:14:31 +02:00
if self.map:
2023-09-10 01:53:38 +02:00
walletMap[dataWork["script"]] = wallet_data
2023-09-09 10:14:31 +02:00
else:
2023-09-10 01:53:38 +02:00
walletList.append(wallet_data)
2021-08-28 02:47:20 +02:00
2023-09-09 09:38:22 +02:00
if self.brut:
2023-09-10 01:53:38 +02:00
# Generate a list of formatted wallet names using list comprehension
names = [
wallet["pubkey"]
if not (self.mbr or self.nonMbr) or wallet["id"] is None
else f'{wallet["pubkey"]} {wallet["id"]["username"]}'
for wallet in walletList
]
2021-08-28 02:47:20 +02:00
return "\n".join(names)
2021-08-27 05:02:16 +02:00
else:
2023-09-10 01:53:38 +02:00
# Return JSON data in either map or list format
return json.dumps(walletMap if self.map else walletList, indent=2)