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
Raw Permalink Normal View History

2023-08-10 14:05:40 +03:00
from io import BytesIO
from pathlib import Path
from random import randint, sample
2023-08-23 12:12:26 +03:00
from typing import List, Union
2023-08-10 14:05:40 +03:00
from huepaper import generate
from PIL import Image
2023-08-23 12:12:26 +03:00
from pyrogram.enums.chat_member_status import ChatMemberStatus
from pyrogram.types import CallbackQuery, Message
2023-08-10 14:05:40 +03:00
from classes.captcha import Captcha
2023-08-23 12:12:26 +03:00
from classes.pyroclient import PyroClient
from classes.pyrogroup import PyroGroup
2023-08-10 14:05:40 +03:00
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)
2023-08-23 12:12:26 +03:00
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