From 2509b488d2da009ba9c790eda083cf7ccead6998 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=9B=AE=E6=A3=83?= Date: Sat, 24 Feb 2024 18:12:05 +0800 Subject: [PATCH] =?UTF-8?q?=F0=9F=8C=B1=20=E5=AE=8C=E5=96=84=E7=B1=BB?= =?UTF-8?q?=E5=9E=8B=EF=BC=8C=E5=88=9D=E6=AD=A5=E8=BF=9B=E8=A1=8C=E6=AD=A3?= =?UTF-8?q?=E5=88=99match=20#94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/pages/common/Announcements.vue | 53 +++++++++++++++++++++++++++--- src/router/modules/sub.ts | 4 +-- src/store/modules/app.ts | 3 +- src/views/t-anno-json.vue | 9 +++-- src/views/t-anno.vue | 18 +++++----- src/web/request/getAnno.ts | 16 +++++---- 6 files changed, 78 insertions(+), 25 deletions(-) diff --git a/src/pages/common/Announcements.vue b/src/pages/common/Announcements.vue index 8c104ebd..318eb656 100644 --- a/src/pages/common/Announcements.vue +++ b/src/pages/common/Announcements.vue @@ -79,7 +79,7 @@ const annoServerList: string[] = [ "国际服-港澳台服", ]; const langList: string[] = ["简体中文", "繁体中文", "English", "日本語"]; - +export type AnnoLang = "zh-cn" | "zh-tw" | "en" | "ja"; // 服务器列表 const annoServerMap: AnnoServerMap = { "国服-官方服": SERVER.CN_ISLAND, @@ -89,7 +89,7 @@ const annoServerMap: AnnoServerMap = { "国际服-美服": SERVER.OS_USA, "国际服-港澳台服": SERVER.OS_CHT, }; -const langMap: Record = { +const langMap: Record = { 简体中文: "zh-cn", 繁体中文: "zh-tw", English: "en", @@ -117,7 +117,7 @@ const appStore = useAppStore(); const router = useRouter(); const curRegion = ref(appStore.server); const curRegionName = ref(annoServerList[0]); -const curLang = ref(appStore.lang); +const curLang = ref(appStore.lang); const curLangName = ref(langList[0]); // 数据 @@ -145,14 +145,12 @@ watch(curLangName, async (value) => { onMounted(async () => { await TGLogger.Info("[Announcements][onMounted] 打开公告页面"); - // 根据curRegion找到对应的curRegionName for (const key in annoServerMap) { if (annoServerMap[key] === curRegion.value) { curRegionName.value = key; break; } } - // 根据curLang找到对应的curLangName for (const key in langMap) { if (langMap[key] === curLang.value) { curLangName.value = key; @@ -167,6 +165,13 @@ async function loadData(): Promise { loading.value = true; annoData.value = await TGRequest.Anno.getList(curRegion.value, curLang.value); const listCards = TGUtils.Anno.getCard(annoData.value); + await Promise.all( + listCards.map(async (item) => { + // if (item.typeLabel === AnnoType.game) return; + const detail = await TGRequest.Anno.getContent(item.id, curRegion.value, "zh-cn"); + item.timeStr = getAnnoTime(detail.content); + }), + ); annoCards.value = { activity: listCards.filter((item) => item.typeLabel === AnnoType.activity), game: listCards.filter((item) => item.typeLabel === AnnoType.game), @@ -177,6 +182,44 @@ async function loadData(): Promise { }); } +interface AnnoTimeRegex { + actPermanent: RegExp; + actPersistent: RegExp; + actTransient: RegExp; + verUpdateTime: RegExp; +} + +const regexMap: AnnoTimeRegex = { + actPermanent: /(?:〓活动时间〓|〓任务开放时间〓).*?\d\.\d版本更新(?:完成|)后永久开放/, + actPersistent: /〓活动时间〓.*?\d\.\d版本期间持续开放/, + // (?:〓活动时间〓|祈愿时间|【上架时间】).*?(\d\.\d版本更新后).*?~.*?&lt;t class="t_(?:gl|lc)".*?&gt;(.*?)&lt;/t&gt; + actTransient: + /(?:〓活动时间〓|祈愿时间|【上架时间】).*?(\d\.\d版本更新后).*?~.*?(.*?)<\/t>/, + // 〓更新时间〓.+?&lt;t class=\"t_(?:gl|lc)\".*?&gt;(.*?)&lt;/t&gt; + verUpdateTime: /〓更新时间〓.+?(.*?)<\/t>gt;/, +}; + +function getAnnoTime(content: string): string { + if (content.match(regexMap.actPermanent)) { + console.log("actPermanent"); + return "永久开放"; + } + if (content.match(regexMap.actPersistent)) { + const res = content.match(regexMap.actPersistent); + console.log("actPersistent", res?.[0]); + return res?.[0].replace(/.*?(\d\.\d版本期间持续开放)/, "$1") ?? "持续开放"; + } + if (content.match(regexMap.actTransient)) { + console.log("actTransient"); + return "临时开放"; + } + if (content.match(regexMap.verUpdateTime)) { + console.log("verUpdateTime"); + return "版本更新"; + } + return "未知时间"; +} + function parseTitle(title: string): string { const div = document.createElement("div"); div.innerHTML = title; diff --git a/src/router/modules/sub.ts b/src/router/modules/sub.ts index 4504f80a..e25fc1cb 100644 --- a/src/router/modules/sub.ts +++ b/src/router/modules/sub.ts @@ -1,7 +1,7 @@ /** * @file router/modules/sub.ts * @description 子路由模块,用于二级窗口 - * @since Beta v0.4.3 + * @since Beta v0.4.4 */ const subRoutes = [ @@ -12,7 +12,7 @@ const subRoutes = [ component: async () => await import("../../views/t-anno.vue"), }, { - path: "/anno_detail_json/:anno_id", + path: "/anno_detail_json/:region/:anno_id/:lang", name: "游戏内公告(JSON)", component: async () => await import("../../views/t-anno-json.vue"), }, diff --git a/src/store/modules/app.ts b/src/store/modules/app.ts index 5e54fa78..d0e2c4d2 100644 --- a/src/store/modules/app.ts +++ b/src/store/modules/app.ts @@ -8,6 +8,7 @@ import { path } from "@tauri-apps/api"; import { defineStore } from "pinia"; import { reactive, ref } from "vue"; +import type { AnnoLang } from "../../pages/common/Announcements.vue"; import { getInitDeviceInfo } from "../../utils/toolFunc"; import { SERVER } from "../../web/request/getAnno"; @@ -47,7 +48,7 @@ export const useAppStore = defineStore( // 服务器 const server = ref(SERVER.CN_ISLAND); // 语言 - const lang = ref("zh-cn"); + const lang = ref("zh-cn"); // 最近的咨讯类型 const recentNewsType = ref("notice"); diff --git a/src/views/t-anno-json.vue b/src/views/t-anno-json.vue index df1e42f3..93df6b22 100644 --- a/src/views/t-anno-json.vue +++ b/src/views/t-anno-json.vue @@ -16,6 +16,8 @@ import { useRoute } from "vue-router"; import TSwitchTheme from "../components/app/t-switchTheme.vue"; import ToLoading from "../components/overlay/to-loading.vue"; +import { AnnoLang } from "../pages/common/Announcements.vue"; +import { SERVER } from "../web/request/getAnno"; import TGRequest from "../web/request/TGRequest"; // loading @@ -24,7 +26,10 @@ const loadingTitle = ref("正在加载"); const loadingEmpty = ref(false); // 数据 -const annoId = Number(useRoute().params.anno_id); +const route = useRoute(); +const annoId = Number(route.params.anno_id); +const region = route.params.region; +const lang = route.params.lang; let jsonList = reactive({}); let jsonContent = reactive({}); @@ -44,7 +49,7 @@ onMounted(async () => { return single.ann_id === annoId ? (jsonList = single) : null; }); }); - jsonContent = await TGRequest.Anno.getContent(annoId); + jsonContent = await TGRequest.Anno.getContent(annoId, region, lang); setTimeout(() => { loading.value = false; }, 200); diff --git a/src/views/t-anno.vue b/src/views/t-anno.vue index 309465a5..768294bf 100644 --- a/src/views/t-anno.vue +++ b/src/views/t-anno.vue @@ -28,6 +28,7 @@ import { useRoute } from "vue-router"; import TSwitchTheme from "../components/app/t-switchTheme.vue"; import TShareBtn from "../components/main/t-shareBtn.vue"; import ToLoading from "../components/overlay/to-loading.vue"; +import { AnnoLang } from "../pages/common/Announcements.vue"; import { useAppStore } from "../store/modules/app"; import TGLogger from "../utils/TGLogger"; import { saveImgLocal } from "../utils/TGShare"; @@ -48,9 +49,10 @@ const annoRef = ref({}); const annoTitle = ref(""); // 数据 -const annoId = Number(useRoute().params.anno_id); -const region = useRoute().params.region; -const lang = ref(useRoute().params.lang); +const route = useRoute(); +const annoId = Number(route.params.anno_id); +const region = route.params.region; +const lang = route.params.lang; const annoData = ref({}); const annoHtml = ref(); const annoBanner = ref(); @@ -67,7 +69,7 @@ onMounted(async () => { // 获取数据 loadingTitle.value = "正在获取数据..."; try { - annoData.value = await TGRequest.Anno.getContent(annoId, region, lang.value); + annoData.value = await TGRequest.Anno.getContent(annoId, region, lang); loadingTitle.value = "正在渲染数据..."; annoHtml.value = await TGUtils.Anno.parseContent(annoData.value.content); if (annoData.value.banner !== "") annoBanner.value = await saveImgLocal(annoData.value.banner); @@ -85,7 +87,7 @@ onMounted(async () => { } // 打开 json const isDev = useAppStore().devMode ?? false; - if (isDev) createAnnoJson(annoId); + if (isDev) createAnnoJson(annoId, region, lang); setTimeout(() => { loading.value = false; }, 200); @@ -102,9 +104,9 @@ watch(loadShare, (value) => { } }); -function createAnnoJson(annoId: number) { - const jsonPath = `/anno_detail_json/${annoId}`; - const jsonTitle = `Anno_${annoId}_JSON`; +function createAnnoJson(annoId: number, region: SERVER, lang: AnnoLang) { + const jsonPath = `/anno_detail_json/${region}/${annoId}/${lang}`; + const jsonTitle = `Anno_${region}_${annoId}_${lang}_JSON`; createTGWindow(jsonPath, "Dev_JSON", jsonTitle, 960, 720, false, false); } diff --git a/src/web/request/getAnno.ts b/src/web/request/getAnno.ts index 78375784..c8c5d25e 100644 --- a/src/web/request/getAnno.ts +++ b/src/web/request/getAnno.ts @@ -1,10 +1,12 @@ /** * @file web/request/getAnnouncement.ts * @description 获取游戏内公告 - * @since Beta v0.4.3 + * @since Beta v0.4.4 */ import { http } from "@tauri-apps/api"; +import type { AnnoLang } from "../../pages/common/Announcements.vue"; + export enum SERVER { CN_ISLAND = "cn_gf01", CN_TREE = "cn_qd01", @@ -16,12 +18,12 @@ export enum SERVER { /** * @description 获取游戏内公告参数 - * @since Beta v0.4.3 + * @since Beta v0.4.4 * @param {SERVER} region 服务器 * @param {string} lang 语言 * @returns {TGApp.BBS.Announcement.Params} */ -function getAnnoParams(region: SERVER, lang: string = "zh-cn"): TGApp.BBS.Announcement.Params { +function getAnnoParams(region: SERVER, lang: AnnoLang = "zh-cn"): TGApp.BBS.Announcement.Params { const params: TGApp.BBS.Announcement.Params = { game: "hk4e", game_biz: "hk4e_cn", @@ -44,12 +46,12 @@ function getAnnoParams(region: SERVER, lang: string = "zh-cn"): TGApp.BBS.Announ * @description 获取游戏内公告列表 * @since Beta v0.4.3 * @param {string} region 服务器 - * @param {string} lang 语言 + * @param {AnnoLang} lang 语言 * @returns {Promise} */ export async function getAnnoList( region: SERVER = SERVER.CN_ISLAND, - lang: string = "zh-cn", + lang: AnnoLang = "zh-cn", ): Promise { const params: TGApp.BBS.Announcement.Params = getAnnoParams(region, lang); let url = "https://hk4e-api.mihoyo.com/common/hk4e_cn/announcement/api/getAnnList"; @@ -69,13 +71,13 @@ export async function getAnnoList( * @since Beta v0.4.3 * @param {number} annId 公告 ID * @param {SERVER} region 服务器 - * @param {string} lang 语言 + * @param {AnnoLang} lang 语言 * @returns {Promise} */ export async function getAnnoContent( annId: number, region: SERVER, - lang: string = "zh-cn", + lang: AnnoLang = "zh-cn", ): Promise { const params: TGApp.BBS.Announcement.Params = getAnnoParams(region, lang); let url = "https://hk4e-api.mihoyo.com/common/hk4e_cn/announcement/api/getAnnContent";