This repository has been archived on 2024-08-21. You can view files and clone it, but cannot push or open issues or pull requests.
EmojiCaptchaBot/modules/utils.py

93 lines
3.0 KiB
Python

from io import BytesIO
from pathlib import Path
from random import randint, sample
from typing import List, Union
from huepaper import generate
from PIL import Image
from pyrogram.enums.chat_member_status import ChatMemberStatus
from pyrogram.types import CallbackQuery, Message
from classes.captcha import Captcha
from classes.pyroclient import PyroClient
from classes.pyrogroup import PyroGroup
def get_captcha_image(emojis: List[str]) -> Captcha:
emojis_all = sample(emojis, 12)
emojis_correct = sample(emojis_all, 6)
output = BytesIO()
image_options = [
(randint(400, 490), randint(90, 280), randint(105, 125)),
(randint(60, 180), randint(180, 240), randint(75, 95)),
(randint(320, 440), randint(170, 210), randint(35, 45)),
(randint(150, 240), randint(240, 320), randint(80, 105)),
(randint(350, 450), randint(280, 380), randint(40, 60)),
(randint(180, 350), randint(100, 300), randint(45, 65)),
]
base_img = generate(
width=500,
height=500,
hue_max=1.0,
lum_min=0.3,
lum_max=0.6,
sat_min=0.8,
sat_max=1.0,
)
for options, emoji in zip(image_options, emojis_correct):
width, height, angle = options
base_img.paste(
Image.open(Path(f"assets/emojis/{emoji}.png"))
.resize((120, 120))
.rotate(angle),
((base_img.width - width), (base_img.height - height)),
Image.open(Path(f"assets/emojis/{emoji}.png"))
.resize((120, 120))
.rotate(angle),
)
base_img.save(output, format="jpeg")
return Captcha(output, emojis_all, emojis_correct)
async def is_permitted(
app: PyroClient,
group: PyroGroup,
message: Union[Message, None] = None,
callback: Union[CallbackQuery, None] = None,
) -> bool:
"""Check if User is an admin or a creator of a group. Alternatively, if the User is actually a group itself.
### Args:
* app (`PyroClient`): Pyrogram Client
* group (`PyroGroup`): Group
* message (`Union[Message, None]`, *optional*): Message if the request originates from a command. Defaults to `None`.
* callback (`Union[CallbackQuery, None]`, *optional*): CallbackQuery if the request originates from a callback. Defaults to `None`.
### Returns:
* `bool`: `True` if permitted and `False` if not. Also `False` if no message or callback provided.
"""
if message is not None:
return (
message.sender_chat is not None and message.sender_chat.id == group.id
) or (
message.from_user is not None
and (await app.get_chat_member(group.id, message.from_user.id)).status
) in [
ChatMemberStatus.ADMINISTRATOR,
ChatMemberStatus.OWNER,
]
if callback is not None:
return (await app.get_chat_member(group.id, callback.from_user.id)).status in [
ChatMemberStatus.ADMINISTRATOR,
ChatMemberStatus.OWNER,
]
return False