From ccfbf01ddf22890ef83593518e375ae74744ae82 Mon Sep 17 00:00:00 2001 From: enjoyeetime Date: Fri, 24 Feb 2023 09:52:03 +0800 Subject: [PATCH] update --- JD.js | 3 +- img/ic_filter.png | Bin 0 -> 5602 bytes "\346\250\241\346\235\277.js" | 341 +++++++--------------------------- "\347\224\265\344\277\241.js" | 37 ++-- 4 files changed, 93 insertions(+), 288 deletions(-) create mode 100644 img/ic_filter.png diff --git a/JD.js b/JD.js index 6678792..d6dc93c 100644 --- a/JD.js +++ b/JD.js @@ -3,7 +3,7 @@ // icon-color: pink; icon-glyph: feather-alt; /** * Author:LSP -* Date:2023-02-07 +* Date:2023-02-13 */ // ------------------------------------------------------- // 是否是开发环境,配合手机端调试使用,正式发布设置为false @@ -1170,6 +1170,7 @@ class Widget extends BaseWidget { let percent = '--'; if (treeState == 2 || treeState == 3) { percent = "100%"; + this.notify('东东农场', `⊱${simpleName}⊰可以兑换啦~`); } else { percent = Math.floor((treeEnergy / treeTotalEnergy) * 100) + "%"; } diff --git a/img/ic_filter.png b/img/ic_filter.png new file mode 100644 index 0000000000000000000000000000000000000000..606ca37681536b4fcf6e1e8a6e7ebf63c8c2ffe5 GIT binary patch literal 5602 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 wix+OXW?#H@OOYZ)iWDhQq)3q>MT(>OC)Y { - let widgetSetting = this.readWidgetSetting(); - let insertDesc = ''; - switch (item.name) { - case 'pic': - try { - let image = await Photos.fromLibrary(); - this.useFileManager().writeImgCache('pic', image); - } catch (error) { - } - break; - } - // 写入更新配置 - this.writeWidgetSetting(widgetSetting); - return { - desc: { value: insertDesc }, - }; - }, - }; - } - - async render({ widgetSetting, family }) { - return await this.provideLargeWidget(); - } - - async provideLargeWidget() { - // ---------------------------------------- - const widgetSize = this.getWidgetSize('小号'); - console.log(JSON.stringify(widgetSize, null, 2)); // - //================================= - const widget = new ListWidget(); - //================================= - let stack = widget.addStack(); - stack.size = new Size(widgetSize.width - 12, widgetSize.height - 12); - let image = await this.getImageByUrl("https://s1.ax1x.com/2023/02/09/pSWWFeO.png"); - stack.backgroundImage = this.useFileManager().readImgCache('pic') - stack.centerAlignContent() +const battCircleRemainColor = new Color('#799351'); //Battery remaining color +const battCircleDepletedColor = new Color('#d54062'); //Battery depleted color - let picStack = stack.addStack(); - picStack.size = new Size(widgetSize.width - 4, widgetSize.height - 4); - picStack.backgroundImage = image - - // let imgSpan = stack.addImage(image) - // imgSpan.centerAlignImage(); - // imgSpan.applyFillingContentMode(); - //================================= - return widget; - } - - // --------------------------NET START-------------------------- - async loadHTML(url) { - let req = new Request(url); - req.headers = { - "user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36", - }; - let html = await req.loadString(); - return html.replace(/(\r\n|\n|\r)/gm, ""); - } - - async loadMovieCalendar() { - const link = this.domain; - let response = undefined; - try { - const ufm = this.useFileManager(); - const webview = new WebView(); - const cacheFileName = this.md5(link); - const lastCacheTime = ufm.getCacheModifyDate(cacheFileName); - const timeInterval = Math.floor((this.getCurrentTimeStamp() - lastCacheTime) / 60); - // 读取本地缓存 - const localCache = ufm.readStringCache(cacheFileName); - const canUseCache = localCache != null && localCache.length > 0; - // 过时且有本地缓存则直接返回本地缓存数据 - const { refreshInterval = '0' } = this.readWidgetSetting(); - const shouldLoadCache = timeInterval <= Number(refreshInterval) && canUseCache; - let html = undefined; - if (!shouldLoadCache) { - console.log(`-->>在线加载网页数据:${link}`); - html = await this.loadHTML(link); - ufm.writeStringCache(cacheFileName, html); - } else { - html = ufm.readStringCache(cacheFileName); - console.log(`-->>加载缓存网页数据:${link}`); - } - await webview.loadHTML(html); - const getData = - ` - function getData() { - let movieImg = document.getElementById('movie-img').src; - let movieDesc = document.querySelector('span#movie-text').textContent; - let movieName = document.querySelector('a#movie-name').textContent.replaceAll('——', ''); - let movieInformation = document.querySelector('a#movie-information').textContent; - let movieRating = movieInformation.slice(0, 3); - movieInformation = movieInformation.slice(5); - let movieLink = document.querySelector('a#movie-img-a').href; - return { movieImg, movieDesc, movieName, movieInformation, movieRating, movieLink }; - } - getData() - ` - // 热榜数据 - response = await webview.evaluateJavaScript(getData, false); - if (response.titleArr?.length > 0) { - this.useFileManager().writeStringCache('movieCalendar', JSON.stringify(response)); - } - } catch (error) { - console.error(`🚫 请求数据出错了=>${error}`); - response = JSON.parse(this.useFileManager().readStringCache('movieCalendar')); - } - return response; - } - // --------------------------NET END-------------------------- +function sinDeg(deg) { + return Math.sin((deg * Math.PI) / 180); } -await new Widget(Script.name()).run(); - - -// ================================================================================= -// ================================================================================= -async function downloadLSPDependency() { - let fm = FileManager.local(); - const dependencyURL = `${remoteRoot}/_LSP.js`; - const update = needUpdateDependency(); - if (isDev) { - const iCloudPath = FileManager.iCloud().documentsDirectory(); - const localIcloudDependencyExit = fm.isFileStoredIniCloud(`${iCloudPath}/_LSP.js`); - const localDependencyExit = fm.fileExists(`${rootDir}/_LSP.js`); - const fileExist = localIcloudDependencyExit || localDependencyExit; - console.log(`🚀 DEV开发依赖文件${fileExist ? '已存在 ✅' : '不存在 🚫'}`); - if (!fileExist || update) { - console.log(`🤖 DEV 开始${update ? '更新' + dependencyLSP : '下载'}依赖~`); - keySave('VERSION', dependencyLSP); - await downloadFile2Scriptable('_LSP', dependencyURL); - } - return - } - - ////////////////////////////////////////////////////////// - console.log(`----------------------------------------`); - const remoteDependencyExit = fm.fileExists(`${cacheDir}/_LSP.js`); - console.log(`🚀 RELEASE依赖文件${remoteDependencyExit ? '已存在 ✅' : '不存在 🚫'}`); - // ------------------------------ - if (!remoteDependencyExit || update) { // 下载依赖 - // 创建根目录 - if (!fm.fileExists(cacheDir)) { - fm.createDirectory(cacheDir, true); - } - // 下载 - console.log(`🤖 RELEASE开始${update ? '更新' : '下载'}依赖~`); - console.log(`----------------------------------------`); - const req = new Request(dependencyURL); - const moduleJs = await req.load(); - if (moduleJs) { - fm.write(fm.joinPath(cacheDir, '/_LSP.js'), moduleJs); - keySave('VERSION', dependencyLSP); - console.log('✅ LSP远程依赖环境下载成功!'); - console.log(`----------------------------------------`); - } else { - console.error('🚫 获取依赖环境脚本失败,请重试!'); - console.log(`----------------------------------------`); - } - } +function cosDeg(deg) { + return Math.cos((deg * Math.PI) / 180); } -/** - * 获取保存的文件名 - * @param {*} fileName - * @returns - */ -function getSaveFileName(fileName) { - const hasSuffix = fileName.lastIndexOf(".") + 1; - return !hasSuffix ? `${fileName}.js` : fileName; -}; - -/** - * 保存文件到Scriptable软件目录,app可看到 - * @param {*} fileName - * @param {*} content - * @returns - */ -function saveFile2Scriptable(fileName, content) { - try { - const fm = FileManager.iCloud(); - let fileSimpleName = getSaveFileName(fileName); - const filePath = fm.joinPath(fm.documentsDirectory(), fileSimpleName); - fm.writeString(filePath, content); - return true; - } catch (error) { - return false; - } -}; - -/** - * 下载js文件到Scriptable软件目录 - * @param {*} moduleName 名称 - * @param {*} url 在线地址 - * @returns - */ -async function downloadFile2Scriptable(moduleName, url) { - const req = new Request(url); - const content = await req.loadString(); - return saveFile2Scriptable(`${moduleName}`, content); -}; - -/** - * 是否需要更新依赖版本 - */ -function needUpdateDependency() { - return dependencyLSP != keyGet('VERSION'); -}; - -function keySave(cacheKey, cache) { - if (cache) { - Keychain.set(Script.name() + cacheKey, cache); +function drawArc(deg, fillColor, strokeColor, text, label, txtColor) { + const canvas = new DrawContext(); + canvas.opaque = false; + canvas.respectScreenScale = true + let ctr = new Point(canvSize / 2, canvSize / 2), + bgx = ctr.x - canvRadius; + bgy = ctr.y - canvRadius; + bgd = 2 * canvRadius; + bgr = new Rect(bgx, bgy, bgd, bgd); + + canvas.setFillColor(fillColor); + canvas.setStrokeColor(strokeColor); + canvas.setLineWidth(canvWidth); + canvas.strokeEllipse(bgr); + + for (t = 0; t < deg; t++) { + rect_x = ctr.x + canvRadius * sinDeg(t) - canvWidth / 2; + rect_y = ctr.y - canvRadius * cosDeg(t) - canvWidth / 2; + rect_r = new Rect(rect_x, rect_y, canvWidth, canvWidth); + canvas.fillEllipse(rect_r); } + // attempt to draw info text + const canvTextRect = new Rect( + 0, + canvSize / 2 + canvWidth / 2 - canvTextSize / 2, + canvSize, + canvTextSize + ); + const canvLabelRect = new Rect( + 0, + (canvSize / 2 + canvWidth / 2 - canvTextSize / 2) - canvTextSize * 1.5, + canvSize, + canvTextSize + 130 + ); + canvas.setTextAlignedCenter(); + canvas.setTextColor(txtColor); + canvas.setFont(Font.boldSystemFont(canvTextSize)); + canvas.drawTextInRect(text, canvTextRect); + canvas.drawTextInRect(label, canvLabelRect); + return canvas.getImage() } -function keyGet(cacheKey, defaultValue = '') { - if (Keychain.contains(Script.name() + cacheKey)) { - return Keychain.get(Script.name() + cacheKey); - } else { - return defaultValue; - } -} -// ================================================================================= -// ================================================================================= \ No newline at end of file +let widget = new ListWidget(); +widget.setPadding(0, 0, 0, 0); +let image = drawArc(330, battCircleRemainColor, battCircleDepletedColor, "总流量:1.46T", "已用:900GB", battCircleRemainColor) +widget.addImage(image) + +// let mainStack = widget.addStack(); +// mainStack.size = new Size(158, 158); +// mainStack.backgroundImage = image +// mainStack.layoutHorizontally(); +// mainStack.setPadding(0, 0, 0, 0); +// let imgSpan = mainStack.addImage(drawArc(330, battCircleRemainColor, battCircleDepletedColor, "总流量:1.46T", "已用:900GB", battCircleRemainColor)) +// imgSpan.imageSize = new Size(158, 158) +// widget.backgroundColor = Color.white() +Script.setWidget(widget); +widget.presentSmall(); +Script.complete(); diff --git "a/\347\224\265\344\277\241.js" "b/\347\224\265\344\277\241.js" index b8ecd19..d02e91e 100644 --- "a/\347\224\265\344\277\241.js" +++ "b/\347\224\265\344\277\241.js" @@ -3,7 +3,7 @@ // icon-color: blue; icon-glyph: mobile-alt; /** * Author:LSP -* Date:2023-02-13 +* Date:2023-02-24 */ // ------------------------------------------------------- // 是否是开发环境,配合手机端调试使用,正式发布设置为false @@ -102,6 +102,14 @@ class Widget extends BaseWidget { needLoading: true, desc: this.getValueByKey('cookie')?.length > 0 ? '已登录' : '未登录' }, + { + name: 'filterOrientateFlow', + label: '过滤定向流量', + type: 'switch', + icon: `${remoteRoot}/img/ic_filter.png`, + needLoading: false, + default: false + }, { name: 'otherSetting', label: '其他设置', @@ -225,14 +233,14 @@ class Widget extends BaseWidget { }; } - async render() { - return await this.provideSmallWidget(); + async render({ widgetSetting }) { + return await this.provideSmallWidget(widgetSetting); } - async provideSmallWidget() { + async provideSmallWidget(widgetSetting) { // ======================================== await this.loadMoneyBalance(); - await this.loadDetailInfo(); + await this.loadDetailInfo(widgetSetting.filterOrientateFlow); const voiceBalance = this.voice.balance; // ======================================== const widget = new ListWidget(); @@ -378,7 +386,7 @@ class Widget extends BaseWidget { * 加载明细 * @returns */ - loadDetailInfo = async () => { + loadDetailInfo = async (filterOrientateFlow) => { const response = await this.httpGet( this.defaultPreference.fetchUrl.detail, { @@ -408,12 +416,19 @@ class Widget extends BaseWidget { data.items?.forEach((item) => { if (item.unitTypeId == 3) { if (!(item.usageAmount == 0 && item.balanceAmount == 0)) { - console.log(`套餐名称:«${item.ratableResourcename}»`); - console.log(`套餐总流量:${item.ratableAmount} MB`); - console.log(`套餐剩余流量:${item.balanceAmount} MB`); + let ratableResourcename = item.ratableResourcename; + let ratableAmount = item.ratableAmount; + let balanceAmount = item.balanceAmount; + console.log(`套餐名称:«${ratableResourcename}»`); + console.log(`套餐总流量:${ratableAmount} MB`); + console.log(`套餐剩余流量:${balanceAmount} MB`); console.log(`================================= `); - totalFlowAmount += parseFloat(item.ratableAmount); - totalBalanceFlowAmount += parseFloat(item.balanceAmount); + if (filterOrientateFlow && ratableResourcename.search('定向') != -1) { + ratableAmount = 0; + balanceAmount = 0; + } + totalFlowAmount += parseFloat(ratableAmount); + totalBalanceFlowAmount += parseFloat(balanceAmount); } if (data.offerType == 21 && item.ratableAmount == '0') { // 无限流量用户 -- GitLab