Skip to content

Commit a35213d

Browse files
committed
:bug 修复语法问题。优化部分逻辑
1 parent 121c3d6 commit a35213d

File tree

12 files changed

+311
-242
lines changed

12 files changed

+311
-242
lines changed

nonebot_plugin_l4d2_server/__init__.py

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,4 +44,3 @@
4444
"author": "Agnes4m <Z735803792@163.com>",
4545
},
4646
)
47-
from .commands import server_groups

nonebot_plugin_l4d2_server/__main__.py

Lines changed: 36 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
"""
1717

1818
from pathlib import Path
19-
from typing import List, Optional
19+
from typing import List, Optional, cast
2020

2121
import aiofiles
2222
import ujson as json
@@ -27,10 +27,12 @@
2727
from nonebot.params import CommandArg, CommandStart, RawCommand
2828
from nonebot.permission import SUPERUSER
2929
from nonebot.plugin import on_command
30-
from nonebot.rule import command as command_rule
3130
from nonebot_plugin_alconna import UniMessage
3231

32+
from nonebot_plugin_l4d2_server.l4_ban.utils import refresh_server_command_rule
33+
3334
from .config import config, config_manager
35+
from .l4_ban import l4_request
3436
from .l4_help import get_l4d2_core_help
3537
from .l4_local import * # noqa: F403
3638
from .l4_request import (
@@ -54,25 +56,17 @@
5456

5557
reload_ip()
5658

59+
5760
l4_help = on_command("l4help", aliases={"l4d2帮助"})
58-
l4_request = on_command("anne", priority=10)
61+
5962
l4_reload = on_command("l4reload", aliases={"l4刷新,l4重载"})
6063
l4_all = on_command("l4all", aliases={"l4全服"})
6164
l4_connect = on_command("connect", aliases={"l4连接"})
6265
l4_find_player = on_command("l4find", aliases={"l4查找"})
6366

6467

6568
config_path = Path(config.l4_path) / "config.json"
66-
67-
68-
def refresh_server_command_rule() -> None:
69-
"""根据最新的服务器组刷新命令别名"""
70-
commands = {"anne"}
71-
commands.update(COMMAND)
72-
l4_request.rule = command_rule(*commands)
73-
74-
75-
refresh_server_command_rule()
69+
refresh_server_command_rule(l4_request)
7670

7771

7872
async def sync_sb_pages_groups() -> None:
@@ -81,7 +75,7 @@ async def sync_sb_pages_groups() -> None:
8175
if not pages:
8276
logger.info("sb_pages.json 为空,跳过启动时刷新")
8377
reload_ip()
84-
refresh_server_command_rule()
78+
refresh_server_command_rule(l4_request)
8579
return
8680

8781
api = L4D2Api()
@@ -96,7 +90,7 @@ async def sync_sb_pages_groups() -> None:
9690
failed.append(f"{tag}: {exc}")
9791

9892
reload_ip()
99-
refresh_server_command_rule()
93+
refresh_server_command_rule(l4_request)
10094

10195
if ok:
10296
logger.success(f"启动时已刷新 {ok} 个服务器组")
@@ -202,15 +196,24 @@ async def _(
202196
logger.info(type(out_msg))
203197
if config.l4_connect and isinstance(out_msg, bytes):
204198
logger.info(f"connect {one['host']}:{one['port']}")
205-
out_msg = UniMessage.image(raw=out_msg) + UniMessage.text(
199+
out_msgs = UniMessage.image(raw=out_msg) + UniMessage.text(
206200
f"\nconnect {one['host']}:{one['port']}",
207201
)
202+
elif config.l4_connect and isinstance(out_msg, str):
203+
logger.info(f"connect {one['host']}:{one['port']}")
204+
out_msgs = UniMessage.text(out_msg) + UniMessage.text(
205+
f"\nconnect {one['host']}:{one['port']}",
206+
)
207+
elif isinstance(out_msg, str):
208+
out_msgs = UniMessage.text(out_msg)
208209
else:
209-
out_msg = UniMessage.text(out_msg)
210+
out_msgs = UniMessage.image(raw=out_msg)
211+
return await out_msg_out(out_msgs)
212+
return None
210213
if len(tag_list) == 2:
211214
group, name = tag_list
212215
await UniMessage.text(f"正在查询{group}组").send()
213-
out: List[OutServer] = await server_find(command=group, is_img=True)
216+
out = cast(List[OutServer], await server_find(command=group, is_img=True))
214217
out_msg = Gm.no_player
215218
for one in out:
216219
for player in one["player"]:
@@ -220,13 +223,22 @@ async def _(
220223
logger.info(type(out_msg))
221224
if config.l4_connect and isinstance(out_msg, bytes):
222225
logger.info(f"connect {one['host']}:{one['port']}")
223-
out_msg = UniMessage.image(raw=out_msg) + UniMessage.text(
226+
out_msgs = UniMessage.image(raw=out_msg) + UniMessage.text(
227+
f"\nconnect {one['host']}:{one['port']}",
228+
)
229+
elif config.l4_connect and isinstance(out_msg, str):
230+
logger.info(f"connect {one['host']}:{one['port']}")
231+
out_msgs = UniMessage.text(out_msg) + UniMessage.text(
224232
f"\nconnect {one['host']}:{one['port']}",
225233
)
234+
elif isinstance(out_msg, str):
235+
out_msgs = UniMessage.text(out_msg)
226236
else:
227-
out_msg = UniMessage.text(out_msg)
237+
out_msgs = UniMessage.image(raw=out_msg)
228238

229-
return await out_msg_out(out_msg)
239+
return await out_msg_out(out_msgs)
240+
return None
241+
return None
230242

231243

232244
@l4_all.handle()
@@ -243,7 +255,7 @@ async def _(args: Message = CommandArg()):
243255
await get_ip_server(ip),
244256
is_connect=config.l4_connect,
245257
host=host,
246-
port=port,
258+
port=str(port),
247259
)
248260

249261

@@ -258,7 +270,7 @@ async def _(args: Message = CommandArg()):
258270
logger.info(f"重载{tag}的ip")
259271
await L4API.get_sourceban(tag, url)
260272
reload_ip()
261-
refresh_server_command_rule()
273+
refresh_server_command_rule(l4_request)
262274
logger.success("重载ip完成")
263275
await out_msg_out("重载ip完成")
264276

@@ -278,7 +290,7 @@ async def _(args: Message = CommandArg()):
278290

279291
await L4API.get_sourceban(arg[0], arg[1])
280292
reload_ip()
281-
refresh_server_command_rule()
293+
refresh_server_command_rule(l4_request)
282294
await UniMessage.text("添加成功\n组名: {arg[0]}\n网址: {arg[1]}").send()
283295

284296

Lines changed: 0 additions & 175 deletions
Original file line numberDiff line numberDiff line change
@@ -1,175 +0,0 @@
1-
# nonebot_plugin_l4d2_server/commands/server_groups.py
2-
from __future__ import annotations
3-
4-
import ujson as json
5-
from nonebot import on_command
6-
from nonebot.adapters.onebot.v11 import Message
7-
from nonebot.params import CommandArg
8-
from nonebot_plugin_alconna import UniMessage
9-
10-
from ..__main__ import refresh_server_command_rule
11-
from ..l4_request import reload_ip
12-
from ..utils.api.request import L4D2Api
13-
from ..utils.group_store import (
14-
export_all,
15-
get_group,
16-
list_groups,
17-
remove_group,
18-
set_group,
19-
)
20-
from ..utils.sb_sources import del_page, get_page, load_pages, set_page
21-
22-
23-
async def _delete_group_and_page(tag: str) -> tuple[bool, bool]:
24-
"""删除服务器组文件及对应的 URL 配置"""
25-
group_deleted = await remove_group(tag)
26-
page_deleted = await del_page(tag)
27-
return group_deleted, page_deleted
28-
29-
30-
# l4addban <组名> [SourceBans服务器页URL]
31-
l4_add_ban = on_command("l4addban", aliases={"l4添加服务器组"})
32-
33-
34-
@l4_add_ban.handle()
35-
async def _(args: Message = CommandArg()):
36-
text = args.extract_plain_text().strip()
37-
if not text:
38-
await UniMessage.text("用法:l4addban <组名> [SourceBans服务器页URL]").finish()
39-
40-
parts = text.split(None, 1)
41-
tag = parts[0]
42-
url = parts[1] if len(parts) > 1 else None
43-
44-
# 如果本次传了 URL,则记入 data/L4D2/sb_pages.json
45-
if url:
46-
await set_page(tag, url)
47-
48-
page = url or await get_page(tag)
49-
if not page:
50-
await UniMessage.text(
51-
f"未在 data/L4D2/sb_pages.json 找到组“{tag}”的 URL;请执行:l4addban {tag} <URL>",
52-
).finish()
53-
54-
api = L4D2Api()
55-
try:
56-
server_list = await api.get_sourceban(tag, page)
57-
except Exception as e:
58-
await UniMessage.text(f"抓取失败:{e}").finish()
59-
60-
path = await set_group(tag, server_list)
61-
await UniMessage.text(
62-
f"✅ 已更新:{path.name}(共 {len(server_list)} 台)",
63-
).finish()
64-
65-
66-
# 批量刷新:遍历 sb_pages.json 中所有组
67-
l4_reload_sb = on_command("l4reloadsb", aliases={"l4刷新服务器组"})
68-
69-
70-
@l4_reload_sb.handle()
71-
async def _():
72-
pages = await load_pages()
73-
if not pages:
74-
await UniMessage.text(
75-
"data/L4D2/sb_pages.json 为空,先用:l4addban <组名> <URL>",
76-
).finish()
77-
78-
api = L4D2Api()
79-
ok, fail = 0, []
80-
for tag, page in pages.items():
81-
try:
82-
servers = await api.get_sourceban(tag, page)
83-
await set_group(tag, servers)
84-
ok += 1
85-
except Exception as e:
86-
fail.append(f"{tag}: {e}")
87-
88-
msg = [f"✅ 刷新完成:成功 {ok} 个组。"]
89-
if fail:
90-
msg.append("❌ 失败:\n" + "\n".join(fail))
91-
await UniMessage.text("\n".join(msg)).send()
92-
reload_ip()
93-
refresh_server_command_rule()
94-
95-
96-
# 列出所有组及数量
97-
l4_list_groups = on_command("l4listgroup", aliases={"l4listgroups", "l4列服务器组"})
98-
99-
100-
@l4_list_groups.handle()
101-
async def _():
102-
names = await list_groups()
103-
if not names:
104-
await UniMessage.text("暂无服务器组。").finish()
105-
lines = []
106-
for name in names:
107-
items = await get_group(name)
108-
lines.append(f"{name}{len(items)})")
109-
await UniMessage.text("现有服务器组:\n" + "\n".join(lines)).finish()
110-
111-
112-
# 删除服务器组(即删除 data/L4D2/l4d2/<tag>.json)
113-
l4_del_group = on_command("l4delgroup", aliases={"l4删除服务器组"})
114-
115-
116-
@l4_del_group.handle()
117-
async def _(args: Message = CommandArg()):
118-
tag = args.extract_plain_text().strip()
119-
if not tag:
120-
await UniMessage.text("用法:l4delgroup <组名>").finish()
121-
group_deleted, page_deleted = await _delete_group_and_page(tag)
122-
123-
if not group_deleted and not page_deleted:
124-
await UniMessage.text("未找到该组文件或 URL 记录").finish()
125-
return
126-
127-
msg_parts = []
128-
if group_deleted:
129-
msg_parts.append("服务器组文件")
130-
if page_deleted:
131-
msg_parts.append("SourceBans URL")
132-
await UniMessage.text("✅ 已删除 " + "、".join(msg_parts)).send()
133-
reload_ip()
134-
refresh_server_command_rule()
135-
136-
137-
# 删除 sb_pages.json 里的 URL 映射(仅删 URL)
138-
l4_del_page = on_command("l4delpage", aliases={"l4删除服务器页"})
139-
140-
141-
@l4_del_page.handle()
142-
async def _(args: Message = CommandArg()):
143-
tag = args.extract_plain_text().strip()
144-
if not tag:
145-
await UniMessage.text("用法:l4delpage <组名>").finish()
146-
ok = await del_page(tag)
147-
await UniMessage.text("✅ 已删除" if ok else "未找到该组的 URL").finish()
148-
149-
150-
# 导出指定组的 JSON 片段(直接读取 data/L4D2/l4d2/<tag>.json)
151-
l4_export_group = on_command("l4exportgroup", aliases={"l4导出服务器组"})
152-
153-
154-
@l4_export_group.handle()
155-
async def _(args: Message = CommandArg()):
156-
tag = args.extract_plain_text().strip()
157-
if not tag:
158-
await UniMessage.text("用法:l4exportgroup <组名>").finish()
159-
items = await get_group(tag)
160-
if not items:
161-
await UniMessage.text("未找到该组。").finish()
162-
data = {tag: items}
163-
await UniMessage.text(json.dumps(data, ensure_ascii=False, indent=4)).finish()
164-
165-
166-
# 导出全部组(仅用于查看,组合成一个对象返回,不写入任何聚合文件)
167-
l4_export_groups = on_command("l4exportgroups", aliases={"l4导出全部服务器组"})
168-
169-
170-
@l4_export_groups.handle()
171-
async def _():
172-
data = await export_all()
173-
if not data:
174-
await UniMessage.text("暂无服务器组。").finish()
175-
await UniMessage.text(json.dumps(data, ensure_ascii=False, indent=4)).finish()

nonebot_plugin_l4d2_server/config.py

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
from pathlib import Path
2-
from typing import List, Set
2+
from typing import List
33

44
from nonebot import get_plugin_config
55
from nonebot.adapters.onebot.v11 import GROUP_ADMIN, GROUP_MEMBER, GROUP_OWNER
66
from nonebot.log import logger
7-
from nonebot.permission import SUPERUSER
7+
from nonebot.permission import SUPERUSER, Permission
88
from pydantic import BaseModel, Field, field_validator
99

1010
# 常量定义
@@ -81,10 +81,10 @@ def update_map_index(self, index: int) -> None:
8181
"""更新地图索引配置"""
8282
if index < 0:
8383
raise ValueError("地图索引不能小于0")
84-
self._config.map_index = index
84+
self.map_index = index
8585

8686
@property
87-
def l4_permission_set(self) -> Set[int]:
87+
def l4_permission_set(self) -> Permission:
8888
permissions = {
8989
1: SUPERUSER,
9090
2: SUPERUSER | GROUP_OWNER,
@@ -139,15 +139,19 @@ def update(self, **kwargs) -> None:
139139
if key not in valid_keys:
140140
raise ValueError(f"无效的配置项: {key}")
141141

142-
field_type = ConfigModel[key].type_
142+
field_info = ConfigModel.model_fields[key]
143+
field_type = field_info.annotation
144+
if not field_type:
145+
continue
146+
143147
if not isinstance(value, field_type):
144148
raise TypeError(f"{key} 必须是 {field_type.__name__} 类型")
145149

146150
setattr(self._config, key, value)
147151

148152
# 验证更新后的配置
149153
try:
150-
self._config = ConfigModel(**self._config.dict())
154+
self._config = ConfigModel(**self._config.model_dump())
151155
except ValueError as e:
152156
logger.error(f"配置更新失败: {e!s}")
153157

0 commit comments

Comments
 (0)