import textwrap from asyncio import gather from os import remove as hapus from PIL import Image, ImageDraw, ImageFont from pyrogram import filters from misskaty import app from misskaty.core.decorator.ratelimiter import ratelimiter from misskaty.core.decorator.errors import capture_err from misskaty.vars import COMMAND_HANDLER async def draw_meme_text(image_path, text): img = Image.open(image_path) hapus(image_path) i_width, i_height = img.size m_font = ImageFont.truetype("assets/MutantAcademyStyle.ttf", int((70 / 640) * i_width)) if ";" in text: upper_text, lower_text = text.split(";") else: upper_text = text lower_text = "" draw = ImageDraw.Draw(img) current_h, pad = 10, 5 if upper_text: for u_text in textwrap.wrap(upper_text, width=15): u_width, u_height = draw.textsize(u_text, font=m_font) 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), stroke_width=3, stroke_fill="black", ) 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), stroke_width=3, stroke_fill="black", ) 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), stroke_width=3, stroke_fill="black", ) 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), stroke_width=3, stroke_fill="black", ) 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): u_width, u_height = draw.textsize(l_text, font=m_font) 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), stroke_width=3, stroke_fill="black", ) 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), stroke_width=3, stroke_fill="black", ) 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), stroke_width=3, stroke_fill="black", ) 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), stroke_width=3, stroke_fill="black", ) 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), stroke_width=3, stroke_fill="black", ) current_h += u_height + pad webp_file = "misskatyfy.webp" png_file = "misskatyfy.png" new_size = (512, 512) img.resize(new_size) img.save(webp_file, "WebP") img.save(png_file, "PNG") img.close() return webp_file, png_file @app.on_message(filters.command(["mmf"], COMMAND_HANDLER)) @capture_err @ratelimiter async def memify(client, message): if message.reply_to_message and (message.reply_to_message.sticker or message.reply_to_message.photo): try: file = await message.reply_to_message.download() webp, png = await draw_meme_text(file, message.text.split(None, 1)[1].strip()) await gather(*[message.reply_document(png), message.reply_sticker(webp)]) try: hapus(webp) hapus(png) except: pass except: await message.reply("Gunakan command /mmf dengan reply ke sticker, pisahkan dengan ; untuk membuat posisi text dibawah.") else: await message.reply("Gunakan command /mmf dengan reply ke sticker, pisahkan dengan ; untuk membuat posisi text dibawah.")