Script/Shortcuts/PolicySwitch.js

129 lines
3.5 KiB
JavaScript

/*
捷径策略切换脚本, 该脚本需与捷径配合使用.
脚本兼容: Surge4.7, QuanX1.0.22(545+), Loon2.1.10(290+)
捷径地址: https://www.icloud.com/shortcuts/0f5b9a825cad47488a78ff2876b822dd
脚本配置:
-----------Surge------------
[Script]
捷径策略切换 = type=http-request,pattern=^http:\/\/nobyda\.policy,requires-body=1,script-path=https://raw.githubusercontent.com/NobyDa/Script/master/Shortcuts/PolicySwitch.js
--------QuantumuitX---------
[rewrite_local]
^http:\/\/nobyda\.policy url script-analyze-echo-response https://raw.githubusercontent.com/NobyDa/Script/master/Shortcuts/PolicySwitch.js
------------Loon------------
[Script]
http-request ^http:\/\/nobyda\.policy script-path=https://raw.githubusercontent.com/NobyDa/Script/master/Shortcuts/PolicySwitch.js, requires-body=true, tag=捷径策略切换
----------------------------
*/
const $ = new nobyda();
const url = $request.url;
const body = JSON.parse($request.body || '{}');
(async function SwitchPoliy() {
let res = {};
if (/\/getGroup$/.test(url))
res.group = await $.getGroup();
if (/\/getPolicy$/.test(url))
res.policy = await $.getPolicy(body.group);
if (/\/setPolicy$/.test(url))
res.success = await $.setPolicy(body.group, body.policy);
$.done(res);
})()
function nobyda() {
const isLoon = typeof($loon) !== "undefined";
const isQuanX = typeof($configuration) !== 'undefined';
const isSurge = typeof($httpAPI) !== 'undefined';
const m = `不支持您的APP版本, 请等待APP更新 ⚠️`;
this.getGroup = () => {
if (isSurge) {
return new Promise((resolve) => {
$httpAPI("GET", "v1/policies", {}, (b) => resolve(b['policy-groups']))
})
}
if (isLoon) {
const getName = JSON.parse($config.getConfig());
return getName['all_policy_groups'];
}
if (isQuanX) {
return new Promise((resolve) => {
$configuration.sendMessage({
action: "get_customized_policy"
}).then(b => {
if (b.ret) {
resolve(Object.keys(b.ret).filter(s => b.ret[s].type == "static"));
} else resolve();
}, () => resolve());
})
}
return m;
}
this.getPolicy = (groupName) => {
if (isSurge) {
return new Promise((resolve) => {
$httpAPI("GET", "v1/policy_groups", {}, (b) => {
resolve(b[groupName].map(g => g.name))
})
})
}
if (isLoon) {
return new Promise((resolve) => {
$config.getSubPolicys(groupName, (b) => {
const get = JSON.parse(b || '[]').map(n => n.name);
resolve(get)
})
})
}
if (isQuanX) {
return new Promise((resolve) => {
$configuration.sendMessage({
action: "get_customized_policy",
content: groupName
}).then(b => {
if (b.ret && b.ret[groupName]) {
resolve(b.ret[groupName].candidates);
} else resolve();
}, () => resolve());
})
}
return m;
}
this.setPolicy = (group, policy) => {
if (isSurge) {
return new Promise((resolve) => {
$httpAPI("POST", "v1/policy_groups/select", {
group_name: group,
policy: policy
}, (b) => resolve(!b.error))
})
}
if (isLoon) {
const set = $config.setSelectPolicy(group, policy);
return set;
}
if (isQuanX) {
return new Promise((resolve) => {
$configuration.sendMessage({
action: "set_policy_state",
content: {
[group]: policy
}
}).then((b) => resolve(!b.error), () => resolve());
})
}
return m;
}
this.done = (body) => {
const e = {
response: {
body: JSON.stringify(body)
}
};
$done(typeof($task) != "undefined" ? e.response : e);
}
}