nonebot-plugin-l4d2-server 0.5.1__py3-none-any.whl → 0.5.2__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.
- LICENSE +674 -674
- README.md +364 -359
- nonebot_plugin_l4d2_server/__init__.py +1 -1
- nonebot_plugin_l4d2_server/chrome.py +44 -44
- nonebot_plugin_l4d2_server/command.py +232 -232
- nonebot_plugin_l4d2_server/config.py +210 -210
- nonebot_plugin_l4d2_server/data/L4D2/image/template/anne.html +60 -60
- nonebot_plugin_l4d2_server/data/L4D2/image/template/fingerprint.svg +15 -15
- nonebot_plugin_l4d2_server/data/L4D2/image/template/help.html +233 -233
- nonebot_plugin_l4d2_server/data/L4D2/image/template/help_dack.html +231 -231
- nonebot_plugin_l4d2_server/data/L4D2/image/template/ip.html +48 -48
- nonebot_plugin_l4d2_server/data/L4D2/image/template/l.svg +9 -9
- nonebot_plugin_l4d2_server/l4d2_anne/__init__.py +251 -251
- nonebot_plugin_l4d2_server/l4d2_anne/analysis.py +51 -51
- nonebot_plugin_l4d2_server/l4d2_anne/anne_telecom.py +75 -75
- nonebot_plugin_l4d2_server/l4d2_anne/server.py +65 -65
- nonebot_plugin_l4d2_server/l4d2_anne/startand.py +17 -17
- nonebot_plugin_l4d2_server/l4d2_data/__init__.py +91 -91
- nonebot_plugin_l4d2_server/l4d2_data/config.py +17 -17
- nonebot_plugin_l4d2_server/l4d2_data/players.py +87 -87
- nonebot_plugin_l4d2_server/l4d2_data/serverip.py +32 -32
- nonebot_plugin_l4d2_server/l4d2_file/__init__.py +122 -122
- nonebot_plugin_l4d2_server/l4d2_file/ayromote.py +56 -56
- nonebot_plugin_l4d2_server/l4d2_file/remote.py +63 -63
- nonebot_plugin_l4d2_server/l4d2_image/__init__.py +103 -103
- nonebot_plugin_l4d2_server/l4d2_image/download.py +101 -101
- nonebot_plugin_l4d2_server/l4d2_image/htmlimg.py +32 -32
- nonebot_plugin_l4d2_server/l4d2_image/send_image_tool.py +32 -32
- nonebot_plugin_l4d2_server/l4d2_image/steam.py +83 -83
- nonebot_plugin_l4d2_server/l4d2_image/vtfs.py +40 -40
- nonebot_plugin_l4d2_server/l4d2_queries/__init__.py +114 -114
- nonebot_plugin_l4d2_server/l4d2_queries/api.py +43 -43
- nonebot_plugin_l4d2_server/l4d2_queries/ohter.py +35 -35
- nonebot_plugin_l4d2_server/l4d2_queries/qqgroup.py +288 -288
- nonebot_plugin_l4d2_server/l4d2_server/__init__.py +61 -61
- nonebot_plugin_l4d2_server/l4d2_server/rcon.py +28 -28
- nonebot_plugin_l4d2_server/l4d2_server/workshop.py +50 -50
- nonebot_plugin_l4d2_server/l4d2_web/web.py +234 -252
- nonebot_plugin_l4d2_server/l4d2_web/webUI.py +241 -245
- nonebot_plugin_l4d2_server/message.py +58 -58
- nonebot_plugin_l4d2_server/seach.py +33 -33
- nonebot_plugin_l4d2_server/txt_to_img.py +64 -64
- nonebot_plugin_l4d2_server/utils.py +272 -272
- {nonebot_plugin_l4d2_server-0.5.1.dist-info → nonebot_plugin_l4d2_server-0.5.2.dist-info}/LICENSE +674 -674
- {nonebot_plugin_l4d2_server-0.5.1.dist-info → nonebot_plugin_l4d2_server-0.5.2.dist-info}/METADATA +6 -1
- nonebot_plugin_l4d2_server-0.5.2.dist-info/RECORD +54 -0
- {nonebot_plugin_l4d2_server-0.5.1.dist-info → nonebot_plugin_l4d2_server-0.5.2.dist-info}/WHEEL +1 -1
- nonebot_plugin_l4d2_server-0.5.1.dist-info/RECORD +0 -54
@@ -1,35 +1,35 @@
|
|
1
|
-
try:
|
2
|
-
import ujson as json
|
3
|
-
except:
|
4
|
-
import json
|
5
|
-
from pathlib import Path
|
6
|
-
from typing import Dict,List
|
7
|
-
import os
|
8
|
-
|
9
|
-
BOT_DIR = os.path.dirname(os.path.abspath(__file__))
|
10
|
-
filename = 'data/L4D2/l4d2.json'
|
11
|
-
global_file = Path(Path(__file__).parent.parent,filename)
|
12
|
-
def load_josn():
|
13
|
-
# 本地模块
|
14
|
-
try:
|
15
|
-
LOCAL_HOST:dict = json.load(open(
|
16
|
-
filename, "r", encoding="utf8"))
|
17
|
-
except IOError or FileNotFoundError:
|
18
|
-
os.makedirs(os.path.dirname(filename), exist_ok=True)
|
19
|
-
data = {}
|
20
|
-
with open(filename, "w") as f:
|
21
|
-
json.dump(data, f)
|
22
|
-
LOCAL_HOST:dict = {}
|
23
|
-
try:
|
24
|
-
# 获取所有json文件的路径
|
25
|
-
json_files = Path('data/L4D2/l4d2').glob('*.json')
|
26
|
-
|
27
|
-
# 将所有json文件中的字典对象合并为一个字典
|
28
|
-
for file_path in json_files:
|
29
|
-
with open(file_path, 'r', encoding='utf-8') as f:
|
30
|
-
LOCAL_HOST.update(json.load(f))
|
31
|
-
except:
|
32
|
-
pass
|
33
|
-
return LOCAL_HOST
|
34
|
-
|
35
|
-
ALL_HOST:Dict[str, List[dict]] = load_josn()
|
1
|
+
try:
|
2
|
+
import ujson as json
|
3
|
+
except:
|
4
|
+
import json
|
5
|
+
from pathlib import Path
|
6
|
+
from typing import Dict,List
|
7
|
+
import os
|
8
|
+
|
9
|
+
BOT_DIR = os.path.dirname(os.path.abspath(__file__))
|
10
|
+
filename = 'data/L4D2/l4d2.json'
|
11
|
+
global_file = Path(Path(__file__).parent.parent,filename)
|
12
|
+
def load_josn():
|
13
|
+
# 本地模块
|
14
|
+
try:
|
15
|
+
LOCAL_HOST:dict = json.load(open(
|
16
|
+
filename, "r", encoding="utf8"))
|
17
|
+
except IOError or FileNotFoundError:
|
18
|
+
os.makedirs(os.path.dirname(filename), exist_ok=True)
|
19
|
+
data = {}
|
20
|
+
with open(filename, "w") as f:
|
21
|
+
json.dump(data, f)
|
22
|
+
LOCAL_HOST:dict = {}
|
23
|
+
try:
|
24
|
+
# 获取所有json文件的路径
|
25
|
+
json_files = Path('data/L4D2/l4d2').glob('*.json')
|
26
|
+
|
27
|
+
# 将所有json文件中的字典对象合并为一个字典
|
28
|
+
for file_path in json_files:
|
29
|
+
with open(file_path, 'r', encoding='utf-8') as f:
|
30
|
+
LOCAL_HOST.update(json.load(f))
|
31
|
+
except:
|
32
|
+
pass
|
33
|
+
return LOCAL_HOST
|
34
|
+
|
35
|
+
ALL_HOST:Dict[str, List[dict]] = load_josn()
|
@@ -1,288 +1,288 @@
|
|
1
|
-
from ..l4d2_data.serverip import L4D2Server
|
2
|
-
from ..l4d2_image import server_ip_pic
|
3
|
-
from . import queries,player_queries,queries_dict,player_queries_anne_dict,msg_ip_to_list,server_rule_dict
|
4
|
-
from nonebot.log import logger
|
5
|
-
import random
|
6
|
-
import asyncio
|
7
|
-
import re
|
8
|
-
from ..message import PRISON,QUEREN,KAILAO
|
9
|
-
from .ohter import ALL_HOST
|
10
|
-
from typing import List,Dict
|
11
|
-
try:
|
12
|
-
import ujson as json
|
13
|
-
except:
|
14
|
-
import json
|
15
|
-
si = L4D2Server()
|
16
|
-
errors = (ConnectionRefusedError,ConnectionResetError,asyncio.exceptions.TimeoutError,OSError)
|
17
|
-
# errors = (TypeError,KeyError,ValueError,ConnectionResetError,TimeoutError)
|
18
|
-
|
19
|
-
async def get_qqgroup_ip_msg(qqgroup):
|
20
|
-
"""首先,获取qq群订阅数据,再依次queries返回ip原标"""
|
21
|
-
ip_list = await si.query_server_ip(qqgroup)
|
22
|
-
return ip_list
|
23
|
-
|
24
|
-
async def bind_group_ip(group:int,host:str,port:int):
|
25
|
-
ip_list = await si.query_server_ip(group)
|
26
|
-
if (host,port) in ip_list:
|
27
|
-
return "本群已添加过该ip辣"
|
28
|
-
await si.bind_server_ip(group,host,port)
|
29
|
-
return "绑定成功喵,新增ip" + host
|
30
|
-
|
31
|
-
async def del_group_ip(group:int,number:int):
|
32
|
-
number = int(number)
|
33
|
-
logger.info(number)
|
34
|
-
try:
|
35
|
-
groups,host,port = await si.query_number(number)
|
36
|
-
except TypeError:
|
37
|
-
return '没有这个序号哦'
|
38
|
-
if groups != group:
|
39
|
-
return "本群可没有订阅过这个ip"
|
40
|
-
await si.del_server_ip(number)
|
41
|
-
return "取消成功喵,已删除序号" + str(number)
|
42
|
-
|
43
|
-
async def qq_ip_queries(msg:List[tuple]):
|
44
|
-
"""输入一个ip的二元元组组成的列表,返回一个输出消息的列表
|
45
|
-
未来作图这里重置"""
|
46
|
-
messsage = ""
|
47
|
-
for i in msg:
|
48
|
-
number,qqgroup,host,port = i
|
49
|
-
msg2 = await player_queries(host,port)
|
50
|
-
msg1 = await queries(host,port)
|
51
|
-
messsage += '序号、'+ str(number) + '\n' + msg1 + msg2 + '--------------------\n'
|
52
|
-
return messsage
|
53
|
-
|
54
|
-
|
55
|
-
async def qq_ip_querie(msg: list,igr:bool = True):
|
56
|
-
msg_list = []
|
57
|
-
tasks = [] # 用来保存异步任务
|
58
|
-
if msg != []:
|
59
|
-
for i in msg:
|
60
|
-
try:
|
61
|
-
number, host, port = i
|
62
|
-
qqgroup = ''
|
63
|
-
except ValueError:
|
64
|
-
number, qqgroup, host, port = i
|
65
|
-
finally:
|
66
|
-
# 将异步任务添加到任务列表中
|
67
|
-
tasks.append(asyncio.create_task(process_message(number, host, port, msg_list,qqgroup,igr)))
|
68
|
-
# 等待所有异步任务完成
|
69
|
-
await asyncio.gather(*tasks)
|
70
|
-
# 对msg_list按照number顺序排序
|
71
|
-
msg_list.sort(key=lambda x: x['number'])
|
72
|
-
for i in msg_list:
|
73
|
-
print(i)
|
74
|
-
break
|
75
|
-
result = {'msg_list': msg_list}
|
76
|
-
|
77
|
-
else:
|
78
|
-
result = {}
|
79
|
-
return result
|
80
|
-
|
81
|
-
|
82
|
-
async def qq_ip_queries_pic(msg: list,igr = False):
|
83
|
-
result = await qq_ip_querie(msg,igr)
|
84
|
-
if 'msg_list' in result:
|
85
|
-
pic = await server_ip_pic(result['msg_list'])
|
86
|
-
else:
|
87
|
-
pic = None
|
88
|
-
return pic
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
async def process_message(number, host, port, msg_list:list,igr:bool,qqgroup = ''):
|
94
|
-
try:
|
95
|
-
msg2 = await player_queries_anne_dict(host, port)
|
96
|
-
msg1 = await queries_dict(host, port)
|
97
|
-
msg3 = await server_rule_dict(host, port)
|
98
|
-
msg1.update({'Players':msg2,'number':number,})
|
99
|
-
msg1.update(msg3)
|
100
|
-
if qqgroup:
|
101
|
-
msg1.update({'tag':qqgroup})
|
102
|
-
msg_list.append(msg1)
|
103
|
-
except errors:
|
104
|
-
if igr:
|
105
|
-
pass
|
106
|
-
else:
|
107
|
-
# 空白字典
|
108
|
-
null_dict = {key: 'null' for key in ['name', 'map_', 'players', 'max_players', 'rank_players', 'ping']}
|
109
|
-
null_dict.update({'number':number,'ip':f'{host}:{port}','Players':[]})
|
110
|
-
msg_list.append(null_dict)
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
async def get_tan_jian(msg:List[tuple],mode:int):
|
115
|
-
"""获取anne列表抽一个"""
|
116
|
-
msg_list = []
|
117
|
-
random.shuffle(msg)
|
118
|
-
for i in msg:
|
119
|
-
number,host,port = i
|
120
|
-
try:
|
121
|
-
if mode == 1:
|
122
|
-
# 探监
|
123
|
-
msg2 = await player_queries_anne_dict(host,port)
|
124
|
-
point = 0
|
125
|
-
for i in msg2:
|
126
|
-
point += int(i['Score'])
|
127
|
-
logger.info(point)
|
128
|
-
msg1 = await queries_dict(host,port)
|
129
|
-
sp:str = msg1['name']
|
130
|
-
if '特' not in sp:
|
131
|
-
continue
|
132
|
-
sp = int(sp.split('特')[0].split('[')[-1])
|
133
|
-
points = point/4
|
134
|
-
if points/sp <10:
|
135
|
-
continue
|
136
|
-
if 'HT' in msg1['name']:
|
137
|
-
continue
|
138
|
-
msg1.update({'Players':msg2})
|
139
|
-
msg1.update({'ranks':point})
|
140
|
-
ips = f'{host}:{str(port)}'
|
141
|
-
msg1.update({'ips':ips})
|
142
|
-
# msg1是一行数据完整的字典
|
143
|
-
msg_list.append(msg1)
|
144
|
-
if mode == 2:
|
145
|
-
# 坐牢
|
146
|
-
# try:
|
147
|
-
msg1 = await queries_dict(host,port)
|
148
|
-
if '普通药役' in msg1['name']:
|
149
|
-
if '缺人' in msg1['name']:
|
150
|
-
msg2 = await player_queries_anne_dict(host,port)
|
151
|
-
msg1.update({'Players':msg2})
|
152
|
-
ips = f'{host}:{str(port)}'
|
153
|
-
msg1.update({'ips':ips})
|
154
|
-
# msg1是一行数据完整的字典
|
155
|
-
else:
|
156
|
-
continue
|
157
|
-
else:
|
158
|
-
continue
|
159
|
-
msg_list.append(msg1)
|
160
|
-
if mode == 3:
|
161
|
-
# 开牢
|
162
|
-
msg1 = await queries_dict(host,port)
|
163
|
-
if '[' not in msg1['name']:
|
164
|
-
msg2 = await player_queries_anne_dict(host,port)
|
165
|
-
msg1.update({'Players':msg2})
|
166
|
-
ips = f'{host}:{str(port)}'
|
167
|
-
msg1.update({'ips':ips})
|
168
|
-
# msg1是一行数据完整的字典
|
169
|
-
msg_list.append(msg1)
|
170
|
-
except errors:
|
171
|
-
continue
|
172
|
-
if msg_list != []:
|
173
|
-
break
|
174
|
-
# 随机选一个牢房
|
175
|
-
logger.info(msg_list)
|
176
|
-
if len(msg_list) == 0:
|
177
|
-
return '暂时没有这种牢房捏'
|
178
|
-
logger.info(len(msg_list))
|
179
|
-
mse = msg_list[0]
|
180
|
-
message:str = ''
|
181
|
-
if mode == 1:
|
182
|
-
ranks = mse['ranks']
|
183
|
-
if ranks <= 300 :
|
184
|
-
message = random.choice(PRISON[1])
|
185
|
-
if 300 < ranks <= 450 :
|
186
|
-
message = random.choice(PRISON[2])
|
187
|
-
if ranks > 450 :
|
188
|
-
message = random.choice(PRISON[3])
|
189
|
-
if mode == 2:
|
190
|
-
player_point = mse['players']
|
191
|
-
if player_point == '1':
|
192
|
-
message = random.choice(QUEREN[1])
|
193
|
-
elif player_point == '2':
|
194
|
-
message = random.choice(QUEREN[2])
|
195
|
-
elif player_point == '3':
|
196
|
-
message = random.choice(QUEREN[3])
|
197
|
-
else:
|
198
|
-
message = random.choice(QUEREN[4])
|
199
|
-
if mode == 3:
|
200
|
-
message = random.choice(KAILAO)
|
201
|
-
message += '\n' + '名称:' + mse['name'] + '\n'
|
202
|
-
message += '地图:' + mse['map_'] + '\n'
|
203
|
-
message += f"玩家:{mse['players']} / {mse['max_players']}\n"
|
204
|
-
print(mse['Players'])
|
205
|
-
try:
|
206
|
-
message += await msg_ip_to_list(mse['Players'])
|
207
|
-
except (KeyError):
|
208
|
-
message += '服务器里,是空空的呢\n'
|
209
|
-
message += 'connect ' + mse['ip']
|
210
|
-
return message
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
async def get_server_ip(number):
|
215
|
-
group,host,port = await si.query_number(number)
|
216
|
-
try:
|
217
|
-
return str(host) + ':' + str(port)
|
218
|
-
except TypeError:
|
219
|
-
return None
|
220
|
-
|
221
|
-
def split_maohao(msg:str) -> list:
|
222
|
-
"""分割大小写冒号"""
|
223
|
-
msg:list = re.split(":|:",msg.strip())
|
224
|
-
mse = [msg[0],msg[-1]] if len(msg)==2 else [msg[0],20715]
|
225
|
-
return mse
|
226
|
-
|
227
|
-
async def write_json(data_str: str):
|
228
|
-
"""
|
229
|
-
添加数据或者删除数据
|
230
|
-
- 【求生更新 添加 腐竹 ip 模式 序号】
|
231
|
-
- 【求生更新 添加 腐竹 ip 模式】
|
232
|
-
- 【求生更新 删除 腐竹 序号】
|
233
|
-
"""
|
234
|
-
data_list = data_str.split()
|
235
|
-
logger.info(data_list)
|
236
|
-
if data_list[0] == "添加":
|
237
|
-
add_server = {}
|
238
|
-
server_dict = ALL_HOST.get(data_list[1], {})
|
239
|
-
if not server_dict:
|
240
|
-
logger.info('新建分支')
|
241
|
-
ALL_HOST[data_list[1]] = []
|
242
|
-
for key, value in ALL_HOST.items():
|
243
|
-
if data_list[1] == key:
|
244
|
-
ids = [server['id'] for server in value]
|
245
|
-
# 序号
|
246
|
-
if len(data_list) == 4:
|
247
|
-
data_num = max(ids, default=0) + 1
|
248
|
-
add_server.update({'id': data_num})
|
249
|
-
elif len(data_list) == 5:
|
250
|
-
if not data_list[4].isdigit():
|
251
|
-
return '序号应该为大于0的正整数,请输入【求生更新 添加 腐竹 ip 模式 序号】'
|
252
|
-
data_num = int(data_list[4])
|
253
|
-
if data_num in ids:
|
254
|
-
return '该序号已存在,请尝试删除原序号【求生更新 删除 腐竹 序号】'
|
255
|
-
add_server.update({'id': data_num})
|
256
|
-
else:
|
257
|
-
return '输入参数错误,请输入【求生更新 添加 腐竹 ip 模式 序号】或【求生更新 添加 腐竹 ip 模式】'
|
258
|
-
# 模式,ip
|
259
|
-
try:
|
260
|
-
host, port = split_maohao(data_list[2])
|
261
|
-
add_server.update({'host': host, 'port': port})
|
262
|
-
except KeyError:
|
263
|
-
return 'ip格式不正确【114.11.4.514:9191】'
|
264
|
-
add_server.update({'version': data_list[3]})
|
265
|
-
value.append(add_server)
|
266
|
-
ALL_HOST[key] = value
|
267
|
-
with open('data/L4D2/l4d2.json', 'w', encoding='utf8') as f_new:
|
268
|
-
json.dump(ALL_HOST, f_new, ensure_ascii=False, indent=4)
|
269
|
-
return f'添加成功,指令为{key}{data_num}'
|
270
|
-
|
271
|
-
elif data_list[0] == "删除":
|
272
|
-
for key, value in ALL_HOST.items():
|
273
|
-
if data_list[1] == key:
|
274
|
-
try:
|
275
|
-
data_num = int(data_list[2])
|
276
|
-
except ValueError:
|
277
|
-
return '序号应该为大于0的正整数,请输入【求生更新 删除 腐竹 序号】'
|
278
|
-
for i, server in enumerate(value):
|
279
|
-
if data_num == server['id']:
|
280
|
-
value.pop(i)
|
281
|
-
if not value:
|
282
|
-
ALL_HOST.pop(key)
|
283
|
-
with open('data/L4D2/l4d2.json', 'w', encoding='utf8') as f_new:
|
284
|
-
json.dump(ALL_HOST, f_new, ensure_ascii=False, indent=4)
|
285
|
-
return '删除成功喵'
|
286
|
-
return '序号不正确,请输入【求生更新 删除 腐竹 序号】'
|
287
|
-
return '腐竹名不存在,请输入【求生更新 删除 腐竹 序号】'
|
288
|
-
|
1
|
+
from ..l4d2_data.serverip import L4D2Server
|
2
|
+
from ..l4d2_image import server_ip_pic
|
3
|
+
from . import queries,player_queries,queries_dict,player_queries_anne_dict,msg_ip_to_list,server_rule_dict
|
4
|
+
from nonebot.log import logger
|
5
|
+
import random
|
6
|
+
import asyncio
|
7
|
+
import re
|
8
|
+
from ..message import PRISON,QUEREN,KAILAO
|
9
|
+
from .ohter import ALL_HOST
|
10
|
+
from typing import List,Dict
|
11
|
+
try:
|
12
|
+
import ujson as json
|
13
|
+
except:
|
14
|
+
import json
|
15
|
+
si = L4D2Server()
|
16
|
+
errors = (ConnectionRefusedError,ConnectionResetError,asyncio.exceptions.TimeoutError,OSError)
|
17
|
+
# errors = (TypeError,KeyError,ValueError,ConnectionResetError,TimeoutError)
|
18
|
+
|
19
|
+
async def get_qqgroup_ip_msg(qqgroup):
|
20
|
+
"""首先,获取qq群订阅数据,再依次queries返回ip原标"""
|
21
|
+
ip_list = await si.query_server_ip(qqgroup)
|
22
|
+
return ip_list
|
23
|
+
|
24
|
+
async def bind_group_ip(group:int,host:str,port:int):
|
25
|
+
ip_list = await si.query_server_ip(group)
|
26
|
+
if (host,port) in ip_list:
|
27
|
+
return "本群已添加过该ip辣"
|
28
|
+
await si.bind_server_ip(group,host,port)
|
29
|
+
return "绑定成功喵,新增ip" + host
|
30
|
+
|
31
|
+
async def del_group_ip(group:int,number:int):
|
32
|
+
number = int(number)
|
33
|
+
logger.info(number)
|
34
|
+
try:
|
35
|
+
groups,host,port = await si.query_number(number)
|
36
|
+
except TypeError:
|
37
|
+
return '没有这个序号哦'
|
38
|
+
if groups != group:
|
39
|
+
return "本群可没有订阅过这个ip"
|
40
|
+
await si.del_server_ip(number)
|
41
|
+
return "取消成功喵,已删除序号" + str(number)
|
42
|
+
|
43
|
+
async def qq_ip_queries(msg:List[tuple]):
|
44
|
+
"""输入一个ip的二元元组组成的列表,返回一个输出消息的列表
|
45
|
+
未来作图这里重置"""
|
46
|
+
messsage = ""
|
47
|
+
for i in msg:
|
48
|
+
number,qqgroup,host,port = i
|
49
|
+
msg2 = await player_queries(host,port)
|
50
|
+
msg1 = await queries(host,port)
|
51
|
+
messsage += '序号、'+ str(number) + '\n' + msg1 + msg2 + '--------------------\n'
|
52
|
+
return messsage
|
53
|
+
|
54
|
+
|
55
|
+
async def qq_ip_querie(msg: list,igr:bool = True):
|
56
|
+
msg_list = []
|
57
|
+
tasks = [] # 用来保存异步任务
|
58
|
+
if msg != []:
|
59
|
+
for i in msg:
|
60
|
+
try:
|
61
|
+
number, host, port = i
|
62
|
+
qqgroup = ''
|
63
|
+
except ValueError:
|
64
|
+
number, qqgroup, host, port = i
|
65
|
+
finally:
|
66
|
+
# 将异步任务添加到任务列表中
|
67
|
+
tasks.append(asyncio.create_task(process_message(number, host, port, msg_list,qqgroup,igr)))
|
68
|
+
# 等待所有异步任务完成
|
69
|
+
await asyncio.gather(*tasks)
|
70
|
+
# 对msg_list按照number顺序排序
|
71
|
+
msg_list.sort(key=lambda x: x['number'])
|
72
|
+
for i in msg_list:
|
73
|
+
print(i)
|
74
|
+
break
|
75
|
+
result = {'msg_list': msg_list}
|
76
|
+
|
77
|
+
else:
|
78
|
+
result = {}
|
79
|
+
return result
|
80
|
+
|
81
|
+
|
82
|
+
async def qq_ip_queries_pic(msg: list,igr = False):
|
83
|
+
result = await qq_ip_querie(msg,igr)
|
84
|
+
if 'msg_list' in result:
|
85
|
+
pic = await server_ip_pic(result['msg_list'])
|
86
|
+
else:
|
87
|
+
pic = None
|
88
|
+
return pic
|
89
|
+
|
90
|
+
|
91
|
+
|
92
|
+
|
93
|
+
async def process_message(number, host, port, msg_list:list,igr:bool,qqgroup = ''):
|
94
|
+
try:
|
95
|
+
msg2 = await player_queries_anne_dict(host, port)
|
96
|
+
msg1 = await queries_dict(host, port)
|
97
|
+
msg3 = await server_rule_dict(host, port)
|
98
|
+
msg1.update({'Players':msg2,'number':number,})
|
99
|
+
msg1.update(msg3)
|
100
|
+
if qqgroup:
|
101
|
+
msg1.update({'tag':qqgroup})
|
102
|
+
msg_list.append(msg1)
|
103
|
+
except errors:
|
104
|
+
if igr:
|
105
|
+
pass
|
106
|
+
else:
|
107
|
+
# 空白字典
|
108
|
+
null_dict = {key: 'null' for key in ['name', 'map_', 'players', 'max_players', 'rank_players', 'ping']}
|
109
|
+
null_dict.update({'number':number,'ip':f'{host}:{port}','Players':[]})
|
110
|
+
msg_list.append(null_dict)
|
111
|
+
|
112
|
+
|
113
|
+
|
114
|
+
async def get_tan_jian(msg:List[tuple],mode:int):
|
115
|
+
"""获取anne列表抽一个"""
|
116
|
+
msg_list = []
|
117
|
+
random.shuffle(msg)
|
118
|
+
for i in msg:
|
119
|
+
number,host,port = i
|
120
|
+
try:
|
121
|
+
if mode == 1:
|
122
|
+
# 探监
|
123
|
+
msg2 = await player_queries_anne_dict(host,port)
|
124
|
+
point = 0
|
125
|
+
for i in msg2:
|
126
|
+
point += int(i['Score'])
|
127
|
+
logger.info(point)
|
128
|
+
msg1 = await queries_dict(host,port)
|
129
|
+
sp:str = msg1['name']
|
130
|
+
if '特' not in sp:
|
131
|
+
continue
|
132
|
+
sp = int(sp.split('特')[0].split('[')[-1])
|
133
|
+
points = point/4
|
134
|
+
if points/sp <10:
|
135
|
+
continue
|
136
|
+
if 'HT' in msg1['name']:
|
137
|
+
continue
|
138
|
+
msg1.update({'Players':msg2})
|
139
|
+
msg1.update({'ranks':point})
|
140
|
+
ips = f'{host}:{str(port)}'
|
141
|
+
msg1.update({'ips':ips})
|
142
|
+
# msg1是一行数据完整的字典
|
143
|
+
msg_list.append(msg1)
|
144
|
+
if mode == 2:
|
145
|
+
# 坐牢
|
146
|
+
# try:
|
147
|
+
msg1 = await queries_dict(host,port)
|
148
|
+
if '普通药役' in msg1['name']:
|
149
|
+
if '缺人' in msg1['name']:
|
150
|
+
msg2 = await player_queries_anne_dict(host,port)
|
151
|
+
msg1.update({'Players':msg2})
|
152
|
+
ips = f'{host}:{str(port)}'
|
153
|
+
msg1.update({'ips':ips})
|
154
|
+
# msg1是一行数据完整的字典
|
155
|
+
else:
|
156
|
+
continue
|
157
|
+
else:
|
158
|
+
continue
|
159
|
+
msg_list.append(msg1)
|
160
|
+
if mode == 3:
|
161
|
+
# 开牢
|
162
|
+
msg1 = await queries_dict(host,port)
|
163
|
+
if '[' not in msg1['name']:
|
164
|
+
msg2 = await player_queries_anne_dict(host,port)
|
165
|
+
msg1.update({'Players':msg2})
|
166
|
+
ips = f'{host}:{str(port)}'
|
167
|
+
msg1.update({'ips':ips})
|
168
|
+
# msg1是一行数据完整的字典
|
169
|
+
msg_list.append(msg1)
|
170
|
+
except errors:
|
171
|
+
continue
|
172
|
+
if msg_list != []:
|
173
|
+
break
|
174
|
+
# 随机选一个牢房
|
175
|
+
logger.info(msg_list)
|
176
|
+
if len(msg_list) == 0:
|
177
|
+
return '暂时没有这种牢房捏'
|
178
|
+
logger.info(len(msg_list))
|
179
|
+
mse = msg_list[0]
|
180
|
+
message:str = ''
|
181
|
+
if mode == 1:
|
182
|
+
ranks = mse['ranks']
|
183
|
+
if ranks <= 300 :
|
184
|
+
message = random.choice(PRISON[1])
|
185
|
+
if 300 < ranks <= 450 :
|
186
|
+
message = random.choice(PRISON[2])
|
187
|
+
if ranks > 450 :
|
188
|
+
message = random.choice(PRISON[3])
|
189
|
+
if mode == 2:
|
190
|
+
player_point = mse['players']
|
191
|
+
if player_point == '1':
|
192
|
+
message = random.choice(QUEREN[1])
|
193
|
+
elif player_point == '2':
|
194
|
+
message = random.choice(QUEREN[2])
|
195
|
+
elif player_point == '3':
|
196
|
+
message = random.choice(QUEREN[3])
|
197
|
+
else:
|
198
|
+
message = random.choice(QUEREN[4])
|
199
|
+
if mode == 3:
|
200
|
+
message = random.choice(KAILAO)
|
201
|
+
message += '\n' + '名称:' + mse['name'] + '\n'
|
202
|
+
message += '地图:' + mse['map_'] + '\n'
|
203
|
+
message += f"玩家:{mse['players']} / {mse['max_players']}\n"
|
204
|
+
print(mse['Players'])
|
205
|
+
try:
|
206
|
+
message += await msg_ip_to_list(mse['Players'])
|
207
|
+
except (KeyError):
|
208
|
+
message += '服务器里,是空空的呢\n'
|
209
|
+
message += 'connect ' + mse['ip']
|
210
|
+
return message
|
211
|
+
|
212
|
+
|
213
|
+
|
214
|
+
async def get_server_ip(number):
|
215
|
+
group,host,port = await si.query_number(number)
|
216
|
+
try:
|
217
|
+
return str(host) + ':' + str(port)
|
218
|
+
except TypeError:
|
219
|
+
return None
|
220
|
+
|
221
|
+
def split_maohao(msg:str) -> list:
|
222
|
+
"""分割大小写冒号"""
|
223
|
+
msg:list = re.split(":|:",msg.strip())
|
224
|
+
mse = [msg[0],msg[-1]] if len(msg)==2 else [msg[0],20715]
|
225
|
+
return mse
|
226
|
+
|
227
|
+
async def write_json(data_str: str):
|
228
|
+
"""
|
229
|
+
添加数据或者删除数据
|
230
|
+
- 【求生更新 添加 腐竹 ip 模式 序号】
|
231
|
+
- 【求生更新 添加 腐竹 ip 模式】
|
232
|
+
- 【求生更新 删除 腐竹 序号】
|
233
|
+
"""
|
234
|
+
data_list = data_str.split()
|
235
|
+
logger.info(data_list)
|
236
|
+
if data_list[0] == "添加":
|
237
|
+
add_server = {}
|
238
|
+
server_dict = ALL_HOST.get(data_list[1], {})
|
239
|
+
if not server_dict:
|
240
|
+
logger.info('新建分支')
|
241
|
+
ALL_HOST[data_list[1]] = []
|
242
|
+
for key, value in ALL_HOST.items():
|
243
|
+
if data_list[1] == key:
|
244
|
+
ids = [server['id'] for server in value]
|
245
|
+
# 序号
|
246
|
+
if len(data_list) == 4:
|
247
|
+
data_num = max(ids, default=0) + 1
|
248
|
+
add_server.update({'id': data_num})
|
249
|
+
elif len(data_list) == 5:
|
250
|
+
if not data_list[4].isdigit():
|
251
|
+
return '序号应该为大于0的正整数,请输入【求生更新 添加 腐竹 ip 模式 序号】'
|
252
|
+
data_num = int(data_list[4])
|
253
|
+
if data_num in ids:
|
254
|
+
return '该序号已存在,请尝试删除原序号【求生更新 删除 腐竹 序号】'
|
255
|
+
add_server.update({'id': data_num})
|
256
|
+
else:
|
257
|
+
return '输入参数错误,请输入【求生更新 添加 腐竹 ip 模式 序号】或【求生更新 添加 腐竹 ip 模式】'
|
258
|
+
# 模式,ip
|
259
|
+
try:
|
260
|
+
host, port = split_maohao(data_list[2])
|
261
|
+
add_server.update({'host': host, 'port': port})
|
262
|
+
except KeyError:
|
263
|
+
return 'ip格式不正确【114.11.4.514:9191】'
|
264
|
+
add_server.update({'version': data_list[3]})
|
265
|
+
value.append(add_server)
|
266
|
+
ALL_HOST[key] = value
|
267
|
+
with open('data/L4D2/l4d2.json', 'w', encoding='utf8') as f_new:
|
268
|
+
json.dump(ALL_HOST, f_new, ensure_ascii=False, indent=4)
|
269
|
+
return f'添加成功,指令为{key}{data_num}'
|
270
|
+
|
271
|
+
elif data_list[0] == "删除":
|
272
|
+
for key, value in ALL_HOST.items():
|
273
|
+
if data_list[1] == key:
|
274
|
+
try:
|
275
|
+
data_num = int(data_list[2])
|
276
|
+
except ValueError:
|
277
|
+
return '序号应该为大于0的正整数,请输入【求生更新 删除 腐竹 序号】'
|
278
|
+
for i, server in enumerate(value):
|
279
|
+
if data_num == server['id']:
|
280
|
+
value.pop(i)
|
281
|
+
if not value:
|
282
|
+
ALL_HOST.pop(key)
|
283
|
+
with open('data/L4D2/l4d2.json', 'w', encoding='utf8') as f_new:
|
284
|
+
json.dump(ALL_HOST, f_new, ensure_ascii=False, indent=4)
|
285
|
+
return '删除成功喵'
|
286
|
+
return '序号不正确,请输入【求生更新 删除 腐竹 序号】'
|
287
|
+
return '腐竹名不存在,请输入【求生更新 删除 腐竹 序号】'
|
288
|
+
|