This commit is contained in:
qsc
2026-01-24 23:54:23 +08:00
parent 739592c97e
commit 6f2fd86a9f
2 changed files with 113 additions and 0 deletions
+18
View File
@@ -1,4 +1,22 @@
{ {
"prefix": {
"description": "指令前缀",
"type": "object",
"items": {
"enable": {
"description": "是否启用",
"type": "bool",
"default": true,
"hint": "是否启用指令前缀检查功能"
},
"text": {
"description": "前缀内容",
"type": "string",
"default": "剑三",
"hint": "为了避免和其他插件的指令冲突可以增加指令的前缀,为空默认值为剑三。"
}
}
},
"server": { "server": {
"description": "默认服务器", "description": "默认服务器",
"type": "string", "type": "string",
+95
View File
@@ -4,6 +4,7 @@ import json
import shutil import shutil
import pathlib import pathlib
import asyncio import asyncio
import inspect
from pathlib import Path from pathlib import Path
from typing import Union from typing import Union
@@ -41,8 +42,21 @@ class Jx3ApiPlugin(Star):
self.api_config = json.load(f) self.api_config = json.load(f)
# 初始化数据 # 初始化数据
self.prefix_en = self.conf.get("prefix").get("enable")
self.prefix_text = self.conf.get("prefix").get("text")
if not self.prefix_text:
self.prefix_text = "剑三"
if self.prefix_en:
logger.info(f"已启用指令前缀功能,前缀为:{self.prefix_text}")
else:
logger.info(f"未启用指令前缀功能。")
self.server = self.conf.get("server", "梦江南") self.server = self.conf.get("server", "梦江南")
logger.info(f"配置加载默认服务器:{self.server}") logger.info(f"配置加载默认服务器:{self.server}")
self.command_map = {
"日常": self.jx3_richang,
}
logger.info("jx3api插件初始化完成") logger.info("jx3api插件初始化完成")
@@ -116,6 +130,87 @@ class Jx3ApiPlugin(Star):
return server return server
def parse_message(self, text: str) -> list[str] | None:
"""消息解析"""
text = text.strip()
if not text:
return None
# 前缀模式
if self.prefix_en:
prefix = self.prefix_text
if text.startswith(prefix):
text = text[len(prefix):].strip()
else:
# 非前缀消息,直接忽略
return None
return text.split()
async def _call_with_auto_args(
self,
handler,
event: AstrMessageEvent,
args: list[str]
):
sig = inspect.signature(handler)
params = list(sig.parameters.values())
call_args = []
arg_index = 0
for p in params:
if p.name == "self":
continue
if p.name == "event":
call_args.append(event)
continue
if arg_index < len(args):
raw = args[arg_index]
arg_index += 1
try:
if p.annotation is int:
call_args.append(int(raw))
elif p.annotation is float:
call_args.append(float(raw))
else:
call_args.append(raw)
except Exception:
call_args.append(p.default)
else:
if p.default is not inspect._empty:
call_args.append(p.default)
else:
raise ValueError(f"缺少参数: {p.name}")
async for ret in handler(*call_args):
yield ret
@filter.event_message_type(filter.EventMessageType.ALL)
async def on_all_message(self, event: AstrMessageEvent):
parts = self.parse_message(event.message_str)
if not parts:
return
cmd, *args = parts
handler = self.command_map.get(cmd)
if not handler:
return
try:
async for ret in self._call_with_auto_args(handler, event, args):
yield ret
except Exception as e:
logger.exception(f"指令执行失败: {cmd}, error={e}")
yield event.plain_result("参数错误或执行失败")
@filter.command_group("剑三") @filter.command_group("剑三")
def jx3(self): def jx3(self):
pass pass