|
|
|
import base64 |
|
import os |
|
from random import choice |
|
|
|
from aiohttp import ContentTypeError |
|
from PIL import Image |
|
from telethon.tl import types |
|
from telethon.utils import get_display_name, get_peer_id |
|
|
|
from Mikobot import DEV_USERS |
|
from Mikobot.events import register |
|
|
|
|
|
|
|
|
|
|
|
class Quotly: |
|
_API = "https://bot.lyo.su/quote/generate" |
|
_entities = { |
|
types.MessageEntityPhone: "phone_number", |
|
types.MessageEntityMention: "mention", |
|
types.MessageEntityBold: "bold", |
|
types.MessageEntityCashtag: "cashtag", |
|
types.MessageEntityStrike: "strikethrough", |
|
types.MessageEntityHashtag: "hashtag", |
|
types.MessageEntityEmail: "email", |
|
types.MessageEntityMentionName: "text_mention", |
|
types.MessageEntityUnderline: "underline", |
|
types.MessageEntityUrl: "url", |
|
types.MessageEntityTextUrl: "text_link", |
|
types.MessageEntityBotCommand: "bot_command", |
|
types.MessageEntityCode: "code", |
|
types.MessageEntityPre: "pre", |
|
} |
|
|
|
async def _format_quote(self, event, reply=None, sender=None, type_="private"): |
|
async def telegraph(file_): |
|
file = file_ + ".png" |
|
Image.open(file_).save(file, "PNG") |
|
files = {"file": open(file, "rb").read()} |
|
uri = ( |
|
"https://telegra.ph" |
|
+ ( |
|
await async_searcher( |
|
"https://telegra.ph/upload", post=True, data=files, re_json=True |
|
) |
|
)[0]["src"] |
|
) |
|
os.remove(file) |
|
os.remove(file_) |
|
return uri |
|
|
|
reply = ( |
|
{ |
|
"name": get_display_name(reply.sender) or "Deleted Account", |
|
"text": reply.raw_text, |
|
"chatId": reply.chat_id, |
|
} |
|
if reply |
|
else {} |
|
) |
|
|
|
is_fwd = event.fwd_from |
|
name, last_name = None, None |
|
|
|
if sender and sender.id not in DEV_USERS: |
|
id_ = get_peer_id(sender) |
|
name = get_display_name(sender) |
|
elif not is_fwd: |
|
id_ = event.sender_id |
|
sender = await event.get_sender() |
|
name = get_display_name(sender) |
|
else: |
|
id_, sender = None, None |
|
name = is_fwd.from_name |
|
if is_fwd.from_id: |
|
id_ = get_peer_id(is_fwd.from_id) |
|
try: |
|
sender = await event.client.get_entity(id_) |
|
name = get_display_name(sender) |
|
except ValueError: |
|
pass |
|
if sender and hasattr(sender, "last_name"): |
|
last_name = sender.last_name |
|
|
|
entities = ( |
|
[ |
|
{ |
|
"type": self._entities[type(entity)], |
|
**{k: v for k, v in entity.to_dict().items() if k != "_"}, |
|
} |
|
for entity in event.entities |
|
] |
|
if event.entities |
|
else [] |
|
) |
|
|
|
message = { |
|
"entities": entities, |
|
"chatId": id_, |
|
"avatar": True, |
|
"from": { |
|
"id": id_, |
|
"first_name": (name or (sender.first_name if sender else None)) |
|
or "Deleted Account", |
|
"last_name": last_name, |
|
"username": sender.username if sender else None, |
|
"language_code": "en", |
|
"title": name, |
|
"name": name or "Unknown", |
|
"type": type_, |
|
}, |
|
"text": event.raw_text, |
|
"replyMessage": reply, |
|
} |
|
|
|
if event.document and event.document.thumbs: |
|
file_ = await event.download_media(thumb=-1) |
|
uri = await telegraph(file_) |
|
message["media"] = {"url": uri} |
|
|
|
return message |
|
|
|
async def create_quotly( |
|
self, |
|
event, |
|
url="https://quote-api.example.com/generate", |
|
reply={}, |
|
bg=None, |
|
sender=None, |
|
OQAPI=True, |
|
file_name="quote.webp", |
|
): |
|
if not isinstance(event, list): |
|
event = [event] |
|
if OQAPI: |
|
url = Quotly._API |
|
bg = bg or "#1b1429" |
|
content = { |
|
"type": "quote", |
|
"format": "webp", |
|
"backgroundColor": bg, |
|
"width": 512, |
|
"height": 768, |
|
"scale": 2, |
|
"messages": [ |
|
await self._format_quote(message, reply=reply, sender=sender) |
|
for message in event |
|
], |
|
} |
|
try: |
|
request = await async_searcher(url, post=True, json=content, re_json=True) |
|
except ContentTypeError as er: |
|
if url != self._API: |
|
return await self.create_quotly( |
|
self._API, post=True, json=content, re_json=True |
|
) |
|
raise er |
|
|
|
if request.get("ok"): |
|
with open(file_name, "wb") as file: |
|
image = base64.decodebytes(request["result"]["image"].encode("utf-8")) |
|
file.write(image) |
|
return file_name |
|
raise Exception(str(request)) |
|
|
|
|
|
quotly = Quotly() |
|
|
|
|
|
async def async_searcher( |
|
url: str, |
|
post: bool = None, |
|
headers: dict = None, |
|
params: dict = None, |
|
json: dict = None, |
|
data: dict = None, |
|
ssl=None, |
|
re_json: bool = False, |
|
re_content: bool = False, |
|
real: bool = False, |
|
*args, |
|
**kwargs |
|
): |
|
try: |
|
import aiohttp |
|
except ImportError: |
|
raise DependencyMissingError( |
|
"'aiohttp' is not installed!\nThis function requires aiohttp to be installed." |
|
) |
|
|
|
async with aiohttp.ClientSession(headers=headers) as client: |
|
data = await ( |
|
client.post(url, json=json, data=data, ssl=ssl, *args, **kwargs) |
|
if post |
|
else client.get(url, params=params, ssl=ssl, *args, **kwargs) |
|
) |
|
return await ( |
|
data.json() if re_json else data.read() if re_content else data.text() |
|
) |
|
|
|
|
|
@register(pattern="^/q(?: |$)(.*)") |
|
async def quott_(event): |
|
match = event.pattern_match.group(1).strip() |
|
if not event.is_reply: |
|
return await event.reply("Please reply to a message.") |
|
|
|
msg = await event.reply("Creating quote, please wait.") |
|
reply = await event.get_reply_message() |
|
replied_to, reply_ = None, None |
|
|
|
if match: |
|
spli_ = match.split(maxsplit=1) |
|
if (spli_[0] in ["r", "reply"]) or ( |
|
spli_[0].isdigit() and int(spli_[0]) in range(1, 21) |
|
): |
|
if spli_[0].isdigit(): |
|
if not event.client.is_bot: |
|
reply_ = await event.client.get_messages( |
|
event.chat_id, |
|
min_id=event.reply_to_msg_id - 1, |
|
reverse=True, |
|
limit=int(spli_[0]), |
|
) |
|
else: |
|
id_ = reply.id |
|
reply_ = [] |
|
for msg_ in range(id_, id_ + int(spli_[0])): |
|
msh = await event.client.get_messages(event.chat_id, ids=msg_) |
|
if msh: |
|
reply_.append(msh) |
|
else: |
|
replied_to = await reply.get_reply_message() |
|
try: |
|
match = spli_[1] |
|
except IndexError: |
|
match = None |
|
|
|
user = None |
|
|
|
if not reply_: |
|
reply_ = reply |
|
|
|
if match: |
|
match = match.split(maxsplit=1) |
|
|
|
if match: |
|
if match[0].startswith("@") or match[0].isdigit(): |
|
try: |
|
match_ = await event.client.parse_id(match[0]) |
|
user = await event.client.get_entity(match_) |
|
except ValueError: |
|
pass |
|
match = match[1] if len(match) == 2 else None |
|
else: |
|
match = match[0] |
|
|
|
if match == "random": |
|
match = choice(all_col) |
|
|
|
try: |
|
file = await quotly.create_quotly( |
|
reply_, bg=match, reply=replied_to, sender=user |
|
) |
|
except Exception as er: |
|
return await msg.edit(str(er)) |
|
|
|
message = await reply.reply("", file=file) |
|
os.remove(file) |
|
await msg.delete() |
|
return message |
|
|
|
|
|
|
|
|
|
|
|
__mod_name__ = "QUOTELY" |
|
|
|
__help__ = """ |
|
» /q : Create quote. |
|
|
|
» /q r : Get replied quote. |
|
|
|
» /q 2 ᴛᴏ 8 : Get multiple quotes. |
|
|
|
» /q < any colour name > : Create any coloured quotes. |
|
|
|
➠ Example: |
|
|
|
» /q red , /q blue etc. |
|
""" |
|
|
|
|