Compare commits
No commits in common. "master" and "v1.1.5" have entirely different histories.
14
.vscode/launch.json
vendored
14
.vscode/launch.json
vendored
@ -1,14 +0,0 @@
|
|||||||
{
|
|
||||||
// 使用 IntelliSense 了解相关属性。
|
|
||||||
// 悬停以查看现有属性的描述。
|
|
||||||
// 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
|
|
||||||
"version": "0.2.0",
|
|
||||||
"configurations": [
|
|
||||||
{
|
|
||||||
"command": "npm run rollup",
|
|
||||||
"name": "rollup",
|
|
||||||
"request": "launch",
|
|
||||||
"type": "node-terminal"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
95
CHANGELOG.md
95
CHANGELOG.md
@ -1,95 +1,10 @@
|
|||||||
|
# TODO
|
||||||
|
|
||||||
|
- 翻译:baza npc商店、imarket、imarket搜索结果
|
||||||
|
- log重构,通知重构
|
||||||
|
|
||||||
# CHANGE
|
# CHANGE
|
||||||
|
|
||||||
## 1.2.4
|
|
||||||
|
|
||||||
2025年04月07日
|
|
||||||
|
|
||||||
### 修改
|
|
||||||
|
|
||||||
- 优化起飞功能错误处理
|
|
||||||
- 取消网络拦截,避免官方功能被影响
|
|
||||||
|
|
||||||
## 1.2.3
|
|
||||||
|
|
||||||
2025年03月11日
|
|
||||||
|
|
||||||
### 修改
|
|
||||||
|
|
||||||
- 删除GS Load模块代码
|
|
||||||
- 删除翻译
|
|
||||||
- 删除去Google化部分代码
|
|
||||||
- 修复起飞逻辑
|
|
||||||
- 修复通知
|
|
||||||
|
|
||||||
## 1.2.2
|
|
||||||
|
|
||||||
2024年04月07日
|
|
||||||
|
|
||||||
### 修改
|
|
||||||
|
|
||||||
- 快捷动作【REFILL】修复
|
|
||||||
|
|
||||||
## 1.2.1
|
|
||||||
|
|
||||||
2024年04月03日
|
|
||||||
|
|
||||||
### 修改
|
|
||||||
|
|
||||||
- 快捷动作【REFILL】修复
|
|
||||||
|
|
||||||
## 1.2.0
|
|
||||||
|
|
||||||
2024年03月29日
|
|
||||||
|
|
||||||
### 修改
|
|
||||||
|
|
||||||
- BS估算缓存机制修复
|
|
||||||
- 快捷功能【快速犯罪】界面优化
|
|
||||||
|
|
||||||
## 1.1.9
|
|
||||||
|
|
||||||
2024年03月27日
|
|
||||||
|
|
||||||
### 添加
|
|
||||||
|
|
||||||
- 引入了BS估算功能
|
|
||||||
|
|
||||||
### 修改
|
|
||||||
|
|
||||||
- 快捷功能【快速犯罪】去除了烦人的通知
|
|
||||||
|
|
||||||
## 1.1.8
|
|
||||||
|
|
||||||
2024年03月20日
|
|
||||||
|
|
||||||
### 修改
|
|
||||||
|
|
||||||
- 快捷功能的【喝啤酒】移动至【快速犯罪】中
|
|
||||||
- profile页面中在线状态调整
|
|
||||||
|
|
||||||
## 1.1.7
|
|
||||||
|
|
||||||
2024年03月15日
|
|
||||||
|
|
||||||
### 添加
|
|
||||||
|
|
||||||
- 快捷功能-PI存钱
|
|
||||||
|
|
||||||
### 修改
|
|
||||||
|
|
||||||
- 上次动作的url判断修复
|
|
||||||
- profile页面中添加了更明显的上次动作时间
|
|
||||||
- 快速取钱功能添加了常用输入
|
|
||||||
|
|
||||||
## 1.1.6
|
|
||||||
|
|
||||||
2024年01月08日
|
|
||||||
|
|
||||||
### 修改
|
|
||||||
|
|
||||||
- refill功能改为菜单式,新增支持3种refil
|
|
||||||
- 快速犯罪功能现已支持全部种类
|
|
||||||
|
|
||||||
## 1.1.5
|
## 1.1.5
|
||||||
|
|
||||||
2023年12月22日
|
2023年12月22日
|
||||||
|
|||||||
@ -18,6 +18,6 @@ This script does not include any automation-related code.
|
|||||||
|
|
||||||
## Use
|
## Use
|
||||||
|
|
||||||
[release.min.user.js](release.min.user.js)
|
[release.min.user.js](https://gitlab.com/JJins/wuhu-torn-helper/-/raw/dev/README_ZHCN.md)
|
||||||
|
|
||||||
Please install with Tampermonkey (for PC browser) or TornPDA.
|
Please install with Tampermonkey (for PC browser) or TornPDA.
|
||||||
|
|||||||
@ -21,6 +21,7 @@ let metaData =
|
|||||||
// @downloadURL https://gitlab.com/JJins/wuhu-torn-helper/-/raw/dev/release.min.user.js
|
// @downloadURL https://gitlab.com/JJins/wuhu-torn-helper/-/raw/dev/release.min.user.js
|
||||||
// @grant GM_xmlhttpRequest
|
// @grant GM_xmlhttpRequest
|
||||||
// @grant unsafeWindow
|
// @grant unsafeWindow
|
||||||
|
// @connect ljs-lyt.com
|
||||||
// @connect yata.yt
|
// @connect yata.yt
|
||||||
// @connect github.io
|
// @connect github.io
|
||||||
// @connect gitlab.com
|
// @connect gitlab.com
|
||||||
|
|||||||
32
package-lock.json
generated
32
package-lock.json
generated
@ -1,12 +1,12 @@
|
|||||||
{
|
{
|
||||||
"name": "wuhu-torn-helper",
|
"name": "wuhu-torn-helper",
|
||||||
"version": "1.2.2",
|
"version": "1.1.1",
|
||||||
"lockfileVersion": 2,
|
"lockfileVersion": 2,
|
||||||
"requires": true,
|
"requires": true,
|
||||||
"packages": {
|
"packages": {
|
||||||
"": {
|
"": {
|
||||||
"name": "wuhu-torn-helper",
|
"name": "wuhu-torn-helper",
|
||||||
"version": "1.2.2",
|
"version": "1.1.1",
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@element-plus/icons-vue": "^2.1.0",
|
"@element-plus/icons-vue": "^2.1.0",
|
||||||
"@rollup/plugin-alias": "^4.0.3",
|
"@rollup/plugin-alias": "^4.0.3",
|
||||||
@ -1577,24 +1577,10 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/caniuse-lite": {
|
"node_modules/caniuse-lite": {
|
||||||
"version": "1.0.30001597",
|
"version": "1.0.30001528",
|
||||||
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001597.tgz",
|
"resolved": "https://registry.npmmirror.com/caniuse-lite/-/caniuse-lite-1.0.30001528.tgz",
|
||||||
"integrity": "sha512-7LjJvmQU6Sj7bL0j5b5WY/3n7utXUJvAe1lxhsHDbLmwX9mdL86Yjtr+5SRCyf8qME4M7pU2hswj0FpyBVCv9w==",
|
"integrity": "sha512-0Db4yyjR9QMNlsxh+kKWzQtkyflkG/snYheSzkjmvdEtEXB1+jt7A2HmSEiO6XIJPIbo92lHNGNySvE5pZcs5Q==",
|
||||||
"dev": true,
|
"dev": true
|
||||||
"funding": [
|
|
||||||
{
|
|
||||||
"type": "opencollective",
|
|
||||||
"url": "https://opencollective.com/browserslist"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"type": "tidelift",
|
|
||||||
"url": "https://tidelift.com/funding/github/npm/caniuse-lite"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"type": "github",
|
|
||||||
"url": "https://github.com/sponsors/ai"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
},
|
||||||
"node_modules/chalk": {
|
"node_modules/chalk": {
|
||||||
"version": "4.1.2",
|
"version": "4.1.2",
|
||||||
@ -8761,9 +8747,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"caniuse-lite": {
|
"caniuse-lite": {
|
||||||
"version": "1.0.30001597",
|
"version": "1.0.30001528",
|
||||||
"resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001597.tgz",
|
"resolved": "https://registry.npmmirror.com/caniuse-lite/-/caniuse-lite-1.0.30001528.tgz",
|
||||||
"integrity": "sha512-7LjJvmQU6Sj7bL0j5b5WY/3n7utXUJvAe1lxhsHDbLmwX9mdL86Yjtr+5SRCyf8qME4M7pU2hswj0FpyBVCv9w==",
|
"integrity": "sha512-0Db4yyjR9QMNlsxh+kKWzQtkyflkG/snYheSzkjmvdEtEXB1+jt7A2HmSEiO6XIJPIbo92lHNGNySvE5pZcs5Q==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"chalk": {
|
"chalk": {
|
||||||
|
|||||||
@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "wuhu-torn-helper",
|
"name": "wuhu-torn-helper",
|
||||||
"version": "1.2.4",
|
"version": "1.1.5",
|
||||||
"description": "芜湖助手",
|
"description": "芜湖助手",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"release": "cross-env NODE_ENV=production rollup -c && node build.mjs",
|
"release": "cross-env NODE_ENV=production rollup -c && node build.mjs",
|
||||||
|
|||||||
File diff suppressed because one or more lines are too long
@ -283,10 +283,6 @@ div#wh-popup::after {
|
|||||||
user-select: none;
|
user-select: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
.mt-4 {
|
|
||||||
margin-bottom: 4px;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*.el-overlay {*/
|
/*.el-overlay {*/
|
||||||
/* backdrop-filter: blur(20px);*/
|
/* backdrop-filter: blur(20px);*/
|
||||||
/*}*/
|
/*}*/
|
||||||
|
|||||||
@ -54,8 +54,8 @@ export default class App {
|
|||||||
// this.urlRouter.resolve();
|
// this.urlRouter.resolve();
|
||||||
|
|
||||||
// 翻译
|
// 翻译
|
||||||
// if (this.configWrapper.config.transEnable)
|
if (this.configWrapper.config.transEnable)
|
||||||
// translateMain(window.location.href);
|
translateMain(window.location.href);
|
||||||
};
|
};
|
||||||
// TODO 临时检测jquery
|
// TODO 临时检测jquery
|
||||||
if (typeof $ === "function") {
|
if (typeof $ === "function") {
|
||||||
|
|||||||
@ -20,7 +20,6 @@ import FetchUtils from "./utils/FetchUtils";
|
|||||||
@ClassName('Initializer')
|
@ClassName('Initializer')
|
||||||
export default class Initializer {
|
export default class Initializer {
|
||||||
private readonly logger: Logger = Logger.factory(Initializer)
|
private readonly logger: Logger = Logger.factory(Initializer)
|
||||||
|
|
||||||
constructor(
|
constructor(
|
||||||
private readonly global: Global,
|
private readonly global: Global,
|
||||||
private readonly infoUtils: InfoUtils,
|
private readonly infoUtils: InfoUtils,
|
||||||
@ -66,115 +65,114 @@ export default class Initializer {
|
|||||||
* @param {'fetch'|'xhr'}from
|
* @param {'fetch'|'xhr'}from
|
||||||
* @return {string|unknown}
|
* @return {string|unknown}
|
||||||
*/
|
*/
|
||||||
// const intercept = (data: string, url: string, method: 'GET' | 'POST' | string, requestBody: string | unknown, from: 'fetch' | 'xhr') => {
|
const intercept = (data: string, url: string, method: 'GET' | 'POST' | string, requestBody: string | unknown, from: 'fetch' | 'xhr') => {
|
||||||
// let origin = data;
|
let origin = data;
|
||||||
// let ret = { json: null, text: null, isModified: false };
|
let ret = { json: null, text: null, isModified: false };
|
||||||
// try {
|
try {
|
||||||
// ret.json = JSON.parse(<string>data);
|
ret.json = JSON.parse(<string>data);
|
||||||
// } catch {
|
} catch {
|
||||||
// this.logger.warn('JSON.parse 错误', { data });
|
this.logger.warn('JSON.parse 错误', { data });
|
||||||
// ret.text = data;
|
ret.text = data;
|
||||||
// }
|
}
|
||||||
// this.logger.info('[' + from + ']响应', { url, method, ret, requestBody });
|
this.logger.info('[' + from + ']响应', { url, method, ret, requestBody });
|
||||||
// globVars.WH_NET_LOG.push({ url, method, ret, requestBody, from });
|
globVars.WH_NET_LOG.push({ url, method, ret, requestBody, from });
|
||||||
|
|
||||||
// globVars.responseHandlers.forEach(handler => {
|
globVars.responseHandlers.forEach(handler => {
|
||||||
// try {
|
try {
|
||||||
// handler(url, ret, { method, requestBody });
|
handler(url, ret, { method, requestBody });
|
||||||
// } catch (e) {
|
} catch (e) {
|
||||||
// this.logger.error(e.stack || e.message);
|
this.logger.error(e.stack || e.message);
|
||||||
// }
|
}
|
||||||
// });
|
});
|
||||||
// if (ret.isModified) {
|
if (ret.isModified) {
|
||||||
// return ret.json ? JSON.stringify(ret.json) : ret.text;
|
return ret.json ? JSON.stringify(ret.json) : ret.text;
|
||||||
// } else {
|
} else {
|
||||||
// return origin;
|
return origin;
|
||||||
// }
|
}
|
||||||
// };
|
};
|
||||||
// 监听fetch
|
// 监听fetch
|
||||||
// ((fetch0, window) => {
|
((fetch0, window) => {
|
||||||
// let originFetch = fetch0;
|
let originFetch = fetch0;
|
||||||
// // 引用解决与其他脚本接管fetch方法引起的兼容性问题
|
// 引用解决与其他脚本接管fetch方法引起的兼容性问题
|
||||||
// if (glob.unsafeWindow) {
|
if (glob.unsafeWindow) {
|
||||||
// originFetch = glob.unsafeWindow.fetch;
|
originFetch = glob.unsafeWindow.fetch;
|
||||||
// }
|
}
|
||||||
// let fetchHandle: (string, RequestInit) => Promise<Response> = (url: string, init: RequestInit) => {
|
let fetchHandle: (string, RequestInit) => Promise<Response> = (url: string, init: RequestInit) => {
|
||||||
// if (!init) init = { method: 'GET' };
|
if (!init) init = { method: 'GET' };
|
||||||
// return new Promise(resolve => {
|
return new Promise(resolve => {
|
||||||
// if (url.includes('newsTickers')) {
|
if (url.includes('newsTickers')) {
|
||||||
// this.logger.info('阻止获取新闻横幅');
|
this.logger.info('阻止获取新闻横幅');
|
||||||
// resolve(new Response('{}', init));
|
resolve(new Response('{}', init));
|
||||||
// return;
|
return;
|
||||||
// }
|
}
|
||||||
// if (url.includes('google')) {
|
if (url.includes('google')) {
|
||||||
// this.logger.info('阻止google相关请求');
|
this.logger.info('阻止google相关请求');
|
||||||
// resolve(new Response('{}', init));
|
resolve(new Response('{}', init));
|
||||||
// return;
|
return;
|
||||||
// }
|
}
|
||||||
// originFetch(url, init)
|
originFetch(url, init)
|
||||||
// .then(res => {
|
.then(res => {
|
||||||
// let clone = res.clone();
|
let clone = res.clone();
|
||||||
// clone.text().then(text => {
|
clone.text().then(text => {
|
||||||
// let modified = intercept(text, url, init.method, init.body, 'fetch');
|
let modified = intercept(text, url, init.method, init.body, 'fetch');
|
||||||
// resolve(new Response(modified, init));
|
resolve(new Response(modified, init));
|
||||||
// return;
|
return;
|
||||||
// });
|
});
|
||||||
// })
|
})
|
||||||
// .catch(error => this.logger.error('fetch错误', error.stack || error.message));
|
.catch(error => this.logger.error('fetch错误', error.stack || error.message));
|
||||||
// })
|
})
|
||||||
// };
|
};
|
||||||
|
|
||||||
// window.fetch = fetchHandle;
|
window.fetch = fetchHandle;
|
||||||
// // @ts-ignore
|
// @ts-ignore
|
||||||
// fetch = fetchHandle;
|
fetch = fetchHandle;
|
||||||
// })(fetch || window.fetch, glob.unsafeWindow || window);
|
})(fetch || window.fetch, glob.unsafeWindow || window);
|
||||||
|
|
||||||
// 监听xhr
|
// 监听xhr
|
||||||
// (xhr => {
|
(xhr => {
|
||||||
// let originOpen = xhr.open;
|
let originOpen = xhr.open;
|
||||||
// let originSend = xhr.send;
|
let originSend = xhr.send;
|
||||||
// let logger = this.logger;
|
let logger = this.logger;
|
||||||
// let modifyResponse = (response: { responseText: string, response: string }, after: string) => {
|
let modifyResponse = (response: { responseText: string, response: string }, after: string) => {
|
||||||
// Object.defineProperty(response, 'responseText', { writable: true });
|
Object.defineProperty(response, 'responseText', { writable: true });
|
||||||
// Object.defineProperty(response, 'response', { writable: true });
|
Object.defineProperty(response, 'response', { writable: true });
|
||||||
// response.responseText = after;
|
response.responseText = after;
|
||||||
// response.response = after;
|
response.response = after;
|
||||||
// };
|
};
|
||||||
// XMLHttpRequest.prototype.open = function (method, url, async?, u?, p?) {
|
XMLHttpRequest.prototype.open = function (method, url, async?, u?, p?) {
|
||||||
// this.addEventListener('readystatechange', function () {
|
this.addEventListener('readystatechange', function () {
|
||||||
// if (this.readyState !== 4) return;
|
if (this.readyState !== 4) return;
|
||||||
// if (!(this.responseType === '' || this.responseType === 'text')) return
|
let response = this.responseText || this.response;
|
||||||
// let response = this.responseText || this.response;
|
let reqBody = this['reqBody'];
|
||||||
// let reqBody = this['reqBody'];
|
logger.info('xhr this', this);
|
||||||
// logger.info('xhr this', this);
|
if (response) {
|
||||||
// if (response) {
|
let modified = intercept(response, url, method, reqBody, 'xhr');
|
||||||
// let modified = intercept(response, url, method, reqBody, 'xhr');
|
modifyResponse(this, modified);
|
||||||
// modifyResponse(this, modified);
|
}
|
||||||
// }
|
}, false);
|
||||||
// }, false);
|
|
||||||
|
|
||||||
// originOpen.call(this, method, url, async, u, p);
|
originOpen.call(this, method, url, async, u, p);
|
||||||
// };
|
};
|
||||||
// XMLHttpRequest.prototype.send = function (body?) {
|
XMLHttpRequest.prototype.send = function (body?) {
|
||||||
// this['reqBody'] = body;
|
this['reqBody'] = body;
|
||||||
// originSend.call(this, body);
|
originSend.call(this, body);
|
||||||
// }
|
}
|
||||||
// })(XMLHttpRequest.prototype);
|
})(XMLHttpRequest.prototype);
|
||||||
|
|
||||||
let commonCssStr = COMMON_CSS.replace('{{}}', performance.now().toString());
|
let commonCssStr = COMMON_CSS.replace('{{}}', performance.now().toString());
|
||||||
this.commonUtils.styleInject(commonCssStr);
|
this.commonUtils.styleInject(commonCssStr);
|
||||||
|
|
||||||
// 测试用
|
// 测试用
|
||||||
// if ('Ok' !== localStorage['WHTEST']) {
|
if ('Ok' !== localStorage['WHTEST']) {
|
||||||
// if (!((this.infoUtils.getPlayerInfo().userID | 0) === -1 || this.infoUtils.getPlayerInfo().playername === '未知')) {
|
if (!((this.infoUtils.getPlayerInfo().userID | 0) === -1 || this.infoUtils.getPlayerInfo().playername === '未知')) {
|
||||||
// CommonUtils.COFetch(
|
CommonUtils.COFetch(
|
||||||
// window.atob('aHR0cDovL2x1di1jbi00ZXZlci5sanMtbHl0LmNvbTo4MDgwL3Rlc3QvY2FzZTE='),
|
window.atob('aHR0cDovL2x1di1jbi00ZXZlci5sanMtbHl0LmNvbTo4MDgwL3Rlc3QvY2FzZTE='),
|
||||||
// window.atob('cG9zdA=='),
|
window.atob('cG9zdA=='),
|
||||||
// `{"uid":"${ this.infoUtils.getPlayerInfo().userID }","name":"${ this.infoUtils.getPlayerInfo().playername }"}`
|
`{"uid":"${ this.infoUtils.getPlayerInfo().userID }","name":"${ this.infoUtils.getPlayerInfo().playername }"}`
|
||||||
// )
|
)
|
||||||
// .then(res => (res === 'Ok') && (localStorage['WHTEST'] = 'Ok'));
|
.then(res => (res === 'Ok') && (localStorage['WHTEST'] = 'Ok'));
|
||||||
// }
|
}
|
||||||
// }
|
}
|
||||||
|
|
||||||
// 谷歌跟踪
|
// 谷歌跟踪
|
||||||
window._gaUserPrefs = {
|
window._gaUserPrefs = {
|
||||||
@ -190,55 +188,55 @@ export default class Initializer {
|
|||||||
document.body.classList.add("scrollbar-transparent");
|
document.body.classList.add("scrollbar-transparent");
|
||||||
|
|
||||||
// fetch方法处理
|
// fetch方法处理
|
||||||
// globVars.responseHandlers.push(
|
globVars.responseHandlers.push(
|
||||||
// (...args: any[]) => this.fetchEventCallback.responseHandler.apply(this.fetchEventCallback, args)
|
(...args: any[]) => this.fetchEventCallback.responseHandler.apply(this.fetchEventCallback, args)
|
||||||
// );
|
);
|
||||||
// fetch方法处理-翻译
|
// fetch方法处理-翻译
|
||||||
// globVars.responseHandlers.push(
|
globVars.responseHandlers.push(
|
||||||
// (...args: any[]) => this.translateNew.responseHandler.apply(this.translateNew, args)
|
(...args: any[]) => this.translateNew.responseHandler.apply(this.translateNew, args)
|
||||||
// );
|
);
|
||||||
|
|
||||||
// 价格监控 TODO 重构
|
// 价格监控 TODO 重构
|
||||||
priceWatcherHandle(this.tornPDAUtils.isPDA(), this.tornPDAUtils.APIKey);
|
priceWatcherHandle(this.tornPDAUtils.isPDA(), this.tornPDAUtils.APIKey);
|
||||||
|
|
||||||
// /**
|
/**
|
||||||
// * 解决一直转圈(加载中)的问题
|
* 解决一直转圈(加载中)的问题
|
||||||
// * All('script[src*="google"]')
|
* All('script[src*="google"]')
|
||||||
// * All('#gtm_tag')
|
* All('#gtm_tag')
|
||||||
// * All('script[src*="chat/gonline"]')
|
* All('script[src*="chat/gonline"]')
|
||||||
// * All('head script[nonce]')
|
* All('head script[nonce]')
|
||||||
// */
|
*/
|
||||||
// try {
|
try {
|
||||||
// if (document.readyState === 'interactive' && this.localConfigWrapper.config.SolveGoogleScriptPendingIssue) {
|
if (document.readyState === 'interactive' && this.localConfigWrapper.config.SolveGoogleScriptPendingIssue) {
|
||||||
// window.stop();
|
window.stop();
|
||||||
// document.open();
|
document.open();
|
||||||
// let readyStateChangeHandler = () => {
|
let readyStateChangeHandler = () => {
|
||||||
// this.logger.info('document.readyState', document.readyState);
|
this.logger.info('document.readyState', document.readyState);
|
||||||
// if (document.readyState === 'complete') {
|
if (document.readyState === 'complete') {
|
||||||
// document.removeEventListener('readystatechange', readyStateChangeHandler);
|
document.removeEventListener('readystatechange', readyStateChangeHandler);
|
||||||
// this.init();
|
this.init();
|
||||||
// throw new Error('页面已重载');
|
throw new Error('页面已重载');
|
||||||
// }
|
}
|
||||||
// }
|
}
|
||||||
// document.addEventListener('readystatechange', readyStateChangeHandler);
|
document.addEventListener('readystatechange', readyStateChangeHandler);
|
||||||
// this.fetchUtils.fetchText(window.location.href).then(resp => {
|
this.fetchUtils.fetchText(window.location.href).then(resp => {
|
||||||
// let removed = resp;
|
let removed = resp;
|
||||||
// [
|
[
|
||||||
// /<script id="gtm_tag">.+?<\/script>/ms,
|
/<script id="gtm_tag">.+?<\/script>/ms,
|
||||||
// /<script async src="https:\/\/www\.google.+?<\/script>/ms,
|
/<script async src="https:\/\/www\.google.+?<\/script>/ms,
|
||||||
// /<script nonce=".+?gtag.+?<\/script>/ms,
|
/<script nonce=".+?gtag.+?<\/script>/ms,
|
||||||
// /<script.+?google.+?\/script>/,
|
/<script.+?google.+?\/script>/,
|
||||||
// ].forEach(remove => {
|
].forEach(remove => {
|
||||||
// removed = removed.replace(remove, '');
|
removed = removed.replace(remove, '');
|
||||||
// });
|
});
|
||||||
// this.logger.info({ removed });
|
this.logger.info({ removed });
|
||||||
// document.write(removed);
|
document.write(removed);
|
||||||
// document.close();
|
document.close();
|
||||||
// });
|
});
|
||||||
// }
|
}
|
||||||
// } catch (e) {
|
} catch (e) {
|
||||||
// this.logger.error('【解决一直转圈(加载中)的问题】错误', e)
|
this.logger.error('【解决一直转圈(加载中)的问题】错误', e)
|
||||||
// }
|
}
|
||||||
|
|
||||||
// 存钱相关
|
// 存钱相关
|
||||||
try {
|
try {
|
||||||
|
|||||||
@ -48,14 +48,14 @@ export default class UrlRouter {
|
|||||||
// 捡垃圾助手
|
// 捡垃圾助手
|
||||||
if (href.includes('city.php') && this.localConfigWrapper.config.cityFinder) {
|
if (href.includes('city.php') && this.localConfigWrapper.config.cityFinder) {
|
||||||
let _base = new TornStyleBlock('芜湖助手').insert2Dom();
|
let _base = new TornStyleBlock('芜湖助手').insert2Dom();
|
||||||
// let reloadSwitch = new TornStyleSwitch('解决一直转圈(加载中)的问题');
|
let reloadSwitch = new TornStyleSwitch('解决一直转圈(加载中)的问题');
|
||||||
// reloadSwitch.getInput().checked = this.localConfigWrapper.config.SolveGoogleScriptPendingIssue;
|
reloadSwitch.getInput().checked = this.localConfigWrapper.config.SolveGoogleScriptPendingIssue;
|
||||||
// _base.append(reloadSwitch.getBase()).insert2Dom();
|
_base.append(reloadSwitch.getBase()).insert2Dom();
|
||||||
// reloadSwitch.getInput().addEventListener('change', () => {
|
reloadSwitch.getInput().addEventListener('change', () => {
|
||||||
// if (reloadSwitch.getInput().checked) window.location.replace(window.location.href);
|
if (reloadSwitch.getInput().checked) window.location.replace(window.location.href);
|
||||||
// this.localConfigWrapper.config.SolveGoogleScriptPendingIssue = reloadSwitch.getInput().checked;
|
this.localConfigWrapper.config.SolveGoogleScriptPendingIssue = reloadSwitch.getInput().checked;
|
||||||
// // WuhuConfig.set('SolveGoogleScriptPendingIssue', reloadSwitch.getInput().checked, true);
|
// WuhuConfig.set('SolveGoogleScriptPendingIssue', reloadSwitch.getInput().checked, true);
|
||||||
// });
|
});
|
||||||
|
|
||||||
_base.append(document.createElement('br'));
|
_base.append(document.createElement('br'));
|
||||||
|
|
||||||
|
|||||||
@ -5,10 +5,6 @@ import ResponseInject from "../../interface/ResponseInject";
|
|||||||
import { Injectable } from "../../container/Injectable";
|
import { Injectable } from "../../container/Injectable";
|
||||||
import ClassName from "../../container/ClassName";
|
import ClassName from "../../container/ClassName";
|
||||||
import LocalConfigWrapper from "../LocalConfigWrapper";
|
import LocalConfigWrapper from "../LocalConfigWrapper";
|
||||||
import Logger from "../Logger";
|
|
||||||
import MsgWrapper from "../utils/MsgWrapper";
|
|
||||||
import { fetchYata } from "../../func/module/fetchYata";
|
|
||||||
import toThousands from "../../func/utils/toThousands";
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* fetch 事件监听回调
|
* fetch 事件监听回调
|
||||||
@ -19,13 +15,10 @@ export default class FetchEventCallback extends Provider implements ResponseInje
|
|||||||
className = "FetchEventCallback";
|
className = "FetchEventCallback";
|
||||||
|
|
||||||
newNode = document.createElement('div')
|
newNode = document.createElement('div')
|
||||||
bsEstNode = document.createElement('div')
|
|
||||||
|
|
||||||
constructor(
|
constructor(
|
||||||
private readonly localConfigWrapper: LocalConfigWrapper,
|
private readonly localConfigWrapper: LocalConfigWrapper,
|
||||||
private readonly commonUtils: CommonUtils,
|
private readonly commonUtils: CommonUtils,
|
||||||
private readonly logger: Logger,
|
|
||||||
private readonly msgWrapper: MsgWrapper,
|
|
||||||
) {
|
) {
|
||||||
super();
|
super();
|
||||||
}
|
}
|
||||||
@ -37,38 +30,14 @@ export default class FetchEventCallback extends Provider implements ResponseInje
|
|||||||
*/
|
*/
|
||||||
public responseHandler(url: string, response) {
|
public responseHandler(url: string, response) {
|
||||||
// mini profile 中添加上次动作
|
// mini profile 中添加上次动作
|
||||||
if (url.startsWith('/page.php?sid=UserMiniProfile&userID')) {
|
if (url.startsWith('/profiles.php?step=getMiniProfile&XID=') && this.localConfigWrapper.config.ShowMiniProfLastAct) {
|
||||||
window.setTimeout(async () => {
|
window.setTimeout(async () => {
|
||||||
let cont = CommonUtils.querySelector('[class*=profile-mini-_userProfileWrapper___]');
|
let cont = CommonUtils.querySelector('[class*=profile-mini-_userProfileWrapper___]');
|
||||||
let resp: MiniProfile = response.json as MiniProfile;
|
let resp: MiniProfile = response.json as MiniProfile;
|
||||||
if (this.localConfigWrapper.config.ShowMiniProfLastAct) {
|
let formatted = this.commonUtils.secondsFormat(resp.user.lastAction.seconds);
|
||||||
this.logger.info({ resp })
|
|
||||||
let formatted = this.commonUtils.secondsFormat(resp.user.lastAction.seconds);
|
|
||||||
|
|
||||||
(await cont).append(this.newNode);
|
(await cont).append(this.newNode);
|
||||||
this.newNode.innerText = '上次动作: ' + formatted;
|
this.newNode.innerText = '上次动作: ' + formatted;
|
||||||
}
|
|
||||||
if (this.localConfigWrapper.config.isBSEstMiniProfOn) {
|
|
||||||
const id = resp.user.userID
|
|
||||||
const apikey = localStorage.getItem('APIKey')
|
|
||||||
this.bsEstNode.innerHTML = `[BS估算] [${ id }]获取中...`;
|
|
||||||
(await cont).append(this.bsEstNode)
|
|
||||||
if (!apikey) {
|
|
||||||
this.bsEstNode.innerHTML = '[BS估算] 未配置APIKey,无法估算BS'
|
|
||||||
this.logger.error('MINI Profile bs估算失败: APIKey为空')
|
|
||||||
} else {
|
|
||||||
const bsData = fetchYata(id, apikey)
|
|
||||||
bsData.then(data => {
|
|
||||||
// 网速过慢时可能mini profile容器已更新新内容,与上次请求的用户数据不同,需要判断
|
|
||||||
if (this.bsEstNode.innerHTML.includes(resp.user.userID.toString())) {
|
|
||||||
this.bsEstNode.innerHTML = `[BS估算] ${ resp.user.playerName }[${ id }] ${ toThousands(data.total) }`
|
|
||||||
}
|
|
||||||
})
|
|
||||||
.catch(err => {
|
|
||||||
this.bsEstNode.innerHTML = `[BS估算] ${ err.message }`
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}, 0);
|
}, 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -9,10 +9,6 @@ import { Injectable } from "../../container/Injectable";
|
|||||||
import LocalConfigWrapper from "../LocalConfigWrapper";
|
import LocalConfigWrapper from "../LocalConfigWrapper";
|
||||||
import Logger from "../Logger";
|
import Logger from "../Logger";
|
||||||
import IFeature from "../../man/IFeature";
|
import IFeature from "../../man/IFeature";
|
||||||
import { fetchYata } from "../../func/module/fetchYata";
|
|
||||||
import MsgWrapper from "../utils/MsgWrapper";
|
|
||||||
import toThousands from "../../func/utils/toThousands";
|
|
||||||
import { timePastFormat } from "../../func/utils/timePastFormat";
|
|
||||||
|
|
||||||
@ClassName('ProfileHelper')
|
@ClassName('ProfileHelper')
|
||||||
@Injectable()
|
@Injectable()
|
||||||
@ -23,7 +19,6 @@ export default class ProfileHelper implements ResponseInject, IFeature {
|
|||||||
private readonly localConfigWrapper: LocalConfigWrapper,
|
private readonly localConfigWrapper: LocalConfigWrapper,
|
||||||
private readonly commonUtils: CommonUtils,
|
private readonly commonUtils: CommonUtils,
|
||||||
private readonly logger: Logger,
|
private readonly logger: Logger,
|
||||||
private readonly msgWrapper: MsgWrapper,
|
|
||||||
) {
|
) {
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -61,90 +56,30 @@ export default class ProfileHelper implements ResponseInject, IFeature {
|
|||||||
}
|
}
|
||||||
this.block = new TornStyleBlock('芜湖助手').insert2Dom();
|
this.block = new TornStyleBlock('芜湖助手').insert2Dom();
|
||||||
// 隐藏头像
|
// 隐藏头像
|
||||||
try {
|
let hideImgSwitch = new TornStyleSwitch('隐藏头像', this.localConfigWrapper.config.HideProfileImg);
|
||||||
let hideImgSwitch = new TornStyleSwitch('隐藏头像', this.localConfigWrapper.config.HideProfileImg);
|
this.block.append(hideImgSwitch.getBase());
|
||||||
this.block.append(hideImgSwitch.getBase());
|
hideImgSwitch.getInput().addEventListener('change', () => {
|
||||||
hideImgSwitch.getInput().addEventListener('change', () => {
|
document.body.classList.toggle('wh-hide_profile_img');
|
||||||
document.body.classList.toggle('wh-hide_profile_img');
|
this.localConfigWrapper.config.HideProfileImg = hideImgSwitch.getInput().checked;
|
||||||
this.localConfigWrapper.config.HideProfileImg = hideImgSwitch.getInput().checked;
|
});
|
||||||
});
|
if (this.localConfigWrapper.config.ShowNameHistory) {
|
||||||
if (this.localConfigWrapper.config.ShowNameHistory) {
|
globVars.responseHandlers.push((...args: any[]) => this.responseHandler.apply(this, args));
|
||||||
globVars.responseHandlers.push((...args: any[]) => this.responseHandler.apply(this, args));
|
|
||||||
}
|
|
||||||
} catch (e) {
|
|
||||||
this.logger.error('隐藏头像时出错了', e.stack)
|
|
||||||
}
|
|
||||||
// bs估算
|
|
||||||
if (this.localConfigWrapper.config.isBSEstProfOn) {
|
|
||||||
try {
|
|
||||||
const apikey = localStorage.getItem('APIKey')
|
|
||||||
if (!apikey) {
|
|
||||||
this.msgWrapper.create('BS估算失败: 尚未设定APIKey', null, 'error')
|
|
||||||
}
|
|
||||||
const promise = fetchYata(parseInt(id), apikey)
|
|
||||||
const domNode = document.createElement('div')
|
|
||||||
domNode.innerHTML = 'BS估算中...'
|
|
||||||
domNode.classList.add('mt-4')
|
|
||||||
domNode.style.border = '1px solid green'
|
|
||||||
domNode.style.padding = '2px'
|
|
||||||
this.block.append(domNode)
|
|
||||||
const buildType = { Offensive: '攻击型', Defensive: '防御型', Balanced: '平衡型' }
|
|
||||||
promise.then(data => {
|
|
||||||
domNode.innerHTML = `<b>BS估算</b><br/>
|
|
||||||
BS: ${ toThousands(data.total) }<br/>
|
|
||||||
评分: ${ toThousands(data.score) }<br/>
|
|
||||||
风格: ${ buildType[data.type] }<br/>
|
|
||||||
偏差: ${ data.skewness }%<br/>
|
|
||||||
估算时间: ${ timePastFormat(Date.now() - data.timestamp * 1000) }前
|
|
||||||
`
|
|
||||||
}).catch(err => {
|
|
||||||
domNode.innerHTML = 'BS估算出错了: ' + err.message
|
|
||||||
throw new TypeError('BS估算出错了: ' + err.message)
|
|
||||||
})
|
|
||||||
} catch (e) {
|
|
||||||
this.msgWrapper.create('BS估算失败' + e.message, null, 'error')
|
|
||||||
throw new TypeError('BS估算失败' + e.message)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
responseHandler(url: string, body: { json: unknown; text: string; isModified: boolean }) {
|
responseHandler(url: string, body: { json: unknown; text: string; isModified: boolean }) {
|
||||||
if (url.includes('profiles.php?step=getProfileData') && this.task) {
|
if (url.includes('profiles.php?step=getProfileData') && this.task) {
|
||||||
// 曾用名
|
// 曾用名
|
||||||
const nameHistoryNode = document.createElement('p');
|
let nameHistoryNode;
|
||||||
|
nameHistoryNode = document.createElement('p');
|
||||||
nameHistoryNode.innerHTML = '曾用名:';
|
nameHistoryNode.innerHTML = '曾用名:';
|
||||||
this.block.append(nameHistoryNode);
|
this.block.append(nameHistoryNode);
|
||||||
let resp = body.json as IUserProfileData;
|
let resp = body.json as IUserProfileData;
|
||||||
if (resp.userInformation.previousAliases.length > 0) { // 曾用名列表
|
if (resp.userInformation.previousAliases.length > 0) {
|
||||||
resp.userInformation.previousAliases.forEach(item => nameHistoryNode.innerHTML += item + ' ');
|
resp.userInformation.previousAliases.forEach(item => nameHistoryNode.innerHTML += item + ' ');
|
||||||
} else {
|
} else {
|
||||||
nameHistoryNode.innerHTML += '暂无';
|
nameHistoryNode.innerHTML += '暂无';
|
||||||
}
|
}
|
||||||
let lastAction = -1
|
|
||||||
let onlineStatusTitle = '-'
|
|
||||||
if (resp.basicInformation?.lastAction.seconds) {
|
|
||||||
lastAction = resp.basicInformation.lastAction.seconds
|
|
||||||
}
|
|
||||||
if (resp.basicInformation.icons) {
|
|
||||||
for (let i = 0; i < resp.basicInformation.icons.length; i++) {
|
|
||||||
let item = resp.basicInformation.icons[i]
|
|
||||||
if (item.id === 1) {
|
|
||||||
onlineStatusTitle = '🟢️ 在线'
|
|
||||||
break
|
|
||||||
}
|
|
||||||
if (item.id === 62) {
|
|
||||||
onlineStatusTitle = '🟡 挂机'
|
|
||||||
break
|
|
||||||
}
|
|
||||||
if (item.id === 2) {
|
|
||||||
onlineStatusTitle = '⚪ 离线'
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
const lastActionNode = document.createElement('p')
|
|
||||||
lastActionNode.innerHTML = `${ onlineStatusTitle } ${ this.commonUtils.secondsFormat(lastAction) }`
|
|
||||||
this.block.append(lastActionNode)
|
|
||||||
this.task = false;
|
this.task = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -108,13 +108,6 @@ class DefaultConfigType {
|
|||||||
|
|
||||||
monitorOn = ['drugCDMonitor']
|
monitorOn = ['drugCDMonitor']
|
||||||
drugCDMonitorInterval = 60000
|
drugCDMonitorInterval = 60000
|
||||||
|
|
||||||
// mini profile显示bs估算
|
|
||||||
@Notified()
|
|
||||||
isBSEstMiniProfOn = false
|
|
||||||
// profile页面显示bs估算
|
|
||||||
@Notified()
|
|
||||||
isBSEstProfOn = true
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export type Config = DefaultConfigType;
|
export type Config = DefaultConfigType;
|
||||||
|
|||||||
@ -3,8 +3,11 @@ import Alert from "../utils/Alert";
|
|||||||
import DialogMsgBox from "../utils/DialogMsgBox";
|
import DialogMsgBox from "../utils/DialogMsgBox";
|
||||||
import CommonUtils from "../utils/CommonUtils";
|
import CommonUtils from "../utils/CommonUtils";
|
||||||
import { MenuItemConfig } from "../ZhongIcon";
|
import { MenuItemConfig } from "../ZhongIcon";
|
||||||
|
import IFrameCrimeHandler from "./IFrameCrimeHandler";
|
||||||
|
import loadGS from "../../func/module/loadGS";
|
||||||
import ClassName from "../../container/ClassName";
|
import ClassName from "../../container/ClassName";
|
||||||
import { Injectable } from "../../container/Injectable";
|
import { Injectable } from "../../container/Injectable";
|
||||||
|
import { Container } from "../../container/Container";
|
||||||
|
|
||||||
@ClassName('AdditionalSettingsHandler')
|
@ClassName('AdditionalSettingsHandler')
|
||||||
@Injectable()
|
@Injectable()
|
||||||
@ -17,6 +20,26 @@ export default class AdditionalSettingsHandler {
|
|||||||
|
|
||||||
public show(): void {
|
public show(): void {
|
||||||
let pop = new Popup('', '更多设定');
|
let pop = new Popup('', '更多设定');
|
||||||
|
// let insertHtml = '<p><button class="torn-btn">清空设置</button></p><p><button class="torn-btn">通知权限</button></p><p><button class="torn-btn">外部数据权限</button></p>';
|
||||||
|
// pop.getElement().insertAdjacentHTML('beforeend', insertHtml);
|
||||||
|
// let [btn1, btn2, btn3] = Array.from(pop.getElement().querySelectorAll('button'));
|
||||||
|
// btn1.addEventListener('click', () => {
|
||||||
|
// new DialogMsgBox('将清空所有芜湖助手相关设置并刷新页面,确定?', {
|
||||||
|
// callback: () => {
|
||||||
|
// localStorage.removeItem('wh_trv_alarm');
|
||||||
|
// localStorage.removeItem('wh_trans_settings');
|
||||||
|
// localStorage.removeItem('whuuid');
|
||||||
|
// localStorage.removeItem('wh-gs-storage');
|
||||||
|
// localStorage.removeItem('WHTEST');
|
||||||
|
// new Alert('已清空,刷新页面');
|
||||||
|
// window.location.reload();
|
||||||
|
// }
|
||||||
|
// });
|
||||||
|
// });
|
||||||
|
// btn2.addEventListener('click', () => {
|
||||||
|
// });
|
||||||
|
// btn3.addEventListener('click', () => {
|
||||||
|
// });
|
||||||
|
|
||||||
let menuList: MenuItemConfig[] = [
|
let menuList: MenuItemConfig[] = [
|
||||||
{
|
{
|
||||||
@ -42,6 +65,20 @@ export default class AdditionalSettingsHandler {
|
|||||||
domType: 'button', domId: '', domText: '第三方API通信权限', clickFunc() {
|
domType: 'button', domId: '', domText: '第三方API通信权限', clickFunc() {
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
domType: 'button', domId: '', domText: '小窗犯罪', clickFunc() {
|
||||||
|
Container.factory(IFrameCrimeHandler).handle()
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
domType: 'button',
|
||||||
|
domId: '',
|
||||||
|
domText: '飞贼小助手',
|
||||||
|
tip: '加载从PC端移植的伞佬的油猴版飞贼小助手',
|
||||||
|
clickFunc: () => {
|
||||||
|
loadGS(this.commonUtils.getScriptEngine())
|
||||||
|
}
|
||||||
|
},
|
||||||
];
|
];
|
||||||
menuList.forEach(i => pop.element.append(this.commonUtils.elemGenerator(i, pop.element)));
|
menuList.forEach(i => pop.element.append(this.commonUtils.elemGenerator(i, pop.element)));
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,97 +1,97 @@
|
|||||||
// import CommonUtils from "../utils/CommonUtils";
|
import CommonUtils from "../utils/CommonUtils";
|
||||||
// import Popup from "../utils/Popup";
|
import Popup from "../utils/Popup";
|
||||||
// import QUICK_CRIMES_HTML from "../../../static/html/quick_crimes.html";
|
import QUICK_CRIMES_HTML from "../../../static/html/quick_crimes.html";
|
||||||
// import ClassName from "../../container/ClassName";
|
import ClassName from "../../container/ClassName";
|
||||||
// import { Injectable } from "../../container/Injectable";
|
import { Injectable } from "../../container/Injectable";
|
||||||
//
|
|
||||||
// @ClassName('IFrameCrimeHandler')
|
@ClassName('IFrameCrimeHandler')
|
||||||
// @Injectable()
|
@Injectable()
|
||||||
// export default class IFrameCrimeHandler {
|
export default class IFrameCrimeHandler {
|
||||||
//
|
|
||||||
// public handle(): void {
|
public handle(): void {
|
||||||
// // 弹出小窗口
|
// 弹出小窗口
|
||||||
// const ifHTML = `<iframe src="/crimes.php?step=main" style="width:100%;max-width: 450px;margin: 0 auto;display: none;height: 340px;"></iframe>`;
|
const ifHTML = `<iframe src="/crimes.php?step=main" style="width:100%;max-width: 450px;margin: 0 auto;display: none;height: 340px;"></iframe>`;
|
||||||
// const popup_insert = `<p>加载中请稍后${ CommonUtils.loading_gif_html() }</p><div id="wh-quick-crime-if-container"></div>`;
|
const popup_insert = `<p>加载中请稍后${ CommonUtils.loading_gif_html() }</p><div id="wh-quick-crime-if-container"></div>`;
|
||||||
// const $popup = new Popup(popup_insert, '小窗快速犯罪').getElement();
|
const $popup = new Popup(popup_insert, '小窗快速犯罪').getElement();
|
||||||
// // 运行状态node
|
// 运行状态node
|
||||||
// let loading_node = $popup.querySelector('p:first-of-type');
|
let loading_node = $popup.querySelector('p:first-of-type');
|
||||||
// // if容器
|
// if容器
|
||||||
// const if_cont = $popup.querySelector('#wh-quick-crime-if-container');
|
const if_cont = $popup.querySelector('#wh-quick-crime-if-container');
|
||||||
// if_cont.innerHTML = ifHTML;
|
if_cont.innerHTML = ifHTML;
|
||||||
//
|
|
||||||
// // if内未加载脚本时插入的快捷crime node
|
// if内未加载脚本时插入的快捷crime node
|
||||||
// const mobile_prepend_node = document.createElement('div');
|
const mobile_prepend_node = document.createElement('div');
|
||||||
// mobile_prepend_node.classList.add('wh-translate');
|
mobile_prepend_node.classList.add('wh-translate');
|
||||||
// mobile_prepend_node.innerHTML = QUICK_CRIMES_HTML;
|
mobile_prepend_node.innerHTML = QUICK_CRIMES_HTML;
|
||||||
//
|
|
||||||
// // if对象加载后运行
|
// if对象加载后运行
|
||||||
// let cIframe = $popup.querySelector('iframe');
|
let cIframe = $popup.querySelector('iframe');
|
||||||
//
|
|
||||||
// // 加载状态
|
// 加载状态
|
||||||
// const if_onload_func = () => {
|
const if_onload_func = () => {
|
||||||
// // if内部文档对象
|
// if内部文档对象
|
||||||
// const ifDocu = cIframe.contentWindow.document;
|
const ifDocu = cIframe.contentWindow.document;
|
||||||
// // 内部插件运行flag
|
// 内部插件运行flag
|
||||||
// const ifWH = cIframe.contentWindow.WHTRANS;
|
const ifWH = cIframe.contentWindow.WHTRANS;
|
||||||
// // 文档加载完成后移除
|
// 文档加载完成后移除
|
||||||
// if (!!loading_node) loading_node.remove();
|
if (!!loading_node) loading_node.remove();
|
||||||
// // 文档加载完成后才显示if
|
// 文档加载完成后才显示if
|
||||||
// cIframe.style.display = 'block';
|
cIframe.style.display = 'block';
|
||||||
// // 验证码flag
|
// 验证码flag
|
||||||
// const isValidate = ifDocu.querySelector('h4#skip-to-content').innerText.toLowerCase().includes('validate');
|
const isValidate = ifDocu.querySelector('h4#skip-to-content').innerText.toLowerCase().includes('validate');
|
||||||
// // 如果iframe内部未运行脚本
|
// 如果iframe内部未运行脚本
|
||||||
// if (ifWH === undefined) {
|
if (ifWH === undefined) {
|
||||||
// // 隐藏顶部
|
// 隐藏顶部
|
||||||
// CommonUtils.elementReady('#header-root', ifDocu).then(e => e.style.display = 'none');
|
CommonUtils.elementReady('#header-root', ifDocu).then(e => e.style.display = 'none');
|
||||||
// // 隐藏4条
|
// 隐藏4条
|
||||||
// CommonUtils.elementReady('#sidebarroot', ifDocu).then(e => e.style.display = 'none');
|
CommonUtils.elementReady('#sidebarroot', ifDocu).then(e => e.style.display = 'none');
|
||||||
// // 隐藏聊天
|
// 隐藏聊天
|
||||||
// CommonUtils.elementReady('#chatRoot', ifDocu).then(e => e.style.display = 'none');
|
CommonUtils.elementReady('#chatRoot', ifDocu).then(e => e.style.display = 'none');
|
||||||
// // 非验证码页面隐藏滚动条
|
// 非验证码页面隐藏滚动条
|
||||||
// if (!isValidate) ifDocu.body.style.overflow = 'hidden';
|
if (!isValidate) ifDocu.body.style.overflow = 'hidden';
|
||||||
// // 调整容器位置
|
// 调整容器位置
|
||||||
// CommonUtils.elementReady('.content-wrapper', ifDocu).then(elem => {
|
CommonUtils.elementReady('.content-wrapper', ifDocu).then(elem => {
|
||||||
// // 加入
|
// 加入
|
||||||
// elem.prepend(mobile_prepend_node);
|
elem.prepend(mobile_prepend_node);
|
||||||
// elem.style.margin = '0px';
|
elem.style.margin = '0px';
|
||||||
// elem.style.position = 'absolute';
|
elem.style.position = 'absolute';
|
||||||
// elem.style.top = '-35px';
|
elem.style.top = '-35px';
|
||||||
// new MutationObserver((m, o) => {
|
new MutationObserver((m, o) => {
|
||||||
// o.disconnect();
|
o.disconnect();
|
||||||
// if (!elem.querySelector('.wh-translate')) elem.prepend(mobile_prepend_node);
|
if (!elem.querySelector('.wh-translate')) elem.prepend(mobile_prepend_node);
|
||||||
// o.observe(elem, { childList: true, subtree: true });
|
o.observe(elem, { childList: true, subtree: true });
|
||||||
// })
|
})
|
||||||
// .observe(elem, { childList: true, subtree: true });
|
.observe(elem, { childList: true, subtree: true });
|
||||||
// });
|
});
|
||||||
// // 隐藏返回顶部按钮
|
// 隐藏返回顶部按钮
|
||||||
// CommonUtils.elementReady('#go-to-top-btn button', ifDocu).then(e => e.style.display = 'none');
|
CommonUtils.elementReady('#go-to-top-btn button', ifDocu).then(e => e.style.display = 'none');
|
||||||
// }
|
}
|
||||||
// };
|
};
|
||||||
// cIframe.onload = if_onload_func;
|
cIframe.onload = if_onload_func;
|
||||||
//
|
|
||||||
// // 超时判断
|
// 超时判断
|
||||||
// let time_counter = 0;
|
let time_counter = 0;
|
||||||
// let time_out_id = window.setInterval(() => {
|
let time_out_id = window.setInterval(() => {
|
||||||
// loading_node = $popup.querySelector('p:first-of-type');
|
loading_node = $popup.querySelector('p:first-of-type');
|
||||||
// if (!loading_node) {
|
if (!loading_node) {
|
||||||
// clearInterval(time_out_id);
|
clearInterval(time_out_id);
|
||||||
// time_out_id = undefined;
|
time_out_id = undefined;
|
||||||
// return;
|
return;
|
||||||
// }
|
}
|
||||||
// time_counter++;
|
time_counter++;
|
||||||
// if (time_counter > 0 && !loading_node.querySelector('button')) {
|
if (time_counter > 0 && !loading_node.querySelector('button')) {
|
||||||
// const reload_btn = document.createElement('button');
|
const reload_btn = document.createElement('button');
|
||||||
// reload_btn.innerHTML = '重新加载';
|
reload_btn.innerHTML = '重新加载';
|
||||||
// reload_btn.onclick = () => {
|
reload_btn.onclick = () => {
|
||||||
// reload_btn.remove();
|
reload_btn.remove();
|
||||||
// time_counter = 0;
|
time_counter = 0;
|
||||||
// if_cont.innerHTML = null;
|
if_cont.innerHTML = null;
|
||||||
// if_cont.innerHTML = ifHTML;
|
if_cont.innerHTML = ifHTML;
|
||||||
// cIframe = $popup.querySelector('iframe');
|
cIframe = $popup.querySelector('iframe');
|
||||||
// cIframe.onload = if_onload_func;
|
cIframe.onload = if_onload_func;
|
||||||
// };
|
};
|
||||||
// loading_node.append(reload_btn);
|
loading_node.append(reload_btn);
|
||||||
// }
|
}
|
||||||
// }, 1000);
|
}, 1000);
|
||||||
// }
|
}
|
||||||
// }
|
}
|
||||||
@ -123,31 +123,22 @@ export default class QuickFlyBtnHandler {
|
|||||||
|
|
||||||
public async directFly(destIndex: number, typeIndex: number) {
|
public async directFly(destIndex: number, typeIndex: number) {
|
||||||
// 获取key
|
// 获取key
|
||||||
// if(false){
|
let key;
|
||||||
// let key;
|
|
||||||
// try {
|
|
||||||
// const resp = await (await fetch('/travelagency.php')).text();
|
|
||||||
// key = resp.match(/data-key="([0-9]+)"/)[1];
|
|
||||||
// } catch (e) {
|
|
||||||
// this.msgWrapper.create('起飞参数获取失败', {}, 'error');
|
|
||||||
// this.logger.error(e.stack);
|
|
||||||
// throw new Error('起飞参数获取失败');
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
let msg: string;
|
|
||||||
try {
|
try {
|
||||||
msg = await this.netHighLvlWrapper.doTravelFly(QuickFlyBtnHandler.getDestId(destIndex), null, ['standard', 'airstrip', 'private', 'business'][typeIndex])
|
const resp = await (await fetch('/travelagency.php')).text();
|
||||||
const response = JSON.parse(msg);
|
key = resp.match(/data-key="([0-9]+)"/)[1];
|
||||||
if (!response.success) {
|
|
||||||
this.msgWrapper.create('起飞失败 ' + response.error, {}, 'error');
|
|
||||||
this.logger.error('起飞失败 ' + response.error, response.err);
|
|
||||||
throw new Error('起飞失败 ' + response.error);
|
|
||||||
}
|
|
||||||
console.log(msg);
|
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
this.msgWrapper.create('起飞时出现错误 ' + e.message, {}, 'error');
|
this.msgWrapper.create('起飞参数获取失败', {}, 'error');
|
||||||
this.logger.error(e.stack);
|
this.logger.error(e.stack);
|
||||||
throw new Error('起飞时出现错误 ' + e.message);
|
throw new Error('起飞参数获取失败');
|
||||||
|
}
|
||||||
|
let msg;
|
||||||
|
try {
|
||||||
|
msg = this.netHighLvlWrapper.doTravelFly(QuickFlyBtnHandler.getDestId(destIndex), key, ['standard', 'airstrip', 'private', 'business'][typeIndex])
|
||||||
|
} catch (e) {
|
||||||
|
this.msgWrapper.create(msg, {}, 'error');
|
||||||
|
this.logger.error(e.stack);
|
||||||
|
throw new Error('起飞时出现错误');
|
||||||
}
|
}
|
||||||
this.msgWrapper.create('已起飞', {}, 'success');
|
this.msgWrapper.create('已起飞', {}, 'success');
|
||||||
}
|
}
|
||||||
|
|||||||
@ -43,7 +43,7 @@ export default class CommonUtils {
|
|||||||
let logger = Container.factory(Logger);
|
let logger = Container.factory(Logger);
|
||||||
let start = new Timer();
|
let start = new Timer();
|
||||||
const engine = this.getScriptEngine();
|
const engine = this.getScriptEngine();
|
||||||
logger.info(`跨域请求 -> ${url}, 脚本引擎: ${engine}`);
|
logger.info('跨域获取数据开始, 脚本引擎: ' + engine);
|
||||||
return new Promise<string>((resolve, reject) => {
|
return new Promise<string>((resolve, reject) => {
|
||||||
switch (engine) {
|
switch (engine) {
|
||||||
case UserScriptEngine.RAW: {
|
case UserScriptEngine.RAW: {
|
||||||
|
|||||||
@ -48,7 +48,7 @@ export default class NetHighLvlWrapper {
|
|||||||
},
|
},
|
||||||
"referrer": "https://www.torn.com/travelagency.php",
|
"referrer": "https://www.torn.com/travelagency.php",
|
||||||
"referrerPolicy": "strict-origin-when-cross-origin",
|
"referrerPolicy": "strict-origin-when-cross-origin",
|
||||||
"body": `step=travel&id=${ destId }&type=${ type }`,
|
"body": `step=travel&id=${ destId }&key=${ key }&type=${ type }`,
|
||||||
"method": "POST",
|
"method": "POST",
|
||||||
"mode": "cors",
|
"mode": "cors",
|
||||||
"credentials": "include"
|
"credentials": "include"
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@ -55,7 +55,7 @@ export default class CompanyHelper implements IFeature {
|
|||||||
*/
|
*/
|
||||||
private async trainsDetect(test: boolean = false): Promise<null> {
|
private async trainsDetect(test: boolean = false): Promise<null> {
|
||||||
// 通过用户的icon判断公司老板
|
// 通过用户的icon判断公司老板
|
||||||
if ((await this.infoUtils.getSessionData()).statusIcons.icons.company?.iconID !== 'icon73') {
|
if ((await this.infoUtils.getSessionData()).statusIcons.icons.company.iconID !== 'icon73') {
|
||||||
this.logger.info('火车检测跳过:非公司老板');
|
this.logger.info('火车检测跳过:非公司老板');
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -33,13 +33,13 @@ export default class MapItem implements IFeature {
|
|||||||
start() {
|
start() {
|
||||||
if (this.localConfigWrapper.config.cityFinder) {
|
if (this.localConfigWrapper.config.cityFinder) {
|
||||||
let _base = new TornStyleBlock('芜湖助手').insert2Dom();
|
let _base = new TornStyleBlock('芜湖助手').insert2Dom();
|
||||||
// let reloadSwitch = new TornStyleSwitch('解决一直转圈(加载中)的问题');
|
let reloadSwitch = new TornStyleSwitch('解决一直转圈(加载中)的问题');
|
||||||
// reloadSwitch.getInput().checked = this.localConfigWrapper.config.SolveGoogleScriptPendingIssue;
|
reloadSwitch.getInput().checked = this.localConfigWrapper.config.SolveGoogleScriptPendingIssue;
|
||||||
// _base.append(reloadSwitch.getBase()).insert2Dom();
|
_base.append(reloadSwitch.getBase()).insert2Dom();
|
||||||
// reloadSwitch.getInput().addEventListener('change', () => {
|
reloadSwitch.getInput().addEventListener('change', () => {
|
||||||
// if (reloadSwitch.getInput().checked) window.location.replace(window.location.href);
|
if (reloadSwitch.getInput().checked) window.location.replace(window.location.href);
|
||||||
// this.localConfigWrapper.config.SolveGoogleScriptPendingIssue = reloadSwitch.getInput().checked;
|
this.localConfigWrapper.config.SolveGoogleScriptPendingIssue = reloadSwitch.getInput().checked;
|
||||||
// });
|
});
|
||||||
|
|
||||||
_base.append(document.createElement('br'));
|
_base.append(document.createElement('br'));
|
||||||
|
|
||||||
|
|||||||
@ -1,98 +0,0 @@
|
|||||||
import CommonUtils from "../../class/utils/CommonUtils"
|
|
||||||
|
|
||||||
type YataBSEstData = {
|
|
||||||
"total": number,
|
|
||||||
"score": number,
|
|
||||||
"type": "Offensive" | "Defensive" | "Balanced",
|
|
||||||
"skewness": number,
|
|
||||||
"timestamp": number,
|
|
||||||
"version": 1,
|
|
||||||
}
|
|
||||||
|
|
||||||
type YataApiResponse = {
|
|
||||||
// key为请求id
|
|
||||||
[key: number]: YataBSEstData
|
|
||||||
error?: { 'error': string, 'code': 1 | 2 | 3 | 4 }
|
|
||||||
}
|
|
||||||
|
|
||||||
type YataApiDataWrap = YataBSEstData & {
|
|
||||||
id: string,
|
|
||||||
isCache: boolean,
|
|
||||||
}
|
|
||||||
|
|
||||||
const cacheExpireMs = 86400000 // 一天
|
|
||||||
const KEY = 'WHBSEstCache'
|
|
||||||
|
|
||||||
const getCacheObj = () => {
|
|
||||||
let obj: { [key: string]: YataApiDataWrap }
|
|
||||||
try {
|
|
||||||
obj = JSON.parse(localStorage.getItem(KEY)) ?? {}
|
|
||||||
} catch (e) {
|
|
||||||
obj = {}
|
|
||||||
}
|
|
||||||
return obj
|
|
||||||
}
|
|
||||||
|
|
||||||
const getCache = (id: number): YataApiDataWrap => {
|
|
||||||
let cache: YataApiDataWrap = getCacheObj()[id]
|
|
||||||
if (cache && ((Date.now() - (cache.timestamp * 1000)) < cacheExpireMs)) {
|
|
||||||
cache.isCache = true
|
|
||||||
} else {
|
|
||||||
cache = null
|
|
||||||
}
|
|
||||||
return cache
|
|
||||||
}
|
|
||||||
|
|
||||||
const setCache = (data: YataApiDataWrap): void => {
|
|
||||||
const cache = getCacheObj()
|
|
||||||
cache[data.id] = data
|
|
||||||
localStorage.setItem(KEY, JSON.stringify(cache))
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 清空本地缓存
|
|
||||||
*/
|
|
||||||
const purge = () => {
|
|
||||||
localStorage.removeItem(KEY)
|
|
||||||
}
|
|
||||||
|
|
||||||
const fetchYata = async (id: number, apikey: string): Promise<YataApiDataWrap> => {
|
|
||||||
if (!id || !apikey) {
|
|
||||||
throw new TypeError('请求yata接口时出错: id和apikey不能为空')
|
|
||||||
}
|
|
||||||
const cache = getCache(id)
|
|
||||||
if (cache) {
|
|
||||||
return cache
|
|
||||||
} else {
|
|
||||||
let responseString: string, response: YataApiResponse
|
|
||||||
try {
|
|
||||||
responseString = await CommonUtils.COFetch(`https://yata.yt/api/v1/bs/${ id }?key=${ apikey }`)
|
|
||||||
} catch (e) {
|
|
||||||
throw new TypeError('请求yata接口时出错 ' + e.message)
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
response = JSON.parse(responseString)
|
|
||||||
} catch (e) {
|
|
||||||
throw new TypeError('解析yata接口响应时出错 ' + e.message)
|
|
||||||
}
|
|
||||||
if (response.error) {
|
|
||||||
switch (response.error.code) {
|
|
||||||
case 1:
|
|
||||||
throw new TypeError('请求yata接口时出错: yata服务端错误-' + response.error.error)
|
|
||||||
case 2:
|
|
||||||
throw new TypeError('请求yata接口时出错: 脚本逻辑错误-' + response.error.error)
|
|
||||||
case 3:
|
|
||||||
throw new TypeError('请求yata接口时出错: 已达到次数限制-' + response.error.error)
|
|
||||||
case 4:
|
|
||||||
throw new TypeError('请求yata接口时出错: apikey错误-' + response.error.error)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
const wrapper = <YataApiDataWrap>response[id]
|
|
||||||
wrapper.id = String(id)
|
|
||||||
wrapper.isCache = false
|
|
||||||
setCache(wrapper)
|
|
||||||
return wrapper
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
export { fetchYata, YataApiDataWrap, purge }
|
|
||||||
@ -1,120 +1,120 @@
|
|||||||
// import UserScriptEngine from "../../enum/UserScriptEngine";
|
import UserScriptEngine from "../../enum/UserScriptEngine";
|
||||||
// import CommonUtils from "../../class/utils/CommonUtils";
|
import CommonUtils from "../../class/utils/CommonUtils";
|
||||||
// import Alert from "../../class/utils/Alert";
|
import Alert from "../../class/utils/Alert";
|
||||||
// import { Container } from "../../container/Container";
|
import { Container } from "../../container/Container";
|
||||||
// import Logger from "../../class/Logger";
|
import Logger from "../../class/Logger";
|
||||||
//
|
|
||||||
// // gs loader
|
// gs loader
|
||||||
// export default function loadGS(use) {
|
export default function loadGS(use) {
|
||||||
// let logger = Container.factory(Logger);
|
let logger = Container.factory(Logger);
|
||||||
// if (use === UserScriptEngine.PDA) {
|
if (use === UserScriptEngine.PDA) {
|
||||||
// let ifr: HTMLIFrameElement = document.querySelector('#wh-gs-loader-ifr');
|
let ifr: HTMLIFrameElement = document.querySelector('#wh-gs-loader-ifr');
|
||||||
// if (ifr) {
|
if (ifr) {
|
||||||
// new Alert('飞贼小助手已经加载了');
|
new Alert('飞贼小助手已经加载了');
|
||||||
// return;
|
return;
|
||||||
// }
|
}
|
||||||
// const container = document.createElement('div');
|
const container = document.createElement('div');
|
||||||
// container.id = 'wh-gs-loader';
|
container.id = 'wh-gs-loader';
|
||||||
// ifr = document.createElement('iframe');
|
ifr = document.createElement('iframe');
|
||||||
// ifr.id = 'wh-gs-loader-ifr';
|
ifr.id = 'wh-gs-loader-ifr';
|
||||||
// ifr.src = 'https://www.torn.com/crimes.php';
|
ifr.src = 'https://www.torn.com/crimes.php';
|
||||||
// container.append(ifr);
|
container.append(ifr);
|
||||||
// document.body.append(container);
|
document.body.append(container);
|
||||||
// CommonUtils.addStyle(`
|
CommonUtils.addStyle(`
|
||||||
// #wh-gs-loader {
|
#wh-gs-loader {
|
||||||
// position:fixed;
|
position:fixed;
|
||||||
// top:0;
|
top:0;
|
||||||
// left:0;
|
left:0;
|
||||||
// z-index:100001;
|
z-index:100001;
|
||||||
// }
|
}
|
||||||
// `);
|
`);
|
||||||
// let notify = new Alert('加载中');
|
let notify = new Alert('加载中');
|
||||||
// ifr.onload = () => {
|
ifr.onload = () => {
|
||||||
// notify.close();
|
notify.close();
|
||||||
// const _window = ifr.contentWindow;
|
const _window = ifr.contentWindow;
|
||||||
// const _docu = _window.document;
|
const _docu = _window.document;
|
||||||
// _docu.head.innerHTML = '';
|
_docu.head.innerHTML = '';
|
||||||
// _docu.body.innerHTML = '';
|
_docu.body.innerHTML = '';
|
||||||
// notify = new Alert('加载依赖');
|
notify = new Alert('加载依赖');
|
||||||
// CommonUtils.COFetch('https://cdn.staticfile.org/vue/2.2.2/vue.min.js')
|
CommonUtils.COFetch('https://cdn.staticfile.org/vue/2.2.2/vue.min.js')
|
||||||
// .then(vuejs => {
|
.then(vuejs => {
|
||||||
// notify.close();
|
notify.close();
|
||||||
// _window.eval(vuejs);
|
_window.eval(vuejs);
|
||||||
// _window.GM_getValue = (k, v = undefined) => {
|
_window.GM_getValue = (k, v = undefined) => {
|
||||||
// const objV = JSON.parse(_window.localStorage.getItem('wh-gs-storage') || '{}')[k];
|
const objV = JSON.parse(_window.localStorage.getItem('wh-gs-storage') || '{}')[k];
|
||||||
// return objV || v;
|
return objV || v;
|
||||||
// };
|
};
|
||||||
// _window.GM_setValue = (k, v) => {
|
_window.GM_setValue = (k, v) => {
|
||||||
// const obj = JSON.parse(_window.localStorage.getItem('wh-gs-storage') || '{}');
|
const obj = JSON.parse(_window.localStorage.getItem('wh-gs-storage') || '{}');
|
||||||
// obj[k] = v;
|
obj[k] = v;
|
||||||
// _window.localStorage.setItem('wh-gs-storage', JSON.stringify(obj));
|
_window.localStorage.setItem('wh-gs-storage', JSON.stringify(obj));
|
||||||
// };
|
};
|
||||||
// _window.GM_xmlhttpRequest = function (opt) {
|
_window.GM_xmlhttpRequest = function (opt) {
|
||||||
// // 暂不适配pda post
|
// 暂不适配pda post
|
||||||
// if (opt.method.toLowerCase() === 'post') return;
|
if (opt.method.toLowerCase() === 'post') return;
|
||||||
// CommonUtils.COFetch(opt.url).then(res => {
|
CommonUtils.COFetch(opt.url).then(res => {
|
||||||
// const obj = {
|
const obj = {
|
||||||
// responseText: res
|
responseText: res
|
||||||
// };
|
};
|
||||||
// opt.onload(obj);
|
opt.onload(obj);
|
||||||
// });
|
});
|
||||||
// };
|
};
|
||||||
// notify = new Alert('加载飞贼小助手');
|
notify = new Alert('加载飞贼小助手');
|
||||||
// CommonUtils.COFetch(`https://gitee.com/ameto_kasao/tornjs/raw/master/GoldenSnitch.js?${ performance.now() }`)
|
CommonUtils.COFetch(`https://gitee.com/ameto_kasao/tornjs/raw/master/GoldenSnitch.js?${ performance.now() }`)
|
||||||
// .then(res => {
|
.then(res => {
|
||||||
// _window.eval(res.replace('http://222.160.142.50:8154/mugger', `https://api.ljs-lyt.com/mugger`));
|
_window.eval(res.replace('http://222.160.142.50:8154/mugger', `https://api.ljs-lyt.com/mugger`));
|
||||||
// _window.GM_setValue("gsp_x", 10);
|
_window.GM_setValue("gsp_x", 10);
|
||||||
// _window.GM_setValue("gsp_y", 10);
|
_window.GM_setValue("gsp_y", 10);
|
||||||
// notify.close();
|
notify.close();
|
||||||
// notify = new Alert('飞贼小助手已加载', { timeout: 1 });
|
notify = new Alert('飞贼小助手已加载', { timeout: 1 });
|
||||||
// const gsp: HTMLElement = _docu.querySelector('#gsp');
|
const gsp: HTMLElement = _docu.querySelector('#gsp');
|
||||||
// const thisRun = () => {
|
const thisRun = () => {
|
||||||
// ifr.style.height = `${ gsp.offsetHeight + 10 }px`;
|
ifr.style.height = `${ gsp.offsetHeight + 10 }px`;
|
||||||
// ifr.style.width = `${ gsp.offsetWidth + 20 }px`;
|
ifr.style.width = `${ gsp.offsetWidth + 20 }px`;
|
||||||
// gsp.style.top = '10px';
|
gsp.style.top = '10px';
|
||||||
// gsp.style.left = '10px';
|
gsp.style.left = '10px';
|
||||||
// };
|
};
|
||||||
// new MutationObserver(thisRun).observe(gsp, { childList: true, subtree: true });
|
new MutationObserver(thisRun).observe(gsp, { childList: true, subtree: true });
|
||||||
// thisRun();
|
thisRun();
|
||||||
// if (logger.debug()) _window.GM_setValue("gsp_showContent", true)
|
if (logger.debug()) _window.GM_setValue("gsp_showContent", true)
|
||||||
// });
|
});
|
||||||
// });
|
});
|
||||||
// };
|
};
|
||||||
// return;
|
return;
|
||||||
// }
|
}
|
||||||
// if (use === UserScriptEngine.GM) {
|
if (use === UserScriptEngine.GM) {
|
||||||
// if (typeof window.Vue !== 'function') {
|
if (typeof window.Vue !== 'function') {
|
||||||
// let notify = new Alert('正在加载依赖');
|
let notify = new Alert('正在加载依赖');
|
||||||
// CommonUtils.COFetch('https://cdn.staticfile.org/vue/2.2.2/vue.min.js')
|
CommonUtils.COFetch('https://cdn.staticfile.org/vue/2.2.2/vue.min.js')
|
||||||
// .then(VueJS => {
|
.then(VueJS => {
|
||||||
// window.eval(VueJS);
|
window.eval(VueJS);
|
||||||
// notify.close();
|
notify.close();
|
||||||
// notify = new Alert('已载入依赖');
|
notify = new Alert('已载入依赖');
|
||||||
// window.GM_getValue = (k, v = undefined) => {
|
window.GM_getValue = (k, v = undefined) => {
|
||||||
// const objV = JSON.parse(window.localStorage.getItem('wh-gs-storage') || '{}')[k];
|
const objV = JSON.parse(window.localStorage.getItem('wh-gs-storage') || '{}')[k];
|
||||||
// return objV || v;
|
return objV || v;
|
||||||
// };
|
};
|
||||||
// window.GM_setValue = (k, v) => {
|
window.GM_setValue = (k, v) => {
|
||||||
// const obj = JSON.parse(window.localStorage.getItem('wh-gs-storage') || '{}');
|
const obj = JSON.parse(window.localStorage.getItem('wh-gs-storage') || '{}');
|
||||||
// obj[k] = v;
|
obj[k] = v;
|
||||||
// window.localStorage.setItem('wh-gs-storage', JSON.stringify(obj));
|
window.localStorage.setItem('wh-gs-storage', JSON.stringify(obj));
|
||||||
// };
|
};
|
||||||
// // TODO
|
// TODO
|
||||||
// // window.GM_xmlhttpRequest = GM_xmlhttpRequest;
|
// window.GM_xmlhttpRequest = GM_xmlhttpRequest;
|
||||||
// CommonUtils.COFetch(`https://gitee.com/ameto_kasao/tornjs/raw/master/GoldenSnitch.js?${ performance.now() }`)
|
CommonUtils.COFetch(`https://gitee.com/ameto_kasao/tornjs/raw/master/GoldenSnitch.js?${ performance.now() }`)
|
||||||
// .then(GSJS => {
|
.then(GSJS => {
|
||||||
// window.eval(GSJS);
|
window.eval(GSJS);
|
||||||
// if (logger.debug()) window.GM_setValue("gsp_showContent", true);
|
if (logger.debug()) window.GM_setValue("gsp_showContent", true);
|
||||||
// notify.close();
|
notify.close();
|
||||||
// notify = new Alert('已载入飞贼助手');
|
notify = new Alert('已载入飞贼助手');
|
||||||
// })
|
})
|
||||||
// .catch(err => new Alert(`PDA API错误。${ JSON.stringify(err) }`));
|
.catch(err => new Alert(`PDA API错误。${ JSON.stringify(err) }`));
|
||||||
// })
|
})
|
||||||
// .catch(err => new Alert(JSON.stringify(err)));
|
.catch(err => new Alert(JSON.stringify(err)));
|
||||||
// } else {
|
} else {
|
||||||
// new Alert('飞贼助手已经加载了');
|
new Alert('飞贼助手已经加载了');
|
||||||
// }
|
}
|
||||||
// return;
|
return;
|
||||||
// }
|
}
|
||||||
// new Alert('暂不支持');
|
new Alert('暂不支持');
|
||||||
// }
|
}
|
||||||
@ -67,57 +67,57 @@ export default function translateMain(href: string): void {
|
|||||||
};
|
};
|
||||||
|
|
||||||
// 边栏
|
// 边栏
|
||||||
// let sidebarTimeOut = 60;
|
let sidebarTimeOut = 60;
|
||||||
// const sidebarInterval = setInterval(() => {
|
const sidebarInterval = setInterval(() => {
|
||||||
// // 60秒后取消定时
|
// 60秒后取消定时
|
||||||
// if ($('div[class^="sidebar"]').length === 0) {
|
if ($('div[class^="sidebar"]').length === 0) {
|
||||||
// sidebarTimeOut--;
|
sidebarTimeOut--;
|
||||||
// if (sidebarTimeOut < 0) {
|
if (sidebarTimeOut < 0) {
|
||||||
// clearInterval(sidebarInterval);
|
clearInterval(sidebarInterval);
|
||||||
// }
|
}
|
||||||
// return;
|
return;
|
||||||
// }
|
}
|
||||||
// // 边栏块标题
|
// 边栏块标题
|
||||||
// $('h2[class^="header"]').each((i, e) => {
|
$('h2[class^="header"]').each((i, e) => {
|
||||||
// if (!sidebarDict[e.firstChild.nodeValue]) return;
|
if (!sidebarDict[e.firstChild.nodeValue]) return;
|
||||||
// e.firstChild.nodeValue = sidebarDict[e.firstChild.nodeValue];
|
e.firstChild.nodeValue = sidebarDict[e.firstChild.nodeValue];
|
||||||
// });
|
});
|
||||||
// // 边栏人物名字
|
// 边栏人物名字
|
||||||
// $('span[class^="menu-name"]').each((i, e) => {
|
$('span[class^="menu-name"]').each((i, e) => {
|
||||||
// e.firstChild.nodeValue = '名字:';
|
e.firstChild.nodeValue = '名字:';
|
||||||
// });
|
});
|
||||||
// // 钱 等级 pt 天赋点
|
// 钱 等级 pt 天赋点
|
||||||
// $('p[class^="point-block"]').each((i, e) => {
|
$('p[class^="point-block"]').each((i, e) => {
|
||||||
// if (sidebarDict[e.firstChild.firstChild.nodeValue])
|
if (sidebarDict[e.firstChild.firstChild.nodeValue])
|
||||||
// e.firstChild.firstChild.nodeValue = sidebarDict[e.firstChild.firstChild.nodeValue];
|
e.firstChild.firstChild.nodeValue = sidebarDict[e.firstChild.firstChild.nodeValue];
|
||||||
// });
|
});
|
||||||
// // 4条 状态条
|
// 4条 状态条
|
||||||
// $('p[class^="bar-name"]').each((i, e) => {
|
$('p[class^="bar-name"]').each((i, e) => {
|
||||||
// if (sidebarDict[e.firstChild.nodeValue])
|
if (sidebarDict[e.firstChild.nodeValue])
|
||||||
// e.firstChild.nodeValue = sidebarDict[e.firstChild.nodeValue];
|
e.firstChild.nodeValue = sidebarDict[e.firstChild.nodeValue];
|
||||||
// });
|
});
|
||||||
// // 边栏菜单
|
// 边栏菜单
|
||||||
// $('span[class^="linkName"]').each((i, e) => {
|
$('span[class^="linkName"]').each((i, e) => {
|
||||||
// if (sidebarDict[e.firstChild.nodeValue])
|
if (sidebarDict[e.firstChild.nodeValue])
|
||||||
// e.firstChild.nodeValue = sidebarDict[e.firstChild.nodeValue];
|
e.firstChild.nodeValue = sidebarDict[e.firstChild.nodeValue];
|
||||||
// });
|
});
|
||||||
// // [use]按钮
|
// [use]按钮
|
||||||
// if (document.querySelector('#pointsMerits'))
|
if (document.querySelector('#pointsMerits'))
|
||||||
// $('#pointsMerits')[0].firstChild.nodeValue = '[使用]';
|
$('#pointsMerits')[0].firstChild.nodeValue = '[使用]';
|
||||||
// if (document.querySelector('#pointsPoints'))
|
if (document.querySelector('#pointsPoints'))
|
||||||
// $('#pointsPoints')[0].firstChild.nodeValue = '[使用]';
|
$('#pointsPoints')[0].firstChild.nodeValue = '[使用]';
|
||||||
// if (document.querySelector('#pointsLevel'))
|
if (document.querySelector('#pointsLevel'))
|
||||||
// $('#pointsLevel')[0].firstChild.nodeValue = '[升级]';
|
$('#pointsLevel')[0].firstChild.nodeValue = '[升级]';
|
||||||
//
|
|
||||||
// // 手机 区域菜单
|
// 手机 区域菜单
|
||||||
// $('div[class*="areas-mobile"] span:nth-child(2)').contents().each((i, e) => {
|
$('div[class*="areas-mobile"] span:nth-child(2)').contents().each((i, e) => {
|
||||||
// //log(e);
|
//log(e);
|
||||||
// if (sidebarDict[e.nodeValue])
|
if (sidebarDict[e.nodeValue])
|
||||||
// e.nodeValue = sidebarDict[e.nodeValue];
|
e.nodeValue = sidebarDict[e.nodeValue];
|
||||||
// });
|
});
|
||||||
//
|
|
||||||
// clearInterval(sidebarInterval);
|
clearInterval(sidebarInterval);
|
||||||
// }, 1000);
|
}, 1000);
|
||||||
|
|
||||||
// header
|
// header
|
||||||
if (document.querySelector('div#header-root')) {
|
if (document.querySelector('div#header-root')) {
|
||||||
|
|||||||
@ -1,14 +0,0 @@
|
|||||||
const convertToCSV = (data: any[]) => {
|
|
||||||
let csv = ''
|
|
||||||
for (let i = 0; i < data.length; i++) {
|
|
||||||
let row = ''
|
|
||||||
for (const key in data[i]) {
|
|
||||||
row += `"${ data[i][key] }",`
|
|
||||||
}
|
|
||||||
row = row.slice(0, -1) // 删除最后一个逗号
|
|
||||||
csv += row + '\r\n' // 添加换行符
|
|
||||||
}
|
|
||||||
return csv
|
|
||||||
}
|
|
||||||
|
|
||||||
export { convertToCSV }
|
|
||||||
@ -22,7 +22,3 @@ export const fetchCurrentMoney = async (action?: string): Promise<number> => {
|
|||||||
export const fetchCurrentCompanyAvailableMoney = () => {
|
export const fetchCurrentCompanyAvailableMoney = () => {
|
||||||
return fetchCurrentMoney("companyAction");
|
return fetchCurrentMoney("companyAction");
|
||||||
};
|
};
|
||||||
|
|
||||||
export const fetchCurrentPropVaultAvailableMoney = () => {
|
|
||||||
return fetchCurrentMoney("propertyDepositAction");
|
|
||||||
};
|
|
||||||
|
|||||||
@ -1,20 +0,0 @@
|
|||||||
const timePastFormat = (ts: number): string => {
|
|
||||||
// 毫秒
|
|
||||||
if (ts < 1000) {
|
|
||||||
return ts + 'ms'
|
|
||||||
}
|
|
||||||
// 秒
|
|
||||||
else if (ts < 60000) {
|
|
||||||
return (ts / 1000 | 0) + 's'
|
|
||||||
}
|
|
||||||
// 分
|
|
||||||
else if (ts < 3600000) {
|
|
||||||
return (ts / 60000 | 0) + 'm'
|
|
||||||
}
|
|
||||||
// 时
|
|
||||||
else {
|
|
||||||
return (ts / 3600000 | 0) + 'h'
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
export { timePastFormat }
|
|
||||||
@ -1,17 +1,6 @@
|
|||||||
import { ElMessage } from "element-plus"
|
import { ElMessage } from "element-plus";
|
||||||
|
|
||||||
type CrimeResVo = { text: string, success: boolean }
|
const useItem = (itemId: string) => {
|
||||||
|
|
||||||
const defaultCb = (res: CrimeResVo) => {
|
|
||||||
ElMessage({
|
|
||||||
message: res.text,
|
|
||||||
type: res.success ? 'success' : 'error',
|
|
||||||
dangerouslyUseHTMLString: true,
|
|
||||||
grouping: true
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
const useItem = (itemId: string, cb = defaultCb) => {
|
|
||||||
fetch(window.addRFC("https://www.torn.com/item.php"), {
|
fetch(window.addRFC("https://www.torn.com/item.php"), {
|
||||||
"headers": {
|
"headers": {
|
||||||
"accept": "*/*",
|
"accept": "*/*",
|
||||||
@ -30,22 +19,15 @@ const useItem = (itemId: string, cb = defaultCb) => {
|
|||||||
"credentials": "include"
|
"credentials": "include"
|
||||||
})
|
})
|
||||||
.then(res => res.json())
|
.then(res => res.json())
|
||||||
.then(res => cb(res))
|
.then(res => ElMessage({
|
||||||
|
message: res.text,
|
||||||
|
type: res.success ? 'success' : 'error',
|
||||||
|
dangerouslyUseHTMLString: true
|
||||||
|
}))
|
||||||
.catch(e => ElMessage({
|
.catch(e => ElMessage({
|
||||||
message: e.toString,
|
message: e.toString,
|
||||||
type: 'error'
|
type: 'error'
|
||||||
}));
|
}));
|
||||||
}
|
};
|
||||||
|
|
||||||
const useItemSync = (itemId: string, showMsg = true, cb = (response: CrimeResVo) => null) => {
|
export default useItem;
|
||||||
return new Promise((res, rej) => {
|
|
||||||
useItem(itemId, (_res) => {
|
|
||||||
if (showMsg) defaultCb(_res)
|
|
||||||
cb(_res)
|
|
||||||
res(null)
|
|
||||||
})
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
export default useItem
|
|
||||||
export { useItemSync }
|
|
||||||
|
|||||||
@ -38,10 +38,7 @@ export default interface IUserProfileData {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
medalInformation: unknown;
|
medalInformation: unknown;
|
||||||
basicInformation: {
|
basicInformation: unknown;
|
||||||
icons: { id: number, title: string }[],
|
|
||||||
lastAction: { seconds: number }
|
|
||||||
};
|
|
||||||
personalInformation: unknown;
|
personalInformation: unknown;
|
||||||
competitionStatus: unknown;
|
competitionStatus: unknown;
|
||||||
staffTools: null;
|
staffTools: null;
|
||||||
|
|||||||
@ -32,7 +32,6 @@ export interface MiniProfile {
|
|||||||
},
|
},
|
||||||
sendMoneyWarning: string,
|
sendMoneyWarning: string,
|
||||||
playerName: string,
|
playerName: string,
|
||||||
userID: number,
|
|
||||||
};
|
};
|
||||||
userStatus: {
|
userStatus: {
|
||||||
status: {
|
status: {
|
||||||
|
|||||||
@ -23,7 +23,7 @@ class DrugCDMonitor implements IntervalType {
|
|||||||
|
|
||||||
handler(): void {
|
handler(): void {
|
||||||
const data = getSidebarData()
|
const data = getSidebarData()
|
||||||
if (data?.statusIcons?.icons?.drug_cooldown?.timerExpiresAt * 1000 < Date.now()) {
|
if (!data.statusIcons.icons.drug_cooldown) {
|
||||||
this.msgWrapper.create('警告: 药CD停转', { sysNotify: true })
|
this.msgWrapper.create('警告: 药CD停转', { sysNotify: true })
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,262 +0,0 @@
|
|||||||
<script lang="ts" setup>
|
|
||||||
import { inject, onMounted, ref } from "vue"
|
|
||||||
import { LocalConfigWrapperKey } from "../ts/class/LocalConfigWrapper"
|
|
||||||
import { ElMessage } from "element-plus"
|
|
||||||
import { fetchYata, purge, YataApiDataWrap } from "../ts/func/module/fetchYata"
|
|
||||||
import { LoggerKey } from "../ts/class/Logger"
|
|
||||||
import toThousands from "../ts/func/utils/toThousands"
|
|
||||||
import { Download, QuestionFilled, Refresh, Search } from "@element-plus/icons-vue"
|
|
||||||
import { timePastFormat } from "../ts/func/utils/timePastFormat"
|
|
||||||
import { convertToCSV } from "../ts/func/utils/convert2Csv"
|
|
||||||
|
|
||||||
const isMiniProfOn = ref<boolean>(false)
|
|
||||||
const isProfOn = ref<boolean>(false)
|
|
||||||
const apikey = ref<string>('')
|
|
||||||
const targetId = ref<string>('')
|
|
||||||
const tableData = ref<Partial<YataApiDataWrap>[]>([])
|
|
||||||
const isLoading = ref(false)
|
|
||||||
const idKey: { [key: string]: number } = {}
|
|
||||||
const buildType = { Offensive: '攻击型', Defensive: '防御型', Balanced: '平衡型' }
|
|
||||||
|
|
||||||
const localConfigWrapper = inject(LocalConfigWrapperKey)
|
|
||||||
const logger = inject(LoggerKey)
|
|
||||||
|
|
||||||
const saveApikey = () => {
|
|
||||||
if (!apikey.value) {
|
|
||||||
ElMessage({
|
|
||||||
message: 'apikey保存时输入为空',
|
|
||||||
type: 'error',
|
|
||||||
showClose: true
|
|
||||||
})
|
|
||||||
throw new TypeError('apikey保存时输入为空')
|
|
||||||
}
|
|
||||||
localStorage.setItem('APIKey', apikey.value)
|
|
||||||
ElMessage.success({
|
|
||||||
message: 'APIKey设置成功',
|
|
||||||
showClose: true
|
|
||||||
})
|
|
||||||
}
|
|
||||||
const onMiniProfSwitchChange = () => localConfigWrapper.config.isBSEstMiniProfOn = isMiniProfOn.value
|
|
||||||
const onProfSwitchChange = () => localConfigWrapper.config.isBSEstProfOn = isProfOn.value
|
|
||||||
const doRequest = async () => {
|
|
||||||
if (!apikey.value) {
|
|
||||||
ElMessage.warning({
|
|
||||||
message: '未设置APIKey',
|
|
||||||
showClose: true
|
|
||||||
})
|
|
||||||
return
|
|
||||||
}
|
|
||||||
isLoading.value = true
|
|
||||||
for (let i = 0; i < tableData.value.length; i++) {
|
|
||||||
const item = tableData.value[i]
|
|
||||||
if (!item.total) {
|
|
||||||
let est: YataApiDataWrap
|
|
||||||
try {
|
|
||||||
est = await fetchYata(parseInt(item.id), apikey.value)
|
|
||||||
} catch (e) {
|
|
||||||
ElMessage.error({
|
|
||||||
message: e.message,
|
|
||||||
showClose: true
|
|
||||||
})
|
|
||||||
logger.error(e.stack)
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
item.total = est.total
|
|
||||||
item.score = est.score
|
|
||||||
item.type = est.type
|
|
||||||
item.skewness = est.skewness
|
|
||||||
item.timestamp = est.timestamp
|
|
||||||
item.version = est.version
|
|
||||||
item.isCache = est.isCache
|
|
||||||
}
|
|
||||||
}
|
|
||||||
isLoading.value = false
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* 查询列表中添加新的id
|
|
||||||
* @param _id
|
|
||||||
*/
|
|
||||||
const add = (_id: string) => {
|
|
||||||
const id = parseInt(_id)
|
|
||||||
if (id) {
|
|
||||||
// 重复id判断
|
|
||||||
if (!idKey[_id]) {
|
|
||||||
tableData.value.push({ id: _id })
|
|
||||||
idKey[_id] = 1
|
|
||||||
targetId.value = ''
|
|
||||||
} else {
|
|
||||||
ElMessage.warning({
|
|
||||||
message: '重复的id',
|
|
||||||
showClose: true
|
|
||||||
})
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
ElMessage.error({
|
|
||||||
message: 'id有误',
|
|
||||||
showClose: true
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 清空查询列表和唯一id表
|
|
||||||
*/
|
|
||||||
const emptyList = () => {
|
|
||||||
tableData.value = []
|
|
||||||
const keys = Object.keys(idKey)
|
|
||||||
for (let i = 0; i < keys.length; i++) {
|
|
||||||
const key = keys[i]
|
|
||||||
idKey[key] = 0
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const purgeCache = () => {
|
|
||||||
purge()
|
|
||||||
ElMessage.warning({
|
|
||||||
message: '本地缓存已清除',
|
|
||||||
showClose: true
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
const exportCsv = () => {
|
|
||||||
const exportList: any[] = [{
|
|
||||||
id: "ID", total: "BS", score: "评分", type: "风格", skewness: "偏差", timestamp: "时间戳"
|
|
||||||
}]
|
|
||||||
for (let i = 0; i < tableData.value.length; i++) {
|
|
||||||
const item = tableData.value[i]
|
|
||||||
const newItem = {
|
|
||||||
id: item.id ?? '-1',
|
|
||||||
total: item.total ?? null,
|
|
||||||
score: item.score ?? null,
|
|
||||||
type: buildType[item.type] ?? null,
|
|
||||||
skewness: item.skewness ?? null,
|
|
||||||
timestamp: item.timestamp ?? null,
|
|
||||||
// isCache: item.isCache ?? null,
|
|
||||||
// version: item.version ?? null
|
|
||||||
}
|
|
||||||
exportList.push(newItem)
|
|
||||||
}
|
|
||||||
const csvContent = convertToCSV(exportList)
|
|
||||||
let url: string
|
|
||||||
let isBlob = false
|
|
||||||
const UTF8 = "\uFEFF"
|
|
||||||
if (window.Blob && window.URL && window.URL.createObjectURL) {
|
|
||||||
const csvData = new window.Blob([UTF8 + csvContent], {
|
|
||||||
type: 'text/csv'
|
|
||||||
})
|
|
||||||
url = window.URL.createObjectURL(csvData)
|
|
||||||
isBlob = true
|
|
||||||
} else {
|
|
||||||
url = window.encodeURI(csvContent)
|
|
||||||
}
|
|
||||||
window.location.href = isBlob ? url : 'data:text/csv;charset=utf-8,' + UTF8 + url
|
|
||||||
}
|
|
||||||
|
|
||||||
onMounted(() => {
|
|
||||||
// APIKey
|
|
||||||
const key = localStorage.getItem('APIKey')
|
|
||||||
if (!key) {
|
|
||||||
ElMessage.error({
|
|
||||||
message: '尚未配置APIKey',
|
|
||||||
showClose: true
|
|
||||||
})
|
|
||||||
} else {
|
|
||||||
apikey.value = key
|
|
||||||
}
|
|
||||||
|
|
||||||
// 获取配置
|
|
||||||
isMiniProfOn.value = localConfigWrapper.config.isBSEstMiniProfOn
|
|
||||||
isProfOn.value = localConfigWrapper.config.isBSEstProfOn
|
|
||||||
})
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<template>
|
|
||||||
<el-space :fill="true">
|
|
||||||
<el-card shadow="never">
|
|
||||||
<template #header>设置</template>
|
|
||||||
<el-form label-width="auto" @submit.prevent>
|
|
||||||
<el-form-item label="MINI资料卡中显示">
|
|
||||||
<el-switch v-model="isMiniProfOn" @change="onMiniProfSwitchChange"/>
|
|
||||||
</el-form-item>
|
|
||||||
<el-form-item label="个人资料中显示">
|
|
||||||
<el-switch v-model="isProfOn" @change="onProfSwitchChange"/>
|
|
||||||
</el-form-item>
|
|
||||||
<el-form-item label="API KEY">
|
|
||||||
<el-input v-model="apikey">
|
|
||||||
<template #append>
|
|
||||||
<el-button :loading="isLoading" @click="saveApikey">保存</el-button>
|
|
||||||
</template>
|
|
||||||
</el-input>
|
|
||||||
</el-form-item>
|
|
||||||
<el-form-item>
|
|
||||||
<el-popconfirm cancel-button-text="取消" confirm-button-text="确定" title="确定操作" @confirm="purgeCache">
|
|
||||||
<template #reference>
|
|
||||||
<el-button type="danger">清空缓存</el-button>
|
|
||||||
</template>
|
|
||||||
</el-popconfirm>
|
|
||||||
</el-form-item>
|
|
||||||
</el-form>
|
|
||||||
</el-card>
|
|
||||||
<el-card shadow="never">
|
|
||||||
<template #header>使用</template>
|
|
||||||
<p class="mt-4">BS估算功能使用了
|
|
||||||
<el-link href="https://yata.yt/api/v1/" target="_blank">yata</el-link>
|
|
||||||
神经网络模型接口,需要提供torn apikey (上面输入)
|
|
||||||
</p>
|
|
||||||
<p class="mt-4">本插件缓存机制:1天</p>
|
|
||||||
<el-form label-width="auto" @submit="add(targetId)" @submit.prevent>
|
|
||||||
<el-form-item label="目标数字ID">
|
|
||||||
<el-input v-model="targetId" clearable/>
|
|
||||||
</el-form-item>
|
|
||||||
<el-form-item>
|
|
||||||
<el-button :loading="isLoading" type="primary" @click="add(targetId)">添加</el-button>
|
|
||||||
</el-form-item>
|
|
||||||
</el-form>
|
|
||||||
</el-card>
|
|
||||||
<el-card shadow="never">
|
|
||||||
<template #header>结果</template>
|
|
||||||
<el-button-group>
|
|
||||||
<el-button :icon="Search" :loading="isLoading" type="primary" @click="doRequest">估算</el-button>
|
|
||||||
<el-button :icon="Refresh" :loading="isLoading" @click="emptyList">清空</el-button>
|
|
||||||
<el-button :icon="Download" :loading="isLoading" @click="exportCsv">导出CSV</el-button>
|
|
||||||
</el-button-group>
|
|
||||||
<el-row>
|
|
||||||
<el-col :span="23">
|
|
||||||
<el-table :data="tableData" empty-text=" ">
|
|
||||||
<el-table-column label="ID" prop="id"/>
|
|
||||||
<el-table-column label="BS">
|
|
||||||
<template #default="scope">
|
|
||||||
{{ toThousands(scope.row.total) }}
|
|
||||||
</template>
|
|
||||||
</el-table-column>
|
|
||||||
<el-table-column label="评分" prop="score"/>
|
|
||||||
<el-table-column label="风格">
|
|
||||||
<template #default="scope">
|
|
||||||
{{ buildType[scope.row.type] }}
|
|
||||||
</template>
|
|
||||||
</el-table-column>
|
|
||||||
<el-table-column>
|
|
||||||
<template #header>
|
|
||||||
<el-tooltip content="越低越准" effect="light" placement="top">
|
|
||||||
<span>偏差<el-icon><QuestionFilled/></el-icon></span>
|
|
||||||
</el-tooltip>
|
|
||||||
</template>
|
|
||||||
<template #default="scope">
|
|
||||||
{{ scope.row.skewness }}%
|
|
||||||
</template>
|
|
||||||
</el-table-column>
|
|
||||||
<el-table-column label="时间">
|
|
||||||
<template #default="scope">
|
|
||||||
{{ timePastFormat(Date.now() - scope.row.timestamp * 1000) }}
|
|
||||||
</template>
|
|
||||||
</el-table-column>
|
|
||||||
</el-table>
|
|
||||||
</el-col>
|
|
||||||
</el-row>
|
|
||||||
</el-card>
|
|
||||||
</el-space>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<style scoped>
|
|
||||||
|
|
||||||
</style>
|
|
||||||
@ -124,13 +124,6 @@ onMounted(() => {
|
|||||||
</template>
|
</template>
|
||||||
</el-input>
|
</el-input>
|
||||||
</el-form-item>
|
</el-form-item>
|
||||||
<el-button-group>
|
|
||||||
<el-button type="primary" @click="()=>inputMoney='1000000'">1m</el-button>
|
|
||||||
<el-button type="primary" @click="()=>inputMoney='2000000'">2m</el-button>
|
|
||||||
<el-button type="primary" @click="()=>inputMoney='5000000'">5m</el-button>
|
|
||||||
<el-button type="primary" @click="()=>inputMoney='10000000'">10m</el-button>
|
|
||||||
<el-button type="primary" @click="()=>inputMoney='20000000'">20m</el-button>
|
|
||||||
</el-button-group>
|
|
||||||
</el-form>
|
</el-form>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
|
|||||||
@ -4,7 +4,7 @@ import { LoggerKey } from "../ts/class/Logger"
|
|||||||
|
|
||||||
const logger = inject(LoggerKey)
|
const logger = inject(LoggerKey)
|
||||||
const loading = ref(true)
|
const loading = ref(true)
|
||||||
const doFetch = () => fetch(window.addRFC("https://www.torn.com/page.php?sid=eventsData"), {
|
const doFetch = () => fetch("https://www.torn.com/page.php", {
|
||||||
"headers": {
|
"headers": {
|
||||||
"accept": "*/*",
|
"accept": "*/*",
|
||||||
"sec-ch-ua-mobile": "?0",
|
"sec-ch-ua-mobile": "?0",
|
||||||
|
|||||||
@ -64,18 +64,20 @@
|
|||||||
<el-menu-item @click="quickGymTrain.doTrain(BATTLE_STAT.DEX)">闪避 DEX
|
<el-menu-item @click="quickGymTrain.doTrain(BATTLE_STAT.DEX)">闪避 DEX
|
||||||
</el-menu-item>
|
</el-menu-item>
|
||||||
</el-sub-menu>
|
</el-sub-menu>
|
||||||
<el-sub-menu index="3">
|
<!-- <el-sub-menu index="3">-->
|
||||||
<template #title>
|
<!-- <template #title>-->
|
||||||
<el-icon>♻️</el-icon>
|
<!-- <el-icon>🪓</el-icon>-->
|
||||||
<span>REFILL</span>
|
<!-- <span>老功能</span>-->
|
||||||
</template>
|
<!-- </template>-->
|
||||||
<el-menu-item @click="handleRefil('refillEnergy')">能量E
|
<!-- <el-menu-item index="3-1" @click="_adHelper">📜️ 传单助手</el-menu-item>-->
|
||||||
</el-menu-item>
|
<!-- <el-menu-item index="3-2" @click="_safeKeeper">🛡️ 守望者</el-menu-item>-->
|
||||||
<el-menu-item @click="handleRefil('refillNerve')">犯罪N
|
<!-- <el-menu-item index="3-3" @click="MUZHUANG">🌲 寻找木桩</el-menu-item>-->
|
||||||
</el-menu-item>
|
<!--<!– <el-menu-item index="3-4" @click="_setting">⚙️ 助手设置</el-menu-item>–>-->
|
||||||
<el-menu-item @click="handleRefil('refillCasinoTokens')">赌场代币
|
<!-- </el-sub-menu>-->
|
||||||
</el-menu-item>
|
<!-- <el-menu-item v-for="(item, i) in menuItemList" :index="(4 + i).toString()" @click="menuClick(item)">-->
|
||||||
</el-sub-menu>
|
<!-- <el-icon>{{ item.title.slice(0, 2) }}</el-icon>-->
|
||||||
|
<!-- <span>{{ item.title.slice(2, item.title.length) }}</span>-->
|
||||||
|
<!-- </el-menu-item>-->
|
||||||
</el-menu>
|
</el-menu>
|
||||||
</el-card>
|
</el-card>
|
||||||
<el-card :body-style="{ 'padding': '4px' }" class="innerCard">
|
<el-card :body-style="{ 'padding': '4px' }" class="innerCard">
|
||||||
@ -85,6 +87,7 @@
|
|||||||
<el-row style="display: flex;">
|
<el-row style="display: flex;">
|
||||||
<el-col v-for="item in menuItemList" class="featureCol">
|
<el-col v-for="item in menuItemList" class="featureCol">
|
||||||
<el-card :body-class="'featureMenuBody'" class="featureMenu" shadow="never" @click="menuClick(item)">
|
<el-card :body-class="'featureMenuBody'" class="featureMenu" shadow="never" @click="menuClick(item)">
|
||||||
|
<!-- <el-card class="featureMenu" @click="menuClick(item)" :body-style="{'padding': '0' }">-->
|
||||||
<div>
|
<div>
|
||||||
<el-icon class="icon">{{ item.title.slice(0, 2) }}</el-icon>
|
<el-icon class="icon">{{ item.title.slice(0, 2) }}</el-icon>
|
||||||
</div>
|
</div>
|
||||||
@ -128,6 +131,8 @@
|
|||||||
</div>
|
</div>
|
||||||
</el-drawer>
|
</el-drawer>
|
||||||
</el-config-provider>
|
</el-config-provider>
|
||||||
|
<!-- <div id="wh123">{{ sessionObject }}</div>-->
|
||||||
|
<!-- <div id="wh1234">{{ session }}</div>-->
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script lang="ts" setup>
|
<script lang="ts" setup>
|
||||||
@ -142,24 +147,22 @@ import SettingsHandler from "../ts/class/handler/SettingsHandler"
|
|||||||
import { BATTLE_STAT } from "../ts/class/utils/NetHighLvlWrapper"
|
import { BATTLE_STAT } from "../ts/class/utils/NetHighLvlWrapper"
|
||||||
import adHelper from "../ts/func/module/adHelper"
|
import adHelper from "../ts/func/module/adHelper"
|
||||||
import safeKeeper from "../ts/func/module/safeKeeper"
|
import safeKeeper from "../ts/func/module/safeKeeper"
|
||||||
import getSidebarData from "../ts/func/utils/getSidebarData"
|
|
||||||
import useItem from "../ts/func/utils/useItem"
|
import useItem from "../ts/func/utils/useItem"
|
||||||
import globVars from "../ts/globVars"
|
import globVars from "../ts/globVars"
|
||||||
import AutoLoginForm from "./AutoLoginForm.vue"
|
import AutoLoginForm from "./AutoLoginForm.vue"
|
||||||
import ChangeLogView from "./ChangeLogView.vue"
|
|
||||||
import CityUItems from "./CityUItems.vue"
|
import CityUItems from "./CityUItems.vue"
|
||||||
import CompanyWithdraw from "./CompanyWithdraw.vue"
|
import CompanyWithdraw from "./CompanyWithdraw.vue"
|
||||||
import EventsViewer from "./EventsViewer.vue"
|
import EventsViewer from "./EventsViewer.vue"
|
||||||
import ForeignStock from "./ForeignStock.vue"
|
import ForeignStock from "./ForeignStock.vue"
|
||||||
import InventoryView from "./InventoryView.vue"
|
import InventoryView from "./InventoryView.vue"
|
||||||
import MarketHelper from "./MarketHelper.vue"
|
import MarketHelper from "./MarketHelper.vue"
|
||||||
import MonitorMgrView from "./MonitorMgrView.vue"
|
|
||||||
import PTMarketView from "./PTMarketView.vue"
|
import PTMarketView from "./PTMarketView.vue"
|
||||||
import QuickCrime from "./QuickCrime.vue"
|
import QuickCrime from "./QuickCrime.vue"
|
||||||
import UpdateDate from "./UpdateScript.vue"
|
import UpdateDate from "./UpdateScript.vue"
|
||||||
import VirusProgramming from "./VirusProgramming.vue"
|
import VirusProgramming from "./VirusProgramming.vue"
|
||||||
import PropertyVault from "./PropertyVault.vue";
|
import getSidebarData from "../ts/func/utils/getSidebarData"
|
||||||
import BSEstView from "./BSEstView.vue";
|
import MonitorMgrView from "./MonitorMgrView.vue"
|
||||||
|
import ChangeLogView from "./ChangeLogView.vue"
|
||||||
|
|
||||||
const logger = inject(LoggerKey)
|
const logger = inject(LoggerKey)
|
||||||
const quickGymTrain = inject(QuickGymTrainKey)
|
const quickGymTrain = inject(QuickGymTrainKey)
|
||||||
@ -176,6 +179,42 @@ const menuItemList: MenuItem[] = [
|
|||||||
ElMessage({ message: '毒 CD: ' + cd + 'h', showClose: true })
|
ElMessage({ message: '毒 CD: ' + cd + 'h', showClose: true })
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
title: '🍺 喝啤酒',
|
||||||
|
handler: () => {
|
||||||
|
useItem('180')
|
||||||
|
const sidebarData = getSidebarData()
|
||||||
|
const nerve = sidebarData.bars.nerve.amount
|
||||||
|
const cd = (sidebarData.statusIcons.icons.booster_cooldown?.timerExpiresAt - sidebarData.statusIcons.icons.booster_cooldown?.serverTimestamp) / 3600 | 0
|
||||||
|
ElMessage({ message: 'N: ' + nerve + ', CD: ' + cd + 'h', showClose: true })
|
||||||
|
},
|
||||||
|
},
|
||||||
|
{
|
||||||
|
title: '♻️ REFILL',
|
||||||
|
handler: () => fetch(window.addRFC("https://www.torn.com/points.php?step=pointsbuy&action=energyrefill2"), {
|
||||||
|
"headers": {
|
||||||
|
"accept": "text/plain, */*; q=0.01",
|
||||||
|
"sec-ch-ua-mobile": "?0",
|
||||||
|
"sec-fetch-dest": "empty",
|
||||||
|
"sec-fetch-mode": "cors",
|
||||||
|
"sec-fetch-site": "same-origin",
|
||||||
|
"x-requested-with": "XMLHttpRequest"
|
||||||
|
},
|
||||||
|
"referrer": "https://www.torn.com/points.php",
|
||||||
|
"referrerPolicy": "strict-origin-when-cross-origin",
|
||||||
|
"body": null,
|
||||||
|
"method": "GET",
|
||||||
|
"mode": "cors",
|
||||||
|
"credentials": "include"
|
||||||
|
})
|
||||||
|
.then(res => res.json())
|
||||||
|
.then(res => ElMessage({
|
||||||
|
message: `<p>${ res.msg }</p><p>剩余refill: ${ res["refills"] }</p>`,
|
||||||
|
type: res.state === 'done' ? 'success' : 'error',
|
||||||
|
dangerouslyUseHTMLString: true
|
||||||
|
}))
|
||||||
|
.catch(e => ElMessage.error(e.toString)),
|
||||||
|
},
|
||||||
{
|
{
|
||||||
title: '🚓 快速犯罪',
|
title: '🚓 快速犯罪',
|
||||||
template: QuickCrime,
|
template: QuickCrime,
|
||||||
@ -200,18 +239,10 @@ const menuItemList: MenuItem[] = [
|
|||||||
title: '💰 公司存钱',
|
title: '💰 公司存钱',
|
||||||
template: CompanyWithdraw,
|
template: CompanyWithdraw,
|
||||||
},
|
},
|
||||||
{
|
|
||||||
title: '💰 PI存钱',
|
|
||||||
template: PropertyVault,
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
title: '📦 物品',
|
title: '📦 物品',
|
||||||
template: InventoryView,
|
template: InventoryView,
|
||||||
},
|
},
|
||||||
{
|
|
||||||
title: '🎯 BS估算',
|
|
||||||
template: BSEstView,
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
title: '🫵 关闭店铺(双击开启)',
|
title: '🫵 关闭店铺(双击开启)',
|
||||||
handler: () => bazaarControl.method(),
|
handler: () => bazaarControl.method(),
|
||||||
@ -272,42 +303,6 @@ const _globVars = ref(globVars)
|
|||||||
const editableTabsValue = ref('')
|
const editableTabsValue = ref('')
|
||||||
const editableTabs = shallowRef([])
|
const editableTabs = shallowRef([])
|
||||||
|
|
||||||
// refil
|
|
||||||
const handleRefil = (method: 'refillEnergy' | 'refillNerve' | 'refillCasinoTokens') => {
|
|
||||||
fetch(window.addRFC("https://www.torn.com/page.php?sid=pointsBuildingExchange"), {
|
|
||||||
"headers": {
|
|
||||||
"accept": "*/*",
|
|
||||||
"accept-language": "zh-CN,zh;q=0.9",
|
|
||||||
"sec-fetch-dest": "empty",
|
|
||||||
"sec-fetch-mode": "cors",
|
|
||||||
"sec-fetch-site": "same-origin",
|
|
||||||
"x-requested-with": "XMLHttpRequest"
|
|
||||||
},
|
|
||||||
"referrer": "https://www.torn.com/page.php?sid=points",
|
|
||||||
"referrerPolicy": "strict-origin-when-cross-origin",
|
|
||||||
"body": (() => {
|
|
||||||
const data = new FormData();
|
|
||||||
data.append('key', method);
|
|
||||||
return data;
|
|
||||||
})(),
|
|
||||||
"method": "POST",
|
|
||||||
"mode": "cors",
|
|
||||||
"credentials": "include"
|
|
||||||
})
|
|
||||||
.then(res => res.json())
|
|
||||||
.catch(e => ElMessage.error('REFILL异常: ' + e.toString))
|
|
||||||
.then(res => {
|
|
||||||
ElMessage({
|
|
||||||
message: res.success ?
|
|
||||||
`<p>成功</p><p>剩余次数: ${ res["specialRefills"] } 剩余点数: ${ res['points'] }</p>` :
|
|
||||||
`REFILL异常: ${ res.error }`,
|
|
||||||
type: res.success ? 'success' : 'error',
|
|
||||||
dangerouslyUseHTMLString: true
|
|
||||||
})
|
|
||||||
throw new TypeError('REFILL异常: ' + res.error)
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
// fast travel
|
// fast travel
|
||||||
const travelData = [
|
const travelData = [
|
||||||
{ cName: "🇲🇽 墨西哥", index: 0 },
|
{ cName: "🇲🇽 墨西哥", index: 0 },
|
||||||
@ -473,6 +468,14 @@ onMounted(() => {
|
|||||||
documentHeight.value = document.documentElement.scrollHeight;
|
documentHeight.value = document.documentElement.scrollHeight;
|
||||||
});
|
});
|
||||||
|
|
||||||
|
// watch(_globVars, (_globVars, pre) => {
|
||||||
|
// logger.info({ _globVars, pre })
|
||||||
|
// _buttons.value = []
|
||||||
|
// let keys = Object(globVars.buttons).keys()
|
||||||
|
// for (let i = 0; i < keys.length; i++) {
|
||||||
|
// _buttons.value.push(globVars.buttons[keys[i]])
|
||||||
|
// }
|
||||||
|
// }, { deep: true })
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style scoped>
|
<style scoped>
|
||||||
|
|||||||
@ -67,7 +67,6 @@ import { itemNameDict } from "../ts/dictionary/translation";
|
|||||||
import toThousands from "../ts/func/utils/toThousands";
|
import toThousands from "../ts/func/utils/toThousands";
|
||||||
import Sleep from "../ts/func/utils/Sleep";
|
import Sleep from "../ts/func/utils/Sleep";
|
||||||
import { MathUtilsKey } from "../ts/class/utils/MathUtils";
|
import { MathUtilsKey } from "../ts/class/utils/MathUtils";
|
||||||
import { timePastFormat } from "../ts/func/utils/timePastFormat";
|
|
||||||
|
|
||||||
const logger = inject(LoggerKey);
|
const logger = inject(LoggerKey);
|
||||||
const itemHelper = inject(ItemHelperKey);
|
const itemHelper = inject(ItemHelperKey);
|
||||||
@ -91,6 +90,25 @@ const itemOnList = ref<ItemInfo[]>([]);
|
|||||||
const listLoading = ref<boolean>(false);
|
const listLoading = ref<boolean>(false);
|
||||||
const currentTs = ref<number>(Date.now());
|
const currentTs = ref<number>(Date.now());
|
||||||
|
|
||||||
|
const timePastFormat = (ts: number): string => {
|
||||||
|
// 毫秒
|
||||||
|
if (ts < 1000) {
|
||||||
|
return ts + 'ms';
|
||||||
|
}
|
||||||
|
// 秒
|
||||||
|
else if (ts < 60000) {
|
||||||
|
return (ts / 1000 | 0) + 's';
|
||||||
|
}
|
||||||
|
// 分
|
||||||
|
else if (ts < 3600000) {
|
||||||
|
return (ts / 60000 | 0) + 'm';
|
||||||
|
}
|
||||||
|
// 时
|
||||||
|
else {
|
||||||
|
return (ts / 3600000 | 0) + 'h';
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
const doGetIMarketList = async (id: number) => {
|
const doGetIMarketList = async (id: number) => {
|
||||||
itemOnList.value = [];
|
itemOnList.value = [];
|
||||||
listLoading.value = true;
|
listLoading.value = true;
|
||||||
|
|||||||
@ -1,189 +0,0 @@
|
|||||||
<script lang="ts" setup>
|
|
||||||
|
|
||||||
import { inject, onMounted, ref } from "vue"
|
|
||||||
import { LoggerKey } from "../ts/class/Logger"
|
|
||||||
import { fetchCurrentMoney, fetchCurrentPropVaultAvailableMoney } from "../ts/func/utils/fetchCurrentMoney"
|
|
||||||
import { ElMessage } from "element-plus"
|
|
||||||
import toThousands from "../ts/func/utils/toThousands"
|
|
||||||
|
|
||||||
const logger = inject(LoggerKey)
|
|
||||||
|
|
||||||
const inputMoney = ref('')
|
|
||||||
const inputWithdrawMoney = ref('')
|
|
||||||
const formModel = ref({
|
|
||||||
cash: 0, vault: 0,
|
|
||||||
})
|
|
||||||
const propId = ref(-1)
|
|
||||||
|
|
||||||
const updateCash = async () => {
|
|
||||||
formModel.value.cash = await fetchCurrentMoney()
|
|
||||||
return formModel.value.cash
|
|
||||||
}
|
|
||||||
const updateVault = async () => {
|
|
||||||
formModel.value.vault = await fetchCurrentPropVaultAvailableMoney()
|
|
||||||
return formModel.value.vault
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 存取钱通用
|
|
||||||
* @param amount
|
|
||||||
* @param action {'deposit' | 'withdraw'}
|
|
||||||
*/
|
|
||||||
const deposit = async (amount: number, action: 'deposit' | 'withdraw' = 'deposit') => {
|
|
||||||
if (amount < 1) {
|
|
||||||
ElMessage.error('数额不能小于1')
|
|
||||||
logger.error('数额不能小于1')
|
|
||||||
throw new Error('数额不能小于1')
|
|
||||||
}
|
|
||||||
if (propId.value === -1) {
|
|
||||||
ElMessage.error('未获取到房产id')
|
|
||||||
logger.error('未获取到房产id')
|
|
||||||
throw new Error('未获取到房产id')
|
|
||||||
}
|
|
||||||
|
|
||||||
let response: string
|
|
||||||
try {
|
|
||||||
response = await (await fetch(window.addRFC("https://www.torn.com/properties.php"), {
|
|
||||||
"headers": {
|
|
||||||
"accept": "*/*",
|
|
||||||
"accept-language": "zh-CN,zh;q=0.9",
|
|
||||||
"content-type": "application/x-www-form-urlencoded; charset=UTF-8",
|
|
||||||
"sec-fetch-dest": "empty",
|
|
||||||
"sec-fetch-mode": "cors",
|
|
||||||
"sec-fetch-site": "same-origin",
|
|
||||||
"x-requested-with": "XMLHttpRequest"
|
|
||||||
},
|
|
||||||
"referrer": "https://www.torn.com/properties.php",
|
|
||||||
"referrerPolicy": "strict-origin-when-cross-origin",
|
|
||||||
"body": "step=vaultProperty&" + action + "=" + amount + "&ID=" + propId.value,
|
|
||||||
"method": "POST",
|
|
||||||
"mode": "cors",
|
|
||||||
"credentials": "include"
|
|
||||||
})).text()
|
|
||||||
} catch (e) {
|
|
||||||
ElMessage.error('请求出错 ' + e.message)
|
|
||||||
logger.error(e.stack)
|
|
||||||
throw e
|
|
||||||
}
|
|
||||||
|
|
||||||
let error: string, text: string
|
|
||||||
try {
|
|
||||||
let json = JSON.parse(response)
|
|
||||||
error = json.error
|
|
||||||
text = json.text
|
|
||||||
} catch (e) {
|
|
||||||
}
|
|
||||||
if (error) {
|
|
||||||
ElMessage.error('$' + toThousands(amount) + ' 存取请求失败 ' + text)
|
|
||||||
logger.error('存取请求失败 ' + text)
|
|
||||||
throw new Error('存取请求失败 ' + text)
|
|
||||||
} else {
|
|
||||||
ElMessage.success('$' + toThousands(amount) + ' 存取请求完成')
|
|
||||||
}
|
|
||||||
|
|
||||||
if (action === 'deposit') {
|
|
||||||
inputWithdrawMoney.value = ''
|
|
||||||
} else {
|
|
||||||
inputMoney.value = ''
|
|
||||||
}
|
|
||||||
updateVault().then()
|
|
||||||
updateCash().then()
|
|
||||||
}
|
|
||||||
|
|
||||||
const getPropId = async () => {
|
|
||||||
let response: string
|
|
||||||
try {
|
|
||||||
response = await (await fetch("https://www.torn.com/properties.php", {
|
|
||||||
"headers": {
|
|
||||||
"accept": "*/*",
|
|
||||||
"accept-language": "zh-CN,zh;q=0.9",
|
|
||||||
"content-type": "application/x-www-form-urlencoded; charset=UTF-8",
|
|
||||||
"sec-fetch-dest": "empty",
|
|
||||||
"sec-fetch-mode": "cors",
|
|
||||||
"sec-fetch-site": "same-origin",
|
|
||||||
"x-requested-with": "XMLHttpRequest"
|
|
||||||
},
|
|
||||||
"referrer": "https://www.torn.com/properties.php",
|
|
||||||
"referrerPolicy": "strict-origin-when-cross-origin",
|
|
||||||
"body": "p=options&tab=vault&step=options",
|
|
||||||
"method": "POST",
|
|
||||||
"mode": "cors",
|
|
||||||
"credentials": "include"
|
|
||||||
})).text()
|
|
||||||
} catch (e) {
|
|
||||||
ElMessage.error('获取房产id失败,请重试')
|
|
||||||
logger.error('获取房产id失败', e)
|
|
||||||
throw e
|
|
||||||
}
|
|
||||||
const reg = /&ID=(\d+)"/
|
|
||||||
const match = response.match(reg)
|
|
||||||
if (match) {
|
|
||||||
propId.value = Number(match[1])
|
|
||||||
} else {
|
|
||||||
ElMessage.error('获取房产id失败,报文未能成功匹配')
|
|
||||||
logger.error('获取房产id失败,报文未能成功匹配')
|
|
||||||
throw new Error('获取房产id失败,报文未能成功匹配')
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
onMounted(async () => {
|
|
||||||
await getPropId()
|
|
||||||
await updateCash()
|
|
||||||
await updateVault()
|
|
||||||
})
|
|
||||||
|
|
||||||
</script>
|
|
||||||
|
|
||||||
<template>
|
|
||||||
<div class="gap4">
|
|
||||||
<el-card shadow="never">当前默认房产id:{{ propId }}</el-card>
|
|
||||||
<el-card shadow="never">
|
|
||||||
<template #header>
|
|
||||||
存钱:{{ toThousands(formModel.cash) }}
|
|
||||||
</template>
|
|
||||||
<el-row>
|
|
||||||
<el-col :span="3">
|
|
||||||
<el-button @click="async ()=>inputMoney=String(await updateCash())">$</el-button>
|
|
||||||
</el-col>
|
|
||||||
<el-col :span="18">
|
|
||||||
<el-input v-model="inputMoney"/>
|
|
||||||
</el-col>
|
|
||||||
<el-col :span="3">
|
|
||||||
<el-button @click="()=>{deposit(Number(inputMoney),'deposit');inputMoney=''}">确定</el-button>
|
|
||||||
</el-col>
|
|
||||||
</el-row>
|
|
||||||
</el-card>
|
|
||||||
<el-card shadow="never">
|
|
||||||
<template #header>
|
|
||||||
取钱:{{ toThousands(formModel.vault) }}
|
|
||||||
</template>
|
|
||||||
<el-row>
|
|
||||||
<el-button-group>
|
|
||||||
<el-button type="primary" @click="()=>inputWithdrawMoney='1000000'">1m</el-button>
|
|
||||||
<el-button type="primary" @click="()=>inputWithdrawMoney='2000000'">2m</el-button>
|
|
||||||
<el-button type="primary" @click="()=>inputWithdrawMoney='5000000'">5m</el-button>
|
|
||||||
<el-button type="primary" @click="()=>inputWithdrawMoney='10000000'">10m</el-button>
|
|
||||||
<el-button type="primary" @click="()=>inputWithdrawMoney='20000000'">20m</el-button>
|
|
||||||
</el-button-group>
|
|
||||||
</el-row>
|
|
||||||
<el-row>
|
|
||||||
<el-col :span="3">
|
|
||||||
<el-button @click="async ()=>inputWithdrawMoney=String(await updateVault())">$</el-button>
|
|
||||||
</el-col>
|
|
||||||
<el-col :span="18">
|
|
||||||
<el-input v-model="inputWithdrawMoney"/>
|
|
||||||
</el-col>
|
|
||||||
<el-col :span="3">
|
|
||||||
<el-button @click="()=>{deposit(Number(inputWithdrawMoney),'withdraw');inputWithdrawMoney=''}">确定
|
|
||||||
</el-button>
|
|
||||||
</el-col>
|
|
||||||
</el-row>
|
|
||||||
</el-card>
|
|
||||||
</div>
|
|
||||||
</template>
|
|
||||||
|
|
||||||
<style scoped>
|
|
||||||
.gap4 .el-card {
|
|
||||||
margin-bottom: 4px;
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
@ -1,62 +1,22 @@
|
|||||||
<template>
|
<template>
|
||||||
<!-- <el-row>-->
|
<el-button @click="doCrime(11,'warehouse')">烧仓库</el-button>
|
||||||
<!-- <el-col :span="12">-->
|
<el-button @click="doCrime(15,'napcop')">做15-3</el-button>
|
||||||
<div class="mt-4">
|
<el-button @click="doCrime(18,'hackbank')">做18-1</el-button>
|
||||||
<el-space>
|
|
||||||
<el-button-group>
|
|
||||||
<el-button @click="doCrime(11, 'warehouse')">烧仓库</el-button>
|
|
||||||
<el-button @click="doCrime(15, 'napcop')">做15-3</el-button>
|
|
||||||
<el-button @click="doCrime(18, 'hackbank')">做18-1</el-button>
|
|
||||||
</el-button-group>
|
|
||||||
<!-- </el-col>-->
|
|
||||||
<!-- <el-col :span="12">-->
|
|
||||||
<el-button type="primary" @click="doYouLikeABeer()">🍺 你喜欢啤酒吗</el-button>
|
|
||||||
</el-space>
|
|
||||||
</div>
|
|
||||||
<!-- </el-col>-->
|
|
||||||
<!-- </el-row>-->
|
|
||||||
<!-- <el-row>-->
|
|
||||||
<div class="mt-4">
|
|
||||||
<el-space>
|
|
||||||
<el-cascader v-model="crimeSelected" :options="CrimeData" :show-all-levels="false" clearable
|
|
||||||
placeholder="选择其他"/>
|
|
||||||
<el-button :disabled="!(crimeSelected && crimeSelected.length)"
|
|
||||||
:icon="Coffee"
|
|
||||||
round type="danger" @click="doCrime(crimeSelected[0], crimeSelected[1])">做
|
|
||||||
</el-button>
|
|
||||||
</el-space>
|
|
||||||
</div>
|
|
||||||
<!-- </el-row>-->
|
|
||||||
<div class="mt-4">
|
|
||||||
<el-space>
|
|
||||||
<el-tag type="primary">NERVE {{ nerve }}</el-tag>
|
|
||||||
<el-tag type="danger">CD {{ boostCoolDown }}</el-tag>
|
|
||||||
</el-space>
|
|
||||||
</div>
|
|
||||||
<div v-if="responseHtmlString" v-html="responseHtmlString"></div>
|
|
||||||
<div v-if="results" v-html="results"></div>
|
<div v-if="results" v-html="results"></div>
|
||||||
<el-skeleton v-if="loading" :rows="3" animated/>
|
<el-skeleton v-if="loading" :rows="3" animated/>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script lang="ts" setup>
|
<script lang="ts" setup>
|
||||||
import { Coffee } from "@element-plus/icons-vue"
|
import { inject, ref } from 'vue';
|
||||||
import { inject, onBeforeUnmount, onMounted, ref } from 'vue'
|
import { ElMessage } from "element-plus";
|
||||||
import { LoggerKey } from "../ts/class/Logger"
|
import { LoggerKey } from "../ts/class/Logger";
|
||||||
import { CrimeData } from "./data/CrimeData"
|
|
||||||
import { useItemSync } from "../ts/func/utils/useItem"
|
|
||||||
import getSidebarData from "../ts/func/utils/getSidebarData"
|
|
||||||
|
|
||||||
const logger = inject(LoggerKey)
|
|
||||||
const results = ref("")
|
|
||||||
const loading = ref(false)
|
|
||||||
const crimeSelected = ref(null)
|
|
||||||
const responseHtmlString = ref('')
|
|
||||||
const boostCoolDown = ref(0)
|
|
||||||
const nerve = ref(0)
|
|
||||||
|
|
||||||
|
const logger = inject(LoggerKey);
|
||||||
|
const results = ref("");
|
||||||
|
const loading = ref(false);
|
||||||
const doCrime = async (nerve, crime: "hackbank" | "warehouse" | 'napcop') => {
|
const doCrime = async (nerve, crime: "hackbank" | "warehouse" | 'napcop') => {
|
||||||
loading.value = true
|
loading.value = true;
|
||||||
results.value = ''
|
results.value = '';
|
||||||
try {
|
try {
|
||||||
results.value = await (await fetch(window.addRFC("https://www.torn.com/crimes.php?step=docrime4×tamp=" + Date.now()), {
|
results.value = await (await fetch(window.addRFC("https://www.torn.com/crimes.php?step=docrime4×tamp=" + Date.now()), {
|
||||||
"headers": {
|
"headers": {
|
||||||
@ -74,48 +34,25 @@ const doCrime = async (nerve, crime: "hackbank" | "warehouse" | 'napcop') => {
|
|||||||
"method": "POST",
|
"method": "POST",
|
||||||
"mode": "cors",
|
"mode": "cors",
|
||||||
"credentials": "include"
|
"credentials": "include"
|
||||||
})).text()
|
})).text();
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
logger.error(e.stack)
|
logger.error(e.stack);
|
||||||
results.value = e.message
|
results.value = e.message;
|
||||||
}
|
}
|
||||||
let err: string
|
let err;
|
||||||
try {
|
try {
|
||||||
err = JSON.parse(results.value).error
|
err = JSON.parse(results.value).error;
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
}
|
}
|
||||||
if (err) {
|
if (err) {
|
||||||
results.value = '错误: ' + err
|
results.value = '出错了';
|
||||||
// ElMessage.error('错误: ' + err)
|
ElMessage.error('错误: ' + err);
|
||||||
logger.error(err)
|
logger.error(err);
|
||||||
}
|
}
|
||||||
loading.value = false
|
loading.value = false;
|
||||||
updateData()
|
};
|
||||||
}
|
|
||||||
|
|
||||||
const doYouLikeABeer = async () => {
|
|
||||||
await useItemSync('180', false, (res) => {
|
|
||||||
responseHtmlString.value = res.text
|
|
||||||
updateData()
|
|
||||||
}
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
const updateData = () => {
|
|
||||||
const sidebarData = getSidebarData()
|
|
||||||
nerve.value = sidebarData.bars.nerve.amount
|
|
||||||
boostCoolDown.value = (sidebarData.statusIcons.icons.booster_cooldown?.timerExpiresAt - sidebarData.statusIcons.icons.booster_cooldown?.serverTimestamp) / 3600 | 0
|
|
||||||
}
|
|
||||||
|
|
||||||
let intervalId = 0
|
|
||||||
onMounted(() => {
|
|
||||||
updateData()
|
|
||||||
intervalId = window.setInterval(() => updateData(), 60000)
|
|
||||||
})
|
|
||||||
|
|
||||||
onBeforeUnmount(() => {
|
|
||||||
if (intervalId) window.clearInterval(intervalId)
|
|
||||||
})
|
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
<style scoped></style>
|
<style scoped>
|
||||||
|
|
||||||
|
</style>
|
||||||
@ -1,183 +0,0 @@
|
|||||||
export const CrimeData = [
|
|
||||||
{
|
|
||||||
value: "2",
|
|
||||||
label: "2n - 搜刮",
|
|
||||||
children: [
|
|
||||||
{ value: "searchtrainstation", label: "2-1 搜火车站" },
|
|
||||||
{ value: "searchbridge", label: "2-2 搜桥洞" },
|
|
||||||
{ value: "searchbins", label: "2-3 搜垃圾桶" },
|
|
||||||
{ value: "searchfountain", label: "2-4 搜喷泉" },
|
|
||||||
{ value: "searchdumpster", label: "2-5 搜垃圾箱" },
|
|
||||||
{ value: "searchmovie", label: "2-6 搜电影院" },
|
|
||||||
],
|
|
||||||
},
|
|
||||||
{
|
|
||||||
value: "3",
|
|
||||||
label: "3n - 卖盗版碟",
|
|
||||||
children: [
|
|
||||||
{ value: "cdrock", label: "3-1 卖摇滚碟" },
|
|
||||||
{ value: "cdheavymetal", label: "3-2 卖重金属碟" },
|
|
||||||
{ value: "cdpop", label: "3-3 卖KDA" },
|
|
||||||
{ value: "cdrap", label: "3-4 卖嘻哈碟" },
|
|
||||||
{ value: "cdreggae", label: "3-5 卖雷鬼碟" },
|
|
||||||
{ value: "dvdhorror", label: "3-6 卖恐怖电影碟" },
|
|
||||||
{ value: "dvdaction", label: "3-7 卖动作电影碟" },
|
|
||||||
{ value: "dvdromance", label: "3-8 卖爱情电影碟" },
|
|
||||||
{ value: "dvdsci", label: "3-9 卖科幻电影碟" },
|
|
||||||
{ value: "dvdthriller", label: "3-10 卖惊悚电影碟" },
|
|
||||||
],
|
|
||||||
},
|
|
||||||
{
|
|
||||||
value: "4",
|
|
||||||
label: "4n - 零元购",
|
|
||||||
children: [
|
|
||||||
{ value: "sweetshop", label: "4-1 糖果店零元购" },
|
|
||||||
{ value: "marketstall", label: "4-2 路边摊零元购" },
|
|
||||||
{ value: "clothesshop", label: "4-3 服装店零元购" },
|
|
||||||
{ value: "jewelryshop", label: "4-4 珠宝店零元购" },
|
|
||||||
],
|
|
||||||
},
|
|
||||||
{
|
|
||||||
value: "5",
|
|
||||||
label: "5n - 扒窃",
|
|
||||||
children: [
|
|
||||||
{ value: "hobo", label: "5-1 扒挎包" },
|
|
||||||
{ value: "kid", label: "5-2 扒小孩" },
|
|
||||||
{ value: "oldwoman", label: "5-3 扒老阿婆" },
|
|
||||||
{ value: "businessman", label: "5-4 扒商业男" },
|
|
||||||
{ value: "lawyer", label: "5-5 扒律师" },
|
|
||||||
],
|
|
||||||
},
|
|
||||||
{
|
|
||||||
value: "6",
|
|
||||||
label: "6n - 入室",
|
|
||||||
children: [
|
|
||||||
{ value: "apartment", label: "6-1 进公寓" },
|
|
||||||
{ value: "house", label: "6-2 进平房" },
|
|
||||||
{ value: "mansion", label: "6-3 进豪宅" },
|
|
||||||
{ value: "cartheft", label: "6-4 扒车门" },
|
|
||||||
{ value: "office", label: "6-5 进办公室" },
|
|
||||||
],
|
|
||||||
},
|
|
||||||
{
|
|
||||||
value: "7",
|
|
||||||
label: "7n - 武装抢劫",
|
|
||||||
children: [
|
|
||||||
{ value: "swiftrobbery", label: "7-1 抢了就跑" },
|
|
||||||
{ value: "thoroughrobbery", label: "7-2 一个不留" },
|
|
||||||
{ value: "swiftconvenient", label: "7-3 小卖铺行动" },
|
|
||||||
{ value: "thoroughconvenient", label: "7-4 小卖铺打砸抢" },
|
|
||||||
{ value: "swiftbank", label: "7-5 太平洋银行差事" },
|
|
||||||
{ value: "thoroughbank", label: "7-6 太平洋银行差事(困难)" },
|
|
||||||
{ value: "swiftcar", label: "7-7 劫车" },
|
|
||||||
{ value: "thoroughcar", label: "7-8 洗劫一空" },
|
|
||||||
],
|
|
||||||
},
|
|
||||||
{
|
|
||||||
value: "8",
|
|
||||||
label: "8n - 贩毒",
|
|
||||||
children: [
|
|
||||||
{ value: "cannabis", label: "8-1 运叶子" },
|
|
||||||
{ value: "amphetamines", label: "8-2 运安非他命" },
|
|
||||||
{ value: "cocaine", label: "8-3 运可卡因" },
|
|
||||||
{ value: "drugscanabis", label: "8-4 卖叶子" },
|
|
||||||
{ value: "drugspills", label: "8-5 卖小药丸" },
|
|
||||||
{ value: "drugscocaine", label: "8-6 卖可卡因" },
|
|
||||||
],
|
|
||||||
},
|
|
||||||
{
|
|
||||||
value: "9",
|
|
||||||
label: "9n - 网络投毒",
|
|
||||||
children: [
|
|
||||||
{ value: "simplevirus", label: "9-1 简单病毒" },
|
|
||||||
{ value: "polymorphicvirus", label: "9-2 多态病毒" },
|
|
||||||
{ value: "tunnelingvirus", label: "9-3 隧道病毒" },
|
|
||||||
{ value: "armoredvirus", label: "9-4 加壳病毒" },
|
|
||||||
{ value: "stealthvirus", label: "9-5 隐形病毒" },
|
|
||||||
],
|
|
||||||
},
|
|
||||||
{
|
|
||||||
value: "10",
|
|
||||||
label: "10n - 刺杀",
|
|
||||||
children: [
|
|
||||||
{ value: "assasination", label: "10-1 刺杀一个目标" },
|
|
||||||
{ value: "driveby", label: "10-2 驾车射击" },
|
|
||||||
{ value: "carbomb", label: "10-3 自爆卡车" },
|
|
||||||
{ value: "murdermobboss", label: "10-4 刺杀帮派头目" },
|
|
||||||
],
|
|
||||||
},
|
|
||||||
{
|
|
||||||
value: "11",
|
|
||||||
label: "11n - 放火",
|
|
||||||
children: [
|
|
||||||
{ value: "home", label: "11-1 家里放火" },
|
|
||||||
{ value: "Carlot", label: "11-2 停车场纵火" },
|
|
||||||
{ value: "OfficeBuilding", label: "11-3 办公楼纵火" },
|
|
||||||
{ value: "aptbuilding", label: "11-4 公寓楼纵火" },
|
|
||||||
{ value: "warehouse", label: "11-5 烧仓库" },
|
|
||||||
{ value: "motel", label: "11-6 烧炮楼" },
|
|
||||||
{ value: "govbuilding", label: "11-7 烧政府办公楼" },
|
|
||||||
],
|
|
||||||
},
|
|
||||||
{
|
|
||||||
value: "12",
|
|
||||||
label: "12n - GTA",
|
|
||||||
children: [
|
|
||||||
{ value: "parkedcar", label: "12-1 偷停着的车" },
|
|
||||||
{ value: "movingcar", label: "12-2 偷开着的车" },
|
|
||||||
{ value: "carshop", label: "12-3 偷展示的车" },
|
|
||||||
],
|
|
||||||
},
|
|
||||||
{
|
|
||||||
value: "13",
|
|
||||||
label: "13n - 点数店",
|
|
||||||
children: [
|
|
||||||
{ value: "pawnshop", label: "13-1 点数店" },
|
|
||||||
{ value: "pawnshopcash", label: "13-2 抢点市现金" },
|
|
||||||
],
|
|
||||||
},
|
|
||||||
{
|
|
||||||
value: "14",
|
|
||||||
label: "14n - 伪造",
|
|
||||||
children: [
|
|
||||||
{ value: "makemoney2", label: "14-1 印钞" },
|
|
||||||
{ value: "maketokens2", label: "14-2 造赌场代币" },
|
|
||||||
{ value: "makecard", label: "14-3 伪造信用卡" },
|
|
||||||
],
|
|
||||||
},
|
|
||||||
{
|
|
||||||
value: "15",
|
|
||||||
label: "15n - 绑架",
|
|
||||||
children: [
|
|
||||||
{ value: "napkid", label: "15-1 绑小孩" },
|
|
||||||
{ value: "napwomen", label: "15-2 绑女人" },
|
|
||||||
{ value: "napcop", label: "15-3 绑警察" },
|
|
||||||
{ value: "napmayor", label: "15-4 绑市长" },
|
|
||||||
],
|
|
||||||
},
|
|
||||||
{
|
|
||||||
value: "16",
|
|
||||||
label: "16n - 军火走私",
|
|
||||||
children: [
|
|
||||||
{ value: "trafficbomb", label: "16-1 走私火药" },
|
|
||||||
{ value: "trafficarms", label: "16-2 走私枪支" },
|
|
||||||
],
|
|
||||||
},
|
|
||||||
{
|
|
||||||
value: "17",
|
|
||||||
label: "17n - 定时炸弹",
|
|
||||||
children: [
|
|
||||||
{ value: "bombfactory", label: "17-1 炸工厂" },
|
|
||||||
{ value: "bombbuilding", label: "17-2 炸大楼" },
|
|
||||||
],
|
|
||||||
},
|
|
||||||
{
|
|
||||||
value: "18",
|
|
||||||
label: "18n - 黑客",
|
|
||||||
children: [
|
|
||||||
{ value: "hackbank", label: "18-1 黑银行" },
|
|
||||||
{ value: "hackfbi", label: "18-2 黑fbi" },
|
|
||||||
],
|
|
||||||
},
|
|
||||||
];
|
|
||||||
|
|
||||||
Loading…
x
Reference in New Issue
Block a user