nonebot-plugin-l4d2-server 1.0.9__py3-none-any.whl → 1.1.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.
- nonebot_plugin_l4d2_server/__main__.py +6 -18
- nonebot_plugin_l4d2_server/l4_help/__init__.py +1 -1
- nonebot_plugin_l4d2_server/l4_image/html_img.py +2 -2
- nonebot_plugin_l4d2_server/l4_image/img/template/normal.html +191 -233
- nonebot_plugin_l4d2_server/l4_image/img/template/normal_.html +247 -0
- nonebot_plugin_l4d2_server/l4_request/__init__.py +25 -4
- nonebot_plugin_l4d2_server/l4_request/draw_msg.py +1 -20
- nonebot_plugin_l4d2_server/l4_request/utils.py +2 -0
- nonebot_plugin_l4d2_server/utils/utils.py +23 -0
- {nonebot_plugin_l4d2_server-1.0.9.dist-info → nonebot_plugin_l4d2_server-1.1.1.dist-info}/METADATA +2 -2
- {nonebot_plugin_l4d2_server-1.0.9.dist-info → nonebot_plugin_l4d2_server-1.1.1.dist-info}/RECORD +14 -13
- {nonebot_plugin_l4d2_server-1.0.9.dist-info → nonebot_plugin_l4d2_server-1.1.1.dist-info}/WHEEL +0 -0
- {nonebot_plugin_l4d2_server-1.0.9.dist-info → nonebot_plugin_l4d2_server-1.1.1.dist-info}/entry_points.txt +0 -0
- {nonebot_plugin_l4d2_server-1.0.9.dist-info → nonebot_plugin_l4d2_server-1.1.1.dist-info}/licenses/LICENSE +0 -0
@@ -42,7 +42,7 @@ from .l4_request import (
|
|
42
42
|
)
|
43
43
|
from .utils.api.request import L4API
|
44
44
|
from .utils.api.utils import out_msg_out
|
45
|
-
from .utils.utils import split_maohao
|
45
|
+
from .utils.utils import log_and_send, read_config, split_maohao, write_config
|
46
46
|
|
47
47
|
if TYPE_CHECKING:
|
48
48
|
from .utils.api.models import OutServer
|
@@ -131,6 +131,8 @@ async def _(
|
|
131
131
|
):
|
132
132
|
# 以后有时间补img格式
|
133
133
|
msg: str = args.extract_plain_text().strip()
|
134
|
+
if not msg:
|
135
|
+
return UniMessage.text("请在指令后添加要找的昵称哦")
|
134
136
|
tag_list: List[str] = msg.split(" ", maxsplit=1)
|
135
137
|
if len(tag_list) == 1:
|
136
138
|
await UniMessage.text("未设置组,正在全服查找,时间较长").send()
|
@@ -202,29 +204,15 @@ l4_add_ban = on_command("l4addban", aliases={"l4添加ban"})
|
|
202
204
|
@l4_add_ban.handle()
|
203
205
|
async def _(args: Message = CommandArg()):
|
204
206
|
arg = args.extract_plain_text().strip().split(" ")
|
205
|
-
|
206
207
|
if len(arg) != 2:
|
207
208
|
await UniMessage.text("请在命令后增加响应指令名和网址").finish()
|
208
209
|
|
209
|
-
|
210
|
-
config_data = {}
|
211
|
-
else:
|
212
|
-
try:
|
213
|
-
with config_path.open("r") as f:
|
214
|
-
config_data = json.load(f)
|
215
|
-
except (json.JSONDecodeError, FileNotFoundError):
|
216
|
-
config_data = {}
|
217
|
-
|
210
|
+
config_data = read_config(config_path)
|
218
211
|
config_data.update({arg[0]: arg[1]})
|
219
|
-
|
220
|
-
try:
|
221
|
-
with config_path.open("w") as f:
|
222
|
-
json.dump(config_data, f, ensure_ascii=False, indent=4)
|
223
|
-
except IOError as e:
|
224
|
-
await UniMessage.text(f"文件写入失败: {e}").finish()
|
212
|
+
write_config(config_path, config_data)
|
225
213
|
|
226
214
|
await L4API.get_sourceban(arg[0], arg[1])
|
227
|
-
await
|
215
|
+
await log_and_send(l4_add_ban, f"添加成功\n组名: {arg[0]}\n网址: {arg[1]}")
|
228
216
|
|
229
217
|
|
230
218
|
l4_del_ban = on_command("l4delban", aliases={"l4删除ban", "l4移除ban"})
|
@@ -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.
|
13
|
+
__version__ = "1.1.1"
|
14
14
|
TEXT_PATH = Path(__file__).parent / "texture2d"
|
15
15
|
HELP_DATA = Path(__file__).parent / "Help.json"
|
16
16
|
|
@@ -76,7 +76,7 @@ async def get_server_img(plugins: List[OutServer]) -> Optional[bytes]:
|
|
76
76
|
else:
|
77
77
|
template = env.get_template("normal.html")
|
78
78
|
content = await template.render_async(
|
79
|
-
|
79
|
+
servers=plugins,
|
80
80
|
max_count=config.l4_players,
|
81
81
|
)
|
82
82
|
return await html_to_pic(
|
@@ -86,5 +86,5 @@ async def get_server_img(plugins: List[OutServer]) -> Optional[bytes]:
|
|
86
86
|
template_path=f"file://{template_path.absolute()}",
|
87
87
|
)
|
88
88
|
except Exception as e:
|
89
|
-
logger.warning(f"Error in
|
89
|
+
logger.warning(f"Error in get_server_img: {e}")
|
90
90
|
return None
|
@@ -1,247 +1,205 @@
|
|
1
|
-
|
1
|
+
<!DOCTYPE html>
|
2
|
+
<html lang="zh-CN">
|
2
3
|
|
3
4
|
<head>
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
132
|
-
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
138
|
-
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
/* 绿色背景 */
|
148
|
-
color: white;
|
149
|
-
/* 白色文字 */
|
150
|
-
}
|
151
|
-
|
152
|
-
.full {
|
153
|
-
background-color: #f44336;
|
154
|
-
/* 红色背景 */
|
155
|
-
color: white;
|
156
|
-
/* 白色文字 */
|
157
|
-
}
|
158
|
-
|
159
|
-
.not_full {
|
160
|
-
background-color: #2196F3;
|
161
|
-
/* 蓝色背景 */
|
162
|
-
color: white;
|
163
|
-
/* 白色文字 */
|
164
|
-
}
|
165
|
-
</style>
|
5
|
+
<meta charset="UTF-8">
|
6
|
+
<title>Anne云服服务器状态</title>
|
7
|
+
<style>
|
8
|
+
body {
|
9
|
+
width: 900px;
|
10
|
+
margin: 0 auto;
|
11
|
+
/* 改为自动居中 */
|
12
|
+
font-family: 'Microsoft YaHei', 'Arial', sans-serif;
|
13
|
+
background-color: #f0f2f5;
|
14
|
+
padding: 10px 0;
|
15
|
+
/* 只保留上下padding */
|
16
|
+
}
|
17
|
+
|
18
|
+
.outer-frame {
|
19
|
+
width: 900px;
|
20
|
+
background-color: white;
|
21
|
+
border-radius: 12px;
|
22
|
+
box-shadow: 0 4px 12px rgba(0, 0, 0, 0.08);
|
23
|
+
overflow: hidden;
|
24
|
+
border: 1px solid #e0e3e7;
|
25
|
+
margin: 0 auto;
|
26
|
+
/* 确保居中 */
|
27
|
+
}
|
28
|
+
|
29
|
+
.container {
|
30
|
+
width: 880px;
|
31
|
+
/* 调整为更接近外层宽度 */
|
32
|
+
margin: 0 auto;
|
33
|
+
padding: 20px 10px;
|
34
|
+
/* 减少左右padding */
|
35
|
+
box-sizing: border-box;
|
36
|
+
}
|
37
|
+
|
38
|
+
h1 {
|
39
|
+
text-align: center;
|
40
|
+
color: #2c3e50;
|
41
|
+
margin: 0 0 20px 0;
|
42
|
+
padding-bottom: 10px;
|
43
|
+
border-bottom: 2px solid #eee;
|
44
|
+
font-size: 24px;
|
45
|
+
}
|
46
|
+
|
47
|
+
.server-grid {
|
48
|
+
display: grid;
|
49
|
+
grid-template-columns: repeat(3, 280px);
|
50
|
+
/* 调整为3列280px */
|
51
|
+
gap: 10px;
|
52
|
+
justify-content: center;
|
53
|
+
/* 确保居中 */
|
54
|
+
padding: 0 10px;
|
55
|
+
/* 添加内边距防止溢出 */
|
56
|
+
}
|
57
|
+
|
58
|
+
.server-card {
|
59
|
+
width: 100%;
|
60
|
+
/* 改为100%填充网格单元格 */
|
61
|
+
background-color: #fff;
|
62
|
+
border: 1px solid #e0e3e7;
|
63
|
+
border-radius: 8px;
|
64
|
+
padding: 12px;
|
65
|
+
box-sizing: border-box;
|
66
|
+
box-shadow: 0 2px 6px rgba(0, 0, 0, 0.03);
|
67
|
+
}
|
68
|
+
|
69
|
+
/* 其余样式保持不变... */
|
70
|
+
.server-name {
|
71
|
+
font-weight: bold;
|
72
|
+
font-size: 14px;
|
73
|
+
color: #3498db;
|
74
|
+
margin-bottom: 8px;
|
75
|
+
white-space: nowrap;
|
76
|
+
overflow: hidden;
|
77
|
+
text-overflow: ellipsis;
|
78
|
+
text-align: left;
|
79
|
+
}
|
80
|
+
|
81
|
+
.server-details {
|
82
|
+
display: grid;
|
83
|
+
grid-template-columns: 80px 1fr;
|
84
|
+
gap: 5px;
|
85
|
+
font-size: 12px;
|
86
|
+
}
|
87
|
+
|
88
|
+
.detail-label {
|
89
|
+
font-weight: bold;
|
90
|
+
color: #7f8c8d;
|
91
|
+
text-align: left;
|
92
|
+
}
|
93
|
+
|
94
|
+
.detail-value {
|
95
|
+
text-align: left;
|
96
|
+
}
|
97
|
+
|
98
|
+
.map-name {
|
99
|
+
font-size: 13px;
|
100
|
+
color: #e74c3c;
|
101
|
+
margin: 5px 0;
|
102
|
+
text-align: left;
|
103
|
+
font-style: normal;
|
104
|
+
padding-left: 5px;
|
105
|
+
}
|
106
|
+
|
107
|
+
.players {
|
108
|
+
text-align: left;
|
109
|
+
margin-top: 6px;
|
110
|
+
font-size: 12px;
|
111
|
+
padding-left: 0px;
|
112
|
+
}
|
113
|
+
|
114
|
+
.online {
|
115
|
+
color: #27ae60;
|
116
|
+
}
|
117
|
+
|
118
|
+
.offline {
|
119
|
+
color: #e74c3c;
|
120
|
+
}
|
121
|
+
|
122
|
+
.footer {
|
123
|
+
text-align: center;
|
124
|
+
margin-top: 20px;
|
125
|
+
color: #7f8c8d;
|
126
|
+
font-size: 12px;
|
127
|
+
border-top: 1px solid #eee;
|
128
|
+
padding-top: 10px;
|
129
|
+
}
|
130
|
+
|
131
|
+
.map-name:before,
|
132
|
+
.players:before {
|
133
|
+
margin-right: 5px;
|
134
|
+
}
|
135
|
+
|
136
|
+
.vac-icon {
|
137
|
+
width: 13px;
|
138
|
+
height: auto;
|
139
|
+
margin-left: 15px;
|
140
|
+
}
|
141
|
+
|
142
|
+
.platform {
|
143
|
+
width: 13px;
|
144
|
+
height: auto;
|
145
|
+
margin-left: 15px;
|
146
|
+
}
|
147
|
+
</style>
|
166
148
|
</head>
|
167
149
|
|
168
150
|
<body>
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
185
|
-
|
186
|
-
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
<div class="
|
204
|
-
|
205
|
-
{% set player_count = plugin.player|length %}
|
151
|
+
<div class="outer-frame">
|
152
|
+
<div class="container">
|
153
|
+
<h1>Anne云服服务器状态 (共 {{ servers|length }} 台)</h1>
|
154
|
+
|
155
|
+
<div class="server-grid">
|
156
|
+
{% for server in servers %}
|
157
|
+
<div class="server-card">
|
158
|
+
<div class="server-name" title="{{ server.server.server_name }}">
|
159
|
+
{{ server.server.server_name|replace('\n', ' ')|replace(' ', ' ')|trim }}
|
160
|
+
</div>
|
161
|
+
|
162
|
+
<div class="map-name" title="当前地图">
|
163
|
+
🗺️ {{ server.server.map_name }}
|
164
|
+
</div>
|
165
|
+
|
166
|
+
<div class="players">
|
167
|
+
{% if server.server.player_count >= 0 %}
|
168
|
+
<span class="online">
|
169
|
+
{% if server.server.max_players == 0 %}
|
170
|
+
🔴
|
171
|
+
{% elif server.server.player_count / server.server.max_players < 0.5 %} 🟢 {% elif
|
172
|
+
server.server.player_count>= server.server.max_players
|
173
|
+
%}
|
174
|
+
🟡
|
175
|
+
{% else %}
|
176
|
+
🔵
|
177
|
+
{% endif %}</span>
|
178
|
+
{{ server.server.player_count }}/{{ server.server.max_players}}
|
179
|
+
{% else %}
|
180
|
+
<span class="offline">🔴 错误</span>
|
181
|
+
{% endif %}
|
182
|
+
<img class="platform" src="{{server.server.platform}}.svg" width="13" height="13" />{% if server.server.vac_enabled %}<img class="vac-icon" src="vac.png">{% endif %}
|
183
|
+
<span class="platform">{{ (server.server.ping * 1000)|round(1) }} ms </span>
|
184
|
+
</div>
|
185
|
+
<div class="player">
|
186
|
+
{% set player_count = server.player|length %}
|
206
187
|
{% for i in range(max_count) %}
|
207
|
-
{% set player =
|
188
|
+
{% set player = server.player[i] if i < player_count else None %} {% if player and player.name %} <font
|
208
189
|
color="green">• {{ player.score }} | {{ player.name }}</font><br>
|
209
190
|
{% else %}
|
210
|
-
<!-- 如果玩家不存在或没有名字,则显示空行或占位符 -->
|
211
|
-
<br>
|
212
191
|
{% endif %}
|
213
192
|
{% endfor %}
|
214
193
|
</div>
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
<image xlink:href="m.svg" width="13" height="13" />
|
223
|
-
{% endif %}
|
224
|
-
<div class="package_name"> {{ plugin.server.player_count }}/{{ plugin.server.max_players }} </div>
|
225
|
-
{% if plugin.server.vac_enabled %}
|
226
|
-
<img class="vac-icon" src="vac.png">
|
227
|
-
{% else %}
|
228
|
-
{% endif %}
|
229
|
-
</div>
|
194
|
+
</div>
|
195
|
+
{% endfor %}
|
196
|
+
</div>
|
197
|
+
|
198
|
+
<div class="footer">
|
199
|
+
111
|
200
|
+
</div>
|
230
201
|
</div>
|
231
|
-
</div>
|
232
|
-
{% endfor %}
|
233
|
-
</div>
|
234
|
-
<div class="head">
|
235
|
-
<span class="loaded-text">
|
236
|
-
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20"
|
237
|
-
style="vertical-align: middle;">
|
238
|
-
<image xlink:href="github.svg" width="20" height="20" />
|
239
|
-
</svg>
|
240
|
-
<b style="vertical-align: middle;">插件:Agnes4m</b>
|
241
|
-
</span>
|
242
|
-
<span class="loaded-text"><b>©爱丽数码</b></span>
|
243
202
|
</div>
|
244
|
-
|
203
|
+
</body>
|
245
204
|
|
246
|
-
</html>
|
247
|
-
</body>
|
205
|
+
</html>
|
@@ -0,0 +1,247 @@
|
|
1
|
+
<html>
|
2
|
+
|
3
|
+
<head>
|
4
|
+
<style>
|
5
|
+
body {
|
6
|
+
margin: 0px;
|
7
|
+
zoom: 150%;
|
8
|
+
}
|
9
|
+
|
10
|
+
/* Vac图标样式 */
|
11
|
+
.vac-icon {
|
12
|
+
width: 13px;
|
13
|
+
height: auto;
|
14
|
+
margin-left: 190px;
|
15
|
+
}
|
16
|
+
|
17
|
+
.image {
|
18
|
+
display: flex;
|
19
|
+
flex-direction: column;
|
20
|
+
overflow: scroll;
|
21
|
+
width: max-content;
|
22
|
+
padding: 20px;
|
23
|
+
}
|
24
|
+
|
25
|
+
.head {
|
26
|
+
display: flex;
|
27
|
+
flex-direction: row;
|
28
|
+
align-items: center;
|
29
|
+
justify-content: space-between;
|
30
|
+
background-color: #f5f6f7;
|
31
|
+
padding-left: 20px;
|
32
|
+
padding-right: 20px;
|
33
|
+
padding-top: 10px;
|
34
|
+
padding-bottom: 10px;
|
35
|
+
border: 2px solid;
|
36
|
+
border-radius: 50px;
|
37
|
+
border-color: #e5e7eb;
|
38
|
+
font-size: 16px;
|
39
|
+
margin-bottom: 20px;
|
40
|
+
}
|
41
|
+
|
42
|
+
.plugins {
|
43
|
+
display: grid;
|
44
|
+
grid-template-columns: auto auto auto;
|
45
|
+
row-gap: 20px;
|
46
|
+
column-gap: 20px;
|
47
|
+
margin-bottom: 20px;
|
48
|
+
}
|
49
|
+
|
50
|
+
.plugin {
|
51
|
+
display: flex;
|
52
|
+
padding: 5px;
|
53
|
+
border: 1px solid;
|
54
|
+
border-radius: 5px;
|
55
|
+
border-color: #e5e7eb;
|
56
|
+
box-shadow: 0px 2px 6px 1px rgba(0, 0, 0, 0.2);
|
57
|
+
background-color: #f5f6f7;
|
58
|
+
}
|
59
|
+
|
60
|
+
.plugin_meta {
|
61
|
+
display: flex;
|
62
|
+
flex-direction: column;
|
63
|
+
padding: 5px;
|
64
|
+
width: 250px;
|
65
|
+
justify-content: space-between;
|
66
|
+
}
|
67
|
+
|
68
|
+
.plugin_name {
|
69
|
+
font-size: 20px;
|
70
|
+
}
|
71
|
+
|
72
|
+
.plugin_description {
|
73
|
+
font-size: 15px;
|
74
|
+
color: gray;
|
75
|
+
margin-top: 5px;
|
76
|
+
margin-bottom: 5px;
|
77
|
+
}
|
78
|
+
|
79
|
+
.plugin_meta_line1 {
|
80
|
+
display: flex;
|
81
|
+
flex-direction: row;
|
82
|
+
align-items: center;
|
83
|
+
justify-content: space-between;
|
84
|
+
}
|
85
|
+
|
86
|
+
.plugin_meta_line3 {
|
87
|
+
display: flex;
|
88
|
+
flex-direction: row;
|
89
|
+
align-items: center;
|
90
|
+
}
|
91
|
+
|
92
|
+
.package_name_label {
|
93
|
+
background-image: url(./fingerprint.svg);
|
94
|
+
width: 13px;
|
95
|
+
height: 13px;
|
96
|
+
margin-right: 8px;
|
97
|
+
}
|
98
|
+
|
99
|
+
.package_name {
|
100
|
+
font-size: 13px;
|
101
|
+
color: gray;
|
102
|
+
}
|
103
|
+
|
104
|
+
.switch {
|
105
|
+
position: relative;
|
106
|
+
display: inline-block;
|
107
|
+
width: 40px;
|
108
|
+
height: 24px;
|
109
|
+
}
|
110
|
+
|
111
|
+
.slider {
|
112
|
+
position: absolute;
|
113
|
+
cursor: pointer;
|
114
|
+
top: 0;
|
115
|
+
left: 0;
|
116
|
+
right: 0;
|
117
|
+
bottom: 0;
|
118
|
+
background-color: #ccc;
|
119
|
+
}
|
120
|
+
|
121
|
+
.slider.round {
|
122
|
+
border-radius: 24px;
|
123
|
+
}
|
124
|
+
|
125
|
+
.status_text {
|
126
|
+
position: absolute;
|
127
|
+
top: 50%;
|
128
|
+
left: 50%;
|
129
|
+
transform: translate(-50%, -50%);
|
130
|
+
white-space: nowrap;
|
131
|
+
/* 防止换行 */
|
132
|
+
padding: 2px 6px;
|
133
|
+
/* 添加一些内边距以增加可读性 */
|
134
|
+
border-radius: 16px;
|
135
|
+
/* 圆角 */
|
136
|
+
}
|
137
|
+
|
138
|
+
.error {
|
139
|
+
background-color: #999;
|
140
|
+
/* 灰色背景 */
|
141
|
+
color: white;
|
142
|
+
/* 白色文字 */
|
143
|
+
}
|
144
|
+
|
145
|
+
.lack {
|
146
|
+
background-color: #4CAF50;
|
147
|
+
/* 绿色背景 */
|
148
|
+
color: white;
|
149
|
+
/* 白色文字 */
|
150
|
+
}
|
151
|
+
|
152
|
+
.full {
|
153
|
+
background-color: #f44336;
|
154
|
+
/* 红色背景 */
|
155
|
+
color: white;
|
156
|
+
/* 白色文字 */
|
157
|
+
}
|
158
|
+
|
159
|
+
.not_full {
|
160
|
+
background-color: #2196F3;
|
161
|
+
/* 蓝色背景 */
|
162
|
+
color: white;
|
163
|
+
/* 白色文字 */
|
164
|
+
}
|
165
|
+
</style>
|
166
|
+
</head>
|
167
|
+
|
168
|
+
<body>
|
169
|
+
<div class="image">
|
170
|
+
<div class="head">
|
171
|
+
<span><b>已加载服务器</b></span>
|
172
|
+
<span>发送 “<b>查询指令+序号</b>” 查看详情</span>
|
173
|
+
</div>
|
174
|
+
<div class="plugins">
|
175
|
+
{% for plugin in plugins %}
|
176
|
+
<div class="plugin">
|
177
|
+
<div class="plugin_meta">
|
178
|
+
<div class="plugin_meta_line1">
|
179
|
+
<div class="plugin_name">{{ plugin.command }}{{ plugin.id_ }}:{{ plugin.server.server_name }}</div>
|
180
|
+
<div class="plugin_status">
|
181
|
+
<label class="switch">
|
182
|
+
<input class="checkbox" type="checkbox" {% if plugin.enabled %} checked {% endif %} />
|
183
|
+
<span
|
184
|
+
class="slider round {% if plugin.server.player_count >= plugin.server.max_players %} locked {% endif %}">
|
185
|
+
<span
|
186
|
+
class="lock {% if plugin.server.player_count >= plugin.server.max_players %} locked {% endif %}"></span>
|
187
|
+
<span
|
188
|
+
class="status_text {% if plugin.server.max_players == 0 %}error{% elif plugin.server.player_count / plugin.server.max_players < 0.5 %}lack{% elif plugin.server.player_count >= plugin.server.max_players %}full{% else %}not_full{% endif %}">
|
189
|
+
{% if plugin.server.max_players == 0 %}
|
190
|
+
错误
|
191
|
+
{% elif plugin.server.player_count / plugin.server.max_players < 0.5 %} 缺人 {% elif
|
192
|
+
plugin.server.player_count>= plugin.server.max_players
|
193
|
+
%}
|
194
|
+
已满
|
195
|
+
{% else %}
|
196
|
+
未满
|
197
|
+
{% endif %}
|
198
|
+
</span>
|
199
|
+
</span>
|
200
|
+
</label>
|
201
|
+
</div>
|
202
|
+
</div>
|
203
|
+
<div class="plugin_meta_line2">
|
204
|
+
<font color="blue">地图:{{ plugin.server.map_name }}</font><br>
|
205
|
+
{% set player_count = plugin.player|length %}
|
206
|
+
{% for i in range(max_count) %}
|
207
|
+
{% set player = plugin.player[i] if i < player_count else None %} {% if player and player.name %} <font
|
208
|
+
color="green">• {{ player.score }} | {{ player.name }}</font><br>
|
209
|
+
{% else %}
|
210
|
+
<!-- 如果玩家不存在或没有名字,则显示空行或占位符 -->
|
211
|
+
<br>
|
212
|
+
{% endif %}
|
213
|
+
{% endfor %}
|
214
|
+
</div>
|
215
|
+
<div class="plugin_meta_line3">
|
216
|
+
{% if plugin.server.platform == 'l' %}
|
217
|
+
<image xlink:href="l.svg" width="13" height="13" />
|
218
|
+
</svg>
|
219
|
+
{% elif plugin.server.platform == 'w' %}
|
220
|
+
<image xlink:href="w.svg" width="13" height="13" />
|
221
|
+
{% else %}
|
222
|
+
<image xlink:href="m.svg" width="13" height="13" />
|
223
|
+
{% endif %}
|
224
|
+
<div class="package_name"> {{ plugin.server.player_count }}/{{ plugin.server.max_players }} </div>
|
225
|
+
{% if plugin.server.vac_enabled %}
|
226
|
+
<img class="vac-icon" src="vac.png">
|
227
|
+
{% else %}
|
228
|
+
{% endif %}
|
229
|
+
</div>
|
230
|
+
</div>
|
231
|
+
</div>
|
232
|
+
{% endfor %}
|
233
|
+
</div>
|
234
|
+
<div class="head">
|
235
|
+
<span class="loaded-text">
|
236
|
+
<svg xmlns="http://www.w3.org/2000/svg" width="20" height="20" viewBox="0 0 20 20"
|
237
|
+
style="vertical-align: middle;">
|
238
|
+
<image xlink:href="github.svg" width="20" height="20" />
|
239
|
+
</svg>
|
240
|
+
<b style="vertical-align: middle;">插件:Agnes4m</b>
|
241
|
+
</span>
|
242
|
+
<span class="loaded-text"><b>©爱丽数码</b></span>
|
243
|
+
</div>
|
244
|
+
</div>
|
245
|
+
|
246
|
+
</html>
|
247
|
+
</body>
|
@@ -119,7 +119,8 @@ async def get_group_detail(
|
|
119
119
|
command: str,
|
120
120
|
):
|
121
121
|
server_json = _get_server_json(command, ALLHOST)
|
122
|
-
logger.debug(server_json)
|
122
|
+
# logger.debug(f"获取组服务器信息: {server_json}")
|
123
|
+
logger.info(server_json)
|
123
124
|
if server_json is None:
|
124
125
|
logger.warning("未找到这个组")
|
125
126
|
return None
|
@@ -212,12 +213,16 @@ async def tj_request(command: str = "云", tj="tj"):
|
|
212
213
|
|
213
214
|
|
214
215
|
async def server_find(
|
215
|
-
command: str = "
|
216
|
+
command: str = "",
|
216
217
|
_id: Optional[str] = None,
|
217
218
|
is_img: bool = True,
|
218
219
|
):
|
219
|
-
|
220
|
-
|
220
|
+
all_command = get_all_json_filenames()
|
221
|
+
server_json = []
|
222
|
+
for one_command in all_command:
|
223
|
+
server_j = _get_server_json(one_command, ALLHOST)
|
224
|
+
server_json.extend(server_j)
|
225
|
+
logger.info(server_json)
|
221
226
|
if server_json is None:
|
222
227
|
logger.warning("未找到这个组")
|
223
228
|
return None
|
@@ -239,3 +244,19 @@ async def server_find(
|
|
239
244
|
if isinstance(out_msg, str):
|
240
245
|
return UniMessage.text(out_msg)
|
241
246
|
return None
|
247
|
+
|
248
|
+
|
249
|
+
def get_all_json_filenames():
|
250
|
+
"""
|
251
|
+
获取 server_all_path 路径下所有 json 文件的文件名(不带扩展名)的列表。
|
252
|
+
"""
|
253
|
+
json_files = []
|
254
|
+
for item in server_all_path.iterdir():
|
255
|
+
if item.is_file() and item.suffix == ".json":
|
256
|
+
json_files.append(item.stem)
|
257
|
+
return json_files
|
258
|
+
|
259
|
+
|
260
|
+
# 使用示例
|
261
|
+
|
262
|
+
# all_json_names 现在是一个包含所有 json 文件名(不带扩展名)的 list
|
@@ -53,24 +53,7 @@ async def draw_one_ip(host: str, port: int, is_img: bool = config.l4_image):
|
|
53
53
|
完整的服务器信息字符串
|
54
54
|
"""
|
55
55
|
|
56
|
-
# 处理服务器类型显示
|
57
|
-
type_map = {
|
58
|
-
"d": "Dedicated",
|
59
|
-
"l": "Listen",
|
60
|
-
}
|
61
|
-
platform_map = {
|
62
|
-
"w": "Windows",
|
63
|
-
"l": "Linux",
|
64
|
-
}
|
65
|
-
# 解析原始数据 (例如 "d(w)" -> type='d', platform='w')
|
66
|
-
server_type = server.server_type[0] if server.server_type else "d"
|
67
|
-
platform = server.platform[0] if server.platform else "w"
|
68
|
-
|
69
|
-
# 处理VAC状态显示
|
70
56
|
vac_status = "启用" if server.vac_enabled else "禁用"
|
71
|
-
# 处理密码状态显示
|
72
|
-
pw_status = "是" if server.password_protected else "否"
|
73
|
-
|
74
57
|
msg = f"""-{server.server_name}-
|
75
58
|
游戏: {server.folder}
|
76
59
|
地图: {server.map_name}
|
@@ -78,9 +61,7 @@ async def draw_one_ip(host: str, port: int, is_img: bool = config.l4_image):
|
|
78
61
|
if server.ping is not None:
|
79
62
|
msg += f"""
|
80
63
|
延迟: {server.ping * 1000:.0f} ms
|
81
|
-
|
82
|
-
VAC : {vac_status}
|
83
|
-
密码: {pw_status}\n
|
64
|
+
VAC : {vac_status}\n
|
84
65
|
{player_info}"""
|
85
66
|
if config.l4_show_ip:
|
86
67
|
msg += f"""
|
@@ -22,11 +22,13 @@ def _get_server_json(
|
|
22
22
|
Returns:
|
23
23
|
Optional[list]: 服务器JSON列表,未找到组时返回None
|
24
24
|
"""
|
25
|
+
logger.debug(f"获取服务器组 {allhost} 的信息")
|
25
26
|
if command:
|
26
27
|
return allhost.get(command)
|
27
28
|
server_json = []
|
28
29
|
for servers in allhost.values():
|
29
30
|
server_json.extend(servers)
|
31
|
+
logger.debug(f"获取到的服务器组信息: {server_json}")
|
30
32
|
return server_json
|
31
33
|
|
32
34
|
|
@@ -13,6 +13,29 @@ from nonebot.log import logger
|
|
13
13
|
from nonebot_plugin_alconna import UniMessage
|
14
14
|
|
15
15
|
|
16
|
+
async def log_and_send(matcher, message: str, level="info"):
|
17
|
+
getattr(logger, level)(message)
|
18
|
+
await matcher.finish(UniMessage.text(message))
|
19
|
+
|
20
|
+
|
21
|
+
def read_config(config_path: Path) -> dict:
|
22
|
+
if not config_path.is_file():
|
23
|
+
return {}
|
24
|
+
try:
|
25
|
+
with config_path.open("r", encoding="utf-8") as f:
|
26
|
+
return json.load(f)
|
27
|
+
except (json.JSONDecodeError, FileNotFoundError):
|
28
|
+
return {}
|
29
|
+
|
30
|
+
|
31
|
+
def write_config(config_path: Path, data: dict) -> None:
|
32
|
+
try:
|
33
|
+
with config_path.open("w", encoding="utf-8") as f:
|
34
|
+
json.dump(data, f, ensure_ascii=False, indent=4)
|
35
|
+
except IOError as e:
|
36
|
+
raise RuntimeError(f"配置写入失败: {e}") from e
|
37
|
+
|
38
|
+
|
16
39
|
async def get_file(url: str, down_file: Path):
|
17
40
|
"""
|
18
41
|
下载指定Url到指定位置
|
{nonebot_plugin_l4d2_server-1.0.9.dist-info → nonebot_plugin_l4d2_server-1.1.1.dist-info}/METADATA
RENAMED
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: nonebot-plugin-l4d2-server
|
3
|
-
Version: 1.
|
3
|
+
Version: 1.1.1
|
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>
|
@@ -15,7 +15,7 @@ Classifier: Programming Language :: Python :: 3.12
|
|
15
15
|
Classifier: Operating System :: OS Independent
|
16
16
|
Project-URL: homepage, https://github.com/Agnes4m/nonebot_plugin_l4d2_server
|
17
17
|
Requires-Python: <4.0,>=3.9
|
18
|
-
Requires-Dist: nonebot2>=2.
|
18
|
+
Requires-Dist: nonebot2>=2.1.0
|
19
19
|
Requires-Dist: nonebot2[fastapi]>=2.3.3
|
20
20
|
Requires-Dist: nonebot-plugin-htmlrender>=0.3.0
|
21
21
|
Requires-Dist: nonebot-adapter-onebot>=2.4.4
|
{nonebot_plugin_l4d2_server-1.0.9.dist-info → nonebot_plugin_l4d2_server-1.1.1.dist-info}/RECORD
RENAMED
@@ -1,13 +1,13 @@
|
|
1
|
-
nonebot_plugin_l4d2_server-1.
|
2
|
-
nonebot_plugin_l4d2_server-1.
|
3
|
-
nonebot_plugin_l4d2_server-1.
|
4
|
-
nonebot_plugin_l4d2_server-1.
|
1
|
+
nonebot_plugin_l4d2_server-1.1.1.dist-info/METADATA,sha256=_Bj2RsGb9rLnhDDRRdkwznXXBtFxxoBHUEOa9Y7MspQ,6759
|
2
|
+
nonebot_plugin_l4d2_server-1.1.1.dist-info/WHEEL,sha256=tSfRZzRHthuv7vxpI4aehrdN9scLjk-dCJkPLzkHxGg,90
|
3
|
+
nonebot_plugin_l4d2_server-1.1.1.dist-info/entry_points.txt,sha256=6OYgBcLyFCUgeqLgnvMyOJxPCWzgy7se4rLPKtNonMs,34
|
4
|
+
nonebot_plugin_l4d2_server-1.1.1.dist-info/licenses/LICENSE,sha256=OXLcl0T2SZ8Pmy2_dmlvKuetivmyPd5m1q-Gyd-zaYY,35149
|
5
5
|
nonebot_plugin_l4d2_server/__init__.py,sha256=xzhXyprPmoTTjpfyqYlMweC4umuLsm8MERA1ZTqCyYc,1661
|
6
|
-
nonebot_plugin_l4d2_server/__main__.py,sha256
|
6
|
+
nonebot_plugin_l4d2_server/__main__.py,sha256=-m1tH_4T-9AP66V3Drb1t8CZXZMc0eAUXZsBY3LEBuI,10271
|
7
7
|
nonebot_plugin_l4d2_server/config.py,sha256=t4BYygrrLTcsl9oBnyce0-tDhMCCkMrkEPs4DX2t4KI,2682
|
8
8
|
nonebot_plugin_l4d2_server/data/font/loli.ttf,sha256=Yrh-RPoCrn1-NG94DR0x20ASXYUt8g3Ep6BCt3CdOFk,11125812
|
9
9
|
nonebot_plugin_l4d2_server/l4_help/Help.json,sha256=D0YmZYGW-imC7nVebkQ0_eODiqevQhL9aKj-cyBaqDY,1704
|
10
|
-
nonebot_plugin_l4d2_server/l4_help/__init__.py,sha256=
|
10
|
+
nonebot_plugin_l4d2_server/l4_help/__init__.py,sha256=jeC509sVXTBmOycZ9GZSTJuVFQba8U9HpA0Y7zykwZQ,1479
|
11
11
|
nonebot_plugin_l4d2_server/l4_help/draw.py,sha256=y6yDPUnoZFvwly8cf7g9HRpT1JXTxyA9DC1TuvUinTM,6448
|
12
12
|
nonebot_plugin_l4d2_server/l4_help/icon/介绍.png,sha256=3QC6A38QC-7gDBxmtQSQdbsz7hsefU5LL-oZmJ41zTk,3806
|
13
13
|
nonebot_plugin_l4d2_server/l4_help/icon/任务.png,sha256=nyZ4_kM21ZO95nwanCFnUfCGX-PkmJXYQf9OrJVKomY,3782
|
@@ -53,7 +53,7 @@ nonebot_plugin_l4d2_server/l4_help/texture2d/icon.png,sha256=A2p0r8aBXpNy_b_CtZT
|
|
53
53
|
nonebot_plugin_l4d2_server/l4_image/__init__.py,sha256=-GWXUDv_z_cfJ-wyvx5J3wB9P7ng4NzRHfCq-GZD6XQ,431
|
54
54
|
nonebot_plugin_l4d2_server/l4_image/convert.py,sha256=2wc72nyfEIjyOZS_98BrzD6G9xFzlD9GlsUGOjBLJV4,4132
|
55
55
|
nonebot_plugin_l4d2_server/l4_image/download.py,sha256=qRAo0Ggj5KV8RQN3LFJe547__wwC7Ww4QnT-v3pfe6w,3116
|
56
|
-
nonebot_plugin_l4d2_server/l4_image/html_img.py,sha256=
|
56
|
+
nonebot_plugin_l4d2_server/l4_image/html_img.py,sha256=BqypwfvrZ-mmrH-a4JBPXRPL6pVC6aqLX3v8623AQAE,2884
|
57
57
|
nonebot_plugin_l4d2_server/l4_image/image_tools.py,sha256=iHkvG2fYxYCz7B2JV69MSMlH5KXyWftcBs_prmyTyO4,14453
|
58
58
|
nonebot_plugin_l4d2_server/l4_image/img/anne/anne.html,sha256=8JOUXoWdulhoP2Axy_omuSDafbduKDZ9Y8Rz2VZWTso,1590
|
59
59
|
nonebot_plugin_l4d2_server/l4_image/img/anne/back.png,sha256=jnsYjnvd2BFcdkdsW8HgcSloWF0ZliPkqlWSIDnFUxw,245488
|
@@ -76,7 +76,8 @@ nonebot_plugin_l4d2_server/l4_image/img/template/fingerprint.svg,sha256=qtbdXb-5
|
|
76
76
|
nonebot_plugin_l4d2_server/l4_image/img/template/github.svg,sha256=Ev2CdWEyL4G-_bhZJ9vBZr5MEWjcgSR819mracoXjqc,1175
|
77
77
|
nonebot_plugin_l4d2_server/l4_image/img/template/l.svg,sha256=YbahWPd7uau6edcATiWrA8apYyrlKeTejuvRHwXkmLI,5484
|
78
78
|
nonebot_plugin_l4d2_server/l4_image/img/template/m.svg,sha256=JKosfpA8Jncw018dWHVzVR8orC48u3mMdzQovWAa91s,2428
|
79
|
-
nonebot_plugin_l4d2_server/l4_image/img/template/normal.html,sha256=
|
79
|
+
nonebot_plugin_l4d2_server/l4_image/img/template/normal.html,sha256=xMT37DxSC1w4IIDuSN589ZbEdnVgpBm7-8an5KZDy4g,6006
|
80
|
+
nonebot_plugin_l4d2_server/l4_image/img/template/normal_.html,sha256=TbHKy4cV-7rEVuE3dx75P1Pf9YKTIp8KW5JoaJFMenY,6610
|
80
81
|
nonebot_plugin_l4d2_server/l4_image/img/template/vac.png,sha256=sX2_qenkRakqP74Sq-FoBYBX1qS8gVYz9L07ijL2vlc,6741
|
81
82
|
nonebot_plugin_l4d2_server/l4_image/img/template/vac_white.png,sha256=3hpqIOp07FJhl9F15Mzc0LUMWQBAZhif8Ealb4doyoI,6045
|
82
83
|
nonebot_plugin_l4d2_server/l4_image/img/template/vue.css,sha256=2sGjCFrR-3tFMB_x7l4K6k40tZ5JVzhWqD759cagYBA,7874
|
@@ -85,13 +86,13 @@ nonebot_plugin_l4d2_server/l4_image/model.py,sha256=FGsCvf_BKbRNJUVy6I5BKnArMY-3
|
|
85
86
|
nonebot_plugin_l4d2_server/l4_image/vtfs.py,sha256=He_7zzEIOip8MXP55TS7aWPbzo6ac0wPf602nN3GWZM,1461
|
86
87
|
nonebot_plugin_l4d2_server/l4_local/__init__.py,sha256=gNNUNXGKHA8UXQaDKomND4VEutGpAghpYE4Va13gb5I,4736
|
87
88
|
nonebot_plugin_l4d2_server/l4_local/file.py,sha256=hew1Y8kV3uSZvUGplmi09EGKC89-sUJWsWV7SCEstI8,3067
|
88
|
-
nonebot_plugin_l4d2_server/l4_request/__init__.py,sha256=
|
89
|
-
nonebot_plugin_l4d2_server/l4_request/draw_msg.py,sha256=
|
90
|
-
nonebot_plugin_l4d2_server/l4_request/utils.py,sha256=
|
89
|
+
nonebot_plugin_l4d2_server/l4_request/__init__.py,sha256=6fSaWFUC-dgU5DWzdDxxcAV4-LwxSaIZbTn7UXE_H3g,8179
|
90
|
+
nonebot_plugin_l4d2_server/l4_request/draw_msg.py,sha256=5zMPPSUAUarInOugBUvZVNZjxTVNrg6kO3FOtSzVpKs,11482
|
91
|
+
nonebot_plugin_l4d2_server/l4_request/utils.py,sha256=VInMCBduIL0I3zLQ60Sq29gwZ3hbU4tRyOT94mJD-vo,5229
|
91
92
|
nonebot_plugin_l4d2_server/utils/api/api.py,sha256=auvDicCEKwvnm6EJYeCxCtugFby61K-zAmmaRWWEwtM,296
|
92
93
|
nonebot_plugin_l4d2_server/utils/api/models.py,sha256=p-hoxPHwadTaMRb2hqwfbaQ3pvJySrV8VbBmhA0Oi-M,2391
|
93
94
|
nonebot_plugin_l4d2_server/utils/api/request.py,sha256=JGAhMgPgmy2Z2w7w3GVlUGKBmxlaTTDD3bq1T2dhHIE,13567
|
94
95
|
nonebot_plugin_l4d2_server/utils/api/utils.py,sha256=rdrFK3VKP59KfNX-C8v0Q_IV3tBLm02Wo9axLTQQ87Y,762
|
95
96
|
nonebot_plugin_l4d2_server/utils/database/models.py,sha256=SLdcgwsn39r_ZkcBoqf4MLX1EfpCOjGBwWcR16u9Bqo,454
|
96
|
-
nonebot_plugin_l4d2_server/utils/utils.py,sha256=
|
97
|
-
nonebot_plugin_l4d2_server-1.
|
97
|
+
nonebot_plugin_l4d2_server/utils/utils.py,sha256=KHfnTO3a-rGpjhXTsXypC0xb61ijpON631zqjIAW2vo,6836
|
98
|
+
nonebot_plugin_l4d2_server-1.1.1.dist-info/RECORD,,
|
{nonebot_plugin_l4d2_server-1.0.9.dist-info → nonebot_plugin_l4d2_server-1.1.1.dist-info}/WHEEL
RENAMED
File without changes
|
File without changes
|
File without changes
|