from .. import loader, utils import telethon import logging import io from telethon.tl.types import (ChannelParticipantsAdmins, ChannelParticipantCreator, ChannelParticipantAdmin, User) from requests import post from PIL import Image logger = logging.getLogger("kzdQuotes") @loader.tds class kzdQuotesMod(loader.Module): """kzdQuote a message""" strings = { "name": "kzdQuotes", "processing": "️Quoting", "processing_api": "Quoting💬", "no_reply": "Нет реплая", "mediaType_photo": "️Фото", "mediaType_video": "Видео", "mediaType_videomessage": "Видеосообщение", "mediaType_voice": "️Аудиосообщение", "mediaType_audio": "Аудио", "mediaType_poll": "Голосование", "mediaType_quiz": "Викторина", "mediaType_location": "Геолокация", "mediaType_gif": "GIF", "mediaType_sticker": "Стикер", "mediaType_file": "Файл: ", "diceType_dice": "Кубик", "diceType_dart": "Дартс", "ball_thrown": "Бросок мяча", "dart_thrown": "Бросок дротика", "dart_almostthere": "близко к цели!", "dart_missed": "мимо!", "dart_bullseye": "в яблочко!", "settings": "Доступные настройки:\ncolor - hex color - Цвет квотеса" } async def client_ready(self, client, db): self.client = client self.db = db @loader.unrestricted @loader.ratelimit async def qqcmd(self, message): args = utils.get_args_raw(message) reply = await message.get_reply_message() if not reply: await utils.answer(message, self.strings('no_reply', message)) return await utils.answer(message, self.strings('processing', message)) fwd = via = rtext = file = thumb = rname = admintitle = None if ".file" in args: file = True args = args.replace(".file","").strip() text = args or reply.text sender = user = reply.sender if sender: id = sender.id if sender.id != 1087968824 else reply.chat.id else: id = reply.fwd_from.channel_id sender = await message.client.get_entity(id) name = "Deleted Account" if user and sender.deleted else telethon.utils.get_display_name(sender) pfp = await message.client.download_profile_photo(sender, bytes) if reply.fwd_from and reply.sender: id = reply.fwd_from.from_id or reply.fwd_from.channel_id if not id: fname = reply.fwd_from.from_name else: sender = await message.client.get_entity(id) fwd = telethon.utils.get_display_name(sender) if reply.via_bot: via = reply.via_bot.username or "magic" img = await check_media(message, reply) rreply = await reply.get_reply_message() if rreply and not args: thumb = await check_media(message, rreply, True) rtext = rreply.raw_text if rreply.media: rtext = await get_media_caption(rreply) #спиздено у t.me/rfoxxxy rsender = rreply.sender rname = telethon.utils.get_display_name(rsender) if message.chat and reply.sender: admins = await message.client.get_participants(message.to_id, filter=ChannelParticipantsAdmins) if reply.sender in admins: admin = admins[admins.index(reply.sender)].participant if not admin: admintitle = None else: admintitle = admin.rank if not admintitle: if type(admin) == ChannelParticipantCreator: admintitle = "creator" else: admintitle = "admin" else: admintitle = "channel" if message.chat else None color = self.db.get("kzdQuotes", "color", None) data = {"id":id,"name":name,"admin":admintitle, "via":via, "fwd":fwd,"text":text,"rtext":rtext,"rname":rname, "color":color} files = {"pfp": pfp, "img":img, "thumb": thumb} await utils.answer(message, self.strings('processing_api', message)) q = post("https://tyt.keyzend.pw/quote", data=data, files=files).content quote = io.BytesIO() quote.name = "govnoquotes"+ (".png" if file else ".webp") im = Image.open(io.BytesIO(q)) if not file: im.thumbnail((512, 512)) back = Image.new("RGBA", (im.width, im.height+100), None) back.paste(im, (0, 0), im) im = back im.thumbnail((512, 512)) im.save(quote, "PNG" if file else "WEBP") quote.seek(0) await reply.reply(file=quote, force_document=file) await message.delete() @loader.unrestricted @loader.ratelimit async def qqsetcmd(self, message): args = utils.get_args(message) if len(args) != 2 or args[0].lower() not in ["color"]: await utils.answer(message, self.strings('settings', message)) return key, value = args self.db.set("kzdQuotes", key, value) await message.edit(f"Значение {args[0]} установлено") async def get_media_caption(reply): if reply and reply.media: if reply.photo: return kzdQuotesMod.strings["mediaType_photo"] if reply.text: return reply.raw_text dice = False try: dice = True if reply.dice else False except AttributeError: try: dice = True if type(reply.media) == telethon.tl.types.MessageMediaDice else False except AttributeError: pass if dice: dice_type = "" dice_text = reply.media.value if reply.media.emoticon == "🎲": dice_type = kzdQuotesMod.strings["diceType_dice"] return "{} {}: {}".format(reply.media.emoticon, dice_type, dice_text) elif reply.media.emoticon == "🎯": if dice_text == 1: dice_text = kzdQuotesMod.strings["dart_missed"] elif dice_text == 5: dice_text = kzdQuotesMod.strings["dart_almostthere"] elif dice_text == 6: dice_text = kzdQuotesMod.strings["dart_bullseye"] else: return "{} {}".format(reply.media.emoticon, kzdQuotesMod.strings["dart_thrown"]) dice_type = kzdQuotesMod.strings["diceType_dart"] return "{} {}: {}".format(reply.media.emoticon, dice_type, dice_text) elif reply.media.emoticon == "🏀": return "{} {}".format(reply.media.emoticon, kzdQuotesMod.strings["ball_thrown"]) else: return "Unsupported dice type ({}): {}".format(reply.media.emoticon, reply.media.value) elif reply.poll: try: if reply.media.poll.quiz is True: return kzdQuotesMod.strings["mediaType_quiz"] except Exception: pass return kzdQuotesMod.strings["mediaType_poll"] elif reply.geo: return kzdQuotesMod.strings["mediaType_location"] elif reply.document: if reply.gif : return kzdQuotesMod.strings["mediaType_gif"] elif reply.video: if reply.video.attributes[0].round_message: return kzdQuotesMod.strings["mediaType_videomessage"] else: return kzdQuotesMod.strings["mediaType_video"] elif reply.audio: return kzdQuotesMod.strings["mediaType_audio"] elif reply.voice: return kzdQuotesMod.strings["mediaType_voice"] elif reply.file: if reply.file.mime_type == "application/x-tgsticker": emoji = "" try: emoji = reply.media.document.attributes[0].alt except AttributeError: try: emoji = reply.media.document.attributes[1].alt except AttributeError: emoji = "" caption = "{} {}".format(emoji, kzdQuotesMod.strings["mediaType_sticker"]) if emoji != "" else kzdQuotesMod.strings["mediaType_sticker"] return caption else: if reply.sticker: emoji = "" try: emoji = reply.file.emoji logger.debug(len(emoji)) except TypeError: emoji = "" caption = "{} {}".format(emoji, kzdQuotesMod.strings["mediaType_sticker"]) if emoji != "" else kzdQuotesMod.strings["mediaType_sticker"] return caption else: return kzdQuotesMod.strings["mediaType_file"] + reply.file.name else: return "" else: return "" return "" async def check_media(message, reply, x=None): if reply and reply.media: if reply.photo: data = reply.photo elif reply.document: if reply.gif or reply.video or reply.file.mime_type == "application/x-tgsticker": return await reply.download_media(bytes, thumb=-1) if x else None if reply.audio or reply.voice: return None data = reply.media.document else: return None else: return None if not data or data is None: return None else: return await message.client.download_file(data, bytes)