rsshub
Version:
Make RSS Great Again!
113 lines (109 loc) • 5.42 kB
JavaScript
import "./esm-shims-CzJ_djXG.mjs";
import "./config-C37vj7VH.mjs";
import "./dist-BInvbO1W.mjs";
import "./logger-Czu8UMNd.mjs";
import { t as ofetch_default } from "./ofetch-BIyrKU3Y.mjs";
import { t as parseDate } from "./parse-date-BrP7mxXf.mjs";
import { t as cache_default } from "./cache-Bo__VnGm.mjs";
import { t as timezone } from "./timezone-D8cuwzTY.mjs";
import { n as Parameter, r as SUPPORTED_LANGUAGES, t as Language } from "./constants-CvBdW0m_.mjs";
import * as cheerio from "cheerio";
//#region lib/routes/kurogames/wutheringwaves/utils.ts
/**
* Parse a number or a number as string.\
* **NOTE:** this may return `NaN` if the string is not a number or the value is `undefined` and no {@link fallback} is provided.
*/
const parseInteger = (value, fallback) => {
if (typeof value === "number") return value;
if (value === void 0) return fallback === void 0 ? NaN : fallback;
const parsed = Number.parseInt(value, 10);
if (fallback !== void 0 && Number.isNaN(parsed)) return fallback;
return parsed;
};
/** Type-guard to ensure {@link language} is a valid value of {@link SUPPORTED_LANGUAGES}. */
const isValidLanguage = (language) => SUPPORTED_LANGUAGES.includes(language);
/** Fetch the articles for a given language in a given category. */
const fetchArticles = (language) => {
if (language === Language.Chinese) return ofetch_default("https://media-cdn-mingchao.kurogame.com/akiwebsite/website2.0/json/G152/zh/ArticleMenu.json", { query: { t: Date.now() } });
return ofetch_default(`https://hw-media-cdn-mingchao.kurogame.com/akiwebsite/website2.0/json/G152/${language}/MainMenu.json`).then((data) => data.article);
};
/** Get the link to the article content. */
const getArticleContentLink = (language, articleId) => {
if (language === Language.Chinese) return `https://media-cdn-mingchao.kurogame.com/akiwebsite/website2.0/json/G152/zh/article/${articleId}.json`;
return `https://hw-media-cdn-mingchao.kurogame.com/akiwebsite/website2.0/json/G152/${language}/article/${articleId}.json`;
};
/** Get the link to an article from its ID. */
const getArticleLink = (language, articleId) => {
if (language === Language.Chinese) return `https://mc.kurogames.com/main/news/detail/${articleId}`;
return `https://wutheringwaves.kurogames.com/${language}/main/news/detail/${articleId}`;
};
/** Resolve the handler language from the {@link Language}. */
const getHandlerLanguage = (language) => {
switch (language) {
case Language.English: return "en";
case Language.Chinese: return "zh-CN";
case Language.ChineseTaiwan: return "zh-TW";
case Language.French: return "fr";
case Language.German: return "de";
case Language.Japanese: return "ja";
case Language.Korean: return "ko";
case Language.Spanish: return "es";
default: throw new Error(`Could not resolve handler language from "${language}"`);
}
};
//#endregion
//#region lib/routes/kurogames/wutheringwaves/news.ts
const route = {
path: `/wutheringwaves/news/:${Parameter.Language}?`,
categories: ["game"],
example: "/kurogames/wutheringwaves/news",
parameters: { [Parameter.Language]: "The language to use for the content. Default: `zh`." },
name: "鸣潮 — 游戏公告、新闻与活动",
radar: [{ source: ["mc.kurogames.com/m/main/news", "mc.kurogames.com/main"] }, {
title: "Wuthering Waves — Game announcements, news and events",
source: ["wutheringwaves.kurogames.com/en/main/news", "wutheringwaves.kurogames.com/en/main"]
}],
maintainers: ["goestav", "enpitsulin"],
description: `
Language codes for the \`${Parameter.Language}\` parameter:
| Language | Code |
|----------|--------------|
| English | en |
| 日本語 | jp |
| 한국어 | kr |
| 简体中文 | zh (default) |
| 繁體中文 | zh-tw |
| Español | es |
| Français | fr |
| Deutsch | de |
`,
async handler(ctx) {
const limitParam = ctx.req.query(Parameter.Limit);
const languageParam = ctx.req.param(Parameter.Language);
const limit = parseInteger(limitParam, 30);
const language = languageParam || Language.Chinese;
if (!isValidLanguage(language)) throw new TypeError(`Language parameter is not valid. Please use one of the following: ${SUPPORTED_LANGUAGES.join(", ")}`);
const filteredArticles = (await fetchArticles(language)).filter((a) => a.articleType !== 0).slice(0, limit);
const item = await Promise.all(filteredArticles.map((article) => {
const contentUrl = getArticleContentLink(language, article.articleId);
const item$1 = {
title: article.articleTitle,
pubDate: timezone(parseDate(article.createTime), 8),
link: getArticleLink(language, article.articleId)
};
return cache_default.tryGet(`wutheringwaves:${language}:${article.articleId}`, async () => {
const articleContent = (await ofetch_default(contentUrl, { query: { t: Date.now() } })).articleContent ?? "";
item$1.description = cheerio.load(articleContent).html() ?? article.articleDesc ?? "";
return item$1;
});
}));
return {
title: language === Language.Chinese ? "《鸣潮》— 游戏公告、新闻和活动" : "Wuthering Waves - Announcements, News and Events",
link: language === Language.Chinese ? "https://mc.kurogames.com/main#news" : `https://wutheringwaves.kurogames.com/${language}/main/#news`,
item,
language: getHandlerLanguage(language)
};
}
};
//#endregion
export { route };