Skip to content

Commit aecd3e8

Browse files
SaucePlumGLGDLY
andauthored
feat: 新增开放论坛事件和进出音视频/直播子频道事件的数据构建以及补充相关示例和文档说明 (#122)
* refactor: 优化上次更新中,http的双重not问题 feat: 新增用户可直接通过print或log获取dict类型的事件结构 * fix: 修复DirectMessage中reply参数错误 * feat: 加入__del__控制aiohttp出现unclosed client session的问题 * feat: 调度事件日志等级调整 * fix: 重写FormData的_gen_form_data方法,以避免重试时由于已process过一次而导致的Form data has been processed already错误 * feat: 为BotHttp增加__del__方法避免出现unclosed client session的问题 * feat: ...补充 * fix: 修复RuntimeWarning问题 * fix: 改善already running的问题 * fix: 进一步改善unclosed client session的问题 * fix: http重新设置client session时调用close * fix: 优化Cannot write to closing transport * feat: 私信加入attachments字段 * fix: http去除超时重试,避免出现多次请求(特指因为重试而连续发送相同消息)的问题 fix: http的_handle_response中raise加入from None避免出现重试下的连锁错误(During handling of the above exception, another exception occurred) * feat: 新增403状态码ForbiddenError * feat: 新增开放论坛事件和进出音视频/直播子频道事件的数据构建以及补充相关示例和文档说明 Co-authored-by: GLGDLY <[email protected]> Co-authored-by: GLGDLY <[email protected]>
1 parent 3a5745b commit aecd3e8

File tree

12 files changed

+365
-53
lines changed

12 files changed

+365
-53
lines changed

botpy/audio.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,3 +23,23 @@ def __init__(self, api: BotAPI, event_id, data: audio.AudioAction):
2323

2424
def __repr__(self):
2525
return str({items: str(getattr(self, items)) for items in self.__slots__ if not items.startswith('_')})
26+
27+
28+
class PublicAudio:
29+
__slots__ = (
30+
"_api",
31+
"_ctx",
32+
"guild_id",
33+
"channel_id",
34+
"channel_type",
35+
"user_id")
36+
37+
def __init__(self, api: BotAPI, data: audio.AudioLive):
38+
self._api = api
39+
self.guild_id = data.get("guild_id", None)
40+
self.channel_id = data.get("channel_id", None)
41+
self.channel_type = data.get("channel_type", None)
42+
self.user_id = data.get("user_id", None)
43+
44+
def __repr__(self):
45+
return str({items: str(getattr(self, items)) for items in self.__slots__ if not items.startswith('_')})

botpy/connection.py

Lines changed: 38 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@
88
from .message import Message, DirectMessage, MessageAudit
99
from .user import Member
1010
from .reaction import Reaction
11-
from .audio import Audio
12-
from .forum import Thread
11+
from .audio import Audio, PublicAudio
12+
from .forum import Thread, OpenThread
1313

1414
from . import logging
1515
from .api import BotAPI
@@ -227,3 +227,39 @@ def parse_forum_reply_delete(self, payload):
227227

228228
def parse_forum_publish_audit_result(self, payload):
229229
self._dispatch("forum_publish_audit_result", payload.get('d', {}))
230+
231+
def parse_audio_or_live_channel_member_enter(self, payload):
232+
_public_audio = PublicAudio(self.api, payload.get('d', {}))
233+
self._dispatch("audio_or_live_channel_member_enter", _public_audio)
234+
235+
def parse_audio_or_live_channel_member_exit(self, payload):
236+
_public_audio = PublicAudio(self.api, payload.get('d', {}))
237+
self._dispatch("audio_or_live_channel_member_exit", _public_audio)
238+
239+
def parse_open_forum_thread_create(self, payload):
240+
_forum = OpenThread(self.api, payload.get('d', {}))
241+
self._dispatch("open_forum_thread_create", _forum)
242+
243+
def parse_open_forum_thread_update(self, payload):
244+
_forum = OpenThread(self.api, payload.get('d', {}))
245+
self._dispatch("open_forum_thread_update", _forum)
246+
247+
def parse_open_forum_thread_delete(self, payload):
248+
_forum = OpenThread(self.api, payload.get('d', {}))
249+
self._dispatch("open_forum_thread_delete", _forum)
250+
251+
def parse_open_forum_post_create(self, payload):
252+
_forum = OpenThread(self.api, payload.get('d', {}))
253+
self._dispatch("open_forum_post_create", payload.get('d', {}))
254+
255+
def parse_open_forum_post_delete(self, payload):
256+
_forum = OpenThread(self.api, payload.get('d', {}))
257+
self._dispatch("open_forum_post_delete", payload.get('d', {}))
258+
259+
def parse_open_forum_reply_create(self, payload):
260+
_forum = OpenThread(self.api, payload.get('d', {}))
261+
self._dispatch("open_forum_reply_create", payload.get('d', {}))
262+
263+
def parse_open_forum_reply_delete(self, payload):
264+
_forum = OpenThread(self.api, payload.get('d', {}))
265+
self._dispatch("open_forum_reply_delete", payload.get('d', {}))

botpy/errors.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -41,10 +41,19 @@ def __str__(self):
4141
return self.msgs
4242

4343

44+
class ForbiddenError(RuntimeError):
45+
def __init__(self, msg):
46+
self.msgs = msg
47+
48+
def __str__(self):
49+
return self.msgs
50+
51+
4452
HttpErrorDict = {
4553
401: AuthenticationFailedError,
4654
404: NotFoundError,
4755
405: MethodNotAllowedError,
56+
403: ForbiddenError,
4857
429: SequenceNumberError,
4958
500: ServerError,
5059
504: ServerError,

botpy/flags.py

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -284,6 +284,36 @@ def public_guild_messages(self):
284284
"""
285285
return 1 << 30
286286

287+
@Flag
288+
def audio_or_live_channel_member(self):
289+
""":class:`bool`: 是否打开音视频/直播子频道成员进出事件的监听.
290+
291+
通过增加`client`的`on_xx`事件可以获取事件下发的数据:
292+
293+
- :func:`on_audio_or_live_channel_enter` // 用户进入音视频/直播子频道时
294+
- :func:`on_audio_or_live_channel_exit` // 用户退出音视频/直播子频道时
295+
296+
"""
297+
return 1 << 19
298+
299+
@Flag
300+
def open_forum_event(self):
301+
""":class:`bool`: 开放论坛对象事件的监听.
302+
303+
通过增加`client`的`on_xx`事件可以获取事件下发的数据:
304+
305+
306+
- :func:`on_open_forum_thread_create` // 用户创建主题时
307+
- :func:`on_open_forum_thread_update` // 用户修改主题时
308+
- :func:`on_open_forum_thread_delete` // 用户删除主题时
309+
- :func:`on_open_forum_post_create` // 用户创建帖子时
310+
- :func:`on_open_forum_post_delete` // 用户删除帖子时
311+
- :func:`on_open_forum_reply_create` // 用户回复评论时
312+
- :func:`on_open_forum_reply_delete` // 用户删除评论时
313+
314+
"""
315+
return 1 << 18
316+
287317

288318
@fill_with_flags()
289319
class Permission(BaseFlags):

botpy/forum.py

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -150,3 +150,23 @@ def __init__(self, data):
150150

151151
def __repr__(self):
152152
return str(self.__dict__)
153+
154+
155+
class OpenThread:
156+
__slots__ = (
157+
"_api",
158+
"thread_info",
159+
"channel_id",
160+
"guild_id",
161+
"author_id",
162+
"event_id")
163+
164+
def __init__(self, api: BotAPI, data: forum.OpenForumEvent):
165+
self._api = api
166+
167+
self.guild_id = data.get("guild_id", None)
168+
self.channel_id = data.get("channel_id", None)
169+
self.author_id = data.get("author_id", None)
170+
171+
def __repr__(self):
172+
return str({items: str(getattr(self, items)) for items in self.__slots__ if not items.startswith('_')})

botpy/http.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -201,4 +201,4 @@ async def login(self, token: Token) -> robot.Robot:
201201
data = await self.request(Route("GET", "/users/@me"))
202202
# TODO 检查机器人token错误的raise exception @veehou
203203

204-
return data
204+
return data

botpy/types/audio.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
"""
1111
AudioStatus = Literal[0, 1, 2, 3]
1212

13+
PublicAudioType = Literal[2, 5]
1314

1415
class AudioControl(TypedDict):
1516
audio_url: str
@@ -22,3 +23,10 @@ class AudioAction(TypedDict):
2223
channel_id: str
2324
audio_url: str
2425
text: str
26+
27+
28+
class AudioLive(TypedDict):
29+
guild_id: str
30+
channel_id: str
31+
channel_type: PublicAudioType
32+
user_id: str

botpy/types/forum.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,3 +69,7 @@ class PostThreadRsp(TypedDict):
6969
task_id: str
7070
create_time: str
7171

72+
class OpenForumEvent(TypedDict):
73+
guild_id: str
74+
channel_id: str
75+
author_id: str

0 commit comments

Comments
 (0)