Skip to content

Commit

Permalink
feat: 完成消息回复及相关api的重写
Browse files Browse the repository at this point in the history
  • Loading branch information
veehou committed May 24, 2022
1 parent 990782b commit 979f3f8
Show file tree
Hide file tree
Showing 19 changed files with 284 additions and 339 deletions.
1 change: 0 additions & 1 deletion botpy/__init__.py
@@ -1,5 +1,4 @@
# -*- coding: utf-8 -*-
from . import logging
from .client import *
from .flags import *

Expand Down
111 changes: 82 additions & 29 deletions botpy/api.py
Expand Up @@ -5,7 +5,37 @@

from .flags import Permission
from .http import BotHttp, Route
from .types import guild, user, channel
from .types import guild, user, channel, message


def _handle_message_parameters(
content: str = None,
embed: message.Embed = None,
ark: message.Ark = None,
message_reference: message.Reference = None,
image: str = None,
msg_id: str = None,
event_id: str = None,
markdown: message.Markdown = None,
) -> Dict:
payload = {}
if content is not None:
payload["content"] = content
if embed is not None:
payload["embed"] = embed
if ark is not None:
payload["ark"] = ark
if message_reference is not None:
payload["message_reference"] = message_reference
if image is not None:
payload["image"] = image
if msg_id is not None:
payload["msg_id"] = msg_id
if event_id is not None:
payload["event_id"] = event_id
if markdown is not None:
payload["markdown"] = markdown
return payload


class BotAPI:
Expand Down Expand Up @@ -309,6 +339,9 @@ async def update_channel_user_permissions(
) -> str:
"""修改指定子频道用户的权限
注意
如果是公共频道不能进行添加和移除查看或发言权限
:param channel_id:
子频道ID
:param user_id:
Expand Down Expand Up @@ -377,9 +410,7 @@ async def update_channel_role_permissions(
)
return await self._http.request(route, json=payload)

#
# """消息"""
#
# 消息
# async def get_message(self, channel_id: str, message_id: str) -> MessageGet:
# """
# 获取指定消息
Expand Down Expand Up @@ -410,27 +441,49 @@ async def update_channel_role_permissions(
#
# response = await self._http.get(url, params=query)
# return json.loads(response, object_hook=Message)
#
# async def post_message(self, channel_id: str, message_send: MessageSendRequest) -> Message:
# """
# 发送消息
#
# 要求操作人在该子频道具有发送消息的权限。
# 发送成功之后,会触发一个创建消息的事件。
# 被动回复消息有效期为 5 分钟
# 主动推送消息每日每个子频道限 2 条
# 发送消息接口要求机器人接口需要链接到websocket gateway 上保持在线状态
#
# :param channel_id: 子频道ID
# :param message_send: MessageSendRequest对象
# :return: Message对象
# """
#
# url = get_url(APIConstant.messagesURI, self.is_sandbox).format(channel_id=channel_id)
# request_json = JsonUtil.obj2json_serialize(message_send)
# response = await self._http.post(url, request_json)
# return json.loads(response, object_hook=Message)
#

async def post_message(
self,
channel_id: str,
content: str = None,
embed: message.Embed = None,
ark: message.Ark = None,
message_reference: message.Reference = None,
image: str = None,
msg_id: str = None,
event_id: str = None,
markdown: message.Markdown = None,
) -> message.Message:
"""发送消息
注意
- 要求操作人在该子频道具有发送消息的权限。
- 发送成功之后,会触发一个创建消息的事件。
- 被动回复消息有效期为 5 分钟
- 主动推送消息每日每个子频道限 2 条
- 发送消息接口要求机器人接口需要链接到websocket gateway 上保持在线状态
:param channel_id:
子频道ID
:param content:
消息内容,文本内容,支持内嵌格式
:param msg_id:
要回复的消息id(Message.id), 在 AT_CREATE_MESSAGE 事件中获取。带了 msg_id 视为被动回复消息,否则视为主动推送消息
:param embed:
embed 消息,一种特殊的 ark
:param ark:
ark 消息
:param image:
图片url地址
:param message_reference:
引用消息
:return: Message
"""
params = _handle_message_parameters(content, embed, ark, message_reference, image, msg_id, event_id, markdown)
route = Route("POST", "/channels/{channel_id}/messages", channel_id=channel_id)
return await self._http.request(route, json=params)

# async def recall_message(self, channel_id: str, message_id: str, hide_tip: bool = False):
# """
# 撤回消息
Expand Down Expand Up @@ -514,10 +567,10 @@ async def update_channel_role_permissions(
# response = await self._http.get(url, params=query)
# return json.loads(response, object_hook=Guild)
#
# """WebsocketAPI"""
#
# async def ws(self):
# return await self._http.request(Route("GET", "/gateway/bot"))
# WebsocketAPI
async def ws(self):
return await self._http.request(Route("GET", "/gateway/bot"))

#
# """禁言接口"""
#
Expand Down
4 changes: 2 additions & 2 deletions botpy/client.py
Expand Up @@ -10,8 +10,7 @@
from .flags import Intents
from .gateway import BotWebSocket
from .http import BotHttp
from .instances.robot import Robot
from .instances.token import Token
from .robot import Robot, Token

_log = logging.get_logger()

Expand Down Expand Up @@ -155,6 +154,7 @@ async def _bot_login(self, token: Token) -> None:
connect=self.bot_connect,
dispatch=self.dispatch,
loop=asyncio.get_event_loop(),
api=self.api,
)

self._connection.state.robot = Robot(user)
Expand Down
17 changes: 11 additions & 6 deletions botpy/connection.py
Expand Up @@ -2,8 +2,11 @@
import inspect
from typing import List, Callable, Dict, Any, Optional

from .instances.robot import Robot
from .api import BotAPI
from .message import Message
from .robot import Robot
from .logging import logging
from .types import gateway
from .types.gateway import ReadyEvent
from .types.session import Session

Expand All @@ -17,9 +20,9 @@ class ConnectionSession:
这里通过设置session_id=""空则任务session需要重连
"""

def __init__(self, max_async, connect: Callable, dispatch: Callable, loop=None):
def __init__(self, max_async, connect: Callable, dispatch: Callable, loop=None, api: BotAPI = None):
self.dispatch = dispatch
self.state = ConnectionState(dispatch)
self.state = ConnectionState(dispatch, api)
self.parser: Dict[str, Callable[[Any], None]] = self.state.parsers

self._connect = connect
Expand Down Expand Up @@ -61,7 +64,7 @@ def add(self, session: Session):
class ConnectionState:
"""Client的Websocket状态处理"""

def __init__(self, dispatch: Callable):
def __init__(self, dispatch: Callable, api: BotAPI):
self.robot: Optional[Robot] = None

self.parsers: Dict[str, Callable[[Any], None]]
Expand All @@ -71,9 +74,11 @@ def __init__(self, dispatch: Callable):
parsers[attr[6:].lower()] = func

self._dispatch = dispatch
self.api = api

def parse_at_message_create(self, data):
self._dispatch("at_message_create", data)
def parse_at_message_create(self, data: gateway.MessagePayload):
message = Message(self.api, data)
self._dispatch("at_message_create", message)

def parse_ready(self, data: ReadyEvent):
self._dispatch("ready")
Expand Down
2 changes: 1 addition & 1 deletion botpy/http.py
Expand Up @@ -9,7 +9,7 @@

from .utils import JsonUtil
from .errors import HttpErrorDict, ServerError
from .instances.token import Token
from .robot import Token
from .logging import logging
from .types import robot

Expand Down
Empty file removed botpy/instances/__init__.py
Empty file.
11 changes: 0 additions & 11 deletions botpy/instances/robot.py

This file was deleted.

15 changes: 15 additions & 0 deletions botpy/message.py
@@ -0,0 +1,15 @@
from .api import BotAPI
from .types import gateway


class Message:
__slots__ = ("_api", "content", "channel_id", "message_id")

def __init__(self, api: BotAPI, data: gateway.MessagePayload):
self._api = api
# TODO 创建一些实体类的数据缓存
self.channel_id = data["channel_id"]
self.message_id = data["id"]

async def reply(self, content: str):
await self._api.post_message(content=content, channel_id=self.channel_id, msg_id=self.message_id)
24 changes: 0 additions & 24 deletions botpy/model/__init__.py
@@ -1,29 +1,5 @@
# -*- coding: utf-8 -*-
from .audio import AudioControl, STATUS
from .message import (
Message,
TypesEnum,
MessagesPager,
MessageAttachment,
MessageEmbedThumbnail,
MessageEmbedField,
MessageEmbed,
MessageArkObjKv,
MessageArkObj,
MessageArkKv,
MessageArk,
MessageMarkdownParams,
MessageMarkdown,
MessageReference,
MessageSendRequest,
DirectMessageGuild,
CreateDirectMessageRequest,
DeletedMessageOriginalAuthor,
DeletedMessage,
DeletionOperator,
MessageSendRequest,
DeletedMessageInfo,
)
from .mute import MuteOption, MultiMuteOption
from .schedule import ScheduleToCreate, ScheduleToPatch
from .user import ReqOption
Expand Down

0 comments on commit 979f3f8

Please sign in to comment.