Skip to content

Commit

Permalink
feat: 完成事件解析的补齐
Browse files Browse the repository at this point in the history
  • Loading branch information
veehou committed May 27, 2022
1 parent aa83bd4 commit 0a62559
Show file tree
Hide file tree
Showing 16 changed files with 191 additions and 100 deletions.
6 changes: 2 additions & 4 deletions botpy/api.py
Expand Up @@ -41,10 +41,8 @@ def __init__(self, http: BotHttp):
"""
self._http = http

# TODO 重写所有的api及单测 @veehou

# 频道相关接口
async def get_guild(self, guild_id: str) -> guild.Guild:
async def get_guild(self, guild_id: str) -> guild.GuildPayload:
"""
获取频道信息。
Expand Down Expand Up @@ -581,7 +579,7 @@ async def me(self) -> user.User:
route = Route("GET", "/users/@me")
return await self._http.request(route)

async def me_guilds(self, guild_id: str = None, limit: int = 100, desc: bool = False) -> List[guild.Guild]:
async def me_guilds(self, guild_id: str = None, limit: int = 100, desc: bool = False) -> List[guild.GuildPayload]:
"""
它返回当前用户已加入的 Guild 对象列表。
Expand Down
8 changes: 4 additions & 4 deletions botpy/client.py
Expand Up @@ -139,7 +139,7 @@ async def start(self, appid: str, token: str, ret_coro: bool = False) -> Optiona
return await self._bot_init(token)

async def _bot_login(self, token: Token) -> None:
_log.info("[client]登录机器人账号中...")
_log.info("[botpy]登录机器人账号中...")

user = await self.http.login(token)

Expand All @@ -158,7 +158,7 @@ async def _bot_login(self, token: Token) -> None:
self._connection.state.robot = Robot(user)

async def _bot_init(self, token):
_log.info("[client]程序启动...")
_log.info("[botpy]程序启动...")
# 每个机器人创建的连接数不能超过remaining剩余连接数
if self._ws_ap["shards"] > self._ws_ap["session_start_limit"]["remaining"]:
raise Exception("session limit exceeded")
Expand Down Expand Up @@ -201,7 +201,7 @@ def _loop_exception_handler(loop, context):
else:
await self._connection.run(session_interval)
except KeyboardInterrupt:
_log.info("[client]服务强行停止!")
_log.info("[botpy]服务强行停止!")
# cancel all tasks lingering

async def bot_connect(self, session):
Expand All @@ -213,7 +213,7 @@ async def bot_connect(self, session):
param session: session对象
"""
_log.info("[client]会话启动中...")
_log.info("[botpy]会话启动中...")

client = BotWebSocket(session, self._connection)
try:
Expand Down
88 changes: 79 additions & 9 deletions botpy/connection.py
Expand Up @@ -7,8 +7,7 @@
from .message import Message
from .robot import Robot
from .logging import logging
from .types import gateway, channel
from .types.session import Session
from .types import gateway, channel, guild, user, session, reaction, interaction

_log = logging.getLogger()

Expand All @@ -29,7 +28,7 @@ def __init__(self, max_async, connect: Callable, dispatch: Callable, loop=None,
self._max_async = max_async
self._loop: asyncio.AbstractEventLoop = asyncio.get_event_loop() if loop is None else loop
# session链接同时最大并发数
self._session_list: List[Session] = []
self._session_list: List[session.Session] = []

async def run(self, session_interval=5):
loop = self._loop
Expand All @@ -43,7 +42,7 @@ async def run(self, session_interval=5):
while len(session_list) > 0:
_log.debug("session list circle run")
time_interval = session_interval * (index + 1)
_log.info("[连接池]最大并发连接数: %s, 启动会话数: %s" % (self._max_async, len(session_list)))
_log.info("[botpy]最大并发连接数: %s, 启动会话数: %s" % (self._max_async, len(session_list)))
for i in range(self._max_async):
if len(session_list) == 0:
break
Expand All @@ -57,8 +56,8 @@ async def _runner(self, session, time_interval):
# 后台有频率限制,根据间隔时间发起链接请求
await asyncio.sleep(time_interval)

def add(self, session: Session):
self._session_list.append(session)
def add(self, _session: session.Session):
self._session_list.append(_session)


class ConnectionState:
Expand All @@ -76,22 +75,93 @@ def __init__(self, dispatch: Callable, api: BotAPI):
self._dispatch = dispatch
self.api = api

def parse_guild_create(self, ctx: gateway.WsContext, data: channel.ChannelPayload):
# botpy.flags.Intents.guilds
def parse_guild_create(self, ctx: gateway.WsContext, data: guild.GuildPayload):
self._dispatch("guild_create", data)

def parse_guild_update(self, ctx: gateway.WsContext, data: guild.GuildPayload):
self._dispatch("guild_update", data)

def parse_guild_delete(self, ctx: gateway.WsContext, data: guild.GuildPayload):
self._dispatch("guild_delete", data)

def parse_channel_create(self, ctx: gateway.WsContext, data: channel.ChannelPayload):
_channel = Channel(self.api, ctx, data)
self._dispatch("channel_create", _channel)

def parse_channel_update(self, ctx: gateway.WsContext, data: channel.ChannelPayload):
_channel = Channel(self.api, ctx, data)
self._dispatch("channel_update", _channel)

def parse_channel_delete(self, ctx: gateway.WsContext, data: channel.ChannelPayload):
_channel = Channel(self.api, ctx, data)
self._dispatch("channel_delete", _channel)

# botpy.flags.Intents.guild_members
def parse_guild_member_add(self, ctx: gateway.WsContext, data: user.GuildMemberPayload):
self._dispatch("guild_member_add", data)

def parse_guild_member_update(self, ctx: gateway.WsContext, data: user.GuildMemberPayload):
self._dispatch("guild_member_update", data)

def parse_guild_member_remove(self, ctx: gateway.WsContext, data: user.GuildMemberPayload):
self._dispatch("guild_member_remove", data)

# botpy.flags.Intents.guild_messages
def parse_message_create(self, ctx: gateway.WsContext, data: gateway.MessagePayload):
message = Message(self.api, data)
self._dispatch("message_create", message)

def parse_message_delete(self, ctx: gateway.WsContext, data: gateway.MessagePayload):
message = Message(self.api, data)
self._dispatch("message_delete", message)

# botpy.flags.Intents.guild_message_reactions
def parse_message_reaction_add(self, ctx: gateway.WsContext, data: reaction.Reaction):
self._dispatch("message_reaction_add", data)

def parse_message_reaction_remove(self, ctx: gateway.WsContext, data: reaction.Reaction):
self._dispatch("message_reaction_remove", data)

# botpy.flags.Intents.direct_message
def parse_direct_message_create(self, ctx: gateway.WsContext, data: gateway.MessagePayload):
message = Message(self.api, data)
self._dispatch("direct_message_create", message)

def parse_direct_message_delete(self, ctx: gateway.WsContext, data: gateway.MessagePayload):
message = Message(self.api, data)
self._dispatch("direct_message_delete", message)

# botpy.flags.Intents.interaction
def parse_interaction_create(self, ctx: gateway.WsContext, data: interaction.InteractionPayload):
self._dispatch("interaction_create", data)

# botpy.flags.Intents.message_audit
def parse_message_audit_pass(self, ctx: gateway.WsContext, data: gateway.MessagePayload):
message = Message(self.api, data)
self._dispatch("direct_message_create", message)

def parse_message_audit_reject(self, ctx: gateway.WsContext, data: gateway.MessagePayload):
message = Message(self.api, data)
self._dispatch("direct_message_delete", message)

# botpy.flags.Intents.audio_action
def parse_audio_start(self, ctx: gateway.WsContext, data):
self._dispatch("direct_message_create", data)

def parse_audio_finish(self, ctx: gateway.WsContext, data):
self._dispatch("direct_message_delete", data)

def parse_on_mic(self, ctx: gateway.WsContext, data):
self._dispatch("direct_message_create", data)

def parse_off_mic(self, ctx: gateway.WsContext, data):
self._dispatch("direct_message_delete", data)

# botpy.flags.Intents.public_guild_messages
def parse_at_message_create(self, ctx: gateway.WsContext, data: gateway.MessagePayload):
message = Message(self.api, data)
self._dispatch("at_message_create", message)

def parse_ready(self, ctx: gateway.WsContext, data: gateway.ReadyEvent):
self._dispatch("ready")

# TODO 补全解析的所有事件 @veehou
63 changes: 47 additions & 16 deletions botpy/flags.py
Expand Up @@ -103,8 +103,6 @@ def __repr__(self) -> str:

@fill_with_flags()
class Intents(BaseFlags):
# TODO 补全所有事件的注释 @veehou

__slots__ = ()

def __init__(self, **kwargs: bool) -> None:
Expand Down Expand Up @@ -154,50 +152,76 @@ async def on_guild_create(self, guild: Guild):
`执行相关的任务`
`
- :func:`on_guild_create`: 当机器人加入新guild时
- :func:`on_guild_update`: 当guild资料发生变更时
- :func:`on_guild_delete`: 当机器人退出guild时
- :func:`on_channel_create`: 当channel被创建时
- :func:`on_channel_update`: 当channel被更新时
- :func:`on_channel_delete`: 当channel被删除时
- :func:`on_guild_create(self, guild: Guild)`: 当机器人加入新guild时
- :func:`on_guild_update(self, guild: Guild)`: 当guild资料发生变更时
- :func:`on_guild_delete(self, guild: Guild)`: 当机器人退出guild时
- :func:`on_channel_create(self, channel: Channel)`: 当channel被创建时
- :func:`on_channel_update(self, channel: Channel)`: 当channel被更新时
- :func:`on_channel_delete(self, channel: Channel)`: 当channel被删除时
"""
return 1 << 0

@Flag
def guild_members(self):
""":class:`bool`: 是否打开频道成员事件的监听."""
""":class:`bool`: 是否打开频道成员事件的监听.
- :func:`guild_member_add(self, member:Member)`: 当成员加入时
- :func:`guild_member_update(self, member:Member)`: 当成员资料变更时
- :func:`guild_member_remove(self, member:Member)`: 当成员被移除时
"""
return 1 << 1

@Flag
def guild_messages(self):
""":class:`bool`: 是否打开消息事件的监听.
通过增加`client`的`on_xx`事件可以获取事件下发的数据:
- :func:`message_create(self,message:Message)`:
发送消息事件,代表频道内的全部消息,而不只是 at 机器人的消息。内容与 AT_MESSAGE_CREATE 相同
- :func:`message_delete(self,message:Message)`: 删除(撤回)消息事件
注意:仅 *私域* 机器人能够设置此 intents
"""
return 1 << 9

@Flag
def guild_message_reactions(self):
""":class:`bool`: 是否打开消息相关互动事件的监听."""
""":class:`bool`: 是否打开消息相关互动事件的监听.
- :func:`message_reaction_add`: 为消息添加表情表态
- :func:`message_reaction_remove`: 为消息删除表情表态
"""
return 1 << 10

@Flag
def direct_message(self):
""":class:`bool`: 是否打开私信事件的监听."""
""":class:`bool`: 是否打开私信事件的监听.
- :func:`direct_message_create`: 当收到用户发给机器人的私信消息时
- :func:`direct_message_delete `: 删除(撤回)消息事件
"""
return 1 << 12

@Flag
def interaction(self):
""":class:`bool`: 是否打开互动事件的监听."""
""":class:`bool`: 是否打开互动事件的监听.
- :func:`interaction_create`: 互动事件创建时
"""
return 1 << 26

@Flag
def message_audit(self):
""":class:`bool`: 是否打开消息审核事件的监听."""
""":class:`bool`: 是否打开消息审核事件的监听.
- :func:`message_audit_pass`: 消息审核通过
- :func:`message_audit_reject`: 消息审核不通过
"""
return 1 << 27

@Flag
Expand All @@ -210,7 +234,14 @@ def forums(self):

@Flag
def audio_action(self):
""":class:`bool`: 是否打开音频事件的监听."""
""":class:`bool`: 是否打开音频事件的监听.
- :func:`audio_start`: 音频开始播放时
- :func:`audio_finish`: 音频播放结束时
- :func:`audio_on_mic`: 上麦时
- :func:``audio_off_mic`: 下麦时
"""
return 1 << 29

@Flag
Expand Down

0 comments on commit 0a62559

Please sign in to comment.