summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKyomotoi <[email protected]>2022-04-05 15:22:04 +0800
committerKyomotoi <[email protected]>2022-04-05 15:27:21 +0800
commit93e71022a5987ca898ca42a84e10cf3a1ddacd0a (patch)
tree0e509c76a575db8a4ab485d503ea7bf3e73b5383
parent770e5d7b5888f15a4d328a5b21ed15f84cd8da7e (diff)
downloadATRI-93e71022a5987ca898ca42a84e10cf3a1ddacd0a.tar.gz
ATRI-93e71022a5987ca898ca42a84e10cf3a1ddacd0a.tar.bz2
ATRI-93e71022a5987ca898ca42a84e10cf3a1ddacd0a.zip
✨ 新增插件:
-rw-r--r--ATRI/plugins/polaroid/__init__.py27
-rw-r--r--ATRI/plugins/polaroid/data_source.py60
-rw-r--r--ATRI/plugins/polaroid/image_dealer.py46
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