From 28766f43e44121cc074c5ecd8abac59929a0cfa5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Kyoku=E2=AD=90?= <144906395+KyokuKong@users.noreply.github.com> Date: Sun, 29 Sep 2024 02:39:11 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E5=96=84Satori=E6=A8=A1=E5=9E=8B?= =?UTF-8?q?=E8=AE=BE=E8=AE=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- adapters/lagrange/event_publisher.go | 6 ++ ice/event.go | 24 +++++-- models/satori/README.md | 100 ++++++++++++++++++++++++++- models/satori/satori_api.go | 1 + models/satori/satori_event.go | 6 ++ 5 files changed, 130 insertions(+), 7 deletions(-) create mode 100644 models/satori/satori_api.go create mode 100644 models/satori/satori_event.go diff --git a/adapters/lagrange/event_publisher.go b/adapters/lagrange/event_publisher.go index 678fa04..cc43321 100644 --- a/adapters/lagrange/event_publisher.go +++ b/adapters/lagrange/event_publisher.go @@ -144,5 +144,11 @@ func BindEvents() { }, }, }) + // 将LagrangeGo的消息存入消息缓存 + err := Cache.Set(strconv.Itoa(int(event.InternalId)), event) + if err != nil { + return + } }) + } diff --git a/ice/event.go b/ice/event.go index e256065..e8450b4 100644 --- a/ice/event.go +++ b/ice/event.go @@ -36,6 +36,8 @@ import "github.com/Iceinu-Project/Iceinu/adapters" // 12:节点失活事件(子节点到主节点) // // 13:节点重新激活事件(子节点到主节点) +// +// 14:数据回调事件,用于节点间的数据传输 type IceinuEvent struct { Type uint8 `json:"type"` From string `json:"from"` // 消息事件来源节点ID @@ -79,16 +81,18 @@ type NodeUserPushEvent struct { // NodeRequestDataEvent 6:节点请求数据事件(子节点到主节点)结构体 type NodeRequestDataEvent struct { - DataType string `json:"data_type"` // 请求的数据类型 - Key string `json:"key"` // 请求的数据键 - Query string `json:"query"` // 请求的查询内容 + RequestSerial int32 `json:"request_serial"` // 请求序列号,用于标识请求防止接受错误 + DataType string `json:"data_type"` // 请求的数据类型 + Key string `json:"key"` // 请求的数据键 + Query string `json:"query"` // 请求的查询内容 } // RequestNodeDataEvent 7:节点请求数据事件(主节点到子节点)结构体 type RequestNodeDataEvent struct { - DataType string `json:"data_type"` // 请求的数据类型 - Key string `json:"key"` // 请求的数据键 - Query string `json:"query"` // 请求的查询内容 + RequestSerial int32 `json:"request_serial"` // 请求序列号,用于标识请求防止接受错误 + DataType string `json:"data_type"` // 请求的数据类型 + Key string `json:"key"` // 请求的数据键 + Query string `json:"query"` // 请求的查询内容 } // AdapterConnectEvent 8:适配器连接事件结构体 @@ -113,3 +117,11 @@ type NodeDeactiveEvent struct { type NodeReactiveEvent struct { OK bool `json:"ok"` } + +// DataCallbackEvent 14:数据回调事件,用于节点间的数据传输结构体 +type DataCallbackEvent struct { + OK bool `json:"ok"` // 回调是否成功 + DataType string `json:"data_type"` // 数据类型 + Data interface{} `json:"data"` // 回调的数据 + RequestSerial int32 `json:"request_serial"` // 请求序列号,用于标识请求防止接受错误 +} diff --git a/models/satori/README.md b/models/satori/README.md index 1d725c5..a96372d 100644 --- a/models/satori/README.md +++ b/models/satori/README.md @@ -1,9 +1,107 @@ # Satori Model +参考:https://satori.js.org/zh-CN/introduction.html + Iceinu默认的消息事件接收/发送模型,基于跨平台的Satori标准,可以用于实现适配不同平台的消息适配器。 虽然说是基于Satori,但是对标准的一些细节进行了修改,主要是Guild之类的元素名称太神秘了(所以我至今也不理解为什么群组要叫做协会),除此之外扩展了一下Satori的一些元素,方便使用。 在使用Satori Model的情况下,可以直接构建Satori XHTML风格的消息进行发送,Iceinu会自动将其解析成Satori元素切片并传递到事件系统中。 -## 事件类型 \ No newline at end of file +## 事件类型 + +Satori协议本身没有直接定义太多跨平台的事件实现,出于方便在不同适配器之间共通事件的考虑,氷犬定义了一些通用的基础事件类型,不过在这些事件类型之外,适配器仍然可以自行定义平台独有的事件类型。 + +### 消息事件 +- `PrivateMessageEvent` 私聊消息事件,特指用户直接向机器人发送的消息,在不同平台上的表现可能略有区别,比如部分平台上的私聊实际上是特殊的频道。 +- `ChannelMessageEvent` 频道消息事件,用户在频道中发送的消息,部分平台上的群组概念和频道是重合的。(如QQ、微信等) +- `TempMessageEvent` 临时消息事件,一种特别的私聊事件,部分平台允许非好友用户向机器人发送消息,这种消息会被视为临时消息。 +- `NotifyEvent` 通知事件,部分平台具有此类事件,如戳一戳。 +- `RecallEvent` 撤回事件,用户撤回消息时触发。 + +### 好友事件 + +- `RenameEvent` 好友昵称变更事件,好友修改昵称时触发。 +- `FriendRequestEvent` 好友请求事件,用户请求添加好友时触发。 + +### 群组事件 + +- `GroupJoinEvent` 机器人加入群组事件,机器人加入群组时触发。 +- `GroupLeaveEvent` 机器人退出群组事件,机器人退出群组时触发。 +- `GroupInvitedEvent` 被邀请入群事件,机器人被邀请入群时触发。 +- `GroupMemberJoinEvent` 群成员加入事件,群组有新成员加入时触发。 +- `GroupMemberLeaveEvent` 群成员离开事件,群组有成员离开时触发。 +- `GroupMuteEvent` 群组禁言事件,群组中有成员被禁言时触发。 +- `GroupRoleChangeEvent` 群组角色变更事件,群组中有成员角色变更时触发。 +- `GroupRenameEvent` 群组名称变更事件,群组名称变更时触发。 +- `GroupTitleChangeEvent` 群组头衔变更事件,部分平台具有这个特性。 +- `GroupDigestEvent` 群组头衔变更事件,部分平台具有这个特性。 + +## API + +基于Satori的资源API并参考了其他Bot框架的一些实现,氷犬提供了一系列可供调用的事件API,用于使开发者可以快速与适配器进行交互。 + +调用API实际上是向事件总线发送数据请求事件,部分API需要通过临时增加一个事件监听器监听数据回调事件来实现API调用的异步回调。 + +### 适配器API + +```go +GetImage(url string) string // 获取图片URL,用于解决一些平台的图片防盗链问题 +Refresh() // 刷新适配器缓存,用于重新加载适配器配置 +``` + +### Satori API + +```go +// 频道相关 +func GetChannel(channelId string) *Channel // 获取指定频道信息 +func GetChannelList(groupId string) []*Channel // 获取群组中的频道列表 +func CreateChannel(groupId string, data *Channel) *Channel // 在群组中创建频道 +func UpdateChannel(channelId string, data *Channel) *Channel // 更新群组中指定频道的信息 +func DeleteChannel(channelId string) // 删除指定频道 +func MuteChannel(channelId string, duration int64) // 禁言指定群组频道,传入时长0时表示解除禁言 +func CreateUserChannel(userId string, groupId string) *Channel // 创建用户私聊频道 +// 群组相关 +func GetGroup(groupId string) *Group // 获取指定群组信息 +func GetGroupList() []*Group // 获取机器人的群组列表 +func ApproveGroup(messageId string, approve bool, comment string) // 处理来自群组的邀请 +// 群组成员相关 +func GetGroupMember(groupId string, userId string) *GroupMember // 获取指定群组的指定成员信息 +func GetGroupMemberList(groupId string) []*GroupMember // 获取指定群组的成员列表 +func KickGroupMember(groupId string, userId string, permanent bool) // 从指定群组中踢出指定成员 +func MuteGroupMember(groupId string, userId string, duration int64) // 禁言指定群组成员,传入时长0时表示解除禁言 +func ApproveGroupMember(messageId string, approve bool, comment string) // 处理加群请求 +// 群组角色相关 +func SetGroupMemberRole(groupId string, userId string, roleId string) // 设置指定群组成员的角色 +func UnsetGroupMemberRole(groupId string, userId string, roleId string) // 取消指定群组成员的角色 +func GetGroupRoleList(groupId string) []*GroupRole // 获取指定群组的角色列表 +func CreateGroupRole(groupId string, role *GroupRole) *GroupRole // 在指定群组中创建角色 +func UpdateGroupRole(groupId string, roleId string, role *GroupRole) *GroupRole // 修改指定群组中的角色 +func DeleteGroupRole(groupId string, roleId string) // 删除指定群组中的角色 +// 登录信息相关 +func GetLoginInfo() *Login // 获取登录信息 +// 消息相关 +func SendMessage(channelId string, message string) *Message // 发送消息 +func RecallMessage(channelId string, messageId string) // 撤回消息 +func EditMessage(channelId string, messageId string, message string) // 编辑消息 +func GetMessage(channelId string, messageId string) *Message // 获取消息 +func GetMessageList(channelId string, limit int64, offset int64) []*Message // 获取消息列表 +// 表态相关 +func CreateReaction(channelId string, messageId string, reaction string) // 创建表态 +func DeleteReaction(channelId string, messageId string, reaction string, userId string) // 删除表态 +func ClearReaction(channelId string, messageId string, reaction string) // 清除表态 +func GetReactionList(channelId string, messageId string, reaction string) []*Reaction // 获取表态列表 +// 用户相关 +func GetUser(userId string) *User // 获取用户信息 +func GetFriendList() []*User // 获取好友列表 +func ApproveFriend(messageId string, approve bool, comment string) // 处理好友请求 +``` + + +### 扩展API + +```go +func SendMessageElements(channelId string, elements ...Element) *Message // 直接发送消息元素 +func Reply(messageId string, message string) *Message // 回复消息 +func ReplyElements(messageId string, elements ...Element) *Message // 直接回复消息元素 +``` \ No newline at end of file diff --git a/models/satori/satori_api.go b/models/satori/satori_api.go new file mode 100644 index 0000000..65c0e23 --- /dev/null +++ b/models/satori/satori_api.go @@ -0,0 +1 @@ +package satori diff --git a/models/satori/satori_event.go b/models/satori/satori_event.go new file mode 100644 index 0000000..9ceaf5d --- /dev/null +++ b/models/satori/satori_event.go @@ -0,0 +1,6 @@ +package satori + +// 用于定义使用Satori模型时的默认事件类型 + +// EventTypeSatori Satori事件类型 +type EventTypeSatori string