Team Ai
Apppublic

azils3/bash

sourceHugging Faceupdated 2y agoView on Hugging Face
0likes
_decorators.py326 linesDownload Raw Back to _misc
1# Ultroid - UserBot2# Copyright (C) 2021-2025 TeamUltroid3#4# This file is a part of < https://github.com/TeamUltroid/Ultroid/ >5# PLease read the GNU Affero General Public License in6# <https://github.com/TeamUltroid/pyUltroid/blob/main/LICENSE>.7 8import asyncio9import inspect10import re11import sys12from io import BytesIO13from pathlib import Path14from time import gmtime, strftime15from traceback import format_exc16 17from telethon import Button18from telethon import __version__ as telever19from telethon import events20from telethon.errors.common import AlreadyInConversationError21from telethon.errors.rpcerrorlist import (22    AuthKeyDuplicatedError,23    BotInlineDisabledError,24    BotMethodInvalidError,25    ChatSendInlineForbiddenError,26    ChatSendMediaForbiddenError,27    ChatSendStickersForbiddenError,28    FloodWaitError,29    MessageDeleteForbiddenError,30    MessageIdInvalidError,31    MessageNotModifiedError,32    UserIsBotError,33)34from telethon.events import MessageEdited, NewMessage35from telethon.utils import get_display_name36 37from pyUltroid.exceptions import DependencyMissingError38from strings import get_string39 40from .. import *41from .. import _ignore_eval42from ..dB import DEVLIST43from ..dB._core import LIST, LOADED44from ..fns.admins import admin_check45from ..fns.helper import bash46from ..fns.helper import time_formatter as tf47from ..version import __version__ as pyver48from ..version import ultroid_version as ult_ver49from . import SUDO_M, owner_and_sudos50from ._wrappers import eod51 52MANAGER = udB.get_key("MANAGER")53TAKE_EDITS = udB.get_key("TAKE_EDITS")54black_list_chats = udB.get_key("BLACKLIST_CHATS")55allow_sudo = SUDO_M.should_allow_sudo56 57 58def compile_pattern(data, hndlr):59    if data.startswith("^"):60        data = data[1:]61    if data.startswith("."):62        data = data[1:]63    if hndlr in [" ", "NO_HNDLR"]:64        # No Hndlr Feature65        return re.compile("^" + data)66    return re.compile("\\" + hndlr + data)67 68 69def ultroid_cmd(70    pattern=None, manager=False, ultroid_bot=ultroid_bot, asst=asst, **kwargs71):72    owner_only = kwargs.get("owner_only", False)73    groups_only = kwargs.get("groups_only", False)74    admins_only = kwargs.get("admins_only", False)75    fullsudo = kwargs.get("fullsudo", False)76    only_devs = kwargs.get("only_devs", False)77    func = kwargs.get("func", lambda e: not e.via_bot_id)78 79    def decor(dec):80        async def wrapp(ult):81            if not ult.out:82                if owner_only:83                    return84                if ult.sender_id not in owner_and_sudos():85                    return86                if ult.sender_id in _ignore_eval:87                    return await eod(88                        ult,89                        get_string("py_d1"),90                    )91                if fullsudo and ult.sender_id not in SUDO_M.fullsudos:92                    return await eod(ult, get_string("py_d2"), time=15)93            chat = ult.chat94            if hasattr(chat, "title"):95                if (96                    "#noub" in chat.title.lower()97                    and not (chat.admin_rights or chat.creator)98                    and not (ult.sender_id in DEVLIST)99                ):100                    return101            if ult.is_private and (groups_only or admins_only):102                return await eod(ult, get_string("py_d3"))103            elif admins_only and not (chat.admin_rights or chat.creator):104                return await eod(ult, get_string("py_d5"))105            if only_devs and not udB.get_key("I_DEV"):106                return await eod(107                    ult,108                    get_string("py_d4").format(HNDLR),109                    time=10,110                )111            try:112                await dec(ult)113            except FloodWaitError as fwerr:114                await asst.send_message(115                    udB.get_key("LOG_CHANNEL"),116                    f"`FloodWaitError:\n{str(fwerr)}\n\nSleeping for {tf((fwerr.seconds + 10)*1000)}`",117                )118                await ultroid_bot.disconnect()119                await asyncio.sleep(fwerr.seconds + 10)120                await ultroid_bot.connect()121                await asst.send_message(122                    udB.get_key("LOG_CHANNEL"),123                    "`Bot is working again`",124                )125                return126            except ChatSendInlineForbiddenError:127                return await eod(ult, "`Inline Locked In This Chat.`")128            except (ChatSendMediaForbiddenError, ChatSendStickersForbiddenError):129                return await eod(ult, get_string("py_d8"))130            except (BotMethodInvalidError, UserIsBotError):131                return await eod(ult, get_string("py_d6"))132            except AlreadyInConversationError:133                return await eod(134                    ult,135                    get_string("py_d7"),136                )137            except (BotInlineDisabledError, DependencyMissingError) as er:138                return await eod(ult, f"`{er}`")139            except (140                MessageIdInvalidError,141                MessageNotModifiedError,142                MessageDeleteForbiddenError,143            ) as er:144                LOGS.exception(er)145            except AuthKeyDuplicatedError as er:146                LOGS.exception(er)147                await asst.send_message(148                    udB.get_key("LOG_CHANNEL"),149                    "Session String expired, create new session from ๐Ÿ‘‡",150                    buttons=[151                        Button.url("Bot", "t.me/SessionGeneratorBot?start="),152                        Button.url(153                            "Repl",154                            "https://replit.com/@TheUltroid/UltroidStringSession",155                        ),156                    ],157                )158                sys.exit()159            except events.StopPropagation:160                raise events.StopPropagation161            except KeyboardInterrupt:162                pass163            except Exception as e:164                LOGS.exception(e)165                date = strftime("%Y-%m-%d %H:%M:%S", gmtime())166                naam = get_display_name(chat)167                ftext = "**Ultroid Client Error:** `Forward this to` @UltroidSupportChat\n\n"168                ftext += "**Py-Ultroid Version:** `" + str(pyver)169                ftext += "`\n**Ultroid Version:** `" + str(ult_ver)170                ftext += "`\n**Telethon Version:** `" + str(telever)171                ftext += f"`\n**Hosted At:** `{HOSTED_ON}`\n\n"172                ftext += "--------START ULTROID CRASH LOG--------"173                ftext += "\n**Date:** `" + date174                ftext += "`\n**Group:** `" + str(ult.chat_id) + "` " + str(naam)175                ftext += "\n**Sender ID:** `" + str(ult.sender_id)176                ftext += "`\n**Replied:** `" + str(ult.is_reply)177                ftext += "`\n\n**Event Trigger:**`\n"178                ftext += str(ult.text)179                ftext += "`\n\n**Traceback info:**`\n"180                ftext += str(format_exc())181                ftext += "`\n\n**Error text:**`\n"182                ftext += str(sys.exc_info()[1])183                ftext += "`\n\n--------END ULTROID CRASH LOG--------"184                ftext += "\n\n\n**Last 5 commits:**`\n"185 186                stdout, stderr = await bash('git log --pretty=format:"%an: %s" -5')187                result = stdout + (stderr or "")188 189                ftext += f"{result}`"190 191                if len(ftext) > 4096:192                    with BytesIO(ftext.encode()) as file:193                        file.name = "logs.txt"194                        error_log = await asst.send_file(195                            udB.get_key("LOG_CHANNEL"),196                            file,197                            caption="**Ultroid Client Error:** `Forward this to` @UltroidSupportChat\n\n",198                        )199                else:200                    error_log = await asst.send_message(201                        udB.get_key("LOG_CHANNEL"),202                        ftext,203                    )204                if ult.out:205                    await ult.edit(206                        f"<b><a href={error_log.message_link}>[An error occurred]</a></b>",207                        link_preview=False,208                        parse_mode="html",209                    )210 211        cmd = None212        blacklist_chats = False213        chats = None214        if black_list_chats:215            blacklist_chats = True216            chats = list(black_list_chats)217        _add_new = allow_sudo and HNDLR != SUDO_HNDLR218        if _add_new:219            if pattern:220                cmd = compile_pattern(pattern, SUDO_HNDLR)221            ultroid_bot.add_event_handler(222                wrapp,223                NewMessage(224                    pattern=cmd,225                    incoming=True,226                    forwards=False,227                    func=func,228                    chats=chats,229                    blacklist_chats=blacklist_chats,230                ),231            )232        if pattern:233            cmd = compile_pattern(pattern, HNDLR)234        ultroid_bot.add_event_handler(235            wrapp,236            NewMessage(237                outgoing=True if _add_new else None,238                pattern=cmd,239                forwards=False,240                func=func,241                chats=chats,242                blacklist_chats=blacklist_chats,243            ),244        )245        if TAKE_EDITS:246 247            def func_(x):248                return not x.via_bot_id and not (x.is_channel and x.chat.broadcast)249 250            ultroid_bot.add_event_handler(251                wrapp,252                MessageEdited(253                    pattern=cmd,254                    forwards=False,255                    func=func_,256                    chats=chats,257                    blacklist_chats=blacklist_chats,258                ),259            )260        if manager and MANAGER:261            allow_all = kwargs.get("allow_all", False)262            allow_pm = kwargs.get("allow_pm", False)263            require = kwargs.get("require", None)264 265            async def manager_cmd(ult):266                if not allow_all and not (await admin_check(ult, require=require)):267                    return268                if not allow_pm and ult.is_private:269                    return270                try:271                    await dec(ult)272                except Exception as er:273                    if chat := udB.get_key("MANAGER_LOG"):274                        text = f"**#MANAGER_LOG\n\nChat:** `{get_display_name(ult.chat)}` `{ult.chat_id}`"275                        text += f"\n**Replied :** `{ult.is_reply}`\n**Command :** {ult.text}\n\n**Error :** `{er}`"276                        try:277                            return await asst.send_message(278                                chat, text, link_preview=False279                            )280                        except Exception as er:281                            LOGS.exception(er)282                    LOGS.info(f"โ€ข MANAGER [{ult.chat_id}]:")283                    LOGS.exception(er)284 285            if pattern:286                cmd = compile_pattern(pattern, "/")287            asst.add_event_handler(288                manager_cmd,289                NewMessage(290                    pattern=cmd,291                    forwards=False,292                    incoming=True,293                    func=func,294                    chats=chats,295                    blacklist_chats=blacklist_chats,296                ),297            )298        if DUAL_MODE and not (manager and DUAL_HNDLR == "/"):299            if pattern:300                cmd = compile_pattern(pattern, DUAL_HNDLR)301            asst.add_event_handler(302                wrapp,303                NewMessage(304                    pattern=cmd,305                    incoming=True,306                    forwards=False,307                    func=func,308                    chats=chats,309                    blacklist_chats=blacklist_chats,310                ),311            )312        file = Path(inspect.stack()[1].filename)313        if "addons/" in str(file):314            if LOADED.get(file.stem):315                LOADED[file.stem].append(wrapp)316            else:317                LOADED.update({file.stem: [wrapp]})318        if pattern:319            if LIST.get(file.stem):320                LIST[file.stem].append(pattern)321            else:322                LIST.update({file.stem: [pattern]})323        return wrapp324 325    return decor326