rsshub
Version:
Make RSS Great Again!
533 lines (529 loc) • 15.2 kB
JavaScript
import { n as init_esm_shims, t as __dirname } from "./esm-shims-CzJ_djXG.mjs";
import { t as config } from "./config-C37vj7VH.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 art } from "./render-BQo6B4tL.mjs";
import { t as timezone } from "./timezone-D8cuwzTY.mjs";
import { t as config_not_found_default } from "./config-not-found-Dyp3RlZZ.mjs";
import path from "node:path";
//#region lib/routes/sdo/ff14risingstones/constant.ts
const REQUIRE_CONFIG = [{
name: "SDO_FF14RISINGSTONES",
description: "值为 Cookie 头中 ff14risingstones 值"
}, {
name: "SDO_UA",
description: "值为与在网页端获取 Cookie 时相匹配的 User-Agent 值"
}];
const API_URL = "https://apiff14risingstones.web.sdo.com/api";
const ORIGIN = "https://ff14risingstones.web.sdo.com";
const INDEX_URL = `${ORIGIN}/pc/index.html`;
const LOGO_URL = `${ORIGIN}/pc/favicon.ico`;
const PLAY_STYLE = {
"2": "采矿/园艺",
"3": "成就收集",
"4": "大型任务",
"5": "钓鱼",
"6": "多玛方城战",
"7": "房屋",
"8": "怪物狩猎",
"9": "集体动作",
"10": "角色扮演",
"11": "金碟游乐场",
"18": "练级",
"19": "休闲玩家",
"20": "硬核玩家",
"21": "主线",
"22": "赚钱",
"23": "武具投影",
"26": "乐器演奏",
"28": "聊天",
"29": "玩家自办活动",
"30": "迷宫挑战",
"31": "讨伐歼灭战",
"32": "玩家对战",
"33": "随机任务",
"34": "寻宝",
"35": "特殊迷宫探索",
"36": "特殊地图探索",
"37": "青魔法师",
"38": "开拓无人岛",
"39": "制作",
"41": "绝境战",
"42": "深层迷宫挑战"
};
const JOB = {
"1": "防护职业",
"3": "进攻职业",
"5": "治疗职业",
"6": "骑士",
"7": "战士",
"8": "暗黑骑士",
"9": "绝枪战士",
"10": "白魔法师",
"11": "占星术士",
"12": "学者",
"13": "贤者",
"14": "武僧",
"15": "龙骑士",
"16": "忍者",
"17": "武士",
"18": "钐镰客",
"19": "吟游诗人",
"20": "机工士",
"21": "舞者",
"22": "黑魔法师",
"23": "召唤师",
"24": "赤魔法师",
"25": "青魔法师",
"28": "近战职业",
"29": "远程物理",
"30": "远程魔法",
"32": "任意职业",
"33": "蝰蛇剑士",
"34": "绘灵法师"
};
const POST_PART = [
{
value: "34",
label: "冒险者行会"
},
{
value: "52",
label: "生活杂谈"
},
{
value: "38",
label: "同人创作"
},
{
value: "36",
label: "剧情讨论"
},
{
value: "51",
label: "建议和BUG反馈"
},
{
value: "37",
label: "游戏记录"
},
{
value: "35",
label: "举手提问"
},
{
value: "74",
label: "版务专区"
},
{
value: "75",
label: "官方讯息"
}
];
const STRAT_PART = [
{
label: "新手指引",
value: "1"
},
{
label: "副本攻略",
value: "2"
},
{
label: "战斗职业",
value: "3"
},
{
label: "PVP",
value: "4"
},
{
label: "生产采集",
value: "5"
},
{
label: "投影外观",
value: "6"
},
{
label: "房屋装修",
value: "7"
},
{
label: "骑士",
value: "8"
},
{
label: "武僧",
value: "9"
},
{
label: "战士",
value: "10"
},
{
label: "龙骑士",
value: "11"
},
{
label: "吟游诗人",
value: "12"
},
{
label: "白魔法师",
value: "13"
},
{
label: "黑魔法师",
value: "14"
},
{
label: "召唤师",
value: "15"
},
{
label: "学者",
value: "16"
},
{
label: "忍者",
value: "17"
},
{
label: "机工士",
value: "18"
},
{
label: "暗黑骑士",
value: "19"
},
{
label: "占星术士",
value: "20"
},
{
label: "武士",
value: "21"
},
{
label: "赤魔法师",
value: "22"
},
{
label: "青魔法师",
value: "23"
},
{
label: "绝枪战士",
value: "24"
},
{
label: "舞者",
value: "25"
},
{
label: "钐镰客",
value: "26"
},
{
label: "贤者",
value: "27"
},
{
label: "猫魅族",
value: "28"
},
{
label: "拉拉菲尔族",
value: "29"
},
{
label: "人族",
value: "30"
},
{
label: "精灵族",
value: "31"
},
{
label: "维埃拉族",
value: "32"
},
{
label: "敖龙族",
value: "59"
},
{
label: "硌狮族",
value: "60"
},
{
label: "鲁加族",
value: "61"
},
{
label: "无人岛",
value: "62"
},
{
label: "特殊场景探索",
value: "63"
},
{
label: "游戏资讯",
value: "64"
},
{
label: "内容考据",
value: "65"
},
{
label: "摄影截图",
value: "66"
},
{
label: "金碟游乐场",
value: "67"
},
{
label: "综合",
value: "68"
},
{
label: "其他",
value: "69"
},
{
label: "国际服资讯翻译",
value: "70"
},
{
label: "游戏资讯整理",
value: "71"
},
{
label: "其他",
value: "72"
}
];
const POST_TYPE = {
top: "置顶",
refine: "精华",
hot: "周热门"
};
let DynamicSource = /* @__PURE__ */ function(DynamicSource$1) {
DynamicSource$1[DynamicSource$1["General"] = 1] = "General";
DynamicSource$1[DynamicSource$1["Post"] = 2] = "Post";
DynamicSource$1[DynamicSource$1["Strat"] = 3] = "Strat";
DynamicSource$1[DynamicSource$1["NoviceNetwork"] = 5] = "NoviceNetwork";
DynamicSource$1[DynamicSource$1["Duty"] = 6] = "Duty";
DynamicSource$1[DynamicSource$1["FreeCompany"] = 7] = "FreeCompany";
DynamicSource$1[DynamicSource$1["RolePlay"] = 8] = "RolePlay";
DynamicSource$1[DynamicSource$1["Other"] = 9] = "Other";
return DynamicSource$1;
}({});
let NoviceNetworkIdentity = /* @__PURE__ */ function(NoviceNetworkIdentity$1) {
NoviceNetworkIdentity$1[NoviceNetworkIdentity$1["Mentor"] = 1] = "Mentor";
NoviceNetworkIdentity$1[NoviceNetworkIdentity$1["Sprout"] = 2] = "Sprout";
return NoviceNetworkIdentity$1;
}({});
//#endregion
//#region lib/routes/sdo/ff14risingstones/utils.ts
init_esm_shims();
function checkConfig() {
if (!config.sdo.ff14risingstones || !config.sdo.ua) throw new config_not_found_default("ff14risingstones RSS is disabled due to the lack of relevant config");
}
function request(url, options) {
return ofetch_default(url, {
...options,
headers: {
Cookie: `ff14risingstones=${config.sdo.ff14risingstones}`,
"User-Agent": config.sdo.ua,
...options?.headers
}
});
}
async function requestAPI(url, options) {
const response = await request(url, options);
if (response.code !== 1e4) throw new Error(response.msg);
return response.data;
}
async function generatePostFeeds(posts) {
return await Promise.all(posts.map(async (post) => {
const detail = await getPostsDetail(post.posts_id);
return {
title: `[${post.part_name}] ${post.title}`,
link: `${INDEX_URL}#/post/detail/${post.posts_id}`,
description: detail?.contentInfo.content,
pubDate: timezone(parseDate(post.created_at), 8),
updated: detail?.updated_at ? timezone(parseDate(detail.updated_at), 8) : void 0,
guid: `sdo/ff14risingstones/posts:${post.posts_id}`,
author: `${post.character_name}@${post.group_name}`
};
}));
}
async function generateDynamicFeeds(dynamics) {
return await Promise.all(dynamics.map(async (dynamic) => {
let title = `${dynamic.character_name}@${dynamic.group_name} ${dynamic.mask_content}`;
let link;
let description;
let detail = null;
switch (dynamic.from) {
case DynamicSource.Post:
case DynamicSource.Strat:
if (!dynamic.from_info) break;
title += dynamic.from_info.title;
link = `${INDEX_URL}#/post/detail/${dynamic.from_info.posts_id}`;
detail = await getPostsDetail(dynamic.from_info.posts_id);
description = detail?.contentInfo.content;
break;
case DynamicSource.NoviceNetwork:
if (!dynamic.from_info) break;
title += `[找${dynamic.from_info.identity === NoviceNetworkIdentity.Mentor ? "豆芽" : "导师"}] ${dynamic.from_info.title}`;
link = `${INDEX_URL}#/recruit/beginner?id=${dynamic.from_info.id}`;
detail = await getNoviceNetworkRecruitDetail(dynamic.from_info.id);
description = art(path.join(__dirname, "templates/novice-network-party-e9dacf9e.art"), {
detail_mask: dynamic.from_info.detail_mask,
styles: dynamic.from_info.style.map((i) => PLAY_STYLE[i]).join(","),
target: `${dynamic.from_info.target_area_name} ${dynamic.from_info.target_group_name ?? "全区"}`,
weekday_time: detail?.weekday_time,
weekend_time: detail?.weekend_time
});
break;
case DynamicSource.Duty:
if (!dynamic.from_info) break;
title += `[${dynamic.from_info.fb_type}] ${dynamic.from_info.fb_name}`;
link = `${INDEX_URL}#/recruit/party?id=${dynamic.from_info.id}`;
detail = await getDutiesRecruitDetail(dynamic.from_info.id);
description = art(path.join(__dirname, "templates/duties-party-67b1d959.art"), {
progress: dynamic.from_info.progress,
strategy: dynamic.from_info.strategy,
fb_name: dynamic.from_info.fb_name,
fb_time: dynamic.from_info.fb_time,
labelInfo: dynamic.from_info.labelInfo,
team_composition: dynamic.from_info.team_composition,
team_position: dynamic.from_info.team_position ? {
A: Object.keys(dynamic.from_info.team_position.A).filter((i) => dynamic.from_info.team_position.A[i] !== "0").map((i) => `${i}: ${JOB[dynamic.from_info.team_position.A[i]]}`).join(","),
B: Object.keys(dynamic.from_info.team_position.B).filter((i) => dynamic.from_info.team_position.B[i] !== "0").map((i) => `${i}: ${JOB[dynamic.from_info.team_position.B[i]]}`).join(","),
C: Object.keys(dynamic.from_info.team_position.C).filter((i) => dynamic.from_info.team_position.C[i] !== "0").map((i) => `${i}: ${JOB[dynamic.from_info.team_position.C[i]]}`).join(",")
} : null,
MT: JOB[dynamic.from_info.MT],
ST: JOB[dynamic.from_info.ST],
T: JOB[dynamic.from_info.T],
H: JOB[dynamic.from_info.H],
H1: JOB[dynamic.from_info.H1],
H2: JOB[dynamic.from_info.H2],
D1: JOB[dynamic.from_info.D1],
D2: JOB[dynamic.from_info.D2],
D3: JOB[dynamic.from_info.D3],
D4: JOB[dynamic.from_info.D4],
need_job: detail?.need_job.map((i) => JOB[i]).join(","),
team_detail_mask: detail?.team_detail_mask,
recruit_require_mask: detail?.recruit_require_mask,
strategy_desc_mask: detail?.strategy_desc_mask
});
break;
case DynamicSource.FreeCompany:
if (!dynamic.from_info) break;
title += `[部队招待] ${dynamic.from_info.guild_name} <${dynamic.from_info.guild_tag}>`;
link = `${INDEX_URL}#/recruit/guild/detail/${dynamic.from_info.id}`;
detail = await getFreeCompanyRecruitDetail(dynamic.from_info.id);
description = art(path.join(__dirname, "templates/fc-party-c69888ce.art"), {
cover_pic: dynamic.from_info.cover_pic,
guild_name: dynamic.from_info.guild_name,
guild_tag: dynamic.from_info.guild_tag,
labelInfo: dynamic.from_info.labelInfo,
area_name: dynamic.from_info.target_area_name,
group_name: dynamic.from_info.target_group_name,
active_member_num: dynamic.from_info.active_member_num,
target_recruit_num: dynamic.from_info.target_recruit_num,
weekday_time: dynamic.from_info.weekday_time,
weekend_time: dynamic.from_info.weekend_time,
guild_address: detail?.guild_address ?? "",
create_time: detail?.create_time ?? "",
foot_pic: detail?.foot_pic ?? "",
detail_mask: dynamic.from_info.detail_mask
});
break;
case DynamicSource.RolePlay:
if (!dynamic.from_info) break;
title += dynamic.from_info.rp_name;
link = `${INDEX_URL}#/recruit/roleplay/detail/${dynamic.from_info.id}`;
description = art(path.join(__dirname, "templates/rp-party-90271e34.art"), {
cover_pic: dynamic.from_info.cover_pic,
open_time: dynamic.from_info.open_time,
rp_type: `${dynamic.from_info.rp_type.map((i) => ({
"0": "无",
"1": "轻",
"2": "中",
"3": "重"
})[i]).join("/")}RP 元素`,
create_time: dynamic.from_info.create_time,
area: `${dynamic.from_info.rp_area_name} ${dynamic.from_info.rp_group_name}`,
address: dynamic.from_info.address,
custom_label: dynamic.from_info.custom_label,
profile: dynamic.from_info.profile,
detail_mask: dynamic.from_info.detail_mask
});
break;
case DynamicSource.Other:
if (!dynamic.from_info) break;
title += `[${dynamic.from_info.category_name}] ${dynamic.from_info.title}`;
link = `${INDEX_URL}#/recruit/others?id=${dynamic.from_info.id}`;
description = dynamic.from_info.detail_mask;
break;
default:
}
return {
title,
link,
pubDate: timezone(parseDate(dynamic.created_at), 8),
guid: `sdo/ff14risingstones/dynamics:${dynamic.id}`,
author: `${dynamic.character_name}@${dynamic.group_name}`,
description
};
}));
}
//#endregion
//#region lib/routes/sdo/ff14risingstones/api.ts
const getResently = async (uid) => await requestAPI(`${API_URL}/home/userInfo/getResently?uuid=${uid}`);
const getUserInfo = async (uid) => await requestAPI(`${API_URL}/home/userInfo/getUserInfo?uuid=${uid}`);
const getUserPosts = async (uid, type) => await requestAPI(`${API_URL}/home/userInfo/getUserPosts?uuid=${uid}&type=${type}`).then((res) => res.rows);
const getUserDynamic = async (uid) => await requestAPI(`${API_URL}/home/userInfo/getUserDynamic?uuid=${uid}`).then((res) => res.rows);
async function getPostsDetail(postID) {
try {
return await cache_default.tryGet(`sdo/ff14risingstones/post-detail:${postID}`, async () => await requestAPI(`${API_URL}/home/posts/postsDetail?id=${postID}`));
} catch {
return null;
}
}
async function getNoviceNetworkRecruitDetail(recruitID) {
try {
return await cache_default.tryGet(`sdo/ff14risingstones/novice-network-recruit-detail:${recruitID}`, async () => await requestAPI(`${API_URL}/home/recruit/getNeDetail?id=${recruitID}`));
} catch {
return null;
}
}
async function getDutiesRecruitDetail(recruitID) {
try {
return await cache_default.tryGet(`sdo/ff14risingstones/duties-recruit-detail:${recruitID}`, async () => await requestAPI(`${API_URL}/home/recruit/getRecruitFbDetail?id=${recruitID}`));
} catch {
return null;
}
}
async function getFreeCompanyRecruitDetail(recruitID) {
try {
return await cache_default.tryGet(`sdo/ff14risingstones/free-company-recruit-detail:${recruitID}`, async () => await requestAPI(`${API_URL}/home/recruit/getRecruitGuildDetail?id=${recruitID}`));
} catch {
return null;
}
}
async function getPosts(params) {
const searchParams = new URLSearchParams();
for (const [key, value] of Object.entries(params)) if (value !== void 0) searchParams.set(key, value.toString());
return await requestAPI(`${API_URL}/home/posts/postsList?${searchParams.toString()}`).then((res) => res.rows);
}
const getFollowDynamicList = async (limit) => await requestAPI(`${API_URL}/home/dynamic/getFollowDynamicList?limit=${limit}`).then((res) => res.rows);
//#endregion
export { getUserInfo as a, generateDynamicFeeds as c, LOGO_URL as d, POST_PART as f, STRAT_PART as h, getUserDynamic as i, generatePostFeeds as l, REQUIRE_CONFIG as m, getPosts as n, getUserPosts as o, POST_TYPE as p, getResently as r, checkConfig as s, getFollowDynamicList as t, INDEX_URL as u };