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

View File

@@ -4,6 +4,7 @@ from ..Convention.Runtime.Architecture import Architecture
from fastapi import APIRouter, Request
from fastapi.responses import JSONResponse
import re
from ..CoreModules.models import CallbackRequest
from ..CoreModules.plugin_interface import PluginInterface
@@ -21,13 +22,25 @@ async def callback_verify():
logger.Log("Info", "收到Callback验证请求")
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")
async def callback_receive_construct(callback_data: CallbackRequest):
"""以构造好的Callback消息进行处理, 已知方式"""
try:
# 解析指令
content = callback_data.content
content = parse_message_after_at(callback_data.content)
command = content.split(" ")[0]
message = content[len(command):].strip()
logger.Log("Info", f"识别指令: command={command}")
@@ -65,7 +78,7 @@ async def callback_receive(request: Request):
return JSONResponse({"result": "error", "message": str(e)})
# 解析指令
content = callback_data.content
content = parse_message_after_at(callback_data.content)
command = content.split(" ")[0]
message = content[len(command):].strip()
logger.Log("Info", f"识别指令: command={command}")
@@ -103,6 +116,9 @@ async def handle_command(command: str, message: str,
if plugin:
logger.Log("Info", f"已找到插件注册指令: {command}, class: {plugin.__class__.__name__}")
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:
return f"❌ 未识别指令: {command}"
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