nonebot-plugin-l4d2-server 1.0.2__tar.gz → 1.0.3__tar.gz

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 (99) hide show
  1. {nonebot_plugin_l4d2_server-1.0.2 → nonebot_plugin_l4d2_server-1.0.3}/PKG-INFO +4 -2
  2. {nonebot_plugin_l4d2_server-1.0.2 → nonebot_plugin_l4d2_server-1.0.3}/nonebot_plugin_l4d2_server/__main__.py +19 -9
  3. {nonebot_plugin_l4d2_server-1.0.2 → nonebot_plugin_l4d2_server-1.0.3}/nonebot_plugin_l4d2_server/config.py +4 -0
  4. {nonebot_plugin_l4d2_server-1.0.2 → nonebot_plugin_l4d2_server-1.0.3}/nonebot_plugin_l4d2_server/l4_help/__init__.py +1 -1
  5. nonebot_plugin_l4d2_server-1.0.3/nonebot_plugin_l4d2_server/l4_request/__init__.py +283 -0
  6. {nonebot_plugin_l4d2_server-1.0.2 → nonebot_plugin_l4d2_server-1.0.3}/nonebot_plugin_l4d2_server/l4_request/draw_msg.py +8 -2
  7. {nonebot_plugin_l4d2_server-1.0.2 → nonebot_plugin_l4d2_server-1.0.3}/pyproject.toml +10 -2
  8. nonebot_plugin_l4d2_server-1.0.2/nonebot_plugin_l4d2_server/l4_request/__init__.py +0 -213
  9. {nonebot_plugin_l4d2_server-1.0.2 → nonebot_plugin_l4d2_server-1.0.3}/LICENSE +0 -0
  10. {nonebot_plugin_l4d2_server-1.0.2 → nonebot_plugin_l4d2_server-1.0.3}/README.md +0 -0
  11. {nonebot_plugin_l4d2_server-1.0.2 → nonebot_plugin_l4d2_server-1.0.3}/nonebot_plugin_l4d2_server/__init__.py +0 -0
  12. {nonebot_plugin_l4d2_server-1.0.2 → nonebot_plugin_l4d2_server-1.0.3}/nonebot_plugin_l4d2_server/data/font/loli.ttf +0 -0
  13. {nonebot_plugin_l4d2_server-1.0.2 → nonebot_plugin_l4d2_server-1.0.3}/nonebot_plugin_l4d2_server/l4_anne/__init__.py +0 -0
  14. {nonebot_plugin_l4d2_server-1.0.2 → nonebot_plugin_l4d2_server-1.0.3}/nonebot_plugin_l4d2_server/l4_anne/ranne.py +0 -0
  15. {nonebot_plugin_l4d2_server-1.0.2 → nonebot_plugin_l4d2_server-1.0.3}/nonebot_plugin_l4d2_server/l4_help/Help.json +0 -0
  16. {nonebot_plugin_l4d2_server-1.0.2 → nonebot_plugin_l4d2_server-1.0.3}/nonebot_plugin_l4d2_server/l4_help/draw.py +0 -0
  17. {nonebot_plugin_l4d2_server-1.0.2 → nonebot_plugin_l4d2_server-1.0.3}/nonebot_plugin_l4d2_server/l4_help/icon//344/273/213/347/273/215.png" +0 -0
  18. {nonebot_plugin_l4d2_server-1.0.2 → nonebot_plugin_l4d2_server-1.0.3}/nonebot_plugin_l4d2_server/l4_help/icon//344/273/273/345/212/241.png" +0 -0
  19. {nonebot_plugin_l4d2_server-1.0.2 → nonebot_plugin_l4d2_server-1.0.3}/nonebot_plugin_l4d2_server/l4_help/icon//344/277/241/346/201/257.png" +0 -0
  20. {nonebot_plugin_l4d2_server-1.0.2 → nonebot_plugin_l4d2_server-1.0.3}/nonebot_plugin_l4d2_server/l4_help/icon//345/205/254/345/221/212.png" +0 -0
  21. {nonebot_plugin_l4d2_server-1.0.2 → nonebot_plugin_l4d2_server-1.0.3}/nonebot_plugin_l4d2_server/l4_help/icon//345/210/200/345/211/221.png" +0 -0
  22. {nonebot_plugin_l4d2_server-1.0.2 → nonebot_plugin_l4d2_server-1.0.3}/nonebot_plugin_l4d2_server/l4_help/icon//345/210/207/346/215/242.png" +0 -0
  23. {nonebot_plugin_l4d2_server-1.0.2 → nonebot_plugin_l4d2_server-1.0.3}/nonebot_plugin_l4d2_server/l4_help/icon//345/210/240/351/231/244.png" +0 -0
  24. {nonebot_plugin_l4d2_server-1.0.2 → nonebot_plugin_l4d2_server-1.0.3}/nonebot_plugin_l4d2_server/l4_help/icon//345/210/267/346/226/260.png" +0 -0
  25. {nonebot_plugin_l4d2_server-1.0.2 → nonebot_plugin_l4d2_server-1.0.3}/nonebot_plugin_l4d2_server/l4_help/icon//345/215/241/347/273/204.png" +0 -0
  26. {nonebot_plugin_l4d2_server-1.0.2 → nonebot_plugin_l4d2_server-1.0.3}/nonebot_plugin_l4d2_server/l4_help/icon//345/223/252/351/207/214.png" +0 -0
  27. {nonebot_plugin_l4d2_server-1.0.2 → nonebot_plugin_l4d2_server-1.0.3}/nonebot_plugin_l4d2_server/l4_help/icon//345/234/260/345/233/276.png" +0 -0
  28. {nonebot_plugin_l4d2_server-1.0.2 → nonebot_plugin_l4d2_server-1.0.3}/nonebot_plugin_l4d2_server/l4_help/icon//345/257/274/345/205/245.png" +0 -0
  29. {nonebot_plugin_l4d2_server-1.0.2 → nonebot_plugin_l4d2_server-1.0.3}/nonebot_plugin_l4d2_server/l4_help/icon//345/257/274/345/207/272.png" +0 -0
  30. {nonebot_plugin_l4d2_server-1.0.2 → nonebot_plugin_l4d2_server-1.0.3}/nonebot_plugin_l4d2_server/l4_help/icon//345/275/261.png" +0 -0
  31. {nonebot_plugin_l4d2_server-1.0.2 → nonebot_plugin_l4d2_server-1.0.3}/nonebot_plugin_l4d2_server/l4_help/icon//346/213/274/345/233/276.png" +0 -0
  32. {nonebot_plugin_l4d2_server-1.0.2 → nonebot_plugin_l4d2_server-1.0.3}/nonebot_plugin_l4d2_server/l4_help/icon//346/216/242/347/264/242.png" +0 -0
  33. {nonebot_plugin_l4d2_server-1.0.2 → nonebot_plugin_l4d2_server-1.0.3}/nonebot_plugin_l4d2_server/l4_help/icon//346/216/250/351/200/201.png" +0 -0
  34. {nonebot_plugin_l4d2_server-1.0.2 → nonebot_plugin_l4d2_server-1.0.3}/nonebot_plugin_l4d2_server/l4_help/icon//346/224/266/351/233/206.png" +0 -0
  35. {nonebot_plugin_l4d2_server-1.0.2 → nonebot_plugin_l4d2_server-1.0.3}/nonebot_plugin_l4d2_server/l4_help/icon//346/224/273/347/225/245.png" +0 -0
  36. {nonebot_plugin_l4d2_server-1.0.2 → nonebot_plugin_l4d2_server-1.0.3}/nonebot_plugin_l4d2_server/l4_help/icon//346/233/264/346/226/260.png" +0 -0
  37. {nonebot_plugin_l4d2_server-1.0.2 → nonebot_plugin_l4d2_server-1.0.3}/nonebot_plugin_l4d2_server/l4_help/icon//346/235/220/346/226/231.png" +0 -0
  38. {nonebot_plugin_l4d2_server-1.0.2 → nonebot_plugin_l4d2_server-1.0.3}/nonebot_plugin_l4d2_server/l4_help/icon//346/237/245/350/257/242.png" +0 -0
  39. {nonebot_plugin_l4d2_server-1.0.2 → nonebot_plugin_l4d2_server-1.0.3}/nonebot_plugin_l4d2_server/l4_help/icon//346/240/241/351/252/214.png" +0 -0
  40. {nonebot_plugin_l4d2_server-1.0.2 → nonebot_plugin_l4d2_server-1.0.3}/nonebot_plugin_l4d2_server/l4_help/icon//346/257/217/346/234/210.png" +0 -0
  41. {nonebot_plugin_l4d2_server-1.0.2 → nonebot_plugin_l4d2_server-1.0.3}/nonebot_plugin_l4d2_server/l4_help/icon//346/267/261/346/270/212.png" +0 -0
  42. {nonebot_plugin_l4d2_server-1.0.2 → nonebot_plugin_l4d2_server-1.0.3}/nonebot_plugin_l4d2_server/l4_help/icon//346/267/273/345/212/240.png" +0 -0
  43. {nonebot_plugin_l4d2_server-1.0.2 → nonebot_plugin_l4d2_server-1.0.3}/nonebot_plugin_l4d2_server/l4_help/icon//346/270/205/351/231/244.png" +0 -0
  44. {nonebot_plugin_l4d2_server-1.0.2 → nonebot_plugin_l4d2_server-1.0.3}/nonebot_plugin_l4d2_server/l4_help/icon//347/212/266/346/200/201.png" +0 -0
  45. {nonebot_plugin_l4d2_server-1.0.2 → nonebot_plugin_l4d2_server-1.0.3}/nonebot_plugin_l4d2_server/l4_help/icon//347/255/276/345/210/260.png" +0 -0
  46. {nonebot_plugin_l4d2_server-1.0.2 → nonebot_plugin_l4d2_server-1.0.3}/nonebot_plugin_l4d2_server/l4_help/icon//347/273/221/345/256/232.png" +0 -0
  47. {nonebot_plugin_l4d2_server-1.0.2 → nonebot_plugin_l4d2_server-1.0.3}/nonebot_plugin_l4d2_server/l4_help/icon//350/241/250.png" +0 -0
  48. {nonebot_plugin_l4d2_server-1.0.2 → nonebot_plugin_l4d2_server-1.0.3}/nonebot_plugin_l4d2_server/l4_help/icon//350/241/250/346/203/205.png" +0 -0
  49. {nonebot_plugin_l4d2_server-1.0.2 → nonebot_plugin_l4d2_server-1.0.3}/nonebot_plugin_l4d2_server/l4_help/icon//350/247/222/350/211/262.png" +0 -0
  50. {nonebot_plugin_l4d2_server-1.0.2 → nonebot_plugin_l4d2_server-1.0.3}/nonebot_plugin_l4d2_server/l4_help/icon//350/256/260/345/275/225.png" +0 -0
  51. {nonebot_plugin_l4d2_server-1.0.2 → nonebot_plugin_l4d2_server-1.0.3}/nonebot_plugin_l4d2_server/l4_help/icon//351/205/215/347/275/256.png" +0 -0
  52. {nonebot_plugin_l4d2_server-1.0.2 → nonebot_plugin_l4d2_server-1.0.3}/nonebot_plugin_l4d2_server/l4_help/icon//351/207/215/345/220/257.png" +0 -0
  53. {nonebot_plugin_l4d2_server-1.0.2 → nonebot_plugin_l4d2_server-1.0.3}/nonebot_plugin_l4d2_server/l4_help/texture2d/badge.png +0 -0
  54. {nonebot_plugin_l4d2_server-1.0.2 → nonebot_plugin_l4d2_server-1.0.3}/nonebot_plugin_l4d2_server/l4_help/texture2d/banner.png +0 -0
  55. {nonebot_plugin_l4d2_server-1.0.2 → nonebot_plugin_l4d2_server-1.0.3}/nonebot_plugin_l4d2_server/l4_help/texture2d/bg.jpg +0 -0
  56. {nonebot_plugin_l4d2_server-1.0.2 → nonebot_plugin_l4d2_server-1.0.3}/nonebot_plugin_l4d2_server/l4_help/texture2d/button.png +0 -0
  57. {nonebot_plugin_l4d2_server-1.0.2 → nonebot_plugin_l4d2_server-1.0.3}/nonebot_plugin_l4d2_server/l4_help/texture2d/icon.png +0 -0
  58. {nonebot_plugin_l4d2_server-1.0.2 → nonebot_plugin_l4d2_server-1.0.3}/nonebot_plugin_l4d2_server/l4_image/__init__.py +0 -0
  59. {nonebot_plugin_l4d2_server-1.0.2 → nonebot_plugin_l4d2_server-1.0.3}/nonebot_plugin_l4d2_server/l4_image/anne_pil.py +0 -0
  60. {nonebot_plugin_l4d2_server-1.0.2 → nonebot_plugin_l4d2_server-1.0.3}/nonebot_plugin_l4d2_server/l4_image/convert.py +0 -0
  61. {nonebot_plugin_l4d2_server-1.0.2 → nonebot_plugin_l4d2_server-1.0.3}/nonebot_plugin_l4d2_server/l4_image/download.py +0 -0
  62. {nonebot_plugin_l4d2_server-1.0.2 → nonebot_plugin_l4d2_server-1.0.3}/nonebot_plugin_l4d2_server/l4_image/html_img.py +0 -0
  63. {nonebot_plugin_l4d2_server-1.0.2 → nonebot_plugin_l4d2_server-1.0.3}/nonebot_plugin_l4d2_server/l4_image/image_tools.py +0 -0
  64. {nonebot_plugin_l4d2_server-1.0.2 → nonebot_plugin_l4d2_server-1.0.3}/nonebot_plugin_l4d2_server/l4_image/img/anne/anne.html +0 -0
  65. {nonebot_plugin_l4d2_server-1.0.2 → nonebot_plugin_l4d2_server-1.0.3}/nonebot_plugin_l4d2_server/l4_image/img/anne/back.png +0 -0
  66. {nonebot_plugin_l4d2_server-1.0.2 → nonebot_plugin_l4d2_server-1.0.3}/nonebot_plugin_l4d2_server/l4_image/img/anne/back1.jpg +0 -0
  67. {nonebot_plugin_l4d2_server-1.0.2 → nonebot_plugin_l4d2_server-1.0.3}/nonebot_plugin_l4d2_server/l4_image/img/anne/group_ip.html +0 -0
  68. {nonebot_plugin_l4d2_server-1.0.2 → nonebot_plugin_l4d2_server-1.0.3}/nonebot_plugin_l4d2_server/l4_image/img/anne/ip.html +0 -0
  69. {nonebot_plugin_l4d2_server-1.0.2 → nonebot_plugin_l4d2_server-1.0.3}/nonebot_plugin_l4d2_server/l4_image/img/head/head.png +0 -0
  70. {nonebot_plugin_l4d2_server-1.0.2 → nonebot_plugin_l4d2_server-1.0.3}/nonebot_plugin_l4d2_server/l4_image/img/header/logo.png +0 -0
  71. {nonebot_plugin_l4d2_server-1.0.2 → nonebot_plugin_l4d2_server-1.0.3}/nonebot_plugin_l4d2_server/l4_image/img/header/player1.jpg +0 -0
  72. {nonebot_plugin_l4d2_server-1.0.2 → nonebot_plugin_l4d2_server-1.0.3}/nonebot_plugin_l4d2_server/l4_image/img/template/Bocchi_The_Rock.html +0 -0
  73. {nonebot_plugin_l4d2_server-1.0.2 → nonebot_plugin_l4d2_server-1.0.3}/nonebot_plugin_l4d2_server/l4_image/img/template/Bocchi_The_Rock.png +0 -0
  74. {nonebot_plugin_l4d2_server-1.0.2 → nonebot_plugin_l4d2_server-1.0.3}/nonebot_plugin_l4d2_server/l4_image/img/template/HYPixel11pxU-2.ttf +0 -0
  75. {nonebot_plugin_l4d2_server-1.0.2 → nonebot_plugin_l4d2_server-1.0.3}/nonebot_plugin_l4d2_server/l4_image/img/template/Pixel.html +0 -0
  76. {nonebot_plugin_l4d2_server-1.0.2 → nonebot_plugin_l4d2_server-1.0.3}/nonebot_plugin_l4d2_server/l4_image/img/template/Pixel.png +0 -0
  77. {nonebot_plugin_l4d2_server-1.0.2 → nonebot_plugin_l4d2_server-1.0.3}/nonebot_plugin_l4d2_server/l4_image/img/template/Rainbow.html +0 -0
  78. {nonebot_plugin_l4d2_server-1.0.2 → nonebot_plugin_l4d2_server-1.0.3}/nonebot_plugin_l4d2_server/l4_image/img/template/Rainbow.png +0 -0
  79. {nonebot_plugin_l4d2_server-1.0.2 → nonebot_plugin_l4d2_server-1.0.3}/nonebot_plugin_l4d2_server/l4_image/img/template/Tutumianhuatang-Bold-2.ttf +0 -0
  80. {nonebot_plugin_l4d2_server-1.0.2 → nonebot_plugin_l4d2_server-1.0.3}/nonebot_plugin_l4d2_server/l4_image/img/template/bilibili.svg +0 -0
  81. {nonebot_plugin_l4d2_server-1.0.2 → nonebot_plugin_l4d2_server-1.0.3}/nonebot_plugin_l4d2_server/l4_image/img/template/fingerprint.svg +0 -0
  82. {nonebot_plugin_l4d2_server-1.0.2 → nonebot_plugin_l4d2_server-1.0.3}/nonebot_plugin_l4d2_server/l4_image/img/template/github.svg +0 -0
  83. {nonebot_plugin_l4d2_server-1.0.2 → nonebot_plugin_l4d2_server-1.0.3}/nonebot_plugin_l4d2_server/l4_image/img/template/l.svg +0 -0
  84. {nonebot_plugin_l4d2_server-1.0.2 → nonebot_plugin_l4d2_server-1.0.3}/nonebot_plugin_l4d2_server/l4_image/img/template/m.svg +0 -0
  85. {nonebot_plugin_l4d2_server-1.0.2 → nonebot_plugin_l4d2_server-1.0.3}/nonebot_plugin_l4d2_server/l4_image/img/template/normal.html +0 -0
  86. {nonebot_plugin_l4d2_server-1.0.2 → nonebot_plugin_l4d2_server-1.0.3}/nonebot_plugin_l4d2_server/l4_image/img/template/vac.png +0 -0
  87. {nonebot_plugin_l4d2_server-1.0.2 → nonebot_plugin_l4d2_server-1.0.3}/nonebot_plugin_l4d2_server/l4_image/img/template/vac_white.png +0 -0
  88. {nonebot_plugin_l4d2_server-1.0.2 → nonebot_plugin_l4d2_server-1.0.3}/nonebot_plugin_l4d2_server/l4_image/img/template/vue.css +0 -0
  89. {nonebot_plugin_l4d2_server-1.0.2 → nonebot_plugin_l4d2_server-1.0.3}/nonebot_plugin_l4d2_server/l4_image/img/template/w.svg +0 -0
  90. {nonebot_plugin_l4d2_server-1.0.2 → nonebot_plugin_l4d2_server-1.0.3}/nonebot_plugin_l4d2_server/l4_image/model.py +0 -0
  91. {nonebot_plugin_l4d2_server-1.0.2 → nonebot_plugin_l4d2_server-1.0.3}/nonebot_plugin_l4d2_server/l4_image/vtfs.py +0 -0
  92. {nonebot_plugin_l4d2_server-1.0.2 → nonebot_plugin_l4d2_server-1.0.3}/nonebot_plugin_l4d2_server/l4_local/__init__.py +0 -0
  93. {nonebot_plugin_l4d2_server-1.0.2 → nonebot_plugin_l4d2_server-1.0.3}/nonebot_plugin_l4d2_server/l4_local/file.py +0 -0
  94. {nonebot_plugin_l4d2_server-1.0.2 → nonebot_plugin_l4d2_server-1.0.3}/nonebot_plugin_l4d2_server/l4_request/utils.py +0 -0
  95. {nonebot_plugin_l4d2_server-1.0.2 → nonebot_plugin_l4d2_server-1.0.3}/nonebot_plugin_l4d2_server/utils/api/api.py +0 -0
  96. {nonebot_plugin_l4d2_server-1.0.2 → nonebot_plugin_l4d2_server-1.0.3}/nonebot_plugin_l4d2_server/utils/api/models.py +0 -0
  97. {nonebot_plugin_l4d2_server-1.0.2 → nonebot_plugin_l4d2_server-1.0.3}/nonebot_plugin_l4d2_server/utils/api/request.py +0 -0
  98. {nonebot_plugin_l4d2_server-1.0.2 → nonebot_plugin_l4d2_server-1.0.3}/nonebot_plugin_l4d2_server/utils/database/models.py +0 -0
  99. {nonebot_plugin_l4d2_server-1.0.2 → nonebot_plugin_l4d2_server-1.0.3}/nonebot_plugin_l4d2_server/utils/utils.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: nonebot-plugin-l4d2-server
3
- Version: 1.0.2
3
+ Version: 1.0.3
4
4
  Summary: L4D2 server related operations plugin for NoneBot2
5
5
  Keywords: steam,game,l4d2,nonebot2,plugin
6
6
  Author-Email: Agnes_Digital <Z735803792@163.com>
@@ -11,10 +11,12 @@ Classifier: Programming Language :: Python :: 3
11
11
  Classifier: Programming Language :: Python :: 3.9
12
12
  Classifier: Programming Language :: Python :: 3.10
13
13
  Classifier: Programming Language :: Python :: 3.11
14
+ Classifier: Programming Language :: Python :: 3.12
14
15
  Classifier: Operating System :: OS Independent
15
16
  Project-URL: homepage, https://github.com/Agnes4m/nonebot_plugin_l4d2_server
16
17
  Requires-Python: <4.0,>=3.9
17
18
  Requires-Dist: nonebot2>=2.0.0
19
+ Requires-Dist: nonebot2[fastapi]>=2.3.3
18
20
  Requires-Dist: nonebot-plugin-htmlrender>=0.3.0
19
21
  Requires-Dist: nonebot-adapter-onebot>=2.4.4
20
22
  Requires-Dist: nonebot-plugin-alconna>=0.50.0
@@ -29,7 +31,7 @@ Requires-Dist: python-a2s>=1.4.1
29
31
  Requires-Dist: ujson>=5.10.0
30
32
  Requires-Dist: lxml>=5.2.2
31
33
  Requires-Dist: rcon>=2.1.0
32
- Requires-Dist: pillow>9
34
+ Requires-Dist: pillow>10
33
35
  Requires-Dist: beautifulsoup4>=4.12.3
34
36
  Requires-Dist: rarfile>=4.2
35
37
  Requires-Dist: pyunpack>=0.3
@@ -105,17 +105,27 @@ async def _(
105
105
  async def _(
106
106
  args: Message = CommandArg(),
107
107
  ):
108
+ # 以后有时间补img格式
108
109
  msg: str = args.extract_plain_text().strip()
109
110
  tag_list: List[str] = msg.split(" ", maxsplit=1)
110
- if len(tag_list) < 2:
111
- return await UniMessage.text("格式错误,正确格式:/l4find 组名 玩家名").finish()
112
- group, name = tag_list
113
- out: List[OutServer] = await get_server_detail(group, is_img=False) # type: ignore
114
- out_msg = "未找到玩家"
115
- for one in out:
116
- for player in one["player"]:
117
- if name in player.name:
118
- out_msg = await get_ip_server(f"{one['host']}:{one['port']}")
111
+ if len(tag_list) == 1:
112
+ await UniMessage.text("未设置组,正在全服查找,时间较长").send()
113
+ name = tag_list[0]
114
+ out: List[OutServer] = await get_server_detail(is_img=False) # type: ignore
115
+ out_msg = "未找到玩家"
116
+ for one in out:
117
+ for player in one["player"]:
118
+ if name in player.name:
119
+ out_msg = await get_ip_server(f"{one['host']}:{one['port']}")
120
+ if len(tag_list) == 2:
121
+ group, name = tag_list
122
+ await UniMessage.text(f"正在查询{group}组").send()
123
+ out: List[OutServer] = await get_server_detail(group, is_img=False) # type: ignore
124
+ out_msg = "未找到玩家"
125
+ for one in out:
126
+ for player in one["player"]:
127
+ if name in player.name:
128
+ out_msg = await get_ip_server(f"{one['host']}:{one['port']}")
119
129
 
120
130
  return await UniMessage.text(out_msg).finish()
121
131
 
@@ -1,10 +1,14 @@
1
1
  from pathlib import Path
2
2
 
3
3
  from nonebot import get_plugin_config
4
+ from nonebot.log import logger
4
5
  from pydantic import BaseModel
5
6
 
6
7
  DATAPATH = Path(__file__).parent.joinpath("data")
7
8
  DATAOUT = Path("data/L4D2")
9
+ if not Path(DATAOUT / "l4d2.json").exists():
10
+ logger.info("文件 l4d2.json 不存在,已创建并初始化为 {}")
11
+ Path(DATAOUT / "l4d2.json").write_text("{}", encoding="utf-8")
8
12
  print(DATAOUT.absolute())
9
13
  server_all_path = DATAOUT / "l4d2"
10
14
  server_all_path.mkdir(parents=True, exist_ok=True)
@@ -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.2"
13
+ __version__ = "1.0.3"
14
14
  TEXT_PATH = Path(__file__).parent / "texture2d"
15
15
  HELP_DATA = Path(__file__).parent / "Help.json"
16
16
 
@@ -0,0 +1,283 @@
1
+ import random
2
+ from typing import Dict, List, Optional, cast
3
+
4
+ from nonebot.log import logger
5
+
6
+ from ..config import server_all_path
7
+ from ..l4_image import msg_to_image
8
+ from ..utils.api.models import AllServer, NserverOut, OutServer
9
+ from ..utils.api.request import L4API
10
+ from ..utils.utils import split_maohao
11
+ from .draw_msg import convert_duration, draw_one_ip, get_much_server
12
+
13
+ try:
14
+ import ujson as json
15
+ except ImportError:
16
+ import json
17
+
18
+ from ..config import config
19
+
20
+ # 获取全部服务器信息
21
+ ALLHOST: Dict[str, List[NserverOut]] = {}
22
+ COMMAND = set()
23
+
24
+
25
+ async def get_all_server_detail():
26
+ """
27
+ 获取所有服务器的详细信息。
28
+
29
+ Args:
30
+
31
+
32
+ Returns:
33
+ str: 包含所有服务器详细信息的字符串。
34
+
35
+ """
36
+ out_list: List[AllServer] = []
37
+ for group in ALLHOST:
38
+ msg_list = await get_group_detail(group)
39
+ if msg_list is None:
40
+ continue
41
+ active_server = 0
42
+ max_server = 0
43
+ active_player = 0
44
+ max_player = 0
45
+ for index, msg in enumerate(msg_list):
46
+ max_server = index + 1
47
+ if msg["server"].max_players != 0:
48
+ active_server += 1
49
+ active_player += msg["server"].player_count
50
+ max_player += msg["server"].max_players
51
+ data = {
52
+ "command": group,
53
+ "active_server": active_server,
54
+ "max_server": max_server,
55
+ "active_player": active_player,
56
+ "max_player": max_player,
57
+ }
58
+ out_list.append(cast(AllServer, data))
59
+
60
+ # to do作图,先用文字凑合
61
+ out_msg = ""
62
+ for one in out_list:
63
+ if one["max_player"]:
64
+ out_msg += f"{one['command']} | 服务器{one['active_server']}/{one['max_server']} | 玩家{one['active_player']}/{one['max_player']}\n"
65
+ else:
66
+ continue
67
+ return out_msg
68
+
69
+
70
+ async def get_server_detail(
71
+ command: str = "",
72
+ _id: Optional[str] = None,
73
+ is_img: bool = True,
74
+ ):
75
+ """
76
+ 异步获取服务器详细信息。
77
+
78
+ Args:
79
+ command (str): 服务器组名。
80
+ _id (Optional[str], optional): 服务器ID。默认为None。
81
+ is_img (bool, optional): 是否返回图片格式的信息。默认为True。
82
+
83
+ Returns:
84
+ Union[bytes, List[OutServer], None]: 返回服务器详细信息。如果为图片格式,返回bytes类型;
85
+ 如果不是图片格式,返回List[OutServer]类型;如果未找到服务器组,返回None。
86
+
87
+ """
88
+ if command:
89
+ server_json = ALLHOST.get(command)
90
+ else:
91
+ server_json = []
92
+ for servers in ALLHOST.values():
93
+ server_json.extend(servers)
94
+
95
+ logger.info(server_json)
96
+ if server_json is None:
97
+ logger.warning("未找到这个组")
98
+ return None
99
+
100
+ if _id is None:
101
+ # 输出组信息
102
+ logger.info(f"正在请求组服务器信息 {command}")
103
+ server_dict = await get_much_server(server_json, command)
104
+ if is_img:
105
+ out_msg = await msg_to_image(server_dict)
106
+ else:
107
+ out_msg = server_dict
108
+ return out_msg
109
+
110
+ # 返回单个
111
+ logger.info("正在请求单服务器信息")
112
+ out_msg = ""
113
+ for i in server_json:
114
+ if str(_id) == str(i["id"]):
115
+ out_msg = await draw_one_ip(i["host"], i["port"])
116
+ if is_img:
117
+ return cast(bytes, out_msg)
118
+ if not is_img:
119
+ return cast(List[OutServer], out_msg)
120
+ # print(out_msg)
121
+ return None
122
+
123
+
124
+ async def get_group_detail(
125
+ command: str,
126
+ ):
127
+ server_json = ALLHOST.get(command)
128
+ logger.info(server_json)
129
+ if server_json is None:
130
+ logger.warning("未找到这个组")
131
+ return None
132
+
133
+ logger.info("正在请求组服务器信息")
134
+ return await get_much_server(server_json, command)
135
+
136
+
137
+ async def get_ip_server(ip: str):
138
+ host, port = split_maohao(ip)
139
+ return await draw_one_ip(host, port)
140
+
141
+
142
+ # 以下是重载ip
143
+ def reload_ip():
144
+ global COMMAND
145
+ # print("正在读取json文件")
146
+ group_ip = []
147
+ for item in server_all_path.iterdir():
148
+ if item.is_file() and item.name.endswith("json"):
149
+ json_data = json.loads(item.read_text(encoding="utf-8"))
150
+ group_server = cast(Dict[str, List[NserverOut]], json_data)
151
+
152
+ for group, group_ip in group_server.items():
153
+ # 处理ip,host,port关系
154
+ for one_ip in group_ip:
155
+ if one_ip.get("ip"):
156
+ if one_ip.get("host") and one_ip.get("port"):
157
+ pass
158
+ if one_ip.get("host") and not one_ip.get("port"):
159
+ one_ip["port"] = 20715
160
+ if not one_ip.get("host"):
161
+ one_ip["host"], one_ip["port"] = split_maohao(
162
+ one_ip.get("ip"),
163
+ )
164
+ else:
165
+ if one_ip.get("host") and one_ip.get("port"):
166
+ one_ip["ip"] = f'{one_ip["host"]}:{one_ip["port"]}'
167
+ if one_ip.get("host") and not one_ip.get("port"):
168
+ one_ip["ip"] = f'{one_ip["host"]}:20715'
169
+ else:
170
+ logger.warning(f"{one_ip} 没有ip")
171
+
172
+ ALLHOST.update({group: group_ip})
173
+ COMMAND.add(group)
174
+ logger.success(f"成功加载 {item.name.split('.')[0]} {len(group_ip)}个")
175
+
176
+
177
+ async def tj_request(command: str = "云", tj="tj"):
178
+ map_type = "普通药役"
179
+ server_json = ALLHOST.get(command)
180
+ logger.info(server_json)
181
+ if server_json is None:
182
+ logger.warning("未找到这个组")
183
+ return None
184
+
185
+ logger.info("正在获取电信服务器信息")
186
+ player_msg = ""
187
+ right_ip = []
188
+
189
+ async def _filter_servers(servers: list, tj_mode: str) -> list:
190
+ """筛选符合条件的服务器
191
+ Args:
192
+ servers: 服务器列表
193
+ tj_mode: 筛选模式('tj'或'zl')
194
+ Returns:
195
+ 符合条件的服务器列表
196
+ """
197
+ filtered = []
198
+ for i in servers:
199
+ ser_list = await L4API.a2s_info([(i["host"], i["port"])], is_player=True)
200
+ if not ser_list:
201
+ continue
202
+
203
+ srv = ser_list[0][0]
204
+ players = ser_list[0][1]
205
+
206
+ if tj_mode == "tj" and map_type in srv.map_name:
207
+ score = sum(p.score for p in players[:4])
208
+ t = srv.map_name.split("[")[-1].split("特")[0]
209
+ if t.isdigit() and int(t) * 50 < score:
210
+ logger.info(
211
+ f"符合TJ条件的服务器: {i['host']}:{i['port']}, 地图: {srv.map_name}, 分数: {score}",
212
+ )
213
+ filtered.append(i)
214
+ elif tj_mode == "zl" and map_type in srv.map_name and len(players) <= 4:
215
+ logger.info(
216
+ f"符合ZL条件的服务器: {i['host']}:{i['port']}, 地图: {srv.map_name}, 玩家数: {len(players)}",
217
+ )
218
+ filtered.append(i)
219
+ return filtered
220
+
221
+ async def _format_players(player_list: list) -> str:
222
+ """格式化玩家信息
223
+ Args:
224
+ player_list: 玩家对象列表
225
+ Returns:
226
+ 格式化后的玩家信息字符串
227
+ """
228
+ durations = [await convert_duration(p.duration) for p in player_list]
229
+ max_duration_len = max(len(str(d)) for d in durations)
230
+ max_score_len = max(len(str(p.score)) for p in player_list)
231
+ return "\n".join(
232
+ f"[{p.score:>{max_score_len}}] | {durations[i]:^{max_duration_len}} | {p.name[0]}***{p.name[-1]}"
233
+ for i, p in enumerate(player_list)
234
+ )
235
+
236
+ def _build_message(srv_info, players_msg: str, selected_srv: dict) -> str:
237
+ """构建服务器信息消息
238
+ Args:
239
+ srv_info: 服务器信息对象
240
+ players_msg: 格式化后的玩家信息
241
+ selected_srv: 选中的服务器信息
242
+ Returns:
243
+ 完整的消息字符串
244
+ """
245
+ msg = f"""*{srv_info.server_name}*
246
+ 游戏: {srv_info.folder}
247
+ 地图: {srv_info.map_name}
248
+ 人数: {srv_info.player_count}/{srv_info.max_players}"""
249
+ if srv_info.ping is not None:
250
+ msg += f"\nping: {srv_info.ping * 1000:.0f}ms\n{players_msg}"
251
+ if config.l4_show_ip:
252
+ msg += f"\nconnect {selected_srv['host']}:{selected_srv['port']}"
253
+ return msg
254
+
255
+ try:
256
+ right_ip = await _filter_servers(server_json, tj)
257
+
258
+ if not right_ip:
259
+ logger.warning("没有找到符合条件的服务器")
260
+ return "没有符合条件的服务器"
261
+
262
+ logger.info(
263
+ f"符合条件的服务器列表: {[f'{ip['host']}:{ip['port']}' for ip in right_ip]}",
264
+ )
265
+ s = random.choice(right_ip)
266
+ logger.info(f"最终选择的服务器: {s['host']}:{s['port']}")
267
+ ser_list = await L4API.a2s_info([(s["host"], s["port"])], is_player=True)
268
+ if not ser_list:
269
+ return "获取服务器信息失败"
270
+
271
+ one_server = ser_list[0][0]
272
+ one_player = ser_list[0][1]
273
+
274
+ if one_player:
275
+ player_msg = await _format_players(one_player)
276
+ else:
277
+ player_msg = "服务器感觉很安静啊"
278
+
279
+ return _build_message(one_server, player_msg, s)
280
+
281
+ except Exception as e:
282
+ logger.error(f"tj_request error: {e}")
283
+ return "获取服务器信息时出错"
@@ -31,8 +31,8 @@ async def draw_one_ip(host: str, port: int):
31
31
  dur = "{:^{}}".format(chines_dur, max_duration_len)
32
32
  name_leg = len(player.name)
33
33
  if name_leg > 2:
34
- # xing = "*" * (name_leg - 2)
35
- name = f"{player.name[0]}xing{player.name[-1]}"
34
+ xing = "*" * (name_leg - 2)
35
+ name = f"{player.name[0]}{xing}{player.name[-1]}"
36
36
  else:
37
37
  name = player.name
38
38
  player_msg += f"{soc} | {dur} | {name} \n"
@@ -77,6 +77,12 @@ async def get_much_server(server_json: List[NserverOut], command: str):
77
77
 
78
78
 
79
79
  async def convert_duration(duration: float) -> str:
80
+ """Convert duration in seconds to human-readable string format (e.g. '1h 30m 15s')
81
+ Args:
82
+ duration: Duration in seconds
83
+ Returns:
84
+ Formatted time string
85
+ """
80
86
  minutes, seconds = divmod(duration, 60)
81
87
  hours, minutes = divmod(minutes, 60)
82
88
  time_str = ""
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "nonebot-plugin-l4d2-server"
3
- version = "1.0.2"
3
+ version = "1.0.3"
4
4
  description = "L4D2 server related operations plugin for NoneBot2"
5
5
  authors = [
6
6
  { name = "Agnes_Digital", email = "Z735803792@163.com" },
@@ -15,6 +15,7 @@ keywords = [
15
15
  ]
16
16
  dependencies = [
17
17
  "nonebot2>=2.0.0",
18
+ "nonebot2[fastapi]>=2.3.3",
18
19
  "nonebot-plugin-htmlrender>=0.3.0",
19
20
  "nonebot-adapter-onebot>=2.4.4",
20
21
  "nonebot-plugin-alconna>=0.50.0",
@@ -29,7 +30,7 @@ dependencies = [
29
30
  "ujson>=5.10.0",
30
31
  "lxml>=5.2.2",
31
32
  "rcon>=2.1.0",
32
- "pillow>9",
33
+ "pillow>10",
33
34
  "beautifulsoup4>=4.12.3",
34
35
  "rarfile>=4.2",
35
36
  "pyunpack>=0.3",
@@ -42,6 +43,7 @@ classifiers = [
42
43
  "Programming Language :: Python :: 3.9",
43
44
  "Programming Language :: Python :: 3.10",
44
45
  "Programming Language :: Python :: 3.11",
46
+ "Programming Language :: Python :: 3.12",
45
47
  "Operating System :: OS Independent",
46
48
  ]
47
49
  readme = "README.md"
@@ -55,6 +57,12 @@ homepage = "https://github.com/Agnes4m/nonebot_plugin_l4d2_server"
55
57
  [tool.pdm.build]
56
58
  includes = []
57
59
 
60
+ [tool.pdm.dependencies.nonebot2]
61
+ version = "*"
62
+ extras = [
63
+ "fastapi",
64
+ ]
65
+
58
66
  [tool.ruff.lint]
59
67
  ignore = [
60
68
  "B008",
@@ -1,213 +0,0 @@
1
- import random
2
- from typing import Dict, List, Optional, cast
3
-
4
- from nonebot.log import logger
5
-
6
- from ..config import server_all_path
7
- from ..l4_image import msg_to_image
8
- from ..utils.api.models import AllServer, NserverOut, OutServer
9
- from ..utils.api.request import L4API
10
- from ..utils.utils import split_maohao
11
- from .draw_msg import convert_duration, draw_one_ip, get_much_server
12
-
13
- try:
14
- import ujson as json
15
- except ImportError:
16
- import json
17
-
18
- from ..config import config
19
-
20
- # 获取全部服务器信息
21
- ALLHOST: Dict[str, List[NserverOut]] = {}
22
- COMMAND = set()
23
-
24
-
25
- async def get_all_server_detail():
26
- out_list: List[AllServer] = []
27
- for group in ALLHOST:
28
- msg_list = await get_group_detail(group)
29
- if msg_list is None:
30
- continue
31
- active_server = 0
32
- max_server = 0
33
- active_player = 0
34
- max_player = 0
35
- for index, msg in enumerate(msg_list):
36
- max_server = index + 1
37
- if msg["server"].max_players != 0:
38
- active_server += 1
39
- active_player += msg["server"].player_count
40
- max_player += msg["server"].max_players
41
- data = {
42
- "command": group,
43
- "active_server": active_server,
44
- "max_server": max_server,
45
- "active_player": active_player,
46
- "max_player": max_player,
47
- }
48
- out_list.append(cast(AllServer, data))
49
-
50
- # to do作图,先用文字凑合
51
- out_msg = ""
52
- for one in out_list:
53
- if one["max_player"]:
54
- out_msg += f"{one['command']} | 服务器{one['active_server']}/{one['max_server']} | 玩家{one['active_player']}/{one['max_player']}\n"
55
- else:
56
- continue
57
- return out_msg
58
-
59
-
60
- async def get_server_detail(
61
- command: str,
62
- _id: Optional[str] = None,
63
- is_img: bool = True,
64
- ):
65
- server_json = ALLHOST.get(command)
66
- logger.info(server_json)
67
- if server_json is None:
68
- logger.warning("未找到这个组")
69
- return None
70
-
71
- if _id is None:
72
- # 输出组信息
73
- logger.info(f"正在请求组服务器信息 {command}")
74
- server_dict = await get_much_server(server_json, command)
75
- if is_img:
76
- out_msg = await msg_to_image(server_dict)
77
- else:
78
- out_msg = server_dict
79
- return out_msg
80
-
81
- # 返回单个
82
- logger.info("正在请求单服务器信息")
83
- out_msg = ""
84
- for i in server_json:
85
- if str(_id) == str(i["id"]):
86
- out_msg = await draw_one_ip(i["host"], i["port"])
87
- if is_img:
88
- return cast(bytes, out_msg)
89
- if not is_img:
90
- return cast(List[OutServer], out_msg)
91
- # print(out_msg)
92
- return None
93
-
94
-
95
- async def get_group_detail(
96
- command: str,
97
- ):
98
- server_json = ALLHOST.get(command)
99
- logger.info(server_json)
100
- if server_json is None:
101
- logger.warning("未找到这个组")
102
- return None
103
-
104
- logger.info("正在请求组服务器信息")
105
- return await get_much_server(server_json, command)
106
-
107
-
108
- async def get_ip_server(ip: str):
109
- host, port = split_maohao(ip)
110
- return await draw_one_ip(host, port)
111
-
112
-
113
- # 以下是重载ip
114
- def reload_ip():
115
- global COMMAND
116
- # print("正在读取json文件")
117
- group_ip = []
118
- for item in server_all_path.iterdir():
119
- if item.is_file():
120
- if item.name.endswith("json"):
121
- json_data = json.loads(item.read_text(encoding="utf-8"))
122
- group_server = cast(Dict[str, List[NserverOut]], json_data)
123
-
124
- for group, group_ip in group_server.items():
125
- # 处理ip,host,port关系
126
- for one_ip in group_ip:
127
- if one_ip.get("ip"):
128
- if one_ip.get("host") and one_ip.get("port"):
129
- pass
130
- if one_ip.get("host") and not one_ip.get("port"):
131
- one_ip["port"] = 20715
132
- if not one_ip.get("host"):
133
- one_ip["host"], one_ip["port"] = split_maohao(
134
- one_ip.get("ip"),
135
- )
136
- else:
137
- if one_ip.get("host") and one_ip.get("port"):
138
- one_ip["ip"] = f'{one_ip["host"]}:{one_ip["port"]}'
139
- if one_ip.get("host") and not one_ip.get("port"):
140
- one_ip["ip"] = f'{one_ip["host"]}:20715'
141
- else:
142
- logger.warning(f"{one_ip} 没有ip")
143
-
144
- ALLHOST.update({group: group_ip})
145
- COMMAND.add(group)
146
- logger.success(f"成功加载 {item.name.split('.')[0]} {len(group_ip)}个")
147
-
148
- if item.name.endswith("txt"):
149
- """to do"""
150
-
151
-
152
- async def tj_request(command: str = "云", tj="tj"):
153
- server_json = ALLHOST.get(command)
154
- logger.info(server_json)
155
- if server_json is None:
156
- logger.warning("未找到这个组")
157
- return None
158
- # 返回单个
159
- logger.info("正在anne电信服务器信息")
160
- player_msg = ""
161
- right_ip = []
162
- for i in server_json:
163
- ser_list = await L4API.a2s_info([(i["host"], i["port"])], is_player=True)
164
- one_server = ser_list[0][0]
165
- one_player = ser_list[0][1]
166
-
167
- # 判断坐牢条件
168
- if tj == "tj" and "普通药役" in one_server.map_name:
169
- score: int = 0
170
- for index, player in enumerate(one_player, 1):
171
- if index > 4:
172
- break
173
- score += player.score
174
-
175
- t = one_server.map_name.split("[")[-1].split("特")[0]
176
- if int(t) * 50 < score:
177
- right_ip.append(i)
178
- if tj == "zl" and "普通药役" in one_server.map_name and len(one_player) <= 4:
179
- right_ip.append(i)
180
-
181
- if not right_ip:
182
- return "没有符合条件的服务器"
183
-
184
- s = random.choice(right_ip)
185
- ser_list = await L4API.a2s_info([(s["host"], s["port"])], is_player=True)
186
- one_server = ser_list[0][0]
187
- one_player = ser_list[0][1]
188
- if len(one_player):
189
- max_duration_len = max(
190
- [len(str(await convert_duration(i.duration))) for i in one_player],
191
- )
192
- max_score_len = max(len(str(i.score)) for i in one_player)
193
-
194
- for player in one_player:
195
- soc = "[{:>{}}]".format(player.score, max_score_len)
196
- chines_dur = await convert_duration(player.duration)
197
- dur = "{:^{}}".format(chines_dur, max_duration_len)
198
- name = f"{player.name[0]}***{player.name[-1]}"
199
- player_msg += f"{soc} | {dur} | {name} \n"
200
- else:
201
- player_msg = "服务器感觉很安静啊"
202
- msg = f"""*{one_server.server_name}*
203
- 游戏: {one_server.folder}
204
- 地图: {one_server.map_name}
205
- 人数: {one_server.player_count}/{one_server.max_players}"""
206
- if one_server.ping is not None:
207
- msg += f"""
208
- ping: {one_server.ping * 1000:.0f}ms
209
- {player_msg}"""
210
- if config.l4_show_ip:
211
- msg += f"""
212
- connect {s["host"]}:{s["port"]}"""
213
- return msg