melobot.protocols.onebot.v11.io.packet 源代码
from __future__ import annotations
import asyncio
import copy
import json
from dataclasses import dataclass, field
from typing_extensions import Any, cast
from melobot.io import EchoPacket as RootEchoPak
from melobot.io import InPacket as RootInPak
from melobot.io import OutPacket as RootOutPak
from ..const import PROTOCOL_IDENTIFIER
@dataclass(kw_only=True)
class InPacket(RootInPak): # type: ignore[override]
data: dict
protocol: str = PROTOCOL_IDENTIFIER
@dataclass(kw_only=True)
class OutPacket(RootOutPak): # type: ignore[override]
data: str
action_type: str
action_params: dict
echo_id: str | None = None
protocol: str = PROTOCOL_IDENTIFIER
@dataclass(kw_only=True)
class EchoPacket(RootEchoPak): # type: ignore[override]
action_type: str = ""
data: dict = field(default_factory=dict)
protocol: str = PROTOCOL_IDENTIFIER
@dataclass(kw_only=True)
class ShareToDownstreamInPacket(InPacket): # type: ignore[override]
to_downstream: asyncio.Future[EventToDownstream] = field(
default_factory=lambda: asyncio.get_running_loop().create_future()
)
@dataclass(kw_only=True)
class DownstreamCallInPacket(InPacket): # type: ignore[override]
to_upstream: asyncio.Future[ActionToUpstream] = field(
default_factory=lambda: asyncio.get_running_loop().create_future()
)
@dataclass(kw_only=True)
class UpstreamRetInPacket(InPacket): # type: ignore[override]
to_downstream: asyncio.Future[EchoToDownstream] = field(
default_factory=lambda: asyncio.get_running_loop().create_future()
)
[文档]
class ActionToUpstream:
def __init__(self, type: str, params: dict[str, Any], echo: str) -> None:
self.type = type
self.params = params
self.echo = echo
self._params_updated = False
self._forbidden = False
[文档]
def set_param(self, key: str, value: Any) -> None:
"""设置传递给上游的数据的 `params` 字段中的字段
:param key: `params` 字典中的键
:param value: 新值
"""
if not self._params_updated:
self.params = copy.deepcopy(self.params)
self._params_updated = True
self.params[key] = value
[文档]
def override(self, new_dic: dict[str, Any]) -> None:
"""覆盖传递给上游的数据
:param new_dic: 新的字典,必须包含 `type` 和 `params` 键,`echo` 键不存在时设置为空字符串
"""
self.type = cast(str, new_dic["type"])
if new_dic["params"] is not self.params:
self._params_updated = True
self.params = cast(dict[str, Any], new_dic["params"])
self.echo = cast(str, new_dic.get("echo", ""))
[文档]
def is_forbidden(self) -> bool:
"""检查数据是否被阻止传递给上游"""
return self._forbidden
[文档]
def forbidden(self) -> None:
"""阻止数据传递给上游"""
self._forbidden = True
[文档]
def get_dict(self, deepcopy: bool = True) -> dict[str, Any]:
"""获得传递给上游的数据的字典表示"""
return {
"action": self.type,
"params": copy.deepcopy(self.params) if deepcopy else self.params,
"echo": self.echo,
}
[文档]
def get_json(self) -> str:
"""获得传递给上游的数据的 JSON 字符串表示"""
return json.dumps(
{"action": self.type, "params": self.params, "echo": self.echo}, ensure_ascii=False
)
[文档]
class ToDownstream:
def __init__(self, dic: dict[str, Any]) -> None:
self._raw = dic
self._updated = False
self._forbidden = False
[文档]
def set_param(self, key: str, value: Any) -> None:
"""设置传递给下游的数据中的字段
:param key: 键
:param value: 新值
"""
if not self._updated:
self._raw = copy.deepcopy(self._raw)
self._updated = True
self._raw[key] = value
[文档]
def override(self, new_dic: dict[str, Any]) -> None:
"""覆盖传递给下游的数据
:param new_dic: 新的字典
"""
if new_dic is not self._raw:
self._updated = True
self._raw = new_dic
[文档]
def is_forbidden(self) -> bool:
"""检查数据是否被阻止传递给下游"""
return self._forbidden
[文档]
def forbidden(self) -> None:
"""阻止数据传递给下游"""
self._forbidden = True
[文档]
def get_dict(self, deepcopy: bool = True) -> dict[str, Any]:
"""获得传递给下游的数据的字典表示"""
return copy.deepcopy(self._raw) if deepcopy else self._raw
[文档]
def get_json(self) -> str:
"""获得传递给下游的数据的 JSON 字符串表示"""
return json.dumps(self._raw, ensure_ascii=False)
[文档]
class EventToDownstream(ToDownstream):
pass
[文档]
class EchoToDownstream(ToDownstream):
[文档]
def set_data_param(self, key: str, value: Any) -> None:
"""设置传递给下游的数据的 `data` 字段中的字段
:param key: 键
:param value: 新值
"""
if not self._updated:
self._raw = copy.deepcopy(self._raw)
self._updated = True
self._raw["data"][key] = value