azils3/bash
0
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 