From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on gnuweeb.org X-Spam-Level: X-Spam-Status: No, score=-0.8 required=5.0 tests=ALL_TRUSTED,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,NO_DNS_FOR_FROM,URIBL_BLOCKED autolearn=no autolearn_force=no version=3.4.6 Received: from kanazawa.. (unknown [101.128.126.198]) by gnuweeb.org (Postfix) with ESMTPSA id 065137E245; Fri, 4 Nov 2022 18:10:27 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=gnuweeb.org; s=default; t=1667585430; bh=UlGZoNUBbm3C3Nf8IQVy3LPGAhlVoX9Dwx2fdJuNpjk=; h=From:To:Cc:Subject:Date:In-Reply-To:References:From; b=jm4kvZfpdbMcprg/X0oW2Hr6/eigGpHStz9v2PBJS//ER/dxvRec4sacwENmdIE96 8nDBDUoaKuI8VuRC2bNNc9MoER24JNKU6aNcBxchmS7jQtP4D1PydB0k4yKftQ4P/8 TYKtWmAc8eFXKIJ28+l3L1JOtWmLrds6Oum8Zrlj159w/okqJG+AdvtC9ixvykQ4kQ ymg3bcI6MQJYqJVgOjA+E9CAHQ87c2KFPrTQsYL6nEiTUL3SRoY4DzFiPpE47wfdnF BegdM40g9V/6X+ANcpSjVCxwqDD+IA9p1eqHT+I4p6vYxCJydQB928UdGgTl1h+MP6 e+92zD26/4FWg== From: Muhammad Rizki To: Ammar Faizi Cc: Muhammad Rizki , Alviro Iskandar Setiawan , GNU/Weeb Mailing List Subject: [PATCH v1 14/15] discord: Implement the catch erros and logs Date: Sat, 5 Nov 2022 01:09:27 +0700 Message-Id: <20221104180931.3852-21-kiizuha@gnuweeb.org> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20221104180931.3852-1-kiizuha@gnuweeb.org> References: <20221104180931.3852-1-kiizuha@gnuweeb.org> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit List-Id: Implement the catch erros and log the message into the file then send it into the Discord log channel. Signed-off-by: Muhammad Rizki --- daemon/dscord/gnuweeb/client.py | 4 +- daemon/dscord/gnuweeb/filters.py | 10 +++-- .../dscord/gnuweeb/plugins/events/on_ready.py | 2 +- .../plugins/slash_commands/get_lore_mail.py | 10 ++++- daemon/dscord/mailer/listener.py | 40 +++++++++++-------- 5 files changed, 41 insertions(+), 25 deletions(-) diff --git a/daemon/dscord/gnuweeb/client.py b/daemon/dscord/gnuweeb/client.py index 1b260ea..406c606 100644 --- a/daemon/dscord/gnuweeb/client.py +++ b/daemon/dscord/gnuweeb/client.py @@ -53,7 +53,7 @@ class GWClient(commands.Bot): @filters.wait_on_limit async def send_text_email(self, guild_id: int, chat_id: int, text: str, reply_to: Union[int, None] = None, url: str = None): - print("[send_text_email]") + self.logger.debug("[send_text_email]") channel = self.get_channel(chat_id) return await channel.send( @@ -70,7 +70,7 @@ class GWClient(commands.Bot): @filters.wait_on_limit async def send_patch_email(self, mail, guild_id: int, chat_id: int, text: str, reply_to: Union[int, None] = None, url: str = None): - print("[send_patch_email]") + self.logger.debug("[send_patch_email]") tmp, doc, caption, url = utils.prepare_patch( mail, text, url, Platform.DISCORD ) diff --git a/daemon/dscord/gnuweeb/filters.py b/daemon/dscord/gnuweeb/filters.py index b994904..1fdb70d 100644 --- a/daemon/dscord/gnuweeb/filters.py +++ b/daemon/dscord/gnuweeb/filters.py @@ -15,6 +15,7 @@ from discord import Interaction # gnuweeb package import from dscord import config +from logger import BotLogger def lore_admin(func): @@ -42,12 +43,15 @@ def wait_on_limit(func): try: return await func(*args) except discord.errors.RateLimited as e: + # Calling logger attr from the GWClient() class + logger = args[0].logger + _flood_exceptions(e) - print("[wait_on_limit]: Woken up from flood wait...") + logger.info("Woken up from flood wait...") return callback -async def _flood_exceptions(e: "discord.errors.RateLimited"): +async def _flood_exceptions(e: "discord.errors.RateLimited", logger: BotLogger): wait = e.retry_after - print(f"[wait_on_limit]: Sleeping for {wait} seconds due to Discord limit") + logger.info(f"Sleeping for {wait} seconds due to Discord limit") await asyncio.sleep(wait) diff --git a/daemon/dscord/gnuweeb/plugins/events/on_ready.py b/daemon/dscord/gnuweeb/plugins/events/on_ready.py index 4f25764..e7f63cd 100644 --- a/daemon/dscord/gnuweeb/plugins/events/on_ready.py +++ b/daemon/dscord/gnuweeb/plugins/events/on_ready.py @@ -23,4 +23,4 @@ class OnReady(commands.Cog): t += f"Send `{prefix}sync` message to the Discord channel " t += "where the bot is running.\n" - print(t) + self.bot.logger.info(t) diff --git a/daemon/dscord/gnuweeb/plugins/slash_commands/get_lore_mail.py b/daemon/dscord/gnuweeb/plugins/slash_commands/get_lore_mail.py index 0c67b8c..e4c171c 100644 --- a/daemon/dscord/gnuweeb/plugins/slash_commands/get_lore_mail.py +++ b/daemon/dscord/gnuweeb/plugins/slash_commands/get_lore_mail.py @@ -26,8 +26,14 @@ class GetLoreSC(commands.Cog): @app_commands.describe(url="Raw lore email URL") async def get_lore(self, i: "Interaction", url: str): s = Scraper() - mail = await s.get_email_from_url(url) - text, _, is_patch = utils.create_template(mail, Platform.DISCORD) + + try: + mail = await s.get_email_from_url(url) + text, _, is_patch = utils.create_template(mail, Platform.DISCORD) + except: + exc_str = utils.catch_err() + self.bot.logger.warning(exc_str) + await self.bot.send_log_file(url) if is_patch: m = await self.bot.send_patch_mail_interaction( diff --git a/daemon/dscord/mailer/listener.py b/daemon/dscord/mailer/listener.py index d986fbd..1764ea2 100644 --- a/daemon/dscord/mailer/listener.py +++ b/daemon/dscord/mailer/listener.py @@ -35,6 +35,7 @@ class Listener: self.scraper = scraper self.mutexes = mutexes self.db = client.db + self.logger = client.logger self.isRunnerFixed = False self.runner = None @@ -44,18 +45,15 @@ class Listener: # Execute __run() once to avoid high latency at # initilization. # - print("Initialize listener...\n") + self.logger.info("Initialize listener...\n") self.sched.start() self.runner = self.sched.add_job(func=self.__run) async def __run(self): - print("[__run]: Running...") + self.logger.info("Running...") for url in self.db.get_atom_urls(): - try: - await self.__handle_atom_url(url) - except: - print(traceback.format_exc()) + await self.__handle_atom_url(url) if not self.isRunnerFixed: self.isRunnerFixed = True @@ -71,8 +69,13 @@ class Listener: async def __handle_atom_url(self, url): urls = await self.scraper.get_new_threads_urls(url) for url in urls: - mail = await self.scraper.get_email_from_url(url) - await self.__handle_mail(url, mail) + try: + mail = await self.scraper.get_email_from_url(url) + await self.__handle_mail(url, mail) + except: + exc_str = utils.catch_err() + self.client.logger.warning(exc_str) + await self.client.send_log_file(url) async def __handle_mail(self, url, mail): @@ -91,10 +94,8 @@ class Listener: async def __send_to_discord(self, url, mail, dc_guild_id, dc_chat_id): email_msg_id = utils.get_email_msg_id(mail) if not email_msg_id: - # - # It doesn't have a Message-Id. - # A malformed email. Skip! - # + md = "email_msg_id not detected, skipping malformed email" + self.logger.debug(md) return False email_id = self.__get_email_id_sent( @@ -102,13 +103,18 @@ class Listener: dc_chat_id=dc_chat_id ) if not email_id: - # - # Email has already been sent to Discord. - # Skip! - # + md = f"Skipping {email_id} because has already been sent to Discord" + self.logger.debug(md) return False - text, files, is_patch = utils.create_template(mail, Platform.DISCORD) + try: + text, files, is_patch = utils.create_template(mail, Platform.DISCORD) + except: + exc_str = utils.catch_err() + self.client.logger.warning(exc_str) + await self.client.send_log_file(url) + return + reply_to = self.get_discord_reply(mail, dc_chat_id) url = str(re.sub(r"/raw$", "", url)) -- Muhammad Rizki