更新
This commit is contained in:
parent
c48165cd78
commit
27dfc7aedb
13
CHANGELOG.md
13
CHANGELOG.md
@ -5,6 +5,19 @@
|
||||
|
||||
# CHANGE
|
||||
|
||||
## 1.1.1
|
||||
|
||||
2023年09月13日
|
||||
|
||||
### 修改
|
||||
|
||||
- 调整了上次动作的显示逻辑
|
||||
- 更准确的现金变动提醒
|
||||
|
||||
### 添加
|
||||
|
||||
- 监控模块-毒CD提醒
|
||||
|
||||
## 1.1.0
|
||||
|
||||
2023年09月11日
|
||||
|
||||
@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "wuhu-torn-helper",
|
||||
"version": "1.1.0",
|
||||
"version": "1.1.2",
|
||||
"description": "芜湖助手",
|
||||
"scripts": {
|
||||
"release": "cross-env NODE_ENV=production rollup -c && node build.mjs",
|
||||
|
||||
File diff suppressed because one or more lines are too long
@ -283,6 +283,6 @@ div#wh-popup::after {
|
||||
user-select: none;
|
||||
}
|
||||
|
||||
.el-overlay {
|
||||
backdrop-filter: blur(20px);
|
||||
}
|
||||
/*.el-overlay {*/
|
||||
/* backdrop-filter: blur(20px);*/
|
||||
/*}*/
|
||||
|
||||
@ -19,6 +19,8 @@ import TornPDAUtils from "./utils/TornPDAUtils";
|
||||
import TravelItem from "./action/TravelItem";
|
||||
import IconHelper from "./IconHelper";
|
||||
import MsgWrapper from "./utils/MsgWrapper";
|
||||
import toThousands from "../func/utils/toThousands";
|
||||
import { WHIntervalLoader } from "./interval/IntervalUnit";
|
||||
|
||||
/**
|
||||
* 脚本不区分页面的通用功能入口
|
||||
@ -34,7 +36,6 @@ export class Common {
|
||||
private readonly tornPDAUtils: TornPDAUtils,
|
||||
private readonly logger: Logger,
|
||||
private readonly buyBeerHelper: BuyBeerHelper,
|
||||
// private readonly icon: ZhongIcon,
|
||||
private readonly fetchUtils: FetchUtils,
|
||||
private readonly moduleLoader: ModuleLoader,
|
||||
private readonly msgWrapper: MsgWrapper,
|
||||
@ -61,6 +62,7 @@ export class Common {
|
||||
|
||||
this.moduleLoader.push(SidebarHelper);
|
||||
this.moduleLoader.push(TravelItem);
|
||||
this.moduleLoader.push(WHIntervalLoader)
|
||||
|
||||
/**
|
||||
* 解决一直转圈(加载中)的问题
|
||||
@ -122,6 +124,7 @@ export class Common {
|
||||
|
||||
// 现金变动提醒
|
||||
if (this.localConfigWrapper.config.CashChangeAlert) CommonUtils.elementReady("#user-money").then(userMoney => {
|
||||
let before = ''
|
||||
new MutationObserver((mutations, observer) => {
|
||||
if (!this.localConfigWrapper.config.CashChangeAlert) {
|
||||
observer.disconnect();
|
||||
@ -131,11 +134,16 @@ export class Common {
|
||||
this.logger.info("现金变动提醒", mutations);
|
||||
mutations.forEach(item => {
|
||||
if (item.attributeName === 'data-money') {
|
||||
// this.icon.updateCashView(userMoney.innerText);
|
||||
this.msgWrapper.create(
|
||||
'现金变动 ' + item.oldValue + ' ➡️ ' + userMoney.innerText,
|
||||
{ sysNotify: true }
|
||||
);
|
||||
let change = userMoney.innerText
|
||||
.trim()
|
||||
.replaceAll(/[,$]/g, '')
|
||||
if (change !== before) {
|
||||
this.msgWrapper.create(
|
||||
'现金变动 ' + item.oldValue + ' --> ' + toThousands(change),
|
||||
{ sysNotify: true }
|
||||
);
|
||||
before = change
|
||||
}
|
||||
}
|
||||
});
|
||||
}).observe(userMoney, { attributes: true, attributeOldValue: true })
|
||||
|
||||
@ -30,7 +30,7 @@ export default class Logger {
|
||||
return Log.getTime()
|
||||
}
|
||||
|
||||
static factory<T extends {}>(classT: T): Logger {
|
||||
static factory(classT: new(...args) => any): Logger {
|
||||
let className = GetClassName(classT);
|
||||
return new class extends Logger {
|
||||
info(...o: any): void {
|
||||
|
||||
@ -28,7 +28,7 @@ export default class ModuleLoader {
|
||||
this.classes.length = 0;
|
||||
}
|
||||
|
||||
public push<T>(clas: T): void {
|
||||
this.classes.push(clas);
|
||||
public push(clazz: new(...arg: any) => { init: () => void }): void {
|
||||
this.classes.push(clazz);
|
||||
}
|
||||
}
|
||||
|
||||
@ -14,6 +14,8 @@ import LocalConfigWrapper from "../LocalConfigWrapper";
|
||||
export default class FetchEventCallback extends Provider implements ResponseInject {
|
||||
className = "FetchEventCallback";
|
||||
|
||||
newNode = document.createElement('div')
|
||||
|
||||
constructor(
|
||||
private readonly localConfigWrapper: LocalConfigWrapper,
|
||||
private readonly commonUtils: CommonUtils,
|
||||
@ -32,11 +34,10 @@ export default class FetchEventCallback extends Provider implements ResponseInje
|
||||
window.setTimeout(async () => {
|
||||
let cont = CommonUtils.querySelector('[class*=profile-mini-_userProfileWrapper___]');
|
||||
let resp: MiniProfile = response.json as MiniProfile;
|
||||
let newNode = document.createElement('div');
|
||||
let formatted = this.commonUtils.secondsFormat(resp.user.lastAction.seconds);
|
||||
|
||||
newNode.innerText = '上次动作: ' + formatted;
|
||||
(await cont).append(newNode);
|
||||
(await cont).append(this.newNode);
|
||||
this.newNode.innerText = '上次动作: ' + formatted;
|
||||
}, 0);
|
||||
}
|
||||
}
|
||||
|
||||
@ -105,6 +105,9 @@ class DefaultConfigType {
|
||||
// 自定义css
|
||||
@Notified()
|
||||
CustomCss = '';
|
||||
|
||||
monitorOn = ['drugCDMonitor']
|
||||
drugCDMonitorInterval = 60000
|
||||
}
|
||||
|
||||
export type Config = DefaultConfigType;
|
||||
|
||||
@ -8,6 +8,9 @@ import { Injectable } from "../../container/Injectable";
|
||||
import { Container } from "../../container/Container";
|
||||
import Logger from "../Logger";
|
||||
|
||||
/**
|
||||
* @deprecated
|
||||
*/
|
||||
@ClassName('ChangeLogHandler')
|
||||
@Injectable()
|
||||
export class ChangeLogHandler extends Provider {
|
||||
|
||||
47
src/ts/class/interval/DrugCDMonitor.ts
Normal file
47
src/ts/class/interval/DrugCDMonitor.ts
Normal file
@ -0,0 +1,47 @@
|
||||
import IntervalType from "./IntervalUnit";
|
||||
import ClassName from "../../container/ClassName";
|
||||
import IntervalSwitch from "./IntervalSwitch";
|
||||
import { SWITCHER } from "./SWITCHER";
|
||||
import getSidebarData from "../../func/utils/getSidebarData";
|
||||
import { Container } from "../../container/Container";
|
||||
import MsgWrapper from "../utils/MsgWrapper";
|
||||
import LocalConfigWrapper from "../LocalConfigWrapper";
|
||||
|
||||
@ClassName('DrugCDMonitor')
|
||||
class DrugCDMonitor implements IntervalType {
|
||||
private id: number = null
|
||||
private ms: number
|
||||
private readonly msgWrapper = Container.factory(MsgWrapper)
|
||||
|
||||
getId(): number {
|
||||
return this.id
|
||||
}
|
||||
|
||||
getMs(): number {
|
||||
return this.ms
|
||||
}
|
||||
|
||||
handler(): void {
|
||||
const data = getSidebarData()
|
||||
if (!data.statusIcons.icons.drug_cooldown) {
|
||||
this.msgWrapper.create('警告: 药CD停转', { sysNotify: true })
|
||||
}
|
||||
}
|
||||
|
||||
setMs(ms: number): void {
|
||||
this.ms = ms
|
||||
}
|
||||
|
||||
switcher(s: IntervalSwitch): void {
|
||||
SWITCHER(this, DrugCDMonitor, s)
|
||||
}
|
||||
|
||||
setId(id: number): void {
|
||||
this.id = id
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
const drugCDMonitor = new DrugCDMonitor()
|
||||
drugCDMonitor.setMs(Container.factory(LocalConfigWrapper).config.drugCDMonitorInterval)
|
||||
export default drugCDMonitor
|
||||
5
src/ts/class/interval/IntervalSwitch.ts
Normal file
5
src/ts/class/interval/IntervalSwitch.ts
Normal file
@ -0,0 +1,5 @@
|
||||
enum IntervalSwitch {
|
||||
ON = 9, OFF = 10
|
||||
}
|
||||
|
||||
export default IntervalSwitch
|
||||
34
src/ts/class/interval/IntervalUnit.ts
Normal file
34
src/ts/class/interval/IntervalUnit.ts
Normal file
@ -0,0 +1,34 @@
|
||||
import drugCDMonitor from "./DrugCDMonitor";
|
||||
import { Injectable } from "../../container/Injectable";
|
||||
import ClassName from "../../container/ClassName";
|
||||
import LocalConfigWrapper from "../LocalConfigWrapper";
|
||||
import IntervalSwitch from "./IntervalSwitch";
|
||||
|
||||
export default interface IntervalType {
|
||||
handler: () => void
|
||||
switcher: (s: IntervalSwitch) => void
|
||||
getId: () => number
|
||||
setId: (id: number) => void
|
||||
getMs: () => number
|
||||
setMs: (ms: number) => void
|
||||
}
|
||||
|
||||
export const intervalUnits: { [key: string]: IntervalType } = {
|
||||
drugCDMonitor,
|
||||
}
|
||||
|
||||
@Injectable()
|
||||
@ClassName('WHIntervalLoader')
|
||||
export class WHIntervalLoader {
|
||||
constructor(
|
||||
private readonly localConfigWrapper: LocalConfigWrapper,
|
||||
) {
|
||||
}
|
||||
|
||||
init() {
|
||||
const list = this.localConfigWrapper.config.monitorOn
|
||||
for (let i = 0; i < list.length; i++) {
|
||||
intervalUnits[list[i]].switcher(IntervalSwitch.ON)
|
||||
}
|
||||
}
|
||||
}
|
||||
24
src/ts/class/interval/SWITCHER.ts
Normal file
24
src/ts/class/interval/SWITCHER.ts
Normal file
@ -0,0 +1,24 @@
|
||||
import { GetClassName } from "../../container/ClassName";
|
||||
import IntervalType from "./IntervalUnit";
|
||||
import IntervalSwitch from "./IntervalSwitch";
|
||||
|
||||
export function SWITCHER(self: IntervalType, clazz: new () => IntervalType, s: IntervalSwitch) {
|
||||
if (self.getMs() === null) {
|
||||
throw new Error('循环时间为空')
|
||||
}
|
||||
switch (s) {
|
||||
case IntervalSwitch.ON:
|
||||
if (self.getId()) {
|
||||
throw new TypeError(GetClassName(clazz) + ' 正在启用')
|
||||
}
|
||||
self.setId(window.setInterval(() => self.handler(), self.getMs()))
|
||||
break
|
||||
case IntervalSwitch.OFF:
|
||||
if (self.getId()) {
|
||||
window.clearInterval(self.getId())
|
||||
self.setId(null)
|
||||
} else {
|
||||
throw new TypeError(GetClassName(clazz) + ' 未启用')
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -35,8 +35,8 @@ export interface Icons {
|
||||
education: Education
|
||||
bazaar: Bazaar
|
||||
stock_market: StockMarket
|
||||
booster_cooldown: BoosterCooldown
|
||||
drug_cooldown: DrugCooldown
|
||||
booster_cooldown?: BoosterCooldown
|
||||
drug_cooldown?: DrugCooldown
|
||||
}
|
||||
|
||||
export interface EnbyGender {
|
||||
|
||||
54
src/vue/ChangeLogView.vue
Normal file
54
src/vue/ChangeLogView.vue
Normal file
@ -0,0 +1,54 @@
|
||||
<template>
|
||||
<el-card shadow="never">
|
||||
<el-row>
|
||||
<el-col span="24">
|
||||
<el-button @click="refresh">刷新</el-button>
|
||||
</el-col>
|
||||
</el-row>
|
||||
<el-row>
|
||||
<el-col span="24">
|
||||
<el-link href="https://gitlab.com/JJins/wuhu-torn-helper/-/raw/dev/CHANGELOG.md" target="_blank">
|
||||
https://gitlab.com/JJins/wuhu-torn-helper/-/raw/dev/CHANGELOG.md
|
||||
</el-link>
|
||||
</el-col>
|
||||
</el-row>
|
||||
<el-row>
|
||||
<el-col span="24">
|
||||
<div v-loading="!respond" class="wh-change-log-view-render" v-html="html"></div>
|
||||
</el-col>
|
||||
</el-row>
|
||||
</el-card>
|
||||
</template>
|
||||
|
||||
<script lang="ts" setup>
|
||||
import { onMounted, ref } from "vue";
|
||||
import CommonUtils from "../ts/class/utils/CommonUtils";
|
||||
import { Container } from "../ts/container/Container";
|
||||
import MDUtils from "../ts/class/utils/MDUtils";
|
||||
|
||||
const mdUtils = Container.factory(MDUtils)
|
||||
|
||||
const respond = ref('')
|
||||
const html = ref('')
|
||||
|
||||
const refresh = async () => {
|
||||
respond.value = ''
|
||||
html.value = ''
|
||||
try {
|
||||
respond.value = await CommonUtils.COFetch('https://gitlab.com/JJins/wuhu-torn-helper/-/raw/dev/CHANGELOG.md?' + performance.now())
|
||||
html.value = mdUtils.parse(respond.value).innerHTML
|
||||
} catch (e) {
|
||||
html.value = '错误: ' + e.message
|
||||
}
|
||||
}
|
||||
|
||||
onMounted(() => {
|
||||
refresh()
|
||||
})
|
||||
</script>
|
||||
|
||||
<style>
|
||||
.wh-change-log-view-render h2, .wh-change-log-view-render h3, .wh-change-log-view-render h4 {
|
||||
margin-top: 20px;
|
||||
}
|
||||
</style>
|
||||
@ -64,16 +64,16 @@
|
||||
<el-menu-item @click="quickGymTrain.doTrain(BATTLE_STAT.DEX)">闪避 DEX
|
||||
</el-menu-item>
|
||||
</el-sub-menu>
|
||||
<el-sub-menu index="3">
|
||||
<template #title>
|
||||
<el-icon>🪓</el-icon>
|
||||
<span>老功能</span>
|
||||
</template>
|
||||
<el-menu-item index="3-1" @click="_adHelper">📜️ 传单助手</el-menu-item>
|
||||
<el-menu-item index="3-2" @click="_safeKeeper">🛡️ 守望者</el-menu-item>
|
||||
<el-menu-item index="3-3" @click="MUZHUANG">🌲 寻找木桩</el-menu-item>
|
||||
<el-menu-item index="3-4" @click="_setting">⚙️ 助手设置</el-menu-item>
|
||||
</el-sub-menu>
|
||||
<!-- <el-sub-menu index="3">-->
|
||||
<!-- <template #title>-->
|
||||
<!-- <el-icon>🪓</el-icon>-->
|
||||
<!-- <span>老功能</span>-->
|
||||
<!-- </template>-->
|
||||
<!-- <el-menu-item index="3-1" @click="_adHelper">📜️ 传单助手</el-menu-item>-->
|
||||
<!-- <el-menu-item index="3-2" @click="_safeKeeper">🛡️ 守望者</el-menu-item>-->
|
||||
<!-- <el-menu-item index="3-3" @click="MUZHUANG">🌲 寻找木桩</el-menu-item>-->
|
||||
<!--<!– <el-menu-item index="3-4" @click="_setting">⚙️ 助手设置</el-menu-item>–>-->
|
||||
<!-- </el-sub-menu>-->
|
||||
<!-- <el-menu-item v-for="(item, i) in menuItemList" :index="(4 + i).toString()" @click="menuClick(item)">-->
|
||||
<!-- <el-icon>{{ item.title.slice(0, 2) }}</el-icon>-->
|
||||
<!-- <span>{{ item.title.slice(2, item.title.length) }}</span>-->
|
||||
@ -140,11 +140,9 @@ import { ElMessage, ElMessageBox } from "element-plus";
|
||||
import { Component, inject, onMounted, ref, shallowRef, triggerRef } from 'vue';
|
||||
import { LoggerKey } from "../ts/class/Logger";
|
||||
import { QuickGymTrainKey } from "../ts/class/action/QuickGymTrain";
|
||||
import { ChangeLogHandler } from "../ts/class/handler/ChangeLogHandler";
|
||||
import { QuickFlyBtnHandlerKey } from "../ts/class/handler/QuickFlyBtnHandler";
|
||||
import SettingsHandler from "../ts/class/handler/SettingsHandler";
|
||||
import { BATTLE_STAT } from "../ts/class/utils/NetHighLvlWrapper";
|
||||
import { Container } from "../ts/container/Container";
|
||||
import adHelper from "../ts/func/module/adHelper";
|
||||
import safeKeeper from "../ts/func/module/safeKeeper";
|
||||
import useItem from "../ts/func/utils/useItem";
|
||||
@ -161,6 +159,8 @@ import QuickCrime from "./QuickCrime.vue";
|
||||
import UpdateDate from "./UpdateScript.vue";
|
||||
import VirusProgramming from "./VirusProgramming.vue";
|
||||
import getSidebarData from "../ts/func/utils/getSidebarData";
|
||||
import MonitorMgrView from "./MonitorMgrView.vue";
|
||||
import ChangeLogView from "./ChangeLogView.vue";
|
||||
|
||||
const logger = inject(LoggerKey);
|
||||
const quickGymTrain = inject(QuickGymTrainKey);
|
||||
@ -258,10 +258,36 @@ const menuItemList: MenuItem[] = [
|
||||
template: AutoLoginForm,
|
||||
},
|
||||
{
|
||||
title: '🚀 更新历史',
|
||||
title: '🖥 监控',
|
||||
template: MonitorMgrView,
|
||||
},
|
||||
{
|
||||
title: '📜️ 传单助手',
|
||||
handler: () => {
|
||||
expanded.value = false
|
||||
Container.factory(ChangeLogHandler).show()
|
||||
adHelper()
|
||||
},
|
||||
},
|
||||
{
|
||||
title: '🛡️ 守望者',
|
||||
handler: () => {
|
||||
expanded.value = false
|
||||
safeKeeper()
|
||||
},
|
||||
},
|
||||
{
|
||||
title: '🌲 寻找木桩',
|
||||
handler: () => window.location.replace('https://www.torn.com/item.php?temp=4#xunzhaomuzhuang'),
|
||||
},
|
||||
{
|
||||
title: '🚀 更新历史',
|
||||
template: ChangeLogView
|
||||
},
|
||||
{
|
||||
title: '⚙️ 助手设置',
|
||||
handler: () => {
|
||||
expanded.value = false
|
||||
SettingsHandler.clickFunc()
|
||||
},
|
||||
},
|
||||
];
|
||||
@ -290,27 +316,11 @@ const travelData = [
|
||||
{ cName: "🇿🇦 南非", index: 10 },
|
||||
];
|
||||
|
||||
const MUZHUANG = () => window.location.replace('https://www.torn.com/item.php?temp=4#xunzhaomuzhuang');
|
||||
const _adHelper = () => {
|
||||
expanded.value = false;
|
||||
adHelper();
|
||||
}
|
||||
const _safeKeeper = () => {
|
||||
expanded.value = false;
|
||||
safeKeeper();
|
||||
}
|
||||
const _setting = () => {
|
||||
expanded.value = false;
|
||||
SettingsHandler.clickFunc();
|
||||
}
|
||||
|
||||
const menuClick = (menuItem: MenuItem) => {
|
||||
if (menuItem.handler) {
|
||||
menuItem.handler();
|
||||
} else if (menuItem.template) {
|
||||
drawer.value = true;
|
||||
// drawerTitle.value = menuItem.title;
|
||||
// drawerContent.value = menuItem.template;
|
||||
addTab(menuItem);
|
||||
}
|
||||
};
|
||||
|
||||
70
src/vue/MonitorMgrView.vue
Normal file
70
src/vue/MonitorMgrView.vue
Normal file
@ -0,0 +1,70 @@
|
||||
<template>
|
||||
<el-card shadow="never">
|
||||
<template #header>
|
||||
<span>毒 CD 空转</span>
|
||||
</template>
|
||||
<el-row>
|
||||
<el-col span="1"></el-col>
|
||||
<el-col span="23">
|
||||
<el-form class="form" label-position="left" label-width="30%">
|
||||
<el-form-item label="开启">
|
||||
<el-switch v-model="_drugCDMonitor"/>
|
||||
<span class="desc">开启后每个页面都会存在一个活跃的监视器,但是后台页面需要刷新后才会开启</span>
|
||||
</el-form-item>
|
||||
<el-form-item label="检查间隔(毫秒)">
|
||||
<el-input v-model="drugCDMonitorLoop" :disabled="_drugCDMonitor" type="number"/>
|
||||
<span class="desc">每个监视器在间隔时间后会检查一次</span>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
</el-col>
|
||||
</el-row>
|
||||
</el-card>
|
||||
</template>
|
||||
|
||||
<script lang="ts" setup>
|
||||
import { onMounted, ref, watch } from "vue";
|
||||
import drugCDMonitor from "../ts/class/interval/DrugCDMonitor";
|
||||
import IntervalSwitch from "../ts/class/interval/IntervalSwitch";
|
||||
import { Container } from "../ts/container/Container";
|
||||
import LocalConfigWrapper from "../ts/class/LocalConfigWrapper";
|
||||
import Logger from "../ts/class/Logger";
|
||||
|
||||
const _drugCDMonitor = ref(false)
|
||||
const drugCDMonitorLoop = ref(999999)
|
||||
|
||||
const localConfigWrapper = Container.factory(LocalConfigWrapper)
|
||||
const logger = Container.factory(Logger)
|
||||
|
||||
onMounted(() => {
|
||||
_drugCDMonitor.value = !!drugCDMonitor.getId() && localConfigWrapper.config.monitorOn.includes('drugCDMonitor')
|
||||
drugCDMonitorLoop.value = localConfigWrapper.config.drugCDMonitorInterval
|
||||
|
||||
watch([_drugCDMonitor, drugCDMonitorLoop], ([_drugCDMonitor, drugCDMonitorLoop]) => {
|
||||
logger.info('新变动', _drugCDMonitor, drugCDMonitorLoop)
|
||||
const monitorOn = localConfigWrapper.config.monitorOn
|
||||
if (_drugCDMonitor) {
|
||||
drugCDMonitor.setMs(drugCDMonitorLoop)
|
||||
drugCDMonitor.switcher(IntervalSwitch.ON)
|
||||
monitorOn.push('drugCDMonitor')
|
||||
} else {
|
||||
drugCDMonitor.switcher(IntervalSwitch.OFF)
|
||||
for (let i = 0; i < monitorOn.length; i++) {
|
||||
if (monitorOn[i] === 'drugCDMonitor') {
|
||||
monitorOn.splice(i, 1)
|
||||
break
|
||||
}
|
||||
}
|
||||
}
|
||||
localConfigWrapper.config.monitorOn = monitorOn
|
||||
localConfigWrapper.config.drugCDMonitorInterval = Number(drugCDMonitorLoop)
|
||||
})
|
||||
})
|
||||
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
.form span.desc {
|
||||
width: 100%;
|
||||
color: #363636;
|
||||
}
|
||||
</style>
|
||||
Loading…
x
Reference in New Issue
Block a user