diff --git a/botpy/audio.py b/botpy/audio.py new file mode 100644 index 0000000..e3ece51 --- /dev/null +++ b/botpy/audio.py @@ -0,0 +1,22 @@ +from .api import BotAPI +from .types import gateway, audio + + +class Audio: + __slots__ = ( + "_api", + "_ctx", + "channel_id", + "guild_id", + "audio_url", + "text", + "event_id") + + def __init__(self, api: BotAPI, ctx: gateway.WsContext, data: audio.AudioAction): + self._api = api + + self.channel_id = data.get("channel_id") + self.guild_id = data.get("guild_id") + self.audio_url = data.get("audio_url") + self.text = data.get("text") + self.event_id = ctx.get("id") diff --git a/botpy/connection.py b/botpy/connection.py index 91193d9..440f6f4 100644 --- a/botpy/connection.py +++ b/botpy/connection.py @@ -5,8 +5,11 @@ from .channel import Channel from .guild import Guild from .interaction import Interaction -from .message import Message, MessageAudit +from .message import Message, DirectMessage, MessageAudit from .user import Member +from .reaction import Reaction +from .audio import Audio +from .forum import Thread from . import logging from .api import BotAPI @@ -135,18 +138,20 @@ def parse_message_delete(self, ctx: gateway.WsContext, data: gateway.MessagePayl # botpy.flags.Intents.guild_message_reactions def parse_message_reaction_add(self, ctx: gateway.WsContext, data: reaction.Reaction): - self._dispatch("message_reaction_add", data) + _reaction = Reaction(self.api, ctx, data) + self._dispatch("message_reaction_add", _reaction) def parse_message_reaction_remove(self, ctx: gateway.WsContext, data: reaction.Reaction): - self._dispatch("message_reaction_remove", data) + _reaction = Reaction(self.api, ctx, data) + self._dispatch("message_reaction_remove", _reaction) # botpy.flags.Intents.direct_message - def parse_direct_message_create(self, ctx: gateway.WsContext, data: gateway.MessagePayload): - _message = Message(self.api, ctx, data) + def parse_direct_message_create(self, ctx: gateway.WsContext, data: gateway.DirectMessagePayload): + _message = DirectMessage(self.api, ctx, data) self._dispatch("direct_message_create", _message) - def parse_direct_message_delete(self, ctx: gateway.WsContext, data: gateway.MessagePayload): - _message = Message(self.api, ctx, data) + def parse_direct_message_delete(self, ctx: gateway.WsContext, data: gateway.DirectMessagePayload): + _message = DirectMessage(self.api, ctx, data) self._dispatch("direct_message_delete", _message) # botpy.flags.Intents.interaction @@ -165,16 +170,20 @@ def parse_message_audit_reject(self, ctx: gateway.WsContext, data: gateway.Messa # botpy.flags.Intents.audio_action def parse_audio_start(self, ctx: gateway.WsContext, data): - self._dispatch("audio_start", data) + _audio = Audio(self.api, ctx, data) + self._dispatch("audio_start", _audio) def parse_audio_finish(self, ctx: gateway.WsContext, data): - self._dispatch("audio_finish", data) + _audio = Audio(self.api, ctx, data) + self._dispatch("audio_finish", _audio) def parse_on_mic(self, ctx: gateway.WsContext, data): - self._dispatch("on_mic", data) + _audio = Audio(self.api, ctx, data) + self._dispatch("on_mic", _audio) def parse_off_mic(self, ctx: gateway.WsContext, data): - self._dispatch("off_mic", data) + _audio = Audio(self.api, ctx, data) + self._dispatch("off_mic", _audio) # botpy.flags.Intents.public_guild_messages 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): self._dispatch("resumed") def parse_forum_thread_create(self, ctx: gateway.WsContext, data: forum.Thread): - self._dispatch("forum_thread_create", data) + _forum = Thread(self.api, ctx, data) + self._dispatch("forum_thread_create", _forum) def parse_forum_thread_update(self, ctx: gateway.WsContext, data: forum.Thread): - self._dispatch("forum_thread_update", data) + _forum = Thread(self.api, ctx, data) + self._dispatch("forum_thread_update", _forum) def parse_forum_thread_delete(self, ctx: gateway.WsContext, data: forum.Thread): - self._dispatch("forum_thread_delete", data) + _forum = Thread(self.api, ctx, data) + self._dispatch("forum_thread_delete", _forum) def parse_forum_post_create(self, ctx: gateway.WsContext, data: forum.Post): self._dispatch("forum_post_create", data) diff --git a/botpy/forum.py b/botpy/forum.py new file mode 100644 index 0000000..7da172d --- /dev/null +++ b/botpy/forum.py @@ -0,0 +1,108 @@ +from json import loads + +from .api import BotAPI +from .types import gateway, forum + + +class _Text: + def __init__(self, data): + self.text = data.get("text", None) + + +class _Image: + def __init__(self, data): + self.plat_image = self._PlatImage(data.get("plat_image", {})) + + class _PlatImage: + def __init__(self, data): + self.url = data.get("url", None) + self.width = data.get("width", None) + self.height = data.get("height", None) + self.image_id = data.get("image_id", None) + + +class _Video: + def __init__(self, data): + self.plat_video = self._PlatVideo(data.get("plat_video", {})) + + class _PlatVideo: + def __init__(self, data): + self.url = data.get("url", None) + self.width = data.get("width", None) + self.height = data.get("height", None) + self.video_id = data.get("video_id", None) + self.cover = data.get("cover", {}) + + class _Cover: + def __init__(self, data): + self.url = data.get("url", None) + self.width = data.get("width", None) + self.height = data.get("height", None) + + +class _Url: + def __init__(self, data): + self.url = data.get("url", None) + self.desc = data.get("desc", None) + + +class Thread: + __slots__ = ( + "_api", + "_ctx", + "thread_info", + "channel_id", + "guild_id", + "author_id", + "event_id") + + def __init__(self, api: BotAPI, ctx: gateway.WsContext, data: forum.Thread): + self._api = api + + self.author_id = data.get("author_id") + self.channel_id = data.get("channel_id") + self.guild_id = data.get("guild_id") + self.thread_info = self._ThreadInfo(data.get("thread_info")) + self.event_id = ctx.get("id") + + class _ThreadInfo: + def __init__(self, data): + self.title = self._Title(loads(data.get("title"))) + self.content = self._Content(loads(data.get("content"))) + self.thread_id = data.get("thread_id") + self.date_time = data.get("date_time") + + class _Title: + def __init__(self, data): + self.paragraphs = [self._Paragraphs(items) for items in data.get("paragraphs")] + + class _Paragraphs: + def __init__(self, data): + self.elems = [self._Elems(items) for items in data.get("elems")] + self.props = data.get("props") + + class _Elems: + def __init__(self, data): + self.type = data.get("type") + self.text = _Text(data.get("text", {})) + + class _Content: + def __init__(self, data): + self.paragraphs = [self._Paragraphs(items) for items in data.get("paragraphs")] + + class _Paragraphs: + def __init__(self, data): + self.elems = [self._Elems(items) for items in data.get("elems")] + self.props = data.get("props") + + class _Elems: + def __init__(self, data): + self.type = data.get("type") + if self.type == 1: + self.text = _Text(data.get("text", {})) + elif self.type == 2: + self.image = _Image(data.get("image", {})) + elif self.type == 3: + self.video = _Video(data.get("video", {})) + elif self.type == 4: + self.url = _Url(data.get("url", {})) diff --git a/botpy/message.py b/botpy/message.py index e4126c0..c813226 100644 --- a/botpy/message.py +++ b/botpy/message.py @@ -11,6 +11,7 @@ class Message: "id", "guild_id", "member", + "message_reference", "mentions", "seq", "seq_in_channel", @@ -22,18 +23,89 @@ def __init__(self, api: BotAPI, ctx: gateway.WsContext, data: gateway.MessagePay # TODO 创建一些实体类的数据缓存 @veehou self._api = api - self.author = data.get("author") + self.author = self._User(data.get("author")) self.channel_id = data.get("channel_id") self.id = data.get("id") self.content = data.get("content") self.guild_id = data.get("guild_id") - self.member = data.get("member") - self.mentions = data.get("mentions") + self.member = self._Member(data.get("member")) + self.message_reference = self._MessageRef(data.get("message_reference", {})) + self.mentions = [self._User(items) for items in data.get("mentions", {})] self.seq = data.get("seq") # 全局消息序号 self.seq_in_channel = data.get("seq_in_channel") # 子频道消息序号 self.timestamp = data.get("timestamp") self.event_id = ctx.get("id") + class _User: + def __init__(self, data): + self.id = data.get("id") + self.username = data.get("username") + self.bot = data.get("bot") + self.avatar = data.get("avatar") + + class _Member: + def __init__(self, data): + self.nick = data.get("nick", None) + self.roles = data.get("roles", None) + self.joined_at = data.get("joined_at", None) + + class _MessageRef: + def __init__(self, data): + self.message_id = data.get("message_id", None) + + async def reply(self, **kwargs): + return await self._api.post_message(channel_id=self.channel_id, msg_id=self.id, **kwargs) + + +class DirectMessage: + __slots__ = ( + "_api", + "author", + "content", + "direct_message", + "channel_id", + "id", + "guild_id", + "member", + "message_reference", + "seq", + "seq_in_channel", + "src_guild_id", + "timestamp", + "event_id" + ) + + def __init__(self, api: BotAPI, ctx: gateway.WsContext, data: gateway.DirectMessagePayload): + self._api = api + + self.author = self._User(data.get("author")) + self.channel_id = data.get("channel_id") + self.id = data.get("id") + self.content = data.get("content") + self.direct_message = data.get("direct_message") + self.guild_id = data.get("guild_id") + self.member = self._Member(data.get("member")) + self.message_reference = self._MessageRef(data.get("message_reference", {})) + self.seq = data.get("seq") # 全局消息序号 + self.seq_in_channel = data.get("seq_in_channel") # 子频道消息序号 + self.src_guild_id = data.get("src_guild_id") + self.timestamp = data.get("timestamp") + self.event_id = ctx.get("id") + + class _User: + def __init__(self, data): + self.id = data.get("id") + self.username = data.get("username") + self.avatar = data.get("avatar") + + class _Member: + def __init__(self, data): + self.joined_at = data.get("joined_at", None) + + class _MessageRef: + def __init__(self, data): + self.message_id = data.get("message_id", None) + async def reply(self, **kwargs): return await self._api.post_message(channel_id=self.channel_id, msg_id=self.id, **kwargs) diff --git a/botpy/reaction.py b/botpy/reaction.py new file mode 100644 index 0000000..7ecfca2 --- /dev/null +++ b/botpy/reaction.py @@ -0,0 +1,34 @@ +from .api import BotAPI +from .types import gateway, reaction + + +class Reaction: + __slots__ = ( + "_api", + "_ctx", + "user_id", + "channel_id", + "guild_id", + "emoji", + "target", + "event_id") + + def __init__(self, api: BotAPI, ctx: gateway.WsContext, data: reaction.Reaction): + self._api = api + + self.user_id = data.get("user_id") + self.channel_id = data.get("channel_id") + self.guild_id = data.get("guild_id") + self.emoji = self._Emoji(data.get("emoji")) + self.target = self._Target(data.get("target")) + self.event_id = ctx.get("id") + + class _Emoji: + def __init__(self, data): + self.id = data.get("id") + self.type = data.get("type") + + class _Target: + def __init__(self, data): + self.id = data.get("id") + self.type = data.get("type") # 0: 消息 1: 帖子 2: 评论 3: 回复 diff --git a/botpy/types/gateway.py b/botpy/types/gateway.py index 98b059d..46b64d5 100644 --- a/botpy/types/gateway.py +++ b/botpy/types/gateway.py @@ -12,6 +12,11 @@ class UserPayload(TypedDict): username: str bot: bool status: int + avatar: str + + +class MessageRefPayload(TypedDict): + message_id: str class ReadyEvent(TypedDict): @@ -32,12 +37,28 @@ class MessagePayload(TypedDict): guild_id: str id: str member: Member + message_reference: MessageRefPayload mentions: List[UserPayload] seq: int seq_in_channel: str timestamp: str +class DirectMessagePayload(TypedDict): + author: UserPayload + channel_id: str + content: str + direct_message: bool + guild_id: str + id: str + member: Member + message_reference: MessageRefPayload + seq: int + seq_in_channel: str + src_guild_id: str + timestamp: str + + class MessageAuditPayload(TypedDict): audit_id: str message_id: str diff --git a/botpy/types/message.py b/botpy/types/message.py index 88c5f9c..cd77591 100644 --- a/botpy/types/message.py +++ b/botpy/types/message.py @@ -16,7 +16,6 @@ class Thumbnail(TypedDict): class EmbedField(TypedDict): name: str - value: str class Embed(TypedDict, total=False): diff --git a/botpy/user.py b/botpy/user.py index 4635cac..bf53311 100644 --- a/botpy/user.py +++ b/botpy/user.py @@ -15,8 +15,17 @@ class Member: def __init__(self, api: BotAPI, ctx: gateway.WsContext, data: user.GuildMemberPayload): self._api = api - self.user = data.get("user") + self.user = self._User(data.get("user")) self.nick = data.get("nick") self.roles = data.get("roles") self.joined_at = data.get("joined_at") self.event_id = ctx.get("id") + + class _User: + def __init__(self, data): + self.id = data.get("user") + self.username = data.get("username") + self.avatar = data.get("avatar") + self.bot = data.get("bot") + self.union_openid = data.get("union_openid", None) + self.union_user_account = data.get("union_user_account", None) diff --git "a/docs/\344\272\213\344\273\266\347\233\221\345\220\254.md" "b/docs/\344\272\213\344\273\266\347\233\221\345\220\254.md" index 55f99a9..85f657c 100644 --- "a/docs/\344\272\213\344\273\266\347\233\221\345\220\254.md" +++ "b/docs/\344\272\213\344\273\266\347\233\221\345\220\254.md" @@ -3,23 +3,24 @@ **本文档概述[botpy的事件监听](https://github.com/tencent-connect/botpy/blob/feature/botpy_1.0/botpy/flags.py)** ## 目录 -- [准备](#准备) -- [使用方式](#使用方式) -- [监听的事件](#监听的事件) - + [公域消息事件的监听](#公域消息事件的监听) - + [消息事件的监听](#消息事件的监听) - + [私信事件的监听](#私信事件的监听) - + [消息相关互动事件的监听](#消息相关互动事件的监听) - + [频道事件的监听](#频道事件的监听) - + [频道成员事件的监听](#频道成员事件的监听) - + [互动事件的监听](#互动事件的监听) - + [消息审核事件的监听](#消息审核事件的监听) - + [论坛事件的监听](#论坛事件的监听) - + [音频事件的监听](#音频事件的监听) -- [订阅事件的方法](#订阅事件的方法) +- [准备](#准备) +- [使用方式](#使用方式) +- [监听的事件](#监听的事件) + - [公域消息事件的监听](#公域消息事件的监听) + - [消息事件的监听](#消息事件的监听) + - [私信事件的监听](#私信事件的监听) + - [消息相关互动事件的监听](#消息相关互动事件的监听) + - [频道事件的监听](#频道事件的监听) + - [频道成员事件的监听](#频道成员事件的监听) + - [互动事件的监听](#互动事件的监听) + - [消息审核事件的监听](#消息审核事件的监听) + - [论坛事件的监听](#论坛事件的监听) + - [音频事件的监听](#音频事件的监听) +- [订阅事件的方法](#订阅事件的方法) ## 准备 + ```python import botpy ``` @@ -45,12 +46,13 @@ intents = botpy.Intents(public_guild_messages=True) client = MyClient(intents=intents) ``` -|对应函数| 说明 | -| --------- | ---- | -| on_at_message_create(self, message: Message) | 当收到@机器人的消息时 | -| on_public_message_delete(self, message: Message) | 当频道的消息被删除时 | +| 对应函数 | 说明 | +| ------------------------------------------------ | ----------- | +| on_at_message_create(self, message: Message) | 当收到@机器人的消息时 | +| on_public_message_delete(self, message: Message) | 当频道的消息被删除时 | + +- **注:需要引入`Message`** -- **注:需要引入`Message`** ```python from botpy.message import Message ``` @@ -69,9 +71,7 @@ class MyClient(botpy.Client): ### 消息事件的监听 - -- **仅 私域 机器人能够设置此 intents** - +- **仅 私域 机器人能够设置此 intents** 首先需要订阅事件`guild_messages` @@ -80,12 +80,13 @@ intents = botpy.Intents(guild_messages=True) client = MyClient(intents=intents) ``` -|对应函数| 说明 | -| --------- | ---- | +| 对应函数 | 说明 | +| ----------------------------------------- | -------------------------------------------------------------- | | on_message_create(self, message: Message) | 发送消息事件,代表频道内的全部消息,而不只是 at 机器人的消息。
内容与 AT_MESSAGE_CREATE 相同 | -| on_message_delete(self, message: Message) | 删除(撤回)消息事件 | +| on_message_delete(self, message: Message) | 删除(撤回)消息事件 | + +- **注:需要引入`Message`** -- **注:需要引入`Message`** ```python from botpy.message import Message ``` @@ -111,23 +112,24 @@ intents = botpy.Intents(direct_message=True) client = MyClient(intents=intents) ``` -|对应函数| 说明 | -| --------- | ---- | -| on_direct_message_create(self, message: Message) | 当收到用户发给机器人的私信消息时 | -| on_direct_message_delete(self, message: Message) | 删除(撤回)消息事件 | +| 对应函数 | 说明 | +| ------------------------------------------------------ | ---------------- | +| on_direct_message_create(self, message: DirectMessage) | 当收到用户发给机器人的私信消息时 | +| on_direct_message_delete(self, message: DirectMessage) | 删除(撤回)消息事件 | + +- **注:需要引入`DirectMessage`** -- **注:需要引入`Message`** ```python -from botpy.message import Message +from botpy.message import DirectMessage ``` ```python class MyClient(botpy.Client): - async def on_direct_message_create(self, message: Message): + async def on_direct_message_create(self, message: DirectMessage): """ 此处为处理该事件的代码 """ - async def on_direct_message_delete(self, message: Message): + async def on_direct_message_delete(self, message: DirectMessage): """ 此处为处理该事件的代码 """ @@ -142,14 +144,15 @@ intents = botpy.Intents(guild_message_reactions=True) client = MyClient(intents=intents) ``` -|对应函数| 说明 | -| --------- | ---- | -| on_message_reaction_add(self, reaction: Reaction) | 为消息添加表情表态 | +| 对应函数 | 说明 | +| ---------------------------------------------------- | --------- | +| on_message_reaction_add(self, reaction: Reaction) | 为消息添加表情表态 | | on_message_reaction_remove(self, reaction: Reaction) | 为消息删除表情表态 | -- **注:需要引入`Reaction`** +- **注:需要引入`Reaction`** + ```python -from botpy.types.reaction import Reaction +from botpy.reaction import Reaction ``` ```python @@ -173,17 +176,17 @@ intents = botpy.Intents(guilds=True) client = MyClient(intents=intents) ``` -|对应函数| 说明 | -| --------- | ---- | -| on_guild_create(self, guild: Guild) | 当机器人加入新guild时 | -| on_guild_update(self, guild: Guild) | 当guild资料发生变更时 | -| on_guild_delete(self, guild: Guild) | 当机器人退出guild时 | -| on_channel_create(self, channel: Channel) | 当channel被创建时 | -| on_channel_update(self, channel: Channel) | 当channel被更新时 | -| on_channel_delete(self, channel: Channel) | 当channel被删除时 | +| 对应函数 | 说明 | +| ----------------------------------------- | ------------- | +| on_guild_create(self, guild: Guild) | 当机器人加入新guild时 | +| on_guild_update(self, guild: Guild) | 当guild资料发生变更时 | +| on_guild_delete(self, guild: Guild) | 当机器人退出guild时 | +| on_channel_create(self, channel: Channel) | 当channel被创建时 | +| on_channel_update(self, channel: Channel) | 当channel被更新时 | +| on_channel_delete(self, channel: Channel) | 当channel被删除时 | +- **注:需要引入`Guild`和`Channel`** -- **注:需要引入`Guild`和`Channel`** ```python from botpy.guild import Guild from botpy.channel import Channel @@ -226,28 +229,29 @@ intents = botpy.Intents(guild_members=True) client = MyClient(intents=intents) ``` -|对应函数| 说明 | -| --------- | ---- | -| on_guild_member_add(self, member: GuildMember) | 当成员加入时 | -| on_guild_member_update(self, member: GuildMember) | 当成员资料变更时 | -| on_guild_member_remove(self, member: GuildMember) | 当成员被移除时 | +| 对应函数 | 说明 | +| -------------------------------------------- | -------- | +| on_guild_member_add(self, member: Member) | 当成员加入时 | +| on_guild_member_update(self, member: Member) | 当成员资料变更时 | +| on_guild_member_remove(self, member: Member) | 当成员被移除时 | + +- **注:需要引入`GuildMember`** -- **注:需要引入`GuildMember`** ```python -from botpy.types.guild import GuildMember +from botpy.user import Member ``` ```python class MyClient(botpy.Client): - async def on_guild_member_add(self, member: GuildMember): + async def on_guild_member_add(self, member: Member): """ 此处为处理该事件的代码 """ - async def on_guild_member_update(self, member: GuildMember): + async def on_guild_member_update(self, member: Member): """ 此处为处理该事件的代码 """ - async def on_guild_member_remove(self, member: GuildMember): + async def on_guild_member_remove(self, member: Member): """ 此处为处理该事件的代码 """ @@ -262,11 +266,12 @@ intents = botpy.Intents(interaction=True) client = MyClient(intents=intents) ``` -|对应函数| 说明 | -| --------- | ---- | +| 对应函数 | 说明 | +| ----------------------------------------------------- | ---------------- | | on_interaction_create(self, interaction: Interaction) | 当收到用户发给机器人的私信消息时 | -- **注:需要引入`Interaction`** +- **注:需要引入`Interaction`** + ```python from botpy.interaction import Interaction ``` @@ -288,12 +293,13 @@ intents = botpy.Intents(message_audit=True) client = MyClient(intents=intents) ``` -|对应函数| 说明 | -| --------- | ---- | -| on_message_audit_pass(self, message: MessageAudit) | 消息审核通过 | +| 对应函数 | 说明 | +| ---------------------------------------------------- | ------- | +| on_message_audit_pass(self, message: MessageAudit) | 消息审核通过 | | on_message_audit_reject(self, message: MessageAudit) | 消息审核不通过 | -- **注:需要引入`MessageAudit`** +- **注:需要引入`MessageAudit`** + ```python from botpy.message import MessageAudit ``` @@ -312,9 +318,7 @@ class MyClient(botpy.Client): ### 论坛事件的监听 - -- **仅 私域 机器人能够设置此 intents** - +- **仅 私域 机器人能够设置此 intents** 首先需要订阅事件`forums` @@ -323,20 +327,22 @@ intents = botpy.Intents(forums=True) client = MyClient(intents=intents) ``` -|对应函数| 说明 | -| --------- | ---- | -| on_forum_thread_create(self, thread: Thread) | 当用户创建主题时 | -| on_forum_thread_update(self, thread: Thread) | 当用户更新主题时 | -| on_forum_thread_delete(self, thread: Thread) | 当用户删除主题时 | -| on_forum_post_create(self, post: Post) | 当用户创建帖子时 | -| on_forum_post_delete(self, post: Post) | 当用户删除帖子时 | -| on_forum_reply_create(self, reply: Reply) | 当用户回复评论时 | -| on_forum_reply_delete(self, reply: Reply) | 当用户删除评论时 | +| 对应函数 | 说明 | +| ------------------------------------------------------------- | ---------- | +| on_forum_thread_create(self, thread: Thread) | 当用户创建主题时 | +| on_forum_thread_update(self, thread: Thread) | 当用户更新主题时 | +| on_forum_thread_delete(self, thread: Thread) | 当用户删除主题时 | +| on_forum_post_create(self, post: Post) | 当用户创建帖子时 | +| on_forum_post_delete(self, post: Post) | 当用户删除帖子时 | +| on_forum_reply_create(self, reply: Reply) | 当用户回复评论时 | +| on_forum_reply_delete(self, reply: Reply) | 当用户删除评论时 | | on_forum_publish_audit_result(self, auditresult: AuditResult) | 当用户发表审核通过时 | -- **注:需要引入`Thread`、`Post`、`Reply`和`AuditResult`** +- **注:需要引入`Thread`、`Post`、`Reply`和`AuditResult`** + ```python -from botpy.types.forum import Thread, Post, Reply, AuditResult +from botpy.forum import Thread +from botpy.types.forum import Post, Reply, AuditResult ``` ```python @@ -384,8 +390,38 @@ intents = botpy.Intents(audio_action=True) client = MyClient(intents=intents) ``` -@TODO 完善audio_action(Huang1220(neutron)) +| 对应函数 | 说明 | +| ------------------------------------ | ------- | +| on_audio_start(self, audio: Audio) | 音频开始播放时 | +| on_audio_finish(self, audio: Audio) | 音频播放结束时 | +| on_audio_on_mic(self, audio: Audio) | 上麦时 | +| on_audio_off_mic(self, audio: Audio) | 下麦时 | + +- **注:需要引入`Audio`** + +```python +from botpy.audio import Audio +``` +```python +class MyClient(botpy.Client): + async def on_audio_start(self, audio: Audio): + """ + 此处为处理该事件的代码 + """ + async def on_audio_finish(self, audio: Audio): + """ + 此处为处理该事件的代码 + """ + async def on_audio_on_mic(self, audio: Audio): + """ + 此处为处理该事件的代码 + """ + async def on_audio_off_mic(self, audio: Audio): + """ + 此处为处理该事件的代码 + """ +``` ## 订阅事件的方法 @@ -418,32 +454,33 @@ intents.direct_message=True intents.guilds=True ``` -- **说明** +- **说明** 方法二对应的快捷订阅方式为 -1. 订阅所有事件 +1. 订阅所有事件 ```python intents = botpy.Intents.all() ``` -2. 订阅所有的公域事件 +2. 订阅所有的公域事件 ```python intents = botpy.Intents.default() ``` #### 参数列表 -| 参数 | 含义 | -| ---- | ---- | -| public_guild_messages | 公域消息事件 | -| guild_messages | 消息事件 **(仅 `私域` 机器人能够设置此 intents)** | -| direct_message | 私信事件 | -| guild_message_reactions | 消息相关互动事件 | -| guilds | 频道事件 | -| guild_members | 频道成员事件 | -| interaction | 互动事件 | -| message_audit | 消息审核事件 | -| forums | 论坛事件 **(仅 `私域` 机器人能够设置此 intents)** | -| audio_action | 音频事件 | + +| 参数 | 含义 | +| ----------------------- | ---------------------------------- | +| public_guild_messages | 公域消息事件 | +| guild_messages | 消息事件 **(仅 `私域` 机器人能够设置此 intents)** | +| direct_message | 私信事件 | +| guild_message_reactions | 消息相关互动事件 | +| guilds | 频道事件 | +| guild_members | 频道成员事件 | +| interaction | 互动事件 | +| message_audit | 消息审核事件 | +| forums | 论坛事件 **(仅 `私域` 机器人能够设置此 intents)** | +| audio_action | 音频事件 |