diff --git a/astrbot/core/updator.py b/astrbot/core/updator.py index a6aca519..62d30cc7 100644 --- a/astrbot/core/updator.py +++ b/astrbot/core/updator.py @@ -32,9 +32,6 @@ class AstrBotUpdator(RepoZipUpdator): pass def _reboot(self, delay: int = 3): - if os.environ.get('TEST_MODE', 'off') == 'on': - logger.info("测试模式下不会重启。") - return py = sys.executable time.sleep(delay) self.terminate_child_processes() @@ -47,6 +44,9 @@ class AstrBotUpdator(RepoZipUpdator): async def check_update(self, url: str, current_version: str) -> ReleaseInfo: return await super().check_update(self.ASTRBOT_RELEASE_API, VERSION) + + async def get_releases(self) -> list: + return await self.fetch_release_info(self.ASTRBOT_RELEASE_API) async def update(self, reboot = False, latest = True, version = None, proxy = ""): update_data = await self.fetch_release_info(self.ASTRBOT_RELEASE_API, latest) diff --git a/astrbot/core/zip_updator.py b/astrbot/core/zip_updator.py index 67003a1b..19841cc8 100644 --- a/astrbot/core/zip_updator.py +++ b/astrbot/core/zip_updator.py @@ -34,10 +34,19 @@ class RepoZipUpdator(): result = await response.json() if not result: return [] - if latest: - ret = self.github_api_release_parser([result[0]]) - else: - ret = self.github_api_release_parser(result) + # if latest: + # ret = self.github_api_release_parser([result[0]]) + # else: + # ret = self.github_api_release_parser(result) + ret = [] + for release in result: + ret.append({ + "version": release['name'], + "published_at": release['published_at'], + "body": release['body'], + "tag_name": release['tag_name'], + "zipball_url": release['zipball_url'] + }) except BaseException: raise Exception("解析版本信息失败") return ret @@ -49,17 +58,10 @@ class RepoZipUpdator(): ''' ret = [] for release in releases: - version = release['name'] - commit_hash = '' - # 规范是: v3.0.7.xxxxxx,其中xxxxxx为 commit hash - _t = version.split(".") - if len(_t) == 4: - commit_hash = _t[3] ret.append({ "version": release['name'], "published_at": release['published_at'], "body": release['body'], - "commit_hash": commit_hash, "tag_name": release['tag_name'], "zipball_url": release['zipball_url'] }) @@ -114,15 +116,6 @@ class RepoZipUpdator(): release_url = f"https://github.com/{author}/{repo}/archive/refs/heads/master.zip" else: release_url = releases[0]['zipball_url'] - - # 镜像站点 - # match self.repo_mirror: - # case 'https://github-mirror.us.kg/': - # release_url = self.repo_mirror + release_url - # case "https://ghp.ci/": - # release_url = self.repo_mirror + release_url - # case _: - # pass if proxy: release_url = f"{proxy}/{release_url}" diff --git a/astrbot/dashboard/routes/update.py b/astrbot/dashboard/routes/update.py index b0eb45d8..630d50d2 100644 --- a/astrbot/dashboard/routes/update.py +++ b/astrbot/dashboard/routes/update.py @@ -13,6 +13,7 @@ class UpdateRoute(Route): super().__init__(context) self.routes = { '/update/check': ('GET', self.check_update), + '/update/releases': ('GET', self.get_releases), '/update/do': ('POST', self.update_project), '/update/dashboard': ('POST', self.update_dashboard), '/update/pip-install': ('POST', self.install_pip_package) @@ -46,6 +47,14 @@ class UpdateRoute(Route): except Exception as e: logger.warning(f"检查更新失败: {str(e)} (不影响除项目更新外的正常使用)") return Response().error(e.__str__()).__dict__ + + async def get_releases(self): + try: + ret = await self.astrbot_updator.get_releases() + return Response().ok(ret).__dict__ + except Exception as e: + logger.error(f"/api/update/releases: {traceback.format_exc()}") + return Response().error(e.__str__()).__dict__ async def update_project(self): data = await request.json diff --git a/dashboard/src/layouts/full/vertical-header/VerticalHeader.vue b/dashboard/src/layouts/full/vertical-header/VerticalHeader.vue index 8c9eb87c..042bec86 100644 --- a/dashboard/src/layouts/full/vertical-header/VerticalHeader.vue +++ b/dashboard/src/layouts/full/vertical-header/VerticalHeader.vue @@ -19,6 +19,18 @@ let botCurrVersion = ref(''); let dashboardHasNewVersion = ref(false); let dashboardCurrentVersion = ref(''); let version = ref(''); +let releases = ref([]); +let devCommits = ref([]); // 新增的 ref + +let tab = ref(0); + +let releasesHeader = [ + { title: '标签', key: 'tag_name' }, + { title: '发布时间', key: 'published_at' }, + { title: '内容', key: 'body' }, + { title: '源码地址', key: 'zipball_url' }, + { title: '操作', key: 'switch' } +]; const open = (link: string) => { window.open(link, '_blank'); @@ -83,6 +95,41 @@ function checkUpdate() { }); } +function getReleases() { + axios.get('/api/update/releases') + .then((res) => { + // releases.value = res.data.data; + // 更新 published_at 的时间为本地时间 + releases.value = res.data.data.map((item: any) => { + item.published_at = new Date(item.published_at).toLocaleString(); + return item; + }) + }) + .catch((err) => { + console.log(err); + }); +} + +function getDevCommits() { + fetch('https://api.github.com/repos/Soulter/AstrBot/commits', { + headers: { + 'Host': 'api.github.com', + 'Referer': 'https://api.github.com' + } + }) + .then(response => response.json()) + .then(data => { + devCommits.value = data.map((commit: any) => ({ + sha: commit.sha, + date: new Date(commit.commit.author.date).toLocaleString(), + message: commit.commit.message + })); + }) + .catch(err => { + console.log(err); + }); +} + function switchVersion(version: string) { updateStatus.value = '正在切换版本...'; axios.post('/api/update/do', { @@ -151,10 +198,10 @@ commonStore.getStartTime(); - + @@ -164,40 +211,80 @@ commonStore.getStartTime(); -

升级到项目最新版本

- 当前版本 {{ botCurrVersion }}
- 会同时尝试更新机器人主程序和管理面板。如果您正在使用 Docker 部署,也可以重新拉取镜像或者使用 watchtower 来自动监控拉取。 + 跳到旧版本或者切换到某个版本不会重新下载管理面板文件,这可能会造成部分数据显示错误。您可在 此处 + 找到对应的面板文件 dist.zip,解压后替换 data/dist 文件夹即可。当然,前端源代码在 dashboard 目录下,你也可以自己使用 npm install 和 npm build 构建。
-

{{ updateStatus }}

- - 更新到最新版本 + + + 正式版 + 开发版(master 分支) + + + + + + 当前版本 {{ botCurrVersion }} +

{{ updateStatus }}

+ + 更新到最新版本 + +
+ `更新到最新版本` 按钮会同时尝试更新机器人主程序和管理面板。如果您正在使用 Docker 部署,也可以重新拉取镜像或者使用 watchtower 来自动监控拉取。 +
+ + + + + +
+ + + +
+ + + +
+
+ +
+ +

手动输入版本号或 Commit SHA

+ + +
+ 如 v3.3.16 (不带 SHA) 或 42e5ec5d80b93b6bfe8b566754d45ffac4c3fe0b +
+ 查看 master 分支提交记录(点击右边的 copy + 即可复制) +
+ + 确定切换 - -
-

切换到项目指定版本或指定提交

-
- 跳到旧版本不会重新下载管理面板文件,这可能会造成部分数据显示错误。您可在 此处 - 找到对应的面板文件 dist.zip,解压后替换 data/dist 文件夹即可。 -
- -
- 如 v3.3.16 (不带 SHA) 或 42e5ec5d80b93b6bfe8b566754d45ffac4c3fe0b -
- 查看 master 分支提交记录(点击右边的 copy - 即可复制) -
- - 确定切换 - -
-

更新管理面板到最新版本

+

单独更新管理面板到最新版本

当前版本 {{ dashboardCurrentVersion }}
@@ -268,4 +355,4 @@ commonStore.getStartTime(); - + \ No newline at end of file