From 8044a7600a33fa5e218cf4d6ebf55bced074443d Mon Sep 17 00:00:00 2001 From: Marsisus Date: Fri, 22 Nov 2024 23:47:13 +0100 Subject: [PATCH] update added a way to get what room is available at a given time --- edt salles.xlsx | Bin 0 -> 35042 bytes main.py | 186 ++++++++++++++++++++++++++++++++-------------- parse_colles.py | 6 +- parse_salles.py | 65 ++++++++++++++++ ~$edt salles.xlsx | Bin 0 -> 165 bytes 5 files changed, 202 insertions(+), 55 deletions(-) create mode 100644 edt salles.xlsx create mode 100644 parse_salles.py create mode 100644 ~$edt salles.xlsx diff --git a/edt salles.xlsx b/edt salles.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..bd15c6387f0e06d6dc08e824f3d017ac3a3d9ed2 GIT binary patch literal 35042 zcmeFZcU)A-@;(eApddkDK(c}g3{irBb-g*;`cV18XJiOq=FBKb#(&`V~`@P%Reizi%ttk z<&YRd2>IX4#ErJ7-JEQ$yaCtD*UiS;6DRkk z@yWhSlD?>l4-R=DcZrZIIZ@~X}w+F`ncrAdX9#Kba8=#r0_epELCNp-UWM226!DN za7$eq19KQN6Qccp?)ZP$2Y>UY=e(Dd|IBj3YeVwXyY*mjA_P}h+FnSq`i_e0o5$lg zrGY7TNhj)Q$Z%Ci-l9mj)w-Uxk4^9fF1Oy<|G}Q)k4L~mU1p!_6>)6+3LSdi=A*cE z&h(d?c7uC^`%w~74zzZ)!O-lA%p~cyNow)_Ezv^UZYFh->-cG8UW9y6?wZZA8sGH~ z^N>ZJ)DjRc~6zIp> zJfd>YePQ0PBN|hWf9A|67u%{t#g2E#+AYy?FLBRJvxI%?Yn;Ou&g-AETQ}Q0{3$cP zgADbbPV(`fwbdUu2r_UX9AKH(=FIk%HfH*kmS%{&m8vpnIm&|Tnox4_X`821_D)Zx z32NHY(6Z|mXIoE*TX6lqbeU(ofuC>ipkFblvCR$V;?~_hs;=&~cddll>@wski_=8L zDFmbv-dA;upE{|IQKO_@sFZVfSt7Hk`N-K}Ywzn(-$>IyBit<%DJUqyYWYkeHk=R=@vQX}NE=ETxrp8k%ESP`Ohg5?v=eIPh# z0Jp``yz?DJ-KsjX{UeLmbzJ3e`uaSf2T)Poc(dn6?A`_HIsR&ddDmWw>zQ)$xUU#z z3tu;jjXJ`AbDy+NVv9}c7LVkoWiIp$k!4)^1l7#xpzuKcR_Lgnm=lY*Kwz_=W~rLK zbWGS&cZgEiN{;LNK?9vVe&$4ZvWRca}Kx>-S zr&;htMKKju{+?v z{(*wO_lZ8!5AUiYzWD|Zs%7U+C(1SbwOk4h2~>Q%)#a7!HB9Vi7=9)H`&Nc{0=~m)_pCReRKRyc{SIgq`drgG@aqxMWx8tK3al@ z17+_H@%6{NSPn?NivxG)4?l_RU)!!ZHI#MeGW(Qrd}EF*TbcsS!RPE{d)vEJg3^ud zJ!~#Hs#$b)m5wiPcM^N4Gbn)6k#?ZM){YuLAe?zXsiSyi*N z%xO7^^xOiy7|amUaD1{sizyw3k3*>Mzp*b_dp6v(Ht=Qtz|EZzwz9J2%QF+~OjN+? zw9;C1gd#ab*mM70Xv}7%QtFnrkg;D7cRvMxw{LQ(q zJ$OWCU*zSeh94|#gf%_M8e|*z9vtyXj@(Ty#MFu1%AC75>}UyAnVA2{!-uWc7k!F5 z`r8%jrR@ue4QBh3_qvM}-c_%3b=AZ2hE6Jk!cXsDRDY4u%g3PApkLEr z@o$;Yd(IXZ8;j|FuHZnxL7Pf3_T0kB+|&o$e`Etl439aWuUysJZ(zm#(pVd%w(C8@m|?Lzatr=x)7PWLDGWM9j6%F9iB*~G?;1u?V* z8n}sN;@n!&URKFg#CvAATQj*4W$7UJ(BzufI~&+;N~it@Z=H~}cooeUdw8WMm(F1(X3jur$?k54X6 zck=5mR=ksyw+wV2WFA)Kvq0DK#1OY} z^;r4!CskQQ_>ZfyBS4d@4x0R7&=hilrnnq5rS_mHKLAZ74rr=_KRC0w)^u@@w+vIpgz_w}njS+GLt(|N}4hiz$9HCeEd*QYs+-^bt9 zs%o=fy;q-B4Q9Yarv)ox{oDy}ROIBgOMFL%6dv zeq-l_qigqp1FJy&0uWD}+yUY}8wl~m1BCdl6A*uVj1XryLx@M8$AUKgJa!$H(9xgJ z@3J1|a15*Jc43uwlRK!CpI_=;;y-BPJ>#BO;6E9WIjB70Jv&=xn>0$3aK?80ViYUk z?CS8vC``h6{q+|kKM7|Y@Zl~ozC&T{?eyhr^`?Ek#CSG^wUOf&m&Kd*aT4RtDXb;d zs6L;~+_d+X7$>E$rg{CP(&-DG(^VPtNNg7JXO9|e-z*{ZBd4SM)qv@GcCqMRn!J_SJ+3YK= z?J`D_+{7i+PIKX86Z!zQnD-8`-(ow&4$PGdJI&R=TNAu>z*`@@4UV0(WqZLVc+2*IPbGE>&lBF543k*?m<$cJU*9LQ9i3{^ zDaAzdCKsE_5eYTZhle9i#Q2>n{G2OZLXI{^pxe`#s?njj&VtG0wb1<52nP3|8y?8&t>MV9SnLji&&Ba{WT&rmH zZZ*dVEqV}a>Mpt*Y>ENB3pPcC&IFq>JsHo3b#>ZxS#(uC?+V_PU3KYlXmxK{LlKY- z3QItm)6*^UcIo7{9OKTNOPzNe`<4h<9URwC#l8+G@y<#lVUj=ph5ouW^q z;FOj$VOd zMfn67jTXl_`NrS!353^Vx&QOmuU_$HsmQQOz0dVR56hgJQC`XDb1yWj@ z!mB7#T0NW3h{TxKH??4&#X|iV%EQdY`4nfVzE0qYy&M8&tmaH^ov6zu_m^k>mrcDn z9}%Vnsb(SU8Dx<8)~Tha|5NSc3_oIEeZ_Cm0b$-kNn2o4e6)YrHlv1T;lG5LKLnzG zzKc0nez%YPw9n9{@#|$?cT0)Abbb6DkD!vL?PXfQTC9PV%?EG3F844pu1@!2GOkJf z^`^2}Rvage%Fw0SB!rD!V#i`(oZNEfFFF5-{N*86GSVQQ>@6`8z{iT^hBhXcLHxB$f`kKqZ@Ja_y@u|0)}ueg#X zXSzOLCzo5S(--p%w07pR!HVsfe&;@D*l-<1?$#46FW7+xNrKg1hV_5jyV&Vx20%;y z=da5cj|lc(qnC7i&t{bG?K`PK3wJiWX@z`i!(RK=#ub}O2bJAxIclZhwu(kE;GMx3bw9+w z8m^@0LMv9n^(|ah!ru5*`A-yWpOfhZCog)T0qa_z#j;Gjo0i+e8>^J)jSJ@gcNX=| zzwT;_2qG-if6TB5LpQ8a{5GHR!)kf2D5LzH*Ut!z2-OCiw)udt6q$b5da;)|>2g zhkHg_<`U`-FnwdJ%pu1@jm1LA$1qKa7q|62Lnq|W+ePdnBQ#l5-lmW+42~Zd;M|nUVbE(i8Vb9~0NjLUex@m0g2RZu~A%pEN)pG`PGu zv07Jbm|r3J8^@M^?eAYVwO7%nhJnBN`ZXUm*lMs%&_BDFQ$}3{wtlvQlSC(kT+LY6 z=H4f9TEy4hD_5jd_A@1NFEeM!@qXoA;I=As*^d}Aatrsa?Q)M<6M6~jnwTB8xf2Vc zu$i)El{^ld=-;p81ABZsR2MeIh^{G;O3nIuF`!bG*Jt>~_&XivPcW=>Gpnbtu_Lba zA`#EceJpc)<{!}U09V`B`JbFSCl)j=O@8MF;V&7H4nr>hC7(Sq?GwVRR?_z6udj1! zC2S|$c*j}gG*cdB_p8OjK=@vl^AYBn{QR4AxM9ukGb^4XPpcze8XsiEDgFi*t^?Y4 zJFl>EkbW0S8nh|?3kv@-dX(93xBGwX|Mt+h4rz2dRk?EtlH;|D_rq>d3fC;9&1t?d za(%VyQtaZsjNTIzdkhP)Y&34YutLVlSjp|lN0StDj}pc^_faS2W2@IgdM>U+P&Z*rh9R^_6;fzLl7BDR%qi~ivByP&45p8=fYi2JgG2sD>*1)1iC z^AD_?>nI?6n>GICaDE;-CyVsg$M%1I9?5e5^+Zy@`V{Q+!ur!`WsZG;ex=a31MNs- z1p^{>wH^l4PDLTuYV^dhwMVOoUTm?)d`)5{tuYg3bhhvP`VeQn{=4a%6{O`p0zD_^{F6g`=Iar~Boc(?Uh z@axjfQbVg;Vr{b$ENnTClG2;lDyg}-R*6&=7G5Y26EhyNOi3-$AA(||qj>1hzM*t3 zh0wCHCU?J*(g$*CCPrlMB(2t)iT`OW*0-@=t4bZd}hR~FO(Bw3S5M@M& zx^g2#I}oBqKvO?L)7ZRVsf1I#@9Rm~E&P~R8~kS7ZOV=lVXPP*i$F-T21ay>$NUIK zuc&##w29vAZ=v#-uS%?>Gk$5UzJZ}}(CSG0f{&109<`G#=-i`~p32fQbWp8FNnjiM zLoI7xrVn&SBCvTqw&p|NQIRQo;v+qM8E@5;LOy@ZrgKw13~JT;g4rE!2$i1=1`u?; z`Ka!s)QZ_pX-o*+5tNmkwhE8x;ewDX2>Z8L6?C?t^${kHEo3!k-1hr6rE1%BGP+yL z@_MdcWX$!)HkZHvh7cqHJ6r7N*{KXtFKKKffTDiCYCbetOzYzPEib0CCGqpt*w-Wgh;fvDT zXzbZ)pY!(@IX{R@M=&hRI$FNT?x(SA-z*Bc$t^T%%WC7gZl%U`>>vbF?9nD0&3-ICkY$U3K>%bUrs@9X4^{vcu1=1VoQ?#Yo@lM2&Z`y|R z(!`6*ZC07zu6~l12`5f&HnQKSY0K=m#-~R&zSAD75Tkr6i&cJCJDo+zV7;V$)+GE} zidv?X+yggkE@=7yvSLRON^<)bv+$@4G}Dvi0YQjpaa08P1U;KPqw2I(tiNgEw#?$` z3ndg()sA9SL<_%cZ>evIh+q-m9ov=;!rZ}E4;QF6x3s2+A>W{#K=E-GRqq=WhAt~ z?pOrC?r0dm?kK1LI`?)chr+eLm_vXshyXtkcoT;LfbM^&*f-wbRM>DjbV+vq@iDkQ zRrlTjvx8H^bm-)H2*(RXAF?|(0j-axpJcQ?qJI%by^`!aj`JDJul?&#n-e ztz+pD5!&JEosH0nx7z)Q64_a9q9Q%}H+qg*H(=s|UX#di(zlztpPJFDP5Ks0oiQ?S zzaJ=H%ckV=^g9_moZ|g_;aXEr?G0U5Q&z61^Q#{mAP~psrmSELH%UxSx2pIiDtOWs zm6*Zp`RTbGnYkWtJi`FZ$hFXcMgr0BVAN8UZ+50naDN0SI$eP*c#q;|>Oaf@?c$l- z#=+(}obS__r;p;_ z1;}iG0OVK)0#Y`gyB~cV&?TvrUnK-tiROHe$|tF{cD)(64h^vJ<<#1B0Mq{6?1A{( zqN70bf6iS65P~mvsjp-(9;p9Qv45)=O{txXui2PC@ZEnmb|3gq`b9*I;?!nq(*9i| zM$eoSkacog19lK@^ia+bbLoc0f{!*q*HKYoCDb_2dN)RRh_Pt>zQ&RLJrL*wXK#jP zG(L4hR3ywW$Fj|-2x%UE&~Abjw$WUB^0 z%e{A~5oG*(%886xhkdFgNjld*Z%em(%BF6eFOZGN>)YEO>Vc6V|msoT_RzY+#7q8V?p+d-em#&@d zU-h*W&7j_GRFzW^3c@8%nv55O1Z^I34Bf;*b;AiQL#!NywkAmZZcJe8 ze_x_<10X!efU$+*RiUjn|6&ds0CC&fuS7LOMC^|m|5U|V?|0_b$%EAsQ6c_sFY)X7 zzI~6jcK$XLX=dl&qtyB++W1NG0v4vcRZf3nVOPkjpjI)x*smV*@WjgIUP}y(^46-D z7loqT2b;(~-djQYfmk8QG!NaK^~Ce>bSRW1wF z5)m<@C8xa{rQRTg!`AF^t4?=HSMOln{2wHcH7?XDaj?)f(9bTjkvcn>9Qr63wgf~) znN*>pNy*eIV7Wx5u{V^Ey8iYfVKE-OrE8EijWo&tYEg+rE!)gi-N|Hx*+vmStN|c^ zCaw#_U4K6&sRiznnhWmGr`8M57)7A*i~R5A5NH@9(D=J55NM1}+7FzF_I3p_xlO6# zjm78%F^`eJWC_;7QZnj;ZP|&V#GJm%ZC-78#27nGT-1fBL4?|QPrMHL;wkmY&kXaJ z(0|_JL)-%{wk ziBL|hGGY{t;q-3t8qnYLsHnOZi~_UnBmBV$_yf3M?8SeMrRFwL02uUefT;_*p^$x$ zM1Gb3-5df2@J&YlwhE9$i1s&}a9ooM63nmr4L>g{7a`XzqqHfQ=5Sp^Gu z4dFFWZ8V;IX!((vlOseA$+1%?Ul;P!xCs*Ue=<|A(oJ)nPKBPUZ|UBmoBskQZ&(Z9 zE-*z;#OTf+MPBEWp?}xL_kg$76rDwl%We=`5Q6=*6h$M=4k^hhfksVDrIxhbWnnKv zpRVzKv$o;hj!rC1T$%s`Q9^B+X+WDnd%q>f+a z3O$s-%}lcY`yyn3=x@Ycgp*tar(6o>`Kq(h9@r;65P(tbT7d3 zDz}3JfwO`7(+F|qos&t0ACnU8TEe3eL&wa_b2({=+|kB|oo@WckEdhhji?t~f}a*^ zNp~A*EFGi}d9GA380TR`uXxO(sayNEl2aY{@ZR2j!gZ`X9mGe}>_BI%W9?<>$xwP@ zT%htjr(r~MgfoT~VT;P3#QQgjYQdEW!a>bA0c1ZVXH`XlI>!$VNlzdMf z)dw}-H(TaE_nRPbKXOX}31{bQMEF+4_bdKs*B-O)K)oBtOPYGU8iA;lrP1|>xXdvN~ z-cV?&TA&e0!P2SdSC((bd%=|kty*t_n7Q?R7$}a` z#AmK)w0P!(dCc1;w@oG|$g&@u9PKm~G8xXK;tYRnd8~ z;olO`kTbYp0;U&!XQlFAUSPH5bF1Eeqv_R%s-BMckSu=uMyo+1Q6R#vy3HX`JvxRBcb9Gx4CeZL@i=+5X z_o${IBT5@%K}eS-2Z@5GnKtmNUO_6pWN{RzqiFYi;B33*S3oyVTy5#wRpDKqcv)~X z7@4>Z#DS|}0Wbp502n~NPb~!*VAhMk%ou?gJHp-mEhes()hp=p=X3v91t>%Fdk>H6 z<|f?gdk>8?M=^OIu@fA1@wWk1K4h{%;ge@v;zQS|GQzBFT&%ouV4_SIGul)urgo65 zoGS4l**hy`R{Zv!POpPg1Q4Dyq%5=(5UPvoAU2!JVq+$0HvI)9e=eYXYI<12P4t5i z%MMEdkxJKXXL6%WX-DWtT2DstKYvmj38Nz)GyX;xzjyo|drh0(>97}{eto6z4aH%Sa8q!czv%*ebg5J> z{}odTU+f%Ft3k0h0uEcp)PCwXiltr242eg4eM_NTV!1yDS`#IjXLmkO5TA;YpGuN{ zniPn6>=d$pdrfHcEhuhqKt01J`BwwtqyPMcX~LXZ8?w)u_3_{`^^jJ$Bo|Dsos>bD zw^Qcw9V{!{eeM+9wwVp(BE)oxmv?Piyh@!QCvKRPkpIKkjz24_vZ0XaW@U8XTO|R? zGqjm;!n_}ORyZ3Ewo#~pJ)iU4Ss@OMXynRobwnhf?s6GVz6tmDtQ`)CTv+uK46B&l zF_n%=%S7TBx|9ri*6LlaQw)dZvxUN|iR}cQEE6$pL}#>d_vqv0NV#a+JUMO9=-q>! zKOlJe-FWBWj)P9b0QR$8t7ABME3_2lnzip5q#I5?BHl|Mugdc#>_>aH9TN0daScgD zTZ1P;trSHvHFyA9P>eE*{EeS<8aR0`l9Zw-^m2e42Qm)!i||q8cZ;Dy!I|WOR02LA z!+}kYjtEpJz&C(6s8*1GZvd@*YCMQw1oV{rRt%900Rix*bN^HYf&j3aa^WeGFF~n( z+M#w&@;od_H|vunu6FUsNU`vcQV*FdyE#=^_hu?MEPKqG14Mkem;+$$Ja!tlj^HfY z9O89!FDANz;$5|@)t_1Gat)z$Z5D>?y~_dhCB{q*A-g4NAjwCIu`EwIA8|32D8*dX zv{7?8SDXbSpO5m^SIdnr zFi-H%gnMMNdJibgIpxtXTx&Yr+zI$Lm2{}Eg)1O3prm(bwY7X5Q^htjzCcjS8`0IC z1T_>iZ^5zg3OG}A^E=NbSp^DgBuebQyN8qi5u6E)Tym`5d3)4*gPa2KqOmAdL8KTc zBE>*d7_JQ{A*%W;1f;*60J#U6J)m?492@>@4nZ17BS?cZ1TpY8R3Iu&rCQ6Recz9! z)|`GF z{&?817@HH$y0&YcZ6z1(n-MWtCZSZUhO25AuM8Vcf9I}S7GCDUb6q5=nda#efb;Rj&B*okcFmn{b2J|MT4M6&Tt@%$;ZM7^H5ucy;sa*xfg~{)n z<0qmgWn&qZgLP>U)yL|lBXyU2TP~io-YoSCa-t$RjA-Qm=Z9^_q0u?87f%U-{({Z% z2~EJz_~j6uQV%H_5S+te7-YJ`ehVXl(s>VC#IqY`)^pEZIa4(@PtDlLaXE@W?Aw{C zr`7zln?RP|gjUmr<98LV9lx2q<)?b7k*MgjU%qT&=5?U(g+XJ53|=lm>KY}(za?d; zOld?>n!?Ju1)0wwq7S@XPd={9H8@8*zVyTupx>3jfJZ*i3EfE%tUnf_s?FCu6NG#} znEt#(fuZX}tG#-Mso&JpO7vJU|469G;0b6UUE5*TC>?zAdd*xN7;5LeaRIXyhH!uZ z5EkEpkK3U?`;Pa4Z>&Ti_%$OX07Cp@fX;so8iYrafJ1e6D!}qm(Vh%&tRXf!0O;Qz zl$BLmiXsrcycObfXZoGUtoTj!ikb!+tqf&c^+a#l(@al2fYdNxFHoABV$i4}%#J}Fx7ERYN3+96Rr&1+ z_s+>|Fw$*ivW=AfDMyUAU!1%e>-p7221Taja6F0mL^ra88Xmtpskxmxta7>_%GWDM zt2Tf#C=i!MLo$}BdOGuZIz@F02h>QDhoCZA^khd63_mELkA#_1g~TKf1Ay)cL4%Md z5%nb|Q}2ekfdR;cMjBBcF1RG61l)o=;=BgAP-r44{G0?9_o)GuCfSGHew44F=ZISO z0-)vR2JGJ?0KoexlAsDbN6-s@HuuZ&64g^gUHdmwAn1kjNlwO7(XINi6{|fvF4q|m ztOR3ovsLr+)z->fLySSMINS8~ z>SY&@sRgLE*{hid*2Y>K>9m*VgU;1jm5388v)d2X*i4_>nT$Mm_m=sF=X0EoTb^Oy zSaHk5@RiEoZdJT2LD%imdg!XPw~=cC!G0@dOFk&u8>jQC7M^Cf?OjEF?)g?7K{Cjz z_XatBqN7=Ma(&n6qSNCw%u8T4^Qn;{MZG4yk-|ay!5$nBus&e*;!OlMA%Wl~00jrG z5nRH*=!IWd2n9W0)76^@#zCa1R2&HZ2~Y5<6W3%#^&TSbsRAcM+#)p>)Bzyw!4Z!d z0M$?ne|ISZ@XCiGTuk*k@SkicMBMwcH9*}TMK#hIDehdZk%dn4jh=X(ofy7Npk1|h zBFMvVI_-N$LbyLha^iP}%V(2W(5=yOYvF2We_JcV>Q3u|=g!aLp71P5XiQ__%TNR= z#0mK;mqZ+U^>fam98(NjYVe6 zRu8bMVaXj1Gg48Nfm@DZ8i~y;?)@`>1HOWEG_(pA6rNM*WN z)fXGoHhU9JYD?Aj?;16-@mx-@mpNiQGJh}tGLG(%G=hx#2q?6Q(JVlMtvt<;*d;0l zoWr6j8Gx$R4+S`sx^<$Xp$~;3VCfu1#hlc#j3p3PfbDCn7s5HG06Tx}mj53Kw7NjR z=ImMU0!%Dtfakc70#{fWdkyS6*=!WV^CzOJB}U&ORu*s_W`9*`87t*(BP0)0j-F7C{&|l zfgG{K>fFlGe-ggs8EUK#+M1|Bn#tN3an+n$rFttgPz(iM(?=u2wN}bJY>9&5WgdDj z$KR>aX%fKuJO=_3+-eVg=nd7bfu0vjH3Iwmc*UJe!h#JI}WC@j1U|F|!z{xHYJgL=w z6Qlld9J&m1Pnfen?E7EA>kqmw{~SbYgadbJx;P9wv9$b9{r1_L`5$#hF$$bH*hN@W|2c%8jpB? zR~iL$N2)gW`-UBS4>by}F|a$?p>*bh2N2ltDhzsw;M55#S4?egxra86qKi)NgNJKZ zd&-aB;3_wm%~;iV8(W2M-J)l3of2JggzVq)V;b(ZNy13D3~$5Pjr`dvBh&=`bMS&m z@%+ZR+Zf%)Q`#(hoE}zc+N^sp&CCkp<%JT!6`bB(ycxbFnJS?Ic5-lL0HAObh;cxQ zVWj|x$AA~axc0*wCE{T4K!KG4K2;AzxI#E$ueT#S0Z63g0@*$_u*xJGtS?bT_{49- zelGvlTvO%$kpDBa-O%u@YnQhKglYKJB!4*%_=&;3earb)%P#r3=-Z7=qnXsda)$bIyd>CEa8yC25KHW{*>yU1%i*w*$B9;HjF&7rTGR;8g&%dm_=$K<0FBxo` z_dE_$BZK-8cxdB85wsb0`=ZM;E6fe&oS)FdzHdEs;&FADU2s!Nu;kxh0REICAT{~t zuS-%uc=T(k&O}PBu4}!e)xqQi;n~nX}5B6S{yOWVCWr zL-sDSI3{(%ofT)huB_Y&TJ2$j=|y#}V-Su!twFZ<)zpMV@fguRAKEY)f5#vRKOWmx z&Cn^yz36n_Uiu}Ld*n93%L#Le={%MDO8!x{i>UGK zgH6s_93&3(z0F5yfUfGIDTOFBoo-P#+iodz1gUDd7dD>gIC=G}TQof+1A?|3B%U=^ zTkt*F+1_GPaVw0%%#%g!&w~NCAJokIPBY+Gi>a}B6fWN6pavnxR2;zx1R#iMVs}7U zvt0q%!w@`G47d$AP%v~l2qs5?7$C){fe%FA1U}Gt4fuc|;t?f~H^~NKCBGHZNHe?& z_<=v2`==@p{D9%Ci&=#{J9RbroLZ+OwCse_bR@vsEQh7*NAv_u<4vj-pV-?rnp{KR zu?>xeK#$|56ioV+Z)iSlB~$D);?eWZn3Tk_4eCpk9$q4LX4FplydSwCY2wevqD|Q` zk`-^NYJYE>M~BZ@x%w25?%hqc`td*jyNtp!RKJVN9Q=0Usfrx${XX~4P2-P790|JU z=EvZBty(YPdxAdrGV<&g=mB)|=mEr~rs5bPO*b@4X*_EpMY6pNc=FW|51&B+L!7ce z=NW3qcHd2DDN4FI;~{#|A(BQZw?Y%TS9arY_Cs{vQ(lD_6v$cTLv%ptSYWG6O9(Jm z$#-jq-1=Hh(`RN13z0O+>TH9Sa$oZ_vy)H(!qTWf10Ze?KZF4*Qggvt*Td{i1Ss|g-9KZ?*~56mN;AN<)I_!*5F&};IyRUn9f`I-&*zVAb$a^f*~XPcYouGaSgi`TQ| zn3(j&gaOX%ZH+;Lo}uzA+jLY$KC#p`id;hmLNL`HZ6bC~)K12{AK0Nzq7)d^0+&Cp z`T1xK#Hb1-4t{pNy73K&q5)M&yNtq27)?}s27%m81(n}7@GBWQGN$>CPY=$2UrZMhPxOxSq3}%O`b}B9AdDknX}mrq+n*)2wz1n9Eu^Uh(Y3cuEB5 zQ9O4%F$;t}9@z?(rXRRyFma|;9g-N0ZCp@QlNlu|YjE@Lt@qc~Y!J$i#>|4hFwvw+W7V zh%QyyKQEYNH%dl3C>Mj0HfjP(RN=9}{$QHX>8`X^!mR+0`?pYRycAgbPgeY1t(<&X zXHqKS9{U5|En#&!@cqDtMh8q~sxkcnN_(8d-ScEd^9Jz~@tdhEJ4?vT%?pPa2}JxW z9*i{%0aZ|zVbuBbhH=8k>MJnaXB3AV6j{8Gc?TvIX4Lu8h8jrZ!Id4wXZ)Bln(&#S zj>^<4>{~M#?$Cg2hN2P`&!{e_f2=qA&MoyJ-O;?p zU=0m-5iJkWdS$I}QU!yg`5P*FpXsGJ*0l7}+x2Bn)FQKrwEOGG6X@2okl{JQ?6#g! zPvuBe zcMbC9SJDQwYd%C9sWVdaa|$r20GOIq(9@ez2AoSsBdfg=J7g=JuECe;I{++Ow=zKk zuwkSC*fhNb*t`bV5aIv;e+XsSY4T>4323?s4|Yw6+%R|gIMGn@nlHTCn>NdCox($D zZJh6F+9*&bRSG-6{b0JVeuowz3RHj_sqon203H7!s34!#l#+^Awk#-LlCkgVf3UY) zV_EXLnsYr@vu6E4!Hgwq+3S`lhbW_RTsaK31lHvomgSlTZI&Gay#ZDCN+uRg)cLZ8 zaY&?7-4aT;1XSKLDgm=Y+TDSX#S(SCw!wK*Rsb`lFK3TAL&nT*eDCvYMH${hVFv^2 zRF3B<(67|?I1lm|y*taYHv{RV?^+OPDQMtTvSk*ahKq$t;1U>`Vj2{;K|545LY>GG=?|lR8uK(GJ6;^M!@GxA@hY)? zMA@nS>9M24H0NmAL^hWC8eaFKu%(USNY}6}JRwC-$^c754A0e*yL)3s5cSjD~YGI1Bil>D}@ z*WoJi2kfq}&cx{F5tBl1=Q|_?SQdn6ms;N0W%`}ih|g3A;q_vMtbeWLHvdrlS=5%+ z-lx(StDXEAljhq#>J*B{qDG0J@$RDr!&1R_lSP(7$3fVV!0UB_-i&*Xm@^G}B4!Ir zPmJ~V8Zk3qRsSJJ#Cp?(WDc+j49&-Cm!JWU0k>%3{WA;1*n0qrL^{M zL45Enh;kJ#hf0CFh+a6JO>t5kujhKMC7jY6%(uQ4pW$M=XePyrXkYHH);gCbekDE^ z+m0G84OLgk!!eh?khR1ZbJmJn2$HX74sd)nKpmdZ$lD#@NEhH}FrcM3;N*Tp%aVY4 zf4ZJiqfsC&i&b@JW!?e(zGcuvz;S>X)Aw7$0kyI(?QT)B6@xc4bB1_StF0_2_GjY-+Y_{;gL$*E1WPTJx^MT^=0074Km@hn2 z{&DbKpjjdZ44Z;`WZC_#j;s8=Wo4x`aEC#;0dH3Fdw+Z79DPipI{ zyqU+a{Q-U{YU$-xR>SSWc1l!MQ|Wd+A5y%4m(n=vz1sC03;T#%^78^7wd+U2&AG3O z3uH$|i9vEaNNE}U*n%85;CCUJ^WRi?dX!DjX*mS)M%`yLQ^{!sAp-L{Xb;=@ESb98 z`^+2;SyW&{+o&_ZDUA6?Kj&+>r zfOhV1|Hh68kn01gKWUYK%#oShtLxRS5n#An+jGeL3M4PTINemICNZD*JAI7!WAG zD^hvT#@GgIZng?w7#;x*kyq#q;>2?t5M!DtK#U3G12Klg2}B=`{oe`dJIl|JI00M! z|5*FWO)kI3&-?DT#g95YIBz-lPIF$aH*xaiVp0FJk-_MCR)_celE?|NS5H@mkxEyV zHi2Q?ivdXZ3d+vuk^D)0Ggit=%mmj@P)jcbz}EQvD*z2-~r@h|5n8U;Qw%i%KP{Un~!Me=GWvsgTiqiUFB z!XmJfgHf~kY3EHwP3f$Q%=47v;AH{$?>q9#0$CTS=gR$VN0Z8Hk4tF=<5irLe(h|_ zn<%Zd4f1F0r;di1%ES5o(CLQrW$)*V7MuR_j<0D#=Kf^^tbNjZyrSyrc5!o?vYHbq zFDT@oJfGqjm$1&WdCzZaa5;<=xj!U<;NDT)oC}VZIA`z)#T6d@v${<)UY6z1cKmQ7 zD6@)AR*j-V#d8D6{^V=5hPjSrE~!%_T+!x zS&5e_Nl!fo((pK-c=V5*IbFGA4v-x*5!vDQ9T3PlKp+SD)_~%F+F8#MH3RNqjD<+S zCFhPV$$KsoQvRfzr`)@fZk&+HllfMjmU}hix2I@;X92TL;+Qx!q6Xhr8fXJ zI!?gyWP}T1uN(3G&hU`31#o6%*)h^np>n+N`y#qKQ%9PPp<-<$%%jzFTKS4w$^a9} zBp1N!JT1~SANQ?ul$2D*`lM&I?v=Zg!RMz}xc$21^X6a#R9!Zrq#_mm^DfZKc?GvU!C2Tzt#z7?_m18m>U`vSe zy|;Vg?syjjb`bEvKp(c?QYeV-U`S9tjXW_GF;dwr^@r&G`&j*-Dd6YY-{yn=wc_`g zB{8E9Tj4UzIGJvgqv+;qoQU%jIPr|Z$rqXUiQQU9utA~M$V-FSKk9ydW^Lr@(1qC{ z=3dFbqHezP6N9XA^2m(fR|lTmj?d;1g@Z#p@t*KpDNDDOyMxg@4m82jp-*%dO$y(7 zJlBK@qvwwNP938xU#!~w{9Akx-v}NS>+i*4(sm4V)O{006bjFZeZkeow)Y)l@F#IX z4d{6uvCOp2i7U5_a3gDT-x-ibZ$-T4?g@gpCr(gw9i<{a-U&B%jEDCBWv{c*l&79 zm0a|k*57@;#;3BLg6ko0{*VFkZPnujp#kj zhwvg28*XI*2hHG_u_!0>Tk0BECgK=j>ifqg;v-iMwkxk;wAVT^d3f{6Jp z3MaL$-ixKKPsICbjzg~f zQqU+9E*4Ri&7!PjM>?5Tga^aU+_VlajT~A%lrb5?P|%9YW|QzljA+$kvXz!rm6o*o^enz-aD8w89H8q&HE_9zObtIyU_t8IOa{A1`QHT7Ywb?;C3(3z>#YF1~xcS z5tD%<6&shzm=U9{WNClS0|n54f-SliENPE?1)*CXhh$CLINTT}^UUSM{5WFcP%t{uGhWIY9q>t(uErY zuu6J)Wt2hQYE#q1Xi9ZitPeat*f~Jx%T7C?=%Q5*F|VR8BPn3i6%kR;Wko+Da6qwa2Q=UoRdxp<$`ZCbFFS3$@Ldq;%=uKZN_X=_v zF%0mx^U}r}S)#U5oo3Q6&AK$DAe3`dg)@HlLWpkLyZA1eSMf^$W`kd|PWH0!t9QwU?GjUwbs7iv)c zqPbH7Z0y}5oMm?@?Yqbq?%ksVsH=B`fV#rf1n_}-06r_p^KTEXA^xgMt>mpGAizoN z=Brn^P$zGEzgq6MI9^EgTr}cAGG)TTY>V~0t)89R-OJ)bp_0LQ=r{b~7UTMV0RwOK zM4j~h2<3r_hYNCaTn(|^E4fcu*k2AC7nXj2wqkzOAO$Mkbw+pk8ZvVq{3jbyEBBXo z95gxpzxKX6s;RB%8$m=sK&44nkrpmRX)4mCBQ=0Z6O@jCp-C5MD!q3UX#oU8ii9Fn zKspGBp$a4vsZv7EyMtcu)#pCz)w{lbzO`PJ?d0Ul4rgZe?3v$e7!4MsVt{H`egK%m zLITJJnJCu}0x*X$2mmn5_bNoZ&XaX+$?){+%M~qqr}vc6SuCM*4OsnKswC~R^(D8) z?7A+s%NnDV z@FBS=zeJ2^Jstzd#|i_`N)6D;uM_T&m83{34lj_jRjxk3cmc!>G&t`(K*SYD)_s=R?frk;<4>%+((cO3LAf-PB@^0#*2S0 zs+IpbJCnNZ6<0K(F(x4=Q>abYe(BP@4lBr?rWM_LrR+5;((0fA|B zsDcGR3>7Q_druHAs9!#t#-t>Ft^@;>7R@BU#(>u;K8v30SSCs&9UKYn$V~y${O`o5 z7V!cwb}(BhB@!6>uM_T&G=P_LlmKIw-g$zgSTN#q-I22xt7fpJMq&{XW}`I{w%aMR z0~(joU`pWUMF6q~@(Vo2cW_+E!PWMZlQJr_RV;=G5(Z5r8Cq?JgFTiAy)~(}L-OYQ zTuLiZOjkV(`%R3FLdk$u#uc7uiw|TdBI2s6>^F;19dDFF2l6jTch<^yy=9^oHcrYZ zv8i`fW3$l$>Gedq7vuWv&~SmcMdk1SSWWC{GN6Wxv^9-~g3;~;JqEg=UIOZSlo@G# z5>oU^I07mPh*HW7cZgIXC>_j*L<1Np<#dN+e`k*!*eri}SV~n2&&ohv+6Ip5Uk=2* zVlnABza?Lj1|n06UL(HqJ96Qp)jKctO80x%LRVbqY*+Q;M~vRJVs@zG8&US1;cSq&e(Ts-x4`9ov|DduAv? zCNIM~%?SCVKHzmsaYg%)!g5WR2Xk(IO#g~2T*i7*lCtjNhx&071Nx^9l z1t=z~n-p*nWw&#*qx|Y&8S67S`uAlN<)==GL*IKleZobJ>o{D48LXB8T$b$yLQBBh zuL{C4q@@@LM)Qfj-y{|@;2Zg!qu^KBzR$e|y-5Kgp#cIMB0ezrImUF%Ld@CjvR*0k zp3G_QxT5uOe;a=d4x&?fVP5EB(>`0QvzG-kNOs32UcKzlB}9YBlq!Cx9#g^Heo+3_ zX8E)H-M)MC)Or&fQxB(*^Q4i>H16R&H(Ye#J=6!(CM*!)`fA()rEDdx>-#Iz0{T$# zf>#AF=BZk~Mc43pVeMEQ-pi1q`Zx3uTF=I0P$yZH?h4)Aor)ohtt2L?kKz#AwLrA@k}!>R3d$40Uv8=JPX0zDwfZ-S@@=HIZM}z z+WU1Ha(zs0Ic!S{8S!PJCo(h49j5W$?@)w`(t^w(Zg!+D+sEWtXDfn%GbP4BL@egW z6HwdeB?3M#6a6T&Z_P+ZU8N9d`3xw7j0z~j2NXgD)qzxxkN}NIf}D;XMK9;&Aqr8axR$4}w0%^Jf2>4F-PJpGE4RP)cJ zF9&(jpcN<6(%t{M4ZeQY|1Wytes>C98H*k$;*A3M7|o@1Vwb+5H;g3t*y%3 zjviUb91zKcCGbOXPC$i!-^F`ApX&*l6?5>+Vq8K!4$5H4i-n z3g1>9&vpq~5?DF0_%QU*+^u_Cjp#R-Q@r9K6b_{Z+ZSGLS=TE}Xxw&bqNW_Km9 z0_#2~jfPMFJ+0u9HgTY*Cfpg5O&l7<0`xSAOY=N{GQZw5n6~;=Id#Dg_90M^;@C5ntEMWOUhi%n*$Ews-#SRhlO#x2GdgA$B1wBW zg(_|R>e1ucqz%yQnEc*XGOP0!+>2+Lbc8xht!NdMF5lQ-%)|paT>D-t1S^!?`wYpn$uCKuh^J|3?k9^zEiCqQtKh zsNa$NChrd);0C!%2=GR|1H4ghWxc7yu7tXhHa{QvWDyd+g4s8fxW_r4>A}^S|L?i3iFL8PA7ZlKC~B4sZ@i6p%xw6@zP-PVTV+baS~6r z4B~#yvgxE>jMZu z(uY`|%iKi?xPh*9Pu)ZydMBmP3_!d@aOv4cfWinNj^$*ZOaf^ec+-kQ7(__FPGF!W z0zhsyp!5Oe`dwl%2NZ*HQwERWP+psTx57aYlhsA1I}3#~U5p`dE8?M(?Yp9U3VM*5 zeby^K;vR__B2e3$VGTs~7fIB&T9d!s3P5*B+QFfNTcqHe&dD-&hjTU{&$eANOBQdt zHmu&E%V1n|<1T^K;?RS{Ga_Nt#R=3=>`k;@IcCElJQjwd4@z7@tBXJJX#e0t3i4}=yrWt^|RnD*tR4m=ABQw#=afq?q|BFSOaa|gMDyBb>wIP(D% z)~{*-@Y~-bHd2)=vNLdb4#1ZDH=d5UYb}ojIN6abhLy0~I=Vn;W*9%BI+MXacL2ra z=&K_#VA`8&)^a22h)kF~Dz)|CR2mN2pnCJx+Q*ffe~A$7%d`7OF#VALvfHM^Qx`pj z1=D%%6>M33R&Y0^Ox!68EzvdWO_zC_A>%OHL?bw9>%Y-zX0;^cO+oL`{mGYxWo@%t zWmLMdUWD{@H*cm?AiCQ*BgNTS{m%??jJc_gXC>h*gwGoAL1b{8u|8P}16Rb?Jh z81Hn^+8(j-AJc1)aSwSF`a4rwyO+`+GuK+C#I1W-quk-|#QLU~t-d_9`yreDvC94Z zEm#(uS-WB>Frzy5v@Ii zOv%O_;-o=_h5dS1rFgYNMRG->83H|-ndVVOcS(_c2^78J`Yv_CZxkNDQ&Nu zhIoOnCB;};bZB-F7&#~ff%}FJv6leg?myiM-H;)8pAHTj&B5x%`572R%r7O@Uz6{} z6W>_BCCZ{;KRB@ZUnX!X9_$Ae2WOf}ysM=b7}7j3=u&M9Y&yll-q6Rar&Z*kf9|7S z?OPU=*h&_o2XTS^?K~f8j4s3uI-295zLgQFFiaY&prUvq@P?8xQ4CYGv-*(KJ)-_= z_NH3>F6!e_{zPo5<9FO-Rmc4_(T7zz{h6U|>T^>0L~m8c=OxbjL`7PK<)+lWlk8WG z_X9l~oS z;I!92-q=%=4a>pHB=GJAGHn4G{XMnJ=UkNsAqV&+HX!71+;!XP5_vwkm?Fh$?kx2^?Vuh+nqQUs|Gnx`MAa&*vn+ z#35V8IArTz3;>J|1^FSz3lL}FbP1N$?-1^gZ;HePWlS}O5i21x9d}yLzm+>i1hNDbhkIx$I?fX+17H3EtXmS?k}d(n6C6>6yMkNN zjkqf~q8)byx3>FmS5jsMzZ%8Aum{{D6=k1f!j;ti-NOD?+t$IF_}Nk3sPmcG4D+7q zMj7pQ)$9*pw^^pW_m;5hHG4y2%=+8j*x6?9{WkASKCIpT=bC*~Ay%MNVsEkr8;D(F z!G2lV$JFdLEIVLEeYKP4jcP0T+ZrNr+JD#4Hon_mr+FL|&8|F`*i3$2-PGZOP&5)< z0M6ZY7<^ElOR6kLgI;tokjc51+CiMz>MG39hvk?I)xZld#ycXOBQet#cIT+0-M-r4 z6r^5=u+Pfb&xo;P^~8dTfL^D5q3AME4lLBp>y%~X9KF&|rhqzsa z@v<@0{VSN{&-B*G47j#n2OX7OaVe;%tzY{?sjHn^r$zA^caipmZUJ3Q&Q_JK2Sv(X zNNb;GDUm2{v9WC-_zmT(Oq8rnJTiZg5gz;02!C>B=;KV>G_5JEc}7<3Ag;6Ae|8%) zV@zg!N`Qy=m>ky>_@LXEqlM{RQ@(@opwU>n?mOEd(2}65fR-UOTPk{ zOwQ)UVhTIr5KD@(_f@XHn{D;Z=#>!L+MSL6LtBn?uFj1&?heXaNxQ8_LGBj&muD|H z1F?~sR9EZr6y%FeW5!?KN^e-XFAP!W^bCu_AGQ@xidj>me;s$s!-1{zjEPBJO0T%^ z8)8A}Cu>$6elGHZtt^vWEGdj(Ew7I7_cz~N)}6GH^l;dWmN*PvE^Nx+JwE&Bc@1XG zp4m2QeUzr<%7&*=>NSq2?mE4F4zbRp)z$UE^{~^E-pB^EEb~?SiB0+NxU*t|g@k&I$mF7Yw>xV|jkTulzT78}dvTN*u>sYlyE4Fb&pzjLc@t&kc2u5CQUpmP%{Y0^ z3xn+5JSE~l$`1Gm$7YeN{jyENCNv|Fk9Z6FQY5@noLoV-f(y-<^D~hZw&!-A@$8dWK6Mw2W9$|&zIGwnB9oj7# znf*roItk{n0Cj5O~t3}0ySY#&{I5$re_qU?P0wM7Xzy_3CCmDieH zUquI_RpLFPfKsy$I&nw_!=o=$+Bc^1Q%?9M+@GBabgDGSBf9EP*m(QF*uxEZJy$2P ziF=21XY{f%5LYBPrN(>Bc|YabjQ2*>{Ns9-T+m-31M9g6^!z6Kx}F^zU2RMqa4iEH zb@Z%pEdyERC5~2CzG>`?yj3Z9jm-bq;=ZUAyj1%y{AJ1c3(l`KvU3+=`S{>15(+V>Lkx z#gl7hGC5LsXOa%v1?SKf3{5dW6dbawAja9yo5u;B7Yt_&L{o)`ohxU!KiWs_r#Q^| z$JPCl$EDUr%A8?rRwjdq_spD`Xyncs>Fa7*zCs_j`W$#pK3}5$kk$IAVz%dm{7d~j zxft{@djsv*KeE*tQYszdrsU5_dND+@APko|F*-FTxEzJ5&11!rn=&J_q!37@sPW_Y zrEJ%S71s^SoJmhHzvwM@mBje@HZ|DNPe0)faV%A}k98es&Sg7MB2w8MY@au`$rSxi zsx-g1G}Rr;dIu}p66aT3YBo@I?%|5T692`Joz_QBpY4ZHRgegUpPk&5)VTE#PnKSW zk0ICe2tNJ5>q`2H>-B@{F*Eb~w+t*_t@>Ix)-Et+t=yc&Z}J#pETeGKrgykW&-uoz zziFRdy8&~Pjvzg}iI6oW(oZiI!x2E35vA2>H?O^%@8LHRt6(e3-tH7}s~l?MJs%g| z@^XH~t!^T$$8G+E&CxS8%rvE_L)bn`mI-%pc!TBDxx}UU;~(kfGD$ljTo#2&w=E_O zuQFtQB#1|@v>HF%5a^A~raWrMfFJ!CdO6BFPPO@zy`Yt!{9XIgR3DSh)jeIXuKi>} zuORiAXENZO`At0jpp8N3NIQdjvCD$70#^^-MOzgQi(kC-GIXGR{SNX`J>m7UQlAqQE z2ebEzQ+Fa*USxgx0%?7&G2g>rbf#;4Z(ppqPM);kFiK?+ffNuNz*juI&ra;p<>$Uz z81c`IS{+FH8gZ?M5kz=+RNvN(g)z+Zj+P_L($@T7`Pjrr*(LKI_g{+n!V>I6x%!!VB5?$@?RYe2+t4~c;y()QB@+3&t&&f`B z)R0Gciw3dq88L?_NYC$fcjUR4uPi>iU%(;`J=5st=6NybeA7^~AlcqbEboGN)34+LFyQQ+qR$suZ@JFcFT*NssSf-WQGtx!lQw=kfPzzt};L z)@7y-iRfk)74&-VdJVKj$?7QGQi23n-qE*9VEW9fi9W_nXLjmHDxap0gh_A#eiyX) zz6RkOq$$Xx>W)fEfC?YI09!!CO%vXm&kJ;dk3CcMZCi0e(o zrdRa74YFOAio>cTLl|A|G))aH2F~7>c*9c1vFYMtS1oZC9w znI3cg@X2}n9%7BhEqE8wqZNnl#?J`(9_88{xVwjbnHc(}A|jewNCSpXnfuHK_7$G(=5+i(9_^R}fPirdU zQ5~u=Y1nJRRoRmZ+ha-2#hqcz_MLkp4r+7#QhDB#y2;vT)mxYO)sd>;`9K!?}Cb)n@0# z_Q*w>#s2`pSGzBo0u0re2HP_4d3=#DppkCavOU8-esXUv-u|kR?S{ir1zq7hn0?t z$S`D-WvQnZWSkM&x6UDaDy`{B-_~pBrn1E*#%H@!A!Mbf80)Hy@^kd-j_gKFls45I zS|~wJtCc?e$6cCnEaFuVuq@n8ef;m%Wo&Q%f5rtw_U%t{WE(E^ki`&gQyj*eN0l5U z@ikFzBz|R~PN4JZsU~X>=QWb4>o0fKnG_$fau_&?@Qq%o%6KETSUq#zlvai-E=Zc> znD7AaywaAwn7(J!SxP^8k7L(cDa~B1#l3rzs6zXfWZl!{o!3 zCP;#NiOvw=kmB;tjhD@ma}}JnRLsOOA?w;MG|^ELx!G9i{B)+xFUn4Hrv_)145m{E zC-f3I%(dE!&a50BAbf(L#>fX5=558Bb@Cu(V2&63bylHvJol?6sk06})yRAO(Cg}{ z`Jo5OA7@f^#BM%Oyn_iOtBReVy~9|m^ic+O{L!JnA}+eyW2Q>zLlm9v&gF7-qzgVL zT0B6(c%0Es}s?E>32JTh?t6 z%|d list[app_commands.Choice[str]]: + hours = ["8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18"] + return [ + app_commands.Choice(name=hour, value=hour) + for hour in hours + if current.lower() in hour.lower() + ] -# réagir a un message + +async def day_autocomplete( + interaction: discord.Interaction, + current: str, +) -> list[app_commands.Choice[str]]: + days = ["Lundi", "Mardi", "Mercredi", "Jeudi", "Vendredi", "Samedi"] + return [ + app_commands.Choice(name=day, value=day) + for day in days + if current.lower() in day.lower() + ] + + +# réagir a un message @bot.event async def on_message(message): if message.author == bot.user: @@ -36,99 +64,149 @@ async def on_message(message): if "quoi" in message.content[-10:].lower(): await message.channel.send(f"quoicoubeh {message.author.mention} !") if "j'aime" in message.content.lower()[:6]: - await message.author.edit(nick=f'{message.content[6:]}') - + await message.author.edit(nick=f"{message.content[6:]}") + for i in range(len(message.content.split())): if message.content.lower().split()[i] in exclusions: - continue; + continue if len(message.content.split()[i]) < 4: continue - if "dis" in message.content.lower().split()[i][:3] or "dit" in message.content.lower().split()[i][:3]: + if ( + "dis" in message.content.lower().split()[i][:3] + or "dit" in message.content.lower().split()[i][:3] + ): await message.channel.send(f"{message.content.split()[i][3:]}") elif "cri" in message.content.lower().split()[i][:3]: await message.channel.send(f"{message.content.upper().split()[i][3:]}") - elif "di" in message.content.lower().split()[i][:2] or "dy" in message.content.lower().split()[i][:2]: + elif ( + "di" in message.content.lower().split()[i][:2] + or "dy" in message.content.lower().split()[i][:2] + ): await message.channel.send(f"{message.content.split()[i][2:]}") -# slash commands +# slash commands @tree.command( name="parse_colles", description="Récupérer un fichier en .ics contenant vos colles du S1", - guild=discord.Object(id=1292935532472565852) + guild=discord.Object(id=1292935532472565852), ) -@app_commands.describe(group = "Votre Groupe de Colles. (1-16)") -@app_commands.describe(timezone = "Le fuseau Horaire UTC+n (laisser vide si vous ne savez pas), UTC+2 par défaut") -async def recup_colles(interaction:discord.Interaction, group:str, timezone:str = "Europe/Paris"): - if 0 list[app_commands.Choice[str]]: - hours = ["13", "14", "15", "16", "17", '18'] - return [ - app_commands.Choice(name=hour, value=hour) - for hour in hours if current.lower() in hour.lower() - ] - - # Slash command to add a colle to the marketplace @tree.command( name="add_colle", description="!!NE FONCTIONNE PAS !! Ajoute une collle au marketplace", - guild=discord.Object(id=1292935532472565852) - + guild=discord.Object(id=1292935532472565852), ) -@app_commands.describe(group = "Votre Groupe de Colles. (1-16)") -@app_commands.describe(day = "Format: JJ/MM/AAAA, bien réspécter le format") -@app_commands.describe(hour = "L'heure de la colle, sans le \"h\"") +@app_commands.describe(group="Votre Groupe de Colles. (1-16)") +@app_commands.describe(day="Format: JJ/MM/AAAA, bien réspécter le format") +@app_commands.describe(hour='L\'heure de la colle, sans le "h"') @app_commands.autocomplete(hour=hour_autocomplete) -@app_commands.describe(teacher = "Le nom du professeur") -@app_commands.describe(subject = "La matière de la colle (Maths, Physique, Anglais, Lettres)") +@app_commands.describe(teacher="Le nom du professeur") +@app_commands.describe( + subject="La matière de la colle (Maths, Physique, Anglais, Lettres)" +) # @app_commands.autocomplete(subject=["Maths", "Physique", "Anglais", "Lettres"]) -@app_commands.describe(room = "La salle de la colle") +@app_commands.describe(room="La salle de la colle") # @app_commands.autocomplete(group=["1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16"]) -async def add_colle(interaction:discord.Interaction, group:str, day:str, hour:str, teacher:str, subject:str, room:str): - # "ASSERTIONS" A IMPLEMENTER !!!! - embed = discord.Embed(title=f"Colle de {subject}", - description=f"Date : {day} {hour}h00\nProfesseur : {teacher}\nSalle : {room}\n Groupe : {group}\n\n! ENCORE EN PHASE DE TEST ! NON FONCTIONNEL !", - colour=0xf50083, - timestamp=datetime.now()) + +async def add_colle( + interaction: discord.Interaction, + group: str, + day: str, + hour: str, + teacher: str, + subject: str, + room: str, +): + # "ASSERTIONS" A IMPLEMENTER !!!! + embed = discord.Embed( + title=f"Colle de {subject}", + description=f"Date : {day} {hour}h00\nProfesseur : {teacher}\nSalle : {room}\n Groupe : {group}\n\n! ENCORE EN PHASE DE TEST ! NON FONCTIONNEL !", + colour=0xF50083, + timestamp=datetime.now(), + ) embed.set_author(name=f"{interaction.user.name}") await interaction.response.send_message(embed=embed) + # Lancer le bot -bot.run(os.getenv('BOT_TOKEN')) +bot.run(os.getenv("BOT_TOKEN")) diff --git a/parse_colles.py b/parse_colles.py index 0c214e2..48fae17 100644 --- a/parse_colles.py +++ b/parse_colles.py @@ -52,7 +52,11 @@ def create_colloscope(groupe:int, timezone:str = "Europe/Paris"): continue day_sem = str(day_sem).split(" ")[0] days = ['Lundi', 'Mardi', 'Mercredi', 'Jeudi', 'Vendredi', 'Samedi', 'Dimanche'] - day_number_sem = days.index(day_sem) + days_english = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday'] + try: + day_number_sem = days.index(day_sem) + except ValueError: + day_number_sem = days_english.index(day_sem) # Combine day_number_sem with date new_days = day_number_sem + date.day; diff --git a/parse_salles.py b/parse_salles.py new file mode 100644 index 0000000..63354ca --- /dev/null +++ b/parse_salles.py @@ -0,0 +1,65 @@ +import openpyxl +from datetime import datetime, timedelta, timezone +import discord +from discord import app_commands, Embed + +def create_edt(heure:int, semestre:int, day:int) -> list[int]: + + days = ['Lundi', 'Mardi', 'Mercredi', 'Jeudi', 'Vendredi', 'Samedi', 'Dimanche'] + days_english = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday'] + try: + day_number_sem = days.index(day) + except ValueError: + day_number_sem = days_english.index(day) + workbook = openpyxl.load_workbook('edt salles.xlsx') + + sheet = workbook['EDT'] + + # Retrieve all coordinates where the cell value is 10 + coordinates = [] + for cell in sheet[3 + (heure - 8) + 11*day_number_sem][1:]: + val = cell.value + if val is None or ("0" not in val and "O" not in val and "S1" not in val): + try: + temp = sheet.cell(row=1, column=cell.column).value + if temp is not None: + coordinates.append((temp, sheet.cell(row=2, column=cell.column).value)) + except Exception as e: + print(f"Error: {e}") + + return coordinates + + +def set_value(type, hour) -> str: + if type == "sci": + return ":test_tube: :white_check_mark:" + if type == "info": + return ":desktop: :no_entry:" + if type == "colle": + return "<:colle:1309644102345949295> :grey_question:" + if type == "classe": + return ":mortar_board: :white_check_mark:" + else : return "" +def parse_edt(coordinates, hour, day): + embeds = [] + + embed1 = discord.Embed(title=f"EDT : {hour}h - {day}", + url="https://staticky.marsisus.me", + description=f"Liste des Salles disponibles à {hour}h", + timestamp=datetime.now()) + + for i in range(min(25, len(coordinates))): + embed1.add_field(name=f"**{coordinates[i][0]}**", inline=True, value=set_value(coordinates[i][1], hour)) + embed1.set_footer(text="Made by Marsisus, Magos, Hugo, Gabriel... ") + embeds.append(embed1) + + if len(coordinates) > 25: + embed2 = discord.Embed( + timestamp=datetime.now()) + + for i in range(25, len(coordinates)): + embed2.add_field(name=f"**{coordinates[i][0]}**", value=set_value(coordinates[i][1], hour), inline=True) + embed2.set_footer(text="Made by Marsisus, Magos, Hugo, Gabriel... ") + embeds.append(embed2) + + return embeds \ No newline at end of file diff --git a/~$edt salles.xlsx b/~$edt salles.xlsx new file mode 100644 index 0000000000000000000000000000000000000000..94de7da02a2e69289bef04f93fffa6e8e9cb2480 GIT binary patch literal 165 zcmd-J&dklvQ}9X5OHR$n%u^r|@G%54WHRJ3