Skip to content

Commit abb6152

Browse files
authored
feat: 完善ws事件的数据构建 (#103)
* feat: 完善ws事件中Message数据的构建 * feat: 完善ws事件中User-Member数据的构建 * feat: 完善ws事件中Reaction、Audio、DirectMessage 以及 Forum(Thread类)数据的构建 feat: 去除EmbedField的value项(实际仅有name) * feat: 完善ws事件中监听文档并优化格式 refactor: 优化forum thread的事件数据名称 * fix: forum thread的事件数据名称更变后同步数据更改到其他文件
1 parent 727ed73 commit abb6152

File tree

9 files changed

+428
-114
lines changed

9 files changed

+428
-114
lines changed

botpy/audio.py

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
from .api import BotAPI
2+
from .types import gateway, audio
3+
4+
5+
class Audio:
6+
__slots__ = (
7+
"_api",
8+
"_ctx",
9+
"channel_id",
10+
"guild_id",
11+
"audio_url",
12+
"text",
13+
"event_id")
14+
15+
def __init__(self, api: BotAPI, ctx: gateway.WsContext, data: audio.AudioAction):
16+
self._api = api
17+
18+
self.channel_id = data.get("channel_id")
19+
self.guild_id = data.get("guild_id")
20+
self.audio_url = data.get("audio_url")
21+
self.text = data.get("text")
22+
self.event_id = ctx.get("id")

botpy/connection.py

Lines changed: 26 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,11 @@
55
from .channel import Channel
66
from .guild import Guild
77
from .interaction import Interaction
8-
from .message import Message, MessageAudit
8+
from .message import Message, DirectMessage, MessageAudit
99
from .user import Member
10+
from .reaction import Reaction
11+
from .audio import Audio
12+
from .forum import Thread
1013

1114
from . import logging
1215
from .api import BotAPI
@@ -135,18 +138,20 @@ def parse_message_delete(self, ctx: gateway.WsContext, data: gateway.MessagePayl
135138

136139
# botpy.flags.Intents.guild_message_reactions
137140
def parse_message_reaction_add(self, ctx: gateway.WsContext, data: reaction.Reaction):
138-
self._dispatch("message_reaction_add", data)
141+
_reaction = Reaction(self.api, ctx, data)
142+
self._dispatch("message_reaction_add", _reaction)
139143

140144
def parse_message_reaction_remove(self, ctx: gateway.WsContext, data: reaction.Reaction):
141-
self._dispatch("message_reaction_remove", data)
145+
_reaction = Reaction(self.api, ctx, data)
146+
self._dispatch("message_reaction_remove", _reaction)
142147

143148
# botpy.flags.Intents.direct_message
144-
def parse_direct_message_create(self, ctx: gateway.WsContext, data: gateway.MessagePayload):
145-
_message = Message(self.api, ctx, data)
149+
def parse_direct_message_create(self, ctx: gateway.WsContext, data: gateway.DirectMessagePayload):
150+
_message = DirectMessage(self.api, ctx, data)
146151
self._dispatch("direct_message_create", _message)
147152

148-
def parse_direct_message_delete(self, ctx: gateway.WsContext, data: gateway.MessagePayload):
149-
_message = Message(self.api, ctx, data)
153+
def parse_direct_message_delete(self, ctx: gateway.WsContext, data: gateway.DirectMessagePayload):
154+
_message = DirectMessage(self.api, ctx, data)
150155
self._dispatch("direct_message_delete", _message)
151156

152157
# botpy.flags.Intents.interaction
@@ -165,16 +170,20 @@ def parse_message_audit_reject(self, ctx: gateway.WsContext, data: gateway.Messa
165170

166171
# botpy.flags.Intents.audio_action
167172
def parse_audio_start(self, ctx: gateway.WsContext, data):
168-
self._dispatch("audio_start", data)
173+
_audio = Audio(self.api, ctx, data)
174+
self._dispatch("audio_start", _audio)
169175

170176
def parse_audio_finish(self, ctx: gateway.WsContext, data):
171-
self._dispatch("audio_finish", data)
177+
_audio = Audio(self.api, ctx, data)
178+
self._dispatch("audio_finish", _audio)
172179

173180
def parse_on_mic(self, ctx: gateway.WsContext, data):
174-
self._dispatch("on_mic", data)
181+
_audio = Audio(self.api, ctx, data)
182+
self._dispatch("on_mic", _audio)
175183

176184
def parse_off_mic(self, ctx: gateway.WsContext, data):
177-
self._dispatch("off_mic", data)
185+
_audio = Audio(self.api, ctx, data)
186+
self._dispatch("off_mic", _audio)
178187

179188
# botpy.flags.Intents.public_guild_messages
180189
def parse_at_message_create(self, ctx: gateway.WsContext, data: gateway.MessagePayload):
@@ -188,13 +197,16 @@ def parse_resumed(self, ctx: gateway.WsContext, data: gateway.ReadyEvent):
188197
self._dispatch("resumed")
189198

190199
def parse_forum_thread_create(self, ctx: gateway.WsContext, data: forum.Thread):
191-
self._dispatch("forum_thread_create", data)
200+
_forum = Thread(self.api, ctx, data)
201+
self._dispatch("forum_thread_create", _forum)
192202

193203
def parse_forum_thread_update(self, ctx: gateway.WsContext, data: forum.Thread):
194-
self._dispatch("forum_thread_update", data)
204+
_forum = Thread(self.api, ctx, data)
205+
self._dispatch("forum_thread_update", _forum)
195206

196207
def parse_forum_thread_delete(self, ctx: gateway.WsContext, data: forum.Thread):
197-
self._dispatch("forum_thread_delete", data)
208+
_forum = Thread(self.api, ctx, data)
209+
self._dispatch("forum_thread_delete", _forum)
198210

199211
def parse_forum_post_create(self, ctx: gateway.WsContext, data: forum.Post):
200212
self._dispatch("forum_post_create", data)

botpy/forum.py

Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,108 @@
1+
from json import loads
2+
3+
from .api import BotAPI
4+
from .types import gateway, forum
5+
6+
7+
class _Text:
8+
def __init__(self, data):
9+
self.text = data.get("text", None)
10+
11+
12+
class _Image:
13+
def __init__(self, data):
14+
self.plat_image = self._PlatImage(data.get("plat_image", {}))
15+
16+
class _PlatImage:
17+
def __init__(self, data):
18+
self.url = data.get("url", None)
19+
self.width = data.get("width", None)
20+
self.height = data.get("height", None)
21+
self.image_id = data.get("image_id", None)
22+
23+
24+
class _Video:
25+
def __init__(self, data):
26+
self.plat_video = self._PlatVideo(data.get("plat_video", {}))
27+
28+
class _PlatVideo:
29+
def __init__(self, data):
30+
self.url = data.get("url", None)
31+
self.width = data.get("width", None)
32+
self.height = data.get("height", None)
33+
self.video_id = data.get("video_id", None)
34+
self.cover = data.get("cover", {})
35+
36+
class _Cover:
37+
def __init__(self, data):
38+
self.url = data.get("url", None)
39+
self.width = data.get("width", None)
40+
self.height = data.get("height", None)
41+
42+
43+
class _Url:
44+
def __init__(self, data):
45+
self.url = data.get("url", None)
46+
self.desc = data.get("desc", None)
47+
48+
49+
class Thread:
50+
__slots__ = (
51+
"_api",
52+
"_ctx",
53+
"thread_info",
54+
"channel_id",
55+
"guild_id",
56+
"author_id",
57+
"event_id")
58+
59+
def __init__(self, api: BotAPI, ctx: gateway.WsContext, data: forum.Thread):
60+
self._api = api
61+
62+
self.author_id = data.get("author_id")
63+
self.channel_id = data.get("channel_id")
64+
self.guild_id = data.get("guild_id")
65+
self.thread_info = self._ThreadInfo(data.get("thread_info"))
66+
self.event_id = ctx.get("id")
67+
68+
class _ThreadInfo:
69+
def __init__(self, data):
70+
self.title = self._Title(loads(data.get("title")))
71+
self.content = self._Content(loads(data.get("content")))
72+
self.thread_id = data.get("thread_id")
73+
self.date_time = data.get("date_time")
74+
75+
class _Title:
76+
def __init__(self, data):
77+
self.paragraphs = [self._Paragraphs(items) for items in data.get("paragraphs")]
78+
79+
class _Paragraphs:
80+
def __init__(self, data):
81+
self.elems = [self._Elems(items) for items in data.get("elems")]
82+
self.props = data.get("props")
83+
84+
class _Elems:
85+
def __init__(self, data):
86+
self.type = data.get("type")
87+
self.text = _Text(data.get("text", {}))
88+
89+
class _Content:
90+
def __init__(self, data):
91+
self.paragraphs = [self._Paragraphs(items) for items in data.get("paragraphs")]
92+
93+
class _Paragraphs:
94+
def __init__(self, data):
95+
self.elems = [self._Elems(items) for items in data.get("elems")]
96+
self.props = data.get("props")
97+
98+
class _Elems:
99+
def __init__(self, data):
100+
self.type = data.get("type")
101+
if self.type == 1:
102+
self.text = _Text(data.get("text", {}))
103+
elif self.type == 2:
104+
self.image = _Image(data.get("image", {}))
105+
elif self.type == 3:
106+
self.video = _Video(data.get("video", {}))
107+
elif self.type == 4:
108+
self.url = _Url(data.get("url", {}))

botpy/message.py

Lines changed: 75 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ class Message:
1111
"id",
1212
"guild_id",
1313
"member",
14+
"message_reference",
1415
"mentions",
1516
"seq",
1617
"seq_in_channel",
@@ -22,18 +23,89 @@ def __init__(self, api: BotAPI, ctx: gateway.WsContext, data: gateway.MessagePay
2223
# TODO 创建一些实体类的数据缓存 @veehou
2324
self._api = api
2425

25-
self.author = data.get("author")
26+
self.author = self._User(data.get("author"))
2627
self.channel_id = data.get("channel_id")
2728
self.id = data.get("id")
2829
self.content = data.get("content")
2930
self.guild_id = data.get("guild_id")
30-
self.member = data.get("member")
31-
self.mentions = data.get("mentions")
31+
self.member = self._Member(data.get("member"))
32+
self.message_reference = self._MessageRef(data.get("message_reference", {}))
33+
self.mentions = [self._User(items) for items in data.get("mentions", {})]
3234
self.seq = data.get("seq") # 全局消息序号
3335
self.seq_in_channel = data.get("seq_in_channel") # 子频道消息序号
3436
self.timestamp = data.get("timestamp")
3537
self.event_id = ctx.get("id")
3638

39+
class _User:
40+
def __init__(self, data):
41+
self.id = data.get("id")
42+
self.username = data.get("username")
43+
self.bot = data.get("bot")
44+
self.avatar = data.get("avatar")
45+
46+
class _Member:
47+
def __init__(self, data):
48+
self.nick = data.get("nick", None)
49+
self.roles = data.get("roles", None)
50+
self.joined_at = data.get("joined_at", None)
51+
52+
class _MessageRef:
53+
def __init__(self, data):
54+
self.message_id = data.get("message_id", None)
55+
56+
async def reply(self, **kwargs):
57+
return await self._api.post_message(channel_id=self.channel_id, msg_id=self.id, **kwargs)
58+
59+
60+
class DirectMessage:
61+
__slots__ = (
62+
"_api",
63+
"author",
64+
"content",
65+
"direct_message",
66+
"channel_id",
67+
"id",
68+
"guild_id",
69+
"member",
70+
"message_reference",
71+
"seq",
72+
"seq_in_channel",
73+
"src_guild_id",
74+
"timestamp",
75+
"event_id"
76+
)
77+
78+
def __init__(self, api: BotAPI, ctx: gateway.WsContext, data: gateway.DirectMessagePayload):
79+
self._api = api
80+
81+
self.author = self._User(data.get("author"))
82+
self.channel_id = data.get("channel_id")
83+
self.id = data.get("id")
84+
self.content = data.get("content")
85+
self.direct_message = data.get("direct_message")
86+
self.guild_id = data.get("guild_id")
87+
self.member = self._Member(data.get("member"))
88+
self.message_reference = self._MessageRef(data.get("message_reference", {}))
89+
self.seq = data.get("seq") # 全局消息序号
90+
self.seq_in_channel = data.get("seq_in_channel") # 子频道消息序号
91+
self.src_guild_id = data.get("src_guild_id")
92+
self.timestamp = data.get("timestamp")
93+
self.event_id = ctx.get("id")
94+
95+
class _User:
96+
def __init__(self, data):
97+
self.id = data.get("id")
98+
self.username = data.get("username")
99+
self.avatar = data.get("avatar")
100+
101+
class _Member:
102+
def __init__(self, data):
103+
self.joined_at = data.get("joined_at", None)
104+
105+
class _MessageRef:
106+
def __init__(self, data):
107+
self.message_id = data.get("message_id", None)
108+
37109
async def reply(self, **kwargs):
38110
return await self._api.post_message(channel_id=self.channel_id, msg_id=self.id, **kwargs)
39111

botpy/reaction.py

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
from .api import BotAPI
2+
from .types import gateway, reaction
3+
4+
5+
class Reaction:
6+
__slots__ = (
7+
"_api",
8+
"_ctx",
9+
"user_id",
10+
"channel_id",
11+
"guild_id",
12+
"emoji",
13+
"target",
14+
"event_id")
15+
16+
def __init__(self, api: BotAPI, ctx: gateway.WsContext, data: reaction.Reaction):
17+
self._api = api
18+
19+
self.user_id = data.get("user_id")
20+
self.channel_id = data.get("channel_id")
21+
self.guild_id = data.get("guild_id")
22+
self.emoji = self._Emoji(data.get("emoji"))
23+
self.target = self._Target(data.get("target"))
24+
self.event_id = ctx.get("id")
25+
26+
class _Emoji:
27+
def __init__(self, data):
28+
self.id = data.get("id")
29+
self.type = data.get("type")
30+
31+
class _Target:
32+
def __init__(self, data):
33+
self.id = data.get("id")
34+
self.type = data.get("type") # 0: 消息 1: 帖子 2: 评论 3: 回复

botpy/types/gateway.py

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,11 @@ class UserPayload(TypedDict):
1212
username: str
1313
bot: bool
1414
status: int
15+
avatar: str
16+
17+
18+
class MessageRefPayload(TypedDict):
19+
message_id: str
1520

1621

1722
class ReadyEvent(TypedDict):
@@ -32,12 +37,28 @@ class MessagePayload(TypedDict):
3237
guild_id: str
3338
id: str
3439
member: Member
40+
message_reference: MessageRefPayload
3541
mentions: List[UserPayload]
3642
seq: int
3743
seq_in_channel: str
3844
timestamp: str
3945

4046

47+
class DirectMessagePayload(TypedDict):
48+
author: UserPayload
49+
channel_id: str
50+
content: str
51+
direct_message: bool
52+
guild_id: str
53+
id: str
54+
member: Member
55+
message_reference: MessageRefPayload
56+
seq: int
57+
seq_in_channel: str
58+
src_guild_id: str
59+
timestamp: str
60+
61+
4162
class MessageAuditPayload(TypedDict):
4263
audit_id: str
4364
message_id: str

0 commit comments

Comments
 (0)