@walavave/cc98-cli 0.1.0

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 (205) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +150 -0
  3. package/dist/api/client.d.ts +57 -0
  4. package/dist/api/client.d.ts.map +1 -0
  5. package/dist/api/client.js +298 -0
  6. package/dist/api/client.js.map +1 -0
  7. package/dist/api/endpoints.d.ts +48 -0
  8. package/dist/api/endpoints.d.ts.map +1 -0
  9. package/dist/api/endpoints.js +53 -0
  10. package/dist/api/endpoints.js.map +1 -0
  11. package/dist/api/types.d.ts +35 -0
  12. package/dist/api/types.d.ts.map +1 -0
  13. package/dist/api/types.js +2 -0
  14. package/dist/api/types.js.map +1 -0
  15. package/dist/api/webvpn.d.ts +40 -0
  16. package/dist/api/webvpn.d.ts.map +1 -0
  17. package/dist/api/webvpn.js +259 -0
  18. package/dist/api/webvpn.js.map +1 -0
  19. package/dist/cli/commands/account.d.ts +2 -0
  20. package/dist/cli/commands/account.d.ts.map +1 -0
  21. package/dist/cli/commands/account.js +81 -0
  22. package/dist/cli/commands/account.js.map +1 -0
  23. package/dist/cli/commands/board.d.ts +2 -0
  24. package/dist/cli/commands/board.d.ts.map +1 -0
  25. package/dist/cli/commands/board.js +61 -0
  26. package/dist/cli/commands/board.js.map +1 -0
  27. package/dist/cli/commands/cache.d.ts +2 -0
  28. package/dist/cli/commands/cache.d.ts.map +1 -0
  29. package/dist/cli/commands/cache.js +68 -0
  30. package/dist/cli/commands/cache.js.map +1 -0
  31. package/dist/cli/commands/forum.d.ts +2 -0
  32. package/dist/cli/commands/forum.d.ts.map +1 -0
  33. package/dist/cli/commands/forum.js +38 -0
  34. package/dist/cli/commands/forum.js.map +1 -0
  35. package/dist/cli/commands/login.d.ts +2 -0
  36. package/dist/cli/commands/login.d.ts.map +1 -0
  37. package/dist/cli/commands/login.js +98 -0
  38. package/dist/cli/commands/login.js.map +1 -0
  39. package/dist/cli/commands/logout.d.ts +2 -0
  40. package/dist/cli/commands/logout.d.ts.map +1 -0
  41. package/dist/cli/commands/logout.js +20 -0
  42. package/dist/cli/commands/logout.js.map +1 -0
  43. package/dist/cli/commands/me.d.ts +2 -0
  44. package/dist/cli/commands/me.d.ts.map +1 -0
  45. package/dist/cli/commands/me.js +9 -0
  46. package/dist/cli/commands/me.js.map +1 -0
  47. package/dist/cli/commands/message.d.ts +2 -0
  48. package/dist/cli/commands/message.d.ts.map +1 -0
  49. package/dist/cli/commands/message.js +42 -0
  50. package/dist/cli/commands/message.js.map +1 -0
  51. package/dist/cli/commands/notice.d.ts +2 -0
  52. package/dist/cli/commands/notice.d.ts.map +1 -0
  53. package/dist/cli/commands/notice.js +30 -0
  54. package/dist/cli/commands/notice.js.map +1 -0
  55. package/dist/cli/commands/post.d.ts +2 -0
  56. package/dist/cli/commands/post.d.ts.map +1 -0
  57. package/dist/cli/commands/post.js +37 -0
  58. package/dist/cli/commands/post.js.map +1 -0
  59. package/dist/cli/commands/search.d.ts +2 -0
  60. package/dist/cli/commands/search.d.ts.map +1 -0
  61. package/dist/cli/commands/search.js +13 -0
  62. package/dist/cli/commands/search.js.map +1 -0
  63. package/dist/cli/commands/topic.d.ts +2 -0
  64. package/dist/cli/commands/topic.d.ts.map +1 -0
  65. package/dist/cli/commands/topic.js +196 -0
  66. package/dist/cli/commands/topic.js.map +1 -0
  67. package/dist/cli/commands/update.d.ts +2 -0
  68. package/dist/cli/commands/update.d.ts.map +1 -0
  69. package/dist/cli/commands/update.js +24 -0
  70. package/dist/cli/commands/update.js.map +1 -0
  71. package/dist/cli/commands/user.d.ts +2 -0
  72. package/dist/cli/commands/user.d.ts.map +1 -0
  73. package/dist/cli/commands/user.js +90 -0
  74. package/dist/cli/commands/user.js.map +1 -0
  75. package/dist/cli/commands/vpn.d.ts +2 -0
  76. package/dist/cli/commands/vpn.d.ts.map +1 -0
  77. package/dist/cli/commands/vpn.js +177 -0
  78. package/dist/cli/commands/vpn.js.map +1 -0
  79. package/dist/cli/context.d.ts +9 -0
  80. package/dist/cli/context.d.ts.map +1 -0
  81. package/dist/cli/context.js +26 -0
  82. package/dist/cli/context.js.map +1 -0
  83. package/dist/cli/options.d.ts +6 -0
  84. package/dist/cli/options.d.ts.map +1 -0
  85. package/dist/cli/options.js +22 -0
  86. package/dist/cli/options.js.map +1 -0
  87. package/dist/cli/parse.d.ts +15 -0
  88. package/dist/cli/parse.d.ts.map +1 -0
  89. package/dist/cli/parse.js +55 -0
  90. package/dist/cli/parse.js.map +1 -0
  91. package/dist/cli/prompt.d.ts +4 -0
  92. package/dist/cli/prompt.d.ts.map +1 -0
  93. package/dist/cli/prompt.js +53 -0
  94. package/dist/cli/prompt.js.map +1 -0
  95. package/dist/cli/router.d.ts +2 -0
  96. package/dist/cli/router.d.ts.map +1 -0
  97. package/dist/cli/router.js +90 -0
  98. package/dist/cli/router.js.map +1 -0
  99. package/dist/config.d.ts +10 -0
  100. package/dist/config.d.ts.map +1 -0
  101. package/dist/config.js +74 -0
  102. package/dist/config.js.map +1 -0
  103. package/dist/main.d.ts +3 -0
  104. package/dist/main.d.ts.map +1 -0
  105. package/dist/main.js +17 -0
  106. package/dist/main.js.map +1 -0
  107. package/dist/storage/cache-store.d.ts +62 -0
  108. package/dist/storage/cache-store.d.ts.map +1 -0
  109. package/dist/storage/cache-store.js +233 -0
  110. package/dist/storage/cache-store.js.map +1 -0
  111. package/dist/storage/paths.d.ts +5 -0
  112. package/dist/storage/paths.d.ts.map +1 -0
  113. package/dist/storage/paths.js +17 -0
  114. package/dist/storage/paths.js.map +1 -0
  115. package/dist/storage/token-store.d.ts +39 -0
  116. package/dist/storage/token-store.d.ts.map +1 -0
  117. package/dist/storage/token-store.js +177 -0
  118. package/dist/storage/token-store.js.map +1 -0
  119. package/dist/storage/vpn-store.d.ts +16 -0
  120. package/dist/storage/vpn-store.d.ts.map +1 -0
  121. package/dist/storage/vpn-store.js +72 -0
  122. package/dist/storage/vpn-store.js.map +1 -0
  123. package/dist/tui/account-modal.d.ts +31 -0
  124. package/dist/tui/account-modal.d.ts.map +1 -0
  125. package/dist/tui/account-modal.js +97 -0
  126. package/dist/tui/account-modal.js.map +1 -0
  127. package/dist/tui/ansi.d.ts +20 -0
  128. package/dist/tui/ansi.d.ts.map +1 -0
  129. package/dist/tui/ansi.js +28 -0
  130. package/dist/tui/ansi.js.map +1 -0
  131. package/dist/tui/app-data.d.ts +22 -0
  132. package/dist/tui/app-data.d.ts.map +1 -0
  133. package/dist/tui/app-data.js +828 -0
  134. package/dist/tui/app-data.js.map +1 -0
  135. package/dist/tui/app-runtime.d.ts +27 -0
  136. package/dist/tui/app-runtime.d.ts.map +1 -0
  137. package/dist/tui/app-runtime.js +874 -0
  138. package/dist/tui/app-runtime.js.map +1 -0
  139. package/dist/tui/app.d.ts +2 -0
  140. package/dist/tui/app.d.ts.map +1 -0
  141. package/dist/tui/app.js +172 -0
  142. package/dist/tui/app.js.map +1 -0
  143. package/dist/tui/cached-client.d.ts +41 -0
  144. package/dist/tui/cached-client.d.ts.map +1 -0
  145. package/dist/tui/cached-client.js +78 -0
  146. package/dist/tui/cached-client.js.map +1 -0
  147. package/dist/tui/canvas.d.ts +26 -0
  148. package/dist/tui/canvas.d.ts.map +1 -0
  149. package/dist/tui/canvas.js +204 -0
  150. package/dist/tui/canvas.js.map +1 -0
  151. package/dist/tui/downloads.d.ts +2 -0
  152. package/dist/tui/downloads.d.ts.map +1 -0
  153. package/dist/tui/downloads.js +81 -0
  154. package/dist/tui/downloads.js.map +1 -0
  155. package/dist/tui/image-preview.d.ts +19 -0
  156. package/dist/tui/image-preview.d.ts.map +1 -0
  157. package/dist/tui/image-preview.js +217 -0
  158. package/dist/tui/image-preview.js.map +1 -0
  159. package/dist/tui/interactions.d.ts +5 -0
  160. package/dist/tui/interactions.d.ts.map +1 -0
  161. package/dist/tui/interactions.js +25 -0
  162. package/dist/tui/interactions.js.map +1 -0
  163. package/dist/tui/keymap.d.ts +7 -0
  164. package/dist/tui/keymap.d.ts.map +1 -0
  165. package/dist/tui/keymap.js +262 -0
  166. package/dist/tui/keymap.js.map +1 -0
  167. package/dist/tui/layout.d.ts +29 -0
  168. package/dist/tui/layout.d.ts.map +1 -0
  169. package/dist/tui/layout.js +82 -0
  170. package/dist/tui/layout.js.map +1 -0
  171. package/dist/tui/renderer.d.ts +9 -0
  172. package/dist/tui/renderer.d.ts.map +1 -0
  173. package/dist/tui/renderer.js +375 -0
  174. package/dist/tui/renderer.js.map +1 -0
  175. package/dist/tui/terminal.d.ts +41 -0
  176. package/dist/tui/terminal.d.ts.map +1 -0
  177. package/dist/tui/terminal.js +162 -0
  178. package/dist/tui/terminal.js.map +1 -0
  179. package/dist/tui/text.d.ts +10 -0
  180. package/dist/tui/text.d.ts.map +1 -0
  181. package/dist/tui/text.js +158 -0
  182. package/dist/tui/text.js.map +1 -0
  183. package/dist/tui/theme.d.ts +56 -0
  184. package/dist/tui/theme.d.ts.map +1 -0
  185. package/dist/tui/theme.js +95 -0
  186. package/dist/tui/theme.js.map +1 -0
  187. package/dist/tui/tui-model.d.ts +126 -0
  188. package/dist/tui/tui-model.d.ts.map +1 -0
  189. package/dist/tui/tui-model.js +54 -0
  190. package/dist/tui/tui-model.js.map +1 -0
  191. package/dist/tui/ubb-renderer.d.ts +12 -0
  192. package/dist/tui/ubb-renderer.d.ts.map +1 -0
  193. package/dist/tui/ubb-renderer.js +196 -0
  194. package/dist/tui/ubb-renderer.js.map +1 -0
  195. package/dist/update.d.ts +17 -0
  196. package/dist/update.d.ts.map +1 -0
  197. package/dist/update.js +88 -0
  198. package/dist/update.js.map +1 -0
  199. package/dist/version.d.ts +6 -0
  200. package/dist/version.d.ts.map +1 -0
  201. package/dist/version.js +6 -0
  202. package/dist/version.js.map +1 -0
  203. package/docs/images/tui.png +0 -0
  204. package/docs/images/tui2.png +0 -0
  205. package/package.json +43 -0
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Walavave
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,150 @@
1
+ # CC98-CLI
2
+
3
+ CC98 的命令行客户端,有适合日常浏览的 TUI,以及面向脚本使用的 CLI 。
4
+
5
+ - 直接运行 `cc98`:进入终端界面。
6
+ - 带参数运行 `cc98 <command>`:执行 CLI,默认输出 JSON。
7
+ - 当前主要面向读取场景,TUI 会尽量按需加载和缓存,减少请求。
8
+
9
+ ## 概要
10
+
11
+ 这是一个个人兴趣项目,改版自Lucent-Snow的[CC98-CLI](https://github.com/Lucent-Snow/CC98-CLI),风格和TUI布局模式参考[Yazi](https://github.com/sxyazi/yazi)。
12
+
13
+ 基于 CC98 的公开接口实现,与 CC98 官方无关。请合理使用本工具,避免违反 CC98 的用户协议。
14
+
15
+ ### 特色
16
+
17
+ - **支持WebVPN、RVPN**:RVPN使用`atrust`验证;魔法VPN不开启TUN模式下也可以使用
18
+ - **支持鼠标点击/滚动**:支持鼠标左右拉动分割线
19
+ - **支持文件下载**:鼠标点击链接下载文件,支持`.pdf` `.docs`等
20
+ - **图片预览(快捷键预览大图)**:支持`Kitty(KPG)`和`iterm2`渲染,在基于libghostty的终端上完成验证
21
+ - **图形化登录**:无需使用命令行登录、切换账号
22
+ - **Yazi风格**:伪装Yazi文件管理器;q键退出,终端不留痕
23
+ - **自定义**:主题颜色、部分快捷键
24
+
25
+ ## 预览
26
+
27
+ <p align="center">
28
+ <img src="docs/images/tui.png" alt="CC98-CLI TUI 截图" width="900">
29
+ <img src="docs/images/tui2.png" alt="CC98-CLI TUI 截图2" width="900">
30
+ </p>
31
+
32
+ ## 安装
33
+
34
+ 需要 Node.js 20+。
35
+
36
+ ```bash
37
+ npm install -g @walavave/cc98-cli
38
+ ```
39
+
40
+ 安装后命令是:
41
+
42
+ ```bash
43
+ cc98
44
+ ```
45
+
46
+ ## 登录
47
+
48
+ ```bash
49
+ cc98 login
50
+ ```
51
+
52
+ 多账号:
53
+
54
+ ```bash
55
+ cc98 account list
56
+ cc98 account use <name>
57
+ cc98 --account <name> me
58
+ ```
59
+
60
+ ## TUI
61
+
62
+ ```bash
63
+ cc98
64
+ ```
65
+
66
+ 常用按键:
67
+
68
+ ```text
69
+ j/k 或 ↑/↓ 上下移动
70
+ l 或 → 进入下一层
71
+ h 或 ← 返回上一层
72
+ Enter 确认执行
73
+ r 刷新
74
+ ? 显示帮助
75
+ n 或 Space 加载更多
76
+ q 退出
77
+ ```
78
+
79
+ 左栏导航包含:十大、收藏、最新、版面、关注、消息、我的、设置。
80
+
81
+ ### 配置
82
+
83
+ 配置文件路径为 `~/.config/cc98-cli/config.toml`,未设置时使用默认值。
84
+
85
+ ```toml
86
+ [tui]
87
+ hide_top_chrome = false
88
+ preview_images = true
89
+ ```
90
+
91
+ 图片预览目前支持 Kitty graphics protocol 和 iTerm2 inline image。若终端不支持对应协议,会保留文本图片占位。
92
+
93
+ 快捷键映射文件路径为 `~/.config/cc98-cli/keymap.toml`。格式参考 `keymap.toml`,组合键使用尖括号表示,例如:
94
+
95
+ ```toml
96
+ [tui]
97
+ prepend_keymap = [
98
+ { on = "<A-Down>", run = "topic.next-reply", desc = "下一条回复" },
99
+ { on = "<A-Up>", run = "topic.previous-reply", desc = "上一条回复" },
100
+ ]
101
+ ```
102
+
103
+ 默认已内置 `<A-Down>` / `<A-Up>` 用于在主题阅读模式下跳转相邻回复。
104
+
105
+ ## CLI
106
+
107
+ CLI 默认输出 JSON,适合配合 `jq` 或脚本使用。
108
+
109
+ ```bash
110
+ cc98 me
111
+ cc98 topic <topic-id>
112
+ cc98 board <board-id>
113
+ cc98 search <keyword>
114
+ cc98 message recent
115
+ cc98 update
116
+ ```
117
+
118
+ 查看完整命令:
119
+
120
+ ```bash
121
+ cc98 --help
122
+ cc98 topic --help
123
+ cc98 user --help
124
+ cc98 update --help
125
+ ```
126
+
127
+ ## 本地数据
128
+
129
+ 登录信息和缓存保存在:
130
+
131
+ ```text
132
+ ~/.cc98-cli/
133
+ ```
134
+
135
+ ## 开发
136
+
137
+ ```bash
138
+ npm install
139
+ npm run check
140
+ npm run build
141
+ node dist/main.js
142
+ ```
143
+
144
+ ## 致谢
145
+
146
+ - [CC98-CLI](https://github.com/Lucent-Snow/CC98-CLI):基于该项目fork,因技术路线分离而独立
147
+
148
+ ## License
149
+
150
+ MIT
@@ -0,0 +1,57 @@
1
+ import type { ClientOptions, JsonObject } from "./types.js";
2
+ interface RequestOptions {
3
+ signal?: AbortSignal;
4
+ }
5
+ export declare class Cc98Client {
6
+ private readonly tokenStore;
7
+ private readonly webVpn?;
8
+ private readonly webVpnOptions?;
9
+ private refreshPromise;
10
+ constructor(options: ClientOptions);
11
+ initWebVpn(): Promise<void>;
12
+ getWebVpnStatus(): {
13
+ enabled: boolean;
14
+ loggedIn: boolean;
15
+ } | undefined;
16
+ loginWithPassword(username: string, password: string): Promise<{
17
+ accessToken: string;
18
+ refreshToken?: string;
19
+ }>;
20
+ getMe(options?: RequestOptions): Promise<JsonObject>;
21
+ getMeWithAccessToken(accessToken: string): Promise<JsonObject>;
22
+ getForumIndex(options?: RequestOptions): Promise<unknown>;
23
+ getAllBoards(options?: RequestOptions): Promise<unknown>;
24
+ getCardStat(): Promise<unknown>;
25
+ getUserProfile(userId: number): Promise<unknown>;
26
+ getBasicUsers(ids: number[], options?: RequestOptions): Promise<unknown>;
27
+ getUsers(ids: number[]): Promise<unknown>;
28
+ getFriendIds(type: "follower" | "followee", from?: number, size?: number, options?: RequestOptions): Promise<unknown>;
29
+ getMoment(from?: number, size?: number, options?: RequestOptions): Promise<unknown>;
30
+ getFavoriteUpdates(from?: number, size?: number, options?: RequestOptions): Promise<unknown>;
31
+ getFavoriteGroups(): Promise<unknown>;
32
+ getRecentChats(from?: number, size?: number, options?: RequestOptions): Promise<unknown>;
33
+ getChatHistory(userId: number, from?: number, size?: number, options?: RequestOptions): Promise<unknown>;
34
+ searchUsers(name: string): Promise<unknown>;
35
+ getUnreadCount(options?: RequestOptions): Promise<unknown>;
36
+ getNotices(type: "system" | "at" | "reply", from?: number, size?: number): Promise<unknown>;
37
+ getBrowseHistory(from?: number, size?: number): Promise<unknown>;
38
+ getTopic(topicId: number, options?: RequestOptions): Promise<JsonObject>;
39
+ getTopicPosts(topicId: number, from?: number, size?: number, options?: RequestOptions): Promise<JsonObject[]>;
40
+ isTopicFavorite(topicId: number): Promise<unknown>;
41
+ getNewTopics(from?: number, size?: number, options?: RequestOptions): Promise<unknown>;
42
+ getRandomTopics(size?: number): Promise<unknown>;
43
+ getFavoriteTopics(from?: number, size?: number, order?: number, groupId?: number): Promise<unknown>;
44
+ getTopicVote(topicId: number): Promise<unknown>;
45
+ getBasicTopics(ids: number[]): Promise<unknown>;
46
+ getRecentTopics(userId: number | undefined, from?: number, size?: number): Promise<unknown>;
47
+ getBoardInfo(boardId: number, options?: RequestOptions): Promise<unknown>;
48
+ getBoardTopics(boardId: number, from?: number, size?: number, best?: boolean, options?: RequestOptions): Promise<unknown>;
49
+ searchTopics(keyword: string, from?: number, size?: number): Promise<unknown>;
50
+ getPostReactionState(postId: number): Promise<unknown>;
51
+ getPostRateReasons(type: number): Promise<unknown>;
52
+ private request;
53
+ private tryRefreshToken;
54
+ private doRefreshToken;
55
+ }
56
+ export {};
57
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../../src/api/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,298 @@
1
+ import { endpoints } from "./endpoints.js";
2
+ import { WebVpnService } from "./webvpn.js";
3
+ const passwordClientId = "9a1fd200-8687-44b1-4c20-08d50a96e5cd";
4
+ const passwordClientSecret = "8b53f727-08e2-4509-8857-e34bf92b27f2";
5
+ export class Cc98Client {
6
+ tokenStore;
7
+ webVpn;
8
+ webVpnOptions;
9
+ refreshPromise = null;
10
+ constructor(options) {
11
+ this.tokenStore = options.tokenStore;
12
+ this.webVpnOptions = options.webVpn;
13
+ if (options.webVpn) {
14
+ this.webVpn = new WebVpnService(options.webVpn.cookies);
15
+ }
16
+ }
17
+ async initWebVpn() {
18
+ if (!this.webVpn || !this.webVpnOptions) {
19
+ return;
20
+ }
21
+ const mode = this.webVpnOptions.mode || "auto";
22
+ if (mode === "direct") {
23
+ return;
24
+ }
25
+ if (mode === "vpn") {
26
+ this.webVpn.enabled = true;
27
+ if (!this.webVpn.isLoggedIn) {
28
+ console.error("WebVPN is enabled but not logged in. Run \"cc98 vpn login\" first.");
29
+ }
30
+ return;
31
+ }
32
+ const inCampus = await this.webVpn.checkNetwork();
33
+ if (!inCampus) {
34
+ this.webVpn.enabled = true;
35
+ if (!this.webVpn.isLoggedIn) {
36
+ this.webVpn.enabled = false;
37
+ console.error("WebVPN is needed but not logged in. Run \"cc98 vpn login\" first.");
38
+ }
39
+ }
40
+ }
41
+ getWebVpnStatus() {
42
+ return this.webVpn?.getStatus();
43
+ }
44
+ async loginWithPassword(username, password) {
45
+ const body = new URLSearchParams({
46
+ username,
47
+ password,
48
+ client_id: passwordClientId,
49
+ client_secret: passwordClientSecret,
50
+ grant_type: "password",
51
+ scope: "cc98-api openid offline_access"
52
+ });
53
+ const token = await this.request(endpoints.auth.token, {
54
+ method: "POST",
55
+ headers: {
56
+ "content-type": "application/x-www-form-urlencoded"
57
+ },
58
+ body
59
+ }, false);
60
+ if (!token.access_token) {
61
+ const reason = token.error_description ?? token.error ?? "login failed";
62
+ throw new Error(reason);
63
+ }
64
+ return {
65
+ accessToken: token.access_token,
66
+ refreshToken: token.refresh_token
67
+ };
68
+ }
69
+ async getMe(options = {}) {
70
+ return this.request(endpoints.user.me, { signal: options.signal });
71
+ }
72
+ async getMeWithAccessToken(accessToken) {
73
+ return this.request(endpoints.user.me, {
74
+ headers: {
75
+ authorization: `Bearer ${accessToken}`
76
+ }
77
+ }, false);
78
+ }
79
+ async getForumIndex(options = {}) {
80
+ return this.request(endpoints.forum.index, { signal: options.signal });
81
+ }
82
+ async getAllBoards(options = {}) {
83
+ return this.request(endpoints.forum.allBoards, { signal: options.signal });
84
+ }
85
+ async getCardStat() {
86
+ return this.request(endpoints.forum.cardStat);
87
+ }
88
+ async getUserProfile(userId) {
89
+ return this.request(endpoints.user.profile(userId));
90
+ }
91
+ async getBasicUsers(ids, options = {}) {
92
+ return this.request(endpoints.user.basic(ids), { signal: options.signal });
93
+ }
94
+ async getUsers(ids) {
95
+ return this.request(endpoints.user.list(ids));
96
+ }
97
+ async getFriendIds(type, from = 0, size = 10, options = {}) {
98
+ return this.request(endpoints.user.friendIds(type, from, size), { signal: options.signal });
99
+ }
100
+ async getMoment(from = 0, size = 20, options = {}) {
101
+ return this.request(endpoints.user.moment(from, size), { signal: options.signal });
102
+ }
103
+ async getFavoriteUpdates(from = 0, size = 20, options = {}) {
104
+ return this.request(endpoints.user.favoriteUpdates(from, size), { signal: options.signal });
105
+ }
106
+ async getFavoriteGroups() {
107
+ return this.request(endpoints.user.favoriteGroups);
108
+ }
109
+ async getRecentChats(from = 0, size = 10, options = {}) {
110
+ return this.request(endpoints.user.recentChats(from, size), { signal: options.signal });
111
+ }
112
+ async getChatHistory(userId, from = 0, size = 10, options = {}) {
113
+ return this.request(endpoints.user.chatHistory(userId, from, size), { signal: options.signal });
114
+ }
115
+ async searchUsers(name) {
116
+ return this.request(endpoints.user.search(name));
117
+ }
118
+ async getUnreadCount(options = {}) {
119
+ return this.request(endpoints.user.unread, { signal: options.signal });
120
+ }
121
+ async getNotices(type, from = 0, size = 10) {
122
+ return this.request(endpoints.user.notices(type, from, size));
123
+ }
124
+ async getBrowseHistory(from = 0, size = 11) {
125
+ return this.request(endpoints.user.browseHistory(from, size));
126
+ }
127
+ async getTopic(topicId, options = {}) {
128
+ return this.request(endpoints.topic.info(topicId), { signal: options.signal });
129
+ }
130
+ async getTopicPosts(topicId, from = 0, size = 10, options = {}) {
131
+ return this.request(endpoints.topic.posts(topicId, from, size), { signal: options.signal });
132
+ }
133
+ async isTopicFavorite(topicId) {
134
+ return this.request(endpoints.topic.isFavorite(topicId));
135
+ }
136
+ async getNewTopics(from = 0, size = 20, options = {}) {
137
+ return this.request(endpoints.topic.newTopics(from, size), { signal: options.signal });
138
+ }
139
+ async getRandomTopics(size = 10) {
140
+ return this.request(endpoints.topic.randomTopics(size));
141
+ }
142
+ async getFavoriteTopics(from = 0, size = 11, order = 1, groupId = 0) {
143
+ return this.request(endpoints.topic.favoriteTopics(from, size, order, groupId));
144
+ }
145
+ async getTopicVote(topicId) {
146
+ return this.request(endpoints.topic.vote(topicId));
147
+ }
148
+ async getBasicTopics(ids) {
149
+ return this.request(endpoints.topic.basic(ids));
150
+ }
151
+ async getRecentTopics(userId, from = 0, size = 11) {
152
+ return this.request(endpoints.topic.recent(userId, from, size));
153
+ }
154
+ async getBoardInfo(boardId, options = {}) {
155
+ return this.request(endpoints.board.info(boardId), { signal: options.signal });
156
+ }
157
+ async getBoardTopics(boardId, from = 0, size = 20, best = false, options = {}) {
158
+ const endpoint = best
159
+ ? endpoints.board.bestTopics(boardId, from, size)
160
+ : endpoints.board.topics(boardId, from, size);
161
+ return this.request(endpoint, { signal: options.signal });
162
+ }
163
+ async searchTopics(keyword, from = 0, size = 20) {
164
+ return this.request(endpoints.topic.search(keyword, from, size));
165
+ }
166
+ async getPostReactionState(postId) {
167
+ return this.request(endpoints.post.reactionState(postId));
168
+ }
169
+ async getPostRateReasons(type) {
170
+ return this.request(endpoints.post.rateReasons(type));
171
+ }
172
+ async request(url, init = {}, authorize = true) {
173
+ const headers = new Headers(init.headers);
174
+ if (authorize) {
175
+ const token = await this.tokenStore.getAccessToken();
176
+ if (!token) {
177
+ throw new Error("not logged in. Run \"cc98 login\" first.");
178
+ }
179
+ headers.set("authorization", `Bearer ${token}`);
180
+ }
181
+ let response = this.webVpn?.isEnabled
182
+ ? await this.webVpn.fetch(url, {
183
+ ...init,
184
+ headers: Object.fromEntries(headers.entries())
185
+ })
186
+ : await fetch(url, {
187
+ ...init,
188
+ headers
189
+ });
190
+ // Try to refresh token on 401
191
+ if (response.status === 401 && authorize) {
192
+ const refreshed = await this.tryRefreshToken();
193
+ if (refreshed) {
194
+ headers.set("authorization", `Bearer ${refreshed.accessToken}`);
195
+ response = this.webVpn?.isEnabled
196
+ ? await this.webVpn.fetch(url, {
197
+ ...init,
198
+ headers: Object.fromEntries(headers.entries())
199
+ })
200
+ : await fetch(url, {
201
+ ...init,
202
+ headers
203
+ });
204
+ }
205
+ }
206
+ const text = await response.text();
207
+ const data = parseJson(text);
208
+ if (!response.ok) {
209
+ if (response.status === 401) {
210
+ throw new Error("not logged in or token expired. Run \"cc98 login\".");
211
+ }
212
+ const detail = getErrorDetail(data) ?? text;
213
+ throw new Error(`request failed: ${response.status} ${response.statusText}${detail ? `: ${detail}` : ""}`);
214
+ }
215
+ return data;
216
+ }
217
+ async tryRefreshToken() {
218
+ // Deduplicate concurrent refresh attempts
219
+ if (this.refreshPromise) {
220
+ return this.refreshPromise;
221
+ }
222
+ this.refreshPromise = this.doRefreshToken();
223
+ try {
224
+ const result = await this.refreshPromise;
225
+ return result;
226
+ }
227
+ finally {
228
+ this.refreshPromise = null;
229
+ }
230
+ }
231
+ async doRefreshToken() {
232
+ const account = await this.tokenStore.getCurrentAccount?.();
233
+ const refreshToken = account ? account.refreshToken : await this.tokenStore.getRefreshToken();
234
+ if (!refreshToken) {
235
+ return null;
236
+ }
237
+ try {
238
+ const body = new URLSearchParams({
239
+ refresh_token: refreshToken,
240
+ client_id: passwordClientId,
241
+ client_secret: passwordClientSecret,
242
+ grant_type: "refresh_token",
243
+ scope: "cc98-api openid offline_access"
244
+ });
245
+ const token = await this.request(endpoints.auth.token, {
246
+ method: "POST",
247
+ headers: {
248
+ "content-type": "application/x-www-form-urlencoded"
249
+ },
250
+ body
251
+ }, false);
252
+ if (!token.access_token) {
253
+ return null;
254
+ }
255
+ const result = {
256
+ accessToken: token.access_token,
257
+ refreshToken: token.refresh_token
258
+ };
259
+ if (account && this.tokenStore.saveAccount) {
260
+ await this.tokenStore.saveAccount(account.account, result);
261
+ }
262
+ else {
263
+ await this.tokenStore.save(result);
264
+ }
265
+ return result;
266
+ }
267
+ catch {
268
+ return null;
269
+ }
270
+ }
271
+ }
272
+ function parseJson(text) {
273
+ if (!text) {
274
+ return undefined;
275
+ }
276
+ try {
277
+ return JSON.parse(text);
278
+ }
279
+ catch {
280
+ return text;
281
+ }
282
+ }
283
+ function getErrorDetail(data) {
284
+ if (typeof data !== "object" || data === null) {
285
+ return undefined;
286
+ }
287
+ if ("error_description" in data && typeof data.error_description === "string") {
288
+ return data.error_description;
289
+ }
290
+ if ("message" in data && typeof data.message === "string") {
291
+ return data.message;
292
+ }
293
+ if ("error" in data && typeof data.error === "string") {
294
+ return data.error;
295
+ }
296
+ return JSON.stringify(data);
297
+ }
298
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/api/client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,48 @@
1
+ export declare const endpoints: {
2
+ readonly auth: {
3
+ readonly token: "https://openid.cc98.org/connect/token";
4
+ };
5
+ readonly forum: {
6
+ readonly allBoards: "https://api.cc98.org/Board/all";
7
+ readonly index: "https://api.cc98.org/config/index";
8
+ readonly cardStat: "https://card.cc98.org/api/collection/stat";
9
+ };
10
+ readonly user: {
11
+ readonly me: "https://api.cc98.org/me";
12
+ readonly profile: (userId: number) => string;
13
+ readonly basic: (ids: number[]) => string;
14
+ readonly list: (ids: number[]) => string;
15
+ readonly friendIds: (type: "follower" | "followee", from?: number, size?: number) => string;
16
+ readonly moment: (from?: number, size?: number) => string;
17
+ readonly favoriteUpdates: (from?: number, size?: number) => string;
18
+ readonly favoriteGroups: "https://api.cc98.org/me/favorite-topic-group";
19
+ readonly recentChats: (from?: number, size?: number) => string;
20
+ readonly chatHistory: (userId: number, from?: number, size?: number) => string;
21
+ readonly search: (name: string) => string;
22
+ readonly unread: "https://api.cc98.org/me/unread-count";
23
+ readonly notices: (type: "system" | "at" | "reply", from?: number, size?: number) => string;
24
+ readonly browseHistory: (from?: number, size?: number) => string;
25
+ };
26
+ readonly board: {
27
+ readonly info: (boardId: number) => string;
28
+ readonly topics: (boardId: number, from?: number, size?: number) => string;
29
+ readonly bestTopics: (boardId: number, from?: number, size?: number) => string;
30
+ };
31
+ readonly topic: {
32
+ readonly info: (topicId: number) => string;
33
+ readonly isFavorite: (topicId: number) => string;
34
+ readonly posts: (topicId: number, from?: number, size?: number) => string;
35
+ readonly newTopics: (from?: number, size?: number) => string;
36
+ readonly randomTopics: (size?: number) => string;
37
+ readonly search: (keyword: string, from?: number, size?: number) => string;
38
+ readonly favoriteTopics: (from?: number, size?: number, order?: number, groupId?: number) => string;
39
+ readonly vote: (topicId: number) => string;
40
+ readonly basic: (ids: number[]) => string;
41
+ readonly recent: (userId: number | undefined, from?: number, size?: number) => string;
42
+ };
43
+ readonly post: {
44
+ readonly reactionState: (postId: number) => string;
45
+ readonly rateReasons: (type: number) => string;
46
+ };
47
+ };
48
+ //# sourceMappingURL=endpoints.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"endpoints.d.ts","sourceRoot":"","sources":["../../src/api/endpoints.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,SAAS;;;;;;;;;;;mCAWA,MAAM;8BACX,MAAM,EAAE;6BACT,MAAM,EAAE;mCACF,UAAU,GAAG,UAAU;;;;;uCAMnB,MAAM;gCAEb,MAAM;;iCAEL,QAAQ,GAAG,IAAI,GAAG,OAAO;;;;iCAKzB,MAAM;mCACJ,MAAM;uCAEF,MAAM;;;iCAIZ,MAAM;uCACA,MAAM;kCACX,MAAM;;;mCAIL,MAAM;;iCAIR,MAAM;8BACT,MAAM,EAAE;kCACJ,MAAM,GAAG,SAAS;;;yCAMX,MAAM;qCACV,MAAM;;CAEpB,CAAC"}
@@ -0,0 +1,53 @@
1
+ const base = "https://api.cc98.org";
2
+ const oidc = "https://openid.cc98.org";
3
+ const card = "https://card.cc98.org";
4
+ export const endpoints = {
5
+ auth: {
6
+ token: `${oidc}/connect/token`
7
+ },
8
+ forum: {
9
+ allBoards: `${base}/Board/all`,
10
+ index: `${base}/config/index`,
11
+ cardStat: `${card}/api/collection/stat`
12
+ },
13
+ user: {
14
+ me: `${base}/me`,
15
+ profile: (userId) => `${base}/user/${userId}`,
16
+ basic: (ids) => `${base}/user/basic?${ids.map((id) => `id=${id}`).join("&")}`,
17
+ list: (ids) => `${base}/user?${ids.map((id) => `id=${id}`).join("&")}`,
18
+ friendIds: (type, from = 0, size = 10) => `${base}/me/${type}?from=${from}&size=${size}`,
19
+ moment: (from = 0, size = 20) => `${base}/me/followee/topic?from=${from}&size=${size}&order=0`,
20
+ favoriteUpdates: (from = 0, size = 20) => `${base}/topic/me/favorite?from=${from}&size=${size}&order=1`,
21
+ favoriteGroups: `${base}/me/favorite-topic-group`,
22
+ recentChats: (from = 0, size = 10) => `${base}/message/recent-contact-users?from=${from}&size=${size}`,
23
+ chatHistory: (userId, from = 0, size = 10) => `${base}/message/user/${userId}?from=${from}&size=${size}`,
24
+ search: (name) => `${base}/user/name/${encodeURIComponent(name)}`,
25
+ unread: `${base}/me/unread-count`,
26
+ notices: (type, from = 0, size = 10) => `${base}/notification/${type}?from=${from}&size=${size}`,
27
+ browseHistory: (from = 0, size = 11) => `${base}/me/browsing-record?from=${from}&size=${size}`
28
+ },
29
+ board: {
30
+ info: (boardId) => `${base}/board/${boardId}`,
31
+ topics: (boardId, from = 0, size = 20) => `${base}/board/${boardId}/topic?from=${from}&size=${size}`,
32
+ bestTopics: (boardId, from = 0, size = 20) => `${base}/topic/best/board/${boardId}?from=${from}&size=${size}`
33
+ },
34
+ topic: {
35
+ info: (topicId) => `${base}/topic/${topicId}`,
36
+ isFavorite: (topicId) => `${base}/topic/${topicId}/isfavorite`,
37
+ posts: (topicId, from = 0, size = 10) => `${base}/Topic/${topicId}/post?from=${from}&size=${size}`,
38
+ newTopics: (from = 0, size = 20) => `${base}/topic/new?from=${from}&size=${size}`,
39
+ randomTopics: (size = 10) => `${base}/topic/random-recent?size=${size}`,
40
+ search: (keyword, from = 0, size = 20) => `${base}/topic/search?keyword=${encodeURIComponent(keyword)}&from=${from}&size=${size}`,
41
+ favoriteTopics: (from = 0, size = 11, order = 1, groupId = 0) => `${base}/topic/me/favorite?from=${from}&size=${size}&order=${order}&groupid=${groupId}`,
42
+ vote: (topicId) => `${base}/topic/${topicId}/vote`,
43
+ basic: (ids) => `${base}/topic/basic?${ids.map((id) => `id=${id}`).join("&")}`,
44
+ recent: (userId, from = 0, size = 11) => userId === undefined
45
+ ? `${base}/me/recent-topic?from=${from}&size=${size}`
46
+ : `${base}/user/${userId}/recent-topic?userid=${userId}&from=${from}&size=${size}`
47
+ },
48
+ post: {
49
+ reactionState: (postId) => `${base}/post/${postId}/like`,
50
+ rateReasons: (type) => `${base}/post/rating-reason?type=${type}`
51
+ }
52
+ };
53
+ //# sourceMappingURL=endpoints.js.map