From e1f0f2d2e0e16f9c59f979d7b7409ef0a25cbd02 Mon Sep 17 00:00:00 2001 From: BTMuli Date: Sat, 1 Apr 2023 22:36:59 +0800 Subject: [PATCH] =?UTF-8?q?feat(genshin):=20=E6=B8=B8=E6=88=8F=E5=86=85?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E8=8E=B7=E5=8F=96=E6=8F=92=E4=BB=B6=E8=8D=89?= =?UTF-8?q?=E5=88=9B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/plugins/Genshin/index.ts | 22 ++ src/plugins/Genshin/interface/announcement.ts | 209 ++++++++++++++++++ src/plugins/Genshin/interface/base.ts | 21 ++ src/plugins/Genshin/request/announcements.ts | 51 +++++ src/plugins/Genshin/request/base.ts | 11 + src/plugins/Genshin/utils/announcements.ts | 32 +++ 6 files changed, 346 insertions(+) create mode 100644 src/plugins/Genshin/index.ts create mode 100644 src/plugins/Genshin/interface/announcement.ts create mode 100644 src/plugins/Genshin/interface/base.ts create mode 100644 src/plugins/Genshin/request/announcements.ts create mode 100644 src/plugins/Genshin/request/base.ts create mode 100644 src/plugins/Genshin/utils/announcements.ts diff --git a/src/plugins/Genshin/index.ts b/src/plugins/Genshin/index.ts new file mode 100644 index 00000000..b2dfddb3 --- /dev/null +++ b/src/plugins/Genshin/index.ts @@ -0,0 +1,22 @@ +/** + * @file plugins Genshin index.ts + * @description Genshin plugin index + * @author BTMuli + * @since Alpha v0.1.1 + */ + +// Announcement +import { getAnnouncementList, getAnnouncementContent } from "./request/announcements"; +import { getAnnoCards } from "./utils/announcements"; + +const GenshinOper = { + Announcement: { + get: { + list: getAnnouncementList, + content: getAnnouncementContent, + }, + card: getAnnoCards, + }, +}; + +export default GenshinOper; diff --git a/src/plugins/Genshin/interface/announcement.ts b/src/plugins/Genshin/interface/announcement.ts new file mode 100644 index 00000000..2ae377c4 --- /dev/null +++ b/src/plugins/Genshin/interface/announcement.ts @@ -0,0 +1,209 @@ +/** + * @file plugins Genshin annoList.ts + * @description 原神游戏内公告列表接口 + * @author BTMuli + * @since Alpha v0.1.1 + */ + +import { Hk4eResponse } from "./base"; + +/** + * @description 原神游戏内公告列表返回 + * @since Alpha v0.1.1 + * @see ANNO_LIST_API + * @interface AnnoListResponse + * @extends Hk4eResponse + * @property {AnnoListData} data 公告数据 + * @return {AnnoListResponse} + */ +export interface AnnoListResponse extends Hk4eResponse { + data: AnnoListData; +} + +/** + * @description 原神游戏内公告内容返回 + * @since Alpha v0.1.1 + * @see ANNO_CONTENT_API + * @interface AnnoContentResponse + * @extends Hk4eResponse + * @property {AnnoContentData} data 公告数据 + * @return {AnnoContentResponse} + */ +export interface AnnoContentResponse extends Hk4eResponse { + data: AnnoContentData; +} + +/** + * @description 公告列表数据 + * @since Alpha v0.1.1 + * @interface AnnoListData + * @property {Announcement[]} list 公告列表 + * @property {number} total 公告总数 + * @property {AnnoTypeList[]} type_list 公告类型列表 + * @property {boolean} alert 是否有紧急公告 + * @property {number} alert_id 紧急公告 ID + * @property {number} time_zone 时区 + * @property {string} t 系统时间 + * @property {unknown[]} pic_list 图片列表 + * @property {number} pic_total 图片总数 + * @property {unknown[]} pic_type_list 图片类型列表 + * @property {boolean} pic_alert 是否有紧急图片 + * @property {number} pic_alert_id 紧急图片 ID + * @property {unknown} static_sign 静态签名 + * @return {AnnoListData} + */ +export interface AnnoListData { + list: Announcement[]; + total: number; + type_list: AnnoTypeList[]; + alert: boolean; + alert_id: number; + time_zone: number; + t: string; + pic_list: unknown[]; + pic_total: number; + pic_type_list: unknown[]; + pic_alert: boolean; + pic_alert_id: number; + static_sign: unknown; +} + +/** + * @description 公告内容数据 + * @since Alpha v0.1.1 + * @interface AnnoContentData + * @property {AnnoContentItem[]} list 公告列表 + * @property {number} total 公告总数 + * @property {unknown[]} pic_list 图片列表 + * @property {number} pic_total 图片总数 + * @return {AnnoContentData} + */ +export interface AnnoContentData { + list: AnnoContentItem[]; + total: number; + pic_list: unknown[]; + pic_total: number; +} + +/** + * @description 公告类型列表 + * @since Alpha v0.1.1 + * @interface AnnoTypeList + * @property {number} id 类型 ID + * @property {string} name 类型名称 + * @property {string} mi18n_name 类型名称 + * @return {AnnoTypeList} + */ +export interface AnnoTypeList { + id: number; + name: string; + mi18n_name: string; +} + +/** + * @description 公告 + * @since Alpha v0.1.1 + * @interface Announcement + * @property {AnnoListItem[]} list 公告列表 + * @property {number} type_id 类型 ID + * @property {string} type_label 类型标签 + * @return {Announcement} + */ +export interface Announcement { + list: AnnoListItem[]; + type_id: number; + type_label: string; +} + +/** + * @description 公告列表项 + * @since Alpha v0.1.1 + * @interface AnnoListItem + * @property {number} ann_id 公告 ID + * @property {string} title 公告标题 + * @property {string} subtitle 公告副标题 + * @property {string} banner 公告图片 + * @property {unknown} content 公告内容 + * @property {string} type_label 公告类型标签 + * @property {string} tag_label 公告标签 + * @property {string} tag_icon 公告标签图标 + * @property {number} login_alert 是否登录提示 + * @property {string} lang 公告语言 + * @property {string} start_time 公告开始时间 // "2023-03-01 07:00:00" + * @property {string} end_time 公告结束时间 // "2023-04-12 06:00:00" + * @property {number} type 公告类型 + * @property {number} remind 公告提醒 + * @property {number} alert 公告紧急 + * @property {string} tag_start_time 公告标签开始时间 // "2000-01-02 15:04:05" + * @property {string} tag_end_time 公告标签结束时间 // "2030-01-02 15:04:05" + * @property {number} remind_ver 公告提醒版本 + * @property {boolean} has_content 是否有内容 + * @property {boolean} extra_remind 是否有额外提醒 + * @return {AnnoListItem} + */ +export interface AnnoListItem { + ann_id: number; + title: string; + subtitle: string; + banner: string; + content: unknown; + type_label: string; + tag_label: string; + tag_icon: string; + login_alert: number; + lang: string; + start_time: string; + end_time: string; + type: number; + remind: number; + alert: number; + tag_start_time: string; + tag_end_time: string; + remind_ver: number; + has_content: boolean; + extra_remind: boolean; +} + +/** + * @description 公告内容列表 + * @since Alpha v0.1.1 + * @interface AnnoContentItem + * @property {number} ann_id 公告 ID + * @property {string} title 公告标题 + * @property {string} subtitle 公告副标题 + * @property {string} banner 公告图片 + * @property {string} content 公告内容为 HTML + * @property {string} lang 公告语言 + * @return {AnnoContentItem} + */ +export interface AnnoContentItem { + ann_id: number; + title: string; + subtitle: string; + banner: string; + content: string; + lang: string; +} + +/** + * @description 渲染用公告列表数据 + * @since Alpha v0.1.1 + * @interface AnnoListCard + * @property {number} id 公告 ID + * @property {string} title 公告标题 + * @property {string} subtitle 公告副标题 + * @property {string} banner 公告图片 + * @property {string} type_label 公告类型标签 + * @property {string} start_time 公告开始时间 + * @property {string} end_time 公告结束时间 + * @return {AnnoListCard} + */ +export interface AnnoListCard { + id: number; + title: string; + subtitle: string; + banner: string; + type_label: string; + start_time: string; + end_time: string; +} diff --git a/src/plugins/Genshin/interface/base.ts b/src/plugins/Genshin/interface/base.ts new file mode 100644 index 00000000..d8337e40 --- /dev/null +++ b/src/plugins/Genshin/interface/base.ts @@ -0,0 +1,21 @@ +/** + * @file plugins Genshin interface base.ts + * @description 原神插件基础接口 + * @author BTMuli + * @since Alpha v0.1.1 + */ + +/** + * @description Mys Response 统一接口,负责游戏内数据获取 + * @since Alpha v0.1.1 + * @interface Hk4eResponse + * @property {number} retcode 状态码 + * @property {string} message 状态信息 + * @property {any} data 数据 + * @return {Hk4eResponse} + */ +export interface Hk4eResponse { + retcode: number; + message: string; + data: any; +} diff --git a/src/plugins/Genshin/request/announcements.ts b/src/plugins/Genshin/request/announcements.ts new file mode 100644 index 00000000..4532115a --- /dev/null +++ b/src/plugins/Genshin/request/announcements.ts @@ -0,0 +1,51 @@ +/** + * @file plugins Genshin request announcements.ts + * @description 原神游戏内公告请求 + * @author BTMuli + * @since Alpha v0.1.1 + */ + +import { http } from "@tauri-apps/api"; +import { Hk4e_ANNO_API } from "./base"; +import { + AnnoListResponse, + AnnoContentResponse, + AnnoListData, + AnnoContentItem, +} from "../interface/announcement"; + +// 公告 API +const ANNO_LIST_API = `${Hk4e_ANNO_API}/getAnnList?`; +const ANNO_CONTENT_API = `${Hk4e_ANNO_API}/getAnnContent?`; +// 公告 Query +const ANNO_QUERY = + "game=hk4e&game_biz=hk4e_cn&lang=zh-cn&bundle_id=hk4e_cn&platform=pc®ion=cn_gf01&level=60&uid=500299765"; + +/** + * @description 获取游戏内公告列表 + * @since Alpha v0.1.1 + * @return {Promise} + */ +export async function getAnnouncementList(): Promise { + return await http + .fetch(`${ANNO_LIST_API}${ANNO_QUERY}`) + .then(res => res.data.data); +} + +/** + * @description 获取游戏内公告内容 + * @since Alpha v0.1.1 + * @param {number} ann_id 公告 ID + * @return {Promise} + */ +export async function getAnnouncementContent(ann_id: number): Promise { + const annoContents: AnnoContentItem[] = await http + .fetch(`${ANNO_CONTENT_API}${ANNO_QUERY}`) + .then(res => res.data.data.list); + const annoContent = annoContents.find(item => item.ann_id === ann_id); + if (annoContent) { + return annoContent; + } else { + throw new Error("公告内容不存在"); + } +} diff --git a/src/plugins/Genshin/request/base.ts b/src/plugins/Genshin/request/base.ts new file mode 100644 index 00000000..88465540 --- /dev/null +++ b/src/plugins/Genshin/request/base.ts @@ -0,0 +1,11 @@ +/** + * @file plugins Genshin request base.ts + * @description 游戏内数据请求的基础类 + * @author BTMuli + * @since Alpha v0.1.1 + */ + +// Hk4e API,目前先用这几个,后续有需要再加 +const Hk4e_API = "https://hk4e-api.mihoyo.com"; // 基础 API +export const Hk4e_ANNO_API = `${Hk4e_API}/common/hk4e_cn/announcement/api`; // 公告 API +export const Hk4e_Gacha_API = `${Hk4e_API}/event/gacha_info/api;`; // 卡池 API diff --git a/src/plugins/Genshin/utils/announcements.ts b/src/plugins/Genshin/utils/announcements.ts new file mode 100644 index 00000000..23e0d089 --- /dev/null +++ b/src/plugins/Genshin/utils/announcements.ts @@ -0,0 +1,32 @@ +/** + * @file plugins Genshin utils announcements.ts + * @description 原神游戏内公告工具 + * @author BTMuli + * @since Alpha v0.1.1 + */ + +import { AnnoListData, AnnoListCard, Announcement, AnnoListItem } from "../interface/announcement"; + +/** + * @description 将获取到的数据转为渲染用的卡片 + * @since Alpha v0.1.1 + * @param {AnnoListData} data 公告数据 + * @return {AnnoListCard[]} 渲染用的卡片 + */ +export function getAnnoCards(data: AnnoListData): AnnoListCard[] { + const cards: AnnoListCard[] = []; + data.list.map((annoList: Announcement) => { + return annoList.list.map((anno: AnnoListItem) => { + return cards.push({ + id: anno.ann_id, + title: anno.title, + subtitle: anno.subtitle, + banner: anno.banner, + type_label: anno.type_label, + start_time: anno.start_time, + end_time: anno.end_time, + }); + }); + }); + return cards; +}