|
5 | 5 | from nonebot.matcher import Matcher |
6 | 6 | from nonebot_plugin_alconna import File, UniMessage, UniMsg, on_alconna |
7 | 7 |
|
8 | | -from ..config import config, map_index |
| 8 | +from ..config import config |
9 | 9 | from ..l4_image.convert import text2pic |
10 | 10 | from ..utils.utils import mes_list |
11 | 11 | 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 |
20 | 13 |
|
21 | 14 | local_path_list = config.l4_local |
22 | 15 | if not local_path_list: |
|
42 | 35 | priority=20, |
43 | 36 | block=True, |
44 | 37 | ) |
| 38 | + up = on_alconna( |
| 39 | + "l4upload", |
| 40 | + aliases={"l4地图上传"}, |
| 41 | + priority=5, |
| 42 | + block=True, |
| 43 | + ) |
45 | 44 |
|
46 | 45 | @search_map.handle() |
47 | | - async def _(): |
| 46 | + async def search_map_handler() -> None: |
48 | 47 | 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" |
50 | 51 | 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: |
64 | 63 | await UniMessage.text("未找到可用的VPK文件").finish() |
| 64 | + return |
65 | 65 |
|
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)) |
89 | 68 |
|
90 | 69 | img = await text2pic(f"服务器地图:\n{out_msg}") |
91 | 70 | await UniMessage.image(raw=img).send() |
92 | 71 |
|
93 | | - up = on_alconna( |
94 | | - "l4upload", |
95 | | - aliases={"l4地图上传"}, |
96 | | - priority=5, |
97 | | - block=True, |
98 | | - ) |
99 | | - |
100 | 72 | @up.handle() |
101 | 73 | async def _(): |
102 | 74 | await UniMessage.text("请发送地图文件").finish() |
103 | 75 |
|
104 | 76 | @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: |
106 | 82 | 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": |
110 | 87 | matcher.set_arg("txt", args) # type: ignore |
111 | 88 | 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("已收到文件,开始下载") |
123 | 115 | vpk_files = await updown_l4d2_vpk(map_path, name, url) |
| 116 | + |
124 | 117 | if vpk_files: |
125 | | - mes = "解压成功,新增以下几个vpk文件" |
| 118 | + mes = "解压成功,新增以下vpk文件:" |
126 | 119 | await UniMessage.text(mes_list(mes, vpk_files)).finish() |
127 | 120 | else: |
128 | | - await UniMessage.text("你可能上传了相同的文件,或者解压失败了捏").finish() |
| 121 | + await UniMessage.text("文件已存在或解压失败").finish() |
0 commit comments