Skip to content

Commit 0d80bcf

Browse files
committed
🐛修复传输文件相关问题
1 parent c3d3157 commit 0d80bcf

4 files changed

Lines changed: 88 additions & 75 deletions

File tree

nonebot_plugin_l4d2_server/config.py

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,6 @@ def init_data_directory(data_dir: Path) -> None:
3030
server_all_path.mkdir(parents=True, exist_ok=True)
3131

3232
ICONPATH = DATAPATH / "icon"
33-
global map_index
34-
map_index = 0
3533

3634

3735
class ConfigModel(BaseModel):
@@ -48,7 +46,8 @@ class ConfigModel(BaseModel):
4846
default=True,
4947
description="单服务器查询时是否展示ip直连地址",
5048
)
51-
l4_local: List[str] = Field(default_factory=list, description="本地服务器路径列表")
49+
l4_local: List[str] = Field(default=[], description="本地服务器路径列表")
50+
l4_map_index: int = Field(default=0, description="地图索引")
5251

5352
@classmethod
5453
def validate_players(cls, v):
@@ -69,6 +68,12 @@ def validate_local_paths(cls, v):
6968
raise ValueError(f"路径 {v} 下缺少 steam_appid.txt 文件")
7069
return str(path.resolve())
7170

71+
def update_map_index(self, index: int) -> None:
72+
"""更新地图索引配置"""
73+
if index < 0:
74+
raise ValueError("地图索引不能小于0")
75+
self._config.map_index = index
76+
7277

7378
config = get_plugin_config(ConfigModel)
7479

nonebot_plugin_l4d2_server/l4_help/Help.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@
4949
},
5050
{
5151
"name": "l4地图上传",
52-
"desc": "进入交互上传地图文件",
52+
"desc": "进入交互上传地图文件(需要设置本地服务器)",
5353
"eg": "l4地图上传",
5454
"need_ck": false,
5555
"need_sk": false,

nonebot_plugin_l4d2_server/l4_local/__init__.py

Lines changed: 64 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -5,18 +5,11 @@
55
from nonebot.matcher import Matcher
66
from nonebot_plugin_alconna import File, UniMessage, UniMsg, on_alconna
77

8-
from ..config import config, map_index
8+
from ..config import config
99
from ..l4_image.convert import text2pic
1010
from ..utils.utils import mes_list
1111
from .file import updown_l4d2_vpk
12-
13-
try:
14-
vpk_path = config.l4_local[map_index]
15-
except IndexError:
16-
logger.warning(
17-
"未填写本地服务器路径,如果想要使用本地服务器功能,请填写本地服务器路径",
18-
)
19-
vpk_path = ""
12+
from .utils import sort_key
2013

2114
local_path_list = config.l4_local
2215
if not local_path_list:
@@ -42,87 +35,87 @@
4235
priority=20,
4336
block=True,
4437
)
38+
up = on_alconna(
39+
"l4upload",
40+
aliases={"l4地图上传"},
41+
priority=5,
42+
block=True,
43+
)
4544

4645
@search_map.handle()
47-
async def _():
46+
async def search_map_handler() -> None:
4847
try:
49-
supath = local_path[map_index] / "addons"
48+
if not local_path or config.l4_map_index is None:
49+
await UniMessage.text("未知错误").finish()
50+
addons_path = local_path[config.l4_map_index] / "addons"
5051
except IndexError:
51-
logger.warning(
52-
"未填写本地服务器路径,如果想要使用本地服务器功能,请填写本地服务器路径",
53-
)
54-
await UniMessage.text(
55-
"未填写本地服务器路径,如果想要使用本地服务器功能,请填写本地服务器路径",
56-
).finish()
57-
vpk_list: list[str] = []
58-
if supath.is_dir():
59-
for sudir in supath.iterdir():
60-
logger.info(f"找到文件:{sudir}")
61-
if sudir.is_file() and sudir.name.endswith(".vpk"):
62-
vpk_list.append(sudir.name)
63-
if not vpk_list:
52+
logger.warning("未配置本地服务器路径")
53+
await UniMessage.text("未配置本地服务器路径").finish()
54+
return
55+
56+
vpk_files: list[str] = []
57+
if addons_path.is_dir():
58+
for file in addons_path.iterdir():
59+
if file.is_file() and file.suffix == ".vpk":
60+
vpk_files.append(file.name)
61+
62+
if not vpk_files:
6463
await UniMessage.text("未找到可用的VPK文件").finish()
64+
return
6565

66-
# 添加排序逻辑(数字升序)
67-
def sort_key(filename: str):
68-
# 提取文件名开头的数字(如果有)
69-
num_part = ""
70-
for char in filename:
71-
if char.isdigit():
72-
num_part += char
73-
elif num_part: # 遇到非数字且已经有数字部分时停止
74-
break
75-
76-
# 返回一个元组作为排序依据:(数字值, 整个文件名)
77-
# 使用正数表示升序,没有数字的用无穷大排在最后
78-
return (
79-
int(num_part) if num_part else float("inf"),
80-
filename,
81-
)
82-
83-
# 按数字升序,然后按字母和中文排序
84-
vpk_list.sort(key=sort_key)
85-
86-
out_msg = "\n".join(
87-
f"{index + 1}{line}" for index, line in enumerate(vpk_list)
88-
)
66+
vpk_files.sort(key=sort_key)
67+
out_msg = "\n".join(f"{i+1}{name}" for i, name in enumerate(vpk_files))
8968

9069
img = await text2pic(f"服务器地图:\n{out_msg}")
9170
await UniMessage.image(raw=img).send()
9271

93-
up = on_alconna(
94-
"l4upload",
95-
aliases={"l4地图上传"},
96-
priority=5,
97-
block=True,
98-
)
99-
10072
@up.handle()
10173
async def _():
10274
await UniMessage.text("请发送地图文件").finish()
10375

10476
@up.got("map_url", prompt="图来")
105-
async def _(ev: Event, msg: UniMsg, matcher: Matcher):
77+
async def handle_upload(
78+
ev: Event,
79+
msg: UniMsg,
80+
matcher: Matcher,
81+
) -> None:
10682
if not msg.has(File):
107-
await UniMessage.text("不是文件,退出交互").finish()
108-
args = ev.dict()
109-
if args["notice_type"] != "offline_file":
83+
await UniMessage.text("不是文件,退出交互").finish()
84+
85+
args = ev.model_dump()
86+
if args.get("notice_type") != "offline_file":
11087
matcher.set_arg("txt", args) # type: ignore
11188
return
112-
l4_file_path = config.l4_local[map_index]
113-
map_path = Path(l4_file_path, vpk_path) # type: ignore
114-
# 检查下载路径是否存在
115-
if not Path(l4_file_path).exists(): # type: ignore
116-
await UniMessage.text("你填写的路径不存在辣").finish()
117-
if not Path(map_path).exists():
118-
await UniMessage.text("这个路径并不是求生服务器的路径,请再看看罢").finish()
119-
url: str = args["file"]["url"]
120-
name: str = args["file"]["name"]
121-
# 如果不符合格式则忽略
122-
await up.send("已收到文件,开始下载")
89+
90+
try:
91+
if not hasattr(config, "l4_map_index"):
92+
await UniMessage.text("未知错误").finish()
93+
l4_file_path = config.l4_local[config.l4_map_index]
94+
except (IndexError, AttributeError):
95+
await UniMessage.text("服务器配置错误").finish()
96+
97+
map_path = Path(l4_file_path) / "addons"
98+
99+
if not map_path.parent.exists():
100+
await UniMessage.text("配置的路径不存在").finish()
101+
if not map_path.exists():
102+
await UniMessage.text("无效的求生服务器路径").finish()
103+
104+
file_info = args.get("file")
105+
if not file_info:
106+
await UniMessage.text("无效的文件信息").finish()
107+
108+
url = file_info.get("url", "")
109+
name = file_info.get("name", "")
110+
111+
if not url or not name or not name.endswith(".vpk"):
112+
await UniMessage.text("无效的文件格式").finish()
113+
114+
await up.send("已收到文件,开始下载")
123115
vpk_files = await updown_l4d2_vpk(map_path, name, url)
116+
124117
if vpk_files:
125-
mes = "解压成功,新增以下几个vpk文件"
118+
mes = "解压成功,新增以下vpk文件:"
126119
await UniMessage.text(mes_list(mes, vpk_files)).finish()
127120
else:
128-
await UniMessage.text("你可能上传了相同的文件,或者解压失败了捏").finish()
121+
await UniMessage.text("文件已存在或解压失败").finish()
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
def sort_key(filename: str):
2+
# 提取文件名开头的数字(如果有)
3+
num_part = ""
4+
for char in filename:
5+
if char.isdigit():
6+
num_part += char
7+
elif num_part: # 遇到非数字且已经有数字部分时停止
8+
break
9+
10+
# 返回一个元组作为排序依据:(数字值, 整个文件名)
11+
# 使用正数表示升序,没有数字的用无穷大排在最后
12+
return (
13+
int(num_part) if num_part else float("inf"),
14+
filename,
15+
)

0 commit comments

Comments
 (0)