From c1372d3d96bd033728ab80a7d8e8dc54dc238175 Mon Sep 17 00:00:00 2001 From: DennisEckerskorn Date: Thu, 9 Jan 2025 22:25:02 +0100 Subject: [PATCH] Updated some code and added email_client to work on a separated thread --- .../__pycache__/email_client.cpython-312.pyc | Bin 5238 -> 6066 bytes .../threads_manager.cpython-312.pyc | Bin 10883 -> 11789 bytes src/services/email_client.py | 10 +++++++--- src/services/threads_manager.py | 18 ++++++++++++------ .../centered_window.cpython-312.pyc | Bin 17313 -> 17879 bytes src/ui/centered_window.py | 16 +++++++++++++--- 6 files changed, 32 insertions(+), 12 deletions(-) diff --git a/src/services/__pycache__/email_client.cpython-312.pyc b/src/services/__pycache__/email_client.cpython-312.pyc index c4b6ea36e6c8c30d75030b9d6b99b73f9e25cb5e..9926095659e1d7d091c57eefb57adf6ba6e1bbb8 100644 GIT binary patch delta 2000 zcmZ8iT})I*6rQ=eclYkyAJ{*Uwcr&&xFTR_L2Z<16s?g3TeVWG-7Y(qW$FIVxtCVR zZt=mSXiR|212$>WlC&wr)DUSCUz)V>(WH@LBfZhazO>~{v1!xxp`CLVq8-UYHUk+=*W*bo)<<)hSnsf*>3r2ov_y_*v3@O1G&(uH zp|pcTwY-kuKmKnYj4OO=OOqVYlj=euN`%PU;5m0C)j> z042;Ve1Ki^OmGQ@EGuidlpM(wkfySR>1sch&<2fEE;}pG09ay8hbt)x z4YCLJdK{Yfh_4APR=^Sn;|C}QSdSlp=_Y{ZIIKIEa@ONYcGEe6H?ubBvyE^T%fT$R zqUo3~K%{@9daSZqR~-(s|~dMiK;hbOj2_;a`Fxwp8rVpV_eFvxvOx1 zEx0RjkUezoa=ZZcN7!v&Ej#I{R>FLmfKY4V-~$`~J^qrz6kZ(s-gZG#eE^o7Q(}L{;N}>~d zgss_oNVSjb>gqL8T2@oiaV4G7jkrQIB@w5Cni1C(lF|or*;H>@(-keNXlX^)=({PB zqo&YxY(!M5nyQrLf4Qi3Y9-X39_3z4N0C#siO1(E$RORx!F2ZJ(wt?w=~x}u`KrQ& z20`uZ(~LxaY*jZ>-kyo4(g)N0ghu02sy*CVKgHoZdJw7nxbefryOD;4NW)@epy^`C zm}A1Z17Ujt^06kcYUSq|e_<;>+i{-#BDa=d{_3kGXC=&5u;=Z> z#!9_g$^4#(40df{zXw~|t&awf&Gcw+@y6ok(4t<^`&(fAB;w!F m-b{`RrL{InxB`f+Z)LB9LS^?+^?kJMPx~p1t5y)8wd+3_Eznp1 delta 1139 zcmY+CU1%It6vywKojV^pGn@U&?q*Ch=ELk}O=2EmTPUSSvBr|LqF7j!y4^e7ZrRPo zJF`g2E>#SuAeQwiT3;-P52Y_+`cmkNuPrDd#WJ>{;7i^@A_{`wIg@DgGV_~z&pr2l z&YXL`n)|(&xZ^l+0^{bu8}-{(KT)7Z`%^Oog&ZebT_>DfS8$tG8}nD<^=48tl6$NR`yQFztlo9iDv5gn9}H|NXbc7rs<96*o(?Sr0$^R03wgr z4_3hC5W)rQ3*6VsbXXe3MLHtiGQKEa;7H&a6&TH@0E~3hEYm63G>bGNKQe!MC=wh- z??(~i|Mh)8K1s{+M*MM_+4v=%qBJ3QtTCFDIs0Lnk_+|$Ixk!Hso@Nqs_oSmri5tl z#^BvKM&-9zSLUpj45b(A#<)5pmz}))*)$4WY7wruq^H(Nk9E~!z= zo7eU)?PU<}DLuW*E?BY}%Q!j+fj-xe^3_b%<@$B}M;QNnDS2;EC0!<8PZpUd!jAkb z=`LPmo#5Qe!ICbbB29x`lo2z4ke%~_+WAncuC973Jk+>XYjdw;L{)^VY_uAIm__$F zIh~pw@bR)o_XgDWQmUjK0F(cz6!w(7n>sOb&rV-ndUxrQ;??;p<*U^zvp=|V-??*N z>fgHu@7jm97#SMd(nvD*jw3P~Z>A5?OQHUJ=j;Wq7KCiIS#7K=L$)dg#ZG|af}mPE zFR;SVC5MI&$+oJEW@uLZGkzc%EA)gcn zj%~8sc1~xDbSKT&*seP|K+Oj6z$4PhFDyl8U%>UhdVd;+TW#KHdPl@**ueJjM*v$f aO6iXz0nY<6@qox4XSR@U{7f2(6dCv5Hy$}j^ZGogr-x!ytN+L6;c zaZ}i$XavzYKN1#~_@FNeQ6cp~5)+d>5lNKEOlO@5j~b1Z!2^L8&$-wiVStQ!6HzGfj+kc z4EyodA8>A51{K^B4P^zRmP)Gyi>9WJs-#~VC2GN>ru$RF*@9Ic69dC3HKPIHwgiZc zCMihSu`J~$(j%FaHbMx?Ok}vqt#{g~sTc~ztU5eM9L#S6v*A5F2s4JQL4W;h+mbIb zyJ^W2h7(JH=U-<8A7YA1j>fL*$E-e@tM*=R(X2O?t7n&dBVrF=wzqp}C{&?fk?kEU@#S}>c& z=&h7NpZJtOB+A^aNbr%^>Ml6b{h9v5YT}`CE{a>Q18kN9rVW&vy$d6j1K~x%IwhVG z-*1~2YV$&LUWk6`$}1i7O2>7jYeDF~VX^0~SuS(9J$G7~=CA|-$73eF&JsNDXbCjY zT%U2oO@{(jvuwek5UHR8*$kgMBDgoV;P{q%w3T_*F?gH-3sVew7>O{)b_!W`uA$ZN zjdU^|hA+JpYsar@BsCDv{q5>A(5-Y=YVeEK57#R%n7UbxC*h>G4)22V-WX27l6Nr7 z7Fyu@2Q`%trdq<5vHIO!=I8;{7sJWiIo};FTFSyGr5zCqwe>wsPL}qxi#o=e=%PIE zeN_OD!XH&+JkzFp|lr1DcvFn2EYFSt-c` zBi^smHadMsHB6l2wS7m3+Mmq!>N+Ny{zuPmvcPvJOrk}pd}`>_&`fY%isq%pAEm}3 zXR=i}H%*rU?KlI%JsPKz^-oRx}ZWOqIo{*%;r=eCGk zRm+I8RWHfzYn8E!H5Z-NDw-GMmbJ)p(zJB1$WzMQY$aXBY=^lMp*dvkY%$E4!<{k1 zT#Tpoz{+2OQV`LItUgqrlrsZ0g zRFw6yjSnmb1-^3GCGgd^TwdN!Soug91w|x#n60nn5d5GF`d(&poxuJncZF@~k>u#G U+D67 delta 999 zcmZWo&1(}u6wlkuZtEtSq)D1Io2^ZnCS;Q)(hon{img?!qE->LDHLOf8*ND|PNGmL zrDzouEtJ=bv?BE&g2zSBi+c0}1O){{{{ZozwL%fRIJ0TJIIzEY^X7g0-n_SWN3NZ8 zypv_gLf5Ku=3Fc=?|2TG`PakNNr&ddBqVG#^p2jM!la4O#8 zIvf?dKAsybX7j~SeWHvXI3GCiE0^>*sGr7HtR=lzATD|!br|F4Acs%+odG4bm|pQm zaC$|JFAn~cYkbm8>m6y;Wk^;5Xb6{}QcMX0pyFlWEtU6*{SY>0MI9iD-)b^kn!{CR z81>rEnD={la(oJNejnC&J@_)_#Rsuk{JzBoE-ZQi)XE2LOh^&Ao^mnQlx56^9~wPi z#R(~lN4KarEP3#SWD|r*K@;)4bbue!WNfr`W6{=0BQ4uT#3Xettsrk75mrTu-DO<0 zKj&bNvD-P%fsF6#xF8D;klwVhgP9AQZ-pqDthheE_hHgl-T{AP)x(2A?N(Uw8$C<4vT*mub7ZmeJjf6YMhnf`V!9r6n zj2n-d{s5f9hv7K1_eLVj|=AQnh9$9=Z{QK^=~@sC^Z8K`-aeXD>|1U2Cot8h-f#LXb2tbM`-K5;?+Tlfh{mP8ERQt5gGh=P#+KGs8h} J&BD-h`3pSa=F$KF diff --git a/src/services/email_client.py b/src/services/email_client.py index 6d151ba..b657cea 100644 --- a/src/services/email_client.py +++ b/src/services/email_client.py @@ -61,15 +61,19 @@ class EmailClient: return [folder.decode().split(' "/" ')[-1] for folder in folders] return [] - def list_emails(self, limit=10): + def list_emails(self, folder="INBOX", limit=10): """Lista de correos más recientes""" - self.imap_conn.select("INBOX") + self.imap_conn.select(folder) status, response = self.imap_conn.search(None, "ALL") email_ids = response[0].split()[-limit:] emails = [] for email_id in email_ids: status, msg_data = self.imap_conn.fetch(email_id, "(RFC822)") - emails.append(msg_data[0][1].decode("utf-8")) + msg = message_from_bytes(msg_data[0][1]) + subject, encoding = decode_header(msg["Subject"])[0] + if isinstance(subject, bytes): + subject = subject.decode(encoding or "utf-8") + emails.append(subject) return emails def send_mail(self, to_address, subject, body): diff --git a/src/services/threads_manager.py b/src/services/threads_manager.py index 35856d7..77b5605 100644 --- a/src/services/threads_manager.py +++ b/src/services/threads_manager.py @@ -18,6 +18,7 @@ class ThreadsManager: "time": ThreadenTask(), "temperature": ThreadenTask(), "emails":ThreadenTask(), + "email_client":ThreadenTask(), "tetris_game":ThreadenTask(), "scrapper":ThreadenTask(), "radio_player": ThreadenTask(), @@ -45,7 +46,7 @@ class ThreadsManager: self.tasks["time"].start(self.update_time) self.tasks["temperature"].start(self.update_temperature) self.tasks["emails"].start(self.update_emails) - + self.tasks["email_client"].start(self.manage_email_client()) if self.system_monitor: for metric in self.system_monitor.metrics.keys(): @@ -104,8 +105,6 @@ class ThreadsManager: self.ui_instance.after(0, lambda: self.ui_instance.info_labels["fecha"].configure(text=f"Fecha: {current_date}")) time.sleep(1) - - def update_temperature(self): API_KEY = "4ba2b87d7fa32934530b5b4a5a83ebf7" # Reemplaza con tu clave de OpenWeatherMap CITY = "Madrid" # Cambia por tu ciudad @@ -121,8 +120,6 @@ class ThreadsManager: print(f"Error al obtener la temperatura: {e}") time.sleep(600) # Actualiza cada 10 minutos - - def get_real_temperature(self, api_key, city): url = f"http://api.openweathermap.org/data/2.5/weather?q={city}&appid={api_key}&units=metric" response = requests.get(url) @@ -132,7 +129,16 @@ class ThreadsManager: else: print(f"Error al obtener la temperatura: {response.status_code}") return None - + + def manage_email_client(self): + while self.tasks["email_client"].running: + try: + if not self.email_client.is_connected(): + self.email_client.reconnect() + time.sleep(10) + except Exception as e: + print(f"Error en el EmailClient: {e}") + time.sleep(10) def update_emails(self): """Actualiza la cantidad de correos no leidos en tiempo real""" diff --git a/src/ui/__pycache__/centered_window.cpython-312.pyc b/src/ui/__pycache__/centered_window.cpython-312.pyc index 753da6f574121deb6f206b53df1144737119968a..c51fc633fd052ecfce7915d54fb84c16e37c6897 100644 GIT binary patch delta 3127 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 UVx#Qh#Fe9$j(#Xu6HeCu1rn8}UH||9 diff --git a/src/ui/centered_window.py b/src/ui/centered_window.py index e62e07a..8d3a646 100644 --- a/src/ui/centered_window.py +++ b/src/ui/centered_window.py @@ -14,6 +14,7 @@ class CenteredWindow(ctk.CTk): # Inicializacion de la clase: super().__init__() self.title(title) + self.after_tasks = [] #Configurar Email Client self.email_client = EmailClient( @@ -46,8 +47,13 @@ class CenteredWindow(ctk.CTk): self.protocol("WM_DELETE_WINDOW", self.on_close) + def schedule_tasks(self, delay, callback): + task_id = self.after(delay, callback) + self.after_tasks.append(task_id) + return task_id + def configure_window(self): - # Configuracion de la ventana: + # Configuración de la ventana: self.configure(bg_color="lightgray") self.create_left_panel() self.create_right_panel() @@ -70,10 +76,14 @@ class CenteredWindow(ctk.CTk): if hasattr(self.thread_manager, "scrapper"): self.thread_manager.scrapper.stop_scraping() + if self.system_monitor: + self.system_monitor.running = False + + for task in self.after_tasks: + self.after_cancel(task) + self.destroy() - - def create_left_panel(self): # Panel izquierdo left_panel = ctk.CTkFrame(self, width=200)