feat(mc-server-status): 服务器列表 Web 管理页 / 数据层抽离 / mcstatus 13 适配

- services/servers.py:校验 + 读写 + 增删改收敛成一份数据层(顶层不 import nonebot,
  可脱离运行时单测),群命令与 Web API 都只经它改数据,校验不再各写一套
- web_hub.py + /hub/mc_server_status 页面:按群列出服务器,抽屉新增/编辑(改名)/
  测试连接,行内删除(删空一台连带删群);每条路由自带 require_admin
- handlers/server.py 改为薄封装,只在需要命令特有提示时自己判断
- services/mc.py 的图标属性名兼容 mcstatus ≥13 的 icon(旧版叫 favicon,
  读错会把整条查询打成"查询失败")
- tests/test_mc_servers.py:数据层归一/改名/删群/坏文件兜底 + 图标解码两版属性名

Co-Authored-By: Claude Code <noreply@anthropic.com>
This commit is contained in:
2026-09-22 14:23:46 +08:00
co-authored by Claude Code
parent 4badcfcf32
commit 814c1994b6
9 changed files with 1150 additions and 46 deletions
@@ -1,4 +1,3 @@
from json import dump, load
from os import makedirs
from pathlib import Path
from typing import List, Optional
@@ -7,6 +6,8 @@ from nonebot import get_bot, get_bots, get_driver, get_plugin_config
from nonebot.adapters import Bot
from pydantic import BaseModel
from .services import servers as store
# 数据目录:项目 hexi/data/ 下(与其它插件数据统一)
DATA_DIR = Path(__file__).resolve().parents[2] / "data"
@@ -40,18 +41,16 @@ async def on_startup():
save_file()
else:
load_file()
# 群命令与 Web 管理台都改 var.group_list,保存时整表落盘(见 services/servers.py)
def load_file():
with open(DATA_DIR / pc.mc_status_data_filename, "r", encoding="utf-8") as r:
tmp_data = load(r)
for i in tmp_data:
var.group_list[int(i)] = tmp_data[i]
"""数据读写都在 services/servers.py(群命令与 Web 管理台共用同一份校验)。"""
var.group_list.update(store.load_servers(pc.mc_status_data_filename))
def save_file():
with open(DATA_DIR / pc.mc_status_data_filename, "w", encoding="utf-8") as w:
dump(var.group_list, w, indent=4, ensure_ascii=False)
store.save_servers(pc.mc_status_data_filename, var.group_list)
# qq机器人连接时执行