diff --git a/package-lock.json b/package-lock.json index 187bbb1..07d77a8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -17,6 +17,7 @@ "@types/jquery": "^3.5.14", "@types/node": "^18.0.6", "@vitejs/plugin-vue": "^4.0.0", + "@vue/tsconfig": "^0.1.3", "cross-env": "^7.0.3", "npm": "^8.19.2", "rollup": "^2.79.0", @@ -876,6 +877,20 @@ "integrity": "sha512-BHGyyGN3Q97EZx0taMQ+OLNuZcW3d37ZEVmEAyeoA9ERdGvm9Irc/0Fua8SNyOtV1w6BS4q25wbMzJujO9HIfQ==", "dev": true }, + "node_modules/@vue/tsconfig": { + "version": "0.1.3", + "resolved": "https://registry.npmmirror.com/@vue/tsconfig/-/tsconfig-0.1.3.tgz", + "integrity": "sha512-kQVsh8yyWPvHpb8gIc9l/HIDiiVUy1amynLNpCy8p+FoCiZXCo6fQos5/097MmnNZc9AtseDsCrfkhqCrJ8Olg==", + "dev": true, + "peerDependencies": { + "@types/node": "*" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + } + } + }, "node_modules/acorn": { "version": "8.8.2", "resolved": "https://registry.npmmirror.com/acorn/-/acorn-8.8.2.tgz", @@ -5807,6 +5822,13 @@ "integrity": "sha512-BHGyyGN3Q97EZx0taMQ+OLNuZcW3d37ZEVmEAyeoA9ERdGvm9Irc/0Fua8SNyOtV1w6BS4q25wbMzJujO9HIfQ==", "dev": true }, + "@vue/tsconfig": { + "version": "0.1.3", + "resolved": "https://registry.npmmirror.com/@vue/tsconfig/-/tsconfig-0.1.3.tgz", + "integrity": "sha512-kQVsh8yyWPvHpb8gIc9l/HIDiiVUy1amynLNpCy8p+FoCiZXCo6fQos5/097MmnNZc9AtseDsCrfkhqCrJ8Olg==", + "dev": true, + "requires": {} + }, "acorn": { "version": "8.8.2", "resolved": "https://registry.npmmirror.com/acorn/-/acorn-8.8.2.tgz", diff --git a/package.json b/package.json index 0a4e7ce..78f3a3c 100644 --- a/package.json +++ b/package.json @@ -16,6 +16,7 @@ "@types/jquery": "^3.5.14", "@types/node": "^18.0.6", "@vitejs/plugin-vue": "^4.0.0", + "@vue/tsconfig": "^0.1.3", "cross-env": "^7.0.3", "npm": "^8.19.2", "rollup": "^2.79.0", diff --git a/rollup-prod.config.js b/rollup-prod.config.js index 62137a3..21b1ee1 100644 --- a/rollup-prod.config.js +++ b/rollup-prod.config.js @@ -3,4 +3,5 @@ import rollupConfig from "./rollup.config"; rollupConfig.plugins.push(terser()); rollupConfig.output.file = 'dist/bundle.min.js'; +rollupConfig.output.name = 'bundle.min.js'; export default rollupConfig; diff --git a/rollup.config.js b/rollup.config.js index c7b1af7..6b0fbec 100644 --- a/rollup.config.js +++ b/rollup.config.js @@ -11,10 +11,12 @@ let node_env = process.env.NODE_ENV; let vuePath = node_env === 'production' ? 'vue/dist/vue.runtime.esm-browser.prod.js' : 'vue/dist/vue.runtime.esm-browser.js'; export default { - input: 'src/ts/index.ts', + // input: 'src/ts/index.ts', + input: 'src/ts/class/Application.ts', output: { file: 'dist/bundle.js', format: 'iife', + name: 'bundle.js', }, plugins: [ json(), diff --git a/src/ts/class/Application.ts b/src/ts/class/Application.ts index 88002d2..fe63b1d 100644 --- a/src/ts/class/Application.ts +++ b/src/ts/class/Application.ts @@ -6,7 +6,9 @@ import UrlPattern from "./UrlMatch"; import WuhuConfig from "./WuhuConfig"; import translateMain from "../func/translate/translateMain"; import CommonUtils from "./utils/CommonUtils"; +import EntryPoint from "./provider/EntryPoint"; +@EntryPoint export default class Application { public static main(): void { diff --git a/src/ts/class/WuhuBase.ts b/src/ts/class/WuhuBase.ts index e7afd56..acce2b3 100644 --- a/src/ts/class/WuhuBase.ts +++ b/src/ts/class/WuhuBase.ts @@ -5,7 +5,7 @@ import Log from "./Log"; export default class WuhuBase extends Provider { public static glob: IGlobal = null; - protected readonly className: string = 'WuhuBase'; + readonly className: string = 'WuhuBase'; /** * 获取 localStorage 中的 wh_trans_settings 值 (json),以对象形式返回 diff --git a/src/ts/class/provider/EntryPoint.ts b/src/ts/class/provider/EntryPoint.ts new file mode 100644 index 0000000..3e7f10f --- /dev/null +++ b/src/ts/class/provider/EntryPoint.ts @@ -0,0 +1,18 @@ +import Log from "../Log"; +import ZhongIcon from "../ZhongIcon"; + +export default function EntryPoint(T: { main: () => void }) { + if (window.WHTRANS) throw '退出, 已运行次数' + window.WHTRANS; + window.WHTRANS = window.WHTRANS === undefined ? 1 : window.WHTRANS++; + + let started = performance.now(); + try { + T.main(); + } catch (e) { + Log.error('[Starter]加载出错信息: ' + e.stack || e.message); + } + let runTime: number = (performance.now() - started) | 0; + Log.info(`芜湖脚本完成加载, 耗时${ runTime }ms`); + if (ZhongIcon.ZhongNode && ZhongIcon.ZhongNode.initTimer) + ZhongIcon.ZhongNode.initTimer.innerHTML = `加载时间 ${ runTime }ms`; +} diff --git a/src/ts/class/provider/Provider.ts b/src/ts/class/provider/Provider.ts index dfb3b9a..7930aca 100644 --- a/src/ts/class/provider/Provider.ts +++ b/src/ts/class/provider/Provider.ts @@ -1,11 +1,12 @@ import Log from "../Log"; import Timer from "../utils/Timer"; +import ClassWithName from "../../interface/ClassWithName"; /** * 基类、单例 */ -export default class Provider { - protected readonly className: string = 'Provider'; +export default class Provider implements ClassWithName { + readonly className: string = 'Provider'; private static instance; private static readonly pool = {}; diff --git a/src/ts/class/provider/Starter.ts b/src/ts/class/provider/Starter.ts index 1602239..cba31a5 100644 --- a/src/ts/class/provider/Starter.ts +++ b/src/ts/class/provider/Starter.ts @@ -1,21 +1,21 @@ -import Log from "../Log"; -import ZhongIcon from "../ZhongIcon"; - -export default class Starter { - public static run(T): void { - - if (window.WHTRANS) throw '退出, 已运行次数' + window.WHTRANS; - window.WHTRANS = window.WHTRANS === undefined ? 1 : window.WHTRANS++; - - let started = performance.now(); - try { - T.main(); - } catch (e) { - Log.error('[Starter]加载出错信息: ' + e.stack || e.message); - } - let runTime: number = (performance.now() - started) | 0; - Log.info(`芜湖脚本完成加载, 耗时${ runTime }ms`); - if (ZhongIcon.ZhongNode && ZhongIcon.ZhongNode.initTimer) - ZhongIcon.ZhongNode.initTimer.innerHTML = `加载时间 ${ runTime }ms`; - } -} +// import Log from "../Log"; +// import ZhongIcon from "../ZhongIcon"; +// +// export default class Starter { +// public static run(T): void { +// +// if (window.WHTRANS) throw '退出, 已运行次数' + window.WHTRANS; +// window.WHTRANS = window.WHTRANS === undefined ? 1 : window.WHTRANS++; +// +// let started = performance.now(); +// try { +// T.main(); +// } catch (e) { +// Log.error('[Starter]加载出错信息: ' + e.stack || e.message); +// } +// let runTime: number = (performance.now() - started) | 0; +// Log.info(`芜湖脚本完成加载, 耗时${ runTime }ms`); +// if (ZhongIcon.ZhongNode && ZhongIcon.ZhongNode.initTimer) +// ZhongIcon.ZhongNode.initTimer.innerHTML = `加载时间 ${ runTime }ms`; +// } +// } diff --git a/src/ts/class/utils/ItemHelper.ts b/src/ts/class/utils/ItemHelper.ts index 2dcaade..ff2d14a 100644 --- a/src/ts/class/utils/ItemHelper.ts +++ b/src/ts/class/utils/ItemHelper.ts @@ -3,9 +3,15 @@ import InventoryItemInfo from "../../interface/responseType/InventoryItemInfo"; import FetchUtils from "./FetchUtils"; import CommonUtils from "./CommonUtils"; import Log from "../Log"; +import PriceData from "../../interface/PriceData"; +import Asyncable from "../../interface/Asyncable"; export default class ItemHelper extends WuhuBase { className = "ItemHelper"; + + /** 保存物品名-ID对应关系 */ + private itemNameMap: { [name: string]: number } = null; + itemValueMap: { [k: string]: Partial } = { 'Glass of Beer': { itemName: '一杯啤酒', @@ -18,9 +24,11 @@ export default class ItemHelper extends WuhuBase { "
效果: 犯罪 + 2,增幅CD + 1h。
", }, }; + itemPriceMap = { 205: { name: 'Vicodin', price: 1300 }, }; + // 缓存过期时间 分钟 private readonly priceTimeout = 720; @@ -29,11 +37,28 @@ export default class ItemHelper extends WuhuBase { super(); } + /** TODO 通过 name 查询 */ public async getItemData(idOrName: string): Promise> { + let _itemId: number = null; + try { + _itemId = parseInt(idOrName); + } finally { + } + let itemId: number; + if (this.itemNameMap) { + itemId = _itemId || this.itemNameMap[idOrName]; + } else { + itemId = (await this.getItemNameMap().promise)[idOrName]; + } return await (await FetchUtils.getInstance().ajaxFetch({ - url: `/inventory.php?step=info&itemID=${ idOrName }&armouryID=0&asObject=true`, - method: 'GET', - referrer: 'bazaar.php', + url: '/inventory.php', + method: 'POST', + body: JSON.stringify({ + step: 'info', + itemID: itemId, + armouryID: 0 + }), + referrer: 'displaycase.php', })).json(); } @@ -58,10 +83,11 @@ export default class ItemHelper extends WuhuBase { return (await this.getItemData(idOrName)).itemValue.replaceAll(/[,$]/, ''); } - public getLocalPriceData(): { priceData: PriceData, promise: Promise } { + /** 返回本地物品价格数据,id对应物品名和价格 */ + public getLocalPriceData(): Asyncable { // 获取本地缓存 let localStore = localStorage.getItem('WHItemPrice'); - let res = { priceData: null, promise: null }; + let res = { data: null, promise: null }; let data: PriceData = null; // 无缓存 if (!localStore) { @@ -77,16 +103,58 @@ export default class ItemHelper extends WuhuBase { } // 缓存超时 if (Date.now() - data.timestamp > this.priceTimeout * 60000) { - res.priceData = null; + res.data = null; res.promise = this.fetchPriceData(); } else { - res.priceData = data; + res.data = data.data; res.promise = null; } return res; } - private async fetchPriceData(): Promise { + /** 返回物品名与id对应关系 */ + public getItemNameMap(): Asyncable<{ [key: string]: number }> { + let localData = this.getLocalPriceData(); + let ret: Asyncable<{ [key: string]: number }> = { + data: null, + promise: null + }; + // 有缓存 + if (localData.data || this.itemNameMap) { + // 内存缓存 + if (this.itemNameMap) { + ret.data = this.itemNameMap; + } + // 本地缓存 + else { + ret.data = {}; + Object.keys(localData.data).forEach((k) => { + ret.data[localData.data[k].name] = parseInt(k); + }); + this.itemNameMap = ret.data; + } + } + // 无缓存异步返回 + else { + ret.promise = new Promise(async resolve => { + let response = await localData.promise; + Log.info({ response }); + let promiseRet = {}; + Object.keys(response).forEach(k => { + promiseRet[response[k].name] = k; + }); + this.itemNameMap = promiseRet; + resolve(promiseRet); + }); + } + return ret; + } + + /** + * fetch方法,返回后加入本地缓存,返回格式: 物品id -> + * `{name: string, price: number}` + */ + private async fetchPriceData(): Promise { let res = null; // 获取在线价格 try { @@ -104,13 +172,3 @@ export default class ItemHelper extends WuhuBase { return res; } } - -interface PriceData { - timestamp: number - data: { - [k: number]: { - name: string - price: number - } - } -} diff --git a/src/ts/func/module/christmasTownHelper.ts b/src/ts/func/module/christmasTownHelper.ts index 4b12948..a8db325 100644 --- a/src/ts/func/module/christmasTownHelper.ts +++ b/src/ts/func/module/christmasTownHelper.ts @@ -253,7 +253,7 @@ export default function christmasTownHelper() { const now = new Date(); dropHist[hist_key] = { pos: `[${ nearby_item.x },${ nearby_item.y }]`, - map: $ct_title.firstChild.nodeValue.trim(), + data: $ct_title.firstChild.nodeValue.trim(), last: `${ now.getFullYear() }-${ now.getMonth() + 1 }-${ now.getDate() } ${ now.getHours() }:${ now.getMinutes() }:${ now.getSeconds() }`, name: item_name, id: Object.keys(dropHist).length, diff --git a/src/ts/func/module/cityFinder.ts b/src/ts/func/module/cityFinder.ts index 3323ed2..bfb872c 100644 --- a/src/ts/func/module/cityFinder.ts +++ b/src/ts/func/module/cityFinder.ts @@ -109,12 +109,12 @@ export default function cityFinder(_base: TornStyleBlock): void { // } let priceData = itemHelper.getLocalPriceData(); - if (priceData.priceData) { - items = priceData.priceData.data; + if (priceData.data) { + items = priceData.data; displayNamePrice(); } else { window.setTimeout(async () => { - items = (await priceData.promise).data; + items = (await priceData.promise); displayNamePrice(); }, 0); } diff --git a/src/ts/index.ts b/src/ts/index.ts index 4bca2b8..64918dd 100644 --- a/src/ts/index.ts +++ b/src/ts/index.ts @@ -1,4 +1,4 @@ -import Starter from "./class/provider/Starter"; -import Application from "./class/Application"; - -Starter.run(Application); \ No newline at end of file +// import Starter from "./class/provider/Starter"; +// import Application from "./class/Application"; +// +// Starter.run(Application); \ No newline at end of file diff --git a/src/ts/interface/Asyncable.ts b/src/ts/interface/Asyncable.ts new file mode 100644 index 0000000..916e508 --- /dev/null +++ b/src/ts/interface/Asyncable.ts @@ -0,0 +1,5 @@ +/** 有同步数据来源时返回data,否则返回promise对象 */ +export default interface Asyncable { + data?: T + promise?: Promise +} diff --git a/src/ts/interface/BazaarApiResponse.ts b/src/ts/interface/BazaarApiResponse.ts new file mode 100644 index 0000000..ae7040f --- /dev/null +++ b/src/ts/interface/BazaarApiResponse.ts @@ -0,0 +1,3 @@ +export default interface BazaarApiResponse { + bazaar: { ID: number, cost: number, quantity: number }[] +} diff --git a/src/ts/interface/ClassWithName.ts b/src/ts/interface/ClassWithName.ts new file mode 100644 index 0000000..8fad0e5 --- /dev/null +++ b/src/ts/interface/ClassWithName.ts @@ -0,0 +1,3 @@ +export default interface ClassWithName { + readonly className: string +} diff --git a/src/ts/interface/PriceData.ts b/src/ts/interface/PriceData.ts new file mode 100644 index 0000000..16e4969 --- /dev/null +++ b/src/ts/interface/PriceData.ts @@ -0,0 +1,11 @@ +export default interface PriceData { + timestamp: number + data: { + [k: number]: ItemPrice + } +} + +export interface ItemPrice { + name: string + price: number +} diff --git a/src/ts/test/Test.ts b/src/ts/test/Test.ts index 52e504b..1c86b74 100644 --- a/src/ts/test/Test.ts +++ b/src/ts/test/Test.ts @@ -10,34 +10,9 @@ export default class Test extends WuhuBase { className = 'Test'; public test(): void { - let popup = new Popup( - // '
' + - // '' + - // '

' + - '' - ); + let popup = new Popup(''); popup.getElement()['__POOL__'] = Test.getPool(); Log.info({ NET: globVars.WH_NET_LOG }); - // let vueApp = createApp({ - // data() { - // return { - // itemNameInput: "", - // itemInfo:{} - // } - // }, - // computed: { - // filteredItems() { - // let arr = ['123', '456', '789', '135', '246', '357', '579']; - // let out = []; - // if (this.itemNameInput) { - // arr.forEach(v => { - // v.includes(this.itemNameInput) && out.push(v); - // }) - // } - // return out; - // } - // } - // }); let vueApp = createApp(ItemPrice); vueApp.mount('#wh-popup-cont'); popup.setOnClosing(() => vueApp.unmount()); @@ -46,7 +21,6 @@ export default class Test extends WuhuBase { private case1() { // FetchUtils.getInstance().ajaxFetch({ // url: '/inventory.php?step=info&itemID=205&armouryID=0&asObject=true', - // // method: 'GET', // referrer: 'bazaar.php', // }); diff --git a/src/ts/vue/ItemPrice.vue b/src/ts/vue/ItemPrice.vue index e30833f..2d26814 100644 --- a/src/ts/vue/ItemPrice.vue +++ b/src/ts/vue/ItemPrice.vue @@ -1,46 +1,141 @@