melobot.base¶
abc 模块¶
本模块包含 melobot 重要的抽象类或基类。
- class melobot.base.abc.AbstractConnector[源代码]¶
抽象连接器类
提示
一般无需手动实例化该类,多数情况会直接使用本类对象,或将本类用作类型注解。
- cd_time¶
连接器发送行为操作的冷却时间
- allow_reconn¶
是否允许重新连接
- class melobot.base.abc.BotAction[源代码]¶
行为类
每个行为操作应该产生一个行为对象
提示
一般无需手动实例化该类,多数情况会直接使用本类对象,或将本类用作类型注解。
- class melobot.base.abc.WrappedChecker[源代码]¶
合并检查器
在两个
BotChecker
对象间使用 | & ^ ~ 运算符即可返回合并检查器。提示
一般无需手动实例化该类,多数情况会直接使用本类对象,或将本类用作类型注解。
- class melobot.base.abc.WrappedMatcher[源代码]¶
合并匹配器
在两个
BotMatcher
对象间使用 | & ^ ~ 运算符即可返回合并匹配器提示
一般无需手动实例化该类,多数情况会直接使用本类对象,或将本类用作类型注解。
exceptions 模块¶
本模块包含 melobot 的异常类,此处仅展示对外部有利用价值的异常类。
tools 模块¶
本模块包含了 melobot 内部使用的工具类和工具函数,它们也可被外部使用。
- class melobot.base.tools.RWController[源代码]¶
异步读写控制器
提供异步安全的读写上下文。在读取时可以多读,同时读写互斥。
使用方法:
rwc = RWController() # 读时使用此控制器的安全读上下文: async with rwc.safe_read(): ... # 写时使用此控制器的安全写上下文: async with rwc.safe_write(): ...
- melobot.base.tools.this_dir(*relative_path: str) str [源代码]¶
包内 py 脚本通过该方法可获得所在目录的绝对路径。提供参数,还可拼接路径。
使用方法:
this_dir() # 获取 ./ 的绝对路径 this_dir('abc', 'env.toml') # 获取 ./abc/env.toml 的绝对路径
一些注意事项如下:
使用 this_dir(),只能这样导入:(导入语句后可以使用 as 子句)
from melobot import this_dir # 或 from melobot.base.tools import this_dir
若 B.py 从 A.py 导入包含
this_dir()
调用的结构, 导入前this_dir()
必须已运行,而不能延迟求值A.py 中:
class Foo: DIR = this_dir() LAMBDA_DIR = lambda: this_dir() GET_DIR = lambda: this_dir() OUTER_DIR = Foo.LAMBDA_DIR() # Ok
B.py 中:
from .A import Foo, OUTER_DIR OUTER_DIR # Ok Foo.DIR # Ok Foo.GET_DIR() # Error
- 参数:
relative_path – 可用于拼接的路径部分
- 返回:
拼接后的绝对路径
- melobot.base.tools.to_async(func: Callable[[], T]) Callable[[], Coroutine[Any, Any, T]] [源代码]¶
异步包装函数
将一个同步函数包装为异步函数,保留返回值。如果需要传参使用 partial 包裹。
- 参数:
func – 需要转换的函数
- 返回:
异步函数
- melobot.base.tools.to_coro(obj: Callable[[], T] | Future[T]) Coroutine[Any, Any, T] [源代码]¶
协程包装函数
将一个同步函数或 Future 对象包装为协程,保留返回值。如果需要传参使用 partial 包裹。
- 参数:
obj – 需要包装的同步函数或 Future 对象
- 返回:
协程
- melobot.base.tools.lock(callback: Callable[[], Awaitable[T1]] | None = None)[源代码]¶
锁装饰器
本方法作为异步函数的装饰器使用,可以为被装饰函数加锁。
在获取锁冲突时,调用 callback 获得一个回调并执行。回调执行完毕后直接返回。
callback 参数为空,只应用
asyncio.Lock
的锁功能。被装饰函数的返回值:被装饰函数被执行 -> 被装饰函数返回值;执行任何回调 -> 那个回调的返回值
- 参数:
callback – 获取锁冲突时的回调
- melobot.base.tools.cooldown(busy_callback: Callable[[], Awaitable[T1]] | None = None, cd_callback: Callable[[float], Awaitable[T2]] | None = None, interval: float = 5)[源代码]¶
冷却装饰器
本方法作为异步函数的装饰器使用,可以为被装饰函数添加 cd 时间。
如果被装饰函数已有一个在运行,此时调用 busy_callback 生成回调并执行。回调执行完毕后直接返回。
busy_callback 参数为空,则等待已运行的运行完成。随后执行下面的“冷却”处理逻辑。
当被装饰函数没有在运行的,但冷却时间未结束:
cd_callback 不为空:使用 cd_callback 生成回调并执行。
cd_callback 为空,被装饰函数持续等待,直至冷却结束再执行。
被装饰函数的返回值:被装饰函数被执行 -> 被装饰函数返回值;执行任何回调 -> 那个回调的返回值
- 参数:
busy_callback – 已运行时的回调
cd_callback – 冷却时间未结束的回调
interval – 冷却时间
- melobot.base.tools.semaphore(callback: Callable[[], Awaitable[T1]] | None = None, value: int = -1)[源代码]¶
信号量装饰器
本方法作为异步函数的装饰器使用,可以为被装饰函数添加信号量控制。
在信号量无法立刻获取时,将调用 callback 获得回调并执行。回调执行完毕后直接返回。
callback 参数为空,只应用
asyncio.Semaphore
的信号量功能。被装饰函数的返回值:被装饰函数被执行 -> 被装饰函数返回值;执行任何回调 -> 那个回调的返回值
- 参数:
callback – 信号量无法立即获取的回调
value – 信号量阈值
- melobot.base.tools.timelimit(callback: Callable[[], Awaitable[T1]] | None = None, timeout: float = 5)[源代码]¶
时间限制装饰器
本方法作为异步函数的装饰器使用,可以为被装饰函数添加超时控制。
超时之后,调用 callback 获得回调并执行,同时取消原任务。
callback 参数为空,如果超时,则抛出
asyncio.TimeoutError
异常。被装饰函数的返回值:被装饰函数被执行 -> 被装饰函数返回值;执行任何回调 -> 那个回调的返回值
- 参数:
callback – 超时时的回调
timeout – 超时时间
- melobot.base.tools.speedlimit(callback: Callable[[], Awaitable[T1]] | None = None, limit: int = 60, duration: int = 60)[源代码]¶
流量/速率限制装饰器
本方法作为异步函数的装饰器使用,可以为被装饰函数添加流量控制:duration 秒内只允许 limit 次调用。
超出调用速率限制后,调用 callback 获得回调并执行,同时取消原任务。
callback 参数为空,等待直至满足速率控制要求再调用。
被装饰函数的返回值:被装饰函数被执行 -> 被装饰函数返回值;执行任何回调 -> 那个回调的返回值。
- 参数:
callback – 超出速率限制时的回调
limit – duration 秒内允许调用多少次
duration – 时长区间
- melobot.base.tools.call_later(callback: Callable[[], None], delay: float)[源代码]¶
同步函数延迟调度
在指定的 delay 后调度一个 callback 执行。callback 应该是同步方法。
- 参数:
callback – 同步函数
delay – 多长时间后调度
- 返回:
- melobot.base.tools.call_at(callback: Callable[[], None], timestamp: float)[源代码]¶
同步函数指定时间调度
在指定的时间戳调度一个 callback 执行。callback 应该是同步方法。timestamp <= 当前时刻回调立即执行
- 参数:
callback – 同步函数
timestamp – 在什么时刻调度
- 返回:
- melobot.base.tools.async_later(callback: Coroutine[Any, Any, Any], delay: float) Future[T] [源代码]¶
异步函数延迟调度(可自主选择是否等待)
在指定的 delay 后调度一个 callback 执行。callback 是协程。
返回一个
asyncio.Future
对象,你可以选择等待或不等待。等待asyncio.Future
即是等待 callback 的返回值。注意:如果 callback 未完成就被取消,需要捕获
asyncio.CancelledError
。- 参数:
callback – 异步函数(可有返回值)
delay – 多长时间后调度
- 返回:
- melobot.base.tools.async_at(callback: Coroutine[Any, Any, Any], timestamp: float) Future[T] [源代码]¶
异步函数指定时间调度(可自主选择是否等待)
在指定的时间戳调度一个 callback 执行。callback 是协程。
返回一个
asyncio.Future
对象,你可以选择等待或不等待。等待asyncio.Future
即是等待 callback 的返回值。注意:如果 callback 未完成就被取消,需要捕获
asyncio.CancelledError
。- 参数:
callback – 异步函数(可有返回值)
timestamp – 在什么时刻调度
- 返回:
- melobot.base.tools.async_interval(callback: Callable[[], Coroutine[Any, Any, None]], interval: float) Task[None] [源代码]¶
异步函数间隔调度(类似 JavaScript 的 setInterval)
每过时间间隔执行 callback 一次。callback 是返回协程的可调用对象(异步函数或 lambda 函数等)。
返回一个
asyncio.Task
对象,可使用该 task 取消调度过程。- 参数:
callback – 异步函数
interval – 调度的间隔
- 返回:
asyncio.Task
对象
typing 模块¶
本模块包含了 melobot 自定义的、用于类型注解的类型。可供外部参考。
- class melobot.base.typing.StdCustomNodeData[源代码]¶
onebot 标准的自定义消息结点数据
- content: list[MsgSegment]¶
- class melobot.base.typing.GocqCustomNodeData[源代码]¶
gocq 风格的自定义消息结点数据
- content: list[MsgSegment]¶
- seq: NotRequired[list[MsgSegment]]¶
- class melobot.base.typing.ParseArgs[源代码]¶
解析参数类
- class melobot.base.typing.User[源代码]¶
用户权限等级枚举
- OWNER = 10000¶
- SU = 1000¶
- WHITE = 100¶
- USER = 10¶
- BLACK = -1¶
- class melobot.base.typing.PriorLevel[源代码]¶
事件处理优先级枚举
为方便进行优先级设置,有 MIN, MAX, MEAN 三个枚举值
- MIN = 0¶
- MAX = 1000¶
- MEAN = 500¶
- class melobot.base.typing.BotLife[源代码]¶
bot 实例的生命周期枚举
- LOADED = 1¶
- FIRST_CONNECTED = 2¶
- RECONNECTED = 3¶
- BEFORE_CLOSE = 4¶
- BEFORE_STOP = 5¶
- EVENT_BUILT = 6¶
- ACTION_PRESEND = 7¶
- melobot.base.typing.T¶
泛型 T,无约束
- melobot.base.typing.T1¶
泛型 T1,无约束
- melobot.base.typing.T2¶
泛型 T2,无约束
- melobot.base.typing.T3¶
泛型 T3,无约束
- melobot.base.typing.AsyncCallable¶
用法:AsyncCallable[P, T]
是该类型的别名:Callable[P, Awaitable[T]]
- melobot.base.typing.VoidType¶
“无值”对象的类型标注,定义如下:
VoidType: TypeAlias = Type[Void]