Skip to content

Commit

Permalink
完善Satori模型设计
Browse files Browse the repository at this point in the history
  • Loading branch information
kyokukong committed Sep 28, 2024
1 parent 3eedc1d commit 28766f4
Show file tree
Hide file tree
Showing 5 changed files with 130 additions and 7 deletions.
6 changes: 6 additions & 0 deletions adapters/lagrange/event_publisher.go
Original file line number Diff line number Diff line change
Expand Up @@ -144,5 +144,11 @@ func BindEvents() {
},
},
})
// 将LagrangeGo的消息存入消息缓存
err := Cache.Set(strconv.Itoa(int(event.InternalId)), event)
if err != nil {
return
}
})

}
24 changes: 18 additions & 6 deletions ice/event.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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:适配器连接事件结构体
Expand All @@ -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"` // 请求序列号,用于标识请求防止接受错误
}
100 changes: 99 additions & 1 deletion models/satori/README.md
Original file line number Diff line number Diff line change
@@ -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元素切片并传递到事件系统中。

## 事件类型
## 事件类型

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 // 直接回复消息元素
```
1 change: 1 addition & 0 deletions models/satori/satori_api.go
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
package satori
6 changes: 6 additions & 0 deletions models/satori/satori_event.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package satori

// 用于定义使用Satori模型时的默认事件类型

// EventTypeSatori Satori事件类型
type EventTypeSatori string

0 comments on commit 28766f4

Please sign in to comment.