flash / Mikobot /plugins /quotely.py
Karma
Create quotely.py
fa3be38
raw
history blame
9.1 kB
# <============================================== IMPORTS =========================================================>
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 & FUNCTION =======================================================>
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
# <=================================================== HELP ====================================================>
__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.
"""
# <================================================ END =======================================================>