from io import BytesIO from pyrogram import filters from pyrogram.types import Message from DragMusic import app import httpx # ----------------------------------------------------------------- fetch = httpx.AsyncClient( http2=True, verify=False, headers={ "Accept-Language": "id-ID", "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36 Edge/107.0.1418.42", }, timeout=httpx.Timeout(20), ) # ------------------------------------------------------------------------ class QuotlyException(Exception): pass # -------------------------------------------------------------------------- async def get_message_sender_id(ctx: Message): if ctx.forward_date: if ctx.forward_sender_name: return 1 elif ctx.forward_from: return ctx.forward_from.id elif ctx.forward_from_chat: return ctx.forward_from_chat.id else: return 1 elif ctx.from_user: return ctx.from_user.id elif ctx.sender_chat: return ctx.sender_chat.id else: return 1 # ----------------------------------------------------------------------------------------- async def get_message_sender_name(ctx: Message): if ctx.forward_date: if ctx.forward_sender_name: return ctx.forward_sender_name elif ctx.forward_from: return ( f"{ctx.forward_from.first_name} {ctx.forward_from.last_name}" if ctx.forward_from.last_name else ctx.forward_from.first_name ) elif ctx.forward_from_chat: return ctx.forward_from_chat.title else: return "" elif ctx.from_user: if ctx.from_user.last_name: return f"{ctx.from_user.first_name} {ctx.from_user.last_name}" else: return ctx.from_user.first_name elif ctx.sender_chat: return ctx.sender_chat.title else: return "" # --------------------------------------------------------------------------------------------------- async def get_message_sender_username(ctx: Message): if ctx.forward_date: if ( not ctx.forward_sender_name and not ctx.forward_from and ctx.forward_from_chat and ctx.forward_from_chat.username ): return ctx.forward_from_chat.username elif ( not ctx.forward_sender_name and not ctx.forward_from and ctx.forward_from_chat or ctx.forward_sender_name or not ctx.forward_from ): return "" else: return ctx.forward_from.username or "" elif ctx.from_user and ctx.from_user.username: return ctx.from_user.username elif ( ctx.from_user or ctx.sender_chat and not ctx.sender_chat.username or not ctx.sender_chat ): return "" else: return ctx.sender_chat.username # ------------------------------------------------------------------------ async def get_message_sender_photo(ctx: Message): if ctx.forward_date: if ( not ctx.forward_sender_name and not ctx.forward_from and ctx.forward_from_chat and ctx.forward_from_chat.photo ): return { "small_file_id": ctx.forward_from_chat.photo.small_file_id, "small_photo_unique_id": ctx.forward_from_chat.photo.small_photo_unique_id, "big_file_id": ctx.forward_from_chat.photo.big_file_id, "big_photo_unique_id": ctx.forward_from_chat.photo.big_photo_unique_id, } elif ( not ctx.forward_sender_name and not ctx.forward_from and ctx.forward_from_chat or ctx.forward_sender_name or not ctx.forward_from ): return "" else: return ( { "small_file_id": ctx.forward_from.photo.small_file_id, "small_photo_unique_id": ctx.forward_from.photo.small_photo_unique_id, "big_file_id": ctx.forward_from.photo.big_file_id, "big_photo_unique_id": ctx.forward_from.photo.big_photo_unique_id, } if ctx.forward_from.photo else "" ) elif ctx.from_user and ctx.from_user.photo: return { "small_file_id": ctx.from_user.photo.small_file_id, "small_photo_unique_id": ctx.from_user.photo.small_photo_unique_id, "big_file_id": ctx.from_user.photo.big_file_id, "big_photo_unique_id": ctx.from_user.photo.big_photo_unique_id, } elif ( ctx.from_user or ctx.sender_chat and not ctx.sender_chat.photo or not ctx.sender_chat ): return "" else: return { "small_file_id": ctx.sender_chat.photo.small_file_id, "small_photo_unique_id": ctx.sender_chat.photo.small_photo_unique_id, "big_file_id": ctx.sender_chat.photo.big_file_id, "big_photo_unique_id": ctx.sender_chat.photo.big_photo_unique_id, } # --------------------------------------------------------------------------------------------------- async def get_text_or_caption(ctx: Message): if ctx.text: return ctx.text elif ctx.caption: return ctx.caption else: return "" # --------------------------------------------------------------------------------------------------- async def pyrogram_to_quotly(messages, is_reply): if not isinstance(messages, list): messages = [messages] payload = { "type": "quote", "format": "png", "backgroundColor": "#1b1429", "messages": [], } for message in messages: the_message_dict_to_append = {} if message.entities: the_message_dict_to_append["entities"] = [ { "type": entity.type.name.lower(), "offset": entity.offset, "length": entity.length, } for entity in message.entities ] elif message.caption_entities: the_message_dict_to_append["entities"] = [ { "type": entity.type.name.lower(), "offset": entity.offset, "length": entity.length, } for entity in message.caption_entities ] else: the_message_dict_to_append["entities"] = [] the_message_dict_to_append["chatId"] = await get_message_sender_id(message) the_message_dict_to_append["text"] = await get_text_or_caption(message) the_message_dict_to_append["avatar"] = True the_message_dict_to_append["from"] = {} the_message_dict_to_append["from"]["id"] = await get_message_sender_id(message) the_message_dict_to_append["from"]["name"] = await get_message_sender_name(message) the_message_dict_to_append["from"]["username"] = await get_message_sender_username(message) the_message_dict_to_append["from"]["type"] = message.chat.type.name.lower() the_message_dict_to_append["from"]["photo"] = await get_message_sender_photo(message) if message.reply_to_message and is_reply: the_message_dict_to_append["replyMessage"] = { "name": await get_message_sender_name(message.reply_to_message), "text": await get_text_or_caption(message.reply_to_message), "chatId": await get_message_sender_id(message.reply_to_message), } else: the_message_dict_to_append["replyMessage"] = {} payload["messages"].append(the_message_dict_to_append) r = await fetch.post("https://bot.lyo.su/quote/generate.png", json=payload) if not r.is_error: return r.read() else: raise QuotlyException(await r.aread()) # ------------------------------------------------------------------------------------------ def isArgInt(txt) -> list: count = txt try: count = int(count) return [True, count] except ValueError: return [False, 0] # --------------------------------------------------------------------------------------------------- @app.on_message(filters.command(["q"]) & filters.reply) async def msg_quotly_cmd(client, ctx: Message): args = ctx.text.split() is_reply = False quote_range = 1 # /q r or /q if len(args) > 1: if args[1].lower() == "r": is_reply = True else: try: quote_range = int(args[1]) if quote_range < 2 or quote_range > 10: return await ctx.reply("Invalid range (2-10)") except ValueError: return await ctx.reply("Invalid argument. Use /q r or /q (2-10)") if quote_range > 1: try: messages = [ i for i in await client.get_messages( chat_id=ctx.chat.id, message_ids=range( ctx.reply_to_message.id, ctx.reply_to_message.id + quote_range ), replies=-1, ) if not i.empty and not i.media ] except Exception: return await ctx.reply_text("🤷🏻‍♂️") try: make_quotly = await pyrogram_to_quotly(messages, is_reply=is_reply) bio_sticker = BytesIO(make_quotly) bio_sticker.name = "misskatyquote_sticker.webp" return await ctx.reply_sticker(bio_sticker) except Exception: return await ctx.reply("🤷🏻‍♂️") else: try: messages_one = await client.get_messages( chat_id=ctx.chat.id, message_ids=ctx.reply_to_message.id, replies=-1 ) messages = [messages_one] except Exception: return await ctx.reply("🤷🏻‍♂️") try: make_quotly = await pyrogram_to_quotly(messages, is_reply=is_reply) bio_sticker = BytesIO(make_quotly) bio_sticker.name = "misskatyquote_sticker.webp" return await ctx.reply_sticker(bio_sticker) except Exception as e: return await ctx.reply(f"ERROR: {e}")