From 80f9ef4232d9de482ed2ca042d4111e3b7f484cc Mon Sep 17 00:00:00 2001 From: manetta Date: Sat, 30 Jan 2021 17:36:59 +0100 Subject: [PATCH] updating logbot to the latest version of xbotlib .... woosh --- LogBot/avatar.1.png | Bin 0 -> 18987 bytes LogBot/avatar.png | Bin 18987 -> 15643 bytes LogBot/index.html.j2 | 6 +- LogBot/logbot.py | 163 ++++++++++++++++++++++-------------------- LogBot/stylesheet.css | 3 +- 5 files changed, 90 insertions(+), 82 deletions(-) create mode 100644 LogBot/avatar.1.png diff --git a/LogBot/avatar.1.png b/LogBot/avatar.1.png new file mode 100644 index 0000000000000000000000000000000000000000..893c2f13e6da67fdbdddf03cd12027e1d11336bc GIT binary patch literal 18987 zcmV)1K+V62P) zaB^>EX>4U6ba`-PAZ2)IW&i+q+O3^wmgP9Er2lIbZwcZoE{BuO=^ga)`!i5?aQCR! z!|BS($ViWSMUeyyW&p@M*8lt;_wir<^-l`+=jro>@_fPdpFcm!c%E}T4|4AZ+y8<_*6*Ls zUC)Dp-#>THzaRDaUW;GTdH(j}dF=D>-~S#9i!l?=3;yscxN!38rBQnD-F^y~HSwL9Lw{k3@S-~C#^nhIUTB@+mgN z-OrjPTVMO@__CYxYhwdDm~5FZCfLrtAJLQh*jBK84ty@1@p#s%WG`DQ=EO)C%=CTw6GB=^}<+`qV zwd!jC!cxt(9QCTTw#J~1M>oFR_(W^n_t0ZcJ@?YDUV9su&xj+9Jj%F69c}s^ zT>0!8KQ86<2q!p6+B0^{N5_sA?EnVtwP)w$V)WWM?b%s9PLVvj=8`sNI_(%c7?<v%mK>+YGG{SXhhOhg$9)_`BSV4eogy1-s+BK&cO@w3OJu!7hi~!hP`~ zA%(SvsectDB@%uaT;KB>=+q>p;u`qXTy~jBdOWdly$lTxW zd;I4p9|QFDwXw?g<@XAmh26RDb`AaeimWmJ%q3w8?!HR6bGUuKm(RW5 z7{|TXwcA#X-C)V?6kNLW+k13*1+LLj88x{vgDW;*c?}pw8)0FAydp5-O287>r|QOO zbN9XJpV$(?E82eDIq|H1^8voiFmc?$Cfu^Kl{yLov^ERd*~9JHx~|14RaT6Re2v|j zs~wimJM&t+=eU-;?hA)xI~<=nwEFv*vG~GoGxKEfp|U_T*gLMl!Y3Y$m)kps)MH__ zuFOX=zyxDC1x(?olO&IoiYc^hG;P7X-aO~uJ%pue?nNeOCSMORGeeoK+ zQEvtR*5njv`L1*3X}|~Ddzs@h7^s4Y%$wKabxU6v*E8#8|E^K`-DgQ`<<3WQZ+Wm+b%00Jdu&AG@FuR^t&Ox! zY*iGp#)Qkw(s|&>adsE<6x`+abFO2gXx=#e`vHC>mm0I^SNweY?{{BcJw9}sbhGm~c@Ml}?z`u*1J6tc#PW+X>WN&L&?TyUJGVx)Z%>BH< zCJ?&cM_EFXYj5b?6E?nT1XZAz#MTgmdfEzX7+?y8k*~=H`8q<(ZQivKGTc#uqRSGA zskq8z&Q@ew+dN+5DOn^ir0C#&~Ne z<{2K(8uI%xh26GigOToaFi0#ztBj*)H;LDKS=)lj0(#gHK6?4&dJCbjqs-S<4Zp^Z z3F~a@F}s}Hu{fBzg@KB%Pv8NYnk)?*1YOa5A`0`DfuvCnYp$RZtVC?N!1apwtY zV}VSK5C(tf6SHQnm}3l+kV5bU-0KdOyumFOU3{#pc9h0It=)6ohScnDz=je=N6hf7 zX6rlj-RBTx=nJYxQIuE9mlxE8A!JHy0Z#JJ$i;Uwja-2zf`_y?F(vCx9yOVqoFL zl7v}T;|IVxYqU0;1fw;qBA>-D*f184jXs0V3zo8kW3m8#RUonLUPhgJy>5qH+yu?Z z7w;pKA>dp?G^(tQ<4?YoQC?x8KE(@|#uR&l0)kGhxDsp27c|m$$UiiuA+rFPZd*3Z zN^;ndtbE%IfP#`BXcQbb5N7VWrjd3t^z(wS6T7@oPkzBvTZ#)48Hy4t9S?_%V8fWt zYn${z2V96~O|vuM8*2o_`2oHyTt!gy!o9>KrY*87%O%2cYYBYys23i5;R$uZDOoLi z>DbJauM!wHEOaD5@17MH^1#fNb!=Y{PQdH{iwNx|d=J?55D#>Q!eJv4&x!(xV*2=r z;rKwKElpqpIe}^NF%d%KRZB!b#ws;HijKQyvDf{4bQ(@S-~vuWU_l^r!`j*bz~O5;S25l&bj^KO_E6?JcenrohfX6(1>*M6e8T+Zu2@cq4+w zw8;T&MYFIbd>1W>%w_$Wp`Q^-FBIP{ENj3PP^5#QcntoD`|*6>>L?qp5C$Ns9QP_O z39`zJxUZB9>;s;k2bvQO=pkD;?GKAP9+QLD-?19|<~{lwV%cmq0=GEJ8)H`%bn|F1 zU<^XwNpM2=-SM#&W425h)LOM({IoBPR-VBmpIyglSZg>S4@Q0SOeAq`N0k}-sqJT8 zKSIGEj7n8^DFF!S5M6f)d`MLG8F@lTgZi?b5cVBc*VP>R7EmwzeNOSp4(4Xmym4o( zM*e<3o-a~g6d|&|57;Nm69Qy~y-RbPO-x7|C21srgBre#Jf69M&fbdv7#T!&Fd5iO z_D4JIr_ ziMuSja0JU3^yE#35qW;b42(oEqkn@DE5j?wN=|}dgW(Ytjz?PFsa)%dDY1ePlmk5g zA7pJ4fxx3XihI$U6eup9pa5(VPhs38HE|ZdSML$$TD7XBz^= zz;DBM?woyaV zi-B&o2IdJd0~u~57FcU57km;~;KP}dDSE;jloW?r`HNE=s~7xhd7e|1QXeo*5P!AI zG;CDMez1FHq}kN65=ApDWpRx$z8EPM9)puN0N?4O-Kk#pjg`+Aic26q-N0*q)jWP`WNO8-I3N#X)rC$)yIdQ4&ND{50Sxqqv63mvS6+pFGbXG$rE0ZWF?r0X`+?tMi)3kR)#d%X81K_n1u z7N$I<1b5kI=haDh`6WkOK{ZnNIV4vzFO$W=VTHTR-~ z0C8KmiCNF_XVP9iP-eGb>)u9zU%(82Z#twj4 z;*zN2K!CH=7|?yny?fD=QluhfZ9_}FH34D|XgicD8GRcnzN88l;DgxyP?sC0 zunI!MFP5b>a)-ZE<~uQVRZ07yC$3MDnP?OHxKHE{UbkwoM3;8YNGO&*Egg71rg~q> z$`f0U#ZV>qN9j4_T7#E%Nf364MFAK;*77nI0?I9J{F>Tb4l|am{&-y#GzZ{Rze-@d z0LmJJ7vpvVh7Aq#84ak^5M z$4)OpA@H-2k_wk@mTpxU#G11I008@BFn?bCdr=hw9VRg5sYt6Be_O5+BdPVNRVte4 z1sb~R#G-e0bg&+lanbOVms`@gCbKLgO3Zqtszm5pQ?7td#1h>YVnEjYFDdWS}Y0@+dSQ}PLsjQ{Ui zps(4<;Qb*CzUqIVR7AKCF>x3yTOalSF9O6Si-3!arm_%zqMn4?yp$FdKUf7VaE&uN z=yDd#Wu6Oel#OcOiokX^Zp$CD(3o<89|6@^G)fS*0OVbJu>qxo6}7k`>@g)EM(qf9 z0Em!9X3s&1U&;RhW5bi+7_1_JalwPLf&to7(4DRZ?o8u#6R7%iWZ@XZN6|l^o@0LK zoS^I@XfSJ!@RdT_`M%93`kPN2%5@v(us=pPSr9Vq#J1yes;$EsWpzzer<}D``TH%E zEIZVsVfmq{V$CDZ;AsR3WRvB}-sO7cI*DzuVjk&ixm6(9ZGw30c%!LwO{KrKUz)!U z7>Q+vG5?#GV-xk;2d6n}d7_&;whj4Rr4>{zB4QWQluAoJYAPr}W7Opr4O5E&mV!C= zLn*;OlmSx}#z4W$0Kz*F7-xpG3;Byo9G_wxgAzZ7G+^1BRyk zYX<*OcE(Cuy-02!-$NX#p*uhyR$@pjUBvRRIb*O@PFdSu8K$WWlhXLZejXJ=l^bz; zAbbL9FNG+o@GAHF3#Ef?Hb_0+i`J?FdCf3yy{?G7q1SWGcD@Y=cQ^o9=hJ_;AIb&5wZ(=*l z-|wolvusOvm3E+jh4>Y06(rCeX2qlbwQkEFWoz(hT{pxBaVm?FPj*l-62W1qotk!v zsDG!3T+ON;9^Q)W#XQ_+)q4R$JiA0IJf%+s^flQap%F|BIOSE%;)k++#tn+!74?X- zzAEZZMiOASeCud8)Yv8!mSs~OPP6ry9Xx(7F5wGIL|;pMFoc?bwgkIgL*^m7R~~wx z4wa}iDe7K)1UgexL2j5Qh7TylL_v0ai@UkNIoo7!G^_6|QoWyP=PbNpbc@aq3f_<>j{L9N}8w7}}F4Tgt#B}6xfFTZ0@ zyf-};?+6>pUIbn8eyC4NDl+UoErvXvG2Q)&czZ~BJm}O#4Id`S3_-t^htXj zADXb;@rievDEtX{dFBYI%>C z^ErzgBN4~%z{ER_BPOQk($v&iwN&*yZMEiQveT6n>Se4&_^1Grj=${sVVpGCr-%(W<)e`cAWUKl8j? zQ^JtAwiB4}lzb)iWfZ+wsQ*Yxfn-}1C@uhZ>S(x?8UoI*a6DZVe9&1kY?!Q)rrzw$ zA|Y`Q%1`t~(7N=?o!mixnxnLkC+F^IYSOxTWZ9k=pZUa22KXDaF+MopSDK>ueYI)TveIT!)0h;zednei=91G` za(iM}Rf}9u;(gPJIZaT({KJ|KO^H}c$XDdl@4`KTcCZxr+h&y}d@DC;_xoU$6Y+#@ ztpf?z#V>A!EqzQe85xc*4iUgsFjuq1T}e(~mE;37Vm-^Q7LBJ`1XaLXmU2l+88nt@ zQ@yBWso@>5trVx0FOTYF=HXb&6Y|35E1!b6#me2^^c_Os%Mmci5hsb5>{YNcqGr2L z*-7c&cS+TR$8LF(vwbNxt?HF*S9qw-t;`RLMvJi4Prd7c3VG$O@>3RjYF-s1?v|_c zN*3(!^n18hT-%KfX*W8o8tQl8RNJ?@Mpb5103{eJrD>F}bTwf#=y51YRYs-xhV&y! z=daMQRM%X)6jPLP+Q|ROb{(5v_IraBewKD}IRzne(y#*wa$AiCg{6|;!lMCJXR+;3 zz;fCz-8jnCyISp{ol!#8{3CF$`%+6A&f9jXO$&R-SXG&U7MW=kbWc<->KIOETb_R6 z-%=~j(t))47-tk4QOr@jZ4;7Y>#Ejwt!%b_XXW55^HVHCt)u`17e%KgQjFA(tX!=( zSo@37Pwlc>vh`P#YjtsTMf5Nl>qr*mlHQttAWQ+vFrpOV~JDTs=PIc-WIiX z?-ClX`hz|a*hQOE=&mh*QZruv~NlZL(>lJiW zHQg`Lbj*f@Q0$jz*=6~c_JOM?68E52QRiy;stA`mlxH9Kr7%1F+o%5sf+|WkmlkIx z43>yd)ylM3`0{h%l~!P7xANVmB@P`3j0 zBR@+)c84wN|f{!|mWaFOB-IYCvWKlzk8TNQD{X2l(s@ z?_tOGG=^0hb-KlKqWHNJ@(?zC%AX4>fN-adDFZyZgp|4s1)lf0i~U=>bJ55 zuYO~UdBjnWmt=wN-hThI7^wz{3=GMV^BTso zZ_G!f8v||2{EF#xbs4FcR!7<;>S+#)W>snF_)Z?O>DN`FT9;+;_vVQ2B~%{jH7!Il zu9sEgDza`-KS^P=@_1<(ls1T@)H%W0hO&{qf|PRNu7#I(Ui0w31QAX-%+e@^^8tKG&d24z{NAPQXaq_VSr6%OzQEnl|mwZwvm(@<$h*mhZxc z0s@i;<@1ZL6F*yC=WK}TC2pxF$tgt|p|(V-W*rQo57r?RH^;rRHCDFNt~iZo8GW^; z=AvWnbIBiS5k^4>{II~G<|Z*Si=|4y^R+|a&vMz#5{pLo<#6g`@csSZ2om=*>o|N@ zOt8kzY^C{IjhtY1@p@fkC&ocMw@fk{SYsLx2Rxf?5A9Z3IRFP2ipJl#aI-G<7L3t3 zTkLIG^YO%LB^z};%Qr0VZZTIiUNuWw4P|dkvQQ}WvhDv@R3(~5vru8a+hs#}{`sTZ z&rWHMTgQv~LA+8-H+&`s9N`Jx=P6NIud@h zmgl@|0o9H3qb#2zLlK$VfLN7Ffc$yUvArxiM?=I$}Ys=TXHU&7U( z@9!SkSHjg31^IYZj{Mjy0iR)9cn@>kO)F^=w2)(7cc1=>tEmo?b=(zn(;1Ot)2rVE zbVzQtS@Bf+5#8d`YnTCXU{2DPjXDUsEWfzrRf*UPGKB@1Q_3r+Qt#>^cE*Ye!5sk|lE zoTk{!2;Pbf@U2Sl#@wRQ;bqm^ZaY==BMe?5)YtuFG1rgGyCSNvTnC>t818`g+h|~y z_14rKf<598-E*c;trteu2h{TW_^b7noI1u;)*;s&ZyziOO4gz5Wwk1Ag{UKGBHnhq(Hb~ZHxImC zmNy)EOJl8$I^%TKXzYWEkEA@Oa`x8du*!EBy0567bI~kF*D>Q2T}07Q1AAlKc=E^Jr4i`ovB?tZ|TQqX`a^;4NG6V)Zwm0qpT z1!9}EC`1el@>0lcX*Vi~3&kBZ_5lKemKg(o9>j~L&Ry2mNG0en^=$<(9u%V|+G59U ziT6J@WY|l8RT&7F7`J$ig^}MyhN5%X*ZXn}`<;EY?P~(op0&QJS>JjWeYNq#T%r!) z69CnFcQhRb{ts_~5Y~}6<&pZQaqLq-Clo_QpxY*g5!=llTEE?RSD@#*Fo7IpmgTsA{)Dlyn^$HLV>lsaXrZSIa z)_k3X#aYP}ORZXQ?$2pNUB&<{RyS?m%AvecC(0kGP;JboyqQl{NCtFF8~#X~G(@C| zzq)8FNgT?*lP zJ!LT|D}gBV>^eAT?`GwTq;^>5JGPpiViFgI>Qv6q5Lx-208`FH4c*GM*RK3M9^)<9 z7ZltfbiQ~im&UiNEhtrTSwUjiA6z0#$gcSHGx$Q;^9wg>TXsB zQjVdEI)o=U;Ubn@in|u;mL2+768t*dSai;+_zz~sXaMm%wnQrZ!qA+#nO0A)%S-M+&m7(oxi}Zv*fL%49E~I0LK1z|(Yd#Ek3%V4(~=tWw~)M5bM=vfOLmIr0;U)JU(b06yxEd^T$*hZTE-L$*uD z9_miX>2i(T`?lNkaaD_;Q*CuR(|qV^0=(ZmNs?sOu3O1J0*(bLE}fyHTI{KGUH3wB1w&Wz|lIv&LQMI6kL{F1r&FtR!7X7n6$6$U@3!9KrC$)8B?^)uk z$8BK_QE>vQU0bAbPf?j7q>QrL{dJZ=vaFcb&31Z5xL?Q2#JzN$c2x^U`yi9(6ZYY! zL6apg!e)-eB20J>sI%MW+yNFT`c=e{j#FO8|LBnfYkrW%$G5c4sS5@e2{&W0&9CtB z=5(NxsKjO=o+E~iE!ioHXnn#ds5NUm8QiABh2_QBF-RQ(-i%WBsccBZ{J=%!w4)B4 zkEG&W+|edWzAx*c=55sip$n7l!wzr)sY*2MtfiQWrEbwYAH}I_Wu7Oi1q3$l9x5Mn zV09jk+OQ7stZNAPs2#R^Sv#6sR`shw6PAzgn|&pX=gCLkseIfciaLz@(nX}c@s>}j z)=Ky9LxKAMxz1e{v-Q`QhX!TAryX%kKk`^%z?XEj18=ni&3xllbpv!3o5X0t1w2Jv zCP3`B3saQ-xOBW&r>!k*hRM`S=m7@qr0d4Sjl2j+fE08TGyC4voUBYg2q`6xC#8Dp zAk--Eqp6;9f>2Hv!BRIq@U6>Y)Fz`gb~`f_zCRg`SgW^gudI}BlR2}+9US6S-cQwW zSJdGMj+bluc-$o?yiP5{NVaRK1+2^N7GWVpT7oI{(RIUCWkL!NphNb!&h!!+)efKS zf|V4^byy$WRqlU;7`ri~1+!KQFdsEDTC5Q}A)H=C39Wua-QcFLd^H@WC$#**Xk8cA zklWHpKc4LJaVfGCbtMJxdY(ylS*e7TiVC-WzkYtvs87~S{GDB%=C<7($^h+nNDN$# z&G5QjZrO^ncE(SbI^t))ZTWXZIri&@=XH0#$|m)dSg1tXncN6N+b%Vi3_$O(yV-WD zqLBU{)K4AStGR!zu~&nVy2Q{f>D1$sj^4}&8>zYpK<<;RfchuG`k}qkx!(0F1r70t zynAXoiX0Cy57lMZL2Pa6^xf;Sub@+mmiv6CHCXE4{y!OrWb)P~n^=}`Mi*4xq5 zR)V0+uCh?!Nab_gHf&dU>Tr6&^3|Sijj?Izw9M|fkqYzzrl z>(K0o&yU9j%R}Crao@=Lv7}Q6 z#g}d;>i)1KUEZ}S$a~r2x^*_)$AEg#8>nsOGgY;P{u%K2KOOPsfKE4m5p#46b5(V) zANv$~$oSB}*}dU1>+Qov+qra8rZVSA`KSUge?VM`6XnlfxQDeP)~ROHQgz15u(<|@ zw=1TEC#F<298`8Av8YzM0rF3E>*&Jf8V&<{-D&|K70=H1el0j7PmfAOTHxRdQ}@j% zuX~rX%g}VesotvZD0HASgRUrbL(LGn9t%*YK~KZ>M~OOd0Zm6psFM=F*C8~`)K_10 z4Wc;gxef^d@uSnSu4l31h+~0R5)8A+pjJ`xTq*7AM)sEIV^z$_gj8%budB!7F=XMg z9jY{bYl}b|Pnn-ivy+OA`l;WMzYFA}+^&jZC0GPe69m^_Tj@+Iu z`JcHDFw+eb!A^Ugw~iDjAzF49C!Q#oRXzAI^tJ$=Una2&<9-7?eJhU1@1&jdR zwaqzI zR+1xP9V&I$-Ko~nFUo21--<8FTHZn#U1tQ!9B-HbWYo$6r62JwG0lTQFusy|&Wg~|RBqG>ARaY>6 z5(QJ~DmdU>-c3beilkqb+UZ8pAC9hcK12&NfU6JP3!+1PHXCIr_Tfw&EOK_1?cI_O z#txlP|6Z?4hXr4w%&$?z^3rjbT!Vw`+FsPBHM_kAY?bRzoeowHp=cRYb$ zs`mY1tGj+&&;n|WF}8!E9%^+`9jaE|MK)oj<5Slm9r1HUoMliz_&0OodmB@KFt=5) z0w5<7vhl_luaDs%+Zn6V8QKld+vkNIf;Iqv^FWP}qx<6*#Rc^TgT3yPZ4 z*n!3K_;u3}nk7j?s~PXB+2j6?lhe^+G~2#sG`M``@8MX?b6;fTZ(WrAeUX(_lz&D) zrEZD+Q|TuiS_y9p8>*K({r7c%gsT4(#E+m+s~oA`-?wEQW#iNO+dE^|%p;)3+%1O6 z&f3b^&AMh`Gfb;06u7!@*@pHk0{Y>wR-gi^4w=sG@tsQ-ol z;avKkEz*BML%EIz(f5r}LUg-_^^NFl-%fb94q0msi4q$9-gx)I3%9dvC?{91eUnS7bu8F7+{B{8}K_=83pqZJIm0 z{(~p#*x@CP{{{4WHNinFF+ujx3rgDT%96i6zHQTu$X7dC5cam{eX;mGVPUiEWi7Z+WmS z*|IHJl;d4?NP>(=VI)cfvCII(3;<#VBnQCE+@5N*0L>(xDiqmw>E-Wp{&V`A za|Lus5UAfe&<#k`wHoZe{?>sU_VG2^eDV2`>dB(QN)=b@Nqqy0GH%4VQe+2QlJJ7l$7!JA^xt|t z($B1?CbSB?s;{>ITS@cBoTCD*w)>lFM|PBZQ~+OC z4(M7SVCNl50wj=a!p0qz1H1+tO)LP7PeJHw0?B~?ukdMSZr=g+J3BH1G@P{@(wwE| z$L|4;+u`^+@R@HZ06pMy06SCLINUA)!y6U=A>cjlu^jL(K7927bv=`TS3VC%p8^>} z6v3`v5+LhNe~KB62ucYRX-TIhp_1tN$QyTfGqF$q*0qGNh1#@+OVSrwohHsT&Gu5> z8V5=bKgAp6=wq%fR0U`$)(zzY3|6ia{!&~ zhmOupJ&!<*lhg0Vt?7kn5={R#?1*g~0BnRe8uc^>BscL360LEd2CEhh_0XScTqrRQn`2>y%>)YhJ;O-OF4|uH$MjQ!v8@R)vfb+o7 zUDL|0BbX?`yYyKiL2^M#?wXlbd*}O1M%TG>>RFHpjU-`i<_f`I-9AdrQ+~k99g_Dy z2A#1Fp2v&-*1;o02)#8gbW4uiTf@@`d?VA~4<5HF@SOlY`q7V?3BTZfj^ppJ3wUk{ zo^UwexdfhY0Ql~1IF_}$^Yx?fhYwl+{}ULy-FY8);`mFDfE4hZe-|8Q7Z4F4d07e` zJ#jlA2=VzbJ`aEYc0f`i=FFZ&0wYc>%M#zjKKsCJiFJf>$tDjc?fMk|FI;1(IpJn! zh4hd&nB64hJS3?B68k41px5yOe4tOizgh4?3W)j~{m$MC@m{en20lV7xF+cEC<;yb4)I1x{5RQU}f?ko%d%_uMYn$XEcz zf$Ws^JWnI>9ykqgOah!aE0N4-LG(FKM1yG{VS|KAS7r$w8G4wUjt68i1>Qf@pfgb% z;L*+jNtfi&cP?lS@TjlVIOfD0<<4%79qTp#BncebcduzTcZ_rFpcR(pB{=2)K%t!j zHa6hcVGBTRFO1!x?H0#rSGUDY;s>r3Ooa<jD&LDP<7c?FNJ58zM~6!wR4B8L4jyJub3n`)ItZx8hNVe> zjR+Edi+I0;xT((o0+Ko;O{=7`zKQPC+f^dm08wwx9&M%HQR+Cn;ds8{7LU^{SKD`k zf{Af>g2+#Z^qgZ66J;b(EWs1R#6(5~B(a1DPjMX{u?&c$U2rS|qR1+$3cLh{c;Xl$ zGHT{hS&7JT!r~YrVO1a&y4{MmIBfYjr>b6dfL_S)Ul`9${h!F%o zyLO%q?b@D?<`An_$R-)^1m~G2#~#Bk6XgOue z`FWxr`X-c=#1dW?(5;UqQ2^(I2HD4-fkd*Nz{Q^r5d6;W_mJ}hNQgSN@&3L06bE?F zUCu+Y>^fqIrE? zT?DK}mIGp-)>N|Rr$bPiQG$f1;key3h&G&<{kk?g?)x=Eg323OGXS(5cW)(LxS>^= zTjYd9hdf&p5XS_o&FeIjQd5&PR+}|C69qzz8mnB_`z@)l#wv+Xfwj2K>e{-Q!CF0J zb#23_Ky4#rb=Ai3*4AKkwP`?ITZ7eFs3xCy)M~JL-AcgP8mtD^f2hT<+O!d)S`$_` zoOr8*)io;tYv{I?fa~b@rRuAeBm{4knsf-|EX*`Z3@luwBgujXvsB0%0HDAUc?OLN z6q|G87q8h6ef2W=#Xhs+g$wKCKWk%Rg)8@wKQM1{W5pum4=kwN7lJ|o^6MW~sjI}J zSUN#|w-v;hG7N^61B%0tuPHF3fWiZiKdZotCCrXN{&h8-NWg3W`Ge~IdJNMi7YH7D z=R@R#iaONJ)_C7tI}8V0eR-BqhXYo)$S8;KwCh;vc%9KbSIq(|%K@W%?lcmxvg|Rs z=diiI*uB8$=pn-ai;J%?I{Hpy=&RKqFnZ`NkP##v3vZra^ls}2)#qW<;ef>mMiUD_ za^a>m4wv(+Ht}W(SPkrS8`v$o4~Ej*=!Gkm#stIv2-{?F=yB zCx!us18RvA$CtDR477bqVl4sxhj>EbWWZaojm*u%azS~$OwLmhP)RD3*M*UQ3Kh!q z7!IgXrNj!pzOuTpN_l$Kj94wLQ=VQji>sKn`c<#hDVNs`39ha}xok60l?s&m*Np^J zt5B|3lB-mp+*BGQJ*Y-db|j#>2IVE|2UOQ}TPm$tiJ@Gz5>RPEu(-5nIH1z3P%a;! zBWVF}o)SKywIHgL$yhU3x=!hD_Syv=jVK+xY5=Hui5MzUg9R2CVXu*ZBHfJe4#NSL$TEV}@wtp(q
Q0%NS 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
Q0%NS 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 -

OMG

+

{{ room }}

-{% for num, msg in messages.items() %} +{% for num, msg in db.items() %}
-

({{ num }})

+

({{ num }})

{{ msg }}

diff --git a/LogBot/logbot.py b/LogBot/logbot.py index 12b4b02..a13ff4c 100644 --- a/LogBot/logbot.py +++ b/LogBot/logbot.py @@ -2,92 +2,101 @@ from xbotlib import Bot import json import jinja2 import re +import os +import shutil + +output = './' + +def add_to_db(self, message): + keys = [int(x) for x in self.db[message.room].keys()] + if not keys: + new_key = '0' + else: + new_key = str(keys[-1] + 1) + self.db[message.room][new_key] = message.content + +def del_from_db(self, message, key): + del self.db[message.room][key] + +def write_log(self, message): + template_file = 'index.html.j2' # Hmm... how to read the self.template ? + print('using the template: ', template_file) + template = jinja2.Template(open(template_file).read()) + if not os.path.isdir(message.room): + os.mkdir(message.room) + shutil.copy('stylesheet.css', message.room) + with open(f'{ output }/{ message.room }/index.html','w') as out: + html = template.render(room=message.room, db=self.db[message.room]) + out.write(html) + print('writing to: ', f'{ message.room }/index.html') -db = 'storage.json' - -def readdb(): - storage = open(db, 'r').read() - messages = json.loads(storage) - return messages - -def writedb(message): - try: - with open(db, 'r') as storage: - messages = json.loads(storage.read()) - if messages.keys(): - keys = [int(x) for x in messages.keys()] - keys.sort() - lastid = keys[-1] - nextid = lastid + 1 - else: - nextid = 0 - messages[f'{ nextid }'] = message - storage = open(db, 'w') - storage.write(json.dumps(messages, indent=4)) - except IOError: - with open(db, 'w') as storage: - storage.write(json.dumps('{}')) - writedb(message) - return messages - -def deletefromdb(id): - with open(db, 'r') as storage: - messages = json.loads(storage.read()) - del messages[id] - storage = open(db, 'w') - storage.write(json.dumps(messages, indent=4)) - return messages - -def writelog(messages): - template = jinja2.Template(open('index.html.j2').read()) - with open('log.html','w') as out: - html = template.render(messages=messages) - out.write(html) class logbot(Bot): - help = '''Oh dear, logbot is here! + help = '''Oh dear, logbot is here! -@delete -Delete posts from the log. -For example: @logbot @delete 5 +(You can speak to the bot using @logbot or logbot:) -@bots -To see who is around :) +: Your image is added to the log. -@uptime -To check how long @logbot has been around +logbot @help: Print this message -@help -Print this message +logbot @add : Add a message to the log. + +logbot @delete : Delete posts from the log. For example: @logbot @delete 5 + +logbot @title : Set the title of your log. [future-feature] + +logbot @style : Edit the css of your log. For example: logbot @style body background-color: pink; [future-feature] + +logbot @uptime: To check how long @logbot has been around + +@bots: To see who is around :) ''' - def group(self, message): - print(message.content) - messages = readdb() - - if message.url: - messages = writedb(f'') - reply = 'Thanks for that image!' - - elif '@delete' in message.text: - match = re.findall("@delete \d*", message.content)[0] - id = match.replace('@delete ','') - if id in messages: - print('To be deleted:', messages[str(id)]) - reply = f'This message is deleted: { messages[str(id)] }' - messages = deletefromdb(id) - else: - reply = 'This message is already gone!' - - elif '@help' in message.text: - print('HELP') - - else: - messages = writedb(message.text) - reply = 'Added, thanks!' - - writelog(messages) - return self.reply(reply, room=message.room) + def group(self, message): + + if not message.room in self.db.keys(): + self.db[message.room] = {} + + # to debug in the terminal + print('------------------') + print('message: ', message.text) + print('room: ', message.room) + print('sender: ', message.sender) + + if message.url: + # messages = writedb(f'') + reply = 'Thanks for that image!' + + elif '@add' in message.text: + add_to_db(self, message) + reply = 'Added, thanks!' + + elif '@delete' in message.text: + match = re.findall("@delete \d*", message.content)[0] + key = str(match.replace('@delete ','')) + + if key in self.db[message.room]: + print('To be deleted:', self.db[message.room][key]) + reply = f'This message is deleted: { self.db[message.room][key] }' + del_from_db(self, message, key) + else: + reply = 'This message is already gone!' + + elif '@help' in message.text: + print('HELP') + + elif '@title' in message.text: + reply = 'This is a future-feature ...' + + elif '@style' in message.text: + reply = 'This is a future-feature ...' + + else: + reply = 'Hmm ... not sure what you want to do?' + + write_log(self, message) + return self.reply(reply, room=message.room) logbot() diff --git a/LogBot/stylesheet.css b/LogBot/stylesheet.css index 95427bd..bfcadc4 100644 --- a/LogBot/stylesheet.css +++ b/LogBot/stylesheet.css @@ -1,12 +1,11 @@ body{ - background-color: pink; margin: 1em; } .post{ margin: 1em 0; clear: both; } -.post p.id{ +.post p.key{ float: left; margin: 0 1em 1em; }