-
Notifications
You must be signed in to change notification settings - Fork 33
/
setUp.py
391 lines (365 loc) · 16.4 KB
/
setUp.py
1
2
3
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
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
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
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
# -*- coding:utf-8 -*-
import logging
import os
import subprocess
import sys
import colorlog
import shutil
current_dir = os.getcwd()
parent_dir = os.path.dirname(current_dir)
# 检测parent_dir目录下是否有NTQQ_Launcher
NTQQ_Launcher_path = os.path.join(parent_dir, "NTQQ_Launcher")
if os.path.exists(NTQQ_Launcher_path):
# 如果有NTQQ_Launcher文件夹,则设置路径为parent_dir下的指定目录
git_path = os.path.join(parent_dir, "git","bin", "git.exe")
custom_python_path = os.path.join(parent_dir, "python", "python.exe")
python_path = custom_python_path
custom_pip_path = os.path.join(parent_dir, "python", "Scripts", "pip.exe")
pip_path = custom_pip_path
os.system(f"\"{python_path}\" -m pip install --upgrade pip")
#print("{pip_path} -m {custom_pip_path} install --upgrade pip")
# os.system(f"\"{python_path}\" -m pip install --upgrade pip")
print("检测到NTQQ_Launcher文件夹,使用对应文件夹下的git、python、pip")
else:
# 检测上一级目录下的environments/MinGit/cmd/git.exe是否存在
custom_git_path = os.path.join(parent_dir, "environments", "MinGit", "cmd", "git.exe")
if os.path.exists(custom_git_path):
git_path = custom_git_path
else:
git_path = "git"
custom_python_path = os.path.join(parent_dir, "environments", "Python39", "python.exe")
if os.path.exists(custom_python_path):
python_path = custom_python_path
else:
python_path = "python"
custom_pip_path = os.path.join(parent_dir, "environments", "Python39", "Scripts", "pip.exe")
if os.path.exists(custom_pip_path):
pip_path = custom_pip_path
else:
pip_path = "pip"
#print("未检测到NTQQ_Launcher文件夹,使用系统环境变量中的git、python、pip")
#print("git路径:", git_path)
#print("python路径:", python_path)
#print("pip路径:", pip_path)
def newLogger():
# 创建一个logger对象
logger = logging.getLogger("villia")
# 设置日志级别为DEBUG,这样可以输出所有级别的日志
logger.setLevel(logging.DEBUG)
# 创建一个StreamHandler对象,用于输出日志到控制台
console_handler = logging.StreamHandler()
# 设置控制台输出的日志格式和颜色
logger.propagate = False
console_format = '%(log_color)s%(asctime)s - %(name)s - %(levelname)s - %(message)s'
console_colors = {
'DEBUG': 'white',
'INFO': 'cyan',
'WARNING': 'yellow',
'ERROR': 'red',
'CRITICAL': 'bold_red',
}
console_formatter = colorlog.ColoredFormatter(console_format, log_colors=console_colors)
console_handler.setFormatter(console_formatter)
# 将控制台处理器添加到logger对象中
logger.addHandler(console_handler)
return logger
logger = newLogger()
def main():
print(
"""请输入要执行的指令:
1 绑定到远程仓库(整合包用不到,如果通过源码包安装请执行)
2 更新bot代码
3 清理无用数据(如缓存图片)
4 导出群信息,制作一个chatLearning可用的配置文件
5 游戏图片素材下载(如星穹铁道)
6 安装奶龙检测必要素材
7 安装vits功能对应依赖""")
a = input("输入要执行的数字")
if a=="1":
os.system(f"{git_path} init")
os.system(f"{git_path} remote add origin https://github.com/avilliai/Manyana.git")
print("正在添加文件.....这可能需要较长时间")
os.system(f"{git_path} add .")
print("over")
elif a=="2":
updaat()
elif a=="3":
print("执行清理缓存操作")
shutil.rmtree("data/pictures/benzi")
if not os.path.exists("data/pictures/benzi"):
os.mkdir("data/pictures/benzi")
aimdir = ["data/pictures/avatars", "data/voices", "data/music/musicCache", "data/pictures/cache",
"data/pictures/wallpaper", "data/blueArchive/arona", "data/blueArchive/cache", "data/Elo",
"data/arknights", "data/backrooms"]
for ib in aimdir:
ls1 = os.listdir(ib)
for i in ls1:
try:
os.remove(f"{ib}/" + i)
except:
continue
print("清理缓存完成")
elif a=="4":
import json
print("chatLearning: https://mirai.mamoe.net/topic/1018/chatlearning-%E8%AE%A9bot%E5%AD%A6%E4%BC%9A%E4%BD%A0%E7%9A%84%E7%BE%A4%E8%81%8A/8")
if os.path.exists("config.clc"):
with open("config.clc", "r", encoding="utf_8_sig") as ass:
p = json.loads(ass.read())
else:
p = {
"unmergegrouplist": [],
"learninggrouplist": [
628763673,
699455559
],
"replygrouplist": [
628763673,
699455559
],
"interval": 900,
"sendmode": 0,
"mergetime": 900,
"learning": 0,
"merge": 0,
"reply": 0,
"replychance": 50,
"admin": 0,
"Administrator": [
123456
],
"blackfreq": 5,
"voicereply": 0,
"voicereplychance": 20,
"synthesizer": "",
"version": "3.0.3",
"tag": {},
"singlereplychance": {},
"singlevoicereplychance": {},
"typefreq": {},
"tempmessagenum": 32,
"fastdelete": 0,
"replywait": [
0,
0
],
"voicecharerror": "存在违规字符,转换失败",
"voicecderror": "转换冷却中",
"voicelengtherror": "长度超过限制",
"deletesuccess": "已从词库内删除!",
"deletetemperror": "删除失败,该消息已不在缓存内",
"deletefinderror": "删除失败,词库中已无法找到该答案",
"replycd": 3,
"stopsign": 0,
"voicecommand": "快说 ",
"cosmatch": 0,
"cosmatching": 0.5,
"botname": [
"我"
],
"replylength": 100,
"atreply": 1
}
file1 = open('data/music/groups.txt', 'r')
js1 = file1.read()
js1 = json.loads(js1)
file1.close()
da = js1.keys()
print(list(da), type(list(da)))
p["replygrouplist"] = list(da)
p["learninggrouplist"] = list(da)
ja = json.dumps(p,ensure_ascii=False,indent=1)
with open("config.clc", "w", encoding="utf_8_sig",newline='\n') as fp:
fp.write(ja)
print("完毕,请用config.clc覆盖chatLearning文件夹下同名文件")
elif a=="5":
logger.info("图片素材下载/更新\n输入要执行的指令:\n1 下载/更新星穹铁道资源")
orderP=input("在这里输入指令:")
if orderP=="1":
if os.path.exists("./data/star-rail-atlas"):
os.chdir("./data")
logger.info("文件夹已存在,进入更新模式")
os.system(f"{git_path} pull https://gitee.com/Nwflower/star-rail-atlas.git")
else:
os.chdir("./data")
logger.info("文件夹不存在,拉取素材")
os.system(f"{git_path} clone https://gitee.com/Nwflower/star-rail-atlas.git")
elif a=="6":
logger.info("开始安装奶龙检测必要素材")
os.system(f"\"{python_path}\" -m pip config set global.index-url https://mirrors.aliyun.com/pypi/simple/")
os.system(f"\"{python_path}\" -m pip install --upgrade torch")
os.system(f"\"{python_path}\" -m pip install --upgrade torchvision")
os.system(f"\"{python_path}\" -m pip install --upgrade opencv-python")
elif a=="7":
logger.info("开始安装vits语音模块相关依赖")
os.system(f"\"{python_path}\" -m pip install -r vits/vitsRequirements.txt")
else:
print("结束")
def updaat(f=False,jump=False,source=None):
if jump==False:
logger.warning("是否补全依赖?如已使用最新整合包请输入1以跳过。(更新的新功能可能需要执行此步骤)。可以按1跳过,如果更新后启动报错/提示功能无法启用,请回来执行这一步")
if input("在这里输入:") != "1":
logger.warning("即将开始更新依赖库,请确保已关闭代理,否则无法安装依赖库")
input("按任意键继续:")
os.system(f"\"{python_path}\" -m pip config set global.index-url https://mirrors.aliyun.com/pypi/simple/")
#print(str(custom_pip_path)+"!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!5555555!!!!!!!!!!!!!!!")
os.system(f"\"{python_path}\" -m pip install --upgrade jmcomic")
os.system(f"\"{python_path}\" -m pip install img2pdf")
os.system(f"\"{python_path}\" -m pip install --upgrade lanzou-api")
os.system(f"\"{python_path}\" -m pip install --upgrade pytubefix")
os.system(f"\"{python_path}\" -m pip install --upgrade PicImageSearch")
os.system(f"\"{python_path}\" -m pip install httpx==0.27.2")
if source==None:
logger.info("拉取bot代码\n--------------------")
logger.info("选择更新源(git源 镜像源相互兼容):\n1 git源\n2 git代理源1\n3 git代理源2 \n4 国内源(没事别几把用这个)")
source = input("选择更新源(输入数字 ):")
else:
source=str(source)
if source == "1":
# os.system("git pull https://github.com/avilliai/Manyana.git")
# 启动进程
p = subprocess.Popen([f'{git_path}', 'pull', 'https://github.com/avilliai/Manyana.git'], stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
elif source=="2":
p = subprocess.Popen([f'{git_path}', 'pull', 'https://github.moeyy.xyz/https://github.com/avilliai/Manyana'], stdout=subprocess.PIPE,
stderr=subprocess.PIPE)
elif source=="3":
p=subprocess.Popen([f'{git_path}', 'pull', 'https://mirror.ghproxy.com/https://github.com/avilliai/Manyana'], stdout=subprocess.PIPE,stderr=subprocess.PIPE)
elif source=="4":
p=subprocess.Popen([f'{git_path}', 'pull', 'https://www.gitlink.org.cn/lux-QAQ/Manyana'], stdout=subprocess.PIPE,stderr=subprocess.PIPE)
else:
logger.error("无效输入,重新执行")
updaat()
# 获取进程的输出和错误信息
stdout, stderr = p.communicate()
stdout = stdout.decode('utf-8', errors='ignore')
stderr = stderr.decode('utf-8', errors='ignore')
logger.info(stdout)
logger.warning(stderr)
# 标记是否在错误信息中
in_error_info = False
# 存放冲突文件名的列表
conflict_files = []
if f==True:
if os.path.exists("./temp"):
if len(os.listdir("./config")) != 14:
logger.error("文件数目异常,请参考远程仓库config文件夹https://github.com/avilliai/Manyana/tree/main/config补全缺失文件。")
input("如已补全请按任意键继续:")
for i in os.listdir("./temp"):
logger.info("开始处理"+i)
if os.path.exists("config/"+i):
conflict_file_dealter("./temp/"+i,"config/"+i)
if os.path.exists("./temp/conflict " + i):
os.remove("./temp/conflict " + i)
os.rename("./temp/" + i, "./temp/conflict " + i)
elif os.path.exists("data/"+i):
conflict_file_dealter("./temp/"+i,"data/"+i)
if os.path.exists("./temp/conflict " + i):
os.remove("./temp/conflict " + i)
os.rename("./temp/" + i, "./temp/conflict " + i)
else:
continue
#shutil.rmtree("./temp")
logger.info("处理冲突文件完成")
logger.info("旧的冲突文件被保存到了temp文件夹,以防万一你需要它们。")
logger.info("你可以关闭此窗口了")
logger.warning("如果出现启动闪退,重新执行更新脚本,不要跳过 补全依赖 环节,执行结束后即可正常启动")
input()
# 逐行检查错误信息
for line in stderr.split('\n'):
# 标记冲突文件名开始位置
if 'error: Your local changes to the following files would be overwritten by merge:' in line:
in_error_info = True
continue # 结束当前循环,进入下一个循环
elif 'error: 您对下列文件的本地修改将被合并操作覆盖:' in line:
in_error_info=True
continue
# 标记冲突文件名结束位置
if 'Please commit your changes or stash them before you merge.' in line:
in_error_info = False
elif '请在合并前提交或贮藏您的修改。' in line:
in_error_info=False
# 将冲突文件名添加到列表
if in_error_info:
conflict_files.append(line.strip())
# 显示冲突的文件列表
for file in conflict_files:
print('冲突文件:', file)
logger.warning("开始处理冲突文件")
if file.endswith(".py"):
os.remove(file)
try:
shutil.os.remove(file)
except:
pass
logger.warning("移除了" + file)
elif file.endswith(".yaml"):
logger.info("冲突的配置文件" + file)
logger.warning("开始处理冲突文件.....读取中")
if os.path.exists("./temp"):
try:
shutil.copyfile(file, file.replace("config/", "temp/").replace("data/","temp/"))
os.remove(file)
try:
shutil.os.remove(file)
except:
pass
except:
continue
else:
os.mkdir("./temp")
shutil.copyfile(file, file.replace("config", "temp").replace("data","temp"))
os.remove(file)
try:
shutil.os.remove(file)
except:
pass
else:
os.remove(file)
try:
shutil.os.remove(file)
except:
pass
logger.warning("移除了 " + file)
#logger.warning("请自行决定删除或修改文件名称,在重新拉取后根据旧文件重新填写新文件")
logger.warning("开始处理冲突文件")
logger.info("即将再次执行拉取操作")
updaat(True,True,str(source))
# 不要忘了等待进程结束
p.wait()
logger.info("结束")
logger.info("如更新成功请自行查看 更新日志.yaml")
# 创建一个YAML对象来加载和存储YAML数据
try:
from ruamel.yaml import YAML
except Exception as e:
logger.error("未安装ruamel.yaml库,无法处理冲突文件,开始安装缺少的依赖")
os.system(f"\"{python_path}\" -m pip install ruamel.yaml")
from ruamel.yaml import YAML
# 创建一个YAML对象来加载和存储YAML数据
yaml = YAML()
def merge_dicts(old, new):
for k, v in old.items():
# 如果值是一个字典,并且键在新的yaml文件中,那么我们就递归地更新键值对
if isinstance(v, dict) and k in new and isinstance(new[k], dict):
merge_dicts(v, new[k])
# 如果键在新的yaml文件中,我们就更新它的值
elif k in new:
logger.info("更新key"+str(k)+" value"+str(v))
new[k] = v
def conflict_file_dealter(file_old='old_aiReply.yaml', file_new='new_aiReply.yaml'):
# 加载旧的YAML文件
with open(file_old, 'r',encoding="utf-8") as file:
old_data = yaml.load(file)
# 加载新的YAML文件
with open(file_new, 'r',encoding="utf-8") as file:
new_data = yaml.load(file)
# 遍历旧的YAML数据并更新新的YAML数据中的相应值
merge_dicts(old_data, new_data)
# 把新的YAML数据保存到新的文件中
with open(file_new, 'w',encoding="utf-8") as file:
yaml.dump(new_data, file)
# 添加远程仓库
# 获取远程更新并合并到本地
if __name__ == '__main__':
main()
input("按任意键退出.")