Files
Ultroid-fork/addons/memify.py

339 lines
11 KiB
Python

# Ported Nd Modified For Ultroid
# Ported From DarkCobra (Modified by @ProgrammingError)
#
# Ultroid - UserBot
# Copyright (C) 2020 TeamUltroid
#
# This file is a part of < https://github.com/TeamUltroid/Ultroid/ >
# PLease read the GNU Affero General Public License in
# <https://www.github.com/TeamUltroid/Ultroid/blob/main/LICENSE/>.
"""
✘ Commands Available -
• `{i}mmf <upper text> ; <lower text> <reply to media>`
To create memes as sticker,
for trying different fonts use (.mmf <text>_1)(u can use 1 to 10).
• `{i}mms <upper text> ; <lower text> <reply to media>`
To create memes as pic,
for trying different fonts use (.mms <text>_1)(u can use 1 to 10).
"""
import asyncio
import os
import textwrap
import cv2
from PIL import Image, ImageDraw, ImageFont
from . import *
@ultroid_cmd(pattern="mmf ?(.*)")
async def ultd(event):
ureply = await event.get_reply_message()
msg = event.pattern_match.group(1)
if not (ureply and (ureply.media)):
xx = await event.eor("`Reply to any media`")
return
if not msg:
xx = await event.eor("`Give me something text to write...`")
return
ultt = await ureply.download_media()
if ultt.endswith((".tgs")):
xx = await event.eor("`Ooo Animated Sticker 👀...`")
cmd = ["lottie_convert.py", ultt, "ult.png"]
file = "ult.png"
process = await asyncio.create_subprocess_exec(
*cmd, stdout=asyncio.subprocess.PIPE, stderr=asyncio.subprocess.PIPE
)
stdout, stderr = await process.communicate()
stderr.decode().strip()
stdout.decode().strip()
elif ultt.endswith((".webp", ".png")):
xx = await event.eor("`Processing`")
im = Image.open(ultt)
im.save("ult.png", format="PNG", optimize=True)
file = "ult.png"
else:
xx = await event.eor("`Processing`")
img = cv2.VideoCapture(ultt)
heh, lol = img.read()
cv2.imwrite("ult.png", lol)
file = "ult.png"
stick = await draw_meme_text(file, msg)
await event.client.send_file(
event.chat_id, stick, force_document=False, reply_to=event.reply_to_msg_id
)
await xx.delete()
try:
os.remove(ultt)
os.remove(file)
os.remove(stick)
except BaseException:
pass
async def draw_meme_text(image_path, msg):
img = Image.open(image_path)
os.remove(image_path)
i_width, i_height = img.size
if "_" in msg:
text, font = msg.split("_")
else:
text = msg
font = "default"
if ";" in text:
upper_text, lower_text = text.split(";")
else:
upper_text = text
lower_text = ""
draw = ImageDraw.Draw(img)
m_font = ImageFont.truetype(
f"resources/fonts/{font}.ttf", int((70 / 640) * i_width)
)
current_h, pad = 10, 5
if upper_text:
for u_text in textwrap.wrap(upper_text, width=15):
bbox = draw.textbbox((0, 0), u_text, font=m_font)
u_width, u_height = bbox[2] - bbox[0], bbox[3] - bbox[1]
draw.text(
xy=(((i_width - u_width) / 2) - 1, int((current_h / 640) * i_width)),
text=u_text,
font=m_font,
fill=(0, 0, 0),
)
draw.text(
xy=(((i_width - u_width) / 2) + 1, int((current_h / 640) * i_width)),
text=u_text,
font=m_font,
fill=(0, 0, 0),
)
draw.text(
xy=((i_width - u_width) / 2, int(((current_h / 640) * i_width)) - 1),
text=u_text,
font=m_font,
fill=(0, 0, 0),
)
draw.text(
xy=(((i_width - u_width) / 2), int(((current_h / 640) * i_width)) + 1),
text=u_text,
font=m_font,
fill=(0, 0, 0),
)
draw.text(
xy=((i_width - u_width) / 2, int((current_h / 640) * i_width)),
text=u_text,
font=m_font,
fill=(255, 255, 255),
)
current_h += u_height + pad
if lower_text:
for l_text in textwrap.wrap(lower_text, width=15):
bbox = draw.textbbox((0, 0), l_text, font=m_font)
u_width, u_height = bbox[2] - bbox[0], bbox[3] - bbox[1]
draw.text(
xy=(
((i_width - u_width) / 2) - 1,
i_height - u_height - int((80 / 640) * i_width),
),
text=l_text,
font=m_font,
fill=(0, 0, 0),
)
draw.text(
xy=(
((i_width - u_width) / 2) + 1,
i_height - u_height - int((80 / 640) * i_width),
),
text=l_text,
font=m_font,
fill=(0, 0, 0),
)
draw.text(
xy=(
(i_width - u_width) / 2,
(i_height - u_height - int((80 / 640) * i_width)) - 1,
),
text=l_text,
font=m_font,
fill=(0, 0, 0),
)
draw.text(
xy=(
(i_width - u_width) / 2,
(i_height - u_height - int((80 / 640) * i_width)) + 1,
),
text=l_text,
font=m_font,
fill=(0, 0, 0),
)
draw.text(
xy=(
(i_width - u_width) / 2,
i_height - u_height - int((80 / 640) * i_width),
),
text=l_text,
font=m_font,
fill=(255, 255, 255),
)
current_h += u_height + pad
imag = "ultt.webp"
img.save(imag, "WebP")
return imag
@ultroid_cmd(pattern="mms ?(.*)")
async def mms(event):
ureply = await event.get_reply_message()
msg = event.pattern_match.group(1)
if not (ureply and (ureply.media)):
xx = await event.eor("`Reply to any media`")
return
if not msg:
xx = await event.eor("`Give me something text to write 😑`")
return
ultt = await ureply.download_media()
if ultt.endswith((".tgs")):
xx = await event.eor("`Ooo Animated Sticker 👀...`")
cmd = ["lottie_convert.py", ultt, "ult.png"]
file = "ult.png"
process = await asyncio.create_subprocess_exec(
*cmd, stdout=asyncio.subprocess.PIPE, stderr=asyncio.subprocess.PIPE
)
stdout, stderr = await process.communicate()
stderr.decode().strip()
stdout.decode().strip()
elif ultt.endswith((".webp", ".png")):
xx = await event.eor("`Processing`")
im = Image.open(ultt)
im.save("ult.png", format="PNG", optimize=True)
file = "ult.png"
else:
xx = await event.eor("`Processing`")
img = cv2.VideoCapture(ultt)
heh, lol = img.read()
cv2.imwrite("ult.png", lol)
file = "ult.png"
pic = await draw_meme(file, msg)
await event.client.send_file(
event.chat_id, pic, force_document=False, reply_to=event.reply_to_msg_id
)
await xx.delete()
try:
os.remove(ultt)
os.remove(file)
except BaseException:
pass
os.remove(pic)
async def draw_meme(image_path, msg):
img = Image.open(image_path)
os.remove(image_path)
i_width, i_height = img.size
if "_" in msg:
text, font = msg.split("_")
else:
text = msg
font = "default"
if ";" in text:
upper_text, lower_text = text.split(";")
else:
upper_text = text
lower_text = ""
draw = ImageDraw.Draw(img)
m_font = ImageFont.truetype(
f"resources/fonts/{font}.ttf", int((70 / 640) * i_width)
)
current_h, pad = 10, 5
if upper_text:
for u_text in textwrap.wrap(upper_text, width=15):
bbox = draw.textbbox((0, 0), u_text, font=m_font)
u_width, u_height = bbox[2] - bbox[0], bbox[3] - bbox[1]
draw.text(
xy=(((i_width - u_width) / 2) - 1, int((current_h / 640) * i_width)),
text=u_text,
font=m_font,
fill=(0, 0, 0),
)
draw.text(
xy=(((i_width - u_width) / 2) + 1, int((current_h / 640) * i_width)),
text=u_text,
font=m_font,
fill=(0, 0, 0),
)
draw.text(
xy=((i_width - u_width) / 2, int(((current_h / 640) * i_width)) - 1),
text=u_text,
font=m_font,
fill=(0, 0, 0),
)
draw.text(
xy=(((i_width - u_width) / 2), int(((current_h / 640) * i_width)) + 1),
text=u_text,
font=m_font,
fill=(0, 0, 0),
)
draw.text(
xy=((i_width - u_width) / 2, int((current_h / 640) * i_width)),
text=u_text,
font=m_font,
fill=(255, 255, 255),
)
current_h += u_height + pad
if lower_text:
for l_text in textwrap.wrap(lower_text, width=15):
bbox = draw.textbbox((0, 0), l_text, font=m_font)
u_width, u_height = bbox[2] - bbox[0], bbox[3] - bbox[1]
draw.text(
xy=(
((i_width - u_width) / 2) - 1,
i_height - u_height - int((20 / 640) * i_width),
),
text=l_text,
font=m_font,
fill=(0, 0, 0),
)
draw.text(
xy=(
((i_width - u_width) / 2) + 1,
i_height - u_height - int((20 / 640) * i_width),
),
text=l_text,
font=m_font,
fill=(0, 0, 0),
)
draw.text(
xy=(
(i_width - u_width) / 2,
(i_height - u_height - int((20 / 640) * i_width)) - 1,
),
text=l_text,
font=m_font,
fill=(0, 0, 0),
)
draw.text(
xy=(
(i_width - u_width) / 2,
(i_height - u_height - int((20 / 640) * i_width)) + 1,
),
text=l_text,
font=m_font,
fill=(0, 0, 0),
)
draw.text(
xy=(
(i_width - u_width) / 2,
i_height - u_height - int((20 / 640) * i_width),
),
text=l_text,
font=m_font,
fill=(255, 255, 255),
)
current_h += u_height + pad
pics = "ultt.png"
img.save(pics, "png")
return pics