提交 ccfbf01d 编写于 作者: AndroidLeaves's avatar AndroidLeaves

update

上级 9886ede4
......@@ -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) + "%";
}
......
// Variables used by Scriptable.
// These must be at the very top of the file. Do not edit.
// icon-color: deep-blue; icon-glyph: film;
/**
* Author:LSP
* Date:2023-02-04
*/
// -------------------------------------------------------
// 是否是开发环境,配合手机端调试使用,正式发布设置为false
const isDev = false;
const dependencyLSP = '20230204';
console.log(`当前环境 👉👉👉👉👉 ${isDev ? 'DEV' : 'RELEASE'}`);
console.log(`----------------------------------------`);
// 分支
const branch = 'master';
// 仓库根目录
const remoteRoot = `https://gitcode.net/enoyee/scriptable/-/raw/${branch}`;
// 依赖包目录
const fm = FileManager.local();
const rootDir = fm.documentsDirectory();
const cacheDir = fm.joinPath(rootDir, 'LSP');
const dependencyFileName = isDev ? "_LSP.js" : `${cacheDir}/_LSP.js`;
// 下载依赖包
await downloadLSPDependency();
// -------------------------------------------------------
if (typeof require === 'undefined') require = importModule
// 引入相关方法
const { BaseWidget } = require(dependencyFileName);
const canvSize = 200;
const canvTextSize = 18;
// @定义小组件
class Widget extends BaseWidget {
const canvWidth = 22; // 圆圈stroke大小
const canvRadius = canvSize / 2 - canvWidth; // 半径
constructor(scriptName) {
super(scriptName);
this.domain = 'https://www.cikeee.com';
this.defaultConfig.refreshInterval = `${2 * 60}`;
this.backgroundColor = '#f0f0f4,#161823';
this.defaultConfig.bgType = '2';
this.titleColor = Color.dynamic(new Color('#222222'), new Color('#AAAAAA'));
this.descColor = Color.dynamic(new Color('#FFFFFF'), new Color('#EEEEEE'));
this.subTitleColor = Color.dynamic(new Color('#555555'), new Color('#AAAAAA'));
}
async getAppViewOptions() {
return {
widgetProvider: {
small: true, // 是否提供小号组件
medium: false, // 是否提供中号组件
large: false, // 是否提供大号组件
},
// 预览界面的组件设置item
settingItems: [
{
name: 'pic',
label: '选择图片',
type: 'cell',
icon: { name: 'tag', color: '#7678ed', },
showDesc: false,
needLoading: true,
},
],
// cell类型的item点击回调
onItemClick: async (item) => {
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();
......@@ -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') {
// 无限流量用户
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册