qqbotsdk-guild-py 2.0.0__py3-none-any.whl
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.
- qqbotsdk/api/guild/agent.md +33 -0
- qqbotsdk/api/guild/channel.py +129 -0
- qqbotsdk/api/guild/content.py +214 -0
- qqbotsdk/api/guild/guild.py +68 -0
- qqbotsdk/api/guild/member.py +179 -0
- qqbotsdk/api/guild/messages.py +126 -0
- qqbotsdk/model/guild/agent.md +36 -0
- qqbotsdk/model/guild/channel.py +177 -0
- qqbotsdk/model/guild/content.py +285 -0
- qqbotsdk/model/guild/event.py +281 -0
- qqbotsdk/model/guild/event_audio.py +58 -0
- qqbotsdk/model/guild/event_forum.py +668 -0
- qqbotsdk/model/guild/event_member.py +85 -0
- qqbotsdk/model/guild/event_message.py +205 -0
- qqbotsdk/model/guild/guild.py +165 -0
- qqbotsdk/model/guild/member.py +256 -0
- qqbotsdk/model/guild/messages.py +349 -0
- qqbotsdk_guild_py-2.0.0.dist-info/METADATA +25 -0
- qqbotsdk_guild_py-2.0.0.dist-info/RECORD +20 -0
- qqbotsdk_guild_py-2.0.0.dist-info/WHEEL +4 -0
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
from qqbotsdk.api.core import session
|
|
2
|
+
from qqbotsdk.model.guild.messages import (
|
|
3
|
+
CreateDmsRequest,
|
|
4
|
+
CreateDmsResponse,
|
|
5
|
+
GetChannelMessagesResponse,
|
|
6
|
+
GetChannelReactionUsersRequest,
|
|
7
|
+
GetChannelReactionUsersResponse,
|
|
8
|
+
SendChannelMessagesRequest,
|
|
9
|
+
SendChannelMessagesResponse,
|
|
10
|
+
SendDmsMessagesRequest,
|
|
11
|
+
SendDmsMessagesResponse,
|
|
12
|
+
)
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
async def send_channel_messages(
|
|
16
|
+
channel_id: str,
|
|
17
|
+
payload: SendChannelMessagesRequest,
|
|
18
|
+
) -> SendChannelMessagesResponse:
|
|
19
|
+
async with session.post(
|
|
20
|
+
f"/channels/{channel_id}/messages",
|
|
21
|
+
json=payload.model_dump(exclude_none=True),
|
|
22
|
+
) as resp:
|
|
23
|
+
result = await resp.json()
|
|
24
|
+
|
|
25
|
+
return SendChannelMessagesResponse.model_validate(result)
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
async def recall_channel_messages(
|
|
29
|
+
channel_id: str,
|
|
30
|
+
message_id: str,
|
|
31
|
+
hide_tip: bool = False,
|
|
32
|
+
) -> None:
|
|
33
|
+
async with session.delete(
|
|
34
|
+
f"/channels/{channel_id}/messages/{message_id}",
|
|
35
|
+
params={"hidetip": str(hide_tip).lower()},
|
|
36
|
+
) as resp:
|
|
37
|
+
await resp.json()
|
|
38
|
+
|
|
39
|
+
|
|
40
|
+
async def get_channel_messages(
|
|
41
|
+
channel_id: str,
|
|
42
|
+
message_id: str,
|
|
43
|
+
) -> GetChannelMessagesResponse:
|
|
44
|
+
async with session.get(
|
|
45
|
+
f"/channels/{channel_id}/messages/{message_id}",
|
|
46
|
+
) as resp:
|
|
47
|
+
result = await resp.json()
|
|
48
|
+
|
|
49
|
+
return GetChannelMessagesResponse.model_validate(result)
|
|
50
|
+
|
|
51
|
+
|
|
52
|
+
async def put_channel_reaction(
|
|
53
|
+
channel_id: str,
|
|
54
|
+
message_id: str,
|
|
55
|
+
emoji_type: int,
|
|
56
|
+
emoji_id: str,
|
|
57
|
+
) -> None:
|
|
58
|
+
async with session.put(
|
|
59
|
+
f"/channels/{channel_id}/messages/{message_id}/reactions/{emoji_type}/{emoji_id}",
|
|
60
|
+
) as resp:
|
|
61
|
+
await resp.json()
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
async def delete_channel_reaction(
|
|
65
|
+
channel_id: str,
|
|
66
|
+
message_id: str,
|
|
67
|
+
emoji_type: int,
|
|
68
|
+
emoji_id: str,
|
|
69
|
+
) -> None:
|
|
70
|
+
async with session.delete(
|
|
71
|
+
f"/channels/{channel_id}/messages/{message_id}/reactions/{emoji_type}/{emoji_id}",
|
|
72
|
+
) as resp:
|
|
73
|
+
await resp.json()
|
|
74
|
+
|
|
75
|
+
|
|
76
|
+
async def get_channel_reaction_users(
|
|
77
|
+
channel_id: str,
|
|
78
|
+
message_id: str,
|
|
79
|
+
emoji_type: int,
|
|
80
|
+
emoji_id: str,
|
|
81
|
+
payload: GetChannelReactionUsersRequest,
|
|
82
|
+
) -> GetChannelReactionUsersResponse:
|
|
83
|
+
async with session.get(
|
|
84
|
+
f"/channels/{channel_id}/messages/{message_id}/reactions/{emoji_type}/{emoji_id}",
|
|
85
|
+
params=payload.model_dump(exclude_none=True),
|
|
86
|
+
) as resp:
|
|
87
|
+
result = await resp.json()
|
|
88
|
+
|
|
89
|
+
return GetChannelReactionUsersResponse.model_validate(result)
|
|
90
|
+
|
|
91
|
+
|
|
92
|
+
async def create_dms(
|
|
93
|
+
payload: CreateDmsRequest,
|
|
94
|
+
) -> CreateDmsResponse:
|
|
95
|
+
async with session.post(
|
|
96
|
+
"/users/@me/dms",
|
|
97
|
+
json=payload.model_dump(exclude_none=True),
|
|
98
|
+
) as resp:
|
|
99
|
+
result = await resp.json()
|
|
100
|
+
|
|
101
|
+
return CreateDmsResponse.model_validate(result)
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
async def send_dms_messages(
|
|
105
|
+
guild_id: str,
|
|
106
|
+
payload: SendDmsMessagesRequest,
|
|
107
|
+
) -> SendDmsMessagesResponse:
|
|
108
|
+
async with session.post(
|
|
109
|
+
f"/dms/{guild_id}/messages",
|
|
110
|
+
json=payload.model_dump(exclude_none=True),
|
|
111
|
+
) as resp:
|
|
112
|
+
result = await resp.json()
|
|
113
|
+
|
|
114
|
+
return SendDmsMessagesResponse.model_validate(result)
|
|
115
|
+
|
|
116
|
+
|
|
117
|
+
async def recall_dms_messages(
|
|
118
|
+
guild_id: str,
|
|
119
|
+
message_id: str,
|
|
120
|
+
hide_tip: bool = False,
|
|
121
|
+
) -> None:
|
|
122
|
+
async with session.delete(
|
|
123
|
+
f"/dms/{guild_id}/messages/{message_id}",
|
|
124
|
+
params={"hidetip": str(hide_tip).lower()},
|
|
125
|
+
) as resp:
|
|
126
|
+
await resp.json()
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
# agent.md — qqbotsdk/model/guild(频道域模型与事件)
|
|
2
|
+
|
|
3
|
+
适用范围:`packages/qqbotsdk-guild/src/qqbotsdk/model/guild/**`(`channel.py`、`guild.py`、`member.py`、`messages.py`、`content.py`,以及 `event.py`、`event_message.py`、`event_member.py`、`event_forum.py`、`event_audio.py`)。
|
|
4
|
+
|
|
5
|
+
## MUST(必须做)
|
|
6
|
+
|
|
7
|
+
- MUST 优先复用已有对象模型(`Guild`、`Channel`、`Member`、`User`、`Role`、`MessageEmbed`、`MessageArk`、`MessageAuthor`),事件体里出现这些对象时直接引用,不要复制字段。
|
|
8
|
+
- MUST 对**需要容错**的字段保持 `int`/`str`:`Channel.type` / `sub_type` / `private_type` / `speak_permission`,以及事件里的 `channel_type`(文档 `2=音视频`、`5=直播` 与 `10005` 两处冲突)。在 `description` 里列出取值,不要用 `Literal` 关死。
|
|
9
|
+
- MUST 对封闭枚举用 `Literal`:`announces_type`(0/1)、`AudioControlRequest.status`(0-3)、`PutChannelThreadRequest.format`(1-4)、`RemoveGuildMemberRequest.delete_history_msg_days`(-1/0/3/7/15/30)。
|
|
10
|
+
- MUST 在事件模型里只建模事件体 `d`,并维护 `EVENT_MODELS` + `parse_event(payload)`(契约见 `qqbotsdk/src/qqbotsdk/model/event/agent.md`);新增事件必须同时更新注册表与 `__all__`。
|
|
11
|
+
- MUST 用 `BeforeValidator` 之类把示例里的**整型 ID 归一化为字符串**(`guild_id`/`channel_id`/`author_id`/`emoji_info.id` 等),保证文档示例与真实报文都能解析。
|
|
12
|
+
- MUST 给分页参数加边界:`limit` 的 `le=100`(频道列表)/`le=400`(成员与身份组成员)。
|
|
13
|
+
|
|
14
|
+
## SHOULD(应当做)
|
|
15
|
+
|
|
16
|
+
- SHOULD 让响应模型的字段默认可选;频道文档的「返回包」示例比字段表更全时,以示例为准补充可选字段(如 `tts`/`pinned`/`type`/`flags`)。
|
|
17
|
+
- SHOULD 用 `EventMessage` 这类继承自响应模型的子类承载事件专有字段(`member`、`mentions`、`seq`),而不是把事件字段塞回响应模型。
|
|
18
|
+
- SHOULD 让论坛富文本按 `RichObject` 数组建模(`EventThreadInfo` 等);表格里写 `string` 而示例是数组时,以示例为准并在说明里注明。
|
|
19
|
+
|
|
20
|
+
## MUST NOT(禁止做)
|
|
21
|
+
|
|
22
|
+
- MUST NOT 加回子频道公告相关模型(官方已废弃)。
|
|
23
|
+
- MUST NOT 用 `Literal` 收窄 `Channel.type` 这类需要向前兼容的字段。
|
|
24
|
+
- MUST NOT 让事件模型继承字段类型不兼容的父类(pyright strict 会报 `reportIncompatibleVariableOverride`);需要覆盖时新建独立模型。
|
|
25
|
+
- MUST NOT 在事件模型里放业务逻辑或发消息。
|
|
26
|
+
- MUST NOT 在 `EventMessage` 之外重复定义消息/用户/成员结构。
|
|
27
|
+
|
|
28
|
+
## 自检
|
|
29
|
+
|
|
30
|
+
```powershell
|
|
31
|
+
cd D:\QQBotSDK
|
|
32
|
+
.venv\Scripts\ruff.exe check packages\qqbotsdk-guild\src\qqbotsdk\model
|
|
33
|
+
.venv\Scripts\pyright.exe
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
事件回归:每个事件文档页的示例 `d` 先直接 `model_validate`,再包成整帧走 `GatewayPayload` → `parse_event`,两路都断言字段值;并断言 `EVENT_MODELS` 与官方 intents 清单一致(当前 40 个)。
|
|
@@ -0,0 +1,177 @@
|
|
|
1
|
+
from pydantic import Field, RootModel
|
|
2
|
+
|
|
3
|
+
from qqbotsdk.model.core import QQBotBaseModel, QQBotRequestModel
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
class Channel(QQBotBaseModel):
|
|
7
|
+
id: str = Field(
|
|
8
|
+
...,
|
|
9
|
+
description="子频道 ID",
|
|
10
|
+
)
|
|
11
|
+
guild_id: str | None = Field(
|
|
12
|
+
default=None,
|
|
13
|
+
description="所属频道 ID",
|
|
14
|
+
)
|
|
15
|
+
name: str | None = Field(
|
|
16
|
+
default=None,
|
|
17
|
+
description="子频道名",
|
|
18
|
+
)
|
|
19
|
+
type: int | None = Field(
|
|
20
|
+
default=None,
|
|
21
|
+
description="子频道类型:0=文字,2=语音,4=分组,10005=直播,10006=应用,10007=论坛",
|
|
22
|
+
)
|
|
23
|
+
sub_type: int | None = Field(
|
|
24
|
+
default=None,
|
|
25
|
+
description="子频道子类型:0=闲聊,1=公告,2=攻略,3=开黑",
|
|
26
|
+
)
|
|
27
|
+
position: int | None = Field(
|
|
28
|
+
default=None,
|
|
29
|
+
description="排序值,从 1 开始",
|
|
30
|
+
)
|
|
31
|
+
parent_id: str | None = Field(
|
|
32
|
+
default=None,
|
|
33
|
+
description="所属分组 ID,仅对子频道有效,对子频道分组(type=4)无效",
|
|
34
|
+
)
|
|
35
|
+
owner_id: str | None = Field(
|
|
36
|
+
default=None,
|
|
37
|
+
description="创建人 ID",
|
|
38
|
+
)
|
|
39
|
+
private_type: int | None = Field(
|
|
40
|
+
default=None,
|
|
41
|
+
description="私密类型:0=公开,1=群主管理员可见,2=群主管理员+指定成员",
|
|
42
|
+
)
|
|
43
|
+
speak_permission: int | None = Field(
|
|
44
|
+
default=None,
|
|
45
|
+
description="发言权限:0=无效,1=所有人,2=群主管理员+指定成员",
|
|
46
|
+
)
|
|
47
|
+
application_id: str | None = Field(
|
|
48
|
+
default=None,
|
|
49
|
+
description="应用子频道标识",
|
|
50
|
+
)
|
|
51
|
+
permissions: str | None = Field(
|
|
52
|
+
default=None,
|
|
53
|
+
description="用户拥有的子频道权限位图",
|
|
54
|
+
)
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
class GetChannelResponse(Channel):
|
|
58
|
+
pass
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
class GetGuildChannelsResponse(RootModel[list[Channel]]):
|
|
62
|
+
pass
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
class CreateChannelRequest(QQBotRequestModel):
|
|
66
|
+
name: str | None = Field(
|
|
67
|
+
default=None,
|
|
68
|
+
description="子频道名称",
|
|
69
|
+
)
|
|
70
|
+
type: int | None = Field(
|
|
71
|
+
default=None,
|
|
72
|
+
description="子频道类型:0=文字,2=语音,4=分组,10005=直播,10006=应用,10007=论坛",
|
|
73
|
+
)
|
|
74
|
+
sub_type: int | None = Field(
|
|
75
|
+
default=None,
|
|
76
|
+
description="子频道子类型:0=闲聊,1=公告,2=攻略,3=开黑",
|
|
77
|
+
)
|
|
78
|
+
position: int | None = Field(
|
|
79
|
+
default=None,
|
|
80
|
+
description="排序值;分组类型(type=4)必须 >= 2",
|
|
81
|
+
)
|
|
82
|
+
parent_id: str | None = Field(
|
|
83
|
+
default=None,
|
|
84
|
+
description="所属分组 ID",
|
|
85
|
+
)
|
|
86
|
+
private_type: int | None = Field(
|
|
87
|
+
default=None,
|
|
88
|
+
description="私密类型:0=公开,1=群主管理员可见,2=群主管理员+指定成员",
|
|
89
|
+
)
|
|
90
|
+
private_user_ids: list[str] | None = Field(
|
|
91
|
+
default=None,
|
|
92
|
+
description="私密成员 ID 列表",
|
|
93
|
+
)
|
|
94
|
+
speak_permission: int | None = Field(
|
|
95
|
+
default=None,
|
|
96
|
+
description="发言权限:0=无效,1=所有人,2=群主管理员+指定成员",
|
|
97
|
+
)
|
|
98
|
+
application_id: str | None = Field(
|
|
99
|
+
default=None,
|
|
100
|
+
description="应用子频道 AppID,仅应用子频道需要",
|
|
101
|
+
)
|
|
102
|
+
|
|
103
|
+
|
|
104
|
+
class CreateChannelResponse(Channel):
|
|
105
|
+
pass
|
|
106
|
+
|
|
107
|
+
|
|
108
|
+
class UpdateChannelRequest(QQBotRequestModel):
|
|
109
|
+
name: str | None = Field(
|
|
110
|
+
default=None,
|
|
111
|
+
description="子频道名",
|
|
112
|
+
)
|
|
113
|
+
position: int | None = Field(
|
|
114
|
+
default=None,
|
|
115
|
+
description="排序值",
|
|
116
|
+
)
|
|
117
|
+
parent_id: str | None = Field(
|
|
118
|
+
default=None,
|
|
119
|
+
description="所属分组 ID",
|
|
120
|
+
)
|
|
121
|
+
private_type: int | None = Field(
|
|
122
|
+
default=None,
|
|
123
|
+
description="私密类型:0=公开,1=群主管理员可见,2=群主管理员+指定成员",
|
|
124
|
+
)
|
|
125
|
+
speak_permission: int | None = Field(
|
|
126
|
+
default=None,
|
|
127
|
+
description="发言权限:0=无效,1=所有人,2=群主管理员+指定成员",
|
|
128
|
+
)
|
|
129
|
+
|
|
130
|
+
|
|
131
|
+
class UpdateChannelResponse(Channel):
|
|
132
|
+
pass
|
|
133
|
+
|
|
134
|
+
|
|
135
|
+
class GetChannelOnlineNumsResponse(QQBotBaseModel):
|
|
136
|
+
online_nums: int | None = Field(
|
|
137
|
+
default=None,
|
|
138
|
+
description="子频道在线成员数",
|
|
139
|
+
)
|
|
140
|
+
|
|
141
|
+
|
|
142
|
+
class ChannelPermissions(QQBotBaseModel):
|
|
143
|
+
channel_id: str | None = Field(
|
|
144
|
+
default=None,
|
|
145
|
+
description="子频道 ID",
|
|
146
|
+
)
|
|
147
|
+
user_id: str | None = Field(
|
|
148
|
+
default=None,
|
|
149
|
+
description="用户 ID",
|
|
150
|
+
)
|
|
151
|
+
role_id: str | None = Field(
|
|
152
|
+
default=None,
|
|
153
|
+
description="身份组 ID",
|
|
154
|
+
)
|
|
155
|
+
permissions: str | None = Field(
|
|
156
|
+
default=None,
|
|
157
|
+
description="字符串形式的权限位图",
|
|
158
|
+
)
|
|
159
|
+
|
|
160
|
+
|
|
161
|
+
class GetChannelPermissionsResponse(ChannelPermissions):
|
|
162
|
+
pass
|
|
163
|
+
|
|
164
|
+
|
|
165
|
+
class GetChannelRolePermissionsResponse(ChannelPermissions):
|
|
166
|
+
pass
|
|
167
|
+
|
|
168
|
+
|
|
169
|
+
class UpdateChannelPermissionsRequest(QQBotRequestModel):
|
|
170
|
+
add: str | None = Field(
|
|
171
|
+
default=None,
|
|
172
|
+
description="字符串形式的位图,表示赋予的权限",
|
|
173
|
+
)
|
|
174
|
+
remove: str | None = Field(
|
|
175
|
+
default=None,
|
|
176
|
+
description="字符串形式的位图,表示删除的权限",
|
|
177
|
+
)
|
|
@@ -0,0 +1,285 @@
|
|
|
1
|
+
from typing import Literal
|
|
2
|
+
|
|
3
|
+
from pydantic import Field, RootModel
|
|
4
|
+
|
|
5
|
+
from qqbotsdk.model.core import QQBotBaseModel, QQBotRequestModel
|
|
6
|
+
from qqbotsdk.model.guild.member import Member
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
class RecommendChannel(QQBotBaseModel):
|
|
10
|
+
channel_id: str | None = Field(
|
|
11
|
+
default=None,
|
|
12
|
+
description="推荐子频道 ID",
|
|
13
|
+
)
|
|
14
|
+
introduce: str | None = Field(
|
|
15
|
+
default=None,
|
|
16
|
+
description="推荐语",
|
|
17
|
+
)
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
class CreateGuildAnnounceRequest(QQBotRequestModel):
|
|
21
|
+
channel_id: str | None = Field(
|
|
22
|
+
default=None,
|
|
23
|
+
description="子频道 ID,message_id 有值时必填",
|
|
24
|
+
)
|
|
25
|
+
message_id: str | None = Field(
|
|
26
|
+
default=None,
|
|
27
|
+
description="消息 ID,有值时创建消息类型的成员公告",
|
|
28
|
+
)
|
|
29
|
+
announces_type: Literal[0, 1] | None = Field(
|
|
30
|
+
default=None,
|
|
31
|
+
description="公告类别:0=成员公告,1=欢迎公告",
|
|
32
|
+
)
|
|
33
|
+
recommend_channels: list[RecommendChannel] | None = Field(
|
|
34
|
+
default=None,
|
|
35
|
+
description="推荐子频道列表,会一次全部替换;与消息类型公告互斥",
|
|
36
|
+
)
|
|
37
|
+
|
|
38
|
+
|
|
39
|
+
class Announce(QQBotBaseModel):
|
|
40
|
+
guild_id: str | None = Field(
|
|
41
|
+
default=None,
|
|
42
|
+
description="频道 ID",
|
|
43
|
+
)
|
|
44
|
+
channel_id: str | None = Field(
|
|
45
|
+
default=None,
|
|
46
|
+
description="子频道 ID",
|
|
47
|
+
)
|
|
48
|
+
message_id: str | None = Field(
|
|
49
|
+
default=None,
|
|
50
|
+
description="消息 ID",
|
|
51
|
+
)
|
|
52
|
+
announces_type: int | None = Field(
|
|
53
|
+
default=None,
|
|
54
|
+
description="公告类别:0=成员公告,1=欢迎公告",
|
|
55
|
+
)
|
|
56
|
+
recommend_channels: list[RecommendChannel] | None = Field(
|
|
57
|
+
default=None,
|
|
58
|
+
description="推荐子频道列表",
|
|
59
|
+
)
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
class CreateGuildAnnounceResponse(Announce):
|
|
63
|
+
pass
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
class PinsMessage(QQBotBaseModel):
|
|
67
|
+
guild_id: str | None = Field(
|
|
68
|
+
default=None,
|
|
69
|
+
description="频道 ID",
|
|
70
|
+
)
|
|
71
|
+
channel_id: str | None = Field(
|
|
72
|
+
default=None,
|
|
73
|
+
description="子频道 ID",
|
|
74
|
+
)
|
|
75
|
+
message_ids: list[str] | None = Field(
|
|
76
|
+
default=None,
|
|
77
|
+
description="当前子频道内所有精华消息 ID",
|
|
78
|
+
)
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
class GetChannelPinsResponse(PinsMessage):
|
|
82
|
+
pass
|
|
83
|
+
|
|
84
|
+
|
|
85
|
+
class ScheduleInfo(QQBotBaseModel):
|
|
86
|
+
name: str | None = Field(
|
|
87
|
+
default=None,
|
|
88
|
+
description="日程名称",
|
|
89
|
+
)
|
|
90
|
+
description: str | None = Field(
|
|
91
|
+
default=None,
|
|
92
|
+
description="日程描述",
|
|
93
|
+
)
|
|
94
|
+
start_timestamp: str | None = Field(
|
|
95
|
+
default=None,
|
|
96
|
+
description="开始时间,毫秒级时间戳字符串",
|
|
97
|
+
)
|
|
98
|
+
end_timestamp: str | None = Field(
|
|
99
|
+
default=None,
|
|
100
|
+
description="结束时间,毫秒级时间戳字符串",
|
|
101
|
+
)
|
|
102
|
+
jump_channel_id: str | None = Field(
|
|
103
|
+
default=None,
|
|
104
|
+
description="跳转子频道 ID",
|
|
105
|
+
)
|
|
106
|
+
remind_type: str | None = Field(
|
|
107
|
+
default=None,
|
|
108
|
+
description="提醒类型:0=不提醒,1=开始时提醒,2=开始前 5 分钟提醒,3=开始前 15 分钟提醒,4=开始前 30 分钟提醒,5=开始前 60 分钟提醒",
|
|
109
|
+
)
|
|
110
|
+
|
|
111
|
+
|
|
112
|
+
class CreateChannelScheduleRequest(QQBotRequestModel):
|
|
113
|
+
schedule: ScheduleInfo = Field(
|
|
114
|
+
...,
|
|
115
|
+
description="日程对象,不需要带 id",
|
|
116
|
+
)
|
|
117
|
+
|
|
118
|
+
|
|
119
|
+
class UpdateChannelScheduleRequest(QQBotRequestModel):
|
|
120
|
+
schedule: ScheduleInfo = Field(
|
|
121
|
+
...,
|
|
122
|
+
description="日程对象,不需要带 id",
|
|
123
|
+
)
|
|
124
|
+
|
|
125
|
+
|
|
126
|
+
class Schedule(QQBotBaseModel):
|
|
127
|
+
id: str | None = Field(
|
|
128
|
+
default=None,
|
|
129
|
+
description="日程 ID",
|
|
130
|
+
)
|
|
131
|
+
name: str | None = Field(
|
|
132
|
+
default=None,
|
|
133
|
+
description="日程名称",
|
|
134
|
+
)
|
|
135
|
+
description: str | None = Field(
|
|
136
|
+
default=None,
|
|
137
|
+
description="日程描述",
|
|
138
|
+
)
|
|
139
|
+
start_timestamp: str | None = Field(
|
|
140
|
+
default=None,
|
|
141
|
+
description="开始时间,毫秒级时间戳字符串",
|
|
142
|
+
)
|
|
143
|
+
end_timestamp: str | None = Field(
|
|
144
|
+
default=None,
|
|
145
|
+
description="结束时间,毫秒级时间戳字符串",
|
|
146
|
+
)
|
|
147
|
+
creator: Member | None = Field(
|
|
148
|
+
default=None,
|
|
149
|
+
description="创建者 member 信息",
|
|
150
|
+
)
|
|
151
|
+
jump_channel_id: str | None = Field(
|
|
152
|
+
default=None,
|
|
153
|
+
description="跳转子频道 ID",
|
|
154
|
+
)
|
|
155
|
+
remind_type: str | None = Field(
|
|
156
|
+
default=None,
|
|
157
|
+
description="提醒类型:0=不提醒,1=开始时提醒,2=开始前 5 分钟提醒,3=开始前 15 分钟提醒,4=开始前 30 分钟提醒,5=开始前 60 分钟提醒",
|
|
158
|
+
)
|
|
159
|
+
|
|
160
|
+
|
|
161
|
+
class CreateChannelScheduleResponse(Schedule):
|
|
162
|
+
pass
|
|
163
|
+
|
|
164
|
+
|
|
165
|
+
class UpdateChannelScheduleResponse(Schedule):
|
|
166
|
+
pass
|
|
167
|
+
|
|
168
|
+
|
|
169
|
+
class GetChannelScheduleResponse(Schedule):
|
|
170
|
+
pass
|
|
171
|
+
|
|
172
|
+
|
|
173
|
+
class GetChannelSchedulesRequest(QQBotRequestModel):
|
|
174
|
+
since: int | None = Field(
|
|
175
|
+
default=None,
|
|
176
|
+
description="起始时间戳(毫秒);不传返回当天日程",
|
|
177
|
+
)
|
|
178
|
+
|
|
179
|
+
|
|
180
|
+
class GetChannelSchedulesResponse(RootModel[list[Schedule]]):
|
|
181
|
+
pass
|
|
182
|
+
|
|
183
|
+
|
|
184
|
+
class AudioControlRequest(QQBotRequestModel):
|
|
185
|
+
audio_url: str | None = Field(
|
|
186
|
+
default=None,
|
|
187
|
+
description="音频数据 URL,status=0 时传",
|
|
188
|
+
)
|
|
189
|
+
text: str | None = Field(
|
|
190
|
+
default=None,
|
|
191
|
+
description="状态文本,status=0 时传",
|
|
192
|
+
)
|
|
193
|
+
status: Literal[0, 1, 2, 3] = Field(
|
|
194
|
+
...,
|
|
195
|
+
description="播放状态:0=开始,1=暂停,2=继续,3=停止",
|
|
196
|
+
)
|
|
197
|
+
|
|
198
|
+
|
|
199
|
+
class ForumThreadInfo(QQBotBaseModel):
|
|
200
|
+
thread_id: str | None = Field(
|
|
201
|
+
default=None,
|
|
202
|
+
description="主帖 ID",
|
|
203
|
+
)
|
|
204
|
+
title: str | None = Field(
|
|
205
|
+
default=None,
|
|
206
|
+
description="帖子标题",
|
|
207
|
+
)
|
|
208
|
+
content: str | None = Field(
|
|
209
|
+
default=None,
|
|
210
|
+
description="帖子内容;format=4 时为 RichText 的 JSON 字符串",
|
|
211
|
+
)
|
|
212
|
+
date_time: str | None = Field(
|
|
213
|
+
default=None,
|
|
214
|
+
description="发表时间,ISO8601 格式",
|
|
215
|
+
)
|
|
216
|
+
|
|
217
|
+
|
|
218
|
+
class ForumThread(QQBotBaseModel):
|
|
219
|
+
guild_id: str | None = Field(
|
|
220
|
+
default=None,
|
|
221
|
+
description="频道 ID",
|
|
222
|
+
)
|
|
223
|
+
channel_id: str | None = Field(
|
|
224
|
+
default=None,
|
|
225
|
+
description="子频道 ID",
|
|
226
|
+
)
|
|
227
|
+
author_id: str | None = Field(
|
|
228
|
+
default=None,
|
|
229
|
+
description="作者 ID",
|
|
230
|
+
)
|
|
231
|
+
thread_info: ForumThreadInfo | None = Field(
|
|
232
|
+
default=None,
|
|
233
|
+
description="主帖内容",
|
|
234
|
+
)
|
|
235
|
+
|
|
236
|
+
|
|
237
|
+
class GetChannelThreadResponse(QQBotBaseModel):
|
|
238
|
+
thread: ForumThread | None = Field(
|
|
239
|
+
default=None,
|
|
240
|
+
description="帖子详情对象",
|
|
241
|
+
)
|
|
242
|
+
|
|
243
|
+
|
|
244
|
+
class GetChannelThreadsResponse(QQBotBaseModel):
|
|
245
|
+
threads: list[ForumThread] | None = Field(
|
|
246
|
+
default=None,
|
|
247
|
+
description="帖子列表",
|
|
248
|
+
)
|
|
249
|
+
is_finish: int | None = Field(
|
|
250
|
+
default=None,
|
|
251
|
+
description="是否拉取完毕:0=否,1=是",
|
|
252
|
+
)
|
|
253
|
+
|
|
254
|
+
|
|
255
|
+
class PutChannelThreadRequest(QQBotRequestModel):
|
|
256
|
+
title: str = Field(
|
|
257
|
+
...,
|
|
258
|
+
description="帖子标题",
|
|
259
|
+
)
|
|
260
|
+
content: str = Field(
|
|
261
|
+
...,
|
|
262
|
+
description="帖子内容;format=4 时参照 RichText 结构",
|
|
263
|
+
)
|
|
264
|
+
format: Literal[1, 2, 3, 4] = Field(
|
|
265
|
+
...,
|
|
266
|
+
description="内容格式:1=纯文本,2=HTML,3=Markdown,4=RichText JSON",
|
|
267
|
+
)
|
|
268
|
+
|
|
269
|
+
|
|
270
|
+
class ForumTaskResponse(QQBotBaseModel):
|
|
271
|
+
task_id: str | None = Field(
|
|
272
|
+
default=None,
|
|
273
|
+
description="异步任务 ID,结果经 FORUM_* 事件推送",
|
|
274
|
+
)
|
|
275
|
+
|
|
276
|
+
|
|
277
|
+
class PutChannelThreadResponse(ForumTaskResponse):
|
|
278
|
+
create_time: str | None = Field(
|
|
279
|
+
default=None,
|
|
280
|
+
description="发帖时间戳,单位:秒",
|
|
281
|
+
)
|
|
282
|
+
|
|
283
|
+
|
|
284
|
+
class DeleteChannelThreadResponse(ForumTaskResponse):
|
|
285
|
+
pass
|