From c5f4db4c19d25f44457e29ea4e7cfb825642fde5 Mon Sep 17 00:00:00 2001 From: SBen-IV Date: Sat, 1 Apr 2023 16:40:15 -0300 Subject: [PATCH] =?UTF-8?q?feat:=20menos=20pegadas=20en=20noticias=20autom?= =?UTF-8?q?=C3=A1ticas;=20otros=20cambios=20menores?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 5 +++-- connectors/fiuba_web.py | 4 ++++ connectors/silk.py | 29 ++++++++++++++++++++++++----- controllers/jjjameson.py | 26 +++++++++++--------------- repositories/noticias_repository.py | 2 +- 5 files changed, 43 insertions(+), 23 deletions(-) diff --git a/README.md b/README.md index 4a42cf1..716f6bf 100644 --- a/README.md +++ b/README.md @@ -30,9 +30,10 @@ pipenv run python3.8 main.py ## TODOs -- [ ] Ver cómo cambiar las noticias automáticas para hacer menos pegadas a la página (método que reciba una fecha y devuelva sólo noticias posteriores). +- [x] Ver cómo cambiar las noticias automáticas para hacer menos pegadas a la página (método que reciba una fecha y devuelva sólo noticias posteriores). - [ ] Agregar método para convertir una url de una noticia. - [ ] Agregar archivo config para variables como delay, intervalo entre mensajes, etc. - [ ] Agregar script para correr en "dev" y "prod". - [ ] Agregar comando /status, /estado o /info que devuelva el estado del bot -- [ ] Agregar /version (?) \ No newline at end of file +- [ ] Agregar /version (?) +- [ ] Agregar tests \ No newline at end of file diff --git a/connectors/fiuba_web.py b/connectors/fiuba_web.py index 8169c1d..1c12e89 100644 --- a/connectors/fiuba_web.py +++ b/connectors/fiuba_web.py @@ -6,4 +6,8 @@ class FiubaWeb(ABC): @abstractclassmethod def obtener_noticias(self, n: int = 1) -> list: + pass + + @abstractclassmethod + def obtener_noticias_nuevas(self, ultima_noticia: Noticia) -> list: pass \ No newline at end of file diff --git a/connectors/silk.py b/connectors/silk.py index 82e7378..4753f7f 100644 --- a/connectors/silk.py +++ b/connectors/silk.py @@ -1,3 +1,4 @@ +from tkinter.tix import MAX import requests as requests import dateparser as dp @@ -22,10 +23,7 @@ def __init__(self): def obtener_noticias(self, n_noticias: int = 1) -> list: self.__validar_cantidad(n_noticias) - page = requests.get(LINK_NOTICIAS) - soup = BeautifulSoup(page.content, 'html.parser') - - uris_noticias = list(map(lambda x: x.get('href'), soup.select(".noticia > a"))) + uris_noticias = self.__obtener_uri_noticias() noticias = [] @@ -53,8 +51,29 @@ def obtener_noticia(self, uri: str) -> Noticia: return Noticia(titulo, descripcion, fecha, url) + def obtener_noticias_nuevas(self, ultima_noticia: Noticia) -> list: + uris_noticias = self.__obtener_uri_noticias() + + noticias_nuevas = [] + + for uri in uris_noticias[:MAX_NOTICIAS]: + noticia = self.obtener_noticia(uri) + + if noticia.fecha > ultima_noticia.fecha: + noticias_nuevas.append(noticia) + else: + break + + return noticias_nuevas + + def __obtener_uri_noticias(self) -> list: + page = requests.get(LINK_NOTICIAS) + soup = BeautifulSoup(page.content, 'html.parser') + + return list(map(lambda x: x.get('href'), soup.select(".noticia > a"))) + def __validar_cantidad(self, n_noticias: int) -> None: if n_noticias <= 0: raise CantidadNoticiasNegativaException(n_noticias) - elif n_noticias >= MAX_NOTICIAS: + elif n_noticias > MAX_NOTICIAS: raise CantidadNoticiasMaximaException(n_noticias) diff --git a/controllers/jjjameson.py b/controllers/jjjameson.py index b2b5d9d..07dc66e 100644 --- a/controllers/jjjameson.py +++ b/controllers/jjjameson.py @@ -29,10 +29,10 @@ def conseguir_noticias(self, update: Update, context: CallbackContext): if len(context.args) < 1: noticias = self.fiuba_web.obtener_noticias() else: - n_noticias = int(context.args[0]) - noticias = self.fiuba_web.obtener_noticias(n_noticias) + cant_noticias = int(context.args[0]) + noticias = self.fiuba_web.obtener_noticias(cant_noticias) - self.logger.info("Se consiguieron {n_noticias} noticias.".format(n_noticias=len(noticias))) + self.logger.info("Se consiguieron {cant_noticias} noticias.".format(cant_noticias=len(noticias))) self.imprenta.enviar_noticias(update.effective_chat, noticias) except ValueError: @@ -49,7 +49,7 @@ def activar_noticias_automaticas(self, update: Update, context: CallbackContext) update.effective_chat.send_message("Las noticias automáticas ya estan activadas.") - def desactivar_noticias_automaticas(self, update: Update, context: CallbackContext): + def desactivar_noticias_automaticas(self, update: Update, _: CallbackContext): if self.noticias_automaticas == True: self.job.schedule_removal() self.noticias_automaticas = False @@ -60,17 +60,13 @@ def desactivar_noticias_automaticas(self, update: Update, context: CallbackConte def conseguir_noticias_automatico(self, context: CallbackContext): ultima_noticia_guardada = self.repo.ultima_noticia() - ultimas_noticias = self.fiuba_web.obtener_noticias(15) - - self.logger.info("Fecha de ultima noticia {titulo} es {fecha}.".format(titulo=ultima_noticia_guardada.titulo, fecha=ultima_noticia_guardada.fecha)) - - nuevas_noticias = [] - for noticia in ultimas_noticias: - if noticia.fecha > ultima_noticia_guardada.fecha: - self.logger.info("Fecha de noticia {titulo} es {fecha}".format(titulo=noticia.titulo, fecha=noticia.fecha)) - nuevas_noticias.append(noticia) + self.logger.info("Fecha de última noticia {titulo} es {fecha}.".format(titulo=ultima_noticia_guardada.titulo, fecha=ultima_noticia_guardada.fecha)) + nuevas_noticias = self.fiuba_web.obtener_noticias_nuevas(ultima_noticia_guardada) + if len(nuevas_noticias) > 0: + self.logger.info("Hay {cant_noticias} noticias nuevas.".format(cant_noticias=len(nuevas_noticias))) self.repo.guardar(max(nuevas_noticias, key=lambda n: n.fecha)) - - self.imprenta.enviar_noticias(context.job.context, nuevas_noticias, 30) + self.imprenta.enviar_noticias(context.job.context, nuevas_noticias, 30) + else: + self.logger.info("No hay noticias nuevas.") diff --git a/repositories/noticias_repository.py b/repositories/noticias_repository.py index 746342e..2bfea41 100644 --- a/repositories/noticias_repository.py +++ b/repositories/noticias_repository.py @@ -27,7 +27,7 @@ def guardar(self, noticia: Noticia) -> Noticia: with open(self.path, 'w', encoding='utf-8') as f: json.dump(noticia_json, f, indent=4) - self.logger.info("Guardado {noticia}.".format(noticia=noticia_json)) + self.logger.info("Guardada {noticia}.".format(noticia=noticia_json)) return noticia