♻️ 大幅重构,拆分模块,增加一些MCP相关限制
Some checks failed
Pyright Lint / Pyright Lint (push) Has been cancelled
Ruff Lint / Ruff Lint (push) Has been cancelled

This commit is contained in:
FuQuan233 2026-07-29 17:00:22 +08:00
parent 41e6aeacb9
commit 0d6771eca6
17 changed files with 1142 additions and 912 deletions

View file

@ -0,0 +1,112 @@
from nonebot import on_command
from nonebot.adapters.onebot.v11 import GroupMessageEvent, Message, PrivateMessageEvent
from nonebot.adapters.onebot.v11.permission import GROUP_ADMIN, GROUP_OWNER, PRIVATE
from nonebot.params import CommandArg
from nonebot.permission import SUPERUSER
from .config import ScopedConfig
from .state import ChatState, StateStore
def _event_state(config: ScopedConfig, states: StateStore, event) -> ChatState | None:
if isinstance(event, GroupMessageEvent):
return states.group_states[event.group_id]
if config.enable_private_chat:
return states.private_states[event.user_id]
return None
def register_commands(config: ScopedConfig, states: StateStore) -> None:
preset_handler = on_command("API预设", priority=1, block=True, permission=SUPERUSER)
@preset_handler.handle()
async def handle_preset(event: GroupMessageEvent | PrivateMessageEvent, args: Message = CommandArg()):
text = args.extract_plain_text().strip()
parts = text.split(maxsplit=1)
target_id: int | None = None
is_group_target = isinstance(event, GroupMessageEvent)
state = _event_state(config, states, event)
if state is None:
return
preset_name = text
if isinstance(event, PrivateMessageEvent) and parts and parts[0].isdigit():
target_id = int(parts[0])
is_group_target = target_id in states.group_states
state = states.get(target_id, is_group_target)
preset_name = parts[1] if len(parts) > 1 else ""
available = {preset.name for preset in config.api_presets}
if not preset_name or preset_name not in available | {"off"}:
names = "\n- ".join(sorted(available))
await preset_handler.finish(f"当前API预设{state.preset_name}\n可用API预设\n- {names}")
state.preset_name = preset_name
if target_id is not None:
kind = "群聊" if is_group_target else "私聊"
await preset_handler.finish(f"已将 {kind} {target_id} 切换至API预设{preset_name}")
await preset_handler.finish(f"已切换至API预设{preset_name}")
edit_handler = on_command(
"修改设定",
priority=1,
block=True,
permission=SUPERUSER | GROUP_ADMIN | GROUP_OWNER | PRIVATE,
)
@edit_handler.handle()
async def handle_edit(event: GroupMessageEvent | PrivateMessageEvent, args: Message = CommandArg()):
state = _event_state(config, states, event)
if state is None:
return
state.prompt = args.extract_plain_text().strip()
await edit_handler.finish("修改成功")
reset_handler = on_command(
"记忆清除",
priority=1,
block=True,
permission=SUPERUSER | GROUP_ADMIN | GROUP_OWNER | PRIVATE,
)
@reset_handler.handle()
async def handle_reset(event: GroupMessageEvent | PrivateMessageEvent):
state = _event_state(config, states, event)
if state is None:
return
state.pending_events.clear()
state.history.clear()
await reset_handler.finish("记忆已清空")
probability_handler = on_command(
"设置主动回复概率",
priority=1,
block=True,
permission=SUPERUSER | GROUP_ADMIN | GROUP_OWNER,
)
@probability_handler.handle()
async def handle_probability(event: GroupMessageEvent, args: Message = CommandArg()):
try:
probability = float(args.extract_plain_text().strip())
if not 0 <= probability <= 1:
raise ValueError("概率必须在0到1之间")
except ValueError as error:
await probability_handler.finish(f"输入有误,请使用 [0,1] 的浮点数\n{error!s}")
return
states.group_states[event.group_id].random_trigger_prob = probability
await probability_handler.finish(f"主动回复概率已设为 {probability}")
think_handler = on_command(
"切换思维输出",
priority=1,
block=True,
permission=SUPERUSER | GROUP_ADMIN | GROUP_OWNER | PRIVATE,
)
@think_handler.handle()
async def handle_think(event: GroupMessageEvent | PrivateMessageEvent):
state = _event_state(config, states, event)
if state is None:
return
state.output_reasoning_content = not state.output_reasoning_content
status = "开启" if state.output_reasoning_content else "关闭"
await think_handler.finish(f"{status}思维输出")