From c1ba5c04ec32100a7877d4c6dc2d15089444c4e3 Mon Sep 17 00:00:00 2001 From: Liwanyi Date: Tue, 20 Sep 2022 19:18:21 +0800 Subject: [PATCH] =?UTF-8?q?TS=E9=87=8D=E6=9E=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/class/Global.ts | 4 +- src/class/Utils.ts | 101 ++- src/class/provider/Provider.ts | 0 src/common.ts | 128 ++-- src/func/module/safeKeeper.ts | 4 +- src/func/utils/BuyBeer.ts | 6 +- src/func/utils/getDeviceType.ts | 4 +- src/func/utils/getPlayerInfo.ts | 1 + src/func/utils/getRandomInt.ts | 6 +- src/func/utils/getScriptEngine.ts | 4 +- src/func/utils/getSidebarData.ts | 2 +- src/func/utils/getUserState.ts | 4 +- src/func/utils/getWhSettingObj.ts | 5 +- src/func/utils/getYaoCD.ts | 4 +- src/func/utils/sleep.ts | 8 - src/interface/ISidebarData.ts | 108 ++++ src/interface/IWHSettings.ts | 4 + src/main.ts | 8 +- src/urlMatch.ts | 977 +++++++++++++++--------------- 19 files changed, 792 insertions(+), 586 deletions(-) create mode 100644 src/class/provider/Provider.ts delete mode 100644 src/func/utils/sleep.ts create mode 100644 src/interface/ISidebarData.ts create mode 100644 src/interface/IWHSettings.ts diff --git a/src/class/Global.ts b/src/class/Global.ts index 01893fb..47e5c09 100644 --- a/src/class/Global.ts +++ b/src/class/Global.ts @@ -1,9 +1,9 @@ import BuyBeer, { BeerMonitorLoop } from "../func/utils/BuyBeer"; import Device from "../enum/Device"; -import getPlayerInfo from "../func/utils/getPlayerInfo"; import WindowActiveState from "../func/utils/WindowActiveState"; import WuhuBase from "./WuhuBase"; import IGlobal from "../interface/IGlobal"; +import Utils from "./Utils"; export default class Global extends WuhuBase implements IGlobal { GM_xmlhttpRequest: Function = null; @@ -53,7 +53,7 @@ export default class Global extends WuhuBase implements IGlobal { this.PDA_APIKey = '###PDA-APIKEY###'; this.isPDA = !this.PDA_APIKey.includes('###'); this.device = window.innerWidth >= 1000 ? Device.PC : window.innerWidth <= 600 ? Device.MOBILE : Device.TABLET; - this.player_info = getPlayerInfo(); + this.player_info = Utils.getPlayerInfo(); this.beer = BuyBeer(); this.popup_node = null; this.notifies = { count: 0 }; diff --git a/src/class/Utils.ts b/src/class/Utils.ts index 18d76b7..aba0cc7 100644 --- a/src/class/Utils.ts +++ b/src/class/Utils.ts @@ -1,13 +1,13 @@ - import UserScriptEngine from "../enum/UserScriptEngine"; -import log from "../func/utils/log"; -import Global from "./Global"; import WuhuBase from "./WuhuBase"; +import Log from "./Log"; +import Device from "../enum/Device"; +import ISidebarData from "../interface/ISidebarData"; +import IWHSettings from "../interface/IWHSettings"; -export default class Utils extends WuhuBase{ +export default class Utils extends WuhuBase { static getScriptEngine() { - // let glob = WuHuTornHelper.getGlob(); - let glob = Global.glob; + let glob = WuhuBase.glob; return glob.unsafeWindow ? UserScriptEngine.GM : glob.isPDA ? UserScriptEngine.PDA : UserScriptEngine.RAW; } @@ -26,26 +26,26 @@ export default class Utils extends WuhuBase{ // get if (method === 'get') { if (typeof PDA_httpGet !== 'function') { - log.error('COFetch网络错误:PDA版本不支持'); + Log.error('COFetch网络错误:PDA版本不支持'); reject('COFetch网络错误:PDA版本不支持'); } PDA_httpGet(url) .then(res => resolve(res.responseText)) .catch(e => { - log.error('COFetch网络错误', e); + Log.error('COFetch网络错误', e); reject(`COFetch网络错误 ${ e }`); }) } // post else { if (typeof PDA_httpPost !== 'function') { - log.error('COFetch网络错误:PDA版本不支持'); + Log.error('COFetch网络错误:PDA版本不支持'); reject('COFetch网络错误:PDA版本不支持'); } PDA_httpPost(url, { 'content-type': 'application/json' }, body) .then(res => resolve(res.responseText)) .catch(e => { - log.error('COFetch网络错误', e); + Log.error('COFetch网络错误', e); reject(`COFetch网络错误 ${ e }`); }); } @@ -54,7 +54,7 @@ export default class Utils extends WuhuBase{ case UserScriptEngine.GM: { let { GM_xmlhttpRequest } = window; if (typeof GM_xmlhttpRequest !== 'function') { - log.error('COFetch网络错误:用户脚本扩展API错误'); + Log.error('COFetch网络错误:用户脚本扩展API错误'); reject('错误:用户脚本扩展API错误'); } GM_xmlhttpRequest({ @@ -70,4 +70,83 @@ export default class Utils extends WuhuBase{ } }); } + + /** + * 返回玩家信息的对象 { playername: string, userID: number } + * @return {PlayerInfo} rs + */ + static getPlayerInfo(): PlayerInfo { + const node = document.querySelector('script[uid]'); + if (node) return { + playername: node.getAttribute('name'), + userID: node.getAttribute('uid') as unknown as number, + } + } + + // 用户设备类型 对应PC MOBILE TABLET + static getDeviceType(): Device { + return window.innerWidth >= 1000 + ? Device.PC : window.innerWidth <= 600 ? Device.MOBILE : Device.TABLET; + } + + // 得到一个两数之间的随机整数 + static getRandomInt(min: number, max: number): number { + min = Math.ceil(min); + max = Math.floor(max); + //不含最大值,含最小值 + return Math.floor(Math.random() * (max - min)) + min; + } + + /** + * 等待毫秒数 + * @param {Number} ms 毫秒 + * @returns {Promise} + */ + static sleep(ms) { + let time = Math.max(ms, 10); + return new Promise(resolve => setTimeout(() => resolve(null), time)); + } + + static getSessionData(): Promise { + let field: string = 'sidebarData' + this.getPlayerInfo().userID; + let ret: ISidebarData = {}; + return new Promise(async resolve => { + let c = 0; + while (!sessionStorage.getItem(field) && c < 50) { + c++; + await this.sleep(10); + } + ret = JSON.parse(sessionStorage.getItem(field)); + ret.headerData = JSON.parse(sessionStorage.getItem('headerData')); + resolve(ret); + }); + } + + static async getSidebarData() { + return (await this.getSessionData()).areas; + } + + static async getUserState() { + return (await this.getSessionData()).headerData.user.state; + } + + static getWhSettingObj(): IWHSettings { + return JSON.parse(localStorage.getItem('wh_trans_settings')) || {} + } + + static getYaoCD(): string { + if (document.querySelector("#icon49-sidebar")) { // 0-10min + return '<10分' + } else if (document.querySelector("#icon50-sidebar")) { // 10min-1h + return '<1时' + } else if (document.querySelector("#icon51-sidebar")) { // 1h-2h + return '1~2时' + } else if (document.querySelector("#icon52-sidebar")) { // 2h-5h + return '2~5时' + } else if (document.querySelector("#icon53-sidebar")) { // 5h+ + return '>5时' + } else { + return '无效' + } + } } \ No newline at end of file diff --git a/src/class/provider/Provider.ts b/src/class/provider/Provider.ts new file mode 100644 index 0000000..e69de29 diff --git a/src/common.ts b/src/common.ts index 5cd40dd..842c4b5 100644 --- a/src/common.ts +++ b/src/common.ts @@ -6,75 +6,77 @@ import attackHelper from "./func/module/attackHelper"; import priceWatcherHandle from "./func/module/priceWatcherHandle"; import WuhuBase from "./class/WuhuBase"; -export default function () { - let glob = WuhuBase.glob; - // 价格监控 - priceWatcherHandle(glob.isPDA, glob.PDA_APIKey); +export class Common extends WuhuBase { + static resolve() { + let glob = WuhuBase.glob; + // 价格监控 + priceWatcherHandle(glob.isPDA, glob.PDA_APIKey); - // 啤酒提醒 - if (getWhSettingObj()['_15Alarm']) glob.beer.start(); + // 啤酒提醒 + if (getWhSettingObj()['_15Alarm']) glob.beer.start(); - // 点击4条转跳对应的页面 - if (getWhSettingObj()['barsRedirect']) { - const eb = document.getElementById('barEnergy') as HTMLAnchorElement; - const nb = document.getElementById('barNerve') as HTMLAnchorElement; - const hb = document.getElementById('barHappy') as HTMLAnchorElement; - const lb = document.getElementById('barLife') as HTMLAnchorElement; - if (eb) { - eb.addEventListener('click', () => location.href = '/gym.php'); - eb.href = '/gym.php'; - } else { - elementReady('#barEnergy').then(eb => { + // 点击4条转跳对应的页面 + if (getWhSettingObj()['barsRedirect']) { + const eb = document.getElementById('barEnergy') as HTMLAnchorElement; + const nb = document.getElementById('barNerve') as HTMLAnchorElement; + const hb = document.getElementById('barHappy') as HTMLAnchorElement; + const lb = document.getElementById('barLife') as HTMLAnchorElement; + if (eb) { eb.addEventListener('click', () => location.href = '/gym.php'); - (eb as HTMLAnchorElement).href = '/gym.php'; - }); - } - if (nb) { - nb.addEventListener('click', () => location.href = '/crimes.php'); - nb.href = '/crimes.php'; - } else { - elementReady('#barNerve').then(nb => { + eb.href = '/gym.php'; + } else { + elementReady('#barEnergy').then(eb => { + eb.addEventListener('click', () => location.href = '/gym.php'); + (eb as HTMLAnchorElement).href = '/gym.php'; + }); + } + if (nb) { nb.addEventListener('click', () => location.href = '/crimes.php'); - (nb as HTMLAnchorElement).href = '/crimes.php'; - }); - } - if (hb) { - hb.addEventListener('click', () => location.href = '/item.php#boosters-items'); - hb.href = '/item.php#boosters-items'; - } else { - elementReady('#barHappy').then(hb => { + nb.href = '/crimes.php'; + } else { + elementReady('#barNerve').then(nb => { + nb.addEventListener('click', () => location.href = '/crimes.php'); + (nb as HTMLAnchorElement).href = '/crimes.php'; + }); + } + if (hb) { hb.addEventListener('click', () => location.href = '/item.php#boosters-items'); - (hb as HTMLAnchorElement).href = '/item.php#boosters-items'; - }); - } - if (lb) { - lb.addEventListener('click', () => location.href = '/item.php#medical-items'); - lb.href = '/item.php#medical-items'; - } else { - elementReady('#barLife').then(lb => { + hb.href = '/item.php#boosters-items'; + } else { + elementReady('#barHappy').then(hb => { + hb.addEventListener('click', () => location.href = '/item.php#boosters-items'); + (hb as HTMLAnchorElement).href = '/item.php#boosters-items'; + }); + } + if (lb) { lb.addEventListener('click', () => location.href = '/item.php#medical-items'); - (lb as HTMLAnchorElement).href = '/item.php#medical-items'; - }); + lb.href = '/item.php#medical-items'; + } else { + elementReady('#barLife').then(lb => { + lb.addEventListener('click', () => location.href = '/item.php#medical-items'); + (lb as HTMLAnchorElement).href = '/item.php#medical-items'; + }); + } } + + /** + * 清除多余的脚本 + * TODO 无效、弃用 + */ + if (getWhSettingObj()['removeScripts']) { + document.querySelectorAll('script[src*="google"]').forEach(item => item.remove()); + document.querySelectorAll('#gtm_tag').forEach(item => item.remove()); + document.querySelectorAll('script[src*="chat/gonline"]').forEach(item => item.remove()); + document.querySelectorAll('head script[nonce]').forEach(item => item.remove()); + } + + // 存钱相关 + depoHelper(); + + // 飞行相关 + travelHelper().then(); + + // 战斗相关 + attackHelper().then(); } - - /** - * 清除多余的脚本 - * TODO 无效、弃用 - */ - if (getWhSettingObj()['removeScripts']) { - document.querySelectorAll('script[src*="google"]').forEach(item => item.remove()); - document.querySelectorAll('#gtm_tag').forEach(item => item.remove()); - document.querySelectorAll('script[src*="chat/gonline"]').forEach(item => item.remove()); - document.querySelectorAll('head script[nonce]').forEach(item => item.remove()); - } - - // 存钱相关 - depoHelper(); - - // 飞行相关 - travelHelper().then(); - - // 战斗相关 - attackHelper().then(); } \ No newline at end of file diff --git a/src/func/module/safeKeeper.ts b/src/func/module/safeKeeper.ts index 9528c69..05aa8fa 100644 --- a/src/func/module/safeKeeper.ts +++ b/src/func/module/safeKeeper.ts @@ -1,7 +1,7 @@ -import getPlayerInfo from "../utils/getPlayerInfo"; import popupMsg from "../utils/popupMsg"; import WHNotify from "../utils/WHNotify"; import log from "../utils/log"; +import Utils from "../../class/Utils"; // 守望者 export default function safeKeeper() { @@ -116,5 +116,5 @@ export default function safeKeeper() { loop_id = null; p.innerHTML = '状态:已关 ❎'; }); - self_target.addEventListener('click', () => uid.value = (getPlayerInfo()['userID']) + ''); + self_target.addEventListener('click', () => uid.value = (Utils.getPlayerInfo()['userID']) + ''); } \ No newline at end of file diff --git a/src/func/utils/BuyBeer.ts b/src/func/utils/BuyBeer.ts index f8045f8..541297b 100644 --- a/src/func/utils/BuyBeer.ts +++ b/src/func/utils/BuyBeer.ts @@ -4,7 +4,7 @@ import WHNotify from "./WHNotify"; import getRandomInt from "./getRandomInt"; import setWhSetting from "./setWhSetting"; import audioPlay from "./audioPlay"; -import getUserState from "./getUserState"; +import Utils from "../../class/Utils"; // 啤酒 export default function BuyBeer() { @@ -19,9 +19,9 @@ export default function BuyBeer() { log.info('啤酒助手已在运行'); return; } - started = setInterval(() => { + started = setInterval(async () => { // 海外取消提醒 - let { isTravelling, isAbroad } = getUserState(); + let { isTravelling, isAbroad } = await Utils.getUserState(); if (isTravelling || isAbroad) { loop.stop(); return; diff --git a/src/func/utils/getDeviceType.ts b/src/func/utils/getDeviceType.ts index 07d0525..841e050 100644 --- a/src/func/utils/getDeviceType.ts +++ b/src/func/utils/getDeviceType.ts @@ -1,6 +1,8 @@ import Device from "../../enum/Device"; -// 用户设备类型 对应PC MOBILE TABLET +/** + * @deprecated + */ export default function getDeviceType() { return window.innerWidth >= 1000 ? Device.PC : window.innerWidth <= 600 ? Device.MOBILE : Device.TABLET; diff --git a/src/func/utils/getPlayerInfo.ts b/src/func/utils/getPlayerInfo.ts index 3864a3e..b5126dd 100644 --- a/src/func/utils/getPlayerInfo.ts +++ b/src/func/utils/getPlayerInfo.ts @@ -1,5 +1,6 @@ /** * 返回玩家信息的对象 user + * @deprecated * @return {PlayerInfo} rs */ export default function getPlayerInfo(): PlayerInfo { diff --git a/src/func/utils/getRandomInt.ts b/src/func/utils/getRandomInt.ts index 71a0895..bdca809 100644 --- a/src/func/utils/getRandomInt.ts +++ b/src/func/utils/getRandomInt.ts @@ -1,4 +1,8 @@ -// 得到一个两数之间的随机整数 +/** + * @deprecated + * @param min + * @param max + */ export default function getRandomInt(min: number, max: number): number { min = Math.ceil(min); max = Math.floor(max); diff --git a/src/func/utils/getScriptEngine.ts b/src/func/utils/getScriptEngine.ts index aca8983..51c4f78 100644 --- a/src/func/utils/getScriptEngine.ts +++ b/src/func/utils/getScriptEngine.ts @@ -1,7 +1,9 @@ import UserScriptEngine from "../../enum/UserScriptEngine"; import WuhuBase from "../../class/WuhuBase"; -// 用户脚本平台类型 +/** + * @deprecated + */ export default function getScriptEngine() { let glob = WuhuBase.glob; return glob.unsafeWindow ? UserScriptEngine.GM : glob.isPDA diff --git a/src/func/utils/getSidebarData.ts b/src/func/utils/getSidebarData.ts index a510d4c..0ea5b23 100644 --- a/src/func/utils/getSidebarData.ts +++ b/src/func/utils/getSidebarData.ts @@ -4,7 +4,7 @@ import log from "./log"; /** * 边栏信息 * @deprecated - * @returns {any} + * @returns {unknown} */ export default async function getSidebarData() { let ret = {}; diff --git a/src/func/utils/getUserState.ts b/src/func/utils/getUserState.ts index 568e492..2aa4b91 100644 --- a/src/func/utils/getUserState.ts +++ b/src/func/utils/getUserState.ts @@ -1,4 +1,6 @@ -// 玩家状态 +/** + * @deprecated + */ export default function getUserState(): {} | any { let obj = {}; let hdd = sessionStorage['headerData']; diff --git a/src/func/utils/getWhSettingObj.ts b/src/func/utils/getWhSettingObj.ts index 841b34e..b0278ce 100644 --- a/src/func/utils/getWhSettingObj.ts +++ b/src/func/utils/getWhSettingObj.ts @@ -1,8 +1,11 @@ +/** + * @deprecated + */ export default function getWhSettingObj(): WHSettings { return JSON.parse(localStorage.getItem('wh_trans_settings')) || {} } -export interface WHSettings { +interface WHSettings { // TODO 补全 [key: string]: any; } \ No newline at end of file diff --git a/src/func/utils/getYaoCD.ts b/src/func/utils/getYaoCD.ts index 0e79187..61d49ff 100644 --- a/src/func/utils/getYaoCD.ts +++ b/src/func/utils/getYaoCD.ts @@ -1,4 +1,6 @@ -// 药cd +/** + * @deprecated + */ export default function getYaoCD(): string { if (document.querySelector("#icon49-sidebar")) { // 0-10min return '<10分' diff --git a/src/func/utils/sleep.ts b/src/func/utils/sleep.ts deleted file mode 100644 index 1d3e6ca..0000000 --- a/src/func/utils/sleep.ts +++ /dev/null @@ -1,8 +0,0 @@ -/** - * 等待毫秒数 - * @param {Number} ms 毫秒 - * @returns {Promise} - */ -export default function sleep(ms) { - return new Promise(resolve => setTimeout(() => resolve(null), ms)); -} \ No newline at end of file diff --git a/src/interface/ISidebarData.ts b/src/interface/ISidebarData.ts new file mode 100644 index 0000000..1744459 --- /dev/null +++ b/src/interface/ISidebarData.ts @@ -0,0 +1,108 @@ +export default interface ISidebarData { + // TODO 补全 + statusIcons?: unknown; + user?: { + userID: number, + name: string, + link: string, + money: { + value: number, + }, + donator: boolean, + level: { + value: number, + upgradePossibility: boolean, + link: string, + } + }; + bars?: { + energy: Bar, + nerve: Bar, + happy: Bar, + life: Bar, + chain: Bar, + }; + areas?: { + [area: string]: Area + } + headerData?: HeaderData; + + [key: string]: unknown; +} + +interface Area { + "name": string, + "shortName": string, + "link": string, + "icon": string, + "styleStatus": string, + "linkOrder": number, + "highlightStatus": unknown, + "status": unknown, + "favorite": boolean, + "added": unknown, + "amount": unknown +} + +interface Bar { + "name": string, + "timeToUpdate": number, + "amount": number, + "max": number, + "step": number, + "coolDown"?: number, + "endCoolDownTimestamp"?: number, + "timestampToUpdate": number, + "bonuses"?: number, + "link"?: string +} + +interface HeaderData { + "user": { + "state": { + "status": "ok"|string, + "isLoggedIn": boolean, + "isDonator": boolean, + "isTravelling": boolean, + "isAbroad": boolean + }, + "data": { + "hospitalStamp": number, + "jailStamp": number, + "logoutHash": string, + "userID": number, + "avatar": { + "isDefault": false, + "link": string + } + } + }, + "serverState": { + "serverName": string, + "currentTime": number + }, + "settings": { + "emptyHeader": boolean, + "emptyLinks": boolean, + "hideActivityLog": boolean, + "hideAdvancedSearch": boolean, + "hideSettingsDropdown": boolean, + "hasAccessToDarkMode": boolean + }, + "logo": { + "name": string, + "title": string, + "country": string, + "darkModeLogo": string, + "additionalData": unknown[] + }, + "links": Link[], + "headlines": unknown +} + +interface Link { + "name": string, + "link": string, + "icon": string, + "inNewTab": boolean +} \ No newline at end of file diff --git a/src/interface/IWHSettings.ts b/src/interface/IWHSettings.ts new file mode 100644 index 0000000..cba973e --- /dev/null +++ b/src/interface/IWHSettings.ts @@ -0,0 +1,4 @@ +export default interface IWHSettings { + // TODO 补全 + [key: string]: any; +} \ No newline at end of file diff --git a/src/main.ts b/src/main.ts index a34e5a9..49a70c6 100644 --- a/src/main.ts +++ b/src/main.ts @@ -1,10 +1,10 @@ import getWhSettingObj from "./func/utils/getWhSettingObj"; import translateMain from "./func/translate/translateMain"; -import common from "./common"; -import urlMatch from "./urlMatch"; +import { Common } from "./common"; import WuHuTornHelper from "./class/WuhuTornHelper"; import ZhongIcon from "./class/ZhongIcon"; import WuhuBase from "./class/WuhuBase"; +import UrlPattern from "./urlMatch"; (function main() { let started = new Date().getTime(); @@ -20,9 +20,9 @@ import WuhuBase from "./class/WuhuBase"; if (getWhSettingObj()['transEnable']) translateMain(glob.href); - common(); + Common.resolve(); - urlMatch().then(); + UrlPattern.resolve(); let runTime = new Date().getTime() - started; ZhongIcon.ZhongNode.initTimer.innerHTML = `助手加载时间 ${ runTime }ms`; diff --git a/src/urlMatch.ts b/src/urlMatch.ts index 10d41f2..0700f1c 100644 --- a/src/urlMatch.ts +++ b/src/urlMatch.ts @@ -3,92 +3,90 @@ import cityFinder from "./func/module/cityFinder"; import WHNotify from "./func/utils/WHNotify"; import elementReady from "./func/utils/elementReady"; import setWhSetting from "./func/utils/setWhSetting"; -import log from "./func/utils/log"; import { missionDict } from "./dictionary/translation"; import getTaskHint from "./func/translate/getTaskHint"; -import getPlayerInfo from "./func/utils/getPlayerInfo"; import Device from "./enum/Device"; import getSidebarData from "./func/utils/getSidebarData"; import getDeviceType from "./func/utils/getDeviceType"; import addStyle from "./func/utils/addStyle"; -import WuHuTornHelper from "./class/WuhuTornHelper"; import WuhuBase from "./class/WuhuBase"; +import Utils from "./class/Utils"; +import Log from "./class/Log"; -class UrlPattern extends WuhuBase { +export default class UrlPattern extends WuhuBase { constructor() { super(); } -} -export default async function urlMatch() { - let { href, beer } = WuhuBase.glob; - // 捡垃圾助手 - if (href.includes('city.php') && getWhSettingObj()['cityFinder']) { - cityFinder(); - } - - // pt一键购买 - if (getWhSettingObj()['ptQuickBuy'] && href.includes('pmarket.php')) { - WHNotify('一键购买已开启'); - // ns脚本 - const rmv_cfm = (e) => { - let el = e.firstElementChild; - el.className += ' yes'; - let old_href = el.getAttribute('href'); - let new_href = old_href.replace(/=buy/, '=buy1').replace(/&points=\d{1,9}$/, ''); - el.setAttribute('href', new_href); - }; - - let points_sales = document.querySelector('.users-point-sell'); - for (const index in points_sales.children) { - 'LI' === points_sales.children[index].tagName && rmv_cfm(points_sales.children[index]) + static resolve() { + let { href, beer } = WuhuBase.glob; + // 捡垃圾助手 + if (href.includes('city.php') && getWhSettingObj()['cityFinder']) { + cityFinder(); } - new MutationObserver(e => { - for (const t of e) { - // for (const e of t.addedNodes) { - // 'LI' === e.tagName && rmv_cfm(e) - // } - t.addedNodes.forEach(e => 'LI' === (e as HTMLElement).tagName && rmv_cfm(e)) + + // pt一键购买 + if (getWhSettingObj()['ptQuickBuy'] && href.includes('pmarket.php')) { + WHNotify('一键购买已开启'); + // ns脚本 + const rmv_cfm = (e) => { + let el = e.firstElementChild; + el.className += ' yes'; + let old_href = el.getAttribute('href'); + let new_href = old_href.replace(/=buy/, '=buy1').replace(/&points=\d{1,9}$/, ''); + el.setAttribute('href', new_href); + }; + + let points_sales = document.querySelector('.users-point-sell'); + for (const index in points_sales.children) { + 'LI' === points_sales.children[index].tagName && rmv_cfm(points_sales.children[index]) } - }).observe(points_sales, { childList: true }); - } - - // 叠e助手 - if (href.includes('gym.php')) { - let cont = null; - const switch_node = document.createElement('div'); - switch_node.innerHTML = ``; - switch_node.id = 'wh-gym-info-cont'; - switch_node.querySelector('input').onchange = e => { - let target = e.target as HTMLInputElement; - cont.classList.toggle('wh-display-none'); - setWhSetting('SEProtect', target.checked); - }; - elementReady('#gymroot').then(node => { - cont = node; - if (getWhSettingObj()['SEProtect']) node.classList.add('wh-display-none'); - node.before(switch_node); - }); - } - - // 啤酒店 - if (href.includes('shops.php?step=bitsnbobs')) { - // 加入啤酒 - elementReady('ul.items-list').then(node => { - const add_btn_node = document.createElement('div'); - add_btn_node.id = 'wh-gym-info-cont'; - add_btn_node.innerHTML = `

如果当前商店没有啤酒这个商品可以提前显示以省去刷新步骤,增加抢酒成功率。

`; - add_btn_node.querySelector('button').addEventListener('click', e => { - const msg_node = add_btn_node.querySelector('#wh-msg'); - if (node.querySelector('span[id="180-name"]')) { - msg_node.innerHTML = '❌ 页面已经有啤酒了'; - return; + new MutationObserver(e => { + for (const t of e) { + // for (const e of t.addedNodes) { + // 'LI' === e.tagName && rmv_cfm(e) + // } + t.addedNodes.forEach(e => 'LI' === (e as HTMLElement).tagName && rmv_cfm(e)) } - const clear_node = node.querySelector('li.clear'); - const beer = document.createElement('li'); - beer.classList.add('torn-divider', 'divider-vertical'); - beer.style.backgroundColor = '#c8c8c8'; - beer.innerHTML = `
+ }).observe(points_sales, { childList: true }); + } + + // 叠e助手 + if (href.includes('gym.php')) { + let cont = null; + const switch_node = document.createElement('div'); + switch_node.innerHTML = ``; + switch_node.id = 'wh-gym-info-cont'; + switch_node.querySelector('input').onchange = e => { + let target = e.target as HTMLInputElement; + cont.classList.toggle('wh-display-none'); + setWhSetting('SEProtect', target.checked); + }; + elementReady('#gymroot').then(node => { + cont = node; + if (getWhSettingObj()['SEProtect']) node.classList.add('wh-display-none'); + node.before(switch_node); + }); + } + + // 啤酒店 + if (href.includes('shops.php?step=bitsnbobs')) { + // 加入啤酒 + elementReady('ul.items-list').then(node => { + const add_btn_node = document.createElement('div'); + add_btn_node.id = 'wh-gym-info-cont'; + add_btn_node.innerHTML = `

如果当前商店没有啤酒这个商品可以提前显示以省去刷新步骤,增加抢酒成功率。

`; + add_btn_node.querySelector('button').addEventListener('click', e => { + const msg_node = add_btn_node.querySelector('#wh-msg'); + if (node.querySelector('span[id="180-name"]')) { + msg_node.innerHTML = '❌ 页面已经有啤酒了'; + return; + } + const clear_node = node.querySelector('li.clear'); + const beer = document.createElement('li'); + beer.classList.add('torn-divider', 'divider-vertical'); + beer.style.backgroundColor = '#c8c8c8'; + beer.innerHTML = `
@@ -155,55 +153,55 @@ $1,000
`; - if (clear_node) clear_node.before(beer); - else node.append(beer); - (e.target).remove(); - msg_node.innerHTML = '添加成功'; + if (clear_node) clear_node.before(beer); + else node.append(beer); + (e.target).remove(); + msg_node.innerHTML = '添加成功'; + }); + document.querySelector('.content-wrapper').prepend(add_btn_node); }); - document.querySelector('.content-wrapper').prepend(add_btn_node); - }); - // 监听啤酒购买 - $(document).ajaxComplete((_, xhr, settings) => { - log.info({ xhr, settings }); - let { data } = settings, { responseText } = xhr; - let response = JSON.parse(responseText); - if (data.includes('step=buyShopItem') && data.includes('ID=180') && response['success']) { - WHNotify('已检测成功购买啤酒') - beer.skip_today(); - } - }); - } - - // 快速crime TODO 重构、与翻译解藕 - if (href.contains(/crimes\.php/) && getWhSettingObj()['quickCrime']) { - if (self !== top) { - const isValidate = document.querySelector('h4#skip-to-content').innerText.toLowerCase().includes('validate'); - elementReady('#header-root').then(e => e.style.display = 'none'); - elementReady('#sidebarroot').then(e => e.style.display = 'none'); - elementReady('#chatRoot').then(e => e.style.display = 'none'); - if (!isValidate) document.body.style.overflow = 'hidden'; - elementReady('.content-wrapper').then(e => { - e.style.margin = '0px'; - e.style.position = 'absolute'; - e.style.top = '-35px'; + // 监听啤酒购买 + $(document).ajaxComplete((_, xhr, settings) => { + Log.info({ xhr, settings }); + let { data } = settings, { responseText } = xhr; + let response = JSON.parse(responseText); + if (data.includes('step=buyShopItem') && data.includes('ID=180') && response['success']) { + WHNotify('已检测成功购买啤酒') + beer.skip_today(); + } }); - elementReady('#go-to-top-btn button').then(e => e.style.display = 'none'); } - const $$ = document.querySelector('.content-wrapper'); - const OB = new MutationObserver(() => { - OB.disconnect(); - // titleTrans(); - // contentTitleLinksTrans(); - trans(); - OB.observe($$, { - characterData: true, - attributes: true, - subtree: true, - childList: true + + // 快速crime TODO 重构、与翻译解藕 + if (href.contains(/crimes\.php/) && getWhSettingObj()['quickCrime']) { + if (self !== top) { + const isValidate = document.querySelector('h4#skip-to-content').innerText.toLowerCase().includes('validate'); + elementReady('#header-root').then(e => e.style.display = 'none'); + elementReady('#sidebarroot').then(e => e.style.display = 'none'); + elementReady('#chatRoot').then(e => e.style.display = 'none'); + if (!isValidate) document.body.style.overflow = 'hidden'; + elementReady('.content-wrapper').then(e => { + e.style.margin = '0px'; + e.style.position = 'absolute'; + e.style.top = '-35px'; + }); + elementReady('#go-to-top-btn button').then(e => e.style.display = 'none'); + } + const $$ = document.querySelector('.content-wrapper'); + const OB = new MutationObserver(() => { + OB.disconnect(); + // titleTrans(); + // contentTitleLinksTrans(); + trans(); + OB.observe($$, { + characterData: true, + attributes: true, + subtree: true, + childList: true + }); }); - }); - const trans = () => { - const dom = `
常用犯罪
+ const trans = () => { + const dom = `
常用犯罪
@@ -247,31 +245,62 @@ $1,000

`; - const is_wh_translate = $$.querySelector('.wh-translate') !== null; - const is_captcha = $$.querySelector('div#tab-menu.captcha') !== null; - const $title = $('div.content-title'); - const $info = $('.info-msg-cont'); - if (!is_wh_translate && !is_captcha) { - if ($title.length > 0) $title.before(dom); - else if ($info.length > 0) $info.before(dom); - } - }; - trans(); - OB.observe($$, { - characterData: true, - attributes: true, - subtree: true, - childList: true - }); - } + const is_wh_translate = $$.querySelector('.wh-translate') !== null; + const is_captcha = $$.querySelector('div#tab-menu.captcha') !== null; + const $title = $('div.content-title'); + const $info = $('.info-msg-cont'); + if (!is_wh_translate && !is_captcha) { + if ($title.length > 0) $title.before(dom); + else if ($info.length > 0) $info.before(dom); + } + }; + trans(); + OB.observe($$, { + characterData: true, + attributes: true, + subtree: true, + childList: true + }); + } - // 任务助手 TODO 重构、与翻译解藕 - if (href.contains(/loader\.php\?sid=missions/) && getWhSettingObj()['missionHint']) { - const $$ = $('.content-wrapper'); - const OB = new MutationObserver(() => { - OB.disconnect(); - // titleTrans(); - // contentTitleLinksTrans(); + // 任务助手 TODO 重构、与翻译解藕 + if (href.contains(/loader\.php\?sid=missions/) && getWhSettingObj()['missionHint']) { + const $$ = $('.content-wrapper'); + const OB = new MutationObserver(() => { + OB.disconnect(); + // titleTrans(); + // contentTitleLinksTrans(); + trans(); + OB.observe($$.get(0), { + characterData: true, + attributes: true, + subtree: true, + childList: true + }); + }); + const taskList = {}; + const trans = () => { + $('ul#giver-tabs a.ui-tabs-anchor').each((i, e) => { + if ($(e).children().hasClass('mission-complete-icon')) { + taskList[i] = e.innerText.trim(); + } else { + taskList[i] = $(e).clone().children().remove().end().text().trim(); + } + }); + // 助手注入 + $('div.max-height-fix.info').each((i, e) => { + if ($(e).find('.wh-translated').length !== 0) return; + $(e).append(`
任务助手

${ getTaskHint(taskList[i]) }

`); + }); + // 任务目标 + $('ul.tasks-list span.title-wrap').contents().each((i, e) => { + if (e.nodeType === 3) { + if (missionDict[e.nodeValue.trim()]) { + e.nodeValue = missionDict[e.nodeValue.trim()]; + } + } + }); + }; trans(); OB.observe($$.get(0), { characterData: true, @@ -279,45 +308,14 @@ $1,000 subtree: true, childList: true }); - }); - const taskList = {}; - const trans = () => { - $('ul#giver-tabs a.ui-tabs-anchor').each((i, e) => { - if ($(e).children().hasClass('mission-complete-icon')) { - taskList[i] = e.innerText.trim(); - } else { - taskList[i] = $(e).clone().children().remove().end().text().trim(); - } - }); - // 助手注入 - $('div.max-height-fix.info').each((i, e) => { - if ($(e).find('.wh-translated').length !== 0) return; - $(e).append(`
任务助手

${ getTaskHint(taskList[i]) }

`); - }); - // 任务目标 - $('ul.tasks-list span.title-wrap').contents().each((i, e) => { - if (e.nodeType === 3) { - if (missionDict[e.nodeValue.trim()]) { - e.nodeValue = missionDict[e.nodeValue.trim()]; - } - } - }); - }; - trans(); - OB.observe($$.get(0), { - characterData: true, - attributes: true, - subtree: true, - childList: true - }); - } - // 圣诞小镇 - if (href.contains(/christmas_town\.php/)) { - let $root = document.querySelector('#christmastownroot'); - const { xmasTownWT, xmasTownNotify } = getWhSettingObj() - // 解密攻略 - if (xmasTownWT) { - const insert_html = `
+ } + // 圣诞小镇 + if (href.contains(/christmas_town\.php/)) { + let $root = document.querySelector('#christmastownroot'); + const { xmasTownWT, xmasTownNotify } = getWhSettingObj() + // 解密攻略 + if (xmasTownWT) { + const insert_html = `
水晶球解密地图攻略