🌱 完善类型,初步进行正则match #94

This commit is contained in:
目棃
2024-02-24 18:12:05 +08:00
parent c9fbddcf5d
commit 2509b488d2
6 changed files with 78 additions and 25 deletions

View File

@@ -79,7 +79,7 @@ const annoServerList: string[] = [
"国际服-港澳台服", "国际服-港澳台服",
]; ];
const langList: string[] = ["简体中文", "繁体中文", "English", "日本語"]; const langList: string[] = ["简体中文", "繁体中文", "English", "日本語"];
export type AnnoLang = "zh-cn" | "zh-tw" | "en" | "ja";
// 服务器列表 // 服务器列表
const annoServerMap: AnnoServerMap = { const annoServerMap: AnnoServerMap = {
"国服-官方服": SERVER.CN_ISLAND, "国服-官方服": SERVER.CN_ISLAND,
@@ -89,7 +89,7 @@ const annoServerMap: AnnoServerMap = {
"国际服-美服": SERVER.OS_USA, "国际服-美服": SERVER.OS_USA,
"国际服-港澳台服": SERVER.OS_CHT, "国际服-港澳台服": SERVER.OS_CHT,
}; };
const langMap: Record<string, string> = { const langMap: Record<string, AnnoLang> = {
简体中文: "zh-cn", 简体中文: "zh-cn",
繁体中文: "zh-tw", 繁体中文: "zh-tw",
English: "en", English: "en",
@@ -117,7 +117,7 @@ const appStore = useAppStore();
const router = useRouter(); const router = useRouter();
const curRegion = ref<SERVER>(appStore.server); const curRegion = ref<SERVER>(appStore.server);
const curRegionName = ref<string>(annoServerList[0]); const curRegionName = ref<string>(annoServerList[0]);
const curLang = ref<string>(appStore.lang); const curLang = ref<AnnoLang>(appStore.lang);
const curLangName = ref<string>(langList[0]); const curLangName = ref<string>(langList[0]);
// 数据 // 数据
@@ -145,14 +145,12 @@ watch(curLangName, async (value) => {
onMounted(async () => { onMounted(async () => {
await TGLogger.Info("[Announcements][onMounted] 打开公告页面"); await TGLogger.Info("[Announcements][onMounted] 打开公告页面");
// 根据curRegion找到对应的curRegionName
for (const key in annoServerMap) { for (const key in annoServerMap) {
if (annoServerMap[key] === curRegion.value) { if (annoServerMap[key] === curRegion.value) {
curRegionName.value = key; curRegionName.value = key;
break; break;
} }
} }
// 根据curLang找到对应的curLangName
for (const key in langMap) { for (const key in langMap) {
if (langMap[key] === curLang.value) { if (langMap[key] === curLang.value) {
curLangName.value = key; curLangName.value = key;
@@ -167,6 +165,13 @@ async function loadData(): Promise<void> {
loading.value = true; loading.value = true;
annoData.value = await TGRequest.Anno.getList(curRegion.value, curLang.value); annoData.value = await TGRequest.Anno.getList(curRegion.value, curLang.value);
const listCards = TGUtils.Anno.getCard(annoData.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 = { annoCards.value = {
activity: listCards.filter((item) => item.typeLabel === AnnoType.activity), activity: listCards.filter((item) => item.typeLabel === AnnoType.activity),
game: listCards.filter((item) => item.typeLabel === AnnoType.game), game: listCards.filter((item) => item.typeLabel === AnnoType.game),
@@ -177,6 +182,44 @@ async function loadData(): Promise<void> {
}); });
} }
interface AnnoTimeRegex {
actPermanent: RegExp;
actPersistent: RegExp;
actTransient: RegExp;
verUpdateTime: RegExp;
}
const regexMap: AnnoTimeRegex = {
actPermanent: /(?:〓活动时间〓|〓任务开放时间〓).*?\d\.\d版本更新(?:完成|)后永久开放/,
actPersistent: /〓活动时间〓.*?\d\.\d版本期间持续开放/,
// (?:〓活动时间〓|祈愿时间|【上架时间】).*?(\d\.\d版本更新后).*?~.*?&amp;lt;t class="t_(?:gl|lc)".*?&amp;gt;(.*?)&amp;lt;/t&amp;gt;
actTransient:
/(?:〓活动时间〓|祈愿时间|【上架时间】).*?(\d\.\d版本更新后).*?~.*?<t class="t_(?:gl|lc)".*?>(.*?)<\/t>/,
// 〓更新时间〓.+?&amp;lt;t class=\"t_(?:gl|lc)\".*?&amp;gt;(.*?)&amp;lt;/t&amp;gt;
verUpdateTime: /〓更新时间〓.+?<t class="t_(?:gl|lc)".*?>(.*?)<\/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 { function parseTitle(title: string): string {
const div = document.createElement("div"); const div = document.createElement("div");
div.innerHTML = title; div.innerHTML = title;

View File

@@ -1,7 +1,7 @@
/** /**
* @file router/modules/sub.ts * @file router/modules/sub.ts
* @description 子路由模块,用于二级窗口 * @description 子路由模块,用于二级窗口
* @since Beta v0.4.3 * @since Beta v0.4.4
*/ */
const subRoutes = [ const subRoutes = [
@@ -12,7 +12,7 @@ const subRoutes = [
component: async () => await import("../../views/t-anno.vue"), component: async () => await import("../../views/t-anno.vue"),
}, },
{ {
path: "/anno_detail_json/:anno_id", path: "/anno_detail_json/:region/:anno_id/:lang",
name: "游戏内公告JSON", name: "游戏内公告JSON",
component: async () => await import("../../views/t-anno-json.vue"), component: async () => await import("../../views/t-anno-json.vue"),
}, },

View File

@@ -8,6 +8,7 @@ import { path } from "@tauri-apps/api";
import { defineStore } from "pinia"; import { defineStore } from "pinia";
import { reactive, ref } from "vue"; import { reactive, ref } from "vue";
import type { AnnoLang } from "../../pages/common/Announcements.vue";
import { getInitDeviceInfo } from "../../utils/toolFunc"; import { getInitDeviceInfo } from "../../utils/toolFunc";
import { SERVER } from "../../web/request/getAnno"; import { SERVER } from "../../web/request/getAnno";
@@ -47,7 +48,7 @@ export const useAppStore = defineStore(
// 服务器 // 服务器
const server = ref<SERVER>(SERVER.CN_ISLAND); const server = ref<SERVER>(SERVER.CN_ISLAND);
// 语言 // 语言
const lang = ref<string>("zh-cn"); const lang = ref<AnnoLang>("zh-cn");
// 最近的咨讯类型 // 最近的咨讯类型
const recentNewsType = ref("notice"); const recentNewsType = ref("notice");

View File

@@ -16,6 +16,8 @@ import { useRoute } from "vue-router";
import TSwitchTheme from "../components/app/t-switchTheme.vue"; import TSwitchTheme from "../components/app/t-switchTheme.vue";
import ToLoading from "../components/overlay/to-loading.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"; import TGRequest from "../web/request/TGRequest";
// loading // loading
@@ -24,7 +26,10 @@ const loadingTitle = ref<string>("正在加载");
const loadingEmpty = ref<boolean>(false); const loadingEmpty = ref<boolean>(false);
// 数据 // 数据
const annoId = Number(useRoute().params.anno_id); const route = useRoute();
const annoId = Number(route.params.anno_id);
const region = <SERVER>route.params.region;
const lang = <AnnoLang>route.params.lang;
let jsonList = reactive({}); let jsonList = reactive({});
let jsonContent = reactive({}); let jsonContent = reactive({});
@@ -44,7 +49,7 @@ onMounted(async () => {
return single.ann_id === annoId ? (jsonList = single) : null; return single.ann_id === annoId ? (jsonList = single) : null;
}); });
}); });
jsonContent = await TGRequest.Anno.getContent(annoId); jsonContent = await TGRequest.Anno.getContent(annoId, region, lang);
setTimeout(() => { setTimeout(() => {
loading.value = false; loading.value = false;
}, 200); }, 200);

View File

@@ -28,6 +28,7 @@ import { useRoute } from "vue-router";
import TSwitchTheme from "../components/app/t-switchTheme.vue"; import TSwitchTheme from "../components/app/t-switchTheme.vue";
import TShareBtn from "../components/main/t-shareBtn.vue"; import TShareBtn from "../components/main/t-shareBtn.vue";
import ToLoading from "../components/overlay/to-loading.vue"; import ToLoading from "../components/overlay/to-loading.vue";
import { AnnoLang } from "../pages/common/Announcements.vue";
import { useAppStore } from "../store/modules/app"; import { useAppStore } from "../store/modules/app";
import TGLogger from "../utils/TGLogger"; import TGLogger from "../utils/TGLogger";
import { saveImgLocal } from "../utils/TGShare"; import { saveImgLocal } from "../utils/TGShare";
@@ -48,9 +49,10 @@ const annoRef = ref<HTMLElement>(<HTMLElement>{});
const annoTitle = ref<string>(""); const annoTitle = ref<string>("");
// 数据 // 数据
const annoId = Number(useRoute().params.anno_id); const route = useRoute();
const region = <SERVER>useRoute().params.region; const annoId = Number(route.params.anno_id);
const lang = ref<string>(<string>useRoute().params.lang); const region = <SERVER>route.params.region;
const lang = <AnnoLang>route.params.lang;
const annoData = ref<TGApp.BBS.Announcement.ContentItem>(<TGApp.BBS.Announcement.ContentItem>{}); const annoData = ref<TGApp.BBS.Announcement.ContentItem>(<TGApp.BBS.Announcement.ContentItem>{});
const annoHtml = ref<string>(); const annoHtml = ref<string>();
const annoBanner = ref<string>(); const annoBanner = ref<string>();
@@ -67,7 +69,7 @@ onMounted(async () => {
// 获取数据 // 获取数据
loadingTitle.value = "正在获取数据..."; loadingTitle.value = "正在获取数据...";
try { try {
annoData.value = await TGRequest.Anno.getContent(annoId, region, lang.value); annoData.value = await TGRequest.Anno.getContent(annoId, region, lang);
loadingTitle.value = "正在渲染数据..."; loadingTitle.value = "正在渲染数据...";
annoHtml.value = await TGUtils.Anno.parseContent(annoData.value.content); annoHtml.value = await TGUtils.Anno.parseContent(annoData.value.content);
if (annoData.value.banner !== "") annoBanner.value = await saveImgLocal(annoData.value.banner); if (annoData.value.banner !== "") annoBanner.value = await saveImgLocal(annoData.value.banner);
@@ -85,7 +87,7 @@ onMounted(async () => {
} }
// 打开 json // 打开 json
const isDev = useAppStore().devMode ?? false; const isDev = useAppStore().devMode ?? false;
if (isDev) createAnnoJson(annoId); if (isDev) createAnnoJson(annoId, region, lang);
setTimeout(() => { setTimeout(() => {
loading.value = false; loading.value = false;
}, 200); }, 200);
@@ -102,9 +104,9 @@ watch(loadShare, (value) => {
} }
}); });
function createAnnoJson(annoId: number) { function createAnnoJson(annoId: number, region: SERVER, lang: AnnoLang) {
const jsonPath = `/anno_detail_json/${annoId}`; const jsonPath = `/anno_detail_json/${region}/${annoId}/${lang}`;
const jsonTitle = `Anno_${annoId}_JSON`; const jsonTitle = `Anno_${region}_${annoId}_${lang}_JSON`;
createTGWindow(jsonPath, "Dev_JSON", jsonTitle, 960, 720, false, false); createTGWindow(jsonPath, "Dev_JSON", jsonTitle, 960, 720, false, false);
} }
</script> </script>

View File

@@ -1,10 +1,12 @@
/** /**
* @file web/request/getAnnouncement.ts * @file web/request/getAnnouncement.ts
* @description 获取游戏内公告 * @description 获取游戏内公告
* @since Beta v0.4.3 * @since Beta v0.4.4
*/ */
import { http } from "@tauri-apps/api"; import { http } from "@tauri-apps/api";
import type { AnnoLang } from "../../pages/common/Announcements.vue";
export enum SERVER { export enum SERVER {
CN_ISLAND = "cn_gf01", CN_ISLAND = "cn_gf01",
CN_TREE = "cn_qd01", CN_TREE = "cn_qd01",
@@ -16,12 +18,12 @@ export enum SERVER {
/** /**
* @description 获取游戏内公告参数 * @description 获取游戏内公告参数
* @since Beta v0.4.3 * @since Beta v0.4.4
* @param {SERVER} region 服务器 * @param {SERVER} region 服务器
* @param {string} lang 语言 * @param {string} lang 语言
* @returns {TGApp.BBS.Announcement.Params} * @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 = { const params: TGApp.BBS.Announcement.Params = {
game: "hk4e", game: "hk4e",
game_biz: "hk4e_cn", game_biz: "hk4e_cn",
@@ -44,12 +46,12 @@ function getAnnoParams(region: SERVER, lang: string = "zh-cn"): TGApp.BBS.Announ
* @description 获取游戏内公告列表 * @description 获取游戏内公告列表
* @since Beta v0.4.3 * @since Beta v0.4.3
* @param {string} region 服务器 * @param {string} region 服务器
* @param {string} lang 语言 * @param {AnnoLang} lang 语言
* @returns {Promise<TGApp.BBS.Announcement.ListData>} * @returns {Promise<TGApp.BBS.Announcement.ListData>}
*/ */
export async function getAnnoList( export async function getAnnoList(
region: SERVER = SERVER.CN_ISLAND, region: SERVER = SERVER.CN_ISLAND,
lang: string = "zh-cn", lang: AnnoLang = "zh-cn",
): Promise<TGApp.BBS.Announcement.ListData> { ): Promise<TGApp.BBS.Announcement.ListData> {
const params: TGApp.BBS.Announcement.Params = getAnnoParams(region, lang); const params: TGApp.BBS.Announcement.Params = getAnnoParams(region, lang);
let url = "https://hk4e-api.mihoyo.com/common/hk4e_cn/announcement/api/getAnnList"; 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 * @since Beta v0.4.3
* @param {number} annId 公告 ID * @param {number} annId 公告 ID
* @param {SERVER} region 服务器 * @param {SERVER} region 服务器
* @param {string} lang 语言 * @param {AnnoLang} lang 语言
* @returns {Promise<TGApp.BBS.Announcement.ContentItem>} * @returns {Promise<TGApp.BBS.Announcement.ContentItem>}
*/ */
export async function getAnnoContent( export async function getAnnoContent(
annId: number, annId: number,
region: SERVER, region: SERVER,
lang: string = "zh-cn", lang: AnnoLang = "zh-cn",
): Promise<TGApp.BBS.Announcement.ContentItem> { ): Promise<TGApp.BBS.Announcement.ContentItem> {
const params: TGApp.BBS.Announcement.Params = getAnnoParams(region, lang); const params: TGApp.BBS.Announcement.Params = getAnnoParams(region, lang);
let url = "https://hk4e-api.mihoyo.com/common/hk4e_cn/announcement/api/getAnnContent"; let url = "https://hk4e-api.mihoyo.com/common/hk4e_cn/announcement/api/getAnnContent";