基础知识
# 基础知识
在阅读其他章节之前需要了解以下关于 Hyperai 的知识。
本章提到的名词均与代码对应。
# 消息结构
# 消息组件(MessageComponent)
消息组件是对各种可能的消息存在的一个抽象,所有的消息组件都具有以下特点
- 具有
TypeName
属性描述 - 能够被输出成文本表示
部分消息组件具有被(反)序列化的能力,但这不是一般特性,不能保证所有消息组件都能被正确序列化且序列化之后还能反序列化。 具体情况具体对待。
Hyperai 项目通识中具有以下消息组件具体实现
- At(@某人)
- AtAll(@全体成员)
- Quote(回复中的引用)
- Image(图片)
- Plain(纯文本)
- Flash(闪照)
- Face(默认表情)
- Poke(特殊动作,戳一戳)
- XmlContent(Xml消息)
- JsonContent(Json消息)
- AppContent(应用产生的消息)
(名称为 Hyperai 所规定,但不能保证与第三方项目相通用)
# 消息链(MessageChain)
一个消息组件仅能代表一个消息元素,通常一条消息中常含有多种元素混合,例如文字与图片的混合。因此有了消息链来表示混合有多种消息元素的一条消息。
消息链本质是一个消息组件的有序集合,在大多数情况下,消息链是只读的。
提示
例外:Image
在被发送的时会检查其图片是否已被上传,而这一步必须修改 Image
本身的属性,导致 Image
破坏了只读特性。
# 事件和事件参数(GenericEventArgs)
每当 SMS 软件中产生变化时,Hyperai 都会把他看成一个事件,同时封装出对应的事件参数。事件本身没有特别的对象与之对应,而用事件参数取而代之:事件参数总能代表一个特定事件。
目前 Hyperai 中存在以下事件(和对应的事件参数)
- GroupMessageEventArgs
- FriendMessageEventArgs
注意
存在不代表支持。具体情况请咨询服务提供方,后者通常指适配器。
# 关系模型(RelationModel)
不能保证关系模型中所有属性都可用且具有值,其情况视使用的适配器而定。
关系模型是对实际中用到的关系建立的模型。不管是那种类型都有 Identity
属性来表示该模型事实所指对象。而 Identifier
属性则用来区分模型与模型,例如不同 Gruop
中的 Member
对象可能具有相同 Identity
,但绝不会有相同 Identifier
。
# 好友(Friend)
好友表示一个好友,提供有关于这个好友的一些属性。
# 群(Group)
群表示一个群,提供有关于这个群的一些属性和成员列表。
# 成员(Member)
成员表示一个成员,提供有关于这个成员的一些属性和其所属的群。
# 自己(Self)
自己表示一个自己,提供有关于这个自己的一些属性和其好友和所加入的群。通常代表绑定的机器人账号。
# 适配器(IApiClient)
为兼容 mirai
和 coolq
,Hyperai 依赖于适配器。
适配器负责与目标通信,交换信息,产生事件,即小而全。这同时也意味着适配器可以单独使用。有关于适配器单独使用的方法请参阅本文档的其他部分。
提示
不用找了,根本没写。章节名前面突然从1
跳到5
就说明中间少了很多内容。想要了解缺失内容的直接去 Github 找作者。
通常情况下用户不会参与到适配器开发。当已有适配器无法满足需求,例如想要适配其他客户端时,需要自行开发适配器,具体请参阅本文档的其他部分。
提示
不用找了,根本没写。章节名前面突然从1
跳到5
就说明中间少了很多内容。想要了解缺失内容的直接去 Github 找作者。
# 管线与中间件(IMiddleware)
Hyperai Application 使用管线来处理事件,用适配器作为管线头部来产生事件,而管线由中间件构成。
除了构建 Hyperai Application,用户通常不需要参与中间件配置。而使用 HyperaiShell 就不属于“构建 Hyperai Application”,前者是本文的主题。
# 特殊中间码(HyperCode)
为了用文本表示消息链,Hyperai 使用了中间码。
一个消息组件可以表示为一个用中括号包裹的代码,该代码具有以下格式“[hyper.XXX(YYYY)]”。纯文本(Plain)的中间码不用该格式,其表示就是其本身。多个消息组件拼接成的消息链同样使用中间码,形式类似于下
Hello, [hyper.atall()].
上述内容代表一个内容为"Hello, "的纯文本和一个“@全体成员”拼接。
注意
当特殊码的格式类似但严格上不符合时它将会被转义成纯文本。如果要将严格表示为特殊码的字符串取消转义,请使用'\'符号加在中括号('[',']')前面。例如"\[hyper.at()\]"会被转义成纯文本"[hyper.at()]"。