From 623310dd54544e1029cf87740187c4bbe390e4f8 Mon Sep 17 00:00:00 2001 From: qo-op Date: Thu, 1 Jul 2021 00:47:13 +0200 Subject: [PATCH] new jaklis release, payment activation --- zen/ipns_TAG_refresh.sh | 3 +- zen/jaklis/.env | 15 ++-- zen/jaklis/.env.template | 14 ++-- zen/jaklis/README.md | 14 ++-- zen/jaklis/jaklis.py | 23 ++++-- zen/jaklis/lib/__pycache__/cesium.cpython-36.pyc | Bin 4118 -> 0 bytes .../lib/__pycache__/cesiumCommon.cpython-36.pyc | Bin 1725 -> 0 bytes zen/jaklis/lib/__pycache__/likes.cpython-36.pyc | Bin 5953 -> 0 bytes .../lib/__pycache__/messaging.cpython-36.pyc | Bin 6602 -> 0 bytes zen/jaklis/lib/__pycache__/natools.cpython-36.pyc | Bin 9296 -> 0 bytes zen/jaklis/lib/__pycache__/offers.cpython-36.pyc | Bin 3538 -> 0 bytes zen/jaklis/lib/__pycache__/profiles.cpython-36.pyc | Bin 3044 -> 0 bytes zen/jaklis/lib/cesium.py | 7 +- zen/jaklis/lib/currentUd.py | 40 ++++++++++ zen/jaklis/lib/gva.py | 17 ++++ zen/jaklis/lib/gvaBalance.py | 7 +- zen/jaklis/lib/gvaHistory.py | 40 +++++++--- zen/jaklis/lib/gvaID.py | 81 +++++++++++++++++++ zen/jaklis/lib/gvaPay.py | 4 +- zen/jaklis/lib/messaging.py | 19 ++--- zen/jaklis/lib/offers.py | 9 ++- zen/jaklis/lib/profiles.py | 2 +- zen/jaklis/lib/qrcode-reader.py | 86 +++++++++++++++++++++ zen/jaklis/lib/{likes.py => stars.py} | 7 +- zen/jaklis/requirements.txt | 4 +- 25 files changed, 334 insertions(+), 58 deletions(-) delete mode 100644 zen/jaklis/lib/__pycache__/cesium.cpython-36.pyc delete mode 100644 zen/jaklis/lib/__pycache__/cesiumCommon.cpython-36.pyc delete mode 100644 zen/jaklis/lib/__pycache__/likes.cpython-36.pyc delete mode 100644 zen/jaklis/lib/__pycache__/messaging.cpython-36.pyc delete mode 100644 zen/jaklis/lib/__pycache__/natools.cpython-36.pyc delete mode 100644 zen/jaklis/lib/__pycache__/offers.cpython-36.pyc delete mode 100644 zen/jaklis/lib/__pycache__/profiles.cpython-36.pyc create mode 100644 zen/jaklis/lib/currentUd.py create mode 100644 zen/jaklis/lib/gvaID.py create mode 100755 zen/jaklis/lib/qrcode-reader.py rename zen/jaklis/lib/{likes.py => stars.py} (96%) diff --git a/zen/ipns_TAG_refresh.sh b/zen/ipns_TAG_refresh.sh index 490a576..5486095 100755 --- a/zen/ipns_TAG_refresh.sh +++ b/zen/ipns_TAG_refresh.sh @@ -131,9 +131,10 @@ do echo "$PubFromDunikey" > $HOME/.zen/ipfs/.${IPFSNODEID}/KEY/${MEDIAKEY}/MEDIAPUBKEY fi MEDIAPUBKEY=$(cat $HOME/.zen/ipfs/.${IPFSNODEID}/KEY/${MEDIAKEY}/MEDIAPUBKEY) + BALANCE=$(~/.zen/astrXbian/zen/jaklis/jaklis.py balance ${MEDIAPUBKEY}) ## DEMO PERIOD -## NICE FINAL STREAMING PAGE +## NICE FINAL STREAMING PAGE # TODO ACTIVATE DOWNLOAD FOR AVI or MKV FILETYPE="${LOCALTUBELINK##*.}" MIMETYPE="video/$FILETYPE" && HTMLTAG="video" [[ "$FILETYPE" == "avi" ]] && MIMETYPE="video/x-msvideo" diff --git a/zen/jaklis/.env b/zen/jaklis/.env index ea6bd51..22d31e4 100644 --- a/zen/jaklis/.env +++ b/zen/jaklis/.env @@ -1,5 +1,10 @@ -DUNIKEY="/.zen/secret.dunikey" # Chemin du fichier de trousseau Ḡ1 de l'émetteur, au format PubSec -POD="https://data.gchange.fr" # Noeud Gchange utilisé pour l'envoi du message -#POD="https://g1.data.duniter.fr" # Noeud Cecium+ utilisé pour l'envoi du message -#POD="https://g1.data.le-sou.org" # Adresse du pod Cesium de secours -#POD="https://g1.data.e-is.pro" +# Chemin de la clé privé Ḡ1 de l'émetteur, au format PubSec +DUNIKEY=/.zen/secret.dunikey + +# Noeud Duniter +NODE=https://g1.librelois.fr/gva + +# Adresse du pod Cesium ou Gchange à utiliser +POD=https://g1.data.le-sou.org +#POD=https://g1.data.duniter.fr +#POD=https://data.gchange.fr diff --git a/zen/jaklis/.env.template b/zen/jaklis/.env.template index dd81446..462b319 100755 --- a/zen/jaklis/.env.template +++ b/zen/jaklis/.env.template @@ -1,6 +1,10 @@ -DUNIKEY="" # Chemin de la clé privé Ḡ1 de l'émetteur, au format PubSec -#POD="https://g1.data.duniter.fr" # Adresse du pod Cesium ou Gchange à utiliser -POD="https://g1.data.le-sou.org" # Adresse du pod Cesium de secours -#POD="https://data.gchange.fr" # Adresse du pod ḠChange à utiliser +# Chemin de la clé privé Ḡ1 de l'émetteur, au format PubSec +DUNIKEY= -NODE="https://g1.librelois.fr/gva" +# Noeud Duniter +NODE=https://g1.librelois.fr/gva + +# Adresse du pod Cesium ou Gchange à utiliser +POD=https://g1.data.le-sou.org +#POD=https://g1.data.duniter.fr +#POD=https://data.gchange.fr diff --git a/zen/jaklis/README.md b/zen/jaklis/README.md index e0ff54d..9d7e950 100755 --- a/zen/jaklis/README.md +++ b/zen/jaklis/README.md @@ -22,7 +22,7 @@ Renseignez optionnellement le fichier **.env** (Généré lors de la première t ``` ``` -usage: jaklis.py [-h] [-v] [-k KEY] [-n NODE] {read,send,delete,get,set,erase,like,unlike,pay,history,balance} ... +usage: jaklis.py [-h] [-v] [-k KEY] [-n NODE] {read,send,delete,get,set,erase,stars,unstars,getoffer,setoffer,deleteoffer,pay,history,balance,id,idBalance} ... Client CLI pour Cesium+ et Ḡchange @@ -33,19 +33,23 @@ optional arguments: -n NODE, --node NODE Adresse du noeud Cesium+, Gchange ou Duniter à utiliser Commandes de jaklis: - {read,send,delete,get,set,erase,like,unlike,pay,history,balance} + {read,send,delete,get,set,erase,stars,unstars,getoffer,setoffer,deleteoffer,pay,history,balance,id,idBalance} read Lecture des messages send Envoi d'un message delete Supression d'un message get Voir un profile Cesium+ set Configurer son profile Cesium+ erase Effacer son profile Cesium+ - like Voir les likes d'un profile / Liker un profile (option -s NOTE) - unlike Supprimer un like + stars Voir les étoiles d'un profile / Noter un profile (option -s NOTE) + unstars Supprimer un star + getoffer Obtenir les informations d'une annonce gchange + setoffer Créer une annonce gchange + deleteoffer Supprimer une annonce gchange pay Payer en Ḡ1 history Voir l'historique des transactions d'un compte Ḡ1 balance Voir le solde d'un compte Ḡ1 - + id Voir l'identité d'une clé publique/username + idBalance Voir l'identité d'une clé publique/username et son solde ``` Utilisez `./jaklis CMD -h` où `CMD` est la commande souhaité pour obtenir l'aide détaillé de cette commande. diff --git a/zen/jaklis/jaklis.py b/zen/jaklis/jaklis.py index 24ffc17..0a13eb2 100755 --- a/zen/jaklis/jaklis.py +++ b/zen/jaklis/jaklis.py @@ -6,7 +6,7 @@ from shutil import copyfile from dotenv import load_dotenv from duniterpy.key import SigningKey -__version__ = "0.0.2" +__version__ = "0.0.4" MY_PATH = os.path.realpath(os.path.dirname(sys.argv[0])) + '/' @@ -37,6 +37,9 @@ deleteoffer_cmd = subparsers.add_parser('deleteoffer', help="Supprimer une annon pay_cmd = subparsers.add_parser('pay', help="Payer en Ḡ1") history_cmd = subparsers.add_parser('history', help="Voir l'historique des transactions d'un compte Ḡ1") balance_cmd = subparsers.add_parser('balance', help="Voir le solde d'un compte Ḡ1") +id_cmd = subparsers.add_parser('id', help="Voir l'identité d'une clé publique/username") +id_balance_cmd = subparsers.add_parser('idBalance', help="Voir l'identité d'une clé publique/username et son solde") +currentUd = subparsers.add_parser('currentUd', help="Affiche la montant actuel du dividende Universel") # Messages management read_cmd.add_argument('-n', '--number',type=int, default=3, help="Affiche les NUMBER derniers messages") @@ -94,6 +97,10 @@ history_cmd.add_argument('--nocolors', action='store_true', help="Affiche le r balance_cmd.add_argument('-p', '--pubkey', help="Clé publique du compte visé") balance_cmd.add_argument('-m', '--mempool', action='store_true', help="Utilise les sources en Mempool") +id_cmd.add_argument('-p', '--pubkey', help="Clé publique du compte visé") +id_cmd.add_argument('-u', '--username', help="Username du compte visé") +id_balance_cmd.add_argument('-p', '--pubkey', help="Pubkey du compte visé") +currentUd.add_argument('-p', '--pubkey', help="Pubkey du compte visé") args = parser.parse_args() @@ -130,7 +137,7 @@ try: except: profile = False -if cmd in ('history','balance','get') and (pubkey or profile): +if cmd in ('history','balance','get','id','idBalance') and (pubkey or profile): noNeedDunikey = True keyPath = False try: @@ -220,7 +227,7 @@ if cmd in ("read","send","delete","set","get","erase","stars","unstars","getoffe cesium.deleteOffer(args.id) # Construct GVA object -elif cmd in ("pay","history","balance"): +elif cmd in ("pay","history","balance","id","idBalance","currentUd"): from lib.gva import GvaApi if args.node: @@ -239,10 +246,16 @@ elif cmd in ("pay","history","balance"): if cmd == "pay": gva.pay(args.amount, args.comment, args.mempool, args.verbose) - if cmd == "history": + elif cmd == "history": gva.history(args.json, args.nocolors, args.number) - if cmd == "balance": + elif cmd == "balance": gva.balance(args.mempool) + elif cmd == "id": + gva.id(args.pubkey, args.username) + elif cmd == "idBalance": + gva.idBalance(args.pubkey) + elif cmd == "currentUd": + gva.currentUd() if keyPath: diff --git a/zen/jaklis/lib/__pycache__/cesium.cpython-36.pyc b/zen/jaklis/lib/__pycache__/cesium.cpython-36.pyc deleted file mode 100644 index b28451597ef7d40b68f322717c51cce12d6bf753..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4118 zcmcIn+j88-5ykyR>@G>svSQ1LtT@?BRh8@M<+cqb8|29azFC(APUr+ zm2Ko<6e`)yI(awh=DnzwZ$_JH&dIj&?Py!q9&5~H-fN9{+&(v>YfL}X`u-d2L>u%C z89wAyI?W%Jd0rMWeD?JhU+#Z5e7^s9|J%MPyU%&d4n&!^S~5K31^a6`A8kJ38L#>B zd0&^_Gf^I=8LzO~r`2DjC%lqAEo?>i>p}@ocAg#|b5SLd)wEtTLb*lKJwW6qq~Zk%&n*NQIYor`%27k*D4^j$%(mM)tXaN4Of zCnb|%1Vr6!7!KWZ#um#k1qcDUQUGY9yUa`ClMjI-X-rFTdxu}K4$ zk4CccYXf1;ukdAK56zJ_b6$O1TTDOKA8CKPIddClY}d}%t-Z027QCySa~x-L!m zf+y)DMJ%K(;$p<56Hg`xk#sO*WiFlMMVTg;ho{nFBs+1Hr0EcuQUmMKVd*HXaX*SH zzIRvpM|*b}PfEt6H7?Ua+C^Dlxu2B9aXLceqktEQIGxmprs!c4eP4iLG-=mqopEXA zn7=_g+(s7#1en&(;^(BM52bgU7IB7msnE9F4m|@@3ib}9Y7-sB$}uTcH}!4fhQ1ar z(o9U!!sVbX^5C}^ti{WG^-Y2mXP8s>;V_HVoT`|yU6>np<^3cIVBLE=JwpO6n>I@R40G$mq zk`)^7Ls+xUYrHngflA75r*Y5SnU7hk@qtZa79i6D!eJ92vyFi?D_-{V(;u_wn{>MO@^2+P6aI9SBSR!)JP>c zz#Se{cr<}WbKyPU(dGi|^Fu^-7l_;^g%wO%Z6bzh;oM$jsJP0w2iVmYXcsA`dw|s0 z<_e(Hdkzu((1LvrPISUxWeR-C8f?&E#HbEq{ zB$jAH#rAod5Gw0zWuf>SdeY9QYI&=DbPCKXn=he0Pn>N%pg-emXT{Ei;v#*>)VGJv zRD_A(A(SX5#3vZzP6WC%&K7iDt{Ar@%+?BNSD=AP86zkVttpqd(IP7k$pA%s$b34e z*GQi<7CR@FUhI4igEio_JEs8AzCUgEjS(fZ4VqlDz!5|?OA8`DdBKwtDh!uF0zT=S z6Td?jITfnPqE^mkV6j`yNc`u1;J}Skjs{K$VxRW%gryw*B6s^kXx1v@& z!CQ~e7H*jn{k0XmUc6;3=!?uGW?Ke*!S)1Eu)2aQ1)DMwby;ICGSV0bB0QA1mmETA z8Lc^l==TqpZN1V$KpH7ibSphDVQc0eN#`o^d5Q;Pv^lD`4aKIbMqa$*YWn#UYnMjC zD54%5X)ubY2gely$>ON8K&wmAfr+1B2C(Me+)UEQ&028R}h-UwP*r)=a&#YDp zs}|WBpq4qiz7o6@#lAaeFO(mHzJ4(OU(DijqbI%LkZO$KPzJ+cUb1OMayT5moW@!E zL{M=k`qYti3f3x=;sFim3=;d)9Z*LI6XbvKjJhS?D2YxwLEi*KHx*T^p5^&o$MXX( z=&9ZbNcNOge@FbDR(wF+`_$b+7j5Ee<4&^j)hg%^Q73uSp=Y`JJVNQMKBw9Oo~SDd z>FNCNu2iiM`83s%y*e)xuM#yy0X-?z_i2k++W1u#N$-B^y3gr=R^L3g^i6#SWQu0| E566$5D*ylh diff --git a/zen/jaklis/lib/__pycache__/cesiumCommon.cpython-36.pyc b/zen/jaklis/lib/__pycache__/cesiumCommon.cpython-36.pyc deleted file mode 100644 index 3d7cd6b97d7b52e8239ff527d87ded539d50c8eb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1725 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 diff --git a/zen/jaklis/lib/__pycache__/messaging.cpython-36.pyc b/zen/jaklis/lib/__pycache__/messaging.cpython-36.pyc deleted file mode 100644 index c7bb05560fd929ab7569ab0986632902e068a737..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6602 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 diff --git a/zen/jaklis/lib/__pycache__/natools.cpython-36.pyc b/zen/jaklis/lib/__pycache__/natools.cpython-36.pyc deleted file mode 100644 index dca2c57c994ba8907706bf48f3363e7bee15d085..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9296 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 QW#6Z;8=Cq({CX$&A9YvmbN~PV diff --git a/zen/jaklis/lib/cesium.py b/zen/jaklis/lib/cesium.py index e755519..e822529 100755 --- a/zen/jaklis/lib/cesium.py +++ b/zen/jaklis/lib/cesium.py @@ -2,7 +2,7 @@ import re, string, random, base64 from lib.cesiumCommon import CesiumCommon, PUBKEY_REGEX from lib.messaging import ReadFromCesium, SendToCesium, DeleteFromCesium from lib.profiles import Profiles -from lib.likes import ReadLikes, SendLikes, UnLikes +from lib.stars import ReadLikes, SendLikes, UnLikes from lib.offers import Offers class CesiumPlus(CesiumCommon): @@ -100,13 +100,14 @@ class CesiumPlus(CesiumCommon): document = setOffer.configDocSet(title, description, city, localisation, category, price, picture) result = setOffer.sendDocumentSet(document,'set') - print(result) + # print(result) return result def getOffer(self, id, avatar=None): getOffer = Offers(self.dunikey, self.pod, self.noNeedDunikey) - + resultJSON = getOffer.sendDocumentGet(id, 'get') + # print(resultJSON) result = getOffer.parseJSON(resultJSON) print(result) diff --git a/zen/jaklis/lib/currentUd.py b/zen/jaklis/lib/currentUd.py new file mode 100644 index 0000000..f038ac5 --- /dev/null +++ b/zen/jaklis/lib/currentUd.py @@ -0,0 +1,40 @@ +#!/usr/bin/env python3 + +import sys, re, os.path, json, ast +from termcolor import colored +from lib.natools import fmt, sign, get_privkey +from gql import gql, Client +from gql.transport.aiohttp import AIOHTTPTransport + +class currentUd: + + def __init__(self, node): + # Define Duniter GVA node + transport = AIOHTTPTransport(url=node) + self.client = Client(transport=transport, fetch_schema_from_transport=True) + + def sendDoc(self): + # Build UD generation document + queryBuild = gql( + """ + query { + currentUd { + amount + } + } + """ + ) + paramsBuild = { + } + + # Send UD document + try: + udValue = 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 du DU:\n" + message + "\n") + sys.exit(1) + + udValueFinal = udValue['currentUd']['amount'] + + return udValueFinal diff --git a/zen/jaklis/lib/gva.py b/zen/jaklis/lib/gva.py index 0ec1ad6..c4173c9 100755 --- a/zen/jaklis/lib/gva.py +++ b/zen/jaklis/lib/gva.py @@ -1,8 +1,10 @@ +from lib.currentUd import currentUd import sys, re from lib.natools import get_privkey from lib.gvaPay import Transaction, PUBKEY_REGEX from lib.gvaHistory import History from lib.gvaBalance import Balance +from lib.gvaID import Id class GvaApi(): def __init__(self, dunikey, node, pubkey, noNeedDunikey=False): @@ -57,3 +59,18 @@ class GvaApi(): gva = Balance(self.dunikey, self.node, self.destPubkey, useMempool) balanceValue = gva.sendDoc() print(balanceValue) + + def id(self, pubkey, username): + gva = Id(self.dunikey, self.node, pubkey, username) + result = gva.sendDoc() + print(result) + + def idBalance(self, pubkey): + gva = Id(self.dunikey, self.node, pubkey) + result = gva.sendDoc(True) + print(result) + + def currentUd(self): + gva = currentUd(self.node) + result = gva.sendDoc() + print(result) \ No newline at end of file diff --git a/zen/jaklis/lib/gvaBalance.py b/zen/jaklis/lib/gvaBalance.py index b148e7e..1a20ea2 100755 --- a/zen/jaklis/lib/gvaBalance.py +++ b/zen/jaklis/lib/gvaBalance.py @@ -26,7 +26,7 @@ class Balance: # Build balance generation document queryBuild = gql( """ - query ($pubkey: String!){ + query ($pubkey: PkOrScriptGva!){ balance(script: $pubkey) { amount } @@ -44,7 +44,10 @@ class Balance: message = ast.literal_eval(str(e))["message"] sys.stderr.write("Echec de récupération du solde:\n" + message + "\n") sys.exit(1) + + if (balanceResult['balance'] == None): balanceValue = 'null' + else: + balanceValue = balanceResult['balance']['amount']/100 - balanceValue = balanceResult['balance']['amount']/100 # print(balanceValue) return balanceValue diff --git a/zen/jaklis/lib/gvaHistory.py b/zen/jaklis/lib/gvaHistory.py index cfcad0f..39563a7 100755 --- a/zen/jaklis/lib/gvaHistory.py +++ b/zen/jaklis/lib/gvaHistory.py @@ -1,7 +1,8 @@ #!/usr/bin/env python3 -import sys, re, os.path, json, ast, time +import sys, re, os.path, json, ast, time, hashlib from datetime import datetime +from duniterpy.key import base58 from termcolor import colored from lib.natools import fmt, sign, get_privkey from gql import gql, Client @@ -27,9 +28,9 @@ class History: # Build history generation document queryBuild = gql( """ - query ($pubkey: String!, $number: Int!){ + query ($pubkey: PubKeyGva!, $script: PkOrScriptGva!, $number: Int!){ txsHistoryBc( - pubkeyOrScript: $pubkey + script: $script pagination: { pageSize: $number, ord: DESC } ) { both { @@ -55,17 +56,17 @@ class History: issuers comment outputs - writtenTime + receivedTime } receiving { currency issuers comment outputs - writtenTime + receivedTime } } - balance(script: $pubkey) { + balance(script: $script) { amount base } @@ -83,7 +84,8 @@ class History: ) paramsBuild = { "pubkey": self.pubkey, - "number": number + "number": number, + "script": f"SIG({self.pubkey})", } # Send history document @@ -176,8 +178,12 @@ class History: def printHistory(self, trans, noColors): # Get balance - balance = self.historyDoc['balance']['amount']/100 - balanceUD = round(balance/self.UD, 2) + if (self.historyDoc['balance'] == None): + balance = balanceUD = 'null' + else: + + balance = self.historyDoc['balance']['amount']/100 + balanceUD = round(balance/self.UD, 2) # Get currency currency = self.historyDoc['node']['peer']['currency'] @@ -220,11 +226,12 @@ class History: print('|', end='') print('-'.center(rows-1, '-')) print('|', end='') - printKey = t[2][0:8] + '\u2026' + t[2][-3:] + checksum = self.gen_checksum(t[2]) + shortPubkey = t[2][0:4] + '\u2026' + t[2][-4:] + ':' + checksum if noColors: - print(" {: <18} | {: <12} | {: <7} | {: <7} | {: <30}".format(date, printKey, t[3], t[4], comment)) + print(" {: <18} | {: <12} | {: <7} | {: <7} | {: <30}".format(date, shortPubkey, t[3], t[4], comment)) else: - print(colored(" {: <18} | {: <12} | {: <7} | {: <7} | {: <30}".format(date, printKey, t[3], t[4], comment), color)) + print(colored(" {: <18} | {: <12} | {: <7} | {: <7} | {: <30}".format(date, shortPubkey, t[3], t[4], comment), color)) print('|', end='') print('-'.center(rows-1, '-')) print('|', end='') @@ -235,6 +242,15 @@ class History: print(colored('Reçus', 'green'), '-', colored('En cours de réception', 'yellow'), '-', colored('Envoyé', 'blue'), '-', colored("En cours d'envoi", 'red')) return trans + + def gen_checksum(self, pubkey): + """ + Returns the checksum of the input pubkey (encoded in b58) + thx Matograine + """ + pubkey_byte = base58.Base58Encoder.decode(str.encode(pubkey)) + hash = hashlib.sha256(hashlib.sha256(pubkey_byte).digest()).digest() + return base58.Base58Encoder.encode(hash)[:3] def jsonHistory(self, transList): dailyJSON = [] diff --git a/zen/jaklis/lib/gvaID.py b/zen/jaklis/lib/gvaID.py new file mode 100644 index 0000000..023a144 --- /dev/null +++ b/zen/jaklis/lib/gvaID.py @@ -0,0 +1,81 @@ +#!/usr/bin/env python3 + +import sys, re, os.path, json, 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 Id: + + def __init__(self, dunikey, node, pubkey='', username=''): + + self.dunikey = dunikey + self.pubkey = pubkey if pubkey else get_privkey(dunikey, "pubsec").pubkey + self.username = username + # if not re.match(PUBKEY_REGEX, self.pubkey) or len(self.pubkey) > 45: + # sys.stderr.write("La clé publique n'est pas au bon format.\n") + # sys.exit(1) + + # Define Duniter GVA node + transport = AIOHTTPTransport(url=node) + self.client = Client(transport=transport, fetch_schema_from_transport=True) + + def sendDoc(self, getBalance=False): + # Build balance generation document + if (getBalance): + queryBuild = gql( + """ + query ($pubkey: PubKeyGva!, $script: PkOrScriptGva!){ + idty (pubkey: $pubkey) { + isMember + username + } + balance(script: $script) { + amount + } + } + """ + ) + else: + queryBuild = gql( + """ + query ($pubkey: PubKeyGva!){ + idty (pubkey: $pubkey) { + isMember + username + } + } + """ + ) + + paramsBuild = { + "pubkey": self.pubkey, + "script": f"SIG({self.pubkey})" + } + + # Send balance document + try: + queryResult = self.client.execute(queryBuild, variable_values=paramsBuild) + except Exception as e: + sys.stderr.write("Echec de récupération du solde:\n" + str(e) + "\n") + sys.exit(1) + + jsonBrut = queryResult + + if (getBalance): + if (queryResult['balance'] == None): + jsonBrut['balance'] = {"amount": 0.0} + else: + jsonBrut['balance'] = queryResult['balance']['amount']/100 + + if (queryResult['idty'] == None): + username = 'Matiou' + isMember = False + else: + username = queryResult['idty']['username'] + isMember = queryResult['idty']['isMember'] + + return json.dumps(jsonBrut, indent=2) diff --git a/zen/jaklis/lib/gvaPay.py b/zen/jaklis/lib/gvaPay.py index e017c88..caa084f 100755 --- a/zen/jaklis/lib/gvaPay.py +++ b/zen/jaklis/lib/gvaPay.py @@ -6,7 +6,7 @@ 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}" +PUBKEY_REGEX = "(?![OIl])[0-9A-Za-z]{42,45}" class Transaction: @@ -46,7 +46,7 @@ class Transaction: if self.verbose: print("useMempool:", str(self.useMempool)) queryBuild = gql( """ - query ($recipient: String!, $issuer: String!, $amount: Int!, $comment: String!, $useMempool: Boolean!){ genTx( + query ($recipient: PkOrScriptGva!, $issuer: PubKeyGva!, $amount: Int!, $comment: String!, $useMempool: Boolean!){ genTx( amount: $amount comment: $comment issuer: $issuer diff --git a/zen/jaklis/lib/messaging.py b/zen/jaklis/lib/messaging.py index 93541a6..2165182 100755 --- a/zen/jaklis/lib/messaging.py +++ b/zen/jaklis/lib/messaging.py @@ -1,6 +1,7 @@ import os, sys, ast, requests, json, base58, base64 from time import time from datetime import datetime +from termcolor import colored from lib.natools import fmt, get_privkey, box_decrypt, box_encrypt from lib.cesiumCommon import CesiumCommon, pp_json, PUBKEY_REGEX @@ -56,11 +57,11 @@ class ReadFromCesium(CesiumCommon): nbrMsg = totalMsg if totalMsg == 0: - print("Aucun message à afficher.") + print(colored("Aucun message à afficher.", 'yellow')) return True else: infoTotal = " Nombre de messages: " + str(nbrMsg) + "/" + str(totalMsg) + " " - print(infoTotal.center(rows, '#')) + print(colored(infoTotal.center(rows, '#'), "yellow")) for hits in msgJSON["hits"]: self.idMsg = hits["_id"] msgSrc = hits["_source"] @@ -76,19 +77,19 @@ class ReadFromCesium(CesiumCommon): headerMsg = startHeader + date + "(ID: {})".format(self.idMsg) + " " print('-'.center(rows, '-')) - print(headerMsg.center(rows+9, '-')) + print(colored(headerMsg, "blue").center(rows+9, '-')) print('-'.center(rows, '-')) try: self.title = decrypt(msgSrc["title"]) self.content = decrypt(msgSrc["content"]) except Exception as e: - sys.stderr.write(str(e) + '\n') + sys.stderr.write(colored(str(e), 'red') + '\n') pp_json(hits) continue print('\033[1m' + self.title + '\033[0m') print(self.content) - print(infoTotal.center(rows, '#')) + print(colored(infoTotal.center(rows, '#'), "yellow")) # Parse JSON result and display messages def jsonMessages(self, msgJSON, nbrMsg, outbox): @@ -124,7 +125,7 @@ class ReadFromCesium(CesiumCommon): self.title = decrypt(msgSrc["title"]) self.content = decrypt(msgSrc["content"]) except Exception as e: - sys.stderr.write(str(e) + '\n') + sys.stderr.write(colored(str(e), 'red') + '\n') pp_json(hits) continue @@ -182,7 +183,7 @@ class SendToCesium(CesiumCommon): sys.exit(1) else: if result.status_code == 200: - print("Message envoyé avec succès !") + print(colored("Message envoyé avec succès !", "green")) print("ID: " + result.text) return result else: @@ -225,11 +226,11 @@ class DeleteFromCesium(CesiumCommon): elif result.status_code == 403: raise ValueError("Vous n'êtes pas l'auteur de ce message.") except Exception as e: - sys.stderr.write("Impossible de supprimer le message {0}:\n".format(idMsg) + str(e) + "\n") + sys.stderr.write(colored("Impossible de supprimer le message {0}:\n".format(idMsg), 'red') + str(e) + "\n") return False else: if result.status_code == 200: - print("Message {0} supprimé avec succès !".format(idMsg)) + print(colored("Message {0} supprimé avec succès !".format(idMsg), "green")) return result else: sys.stderr.write("Erreur inconnue.") diff --git a/zen/jaklis/lib/offers.py b/zen/jaklis/lib/offers.py index c8358a2..5af44f4 100644 --- a/zen/jaklis/lib/offers.py +++ b/zen/jaklis/lib/offers.py @@ -25,9 +25,8 @@ class Offers(CesiumCommon): data['thumbnail']['_content'] = picture data['thumbnail']['_content_type'] = "image/png" # if category: data['category'] = category - # else: data['category'] = {"parent":"cat24","localizedNames":{"en":"CD / Music","es-ES":"CDs / M\u00fasica","fr-FR":"CD / Musique"},"name":"CD / Musique","id":"cat26"} - # data['category'] = {"parent":"cat90","localizedNames":{"en":"Fruits & Vegetables","es-ES":"Frutas y Vegetales","fr-FR":"Fruits & Légumes"},"name":"Fruits & Légumes","id":"cat92"} - data['category'] = {"parent":"cat24","localizedNames":{"en":"DVD / Films","es-ES":"DVDs / Cine","fr-FR":"DVD / Films"},"name":"DVD / Films","id":"cat25"} + # else: + data['category'] = {"parent":"cat90","localizedNames":{"en":"Fruits & Vegetables","es-ES":"Frutas y Vegetales","fr-FR":"Fruits & Légumes"},"name":"Fruits & Légumes","id":"cat92"} if price: data['price'] = float(price) * 100 data['type'] = 'offer' data['time'] = timeSent @@ -95,11 +94,13 @@ class Offers(CesiumCommon): if type == 'set': reqQuery = '{0}/market/record'.format(self.pod) elif type == 'get': - reqQuery = '{0}/market/record/{1}?_source=category,title,description,issuer,time,creationTime,location,address,city,price,unit,currency,thumbnail._content_type,picturesCount,type,stock,fees,feesCurrency,geoPoint,pubkey,freePrice'.format(self.pod, id) + reqQuery = '{0}/market/record/{1}?_source=category,title,description,issuer,time,creationTime,location,address,city,price,unit,currency,thumbnail._content_type,thumbnail._content,picturesCount,type,stock,fees,feesCurrency,geoPoint,pubkey,freePrice'.format(self.pod, id) elif type == 'erase': reqQuery = '{0}/market/delete'.format(self.pod) + result = requests.get(reqQuery, headers=headers) + # print(result) if result.status_code == 200: # print(result.text) return result.text diff --git a/zen/jaklis/lib/profiles.py b/zen/jaklis/lib/profiles.py index 5386c89..cfe2592 100755 --- a/zen/jaklis/lib/profiles.py +++ b/zen/jaklis/lib/profiles.py @@ -68,7 +68,7 @@ class Profiles(CesiumCommon): } },"from":0, "size":100, - "_source":["title", avatar,"description","city","address","socials.url","creationTime","membersCount","type"], + "_source":["title", avatar,"description","city","address","socials.url","creationTime","membersCount","type","geoPoint"], "indices_boost":{"user":100,"page":1,"group":0.01 } } diff --git a/zen/jaklis/lib/qrcode-reader.py b/zen/jaklis/lib/qrcode-reader.py new file mode 100755 index 0000000..f92bfcd --- /dev/null +++ b/zen/jaklis/lib/qrcode-reader.py @@ -0,0 +1,86 @@ +#!/usr/bin/env python3 + +from io import BytesIO +import base64, base58, varint, os, json +# from lib.cesium import CesiumPlus as cs + +## BytesIO adds a stream interface to bytes +## Exemple: +qr = BytesIO(bytes.fromhex("8316140212c28e52e034ecaf684fa3e5d755db519074f27ad086bddffd26b386e55f3b623ca01f0177c0f8ce5f6a69764c7bc10263ec")) + +## Read from a file: +# qr = open("qrcode-AXfA-M5faml2THvBAmPs.bin","rb") +# qr = BytesIO(qr.read()) + +## Check magic number +assert qr.read(3) == b"\x83\x16\x14" + +## Read data type +data_type = varint.decode_stream(qr) + +## Read price type +raw_price_type = varint.decode_stream(qr) +price_type = raw_price_type >> 4 +amount_len = raw_price_type & 0b1111 + +## Read pubkey +pubkey = qr.read(32) +pubkey_b58 = base58.b58encode(pubkey) +# print("Pubkey: {}".format(pubkey_b58.decode("utf-8"))) + +## Read amount + +if price_type == 0: # Free price, ignore amount + qr.read(amount_len) + print("Free price") + +elif price_type == 1: # Units + amount = varint.decode_stream(qr) + # print("Price: {} Ğ1".format(amount/100)) + +elif price_type == 2: # UD + amount_n = varint.decode_stream(qr) + amount_e = varint.decode_stream(qr) + amount = amount_n * 10 ** -amount_e + # print("Price: {} UD_Ğ1".format(amount.decode("utf-8"))) + +else: + qr.read(amount_len) + print("Error: unknown price type, ignoring price") + +## Read data + +if data_type == 0: # No data + data = None + print("There is no data") + +elif data_type == 1: # Plain text + data = qr.read() + print("Data:") + print(data) + +elif data_type == 2: # Ğchange ad + data = base64.urlsafe_b64encode(qr.read(16)) + # print("Ğchange ad ID: {}".format(data.decode("utf-8"))) + + +## Get gchange-pod datas + +item = os.popen("./../jaklis/jaklis.py getoffer -i {0}".format(data.decode("utf-8"))) +# item = cs.getOffer(id) + + +jsonR = json.load(item) +item_time = jsonR['creationTime'] +item_name = jsonR['title'] +item_description = jsonR['description'] +item_image = jsonR['thumbnail'] +isImage = '_content' in item_image +if (isImage): + print(item_image['_content']) + +# print(jsonR) +print(item_time) +print(item_name) +print(item_description) + diff --git a/zen/jaklis/lib/likes.py b/zen/jaklis/lib/stars.py similarity index 96% rename from zen/jaklis/lib/likes.py rename to zen/jaklis/lib/stars.py index ade2a38..5eee339 100755 --- a/zen/jaklis/lib/likes.py +++ b/zen/jaklis/lib/stars.py @@ -3,6 +3,7 @@ from lib.natools import fmt, sign, get_privkey, box_decrypt, box_encrypt from time import sleep from hashlib import sha256 from datetime import datetime +from termcolor import colored from lib.cesiumCommon import CesiumCommon, PUBKEY_REGEX class ReadLikes(CesiumCommon): @@ -111,7 +112,7 @@ class SendLikes(CesiumCommon): def configDoc(self, profile, likes): if not profile: profile = self.pubkey if likes not in range(0, 6): - sys.stderr.write('Votre like doit être compris entre 0 et 5.\n') + sys.stderr.write(colored('Votre like doit être compris entre 0 et 5.\n', 'red')) return False @@ -155,7 +156,7 @@ class SendLikes(CesiumCommon): result = requests.post('{0}/user/profile/:id/_like'.format(self.pod), headers=headers, data=document) if result.status_code == 200: - print("Profile liké avec succès !") + print(colored("Profile liké avec succès !", 'green')) return result.text elif result.status_code == 400: resultJson = json.loads(result.text) @@ -235,7 +236,7 @@ class UnLikes(CesiumCommon): if result.status_code == 200: if not silent: - print("Like supprimé avec succès !") + print(colored("Like supprimé avec succès !", 'green')) return result.text else: sys.stderr.write("Echec de l'envoi du document de lecture des messages...\n" + result.text + '\n') diff --git a/zen/jaklis/requirements.txt b/zen/jaklis/requirements.txt index afcf4b4..67be260 100755 --- a/zen/jaklis/requirements.txt +++ b/zen/jaklis/requirements.txt @@ -1,7 +1,9 @@ wheel base58 pybase64 -duniterpy +duniterpy==0.62.0 termcolor python-dotenv +gql==3.0.0a5 +#gql==2.0 requests