@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.
- package/LICENSE +21 -0
- package/README.md +150 -0
- package/dist/api/client.d.ts +57 -0
- package/dist/api/client.d.ts.map +1 -0
- package/dist/api/client.js +298 -0
- package/dist/api/client.js.map +1 -0
- package/dist/api/endpoints.d.ts +48 -0
- package/dist/api/endpoints.d.ts.map +1 -0
- package/dist/api/endpoints.js +53 -0
- package/dist/api/endpoints.js.map +1 -0
- package/dist/api/types.d.ts +35 -0
- package/dist/api/types.d.ts.map +1 -0
- package/dist/api/types.js +2 -0
- package/dist/api/types.js.map +1 -0
- package/dist/api/webvpn.d.ts +40 -0
- package/dist/api/webvpn.d.ts.map +1 -0
- package/dist/api/webvpn.js +259 -0
- package/dist/api/webvpn.js.map +1 -0
- package/dist/cli/commands/account.d.ts +2 -0
- package/dist/cli/commands/account.d.ts.map +1 -0
- package/dist/cli/commands/account.js +81 -0
- package/dist/cli/commands/account.js.map +1 -0
- package/dist/cli/commands/board.d.ts +2 -0
- package/dist/cli/commands/board.d.ts.map +1 -0
- package/dist/cli/commands/board.js +61 -0
- package/dist/cli/commands/board.js.map +1 -0
- package/dist/cli/commands/cache.d.ts +2 -0
- package/dist/cli/commands/cache.d.ts.map +1 -0
- package/dist/cli/commands/cache.js +68 -0
- package/dist/cli/commands/cache.js.map +1 -0
- package/dist/cli/commands/forum.d.ts +2 -0
- package/dist/cli/commands/forum.d.ts.map +1 -0
- package/dist/cli/commands/forum.js +38 -0
- package/dist/cli/commands/forum.js.map +1 -0
- package/dist/cli/commands/login.d.ts +2 -0
- package/dist/cli/commands/login.d.ts.map +1 -0
- package/dist/cli/commands/login.js +98 -0
- package/dist/cli/commands/login.js.map +1 -0
- package/dist/cli/commands/logout.d.ts +2 -0
- package/dist/cli/commands/logout.d.ts.map +1 -0
- package/dist/cli/commands/logout.js +20 -0
- package/dist/cli/commands/logout.js.map +1 -0
- package/dist/cli/commands/me.d.ts +2 -0
- package/dist/cli/commands/me.d.ts.map +1 -0
- package/dist/cli/commands/me.js +9 -0
- package/dist/cli/commands/me.js.map +1 -0
- package/dist/cli/commands/message.d.ts +2 -0
- package/dist/cli/commands/message.d.ts.map +1 -0
- package/dist/cli/commands/message.js +42 -0
- package/dist/cli/commands/message.js.map +1 -0
- package/dist/cli/commands/notice.d.ts +2 -0
- package/dist/cli/commands/notice.d.ts.map +1 -0
- package/dist/cli/commands/notice.js +30 -0
- package/dist/cli/commands/notice.js.map +1 -0
- package/dist/cli/commands/post.d.ts +2 -0
- package/dist/cli/commands/post.d.ts.map +1 -0
- package/dist/cli/commands/post.js +37 -0
- package/dist/cli/commands/post.js.map +1 -0
- package/dist/cli/commands/search.d.ts +2 -0
- package/dist/cli/commands/search.d.ts.map +1 -0
- package/dist/cli/commands/search.js +13 -0
- package/dist/cli/commands/search.js.map +1 -0
- package/dist/cli/commands/topic.d.ts +2 -0
- package/dist/cli/commands/topic.d.ts.map +1 -0
- package/dist/cli/commands/topic.js +196 -0
- package/dist/cli/commands/topic.js.map +1 -0
- package/dist/cli/commands/update.d.ts +2 -0
- package/dist/cli/commands/update.d.ts.map +1 -0
- package/dist/cli/commands/update.js +24 -0
- package/dist/cli/commands/update.js.map +1 -0
- package/dist/cli/commands/user.d.ts +2 -0
- package/dist/cli/commands/user.d.ts.map +1 -0
- package/dist/cli/commands/user.js +90 -0
- package/dist/cli/commands/user.js.map +1 -0
- package/dist/cli/commands/vpn.d.ts +2 -0
- package/dist/cli/commands/vpn.d.ts.map +1 -0
- package/dist/cli/commands/vpn.js +177 -0
- package/dist/cli/commands/vpn.js.map +1 -0
- package/dist/cli/context.d.ts +9 -0
- package/dist/cli/context.d.ts.map +1 -0
- package/dist/cli/context.js +26 -0
- package/dist/cli/context.js.map +1 -0
- package/dist/cli/options.d.ts +6 -0
- package/dist/cli/options.d.ts.map +1 -0
- package/dist/cli/options.js +22 -0
- package/dist/cli/options.js.map +1 -0
- package/dist/cli/parse.d.ts +15 -0
- package/dist/cli/parse.d.ts.map +1 -0
- package/dist/cli/parse.js +55 -0
- package/dist/cli/parse.js.map +1 -0
- package/dist/cli/prompt.d.ts +4 -0
- package/dist/cli/prompt.d.ts.map +1 -0
- package/dist/cli/prompt.js +53 -0
- package/dist/cli/prompt.js.map +1 -0
- package/dist/cli/router.d.ts +2 -0
- package/dist/cli/router.d.ts.map +1 -0
- package/dist/cli/router.js +90 -0
- package/dist/cli/router.js.map +1 -0
- package/dist/config.d.ts +10 -0
- package/dist/config.d.ts.map +1 -0
- package/dist/config.js +74 -0
- package/dist/config.js.map +1 -0
- package/dist/main.d.ts +3 -0
- package/dist/main.d.ts.map +1 -0
- package/dist/main.js +17 -0
- package/dist/main.js.map +1 -0
- package/dist/storage/cache-store.d.ts +62 -0
- package/dist/storage/cache-store.d.ts.map +1 -0
- package/dist/storage/cache-store.js +233 -0
- package/dist/storage/cache-store.js.map +1 -0
- package/dist/storage/paths.d.ts +5 -0
- package/dist/storage/paths.d.ts.map +1 -0
- package/dist/storage/paths.js +17 -0
- package/dist/storage/paths.js.map +1 -0
- package/dist/storage/token-store.d.ts +39 -0
- package/dist/storage/token-store.d.ts.map +1 -0
- package/dist/storage/token-store.js +177 -0
- package/dist/storage/token-store.js.map +1 -0
- package/dist/storage/vpn-store.d.ts +16 -0
- package/dist/storage/vpn-store.d.ts.map +1 -0
- package/dist/storage/vpn-store.js +72 -0
- package/dist/storage/vpn-store.js.map +1 -0
- package/dist/tui/account-modal.d.ts +31 -0
- package/dist/tui/account-modal.d.ts.map +1 -0
- package/dist/tui/account-modal.js +97 -0
- package/dist/tui/account-modal.js.map +1 -0
- package/dist/tui/ansi.d.ts +20 -0
- package/dist/tui/ansi.d.ts.map +1 -0
- package/dist/tui/ansi.js +28 -0
- package/dist/tui/ansi.js.map +1 -0
- package/dist/tui/app-data.d.ts +22 -0
- package/dist/tui/app-data.d.ts.map +1 -0
- package/dist/tui/app-data.js +828 -0
- package/dist/tui/app-data.js.map +1 -0
- package/dist/tui/app-runtime.d.ts +27 -0
- package/dist/tui/app-runtime.d.ts.map +1 -0
- package/dist/tui/app-runtime.js +874 -0
- package/dist/tui/app-runtime.js.map +1 -0
- package/dist/tui/app.d.ts +2 -0
- package/dist/tui/app.d.ts.map +1 -0
- package/dist/tui/app.js +172 -0
- package/dist/tui/app.js.map +1 -0
- package/dist/tui/cached-client.d.ts +41 -0
- package/dist/tui/cached-client.d.ts.map +1 -0
- package/dist/tui/cached-client.js +78 -0
- package/dist/tui/cached-client.js.map +1 -0
- package/dist/tui/canvas.d.ts +26 -0
- package/dist/tui/canvas.d.ts.map +1 -0
- package/dist/tui/canvas.js +204 -0
- package/dist/tui/canvas.js.map +1 -0
- package/dist/tui/downloads.d.ts +2 -0
- package/dist/tui/downloads.d.ts.map +1 -0
- package/dist/tui/downloads.js +81 -0
- package/dist/tui/downloads.js.map +1 -0
- package/dist/tui/image-preview.d.ts +19 -0
- package/dist/tui/image-preview.d.ts.map +1 -0
- package/dist/tui/image-preview.js +217 -0
- package/dist/tui/image-preview.js.map +1 -0
- package/dist/tui/interactions.d.ts +5 -0
- package/dist/tui/interactions.d.ts.map +1 -0
- package/dist/tui/interactions.js +25 -0
- package/dist/tui/interactions.js.map +1 -0
- package/dist/tui/keymap.d.ts +7 -0
- package/dist/tui/keymap.d.ts.map +1 -0
- package/dist/tui/keymap.js +262 -0
- package/dist/tui/keymap.js.map +1 -0
- package/dist/tui/layout.d.ts +29 -0
- package/dist/tui/layout.d.ts.map +1 -0
- package/dist/tui/layout.js +82 -0
- package/dist/tui/layout.js.map +1 -0
- package/dist/tui/renderer.d.ts +9 -0
- package/dist/tui/renderer.d.ts.map +1 -0
- package/dist/tui/renderer.js +375 -0
- package/dist/tui/renderer.js.map +1 -0
- package/dist/tui/terminal.d.ts +41 -0
- package/dist/tui/terminal.d.ts.map +1 -0
- package/dist/tui/terminal.js +162 -0
- package/dist/tui/terminal.js.map +1 -0
- package/dist/tui/text.d.ts +10 -0
- package/dist/tui/text.d.ts.map +1 -0
- package/dist/tui/text.js +158 -0
- package/dist/tui/text.js.map +1 -0
- package/dist/tui/theme.d.ts +56 -0
- package/dist/tui/theme.d.ts.map +1 -0
- package/dist/tui/theme.js +95 -0
- package/dist/tui/theme.js.map +1 -0
- package/dist/tui/tui-model.d.ts +126 -0
- package/dist/tui/tui-model.d.ts.map +1 -0
- package/dist/tui/tui-model.js +54 -0
- package/dist/tui/tui-model.js.map +1 -0
- package/dist/tui/ubb-renderer.d.ts +12 -0
- package/dist/tui/ubb-renderer.d.ts.map +1 -0
- package/dist/tui/ubb-renderer.js +196 -0
- package/dist/tui/ubb-renderer.js.map +1 -0
- package/dist/update.d.ts +17 -0
- package/dist/update.d.ts.map +1 -0
- package/dist/update.js +88 -0
- package/dist/update.js.map +1 -0
- package/dist/version.d.ts +6 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +6 -0
- package/dist/version.js.map +1 -0
- package/docs/images/tui.png +0 -0
- package/docs/images/tui2.png +0 -0
- 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":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAG5C,MAAM,gBAAgB,GAAG,sCAAsC,CAAC;AAChE,MAAM,oBAAoB,GAAG,sCAAsC,CAAC;AAWpE,MAAM,OAAO,UAAU;IACJ,UAAU,CAA8B;IACxC,MAAM,CAAiB;IACvB,aAAa,CAAiB;IACvC,cAAc,GAA8C,IAAI,CAAC;IAEzE,YAAY,OAAsB;QAChC,IAAI,CAAC,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC;QACrC,IAAI,CAAC,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC;QACpC,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;YACnB,IAAI,CAAC,MAAM,GAAG,IAAI,aAAa,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QAC1D,CAAC;IACH,CAAC;IAED,KAAK,CAAC,UAAU;QACd,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;YACxC,OAAO;QACT,CAAC;QAED,MAAM,IAAI,GAAG,IAAI,CAAC,aAAa,CAAC,IAAI,IAAI,MAAM,CAAC;QAC/C,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;YACtB,OAAO;QACT,CAAC;QAED,IAAI,IAAI,KAAK,KAAK,EAAE,CAAC;YACnB,IAAI,CAAC,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC;YAC3B,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;gBAC5B,OAAO,CAAC,KAAK,CAAC,oEAAoE,CAAC,CAAC;YACtF,CAAC;YACD,OAAO;QACT,CAAC;QAED,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,YAAY,EAAE,CAAC;QAClD,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,IAAI,CAAC,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC;YAC3B,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;gBAC5B,IAAI,CAAC,MAAM,CAAC,OAAO,GAAG,KAAK,CAAC;gBAC5B,OAAO,CAAC,KAAK,CAAC,mEAAmE,CAAC,CAAC;YACrF,CAAC;QACH,CAAC;IACH,CAAC;IAED,eAAe;QACb,OAAO,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,CAAC;IAClC,CAAC;IAED,KAAK,CAAC,iBAAiB,CAAC,QAAgB,EAAE,QAAgB;QACxD,MAAM,IAAI,GAAG,IAAI,eAAe,CAAC;YAC/B,QAAQ;YACR,QAAQ;YACR,SAAS,EAAE,gBAAgB;YAC3B,aAAa,EAAE,oBAAoB;YACnC,UAAU,EAAE,UAAU;YACtB,KAAK,EAAE,gCAAgC;SACxC,CAAC,CAAC;QAEH,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,OAAO,CAAY,SAAS,CAAC,IAAI,CAAC,KAAK,EAAE;YAChE,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,cAAc,EAAE,mCAAmC;aACpD;YACD,IAAI;SACL,EAAE,KAAK,CAAC,CAAC;QAEV,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE,CAAC;YACxB,MAAM,MAAM,GAAG,KAAK,CAAC,iBAAiB,IAAI,KAAK,CAAC,KAAK,IAAI,cAAc,CAAC;YACxE,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,CAAC;QAC1B,CAAC;QAED,OAAO;YACL,WAAW,EAAE,KAAK,CAAC,YAAY;YAC/B,YAAY,EAAE,KAAK,CAAC,aAAa;SAClC,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,UAA0B,EAAE;QACtC,OAAO,IAAI,CAAC,OAAO,CAAa,SAAS,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IACjF,CAAC;IAED,KAAK,CAAC,oBAAoB,CAAC,WAAmB;QAC5C,OAAO,IAAI,CAAC,OAAO,CAAa,SAAS,CAAC,IAAI,CAAC,EAAE,EAAE;YACjD,OAAO,EAAE;gBACP,aAAa,EAAE,UAAU,WAAW,EAAE;aACvC;SACF,EAAE,KAAK,CAAC,CAAC;IACZ,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,UAA0B,EAAE;QAC9C,OAAO,IAAI,CAAC,OAAO,CAAU,SAAS,CAAC,KAAK,CAAC,KAAK,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAClF,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,UAA0B,EAAE;QAC7C,OAAO,IAAI,CAAC,OAAO,CAAU,SAAS,CAAC,KAAK,CAAC,SAAS,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IACtF,CAAC;IAED,KAAK,CAAC,WAAW;QACf,OAAO,IAAI,CAAC,OAAO,CAAU,SAAS,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IACzD,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,MAAc;QACjC,OAAO,IAAI,CAAC,OAAO,CAAU,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;IAC/D,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,GAAa,EAAE,UAA0B,EAAE;QAC7D,OAAO,IAAI,CAAC,OAAO,CAAU,SAAS,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IACtF,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,GAAa;QAC1B,OAAO,IAAI,CAAC,OAAO,CAAU,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IACzD,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,IAA6B,EAAE,IAAI,GAAG,CAAC,EAAE,IAAI,GAAG,EAAE,EAAE,UAA0B,EAAE;QACjG,OAAO,IAAI,CAAC,OAAO,CAAU,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IACvG,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,IAAI,GAAG,CAAC,EAAE,IAAI,GAAG,EAAE,EAAE,UAA0B,EAAE;QAC/D,OAAO,IAAI,CAAC,OAAO,CAAU,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAC9F,CAAC;IAED,KAAK,CAAC,kBAAkB,CAAC,IAAI,GAAG,CAAC,EAAE,IAAI,GAAG,EAAE,EAAE,UAA0B,EAAE;QACxE,OAAO,IAAI,CAAC,OAAO,CAAU,SAAS,CAAC,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IACvG,CAAC;IAED,KAAK,CAAC,iBAAiB;QACrB,OAAO,IAAI,CAAC,OAAO,CAAU,SAAS,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IAC9D,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,IAAI,GAAG,CAAC,EAAE,IAAI,GAAG,EAAE,EAAE,UAA0B,EAAE;QACpE,OAAO,IAAI,CAAC,OAAO,CAAU,SAAS,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IACnG,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,MAAc,EAAE,IAAI,GAAG,CAAC,EAAE,IAAI,GAAG,EAAE,EAAE,UAA0B,EAAE;QACpF,OAAO,IAAI,CAAC,OAAO,CAAU,SAAS,CAAC,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAC3G,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,IAAY;QAC5B,OAAO,IAAI,CAAC,OAAO,CAAU,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;IAC5D,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,UAA0B,EAAE;QAC/C,OAAO,IAAI,CAAC,OAAO,CAAU,SAAS,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAClF,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,IAA+B,EAAE,IAAI,GAAG,CAAC,EAAE,IAAI,GAAG,EAAE;QACnE,OAAO,IAAI,CAAC,OAAO,CAAU,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;IACzE,CAAC;IAED,KAAK,CAAC,gBAAgB,CAAC,IAAI,GAAG,CAAC,EAAE,IAAI,GAAG,EAAE;QACxC,OAAO,IAAI,CAAC,OAAO,CAAU,SAAS,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;IACzE,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,OAAe,EAAE,UAA0B,EAAE;QAC1D,OAAO,IAAI,CAAC,OAAO,CAAa,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAC7F,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,OAAe,EAAE,IAAI,GAAG,CAAC,EAAE,IAAI,GAAG,EAAE,EAAE,UAA0B,EAAE;QACpF,OAAO,IAAI,CAAC,OAAO,CAAe,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAC5G,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,OAAe;QACnC,OAAO,IAAI,CAAC,OAAO,CAAU,SAAS,CAAC,KAAK,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC;IACpE,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,IAAI,GAAG,CAAC,EAAE,IAAI,GAAG,EAAE,EAAE,UAA0B,EAAE;QAClE,OAAO,IAAI,CAAC,OAAO,CAAU,SAAS,CAAC,KAAK,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAClG,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,IAAI,GAAG,EAAE;QAC7B,OAAO,IAAI,CAAC,OAAO,CAAU,SAAS,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC;IACnE,CAAC;IAED,KAAK,CAAC,iBAAiB,CAAC,IAAI,GAAG,CAAC,EAAE,IAAI,GAAG,EAAE,EAAE,KAAK,GAAG,CAAC,EAAE,OAAO,GAAG,CAAC;QACjE,OAAO,IAAI,CAAC,OAAO,CAAU,SAAS,CAAC,KAAK,CAAC,cAAc,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC;IAC3F,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,OAAe;QAChC,OAAO,IAAI,CAAC,OAAO,CAAU,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;IAC9D,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,GAAa;QAChC,OAAO,IAAI,CAAC,OAAO,CAAU,SAAS,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC;IAC3D,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,MAA0B,EAAE,IAAI,GAAG,CAAC,EAAE,IAAI,GAAG,EAAE;QACnE,OAAO,IAAI,CAAC,OAAO,CAAU,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;IAC3E,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,OAAe,EAAE,UAA0B,EAAE;QAC9D,OAAO,IAAI,CAAC,OAAO,CAAU,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IAC1F,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,OAAe,EAAE,IAAI,GAAG,CAAC,EAAE,IAAI,GAAG,EAAE,EAAE,IAAI,GAAG,KAAK,EAAE,UAA0B,EAAE;QACnG,MAAM,QAAQ,GAAG,IAAI;YACnB,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,UAAU,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC;YACjD,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;QAChD,OAAO,IAAI,CAAC,OAAO,CAAU,QAAQ,EAAE,EAAE,MAAM,EAAE,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;IACrE,CAAC;IAED,KAAK,CAAC,YAAY,CAAC,OAAe,EAAE,IAAI,GAAG,CAAC,EAAE,IAAI,GAAG,EAAE;QACrD,OAAO,IAAI,CAAC,OAAO,CAAU,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;IAC5E,CAAC;IAED,KAAK,CAAC,oBAAoB,CAAC,MAAc;QACvC,OAAO,IAAI,CAAC,OAAO,CAAU,SAAS,CAAC,IAAI,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC,CAAC;IACrE,CAAC;IAED,KAAK,CAAC,kBAAkB,CAAC,IAAY;QACnC,OAAO,IAAI,CAAC,OAAO,CAAU,SAAS,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC;IACjE,CAAC;IAEO,KAAK,CAAC,OAAO,CAAI,GAAW,EAAE,OAAoB,EAAE,EAAE,SAAS,GAAG,IAAI;QAC5E,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAE1C,IAAI,SAAS,EAAE,CAAC;YACd,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,cAAc,EAAE,CAAC;YACrD,IAAI,CAAC,KAAK,EAAE,CAAC;gBACX,MAAM,IAAI,KAAK,CAAC,0CAA0C,CAAC,CAAC;YAC9D,CAAC;YACD,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,UAAU,KAAK,EAAE,CAAC,CAAC;QAClD,CAAC;QAED,IAAI,QAAQ,GAAG,IAAI,CAAC,MAAM,EAAE,SAAS;YACnC,CAAC,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE;gBAC7B,GAAG,IAAI;gBACP,OAAO,EAAE,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;aAC/C,CAAC;YACF,CAAC,CAAC,MAAM,KAAK,CAAC,GAAG,EAAE;gBACjB,GAAG,IAAI;gBACP,OAAO;aACR,CAAC,CAAC;QAEL,8BAA8B;QAC9B,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,IAAI,SAAS,EAAE,CAAC;YACzC,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC;YAC/C,IAAI,SAAS,EAAE,CAAC;gBACd,OAAO,CAAC,GAAG,CAAC,eAAe,EAAE,UAAU,SAAS,CAAC,WAAW,EAAE,CAAC,CAAC;gBAChE,QAAQ,GAAG,IAAI,CAAC,MAAM,EAAE,SAAS;oBAC/B,CAAC,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE;wBAC7B,GAAG,IAAI;wBACP,OAAO,EAAE,MAAM,CAAC,WAAW,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;qBAC/C,CAAC;oBACF,CAAC,CAAC,MAAM,KAAK,CAAC,GAAG,EAAE;wBACjB,GAAG,IAAI;wBACP,OAAO;qBACR,CAAC,CAAC;YACP,CAAC;QACH,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QACnC,MAAM,IAAI,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;QAE7B,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,IAAI,QAAQ,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;gBAC5B,MAAM,IAAI,KAAK,CAAC,qDAAqD,CAAC,CAAC;YACzE,CAAC;YACD,MAAM,MAAM,GAAG,cAAc,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC;YAC5C,MAAM,IAAI,KAAK,CAAC,mBAAmB,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,GAAG,MAAM,CAAC,CAAC,CAAC,KAAK,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QAC7G,CAAC;QAED,OAAO,IAAS,CAAC;IACnB,CAAC;IAEO,KAAK,CAAC,eAAe;QAC3B,0CAA0C;QAC1C,IAAI,IAAI,CAAC,cAAc,EAAE,CAAC;YACxB,OAAO,IAAI,CAAC,cAAc,CAAC;QAC7B,CAAC;QAED,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;QAE5C,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC;YACzC,OAAO,MAAM,CAAC;QAChB,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,cAAc,GAAG,IAAI,CAAC;QAC7B,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,cAAc;QAC1B,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,iBAAiB,EAAE,EAAE,CAAC;QAC5D,MAAM,YAAY,GAAG,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,MAAM,IAAI,CAAC,UAAU,CAAC,eAAe,EAAE,CAAC;QAC9F,IAAI,CAAC,YAAY,EAAE,CAAC;YAClB,OAAO,IAAI,CAAC;QACd,CAAC;QAED,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,IAAI,eAAe,CAAC;gBAC/B,aAAa,EAAE,YAAY;gBAC3B,SAAS,EAAE,gBAAgB;gBAC3B,aAAa,EAAE,oBAAoB;gBACnC,UAAU,EAAE,eAAe;gBAC3B,KAAK,EAAE,gCAAgC;aACxC,CAAC,CAAC;YAEH,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,OAAO,CAAY,SAAS,CAAC,IAAI,CAAC,KAAK,EAAE;gBAChE,MAAM,EAAE,MAAM;gBACd,OAAO,EAAE;oBACP,cAAc,EAAE,mCAAmC;iBACpD;gBACD,IAAI;aACL,EAAE,KAAK,CAAC,CAAC;YAEV,IAAI,CAAC,KAAK,CAAC,YAAY,EAAE,CAAC;gBACxB,OAAO,IAAI,CAAC;YACd,CAAC;YAED,MAAM,MAAM,GAAuB;gBACjC,WAAW,EAAE,KAAK,CAAC,YAAY;gBAC/B,YAAY,EAAE,KAAK,CAAC,aAAa;aAClC,CAAC;YAEF,IAAI,OAAO,IAAI,IAAI,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC;gBAC3C,MAAM,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,OAAO,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YAC7D,CAAC;iBAAM,CAAC;gBACN,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YACrC,CAAC;YACD,OAAO,MAAM,CAAC;QAChB,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;CACF;AAED,SAAS,SAAS,CAAC,IAAY;IAC7B,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAY,CAAC;IACrC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,cAAc,CAAC,IAAa;IACnC,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;QAC9C,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,IAAI,mBAAmB,IAAI,IAAI,IAAI,OAAO,IAAI,CAAC,iBAAiB,KAAK,QAAQ,EAAE,CAAC;QAC9E,OAAO,IAAI,CAAC,iBAAiB,CAAC;IAChC,CAAC;IAED,IAAI,SAAS,IAAI,IAAI,IAAI,OAAO,IAAI,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;QAC1D,OAAO,IAAI,CAAC,OAAO,CAAC;IACtB,CAAC;IAED,IAAI,OAAO,IAAI,IAAI,IAAI,OAAO,IAAI,CAAC,KAAK,KAAK,QAAQ,EAAE,CAAC;QACtD,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;IAED,OAAO,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;AAC9B,CAAC"}
|
|
@@ -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
|