| | import sys |
| | import traceback |
| | from functools import wraps |
| |
|
| | from pyrogram.errors.exceptions.forbidden_403 import ChatWriteForbidden |
| | from Devine import app |
| | from Devine.logging import LOGGER |
| |
|
| |
|
| | def split_limits(text): |
| | if len(text) < 2048: |
| | return [text] |
| |
|
| | lines = text.splitlines(True) |
| | small_msg = "" |
| | result = [] |
| | for line in lines: |
| | if len(small_msg) + len(line) < 2048: |
| | small_msg += line |
| | else: |
| | result.append(small_msg) |
| | small_msg = line |
| |
|
| | result.append(small_msg) |
| |
|
| | return result |
| |
|
| |
|
| | def capture_err(func): |
| | @wraps(func) |
| | async def capture(client, message, *args, **kwargs): |
| | try: |
| | return await func(client, message, *args, **kwargs) |
| | except ChatWriteForbidden: |
| | await app.leave_chat(message.chat.id) |
| | return |
| | except Exception as err: |
| | exc_type, exc_obj, exc_tb = sys.exc_info() |
| | errors = traceback.format_exception( |
| | etype=exc_type, |
| | value=exc_obj, |
| | tb=exc_tb, |
| | ) |
| | error_feedback = split_limits( |
| | "**ERROR** | `{}` | `{}`\n\n```{}```\n\n```{}```\n".format( |
| | 0 if not message.from_user else message.from_user.id, |
| | 0 if not message.chat else message.chat.id, |
| | message.text or message.caption, |
| | "".join(errors), |
| | ), |
| | ) |
| | for x in error_feedback: |
| | await app.send_message(LOGGER, x) |
| | raise err |
| |
|
| | return capture |
| |
|