diff options
author | Kyomotoi <[email protected]> | 2022-04-05 15:22:04 +0800 |
---|---|---|
committer | Kyomotoi <[email protected]> | 2022-04-05 15:27:21 +0800 |
commit | 93e71022a5987ca898ca42a84e10cf3a1ddacd0a (patch) | |
tree | 0e509c76a575db8a4ab485d503ea7bf3e73b5383 | |
parent | 770e5d7b5888f15a4d328a5b21ed15f84cd8da7e (diff) | |
download | ATRI-93e71022a5987ca898ca42a84e10cf3a1ddacd0a.tar.gz ATRI-93e71022a5987ca898ca42a84e10cf3a1ddacd0a.tar.bz2 ATRI-93e71022a5987ca898ca42a84e10cf3a1ddacd0a.zip |
✨ 新增插件:
-rw-r--r-- | ATRI/plugins/polaroid/__init__.py | 27 | ||||
-rw-r--r-- | ATRI/plugins/polaroid/data_source.py | 60 | ||||
-rw-r--r-- | ATRI/plugins/polaroid/image_dealer.py | 46 |
3 files changed, 133 insertions, 0 deletions
diff --git a/ATRI/plugins/polaroid/__init__.py b/ATRI/plugins/polaroid/__init__.py new file mode 100644 index 0000000..a3d2d61 --- /dev/null +++ b/ATRI/plugins/polaroid/__init__.py @@ -0,0 +1,27 @@ +from random import choice + +from nonebot.adapters.onebot.v11 import MessageEvent, MessageSegment, Message +from nonebot.adapters.onebot.v11.helpers import Cooldown + +from ATRI.rule import to_bot +from .data_source import Polaroid, TEMP_PATH + + +_flmt_notice = choice(["慢...慢一..点❤", "冷静1下", "歇会歇会~~"]) + + +polaroid = Polaroid().on_command("拍立得", "获取一张以自己头像的拍立得图片!需at", rule=to_bot()) + + [email protected]([Cooldown(15, prompt=_flmt_notice)]) +async def _(event: MessageEvent): + user_id = event.get_user_id() + + temp_p = TEMP_PATH / f"{user_id}.png" + if not temp_p.is_file(): + pol = await Polaroid().generate(user_id) + result = MessageSegment.image(pol) + else: + result = MessageSegment.image(temp_p) + + await polaroid.finish(Message(result)) diff --git a/ATRI/plugins/polaroid/data_source.py b/ATRI/plugins/polaroid/data_source.py new file mode 100644 index 0000000..82e0337 --- /dev/null +++ b/ATRI/plugins/polaroid/data_source.py @@ -0,0 +1,60 @@ +import asyncio + +from ATRI.service import Service +from ATRI.rule import is_in_service +from ATRI.utils import request +from ATRI.log import logger as log +from ATRI.exceptions import RequestError, WriteError +from .image_dealer import image_dealer + + +TENCENT_AVATER_URL = "https://q1.qlogo.cn/g?b=qq&nk={user_id}&s=640" +SOURCE_URL = "https://cdn.jsdelivr.net/gh/Kyomotoi/CDN@master/project/ATRI/" + + +class Polaroid(Service): + def __init__(self): + Service.__init__(self, "拍立得", "根据头像生成拍立得风格照片!", rule=is_in_service("拍立得")) + + @classmethod + async def _request(cls, user_id: str) -> bytes: + try: + res = await request.get(TENCENT_AVATER_URL.format(user_id=user_id)) + except RequestError: + raise RequestError("Request failed!") + data = res.read() + return data + + @classmethod + async def generate(cls, user_id: str): + await init_source() + + user_avater = await cls._request(user_id) + + result = image_dealer(user_avater, user_id) + return f"file:///{result}" + + +from .image_dealer import TEMP_PATH, POLAROID_DIR + + +async def init_source(): + files = ["frame-0.PNG", "frame-1.PNG", "font-0.ttf"] + + for i in files: + path = POLAROID_DIR / i + if not path.is_file(): + log.warning("插件 polaroid 缺少所需资源,装载中") + + url = SOURCE_URL + i + data = await request.get(url) + try: + with open(path, "wb") as w: + w.write(data.read()) + log.info("所需资源装载完成") + except WriteError: + raise WriteError("装载资源失败") + + +loop = asyncio.get_event_loop() +loop.create_task(init_source()) diff --git a/ATRI/plugins/polaroid/image_dealer.py b/ATRI/plugins/polaroid/image_dealer.py new file mode 100644 index 0000000..c1ab50b --- /dev/null +++ b/ATRI/plugins/polaroid/image_dealer.py @@ -0,0 +1,46 @@ +from random import choice +from pathlib import Path +from datetime import datetime + +from PIL import Image, ImageFont, ImageDraw + + +POLAROID_DIR = Path(".") / "data" / "database" / "polaroid" +TEMP_PATH = Path(".") / "data" / "temp" +POLAROID_DIR.mkdir(exist_ok=True) + + +def image_dealer(user_img: bytes, user_id): + user_p = str((TEMP_PATH / f"{user_id}.png").absolute()) + + with open(user_p, "wb") as w: + w.write(user_img) + + bg = Image.new("RGBA", (689, 1097), color=(0, 0, 0, 0)) + + pol_frame = Image.open(POLAROID_DIR / f"frame-{choice([0, 1])}.PNG").convert("RGBA") + user = Image.open(user_p).convert("RGBA").resize((800, 800), Image.ANTIALIAS) + + _, _, _, a = pol_frame.split() + + f_path = str(POLAROID_DIR / "font-0.ttf") + f_date = ImageFont.truetype(f_path, 100) # type: ignore + f_msg = ImageFont.truetype(f_path, 110) # type: ignore + + bg.paste(user, (0, 53)) + bg.paste(pol_frame, (0, 0), a) + + msg = f"今天辛苦了{choice(['!', '❤️', '✨'])}" + now = datetime.now().strftime("%m / %d") + + img = ImageDraw.Draw(bg) + img.text((25, 805), now, font=f_date, fill=(99, 184, 255)) + img.text( + (15, 915), + msg, + font=f_msg, + fill=(255, 100, 97), + ) + + bg.save(user_p) + return user_p |