93 lines
3.0 KiB
Python
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
|