MissKatyPyro/misskaty/plugins/fun.py
Yasir Aris M 9201940fb6
MissKaty Updates New Year Version (#291)
* [MissKaty] Prevent Edit Message Triggered by Reaction 

Signed-off-by: Yasir Aris M <git@yasirdev.my.id>

* [MissKaty] Fix info command that give wrong id

Signed-off-by: Yasir Aris M <git@yasirdev.my.id>

* [MissKaty] No need this because I have stopped my movies groups

Signed-off-by: Yasir Aris M <git@yasirdev.my.id>

* [MissKaty] Add Federation Plugins..

Signed-off-by: Yasir Aris M <git@yasirdev.my.id>

* [MissKaty] Add exception on admin plugins, i dont have time for now to add spesific exception

Signed-off-by: Yasir Aris M <git@yasirdev.my.id>

* [MissKaty] Fix time_converter

Signed-off-by: Yasir Aris M <git@yasirdev.my.id>

* [MissKaty] Add ChannelPrivate Exception

Signed-off-by: Yasir Aris M <git@yasirdev.my.id>

* [MissKaty] Merge toimage command with getsticker

Signed-off-by: Yasir Aris M <git@yasirdev.my.id>


* Update version

Signed-off-by: Yasir Aris M <git@yasirdev.my.id>

* Revert callback timeout

Signed-off-by: Yasir Aris M <git@yasirdev.my.id>

* Revert

Signed-off-by: Yasir Aris M <git@yasirdev.my.id>

* Change Timezone 

Signed-off-by: Yasir Aris M <git@yasirdev.my.id>

* Fix typo on handler

Signed-off-by: Yasir Aris M <git@yasirdev.my.id>

* MissKaty: Add react command for user and bots

Signed-off-by: Yasir Aris M <git@yasirdev.my.id>

* Forgot import

Signed-off-by: Yasir Aris M <git@yasirdev.my.id>

* Fix emoji parser

Signed-off-by: Yasir Aris M <git@yasirdev.my.id>

* Gegara gboard

Signed-off-by: Yasir Aris M <git@yasirdev.my.id>

* Salah parsing

Signed-off-by: Yasir Aris M <git@yasirdev.my.id>

* React command only for sudo

Signed-off-by: Yasir Aris M <git@yasirdev.my.id>

---------

Signed-off-by: Yasir Aris M <git@yasirdev.my.id>
2024-01-01 08:02:46 +07:00

217 lines
7.3 KiB
Python

import textwrap
import regex
from asyncio import gather
from os import remove as hapus
from PIL import Image, ImageDraw, ImageFont
from pyrogram import filters
from pyrogram.errors import MessageIdInvalid, PeerIdInvalid, ReactionInvalid
from misskaty import app, user
from misskaty.core.decorator.errors import capture_err
from misskaty.helper.localization import use_chat_lang
from misskaty.vars import COMMAND_HANDLER, SUDO
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):
text_bbox = m_font.getbbox(u_text)
(left, top, right, bottom) = text_bbox
u_width = abs(right - left)
u_height = abs(top - bottom)
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):
text_bbox = m_font.getbbox(l_text)
(left, top, right, bottom) = text_bbox
u_width = abs(right - left)
u_height = abs(top - bottom)
draw.text(
xy=(
((i_width - u_width) / 2) - 1,
i_height - u_height - int((20 / 500) * 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 / 500) * 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 / 500) * 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 / 500) * 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 / 500) * 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
async def memify(_, 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 Exception as err:
try:
hapus(webp)
hapus(png)
except:
pass
await message.reply_msg(f"ERROR: {err}")
else:
await message.reply_msg(
"Gunakan command <b>/mmf <text></b> dengan reply ke sticker, pisahkan dengan ; untuk membuat posisi text dibawah."
)
@app.on_message(filters.command(["dice"], COMMAND_HANDLER))
@use_chat_lang()
async def dice(c, m, strings):
dices = await c.send_dice(m.chat.id, reply_to_message_id=m.id)
await dices.reply_msg(strings("result").format(number=dices.dice.value), quote=True)
@app.on_message(filters.command(["beri"], COMMAND_HANDLER))
async def beriharapan(c, m):
reply = m.reply_to_message
if not reply and m.command == 1:
return m.reply("Harap berikan kalimat yang ingin diberi pada seseorang")
pesan = m.text.split(maxsplit=1)[1]
reply_name = reply.from_user.mention if reply.from_user else reply.sender_chat.title
sender_name = m.from_user.mention if m.from_user else m.sender_chat.title
await reply.reply(f"{sender_name} memberikan {pesan} pada {reply_name}")
@app.on_message(filters.command("react", COMMAND_HANDLER) & filters.user(SUDO))
@user.on_message(filters.command("react", "."))
async def givereact(c, m):
if len(m.command) == 1:
return await m.reply("Please add reaction after command, you can give multiple reaction too.")
if not m.reply_to_message:
return await m.reply("Please reply to the message you want to react to.")
emot = [emoji for emoji in regex.findall(r'\p{Emoji}', m.text)]
try:
await m.reply_to_message.react(emoji=emot)
except ReactionInvalid:
await m.reply("Please give valid reaction.")
except MessageIdInvalid:
await m.reply("Sorry, i couldn't react to other bots or without being as administrator.")
except PeerIdInvalid:
await m.reply("Sorry, i can't react chat without join that groups.")
except Exception as err:
await m.reply(str(err))