- 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>
127 lines
4.5 KiB
Python
127 lines
4.5 KiB
Python
"""MC 服务器状态 —— 触发器(Trigger)层。"""
|
|
|
|
from __future__ import annotations
|
|
|
|
from asyncio import gather
|
|
|
|
from nonebot import on_command, on_regex
|
|
from nonebot.adapters.onebot.v11 import (
|
|
Bot,
|
|
GroupMessageEvent,
|
|
MessageEvent,
|
|
)
|
|
from nonebot.log import logger
|
|
from nonebot.params import RegexGroup
|
|
from nonebot.plugin import PluginMetadata
|
|
|
|
from ..config import pc, var
|
|
from ..services import servers as store
|
|
from ..services.mc import check_mc_status
|
|
|
|
__plugin_meta__ = PluginMetadata(
|
|
name="MC服务器信息查询插件",
|
|
description="如名",
|
|
type="application",
|
|
homepage="https://github.com/nikissXI/nonebot_plugins/tree/main/nonebot_plugin_setu_customization",
|
|
supported_adapters={"~onebot.v11"},
|
|
usage="""插件命令如下:
|
|
信息 # 字面意思,需要加命令前缀,默认/
|
|
信息数据 # 查看已启用群以及服务器信息,需要加命令前缀,默认/
|
|
添加服务器 # 字面意思
|
|
删除服务器 # 字面意思
|
|
""",
|
|
)
|
|
|
|
|
|
async def group_check(event: GroupMessageEvent, bot: Bot) -> bool:
|
|
return event.group_id in var.group_list and bot == var.handle_bot
|
|
|
|
|
|
async def admin_check(event: MessageEvent, bot: Bot) -> bool:
|
|
return bot == var.handle_bot and event.user_id in pc.mc_status_admin_qqnum
|
|
|
|
|
|
xinxi = on_command("信息", rule=group_check)
|
|
list_all = on_command("信息数据", rule=admin_check)
|
|
add_server = on_regex(
|
|
r"^添加服务器\s*((\d+)\s+(\S+)\s+(\S+)\s+(\S+))?", rule=admin_check
|
|
)
|
|
del_server = on_regex(r"^删除服务器\s*((\d+)\s+(\S+))?", rule=admin_check)
|
|
test_server = on_regex(r"^测试服务器\s*((\S+)\s+(\S+))?", rule=admin_check)
|
|
|
|
|
|
@xinxi.handle()
|
|
async def _(event: GroupMessageEvent):
|
|
group = event.group_id
|
|
task_list = []
|
|
for server_name in var.group_list[group]:
|
|
server_host = var.group_list[group][server_name][0]
|
|
server_type = var.group_list[group][server_name][1]
|
|
task_list.append(check_mc_status(server_name, server_host, server_type))
|
|
result = await gather(*task_list)
|
|
count = 0
|
|
msg = ""
|
|
logger.info(f"MC 服务器状态结果: {result}")
|
|
for r in result:
|
|
count += 1
|
|
if count > 1:
|
|
msg += "\n=== 分割线 ===\n"
|
|
msg += r
|
|
await xinxi.finish(msg)
|
|
|
|
|
|
@add_server.handle()
|
|
async def _(mp=RegexGroup()):
|
|
if not mp[0]:
|
|
await add_server.finish("添加服务器 [群号] [名称] [服务器地址] [类型]\n类型写js或bds,js是Java服务器,bds是基岩服务器\n服务器地址如果知道端口号把端口加上,否则查询速度会慢一点\n添加例子:\nexp1: 添加服务器 114514 哈皮咳嗽 mc.hypixel.net js\nexp2: 添加服务器 114514 某基岩服 mc.bds.net bds\nexp3: 添加服务器 114514 某Java服 mc.java.net:25577 js")
|
|
return
|
|
group = int(mp[1])
|
|
new_server_name = mp[2]
|
|
if new_server_name in var.group_list.get(group, {}):
|
|
await add_server.finish("有同名服务器啦!")
|
|
# 校验 + 落盘都在 services/servers.py(与 Web 管理台同一套)
|
|
try:
|
|
store.set_server(group, new_server_name, mp[3], mp[4])
|
|
except store.ServerError as e:
|
|
await add_server.finish("类型请填js或bds" if "类型请填" in str(e) else str(e))
|
|
await add_server.finish("添加成功")
|
|
|
|
|
|
@del_server.handle()
|
|
async def _(mp=RegexGroup()):
|
|
if not mp[0]:
|
|
await del_server.finish(f"删除服务器 [群号] [名称]")
|
|
return
|
|
try:
|
|
store.delete_server(int(mp[1]), mp[2])
|
|
except store.ServerError as e:
|
|
await del_server.finish(str(e))
|
|
await del_server.finish("删除成功")
|
|
|
|
|
|
@list_all.handle()
|
|
async def _():
|
|
msg = ""
|
|
for group_id in var.group_list:
|
|
msg += f"群{group_id}服务器列表\n"
|
|
for server_name in var.group_list[group_id]:
|
|
server_host, server_type = var.group_list[group_id][server_name]
|
|
msg += f"{server_name} {server_host} {server_type}\n"
|
|
msg += "\n"
|
|
if not msg:
|
|
msg = "无数据"
|
|
await list_all.finish(f"mc_status数据\n{msg}")
|
|
|
|
|
|
@test_server.handle()
|
|
async def _(mp=RegexGroup()):
|
|
if not mp[0]:
|
|
await test_server.finish("测试服务器 [服务器地址] [类型]\n类型写js或bds,js是Java服务器,bds是基岩服务器")
|
|
return
|
|
try:
|
|
server_type = store.normalize_type(mp[2])
|
|
except store.ServerError as e:
|
|
await test_server.finish(str(e))
|
|
msg = await check_mc_status("测试", mp[1], server_type)
|
|
await test_server.finish(msg)
|