mirror of
https://github.com/langbot-app/LangBot.git
synced 2026-06-05 05:16:03 +00:00
Compare commits
7 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
5c10f520fb | ||
|
|
f8abe90674 | ||
|
|
964ad42cb4 | ||
|
|
424b970469 | ||
|
|
792366e221 | ||
|
|
79e970c4c3 | ||
|
|
d12acd5f31 |
4
.gitignore
vendored
4
.gitignore
vendored
@@ -9,4 +9,6 @@ plugins/
|
|||||||
/revcfg.py
|
/revcfg.py
|
||||||
prompts/
|
prompts/
|
||||||
logs/
|
logs/
|
||||||
sensitive.json
|
sensitive.json
|
||||||
|
temp/
|
||||||
|
current_tag
|
||||||
44
main.py
44
main.py
@@ -107,11 +107,18 @@ def reset_logging():
|
|||||||
def main(first_time_init=False):
|
def main(first_time_init=False):
|
||||||
global known_exception_caught
|
global known_exception_caught
|
||||||
|
|
||||||
# 检查并创建plugins、prompts目录
|
import config
|
||||||
check_path = ["plugins", "prompts"]
|
# 更新openai库到最新版本
|
||||||
for path in check_path:
|
if not hasattr(config, 'upgrade_dependencies') or config.upgrade_dependencies:
|
||||||
if not os.path.exists(path):
|
print("正在更新依赖库,请等待...")
|
||||||
os.mkdir(path)
|
if not hasattr(config, 'upgrade_dependencies'):
|
||||||
|
print("这个操作不是必须的,如果不想更新,请在config.py中添加upgrade_dependencies=False")
|
||||||
|
else:
|
||||||
|
print("这个操作不是必须的,如果不想更新,请在config.py中将upgrade_dependencies设置为False")
|
||||||
|
try:
|
||||||
|
ensure_dependencies()
|
||||||
|
except Exception as e:
|
||||||
|
print("更新openai库失败:{}, 请忽略或自行更新".format(e))
|
||||||
|
|
||||||
known_exception_caught = False
|
known_exception_caught = False
|
||||||
try:
|
try:
|
||||||
@@ -263,7 +270,7 @@ def main(first_time_init=False):
|
|||||||
import pkg.utils.updater
|
import pkg.utils.updater
|
||||||
try:
|
try:
|
||||||
if pkg.utils.updater.is_new_version_available():
|
if pkg.utils.updater.is_new_version_available():
|
||||||
pkg.utils.context.get_qqbot_manager().notify_admin("新版本可用,请发送 !update 进行自动更新")
|
pkg.utils.context.get_qqbot_manager().notify_admin("新版本可用,请发送 !update 进行自动更新\n更新日志:\n{}".format("\n".join(pkg.utils.updater.get_rls_notes())))
|
||||||
else:
|
else:
|
||||||
logging.info("当前已是最新版本")
|
logging.info("当前已是最新版本")
|
||||||
|
|
||||||
@@ -314,10 +321,20 @@ if __name__ == '__main__':
|
|||||||
if not os.path.exists('banlist.py'):
|
if not os.path.exists('banlist.py'):
|
||||||
shutil.copy('banlist-template.py', 'banlist.py')
|
shutil.copy('banlist-template.py', 'banlist.py')
|
||||||
|
|
||||||
# 检查是否有sensitive.json,
|
# 检查是否有sensitive.json
|
||||||
if not os.path.exists("sensitive.json"):
|
if not os.path.exists("sensitive.json"):
|
||||||
shutil.copy("sensitive-template.json", "sensitive.json")
|
shutil.copy("sensitive-template.json", "sensitive.json")
|
||||||
|
|
||||||
|
# 检查temp目录
|
||||||
|
if not os.path.exists("temp/"):
|
||||||
|
os.mkdir("temp/")
|
||||||
|
|
||||||
|
# 检查并创建plugins、prompts目录
|
||||||
|
check_path = ["plugins", "prompts"]
|
||||||
|
for path in check_path:
|
||||||
|
if not os.path.exists(path):
|
||||||
|
os.mkdir(path)
|
||||||
|
|
||||||
if len(sys.argv) > 1 and sys.argv[1] == 'init_db':
|
if len(sys.argv) > 1 and sys.argv[1] == 'init_db':
|
||||||
init_db()
|
init_db()
|
||||||
sys.exit(0)
|
sys.exit(0)
|
||||||
@@ -343,17 +360,4 @@ if __name__ == '__main__':
|
|||||||
# pkg.utils.configmgr.set_config_and_reload("quote_origin", False)
|
# pkg.utils.configmgr.set_config_and_reload("quote_origin", False)
|
||||||
requests.packages.urllib3.disable_warnings(InsecureRequestWarning)
|
requests.packages.urllib3.disable_warnings(InsecureRequestWarning)
|
||||||
|
|
||||||
import config
|
|
||||||
# 更新openai库到最新版本
|
|
||||||
if not hasattr(config, 'upgrade_dependencies') or config.upgrade_dependencies:
|
|
||||||
print("正在更新依赖库,请等待...")
|
|
||||||
if not hasattr(config, 'upgrade_dependencies'):
|
|
||||||
print("这个操作不是必须的,如果不想更新,请在config.py中添加upgrade_dependencies=False")
|
|
||||||
else:
|
|
||||||
print("这个操作不是必须的,如果不想更新,请在config.py中将upgrade_dependencies设置为False")
|
|
||||||
try:
|
|
||||||
ensure_dependencies()
|
|
||||||
except Exception as e:
|
|
||||||
print("更新openai库失败:{}, 请忽略或自行更新".format(e))
|
|
||||||
|
|
||||||
main(True)
|
main(True)
|
||||||
|
|||||||
@@ -1,4 +1,9 @@
|
|||||||
import datetime
|
import datetime
|
||||||
|
import logging
|
||||||
|
import os.path
|
||||||
|
|
||||||
|
import requests
|
||||||
|
import json
|
||||||
|
|
||||||
import pkg.utils.context
|
import pkg.utils.context
|
||||||
|
|
||||||
@@ -28,34 +33,100 @@ def pull_latest(repo_path: str) -> bool:
|
|||||||
return True
|
return True
|
||||||
|
|
||||||
|
|
||||||
|
def get_release_list() -> list:
|
||||||
|
"""获取发行列表"""
|
||||||
|
rls_list_resp = requests.get(
|
||||||
|
url="https://api.github.com/repos/RockChinQ/QChatGPT/releases"
|
||||||
|
)
|
||||||
|
|
||||||
|
rls_list = rls_list_resp.json()
|
||||||
|
|
||||||
|
return rls_list
|
||||||
|
|
||||||
|
|
||||||
|
def get_current_tag() -> str:
|
||||||
|
"""获取当前tag"""
|
||||||
|
current_tag = "v0.1.0"
|
||||||
|
if os.path.exists("current_tag"):
|
||||||
|
with open("current_tag", "r") as f:
|
||||||
|
current_tag = f.read()
|
||||||
|
|
||||||
|
return current_tag
|
||||||
|
|
||||||
|
|
||||||
def update_all() -> bool:
|
def update_all() -> bool:
|
||||||
"""使用dulwich更新源码"""
|
"""检查更新并下载源码"""
|
||||||
check_dulwich_closure()
|
current_tag = get_current_tag()
|
||||||
import dulwich
|
|
||||||
try:
|
|
||||||
before_commit_id = get_current_commit_id()
|
|
||||||
from dulwich import porcelain
|
|
||||||
repo = porcelain.open_repo('.')
|
|
||||||
porcelain.pull(repo)
|
|
||||||
|
|
||||||
change_log = ""
|
rls_list = get_release_list()
|
||||||
|
|
||||||
for entry in repo.get_walker():
|
latest_rls = {}
|
||||||
if str(entry.commit.id)[2:-1] == before_commit_id:
|
rls_notes = []
|
||||||
break
|
for rls in rls_list:
|
||||||
tz = datetime.timezone(datetime.timedelta(hours=entry.commit.commit_timezone // 3600))
|
rls_notes.append(rls['name']) # 使用发行名称作为note
|
||||||
dt = datetime.datetime.fromtimestamp(entry.commit.commit_time, tz)
|
if rls['tag_name'] == current_tag:
|
||||||
change_log += dt.strftime('%Y-%m-%d %H:%M:%S') + " [" + str(entry.commit.message, encoding="utf-8").strip()+"]\n"
|
break
|
||||||
|
|
||||||
if change_log != "":
|
if latest_rls == {}:
|
||||||
pkg.utils.context.get_qqbot_manager().notify_admin("代码拉取完成,更新内容如下:\n"+change_log)
|
latest_rls = rls
|
||||||
return True
|
logging.info("更新日志: {}".format(rls_notes))
|
||||||
else:
|
if latest_rls == {}: # 没有新版本
|
||||||
return False
|
return False
|
||||||
except ModuleNotFoundError:
|
|
||||||
raise Exception("dulwich模块未安装,请查看 https://github.com/RockChinQ/QChatGPT/issues/77")
|
# 下载最新版本的zip到temp目录
|
||||||
except dulwich.porcelain.DivergedBranches:
|
logging.info("开始下载最新版本: {}".format(latest_rls['zipball_url']))
|
||||||
raise Exception("分支不一致,自动更新仅支持master分支,请手动更新(https://github.com/RockChinQ/QChatGPT/issues/76)")
|
zip_url = latest_rls['zipball_url']
|
||||||
|
zip_resp = requests.get(url=zip_url)
|
||||||
|
zip_data = zip_resp.content
|
||||||
|
|
||||||
|
# 检查temp/updater目录
|
||||||
|
if not os.path.exists("temp"):
|
||||||
|
os.mkdir("temp")
|
||||||
|
if not os.path.exists("temp/updater"):
|
||||||
|
os.mkdir("temp/updater")
|
||||||
|
with open("temp/updater/{}.zip".format(latest_rls['tag_name']), "wb") as f:
|
||||||
|
f.write(zip_data)
|
||||||
|
|
||||||
|
logging.info("下载最新版本完成: {}".format("temp/updater/{}.zip".format(latest_rls['tag_name'])))
|
||||||
|
|
||||||
|
# 解压zip到temp/updater/<tag_name>/
|
||||||
|
import zipfile
|
||||||
|
# 检查目标文件夹
|
||||||
|
if os.path.exists("temp/updater/{}".format(latest_rls['tag_name'])):
|
||||||
|
import shutil
|
||||||
|
shutil.rmtree("temp/updater/{}".format(latest_rls['tag_name']))
|
||||||
|
os.mkdir("temp/updater/{}".format(latest_rls['tag_name']))
|
||||||
|
with zipfile.ZipFile("temp/updater/{}.zip".format(latest_rls['tag_name']), 'r') as zip_ref:
|
||||||
|
zip_ref.extractall("temp/updater/{}".format(latest_rls['tag_name']))
|
||||||
|
|
||||||
|
# 覆盖源码
|
||||||
|
source_root = ""
|
||||||
|
# 找到temp/updater/<tag_name>/中的第一个子目录路径
|
||||||
|
for root, dirs, files in os.walk("temp/updater/{}".format(latest_rls['tag_name'])):
|
||||||
|
if root != "temp/updater/{}".format(latest_rls['tag_name']):
|
||||||
|
source_root = root
|
||||||
|
break
|
||||||
|
|
||||||
|
# 覆盖源码
|
||||||
|
import shutil
|
||||||
|
for root, dirs, files in os.walk(source_root):
|
||||||
|
# 覆盖所有子文件子目录
|
||||||
|
for file in files:
|
||||||
|
src = os.path.join(root, file)
|
||||||
|
dst = src.replace(source_root, ".")
|
||||||
|
if os.path.exists(dst):
|
||||||
|
os.remove(dst)
|
||||||
|
shutil.copy(src, dst)
|
||||||
|
|
||||||
|
# 把current_tag写入文件
|
||||||
|
current_tag = latest_rls['tag_name']
|
||||||
|
with open("current_tag", "w") as f:
|
||||||
|
f.write(current_tag)
|
||||||
|
|
||||||
|
# 通知管理员
|
||||||
|
import pkg.utils.context
|
||||||
|
pkg.utils.context.get_qqbot_manager().notify_admin("已更新到最新版本: {}\n更新日志:\n{}\n新功能通常可以在config-template.py中看到,完整的更新日志请前往 https://github.com/RockChinQ/QChatGPT/releases 查看".format(current_tag, "\n".join(rls_notes)))
|
||||||
|
return True
|
||||||
|
|
||||||
|
|
||||||
def is_repo(path: str) -> bool:
|
def is_repo(path: str) -> bool:
|
||||||
@@ -132,15 +203,42 @@ def get_current_commit_id() -> str:
|
|||||||
|
|
||||||
def is_new_version_available() -> bool:
|
def is_new_version_available() -> bool:
|
||||||
"""检查是否有新版本"""
|
"""检查是否有新版本"""
|
||||||
check_dulwich_closure()
|
# 从github获取release列表
|
||||||
|
rls_list = get_release_list()
|
||||||
|
if rls_list is None:
|
||||||
|
return False
|
||||||
|
|
||||||
from dulwich import porcelain
|
# 获取当前版本
|
||||||
|
current_tag = get_current_tag()
|
||||||
|
|
||||||
repo = porcelain.open_repo('.')
|
# 检查是否有新版本
|
||||||
fetch_res = porcelain.ls_remote(porcelain.get_remote_repo(repo, "origin")[1])
|
for rls in rls_list:
|
||||||
|
if rls['tag_name'] == current_tag:
|
||||||
|
return False
|
||||||
|
else:
|
||||||
|
return True
|
||||||
|
|
||||||
current_commit_id = get_current_commit_id()
|
|
||||||
|
|
||||||
latest_commit_id = str(fetch_res[b'HEAD'])[2:-1]
|
def get_rls_notes() -> list:
|
||||||
|
"""获取更新日志"""
|
||||||
|
# 从github获取release列表
|
||||||
|
rls_list = get_release_list()
|
||||||
|
if rls_list is None:
|
||||||
|
return None
|
||||||
|
|
||||||
return current_commit_id != latest_commit_id
|
# 获取当前版本
|
||||||
|
current_tag = get_current_tag()
|
||||||
|
|
||||||
|
# 检查是否有新版本
|
||||||
|
rls_notes = []
|
||||||
|
for rls in rls_list:
|
||||||
|
if rls['tag_name'] == current_tag:
|
||||||
|
break
|
||||||
|
|
||||||
|
rls_notes.append(rls['name'])
|
||||||
|
|
||||||
|
return rls_notes
|
||||||
|
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
update_all()
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
requests~=2.28.1
|
requests~=2.28.1
|
||||||
openai~=0.27.0
|
openai~=0.27.0
|
||||||
pip~=22.3.1
|
|
||||||
dulwich~=0.21.3
|
dulwich~=0.21.3
|
||||||
colorlog~=6.6.0
|
colorlog~=6.6.0
|
||||||
yiri-mirai~=0.2.6.1
|
yiri-mirai~=0.2.6.1
|
||||||
|
|||||||
Reference in New Issue
Block a user