diff --git a/docs_build/README.rst b/docs_build/README.rst
index 95ffcc2d..4a273041 100644
--- a/docs_build/README.rst
+++ b/docs_build/README.rst
@@ -18,3 +18,4 @@ NoneBot Api Reference
- `nonebot.adapters `_
- `nonebot.adapters.cqhttp `_
- `nonebot.adapters.ding `_
+ - `nonebot.adapters.mirai `_
diff --git a/docs_build/adapters/mirai.rst b/docs_build/adapters/mirai.rst
new file mode 100644
index 00000000..1f6e3eaf
--- /dev/null
+++ b/docs_build/adapters/mirai.rst
@@ -0,0 +1,72 @@
+---
+contentSidebar: true
+sidebarDepth: 0
+---
+
+NoneBot.adapters.mirai 模块
+===========================
+
+.. automodule:: nonebot.adapters.mirai
+
+NoneBot.adapters.mirai.bot 模块
+=====================================
+
+.. automodule:: nonebot.adapters.mirai.bot
+ :members:
+ :show-inheritance:
+
+NoneBot.adapters.mirai.bot_ws 模块
+=====================================
+
+.. automodule:: nonebot.adapters.mirai.bot_ws
+ :members:
+ :show-inheritance:
+
+NoneBot.adapters.mirai.config 模块
+=====================================
+
+.. automodule:: nonebot.adapters.mirai.config
+ :members:
+ :show-inheritance:
+
+NoneBot.adapters.mirai.message 模块
+====================================
+
+.. automodule:: nonebot.adapters.mirai.message
+ :members:
+ :show-inheritance:
+
+NoneBot.adapters.mirai.event 模块
+====================================
+
+.. automodule:: nonebot.adapters.mirai.event
+ :members:
+ :show-inheritance:
+
+NoneBot.adapters.mirai.event.base 模块
+====================================
+
+.. automodule:: nonebot.adapters.mirai.event.base
+ :members:
+ :show-inheritance:
+
+NoneBot.adapters.mirai.event.message 模块
+====================================
+
+.. automodule:: nonebot.adapters.mirai.event.message
+ :members:
+ :show-inheritance:
+
+NoneBot.adapters.mirai.event.notice 模块
+====================================
+
+.. automodule:: nonebot.adapters.mirai.event.notice
+ :members:
+ :show-inheritance:
+
+NoneBot.adapters.mirai.event.request 模块
+====================================
+
+.. automodule:: nonebot.adapters.mirai.event.request
+ :members:
+ :show-inheritance:
\ No newline at end of file
diff --git a/nonebot/adapters/mirai/bot.py b/nonebot/adapters/mirai/bot.py
index 27e91066..81c7f7b7 100644
--- a/nonebot/adapters/mirai/bot.py
+++ b/nonebot/adapters/mirai/bot.py
@@ -22,13 +22,13 @@ from .message import MessageChain, MessageSegment
class ActionFailed(BaseActionFailed):
- def __init__(self, code: int, message: str = ''):
+ def __init__(self, **kwargs):
super().__init__('mirai')
- self.code = code
- self.message = message
+ self.data = kwargs.copy()
def __repr__(self):
- return f"{self.__class__.__name__}(code={self.code}, message={self.message!r})"
+ return self.__class__.__name__ + '(%s)' % ', '.join(
+ map(lambda m: '%s=%r' % m, self.data.items()))
class SessionManager:
@@ -44,7 +44,7 @@ class SessionManager:
logger.opt(colors=True).debug('Mirai API returned data: '
f'{escape_tag(str(data))}')
if code != 0:
- raise ActionFailed(code, message=data['msg'])
+ raise ActionFailed(**data)
return data
async def post(self,
@@ -310,7 +310,7 @@ class MiraiBot(BaseBot):
return await self.api.post('recall', params={'target': target})
async def send_image_message(self, target: int, qq: int, group: int,
- urls: List[str]):
+ urls: List[str]) -> List[str]:
"""
:说明:
@@ -321,14 +321,14 @@ class MiraiBot(BaseBot):
:参数:
- * ``target: int``: [description]
- * ``qq: int``: [description]
- * ``group: int``: [description]
- * ``urls: List[str]``: [description]
+ * ``target: int``: 发送对象的QQ号或群号,可能存在歧义
+ * ``qq: int``: 发送对象的QQ号
+ * ``group: int``: 发送对象的群号
+ * ``urls: List[str]``: 是一个url字符串构成的数组
:返回:
- - ``[type]``: [description]
+ - ``List[str]``: 一个包含图片imageId的数组
"""
return await self.api.post('sendImageMessage',
params={
@@ -336,48 +336,174 @@ class MiraiBot(BaseBot):
'qq': qq,
'group': group,
'urls': urls
- })
+ }) # type: ignore
async def upload_image(self, type: str, img: BytesIO):
+ """
+ :说明:
+
+ 使用此方法上传图片文件至服务器并返回Image_id
+
+ :参数:
+
+ * ``type: str``: "friend" 或 "group" 或 "temp"
+ * ``img: BytesIO``: 图片的BytesIO对象
+
+ :返回:
+
+ - ``Any``: API 调用返回数据
+ """
return await self.api.upload('uploadImage',
type=type,
file=('img', img))
async def upload_voice(self, type: str, voice: BytesIO):
+ """
+ :说明:
+
+ 使用此方法上传语音文件至服务器并返回voice_id
+
+ :参数:
+
+ * ``type: str``: 当前仅支持 "group"
+ * ``voice: BytesIO``: 语音的BytesIO对象
+
+ :返回:
+
+ - ``Any``: API 调用返回数据
+ """
return await self.api.upload('uploadVoice',
type=type,
file=('voice', voice))
- async def fetch_message(self):
- return await self.api.request('fetchMessage')
+ async def fetch_message(self, count: int = 10):
+ """
+ :说明:
- async def fetch_latest_message(self):
- return await self.api.request('fetchLatestMessage')
+ 使用此方法获取bot接收到的最老消息和最老各类事件
+ (会从MiraiApiHttp消息记录中删除)
- async def peek_message(self, count: int):
+ :参数:
+
+ * ``count: int``: 获取消息和事件的数量
+ """
+ return await self.api.request('fetchMessage', params={'count': count})
+
+ async def fetch_latest_message(self, count: int = 10):
+ """
+ :说明:
+
+ 使用此方法获取bot接收到的最新消息和最新各类事件
+ (会从MiraiApiHttp消息记录中删除)
+
+ :参数:
+
+ * ``count: int``: 获取消息和事件的数量
+ """
+ return await self.api.request('fetchLatestMessage',
+ params={'count': count})
+
+ async def peek_message(self, count: int = 10):
+ """
+ :说明:
+
+ 使用此方法获取bot接收到的最老消息和最老各类事件
+ (不会从MiraiApiHttp消息记录中删除)
+
+ :参数:
+
+ * ``count: int``: 获取消息和事件的数量
+ """
return await self.api.request('peekMessage', params={'count': count})
- async def peek_latest_message(self, count: int):
+ async def peek_latest_message(self, count: int = 10):
+ """
+ :说明:
+
+ 使用此方法获取bot接收到的最新消息和最新各类事件
+ (不会从MiraiApiHttp消息记录中删除)
+
+ :参数:
+
+ * ``count: int``: 获取消息和事件的数量
+ """
return await self.api.request('peekLatestMessage',
params={'count': count})
async def messsage_from_id(self, id: int):
+ """
+ :说明:
+
+ 通过messageId获取一条被缓存的消息
+ 使用此方法获取bot接收到的消息和各类事件
+
+ :参数:
+
+ * ``id: int``: 获取消息的message_id
+ """
return await self.api.request('messageFromId', params={'id': id})
async def count_message(self):
+ """
+ :说明:
+
+ 使用此方法获取bot接收并缓存的消息总数,注意不包含被删除的
+ """
return await self.api.request('countMessage')
async def friend_list(self) -> List[Dict[str, Any]]:
+ """
+ :说明:
+
+ 使用此方法获取bot的好友列表
+
+ :返回:
+
+ - ``List[Dict[str, Any]]``: 返回的好友列表数据
+ """
return await self.api.request('friendList') # type: ignore
async def group_list(self) -> List[Dict[str, Any]]:
+ """
+ :说明:
+
+ 使用此方法获取bot的群列表
+
+ :返回:
+
+ - ``List[Dict[str, Any]]``: 返回的群列表数据
+ """
return await self.api.request('groupList') # type: ignore
async def member_list(self, target: int) -> List[Dict[str, Any]]:
+ """
+ :说明:
+
+ 使用此方法获取bot指定群种的成员列表
+
+ :参数:
+
+ * ``target: int``: 指定群的群号
+
+ :返回:
+
+ - ``List[Dict[str, Any]]``: 返回的群成员列表数据
+ """
return await self.api.request('memberList',
params={'target': target}) # type: ignore
async def mute(self, target: int, member_id: int, time: int):
+ """
+ :说明:
+
+ 使用此方法指定群禁言指定群员(需要有相关权限)
+
+ :参数:
+
+ * ``target: int``: 指定群的群号
+ * ``member_id: int``: 指定群员QQ号
+ * ``time: int``: 禁言时长,单位为秒,最多30天
+ """
return await self.api.post('mute',
params={
'target': target,
@@ -386,6 +512,16 @@ class MiraiBot(BaseBot):
})
async def unmute(self, target: int, member_id: int):
+ """
+ :说明:
+
+ 使用此方法指定群解除群成员禁言(需要有相关权限)
+
+ :参数:
+
+ * ``target: int``: 指定群的群号
+ * ``member_id: int``: 指定群员QQ号
+ """
return await self.api.post('unmute',
params={
'target': target,
@@ -393,6 +529,17 @@ class MiraiBot(BaseBot):
})
async def kick(self, target: int, member_id: int, msg: str):
+ """
+ :说明:
+
+ 使用此方法移除指定群成员(需要有相关权限)
+
+ :参数:
+
+ * ``target: int``: 指定群的群号
+ * ``member_id: int``: 指定群员QQ号
+ * ``msg: str``: 信息
+ """
return await self.api.post('kick',
params={
'target': target,
@@ -401,18 +548,77 @@ class MiraiBot(BaseBot):
})
async def quit(self, target: int):
+ """
+ :说明:
+
+ 使用此方法使Bot退出群聊
+
+ :参数:
+
+ * ``target: int``: 退出的群号
+ """
return await self.api.post('quit', params={'target': target})
async def mute_all(self, target: int):
+ """
+ :说明:
+
+ 使用此方法令指定群进行全体禁言(需要有相关权限)
+
+ :参数:
+
+ * ``target: int``: 指定群的群号
+ """
return await self.api.post('muteAll', params={'target': target})
async def unmute_all(self, target: int):
+ """
+ :说明:
+
+ 使用此方法令指定群解除全体禁言(需要有相关权限)
+
+ :参数:
+
+ * ``target: int``: 指定群的群号
+ """
return await self.api.post('unmuteAll', params={'target': target})
async def group_config(self, target: int):
+ """
+ :说明:
+
+ 使用此方法获取群设置
+
+ :参数:
+
+ * ``target: int``: 指定群的群号
+
+ :返回:
+
+ .. code-block:: json
+
+ {
+ "name": "群名称",
+ "announcement": "群公告",
+ "confessTalk": true,
+ "allowMemberInvite": true,
+ "autoApprove": true,
+ "anonymousChat": true
+ }
+ """
return await self.api.request('groupConfig', params={'target': target})
async def modify_group_config(self, target: int, config: Dict[str, Any]):
+ """
+ :说明:
+
+ 使用此方法修改群设置(需要有相关权限)
+
+ :参数:
+
+ * ``target: int``: 指定群的群号
+ * ``config: Dict[str, Any]``: 群设置, 格式见 ``group_config`` 的返回值
+ """
return await self.api.post('groupConfig',
params={
'target': target,
@@ -420,6 +626,25 @@ class MiraiBot(BaseBot):
})
async def member_info(self, target: int, member_id: int):
+ """
+ :说明:
+
+ 使用此方法获取群员资料
+
+ :参数:
+
+ * ``target: int``: 指定群的群号
+ * ``member_id: int``: 群员QQ号
+
+ :返回:
+
+ .. code-block:: json
+
+ {
+ "name": "群名片",
+ "specialTitle": "群头衔"
+ }
+ """
return await self.api.request('memberInfo',
params={
'target': target,
@@ -428,6 +653,21 @@ class MiraiBot(BaseBot):
async def modify_member_info(self, target: int, member_id: int,
info: Dict[str, Any]):
+ """
+ :说明:
+
+ 使用此方法修改群员资料(需要有相关权限)
+
+ :参数:
+
+ * ``target: int``: 指定群的群号
+ * ``member_id: int``: 群员QQ号
+ * ``info: Dict[str, Any]``: 群员资料, 格式见 ``member_info`` 的返回值
+
+ :返回:
+
+ - ``[type]``: [description]
+ """
return await self.api.post('memberInfo',
params={
'target': target,
diff --git a/nonebot/adapters/mirai/event/request.py b/nonebot/adapters/mirai/event/request.py
index 27fea4d8..39c64298 100644
--- a/nonebot/adapters/mirai/event/request.py
+++ b/nonebot/adapters/mirai/event/request.py
@@ -20,6 +20,15 @@ class NewFriendRequestEvent(RequestEvent):
group_id: int = Field(0, alias='groupId')
async def approve(self, bot: "Bot"):
+ """
+ :说明:
+
+ 通过此人的好友申请
+
+ :参数:
+
+ * ``bot: Bot``: 当前的 ``Bot`` 对象
+ """
return await bot.api.post('/resp/newFriendRequestEvent',
params={
'eventId': self.event_id,
@@ -32,6 +41,23 @@ class NewFriendRequestEvent(RequestEvent):
bot: "Bot",
operate: Literal[1, 2] = 1,
message: str = ''):
+ """
+ :说明:
+
+ 拒绝此人的好友申请
+
+ :参数:
+
+ * ``bot: Bot``: 当前的 ``Bot`` 对象
+ * ``operate: Literal[1, 2]``: 响应的操作类型
+ - ``1``: 拒绝添加好友
+ - ``2``: 拒绝添加好友并添加黑名单,不再接收该用户的好友申请
+ * ``message: str``: 回复的信息
+
+ :返回:
+
+ - ``[type]``: [description]
+ """
assert operate > 0
return await bot.api.post('/resp/newFriendRequestEvent',
params={
@@ -49,6 +75,15 @@ class MemberJoinRequestEvent(RequestEvent):
group_name: str = Field(alias='groupName')
async def approve(self, bot: "Bot"):
+ """
+ :说明:
+
+ 通过此人的加群申请
+
+ :参数:
+
+ * ``bot: Bot``: 当前的 ``Bot`` 对象
+ """
return await bot.api.post('/resp/memberJoinRequestEvent',
params={
'eventId': self.event_id,
@@ -61,6 +96,21 @@ class MemberJoinRequestEvent(RequestEvent):
bot: "Bot",
operate: Literal[1, 2, 3, 4] = 1,
message: str = ''):
+ """
+ :说明:
+
+ 拒绝(忽略)此人的加群申请
+
+ :参数:
+
+ * ``bot: Bot``: 当前的 ``Bot`` 对象
+ * ``operate: Literal[1, 2, 3, 4]``: 响应的操作类型
+ - ``1``: 拒绝入群
+ - ``2``: 忽略请求
+ - ``3``: 拒绝入群并添加黑名单,不再接收该用户的入群申请
+ - ``4``: 忽略入群并添加黑名单,不再接收该用户的入群申请
+ * ``message: str``: 回复的信息
+ """
assert operate > 0
return await bot.api.post('/resp/memberJoinRequestEvent',
params={
@@ -78,6 +128,15 @@ class BotInvitedJoinGroupRequestEvent(RequestEvent):
group_name: str = Field(alias='groupName')
async def approve(self, bot: "Bot"):
+ """
+ :说明:
+
+ 通过这份被邀请入群申请
+
+ :参数:
+
+ * ``bot: Bot``: 当前的 ``Bot`` 对象
+ """
return await bot.api.post('/resp/botInvitedJoinGroupRequestEvent',
params={
'eventId': self.event_id,
@@ -87,6 +146,16 @@ class BotInvitedJoinGroupRequestEvent(RequestEvent):
})
async def reject(self, bot: "Bot", message: str = ""):
+ """
+ :说明:
+
+ 拒绝这份被邀请入群申请
+
+ :参数:
+
+ * ``bot: Bot``: 当前的 ``Bot`` 对象
+ * ``message: str``: 邀请消息
+ """
return await bot.api.post('/resp/botInvitedJoinGroupRequestEvent',
params={
'eventId': self.event_id,