diff --git a/model/command/command.py b/model/command/command.py index 1c0cb6c79..009a51789 100644 --- a/model/command/command.py +++ b/model/command/command.py @@ -324,7 +324,7 @@ class Command: if len(l) == 1: try: update_info = util.updator.check_update() - update_info += "\nTips:\n输入「update latest」更新到最新版本\n输入「update r」重启机器人\n" + update_info += "\nTips:\n输入「update latest」更新到最新版本\n输入「update <版本号如v3.1.3>」切换到指定版本\n输入「update r」重启机器人\n" return True, update_info, "update" except BaseException as e: return False, "检查更新失败: "+str(e), "update" @@ -336,8 +336,18 @@ class Command: return True, "更新成功,重启生效。可输入「update r」重启", "update" except BaseException as e: return False, "更新失败: "+str(e), "update" - if l[1] == "r": + elif l[1] == "r": util.updator._reboot() + else: + if l[1].lower().startswith('v'): + try: + release_data = util.updator.request_release_info(latest=False) + util.updator.update_project(release_data, latest=False, version=l[1]) + return True, "更新成功,重启生效。可输入「update r」重启", "update" + except BaseException as e: + return False, "更新失败: "+str(e), "update" + else: + return False, "版本号格式错误", "update" def reset(self): return False @@ -364,6 +374,4 @@ class Command: return False def draw(self): - return False - - \ No newline at end of file + return False \ No newline at end of file diff --git a/util/updator.py b/util/updator.py index 7564301f0..a379cf8ce 100644 --- a/util/updator.py +++ b/util/updator.py @@ -33,12 +33,19 @@ def request_release_info(latest: bool = True) -> list: 请求版本信息。 返回一个列表,每个元素是一个字典,包含版本号、发布时间、更新内容、commit hash等信息。 ''' - api_url = "https://api.github.com/repos/Soulter/AstrBot/releases" - result = requests.get(api_url).json() - if latest: - ret = github_api_release_parser([result[0]]) - else: - ret = github_api_release_parser(result) + api_url1 = "https://api.github.com/repos/Soulter/AstrBot/releases" + api_url2 = "https://api.soulter.top/releases" # 0-10 分钟的缓存时间 + try: + result = requests.get(api_url2).json() + except BaseException as e: + result = requests.get(api_url1).json() + try: + if latest: + ret = github_api_release_parser([result[0]]) + else: + ret = github_api_release_parser(result) + except BaseException as e: + raise Exception(f"解析版本信息失败: {result}") return ret def github_api_release_parser(releases: list) -> list: @@ -48,7 +55,7 @@ def github_api_release_parser(releases: list) -> list: ''' ret = [] for release in releases: - version = release['tag_name'] + version = release['name'] commit_hash = '' # 规范是: v3.0.7.xxxxxx,其中xxxxxx为 commit hash _t = version.split(".") @@ -58,19 +65,25 @@ def github_api_release_parser(releases: list) -> list: "version": release['name'], "published_at": release['published_at'], "body": release['body'], - "commit_hash": commit_hash + "commit_hash": commit_hash, + "tag_name": release['tag_name'] }) return ret def check_update() -> str: repo = find_repo() - curr_commit = repo.head.commit.hexsha[:6] + curr_commit = repo.commit().hexsha update_data = request_release_info() new_commit = update_data[0]['commit_hash'] - if curr_commit == new_commit: + print(f"当前版本: {curr_commit}") + print(f"最新版本: {new_commit}") + if curr_commit.startswith(new_commit): return "当前已经是最新版本。" else: update_info = f"""有新版本可用。 +=== 当前版本 === +{curr_commit} + === 新版本 === {update_data[0]['version']} @@ -89,17 +102,17 @@ def update_project(update_data: list, # update_data = request_release_info(latest) if latest: # 检查本地commit和最新commit是否一致 - curr_commit = repo.head.commit.hexsha[:6] + curr_commit = repo.head.commit.hexsha new_commit = update_data[0]['commit_hash'] if curr_commit == '': raise Exception("无法获取当前版本号对应的版本位置。请联系项目维护者。") - if curr_commit == new_commit: + if curr_commit.startswith(new_commit): raise Exception("当前已经是最新版本。") else: # 更新到最新版本对应的commit try: repo.remotes.origin.fetch() - repo.git.checkout(new_commit) + repo.git.checkout(update_data[0]['tag_name']) if reboot: _reboot() except BaseException as e: raise e @@ -107,10 +120,10 @@ def update_project(update_data: list, # 更新到指定版本 flag = False for data in update_data: - if data['version'] == version: + if data['tag_name'] == version: try: repo.remotes.origin.fetch() - repo.git.checkout(data['commit_hash']) + repo.git.checkout(data['tag_name']) flag = True if reboot: _reboot() except BaseException as e: