rsshub 1.0.0-master.f9b85f5 → 1.0.0-master.f9c381a

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (166) hide show
  1. package/lib/config.ts +10 -0
  2. package/lib/middleware/cache.ts +4 -0
  3. package/lib/middleware/parameter.ts +1 -1
  4. package/lib/registry.ts +6 -2
  5. package/lib/routes/51cto/utils.ts +1 -1
  6. package/lib/routes/abc/index.ts +1 -1
  7. package/lib/routes/acgvinyl/namespace.ts +6 -0
  8. package/lib/routes/acgvinyl/news.ts +86 -0
  9. package/lib/routes/ally/rail.ts +1 -1
  10. package/lib/routes/anthropic/news.ts +13 -11
  11. package/lib/routes/apnews/mobile-api.ts +1 -1
  12. package/lib/routes/apnews/sitemap.ts +1 -1
  13. package/lib/routes/apple/apps.ts +2 -2
  14. package/lib/routes/apple/podcast.ts +58 -25
  15. package/lib/routes/bangumi.tv/group/reply.ts +1 -1
  16. package/lib/routes/bilibili/cache.ts +18 -2
  17. package/lib/routes/bilibili/dynamic.ts +31 -7
  18. package/lib/routes/bilibili/page.ts +1 -1
  19. package/lib/routes/bilibili/ranking.ts +23 -17
  20. package/lib/routes/bilibili/wasm-exec.ts +1 -1
  21. package/lib/routes/bilibili/weekly-recommend.ts +22 -6
  22. package/lib/routes/bjp/apod.ts +1 -1
  23. package/lib/routes/buaa/jiaowu.ts +1 -1
  24. package/lib/routes/bullionvault/gold-news.ts +3 -3
  25. package/lib/routes/cast/index.ts +1 -1
  26. package/lib/routes/coolapk/utils.ts +5 -4
  27. package/lib/routes/coolbuy/index.ts +106 -0
  28. package/lib/routes/{xinhuanet → coolbuy}/namespace.ts +3 -3
  29. package/lib/routes/coolbuy/templates/description.art +48 -0
  30. package/lib/routes/coolidge/film-guide.ts +60 -0
  31. package/lib/routes/coolidge/namespace.ts +7 -0
  32. package/lib/routes/coolidge/news.ts +65 -0
  33. package/lib/routes/coolidge/templates/description.art +4 -0
  34. package/lib/routes/copymanga/comic.ts +1 -1
  35. package/lib/routes/cpta/handler.ts +1 -1
  36. package/lib/routes/creative-comic/book.ts +1 -1
  37. package/lib/routes/daum/potplayer.ts +1 -1
  38. package/lib/routes/dockerhub/utils.ts +1 -1
  39. package/lib/routes/dora-world/article.ts +2 -2
  40. package/lib/routes/ehentai/ehapi.ts +3 -3
  41. package/lib/routes/eventbrite/events.ts +152 -0
  42. package/lib/routes/eventbrite/namespace.ts +7 -0
  43. package/lib/routes/github/activity.ts +1 -1
  44. package/lib/routes/google/jules.ts +63 -0
  45. package/lib/routes/gov/mem/namespace.ts +7 -0
  46. package/lib/routes/gov/mem/zfxxgkpt.ts +96 -0
  47. package/lib/routes/gov/mot/index.ts +158 -53
  48. package/lib/routes/hameln/chapter.ts +1 -1
  49. package/lib/routes/hpoi/banner-item.ts +28 -11
  50. package/lib/routes/hpoi/info.ts +1 -1
  51. package/lib/routes/huggingface/daily-papers.ts +1 -1
  52. package/lib/routes/hupu/index.ts +158 -74
  53. package/lib/routes/hupu/types.ts +163 -0
  54. package/lib/routes/hust/gs.ts +1 -1
  55. package/lib/routes/hust/mse.ts +1 -1
  56. package/lib/routes/huxiu/util.ts +2 -2
  57. package/lib/routes/infoq/presentations.ts +1 -1
  58. package/lib/routes/instagram/common-utils.ts +3 -3
  59. package/lib/routes/itch/devlog.ts +7 -3
  60. package/lib/routes/javbus/index.ts +1 -1
  61. package/lib/routes/javlibrary/utils.ts +1 -1
  62. package/lib/routes/jbma/namespace.ts +17 -0
  63. package/lib/routes/jbma/report.ts +473 -0
  64. package/lib/routes/jetbrains/comments.ts +1 -1
  65. package/lib/routes/jingzhengu/utils.ts +1 -1
  66. package/lib/routes/juejin/aicoding.ts +102 -0
  67. package/lib/routes/juejin/utils.ts +36 -51
  68. package/lib/routes/kakuyomu/works.ts +1 -1
  69. package/lib/routes/kemono/index.ts +2 -2
  70. package/lib/routes/komiic/comic.ts +1 -1
  71. package/lib/routes/koyso/index.ts +338 -0
  72. package/lib/routes/koyso/namespace.ts +9 -0
  73. package/lib/routes/koyso/templates/description.art +13 -0
  74. package/lib/routes/letterboxd/index.ts +65 -0
  75. package/lib/routes/letterboxd/namespace.ts +8 -0
  76. package/lib/routes/maccms/index.ts +1 -1
  77. package/lib/routes/mercari/util.ts +1 -1
  78. package/lib/routes/mingpao/index.ts +1 -1
  79. package/lib/routes/nankai/ai-notice.ts +142 -0
  80. package/lib/routes/nankai/graduate-notice.ts +162 -0
  81. package/lib/routes/natgeo/natgeo.ts +1 -0
  82. package/lib/routes/nhk/news-web-easy.ts +1 -1
  83. package/lib/routes/nicovideo/mylist.ts +39 -0
  84. package/lib/routes/nicovideo/types.ts +27 -0
  85. package/lib/routes/nicovideo/utils.ts +27 -1
  86. package/lib/routes/nikkei/cn/index.ts +1 -4
  87. package/lib/routes/now/news.ts +1 -1
  88. package/lib/routes/nytimes/index.ts +1 -1
  89. package/lib/routes/pixiv/novel-api/user-novels/sfw.ts +1 -1
  90. package/lib/routes/pixivision/utils.ts +1 -1
  91. package/lib/routes/pku/hr.ts +1 -1
  92. package/lib/routes/pku/scc/recruit.ts +1 -1
  93. package/lib/routes/producthunt/templates/description.art +2 -2
  94. package/lib/routes/producthunt/today.ts +17 -8
  95. package/lib/routes/ps/trophy.ts +1 -1
  96. package/lib/routes/pubscholar/utils.ts +14 -1
  97. package/lib/routes/qweather/3days.ts +14 -14
  98. package/lib/routes/qweather/now.ts +12 -10
  99. package/lib/routes/qweather/util.tsx +89 -0
  100. package/lib/routes/qwenlm/blog.ts +75 -0
  101. package/lib/routes/qwenlm/namespace.ts +6 -0
  102. package/lib/routes/radio-canada/latest.ts +30 -17
  103. package/lib/routes/ruc/ai.ts +1 -1
  104. package/lib/routes/ruc/hr.ts +1 -1
  105. package/lib/routes/samrdprc/index.ts +241 -0
  106. package/lib/routes/samrdprc/namespace.ts +1 -1
  107. package/lib/routes/sdo/ff14risingstones/api.ts +78 -0
  108. package/lib/routes/sdo/ff14risingstones/constant.ts +338 -0
  109. package/lib/routes/sdo/ff14risingstones/posts.ts +80 -0
  110. package/lib/routes/sdo/ff14risingstones/strats.ts +75 -0
  111. package/lib/routes/sdo/ff14risingstones/templates/duties-party.art +41 -0
  112. package/lib/routes/sdo/ff14risingstones/templates/fc-party.art +26 -0
  113. package/lib/routes/sdo/ff14risingstones/templates/novice-network-party.art +9 -0
  114. package/lib/routes/sdo/ff14risingstones/templates/rp-party.art +15 -0
  115. package/lib/routes/sdo/ff14risingstones/timeline.ts +31 -0
  116. package/lib/routes/sdo/ff14risingstones/types/dynamic.ts +50 -0
  117. package/lib/routes/sdo/ff14risingstones/types/index.ts +3 -0
  118. package/lib/routes/sdo/ff14risingstones/types/other.ts +57 -0
  119. package/lib/routes/sdo/ff14risingstones/types/party.ts +111 -0
  120. package/lib/routes/sdo/ff14risingstones/user-dynamics.ts +32 -0
  121. package/lib/routes/sdo/ff14risingstones/user-posts.ts +32 -0
  122. package/lib/routes/sdo/ff14risingstones/user-resently.ts +38 -0
  123. package/lib/routes/sdo/ff14risingstones/user-strats.ts +32 -0
  124. package/lib/routes/sdo/ff14risingstones/utils.ts +215 -0
  125. package/lib/routes/sdo/namespace.ts +7 -0
  126. package/lib/routes/showstart/utils.ts +1 -1
  127. package/lib/routes/sohu/mp.ts +1 -1
  128. package/lib/routes/sotwe/user.ts +1 -1
  129. package/lib/routes/surfshark/blog.ts +273 -77
  130. package/lib/routes/surfshark/templates/description.art +16 -4
  131. package/lib/routes/sustainabilitymag/articles.ts +1 -1
  132. package/lib/routes/syosetu/dev.ts +1 -1
  133. package/lib/routes/syosetu/ranking-isekai.ts +1 -1
  134. package/lib/routes/szse/disclosure/listed-notice.ts +44 -6
  135. package/lib/routes/telegram/channel-media.ts +249 -0
  136. package/lib/routes/telegram/channel.ts +5 -4
  137. package/lib/routes/telegram/stories.ts +130 -0
  138. package/lib/routes/telegram/tglib/channel.ts +136 -118
  139. package/lib/routes/telegram/tglib/client.ts +37 -139
  140. package/lib/routes/tesla/cx.ts +1 -1
  141. package/lib/routes/theverge/index.ts +20 -6
  142. package/lib/routes/threads/utils.ts +7 -3
  143. package/lib/routes/tidb/blog.ts +1 -1
  144. package/lib/routes/toutiao/user.ts +2 -2
  145. package/lib/routes/twitter/api/mobile-api/api.ts +1 -1
  146. package/lib/routes/txrjy/fornumtopic.ts +2 -2
  147. package/lib/routes/typst/universe.ts +1 -1
  148. package/lib/routes/uber/blog.ts +87 -46
  149. package/lib/routes/weibo/utils.ts +17 -9
  150. package/lib/routes/xiaohongshu/user.ts +1 -1
  151. package/lib/routes/xjtu/ee-jzxx.ts +1 -1
  152. package/lib/routes/yahoo/news/utils.ts +1 -1
  153. package/lib/routes/ymgal/article.ts +1 -1
  154. package/lib/routes/yoasobi-music/media.ts +1 -1
  155. package/lib/routes/youtube/api/youtubei.ts +1 -1
  156. package/lib/routes/youtube/community.ts +4 -4
  157. package/lib/routes/zaker/utils.ts +1 -1
  158. package/lib/routes/zaobao/util.tsx +1 -1
  159. package/lib/server.ts +1 -1
  160. package/lib/types.ts +1 -1
  161. package/lib/utils/puppeteer-utils.test.ts +2 -2
  162. package/lib/views/index.tsx +4 -4
  163. package/package.json +40 -40
  164. package/lib/routes/qweather/templates/3days.art +0 -22
  165. package/lib/routes/qweather/templates/now.art +0 -16
  166. package/lib/routes/xinhuanet/app.ts +0 -109
@@ -0,0 +1,78 @@
1
+ import cache from '@/utils/cache';
2
+ import { API_URL } from './constant';
3
+ import type { DutiesPartyDetail, FreeCompanyPartyDetail, NoviceNetworkParty, PostDetail, Resently, UserDynamic, UserInfo, UserPost } from './types';
4
+ import { requestAPI } from './utils';
5
+
6
+ // 获取用户游戏近况
7
+ export const getResently = async (uid: string) => await requestAPI<Resently[]>(`${API_URL}/home/userInfo/getResently?uuid=${uid}`);
8
+
9
+ // 获取用户信息
10
+ export const getUserInfo = async (uid: string) => await requestAPI<UserInfo>(`${API_URL}/home/userInfo/getUserInfo?uuid=${uid}`);
11
+
12
+ // 获取用户帖子
13
+ export const getUserPosts = async (uid: string, type: 1 | 2) =>
14
+ await requestAPI<{
15
+ rows: UserPost[];
16
+ }>(`${API_URL}/home/userInfo/getUserPosts?uuid=${uid}&type=${type}`).then((res) => res.rows);
17
+
18
+ // 获取用户动态
19
+ export const getUserDynamic = async (uid: string) =>
20
+ await requestAPI<{
21
+ rows: UserDynamic[];
22
+ }>(`${API_URL}/home/userInfo/getUserDynamic?uuid=${uid}`).then((res) => res.rows);
23
+
24
+ // 获取帖子详情
25
+ export async function getPostsDetail(postID: string) {
26
+ try {
27
+ return await cache.tryGet(`sdo/ff14risingstones/post-detail:${postID}`, async () => await requestAPI<PostDetail>(`${API_URL}/home/posts/postsDetail?id=${postID}`));
28
+ } catch {
29
+ return null;
30
+ }
31
+ }
32
+
33
+ // 获取导芽招募详情
34
+ export async function getNoviceNetworkRecruitDetail(recruitID: number) {
35
+ try {
36
+ return await cache.tryGet(`sdo/ff14risingstones/novice-network-recruit-detail:${recruitID}`, async () => await requestAPI<NoviceNetworkParty>(`${API_URL}/home/recruit/getNeDetail?id=${recruitID}`));
37
+ } catch {
38
+ return null;
39
+ }
40
+ }
41
+
42
+ // 获取副本招募详情
43
+ export async function getDutiesRecruitDetail(recruitID: number) {
44
+ try {
45
+ return await cache.tryGet(`sdo/ff14risingstones/duties-recruit-detail:${recruitID}`, async () => await requestAPI<DutiesPartyDetail>(`${API_URL}/home/recruit/getRecruitFbDetail?id=${recruitID}`));
46
+ } catch {
47
+ return null;
48
+ }
49
+ }
50
+
51
+ // 获取部队招募详情
52
+ export async function getFreeCompanyRecruitDetail(recruitID: number) {
53
+ try {
54
+ return await cache.tryGet(`sdo/ff14risingstones/free-company-recruit-detail:${recruitID}`, async () => await requestAPI<FreeCompanyPartyDetail>(`${API_URL}/home/recruit/getRecruitGuildDetail?id=${recruitID}`));
55
+ } catch {
56
+ return null;
57
+ }
58
+ }
59
+
60
+ // 获取帖文列表
61
+ export async function getPosts(params: { type: 1 | 2; is_top?: 0 | 1; is_refine?: 0 | 1; limit?: number | string; order?: string; hotType?: string; part_id?: string }) {
62
+ const searchParams = new URLSearchParams();
63
+ for (const [key, value] of Object.entries(params)) {
64
+ if (value !== undefined) {
65
+ searchParams.set(key, value.toString());
66
+ }
67
+ }
68
+
69
+ return await requestAPI<{
70
+ rows: UserPost[];
71
+ }>(`${API_URL}/home/posts/postsList?${searchParams.toString()}`).then((res) => res.rows);
72
+ }
73
+
74
+ // 获取用户关注动态
75
+ export const getFollowDynamicList = async (limit: number | string) =>
76
+ await requestAPI<{
77
+ rows: UserDynamic[];
78
+ }>(`${API_URL}/home/dynamic/getFollowDynamicList?limit=${limit}`).then((res) => res.rows);
@@ -0,0 +1,338 @@
1
+ import type { Route } from '@/types';
2
+
3
+ export const REQUIRE_CONFIG: NonNullable<Route['features']>['requireConfig'] = [
4
+ {
5
+ name: 'SDO_FF14RISINGSTONES',
6
+ description: '值为 Cookie 头中 ff14risingstones 值',
7
+ },
8
+ {
9
+ // https://github.com/StarHeartHunt/ff14risingstone_sign_task/issues/17
10
+ name: 'SDO_UA',
11
+ description: '值为与在网页端获取 Cookie 时相匹配的 User-Agent 值',
12
+ },
13
+ ];
14
+
15
+ export const API_URL = 'https://apiff14risingstones.web.sdo.com/api';
16
+
17
+ export const ORIGIN = 'https://ff14risingstones.web.sdo.com';
18
+ export const INDEX_URL = `${ORIGIN}/pc/index.html`;
19
+
20
+ export const LOGO_URL = `${ORIGIN}/pc/favicon.ico`;
21
+
22
+ // source: /api/home/recruit/styleConfigList
23
+ export const PLAY_STYLE = {
24
+ '2': '采矿/园艺',
25
+ '3': '成就收集',
26
+ '4': '大型任务',
27
+ '5': '钓鱼',
28
+ '6': '多玛方城战',
29
+ '7': '房屋',
30
+ '8': '怪物狩猎',
31
+ '9': '集体动作',
32
+ '10': '角色扮演',
33
+ '11': '金碟游乐场',
34
+ '18': '练级',
35
+ '19': '休闲玩家',
36
+ '20': '硬核玩家',
37
+ '21': '主线',
38
+ '22': '赚钱',
39
+ '23': '武具投影',
40
+ '26': '乐器演奏',
41
+ '28': '聊天',
42
+ '29': '玩家自办活动',
43
+ '30': '迷宫挑战',
44
+ '31': '讨伐歼灭战',
45
+ '32': '玩家对战',
46
+ '33': '随机任务',
47
+ '34': '寻宝',
48
+ '35': '特殊迷宫探索',
49
+ '36': '特殊地图探索',
50
+ '37': '青魔法师',
51
+ '38': '开拓无人岛',
52
+ '39': '制作',
53
+ '41': '绝境战',
54
+ '42': '深层迷宫挑战',
55
+ };
56
+
57
+ // source: /api/home/recruit/getJobConfigList
58
+ export const JOB = {
59
+ '1': '防护职业',
60
+ '3': '进攻职业',
61
+ '5': '治疗职业',
62
+ '6': '骑士',
63
+ '7': '战士',
64
+ '8': '暗黑骑士',
65
+ '9': '绝枪战士',
66
+ '10': '白魔法师',
67
+ '11': '占星术士',
68
+ '12': '学者',
69
+ '13': '贤者',
70
+ '14': '武僧',
71
+ '15': '龙骑士',
72
+ '16': '忍者',
73
+ '17': '武士',
74
+ '18': '钐镰客',
75
+ '19': '吟游诗人',
76
+ '20': '机工士',
77
+ '21': '舞者',
78
+ '22': '黑魔法师',
79
+ '23': '召唤师',
80
+ '24': '赤魔法师',
81
+ '25': '青魔法师',
82
+ '28': '近战职业',
83
+ '29': '远程物理',
84
+ '30': '远程魔法',
85
+ '32': '任意职业',
86
+ '33': '蝰蛇剑士',
87
+ '34': '绘灵法师',
88
+ };
89
+
90
+ // source: /api/home/posts/partList type = 1
91
+ export const POST_PART = [
92
+ {
93
+ value: '34',
94
+ label: '冒险者行会',
95
+ },
96
+ {
97
+ value: '52',
98
+ label: '生活杂谈',
99
+ },
100
+ {
101
+ value: '38',
102
+ label: '同人创作',
103
+ },
104
+ {
105
+ value: '36',
106
+ label: '剧情讨论',
107
+ },
108
+ {
109
+ value: '51',
110
+ label: '建议和BUG反馈',
111
+ },
112
+ {
113
+ value: '37',
114
+ label: '游戏记录',
115
+ },
116
+ {
117
+ value: '35',
118
+ label: '举手提问',
119
+ },
120
+ {
121
+ value: '74',
122
+ label: '版务专区',
123
+ },
124
+ {
125
+ value: '75',
126
+ label: '官方讯息',
127
+ },
128
+ ];
129
+
130
+ // source: /api/home/posts/partList type = 2
131
+ export const STRAT_PART = [
132
+ {
133
+ label: '新手指引',
134
+ value: '1',
135
+ },
136
+ {
137
+ label: '副本攻略',
138
+ value: '2',
139
+ },
140
+ {
141
+ label: '战斗职业',
142
+ value: '3',
143
+ },
144
+ {
145
+ label: 'PVP',
146
+ value: '4',
147
+ },
148
+ {
149
+ label: '生产采集',
150
+ value: '5',
151
+ },
152
+ {
153
+ label: '投影外观',
154
+ value: '6',
155
+ },
156
+ {
157
+ label: '房屋装修',
158
+ value: '7',
159
+ },
160
+ {
161
+ label: '骑士',
162
+ value: '8',
163
+ },
164
+ {
165
+ label: '武僧',
166
+ value: '9',
167
+ },
168
+ {
169
+ label: '战士',
170
+ value: '10',
171
+ },
172
+ {
173
+ label: '龙骑士',
174
+ value: '11',
175
+ },
176
+ {
177
+ label: '吟游诗人',
178
+ value: '12',
179
+ },
180
+ {
181
+ label: '白魔法师',
182
+ value: '13',
183
+ },
184
+ {
185
+ label: '黑魔法师',
186
+ value: '14',
187
+ },
188
+ {
189
+ label: '召唤师',
190
+ value: '15',
191
+ },
192
+ {
193
+ label: '学者',
194
+ value: '16',
195
+ },
196
+ {
197
+ label: '忍者',
198
+ value: '17',
199
+ },
200
+ {
201
+ label: '机工士',
202
+ value: '18',
203
+ },
204
+ {
205
+ label: '暗黑骑士',
206
+ value: '19',
207
+ },
208
+ {
209
+ label: '占星术士',
210
+ value: '20',
211
+ },
212
+ {
213
+ label: '武士',
214
+ value: '21',
215
+ },
216
+ {
217
+ label: '赤魔法师',
218
+ value: '22',
219
+ },
220
+ {
221
+ label: '青魔法师',
222
+ value: '23',
223
+ },
224
+ {
225
+ label: '绝枪战士',
226
+ value: '24',
227
+ },
228
+ {
229
+ label: '舞者',
230
+ value: '25',
231
+ },
232
+ {
233
+ label: '钐镰客',
234
+ value: '26',
235
+ },
236
+ {
237
+ label: '贤者',
238
+ value: '27',
239
+ },
240
+ {
241
+ label: '猫魅族',
242
+ value: '28',
243
+ },
244
+ {
245
+ label: '拉拉菲尔族',
246
+ value: '29',
247
+ },
248
+ {
249
+ label: '人族',
250
+ value: '30',
251
+ },
252
+ {
253
+ label: '精灵族',
254
+ value: '31',
255
+ },
256
+ {
257
+ label: '维埃拉族',
258
+ value: '32',
259
+ },
260
+ {
261
+ label: '敖龙族',
262
+ value: '59',
263
+ },
264
+ {
265
+ label: '硌狮族',
266
+ value: '60',
267
+ },
268
+ {
269
+ label: '鲁加族',
270
+ value: '61',
271
+ },
272
+ {
273
+ label: '无人岛',
274
+ value: '62',
275
+ },
276
+ {
277
+ label: '特殊场景探索',
278
+ value: '63',
279
+ },
280
+ {
281
+ label: '游戏资讯',
282
+ value: '64',
283
+ },
284
+ {
285
+ label: '内容考据',
286
+ value: '65',
287
+ },
288
+ {
289
+ label: '摄影截图',
290
+ value: '66',
291
+ },
292
+ {
293
+ label: '金碟游乐场',
294
+ value: '67',
295
+ },
296
+ {
297
+ label: '综合',
298
+ value: '68',
299
+ },
300
+ {
301
+ label: '其他',
302
+ value: '69',
303
+ },
304
+ {
305
+ label: '国际服资讯翻译',
306
+ value: '70',
307
+ },
308
+ {
309
+ label: '游戏资讯整理',
310
+ value: '71',
311
+ },
312
+ {
313
+ label: '其他',
314
+ value: '72',
315
+ },
316
+ ];
317
+
318
+ export const POST_TYPE = {
319
+ top: '置顶',
320
+ refine: '精华',
321
+ hot: '周热门',
322
+ };
323
+
324
+ export enum DynamicSource {
325
+ General = 1,
326
+ Post = 2,
327
+ Strat = 3,
328
+ NoviceNetwork = 5,
329
+ Duty = 6,
330
+ FreeCompany = 7,
331
+ RolePlay = 8,
332
+ Other = 9,
333
+ }
334
+
335
+ export enum NoviceNetworkIdentity {
336
+ Mentor = 1,
337
+ Sprout = 2,
338
+ }
@@ -0,0 +1,80 @@
1
+ import type { Route } from '@/types';
2
+ import { INDEX_URL, LOGO_URL, POST_PART, POST_TYPE, REQUIRE_CONFIG } from './constant';
3
+ import type { Context } from 'hono';
4
+ import { checkConfig, generatePostFeeds } from './utils';
5
+ import { getPosts } from './api';
6
+
7
+ export const route: Route = {
8
+ path: '/ff14risingstones/posts/:pid?/:type?',
9
+ example: '/sdo/ff14risingstones/posts/all/hot',
10
+ name: '帖子',
11
+ categories: ['bbs'],
12
+ maintainers: ['KarasuShin'],
13
+ features: {
14
+ requireConfig: REQUIRE_CONFIG,
15
+ },
16
+ parameters: {
17
+ pid: {
18
+ description: '分区id,默认显示所有分区,可通过 `,` 拼接多个分区 id 进行筛选',
19
+ default: 'all',
20
+ options: [
21
+ {
22
+ label: '全部',
23
+ value: 'all',
24
+ },
25
+ ...POST_PART,
26
+ ],
27
+ },
28
+ type: {
29
+ description: '帖文类型,默认不做筛选',
30
+ options: [
31
+ {
32
+ label: '置顶',
33
+ value: 'top',
34
+ },
35
+ {
36
+ label: '精华',
37
+ value: 'refine',
38
+ },
39
+ {
40
+ label: '周热门',
41
+ value: 'hot',
42
+ },
43
+ ],
44
+ },
45
+ },
46
+ handler,
47
+ };
48
+
49
+ async function handler(ctx: Context) {
50
+ checkConfig();
51
+
52
+ const limit = ctx.req.query('limit') || 20;
53
+
54
+ const pid =
55
+ ctx.req
56
+ .param('pid')
57
+ ?.split(',')
58
+ .filter((i) => POST_PART.some((part) => part.value === i)) ?? [];
59
+
60
+ const type = ctx.req.param('type');
61
+
62
+ const postPart = pid.length ? pid.map((i) => POST_PART.find((p) => p.value === i)?.label).join(',') : '';
63
+
64
+ const posts = await getPosts({
65
+ type: 1,
66
+ limit,
67
+ order: 'latest',
68
+ hotType: type === 'hot' ? 'postsHotWeek' : 'postsHotNow',
69
+ is_refine: type === 'refine' ? 1 : 0,
70
+ is_top: type === 'top' ? 1 : 0,
71
+ part_id: pid.length ? pid.join(',') : undefined,
72
+ });
73
+
74
+ return {
75
+ title: `石之家 - ${POST_TYPE[type] ?? ''}帖文${postPart ? ` - ${postPart}` : ''}`,
76
+ link: `${INDEX_URL}#/post`,
77
+ image: LOGO_URL,
78
+ item: await generatePostFeeds(posts),
79
+ };
80
+ }
@@ -0,0 +1,75 @@
1
+ import type { Route } from '@/types';
2
+ import { INDEX_URL, LOGO_URL, POST_TYPE, REQUIRE_CONFIG, STRAT_PART } from './constant';
3
+ import type { Context } from 'hono';
4
+ import { checkConfig, generatePostFeeds } from './utils';
5
+ import { getPosts } from './api';
6
+
7
+ export const route: Route = {
8
+ path: '/ff14risingstones/strats/:pid?/:type?',
9
+ example: '/sdo/ff14risingstones/strats/1,2/refine',
10
+ name: '攻略',
11
+ categories: ['bbs'],
12
+ maintainers: ['KarasuShin'],
13
+ features: {
14
+ requireConfig: REQUIRE_CONFIG,
15
+ },
16
+ parameters: {
17
+ pid: {
18
+ description: '分区id,默认显示所有分区,可通过 `,` 拼接多个分区 id 进行筛选',
19
+ default: 'all',
20
+ options: [
21
+ {
22
+ label: '全部',
23
+ value: 'all',
24
+ },
25
+ ...STRAT_PART,
26
+ ],
27
+ },
28
+ type: {
29
+ description: '攻略类型,默认不做筛选',
30
+ options: [
31
+ {
32
+ label: '置顶',
33
+ value: 'top',
34
+ },
35
+ {
36
+ label: '精华',
37
+ value: 'refine',
38
+ },
39
+ ],
40
+ },
41
+ },
42
+ handler,
43
+ };
44
+
45
+ async function handler(ctx: Context) {
46
+ checkConfig();
47
+
48
+ const limit = ctx.req.query('limit') || 20;
49
+
50
+ const pid =
51
+ ctx.req
52
+ .param('pid')
53
+ ?.split(',')
54
+ .filter((i) => STRAT_PART.some((part) => part.value === i)) ?? [];
55
+
56
+ const type = ctx.req.param('type');
57
+
58
+ const stratPart = pid.length ? pid.map((i) => STRAT_PART.find((p) => p.value === i)?.label).join(',') : '';
59
+
60
+ const posts = await getPosts({
61
+ type: 2,
62
+ limit,
63
+ order: 'latest',
64
+ is_refine: type === 'refine' ? 1 : 0,
65
+ is_top: type === 'top' ? 1 : 0,
66
+ part_id: pid.length ? pid.join(',') : undefined,
67
+ });
68
+
69
+ return {
70
+ title: `石之家 - ${POST_TYPE[type] ?? ''}攻略${stratPart ? ` - ${stratPart}` : ''}`,
71
+ link: `${INDEX_URL}#/strat`,
72
+ image: LOGO_URL,
73
+ item: await generatePostFeeds(posts),
74
+ };
75
+ }
@@ -0,0 +1,41 @@
1
+ <div>
2
+ <p>进度:{{ progress }}</p>
3
+ <p>攻略:{{ strategy }}</p>
4
+ <p>时间:{{ fb_time }}</p>
5
+ <p>标签:{{ labelInfo.map(i => i.name).join(',') }}</p>
6
+ {{ if team_composition === '团队' }}
7
+ <p>队伍构成</P>
8
+ <p>A队:{{ team_position.A }}</p>
9
+ <p>B队:{{ team_position.B }}</p>
10
+ <p>C队:{{ team_position.C }}</p>
11
+ {{ else if team_composition === '满编小队' }}
12
+ <p>队伍构成</p>
13
+ <p>MT:{{ MT }}</p>
14
+ <p>ST:{{ ST }}</p>
15
+ <p>H1:{{ H1 }}</p>
16
+ <p>H2:{{ H2 }}</p>
17
+ <p>D1:{{ D1 }}</p>
18
+ <p>D2:{{ D2 }}</p>
19
+ <p>D3:{{ D3 }}</p>
20
+ <p>D4:{{ D4 }}</p>
21
+ {{ else if team_composition === '轻锐小队' }}
22
+ <p>队伍构成</p>
23
+ <p>T:{{ T }}</p>
24
+ <p>H:{{ H }}</p>
25
+ <p>D1:{{ D1 }}</p>
26
+ <p>D2:{{ D2 }}</p>
27
+ {{ /if }}
28
+
29
+ {{ if need_job }}
30
+ <p>需求职业:{{ need_job }}</P>
31
+ {{ /if }}
32
+ {{ if team_detail_mask }}
33
+ <p>队伍详情:{{ team_detail_mask }}</p>
34
+ {{ /if }}
35
+ {{ if recruit_require_mask }}
36
+ <p>招募要求:{{ recruit_require_mask }}</p>
37
+ {{ /if }}
38
+ {{ if strategy_desc_mask }}
39
+ <p>攻略说明:{{ strategy_desc_mask }}</p>
40
+ {{ /if }}
41
+ </div>
@@ -0,0 +1,26 @@
1
+ {{ if cover_pic }}
2
+ <img src="{{ cover_pic }}" />
3
+ {{ /if }}
4
+
5
+ <p>部队名称:{{ guild_name }} <{{ guild_tag }}></p>
6
+ <p>区服:{{ area_name }} {{ group_name }}</p>
7
+ <p>活跃成员:{{ active_member_num }}</p>
8
+ <p>招募人数:{{ target_recruit_num }}</p>
9
+ <p>活跃时间:工作日&nbsp;{{ weekday_time }}&nbsp;&nbsp;&nbsp;&nbsp;休息日&nbsp;{{ weekend_time }}</p>
10
+ {{ if guild_address }}
11
+ <p>部队地址:{{ guild_address }}</p>
12
+ {{ /if }}
13
+ {{ if create_time }}
14
+ <p>成立时间:{{ create_time }}</p>
15
+ {{ /if }}
16
+ <p>部队标签:{{ labelInfo.map(i => i.name).join(',') }}</p>
17
+
18
+ <div>
19
+ {{@ detail_mask }}
20
+ </div>
21
+
22
+ {{ if foot_pic }}
23
+ {{ each foot_pic.split(',') url }}
24
+ <img src="{{ url }}" />
25
+ {{ /each }}
26
+ {{ /if }}
@@ -0,0 +1,9 @@
1
+ {{@ detail_mask }}
2
+
3
+ <div>
4
+ {{ if weekday_time && weekend_time }}
5
+ <p>活跃时间:工作日&nbsp;{{ weekday_time }}&nbsp;&nbsp;&nbsp;&nbsp;休息日&nbsp;{{ weekend_time }}</p>
6
+ {{ /if }}
7
+ <p>游戏风格:{{ styles }}</p>
8
+ <p>招募区服:{{ target }}</p>
9
+ </div>
@@ -0,0 +1,15 @@
1
+ {{ if cover_pic }}
2
+ <img src="{{ cover_pic }}" />
3
+ {{ /if }}
4
+
5
+ <p>开放时间:{{ open_time }}</p>
6
+ <p>RP 类型:{{ rp_type }}</p>
7
+ <p>创立时间:{{ create_time }}</p>
8
+ <p>区服:{{ area }}</p>
9
+ <p>地址:{{ address }}</p>
10
+ <p>标签:{{ custom_label }}</p>
11
+ <p>简介:{{ profile }}</p>
12
+
13
+ <div>
14
+ {{@ detail_mask }}
15
+ </div>
@@ -0,0 +1,31 @@
1
+ import type { Data, Route } from '@/types';
2
+ import { INDEX_URL, LOGO_URL, REQUIRE_CONFIG } from './constant';
3
+ import type { Context } from 'hono';
4
+ import { checkConfig, generateDynamicFeeds } from './utils';
5
+ import { getFollowDynamicList } from './api';
6
+
7
+ export const route: Route = {
8
+ path: '/ff14risingstones/timeline',
9
+ example: '/sdo/ff14risingstones/timeline',
10
+ name: '时间线',
11
+ categories: ['bbs'],
12
+ maintainers: ['KarasuShin'],
13
+ features: {
14
+ requireConfig: REQUIRE_CONFIG,
15
+ },
16
+ handler,
17
+ };
18
+
19
+ async function handler(ctx: Context) {
20
+ checkConfig();
21
+
22
+ const limit = ctx.req.query('limit') || 20;
23
+ const dynamics = await getFollowDynamicList(limit);
24
+
25
+ return {
26
+ title: '石之家 - 时间线',
27
+ link: `${INDEX_URL}#/dynamic`,
28
+ image: LOGO_URL,
29
+ item: await generateDynamicFeeds(dynamics),
30
+ } as Data;
31
+ }