diff --git a/lib/update.js b/lib/update.js index 7ac5292..9685864 100644 --- a/lib/update.js +++ b/lib/update.js @@ -2,13 +2,25 @@ const { send } = require('./net/http') const { strToJson, download, try_for_each } = require('./utils') const { version, checkVersion, log } = require('./utils') +const + platform = new Map([ + ['win32', 'win'], + ['linux', 'linux'], + ['darwin', 'macos'] + ]).get(process.platform), + arch = new Map([ + ['x64', 'x64'], + ['arm', 'armv7'], + ['arm64', 'arm64'] + ]).get(process.arch); + /** * 获取下载链接 * @param {string} owner * @param {string} repo - * @returns {Promise<{ download_url: string[], text: string }>} + * @returns {Promise<{ tag_name:string, assets:Object, text:string }>} */ -function getLatestReleaseDownloadUrl(owner, repo) { +function getLatestRelease(owner, repo) { return new Promise((resolve, reject) => { send({ url: `https://api.github.com/repos/${owner}/${repo}/releases/latest`, @@ -19,37 +31,9 @@ function getLatestReleaseDownloadUrl(owner, repo) { retry: false }, success: ({ body }) => { - const { tag_name, assets, body: text } = strToJson(body) - if (tag_name) { - if (checkVersion(version) < checkVersion(tag_name)) { - const platform = new Map([ - ['win32', 'win'], - ['linux', 'linux'], - ['darwin', 'macos'] - ]).get(process.platform) - const arch = new Map([ - ['x64', 'x64'], - ['arm', 'armv7'], - ['arm64', 'arm64'] - ]).get(process.arch) - if (platform && arch) { - try { - const download_url = assets - .filter(({ name }) => name.includes(platform) && name.includes(arch)) - .map(({ browser_download_url }) => browser_download_url) - if (!download_url.length) { - reject(`未找到能在此平台(${process.platform})-(${process.arch})上运行的版本`) - } - resolve({ download_url, text }) - } catch (err) { - reject(err) - } - } else { - reject(`未找到能在此平台(${process.platform})-(${process.arch})上运行的版本`) - } - } else { - reject('当前已是最新版本') - } + const release = strToJson(body); + if (release.tag_name) { + resolve(release) } else { reject(body) } @@ -61,21 +45,48 @@ function getLatestReleaseDownloadUrl(owner, repo) { }); } +/** + * @param {string} releases + * @return {boolean} +*/ +function checkPlatform(releases) { + return releases.includes(platform) + && releases.includes(arch) +} + /** * 半自动更新 */ async function update() { try { - const { download_url, text } = await getLatestReleaseDownloadUrl('shanmiteko', 'LotteryAutoScript') - await try_for_each(download_url.entries(), async ([i, url]) => { - let proxy_url = new URL(url) - proxy_url.host = 'download.fastgit.org' - await download(proxy_url.href, `latest_version${i}.zip`) - return false - }) - - log.info('自动下载', '成功下载到当前目录') - log.info('更新说明', '\n' + text + '\n') + const { tag_name, assets, body: text } = await getLatestRelease('shanmiteko', 'LotteryAutoScript') + if (checkVersion(version) < checkVersion(tag_name)) { + const download_url = assets + .filter(({ name }) => checkPlatform(name)) + .map(({ browser_download_url }) => browser_download_url) + if (download_url.length) { + const proxy_host = ['download.fastgit.org'] + await try_for_each(download_url.entries(), async ([i, url]) => { + let proxy_url = new URL(url) + proxy_url.host = proxy_host[0] + log.warn('自动下载', `切换代理${proxy_host[0]}`) + await download(proxy_url.href, `latest_version${i}.zip`) + .catch(async err => { + log.error('自动下载', err) + proxy_url.host = 'github.com' + log.warn('自动下载', `使用原始链接github.com`) + await download(proxy_url.href, `latest_version${i}.zip`) + }) + return false + }) + log.info('自动下载', '成功下载到当前目录') + log.info('更新说明', '\n' + text + '\n') + } else { + throw `未找到能在此平台(${process.platform})-(${process.arch})上运行的版本,建议以源码运行` + } + } else { + throw '当前已是最新版本' + } } catch (error) { log.error('更新脚本', error) } diff --git a/lib/utils.js b/lib/utils.js index c38dd90..8bc6f34 100644 --- a/lib/utils.js +++ b/lib/utils.js @@ -248,12 +248,13 @@ const utils = { redirect: true, retry: false }, - success: ({ resStream }) => { + success: ({ headers, resStream }) => { + const total_len = Number(headers["content-length"]); let recv_length = 0; const wtbs = fs.createWriteStream(file_name); resStream.on('data', chuck => { recv_length += chuck.length - utils.log.proPrint(`已收到:${recv_length} Bytes`) + utils.log.proPrint(total_len ? `已下载${(recv_length * 100 / total_len + '').slice(0, 5)}%` : `已收到:${recv_length} Bytes`) }) resStream.pipe(wtbs) wtbs.on('finish', () => { @@ -261,7 +262,7 @@ const utils = { resolve() }).on('error', error => { wtbs.destroy() - resolve(error) + reject(error) }) }, failure: error => { diff --git a/main.js b/main.js index 8937f92..afe1949 100644 --- a/main.js +++ b/main.js @@ -88,7 +88,7 @@ async function main() { } } else { log.error('Cookie已失效', '切换账号时不要点击退出账号而应直接删除Cookie退出') - return '' + return } } else { return '请查看README文件, 在env.js指定位置填入cookie'