import CommonUtils from "../class/utils/CommonUtils"; import UserScriptEngine from "../enum/UserScriptEngine"; import Popup from "../class/utils/Popup"; import STOCK_IMG_HTML from "../../static/html/stock_img.html"; import WindowActiveState from "../class/action/WindowActiveState"; import { Injectable } from "../container/Injectable"; import ClassName from "../container/ClassName"; import Logger from "../class/Logger"; import IFeature from "../man/IFeature"; import ATK_PAGE_REG from "./url/ATK_PAGE_REG"; import ALL_PAGE_REG from "./url/ALL_PAGE_REG"; @Injectable() @ClassName('TravelItem') export default class TravelItem implements IFeature { private readonly logger: Logger = Logger.factory(TravelItem) description(): string { return "海外货物存量静默获取"; } iStart(): void | Promise { this.init() } urlExcludes(): RegExp[] { return [ATK_PAGE_REG]; } private readonly apiUrl: string = 'https://yata.yt/api/v1/travel/export/'; private foreignStockInfo: any = null; urlIncludes(): RegExp[] { return [ALL_PAGE_REG]; } public constructor( private readonly windowActiveState: WindowActiveState, private readonly commonUtils: CommonUtils, ) { } public init() { window.setInterval(async () => { if (!this.windowActiveState.get()) return; this.logger.info('COFetch ', this.apiUrl); try { this.foreignStockInfo = JSON.parse(await CommonUtils.COFetch(this.apiUrl)); } catch (e) { this.logger.error('解析错误', e.stack || e.message || e); } this.logger.info({ info: 'TravelItem 跨域返回', 'returned': this.foreignStockInfo }); }, 30 * 1000); } public get itemFiler() { return [ { "name": "mex", "show": "墨西哥", "stocks": { "Dahlia": "花", "Jaguar Plushie": "偶" } }, { "name": "cay", "show": "开曼", "stocks": { "Banana Orchid": "花", "Stingray Plushie": "偶" } }, { "name": "can", "show": "加拿大", "stocks": { "Crocus": "花", "Wolverine Plushie": "偶" } }, { "name": "haw", "show": "夏威夷", "stocks": { "Orchid": "花", "Large Suitcase": "大箱" } }, { "name": "uni", "show": "嘤国", "stocks": { "Heather": "花", "Red Fox Plushie": "赤狐", "Nessie Plushie": "水怪" } }, { "name": "arg", "show": "阿根廷", "stocks": { "Ceibo Flower": "花", "Monkey Plushie": "偶", "Tear Gas": "催泪弹" } }, { "name": "swi", "show": "瑞士", "stocks": { "Edelweiss": "花", "Chamois Plushie": "偶" } }, { "name": "jap", "show": "日本", "stocks": { "Cherry Blossom": "花" } }, { "name": "chi", "show": "祖国", "stocks": { "Peony": "花", "Panda Plushie": "偶" } }, { "name": "uae", "show": "阿联酋 (UAE)", "stocks": { "Tribulus Omanense": "花", "Camel Plushie": "偶" } }, { "name": "sou", "show": "南非", "stocks": { "African Violet": "花", "Lion Plushie": "偶", "Xanax": "XAN" } } ] } // 呈现内容 public async clickHandler(): Promise { if (this.commonUtils.getScriptEngine() === UserScriptEngine.RAW) { new Popup(STOCK_IMG_HTML.replace('{{}}', performance.now().toString()), '飞花库存'); } else { const popup = new Popup("请稍后 " + CommonUtils.loading_gif_html(), '飞花库存'); let table = ``; // const dest = FILTER.default; const dest = this.itemFiler; const now = new Date(); const res = await this.get(); this.logger.info({ res }) if (!res || !res.stocks) return; dest.forEach(el => { const update = (now.getTime() - new Date(res.stocks[el.name]['update'] * 1000).getTime()) / 1000 | 0 table += ``; let count = 0; res.stocks[el.name]['stocks'].forEach(stock => { if (el.stocks[stock.name]) { table += `${ el.stocks[stock.name] } (${ stock['quantity'] })`; count++; } }); while (count < 3) { count++; table += ''; } table += ''; }); table += '
目的地 - 更新时间库存
${ el.show }${ update / 60 | 0 }分${ update % 60 | 0 }秒前
'; popup.getElement().innerHTML = table; } } public async get() { try { return this.foreignStockInfo ||= JSON.parse(await CommonUtils.COFetch(this.apiUrl)); } catch (e) { this.logger.error('解析出错', e.stack || e.message || e); return null; } } } // export const TravelItemKey = Symbol('TravelItemKey') as InjectionKey