import { version } from "../../version"; import * as path from "node:path"; import * as fs from "node:fs"; import { copyFolder, httpDownload, log, PLUGIN_DIR, TEMP_DIR } from "."; import compressing from "compressing"; const downloadMirrorHosts = ["https://mirror.ghproxy.com/"]; const checkVersionMirrorHosts = ["https://521github.com"]; export async function checkVersion() { const latestVersionText = await getRemoteVersion(); const latestVersion = latestVersionText.split("."); log("llonebot last version", latestVersion); const currentVersion: string[] = version.split("."); for (let k of [0, 1, 2]) { if (parseInt(latestVersion[k]) > parseInt(currentVersion[k])) { return { result: false, version: latestVersionText }; } } return { result: true, version: version }; } export async function upgradeLLOneBot() { const latestVersion = await getRemoteVersion(); if (latestVersion && latestVersion != "") { const downloadUrl = "https://github.com/LLOneBot/LLOneBot/releases/download/v" + latestVersion + "/LLOneBot.zip"; const filePath = path.join(TEMP_DIR, "./update-" + latestVersion + ".zip"); let downloadSuccess = false; // 多镜像下载 for (const mirrorGithub of downloadMirrorHosts) { try { const buffer = await httpDownload(mirrorGithub + downloadUrl); fs.writeFileSync(filePath, buffer) downloadSuccess = true; break; } catch (e) { log("llonebot upgrade error", e); } } if (!downloadSuccess) { log("llonebot upgrade error", "download failed"); return false; } const temp_ver_dir = path.join(TEMP_DIR, "LLOneBot" + latestVersion); let uncompressedPromise = async function () { return new Promise<boolean>((resolve, reject) => { compressing.zip.uncompress(filePath, temp_ver_dir).then(() => { resolve(true); }).catch((reason: any) => { log("llonebot upgrade failed, ", reason); if (reason?.errno == -4082) { resolve(true); } resolve(false); }); }); } const uncompressedResult = await uncompressedPromise(); // 复制文件 await copyFolder(temp_ver_dir, PLUGIN_DIR); return uncompressedResult; } return false; } export async function getRemoteVersion() { let Version = ""; for (let i = 0; i < checkVersionMirrorHosts.length; i++) { let mirrorGithub = checkVersionMirrorHosts[i]; let tVersion = await getRemoteVersionByMirror(mirrorGithub); if (tVersion && tVersion != "") { Version = tVersion; break; } } return Version; } export async function getRemoteVersionByMirror(mirrorGithub: string) { let releasePage = "error"; try { releasePage = (await httpDownload(mirrorGithub + "/LLOneBot/LLOneBot/releases")).toString(); // log("releasePage", releasePage); if (releasePage === "error") return ""; return releasePage.match(new RegExp('(?<=(tag/v)).*?(?=("))'))[0]; } catch { } return ""; }