From 3a964af0b01cda2b320d72213d0d2882e112de23 Mon Sep 17 00:00:00 2001 From: linyuchen Date: Tue, 19 Mar 2024 14:36:58 +0800 Subject: [PATCH] refactor: http download function --- manifest.json | 4 +- package-lock.json | 13 ---- src/common/utils/file.ts | 24 ++++++- src/common/utils/index.ts | 2 +- src/common/utils/{update.ts => upgrade.ts} | 80 ++++++++++------------ src/main/main.ts | 4 +- src/version.ts | 2 +- 7 files changed, 65 insertions(+), 64 deletions(-) rename src/common/utils/{update.ts => upgrade.ts} (50%) diff --git a/manifest.json b/manifest.json index c2fd582..c94e72e 100644 --- a/manifest.json +++ b/manifest.json @@ -1,10 +1,10 @@ { "manifest_version": 4, "type": "extension", - "name": "LLOneBot v3.16.1", + "name": "LLOneBot v3.16.0", "slug": "LLOneBot", "description": "LiteLoaderQQNT的OneBotApi,不支持商店在线更新", - "version": "3.16.1", + "version": "3.16.0", "icon": "./icon.jpg", "authors": [ { diff --git a/package-lock.json b/package-lock.json index f865c6d..dc3d75e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,7 +14,6 @@ "file-type": "^19.0.0", "fluent-ffmpeg": "^2.1.2", "level": "^8.0.1", - "node-stream-zip": "^1.15.0", "silk-wasm": "^3.2.3", "utf-8-validate": "^6.0.3", "uuid": "^9.0.1", @@ -5067,18 +5066,6 @@ "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", "dev": true }, - "node_modules/node-stream-zip": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/node-stream-zip/-/node-stream-zip-1.15.0.tgz", - "integrity": "sha512-LN4fydt9TqhZhThkZIVQnF9cwjU3qmUH9h78Mx/K7d3VvfRqqwthLwJEUOEL0QPZ0XQmNN7be5Ggit5+4dq3Bw==", - "engines": { - "node": ">=0.12.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/antelle" - } - }, "node_modules/normalize-url": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-6.1.0.tgz", diff --git a/src/common/utils/file.ts b/src/common/utils/file.ts index e7cc046..397d495 100644 --- a/src/common/utils/file.ts +++ b/src/common/utils/file.ts @@ -9,6 +9,8 @@ import {DATA_DIR, log, TEMP_DIR} from "./index"; import {getConfigUtil} from "../config"; import {dbUtil} from "../db"; import * as fileType from "file-type"; +import {net} from "electron"; +import ClientRequestConstructorOptions = Electron.ClientRequestConstructorOptions; export function isGIF(path: string) { const buffer = Buffer.alloc(4); @@ -79,7 +81,7 @@ export function checkFfmpeg(newPath: string = null): Promise { resolve(true); } }) - }catch (e) { + } catch (e) { resolve(false); } }); @@ -268,6 +270,26 @@ export function calculateFileMD5(filePath: string): Promise { }); } +export function httpDownload(options: ClientRequestConstructorOptions | string): Promise { + let chunks: Buffer[] = []; + let netRequest = net.request(options) + return new Promise((resolve, reject) => { + netRequest.on("response", (response) => { + if (!(response.statusCode >= 200 && response.statusCode < 300)) { + return reject(new Error(`下载失败,状态码${response.statusCode}`)) + } + response.on("data", (chunk) => { + chunks.push(chunk); + }).on("end", () => { + resolve(Buffer.concat(chunks)); + }) + }).on("error", (err) => { + reject(err); + }) + netRequest.end() + }) +} + type Uri2LocalRes = { success: boolean, errMsg: string, diff --git a/src/common/utils/index.ts b/src/common/utils/index.ts index 0eccb8c..58c3afa 100644 --- a/src/common/utils/index.ts +++ b/src/common/utils/index.ts @@ -6,7 +6,7 @@ export * from './helper' export * from './log' export * from './qqlevel' export * from './qqpkg' -export * from './update' +export * from './upgrade' export const DATA_DIR = global.LiteLoader.plugins["LLOneBot"].path.data; export const TEMP_DIR = path.join(DATA_DIR, "temp"); export const PLUGIN_DIR = global.LiteLoader.plugins["LLOneBot"].path.plugin; diff --git a/src/common/utils/update.ts b/src/common/utils/upgrade.ts similarity index 50% rename from src/common/utils/update.ts rename to src/common/utils/upgrade.ts index fefcc38..97b613a 100644 --- a/src/common/utils/update.ts +++ b/src/common/utils/upgrade.ts @@ -1,46 +1,50 @@ -import { version } from "../../version"; -import https from "node:https"; -//import http from "node:http"; +import {version} from "../../version"; import * as path from "node:path"; import * as fs from "node:fs"; -import { PLUGIN_DIR, TEMP_DIR } from "."; +import {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 = version.split("."); for (let k in [0, 1, 2]) { if (latestVersion[k] > currentVersion[k]) { - return { result: false, version: latestVersionText }; + return {result: false, version: latestVersionText}; } } - return { result: true, version: version }; + return {result: true, version: version}; } -export async function updateLLOneBot() { - let mirrorGithubList = ["https://mirror.ghproxy.com/"]; + +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 realUrl = mirrorGithubList[0] + downloadUrl; + const mirrorUrl = downloadMirrorHosts[0] + downloadUrl; const filePath = path.join(TEMP_DIR, "./update-" + latestVersion + ".zip"); const fileStream = fs.createWriteStream(filePath); - let downloadPromise = async function (filePath): Promise { - return new Promise((resolve, reject) => { - https.get(filePath, res => { - res.pipe(fileStream); - res.on('end', () => { - resolve(true); - }); - }).on('error', err => { - resolve(false); - }); - }); + 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 (!(await downloadPromise(realUrl))) { - // 下载异常 + if (!downloadSuccess){ + log("llonebot upgrade error", "download failed"); return false; } - let uncompressPromise = async function () { + let uncompressedPromise = async function () { return new Promise((resolve, reject) => { compressing.zip.uncompress(filePath, PLUGIN_DIR).then(() => { resolve(true); @@ -53,16 +57,16 @@ export async function updateLLOneBot() { }); }); } - const uncompressResult = await uncompressPromise(); + const uncompressResult = await uncompressedPromise(); return uncompressResult; } return false; } + export async function getRemoteVersion() { - let mirrorGithubList = ["https://521github.com"]; let Version = ""; - for (let i = 0; i < mirrorGithubList.length; i++) { - let mirrorGithub = mirrorGithubList[i]; + for (let i = 0; i < checkVersionMirrorHosts.length; i++) { + let mirrorGithub = checkVersionMirrorHosts[i]; let tVersion = await getRemoteVersionByMirror(mirrorGithub); if (tVersion && tVersion != "") { Version = tVersion; @@ -71,29 +75,17 @@ export async function getRemoteVersion() { } return Version; } + export async function getRemoteVersionByMirror(mirrorGithub: string) { let releasePage = "error"; - let reqPromise = async function (): Promise { - return new Promise((resolve, reject) => { - https.get(mirrorGithub + "/LLOneBot/LLOneBot/releases", res => { - let list = []; - res.on('data', chunk => { - list.push(chunk); - }); - res.on('end', () => { - resolve(Buffer.concat(list).toString()); - }); - }).on('error', err => { - reject(); - }); - }); - } + try { - releasePage = await reqPromise(); + releasePage = (await httpDownload(mirrorGithub + "/LLOneBot/LLOneBot/releases")).toString(); + log("releasePage", releasePage); if (releasePage === "error") return ""; return releasePage.match(new RegExp('(?<=(tag/v)).*?(?=("))'))[0]; + } catch { } - catch { } return ""; } \ No newline at end of file diff --git a/src/main/main.ts b/src/main/main.ts index 352d0ad..42257d0 100644 --- a/src/main/main.ts +++ b/src/main/main.ts @@ -41,7 +41,7 @@ import {NTQQUserApi} from "../ntqqapi/api/user"; import {NTQQGroupApi} from "../ntqqapi/api/group"; import {registerPokeHandler} from "../ntqqapi/external/ccpoke"; import {OB11FriendPokeEvent, OB11GroupPokeEvent} from "../onebot11/event/notice/OB11PokeEvent"; -import {checkVersion, updateLLOneBot} from "../common/utils/update"; +import {checkVersion, upgradeLLOneBot} from "../common/utils/upgrade"; import {checkFfmpeg} from "../common/utils/file"; import {log} from "../common/utils/log"; import {getConfigUtil} from "../common/config"; @@ -57,7 +57,7 @@ function onLoad() { return checkVersion(); }); ipcMain.handle(CHANNEL_UPDATE, async (event, arg) => { - return updateLLOneBot(); + return upgradeLLOneBot(); }); ipcMain.handle(CHANNEL_SELECT_FILE, async (event, arg) => { const selectPath = new Promise((resolve, reject) => { diff --git a/src/version.ts b/src/version.ts index 42fc3ff..93bafb5 100644 --- a/src/version.ts +++ b/src/version.ts @@ -1 +1 @@ -export const version = "3.16.1" \ No newline at end of file +export const version = "3.16.0" \ No newline at end of file