-from __future__ import annotations
+from __future__ import annotations
-from typing_extensions import Any, ClassVar, Generic, Literal, NamedTuple, NoReturn
+from typing_extensions import Any, ClassVar, Generic, Literal, NamedTuple, NoReturn
-from .typ import T
+from .typ import T
__version__ = "3.0.0"
-def _version_str_to_info(s: str) -> VersionInfo:
+def _version_str_to_info(s: str) -> VersionInfo:
parts = s.split(".")
major = int(parts[0])
minor = int(parts[1])
@@ -335,20 +335,20 @@ melobot._meta 源代码
return VersionInfo(major, minor, micro, flag, serial)
-class ReadOnlyAttr(Generic[T]):
- def __init__(self, val: T):
+class ReadOnlyAttr(Generic[T]):
+ def __init__(self, val: T):
self.val = val
- def __get__(self, obj: Any, klass: Any = None) -> T:
+ def __get__(self, obj: Any, klass: Any = None) -> T:
return self.val
- def __set__(self, obj: Any, value: T) -> NoReturn:
+ def __set__(self, obj: Any, value: T) -> NoReturn:
raise AttributeError("只读属性无法重新设定值")
[文档]
-
class VersionInfo(NamedTuple):
+
class VersionInfo(NamedTuple):
"""版本信息元组"""
major: int
@@ -391,7 +391,7 @@
melobot._meta 源代码
-class MetaInfoMeta(type):
+class MetaInfoMeta(type):
ver = ReadOnlyAttr[str](__version__)
ver_info = ReadOnlyAttr[VersionInfo](_version_str_to_info(__version__))
name = ReadOnlyAttr[str]("melobot")
@@ -412,7 +412,7 @@ melobot._meta 源代码
melobot.adapter.base 源代码
-from __future__ import annotations
+from __future__ import annotations
-import asyncio
-from asyncio import create_task
-from contextlib import AsyncExitStack, _GeneratorContextManager, asynccontextmanager
-from enum import Enum
-from os import PathLike
+import asyncio
+from asyncio import create_task
+from contextlib import AsyncExitStack, _GeneratorContextManager, asynccontextmanager
+from enum import Enum
+from os import PathLike
-from typing_extensions import (
+from typing_extensions import (
TYPE_CHECKING,
AsyncGenerator,
Callable,
@@ -323,10 +323,10 @@ melobot.adapter.base 源代码
final,
)
-from .._hook import Hookable
-from ..ctx import EventBuildInfo, EventBuildInfoCtx, LoggerCtx, OutSrcFilterCtx
-from ..exceptions import AdapterError
-from ..io.base import (
+from .._hook import Hookable
+from ..ctx import EventBuildInfo, EventBuildInfoCtx, LoggerCtx, OutSrcFilterCtx
+from ..exceptions import AdapterError
+from ..io.base import (
AbstractInSource,
AbstractOutSource,
EchoPacketT,
@@ -335,13 +335,13 @@ melobot.adapter.base 源代码
OutPacketT,
OutSourceT,
)
-from ..log.base import LogLevel
-from ..typ import AsyncCallable, BetterABC, P, abstractmethod
-from .content import Content
-from .model import ActionHandle, ActionT, EchoT, Event, EventT
+from ..log.base import LogLevel
+from ..typ import AsyncCallable, BetterABC, P, abstractmethod
+from .content import Content
+from .model import ActionHandle, ActionT, EchoT, Event, EventT
if TYPE_CHECKING:
- from ..bot.dispatch import Dispatcher
+ from ..bot.dispatch import Dispatcher
_EVENT_BUILD_INFO_CTX = EventBuildInfoCtx()
@@ -350,13 +350,13 @@ melobot.adapter.base 源代码
[文档]
-
class AbstractEventFactory(BetterABC, Generic[InPacketT, EventT]):
+
class AbstractEventFactory(BetterABC, Generic[InPacketT, EventT]):
"""抽象事件工厂类"""
[文档]
@abstractmethod
-
async def create(self, packet: InPacketT) -> EventT:
+
async def create(self, packet: InPacketT) -> EventT:
"""将 :class:`.InPacket` 对象转换为 :class:`.Event` 对象的方法
:param packet: 输入包
@@ -372,13 +372,13 @@
melobot.adapter.base 源代码
[文档]
-
class AbstractOutputFactory(BetterABC, Generic[OutPacketT, ActionT]):
+
class AbstractOutputFactory(BetterABC, Generic[OutPacketT, ActionT]):
"""抽象输出工厂类"""
[文档]
@abstractmethod
-
async def create(self, action: ActionT) -> OutPacketT:
+
async def create(self, action: ActionT) -> OutPacketT:
"""将 :class:`.Action` 对象转换为 :class:`.OutPacket` 对象的方法
:param packet: 行为
@@ -394,13 +394,13 @@
melobot.adapter.base 源代码
[文档]
-
class AbstractEchoFactory(BetterABC, Generic[EchoPacketT, EchoT]):
+
class AbstractEchoFactory(BetterABC, Generic[EchoPacketT, EchoT]):
"""抽象回应工厂类"""
[文档]
@abstractmethod
-
async def create(self, packet: EchoPacketT) -> EchoT | None:
+
async def create(self, packet: EchoPacketT) -> EchoT | None:
"""将 :class:`.EchoPacket` 对象转换为 :class:`.Echo` 对象的方法
:param packet: 回应包
@@ -416,7 +416,7 @@
melobot.adapter.base 源代码
[文档]
-
class AdapterLifeSpan(Enum):
+
class AdapterLifeSpan(Enum):
"""适配器生命周期阶段的枚举"""
BEFORE_EVENT_HANDLE = "beh"
@@ -428,7 +428,7 @@
melobot.adapter.base 源代码
[文档]
-
class Adapter(
+
class Adapter(
BetterABC,
Generic[
EventFactoryT,
@@ -448,7 +448,7 @@
melobot.adapter.base 源代码
# pylint: disable=duplicate-code
# pylint: disable=unused-argument
- def __init__(
+ def __init__(
self,
protocol: LiteralString,
event_factory: EventFactoryT,
@@ -469,12 +469,12 @@ melobot.adapter.base 源代码
[文档]
-
def on(
+
def on(
self, *periods: AdapterLifeSpan
) -> Callable[[AsyncCallable[P, None]], AsyncCallable[P, None]]:
groups = (AdapterLifeSpan.BEFORE_EVENT_HANDLE, AdapterLifeSpan.BEFORE_ACTION_EXEC)
-
def wrapped(func: AsyncCallable[P, None]) -> AsyncCallable[P, None]:
+
def wrapped(func: AsyncCallable[P, None]) -> AsyncCallable[P, None]:
for type in periods:
self._hook_bus.register(type, func, once=type not in groups)
return func
@@ -485,7 +485,7 @@
melobot.adapter.base 源代码
[文档]
@final
-
def get_isrcs(self, filter: Callable[[InSourceT], bool]) -> set[InSourceT]:
+
def get_isrcs(self, filter: Callable[[InSourceT], bool]) -> set[InSourceT]:
"""获取与当前适配器匹配的所有输入源
:param filter: 过滤函数,为 `True` 时保留输入源
@@ -497,7 +497,7 @@
melobot.adapter.base 源代码
[文档]
@final
-
def get_osrcs(self, filter: Callable[[OutSourceT], bool]) -> set[OutSourceT]:
+
def get_osrcs(self, filter: Callable[[OutSourceT], bool]) -> set[OutSourceT]:
"""获取与当前适配器匹配的所有输出源
:param filter: 过滤函数,为 `True` 时保留输出源
@@ -507,7 +507,7 @@
melobot.adapter.base 源代码
@final
- async def __adapter_input_loop__(self, src: InSourceT) -> NoReturn:
+ async def __adapter_input_loop__(self, src: InSourceT) -> NoReturn:
logger = LoggerCtx().get()
while True:
try:
@@ -524,7 +524,7 @@ melobot.adapter.base 源代码
@asynccontextmanager
@final
- async def __adapter_launch__(self) -> AsyncGenerator[Self, None]:
+ async def __adapter_launch__(self) -> AsyncGenerator[Self, None]:
if self._inited:
raise AdapterError(f"适配器 {self} 已在运行,不能重复启动")
@@ -558,7 +558,7 @@ melobot.adapter.base 源代码
[文档]
@final
-
def filter_out(
+
def filter_out(
self, filter: Callable[[OutSourceT], bool]
) -> _GeneratorContextManager[Callable[[OutSourceT], bool]]:
"""上下文管理器,提供由 `filter` 控制输出的输出上下文
@@ -570,7 +570,7 @@
melobot.adapter.base 源代码
[文档]
-
async def call_output(self, action: ActionT) -> tuple[ActionHandle, ...]:
+
async def call_output(self, action: ActionT) -> tuple[ActionHandle, ...]:
"""输出行为,并返回各个输出源返回的 :class:`.ActionHandle` 组成的元组
适配器开发者的适配器子类可以重写此方法,以实现自定义功能
@@ -605,7 +605,7 @@
melobot.adapter.base 源代码
@abstractmethod
- async def __send_text__(self, text: str) -> tuple[ActionHandle, ...]:
+ async def __send_text__(self, text: str) -> tuple[ActionHandle, ...]:
"""输出文本
抽象方法。所有适配器子类应该实现此方法
@@ -615,7 +615,7 @@ melobot.adapter.base 源代码
"""
raise NotImplementedError
- async def __send_media__(
+ async def __send_media__(
self,
name: str,
raw: bytes | None = None,
@@ -636,7 +636,7 @@ melobot.adapter.base 源代码
f"[melobot media: {name if url is None else name + ' at ' + url}]"
)
- async def __send_image__(
+ async def __send_image__(
self,
name: str,
raw: bytes | None = None,
@@ -657,7 +657,7 @@ melobot.adapter.base 源代码
f"[melobot image: {name if url is None else name + ' at ' + url}]"
)
- async def __send_audio__(
+ async def __send_audio__(
self,
name: str,
raw: bytes | None = None,
@@ -678,7 +678,7 @@ melobot.adapter.base 源代码
f"[melobot audio: {name if url is None else name + ' at ' + url}]"
)
- async def __send_voice__(
+ async def __send_voice__(
self,
name: str,
raw: bytes | None = None,
@@ -699,7 +699,7 @@ melobot.adapter.base 源代码
f"[melobot voice: {name if url is None else name + ' at ' + url}]"
)
- async def __send_video__(
+ async def __send_video__(
self,
name: str,
raw: bytes | None = None,
@@ -720,7 +720,7 @@ melobot.adapter.base 源代码
f"[melobot video: {name if url is None else name + ' at ' + url}]"
)
- async def __send_file__(
+ async def __send_file__(
self, name: str, path: str | PathLike[str]
) -> tuple[ActionHandle, ...]:
"""输出文件
@@ -733,7 +733,7 @@ melobot.adapter.base 源代码
"""
return await self.__send_text__(f"[melobot file: {name} at {path}]")
- async def __send_refer__(
+ async def __send_refer__(
self, event: Event, contents: Sequence[Content] | None = None
) -> tuple[ActionHandle, ...]:
"""输出对过往事件的引用
@@ -748,7 +748,7 @@ melobot.adapter.base 源代码
f"[melobot refer: {event.__class__.__name__}({event.id})]"
)
- async def __send_resource__(self, name: str, url: str) -> tuple[ActionHandle, ...]:
+ async def __send_resource__(self, name: str, url: str) -> tuple[ActionHandle, ...]:
"""输出网络资源
建议所有适配器子类重写此方法,否则回退到基类实现:仅使用 :func:`send_text` 输出相关提示信息
diff --git a/_modules/melobot/adapter/content.html b/_modules/melobot/adapter/content.html
index b074559d..2c6c54e1 100644
--- a/_modules/melobot/adapter/content.html
+++ b/_modules/melobot/adapter/content.html
@@ -14,7 +14,7 @@
melobot.adapter.content - melobot 3.0.0
-
+
@@ -300,16 +300,16 @@
melobot.adapter.content 源代码
-from __future__ import annotations
+from __future__ import annotations
-import mimetypes
+import mimetypes
-from typing_extensions import Hashable, Sequence, TypeVar
+from typing_extensions import Hashable, Sequence, TypeVar
[文档]
-
class Content:
+
class Content:
"""通用内容基类"""
@@ -319,12 +319,12 @@ melobot.adapter.content 源代码
[文档]
-
class TextContent(Content):
+
class TextContent(Content):
"""文本内容"""
[文档]
-
def __init__(self, text: str) -> None:
+
def __init__(self, text: str) -> None:
"""初始化文本内容
:param text: 文本
@@ -337,12 +337,12 @@
melobot.adapter.content 源代码
[文档]
-
class MediaContent(Content):
+
class MediaContent(Content):
"""多媒体内容"""
[文档]
-
def __init__(
+
def __init__(
self,
*,
name: str,
@@ -369,40 +369,40 @@
melobot.adapter.content 源代码
[文档]
-
class ImageContent(MediaContent):
+
class ImageContent(MediaContent):
"""图像内容,初始化方法参考基类"""
[文档]
-
class AudioContent(MediaContent):
+
class AudioContent(MediaContent):
"""音频内容,初始化方法参考基类"""
[文档]
-
class VoiceContent(AudioContent):
+
class VoiceContent(AudioContent):
"""语音内容,初始化方法参考基类"""
[文档]
-
class VideoContent(MediaContent):
+
class VideoContent(MediaContent):
"""视频内容,初始化方法参考基类"""
[文档]
-
class FileContent(Content):
+
class FileContent(Content):
"""文件内容"""
[文档]
-
def __init__(self, name: str, flag: Hashable) -> None:
+
def __init__(self, name: str, flag: Hashable) -> None:
"""初始化文件内容
:param name: 文件名
@@ -413,19 +413,19 @@
melobot.adapter.content 源代码
-
def __repr__(self) -> str:
+
def __repr__(self) -> str:
return f"[melobot File: {self.name} at {self.flag}]"
[文档]
-
class ReferContent(Content):
+
class ReferContent(Content):
"""引用内容"""
[文档]
-
def __init__(self, prompt: str, flag: Hashable, contents: Sequence[Content]) -> None:
+
def __init__(self, prompt: str, flag: Hashable, contents: Sequence[Content]) -> None:
"""初始化引用内容
:param prompt: 引用的文本提示
@@ -438,19 +438,19 @@
melobot.adapter.content 源代码
self.sub_contents = contents
-
def __repr__(self) -> str:
+
def __repr__(self) -> str:
return f"[melobot Refer: {self.prompt} at {self.flag}]"
[文档]
-
class ResourceContent(Content):
+
class ResourceContent(Content):
"""资源内容"""
[文档]
-
def __init__(self, name: str, url: str) -> None:
+
def __init__(self, name: str, url: str) -> None:
"""初始化资源内容
:param name: 名称
@@ -461,7 +461,7 @@
melobot.adapter.content 源代码
-
def __repr__(self) -> str:
+
def __repr__(self) -> str:
return f"[melobot Resource: {self.name} at {self.url}]"
diff --git a/_modules/melobot/adapter/generic.html b/_modules/melobot/adapter/generic.html
index 1ee4a116..b585e62e 100644
--- a/_modules/melobot/adapter/generic.html
+++ b/_modules/melobot/adapter/generic.html
@@ -14,7 +14,7 @@
melobot.adapter.generic - melobot 3.0.0
-
+
@@ -300,20 +300,20 @@
melobot.adapter.generic 源代码
-from os import PathLike
+from os import PathLike
-from typing_extensions import Sequence
+from typing_extensions import Sequence
-from ..ctx import EventBuildInfoCtx
-from .content import Content
-from .model import ActionHandle, Event
+from ..ctx import EventBuildInfoCtx
+from .content import Content
+from .model import ActionHandle, Event
_CTX = EventBuildInfoCtx()
[文档]
-
async def send_text(text: str) -> tuple[ActionHandle, ...]:
+
async def send_text(text: str) -> tuple[ActionHandle, ...]:
"""通用文本输出方法"""
return await _CTX.get().adapter.__send_text__(text)
@@ -321,7 +321,7 @@ melobot.adapter.generic 源代码
[文档]
-
async def send_media(
+
async def send_media(
name: str,
raw: bytes | None = None,
url: str | None = None,
@@ -334,7 +334,7 @@
melobot.adapter.generic 源代码
[文档]
-
async def send_image(
+
async def send_image(
name: str,
raw: bytes | None = None,
url: str | None = None,
@@ -347,7 +347,7 @@
melobot.adapter.generic 源代码
[文档]
-
async def send_audio(
+
async def send_audio(
name: str,
raw: bytes | None = None,
url: str | None = None,
@@ -360,7 +360,7 @@
melobot.adapter.generic 源代码
[文档]
-
async def send_voice(
+
async def send_voice(
name: str,
raw: bytes | None = None,
url: str | None = None,
@@ -373,7 +373,7 @@
melobot.adapter.generic 源代码
[文档]
-
async def send_video(
+
async def send_video(
name: str,
raw: bytes | None = None,
url: str | None = None,
@@ -386,7 +386,7 @@
melobot.adapter.generic 源代码
[文档]
-
async def send_file(name: str, path: str | PathLike[str]) -> tuple[ActionHandle, ...]:
+
async def send_file(name: str, path: str | PathLike[str]) -> tuple[ActionHandle, ...]:
"""通用文件输出方法"""
return await _CTX.get().adapter.__send_file__(name, path)
@@ -394,7 +394,7 @@ melobot.adapter.generic 源代码
[文档]
-
async def send_refer(
+
async def send_refer(
event: Event, contents: Sequence[Content] | None = None
) -> tuple[ActionHandle, ...]:
"""通用过往事件引用输出方法"""
@@ -404,7 +404,7 @@
melobot.adapter.generic 源代码
[文档]
-
async def send_resource(name: str, url: str) -> tuple[ActionHandle, ...]:
+
async def send_resource(name: str, url: str) -> tuple[ActionHandle, ...]:
"""通用其他资源输出方法"""
return await _CTX.get().adapter.__send_resource__(name, url)
diff --git a/_modules/melobot/adapter/model.html b/_modules/melobot/adapter/model.html
index 3ba69e91..9f792640 100644
--- a/_modules/melobot/adapter/model.html
+++ b/_modules/melobot/adapter/model.html
@@ -14,7 +14,7 @@
melobot.adapter.model - melobot 3.0.0
-
+
@@ -300,15 +300,15 @@
melobot.adapter.model 源代码
-from __future__ import annotations
+from __future__ import annotations
-import asyncio
-from asyncio import create_task
-from contextlib import contextmanager
-from dataclasses import dataclass, field
-from time import time_ns
+import asyncio
+from asyncio import create_task
+from contextlib import contextmanager
+from dataclasses import dataclass, field
+from time import time_ns
-from typing_extensions import (
+from typing_extensions import (
TYPE_CHECKING,
Any,
Awaitable,
@@ -324,21 +324,21 @@ melobot.adapter.model 源代码
cast,
)
-from ..ctx import ActionManualSignalCtx, Context, LoggerCtx
-from ..exceptions import AdapterError
-from ..io.base import AbstractOutSource
-from ..log.base import LogLevel
-from ..typ import AttrsReprable, T
-from ..utils import get_id, to_coro
-from .content import Content
+from ..ctx import ActionManualSignalCtx, Context, LoggerCtx
+from ..exceptions import AdapterError
+from ..io.base import AbstractOutSource
+from ..log.base import LogLevel
+from ..typ import AttrsReprable, T
+from ..utils import get_id, to_coro
+from .content import Content
if TYPE_CHECKING:
- from .base import AbstractEchoFactory, AbstractOutputFactory
+ from .base import AbstractEchoFactory, AbstractOutputFactory
[文档]
-
class Event(AttrsReprable):
+
class Event(AttrsReprable):
"""事件基类
:ivar float time: 时间戳
@@ -348,7 +348,7 @@
melobot.adapter.model 源代码
:ivar typing.Hashable | None scope: 所在的域,可空
"""
- def __init__(
+ def __init__(
self,
time: float = -1,
id: str = "",
@@ -371,7 +371,7 @@ melobot.adapter.model 源代码
[文档]
-
class Action(AttrsReprable):
+
class Action(AttrsReprable):
"""行为基类
:ivar float time: 时间戳
@@ -382,7 +382,7 @@
melobot.adapter.model 源代码
:ivar Event | None trigger: 触发该行为的事件,为空表明不由事件触发
"""
- def __init__(
+ def __init__(
self,
time: float = -1,
id: str = "",
@@ -402,7 +402,7 @@ melobot.adapter.model 源代码
[文档]
-
class Echo(AttrsReprable):
+
class Echo(AttrsReprable):
"""回应基类
:ivar float time: 时间戳
@@ -415,7 +415,7 @@
melobot.adapter.model 源代码
:ivar Any data: 回应数据
"""
- def __init__(
+ def __init__(
self,
time: float = -1,
id: str = "",
@@ -446,7 +446,7 @@ melobot.adapter.model 源代码
[文档]
-
class ActionHandle(Generic[ActionRetT]):
+
class ActionHandle(Generic[ActionRetT]):
"""行为操作句柄
:ivar Action action: 操作包含的行为对象
@@ -454,7 +454,7 @@
melobot.adapter.model 源代码
:ivar AbstractOutSource out_src: 执行操作的输出源对象
"""
- def __init__(
+ def __init__(
self,
action: Action,
out_src: AbstractOutSource,
@@ -473,18 +473,18 @@ melobot.adapter.model 源代码
if not ActionManualSignalCtx().try_get():
self.execute()
- async def _wait(self) -> ActionRetT:
+ async def _wait(self) -> ActionRetT:
await self._done.wait()
return self._echo
[文档]
-
def __await__(self) -> Generator[Any, Any, ActionRetT]:
+
def __await__(self) -> Generator[Any, Any, ActionRetT]:
"""本对象实现 __await__ 接口,因此可等待。返回本操作对应的回应数据"""
return self._wait().__await__()
- async def _execute(self) -> None:
+ async def _execute(self) -> None:
try:
output_packet = await self._output_factory.create(self.action)
echo_packet = await self.out_src.output(output_packet)
@@ -498,7 +498,7 @@ melobot.adapter.model 源代码
)
logger.generic_obj("异常点局部变量", locals(), level=LogLevel.ERROR)
- def execute(self) -> Self:
+ def execute(self) -> Self:
if self.status != "PENDING":
raise AdapterError("行为操作正在执行或执行完毕,不应该再执行")
@@ -509,14 +509,14 @@ melobot.adapter.model 源代码
@dataclass
-class _ChainStep:
+class _ChainStep:
coros: Sequence[Coroutine]
ret_when: Literal["FIRST_COMPLETED", "FIRST_EXCEPTION", "ALL_COMPLETED"]
next: _ChainStep | None = None
@dataclass(kw_only=True)
-class _ChainCtxStep(_ChainStep): # type: ignore[override]
+class _ChainCtxStep(_ChainStep): # type: ignore[override]
ctx_var: Context
ctx_val: Any
coros: Sequence[Coroutine] = field(default_factory=tuple)
@@ -525,20 +525,20 @@ melobot.adapter.model 源代码
[文档]
-
class ActionChain:
+
class ActionChain:
"""行为链"""
-
def __init__(self) -> None:
+
def __init__(self) -> None:
self._chain: list[_ChainStep] = []
-
def _add_step(self, step: _ChainStep) -> None:
+
def _add_step(self, step: _ChainStep) -> None:
if len(self._chain):
self._chain[-1].next = step
self._chain.append(step)
[文档]
-
def unfold(self, ctx: Context[T], val: T) -> Self:
+
def unfold(self, ctx: Context[T], val: T) -> Self:
"""指定链后续的步骤中在 `ctx` 类别的上下文中执行,上下文值为 `val`
:param ctx: 上下文类别
@@ -549,7 +549,7 @@
melobot.adapter.model 源代码
-
async def _exec_handle(self, handles: Awaitable[tuple[ActionHandle, ...]]) -> None:
+
async def _exec_handle(self, handles: Awaitable[tuple[ActionHandle, ...]]) -> None:
_handles = await handles
for handle in _handles:
handle.execute()
@@ -557,7 +557,7 @@
melobot.adapter.model 源代码
[文档]
-
def add(
+
def add(
self,
*handles: Awaitable[tuple[ActionHandle, ...]],
ret_when: Literal[
@@ -577,7 +577,7 @@
melobot.adapter.model 源代码
[文档]
-
def sleep(self, interval: float) -> Self:
+
def sleep(self, interval: float) -> Self:
"""
在链的步骤中添加指定时长的等待
@@ -589,7 +589,7 @@
melobot.adapter.model 源代码
-
async def _start(self, step: _ChainStep) -> None:
+
async def _start(self, step: _ChainStep) -> None:
if isinstance(step, _ChainCtxStep):
with step.ctx_var.unfold(step.ctx_val):
if step.next:
@@ -603,7 +603,7 @@
melobot.adapter.model 源代码
[文档]
-
async def run(self) -> None:
+
async def run(self) -> None:
"""顺序执行链的所有步骤"""
await self._start(self._chain[0])
@@ -613,7 +613,7 @@
melobot.adapter.model 源代码
[文档]
@contextmanager
-
def open_chain() -> Generator[ActionChain, None, None]:
+
def open_chain() -> Generator[ActionChain, None, None]:
"""创建行为链的上下文管理器
:yield: 行为链对象
diff --git a/_modules/melobot/bot.html b/_modules/melobot/bot.html
index 1d515fe6..b4722a12 100644
--- a/_modules/melobot/bot.html
+++ b/_modules/melobot/bot.html
@@ -14,7 +14,7 @@
melobot.bot - melobot 3.0.0
-
+
@@ -300,13 +300,13 @@
melobot.bot 源代码
-from ..ctx import BotCtx as _BotCtx
-from .base import CLI_RUNTIME, LAST_EXIT_SIGNAL, Bot, BotExitSignal, BotLifeSpan
+from ..ctx import BotCtx as _BotCtx
+from .base import CLI_RUNTIME, LAST_EXIT_SIGNAL, Bot, BotExitSignal, BotLifeSpan
[文档]
-
def get_bot() -> Bot:
+
def get_bot() -> Bot:
"""获得当前上下文中的 bot 对象
:return: bot 对象
diff --git a/_modules/melobot/bot/base.html b/_modules/melobot/bot/base.html
index 0b495695..d1c38d90 100644
--- a/_modules/melobot/bot/base.html
+++ b/_modules/melobot/bot/base.html
@@ -14,7 +14,7 @@
melobot.bot.base - melobot 3.0.0
-
+
@@ -300,20 +300,20 @@
melobot.bot.base 源代码
-from __future__ import annotations
-
-import asyncio
-import asyncio.tasks
-import os
-import platform
-import sys
-from contextlib import AsyncExitStack, ExitStack, asynccontextmanager, contextmanager
-from enum import Enum
-from os import PathLike
-from pathlib import Path
-from types import ModuleType
-
-from typing_extensions import (
+from __future__ import annotations
+
+import asyncio
+import asyncio.tasks
+import os
+import platform
+import sys
+from contextlib import AsyncExitStack, ExitStack, asynccontextmanager, contextmanager
+from enum import Enum
+from os import PathLike
+from pathlib import Path
+from types import ModuleType
+
+from typing_extensions import (
Any,
AsyncGenerator,
Callable,
@@ -324,24 +324,24 @@ melobot.bot.base 源代码
NoReturn,
)
-from .._hook import Hookable
-from .._meta import MetaInfo
-from ..adapter.base import Adapter
-from ..ctx import BotCtx, LoggerCtx
-from ..exceptions import BotError
-from ..io.base import AbstractInSource, AbstractIOSource, AbstractOutSource
-from ..log.base import GenericLogger, Logger, NullLogger
-from ..plugin.base import Plugin, PluginLifeSpan, PluginPlanner
-from ..plugin.ipc import AsyncShare, IPCManager, SyncShare
-from ..plugin.load import PluginLoader
-from ..protocols.base import ProtocolStack
-from ..typ import AsyncCallable, P
-from .dispatch import Dispatcher
+from .._hook import Hookable
+from .._meta import MetaInfo
+from ..adapter.base import Adapter
+from ..ctx import BotCtx, LoggerCtx
+from ..exceptions import BotError
+from ..io.base import AbstractInSource, AbstractIOSource, AbstractOutSource
+from ..log.base import GenericLogger, Logger, NullLogger
+from ..plugin.base import Plugin, PluginLifeSpan, PluginPlanner
+from ..plugin.ipc import AsyncShare, IPCManager, SyncShare
+from ..plugin.load import PluginLoader
+from ..protocols.base import ProtocolStack
+from ..typ import AsyncCallable, P
+from .dispatch import Dispatcher
[文档]
-
class BotLifeSpan(Enum):
+
class BotLifeSpan(Enum):
"""bot 生命周期阶段的枚举"""
LOADED = "l"
@@ -352,7 +352,7 @@
melobot.bot.base 源代码
-class BotExitSignal(Enum):
+class BotExitSignal(Enum):
NORMAL_STOP = 0
ERROR = 1
RESTART = 2
@@ -366,7 +366,7 @@ melobot.bot.base 源代码
_LOGGER_CTX = LoggerCtx()
-def _start_log(logger: GenericLogger) -> None:
+def _start_log(logger: GenericLogger) -> None:
for row in MetaInfo.logo.split("\n"):
logger.info(f"{row}")
logger.info("")
@@ -378,7 +378,7 @@ melobot.bot.base 源代码
[文档]
-
class Bot(Hookable[BotLifeSpan]):
+
class Bot(Hookable[BotLifeSpan]):
"""bot 类
:ivar str name: bot 对象的名称
@@ -387,7 +387,7 @@
melobot.bot.base 源代码
__instances__: dict[str, Bot] = {}
- def __new__(cls, name: str = "melobot", /, *args: Any, **kwargs: Any) -> Bot:
+ def __new__(cls, name: str = "melobot", /, *args: Any, **kwargs: Any) -> Bot:
if name in Bot.__instances__:
raise BotError(f"命名为 {name} 的 bot 实例已存在,请改名避免冲突")
obj = super().__new__(cls)
@@ -396,7 +396,7 @@ melobot.bot.base 源代码
[文档]
-
def __init__(
+
def __init__(
self,
name: str = "melobot",
/,
@@ -438,23 +438,23 @@
melobot.bot.base 源代码
self._rip_signal = asyncio.Event()
-
def __repr__(self) -> str:
+
def __repr__(self) -> str:
return f'Bot(name="{self.name}")'
@property
-
def loop(self) -> asyncio.AbstractEventLoop:
+
def loop(self) -> asyncio.AbstractEventLoop:
"""获得当前 bot 运行时的事件循环对象"""
return asyncio.get_running_loop()
@contextmanager
-
def _common_sync_ctx(self) -> Generator[ExitStack, None, None]:
+
def _common_sync_ctx(self) -> Generator[ExitStack, None, None]:
with ExitStack() as stack:
stack.enter_context(_BOT_CTX.unfold(self))
stack.enter_context(_LOGGER_CTX.unfold(self.logger))
yield stack
@asynccontextmanager
-
async def _common_async_ctx(self) -> AsyncGenerator[AsyncExitStack, None]:
+
async def _common_async_ctx(self) -> AsyncGenerator[AsyncExitStack, None]:
async with AsyncExitStack() as stack:
stack.enter_context(_BOT_CTX.unfold(self))
stack.enter_context(_LOGGER_CTX.unfold(self.logger))
@@ -462,7 +462,7 @@
melobot.bot.base 源代码
[文档]
-
def add_input(self, src: AbstractInSource) -> Bot:
+
def add_input(self, src: AbstractInSource) -> Bot:
"""绑定输入源
:param src: 输入源
@@ -477,7 +477,7 @@
melobot.bot.base 源代码
[文档]
-
def add_output(self, src: AbstractOutSource) -> Bot:
+
def add_output(self, src: AbstractOutSource) -> Bot:
"""绑定输出源
:param src: 输出源
@@ -492,7 +492,7 @@
melobot.bot.base 源代码
[文档]
-
def add_io(self, src: AbstractIOSource) -> Bot:
+
def add_io(self, src: AbstractIOSource) -> Bot:
"""绑定输入输出源
:param src: 输入输出源
@@ -505,7 +505,7 @@
melobot.bot.base 源代码
[文档]
-
def add_adapter(self, adapter: Adapter) -> Bot:
+
def add_adapter(self, adapter: Adapter) -> Bot:
"""绑定适配器
:param adapter: 适配器对象
@@ -524,7 +524,7 @@
melobot.bot.base 源代码
[文档]
-
def add_protocol(self, pstack: ProtocolStack) -> Bot:
+
def add_protocol(self, pstack: ProtocolStack) -> Bot:
"""绑定完整的协议栈,这包含了一组协同工作的输入源、输出源和适配器
:param pstack: 协议栈对象
@@ -539,7 +539,7 @@
melobot.bot.base 源代码
-
def _core_init(self) -> None:
+
def _core_init(self) -> None:
_start_log(self.logger)
for protocol, srcs in self._in_srcs.items():
@@ -577,7 +577,7 @@
melobot.bot.base 源代码
[文档]
-
def load_plugin(
+
def load_plugin(
self,
plugin: ModuleType | str | PathLike[str] | PluginPlanner,
load_depth: int = 1,
@@ -619,7 +619,7 @@
melobot.bot.base 源代码
[文档]
-
def load_plugins(
+
def load_plugins(
self,
plugins: Iterable[ModuleType | str | PathLike[str] | PluginPlanner],
load_depth: int = 1,
@@ -635,7 +635,7 @@
melobot.bot.base 源代码
[文档]
-
def load_plugins_dir(self, pdir: str | PathLike[str], load_depth: int = 1) -> None:
+
def load_plugins_dir(self, pdir: str | PathLike[str], load_depth: int = 1) -> None:
"""与 :func:`load_plugin` 行为类似,但是参数变为插件目录的父目录,本方法可以加载单个目录下的多个插件
:param pdir: 插件所在父目录的路径
@@ -654,7 +654,7 @@
melobot.bot.base 源代码
[文档]
-
def load_plugins_dirs(
+
def load_plugins_dirs(
self, pdirs: Iterable[str | PathLike[str]], load_depth: int = 1
) -> None:
"""与 :func:`load_plugins_dir` 行为类似,但是参数变为可迭代对象,每个元素为包含插件目录的父目录。
@@ -669,7 +669,7 @@
melobot.bot.base 源代码
[文档]
-
async def core_run(self) -> None:
+
async def core_run(self) -> None:
"""运行 bot 的方法,可以在异步事件循环中自由地使用
若使用此方法,则需要自行管理异步事件循环
@@ -719,7 +719,7 @@
melobot.bot.base 源代码
[文档]
-
def run(self, debug: bool = False) -> None:
+
def run(self, debug: bool = False) -> None:
"""安全地运行 bot 的阻塞方法,这适用于只运行单一 bot 的情况
:param debug: 是否启用 :py:mod:`asyncio` 的调试模式,但是这不会更改 :py:mod:`asyncio` 日志器的日志等级
@@ -730,14 +730,14 @@
melobot.bot.base 源代码
[文档]
@classmethod
-
def start(cls, *bots: Bot, debug: bool = False) -> None:
+
def start(cls, *bots: Bot, debug: bool = False) -> None:
"""安全地同时运行多个 bot 的阻塞方法
:param bots: 要运行的 bot 对象
:param debug: 参见 :func:`run` 同名参数
"""
-
async def bots_run() -> None:
+
async def bots_run() -> None:
tasks = []
for bot in bots:
tasks.append(asyncio.create_task(bot.core_run()))
@@ -751,7 +751,7 @@
melobot.bot.base 源代码
[文档]
-
async def close(self) -> None:
+
async def close(self) -> None:
"""停止并关闭当前 bot"""
if not self._running:
raise BotError(f"{self} 未在运行中,不能停止运行")
@@ -762,7 +762,7 @@
melobot.bot.base 源代码
[文档]
-
async def restart(self) -> NoReturn:
+
async def restart(self) -> NoReturn:
"""重启当前 bot,需要通过模块运行模式启动 bot 主脚本:
.. code:: shell
@@ -780,7 +780,7 @@
melobot.bot.base 源代码
[文档]
-
def get_adapter(
+
def get_adapter(
self,
type: LiteralString | type[Adapter] | None = None,
filter: Callable[[Adapter], bool] | None = None,
@@ -810,7 +810,7 @@
melobot.bot.base 源代码
[文档]
-
def get_adapters(
+
def get_adapters(
self, filter: Callable[[Adapter], bool] | None = None
) -> set[Adapter]:
"""获取一组适配器
@@ -825,7 +825,7 @@
melobot.bot.base 源代码
[文档]
-
def get_plugins(self) -> list[str]:
+
def get_plugins(self) -> list[str]:
"""获取所有绑定的插件的名称
:return: 所绑定的插件的名称列表
@@ -835,7 +835,7 @@
melobot.bot.base 源代码
[文档]
-
def get_share(self, plugin: str, share: str) -> SyncShare | AsyncShare:
+
def get_share(self, plugin: str, share: str) -> SyncShare | AsyncShare:
"""获取绑定的插件中的共享对象
:param plugin: 插件名称
@@ -846,33 +846,33 @@
melobot.bot.base 源代码
@property
- def on_loaded(self) -> Callable[[AsyncCallable[P, None]], AsyncCallable[P, None]]:
+ def on_loaded(self) -> Callable[[AsyncCallable[P, None]], AsyncCallable[P, None]]:
"""给 bot 注册 :obj:`.BotLifeSpan.LOADED` 阶段 hook 的装饰器"""
return self.on(BotLifeSpan.LOADED)
@property
- def on_reloaded(self) -> Callable[[AsyncCallable[P, None]], AsyncCallable[P, None]]:
+ def on_reloaded(self) -> Callable[[AsyncCallable[P, None]], AsyncCallable[P, None]]:
"""给 bot 注册 :obj:`.BotLifeSpan.RELOADED` 阶段 hook 的装饰器"""
return self.on(BotLifeSpan.RELOADED)
@property
- def on_started(self) -> Callable[[AsyncCallable[P, None]], AsyncCallable[P, None]]:
+ def on_started(self) -> Callable[[AsyncCallable[P, None]], AsyncCallable[P, None]]:
"""给 bot 注册 :obj:`.BotLifeSpan.STARTED` 阶段 hook 的装饰器"""
return self.on(BotLifeSpan.STARTED)
@property
- def on_close(self) -> Callable[[AsyncCallable[P, None]], AsyncCallable[P, None]]:
+ def on_close(self) -> Callable[[AsyncCallable[P, None]], AsyncCallable[P, None]]:
"""给 bot 注册 :obj:`.BotLifeSpan.CLOSE` 阶段 hook 的装饰器"""
return self.on(BotLifeSpan.CLOSE)
@property
- def on_stopped(self) -> Callable[[AsyncCallable[P, None]], AsyncCallable[P, None]]:
+ def on_stopped(self) -> Callable[[AsyncCallable[P, None]], AsyncCallable[P, None]]:
"""给 bot 注册 :obj:`.BotLifeSpan.STOPPED` 阶段 hook 的装饰器"""
return self.on(BotLifeSpan.STOPPED)
-
def _safe_run(main: Coroutine[Any, Any, None], debug: bool) -> None:
+
def _safe_run(main: Coroutine[Any, Any, None], debug: bool) -> None:
try:
loop = asyncio.get_event_loop()
asyncio.get_event_loop_policy().set_event_loop(loop)
@@ -900,7 +900,7 @@
melobot.bot.base 源代码
loop.close()
-async def alive_signal_guard(main_coro: Coroutine[Any, Any, None]) -> None:
+async def alive_signal_guard(main_coro: Coroutine[Any, Any, None]) -> None:
asyncio.create_task(main_coro)
while True:
@@ -911,7 +911,7 @@ melobot.bot.base 源代码
await asyncio.sleep(0.45)
-def _cancel_all_tasks(loop: asyncio.AbstractEventLoop) -> None:
+def _cancel_all_tasks(loop: asyncio.AbstractEventLoop) -> None:
to_cancel = asyncio.tasks.all_tasks(loop)
if not to_cancel:
return
diff --git a/_modules/melobot/ctx.html b/_modules/melobot/ctx.html
index fccebe19..70d23006 100644
--- a/_modules/melobot/ctx.html
+++ b/_modules/melobot/ctx.html
@@ -14,7 +14,7 @@
melobot.ctx - melobot 3.0.0
-
+
@@ -300,30 +300,30 @@
melobot.ctx 源代码
-from contextlib import contextmanager
-from contextvars import ContextVar, Token
-from dataclasses import dataclass, field
-from enum import Enum
+from contextlib import contextmanager
+from contextvars import ContextVar, Token
+from dataclasses import dataclass, field
+from enum import Enum
-from typing_extensions import TYPE_CHECKING, Any, Callable, Generator, Generic, Union
+from typing_extensions import TYPE_CHECKING, Any, Callable, Generator, Generic, Union
-from .exceptions import AdapterError, BotError, FlowError, LogError, SessionError
-from .typ import SingletonMeta, T
+from .exceptions import AdapterError, BotError, FlowError, LogError, SessionError
+from .typ import SingletonMeta, T
if TYPE_CHECKING:
- from .adapter import model
- from .adapter.base import Adapter
- from .bot.base import Bot
- from .handle.process import Flow, FlowNode
- from .io.base import AbstractInSource, OutSourceT
- from .log.base import GenericLogger
- from .session.base import Session, SessionStore
- from .session.option import Rule
+ from .adapter import model
+ from .adapter.base import Adapter
+ from .bot.base import Bot
+ from .handle.process import Flow, FlowNode
+ from .io.base import AbstractInSource, OutSourceT
+ from .log.base import GenericLogger
+ from .session.base import Session, SessionStore
+ from .session.option import Rule
[文档]
-
class Context(Generic[T], metaclass=SingletonMeta):
+
class Context(Generic[T], metaclass=SingletonMeta):
"""上下文对象,本质是对 :class:`contextvars.ContextVar` 操作的封装
继承该基类,可以实现自己的上下文对象。
@@ -332,7 +332,7 @@
melobot.ctx 源代码
[文档]
-
def __init__(
+
def __init__(
self,
ctx_name: str,
lookup_exc_cls: type[BaseException],
@@ -356,7 +356,7 @@
melobot.ctx 源代码
[文档]
-
def get(self) -> T:
+
def get(self) -> T:
"""在当前上下文中,获取本上下文对象的上下文值
:return: 上下文对象的上下文值
@@ -364,12 +364,12 @@
melobot.ctx 源代码
try:
return self.__storage__.get()
except LookupError:
- raise self.lookup_exc_cls(self.lookup_exc_tip) from None
+
raise self.lookup_exc_cls(self.lookup_exc_tip) from None
[文档]
-
def try_get(self) -> T | None:
+
def try_get(self) -> T | None:
"""与 :func:`get` 类似,但不存在上下文对象时返回 `None`
:return: 上下文对象的上下文值
@@ -379,7 +379,7 @@
melobot.ctx 源代码
[文档]
-
def add(self, ctx: T) -> Token[T]:
+
def add(self, ctx: T) -> Token[T]:
"""在当前上下文中,添加一个上下文值
:param ctx: 上下文值
@@ -390,7 +390,7 @@
melobot.ctx 源代码
[文档]
-
def remove(self, token: Token[T]) -> None:
+
def remove(self, token: Token[T]) -> None:
"""移除当前上下文中的上下文值
:param token: 添加时返回的 :class:`contextvars.Token` 对象
@@ -401,7 +401,7 @@
melobot.ctx 源代码
[文档]
@contextmanager
-
def unfold(self, obj: T) -> Generator[T, None, None]:
+
def unfold(self, obj: T) -> Generator[T, None, None]:
"""展开一个上下文值为 `obj` 的上下文环境,返回上下文管理器
上下文管理器可 `yield` 上下文值,退出上下文管理器作用域后自动清理
@@ -420,34 +420,34 @@
melobot.ctx 源代码
_OutSrcFilterType = Callable[["OutSourceT"], bool]
-class OutSrcFilterCtx(Context[_OutSrcFilterType]):
- def __init__(self) -> None:
+class OutSrcFilterCtx(Context[_OutSrcFilterType]):
+ def __init__(self) -> None:
super().__init__("MELOBOT_OUT_SRC_FILTER", AdapterError)
@dataclass
-class EventBuildInfo:
+class EventBuildInfo:
adapter: "Adapter"
in_src: "AbstractInSource"
-class EventBuildInfoCtx(Context[EventBuildInfo]):
- def __init__(self) -> None:
+class EventBuildInfoCtx(Context[EventBuildInfo]):
+ def __init__(self) -> None:
super().__init__(
"MELOBOT_EVENT_BUILD_INFO",
AdapterError,
"此时不在活动的事件处理流中,无法获取适配器与输入源的上下文信息",
)
- def get_adapter_type(self) -> type["Adapter"]:
- from .adapter.base import Adapter
+ def get_adapter_type(self) -> type["Adapter"]:
+ from .adapter.base import Adapter
return Adapter
[文档]
-
class FlowRecordStage(Enum):
+
class FlowRecordStage(Enum):
"""流记录阶段的枚举"""
FLOW_START = "fs"
@@ -468,7 +468,7 @@
melobot.ctx 源代码
[文档]
@dataclass
-
class FlowRecord:
+
class FlowRecord:
"""流记录"""
stage: FlowRecordStage
@@ -479,20 +479,20 @@
melobot.ctx 源代码
-class FlowRecords(list[FlowRecord]):
- def append(self, snapshot: FlowRecord) -> None:
+class FlowRecords(list[FlowRecord]):
+ def append(self, snapshot: FlowRecord) -> None:
super().append(snapshot)