From e623d6fd14ef71331aa1aea8d4ed76ca5ca9a1c7 Mon Sep 17 00:00:00 2001 From: Liwanyi Date: Tue, 4 Apr 2023 12:02:14 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/ts/class/LocalConfigWrapper.ts | 15 ++- src/ts/class/UrlRouter.ts | 4 +- src/ts/class/WuhuConfig.ts | 146 ----------------------- src/ts/class/action/BuyBeerHelper.ts | 10 +- src/ts/class/action/ProfileHelper.ts | 3 +- src/ts/class/action/StackHelper.ts | 3 +- src/ts/class/config/defaultConfig.ts | 122 +++++-------------- src/ts/class/handler/CustomCssHandler.ts | 3 +- src/ts/class/utils/CommonUtils.ts | 5 +- src/ts/class/utils/MsgWrapper.ts | 12 ++ src/ts/func/module/landedRedirect.ts | 3 +- 11 files changed, 66 insertions(+), 260 deletions(-) delete mode 100644 src/ts/class/WuhuConfig.ts create mode 100644 src/ts/class/utils/MsgWrapper.ts diff --git a/src/ts/class/LocalConfigWrapper.ts b/src/ts/class/LocalConfigWrapper.ts index c3bc787..1d060bd 100644 --- a/src/ts/class/LocalConfigWrapper.ts +++ b/src/ts/class/LocalConfigWrapper.ts @@ -1,7 +1,8 @@ import { Injectable } from "../container/Injectable"; import ClassName from "../container/ClassName"; import Logger from "./Logger"; -import defaultConfig, { Config } from "./config/defaultConfig"; +import defaultConfig, { Config, isNotified } from "./config/defaultConfig"; +import MsgWrapper from "./utils/MsgWrapper"; @Injectable() @ClassName('LocalConfigWrapper') @@ -9,19 +10,25 @@ export default class LocalConfigWrapper { constructor( private readonly logger: Logger, + private readonly msgWrapper: MsgWrapper, ) { } public get config(): Config { - let setLocal = this.setLocal; + const _this = this; return new Proxy(this.Local, { get(target: Config, prop: string) { - return target[prop] || defaultConfig[prop]; + return target[prop] ?? defaultConfig[prop]; }, set(target: Config, prop: string, value: any): boolean { let config = target; + let preVal = config[prop]; config[prop] = value; - setLocal(config); + _this.setLocal(config); + let msg = `[${ prop }]值变更 ${ preVal }->${ value }`; + _this.logger.info(msg); + if (isNotified(prop)) + _this.msgWrapper.create(msg); return true; } }) diff --git a/src/ts/class/UrlRouter.ts b/src/ts/class/UrlRouter.ts index e3c8276..72b4a20 100644 --- a/src/ts/class/UrlRouter.ts +++ b/src/ts/class/UrlRouter.ts @@ -3,7 +3,6 @@ import { missionDict } from "../dictionary/translation"; import getTaskHint from "../func/translate/getTaskHint"; import CommonUtils from "./utils/CommonUtils"; import Log from "./Log"; -import WuhuConfig from "./WuhuConfig"; import SHOP_BEER_STATIC_ITEM_HTML from "../../static/html/buyBeer/shop_beer_static_item.html"; import ADD_BEER_HEAD_HTML from "../../static/html/buyBeer/add_beer_head.html"; import QUICK_CRIMES_HTML from "../../static/html/quick_crimes.html"; @@ -53,7 +52,8 @@ export default class UrlRouter { _base.append(reloadSwitch.getBase()).insert2Dom(); reloadSwitch.getInput().addEventListener('change', () => { if (reloadSwitch.getInput().checked) window.location.replace(window.location.href); - WuhuConfig.set('SolveGoogleScriptPendingIssue', reloadSwitch.getInput().checked, true); + this.localConfigWrapper.config.SolveGoogleScriptPendingIssue = reloadSwitch.getInput().checked; + // WuhuConfig.set('SolveGoogleScriptPendingIssue', reloadSwitch.getInput().checked, true); }); _base.append(document.createElement('br')); diff --git a/src/ts/class/WuhuConfig.ts b/src/ts/class/WuhuConfig.ts deleted file mode 100644 index 44a9968..0000000 --- a/src/ts/class/WuhuConfig.ts +++ /dev/null @@ -1,146 +0,0 @@ -import WuhuBase from "./WuhuBase"; -import Alert from "./utils/Alert"; -import Log from "./Log"; - -/** - * @deprecated - */ -export default class WuhuConfig extends WuhuBase { - - /** - * 获取键或多个键对应的值,返回值或列表 - * @param key - */ - // public static get(key: string | string[]) { - // let localPool = this.getLocal(); - // if (typeof key === 'string') { - // return localPool[key]; - // } else { - // let ret: string[] = []; - // key.forEach(k => { - // ret.push(localPool[k]) - // }); - // return ret; - // } - // } - - - public static set(key: string, val: any, isNotify = false, callback: Function = () => null) { - let config = WuhuConfig.getLocal(); - let prev = config[key]; - config[key] = val; - localStorage.setItem('wh_trans_settings', JSON.stringify(config)); - - if (isNotify) new Alert('已保存设置') - new Promise(() => callback()).then(); - Log.info(`值变更:[${ key }] ${ JSON.stringify({ from: prev, to: val }) }`); - return val; - } - - /** - * 检查类型不符合时设置为默认值 - */ - // public static setDefaults(): void { - // let count = 0; - // [ - // // 开启翻译 - // { key: 'transEnable', val: false }, - // { key: 'transNew', val: true }, - // // 快速犯罪 - // { key: 'quickCrime', val: true }, - // // 任务助手 - // { key: 'missionHint', val: true }, - // // 小镇攻略 - // { key: 'xmasTownWT', val: true }, - // // 小镇提醒 - // { key: 'xmasTownNotify', val: true }, - // // 起飞爆e - // { key: 'energyAlert', val: true }, - // // 飞行闹钟 - // { key: 'trvAlarm', val: true }, - // // 啤酒提醒 - // { key: '_15Alarm', val: true }, - // // 捡垃圾助手 - // { key: 'cityFinder', val: false }, - // // 叠E保护 - // { key: 'SEProtect', val: false }, - // // PT一键购买 - // { key: 'ptQuickBuy', val: false }, - // // 光速拔刀 6-关闭 - // { key: 'quickAttIndex', val: 2 }, - // // 光速跑路 0-leave 1-mug 2-hos 3-关闭 - // { key: 'quickFinishAtt', val: 3 }, - // // 自动开打和结束 - // { key: 'autoStartFinish', val: false }, - // /** - // * @deprecated 废弃 - // */ - // { key: 'attRelocate', val: true }, - // // 攻击自刷新 0-无间隔 1-5s 6-关闭 - // { key: 'attReload', val: 6 }, - // // 价格监视 - // { key: 'priceWatcher', val: { xan: -1, pt: -1 } }, - // // 开发者模式 - // { key: 'isDev', val: false }, - // // 啤酒提醒时间 - // { key: '_15AlarmTime', val: 50 }, - // // 4条转跳 - // { key: 'barsRedirect', val: true }, - // // 浮动存钱框 - // { key: 'floatDepo', val: true }, - // // 公司转跳存钱 - // { key: 'companyRedirect', val: true }, - // // 收起公司冰蛙效率表 - // { key: 'companyBWCollapse', val: true }, - // /** - // * @deprecated - // */ - // { key: 'removeScripts', val: true }, - // // 海外警告 - // { key: 'abroadWarning', val: true }, - // // 落地转跳 - // { key: 'landedRedirect', val: '' }, - // // 任何位置一键存钱 - // { key: 'companyDepositAnywhere', val: false }, - // // 火车提醒时间 - // { key: 'CHTrainsDetect', val: 0 }, - // // 火车提醒开关 - // { key: 'CHTrainsDetectSwitch', val: true }, - // // 隐藏个人资料头像 - // { key: 'HideProfileImg', val: false }, - // // 显示曾用名 - // { key: 'ShowNameHistory', val: true }, - // // 盯梢模式强度 0-550 1-950 2-1450 ms - // { key: 'WatchTargetFreq', val: 1 }, - // // 隐藏侧边栏 - // { key: 'HideSidebar', val: false }, - // // 添加隐藏边栏按钮 - // { key: 'HideSidebarBtn', val: true }, - // // 搜索页占位区 - // { key: 'SearchPagePlaceholder', val: true }, - // // 解决一直转圈(加载中)的问题 - // { key: 'SolveGoogleScriptPendingIssue', val: false }, - // // 图标坐标 - // { key: 'IconPosition', val: {} }, - // // 记住图标位置 - // { key: 'SaveIconPosition', val: false }, - // // 现金变动提醒 - // { key: 'CashChangeAlert', val: false }, - // // 收集数据以改进翻译质量 - // { key: 'CollectPlayerData', val: true }, - // // 迷你资料卡显示上次行动时间 - // { key: 'ShowMiniProfLastAct', val: true }, - // - // /** - // * @deprecated - // */ - // { key: 'dangerZone', val: false }, - // ].forEach(df => { - // if (typeof WuhuConfig.get(df.key) !== typeof df.val) { - // WuhuConfig.set(df.key, df.val); - // count++; - // } - // }); - // Log.info('设置默认值,新:' + count); - // } -} diff --git a/src/ts/class/action/BuyBeerHelper.ts b/src/ts/class/action/BuyBeerHelper.ts index 5591233..15970ff 100644 --- a/src/ts/class/action/BuyBeerHelper.ts +++ b/src/ts/class/action/BuyBeerHelper.ts @@ -1,4 +1,3 @@ -import WuhuConfig from "../WuhuConfig"; import Log from "../Log"; import InfoUtils from "../utils/InfoUtils"; import Alert from "../utils/Alert"; @@ -107,11 +106,16 @@ export default class BuyBeerHelper implements BeerMonitorLoop, ResponseInject { public skip_today(): void { const date = new Date(); - WuhuConfig.set('_15_alarm_ignore', [date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate()], false); + this.localConfigWrapper.config._15_alarm_ignore = [date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate()]; + // WuhuConfig.set('_15_alarm_ignore', [date.getUTCFullYear(), date.getUTCMonth(), date.getUTCDate()], false); // 通知 const notify = new Alert(`明早8点前将不再提醒 `); // 通知中的取消按钮 - notify.getElement().querySelector('.wh-notify-msg button').addEventListener('click', () => WuhuConfig.set('_15_alarm_ignore', undefined, true)); + notify.getElement().querySelector('.wh-notify-msg button') + .addEventListener( + 'click', + () => this.localConfigWrapper.config._15_alarm_ignore.length = 0 + ); } public setTimeHandler(): void { diff --git a/src/ts/class/action/ProfileHelper.ts b/src/ts/class/action/ProfileHelper.ts index 7deaf08..4eab045 100644 --- a/src/ts/class/action/ProfileHelper.ts +++ b/src/ts/class/action/ProfileHelper.ts @@ -1,4 +1,3 @@ -import WuhuConfig from "../WuhuConfig"; import CommonUtils from "../utils/CommonUtils"; import TornStyleBlock from "../utils/TornStyleBlock"; import TornStyleSwitch from "../utils/TornStyleSwitch"; @@ -41,7 +40,7 @@ export default class ProfileHelper implements ResponseInject { this.block.append(hideImgSwitch.getBase()); hideImgSwitch.getInput().addEventListener('change', () => { document.body.classList.toggle('wh-hide_profile_img'); - WuhuConfig.set('HideProfileImg', hideImgSwitch.getInput().checked, true); + this.localConfigWrapper.config.HideProfileImg = hideImgSwitch.getInput().checked; }); if (this.localConfigWrapper.config.ShowNameHistory) { globVars.responseHandlers.push((url, body) => this.responseHandler(url, body)); diff --git a/src/ts/class/action/StackHelper.ts b/src/ts/class/action/StackHelper.ts index 36344dd..188dbe1 100644 --- a/src/ts/class/action/StackHelper.ts +++ b/src/ts/class/action/StackHelper.ts @@ -1,5 +1,4 @@ import TornStyleBlock from "../utils/TornStyleBlock"; -import WuhuConfig from "../WuhuConfig"; import TornStyleSwitch from "../utils/TornStyleSwitch"; import { Injectable } from "../../container/Injectable"; import ClassName from "../../container/ClassName"; @@ -21,7 +20,7 @@ export default class StackHelper { input.onchange = e => { let target = e.target as HTMLInputElement; document.body.classList.toggle('wh-gym-stack'); - WuhuConfig.set('SEProtect', target.checked, true); + this.localConfigWrapper.config.SEProtect = target.checked; }; } diff --git a/src/ts/class/config/defaultConfig.ts b/src/ts/class/config/defaultConfig.ts index f1e7ebe..5ca6d67 100644 --- a/src/ts/class/config/defaultConfig.ts +++ b/src/ts/class/config/defaultConfig.ts @@ -1,98 +1,10 @@ -const defaultConfig = { - // 开启翻译 - transEnable: false, - transNew: true, - // 快速犯罪 - quickCrime: true, - // 任务助手 - missionHint: true, - // 小镇攻略 - xmasTownWT: true, - // 小镇提醒 - xmasTownNotify: true, - // 起飞爆e - energyAlert: true, - // 飞行闹钟 - trvAlarm: true, - // 啤酒提醒 - _15Alarm: true, - // 啤酒提醒时间 - _15AlarmTime: 50, - // 啤酒提醒忽略当天 - _15_alarm_ignore: '', - // 捡垃圾助手 - cityFinder: false, - // 叠E保护 - SEProtect: false, - // PT一键购买 - ptQuickBuy: false, - // 光速拔刀 6-关闭 - quickAttIndex: 2, - // 光速跑路 0-leave 1-mug 2-hos 3-关闭 - quickFinishAtt: 3, - // 自动开打和结束 - autoStartFinish: false, - // 攻击自刷新 0-无间隔 1-5s 6-关闭 - attReload: 6, - // 价格监视 - priceWatcher: { xan: -1, pt: -1 }, - // 开发者模式 - isDev: false, - // 4条转跳 - barsRedirect: true, - // 浮动存钱框 - floatDepo: true, - // 公司转跳存钱 - companyRedirect: true, - // 收起公司冰蛙效率表 - companyBWCollapse: true, - // 海外警告 - abroadWarning: true, - // 落地转跳 - landedRedirect: '', - // 任何位置一键存钱 - companyDepositAnywhere: false, - // 火车提醒时间 - CHTrainsDetect: 0, - // 火车提醒开关 - CHTrainsDetectSwitch: true, - // 隐藏个人资料头像 - HideProfileImg: false, - // 显示曾用名 - ShowNameHistory: true, - // 盯梢模式强度 0-550 1-950 2-1450 ms - WatchTargetFreq: 1, - // 隐藏侧边栏 - HideSidebar: false, - // 添加隐藏边栏按钮 - HideSidebarBtn: true, - // 搜索页占位区 - SearchPagePlaceholder: true, - // 解决一直转圈(加载中)的问题 - SolveGoogleScriptPendingIssue: false, - // 图标坐标 - IconPosition: {} as { x: number, y: number }, - // 记住图标位置 - SaveIconPosition: false, - // 现金变动提醒 - CashChangeAlert: false, - // 收集数据以改进翻译质量 - CollectPlayerData: true, - // 迷你资料卡显示上次行动时间 - ShowMiniProfLastAct: true, - // 自定义css - CustomCss: '', - - /** @deprecated */ - attRelocate: false, -}; -// } as const; - -// export default defaultConfig; +const notifyKey = Symbol('ConfigNotifyKey'); class DefaultConfigType { // 开启翻译 transEnable = false; + + @Notified() transNew = true; // 快速犯罪 quickCrime = true; @@ -108,12 +20,16 @@ class DefaultConfigType { trvAlarm = true; // 啤酒提醒 _15Alarm = true; - _15_alarm_ignore = false; + + @Notified() + _15_alarm_ignore: number[] = []; // 啤酒提醒时间 _15AlarmTime = 50; // 捡垃圾助手 cityFinder = false; + // 叠E保护 + @Notified() SEProtect = false; // PT一键购买 ptQuickBuy = false; @@ -141,7 +57,9 @@ class DefaultConfigType { companyBWCollapse = true; // 海外警告 abroadWarning = true; + // 落地转跳 + @Notified() landedRedirect = ''; // 任何位置一键存钱 companyDepositAnywhere = false; @@ -149,7 +67,9 @@ class DefaultConfigType { CHTrainsDetect = 0; // 火车提醒开关 CHTrainsDetectSwitch = true; + // 隐藏个人资料头像 + @Notified() HideProfileImg = false; // 显示曾用名 ShowNameHistory = true; @@ -161,7 +81,9 @@ class DefaultConfigType { HideSidebarBtn = true; // 搜索页占位区 SearchPagePlaceholder = true; + // 解决一直转圈(加载中)的问题 + @Notified() SolveGoogleScriptPendingIssue = false; // 图标坐标 IconPosition: Partial<{ x: number, y: number }> = {}; @@ -173,10 +95,22 @@ class DefaultConfigType { CollectPlayerData = true; // 迷你资料卡显示上次行动时间 ShowMiniProfLastAct = true; + // 自定义css + @Notified() CustomCss = ''; } - export type Config = DefaultConfigType; -export default new DefaultConfigType() as Readonly; + +let config = new DefaultConfigType(); + +export default config as Readonly; + +function Notified(f: boolean = true) { + return Reflect.metadata(notifyKey, f); +} + +export function isNotified(propertyKey: string): boolean { + return Reflect.getMetadata(notifyKey, config, propertyKey); +} diff --git a/src/ts/class/handler/CustomCssHandler.ts b/src/ts/class/handler/CustomCssHandler.ts index 1c0c784..2f8e777 100644 --- a/src/ts/class/handler/CustomCssHandler.ts +++ b/src/ts/class/handler/CustomCssHandler.ts @@ -1,5 +1,4 @@ import Popup from "../utils/Popup"; -import WuhuConfig from "../WuhuConfig"; import ClassName from "../../container/ClassName"; import { Injectable } from "../../container/Injectable"; import LocalConfigWrapper from "../LocalConfigWrapper"; @@ -19,7 +18,7 @@ export default class CustomCssHandler { let button = pop.element.querySelector('button'); textarea.value = this.localConfigWrapper.config.CustomCss || ''; button.addEventListener('click', () => { - WuhuConfig.set('CustomCss', textarea.value || '', true); + this.localConfigWrapper.config.CustomCss = textarea.value || ''; }); } } diff --git a/src/ts/class/utils/CommonUtils.ts b/src/ts/class/utils/CommonUtils.ts index 65315f3..3fe5b3e 100644 --- a/src/ts/class/utils/CommonUtils.ts +++ b/src/ts/class/utils/CommonUtils.ts @@ -5,7 +5,6 @@ import LOADING_IMG_HTML from "../../../static/html/loading_img.html"; import Timer from "./Timer"; import FetchUtils from "./FetchUtils"; import TornStyleSwitch from "./TornStyleSwitch"; -import WuhuConfig from "../WuhuConfig"; import { MenuItemConfig } from "../ZhongIcon"; import TRAVEL_STATE from "../../enum/TravelState"; import InventoryItemInfo from "../../interface/responseType/InventoryItemInfo"; @@ -304,7 +303,7 @@ export default class CommonUtils { (tip) && (switcher.getBase().setAttribute('title', tip)); _input.checked = this.localConfigWrapper.config[dictName]; _input.onchange = e => { - WuhuConfig.set(dictName, _input.checked, true); + this.localConfigWrapper.config[dictName] = _input.checked; if (changeEv) changeEv(e); }; new_node.appendChild(switcher.getBase()); @@ -339,7 +338,7 @@ export default class CommonUtils { option.innerHTML = domText; select.appendChild(option); }); - select.onchange = e => WuhuConfig.set(dictName, (e.target).selectedIndex); + select.onchange = e => this.localConfigWrapper.config[dictName] = (e.target).selectedIndex; label.appendChild(text); label.appendChild(select); new_node.appendChild(label); diff --git a/src/ts/class/utils/MsgWrapper.ts b/src/ts/class/utils/MsgWrapper.ts new file mode 100644 index 0000000..3afa165 --- /dev/null +++ b/src/ts/class/utils/MsgWrapper.ts @@ -0,0 +1,12 @@ +import ClassName from "../../container/ClassName"; +import { Injectable } from "../../container/Injectable"; +import Alert from "./Alert"; +import IWHNotify from "../../interface/IWHNotify"; + +@ClassName('MsgWrapper') +@Injectable() +export default class MsgWrapper { + create(msg: string, options: IWHNotify = {},): Alert { + return new Alert(msg, options); + } +} diff --git a/src/ts/func/module/landedRedirect.ts b/src/ts/func/module/landedRedirect.ts index 6dbbd3f..2e46b58 100644 --- a/src/ts/func/module/landedRedirect.ts +++ b/src/ts/func/module/landedRedirect.ts @@ -1,4 +1,3 @@ -import WuhuConfig from "../../class/WuhuConfig"; import Popup from "../../class/utils/Popup"; import LocalConfigWrapper from "../../class/LocalConfigWrapper"; import { Container } from "../../container/Container"; @@ -28,7 +27,7 @@ export default function landedRedirect() { buttonFct.innerHTML = '填入帮派金库金库'; buttonTest.innerHTML = '测试链接'; - buttonSave.addEventListener('click', () => WuhuConfig.set('landedRedirect', input.value, true)); + buttonSave.addEventListener('click', () => localConfigWrapper.config.landedRedirect = input.value); buttonCmp.addEventListener('click', () => input.value = 'https://www.torn.com/companies.php#/option=funds'); buttonFct.addEventListener('click', () => input.value = 'https://www.torn.com/factions.php?step=your#/tab=armoury'); buttonTest.addEventListener('click', () => window.open(input.value));