Path: blob/master/bot/helper/telegram_helper/message_utils.py
1635 views
from asyncio import sleep1from pyrogram.errors import FloodWait, FloodPremiumWait2from re import match as re_match3from time import time45from ... import LOGGER, status_dict, task_dict_lock, intervals, DOWNLOAD_DIR6from ...core.config_manager import Config7from ...core.telegram_manager import TgClient8from ..ext_utils.bot_utils import SetInterval9from ..ext_utils.exceptions import TgLinkException10from ..ext_utils.status_utils import get_readable_message111213async def send_message(message, text, buttons=None, block=True):14try:15return await message.reply(16text=text,17disable_notification=True,18reply_markup=buttons,19)20except FloodWait as f:21LOGGER.warning(str(f))22if not block:23return str(f)24await sleep(f.value * 1.2)25return await send_message(message, text, buttons)26except Exception as e:27LOGGER.error(str(e))28return str(e)293031async def edit_message(message, text, buttons=None, block=True):32try:33return await message.edit(34text=text,35reply_markup=buttons,36)37except FloodWait as f:38LOGGER.warning(str(f))39if not block:40return str(f)41await sleep(f.value * 1.2)42return await edit_message(message, text, buttons)43except Exception as e:44LOGGER.error(str(e))45return str(e)464748async def send_file(message, file, caption=""):49try:50return await message.reply_document(51document=file, caption=caption, disable_notification=True52)53except FloodWait as f:54LOGGER.warning(str(f))55await sleep(f.value * 1.2)56return await send_file(message, file, caption)57except Exception as e:58LOGGER.error(str(e))59return str(e)606162async def send_rss(text, chat_id, thread_id):63try:64app = TgClient.user or TgClient.bot65return await app.send_message(66chat_id=chat_id,67text=text,68message_thread_id=thread_id,69disable_notification=True,70)71except (FloodWait, FloodPremiumWait) as f:72LOGGER.warning(str(f))73await sleep(f.value * 1.2)74return await send_rss(text, chat_id, thread_id)75except Exception as e:76LOGGER.error(str(e))77return str(e)787980async def delete_message(message):81try:82await message.delete()83except Exception as e:84LOGGER.error(str(e))858687async def auto_delete_message(cmd_message=None, bot_message=None):88await sleep(60)89if cmd_message is not None:90await delete_message(cmd_message)91if bot_message is not None:92await delete_message(bot_message)939495async def delete_status():96async with task_dict_lock:97for key, data in list(status_dict.items()):98try:99await delete_message(data["message"])100del status_dict[key]101except Exception as e:102LOGGER.error(str(e))103104105async def get_tg_link_message(link):106message = None107links = []108if link.startswith("https://t.me/"):109private = False110msg = re_match(111r"https:\/\/t\.me\/(?:c\/)?([^\/]+)(?:\/[^\/]+)?\/([0-9-]+)", link112)113else:114private = True115msg = re_match(116r"tg:\/\/openmessage\?user_id=([0-9]+)&message_id=([0-9-]+)", link117)118if not TgClient.user:119raise TgLinkException("USER_SESSION_STRING required for this private link!")120121chat = msg[1]122msg_id = msg[2]123if "-" in msg_id:124start_id, end_id = msg_id.split("-")125msg_id = start_id = int(start_id)126end_id = int(end_id)127btw = end_id - start_id128if private:129link = link.split("&message_id=")[0]130links.append(f"{link}&message_id={start_id}")131for _ in range(btw):132start_id += 1133links.append(f"{link}&message_id={start_id}")134else:135link = link.rsplit("/", 1)[0]136links.append(f"{link}/{start_id}")137for _ in range(btw):138start_id += 1139links.append(f"{link}/{start_id}")140else:141msg_id = int(msg_id)142143if chat.isdigit():144chat = int(chat) if private else int(f"-100{chat}")145146if not private:147try:148message = await TgClient.bot.get_messages(chat_id=chat, message_ids=msg_id)149if message.empty:150private = True151except Exception as e:152private = True153if not TgClient.user:154raise e155156if not private:157return (links, "bot") if links else (message, "bot")158elif TgClient.user:159try:160user_message = await TgClient.user.get_messages(161chat_id=chat, message_ids=msg_id162)163except Exception as e:164raise TgLinkException(165f"You don't have access to this chat!. ERROR: {e}"166) from e167if not user_message.empty:168return (links, "user") if links else (user_message, "user")169else:170raise TgLinkException("Private: Please report!")171172173async def temp_download(msg):174path = f"{DOWNLOAD_DIR}temp"175return await msg.download(file_name=f"{path}/")176177178async def update_status_message(sid, force=False):179if intervals["stopAll"]:180return181async with task_dict_lock:182if not status_dict.get(sid):183if obj := intervals["status"].get(sid):184obj.cancel()185del intervals["status"][sid]186return187if not force and time() - status_dict[sid]["time"] < 3:188return189status_dict[sid]["time"] = time()190page_no = status_dict[sid]["page_no"]191status = status_dict[sid]["status"]192is_user = status_dict[sid]["is_user"]193page_step = status_dict[sid]["page_step"]194text, buttons = await get_readable_message(195sid, is_user, page_no, status, page_step196)197if text is None:198del status_dict[sid]199if obj := intervals["status"].get(sid):200obj.cancel()201del intervals["status"][sid]202return203if text != status_dict[sid]["message"].text:204message = await edit_message(205status_dict[sid]["message"], text, buttons, block=False206)207if isinstance(message, str):208if message.startswith("Telegram says: [40"):209del status_dict[sid]210if obj := intervals["status"].get(sid):211obj.cancel()212del intervals["status"][sid]213else:214LOGGER.error(215f"Status with id: {sid} haven't been updated. Error: {message}"216)217return218status_dict[sid]["message"].text = text219status_dict[sid]["time"] = time()220221222async def send_status_message(msg, user_id=0):223if intervals["stopAll"]:224return225sid = user_id or msg.chat.id226is_user = bool(user_id)227async with task_dict_lock:228if sid in status_dict:229page_no = status_dict[sid]["page_no"]230status = status_dict[sid]["status"]231page_step = status_dict[sid]["page_step"]232text, buttons = await get_readable_message(233sid, is_user, page_no, status, page_step234)235if text is None:236del status_dict[sid]237if obj := intervals["status"].get(sid):238obj.cancel()239del intervals["status"][sid]240return241old_message = status_dict[sid]["message"]242message = await send_message(msg, text, buttons, block=False)243if isinstance(message, str):244LOGGER.error(245f"Status with id: {sid} haven't been sent. Error: {message}"246)247return248await delete_message(old_message)249message.text = text250status_dict[sid].update({"message": message, "time": time()})251else:252text, buttons = await get_readable_message(sid, is_user)253if text is None:254return255message = await send_message(msg, text, buttons, block=False)256if isinstance(message, str):257LOGGER.error(258f"Status with id: {sid} haven't been sent. Error: {message}"259)260return261message.text = text262status_dict[sid] = {263"message": message,264"time": time(),265"page_no": 1,266"page_step": 1,267"status": "All",268"is_user": is_user,269}270if not intervals["status"].get(sid) and not is_user:271intervals["status"][sid] = SetInterval(272Config.STATUS_UPDATE_INTERVAL, update_status_message, sid273)274275276