Skip to content
This repository has been archived by the owner on May 27, 2024. It is now read-only.

Commit

Permalink
MessageChain实现json.Unmarshaler接口
Browse files Browse the repository at this point in the history
  • Loading branch information
CuteReimu committed May 10, 2024
1 parent 2348d62 commit 3759ea0
Show file tree
Hide file tree
Showing 5 changed files with 45 additions and 30 deletions.
2 changes: 1 addition & 1 deletion examples/echo.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ import (
func main() {
b, _ := Connect("localhost", 8080, WsChannelAll, "ABCDEFGHIJK", 123456789, false)
b.ListenGroupMessage(func(message *GroupMessage) bool {
var ret []SingleMessage
var ret MessageChain
ret = append(ret, &Plain{Text: "你说了:\n"})
ret = append(ret, message.MessageChain[1:]...) // 第一个元素原先一定是 Source ,直接排除掉即可
_, err := b.SendGroupMessage(message.Sender.Group.Id, 0, ret)
Expand Down
21 changes: 18 additions & 3 deletions message.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,16 +2,31 @@ package miraihttp

import (
"encoding/json"
"errors"
"github.com/tidwall/gjson"
"log/slog"
)

type MessageChain []SingleMessage

func (c *MessageChain) UnmarshalJSON(data []byte) error {
if !gjson.ValidBytes(data) {
return errors.New("invalid json data")
}
result := gjson.ParseBytes(data)
if !result.IsArray() {
return errors.New("result is not array")
}
*c = parseMessageChain(result.Array())
return nil
}

type SingleMessage interface {
FillMessageType()
}

// buildMessageChain 自动填上每个元素的Type字段
func buildMessageChain(messages []SingleMessage) []SingleMessage {
func buildMessageChain(messages MessageChain) MessageChain {
for _, m := range messages {
m.FillMessageType()
}
Expand Down Expand Up @@ -285,11 +300,11 @@ var singleMessageBuilder = map[string]func() SingleMessage{
"MiraiCode": func() SingleMessage { return &MiraiCode{} },
}

func parseMessageChain(results []gjson.Result) []SingleMessage {
func parseMessageChain(results []gjson.Result) MessageChain {
if len(results) == 0 {
return nil
}
ret := make([]SingleMessage, 0, len(results))
ret := make(MessageChain, 0, len(results))
for i := range results {
if results[i].Type != gjson.JSON {
slog.Error("single message is not json: " + results[i].Type.String())
Expand Down
18 changes: 9 additions & 9 deletions message_listener.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ func init() {
// FriendMessage 好友消息
type FriendMessage struct {
Sender Friend
MessageChain []SingleMessage
MessageChain MessageChain
}

// ListenFriendMessage 监听好友消息
Expand All @@ -47,7 +47,7 @@ func parseFriendMessage(data gjson.Result) any {
// GroupMessage 群消息
type GroupMessage struct {
Sender Member
MessageChain []SingleMessage
MessageChain MessageChain
}

// ListenGroupMessage 监听群消息
Expand All @@ -73,7 +73,7 @@ func parseGroupMessage(data gjson.Result) any {
// TempMessage 群临时消息
type TempMessage struct {
Sender Member
MessageChain []SingleMessage
MessageChain MessageChain
}

// ListenTempMessage 监听群临时消息
Expand All @@ -99,7 +99,7 @@ func parseTempMessage(data gjson.Result) any {
// StrangerMessage 陌生人消息
type StrangerMessage struct {
Sender Friend
MessageChain []SingleMessage
MessageChain MessageChain
}

// ListenStrangerMessage 监听陌生人消息
Expand Down Expand Up @@ -130,7 +130,7 @@ type OtherClient struct {
// OtherClientMessage 其他客户端消息
type OtherClientMessage struct {
Sender OtherClient
MessageChain []SingleMessage
MessageChain MessageChain
}

// ListenOtherClientMessage 监听其他客户端消息
Expand All @@ -156,7 +156,7 @@ func parseOtherClientMessage(data gjson.Result) any {
// FriendSyncMessage 同步好友消息
type FriendSyncMessage struct {
Subject Friend
MessageChain []SingleMessage
MessageChain MessageChain
}

// ListenFriendSyncMessage 监听同步好友消息
Expand All @@ -182,7 +182,7 @@ func parseFriendSyncMessage(data gjson.Result) any {
// GroupSyncMessage 同步群消息
type GroupSyncMessage struct {
Subject Group
MessageChain []SingleMessage
MessageChain MessageChain
}

// ListenGroupSyncMessage 监听同步群消息
Expand All @@ -208,7 +208,7 @@ func parseGroupSyncMessage(data gjson.Result) any {
// TempSyncMessage 同步群临时消息
type TempSyncMessage struct {
Subject Member
MessageChain []SingleMessage
MessageChain MessageChain
}

// ListenTempSyncMessage 监听同步群临时消息
Expand All @@ -234,7 +234,7 @@ func parseTempSyncMessage(data gjson.Result) any {
// StrangerSyncMessage 同步好友消息
type StrangerSyncMessage struct {
Subject Friend
MessageChain []SingleMessage
MessageChain MessageChain
}

// ListenStrangerSyncMessage 监听同步好友消息
Expand Down
8 changes: 4 additions & 4 deletions message_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,14 +7,14 @@ import (
)

func TestMessage(t *testing.T) {
assert.Equal(t, []SingleMessage{&Plain{Type: "Plain", Text: "123"}}, buildMessageChain([]SingleMessage{&Plain{Text: "123"}}))
assert.Equal(t, []SingleMessage{&Poke{Type: "Poke", Name: "SixSixSix"}}, buildMessageChain([]SingleMessage{&Poke{Name: "SixSixSix"}}))
assert.Equal(t, []SingleMessage{&Image{Type: "Image", ImageId: "1", Url: "url"}}, buildMessageChain([]SingleMessage{&Image{ImageId: "1", Url: "url"}}))
assert.Equal(t, MessageChain{&Plain{Type: "Plain", Text: "123"}}, buildMessageChain(MessageChain{&Plain{Text: "123"}}))
assert.Equal(t, MessageChain{&Poke{Type: "Poke", Name: "SixSixSix"}}, buildMessageChain(MessageChain{&Poke{Name: "SixSixSix"}}))
assert.Equal(t, MessageChain{&Image{Type: "Image", ImageId: "1", Url: "url"}}, buildMessageChain(MessageChain{&Image{ImageId: "1", Url: "url"}}))
}

func TestMessageChain(t *testing.T) {
content := `[{"type":"Plain","text":"123"},{"type":"Poke","name":"SixSixSix"},{"type":"Image","imageId":"1","url":"url"}]`
assert.Equal(t, parseMessageChain(gjson.Parse(content).Array()), buildMessageChain(
[]SingleMessage{&Plain{Text: "123"}, &Poke{Name: "SixSixSix"}, &Image{ImageId: "1", Url: "url"}},
MessageChain{&Plain{Text: "123"}, &Poke{Name: "SixSixSix"}, &Image{ImageId: "1", Url: "url"}},
))
}
26 changes: 13 additions & 13 deletions request.go
Original file line number Diff line number Diff line change
Expand Up @@ -58,11 +58,11 @@ func (b *Bot) MessageFromId(messageId, target int64) (any, error) {
}

// SendFriendMessage 发送好友消息,qq-目标好友的QQ号,quote-引用回复的消息,messageChain-发送的内容,返回消息id
func (b *Bot) SendFriendMessage(qq, quote int64, messageChain []SingleMessage) (int64, error) {
func (b *Bot) SendFriendMessage(qq, quote int64, messageChain MessageChain) (int64, error) {
result, err := b.request("sendFriendMessage", "", &struct {
Target int64 `json:"target"`
Quote int64 `json:"quote,omitempty"`
MessageChain []SingleMessage `json:"messageChain"`
Target int64 `json:"target"`
Quote int64 `json:"quote,omitempty"`
MessageChain MessageChain `json:"messageChain"`
}{qq, quote, buildMessageChain(messageChain)})
if err != nil {
return 0, err
Expand All @@ -71,11 +71,11 @@ func (b *Bot) SendFriendMessage(qq, quote int64, messageChain []SingleMessage) (
}

// SendGroupMessage 发送群消息,group-群号,quote-引用回复的消息,messageChain-发送的内容,返回消息id
func (b *Bot) SendGroupMessage(group, quote int64, messageChain []SingleMessage) (int64, error) {
func (b *Bot) SendGroupMessage(group, quote int64, messageChain MessageChain) (int64, error) {
result, err := b.request("sendGroupMessage", "", &struct {
Target int64 `json:"target"`
Quote int64 `json:"quote,omitempty"`
MessageChain []SingleMessage `json:"messageChain"`
Target int64 `json:"target"`
Quote int64 `json:"quote,omitempty"`
MessageChain MessageChain `json:"messageChain"`
}{group, quote, buildMessageChain(messageChain)})
if err != nil {
return 0, err
Expand All @@ -84,12 +84,12 @@ func (b *Bot) SendGroupMessage(group, quote int64, messageChain []SingleMessage)
}

// SendTempMessage 发送临时会话消息,qq-临时会话对象QQ号,group-临时会话群号,quote-引用回复的消息,messageChain-发送的内容,返回消息id
func (b *Bot) SendTempMessage(qq, group, quote int64, messageChain []SingleMessage) (int64, error) {
func (b *Bot) SendTempMessage(qq, group, quote int64, messageChain MessageChain) (int64, error) {
result, err := b.request("sendTempMessage", "", &struct {
QQ int64 `json:"qq"`
Group int64 `json:"group"`
Quote int64 `json:"quote,omitempty"`
MessageChain []SingleMessage `json:"messageChain"`
QQ int64 `json:"qq"`
Group int64 `json:"group"`
Quote int64 `json:"quote,omitempty"`
MessageChain MessageChain `json:"messageChain"`
}{qq, group, quote, buildMessageChain(messageChain)})
if err != nil {
return 0, err
Expand Down

0 comments on commit 3759ea0

Please sign in to comment.