Compare commits

...

6 Commits

Author SHA1 Message Date
wy
17b58c7924 优化起飞功能错误处理,取消网络拦截,避免官方功能被影响,更新版本至1.2.4 2025-04-07 16:03:01 +08:00
wy
4ae5ba1e46 Fix 2025-03-11 14:54:00 +08:00
d3b85ec361 快捷动作【REFILL】修复 2024-04-07 08:32:07 +08:00
6234424aa6 快捷动作【REFILL】修复 2024-04-03 09:33:54 +08:00
2285b3f41e v1.2.0 2024-03-29 09:56:49 +08:00
92173c57ec - BS估算缓存机制修复
- 快捷功能【快速犯罪】界面优化
2024-03-29 09:44:06 +08:00
23 changed files with 2861 additions and 2822 deletions

View File

@ -1,5 +1,51 @@
# 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 ## 1.1.9
2024年03月27日 2024年03月27日

View File

@ -21,7 +21,6 @@ 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

4
package-lock.json generated
View File

@ -1,12 +1,12 @@
{ {
"name": "wuhu-torn-helper", "name": "wuhu-torn-helper",
"version": "1.1.7", "version": "1.2.2",
"lockfileVersion": 2, "lockfileVersion": 2,
"requires": true, "requires": true,
"packages": { "packages": {
"": { "": {
"name": "wuhu-torn-helper", "name": "wuhu-torn-helper",
"version": "1.1.7", "version": "1.2.2",
"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",

View File

@ -1,6 +1,6 @@
{ {
"name": "wuhu-torn-helper", "name": "wuhu-torn-helper",
"version": "1.1.9", "version": "1.2.4",
"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

View File

@ -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") {

View File

@ -66,115 +66,115 @@ 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 // 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 +190,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 {

View File

@ -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'));

View File

@ -97,9 +97,13 @@ BS: ${ toThousands(data.total) }<br/>
偏差: ${ data.skewness }%<br/> 偏差: ${ data.skewness }%<br/>
估算时间: ${ timePastFormat(Date.now() - data.timestamp * 1000) } 估算时间: ${ timePastFormat(Date.now() - data.timestamp * 1000) }
` `
}).catch(err => domNode.innerHTML = 'BS估算出错了: ' + err.message) }).catch(err => {
domNode.innerHTML = 'BS估算出错了: ' + err.message
throw new TypeError('BS估算出错了: ' + err.message)
})
} catch (e) { } catch (e) {
this.msgWrapper.create('BS估算失败', null, 'error') this.msgWrapper.create('BS估算失败' + e.message, null, 'error')
throw new TypeError('BS估算失败' + e.message)
} }
} }
} }

View File

@ -3,11 +3,8 @@ 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()
@ -20,26 +17,6 @@ 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[] = [
{ {
@ -65,20 +42,6 @@ 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)));
} }

View File

@ -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);
} // }
} // }

View File

@ -123,22 +123,31 @@ export default class QuickFlyBtnHandler {
public async directFly(destIndex: number, typeIndex: number) { public async directFly(destIndex: number, typeIndex: number) {
// 获取key // 获取key
let key; // if(false){
// 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 {
const resp = await (await fetch('/travelagency.php')).text(); msg = await this.netHighLvlWrapper.doTravelFly(QuickFlyBtnHandler.getDestId(destIndex), null, ['standard', 'airstrip', 'private', 'business'][typeIndex])
key = resp.match(/data-key="([0-9]+)"/)[1]; const response = JSON.parse(msg);
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('起飞参数获取失败', {}, 'error'); this.msgWrapper.create('起飞时出现错误 ' + e.message, {}, 'error');
this.logger.error(e.stack); this.logger.error(e.stack);
throw new Error('起飞参数获取失败'); throw new Error('起飞时出现错误 ' + e.message);
}
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');
} }

View File

@ -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('跨域获取数据开始, 脚本引擎: ' + engine); logger.info(`跨域请求 -> ${url}, 脚本引擎: ${engine}`);
return new Promise<string>((resolve, reject) => { return new Promise<string>((resolve, reject) => {
switch (engine) { switch (engine) {
case UserScriptEngine.RAW: { case UserScriptEngine.RAW: {

View File

@ -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 }&key=${ key }&type=${ type }`, "body": `step=travel&id=${ destId }&type=${ type }`,
"method": "POST", "method": "POST",
"mode": "cors", "mode": "cors",
"credentials": "include" "credentials": "include"

File diff suppressed because it is too large Load Diff

View File

@ -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'));

View File

@ -35,7 +35,7 @@ const getCacheObj = () => {
const getCache = (id: number): YataApiDataWrap => { const getCache = (id: number): YataApiDataWrap => {
let cache: YataApiDataWrap = getCacheObj()[id] let cache: YataApiDataWrap = getCacheObj()[id]
if (cache && (Date.now() - cache.timestamp * 1000 > cacheExpireMs)) { if (cache && ((Date.now() - (cache.timestamp * 1000)) < cacheExpireMs)) {
cache.isCache = true cache.isCache = true
} else { } else {
cache = null cache = null

View File

@ -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('暂不支持');
} // }

View File

@ -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')) {

View File

@ -23,7 +23,7 @@ class DrugCDMonitor implements IntervalType {
handler(): void { handler(): void {
const data = getSidebarData() const data = getSidebarData()
if (!data.statusIcons.icons.drug_cooldown) { if (data?.statusIcons?.icons?.drug_cooldown?.timerExpiresAt * 1000 < Date.now()) {
this.msgWrapper.create('警告: 药CD停转', { sysNotify: true }) this.msgWrapper.create('警告: 药CD停转', { sysNotify: true })
} }
} }

View File

@ -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("https://www.torn.com/page.php", { const doFetch = () => fetch(window.addRFC("https://www.torn.com/page.php?sid=eventsData"), {
"headers": { "headers": {
"accept": "*/*", "accept": "*/*",
"sec-ch-ua-mobile": "?0", "sec-ch-ua-mobile": "?0",

View File

@ -3,14 +3,14 @@
<el-button-group class="wh-menu-button" style="z-index: 1000000;"> <el-button-group class="wh-menu-button" style="z-index: 1000000;">
<el-button circle @click="expanded = !expanded"> <el-button circle @click="expanded = !expanded">
<el-icon> <el-icon>
<MoonNight /> <MoonNight/>
</el-icon> </el-icon>
</el-button> </el-button>
<el-button v-for="item in globVars.buttons" @click="item.func">{{ item.txt }}</el-button> <el-button v-for="item in globVars.buttons" @click="item.func">{{ item.txt }}</el-button>
<el-button v-if="editableTabs.length > 0" circle @click="showDrawer"> <el-button v-if="editableTabs.length > 0" circle @click="showDrawer">
<el-badge :value="editableTabs.length" type="primary"> <el-badge :value="editableTabs.length" type="primary">
<el-icon> <el-icon>
<CopyDocument /> <CopyDocument/>
</el-icon> </el-icon>
</el-badge> </el-badge>
</el-button> </el-button>
@ -18,12 +18,12 @@
<el-dialog v-model="drawer" :fullscreen="isMobilePhone" :lock-scroll="true" width="65%"> <el-dialog v-model="drawer" :fullscreen="isMobilePhone" :lock-scroll="true" width="65%">
<el-tabs v-model="editableTabsValue" closable style="margin-top: -1em" type="border-card" @tab-remove="removeTab"> <el-tabs v-model="editableTabsValue" closable style="margin-top: -1em" type="border-card" @tab-remove="removeTab">
<el-tab-pane v-for="item in editableTabs" :key="item.name" :label="item.title" :name="item.name"> <el-tab-pane v-for="item in editableTabs" :key="item.name" :label="item.title" :name="item.name">
<component :is="item.content" /> <component :is="item.content"/>
</el-tab-pane> </el-tab-pane>
</el-tabs> </el-tabs>
</el-dialog> </el-dialog>
<el-drawer v-model="expanded" :show-close="false" :size="isMobilePhone ? '85%' : '30%'" class="whDrawer" <el-drawer v-model="expanded" :show-close="false" :size="isMobilePhone ? '85%' : '30%'" class="whDrawer"
:with-header="false" direction="rtl"> :with-header="false" direction="rtl">
<el-card :body-style="{ 'padding': '0' }" class="innerCard" style="margin-bottom: 0.5em"> <el-card :body-style="{ 'padding': '0' }" class="innerCard" style="margin-bottom: 0.5em">
<template #header> <template #header>
<div>快捷动作</div> <div>快捷动作</div>
@ -69,11 +69,11 @@
<el-icon></el-icon> <el-icon></el-icon>
<span>REFILL</span> <span>REFILL</span>
</template> </template>
<el-menu-item @click="handleRefil('energyrefill2')">能量E <el-menu-item @click="handleRefil('refillEnergy')">能量E
</el-menu-item> </el-menu-item>
<el-menu-item @click="handleRefil('nerverefill2')">犯罪N <el-menu-item @click="handleRefil('refillNerve')">犯罪N
</el-menu-item> </el-menu-item>
<el-menu-item @click="handleRefil('casinotokens2')">赌场代币 <el-menu-item @click="handleRefil('refillCasinoTokens')">赌场代币
</el-menu-item> </el-menu-item>
</el-sub-menu> </el-sub-menu>
</el-menu> </el-menu>
@ -101,13 +101,13 @@
<el-tooltip content="更新?" placement="bottom-start"> <el-tooltip content="更新?" placement="bottom-start">
<el-button link @click="menuClick({ title: '关于助手', template: UpdateDate })">芜湖助手 <el-button link @click="menuClick({ title: '关于助手', template: UpdateDate })">芜湖助手
<el-icon> <el-icon>
<Refresh /> <Refresh/>
</el-icon> </el-icon>
</el-button> </el-button>
</el-tooltip> </el-tooltip>
<el-tag size="small" type="info">{{ <el-tag size="small" type="info">{{
globVars.version.startsWith('$') ? 'dev' : 'v' + globVars.version globVars.version.startsWith('$') ? 'dev' : 'v' + globVars.version
}} }}
</el-tag> </el-tag>
</el-col> </el-col>
</el-row> </el-row>
@ -273,30 +273,39 @@ const editableTabsValue = ref('')
const editableTabs = shallowRef([]) const editableTabs = shallowRef([])
// refil // refil
const handleRefil = (method: 'nerverefill2' | 'energyrefill2' | 'casinotokens2') => { const handleRefil = (method: 'refillEnergy' | 'refillNerve' | 'refillCasinoTokens') => {
fetch(window.addRFC('https://www.torn.com/points.php?step=pointsbuy&action=' + method), { fetch(window.addRFC("https://www.torn.com/page.php?sid=pointsBuildingExchange"), {
"headers": { "headers": {
"accept": "text/plain, */*; q=0.01", "accept": "*/*",
"sec-ch-ua-mobile": "?0", "accept-language": "zh-CN,zh;q=0.9",
"sec-fetch-dest": "empty", "sec-fetch-dest": "empty",
"sec-fetch-mode": "cors", "sec-fetch-mode": "cors",
"sec-fetch-site": "same-origin", "sec-fetch-site": "same-origin",
"x-requested-with": "XMLHttpRequest" "x-requested-with": "XMLHttpRequest"
}, },
"referrer": "https://www.torn.com/points.php", "referrer": "https://www.torn.com/page.php?sid=points",
"referrerPolicy": "strict-origin-when-cross-origin", "referrerPolicy": "strict-origin-when-cross-origin",
"body": null, "body": (() => {
"method": "GET", const data = new FormData();
data.append('key', method);
return data;
})(),
"method": "POST",
"mode": "cors", "mode": "cors",
"credentials": "include" "credentials": "include"
}) })
.then(res => res.json()) .then(res => res.json())
.then(res => ElMessage({ .catch(e => ElMessage.error('REFILL异常: ' + e.toString))
message: `<p>${res.msg}</p><p>剩余次数: ${res["refills"]}</p>`, .then(res => {
type: res.state === 'done' ? 'success' : 'error', ElMessage({
dangerouslyUseHTMLString: true message: res.success ?
})) `<p>成功</p><p>剩余次数: ${ res["specialRefills"] } 剩余点数: ${ res['points'] }</p>` :
.catch(e => ElMessage.error(e.toString)) `REFILL异常: ${ res.error }`,
type: res.success ? 'success' : 'error',
dangerouslyUseHTMLString: true
})
throw new TypeError('REFILL异常: ' + res.error)
})
} }
// fast travel // fast travel
@ -383,25 +392,25 @@ const travelConfirm = (destIndex: number, typeIndex: number) => {
const destName = travelData[destIndex].cName; const destName = travelData[destIndex].cName;
const typeName = ['普通飞机', 'PI飞机', '股票飞机', '商务飞机(机票或内衣店)'][typeIndex]; const typeName = ['普通飞机', 'PI飞机', '股票飞机', '商务飞机(机票或内衣店)'][typeIndex];
ElMessageBox.confirm( ElMessageBox.confirm(
'即将使用「' + typeName + '」飞往「' + destName + '」', '即将使用「' + typeName + '」飞往「' + destName + '」',
'确认', '确认',
{ {
confirmButtonText: '好',
cancelButtonText: '算了',
type: 'info',
}
)
.then(async () => {
await quickFlyBtnHandler.directFly(destIndex, typeIndex);
ElMessageBox.confirm('是否转跳页面?', '确认', {
confirmButtonText: '好', confirmButtonText: '好',
cancelButtonText: '算了', cancelButtonText: '算了',
type: 'info' type: 'info',
} }
).then(() => window.location.href = 'https://www.torn.com') )
.catch(() => null); .then(async () => {
}) await quickFlyBtnHandler.directFly(destIndex, typeIndex);
.catch(() => null); ElMessageBox.confirm('是否转跳页面?', '确认', {
confirmButtonText: '好',
cancelButtonText: '算了',
type: 'info'
}
).then(() => window.location.href = 'https://www.torn.com')
.catch(() => null);
})
.catch(() => null);
}; };
const bazaarControl = { const bazaarControl = {
@ -411,23 +420,23 @@ const bazaarControl = {
let response; let response;
try { try {
response = await (await fetch( response = await (await fetch(
"https://www.torn.com/bazaar.php?sid=bazaarData&step=" + (isClose ? "closeBazaar" : "openBazaar"), "https://www.torn.com/bazaar.php?sid=bazaarData&step=" + (isClose ? "closeBazaar" : "openBazaar"),
{ {
"headers": { "headers": {
"accept": "*/*", "accept": "*/*",
"sec-ch-ua-mobile": "?0", "sec-ch-ua-mobile": "?0",
"sec-fetch-dest": "empty", "sec-fetch-dest": "empty",
"sec-fetch-mode": "cors", "sec-fetch-mode": "cors",
"sec-fetch-site": "same-origin", "sec-fetch-site": "same-origin",
"x-requested-with": "XMLHttpRequest" "x-requested-with": "XMLHttpRequest"
}, },
"referrer": "https://www.torn.com/bazaar.php", "referrer": "https://www.torn.com/bazaar.php",
"referrerPolicy": "strict-origin-when-cross-origin", "referrerPolicy": "strict-origin-when-cross-origin",
"body": null, "body": null,
"method": "GET", "method": "GET",
"mode": "cors", "mode": "cors",
"credentials": "include" "credentials": "include"
} }
)).json(); )).json();
} catch (e) { } catch (e) {
logger.error(e.stack); logger.error(e.stack);

View File

@ -1,27 +1,37 @@
<template> <template>
<el-row> <!-- <el-row>-->
<el-col :span="12"> <!-- <el-col :span="12">-->
<div class="mt-4">
<el-space>
<el-button-group> <el-button-group>
<el-button @click="doCrime(11, 'warehouse')">烧仓库</el-button> <el-button @click="doCrime(11, 'warehouse')">烧仓库</el-button>
<el-button @click="doCrime(15, 'napcop')">做15-3</el-button> <el-button @click="doCrime(15, 'napcop')">做15-3</el-button>
<el-button @click="doCrime(18, 'hackbank')">做18-1</el-button> <el-button @click="doCrime(18, 'hackbank')">做18-1</el-button>
</el-button-group> </el-button-group>
</el-col> <!-- </el-col>-->
<el-col :span="12"> <!-- <el-col :span="12">-->
<el-button type="primary" @click="doYouLikeABeer()">🍺 你喜欢啤酒吗</el-button> <el-button type="primary" @click="doYouLikeABeer()">🍺 你喜欢啤酒吗</el-button>
</el-col> </el-space>
</el-row> </div>
<el-row> <!-- </el-col>-->
<!-- </el-row>-->
<!-- <el-row>-->
<div class="mt-4">
<el-space>
<el-cascader v-model="crimeSelected" :options="CrimeData" :show-all-levels="false" clearable <el-cascader v-model="crimeSelected" :options="CrimeData" :show-all-levels="false" clearable
placeholder="选择其他"/> placeholder="选择其他"/>
<el-button :disabled="!(crimeSelected && crimeSelected.length)" <el-button :disabled="!(crimeSelected && crimeSelected.length)"
:icon="Coffee" :icon="Coffee"
round type="danger" @click="doCrime(crimeSelected[0], crimeSelected[1])"> round type="danger" @click="doCrime(crimeSelected[0], crimeSelected[1])">
</el-button> </el-button>
</el-row> </el-space>
<div> </div>
<!-- </el-row>-->
<div class="mt-4">
<el-space>
<el-tag type="primary">NERVE {{ nerve }}</el-tag> <el-tag type="primary">NERVE {{ nerve }}</el-tag>
<el-tag type="danger">CD {{ boostCoolDown }}</el-tag> <el-tag type="danger">CD {{ boostCoolDown }}</el-tag>
</el-space>
</div> </div>
<div v-if="responseHtmlString" v-html="responseHtmlString"></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>
@ -29,12 +39,12 @@
</template> </template>
<script lang="ts" setup> <script lang="ts" setup>
import { Coffee } from "@element-plus/icons-vue"; import { Coffee } from "@element-plus/icons-vue"
import { inject, onBeforeUnmount, onMounted, ref } from 'vue'; import { inject, onBeforeUnmount, onMounted, ref } from 'vue'
import { LoggerKey } from "../ts/class/Logger"; import { LoggerKey } from "../ts/class/Logger"
import { CrimeData } from "./data/CrimeData"; import { CrimeData } from "./data/CrimeData"
import { useItemSync } from "../ts/func/utils/useItem"; import { useItemSync } from "../ts/func/utils/useItem"
import getSidebarData from "../ts/func/utils/getSidebarData"; import getSidebarData from "../ts/func/utils/getSidebarData"
const logger = inject(LoggerKey) const logger = inject(LoggerKey)
const results = ref("") const results = ref("")
@ -45,8 +55,8 @@ const boostCoolDown = ref(0)
const nerve = ref(0) const nerve = ref(0)
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&timestamp=" + Date.now()), { results.value = await (await fetch(window.addRFC("https://www.torn.com/crimes.php?step=docrime4&timestamp=" + Date.now()), {
"headers": { "headers": {
@ -64,22 +74,22 @@ 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: string
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 = '错误: ' + err
// ElMessage.error(': ' + err); // ElMessage.error(': ' + err)
logger.error(err); logger.error(err)
} }
loading.value = false; loading.value = false
updateData() updateData()
} }