从端

从端更像是对即时通讯 API 的封装,它将来自通讯平台的消息封装到对应的对象中并将其传递给主端。

尽管我们建议从属通道应该和即使通讯平台适配,但你可以尝试适配任何适宜的系统模型:该系统可以将数据以消息方式发送,同时可以有一个有限的用于收发消息的终端列表。

在大多数情况下,从端应该被看作为一个来自即时通讯平台的普通用户,而不是一个机器人。你只应在如下情况下为从端使用机器人:

  • 该平台不对用户和机器人做特别区分,或者

  • 该平台上的机器人可以实现与用户同等或更多的功能,并且机器人相对比一般用户账户更容易创建

附加功能

通过 附加功能,从端能够提供 EFB 没有要求的更多功能,例如创建组群组,搜索好友等。

用户可以通过和 CLI 类似的方式来访问这些功能。「附加功能」方法除 self 之外只能(MUST)接受一个字符串参数,并使用 extra() 装饰器将其封装。该装饰器接受两个参数:name 表示功能的名称,以及 desc 表示功能的描述及其用法。

desc 应该(SHOULD)描述功能的用途以及用法。它更像是 CLI 程序的帮助文本。由于调用这些功能的方法依赖于主端的实现方式,因此 desc 中应(SHOULD)使用 "{function_name}" 代替用法中的名称,根据实现方式的不同,主端会使用适合名称来替代它。

方法在结束时必须(MUST)返回一个字符串或 None。字符串会被作为运行结果显示给用户,None 代表后续将会有进一步的交互。根据这个特性的具体功能,输出可能只是一个简单的成功消息,或者是一个很长的结果。

该函数不可(MUST NOT)抛出任何异常。任何发生的异常都应该被 expect 并处理。

出于兼容性考虑,该类功能的方法名称具有比一般 Python 3 标识符名称更严格的限制。附加功能函数的调用名称须(MUST):

  • 区分大小写

  • 只包含大小写字母,数字,和下划线。

  • 不以数字开头。

  • 长度为 1 到 20字符(含)

  • 越短越精确越好,但是要容易被理解

用正则表达式表示则为:

^[A-Za-z][A-Za-z0-9_]{0,19}$

示例如下:

@extra(name="Echo",
       desc="返回与输入内容相同的字符串。\n"
            "用法:\n"
            "    {function_name} 文本")
def echo(self, arguments: str = "") -> str:
    return arguments

消息命令

消息命令通常由从端发送,以允许用户对于要求特殊操作的消息做出回应。

消息命令的使用场景示例:

  • 添加推荐联系人为好友。

  • 接受或拒绝好友请求。

  • 向投票消息进行投票.

一条消息可以附加到在 list 之中附加一系列命令,其中的每个命令有:

  • 面向用户的名称,

  • 方法名称,

  • 位置指定参数(*args) 的 list 列表,以及

  • 关键字参数(**kwargs)的 dict 字典

当用户单击按钮时,将会调用相应的信道方法并传递指定的参数。

注意:作为对用户操作的响应,所有这样的方法必须(MUST)返回一个 str,且不可(MUST NOT)抛出任何异常。任何发生的异常都必须(MUST)被 expect 并被处理。

消息传递

从端应该(SHOULD)发送 IM 提供的所有消息,包括用户在没有通过改从端发送的消息。但用户通过主端发出的消息不应(SHOULD NOT)再传回主端。

实现细节

参见 SlaveChannel