Compare commits

...

6 Commits

4 changed files with 36 additions and 8 deletions

View File

@@ -80,7 +80,7 @@ class PluginInterface(ABC):
config.Log("Error", f"{ConsoleFrontColor.RED}提交表 {db_model.table_name} 列更新失败: {e}{ConsoleFrontColor.RESET}") config.Log("Error", f"{ConsoleFrontColor.RED}提交表 {db_model.table_name} 列更新失败: {e}{ConsoleFrontColor.RESET}")
@final @final
def execute(self, path:str) -> Optional[APIRouter]: def execute(self) -> Optional[APIRouter]:
''' '''
继承后是否返回路由决定是否启动该插件 继承后是否返回路由决定是否启动该插件
若返回None, 则不启动该插件 若返回None, 则不启动该插件
@@ -100,16 +100,22 @@ class PluginInterface(ABC):
Architecture.Register(self.__class__, self, setup, *self.dependencies()) Architecture.Register(self.__class__, self, setup, *self.dependencies())
router = APIRouter() router = APIRouter()
router.post(path)(self.generate_router_callback()) router.post(f"/{self.__class__.__name__}/callback")(self.generate_router_callback())
if self.generate_router_illustrated_guide() is not None:
router.get(f"/{self.__class__.__name__}")(self.generate_router_illustrated_guide())
return router return router
def generate_router_callback(self) -> Callable|Coroutine: def generate_router_callback(self) -> Callable|Coroutine:
''' '''
继承后重写该方法生成路由回调函数 继承后重写该方法生成路由回调函数
''' '''
async def callback(message: str, chat_id: int, user_id: int) -> Any: return self.callback
return await self.callback(message, chat_id, user_id)
return callback def generate_router_illustrated_guide(self) -> Callable|Coroutine|None:
'''
继承后重写该方法生成渲染图鉴与攻略网页的函数
'''
return None
def dependencies(self) -> List[Type]: def dependencies(self) -> List[Type]:
''' '''
@@ -218,7 +224,7 @@ def ImportPlugins(app: FastAPI, plugin_dir:str = "Plugins") -> None:
plugin = plugin_class() plugin = plugin_class()
if plugin.is_enable_plugin() == False: if plugin.is_enable_plugin() == False:
continue continue
router = plugin.execute(f"/{module_file.GetFullPath().replace(".py", '')}/{class_name}") router = plugin.execute()
if router: if router:
app.include_router(router, prefix=f"/api", tags=[plugin.get_plugin_tag()]) app.include_router(router, prefix=f"/api", tags=[plugin.get_plugin_tag()])
except Exception as e: except Exception as e:

View File

@@ -4,6 +4,7 @@ from ..Convention.Runtime.Architecture import Architecture
from fastapi import APIRouter, Request from fastapi import APIRouter, Request
from fastapi.responses import JSONResponse from fastapi.responses import JSONResponse
import re
from ..CoreModules.models import CallbackRequest from ..CoreModules.models import CallbackRequest
from ..CoreModules.plugin_interface import PluginInterface from ..CoreModules.plugin_interface import PluginInterface
@@ -21,13 +22,25 @@ async def callback_verify():
logger.Log("Info", "收到Callback验证请求") logger.Log("Info", "收到Callback验证请求")
return JSONResponse({"result": "ok"}) return JSONResponse({"result": "ok"})
# 机器人名称模式(用于从@消息中提取,兼容半角/全角空格)
AT_PATTERN = re.compile(r'@[^\s]+[\s\u3000]+(.+)', re.DOTALL)
def parse_message_after_at(message: str) -> str:
# 去除首尾空格
message = message.strip()
# 尝试提取@后的内容
at_match = AT_PATTERN.search(message)
if at_match:
return at_match.group(1).strip()
return message
@router.post("/callback/construct") @router.post("/callback/construct")
async def callback_receive_construct(callback_data: CallbackRequest): async def callback_receive_construct(callback_data: CallbackRequest):
"""以构造好的Callback消息进行处理, 已知方式""" """以构造好的Callback消息进行处理, 已知方式"""
try: try:
# 解析指令 # 解析指令
content = callback_data.content content = parse_message_after_at(callback_data.content)
command = content.split(" ")[0] command = content.split(" ")[0]
message = content[len(command):].strip() message = content[len(command):].strip()
logger.Log("Info", f"识别指令: command={command}") logger.Log("Info", f"识别指令: command={command}")
@@ -65,7 +78,7 @@ async def callback_receive(request: Request):
return JSONResponse({"result": "error", "message": str(e)}) return JSONResponse({"result": "error", "message": str(e)})
# 解析指令 # 解析指令
content = callback_data.content content = parse_message_after_at(callback_data.content)
command = content.split(" ")[0] command = content.split(" ")[0]
message = content[len(command):].strip() message = content[len(command):].strip()
logger.Log("Info", f"识别指令: command={command}") logger.Log("Info", f"识别指令: command={command}")
@@ -103,6 +116,9 @@ async def handle_command(command: str, message: str,
if plugin: if plugin:
logger.Log("Info", f"已找到插件注册指令: {command}, class: {plugin.__class__.__name__}") logger.Log("Info", f"已找到插件注册指令: {command}, class: {plugin.__class__.__name__}")
return await plugin.callback(message, chat_id, user_id) return await plugin.callback(message, chat_id, user_id)
elif "default" in PluginInterface.plugin_instances:
logger.Log("Info", f"未找到插件注册指令: {command}, 使用默认插件: {PluginInterface.plugin_instances["default"].__class__.__name__}")
return await PluginInterface.plugin_instances["default"].callback(command+" "+message, chat_id, user_id)
else: else:
return f"❌ 未识别指令: {command}" return f"❌ 未识别指令: {command}"
except Exception as e: except Exception as e:

3
swagger-ui-bundle.js Normal file

File diff suppressed because one or more lines are too long

3
swagger-ui.css Normal file

File diff suppressed because one or more lines are too long