跳转至

Channel - 模块频道🔗

Saya 中, 每个被导入的模块都会被分配一个独一无二的 Channel 实例, 除了在 Quick Start 一章中粗略介绍的 Channel.use 方法外, 我们还提供了其他的属性与特性.

Channel.meta🔗

Channel.meta 的类型 ChannelMeta 被声明为一个 TypedDict, 这意味着你能通过继承 ChannelMeta 来扩展可以在 Channel.meta 上使用的字段.

class ExtendedMeta(ChannelMeta):
    example: str

channel = Channel[ExtendedMeta].current() # type: Channel[ExtendedMeta]

channel.example = "example"

Channel.{name, author, description}🔗

这三者皆为方法, 与 Channel.meta["name"], Channel.meta["author"], Channel.meta["description"] 一一对应,

需要注意的: author 方法的具体行为为附加, 你可以以此来描述多个作者.

channel.name("plugin_example")

channel.author({ "name": "GreyElaina", "email": ... })
channel.author({ "name": "BlueGlassBlock", "email": ... })
channel.author({ "name": "???", "email": "witch_stellaium@witch.org" })

channel.description("Example Plugin for Saya")

ScopedContext🔗

Warn

该特性尚处于 experiment(实验性) & work-in-process(半成品) 阶段, 请 不要 在实际开发中使用.

ScopedContext 旨在改善模块内运行时数据的共享与存储.

@channel.scoped_context
class Scoped1:
    a: str = "1"

    @channel.use(ListenerSchema(...))
    async def n1(self):
        self.a = "2"

    ...

被接管的数据在 reload 前后都不会失效, 其生命周期与 Channel 一致, 但极可能引发未定义行为.

我们可能会在之后将这个特性删除并重新迭代设计.