This commit is contained in:
Liwanyi 2023-09-13 16:54:58 +08:00
parent c48165cd78
commit 27dfc7aedb
19 changed files with 324 additions and 52 deletions

View File

@ -5,6 +5,19 @@
# CHANGE
## 1.1.1
2023年09月13日
### 修改
- 调整了上次动作的显示逻辑
- 更准确的现金变动提醒
### 添加
- 监控模块-毒CD提醒
## 1.1.0
2023年09月11日

View File

@ -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

View File

@ -283,6 +283,6 @@ div#wh-popup::after {
user-select: none;
}
.el-overlay {
backdrop-filter: blur(20px);
}
/*.el-overlay {*/
/* backdrop-filter: blur(20px);*/
/*}*/

View File

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

View File

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

View File

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

View File

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

View File

@ -105,6 +105,9 @@ class DefaultConfigType {
// 自定义css
@Notified()
CustomCss = '';
monitorOn = ['drugCDMonitor']
drugCDMonitorInterval = 60000
}
export type Config = DefaultConfigType;

View File

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

View 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

View File

@ -0,0 +1,5 @@
enum IntervalSwitch {
ON = 9, OFF = 10
}
export default IntervalSwitch

View 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)
}
}
}

View 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) + ' 未启用')
}
}
}

View File

@ -7,4 +7,4 @@ export default interface IWHNotify {
sysNotifyClick?: Function;
// 强制后台也通知
force?: boolean;
}
}

View File

@ -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
View 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>

View File

@ -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>-->
<!--&lt;!&ndash; <el-menu-item index="3-4" @click="_setting"> 助手设置</el-menu-item>&ndash;&gt;-->
<!-- </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);
}
};

View 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>