melobot.protocols.onebot.v11.adapter.echo 源代码

from __future__ import annotations

from pydantic import BaseModel
from typing_extensions import Any, Literal, Mapping, TypedDict, cast

from melobot.adapter import Echo as RootEcho

from ..const import ACTION_TYPE_KEY_NAME, PROTOCOL_IDENTIFIER
from .event import _GroupMessageSender, _MessageSender
from .segment import NodeGocqCustomSegment, NodeStdCustomSegment, Segment


[文档] class Echo(RootEcho): class Model(BaseModel): status: Literal["ok", "async", "failed"] retcode: int data: Mapping[str, Any] | list | None def __init__(self, **kv_pairs: Any) -> None: self._model = self.Model(**kv_pairs) _dic = kv_pairs.copy() self.action_type: str = _dic.pop(ACTION_TYPE_KEY_NAME) self.raw = _dic super().__init__( protocol=PROTOCOL_IDENTIFIER, ok=self._model.status == "ok", status=self._model.retcode, data=self._model.data, ) def __repr__(self) -> str: return ( f"{self.__class__.__name__}(status={self._model.status}," f" retcode={self._model.retcode}, action_type={self.action_type})" )
[文档] def is_ok(self) -> bool: return self._model.status == "ok"
[文档] def is_async(self) -> bool: return self._model.status == "async"
[文档] def is_failed(self) -> bool: return self._model.status == "failed"
@classmethod def resolve(cls, raw: dict[str, Any]) -> Echo: match raw[ACTION_TYPE_KEY_NAME]: case "send_private_msg" | "send_group_msg" | "send_msg": return SendMsgEcho(**raw) case "send_private_forward_msg" | "send_group_forward_msg": return SendForwardMsgEcho(**raw) case "get_msg": return GetMsgEcho(**raw) case "get_forward_msg": return GetForwardMsgEcho(**raw) case "get_login_info": return GetLoginInfoEcho(**raw) case "get_stranger_info": return GetStrangerInfoEcho(**raw) case "get_friend_list": return GetFriendListEcho(**raw) case "get_group_info": return GetGroupInfoEcho(**raw) case "get_group_list": return GetGroupListEcho(**raw) case "get_group_member_info": return GetGroupMemberInfoEcho(**raw) case "get_group_member_list": return GetGroupMemberListEcho(**raw) case "get_group_honor_info": return GetGroupHonorInfoEcho(**raw) case "get_cookies": return GetCookiesEcho(**raw) case "get_csrf_token": return GetCsrfTokenEcho(**raw) case "get_credentials": return GetCredentialsEcho(**raw) case "get_record": return GetRecordEcho(**raw) case "get_image": return GetImageEcho(**raw) case "can_send_image": return CanSendImageEcho(**raw) case "can_send_record": return CanSendRecordEcho(**raw) case "get_status": return GetStatusEcho(**raw) case "get_version_info": return GetVersionInfoEcho(**raw) case ( "delete_msg" | "send_like" | "set_group_kick" | "set_group_ban" | "set_group_anonymous_ban" | "set_group_whole_ban" | "set_group_admin" | "set_group_anonymous" | "set_group_card" | "set_group_name" | "set_group_leave" | "set_group_special_title" | "set_friend_add_request" | "set_group_add_request" | "set_restart" | "clean_cache" ): return EmptyEcho(**raw) case _: return Echo(**raw)
[文档] class EmptyEcho(Echo): class Model(Echo.Model): data: None data: None
class _SendMsgEchoData(TypedDict): message_id: int
[文档] class SendMsgEcho(Echo): class Model(Echo.Model): data: _SendMsgEchoData | None data: _SendMsgEchoData | None
class _SendForwardMsgEchoData(TypedDict): message_id: int forward_id: str
[文档] class SendForwardMsgEcho(Echo): class Model(Echo.Model): data: _SendForwardMsgEchoData | None data: _SendForwardMsgEchoData | None
class _GetMsgEchoData(TypedDict): time: int message_type: Literal["private", "group"] message_id: int real_id: int class _GetMsgEchoDataInterface(_GetMsgEchoData): sender: _MessageSender | _GroupMessageSender message: list[Segment]
[文档] class GetMsgEcho(Echo): class Model(Echo.Model): data: _GetMsgEchoData | None data: _GetMsgEchoDataInterface | None def __init__(self, **kv_pairs: Any) -> None: super().__init__(**kv_pairs) if self.data is None: return data = kv_pairs["data"] msgs = data["message"] segs: list[Segment] if isinstance(msgs, str): segs = Segment.__resolve_cq__(msgs) else: segs = [Segment.resolve(seg_dic["type"], seg_dic["data"]) for seg_dic in msgs] sender: _MessageSender | _GroupMessageSender if data["message_type"] == "private": sender = _MessageSender(**data["sender"]) else: sender = _GroupMessageSender(**data["sender"]) self.data["message"] = segs self.data["sender"] = sender
class _GetForwardMsgEchoData(TypedDict): ... class _GetForwardMsgEchoDataInterface(_GetForwardMsgEchoData): message: list[NodeGocqCustomSegment | NodeStdCustomSegment]
[文档] class GetForwardMsgEcho(Echo): class Model(Echo.Model): data: _GetForwardMsgEchoData | None data: _GetForwardMsgEchoDataInterface | None def __init__(self, **kv_pairs: Any) -> None: super().__init__(**kv_pairs) if self.data is None: return data = kv_pairs["data"] msgs = data["message"] segs: list[Segment] if isinstance(msgs, str): segs = Segment.__resolve_cq__(msgs) else: segs = [Segment.resolve(seg_dic["type"], seg_dic["data"]) for seg_dic in msgs] self.data["message"] = cast(list[NodeGocqCustomSegment | NodeStdCustomSegment], segs)
class _GetLoginInfoEchoData(TypedDict): user_id: int nickname: str
[文档] class GetLoginInfoEcho(Echo): class Model(Echo.Model): data: _GetLoginInfoEchoData | None data: _GetLoginInfoEchoData | None
class _GetStrangerInfoEchoData(TypedDict): user_id: int nickname: str sex: Literal["male", "female", "unknown"] age: int
[文档] class GetStrangerInfoEcho(Echo): class Model(Echo.Model): data: _GetStrangerInfoEchoData | None data: _GetStrangerInfoEchoData | None
class _GetFriendListEchoElem(TypedDict): user_id: int nickname: str remark: str
[文档] class GetFriendListEcho(Echo): class Model(Echo.Model): data: list[_GetFriendListEchoElem] | None data: list[_GetFriendListEchoElem] | None
class _GetGroupInfoEchoData(TypedDict): group_id: int group_name: str member_count: int max_member_count: int
[文档] class GetGroupInfoEcho(Echo): class Model(Echo.Model): data: _GetGroupInfoEchoData | None data: _GetGroupInfoEchoData | None
[文档] class GetGroupListEcho(Echo): class Model(Echo.Model): data: list[_GetGroupInfoEchoData] | None data: list[_GetGroupInfoEchoData] | None
class _GetGroupMemberInfoEchoData(TypedDict): group_id: int user_id: int nickname: str card: str sex: str age: int area: str join_time: int last_sent_time: int level: str role: Literal["owner", "admin", "member"] unfriendly: bool title: str title_expire_time: int card_changeable: bool
[文档] class GetGroupMemberInfoEcho(Echo): class Model(Echo.Model): data: _GetGroupMemberInfoEchoData | None data: _GetGroupMemberInfoEchoData | None
[文档] class GetGroupMemberListEcho(Echo): class Model(Echo.Model): data: list[_GetGroupMemberInfoEchoData] | None data: list[_GetGroupMemberInfoEchoData] | None
class _CurrentTalkativeData(TypedDict): user_id: int nickname: str avatar: str day_count: int class _OtherListData(TypedDict): user_id: int nickname: str avatar: str description: str class _GetGroupHonorInfoEchoData(TypedDict): group_id: int current_talkative: _CurrentTalkativeData | None talkative_list: list[_OtherListData] | None performer_list: list[_OtherListData] | None legend_list: list[_OtherListData] | None strong_newbie_list: list[_OtherListData] | None emotion_list: list[_OtherListData] | None
[文档] class GetGroupHonorInfoEcho(Echo): class Model(Echo.Model): data: _GetGroupHonorInfoEchoData | None data: _GetGroupHonorInfoEchoData | None
class _GetCookiesEchoData(TypedDict): cookies: str
[文档] class GetCookiesEcho(Echo): class Model(Echo.Model): data: _GetCookiesEchoData | None data: _GetCookiesEchoData | None
class _GetCsrfTokenEchoData(TypedDict): token: int
[文档] class GetCsrfTokenEcho(Echo): class Model(Echo.Model): data: _GetCsrfTokenEchoData | None data: _GetCsrfTokenEchoData | None
class _GetCredentialsEchoData(TypedDict): cookies: str csrf_token: int
[文档] class GetCredentialsEcho(Echo): class Model(Echo.Model): data: _GetCredentialsEchoData | None data: _GetCredentialsEchoData | None
class _GetRecordEchoData(TypedDict): file: str
[文档] class GetRecordEcho(Echo): class Model(Echo.Model): data: _GetRecordEchoData | None data: _GetRecordEchoData | None
class _GetImageEchoData(TypedDict): file: str
[文档] class GetImageEcho(Echo): class Model(Echo.Model): data: _GetImageEchoData | None data: _GetImageEchoData | None
class _CanSendImageEchoData(TypedDict): yes: bool
[文档] class CanSendImageEcho(Echo): class Model(Echo.Model): data: _CanSendImageEchoData | None data: _CanSendImageEchoData | None
class _CanSendRecordEchoData(TypedDict): yes: bool
[文档] class CanSendRecordEcho(Echo): class Model(Echo.Model): data: _CanSendRecordEchoData | None data: _CanSendRecordEchoData | None
class _GetStatusEchoData(TypedDict): online: bool good: bool
[文档] class GetStatusEcho(Echo): class Model(Echo.Model): data: _GetStatusEchoData | None def __init__(self, **kv_pairs: Any) -> None: self._model: GetStatusEcho.Model super().__init__(**kv_pairs) if kv_pairs["data"] is None: return for k, v in kv_pairs["data"].items(): if k not in cast(_GetStatusEchoData, self._model.data): cast(_GetStatusEchoData, self.data)[k] = v # type: ignore[literal-required] data: _GetStatusEchoData | None
class _GetVersionInfoEchoData(TypedDict): app_name: str app_version: str protocol_version: str
[文档] class GetVersionInfoEcho(Echo): class Model(Echo.Model): data: _GetVersionInfoEchoData | None def __init__(self, **kv_pairs: Any) -> None: self._model: GetVersionInfoEcho.Model super().__init__(**kv_pairs) if kv_pairs["data"] is None: return for k, v in kv_pairs["data"].items(): if k not in cast(_GetVersionInfoEchoData, self._model.data): cast(_GetVersionInfoEchoData, self.data)[k] = v # type: ignore[literal-required] data: _GetVersionInfoEchoData | None