Source code for spotted.debug.log_manager

"""Handles the logging of events"""

import html
import logging
import traceback
from datetime import datetime
from pathlib import Path

from telegram import Update
from telegram.constants import ParseMode
from telegram.ext import CallbackContext

from spotted.data import Config

logging.basicConfig(format="%(asctime)s - %(name)s - %(levelname)s - %(message)s", level=logging.INFO)
logger = logging.getLogger(__name__)


[docs] async def error_handler(update: Update, context: CallbackContext): """Logs the error and notifies the admins. Args: update: update event context: context passed by the handler """ logger.error(msg="Exception while handling an update:", exc_info=context.error) traceback_list = traceback.format_exception(None, context.error, context.error.__traceback__) traceback_str = "".join(traceback_list) min_traceback_list = [line for line in traceback_list if "modules" in line] min_traceback_list.append(traceback_list[-1]) min_traceback_str = "".join(min_traceback_list) await notify_error_admin(context=context, traceback_str=min_traceback_str) try: # log the error log_file_path = Path(Config.debug_get("log_error_file")) log_file_path.parent.mkdir(parents=True, exist_ok=True) with open(log_file_path, "a", encoding="utf8") as log_file: message = ( "\n___ERROR LOG___\n" f"time: {datetime.now()}\n" f"error: {context.error}\n" f"error_traceback: {traceback_str}\n" ) if update and update.message: # if the update contains a message, show additional info chat = update.message.chat message += ( f"id_message: {update.message.message_id}\n" f"chat_id: {chat.id}\n" f"chat_type: {chat.type}\n" f"chat_title: {chat.title}\n" f"message_date: {update.message.date}\n" ) message += "_____________\n" log_file.write("\n" + message) except AttributeError as ex: logger.warning(ex) except FileNotFoundError as ex: logger.error(ex)
[docs] async def notify_error_admin(context: CallbackContext, traceback_str: str): """Sends a telegram message to notify the admins. Args: context: context passed by the handler traceback_str: the traceback text """ traceback_str = traceback_str.replace(Config.settings_get("token"), "[bot_token]") text = f"An exception was raised:\n" f"<pre>{html.escape(traceback_str)}</pre>" await context.bot.send_message(chat_id=Config.post_get("admin_group_id"), text=text, parse_mode=ParseMode.HTML)
[docs] async def log_message(update: Update, _: CallbackContext): """Log the message that caused the update Args: update: update event context: context passed by the handler """ if update.message: try: log_file_path = Path(Config.debug_get("log_file")) log_file_path.parent.mkdir(parents=True, exist_ok=True) with open(log_file_path, "a", encoding="utf8") as log_file: user = update.message.from_user chat = update.message.chat message = ( f"\n___ID MESSAGE: {str(update.message.message_id)} ____\n" "___INFO USER___\n" f"user_id: {str(user.id)}\n" f"user_name: {str(user.username)}\n" f"user_first_lastname: {str(user.first_name)} {str(user.last_name)}\n" "___INFO CHAT___\n" f"chat_id: {str(chat.id)}\n" f"chat_type: {str(chat.type)}\n" f"chat_title: {str(chat.title)}\n" "___TESTO___\n" f"text: {str(update.message.text)}\n" f"date: {str(update.message.date)}" "\n_____________\n" ) log_file.write("\n" + message) except AttributeError as ex: logger.warning(ex) except FileNotFoundError as ex: logger.error(ex)