This commit is contained in:
Liwanyi 2023-04-10 10:33:57 +08:00
parent 4b51e156bb
commit a4d6b581d7
14 changed files with 313 additions and 90 deletions

View File

@ -4,6 +4,24 @@
# CHANGE
## 0.8.7
2023年04月10日
### 修改
- 修复脚本首次运行配置获取错误的问题
- 修复"解决加载中"功能开启后无法加载插件图标的问题
- 修复功能选项错误读取默认值的问题
## 0.8.6
2023年04月07日
### 修改
- 结构调整
## 0.8.5
2023年04月03日

File diff suppressed because one or more lines are too long

6
src/shims-vue.d.ts vendored
View File

@ -1,11 +1,5 @@
/* eslint-disable */
declare module '*.vue' {
import type { DefineComponent } from 'vue'
const component: DefineComponent<{}, {}, any>
export default component
}
declare module '*vue&type=script&lang.ts' {
import type { DefineComponent } from 'vue'
const component: DefineComponent<{}, {}, any>
export default component
}

View File

@ -30,16 +30,14 @@ export default class App {
// 初始化
this.tornHelper.init();
// 插件设置默认值
// WuhuConfig.setDefaults();
// 插件图标和设置菜单
this.icon.init();
let tmp = () => {
// 所有页面通用
try {
this.common.resolve(this.run);
// this.common.resolve.apply(this.common, this.run);
this.common.resolve(() => this.run());
} catch (e) {
}

View File

@ -1,17 +1,17 @@
import Logger from "./Logger";
import ClassName from "../container/ClassName";
import { Injectable } from "../container/Injectable";
import Global from "./Global";
import CommonUtils from "./utils/CommonUtils";
import LocalConfigWrapper from "./LocalConfigWrapper";
import NNB from "./handler/NNB";
import ItemPriceWatcherHandler from "./handler/ItemPriceWatcherHandler";
import { createApp, InjectionKey } from "vue";
import FloatMenu from "../../vue/FloatMenu.vue";
import MenuItem, { MENU_ITEM_TYPE } from "../interface/MenuItem";
import PopupWrapper, { PopupWrapperKey } from "./utils/PopupWrapper";
import InfoUtils from "./utils/InfoUtils";
export const MenuItemListKey = Symbol() as InjectionKey<MenuItem[]>;
export const GlobalKey = Symbol() as InjectionKey<Global>;
// export const MenuItemListKey = Symbol() as InjectionKey<MenuItem[]>;
// export const GlobalKey = Symbol() as InjectionKey<Global>;
export const LoggerKey = Symbol() as InjectionKey<Logger>;
@ClassName("IconHelper")
@ -21,11 +21,13 @@ export default class IconHelper {
constructor(
private readonly logger: Logger,
private readonly global: Global,
// private readonly global: Global,
private readonly commonUtils: CommonUtils,
private readonly localConfigWrapper: LocalConfigWrapper,
private readonly nnb: NNB,
private readonly itemPriceWatcherHandler: ItemPriceWatcherHandler,
private readonly popupWrapper: PopupWrapper,
private readonly infoUtils: InfoUtils,
) {
this._element = document.createElement('div');
}
@ -39,9 +41,200 @@ export default class IconHelper {
document.body.append(this._element);
let app = createApp(FloatMenu);
app.config.errorHandler = (err) => this.logger.error('vue错误', err);
app.provide(MenuItemListKey, [{ domType: MENU_ITEM_TYPE.BUTTON, domId: '1', domText: '1111111' }]);
app.provide(GlobalKey, this.global);
// app.provide(menuItemList, this.items);
// app.provide(GlobalKey, this.global);
app.provide(LoggerKey, this.logger);
app.provide(PopupWrapperKey, this.popupWrapper);
app.mount(this._element);
}
// get items(): MenuItem[] {
// let rt: MenuItem[] = [];
// let playerInfo = this.infoUtils.getPlayerInfo();
//
// // 欢迎 显示玩家id
// if (playerInfo.userID !== 0) {
// rt.push({
// domType: MENU_ITEM_TYPE.PLAIN,
// domHTML:
// `<a href="/profiles.php?XID=${ playerInfo.userID }" target="_blank">${ playerInfo.playername }</a>[${ playerInfo.userID }]`,
// });
// }
// // 节日
// let festDateHtml = '<button>节日</button>: ';
// {
// // 节日字典
// const festData = FEST.val;
// const formatMMDD = (m, d) => {
// const MM = m < 10 ? `0${ m }` : m.toString();
// const DD = d < 10 ? `0${ d }` : d.toString();
// return MM + DD;
// };
// const newDate = new Date();
// const festKey = formatMMDD(newDate.getUTCMonth(), newDate.getUTCDate());
// if (festData[festKey]) festDateHtml += `今天 - ${ festData[festKey]['name'] }(<button title="${ festData[festKey]['eff'] }">效果</button>)`;
// else {
// // 月日列表
// let MMDDList = Object.keys(festData);
// MMDDList.push(festKey);
// // 下个节日的位置
// const nextFestIndex = MMDDList.sort().indexOf(festKey) + 1;
// // 下个节日obj
// const nextFestDate = festData[MMDDList[nextFestIndex] || MMDDList[0]];
// // 下个节日的时间
// let next = new Date(
// nextFestIndex !== MMDDList.length ? newDate.getUTCFullYear() : newDate.getUTCFullYear() + 1,
// (MMDDList[nextFestIndex !== MMDDList.length ? nextFestIndex : 0] as any).slice(0, 2) | 0,
// (MMDDList[nextFestIndex !== MMDDList.length ? nextFestIndex : 0] as any).slice(2) | 0,
// 8
// ).getTime();
// // 剩余天数
// const left = (next - newDate.getTime()) / 86400000 | 0;
// festDateHtml += `${ left }天后 - ${ nextFestDate.name }(<button title="${ nextFestDate.eff }">效果</button>)`;
// }
// }
// rt.push({
// domType: MENU_ITEM_TYPE.PLAIN,
// domHTML: festDateHtml,
// });
// // 活动
// let eventObj: EventWrapper = {
// onEv: false,
// daysLeft: Infinity,
// events: EVENTS.default,
// };
// rt.events = EVENTS.default;
// eventObj.events.forEach((obj, index) => {
// if (eventObj.onEv) return;
// // 当前年份
// const nowYear = date.getFullYear();
// // 当前遍历的活动开始时间
// const start = new Date(nowYear, obj.start[0], obj.start[1], obj.start[2]);
// // 当前遍历的活动结束时间
// const end = new Date(nowYear, obj.end[0], obj.end[1], obj.end[2]);
// // 当前处于活动中
// if (start < date && date < end) {
// eventObj.onEv = true;
// eventObj.daysLeft = (end.getTime() - date.getTime()) / 86400000 | 0;
// eventObj.current = obj;
// }
// // 当前没有活动
// else {
// // 当前遍历的活动如果已经经过了,那么下次活动就是遍历的下一个活动对象,否则为当前活动。
// // 如果本年度活动都经过了,那么下次活动是列表的第一个活动对象
// const next = end < date ? eventObj.events[index + 1] || eventObj.events[0] : obj;
// // 经过了最后一个活动所以下次活动开始时间是第二年
// const start = new Date(next !== obj && index === eventObj.events.length - 1 ? nowYear + 1 : nowYear, next.start[0], next.start[1], next.start[2]);
// const daysLeft = (start.getTime() - date.getTime()) / 86400000 | 0;
// if (0 <= daysLeft && daysLeft < eventObj.daysLeft) {
// eventObj.daysLeft = daysLeft;
// eventObj.next = next;
// }
// }
// });
// eventObj.html = '<button>活动</button>: ';
// eventObj.onEv
// ? eventObj.html += `${ eventObj.current.name }(<button title="${ eventObj.current.eff }">详情</button>) - 剩余${ eventObj.daysLeft }天`
// : eventObj.html += `${ eventObj.daysLeft }天后 - ${ eventObj.next.name }(<button title="${ eventObj.next.eff }">详情</button>)`;
// rt.push({
// domType: 'plain',
// domId: 'wh-trans-event-cont',
// domHTML: eventObj.html,
// });
// // 一键起飞
// rt.push({
// domType: 'button',
// domId: 'wh-quick-fly-btn',
// domText: '✈️ 一键起飞',
// clickFunc: () => Container.factory(QuickFlyBtnHandler).handle(),
// });
// // 飞花库存
// rt.push({
// domType: 'button',
// domId: 'wh-foreign-stock-btn',
// domText: '🌸 飞花库存',
// clickFunc: () => Container.factory(TravelItem).clickHandler().then(),
// });
// // NPC LOOT
// rt.push({
// domType: 'button',
// domId: 'wh-npc-loot-btn',
// domText: '🔫 LOOT',
// clickFunc: () => {
// const insert = ZHONG_LOOT_HTML.replace('{{}}', performance.now().toString());
// new Popup(insert, 'NPC LOOT');
// },
// tip: '显示5个可击杀NPC的开打时间',
// });
// // 查看NNB
// rt.push({
// domType: 'button',
// domId: 'wh-nnb-info',
// domText: '👮‍ 查看NNB',
// clickFunc: () => this.nnb.handle(),
// });
// // 常用链接
// rt.push({
// domType: 'button',
// domId: 'wh-link-collection',
// domText: '🔗 常用链接',
// clickFunc: () => Container.factory(QuickLinksHandler).handle()
// });
// // 飞贼
// // rt.push({
// // domType: 'button',
// // domId: 'wh-gs-btn',
// // domText: '🐏 飞贼小助手',
// // clickFunc: () => loadGS(CommonUtils.getScriptEngine()),
// // tip: '加载从PC端移植的伞佬的油猴版飞贼小助手',
// // });
//
// // 物品价格监视
// rt.push({
// domType: 'button',
// domId: 'wh-price-watcher-btn',
// domText: '💊 价格监视',
// clickFunc: () => this.itemPriceWatcherHandler.handle()
// });
// // 全屏
// if (!this.tornPDAUtils.isPDA()) rt.push({
// domType: 'button', domId: '', domText: '🖥️ 进入全屏', clickFunc() {
// document.documentElement.requestFullscreen().then();
// }
// });
// // 传单助手
// rt.push({
// domType: 'button',
// domId: '',
// domText: '📜️ 传单助手',
// clickFunc: adHelper
// });
// // 守望者
// rt.push({
// domType: 'button',
// domId: '',
// domText: '🛡️ 守望者',
// clickFunc: function () {
// safeKeeper();
// },
// });
// // 寻找木桩
// rt.push({
// domType: 'button',
// domId: '',
// domText: '🌲 寻找木桩',
// clickFunc() {
// window.location.replace('https://www.torn.com/item.php?temp=4#xunzhaomuzhuang')
// }
// });
// // 物品查价
// rt.push(ItemPriceHandler);
// // 更新历史
// rt.push(ChangeLogHandler);
// // 助手设置
// rt.push(SettingsHandler);
// // 测试
// if (this.logger.debug()) rt.push(Test);
// return rt;
// }
}

View File

@ -44,9 +44,9 @@ export default class LocalConfigWrapper {
private get Local(): Config {
let config: Config;
try {
config = JSON.parse(localStorage.getItem('wh_trans_settings'))
config = JSON.parse(localStorage.getItem('wh_trans_settings')) ?? defaultConfig;
} catch (e) {
this.logger.error('配置获取失败, 载入默认');
this.logger.error('配置解析失败, 载入默认');
config = defaultConfig;
localStorage.setItem('wh_trans_settings', JSON.stringify(defaultConfig));
}

View File

@ -23,7 +23,7 @@ export default function EntryPoint(T: { main: () => void }) {
ZhongIcon.ZhongNode.initTimer.innerHTML = `加载时间 ${ runTime }ms`;
};
const evHandler = () => {
console.log('document.readyState: ' + document.readyState);
// console.log('document.readyState: ' + document.readyState);
if (!started && (document.readyState === 'complete' || document.readyState === 'interactive')) {
document.removeEventListener('readystatechange', evHandler);
started = !started;

View File

@ -2,6 +2,7 @@ import ClassName from "../../container/ClassName";
import { Injectable } from "../../container/Injectable";
import Alert from "./Alert";
import IWHNotify from "../../interface/IWHNotify";
import { InjectionKey } from "vue";
@ClassName('MsgWrapper')
@Injectable()
@ -10,3 +11,5 @@ export default class MsgWrapper {
return new Alert(msg, options);
}
}
export const MsgWrapperKey = Symbol('MsgWrapperKey') as InjectionKey<MsgWrapper>;

View File

@ -0,0 +1,14 @@
import ClassName from "../../container/ClassName";
import { Injectable } from "../../container/Injectable";
import Popup from "./Popup";
import { InjectionKey } from "vue";
@ClassName('PopupWrapper')
@Injectable()
export default class PopupWrapper {
public create(html: string, title: string, onClosing: () => unknown) {
return new Popup(html, title, onClosing);
}
}
export const PopupWrapperKey = Symbol('PopupWrapperKey') as InjectionKey<PopupWrapper>;

View File

@ -13,4 +13,4 @@ export enum MENU_ITEM_TYPE {
}
// export
export const menuItemList = Symbol() as InjectionKey<MenuItem[]>;
export const menuItemList = Symbol('menuItemList') as InjectionKey<MenuItem[]>;

View File

@ -1,13 +1,29 @@
<script lang="ts" setup>
import { inject } from 'vue';
import { LoggerKey, MenuItemListKey } from "../ts/class/IconHelper";
import { inject, ref } from 'vue';
import { LoggerKey } from "../ts/class/IconHelper";
import globVars from "../ts/globVars";
import Test from "./Test.vue";
import PopupWindow from "./PopupWindow.vue";
const logger = inject(LoggerKey);
const menuItemList = inject(MenuItemListKey);
// const menuItemList = inject(MenuItemListKey);
const menuItemList = [];
const version = globVars.version;
const itemHandle = (id) => logger.info(id);
const updateHandle = () => {
};
const currentPopupContent = ref({
has: false,
title: null,
content: null,
});
const menuClick = (id) => {
currentPopupContent.value.has = true;
currentPopupContent.value.title = 'test';
currentPopupContent.value.content = Test;
};
</script>
<template>
@ -18,10 +34,11 @@ const itemHandle = (id) => logger.info(id);
<div class="main">
<div><b>芜湖助手</b></div>
<div id="itemList">
<div v-for="item in menuItemList">
<button v-if="item.domType === 'button'" @click="itemHandle(item.domId)">{{ item.domText }}</button>
<div v-if="item.domType === 'plain'" v-html="item.domHTML"></div>
</div>
<!-- <div v-for="item in menuItemList">-->
<!-- <button v-if="item.domType === 'button'" @click="itemHandle(item.domId)">{{ item.domText }}</button>-->
<!-- <div v-if="item.domType === 'plain'" v-html="item.domHTML"></div>-->
<!-- </div>-->
<button @click="menuClick">菜单</button>
</div>
<div>
<p>当前版本: {{ version }}
@ -32,68 +49,15 @@ const itemHandle = (id) => logger.info(id);
<div><p id="loadTime"></p></div>
</div>
</div>
<PopupWindow v-if="currentPopupContent.has" title="{{ currentPopupContent.title }}">
<component :is="currentPopupContent.content"/>
</PopupWindow>
</template>
<script lang="ts">
// import "reflect-metadata";
// import Global from "../ts/class/Global";
// import { defineComponent, inject } from "vue";
// import Logger from "../ts/class/Logger";
// import MenuItem, { menuItemList } from "../ts/interface/MenuItem";
// import { global, logger } from "../ts/class/IconHelper";
// import { Component, Inject, Vue } from "vue-facing-decorator";
//
// // export default defineComponent({
// // export default {
// // // inject: ['_logger', '_global', '_menuItemList'],
// // inject: {
// // // _logger: {
// // // from: logger,
// // // default: {},
// // // },
// // // global: {
// // // from: global,
// // // },
// // _menuItemList: {
// // from: menuItemList,
// // }
// // },
// // name: "FloatMenu",
// // setup(props) {
// // },
// // data() {
// // return {
// // // @ts-ignore
// // // logger: this._logger,
// // // global: this._global as unknown as Global,
// // // menuItemList: this.menuItemList,
// // menuItemList: this._menuItemList,
// // // version: this.inject.global.version,
// // }
// // },
// // methods: {
// // itemHandle(id: string) {
// // // this.logger.info(id);
// // }
// // },
// // mounted() {
// // // @ts-ignore
// // console.warn('123123123', this.menuItemList)
// // console.warn('123123123', this._menuItemList)
// // }
// // }
// @Component({})
// export default class A extends Vue{
// @Inject
// readonly logger!:Logger;
// @Inject
// readonly menuItemList!:MenuItem[];
// @Inject
// readonly global!:Global;
//
// version = this.global.version;
// }
export default {};
export default {
name: 'FloatMenu',
};
</script>
<style scoped>

26
src/vue/PopupWindow.vue Normal file
View File

@ -0,0 +1,26 @@
<script lang="ts" setup>
defineProps(['title', 'html', 'temp']);
</script>
<template>
<div class="popup-container">
<div class="border-round">
<div class="title-black top-round">
<p>{{ title || '芜湖助手' }}</p>
</div>
<div class="bottom-round cont-gray scroll-area scrollbar-transparent">
<slot></slot>
</div>
</div>
</div>
</template>
<script lang="ts">
export default {
name: "PopupWindow"
}
</script>
<style scoped>
</style>

13
src/vue/Test.vue Normal file
View File

@ -0,0 +1,13 @@
<template>
<p>1</p>
</template>
<script>
export default {
name: "Test"
}
</script>
<style scoped>
</style>