From bae8933fdd2e7d4969618186203a8fad32bcaac1 Mon Sep 17 00:00:00 2001 From: qo-op Date: Fri, 2 Jul 2021 03:56:12 +0200 Subject: [PATCH] remove old jaklis --- img/QR_oasis_OASIS.png | Bin 0 -> 18169 bytes sms/jaklis/lib/currentUd.py | 40 ++++++ sms/jaklis/lib/gvaID.py | 81 +++++++++++ sms/jaklis/lib/qrcode-reader.py | 86 ++++++++++++ sms/jaklis/lib/stars.py | 242 ++++++++++++++++++++++++++++++++ 5 files changed, 449 insertions(+) create mode 100644 img/QR_oasis_OASIS.png create mode 100644 sms/jaklis/lib/currentUd.py create mode 100644 sms/jaklis/lib/gvaID.py create mode 100755 sms/jaklis/lib/qrcode-reader.py create mode 100755 sms/jaklis/lib/stars.py diff --git a/img/QR_oasis_OASIS.png b/img/QR_oasis_OASIS.png new file mode 100644 index 0000000000000000000000000000000000000000..711469374a2f44c4739307397f0f8c4695e36d54 GIT binary patch literal 18169 zcmZ9!1zeO{+dWKogMdhhbV#>=qaxCvG)OZbjZ)I3C@tL}DB#cyDkUW)BGL__(j_JJ zzveved7tBhZ4n)cw-9pR}W|rxDPw9Q&eBw ze)`aZPB9K6g6;5aE*56kB`tOes++B@^n@xT6s)&y-EtPuZwXBNA~86u?8BMRk1=>y z%|aWwn!dU;rhBF%H+b!HRX;&U!ye@d6$Q@AG*$vCQ3M4$GK5uUi09(k(xDoH0taCp zwWB~7;;PxOVw7xSm~6$Mcw0C!kDEJpO_5@gA9;oMS~Yt_2=_V1qb~ZDG}dV^^JJR| z``TW;;)qm5WvUArvhr*|YAVPv9`D6G2*p)J}?&{I$^{q_Uz)Q2v0U&2*>h4rgCf zT5)`h){c;=KsgUN=i0pO0Y~gPz4|?l;fGK5)J;YHj}#Yy08ZyM$8rB*Hve3i?7(OAx zrR|dHYVGh}=Tr&oRKjkW#gmp6dc|j!Wx=l|5In2yYHvFEL*xT-3xME@LZo zf6=KK-=^$DHH!L|pW54-1=R<7=^W~YVYAo2RUZUly|E5)jm{P)>lYUusN0f-$lzL; z@UWy+H1cC3P^UI15`>eRjSQ>5ybe3;cCG(Q3xoL zeIwW1&uaRKtR`aTL!Z_D39ik>M-u-DGt{%S!-umUpYDBs_h8diz~|3zOcfDP(Y@VW z=ZjX#$yx_|RFkdXoK5QP!NVq&;Ht2byd~P+Mfd%zP`SEs@Kh$ z{Wd1WZC*||(&8ZA`v+>A{oUXCu+_|~NqsmvJX~$lm;B{@R6~7KWu4Ph$n5#~$=31l zaXl%29z7i$KAD=PrXUZ`yQ+G8GDg>Mr6TnV36It9ZWDujL}kBz{9K;n=jXkCoku|6 zgRW=ssb1sIfkNZQkG&U${m2Q8gRQwOPC<$3`d8PKLS*9E7wjK?@WdT~40JsqBqW?~ zJv#C>**Mx+%AJHKt^E_&6?NI@x_6;QR%@`ZuyEC0s@Nl{O=D;0>qQdozqPcw`}&CM zM_=E@*AkGBpw)kppk#M(e&%T=82Oe+J!y`!-FUgH%6R#$O?`x_3UOq_-mZ)3;PKw% zH?a)X-x>cWkMH&4xaltyTtzG{Elt%q89&)5H>^f(OxEh^`Tk6^mGN9J;_n$4*qCjS zEgEfn@@t_zoKN-J@Nmn?rmU9J=5!-5Ex%T>nB7;5D>c{H*lzaBw}m1s0s_we?yn(G zxo_UEf0b-9y*N9Z3mxUu%+AcpD&;?3idEQFR*tu>G)UxtOBpw~S|rgqeU7`Tt*xE= zwYwWX@%R4UyU`3hs@8^GGrx!OyNk5*6FEHAMn@h;c1K+n^;{oM_YKp?z9DVXOLG_> z?R#Ba+H$czynfcFcvn@MQYn_X6aTvDM|z#9k55I*^vX@;w7xa@dUgMe)i1nkHIOde z9y0W8GQ}+5r7?}7WGK&$ElyiiOptCeqWjf~pyoA*bJ#s3mWZ#2Gr%M)OCf4xa9@M)5ll%%7v z6m^6M5H$TrKy>ZewYExR^+cs}*t2H~2g2dxESuln5_6kWS@-k_wv_NcU9aqRby!$f z$gRi3#58hl8`e~4a-NY9u*IA_+}-`Osi)ClSt)f&z`@Q=!h9pOVB$Yd%_>a&zfGVl z^l|y5QUa&?cJrEUu^uKlk%B@?ULM=gB8?)21~(TMehHOuSM%}DjFYVvGeZ&EFPY1I zDWUe=u`JzFg_w8qDe;B=u2&C2dKU8U93Bet^W%(|K3z`YR8QwtJy@Rz)$Fwvc{-h) z{@uPdL`J{dwDVOGbKt3)D+fH}i}J2a=_lEKyUIS>_xitZ2?@E5S6Ji<$;+RAdPdwE z9~T$5HdY>LzrQ+y9Vr|T5HNqUpw8ZZsf*Nvv_b4$-q@O(q@SPPO^4U7Uwf+;LF!}U zlj$UzG`M2c7l=&U?n&rJif*=)mkTz;hm$dV8re2}o(n|@z4z!Fav7~DZe8;L8WD%7RMNzE;sG0-5M`2qV+u<*~7 zm6xRxQZ-sPZ(@}FJl`Z`|0x?P?l9^&Swnc^ok4$RXD7VL&HC}}59V!H0vY?2PjvTw z4j@jVDkbOqs1wB;M)~FB9vUt#ECh=mPdb!iDn*tz|6Sb*ypS!zqs^qZlF1_T!ruFO zn|z^u{Ppc{)Qt+*S0faq*Z}AMw*CK!|HbSdF_lPi1~Gyw$lB~T`NE;Sy}hj(Rv$M% z(Tg%f=cc!rw^H`qjiSe-GW+v;$ZD?HKX)=#;hZ4vy`WLe@9D-Tx(9V1KQbQDPK9%6 zWJo903rUT z{|eL!^LEeS0`=i<-xz&K7z4s|wq##UAaD?_dW?b_-cO%mvasqN;x(C)qgLGC)HbDQm#fGrfcZs2e^!Qr8$a8L#V|_WH@t6Tl%AbUrdC4AAcj%L zoj-K+cdb11z_`W^Gn3I>hN)~cUy0m&vv+V1U;dKX03$~PTLXidKyqA43SAMh)@W&Q z@n&sQ6p5gqppCMtYekpw>A{rC*z~oq(7Xob!~VhbUDY;BD$6M4_^@INvz*_*?Mz5* zwe<%Eqhuv~{@4i|r`h(WVxlm&_`bw*sMh?jovpOOFOmp6_cIX?7r&&F0j;MjIU~c^ zCIAT+@e{9bQjn0)>r;F}n3w~tVQIQWl?ZzA})VwbL8d zIZl)qRwr^mS~oz9HyuEQ;Z-(@kb#tUG-`nfGeq zVbKF&&c%c@sUi0I* zxvXD}qhn}gy*5uz_XZIbj~?*|$v}bKdq!vKI!~#tso5RFxYQlHHBy|?XT9`TiCFi& z#~R+>cRs{!oNgn_)Q%S&RQGKrYaSW-6b}tyQM0hb2LAakR?*AP$JG#~rl!6oORlR# zO!E1AJL;ERa2nvUWalU*+0n{j9gmN&HJ7E0fGy1ZPYZ<<3Y%K+aqxWfXk}30B8nIh z#9TZQar@v!9zm3GJiEn{6z&M~t+ENn(JH=*qN3m3EP*=7i76@A#r#%k$u?ipxg(&e zC-+K0`}0~_pQvt4$!%z$*Khyus=B(mEjC-$i;U$(`I{c=PfeY+t6N)hC5EC}q%1|1 z^+$Q{oR!4W)N<K~oa4>HkF;i_;YdgGWA1%=L5c9&l-?j|{PK za}y-GrqFYsULWTK{C%XgvDg{eFbQE=GmZ7js9G~e{^4?P%f-2@JjK*36p1XWGcE_f zzkde)gNFab9ACrMQVIYj(7_dnTK=x`X|WN6TJF87_Coh5Oww&DKDkCn%gaB?gl zBO&S7Fy^OqO&=>a>n=2exYg*Lo4bgXoW&SP7BI%6a;Bl7nIAphx;Q5{SkWCeoL_zk zZ8K=p_2O6nuiH{o*2-~vzOAvbF_+?^DA~>)fj}HhZjM)CvqYA6LD7Q>`CCL_W+;Z% z`w`I`UctoB;_66ojDY$=c!A7ify{dzi~G$Gaqj2i~a2z&3~2)jZV`HkFV1a9fO z>*YZ=@6`@4ZP+cijB;I`9#i~U1%T^E9xSGkcMoZBu02yspgR~NR zPRjOgg#7!+Xk_9lUS^gq!VoQ$tGif>3+qZ9n z_vs@$@7Fs&)Y7J|jb>3`HmQLG=~VZxDF!ZEelXKi^I*VHpg_{Qv4;7n)$^e^^X@G)`05KU9_zU^Ue zzY1_Oi39bH9SaMqwGuBBA#Omjt-O7BxHa4Kp{m19?0l!2rS-WXthEX0RGOc^KOh14 z0cM)i?QPeu@>V1+bKQVK{Bl>D-MOeJDT4!Pel?R35MW$cd8$Wb{^#KE5Wnqk04XZL zh_tp2;#z=0ccgav)~#0mcV;c}QeW+BJy*Wro`!W=VwS!$s^(C}8o@!dPK^Qn-BJ;F zmH+I6w2>69gYGmBSBR)l5fO5%>|u;eO>40UYMS!0fQf<#wT7SI6s>lfJ?a3PFda!< zHddh?x4gXkYcNNUkFWjm9u8ujgOZZ6?kTB4TuK5;xj(GWx_>zZzLJuX5)*ZFbf7G! zq^72(q;w15s>l(CnAaNNB7T2;-44WWkUlap(qROp3tKi&auZwpWtwYnl&Y%gg9i@) zyOA+U#U&>vzk1b%Z(TfMq`dk-IbK9Wgk8DHs1z;=`Mx zo&vWE#U~$q_n`2}uP?X5$u>rc^`UC=q;)t-qAU_B27}m@$2X(tB6LJG+}Fn`6B!i( zO#0g2J55Pc7@B#wc&e$9ya*jB(!QqkiQZwnV&Sc7N+O4x&!2m0YBg(*2}86D47}IJ zD}m{4%zQ|>i0HJWRMe)x2@Jd#A0M}9e}4S;Z=Kyx9)O%9F~NuL|G)~RBqwunadB~S z&NjHUTUOFXcR{K#$$GMLaCoeIvjJk<VprS08Vdp)9$ z>OTFc!v25%U_Mh%7sKR$uZG&QlfzKlPx@y5`vA9lsm^(E@X->;bc5SrS*q?H{d}!S zlWDo|b~L?9t!gQ|F9N|$}o#aGDGX7`nE0>*VF@7;SOXoy3;*1OE{JSYGl z!YL-Ea~wDE+{`ffinu*{-(zd*A5RA5y6JtFlk|7@_R3A0-aF5{2axqx>Dd)Y=k>|j zwXd&lgHDqz_UL{rvz(4g+=BvoqcXha2dG0br5{A3q`K;CZjSvf|@G<7tetvb4+&JUkC{Ny1KHm@)Zfk@mdEutCEU}?J1X*f&PBR8{XT1m}0FQr~ub9 zvWts*%)Ivi;+As#;bKMt7B===z{!Sf_S5H@1jpgRbQMksB$}PcnVJ19T2$23zJGqd z?jJ->S=@(uOL+|lk1(6G^l_Hg>@lcExCkk)&1onQ5apm|h}(T-9s7Gose8+}dJ6+W zSHh|*N->faD(BAIB}6D5lZ?CFr!YcbtDFfvb=X67^ChQ!d5V$VvOwe>oF{Bt%gm@9 zKvs{~Ly23fhdax;IPIRBGo!%CA8LTAI%XE=5C3$Xj7U8$b;}*-g~*ei{SZ65n9}_G z>j|3j6IC{<(8l_a)%< zT`hGF2l)cGr7rV1zkB!Yeem39r9-1U5>K}^cbTuGk)0u4#B1*FVQ)eY+$5iqF%jkI z>Rg_Yht(U9oKsU%`@Z6?S6mB1j+x(%B9OKEBKSe$X}`BaeFe4%3V>aXVhqPC#-*d3 zk#yw`KaA?BAJfgoK-u8W82G7IY6RJL*iNqCceX#qq5R(Ocozf%e%d~e2R}A7@vZCu zI3j1hK|lng`=P52gk{i(%1FxH_%~$_Kk%yV?(PP8M7&FD09@O0{PT*Il+&ab#q}1b z82L)Ecq0{OBOt*|^N)B?JD0j%{$Z#6G9Q=rO5mtNI6$K98zVAV8Z?~{qYXtx_mXY$ zhd#H&@jXtf7)UEOX~d!`07=r;+IpNf2$})1I*oju#s3dwP6TlX1ugBtLO9E=vrfkw z<%I2|{(%9HQJdq%NI};VGFc<70Aya5wEOR`{b`~J@$olq+$hmoyB2$+%KyX@ln43C zl}?pis#za1$@}>9O1QbXD+W~VX!8pQoc&19#|t35a&mG`swzqA>2(9ixQKChYp5SVONrbOpuqyRttS0~ z;;y%SBByXT{RD0=fnB+9_zZp!^v4F*1uUmyc46wI9Z(hn&X0cqwKR`XymP0-tYy|* z$WFV;$$(aI$WCnc5>Kwdc}|Z1!Nfp@ltsse*6g9Q|? z5FSR0r3U=T>+6owqymG_R~zSUTRIOH4AeS|-CW2;gkCpk&|0p9DsWlKmG$e5FH*t8 zzxvZcpLpg-Kfz1w-U;T?%b!1a4t|kd7hCjs?ukFH5k9r_iz*Nx>m9uuxy3X zZS24&=v#-b@~a$U%Ih(Qe)~_sPW?BjY&4joryv|;`)*1%H#{q+9~I5nJ2^h~-|gXo zTDqi>Xcllji<)eFhq1`F;iQ>l8>@`1E&`tZGQ=E+&yS&V6aG7fc>=0sWlusSm zZg;9hr${+Hu*#2hg#_=b5j?9d3lhW-dMif&e?2`tCO6Q4*GsYNvwi8`7kj|gB(Z~?y9P;mUNlTOh~wW7(-&-aq;={XUGFp1On5l z#JJuWz49uI>oUS!*=1N7j=+lq<~Iw(P6`6FPHSr@;~&rSl57VwSo z*@UStmOwyd#G zqrW)LupG>mQyGio#kW0g7RngF3w>?Y5@0g*=+PsoOx8IO z*Np*o+j*#@qI2!D-D|I{S@Wc#k01S@5w->e4|_61cL8+?8YP2T&2MjNYI-9bUy4>| z>9qpTJip_|j~|O%eDyzGP6-VSJ${^cP~=m01~h&4NB;X{i&4wUj_z)k@e0JrykjwX zUIQ5jPm%+AKL{9gzX|fVcLnX=E-SCtJOr>wc{It%$!V!zU$KxWJc^cLbl$vqW8LwB za-PbqP}{~rTbr^7DaK&tyCJ^KKCi?4>eZ`;dVqQ!Z(e9e9o& zoUKY31s#%E@yp0emaS7mt`m}x(c-iX5AU5G?@bRPRA&h{87wLdO7t8oEUubKR6AHD zr=*NQ!0EkOQ&d#wZ4x{=+#2-f>W*Q`NJw}9Jq9^iV(6SP#0F~n!DG+3{LUFb{>tj= z%c@@i@(<{2i+12IM;~<}g&a>L)j1PZ&j)ztu%ap( zQW`glyl-^pv;G@0fMeV9i01ruOqgb;CL~ltBLf6n)aBVNNZFM-;Rq}Z^ym&~pd}<+ zMZ+sPUVT_Z#Kdh$I;2%B~Ir!T7 zs?6eFFTii0nf!e)gjk@Rgtz5=z~@lUyEijLwzd0Us4?Vm8vrQ&})XaWzP0=i%dvR4Oh(ZsTQ`{eU-h z3Kfm6VMpe@H?m<1PO_;AkP7;fyUQi+v&?^`(Mt$H?bWhoo}V ziDW>1yxiRL3xd4g;@Oq+u;S|QbbdNmK?#Q04eFcVw>qjX>H`e^w_Y%Gs#^se9~}kt zhla2QjbL?+gZed@r$}t`aup_xzwIh;CMzs%SMbzB+5_S>f8j9KdZjpeoFm7BeHEHyMVnqbe!1zLZN%Var&S`Eadw4*dH z@7Y`gd#@RFB(1N-TA6#K%><`s}(aEfRZMs^4ir(|1Rc%AV%bHB4uVznAPiLS0$|`R;_kqDL z`ai%7&^Q3_0xoWN@=IfL{EbgZczE~9a3P;t(|j3I6+dWdqWt_(#J-CiFJW6{R3AV^ z23R_O+T;BQC4&|exZf79y^M--94(oE#4Ob-9d;}*KCbu(90gd5x`)n>XFzFu z0V4AL9s2(LJ1FK)G?79#;3l6D)1mPc+ZgdwEJO6&>`Bm1i(vArD>Md`iT0aP+N?7dnYue1Us z5+s(WyGwx4XMqaYh$t;r@JB4drbGYl`z{f&efcQv>g~L|JnzIjuqha)OTA^_o2%}5 zaKF^3*8XRIno4!)W6$li@)l+(*PF>Unwo>xAHLsCB|;@8C-0ILszgLYw2o-aWH3=u zzDh~Km#5f%X|+X`KSbaxyhV7Anu&>t)X@<%3t)*@_zWa?u8|zdpY|9S2aEI?ACyc$ zk0q-wfWbrlQ2Il4C1S&5(31eR_KWJ{;Nh8m@QgMt4JJ*?h?|stQlrXPqasS==OkYdO_0MnZ_4%)xsvCWG>{vXTBrH0jab#qJ}kzSEt z6tkna=sklG(DAuYcqcyr)?n;w_ojK$=CgyTk4B){_#AGkdkRvCx?O=tUuwHVZSIY1MO}Wm{$6$2`geh8y&vlBA1CX|pqdg6&Dg1_yf$ww~ zz_-IJx9q)iEUWO`@SVGN$*xF5O+5x0xC0~SDcS;KnodBqJDnD~{=k$VXaIZfo>_qQ z054U8wU%zoQ#Ko-nC zdJ8KkTmT^oSb3Wwf3jZP(Q)U-cfMckFiqG5h#={or4VRZKDKw2L5Z$5$(1?<{%36; z6eYaSHlVCyV`EcOvO+>yg~OoDLjm0;f_gaD5~wg(d7a=EOl82ra(@WVWsx}xN$t%n z3<4A68|afJg~O#FE5U3WhPKdTWU{_Md558mxe&Y!4leG>zEAU*PiqjSNo!Okz%lTr zG?bJ?#s26$OEsyl^WZcF?e3^os|v^(XllU9`YbDJ948}PkV=^)_coToq2 zYHDf{6KTMg0}UoktpI{S=eV;&fg8r|ULIv%BGnom2`cDWsg$`*(5DMmI^ zl}aMk&$(5ZtQZ%)oj-r3Vaf^+wJ{zFc_Hw&fK%^GWK!;{H0b^N>l4&8e~*qZ%y1KW z!k7eLT>E6<6Ru4U=+;4v@xrw9^aOR>ASI(gQ7;uU4W8p@_iGCnWja;{I6}6C5U#>_ zJbcjocz5~PvuC~WFJ2JDF&ZdCO`n5%1xtviu&{RFu+wzIkbNz5+;4q-k-xHv?3Q~f zT}^sPGeDFIGy>>w&T?^te{l-4p>vqvbw^*p_q&AZ7#^mcvvgeg2vPw&Ey4nJ6q31= zU)pPv(Q~Txm;)H$PV8cqePv~3ZhEKX@tAcNMxtqRxsbU4Dh0)xh4y;73` zjzjmF)}o)bU6%#6uYIClGR{g;%aBm->(mC9Lb2}LP#zT-i~Q+!J9%|W-d-(Om9AcG zOU?_9EuKs;*NOizk<1pVdI(A@cu1-gu}H|tFOHUCf%e#cDalAo3@hINS%&FJjjNPn z++C$eQ0V6E6Nf^IqG0GhkS1CP4At*}JK$O%LgzcNf!4rCdxXrc>Nlrv_{Z+G?0FvX zS@pzoJbVx9*(Z3}O0QU)jcpN>N=9hi17#~2X+^Za7repf#-*N4LrK|ITMr5iNQtm; z%{4VTg~L0?bp!Q;MLHg|1>ajbEf?l`^0=850{j4Ff@FOP$`!p8Ug!c^51S7q2mfFG zs*BoJNl^}YS#Wd5!-hs>@ z#+s12QJ2r#xI`<|#`9e(N)|x@loL6aJ<}3+0e1qrtmL(8q2!%#8Nhw9IXPzFB4hUd zqYZKd)GCP3DRUw2y+Yy;SNIN??Z9m50^$b*e2^xm7dxHiVXzEaaaqLr9v~*bN(Oz0 zGg&!&hvY`TeS~wQ-11;3gf@c(fbQQ*HJ{hoMu?+xt#9!Y6pSbaaTUW)hZ>kxwNB6O zPS7yFGxgi)d`Zp4tNNcAC>hEkl8;=*Y3tfDFiFTv2ok6ajsOckcx`>@?OpWz84?l# zn+C?E5QW;Ip&@yBdDg(c$9uny^D0G#qr=0Mpl!%_ZQcN(7W%414sD^RodVA!tWnI!%&-joV!2e?&iB4htG7t=Wq7=Et!NNEX5lSjS!D#{_l`{ea% zCI#JSxtW=`a7ZYfcE$&C)6vJRQjU=_;M*LA(h2q^*Q4zPP+35=a6Ffu(=?{tSrUFqr{S2fkn&(Rwgibat!_*uS_0f`Cb2#Jm4C{@1nr2LI?e zhJ&)!VUPzDltHWZg0X_bSXp~G`CxA^R2g1g-rl}GRW-H#zP=>~{odo(tOV1ZGhj${ z7X9zEZ)2b+O7{-Luy%1gEzWDWG}KwA;R4bNTB*SE8!UNze^X;$yudJac4Qf0x1thV zP*LXN>H^6K40)dZ;R(-S)F_KeewJ=mBJjnXMhH-R3ITVmh54R z@OJD@&(7SY$uk`npp#D2yRdNk{mSwR5=7f3pK?lGk>bFz>IWy`!)d+ZOZdHyz87i3 z?IdyBD7POVJb}`IR_Cf7ySi>)arvliQ`^ze0l^yl>Cte(gd;K&#Oewc@bj9)vzv4F zgBOcVeI!E$^d21EHdPX}fpjN{j2-N1P}1fdf~$=k)&NVzz8r=bgZGYpv zO;VAJkx7%!C7mnMkJ*dzSM7qEWGnCq0(+My0si88VY~c_c=-~Hsh|$IIlO!KE_V|0 zujYm~gQ$^|utK#xr+ajxx{hyT@vD4X1cgQrcxceBE41Z7ifPQaTAh6_mC#lf6!DHX8ht9`oQ=Qma$1+Utc9Pc}!GJ zMn+`u!pCvV8#{NLoy)3zK&*J@cmC)}K!_WUa&W}T9nc%d@9gX-Yii<;EG{m3+uK|L zDssswM^6MS-MqJ-pz_`aokC>|b@tmEkUYxU0A@1Z8aywuIC_(*YaHyqt%@J~jzwlS zqD~4Xjs0rDCj(Qpicbi2ijGL(g5i~$-Kmqb?o%2Ky;J)BR3;gu!|IaJb{~fuw8Y1F z?#8nVjqU^mV33oO3*2TiJ)lt>s;vCpSky}%yT>qtU2~EUbO7^Yu>=H;W*zOvG5*6w{go1B+ZSP02&ZKQ%AO*RN_LT?hkLV+A5@sr&!Uhf( zYT`cwn`>qW>h&@V>V5$Ng26xS5V$Uh=))^4^pbFiX@k^Wfl_@mx!9RaD`3>0E>2AI z&!9J5yf+?f>?WjzM=v5Hu|4={!43j8m1kA_p&6gfiKtNg+B1jp&eKwH(T$K*E=~K% z)!E<3<&Wk;?$wo#6KwiJHE1x;FfFR^1Sm|j533#Y*dW>7wiw!xp24Uo7CE1qWb7R8 zMMBqH6w5cX^{)oc?=`&@+6%oNrL!k$^|bi;&$ebU=;23PpFVxMDIN|60uk?R^RM#% ze=Ao9Q|Mah1U#;>ysOa8$B!S;ZZsN@NKE?hntuGSHa7rsd>396C;*r_!C-wb57OQ! z<&MY|*Ij#Y7bbED7j@2Iu$?AyOtX<5=z}MO`VVP%i$&DKmH?)jpUcbpt=Q!A30S2` z$;lzum#ylZXRwA^D$^vvX>3Men2b0<{gjF9#6p3MZkkk6Q}dL%!3Y>7Be7HI*c$w+ z@SymncPY;%jYFM%05B^_hhxHzq~2(8?F+Otw-dCL)N)`nHD|)2KqCvathe~W5^dyy zc{CWg#2qQ>kW2grs3N>YFvR0-kTc29d>^tK&?CK4<1lvp>p6_s-D+Xi`!?|ms|iDL zT_7|6$105Wi-vJde}b&x*QFL*vPUf-gwU+SQS0vAu26D$f&gJQHmva`cvBn{)Fo9_ z7u}~ot^mf6+bF|hBwv3>gz^AC0>8R)JWjxO7iR zMk#c|?TrWWw3syx6z7UUz{jc|kjJ@U!UtVfT)^o5d-hT_NJ2pOT(5Eq(~~r$-}TCa z(iv3v6s&~=$#6fd}1mW1Hm?+2j~eFWpA;UDj>3b;LavA!Zv&-4fGLz^ExnCsoZV=MZwWRGBON~ z7ZMo*M>nU9b=j4%x>3w%gTDwHTy{w|DJO^AS(t1C?MOe7>Vzq)WSJhcVtxA_xjoSj zgdj?c(o1kdqp9~iJ#y=26acF9dRfU~a%d6y;3$=Z9l!-6pU6GY;^(B_LRN|3WPnxA zP{@CMx&J!ErU@GY9`OnbSArx7XKA*1pN-g)!b5quc10<%_`3rl>5Uh){WAYs0;HmU zNCQ{~!M#DOb22q|j;HeX&k8mwO^p*l5oG)cT6t?M%GoZ3oiH=;AB!dWGz;1di2@@| z@O~ZSxK=kFRCV^xpFckU`y&m~);2Wy2o=MI zw&{3!M88sVb-_g(0p7n^3*vK}_Jp0-V)o}M62}%e1yC;mDtw#}+UbJvk~AVR5Cighf=JQo*0arUPNZw(5dLa;Z__hxw=HU zQ5(?*JaTI;*0&Zd8_i6Yr9YptP$G`LEWpObwtek4*>PGM6&XH0-UE*sG)OIlnK2&~*8_GsA{Y(|M3fV$^zc8!C>gG2>vI&QUaZp5yUK?=_R z>iA%mY$3lkX-Mphg!Amjm!*G#gM+0A&Hs7hm-ImU=sSz0u`FqRZHoWD@(3r5TAfK7jQfrN$|b$er~9v}aC zSQxmZX=xVC;gHekUd{#12=F}oTfabcHYt7c2B*Qvpj2-=|8BlEjpA2hP%EIY@TsDw zS{s8f#W0>&DRSN;*HmG9mA3gz>8ZDqv&6m#IvJ-xm6lM|DY77jqE zBf0fdz_1EOA6C(MDDPR7HI&%~BQS}+7_9?o*Oddtm{H^=aNq#^W15zpN@ANU-R~bO zOQNv7J$1DQq$nXhV@hM%c{cIny+(>Rz)u>Z>yQ2S_&C^}pI!`c6ZQ7Zn|XUk&0KadF&h2$7+L_6I2%hhy84|M1zb59y2gR% zW_b|njM1bB7~hS7lbApc|8v$8u+oBO!#nX45FfZ*^(aoC3jVZusXKOJXSeE&Tmw|zSqhkqnle)TkXN!TJ-cOZ@hC=bF z<&-?OZ6~Dt=sHyA@PRiC{uDToq3w7Jr|7ZWe=Pn2oSb)6yMGSm#C`|{%&cRU<^2$j zXZ9^b{_Lngv|OBj=$c)$w?>~DYEJvl=`o-a|I|?N=iulE55$^0-Ucrm2{eT>65JiL zbgXn?5BbfS8OLkf8u&+YykSoE_h6$K5Wlkglb>o7PJFDaH&xNhHhfS{M5L-08||$L z_O2|HxvBzpLM|d82`4hYzhWo!!p?ZNHd0*pwjOMTz6|ZdzxMkuei%( zaYy8F6NTiOtczEmmKqH?l-;Y{cX1X*4N6HiOd2-kE{j%99hi)NG%3+5o^S*p)3zUC zm#+TL@q~Yfku0Kra`6ppo_mj!VL#T)l@QP{S?#Pn3ty!{PV+qGildlo4`K|-fx^88{nr%q}(Hg7en^^Mjrl)sYZ%AuuR&SyW zQbbtWI=%yElKJj*`)84A14jBdo7Z?9j+at@jB`8GiWDaiVo~>$hc!M05IX)R> z7S?~#+&`y=gBTa58SRj)ez-w}vk*o(lihppazf2n8_r%^(%P%^S7ntGg|MPT`KR_D zIn*omvc*wGvf3;5dtS$wC{;5|epJqh_%6oT<{W6L^xTk-+OA5SLOeW;kc^-CWy}Tr z!^a^-FNG(D+U}Qp(fl^+5aP;K)gLuN&sm(5-Sr8F&r0U5VK!mjdxKQ-ve{l2k0z{svC)zMxgw3NDio8ST+SF5Nf zXn(wsnj9Wj&-EX{eVh-cat?SKWi(v}qI(#)rs^JeI#!jQc_pQ!UqlQmOe*&uMm*<> zw^4kc9xdY8^QP%9sh)eY`1|)356bUg-nt=n#9}c`G+eDMvm#<`AO=lIJDz&!lzv^_qvIqOrkcmk~@zy2rye7BF zJ9jKS_2saIWi@$Ew~jP#E&0AG3%+|NzOuJMt>I-wm%-B^tK2g!%Lr-M(tIIFZ4i=NH)O&+- zW$W=G;He1ij~e)ugXut-t~sax5DqG%=Ijyhu0kxEqVdWRfVspvJiu~D@T zk6X;%awR`p8$Vzsz4Nu}%!Ir}53YChy-jC^EWcy0W2?8QpU(8W1A2_}y>p!A;k(k_e7Mia>2QK&!*v3hFI|+C z$Hx9OEON5Jj~J2Bv-+pbjC>QNEyX6+Tb^ilxPIk{VmGg5TL6cH%md#C^(a&7`ywwJ z@%Bw#k)Yh0YgJpnq=S6aZck*;CtH-~aiS7~yOVLRhaJfkD9wk@IP$1&b@=BrLUXAy zDYol~Ka+b)#Yih_#_qc)!qT((jczyTY3h3khu2*>Wh<1LeQIGftG9&5?h_5lD*m{% z(sq_JWR&qC-XzQ8YOQXyEj~RDeA0+_vrTwvX%uw3>#e*}5BuNPz^7xR;@UsRO9Ch@Jy$k!s&J;zRRl6tyAGgd^qjY(FIN z^i{ng{IjD*Auh+6v0 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/sms/jaklis/lib/qrcode-reader.py b/sms/jaklis/lib/qrcode-reader.py new file mode 100755 index 0000000..f92bfcd --- /dev/null +++ b/sms/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/sms/jaklis/lib/stars.py b/sms/jaklis/lib/stars.py new file mode 100755 index 0000000..5eee339 --- /dev/null +++ b/sms/jaklis/lib/stars.py @@ -0,0 +1,242 @@ +import os, sys, ast, requests, json, base58, base64, time, string, random, re +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): + # Configure JSON document to send + def configDoc(self, profile): + if not profile: profile = self.pubkey + + data = {} + data['query'] = {} + data['query']['bool'] = {} + data['query']['bool']['filter'] = [ + {'term': {'index': 'user'}}, + {'term': {'type': 'profile'}}, + {'term': {'id': profile}}, + {'term': {'kind': 'STAR'}} + ] + # data['query']['bool']['should'] = {'term':{'issuer': self.issuer}} + data['size'] = 5000 + data['_source'] = ['issuer','level'] + data['aggs'] = { + 'level_sum': { + 'sum': { + 'field': 'level' + } + } + } + + return json.dumps(data) + + def sendDocument(self, document): + + headers = { + 'Content-type': 'application/json', + } + + # Send JSON document and get JSON result + result = requests.post('{0}/like/record/_search'.format(self.pod), headers=headers, data=document) + + if result.status_code == 200: + # print(result.text) + return result.text + else: + sys.stderr.write("Echec de l'envoi du document de lecture des messages...\n" + result.text + '\n') + + def parseResult(self, result): + result = json.loads(result) + totalLikes = result['hits']['total'] + totalValue = result['aggregations']['level_sum']['value'] + if totalLikes: + score = totalValue/totalLikes + else: + score = 0 + raw = result['hits']['hits'] + finalPrint = {} + finalPrint['likes'] = [] + for i in raw: + issuer = i['_source']['issuer'] + # print(issuer) + gProfile = self.getProfile(issuer) + try: + pseudo = gProfile['title'] + except: + pseudo = '' + try: + payTo = gProfile['pubkey'] + except: + payTo = '' + id = i['_id'] + level = i['_source']['level'] + if issuer == self.pubkey: + finalPrint['yours'] = { 'id' : id, 'pseudo' : pseudo, 'payTo' : payTo, 'level' : level } + else: + finalPrint['likes'].append({ 'issuer' : issuer, 'pseudo' : pseudo, 'payTo' : payTo, 'level' : level }) + finalPrint['score'] = score + + return json.dumps(finalPrint) + + def getProfile(self, profile): + headers = { + 'Content-type': 'application/json', + } + + data = {} + data['query'] = {} + data['query']['bool'] = {} + data['query']['bool']['filter'] = [ + {'term': {'_index': 'user'}}, + {'term': {'_type': 'profile'}}, + {'term': {'_id': profile}} + ] + data['_source'] = ['title','pubkey'] + + data = json.dumps(data) + + result = requests.post('{0}/user/profile/_search'.format(self.pod), headers=headers, data=data) + result = json.loads(result.text)['hits']['hits'] + for i in result: + return i['_source'] + + +#################### Like class #################### + + +class SendLikes(CesiumCommon): + # Configure JSON document to send + def configDoc(self, profile, likes): + if not profile: profile = self.pubkey + if likes not in range(0, 6): + sys.stderr.write(colored('Votre like doit être compris entre 0 et 5.\n', 'red')) + return False + + + timeSent = int(time.time()) + + data = {} + data['version'] = 2 + data['index'] = "user" + data['type'] = "profile" + data['id'] = profile + data['kind'] = "STAR" + data['level'] = likes + data['time'] = timeSent + data['issuer'] = self.pubkey + + document = json.dumps(data) + + # Generate hash of document + hashDoc = sha256(document.encode()).hexdigest().upper() + + # Generate signature of document + signature = fmt["64"](sign(hashDoc.encode(), get_privkey(self.dunikey, "pubsec"))[:-len(hashDoc.encode())]).decode() + + # Build final document + data = {} + data['hash'] = hashDoc + data['signature'] = signature + signJSON = json.dumps(data) + finalJSON = {**json.loads(signJSON), **json.loads(document)} + finalDoc = json.dumps(finalJSON) + + return finalDoc + + def sendDocument(self, document, pubkey): + + headers = { + 'Content-type': 'application/json', + } + + # Send JSON document and get JSON result + result = requests.post('{0}/user/profile/:id/_like'.format(self.pod), headers=headers, data=document) + + if result.status_code == 200: + print(colored("Profile liké avec succès !", 'green')) + return result.text + elif result.status_code == 400: + resultJson = json.loads(result.text) + if 'DuplicatedDocumentException' in resultJson['error']: + rmLike = UnLikes(self.dunikey, self.pod) + idLike = rmLike.checkLike(pubkey) + if idLike: + document = rmLike.configDoc(idLike) + rmLike.sendDocument(document, True) + sleep(0.5) + self.sendDocument(document, pubkey) + return resultJson['error'] + else: + sys.stderr.write("Echec de l'envoi du document de lecture des messages...\n" + resultJson['error'] + '\n') + else: + resultJson = json.loads(result.text) + sys.stderr.write("Echec de l'envoi du document de lecture des messages...\n" + resultJson['error'] + '\n') + + +#################### Unlike class #################### + + +class UnLikes(CesiumCommon): + # Check if you liked this profile + def checkLike(self, pubkey): + readProfileLikes = ReadLikes(self.dunikey, self.pod) + document = readProfileLikes.configDoc(pubkey) + result = readProfileLikes.sendDocument(document) + result = readProfileLikes.parseResult(result) + result = json.loads(result) + + if 'yours' in result: + myLike = result['yours']['id'] + return myLike + else: + sys.stderr.write("Vous n'avez pas liké ce profile\n") + return False + + # Configure JSON document to send + def configDoc(self, idLike): + timeSent = int(time.time()) + + data = {} + data['version'] = 2 + data['index'] = "like" + data['type'] = "record" + data['id'] = idLike + data['issuer'] = self.pubkey + data['time'] = timeSent + + document = json.dumps(data) + + # Generate hash of document + hashDoc = sha256(document.encode()).hexdigest().upper() + + # Generate signature of document + signature = fmt["64"](sign(hashDoc.encode(), get_privkey(self.dunikey, "pubsec"))[:-len(hashDoc.encode())]).decode() + + # Build final document + data = {} + data['hash'] = hashDoc + data['signature'] = signature + signJSON = json.dumps(data) + finalJSON = {**json.loads(signJSON), **json.loads(document)} + finalDoc = json.dumps(finalJSON) + + return finalDoc + + def sendDocument(self, document, silent): + + headers = { + 'Content-type': 'application/json', + } + + # Send JSON document and get JSON result + result = requests.post('{0}/history/delete'.format(self.pod), headers=headers, data=document) + + if result.status_code == 200: + if not silent: + 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')