This commit is contained in:
Liwanyi 2022-10-31 10:47:30 +08:00
parent be9e202802
commit 0b6c2cda4f
11 changed files with 164 additions and 42 deletions

View File

@ -4,6 +4,18 @@
# CHANGE
## 0.6.6
2022年10月31日
### 修改
- 寻找木桩添加停止操作
### 添加
- 个人资料隐藏头像、显示曾用名
## 0.6.5
2022年10月26日

View File

@ -1,6 +1,6 @@
{
"name": "wuhu-torn-helper",
"version": "0.6.5",
"version": "0.6.6",
"description": "芜湖助手",
"dependencies": {},
"scripts": {

File diff suppressed because one or more lines are too long

View File

@ -17,6 +17,7 @@ import PTHelper from "./action/PTHelper";
import StackHelper from "./action/StackHelper";
import BuyBeerHelper from "./action/BuyBeerHelper";
import XZMZ from "./action/XZMZ";
import ProfileHelper from "./action/ProfileHelper";
/**
* TODO jq
@ -178,6 +179,9 @@ export default class UrlPattern extends WuhuBase {
});
}
// 个人资料
if (href.includes('profiles.php?XID=')) ProfileHelper.getInstance();
// 圣诞小镇
if (href.contains(/christmas_town\.php/) && new Date().getMonth() > 9) christmasTownHelper();

View File

@ -102,6 +102,10 @@ export default class WuhuConfig extends WuhuBase {
{ key: 'CHTrainsDetect', val: 0 },
// 火车提醒开关
{ key: 'CHTrainsDetectSwitch', val: true },
// 隐藏个人资料头像
{ key: 'HideProfileImg', val: false },
// 显示曾用名
{ key: 'ShowNameHistory', val: true },
// 危险行为⚠️
{ key: 'dangerZone', val: false },

View File

@ -0,0 +1,51 @@
import WuhuBase from "../WuhuBase";
import Log from "../Log";
import WuhuConfig from "../WuhuConfig";
import CommonUtils from "../utils/CommonUtils";
import TornStyleBlock from "../utils/TornStyleBlock";
import TornStyleSwitch from "../utils/TornStyleSwitch";
export default class ProfileHelper extends WuhuBase {
className = 'ProfileHelper';
constructor() {
super();
CommonUtils.addStyle('body.wh-hide_profile_img .profile-image a.profile-image-wrapper .img-wrap img{display:none;}');
let id = document.querySelector('link[rel="canonical"]').getAttribute('href').split('=')[1];
// id获取格式判断
if (!/^[0-9]{1,7}$/.test(id)) {
Log.error('[ProfileHelper] id格式错误');
}
if (WuhuConfig.get('HideProfileImg')) {
Log.info('[ProfileHelper] 隐藏头像');
document.body.classList.toggle('wh-hide_profile_img');
}
let block = new TornStyleBlock('芜湖助手').insert2Dom();
// 隐藏头像
let hideImgSwitch = new TornStyleSwitch('隐藏头像', WuhuConfig.get('HideProfileImg'));
block.append(hideImgSwitch.getBase());
hideImgSwitch.getInput().addEventListener('change', () => {
document.body.classList.toggle('wh-hide_profile_img');
WuhuConfig.set('HideProfileImg', hideImgSwitch.getInput().checked, true);
});
// 曾用名
let nameHistoryNode;
if (WuhuConfig.get('ShowNameHistory')) {
nameHistoryNode = document.createElement('p');
nameHistoryNode.innerHTML = '曾用名:';
block.append(nameHistoryNode);
CommonUtils.ajaxFetch({
url: window.addRFC('https://www.torn.com/profiles.php?step=getProfileData&XID=' + id),
method: 'GET'
}).then((o) => {
o.json().then((res) => {
if (res.userInformation.previousAliases.length > 0) {
res.userInformation.previousAliases.forEach(item => nameHistoryNode.innerHTML += item + ' ');
} else {
nameHistoryNode.innerHTML += '暂无';
}
}).catch(e => Log.error('[ProfileHelper] 错误: ', e.message, '错误堆栈: ', e.stack));
}).catch(e => Log.error('[ProfileHelper] 错误: ', e.message, '错误堆栈: ', e.stack));
}
}
}

View File

@ -16,25 +16,31 @@ export default class XZMZ extends WuhuBase {
private readonly mainRoleContainer: HTMLElement;
private readonly IDList: number[];
private readonly btn: HTMLButtonElement;
private readonly stopBtn: HTMLButtonElement;
private stopSignal: boolean = false;
private readonly tips: HTMLElement;
private counter: number;
public constructor() {
super();
CommonUtils.addStyle(XUNZHAOMUZHUANG_CSS);
document.title = document.title.replace('Items', '寻找木桩');
this.mainRoleContainer = document.querySelector('div[role="main"]');
let block = new TornStyleBlock('寻找木桩');
block.setContent(XUNZHAOMUZHUANG_HTML);
this.mainRoleContainer.append(block.getBase());
this.IDList = MUZHUANG_ID_LIST_JSON.default;
this.btn = block.querySelector('#deadman-start-btn') as HTMLButtonElement;
this.stopBtn = this.btn.nextElementSibling as HTMLButtonElement;
this.tips = block.querySelector('#deadman_tips');
block.querySelector('#deadman-start-btn').addEventListener('click', () => {
this.btn.addEventListener('click', () => {
this.mainRoleContainer.querySelector('#table-body').innerHTML = '';
this.btn.disabled = true;
this.stopSignal = false;
this.StartSearch();
});
this.stopBtn.addEventListener('click', () => this.stopSignal = true);
}
private StartSearch() {
@ -43,6 +49,12 @@ export default class XZMZ extends WuhuBase {
tips.innerText = "---寻找中,长按目标名字弹出迷你档案---";
window.setTimeout(async () => {
for (const id of this.IDList) {
if (this.stopSignal) {
this.stopSignal = false;
this.counter = 1;
this.counterHandler(false);
return;
}
await this.SearchDeadman(id);
}
}, 1);
@ -79,11 +91,11 @@ export default class XZMZ extends WuhuBase {
$parentNode.insertAdjacentHTML('beforeend', $node)
}
private counterHandler(): void {
private counterHandler(hasCoolDown: boolean = true): void {
this.counter--;
if (this.counter === 0) {
this.tips.innerText = "---寻找结束,等待60秒后重试---";
let countdown = 60;
let countdown = hasCoolDown ? 60 : 2;
let timer = window.setInterval(() => {
this.btn.innerHTML = (countdown--).toString();
if (countdown === 0) {
@ -91,7 +103,7 @@ export default class XZMZ extends WuhuBase {
this.btn.disabled = false;
this.btn.innerHTML = '重新寻找';
}
}, 1000)
}, 1000);
}
}
}

View File

@ -353,6 +353,26 @@ export default class SettingsHandler extends WuhuBase {
clickFunc: () => BuyBeerHelper.getInstance().setTimeHandler()
});
// 个人资料
list.push({
domType: 'plain',
domId: '',
domHTML: '个人资料',
tagName: 'h4',
});
list.push({
domType: 'checkbox',
domText: '隐藏个人资料头像',
dictName: 'HideProfileImg',
domId: ''
});
list.push({
domType: 'checkbox',
domText: '显示曾用名',
dictName: 'ShowNameHistory',
domId: ''
});
// 其他
list.push({
domType: 'plain',

View File

@ -3,6 +3,7 @@ import MathUtils from "./MathUtils";
export default class TornStyleSwitch {
private readonly baseElement;
private readonly randomId;
private readonly input;
constructor(label: string, checked: boolean = false) {
this.randomId = MathUtils.getInstance().getRandomInt(100, 2000);
@ -10,14 +11,15 @@ export default class TornStyleSwitch {
this.baseElement.id = 'WHSwitch' + this.randomId;
this.baseElement.innerHTML = `<input class="checkbox-css" type="checkbox" id="WHCheck${ this.randomId }" ${ checked ? 'checked' : '' }/>
<label for="WHCheck${ this.randomId }" class="non-selection marker-css">${ label }</label>`;
this.input = this.baseElement.querySelector('input') as HTMLInputElement;
}
public getBase() {
public getBase(): HTMLElement {
return this.baseElement
};
public getInput(): HTMLInputElement {
return this.baseElement.querySelector('input');
return this.input;
}
public getHtml(): string {

View File

@ -8,12 +8,28 @@ import MathUtils from "../../class/utils/MathUtils";
import ActionButtonUtils from "../../class/utils/ActionButtonUtils";
import ATTACK_HELPER_CSS from "../../static/css/attack_helper.css";
enum FIGHT_STAGE {
READY,
IN_PROGRESS_OR_ERROR,
FINISHED
}
enum DIALOG_BUTTON {
START = 'start',
JOIN = 'join',
LEAVE = 'leave',
MUG = 'mug',
// TODO
HOST = 'hospitalize',
OTHER = 'other'
}
/**
* TODO class重构
*/
export default async function attackHelper(): Promise<null> {
let { href, device } = WuhuBase.glob;
// 攻击页面
// 攻击页面URL判断
if (href.contains(/loader\.php\?sid=attack/)) {
let stop_reload = false;
const quickAttIndex = WuhuConfig.get('quickAttIndex');
@ -64,20 +80,21 @@ export default async function attackHelper(): Promise<null> {
});
}
// await CommonUtils.querySelector('#react-root div[class^="players___"]'); // pc 可用
let playersModelWrap = await CommonUtils.querySelector('#react-root div[class^="playersModelWrap___"]');
let fightStage = document.querySelectorAll('div[class^="dialogButtons___"] button').length > 1;
Log.info('响应式内容已加载');
// 光速拔刀
if (quickAttIndex !== 6) {
// await CommonUtils.querySelector('#react-root div[class^="players___"]'); // pc 可用
await CommonUtils.querySelector('#react-root div[class^="playersModelWrap___"]');
Log.info('响应式内容已加载, 查找攻击按钮');
// const btn = await CommonUtils.elementReady('div[class^="modal___"] button');
/**
* pc #defender
* mobile #attacker
*/
const btn = <HTMLInputElement>(document.querySelector('#attacker button') || document.querySelector('#defender button'));
Log.info('操作按钮按钮', { btn });
Log.info('操作按钮', { btn });
if (!btn.innerText.toLowerCase().includes('fight')) {
Log.info('未找到攻击按钮, 退出');
Log.info('未找到攻击按钮, 光速拔刀跳过');
new Alert('未找到攻击按钮, 光速拔刀跳过');
} else {
// 判断是否存在脚踢
const hasKick = !!document.querySelector('#weapon_boots');
@ -236,27 +253,26 @@ export default async function attackHelper(): Promise<null> {
}
// 光速跑路 TODO 暂时关闭
// if (quickFinishAtt !== 3) {
// const user_btn_select = ['leave', 'mug', 'hosp'][WuhuConfig.get('quickFinishAtt')];
// const wrap = document.querySelector('#react-root');
// Log.info('光速跑路选项选中:', user_btn_select);
// new MutationObserver(() => {
// const btn_arr = document.querySelectorAll('div[class^="dialogButtons___"] button') as unknown as HTMLButtonElement[];
// if (btn_arr.length > 1) btn_arr.forEach(btn => {
// btn = btn as HTMLButtonElement;
// const flag = btn.innerText.toLowerCase().includes(user_btn_select);
// Log.info('按钮内容:', btn.innerText, ',是否包含选中:', flag);
// if (!flag) btn.style.display = 'none';
// // 自动结束
// else if (WuhuConfig.get('autoStartFinish') === true) {
// try {
// btn.click();
// } catch {
// }
// }
// });
// }).observe(wrap, { subtree: true, attributes: true, childList: true });
// }
if (quickFinishAtt !== 3) {
const user_btn_select = ['leave', 'mug', 'hosp'][WuhuConfig.get('quickFinishAtt')];
const wrap = document.querySelector('#react-root');
Log.info('光速跑路选项选中:', user_btn_select);
new MutationObserver((mut, obs) => {
const btn_arr: HTMLButtonElement[] = document.querySelectorAll('div[class^="dialogButtons___"] button') as unknown as HTMLButtonElement[];
if (btn_arr.length > 1) btn_arr.forEach(btn => {
const flag = btn.innerText.toLowerCase().includes(user_btn_select);
Log.info('按钮内容:', btn.innerText, ',是否包含选中:', flag);
if (!flag) btn.style.display = 'none';
// 自动结束
else if (WuhuConfig.get('autoStartFinish')) {
try {
btn.click();
} catch {
}
}
});
}).observe(wrap, { subtree: true, attributes: true, childList: true });
}
return;
}

View File

@ -1,6 +1,7 @@
<div id="deadman_div" style="width: inherit">
<div id="deadman_header" style="margin:10px 0px; border:1px solid darkgray; text-align:center;">
<button class="torn-btn" id="deadman-start-btn" style="margin:5px;">开始寻找木桩</button>
<button class="torn-btn" style="margin:5px;">停止</button>
</div>
<div id="deadman_tips" style="text-align:center; margin-bottom: 3px; font-size: 16px;">未开始</div>
<div id="deadman_wrapper"