This commit is contained in:
Liwanyi 2023-06-13 08:53:12 +08:00
parent d788227ae4
commit d30e4f0d96
12 changed files with 206 additions and 114 deletions

View File

@ -5,6 +5,14 @@
# CHANGE
## 1.0.1
2023年06月14日
### 添加
- 公司存取钱
## 1.0.0
2023年06月12日

View File

@ -1,6 +1,6 @@
{
"name": "wuhu-torn-helper",
"version": "1.0.0",
"version": "1.0.1",
"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

@ -7,7 +7,6 @@ import SidebarHelper from "./action/SidebarHelper";
import CommonUtils from "./utils/CommonUtils";
import FetchUtils from "./utils/FetchUtils";
import ZhongIcon from "./ZhongIcon";
import Alert from "./utils/Alert";
import FetchEventCallback from "./action/FetchEventCallback";
import globVars from "../globVars";
import TranslateNew from "./action/TranslateNew";
@ -20,6 +19,7 @@ import ModuleLoader from "./ModuleLoader";
import TornPDAUtils from "./utils/TornPDAUtils";
import TravelItem from "./action/TravelItem";
import IconHelper from "./IconHelper";
import MsgWrapper from "./utils/MsgWrapper";
/**
*
@ -38,7 +38,7 @@ export class Common {
private readonly icon: ZhongIcon,
private readonly fetchUtils: FetchUtils,
private readonly moduleLoader: ModuleLoader,
// private readonly msgWrapper: MsgWrapper,
private readonly msgWrapper: MsgWrapper,
) {
}
@ -126,15 +126,15 @@ export class Common {
new MutationObserver((mutations, observer) => {
if (!this.localConfigWrapper.config.CashChangeAlert) {
observer.disconnect();
new Alert('现金变动提醒已关闭', { sysNotify: true });
this.msgWrapper.create('现金变动提醒已关闭', { sysNotify: true });
return;
}
this.logger.info("现金变动提醒", mutations);
mutations.forEach(item => {
if (item.attributeName === 'data-money') {
this.icon.updateCashView(userMoney.innerText);
new Alert(
'提醒: 现金变动 ' + item.oldValue + ' -> ' + userMoney.innerText,
this.msgWrapper.create(
'现金变动 ' + item.oldValue + ' ➡️ ' + userMoney.innerText,
{ sysNotify: true }
);
}

View File

@ -2,7 +2,6 @@ import adHelper from "../func/module/adHelper";
import safeKeeper from "../func/module/safeKeeper";
import initMiniProf from "../func/utils/initMiniProf";
import CommonUtils from "./utils/CommonUtils";
import Alert from "./utils/Alert";
import * as EVENTS from "../../static/json/event.json";
import * as FEST from "../../static/json/fest.json";
import Popup from "./utils/Popup";
@ -28,6 +27,7 @@ import { Container } from "../container/Container";
import TornPDAUtils from "./utils/TornPDAUtils";
import InfoUtils from "./utils/InfoUtils";
import globVars from "../globVars";
import MsgWrapper from "./utils/MsgWrapper";
@Injectable()
@ClassName('ZhongIcon')
@ -44,6 +44,7 @@ export default class ZhongIcon {
private readonly logger: Logger,
private readonly tornPDAUtils: TornPDAUtils,
private readonly infoUtils: InfoUtils,
private readonly msgWrapper: MsgWrapper,
) {
}
@ -133,7 +134,7 @@ export default class ZhongIcon {
textarea_node.remove();
target.innerHTML = '已复制';
target.onclick = null;
new Alert('脚本已复制,请前往粘贴');
this.msgWrapper.create('脚本已复制,请前往粘贴');
};
};
};

View File

@ -1,5 +1,4 @@
import InfoUtils from "../utils/InfoUtils";
import Alert from "../utils/Alert";
import MathUtils from "../utils/MathUtils";
import NOTIFY_HTML from "../../../static/html/buyBeer/notify.html";
import CommonUtils from "../utils/CommonUtils";
@ -9,6 +8,7 @@ import LocalConfigWrapper from "../LocalConfigWrapper";
import ClassName from "../../container/ClassName";
import { Injectable } from "../../container/Injectable";
import Logger from "../Logger";
import MsgWrapper from "../utils/MsgWrapper";
@ClassName('BuyBeerHelper')
@Injectable()
@ -25,6 +25,7 @@ export default class BuyBeerHelper implements BeerMonitorLoop, ResponseInject {
private readonly infoUtils: InfoUtils,
private readonly mathUtils: MathUtils,
private readonly logger: Logger,
private readonly msgWrapper: MsgWrapper,
) {
this.time = this.localConfigWrapper.config._15AlarmTime || 30;
}
@ -60,16 +61,18 @@ export default class BuyBeerHelper implements BeerMonitorLoop, ResponseInject {
if (this.isNotifying) return;
this.isNotifying = true;
// 发送通知
const notify = new Alert(this.notifyHtml, {
const rNum = this.mathUtils.getRandomInt(0, 99);
// const notify =
this.msgWrapper.create(NOTIFY_HTML.replace('{{}}', rNum.toString()), {
timeout: 30,
sysNotify: true,
});
notify.getElement().querySelector('.wh-notify-msg button').addEventListener('click', () => this.skip_today());
notify.getElement().addEventListener('click', ev => {
if ((ev.target as HTMLElement).tagName.toLowerCase() === 'a') {
notify.close();
}
});
document.querySelector('button#wh-rd-btn-' + rNum).addEventListener('click', () => this.skip_today());
// notify.getElement().addEventListener('click', ev => {
// if ((ev.target as HTMLElement).tagName.toLowerCase() === 'a') {
// notify.close();
// }
// });
// 声音提醒
{
let loop = 3;
@ -110,9 +113,10 @@ export default class BuyBeerHelper implements BeerMonitorLoop, ResponseInject {
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点前将不再提醒 <button id="wh-rd-btn-${ this.mathUtils.getRandomInt(0, 100) }">取消</button>`);
const rNumber = this.mathUtils.getRandomInt(0, 100);
const notify = this.msgWrapper.create(`明早8点前将不再提醒 <button id="wh-rd-btn-${ rNumber }">取消</button>`);
// 通知中的取消按钮
notify.getElement().querySelector('.wh-notify-msg button')
document.querySelector('#wh-rd-btn-' + rNumber)
.addEventListener(
'click',
() => this.localConfigWrapper.config._15_alarm_ignore.length = 0
@ -139,11 +143,14 @@ export default class BuyBeerHelper implements BeerMonitorLoop, ResponseInject {
popup.element.appendChild(confirm);
}
public responseHandler(url: string, body: { json: unknown; text: string; isModified: boolean }, opt: { method: "GET" | "POST"; requestBody: string }) {
public responseHandler(url: string, body: { json: unknown; text: string; isModified: boolean }, opt: {
method: "GET" | "POST";
requestBody: string
}) {
if (url.includes('shops.php') && opt?.method === 'POST') {
let req = opt.requestBody;
if (req && req.includes('step=buyShopItem') && req.includes('ID=180') && body.json && body.json['success']) {
new Alert('检测到已成功购买啤酒');
this.msgWrapper.create('检测到已成功购买啤酒');
this.skip_today();
}
}

View File

@ -1,12 +1,12 @@
import CommonUtils from "../utils/CommonUtils";
import FetchUtils from "../utils/FetchUtils";
import InfoUtils from "../utils/InfoUtils";
import Alert from "../utils/Alert";
import TRAVEL_STATE from "../../enum/TravelState";
import LocalConfigWrapper from "../LocalConfigWrapper";
import { Injectable } from "../../container/Injectable";
import ClassName from "../../container/ClassName";
import Logger from "../Logger";
import MsgWrapper from "../utils/MsgWrapper";
/**
*
@ -22,6 +22,7 @@ export default class CompanyHelper {
private readonly fetchUtils: FetchUtils,
private readonly logger: Logger,
private readonly infoUtils: InfoUtils,
private readonly msgWrapper: MsgWrapper,
) {
}
@ -76,7 +77,7 @@ export default class CompanyHelper {
this.logger.info('火车检测: 火车/星级: ' + trains + '/' + stars);
this.logger.info({ tmp });
if (trains + stars > 20) {
new Alert(`公司助手<br/><br/>火车检测:火车明日将溢出!${ trains }/20火车`, {
this.msgWrapper.create(`【公司助手】火车检测:火车明日将溢出!${ trains }/20火车`, {
timeout: 15,
force: true,
sysNotify: true

View File

@ -1,7 +1,6 @@
import titleTrans from "../translate/titleTrans";
import contentTitleLinksTrans from "../translate/contentTitleLinksTrans";
import Device from "../../enum/Device";
import Alert from "../../class/utils/Alert";
import ActionButtonUtils from "../../class/utils/ActionButtonUtils";
import CommonUtils from "../../class/utils/CommonUtils";
import TRAVEL_ALARM_CSS from "../../../static/css/travel_alarm.module.css";
@ -13,37 +12,7 @@ import Global from "../../class/Global";
import ClassName from "../../container/ClassName";
import { Injectable } from "../../container/Injectable";
import LocalConfigWrapper from "../../class/LocalConfigWrapper";
// async function travelHelper(): Promise<void> {
// let global = Container.factory(Global);
// let commonUtils = Container.factory(CommonUtils);
// }
// async function travelBack(): Promise<null> {
// if (typeof window['getAction'] !== 'function') return;
// let backHomeAction = function (): Promise<string> {
// return new Promise(resolve => {
// window.getAction({
// type: "post",
// action: 'travelagency.php',
// data: {
// step: 'backHomeAction'
// },
// success: function (msg) {
// resolve(msg);
// }
// });
// });
// };
// let res = await backHomeAction();
// new Alert(res);
// if (!res.includes('error')) {
// new Alert('成功,即将刷新');
// window.setTimeout(() => location.reload(), 3000);
// } else {
// new Alert('出错了');
// }
// }
import MsgWrapper from "../../class/utils/MsgWrapper";
/**
*
@ -61,6 +30,7 @@ export default class TravelHelper {
private readonly commonUtils: CommonUtils,
private readonly actionButtonUtils: ActionButtonUtils,
private readonly localConfigWrapper: LocalConfigWrapper,
private readonly msgWrapper: MsgWrapper,
) {
}
@ -133,10 +103,6 @@ export default class TravelHelper {
const set_node = wh_trv_alarm_node.querySelectorAll('#wh-trv-alarm-cont button')[0] as HTMLButtonElement;
// 落地前响铃时长
const cd_time = wh_trv_alarm_node.querySelector('input[type="number"]') as HTMLInputElement;
let count_down_notify: MyHTMLElement | { close: Function } = {
close: () => {
}
};
set_node.onclick = () => {
try {
wh_trv_alarm.alert_time = parseInt(cd_time.value);
@ -145,8 +111,7 @@ export default class TravelHelper {
}
save_trv_settings();
set_node.value = wh_trv_alarm.alert_time;
count_down_notify.close();
count_down_notify = new Alert('设置已更新');
this.msgWrapper.create('设置已更新');
};
// 停止响铃按钮
const stop_node = wh_trv_alarm_node.querySelectorAll('#wh-trv-alarm-cont button')[1] as HTMLButtonElement;
@ -157,15 +122,10 @@ export default class TravelHelper {
}
// 开启闹钟勾选
const enable_node = wh_trv_alarm_node.querySelector('#wh-trv-alarm-cont input[type="checkbox"]') as HTMLInputElement;
let on_off_notify: MyHTMLElement | { close: Function } = {
close: () => {
}
};
enable_node.onchange = ev => {
wh_trv_alarm.enable = (<HTMLInputElement>ev.target).checked;
save_trv_settings();
on_off_notify.close();
on_off_notify = new Alert(wh_trv_alarm.enable ? '闹钟已开启' : '闹钟已关闭');
this.msgWrapper.create(wh_trv_alarm.enable ? '闹钟已开启' : '闹钟已关闭');
};
// 剩余时间 秒
const remaining_sec = parseInt(remaining_arr);
@ -260,7 +220,7 @@ export default class TravelHelper {
// 海外警告
if (this.localConfigWrapper.config.abroadWarning) {
let c = 1;
setInterval(() => new Alert(`警告:您已海外落地${ c++ * 30 }`, {
setInterval(() => this.msgWrapper.create(`警告:您已海外落地${ c++ * 30 }`, {
timeout: 30,
sysNotify: true
}), 30000);
@ -365,12 +325,12 @@ export default class TravelHelper {
});
};
let res = await backHomeAction();
new Alert(res);
this.msgWrapper.create(res);
if (!res.includes('error')) {
new Alert('成功,即将刷新');
this.msgWrapper.create('成功,即将刷新');
window.setTimeout(() => location.reload(), 3000);
} else {
new Alert('出错了');
this.msgWrapper.create('出错了');
}
}
}

View File

@ -0,0 +1,24 @@
const init: RequestInit = {
"headers": {
"accept": "*/*",
"sec-ch-ua-mobile": "?0",
"sec-fetch-dest": "empty",
"sec-fetch-mode": "cors",
"sec-fetch-site": "same-origin",
"x-requested-with": "XMLHttpRequest"
},
"referrer": "https://www.torn.com/companies.php",
"referrerPolicy": "strict-origin-when-cross-origin",
"body": null,
"method": "GET",
"mode": "cors",
"credentials": "include"
};
export const fetchCurrentMoney = async (action?: string): Promise<number> => {
return Number(await (await fetch(window.addRFC("/inputMoneyAction.php?step=" + (action ? action : "generalAction")), init)).text());
};
export const fetchCurrentCompanyAvailableMoney = () => {
return fetchCurrentMoney("companyAction");
};

View File

@ -1,21 +0,0 @@
import { isRef, onMounted, onUnmounted, Ref } from 'vue'
// https://cn.vuejs.org/guide/reusability/composables.html#mouse-tracker-example
export function useEventListener(target: HTMLElement | Ref<HTMLElement>, event: string, callback: (ev: Event) => void) {
// 如果你想的话,
// 也可以用字符串形式的 CSS 选择器来寻找目标 DOM 元素
onMounted(() => {
if (isRef(target)) {
target.value.addEventListener(event, callback)
} else {
target.addEventListener(event, callback)
}
})
onUnmounted(() => {
if (isRef(target)) {
target.value.removeEventListener(event, callback)
} else {
target.removeEventListener(event, callback)
}
})
}

107
src/vue/CompanyWithdraw.vue Normal file
View File

@ -0,0 +1,107 @@
<script lang="ts" setup>
import { inject, onMounted, ref } from "vue";
import toThousands from "../ts/func/utils/toThousands";
import { fetchCurrentCompanyAvailableMoney, fetchCurrentMoney } from "../ts/func/utils/fetchCurrentMoney";
import { ElMessage } from "element-plus";
import { LoggerKey } from "../ts/class/Logger";
const logger = inject(LoggerKey);
const inputMoney = ref('');
const inputWithdrawMoney = ref('');
const formModel = ref({
cash: 0, company: 0,
});
const updateCash = async () => {
formModel.value.cash = await fetchCurrentMoney();
return formModel.value.cash;
};
const updateCompany = async () => {
formModel.value.company = await fetchCurrentCompanyAvailableMoney();
return formModel.value.company;
};
/**
* 存取钱通用
* @param amount
* @param action {'deposit' | 'withdraw'}
*/
const deposit = async (amount: number, action: 'deposit' | 'withdraw' = 'deposit') => {
if (amount < 1) {
ElMessage.error('数额不能小于1');
logger.error('数额不能小于1');
throw new Error('数额不能小于1');
}
try {
await fetch(window.addRFC("https://www.torn.com/companies.php?step=funds"), {
"headers": {
"accept": "*/*",
"content-type": "application/x-www-form-urlencoded; charset=UTF-8",
"sec-ch-ua-mobile": "?0",
"sec-fetch-dest": "empty",
"sec-fetch-mode": "cors",
"sec-fetch-site": "same-origin",
"x-requested-with": "XMLHttpRequest"
},
"referrer": "https://www.torn.com/companies.php",
"referrerPolicy": "strict-origin-when-cross-origin",
"body": action + "=" + amount,
"method": "POST",
"mode": "cors",
"credentials": "include"
});
} catch (e) {
ElMessage.error('请求出错 ' + e.message);
logger.error(e.stack);
throw e;
}
ElMessage.success('$' + toThousands(amount) + ' 存取请求完成');
};
onMounted(() => {
updateCompany();
updateCash();
});
</script>
<template>
<el-form
:model="formModel"
label-position="top"
>
<el-form-item :label="'现金 $' + toThousands(formModel.cash)">
<el-input
v-model="inputWithdrawMoney"
:formatter="toThousands"
:parser="(value) => value.replaceAll(',', '')"
>
<template #prepend>
<el-button @click="async () => inputWithdrawMoney = toThousands(await updateCash())">$</el-button>
</template>
<template #append>
<el-button @click="deposit(Number(inputWithdrawMoney.replaceAll(',', '')), 'withdraw')">取出</el-button>
</template>
</el-input>
</el-form-item>
<el-form-item :label="'公司可用余额 $' + toThousands(formModel.company)">
<el-input
v-model="inputMoney"
:formatter="toThousands"
:parser="(value) => value.replaceAll(',', '')"
>
<template #prepend>
<el-button @click="async () => inputMoney = toThousands(await updateCompany())">$</el-button>
</template>
<template #append>
<el-button @click="deposit(Number(inputMoney.replaceAll(',', '')))">存入</el-button>
</template>
</el-input>
</el-form-item>
</el-form>
</template>
<style scoped></style>

View File

@ -1,16 +1,20 @@
<template>
<el-config-provider :size="'default'" :z-index="1000000">
<el-dropdown :hide-on-click="false" size="small" style="z-index: 1000000;user-select: none" trigger="click">
<el-button circle class="wh-menu-button">
<el-icon>
<MoonNight/>
</el-icon>
</el-button>
<template #dropdown>
<el-dropdown-menu>
<el-dropdown-item>芜湖助手</el-dropdown-item>
<el-dropdown-item divided>
<el-dropdown placement="bottom-end" size="small" style="width: 100%" trigger="click">
<el-dropdown
:hide-on-click="false"
:max-height="(documentHeight * 0.8 | 0) + 'px'" size="small" style="z-index: 1000000;user-select: none"
trigger="click"
>
<el-button circle class="wh-menu-button">
<el-icon>
<MoonNight/>
</el-icon>
</el-button>
<template #dropdown>
<el-dropdown-menu>
<el-dropdown-item>芜湖助手</el-dropdown-item>
<el-dropdown-item divided>
<el-dropdown placement="bottom-end" size="small" style="width: 100%" trigger="click">
<el-button link size="small" style="width: 100%;text-align: left;">💪 快速锻炼 ></el-button>
<template #dropdown>
<el-dropdown-item @click="quickGymTrain.doTrain(BATTLE_STAT.STR)">力量
@ -91,6 +95,7 @@ import MarketHelper from "./MarketHelper.vue";
import PTMarketView from "./PTMarketView.vue";
import QuickCrime from "./QuickCrime.vue";
import VirusProgramming from "./VirusProgramming.vue";
import CompanyWithdraw from "./CompanyWithdraw.vue";
const logger = inject(LoggerKey);
const quickGymTrain = inject(QuickGymTrainKey);
@ -196,6 +201,10 @@ const menuItemList = [
title: '🅿️ PT购买',
template: PTMarketView,
},
{
title: '💰 公司存钱',
template: CompanyWithdraw,
},
{
title: '⚙️ 插件配置',
template: Config,
@ -205,6 +214,7 @@ const drawer = ref(false);
const drawerTitle = ref('');
const drawerContent = shallowRef(null);
const isMobilePhone = ref(false);
const documentHeight = ref(0);
// fast travel
const travelData = [
@ -311,15 +321,10 @@ onMounted(() => {
if (document.documentElement.scrollWidth < 800) {
isMobilePhone.value = true;
}
documentHeight.value = document.documentElement.scrollHeight;
});
</script>
<script lang="ts">
export default {
name: 'FloatMenu',
};
</script>
<style scoped>
.wh-menu-button {
position: fixed;