diff --git a/gsuid_core/core.py b/gsuid_core/core.py index 94decc1..78ee7ac 100644 --- a/gsuid_core/core.py +++ b/gsuid_core/core.py @@ -1,18 +1,22 @@ import sys import asyncio +from io import BytesIO from typing import Dict from pathlib import Path import uvicorn +from PIL import Image from msgspec import json as msgjson from starlette.requests import Request -from fastapi import FastAPI, WebSocket, WebSocketDisconnect +from fastapi.responses import StreamingResponse +from fastapi import FastAPI, WebSocket, BackgroundTasks, WebSocketDisconnect sys.path.append(str(Path(__file__).resolve().parents[1])) from gsuid_core.sv import SL # noqa: E402 from gsuid_core.gss import gss # noqa: E402 from gsuid_core.logger import logger # noqa: E402 from gsuid_core.config import core_config # noqa: E402 +from gsuid_core.data_store import image_res # noqa: E402 from gsuid_core.handler import handle_event # noqa: E402 from gsuid_core.models import MessageReceive # noqa: E402 from gsuid_core.webconsole.mount_app import site # noqa: E402 @@ -145,6 +149,20 @@ def main(): retcode = -1 return {'status': retcode, 'msg': '', 'data': {}} + def delete_image(image_path: Path): + image_path.unlink() + + @app.get('/genshinuid/image/{image_id}.jpg') + async def get_image(image_id: str, background_tasks: BackgroundTasks): + path = image_res / f'{image_id}.jpg' + image = Image.open(path) + image_bytes = BytesIO() + image.save(image_bytes, format='JPEG') + image_bytes.seek(0) + response = StreamingResponse(image_bytes, media_type='image/png') + background_tasks.add_task(delete_image, path) + return response + site.mount_app(app) uvicorn.run( diff --git a/gsuid_core/data_store.py b/gsuid_core/data_store.py index e1a9e80..8357e9b 100644 --- a/gsuid_core/data_store.py +++ b/gsuid_core/data_store.py @@ -17,3 +17,6 @@ def get_res_path(_path: Optional[Union[str, List]] = None) -> Path: path.mkdir(parents=True) return path + + +image_res = get_res_path('IMAGE_TEMP') diff --git a/gsuid_core/segment.py b/gsuid_core/segment.py index adef5be..79822b8 100644 --- a/gsuid_core/segment.py +++ b/gsuid_core/segment.py @@ -1,3 +1,4 @@ +import uuid from io import BytesIO from pathlib import Path from base64 import b64encode @@ -6,6 +7,14 @@ from typing import List, Union, Literal from PIL import Image from gsuid_core.models import Message +from gsuid_core.config import core_config +from gsuid_core.data_store import image_res +from gsuid_core.utils.plugins_config.gs_config import core_plugins_config + +pic_srv = core_plugins_config.get_config('EnablePicSrv').data +HOST = core_config.get_config('HOST') +PORT = int(core_config.get_config('PORT')) +_HOST = '127.0.0.1' if HOST == 'localhost' else HOST class MessageSegment: @@ -31,7 +40,16 @@ class MessageSegment: return Message(type='image', data=img) with open(img, 'rb') as fp: img = fp.read() - msg = Message(type='image', data=f'base64://{b64encode(img).decode()}') + + if pic_srv: + name = f'{uuid.uuid1()}.jpg' + path = image_res / name + path.write_bytes(img) + data = f'{_HOST}:{PORT}/genshinuid/image/{name}' + else: + data = f'base64://{b64encode(img).decode()}' + + msg = Message(type='image', data=data) return msg @staticmethod diff --git a/gsuid_core/utils/plugins_config/config_default.py b/gsuid_core/utils/plugins_config/config_default.py index a3f0d75..685880e 100644 --- a/gsuid_core/utils/plugins_config/config_default.py +++ b/gsuid_core/utils/plugins_config/config_default.py @@ -59,4 +59,5 @@ CONIFG_DEFAULT: Dict[str, GSC] = { 'EnableSpecificMsgId': GsBoolConfig('启用回复特殊ID', '如不知道请勿开启', False), 'SpecificMsgId': GsStrConfig('特殊返回消息ID', '如不知道请勿填写', ''), 'AutoUpdateDep': GsBoolConfig('自动更新依赖', '更新插件时将会自动更新依赖', False), + 'EnablePicSrv': GsBoolConfig('将图片转链接发送(需公网)', '发送图片转链接', True), }