🚧 add api methods define

This commit is contained in:
Mix 2021-01-30 20:40:00 +08:00
parent c82ceefc8b
commit 95f27824ee
2 changed files with 214 additions and 13 deletions

View File

@ -1,6 +1,7 @@
from typing import Any, Dict, Optional, Tuple
from datetime import datetime, timedelta from datetime import datetime, timedelta
from io import BytesIO
from ipaddress import IPv4Address from ipaddress import IPv4Address
from typing import Any, Dict, List, NoReturn, Optional, Tuple
import httpx import httpx
@ -14,7 +15,8 @@ from nonebot.message import handle_event
from nonebot.typing import overrides from nonebot.typing import overrides
from .config import Config as MiraiConfig from .config import Config as MiraiConfig
from .event import Event, FriendMessage, TempMessage, GroupMessage from .event import Event, FriendMessage, GroupMessage, TempMessage
from .message import MessageChain, MessageSegment
class SessionManager: class SessionManager:
@ -24,12 +26,41 @@ class SessionManager:
def __init__(self, session_key: str, client: httpx.AsyncClient): def __init__(self, session_key: str, client: httpx.AsyncClient):
self.session_key, self.client = session_key, client self.session_key, self.client = session_key, client
async def post(self, path: str, *, params: Optional[Dict[str, Any]] = None): async def post(self,
path: str,
*,
params: Optional[Dict[str, Any]] = None) -> Dict[str, Any]:
params = {**(params or {}), 'sessionKey': self.session_key} params = {**(params or {}), 'sessionKey': self.session_key}
response = await self.client.post(path, json=params) response = await self.client.post(path, json=params)
response.raise_for_status() response.raise_for_status()
return response.json() return response.json()
async def request(self,
path: str,
*,
params: Optional[Dict[str,
Any]] = None) -> Dict[str, Any]:
response = await self.client.get(path,
params={
**(params or {}), 'sessionKey':
self.session_key
})
response.raise_for_status()
return response.json()
async def upload(self, path: str, *, type: str,
file: Tuple[str, BytesIO]) -> Dict[str, Any]:
file_type, file_io = file
response = await self.client.post(path,
data={
'sessionKey': self.session_key,
'type': type
},
files={file_type: file_io},
timeout=6)
response.raise_for_status()
return response.json()
@classmethod @classmethod
async def new(cls, self_id: int, *, host: IPv4Address, port: int, async def new(cls, self_id: int, *, host: IPv4Address, port: int,
auth_key: str): auth_key: str):
@ -117,9 +148,163 @@ class MiraiBot(BaseBot):
})) }))
@overrides(BaseBot) @overrides(BaseBot)
async def call_api(self, api: str, **data): async def call_api(self, api: str, **data) -> NoReturn:
return await self.api.post('/' + api, params=data) raise NotImplementedError
@overrides(BaseBot) @overrides(BaseBot)
async def send(self, event: "BaseEvent", message: str, **kwargs): async def __getattr__(self, key: str) -> NoReturn:
pass raise NotImplementedError
@overrides(BaseBot)
async def send(self,
event: Event,
message: MessageChain,
at_sender: bool = False,
**kwargs):
if isinstance(event, FriendMessage):
return await self.send_friend_message(target=event.sender.id,
message_chain=message)
elif isinstance(event, GroupMessage):
return await self.send_group_message(target=event.sender.group.id,
message_chain=message)
elif isinstance(event, TempMessage):
return await self.send_temp_message(qq=event.sender.id,
group=event.sender.group.id,
message_chain=message)
else:
raise ValueError(f'Unsupported event type {event!r}.')
async def send_friend_message(self, target: int,
message_chain: MessageChain):
return await self.api.post('sendFriendMessage',
params={
'target': target,
'messageChain': message_chain.export()
})
async def send_temp_message(self, qq: int, group: int,
message_chain: MessageChain):
return await self.api.post('sendTempMessage',
params={
'qq': qq,
'group': group,
'messageChain': message_chain.export()
})
async def send_group_message(self, target: int,
message_chain: MessageChain):
return await self.api.post('sendGroupMessage',
params={
'target': target,
'messageChain': message_chain.export()
})
async def recall(self, target: int):
return await self.api.post('recall', params={'target': target})
async def send_image_message(self, target: int, qq: int, group: int,
urls: List[str]):
return await self.api.post('sendImageMessage',
params={
'target': target,
'qq': qq,
'group': group,
'urls': urls
})
async def upload_image(self, type: str, img: BytesIO):
return await self.api.upload('uploadImage',
type=type,
file=('img', img))
async def upload_voice(self, type: str, voice: BytesIO):
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_latest_message(self):
return await self.api.request('fetchLatestMessage')
async def peek_message(self, count: int):
return await self.api.request('peekMessage', params={'count': count})
async def peek_latest_message(self, count: int):
return await self.api.request('peekLatestMessage',
params={'count': count})
async def messsage_from_id(self, id: int):
return await self.api.request('messageFromId', params={'id': id})
async def count_message(self):
return await self.api.request('countMessage')
async def friend_list(self) -> List[Dict[str, Any]]:
return await self.api.request('friendList') # type: ignore
async def group_list(self) -> List[Dict[str, Any]]:
return await self.api.request('groupList') # type: ignore
async def member_list(self, 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):
return await self.api.post('mute',
params={
'target': target,
'memberId': member_id,
'time': time
})
async def unmute(self, target: int, member_id: int):
return await self.api.post('unmute',
params={
'target': target,
'memberId': member_id
})
async def kick(self, target: int, member_id: int, msg: str):
return await self.api.post('kick',
params={
'target': target,
'memberId': member_id,
'msg': msg
})
async def quit(self, target: int):
return await self.api.post('quit', params={'target': target})
async def mute_all(self, target: int):
return await self.api.post('muteAll', params={'target': target})
async def unmute_all(self, target: int):
return await self.api.post('unmuteAll', params={'target': target})
async def group_config(self, target: int):
return await self.api.request('groupConfig', params={'target': target})
async def modify_group_config(self, target: int, config: Dict[str, Any]):
return await self.api.post('groupConfig',
params={
'target': target,
'config': config
})
async def member_info(self, target: int, member_id: int):
return await self.api.request('memberInfo',
params={
'target': target,
'memberId': member_id
})
async def modify_member_info(self, target: int, member_id: int,
info: Dict[str, Any]):
return await self.api.post('memberInfo',
params={
'target': target,
'memberId': member_id,
'info': info
})

View File

@ -1,4 +1,4 @@
from typing import TYPE_CHECKING from typing import Any
from pydantic import Field from pydantic import Field
@ -10,7 +10,7 @@ from .base import Event, PrivateSenderInfo, SenderInfo
class MessageEvent(Event): class MessageEvent(Event):
message_chain: MessageChain = Field(alias='messageChain') message_chain: MessageChain = Field(alias='messageChain')
sender: SenderInfo sender: Any
@overrides(Event) @overrides(Event)
def get_message(self) -> MessageChain: def get_message(self) -> MessageChain:
@ -22,20 +22,36 @@ class MessageEvent(Event):
@overrides(Event) @overrides(Event)
def get_user_id(self) -> str: def get_user_id(self) -> str:
return str(self.sender.id) raise NotImplementedError
@overrides(Event) @overrides(Event)
def get_session_id(self) -> str: def get_session_id(self) -> str:
return self.get_user_id() raise NotImplementedError
class GroupMessage(MessageEvent): class GroupMessage(MessageEvent):
pass sender: SenderInfo
@overrides(MessageEvent)
def get_session_id(self) -> str:
return f'group_{self.sender.group.id}_' + self.get_user_id()
class FriendMessage(MessageEvent): class FriendMessage(MessageEvent):
sender: PrivateSenderInfo sender: PrivateSenderInfo
@overrides(MessageEvent)
def get_user_id(self) -> str:
return str(self.sender.id)
@overrides
def get_session_id(self) -> str:
return 'friend_' + self.get_user_id()
class TempMessage(MessageEvent): class TempMessage(MessageEvent):
pass sender: SenderInfo
@overrides
def get_session_id(self) -> str:
return f'temp_{self.sender.group.id}_' + self.get_user_id()