From e77723cb990dca9933099ec327ed161e101be259 Mon Sep 17 00:00:00 2001 From: KimigaiiWuyi <444835641@qq.com> Date: Mon, 11 Sep 2023 00:19:05 +0800 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20=E6=94=AF=E6=8C=81=E5=8F=91?= =?UTF-8?q?=E9=80=81=E5=9B=BE=E7=89=87=E6=97=B6=E5=90=AF=E7=94=A8=E5=9B=BE?= =?UTF-8?q?=E7=89=87=E6=9C=8D=E5=8A=A1=E5=99=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- gsuid_core/core.py | 20 ++++++++++++++++++- gsuid_core/data_store.py | 3 +++ gsuid_core/segment.py | 20 ++++++++++++++++++- .../utils/plugins_config/config_default.py | 1 + 4 files changed, 42 insertions(+), 2 deletions(-) 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), }