nonebot-plugin-l4d2-server 1.0.0a2__py3-none-any.whl → 1.0.1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (73) hide show
  1. nonebot_plugin_l4d2_server/__main__.py +90 -1
  2. nonebot_plugin_l4d2_server/config.py +7 -1
  3. nonebot_plugin_l4d2_server/l4_anne/__init__.py +2 -1
  4. nonebot_plugin_l4d2_server/l4_help/Help.json +8 -0
  5. nonebot_plugin_l4d2_server/l4_help/__init__.py +1 -1
  6. nonebot_plugin_l4d2_server/l4_help/icon//344/273/213/347/273/215.png +0 -0
  7. nonebot_plugin_l4d2_server/l4_help/icon//344/273/273/345/212/241.png +0 -0
  8. nonebot_plugin_l4d2_server/l4_help/icon//344/277/241/346/201/257.png +0 -0
  9. nonebot_plugin_l4d2_server/l4_help/icon//345/205/254/345/221/212.png +0 -0
  10. nonebot_plugin_l4d2_server/l4_help/icon//345/210/200/345/211/221.png +0 -0
  11. nonebot_plugin_l4d2_server/l4_help/icon//345/210/207/346/215/242.png +0 -0
  12. nonebot_plugin_l4d2_server/l4_help/icon//345/210/240/351/231/244.png +0 -0
  13. nonebot_plugin_l4d2_server/l4_help/icon//345/210/267/346/226/260.png +0 -0
  14. nonebot_plugin_l4d2_server/l4_help/icon//345/215/241/347/273/204.png +0 -0
  15. nonebot_plugin_l4d2_server/l4_help/icon//345/223/252/351/207/214.png +0 -0
  16. nonebot_plugin_l4d2_server/l4_help/icon//345/234/260/345/233/276.png +0 -0
  17. nonebot_plugin_l4d2_server/l4_help/icon//345/257/274/345/205/245.png +0 -0
  18. nonebot_plugin_l4d2_server/l4_help/icon//345/257/274/345/207/272.png +0 -0
  19. nonebot_plugin_l4d2_server/l4_help/icon//345/275/261.png +0 -0
  20. nonebot_plugin_l4d2_server/l4_help/icon//346/213/274/345/233/276.png +0 -0
  21. nonebot_plugin_l4d2_server/l4_help/icon//346/216/242/347/264/242.png +0 -0
  22. nonebot_plugin_l4d2_server/l4_help/icon//346/216/250/351/200/201.png +0 -0
  23. nonebot_plugin_l4d2_server/l4_help/icon//346/224/266/351/233/206.png +0 -0
  24. nonebot_plugin_l4d2_server/l4_help/icon//346/224/273/347/225/245.png +0 -0
  25. nonebot_plugin_l4d2_server/l4_help/icon//346/233/264/346/226/260.png +0 -0
  26. nonebot_plugin_l4d2_server/l4_help/icon//346/235/220/346/226/231.png +0 -0
  27. nonebot_plugin_l4d2_server/l4_help/icon//346/237/245/350/257/242.png +0 -0
  28. nonebot_plugin_l4d2_server/l4_help/icon//346/240/241/351/252/214.png +0 -0
  29. nonebot_plugin_l4d2_server/l4_help/icon//346/257/217/346/234/210.png +0 -0
  30. nonebot_plugin_l4d2_server/l4_help/icon//346/267/261/346/270/212.png +0 -0
  31. nonebot_plugin_l4d2_server/l4_help/icon//346/267/273/345/212/240.png +0 -0
  32. nonebot_plugin_l4d2_server/l4_help/icon//346/270/205/351/231/244.png +0 -0
  33. nonebot_plugin_l4d2_server/l4_help/icon//347/212/266/346/200/201.png +0 -0
  34. nonebot_plugin_l4d2_server/l4_help/icon//347/255/276/345/210/260.png +0 -0
  35. nonebot_plugin_l4d2_server/l4_help/icon//347/273/221/345/256/232.png +0 -0
  36. nonebot_plugin_l4d2_server/l4_help/icon//350/241/250.png +0 -0
  37. nonebot_plugin_l4d2_server/l4_help/icon//350/241/250/346/203/205.png +0 -0
  38. nonebot_plugin_l4d2_server/l4_help/icon//350/247/222/350/211/262.png +0 -0
  39. nonebot_plugin_l4d2_server/l4_help/icon//350/256/260/345/275/225.png +0 -0
  40. nonebot_plugin_l4d2_server/l4_help/icon//351/205/215/347/275/256.png +0 -0
  41. nonebot_plugin_l4d2_server/l4_help/icon//351/207/215/345/220/257.png +0 -0
  42. nonebot_plugin_l4d2_server/l4_help/texture2d/badge.png +0 -0
  43. nonebot_plugin_l4d2_server/l4_help/texture2d/banner.png +0 -0
  44. nonebot_plugin_l4d2_server/l4_help/texture2d/bg.jpg +0 -0
  45. nonebot_plugin_l4d2_server/l4_help/texture2d/button.png +0 -0
  46. nonebot_plugin_l4d2_server/l4_help/texture2d/icon.png +0 -0
  47. nonebot_plugin_l4d2_server/l4_image/anne_pil.py +3 -2
  48. nonebot_plugin_l4d2_server/l4_image/convert.py +8 -12
  49. nonebot_plugin_l4d2_server/l4_image/download.py +5 -3
  50. nonebot_plugin_l4d2_server/l4_image/html_img.py +2 -2
  51. nonebot_plugin_l4d2_server/l4_image/image_tools.py +8 -5
  52. nonebot_plugin_l4d2_server/l4_image/img/anne/back.png +0 -0
  53. nonebot_plugin_l4d2_server/l4_image/img/anne/back1.jpg +0 -0
  54. nonebot_plugin_l4d2_server/l4_image/img/head/head.png +0 -0
  55. nonebot_plugin_l4d2_server/l4_image/img/header/logo.png +0 -0
  56. nonebot_plugin_l4d2_server/l4_image/img/header/player1.jpg +0 -0
  57. nonebot_plugin_l4d2_server/l4_image/img/template/Bocchi_The_Rock.png +0 -0
  58. nonebot_plugin_l4d2_server/l4_image/img/template/Pixel.png +0 -0
  59. nonebot_plugin_l4d2_server/l4_image/img/template/Rainbow.png +0 -0
  60. nonebot_plugin_l4d2_server/l4_image/img/template/vac.png +0 -0
  61. nonebot_plugin_l4d2_server/l4_image/img/template/vac_white.png +0 -0
  62. nonebot_plugin_l4d2_server/l4_local/__init__.py +98 -0
  63. nonebot_plugin_l4d2_server/l4_local/file.py +105 -0
  64. nonebot_plugin_l4d2_server/l4_request/__init__.py +70 -4
  65. nonebot_plugin_l4d2_server/l4_request/draw_msg.py +8 -3
  66. nonebot_plugin_l4d2_server/utils/api/request.py +25 -1
  67. nonebot_plugin_l4d2_server/utils/utils.py +13 -2
  68. {nonebot_plugin_l4d2_server-1.0.0a2.dist-info → nonebot_plugin_l4d2_server-1.0.1.dist-info}/METADATA +4 -6
  69. nonebot_plugin_l4d2_server-1.0.1.dist-info/RECORD +99 -0
  70. {nonebot_plugin_l4d2_server-1.0.0a2.dist-info → nonebot_plugin_l4d2_server-1.0.1.dist-info}/WHEEL +1 -1
  71. nonebot_plugin_l4d2_server-1.0.1.dist-info/entry_points.txt +4 -0
  72. nonebot_plugin_l4d2_server-1.0.0a2.dist-info/RECORD +0 -96
  73. {nonebot_plugin_l4d2_server-1.0.0a2.dist-info → nonebot_plugin_l4d2_server-1.0.1.dist-info}/licenses/LICENSE +0 -0
@@ -15,8 +15,10 @@
15
15
  * along with this program. If not, see <https://www.gnu.org/licenses/>.
16
16
  """
17
17
 
18
+ from pathlib import Path
18
19
  from typing import TYPE_CHECKING, List, Optional
19
20
 
21
+ import ujson as json
20
22
  from nonebot.adapters import Message
21
23
  from nonebot.log import logger
22
24
  from nonebot.matcher import Matcher
@@ -26,12 +28,14 @@ from nonebot_plugin_alconna import UniMessage
26
28
 
27
29
  from .config import config
28
30
  from .l4_help import get_l4d2_core_help
31
+ from .l4_local import * # noqa: F403
29
32
  from .l4_request import (
30
33
  COMMAND,
31
34
  get_all_server_detail,
32
35
  get_ip_server,
33
36
  get_server_detail,
34
37
  reload_ip,
38
+ tj_request
35
39
  )
36
40
  from .utils.api.request import L4API
37
41
 
@@ -47,6 +51,9 @@ l4_all = on_command("l4all", aliases={"l4全服"})
47
51
  l4_connect = on_command("connect", aliases={"l4连接"})
48
52
  l4_find_player = on_command("l4find", aliases={"l4查找"})
49
53
 
54
+ ld_tj = on_command("tj", aliases={"探监"})
55
+ ld_zl = on_command("zl")
56
+ ld_kl = on_command("kl")
50
57
 
51
58
  @l4_help.handle()
52
59
  async def _(matcher: Matcher):
@@ -135,6 +142,88 @@ async def _(args: Message = CommandArg()):
135
142
  if not arg:
136
143
  reload_ip()
137
144
  logger.success("重载ip完成")
145
+ with (Path(config.l4_path) / "config.json").open("r", encoding="utf-8") as f:
146
+ content = f.read().strip()
147
+ ip_json = json.loads(content)
148
+ for tag, url in ip_json.items():
149
+ logger.info(f"重载{tag}的ip")
150
+ await L4API.get_sourceban(tag, url)
138
151
  await UniMessage.text("重载ip完成").finish()
152
+
153
+
154
+ l4_add_ban = on_command("l4addban", aliases={"l4添加ban"})
155
+ @l4_add_ban.handle()
156
+ async def _(args: Message = CommandArg()):
157
+ arg = args.extract_plain_text().strip().split(" ")
158
+
159
+ if len(arg) != 2:
160
+ await UniMessage.text("请在命令后增加响应指令名和网址").finish()
161
+
162
+ config_path = Path(config.l4_path) / "config.json"
163
+
164
+ if not config_path.is_file():
165
+ config_data = {}
139
166
  else:
140
- print(await L4API.get_sourceban())
167
+ try:
168
+ with config_path.open("r") as f:
169
+ config_data = json.load(f)
170
+ except (json.JSONDecodeError, FileNotFoundError):
171
+ config_data = {}
172
+
173
+ config_data.update({arg[0]: arg[1]})
174
+
175
+ try:
176
+ with config_path.open("w") as f:
177
+ json.dump(config_data, f, ensure_ascii=False, indent=4)
178
+ except IOError as e:
179
+ await UniMessage.text(f"文件写入失败: {e}").finish()
180
+
181
+ await L4API.get_sourceban(arg[0], arg[1])
182
+ await UniMessage.text(f"添加成功\n组名: {arg[0]}\n网址: {arg[1]}").finish()
183
+
184
+
185
+ l4_del_ban = on_command("l4delban", aliases={"l4删除ban", "l4移除ban"})
186
+ @l4_del_ban.handle()
187
+ async def _(args: Message = CommandArg()):
188
+ arg = args.extract_plain_text().strip().split(" ")
189
+ if len(arg) not in [1,2]:
190
+ await UniMessage.text("请在命令后增加响应指令名或者带响应网址").finish()
191
+ elif len(arg) == 1:
192
+ if not Path(Path(config.l4_path) / "config.json").is_file():
193
+ await UniMessage.text("没有添加过组名").finish()
194
+ else:
195
+ with (Path(config.l4_path) / "config.json").open("r", encoding="utf-8") as f:
196
+ content = f.read().strip()
197
+ config_data = json.loads(content)
198
+ if arg[0] not in config_data:
199
+ await UniMessage.text("没有添加过这个组").finish()
200
+ else:
201
+ del config_data[arg[0]]
202
+ with Path(Path(config.l4_path) / "config.json").open("w") as f:
203
+ json.dump(config_data, f,ensure_ascii=False,indent=4)
204
+ await UniMessage.text(f"删除成功,组名:{arg[0]}").finish()
205
+ elif len(arg) == 2:
206
+ if not Path(Path(config.l4_path) / "config.json").is_file():
207
+ await UniMessage.text("没有添加过组名").finish()
208
+ else:
209
+ with (Path(config.l4_path) / "config.json").open("r", encoding="utf-8") as f:
210
+ content = f.read().strip()
211
+ config_datas = json.loads(content)
212
+ if arg[0] not in config_datas:
213
+ await UniMessage.text("没有添加过这个组").finish()
214
+ else:
215
+ config_datas[arg[0]] = arg[1]
216
+ with Path(Path(config.l4_path) / "config.json").open("w") as f:
217
+ json.dump(config_datas, f,ensure_ascii=False,indent=4)
218
+ await UniMessage.text(f"修改成功,组名:{arg[0]},网址:{arg[1]}").finish()
219
+
220
+
221
+ @ld_tj.handle()
222
+ async def _(matcher: Matcher):
223
+ await matcher.send("正在寻找牢房信息")
224
+ await matcher.finish(await tj_request("云","tj"))
225
+
226
+ @ld_zl.handle()
227
+ async def _(matcher: Matcher):
228
+ await matcher.send("正在寻找牢房信息")
229
+ await matcher.finish(await tj_request("云","zl"))
@@ -11,9 +11,12 @@ server_all_path.mkdir(parents=True, exist_ok=True)
11
11
 
12
12
  ICONPATH = DATAPATH / "icon"
13
13
 
14
+ global map_index
15
+ map_index = 0
16
+
14
17
 
15
18
  class ConfigModel(BaseModel):
16
- l4_anne: bool = True
19
+ l4_anne: bool = False
17
20
  """是否启用anne电信服相关功能"""
18
21
  l4_enable: bool = True
19
22
  """是否全局启用求生功能"""
@@ -30,6 +33,9 @@ class ConfigModel(BaseModel):
30
33
  l4_font: str = str(Path(__file__).parent.joinpath("data/font/loli.ttf"))
31
34
  """字体"""
32
35
  l4_show_ip: bool = True
36
+ """单服务器查询时候是否展示ip直连地址"""
37
+ l4_local: list[str] = []
38
+ """本地服务器路径,填写路径下有`steam_appid.txt`文件"""
33
39
 
34
40
 
35
41
  config = get_plugin_config(ConfigModel)
@@ -1,4 +1,5 @@
1
- from nonebot import log as log, on_command # noqa: N999
1
+ from nonebot import log as log
2
+ from nonebot import on_command
2
3
  from nonebot.adapters import Event, Message
3
4
  from nonebot.log import logger
4
5
  from nonebot.params import CommandArg
@@ -83,6 +83,14 @@
83
83
  "need_ck": false,
84
84
  "need_sk": false,
85
85
  "need_admin": true
86
+ },
87
+ {
88
+ "name": "l4地图上传",
89
+ "desc": "进入交互上传地图文件",
90
+ "eg": "l4地图上传",
91
+ "need_ck": false,
92
+ "need_sk": false,
93
+ "need_admin": true
86
94
  }
87
95
  ]
88
96
  },
@@ -10,7 +10,7 @@ from ..l4_image.convert import core_font
10
10
  from ..l4_image.model import PluginHelp
11
11
  from .draw import get_help
12
12
 
13
- __version__ = "1.0.0a2"
13
+ __version__ = "1.0.1"
14
14
  TEXT_PATH = Path(__file__).parent / "texture2d"
15
15
  HELP_DATA = Path(__file__).parent / "Help.json"
16
16
 
@@ -1,8 +1,9 @@
1
1
  from pathlib import Path
2
2
 
3
- from nonebot_plugin_l4d2_server.utils.api.models import AnnePlayer2
4
3
  from PIL import Image, ImageFont
5
4
 
5
+ from nonebot_plugin_l4d2_server.utils.api.models import AnnePlayer2
6
+
6
7
  from ..config import config
7
8
 
8
9
  font = ImageFont.truetype(config.l4_font)
@@ -10,7 +11,7 @@ font = ImageFont.truetype(config.l4_font)
10
11
  anne_path = Path(__file__).parent / "img" / "anne"
11
12
 
12
13
 
13
- async def anne_player_info(msg: AnnePlayer2):
14
+ async def anne_player_info(msg: AnnePlayer2): # noqa: RUF029
14
15
  back_img = Image.open(anne_path / "back1.jpg")
15
16
  base_img = Image.new("RGBA", (back_img.size), (255, 255, 255, 50))
16
17
  back_img.paste(base_img, (0, 0), base_img)
@@ -21,32 +21,28 @@ def core_font(size: int) -> ImageFont.FreeTypeFont:
21
21
  async def convert_img(
22
22
  img: Image.Image,
23
23
  is_base64: bool = False,
24
- ) -> bytes:
25
- ...
24
+ ) -> bytes: ...
26
25
 
27
26
 
28
27
  @overload
29
28
  async def convert_img(
30
29
  img: Image.Image,
31
- is_base64: bool = True,
32
- ) -> str:
33
- ...
30
+ is_base64: bool = True, # noqa: FBT001
31
+ ) -> str: ...
34
32
 
35
33
 
36
34
  @overload
37
35
  async def convert_img(
38
36
  img: bytes,
39
37
  is_base64: bool = False,
40
- ) -> str:
41
- ...
38
+ ) -> str: ...
42
39
 
43
40
 
44
41
  @overload
45
42
  async def convert_img(
46
43
  img: Path,
47
44
  is_base64: bool = False,
48
- ) -> str:
49
- ...
45
+ ) -> str: ...
50
46
 
51
47
 
52
48
  async def convert_img(
@@ -78,7 +74,7 @@ async def convert_img(
78
74
  async with aiofiles.open(img, "rb") as fp:
79
75
  img = await fp.read()
80
76
 
81
- logger.success("图片处理完成!")
77
+ logger.success("图片处理完成!")
82
78
 
83
79
  return f"base64://{b64encode(img).decode()}"
84
80
 
@@ -90,7 +86,7 @@ def convert_img_sync(img_path: Path):
90
86
  return f"base64://{b64encode(img).decode()}"
91
87
 
92
88
 
93
- async def str_lenth(r: str, size: int, limit: int = 540) -> str:
89
+ async def str_lenth(r: str, size: int, limit: int = 540) -> str: # noqa: RUF029
94
90
  result = ""
95
91
  temp = 0
96
92
  for i in r:
@@ -158,7 +154,7 @@ async def text2pic(text: str, max_size: int = 800, font_size: int = 24):
158
154
 
159
155
  img = Image.new(
160
156
  "RGB",
161
- (max_size, len(text) * font_size // 3),
157
+ (max_size, len(text) * font_size // 10),
162
158
  (255, 255, 255),
163
159
  )
164
160
  img_draw = ImageDraw.ImageDraw(img)
@@ -27,20 +27,22 @@ async def download_url(url: str) -> bytes:
27
27
  logger.warning(f"Error downloading {url}, retry {i}/3: {e}")
28
28
  await asyncio.sleep(3)
29
29
 
30
- raise Exception(f"{url} 下载失败!")
30
+ raise Exception(f"{url} 下载失败!")
31
31
 
32
32
 
33
33
  async def download_head(user_id: str) -> bytes:
34
34
  url = f"http://q1.qlogo.cn/g?b=qq&nk={user_id}&s=640"
35
35
  data = await download_url(url)
36
- if hashlib.md5(data).hexdigest() == "acef72340ac0e914090bd35799f5594e": # noqa: S324
36
+ if (
37
+ hashlib.md5(data).hexdigest() == "acef72340ac0e914090bd35799f5594e"
38
+ ): # noqa: S324
37
39
  url = f"http://q1.qlogo.cn/g?b=qq&nk={user_id}&s=100"
38
40
  data = await download_url(url)
39
41
  return data
40
42
 
41
43
 
42
44
  def square_to_circle(im: ImageS):
43
- """im是正方形,变圆形"""
45
+ """im是正方形,变圆形"""
44
46
  size = im.size
45
47
  mask = Image.new("L", size, 0)
46
48
  draw = ImageDraw.Draw(mask)
@@ -23,7 +23,7 @@ env = jinja2.Environment(
23
23
 
24
24
  async def server_ip_pic(server_dict: List[OutServer]):
25
25
  """
26
- 输入一个字典列表,输出图片
26
+ 输入一个字典列表,输出图片
27
27
  msg_dict:folder/name/map_/players/max_players/Players/[Name]
28
28
  """
29
29
  for server_info in server_dict:
@@ -92,7 +92,7 @@ async def get_server_img(plugins: List[OutServer]) -> Optional[bytes]:
92
92
 
93
93
  # async def server_group_ip_pic(msg_list: List[ServerGroup]) -> bytes:
94
94
  # """
95
- # 输入一个群组字典列表,输出图片
95
+ # 输入一个群组字典列表,输出图片
96
96
  # msg_dict:folder/name/map_/players/max_players/Players/[Name]
97
97
  # """
98
98
  # template = env.get_template("group_ip.html")
@@ -44,7 +44,10 @@ def get_v4_bg(w: int, h: int, is_dark: bool = False, is_blur: bool = False):
44
44
  return img.convert("RGBA")
45
45
 
46
46
 
47
- async def shift_image_hue(img: Image.Image, angle: float = 30) -> Image.Image:
47
+ async def shift_image_hue(
48
+ img: Image.Image,
49
+ angle: float = 30,
50
+ ) -> Image.Image: # noqa: RUF029
48
51
  alpha = img.getchannel("A")
49
52
  img = img.convert("HSV")
50
53
 
@@ -120,7 +123,7 @@ def draw_center_text_by_line(
120
123
  line = line.replace("\n", "")
121
124
  img.text((x, y), line, fill, font, anchor)
122
125
  line, lenth = "", 0
123
- y += h * 2.5
126
+ y += h * 1.5
124
127
  else:
125
128
  img.text((x, y), line, fill, font, anchor)
126
129
  return y
@@ -198,7 +201,7 @@ def easy_paste(
198
201
  """
199
202
  inplace method
200
203
  快速粘贴, 自动获取被粘贴图像的坐标。
201
- pos应当是粘贴点坐标,direction指定粘贴点方位,例如lt为左上
204
+ pos应当是粘贴点坐标,direction指定粘贴点方位,例如lt为左上
202
205
  """
203
206
  x, y = pos
204
207
  size_x, size_y = im_paste.size
@@ -379,11 +382,11 @@ class CustomizeImage:
379
382
  for i in range(color):
380
383
  bg = tuple(
381
384
  q.getpalette()[ # type:ignore
382
- i * 3 : (i * 3) + 3 # noqa:E203
385
+ i * 3 : (i * 3) + 3
383
386
  ],
384
387
  )
385
388
  light_value = bg[0] * 0.3 + bg[1] * 0.6 + bg[2] * 0.1
386
- if abs(light_value - based_light) < temp: # noqa:E203
389
+ if abs(light_value - based_light) < temp:
387
390
  bg_color = bg
388
391
  temp = abs(light_value - based_light)
389
392
  return bg_color # type:ignore
@@ -0,0 +1,98 @@
1
+ from pathlib import Path
2
+
3
+ from nonebot.adapters import Event
4
+ from nonebot.log import logger
5
+ from nonebot.matcher import Matcher
6
+ from nonebot_plugin_alconna import File, UniMessage, UniMsg, on_alconna
7
+
8
+ from ..config import config, map_index
9
+ from ..l4_image.convert import text2pic
10
+ from ..utils.utils import mes_list
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
+ vpk_path = ""
18
+
19
+ local_path_list = config.l4_local
20
+ if not local_path_list:
21
+ logger.warning(
22
+ "未填写本地服务器路径,如果想要使用本地服务器功能,请填写本地服务器路径",
23
+ )
24
+ else:
25
+ local_path: list[Path] = []
26
+ for folder_path in local_path_list:
27
+ path = Path(folder_path)
28
+
29
+ if path.is_dir():
30
+ for nextdir in path.iterdir():
31
+ # 如果找到了名为left4dead2的目录,返回True
32
+ if nextdir.name == "left4dead2" and nextdir.is_dir():
33
+ local_path.append(nextdir)
34
+ continue
35
+ logger.debug(f"本地服务器路径列表:{local_path}")
36
+
37
+ search_map = on_alconna(
38
+ "l4map",
39
+ aliases={"l4地图查询", "l4地图"},
40
+ priority=20,
41
+ block=True,
42
+ )
43
+
44
+ @search_map.handle()
45
+ async def _():
46
+ supath = local_path[map_index] / "addons"
47
+ vpk_list: list[str] = []
48
+ print(supath)
49
+ if supath.is_dir():
50
+ for sudir in supath.iterdir():
51
+ logger.info(f"找到文件:{sudir}")
52
+ if sudir.is_file() and sudir.name.endswith(".vpk"):
53
+ vpk_list.append(sudir.name)
54
+ if not vpk_list:
55
+ await UniMessage.text("未找到可用的VPK文件").finish()
56
+ out_msg = "\n".join(
57
+ f"{index + 1}、{line}" for index, line in enumerate(vpk_list)
58
+ )
59
+
60
+ img = await text2pic(f"服务器地图:\n{out_msg}")
61
+ await UniMessage.image(raw=img).send()
62
+
63
+ up = on_alconna(
64
+ "l4upload",
65
+ aliases={"l4地图上传"},
66
+ priority=5,
67
+ block=True,
68
+ )
69
+
70
+ @up.handle()
71
+ async def _():
72
+ await UniMessage.text("请发送地图文件").finish()
73
+
74
+ @up.got("map_url", prompt="图来")
75
+ async def _(ev: Event, msg: UniMsg, matcher: Matcher):
76
+ if not msg.has(File):
77
+ await UniMessage.text("不是文件,退出交互").finish()
78
+ args = ev.dict()
79
+ if args["notice_type"] != "offline_file":
80
+ matcher.set_arg("txt", args) # type: ignore
81
+ return
82
+ l4_file_path = config.l4_local[map_index]
83
+ map_path = Path(l4_file_path, vpk_path) # type: ignore
84
+ # 检查下载路径是否存在
85
+ if not Path(l4_file_path).exists(): # type: ignore
86
+ await UniMessage.text("你填写的路径不存在辣").finish()
87
+ if not Path(map_path).exists():
88
+ await UniMessage.text("这个路径并不是求生服务器的路径,请再看看罢").finish()
89
+ url: str = args["file"]["url"]
90
+ name: str = args["file"]["name"]
91
+ # 如果不符合格式则忽略
92
+ await up.send("已收到文件,开始下载")
93
+ vpk_files = await updown_l4d2_vpk(map_path, name, url)
94
+ if vpk_files:
95
+ mes = "解压成功,新增以下几个vpk文件"
96
+ await UniMessage.text(mes_list(mes, vpk_files)).finish()
97
+ else:
98
+ await UniMessage.text("你可能上传了相同的文件,或者解压失败了捏").finish()
@@ -0,0 +1,105 @@
1
+ import io
2
+ import platform
3
+ import zipfile
4
+ from pathlib import Path
5
+ from typing import Callable, Dict, List
6
+ from zipfile import ZipFile
7
+
8
+ import rarfile
9
+ from nonebot.log import logger
10
+ from pyunpack import Archive
11
+
12
+ from ..utils.utils import get_file, get_vpk
13
+
14
+ systems = platform.system()
15
+
16
+
17
+ async def updown_l4d2_vpk(map_paths: Path, name: str, url: str):
18
+ """从url下载压缩包并解压到位置"""
19
+ original_vpk_files = get_vpk(map_paths)
20
+ down_file = Path(map_paths, name)
21
+ if await get_file(url, down_file) is None:
22
+ return None
23
+ msg = open_packet(name, down_file)
24
+ logger.info(msg)
25
+
26
+ extracted_vpk_files = get_vpk(map_paths)
27
+ # 获取新增vpk文件的list
28
+ return list(set(extracted_vpk_files) - set(original_vpk_files))
29
+
30
+
31
+ SUPPORTED_EXTENSIONS = (".zip", ".7z", ".rar")
32
+
33
+
34
+ def unzip_zipfile(down_file: Path, down_path: Path):
35
+ """解压zip文件"""
36
+ with support_gbk(zipfile.ZipFile(down_file, "r")) as z:
37
+ z.extractall(down_path)
38
+ down_file.unlink()
39
+
40
+
41
+ def unpack_7zfile(down_file: Path, down_path: Path):
42
+ """解压7z文件"""
43
+ Archive(str(down_file)).extractall(str(down_path))
44
+ down_file.unlink()
45
+
46
+
47
+ def unpack_rarfile(down_file: Path, down_path: Path):
48
+ """解压rar文件"""
49
+ with rarfile.RarFile(down_file, "r") as z:
50
+ z.extractall(down_path)
51
+ down_file.unlink()
52
+
53
+
54
+ def open_packet(name: str, down_file: Path) -> str:
55
+ """解压压缩包"""
56
+ down_path = down_file.parent
57
+ logger.info("文件名为:" + name)
58
+ logger.info(f"系统为{systems}")
59
+ if name.endswith(".vpk"):
60
+ return "vpk文件已下载"
61
+
62
+ for ext in SUPPORTED_EXTENSIONS:
63
+ if name.endswith(ext):
64
+ mes = f"{ext[1:]}文件已下载,正在解压"
65
+ unpack_funcs: Dict[str, Callable] = {
66
+ ".zip": unzip_zipfile,
67
+ ".7z": unpack_7zfile,
68
+ ".rar": unpack_rarfile,
69
+ }
70
+ unpack_func = unpack_funcs.get(ext)
71
+ if not unpack_func:
72
+ raise ValueError(f"不支持的拓展名: {ext}")
73
+ unpack_func(down_file, down_path)
74
+ return mes
75
+
76
+ raise ValueError(f"不支持的文件: {name}")
77
+
78
+
79
+ def support_gbk(zip_file: ZipFile):
80
+ """
81
+ 压缩包中文恢复
82
+ """
83
+ if isinstance(zip_file, ZipFile):
84
+ name_to_info = zip_file.NameToInfo
85
+ # copy map first
86
+ for name, info in name_to_info.copy().items():
87
+ real_name = name.encode("cp437").decode("gbk")
88
+ if real_name != name:
89
+ info.filename = real_name
90
+ del name_to_info[name]
91
+ name_to_info[real_name] = info
92
+ return zip_file
93
+
94
+
95
+ async def all_zip_to_one(data_list: List[bytes]): # noqa: RUF029
96
+ """多压缩包文件合并"""
97
+ file_list = [io.BytesIO(data).getbuffer() for data in data_list]
98
+ data_file = io.BytesIO()
99
+
100
+ with ZipFile(data_file, mode="w") as zf:
101
+ for i, file in enumerate(file_list):
102
+ filename = f"file{i}.zip"
103
+ zf.writestr(filename, file)
104
+
105
+ return data_file.getbuffer()
@@ -1,18 +1,18 @@
1
+ import random
1
2
  from typing import Dict, List, Optional, cast
2
3
 
3
4
  from nonebot.log import logger
4
-
5
5
  from ..config import server_all_path
6
6
  from ..l4_image import msg_to_image
7
7
  from ..utils.api.models import AllServer, NserverOut, OutServer
8
8
  from ..utils.utils import split_maohao
9
- from .draw_msg import draw_one_ip, get_much_server
10
-
9
+ from .draw_msg import draw_one_ip, get_much_server, convert_duration
10
+ from ..utils.api.request import L4API
11
11
  try:
12
12
  import ujson as json
13
13
  except ImportError:
14
14
  import json
15
-
15
+ from ..config import config
16
16
 
17
17
  # 获取全部服务器信息
18
18
  ALLHOST: Dict[str, List[NserverOut]] = {}
@@ -141,3 +141,69 @@ def reload_ip():
141
141
 
142
142
  if item.name.endswith("txt"):
143
143
  """to do"""
144
+
145
+ async def tj_request(command: str = "云",tj ="tj"):
146
+ server_json = ALLHOST.get(command)
147
+ logger.info(server_json)
148
+ if server_json is None:
149
+ logger.warning("未找到这个组")
150
+ return None
151
+ # 返回单个
152
+ logger.info("正在anne电信服务器信息")
153
+ player_msg = ""
154
+ right_ip = []
155
+ for i in server_json:
156
+ ser_list = await L4API.a2s_info([(i["host"], i["port"])], is_player=True)
157
+ one_server = ser_list[0][0]
158
+ one_player = ser_list[0][1]
159
+
160
+ # 判断坐牢条件
161
+ if tj == "tj":
162
+ if "普通药役" in one_server.map_name:
163
+ score: int = 0
164
+ for index, player in enumerate(one_player, 1):
165
+ if index > 4:
166
+ break
167
+ score += player.score
168
+
169
+ t = one_server.map_name.split("[")[-1].split("特")[0]
170
+ if int(t)*50 < score:
171
+ right_ip.append(i)
172
+ if tj == "zl":
173
+ if "普通药役" in one_server.map_name and len(one_player) <= 4:
174
+ right_ip.append(i)
175
+
176
+
177
+ if not right_ip:
178
+ return "没有符合条件的服务器"
179
+
180
+ s = random.choice(right_ip)
181
+ ser_list = await L4API.a2s_info([(s["host"], s["port"])], is_player=True)
182
+ one_server = ser_list[0][0]
183
+ one_player = ser_list[0][1]
184
+ if len(one_player):
185
+ max_duration_len = max(
186
+ [len(str(await convert_duration(i.duration))) for i in one_player],
187
+ )
188
+ max_score_len = max(len(str(i.score)) for i in one_player)
189
+
190
+ for player in one_player:
191
+ soc = "[{:>{}}]".format(player.score, max_score_len)
192
+ chines_dur = await convert_duration(player.duration)
193
+ dur = "{:^{}}".format(chines_dur, max_duration_len)
194
+ name = f"{player.name[0]}***{player.name[-1]}"
195
+ player_msg += f"{soc} | {dur} | {name} \n"
196
+ else:
197
+ player_msg = "服务器感觉很安静啊"
198
+ msg = f"""*{one_server.server_name}*
199
+ 游戏: {one_server.folder}
200
+ 地图: {one_server.map_name}
201
+ 人数: {one_server.player_count}/{one_server.max_players}"""
202
+ if one_server.ping is not None:
203
+ msg += f"""
204
+ ping: {one_server.ping * 1000:.0f}ms
205
+ {player_msg}"""
206
+ if config.l4_show_ip:
207
+ msg += f"""
208
+ connect {s["host"]}:{s["port"]}"""
209
+ return msg
@@ -29,8 +29,13 @@ async def draw_one_ip(host: str, port: int):
29
29
  soc = "[{:>{}}]".format(player.score, max_score_len)
30
30
  chines_dur = await convert_duration(player.duration)
31
31
  dur = "{:^{}}".format(chines_dur, max_duration_len)
32
-
33
- player_msg += f"{soc} | {dur} | {player.name} \n"
32
+ name_leg = len(player.name)
33
+ if name_leg > 2:
34
+ xing = "*" * (name_leg - 2)
35
+ name = f"{player.name[0]}xing{player.name[-1]}"
36
+ else:
37
+ name = player.name
38
+ player_msg += f"{soc} | {dur} | {name} \n"
34
39
  else:
35
40
  player_msg = "服务器感觉很安静啊"
36
41
 
@@ -52,7 +57,7 @@ async def get_much_server(server_json: List[NserverOut], command: str):
52
57
  out_server: List[OutServer] = []
53
58
  search_list: List[Tuple[str, int]] = []
54
59
  for i in server_json:
55
- search_list.append((i["host"], i["port"])) # noqa: PERF401
60
+ search_list.append((i["host"], i["port"]))
56
61
 
57
62
  all_server = await L4API.a2s_info(search_list, is_player=True)
58
63
 
@@ -2,13 +2,17 @@ import asyncio
2
2
  import contextlib
3
3
  import socket
4
4
  from copy import deepcopy
5
+ from pathlib import Path
5
6
  from typing import Any, Dict, List, Literal, Optional, Tuple, cast
6
7
 
7
8
  import a2s
8
9
  import ujson as js
10
+ import ujson as json
9
11
  from bs4 import BeautifulSoup
10
12
  from httpx import AsyncClient
11
13
 
14
+ from ...config import config
15
+
12
16
  # from nonebot.log import logger
13
17
  from ..utils import split_maohao
14
18
  from .api import AnnePlayerApi, AnneSearchApi, anne_ban
@@ -154,8 +158,10 @@ class L4D2Api:
154
158
  html_content = resp.content
155
159
  return BeautifulSoup(html_content, "lxml")
156
160
 
157
- async def get_sourceban(self, url: str = anne_ban):
161
+ async def get_sourceban(self, tag:str = "云", url: str = anne_ban):
158
162
  """从sourceban++获取服务器列表,目前未做名称处理"""
163
+ if not (url.startswith(("http://", "https://"))):
164
+ url = "http://" + url # 默认添加 http://
159
165
  soup = await self._server_request(
160
166
  url=url,
161
167
  is_json=False,
@@ -177,6 +183,24 @@ class L4D2Api:
177
183
  SourceBansInfo(index=index, host=host, port=port),
178
184
  )
179
185
 
186
+ if not Path(Path(config.l4_path) / "config.json").is_file():
187
+ with Path(Path(config.l4_path) / "config.json").open("w") as f:
188
+ f.write("{}")
189
+ with (Path(config.l4_path) / "config.json").open("r", encoding="utf-8") as f:
190
+ content = f.read().strip()
191
+ ip_json = json.loads(content)
192
+ if tag in ip_json:
193
+ url = ip_json[tag]
194
+ with (Path(Path(config.l4_path) / f"l4d2/{tag}.json")).open("w") as f:
195
+ print(Path(Path(config.l4_path) / f"l4d2/{tag}.json"))
196
+ up_data = {}
197
+ for server in server_list:
198
+ new_dict = {}
199
+ new_dict["id"] = int(server.index )+ 1
200
+ new_dict["ip"] = server.host + ":" + str(server.port)
201
+ up_data.update(new_dict)
202
+ print(up_data)
203
+ json.dump(up_data, f)
180
204
  return server_list
181
205
 
182
206
  async def get_anne_steamid(self, name: str):
@@ -6,8 +6,10 @@ from typing import Any, Dict, List, Optional, Tuple
6
6
 
7
7
  import aiofiles
8
8
  import aiohttp
9
+ import nonebot
9
10
  from nonebot.adapters.onebot.v11 import Bot, GroupMessageEvent, MessageEvent
10
11
  from nonebot.log import logger
12
+ from nonebot_plugin_alconna import UniMessage
11
13
 
12
14
 
13
15
  async def get_file(url: str, down_file: Path):
@@ -174,7 +176,7 @@ def split_maohao(msg: str) -> Tuple[str, int]:
174
176
 
175
177
 
176
178
  headers = {
177
- "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:107.0) Gecko/20100101 Firefox/107.0", # noqa: E501
179
+ "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:107.0) Gecko/20100101 Firefox/107.0",
178
180
  }
179
181
 
180
182
 
@@ -198,7 +200,16 @@ async def url_to_msg(url: str):
198
200
  return None
199
201
 
200
202
 
201
- async def get_message_at(datas: str) -> Optional[int]: # noqa: F811
203
+ async def get_message_at(datas: str) -> Optional[int]:
202
204
  data: Dict[str, Any] = json.loads(datas)
203
205
  at_list = [int(msg["data"]["qq"]) for msg in data["message"] if msg["type"] == "at"]
204
206
  return at_list[0] if at_list else None
207
+
208
+
209
+ async def send_ip_msg(msg: str):
210
+ try:
211
+ await UniMessage.text(msg).finish()
212
+ except nonebot.adapters.qq:
213
+ msg_new = msg.split("\n")[:-2]
214
+ msg_out = "\n".join(msg_new)
215
+ await UniMessage.text(msg_out).send()
@@ -1,9 +1,8 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: nonebot-plugin-l4d2-server
3
- Version: 1.0.0a2
3
+ Version: 1.0.1
4
4
  Summary: L4D2 server related operations plugin for NoneBot2
5
5
  Keywords: steam,game,l4d2,nonebot2,plugin
6
- Home-page: https://github.com/Agnes4m/nonebot_plugin_l4d2_server
7
6
  Author-Email: Agnes_Digital <Z735803792@163.com>
8
7
  License: GPLv3
9
8
  Classifier: License :: OSI Approved :: GNU General Public License v3 (GPLv3)
@@ -13,7 +12,7 @@ Classifier: Programming Language :: Python :: 3.9
13
12
  Classifier: Programming Language :: Python :: 3.10
14
13
  Classifier: Programming Language :: Python :: 3.11
15
14
  Classifier: Operating System :: OS Independent
16
- Project-URL: Homepage, https://github.com/Agnes4m/nonebot_plugin_l4d2_server
15
+ Project-URL: homepage, https://github.com/Agnes4m/nonebot_plugin_l4d2_server
17
16
  Requires-Python: <4.0,>=3.9
18
17
  Requires-Dist: nonebot2>=2.0.0
19
18
  Requires-Dist: nonebot-plugin-htmlrender>=0.3.0
@@ -87,7 +86,6 @@ _✨Nonebot & Left 4 Dead 2 server操作✨_
87
86
 
88
87
  以下提到的方法 任选**其一** 即可
89
88
 
90
-
91
89
  <details open>
92
90
  <summary>[推荐] 使用 nb-cli 安装</summary>
93
91
  在 nonebot2 项目的根目录下打开命令行, 输入以下指令即可安装
@@ -164,7 +162,7 @@ conda install nonebot-plugin-l4d2-server
164
162
  l4_style = "default"
165
163
  """图片风格,可选包括以下,默认简洁
166
164
  - 暗风格
167
- - 孤独摇滚
165
+ - 孤独摇滚
168
166
  - 电玩像素
169
167
  - 缤纷彩虹
170
168
  """
@@ -185,7 +183,7 @@ conda install nonebot-plugin-l4d2-server
185
183
  - 水果 - html图片优化
186
184
 
187
185
  - 感谢以下服主大力支持
188
- - Michaela's | 机器人功能测试反馈
186
+ - Michaela's | 机器人功能测试反馈
189
187
  - 东 | 提供docker部署方法等建议 | [电信服anne游戏群](http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=6i7r5aJ7Jyg0ejby4rt9GWmFRF53nV1K&authKey=ekMsWepBZPL26%2BfJAG%2F95JD0fhvH39%2BIGVyKOvNlXVDbpIclJlly4kXqukL7JhWR&noverify=0&group_code=883237206)
190
188
  - 迷茫 | 催命更新byd
191
189
  - ArcPav | 积极反馈bug,提供改进思路
@@ -0,0 +1,99 @@
1
+ nonebot_plugin_l4d2_server-1.0.1.dist-info/METADATA,sha256=qUgbCb3s-Ok_j3XIc9tpnUJbl7i-mW8TwDoDVd9Ep90,6507
2
+ nonebot_plugin_l4d2_server-1.0.1.dist-info/WHEEL,sha256=thaaA2w1JzcGC48WYufAs8nrYZjJm8LqNfnXFOFyCC4,90
3
+ nonebot_plugin_l4d2_server-1.0.1.dist-info/entry_points.txt,sha256=6OYgBcLyFCUgeqLgnvMyOJxPCWzgy7se4rLPKtNonMs,34
4
+ nonebot_plugin_l4d2_server-1.0.1.dist-info/licenses/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
5
+ nonebot_plugin_l4d2_server/__init__.py,sha256=PIufOk1bxOx-nYqdoinoB7BcntIETNFwfzqKnmu-teE,1624
6
+ nonebot_plugin_l4d2_server/__main__.py,sha256=8bIrOWQo9tZA1VdPiUzGe_akSea-C4OWRw7AX7T9F5E,7956
7
+ nonebot_plugin_l4d2_server/config.py,sha256=CavZ4EGdLvooVrUeP8zGsbZ0TJNsxGl2WT9rpyJtvhw,1175
8
+ nonebot_plugin_l4d2_server/data/font/loli.ttf,sha256=Yrh-RPoCrn1-NG94DR0x20ASXYUt8g3Ep6BCt3CdOFk,11125812
9
+ nonebot_plugin_l4d2_server/l4_anne/__init__.py,sha256=zX4kTu4LAsqm7_li0-GcihnbYI65SBPkfUCPTs79U8k,4124
10
+ nonebot_plugin_l4d2_server/l4_anne/ranne.py,sha256=vtNQJ-74rJiwVI3IYS3ZgFk_LaCviKU1yxrGk3DFvQs,532
11
+ nonebot_plugin_l4d2_server/l4_help/Help.json,sha256=hz_k-qmGmGJKwCa8wmkHTLzXu6C-G-E_g7xdK-t6fNk,2673
12
+ nonebot_plugin_l4d2_server/l4_help/__init__.py,sha256=UJZpNCbZY5_jkY_SsTWjy1Et4CzGGBkjckoCeKUsVJM,1535
13
+ nonebot_plugin_l4d2_server/l4_help/draw.py,sha256=y6yDPUnoZFvwly8cf7g9HRpT1JXTxyA9DC1TuvUinTM,6448
14
+ nonebot_plugin_l4d2_server/l4_help/icon/介绍.png,sha256=3QC6A38QC-7gDBxmtQSQdbsz7hsefU5LL-oZmJ41zTk,3806
15
+ nonebot_plugin_l4d2_server/l4_help/icon/任务.png,sha256=nyZ4_kM21ZO95nwanCFnUfCGX-PkmJXYQf9OrJVKomY,3782
16
+ nonebot_plugin_l4d2_server/l4_help/icon/信息.png,sha256=iDsO5U8jYriGuFx-cVg8os-vqd-SCuF8If0eKkNwjcE,4129
17
+ nonebot_plugin_l4d2_server/l4_help/icon/公告.png,sha256=EyEe6i97-pdfs1asHPaIoc5oyvA-sFL24sjA9QXmPuo,3727
18
+ nonebot_plugin_l4d2_server/l4_help/icon/刀剑.png,sha256=iRpUEIFZHnLSBnrjWbxvEE1feJLHwX6a9uq3WdalG7Q,4004
19
+ nonebot_plugin_l4d2_server/l4_help/icon/切换.png,sha256=pO0vqRTaQvAVqQ6PZkLXZPKZ-cGclCdtWWVVVcvya5w,3920
20
+ nonebot_plugin_l4d2_server/l4_help/icon/删除.png,sha256=L9n-gLe4FoTrVTREVOUsmdDbH5ATZLXhg8uq-vUHEmE,3773
21
+ nonebot_plugin_l4d2_server/l4_help/icon/刷新.png,sha256=SHWNR-ynpJL587anfN_XdumKz8C5lhRHHjo2ILvlDBY,3905
22
+ nonebot_plugin_l4d2_server/l4_help/icon/卡组.png,sha256=3JeJ60y9cNzrv48KEAwBAdVlHqtw8pqmnx0KIq1IGo0,4491
23
+ nonebot_plugin_l4d2_server/l4_help/icon/哪里.png,sha256=h5rWTid8OAQM_QBLwslsI5d34y8Yf_5j6RV50b42i5I,3923
24
+ nonebot_plugin_l4d2_server/l4_help/icon/地图.png,sha256=nJcu7DaeBMYjaVCAyvGOypS9fMH_qFNLkOXSqvhP3mY,3923
25
+ nonebot_plugin_l4d2_server/l4_help/icon/导入.png,sha256=6kUReHxejDqhZ0-koXiHZIKcJRKQNfqIHH_DpkYpNQc,3593
26
+ nonebot_plugin_l4d2_server/l4_help/icon/导出.png,sha256=UQjGUQ3FxWxUUG6Zvq6IsHgC30hr5q_DDQbjYZ4Pwr4,3674
27
+ nonebot_plugin_l4d2_server/l4_help/icon/影.png,sha256=ROc2IjcFnVjtTzgKobUWEp6rzU3x9_q9l4a9OJZUIMQ,3651
28
+ nonebot_plugin_l4d2_server/l4_help/icon/拼图.png,sha256=9Ul3lEL6jGvGtlCitLdCCYVV694RFCnUGc2OuvwEW3I,3946
29
+ nonebot_plugin_l4d2_server/l4_help/icon/探索.png,sha256=LihxvU_P4gJSM9ji1Y4VnraN8SAy-TN3xnTwr3oMNtk,4418
30
+ nonebot_plugin_l4d2_server/l4_help/icon/推送.png,sha256=OEHkKegLBy8KJyPPCfYYjYo1bjYEH7N5bGI6IS88nJE,3799
31
+ nonebot_plugin_l4d2_server/l4_help/icon/收集.png,sha256=wtSL4iLtpdiGj9CxT1Xkqoe1lrRvI5x55n5lKUoFRpk,4149
32
+ nonebot_plugin_l4d2_server/l4_help/icon/攻略.png,sha256=tqoSIH_TKCDvz43ezoeec897sg_BUzo-141QSWW5n8o,4349
33
+ nonebot_plugin_l4d2_server/l4_help/icon/更新.png,sha256=YQeIXgLDdcPWsmmOultUBo5sX0YfAAeCA32ZiBLUaeY,3912
34
+ nonebot_plugin_l4d2_server/l4_help/icon/材料.png,sha256=IQF16Ivy27BcJ9hfDe379XvJ0vTagFJunzbtSe_wq8M,3978
35
+ nonebot_plugin_l4d2_server/l4_help/icon/查询.png,sha256=YuTzH1_sKet18Sq9VUUVQ5_70_szXHARvS25hk5skKU,3869
36
+ nonebot_plugin_l4d2_server/l4_help/icon/校验.png,sha256=qsff1eh45tml-eW9O45Cq5vvj-yr8x_ujYLsT_IeP9Y,4099
37
+ nonebot_plugin_l4d2_server/l4_help/icon/每月.png,sha256=f59dOBPFmfYgIzEiRFV4VhqKe52bvAZqOCiVhdESowo,3797
38
+ nonebot_plugin_l4d2_server/l4_help/icon/深渊.png,sha256=ixaqRUcUHc9oi-hwFtI-d0NtEyZetPZnXzc0UvE1TiM,4034
39
+ nonebot_plugin_l4d2_server/l4_help/icon/添加.png,sha256=zW31IMFP0n3NnEj7duAeaLzWhwJcKDZghomRPZS2tXE,3860
40
+ nonebot_plugin_l4d2_server/l4_help/icon/清除.png,sha256=HIb46c0rtqdoNvA3aZ_9OkUKSUgs-fkhcGbvLPOb9pE,3673
41
+ nonebot_plugin_l4d2_server/l4_help/icon/状态.png,sha256=HX7w-ePwbyrjJIByOhSavs1llUNHZ-n5uzOv0RKN1rE,3790
42
+ nonebot_plugin_l4d2_server/l4_help/icon/签到.png,sha256=17ug1CEZpE-LP3gy87OIofWi9J6BugbT1BpGRojuBxU,3800
43
+ nonebot_plugin_l4d2_server/l4_help/icon/绑定.png,sha256=jPzw0Clw-52AT-lLEY7HNK86ctVjW_jRqHLsHrl1twU,3865
44
+ nonebot_plugin_l4d2_server/l4_help/icon/表.png,sha256=pK_80dh6-UYQL_s-H0QBY7NR3wk6Ot5C3MyajJFg83o,3566
45
+ nonebot_plugin_l4d2_server/l4_help/icon/表情.png,sha256=K6dvIVzPGhhbKwEw9PIV3VyesJdGRhjILvph8NB03N8,3894
46
+ nonebot_plugin_l4d2_server/l4_help/icon/角色.png,sha256=SQX9dQJMfyV9iM4D1eExkebo3navLk8n1E02KT5TAJo,3657
47
+ nonebot_plugin_l4d2_server/l4_help/icon/记录.png,sha256=Flu94LQrEDTIaAajH7ma0u7H1duckZVVzTmZpaYcNyY,3458
48
+ nonebot_plugin_l4d2_server/l4_help/icon/配置.png,sha256=8DMYIzY4AnmjajmfFNH-db-heAnMLFjSGs4X9QrnRl8,4214
49
+ nonebot_plugin_l4d2_server/l4_help/icon/重启.png,sha256=3Js_Fu44usnMPihoCtE5CZgBT6UpU5ivl2OAfXKd86Q,4019
50
+ nonebot_plugin_l4d2_server/l4_help/texture2d/badge.png,sha256=KJlwepfquSqdo7kXhTCK_asLP3Vu-zfQKoOOTTYGBFc,8186
51
+ nonebot_plugin_l4d2_server/l4_help/texture2d/banner.png,sha256=e7dNro0VBjtdxnXkAjHP_AM3IVPevTgfQbATpJ6toMw,32330
52
+ nonebot_plugin_l4d2_server/l4_help/texture2d/bg.jpg,sha256=xTyLJLgo3E-ZH-tupsjZCNIgwQrwyttdxefQYhUZNt0,246026
53
+ nonebot_plugin_l4d2_server/l4_help/texture2d/button.png,sha256=oQKoRBJDaVXz2eVD-lHkaVcV1aw0ehkNBK8TNSjTehI,12711
54
+ nonebot_plugin_l4d2_server/l4_help/texture2d/icon.png,sha256=A2p0r8aBXpNy_b_CtZTZzTrEeHbGRYzO2fNwahyLlQ0,634659
55
+ nonebot_plugin_l4d2_server/l4_image/__init__.py,sha256=-GWXUDv_z_cfJ-wyvx5J3wB9P7ng4NzRHfCq-GZD6XQ,431
56
+ nonebot_plugin_l4d2_server/l4_image/anne_pil.py,sha256=Q_PHRzB_OgPbRbnLg-asVduV477F1rQnau2DhPOzf5k,500
57
+ nonebot_plugin_l4d2_server/l4_image/convert.py,sha256=MISJq2JFcmQJaYZz6dDjQ2UusVORQt7rLSoAY_CyyWY,3894
58
+ nonebot_plugin_l4d2_server/l4_image/download.py,sha256=qRAo0Ggj5KV8RQN3LFJe547__wwC7Ww4QnT-v3pfe6w,3116
59
+ nonebot_plugin_l4d2_server/l4_image/html_img.py,sha256=P4UJO-7Uf77ECePjM6bSWcOvYRrfZ0BBlG7PLARyrF8,3387
60
+ nonebot_plugin_l4d2_server/l4_image/image_tools.py,sha256=rooAmk_3QXSmteORtD-yAvsNXXWcNI9l-b1NBoKlnsI,14513
61
+ nonebot_plugin_l4d2_server/l4_image/img/anne/anne.html,sha256=8JOUXoWdulhoP2Axy_omuSDafbduKDZ9Y8Rz2VZWTso,1590
62
+ nonebot_plugin_l4d2_server/l4_image/img/anne/back.png,sha256=jnsYjnvd2BFcdkdsW8HgcSloWF0ZliPkqlWSIDnFUxw,245488
63
+ nonebot_plugin_l4d2_server/l4_image/img/anne/back1.jpg,sha256=hAzPHflbf4db5S3rM5xn-1wnDP8xZExikYmkKW5c4w0,113622
64
+ nonebot_plugin_l4d2_server/l4_image/img/anne/group_ip.html,sha256=0RCWB0q8Wx0NcKdVmGeVr2odaNzODNVCJK0jiQ826U8,7222
65
+ nonebot_plugin_l4d2_server/l4_image/img/anne/ip.html,sha256=hvKDc7ASbuaGxtx5Doavg5qa82K1vGq4bSapjrwrTy8,1611
66
+ nonebot_plugin_l4d2_server/l4_image/img/head/head.png,sha256=5kZ_9Toabm5y1VYnSQ9XGQIAef2v5wwROilmD_jKz1I,160309
67
+ nonebot_plugin_l4d2_server/l4_image/img/header/logo.png,sha256=86sZp1cYvrPHY-L-3T8Y64Q3CcouCh7eH4XPln9Gp9Q,633582
68
+ nonebot_plugin_l4d2_server/l4_image/img/header/player1.jpg,sha256=uiWlehfMGn7SlR5c5gL5ceWNQ4MTCRuS-6qSHRFNXD0,407306
69
+ nonebot_plugin_l4d2_server/l4_image/img/template/Bocchi_The_Rock.html,sha256=9qriDKJJuTmvtp7T0lQ1Om22aoRzUipViCFq2IcoWWc,8707
70
+ nonebot_plugin_l4d2_server/l4_image/img/template/Bocchi_The_Rock.png,sha256=ogwyR8nis0JC4aGxbsccL_EYwtWqdIbwl5BdqMfaf54,456202
71
+ nonebot_plugin_l4d2_server/l4_image/img/template/HYPixel11pxU-2.ttf,sha256=RGJai1Y8AP8toBwIqq2EZyaBmRbRYPUpNu7f2ZWeDuk,2446828
72
+ nonebot_plugin_l4d2_server/l4_image/img/template/Pixel.html,sha256=STw3WKRsMuX94PfcYTk_aRl8RtjTiLKj2ABpQcGKeXA,17756
73
+ nonebot_plugin_l4d2_server/l4_image/img/template/Pixel.png,sha256=QqRu25_ZYcQR815_Z17-VcSZYyj_PzfYNijIWnjIf8c,1275622
74
+ nonebot_plugin_l4d2_server/l4_image/img/template/Rainbow.html,sha256=8YfS0MPp5zsdCQrZIuXM3izF0h2RTwXHs63C5w-1C2c,20656
75
+ nonebot_plugin_l4d2_server/l4_image/img/template/Rainbow.png,sha256=ssVR6knxk_A13Kgtdx0BbPI39B_3-mPovysAVD4rzZ8,314683
76
+ nonebot_plugin_l4d2_server/l4_image/img/template/Tutumianhuatang-Bold-2.ttf,sha256=rX7HSHSCpQ4mJYsGghvm3btXLabxcCEbLF52wKNDNAE,3090420
77
+ nonebot_plugin_l4d2_server/l4_image/img/template/bilibili.svg,sha256=v3u6R-HLoTHVI1qPCNopPWd_WYZ9L2YSqvvB-L6RZY8,1336
78
+ nonebot_plugin_l4d2_server/l4_image/img/template/fingerprint.svg,sha256=qtbdXb-5o62YQU2-LR4S9b7-ddKC1UOpJG4w8xDrytw,2135
79
+ nonebot_plugin_l4d2_server/l4_image/img/template/github.svg,sha256=Ev2CdWEyL4G-_bhZJ9vBZr5MEWjcgSR819mracoXjqc,1175
80
+ nonebot_plugin_l4d2_server/l4_image/img/template/l.svg,sha256=YbahWPd7uau6edcATiWrA8apYyrlKeTejuvRHwXkmLI,5484
81
+ nonebot_plugin_l4d2_server/l4_image/img/template/m.svg,sha256=JKosfpA8Jncw018dWHVzVR8orC48u3mMdzQovWAa91s,2428
82
+ nonebot_plugin_l4d2_server/l4_image/img/template/normal.html,sha256=TbHKy4cV-7rEVuE3dx75P1Pf9YKTIp8KW5JoaJFMenY,6610
83
+ nonebot_plugin_l4d2_server/l4_image/img/template/vac.png,sha256=sX2_qenkRakqP74Sq-FoBYBX1qS8gVYz9L07ijL2vlc,6741
84
+ nonebot_plugin_l4d2_server/l4_image/img/template/vac_white.png,sha256=3hpqIOp07FJhl9F15Mzc0LUMWQBAZhif8Ealb4doyoI,6045
85
+ nonebot_plugin_l4d2_server/l4_image/img/template/vue.css,sha256=2sGjCFrR-3tFMB_x7l4K6k40tZ5JVzhWqD759cagYBA,7874
86
+ nonebot_plugin_l4d2_server/l4_image/img/template/w.svg,sha256=LnctC2mVwjdhRMiS9ffrjUX-9KGwqb6OMmpJXvVXl70,486
87
+ nonebot_plugin_l4d2_server/l4_image/model.py,sha256=FGsCvf_BKbRNJUVy6I5BKnArMY-3JEIdqeX2gs93E5o,231
88
+ nonebot_plugin_l4d2_server/l4_image/vtfs.py,sha256=He_7zzEIOip8MXP55TS7aWPbzo6ac0wPf602nN3GWZM,1461
89
+ nonebot_plugin_l4d2_server/l4_local/__init__.py,sha256=09AnKq-D5rM4pdDGXOWtbXdpSnghliEU7sR-kubqf00,3588
90
+ nonebot_plugin_l4d2_server/l4_local/file.py,sha256=hew1Y8kV3uSZvUGplmi09EGKC89-sUJWsWV7SCEstI8,3067
91
+ nonebot_plugin_l4d2_server/l4_request/__init__.py,sha256=sS0X4R2eW-GFjXZKt3z6hV69qQNPM7JqZjsq0S7Pahg,7180
92
+ nonebot_plugin_l4d2_server/l4_request/draw_msg.py,sha256=92_UaCpXNP-8wowuJ1JYkQi-Rw0DVJiNq_S4wZ0SaOE,2695
93
+ nonebot_plugin_l4d2_server/l4_request/utils.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
94
+ nonebot_plugin_l4d2_server/utils/api/api.py,sha256=auvDicCEKwvnm6EJYeCxCtugFby61K-zAmmaRWWEwtM,296
95
+ nonebot_plugin_l4d2_server/utils/api/models.py,sha256=EKAAM5RsFK-hV-a80tc4r35ToNRhnCWVuQ-7imwBjwE,2386
96
+ nonebot_plugin_l4d2_server/utils/api/request.py,sha256=LVC7wZN9r5_VjFnMzuETmppaMOOmDsNxUE12TKlnmKI,14112
97
+ nonebot_plugin_l4d2_server/utils/database/models.py,sha256=SLdcgwsn39r_ZkcBoqf4MLX1EfpCOjGBwWcR16u9Bqo,454
98
+ nonebot_plugin_l4d2_server/utils/utils.py,sha256=C-QzwtUCbq7QXmHplpmo3OTKbRztE1W7V-IywvufDl0,5971
99
+ nonebot_plugin_l4d2_server-1.0.1.dist-info/RECORD,,
@@ -1,4 +1,4 @@
1
1
  Wheel-Version: 1.0
2
- Generator: pdm-backend (2.3.3)
2
+ Generator: pdm-backend (2.4.3)
3
3
  Root-Is-Purelib: true
4
4
  Tag: py3-none-any
@@ -0,0 +1,4 @@
1
+ [console_scripts]
2
+
3
+ [gui_scripts]
4
+
@@ -1,96 +0,0 @@
1
- nonebot_plugin_l4d2_server-1.0.0a2.dist-info/METADATA,sha256=XN33zbiVUs_p1FDQoUQroNZqyKfkj5F2dF1VdHYsr3c,6584
2
- nonebot_plugin_l4d2_server-1.0.0a2.dist-info/WHEEL,sha256=rSwsxJWe3vzyR5HCwjWXQruDgschpei4h_giTm0dJVE,90
3
- nonebot_plugin_l4d2_server-1.0.0a2.dist-info/licenses/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
4
- nonebot_plugin_l4d2_server/__init__.py,sha256=PIufOk1bxOx-nYqdoinoB7BcntIETNFwfzqKnmu-teE,1624
5
- nonebot_plugin_l4d2_server/__main__.py,sha256=AY5CWuPMcpD7aC1OyT3bqCpjq7lZuvpkNtLtjNrtKKU,4232
6
- nonebot_plugin_l4d2_server/config.py,sha256=zPwEZoDYyzOCKnS6XE3JxBRw7LZazLE8_hSy-rntzfM,978
7
- nonebot_plugin_l4d2_server/data/font/loli.ttf,sha256=Yrh-RPoCrn1-NG94DR0x20ASXYUt8g3Ep6BCt3CdOFk,11125812
8
- nonebot_plugin_l4d2_server/l4_anne/__init__.py,sha256=lfTSVNO3tWvlnwLXTUVeOWI6JcDEdgTUnb0oDduzmnA,4119
9
- nonebot_plugin_l4d2_server/l4_anne/ranne.py,sha256=vtNQJ-74rJiwVI3IYS3ZgFk_LaCviKU1yxrGk3DFvQs,532
10
- nonebot_plugin_l4d2_server/l4_help/Help.json,sha256=cT57SgJhFeunZoNMUwoJyqWzVaAYP_Er1-fw8gTyImk,2455
11
- nonebot_plugin_l4d2_server/l4_help/__init__.py,sha256=2d7Tcncf2FBMfj1s8rWvhNEQNTnFoQSj75wurefQOtk,1537
12
- nonebot_plugin_l4d2_server/l4_help/draw.py,sha256=y6yDPUnoZFvwly8cf7g9HRpT1JXTxyA9DC1TuvUinTM,6448
13
- nonebot_plugin_l4d2_server/l4_help/icon/介绍.png,sha256=67JXA7JZjVNo5FoPF_mKlRq30uzc30b7DxDasteiMOA,3179
14
- nonebot_plugin_l4d2_server/l4_help/icon/任务.png,sha256=FWvlRKgxUO6yypKSC0ROXy3JcrM3hzUPNMTibiJlYD8,3155
15
- nonebot_plugin_l4d2_server/l4_help/icon/信息.png,sha256=ZQJU-u4a4r-yrYmHbM-b9oi44xB-KEscx0ohlZiTobY,3502
16
- nonebot_plugin_l4d2_server/l4_help/icon/公告.png,sha256=TQLVFTD4Wi2Zsya6p27SIxDwlnCNUv8hLTnwHTlNpns,3100
17
- nonebot_plugin_l4d2_server/l4_help/icon/刀剑.png,sha256=qD9x7bXLe5YqCXRK580iehXAgON52-uPDSoE15BNzkg,3378
18
- nonebot_plugin_l4d2_server/l4_help/icon/切换.png,sha256=1o1a4nkBvu1VeJ1wcPmYys3RLit1LhzZi6hzmzJWzik,3293
19
- nonebot_plugin_l4d2_server/l4_help/icon/删除.png,sha256=numLbz8zbKj8MKJhYOLbvO77lKVp9Aj9scH0Agrdmkg,3146
20
- nonebot_plugin_l4d2_server/l4_help/icon/刷新.png,sha256=H2C2tWo9I2HxzYf0Atiw9R6F3W2RchOuF5A_SPHER9M,3278
21
- nonebot_plugin_l4d2_server/l4_help/icon/卡组.png,sha256=Cju_SBdoLSZrKLrutsmQ9ViYssC8Ol95_YQ34n1OFio,3864
22
- nonebot_plugin_l4d2_server/l4_help/icon/哪里.png,sha256=BFxEBhnNRrDsL9C-yN8TM_Khgs3hu6n6SNDeMca9Fwc,3296
23
- nonebot_plugin_l4d2_server/l4_help/icon/地图.png,sha256=oN-IA4rn6Uy91mnG6-Z5sbzmCz3VpL4gCn-lp0cCwNI,3296
24
- nonebot_plugin_l4d2_server/l4_help/icon/导入.png,sha256=s0oOG1eB-9QX1nktkcZfDp7MTdKzI80nLLBkm1_JB4w,2966
25
- nonebot_plugin_l4d2_server/l4_help/icon/导出.png,sha256=ZpRGubMwxmhkPlWRsFkN6t0KlaqbeL3q_pHTgVS-xPU,3047
26
- nonebot_plugin_l4d2_server/l4_help/icon/影.png,sha256=dMeiCD6AzhIdP1kayyTS6rKgwOy3pdhuNb3OGWfNzfc,3024
27
- nonebot_plugin_l4d2_server/l4_help/icon/拼图.png,sha256=D8iGE0quwvQ6TFzgTi9sWS3MiEj64y5le2gFlOIaskA,3320
28
- nonebot_plugin_l4d2_server/l4_help/icon/探索.png,sha256=p5JJti50I1c9NAZwDkumIKCLeHBrIb70tdTMWjU7w34,3791
29
- nonebot_plugin_l4d2_server/l4_help/icon/推送.png,sha256=Ps9J2qEWcFKGki7_eVno_kHzcewXNvLglUf6_alkMRw,3172
30
- nonebot_plugin_l4d2_server/l4_help/icon/收集.png,sha256=MPRZ2cI0F7_6ezBYddIx1J7Zf1Ljbfu9M0DPXi-g_Wo,3522
31
- nonebot_plugin_l4d2_server/l4_help/icon/攻略.png,sha256=Pk-hnGW2gpPzmvANLiWYkeOK3B-bAFjqq62VwraVTtc,3722
32
- nonebot_plugin_l4d2_server/l4_help/icon/更新.png,sha256=gfVGEO1fdg5QdHV-w5XF4TWNCsxCQNU2M8yBVDqbt1M,3285
33
- nonebot_plugin_l4d2_server/l4_help/icon/材料.png,sha256=FEcU_jbJhPhNNNMu1rJ3nV-Rvjfn9EhihGXVesG1a8I,3351
34
- nonebot_plugin_l4d2_server/l4_help/icon/查询.png,sha256=T4Wq6MTc5qf1B6UpEmQH7s4cL09kaQ0OyK5Bv5KdfXM,3242
35
- nonebot_plugin_l4d2_server/l4_help/icon/校验.png,sha256=wHvYcXd8L7ZdgNbH-4BVZiltwF60eVXfORETVBp6cE0,3472
36
- nonebot_plugin_l4d2_server/l4_help/icon/每月.png,sha256=jDNeSJQ7NWqbwGd4k4H7E8gVw2Ok3473zm-zSzrovwM,3170
37
- nonebot_plugin_l4d2_server/l4_help/icon/深渊.png,sha256=X0Q5yU_FPYfTGQvf-A26UiPWxRdwuotZnWnXWVeqbyI,3407
38
- nonebot_plugin_l4d2_server/l4_help/icon/添加.png,sha256=ceW1U5LWji5Mc4Lr6oHaTy6Q6bQeToYeEo3nIEXu9mg,3233
39
- nonebot_plugin_l4d2_server/l4_help/icon/清除.png,sha256=DtMlluPWtQYEZLBPHDyFwWB5ZR01zM9XfdD3beCTJcg,3046
40
- nonebot_plugin_l4d2_server/l4_help/icon/状态.png,sha256=ztzyrAz98NSnFMpfRc-HHzBsecKDNGit8dhT51glDXA,3163
41
- nonebot_plugin_l4d2_server/l4_help/icon/签到.png,sha256=d-zp3wphrAVXtxaCpop1R7gjdwCyA4mHjy1w3iW4UiM,3174
42
- nonebot_plugin_l4d2_server/l4_help/icon/绑定.png,sha256=Nyfb2VHuD9CicsXN4oBlJ20Uvz_RLMtXorjVvmX_35A,3238
43
- nonebot_plugin_l4d2_server/l4_help/icon/表.png,sha256=8HZCqdfLUc-f-yrz0XAvAFAwsQnszwW7bCY1tf5l7YQ,2939
44
- nonebot_plugin_l4d2_server/l4_help/icon/表情.png,sha256=ouFr_gRq-bCa1_aGgXqvVhreZa-8NawRThIlekozgcw,3267
45
- nonebot_plugin_l4d2_server/l4_help/icon/角色.png,sha256=akMfHCei0CI65HMmDhbdD0sLaRLkjFls-ahU4OaPsoQ,3030
46
- nonebot_plugin_l4d2_server/l4_help/icon/记录.png,sha256=HmIi53yXgvbkjSI8ZTTJW-3HkeJs7vLBw-GCVZIU5XM,2831
47
- nonebot_plugin_l4d2_server/l4_help/icon/配置.png,sha256=oxqe8WwRUv_Z_d5gie6HaEi8qW-zgV-pFY2N4SocNyw,3588
48
- nonebot_plugin_l4d2_server/l4_help/icon/重启.png,sha256=51XKc-RBHv3D_kfT3AciyB1Fz-ujF6vX7D-s7SyJ3r4,3392
49
- nonebot_plugin_l4d2_server/l4_help/texture2d/badge.png,sha256=TJScC5Mt5jKypq8U1UFISlkH8yB4ynvnyoIDn7Luj00,7559
50
- nonebot_plugin_l4d2_server/l4_help/texture2d/banner.png,sha256=sDwq7DbCORC1vRp8JD1hgQlKrasrfqtxm24zqGUgmGM,31703
51
- nonebot_plugin_l4d2_server/l4_help/texture2d/bg.jpg,sha256=BE2kEc9y--B7UJtHR5h_Q8rk5yeEiLbtsbMFj9xl8Tg,245400
52
- nonebot_plugin_l4d2_server/l4_help/texture2d/button.png,sha256=8wOFPbWUFfkGY7CNUx4fV1CaRA30oWz3YUBUtQq-Jpo,12084
53
- nonebot_plugin_l4d2_server/l4_help/texture2d/icon.png,sha256=hkkkTOv1fjAFbpS3f3bdg6BGReeLmUcMkSwUo9-N32Y,634032
54
- nonebot_plugin_l4d2_server/l4_image/__init__.py,sha256=-GWXUDv_z_cfJ-wyvx5J3wB9P7ng4NzRHfCq-GZD6XQ,431
55
- nonebot_plugin_l4d2_server/l4_image/anne_pil.py,sha256=A4eU68zdcHEhDnD0hctPtv27kWCul6rs-dHoWoJHMFY,483
56
- nonebot_plugin_l4d2_server/l4_image/convert.py,sha256=_mhFnMUFXGzVvseFIdu2R3bFrnZhShhkLOhKL0AYP6I,3879
57
- nonebot_plugin_l4d2_server/l4_image/download.py,sha256=rospgp7OnOwOCCO4A-hE5LNKBSNcCpEcgHFVjowlLqs,3104
58
- nonebot_plugin_l4d2_server/l4_image/html_img.py,sha256=TO-9uhahS3D140PlTHN68UvXHVftBflBL6dMmZWVKYY,3391
59
- nonebot_plugin_l4d2_server/l4_image/image_tools.py,sha256=Km9S10Q_MHNLo6MQUtkhNaVTQKB5PpFFDeUv0TKI5og,14516
60
- nonebot_plugin_l4d2_server/l4_image/img/anne/anne.html,sha256=8JOUXoWdulhoP2Axy_omuSDafbduKDZ9Y8Rz2VZWTso,1590
61
- nonebot_plugin_l4d2_server/l4_image/img/anne/back.png,sha256=H8gRdpJy69X-WbuwZ0AhSdPuL0rN61Dfhq4uMjbRdAs,244861
62
- nonebot_plugin_l4d2_server/l4_image/img/anne/back1.jpg,sha256=kD5tM58b2oZ_BpJa2G4fJhvOJ1LM0O4uGc-zLmcVj6Q,112995
63
- nonebot_plugin_l4d2_server/l4_image/img/anne/group_ip.html,sha256=0RCWB0q8Wx0NcKdVmGeVr2odaNzODNVCJK0jiQ826U8,7222
64
- nonebot_plugin_l4d2_server/l4_image/img/anne/ip.html,sha256=hvKDc7ASbuaGxtx5Doavg5qa82K1vGq4bSapjrwrTy8,1611
65
- nonebot_plugin_l4d2_server/l4_image/img/head/head.png,sha256=8toEieoMkcJE8xD2NaSLOJ5TddWFOCwoI3mpbv4kbp4,159682
66
- nonebot_plugin_l4d2_server/l4_image/img/header/logo.png,sha256=2Onm6-veRaO11MqpNOuKXnwufhKNKTHm8wlmKJciRZU,632955
67
- nonebot_plugin_l4d2_server/l4_image/img/header/player1.jpg,sha256=8WBV0N_rADaJwBIniL_oo2PIecdwiuBxwBvQtrXW39I,406679
68
- nonebot_plugin_l4d2_server/l4_image/img/template/Bocchi_The_Rock.html,sha256=9qriDKJJuTmvtp7T0lQ1Om22aoRzUipViCFq2IcoWWc,8707
69
- nonebot_plugin_l4d2_server/l4_image/img/template/Bocchi_The_Rock.png,sha256=zFfEePTB5Qx3_8P_m7J-C6A7OEeK4bGmQPFUYtWcocI,455575
70
- nonebot_plugin_l4d2_server/l4_image/img/template/HYPixel11pxU-2.ttf,sha256=RGJai1Y8AP8toBwIqq2EZyaBmRbRYPUpNu7f2ZWeDuk,2446828
71
- nonebot_plugin_l4d2_server/l4_image/img/template/Pixel.html,sha256=STw3WKRsMuX94PfcYTk_aRl8RtjTiLKj2ABpQcGKeXA,17756
72
- nonebot_plugin_l4d2_server/l4_image/img/template/Pixel.png,sha256=ej2z6qmWvxth3wzTOdhxZrAErDhuCfEuY4w8cYLzekk,1274995
73
- nonebot_plugin_l4d2_server/l4_image/img/template/Rainbow.html,sha256=8YfS0MPp5zsdCQrZIuXM3izF0h2RTwXHs63C5w-1C2c,20656
74
- nonebot_plugin_l4d2_server/l4_image/img/template/Rainbow.png,sha256=aKKtkWth49FzAxpsDeDtqkrO1HPbGAGqSMqi__4F-CE,314056
75
- nonebot_plugin_l4d2_server/l4_image/img/template/Tutumianhuatang-Bold-2.ttf,sha256=rX7HSHSCpQ4mJYsGghvm3btXLabxcCEbLF52wKNDNAE,3090420
76
- nonebot_plugin_l4d2_server/l4_image/img/template/bilibili.svg,sha256=v3u6R-HLoTHVI1qPCNopPWd_WYZ9L2YSqvvB-L6RZY8,1336
77
- nonebot_plugin_l4d2_server/l4_image/img/template/fingerprint.svg,sha256=qtbdXb-5o62YQU2-LR4S9b7-ddKC1UOpJG4w8xDrytw,2135
78
- nonebot_plugin_l4d2_server/l4_image/img/template/github.svg,sha256=Ev2CdWEyL4G-_bhZJ9vBZr5MEWjcgSR819mracoXjqc,1175
79
- nonebot_plugin_l4d2_server/l4_image/img/template/l.svg,sha256=YbahWPd7uau6edcATiWrA8apYyrlKeTejuvRHwXkmLI,5484
80
- nonebot_plugin_l4d2_server/l4_image/img/template/m.svg,sha256=JKosfpA8Jncw018dWHVzVR8orC48u3mMdzQovWAa91s,2428
81
- nonebot_plugin_l4d2_server/l4_image/img/template/normal.html,sha256=TbHKy4cV-7rEVuE3dx75P1Pf9YKTIp8KW5JoaJFMenY,6610
82
- nonebot_plugin_l4d2_server/l4_image/img/template/vac.png,sha256=qCZsUYRcIgnHEWGir0mSOJ0qWhax5oNX200A5NUgDiI,6114
83
- nonebot_plugin_l4d2_server/l4_image/img/template/vac_white.png,sha256=fjqCsOSxCLZs3OOzEs5gItK3dR1RgcBMH5JC8hY_BGw,5418
84
- nonebot_plugin_l4d2_server/l4_image/img/template/vue.css,sha256=2sGjCFrR-3tFMB_x7l4K6k40tZ5JVzhWqD759cagYBA,7874
85
- nonebot_plugin_l4d2_server/l4_image/img/template/w.svg,sha256=LnctC2mVwjdhRMiS9ffrjUX-9KGwqb6OMmpJXvVXl70,486
86
- nonebot_plugin_l4d2_server/l4_image/model.py,sha256=FGsCvf_BKbRNJUVy6I5BKnArMY-3JEIdqeX2gs93E5o,231
87
- nonebot_plugin_l4d2_server/l4_image/vtfs.py,sha256=He_7zzEIOip8MXP55TS7aWPbzo6ac0wPf602nN3GWZM,1461
88
- nonebot_plugin_l4d2_server/l4_request/__init__.py,sha256=WQ4hvUY8Vw3-TlLz2OQylP_crLy_2yNTUaSHa-sLe2c,4710
89
- nonebot_plugin_l4d2_server/l4_request/draw_msg.py,sha256=yUlCfWj4p4F0Du3gyhyGdL64DuFBTQ_pBuLPm7JEy2o,2490
90
- nonebot_plugin_l4d2_server/l4_request/utils.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
91
- nonebot_plugin_l4d2_server/utils/api/api.py,sha256=auvDicCEKwvnm6EJYeCxCtugFby61K-zAmmaRWWEwtM,296
92
- nonebot_plugin_l4d2_server/utils/api/models.py,sha256=EKAAM5RsFK-hV-a80tc4r35ToNRhnCWVuQ-7imwBjwE,2386
93
- nonebot_plugin_l4d2_server/utils/api/request.py,sha256=N38sZ5FLrlh939Al8jlLfbvAG5WaGTC9xLKP0YHXjYI,13036
94
- nonebot_plugin_l4d2_server/utils/database/models.py,sha256=SLdcgwsn39r_ZkcBoqf4MLX1EfpCOjGBwWcR16u9Bqo,454
95
- nonebot_plugin_l4d2_server/utils/utils.py,sha256=B697gPxEUs5HFojhHlv6ZybB4lujSXKQghqOT2zBlPY,5696
96
- nonebot_plugin_l4d2_server-1.0.0a2.dist-info/RECORD,,