| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555 |
- function MagicJS(e = "MagicJS", t = "INFO") {
- const s = {
- accept: "Accept",
- "accept-ch": "Accept-CH",
- "accept-charset": "Accept-Charset",
- "accept-features": "Accept-Features",
- "accept-encoding": "Accept-Encoding",
- "accept-language": "Accept-Language",
- "accept-ranges": "Accept-Ranges",
- "access-control-allow-credentials": "Access-Control-Allow-Credentials",
- "access-control-allow-origin": "Access-Control-Allow-Origin",
- "access-control-allow-methods": "Access-Control-Allow-Methods",
- "access-control-allow-headers": "Access-Control-Allow-Headers",
- "access-control-max-age": "Access-Control-Max-Age",
- "access-control-expose-headers": "Access-Control-Expose-Headers",
- "access-control-request-method": "Access-Control-Request-Method",
- "access-control-request-headers": "Access-Control-Request-Headers",
- age: "Age",
- allow: "Allow",
- alternates: "Alternates",
- authorization: "Authorization",
- "cache-control": "Cache-Control",
- connection: "Connection",
- "content-encoding": "Content-Encoding",
- "content-language": "Content-Language",
- "content-length": "Content-Length",
- "content-location": "Content-Location",
- "content-md5": "Content-MD5",
- "content-range": "Content-Range",
- "content-security-policy": "Content-Security-Policy",
- "content-type": "Content-Type",
- cookie: "Cookie",
- dnt: "DNT",
- date: "Date",
- etag: "ETag",
- expect: "Expect",
- expires: "Expires",
- from: "From",
- host: "Host",
- "if-match": "If-Match",
- "if-modified-since": "If-Modified-Since",
- "if-none-match": "If-None-Match",
- "if-range": "If-Range",
- "if-unmodified-since": "If-Unmodified-Since",
- "last-event-id": "Last-Event-ID",
- "last-modified": "Last-Modified",
- link: "Link",
- location: "Location",
- "max-forwards": "Max-Forwards",
- negotiate: "Negotiate",
- origin: "Origin",
- pragma: "Pragma",
- "proxy-authenticate": "Proxy-Authenticate",
- "proxy-authorization": "Proxy-Authorization",
- range: "Range",
- referer: "Referer",
- "retry-after": "Retry-After",
- "sec-websocket-extensions": "Sec-Websocket-Extensions",
- "sec-websocket-key": "Sec-Websocket-Key",
- "sec-websocket-origin": "Sec-Websocket-Origin",
- "sec-websocket-protocol": "Sec-Websocket-Protocol",
- "sec-websocket-version": "Sec-Websocket-Version",
- server: "Server",
- "set-cookie": "Set-Cookie",
- "set-cookie2": "Set-Cookie2",
- "strict-transport-security": "Strict-Transport-Security",
- tcn: "TCN",
- te: "TE",
- trailer: "Trailer",
- "transfer-encoding": "Transfer-Encoding",
- upgrade: "Upgrade",
- "user-agent": "User-Agent",
- "variant-vary": "Variant-Vary",
- vary: "Vary",
- via: "Via",
- warning: "Warning",
- "www-authenticate": "WWW-Authenticate",
- "x-content-duration": "X-Content-Duration",
- "x-content-security-policy": "X-Content-Security-Policy",
- "x-dnsprefetch-control": "X-DNSPrefetch-Control",
- "x-frame-options": "X-Frame-Options",
- "x-requested-with": "X-Requested-With",
- "x-surge-skip-scripting": "X-Surge-Skip-Scripting"
- };
- return new class {
- constructor() {
- this.version = "2.2.3.3";
- this.scriptName = e;
- this.logLevels = {
- DEBUG: 5,
- INFO: 4,
- NOTIFY: 3,
- WARNING: 2,
- ERROR: 1,
- CRITICAL: 0,
- NONE: -1
- };
- this.isLoon = typeof $loon !== "undefined";
- this.isQuanX = typeof $task !== "undefined";
- this.isJSBox = typeof $drive !== "undefined";
- this.isNode = typeof module !== "undefined" && !this.isJSBox;
- this.isSurge = typeof $httpClient !== "undefined" && !this.isLoon;
- this.platform = this.getPlatform();
- this.node = {
- request: undefined,
- fs: undefined,
- data: {}
- };
- this.iOSUserAgent = "Mozilla/5.0 (iPhone; CPU iPhone OS 13_3_1 like Mac OS X) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/13.0.5 Mobile/15E148 Safari/604.1";
- this.pcUserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.125 Safari/537.36 Edg/84.0.522.59";
- this.logLevel = t;
- this._unifiedPushUrl = "";
- if (this.isNode) {
- this.node.fs = require("fs");
- this.node.request = require("request");
- try {
- this.node.fs.accessSync("./magic.json", this.node.fs.constants.R_OK | this.node.fs.constants.W_OK);
- } catch (e) {
- this.node.fs.writeFileSync("./magic.json", "{}", {
- encoding: "utf8"
- });
- }
- this.node.data = require("./magic.json");
- } else if (this.isJSBox) {
- if (!$file.exists("drive://MagicJS")) {
- $file.mkdir("drive://MagicJS");
- }
- if (!$file.exists("drive://MagicJS/magic.json")) {
- $file.write({
- data: $data({
- string: "{}"
- }),
- path: "drive://MagicJS/magic.json"
- });
- }
- }
- }
- set unifiedPushUrl(e) {
- this._unifiedPushUrl = !!e ? e.replace(/\/+$/g, "") : "";
- }
- set logLevel(e) {
- this._logLevel = typeof e === "string" ? e.toUpperCase() : "DEBUG";
- }
- get logLevel() {
- return this._logLevel;
- }
- get isRequest() {
- return typeof $request !== "undefined" && typeof $response === "undefined";
- }
- get isResponse() {
- return typeof $response !== "undefined";
- }
- get request() {
- return typeof $request !== "undefined" ? $request : undefined;
- }
- get response() {
- if (typeof $response !== "undefined") {
- if ($response.hasOwnProperty("status")) $response["statusCode"] = $response["status"];
- if ($response.hasOwnProperty("statusCode")) $response["status"] = $response["statusCode"];
- return $response;
- } else {
- return undefined;
- }
- }
- getPlatform() {
- if (this.isSurge) return "Surge"; else if (this.isQuanX) return "QuantumultX"; else if (this.isLoon) return "Loon"; else if (this.isJSBox) return "JSBox"; else if (this.isNode) return "Node.js"; else return "unknown";
- }
- read(e, t = "") {
- let s = "";
- if (this.isSurge || this.isLoon) {
- s = $persistentStore.read(e);
- } else if (this.isQuanX) {
- s = $prefs.valueForKey(e);
- } else if (this.isNode) {
- s = this.node.data;
- } else if (this.isJSBox) {
- s = $file.read("drive://MagicJS/magic.json").string;
- }
- try {
- if (this.isNode) s = s[e];
- if (this.isJSBox) s = JSON.parse(s)[e];
- if (!!t) {
- if (typeof s === "string") s = JSON.parse(s);
- s = !!s && typeof s === "object" ? s[t] : null;
- }
- } catch (i) {
- this.logError(i);
- s = !!t ? {} : null;
- this.del(e);
- }
- if (typeof s === "undefined") s = null;
- try {
- if (!!s && typeof s === "string") s = JSON.parse(s);
- } catch (e) {}
- this.logDebug(`READ DATA [${e}]${!!t ? `[${t}]` : ""}(${typeof s})\n${JSON.stringify(s)}`);
- return s;
- }
- write(e, t, s = "") {
- let i = !!s ? {} : "";
- if (!!s && (this.isSurge || this.isLoon)) {
- i = $persistentStore.read(e);
- } else if (!!s && this.isQuanX) {
- i = $prefs.valueForKey(e);
- } else if (this.isNode) {
- i = this.node.data;
- } else if (this.isJSBox) {
- i = JSON.parse($file.read("drive://MagicJS/magic.json").string);
- }
- if (!!s) {
- try {
- if (typeof i === "string") i = JSON.parse(i);
- i = typeof i === "object" && !!i ? i : {};
- } catch (t) {
- this.logError(t);
- this.del(e);
- i = {};
- }
- if (this.isJSBox || this.isNode) {
- if (!i.hasOwnProperty(e) || typeof i[e] !== "object" || i[e] === null) {
- i[e] = {};
- }
- if (!i[e].hasOwnProperty(s)) {
- i[e][s] = null;
- }
- if (typeof t === "undefined") {
- delete i[e][s];
- } else {
- i[e][s] = t;
- }
- } else {
- if (typeof t === "undefined") {
- delete i[s];
- } else {
- i[s] = t;
- }
- }
- } else {
- if (this.isNode || this.isJSBox) {
- if (typeof t === "undefined") {
- delete i[e];
- } else {
- i[e] = t;
- }
- } else {
- if (typeof t === "undefined") {
- i = null;
- } else {
- i = t;
- }
- }
- }
- if (typeof i === "object") i = JSON.stringify(i);
- if (this.isSurge || this.isLoon) {
- $persistentStore.write(i, e);
- } else if (this.isQuanX) {
- $prefs.setValueForKey(i, e);
- } else if (this.isNode) {
- this.node.fs.writeFileSync("./magic.json", i);
- } else if (this.isJSBox) {
- $file.write({
- data: $data({
- string: i
- }),
- path: "drive://MagicJS/magic.json"
- });
- }
- this.logDebug(`WRITE DATA [${e}]${!!s ? `[${s}]` : ""}(${typeof t})\n${JSON.stringify(t)}`);
- }
- del(e, t = "") {
- this.logDebug(`DELETE KEY [${e}]${!!t ? `[${t}]` : ""}`);
- this.write(e, null, t);
- }
- notify(e = this.scriptName, t = "", s = "", i = "") {
- let o = e => {
- let t = {};
- if (this.isSurge || this.isQuanX || this.isLoon) {
- if (typeof e === "string") {
- if (this.isLoon) t = {
- openUrl: e
- }; else if (this.isQuanX) t = {
- "open-url": e
- }; else if (this.isSurge) t = {
- url: e
- };
- } else if (typeof e === "object") {
- let s = {
- Surge: {
- openUrl: "url",
- "open-url": "url"
- },
- Loon: {
- url: "openUrl",
- "open-url": "openUrl",
- "media-url": "mediaUrl"
- },
- QuantumultX: {
- url: "open-url",
- openUrl: "open-url",
- mediaUrl: "media-url"
- }
- };
- let i = Object.keys(e);
- for (let o = 0; o < i.length; o++) {
- if (!!s[this.platform][i[o]]) {
- t[s[this.platform][i[o]]] = e[i[o]];
- } else {
- t[i[o]] = e[i[o]];
- }
- }
- }
- }
- return t;
- };
- i = o(i);
- this.logNotify(`title:${e}\nsubTitle:${t}\nbody:${s}\noptions:${typeof i === "object" ? JSON.stringify(i) : i}`);
- if (arguments.length == 1) {
- e = this.scriptName;
- t = "", s = arguments[0];
- }
- if (!!this._unifiedPushUrl) {
- let i = encodeURI(`${e}/${t}${!!t ? "\n" : ""}${s}`);
- this.get(`${this._unifiedPushUrl}/${i}`, () => {});
- }
- if (this.isSurge || this.isLoon) {
- $notification.post(e, t, s, i);
- } else if (this.isQuanX) {
- $notify(e, t, s, i);
- } else if (this.isJSBox) {
- let i = {
- title: e,
- body: !!t ? `${t}\n${s}` : s
- };
- $push.schedule(i);
- }
- }
- log(e, t = "INFO") {
- if (!(this.logLevels[this._logLevel] < this.logLevels[t.toUpperCase()])) console.log(`[${t}] [${this.scriptName}]\n${e}\n`);
- }
- logDebug(e) {
- this.log(e, "DEBUG");
- }
- logInfo(e) {
- this.log(e, "INFO");
- }
- logNotify(e) {
- this.log(e, "NOTIFY");
- }
- logWarning(e) {
- this.log(e, "WARNING");
- }
- logError(e) {
- this.log(e, "ERROR");
- }
- adapterHttpOptions(e, t) {
- let i = typeof e === "object" ? Object.assign({}, e) : {
- url: e,
- headers: {}
- };
- if (i.hasOwnProperty("header") && !i.hasOwnProperty("headers")) {
- i["headers"] = i["header"];
- delete i["header"];
- }
- if (typeof i.headers === "object" && !!s) {
- for (let e in i.headers) {
- if (s[e]) {
- i.headers[s[e]] = i.headers[e];
- delete i.headers[e];
- }
- }
- }
- if (!!!i.headers || typeof i.headers !== "object" || !!!i.headers["User-Agent"]) {
- if (!!!i.headers || typeof i.headers !== "object") i.headers = {};
- if (this.isNode) i.headers["User-Agent"] = this.pcUserAgent; else i.headers["User-Agent"] = this.iOSUserAgent;
- }
- let o = false;
- if (typeof i["opts"] === "object" && (i["opts"]["hints"] === true || i["opts"]["Skip-Scripting"] === true) || typeof i["headers"] === "object" && i["headers"]["X-Surge-Skip-Scripting"] === true) {
- o = true;
- }
- if (!o) {
- if (this.isSurge) i.headers["X-Surge-Skip-Scripting"] = false; else if (this.isLoon) i.headers["X-Requested-With"] = "XMLHttpRequest"; else if (this.isQuanX) {
- if (typeof i["opts"] !== "object") i.opts = {};
- i.opts["hints"] = false;
- }
- }
- if (!this.isSurge || o) delete i.headers["X-Surge-Skip-Scripting"];
- if (!this.isQuanX && i.hasOwnProperty("opts")) delete i["opts"];
- if (this.isQuanX && i.hasOwnProperty("opts")) delete i["opts"]["Skip-Scripting"];
- if (t === "GET" && !this.isNode && !!i.body) {
- let e = Object.keys(i.body).map(e => {
- if (typeof i.body === "undefined") return "";
- return `${encodeURIComponent(e)}=${encodeURIComponent(i.body[e])}`;
- }).join("&");
- if (i.url.indexOf("?") < 0) i.url += "?";
- if (i.url.lastIndexOf("&") + 1 != i.url.length && i.url.lastIndexOf("?") + 1 != i.url.length) i.url += "&";
- i.url += e;
- delete i.body;
- }
- if (this.isQuanX) {
- if (i.hasOwnProperty("body") && typeof i["body"] !== "string") i["body"] = JSON.stringify(i["body"]);
- i["method"] = t;
- } else if (this.isNode) {
- delete i.headers["Accept-Encoding"];
- if (typeof i.body === "object") {
- if (t === "GET") {
- i.qs = i.body;
- delete i.body;
- } else if (t === "POST") {
- i["json"] = true;
- i.body = i.body;
- }
- }
- } else if (this.isJSBox) {
- i["header"] = i["headers"];
- delete i["headers"];
- }
- return i;
- }
- get(e, t) {
- let s = this.adapterHttpOptions(e, "GET");
- this.logDebug(`HTTP GET: ${JSON.stringify(s)}`);
- if (this.isSurge || this.isLoon) {
- $httpClient.get(s, t);
- } else if (this.isQuanX) {
- $task.fetch(s).then(e => {
- e["status"] = e.statusCode;
- t(null, e, e.body);
- }, e => t(e.error, null, null));
- } else if (this.isNode) {
- return this.node.request.get(s, t);
- } else if (this.isJSBox) {
- s["handler"] = e => {
- let s = e.error ? JSON.stringify(e.error) : undefined;
- let i = typeof e.data === "object" ? JSON.stringify(e.data) : e.data;
- t(s, e.response, i);
- };
- $http.get(s);
- }
- }
- post(e, t) {
- let s = this.adapterHttpOptions(e, "POST");
- this.logDebug(`HTTP POST: ${JSON.stringify(s)}`);
- if (this.isSurge || this.isLoon) {
- $httpClient.post(s, t);
- } else if (this.isQuanX) {
- $task.fetch(s).then(e => {
- e["status"] = e.statusCode;
- t(null, e, e.body);
- }, e => {
- t(e.error, null, null);
- });
- } else if (this.isNode) {
- return this.node.request.post(s, t);
- } else if (this.isJSBox) {
- s["handler"] = e => {
- let s = e.error ? JSON.stringify(e.error) : undefined;
- let i = typeof e.data === "object" ? JSON.stringify(e.data) : e.data;
- t(s, e.response, i);
- };
- $http.post(s);
- }
- }
- done(e = {}) {
- if (typeof $done !== "undefined") {
- $done(e);
- }
- }
- isToday(e) {
- if (e == null) {
- return false;
- } else {
- let t = new Date();
- if (typeof e == "string") {
- e = new Date(e);
- }
- if (t.getFullYear() == e.getFullYear() && t.getMonth() == e.getMonth() && t.getDay() == e.getDay()) {
- return true;
- } else {
- return false;
- }
- }
- }
- isNumber(e) {
- return parseFloat(e).toString() === "NaN" ? false : true;
- }
- attempt(e, t = null) {
- return e.then(e => {
- return [ null, e ];
- }).catch(e => {
- this.logError(e);
- return [ e, t ];
- });
- }
- retry(e, t = 5, s = 0, i = null) {
- return (...o) => {
- return new Promise((r, n) => {
- function a(...o) {
- Promise.resolve().then(() => e.apply(this, o)).then(e => {
- if (typeof i === "function") {
- Promise.resolve().then(() => i(e)).then(() => {
- r(e);
- }).catch(e => {
- this.logError(e);
- if (t >= 1 && s > 0) {
- setTimeout(() => a.apply(this, o), s);
- } else if (t >= 1) {
- a.apply(this, o);
- } else {
- n(e);
- }
- t--;
- });
- } else {
- r(e);
- }
- }).catch(e => {
- this.logError(e);
- if (t >= 1 && s > 0) {
- setTimeout(() => a.apply(this, o), s);
- } else if (t >= 1) {
- a.apply(this, o);
- } else {
- n(e);
- }
- t--;
- });
- }
- a.apply(this, o);
- });
- };
- }
- formatTime(e, t = "yyyy-MM-dd hh:mm:ss") {
- var s = {
- "M+": e.getMonth() + 1,
- "d+": e.getDate(),
- "h+": e.getHours(),
- "m+": e.getMinutes(),
- "s+": e.getSeconds(),
- "q+": Math.floor((e.getMonth() + 3) / 3),
- S: e.getMilliseconds()
- };
- if (/(y+)/.test(t)) t = t.replace(RegExp.$1, (e.getFullYear() + "").substr(4 - RegExp.$1.length));
- for (let e in s) if (new RegExp("(" + e + ")").test(t)) t = t.replace(RegExp.$1, RegExp.$1.length == 1 ? s[e] : ("00" + s[e]).substr(("" + s[e]).length));
- return t;
- }
- now() {
- return this.formatTime(new Date(), "yyyy-MM-dd hh:mm:ss");
- }
- today() {
- return this.formatTime(new Date(), "yyyy-MM-dd");
- }
- sleep(e) {
- return new Promise(t => setTimeout(t, e));
- }
- }(e);
- }
|