diff --git a/app/__init__.py b/app/__init__.py index ccb5a0d..3076adf 100644 --- a/app/__init__.py +++ b/app/__init__.py @@ -8,9 +8,13 @@ tracemalloc.start() load_dotenv("config.env") from app.config import Config # NOQA -from app.core import LOGGER # NOQA from app.core.db import DB, DB_CLIENT, CustomDB # NOQA from app.core import Message # NOQA + +from app.core.logger import getLogger # NOQA + +LOGGER = getLogger("PLAIN-UB") + from app.core.client.client import BOT # NOQA @@ -20,5 +24,3 @@ if "com.termux" not in os.environ.get("PATH", ""): uvloop.install() bot: BOT = BOT() - -from app.core.decorators.try_except import try_ # NOQA diff --git a/app/config.py b/app/config.py index 8bc3b30..5f73b60 100644 --- a/app/config.py +++ b/app/config.py @@ -14,6 +14,9 @@ class _Config: self.doc: str = doc or "Not Documented." self.sudo: bool = sudo + def __str__(self): + return json.dumps(self.__dict__, indent=4, ensure_ascii=False, default=str) + def __init__(self): self.CMD_DICT: dict[str, _Config.CMD] = {} diff --git a/app/core/__init__.py b/app/core/__init__.py index a7a900c..badae98 100644 --- a/app/core/__init__.py +++ b/app/core/__init__.py @@ -1,4 +1,3 @@ from app.core.client import filters -from app.core.logger import LOGGER from app.core.types.message import Message # NOQA diff --git a/app/core/decorators/try_except.py b/app/core/decorators/try_except.py deleted file mode 100644 index 78aa8f9..0000000 --- a/app/core/decorators/try_except.py +++ /dev/null @@ -1,48 +0,0 @@ -import asyncio -import traceback -from functools import wraps - -from app import bot - - -def try_(func): - if asyncio.iscoroutinefunction(func): - - @wraps(func) - async def run_func(*args, **kwargs): - try: - result = await func(*args, **kwargs) - return result - except asyncio.exceptions.CancelledError: - text, type = f"FUNC: {func.__name__} Cancelled.", "info" - except BaseException: - text, type = ( - f"FUNC: {func.__name__}" - f"\n#TRACEBACK:\n
{traceback.format_exc()}
", - "error", - ) - if text: - await bot.log_text(text=text, name="traceback.txt", type=type) - - else: - - @wraps(func) - def run_func(*args, **kwargs): - try: - result = func(*args, **kwargs) - return result - except asyncio.exceptions.CancelledError: - text, type = f"FUNC: {func.__name__} Cancelled.", "info" - except BaseException: - text, type = ( - f"FUNC: {func.__name__}" - f"\n#TRACEBACK:\n
{traceback.format_exc()}
", - "error", - ) - if text: - asyncio.run_coroutine_threadsafe( - coro=bot.log_text(text=text, name="traceback.txt", type=type), - loop=bot.loop, - ) - - return run_func diff --git a/app/core/logger.py b/app/core/logger.py index 006074c..ae69f29 100644 --- a/app/core/logger.py +++ b/app/core/logger.py @@ -1,14 +1,43 @@ import os -from logging import INFO, WARNING, StreamHandler, basicConfig, getLogger, handlers +import asyncio +from logging import ( + ERROR, + INFO, + WARNING, + Handler, + StreamHandler, + basicConfig, + getLogger, + handlers, +) os.makedirs("logs", exist_ok=True) -LOGGER = getLogger("PLAIN_UB") + +class TgErrorHandler(Handler): + def emit(self, log_record): + if log_record.levelno < ERROR: + return + from app import bot + if not bot.is_connected: + return + text = ( + f"#{log_record.levelname} #TRACEBACK" + f"\nLine No: {log_record.lineno}" + f"\nFunc: {log_record.funcName}" + f"\nModule: {log_record.module}" + f"\nTime: {log_record.asctime}" + f"\nError Message:\n
{log_record.message}
" + ) + asyncio.run_coroutine_threadsafe( + coro=bot.log_text(text=text, name="traceback.txt"), loop=bot.loop + ) + basicConfig( level=INFO, - format="[%(asctime)s] [%(levelname)s] [%(name)s]: %(message)s", - datefmt="%y-%m-%d %H:%M:%S", + format="[%(levelname)s] [%(asctime)s] [%(name)s] [%(module)s]: %(message)s", + datefmt="%d-%m-%y %I:%M:%S %p", handlers={ handlers.RotatingFileHandler( filename="logs/app_logs.txt", @@ -19,6 +48,7 @@ basicConfig( delay=0, ), StreamHandler(), + TgErrorHandler(), }, ) diff --git a/app/plugins/dev/exec.py b/app/plugins/dev/exec.py index df463ed..7006949 100644 --- a/app/plugins/dev/exec.py +++ b/app/plugins/dev/exec.py @@ -6,7 +6,7 @@ from io import StringIO from pyrogram.enums import ParseMode -from app import Config, bot, BOT, Message, DB, DB_CLIENT, try_ # isort:skip +from app import Config, bot, BOT, Message, DB, DB_CLIENT # isort:skip from app.utils import shell # isort:skip from app.utils.aiohttp_tools import aio # isort:skip diff --git a/app/plugins/sudo/superuser_toggle.py b/app/plugins/sudo/superuser_toggle.py index 29657bc..671dd6f 100644 --- a/app/plugins/sudo/superuser_toggle.py +++ b/app/plugins/sudo/superuser_toggle.py @@ -1,6 +1,6 @@ from pyrogram import filters -from app import BOT, Config, Message, bot, try_ +from app import BOT, Config, Message, bot from app.plugins.sudo.users import SUDO_USERS @@ -16,7 +16,6 @@ async def disable_su(bot: BOT, message: Message): ) -@try_ @bot.on_message( filters=filters.command(commands="enable_su", prefixes=Config.SUDO_TRIGGER) & filters.create( diff --git a/app/plugins/tools/pm_n_tag_logger.py b/app/plugins/tools/pm_n_tag_logger.py index ec769b0..4ee4c2b 100644 --- a/app/plugins/tools/pm_n_tag_logger.py +++ b/app/plugins/tools/pm_n_tag_logger.py @@ -5,7 +5,7 @@ from pyrogram import filters from pyrogram.enums import ChatType, MessageEntityType, ParseMode from pyrogram.errors import MessageIdInvalid -from app import BOT, Config, CustomDB, Message, bot, try_ +from app import BOT, Config, CustomDB, Message, bot LOGGER = CustomDB("COMMON_SETTINGS") @@ -61,7 +61,6 @@ basic_filters = ( ) -@try_ @bot.on_message( filters=basic_filters & filters.private @@ -75,7 +74,6 @@ async def pm_logger(bot: BOT, message: Message): tag_filter = filters.create(lambda _, __, ___: Config.TAG_LOGGER) -@try_ @bot.on_message( filters=(basic_filters & filters.reply & tag_filter) & ~filters.private, group=2 ) @@ -89,7 +87,6 @@ async def reply_logger(bot: BOT, message: Message): message.continue_propagation() -@try_ @bot.on_message( filters=(basic_filters & filters.mentioned & tag_filter) & ~filters.private, group=2 ) @@ -104,7 +101,6 @@ async def mention_logger(bot: BOT, message: Message): message.continue_propagation() -@try_ @bot.on_message( filters=(basic_filters & (filters.text | filters.media) & tag_filter) & ~filters.private, @@ -117,7 +113,6 @@ async def username_logger(bot: BOT, message: Message): message.continue_propagation() -@try_ def cache_message(message: Message): m_id = message.chat.id if len(MESSAGE_CACHE[m_id]) > 10: @@ -126,8 +121,9 @@ def cache_message(message: Message): MESSAGE_CACHE[m_id].append(message) -@try_ async def runner(): + await asyncio.sleep(20) + raise TypeError() if not (Config.TAG_LOGGER or Config.PM_LOGGER): return last_pm_logged_id = 0 @@ -186,7 +182,6 @@ async def log_chat(message: Message): await log_deleted_message(message, data=(mention, u_id)) -@try_ async def log_deleted_message(message: Message, data: tuple | None = None): if data: mention, u_id = data diff --git a/app/utils/aiohttp_tools.py b/app/utils/aiohttp_tools.py index 2dbc204..de8921f 100644 --- a/app/utils/aiohttp_tools.py +++ b/app/utils/aiohttp_tools.py @@ -1,12 +1,15 @@ import json +import logging import os from io import BytesIO from aiohttp import ClientSession, web -from app import LOGGER, Config +from app import Config from app.utils.media_helper import get_filename +LOGGER = logging.getLogger("PLAIN-UB") + class Aio: def __init__(self):