fix: 修改消息结构以支持单一类型消息,更新解析函数以适应新结构

This commit is contained in:
lixiangwuxian 2025-06-16 11:48:13 +08:00
parent 9a4be54662
commit c502c87e15
2 changed files with 35 additions and 33 deletions

View File

@ -71,7 +71,7 @@ type EventMessage struct {
SubType string `json:"sub_type"`
MessageID int32 `json:"message_id"`
UserID int64 `json:"user_id"`
Message []any `json:"message"`
Message any `json:"message"`
RawMessage string `json:"raw_message"`
Font int32 `json:"font"`
Sender Sender `json:"sender"`

View File

@ -47,38 +47,40 @@ func CreateMessage(messageType string) (QQMessage, error) {
return factory(), nil
}
// [map[data:map[chainCount:<nil> id:267 raw:map[chainCount:<nil> doubleHit:<nil> faceBubbleCount:<nil> faceIndex:267 faceText:/头秃 faceType:2 imageType:<nil> msgType:<nil> oldVersionStr:<nil> packId:<nil> pokeFlag:<nil> pokeStrength:<nil> pokeType:<nil> randomType:<nil> resultId:<nil> sourceType:<nil> spokeSummary:<nil> stickerId:<nil> stickerType:<nil> surpriseId:<nil> vaspokeId:<nil> vaspokeMinver:<nil> vaspokeName:<nil>] resultId:<nil>] type:face]]
// ParseStructMessages 解析消息数组
func ParseStructMessages(jsonData []any) []QQMessage {
log.Println("解析消息数组:", jsonData)
func ParseStructMessages(msgData any) []QQMessage {
log.Println("解析消息数组:", msgData)
switch msgData.(type) {
case []map[string]any:
msgArray := msgData.([]map[string]any)
messages := make([]QQMessage, 0, len(msgArray))
for _, raw := range msgArray {
msg, err := CreateMessage(raw["type"].(string))
if err != nil {
log.Println("创建消息失败:", err)
continue
}
dataByte, _ := json.Marshal(raw["data"])
// 使用类型断言获取具体类型的Data字段
if v, ok := msg.(interface{ SetData(json.RawMessage) error }); ok {
if err := v.SetData(dataByte); err != nil {
// return nil, fmt.Errorf("解析消息数据失败: %v", err)
log.Println("解析消息数据失败:", err)
continue
}
} else {
log.Printf("消息类型 %s 未实现 SetData 方法\n", raw["type"])
continue
}
messages = append(messages, msg)
}
log.Println("解析出的QQ消息数组:", messages)
return messages
case string:
return []QQMessage{NewTextMessage().ParseMessage(msgData.(string))}
}
return nil
// var rawMessages []RawMessage
// if err := json.Unmarshal(jsonData, &rawMessages); err != nil {
// log.Println("解析 JSON 数组失败:", err, string(jsonData))
// return nil
// }
// messages := make([]QQMessage, 0, len(rawMessages))
// for _, raw := range rawMessages {
// msg, err := CreateMessage(raw.Type)
// if err != nil {
// log.Println("创建消息失败:", err)
// continue
// }
// // 使用类型断言获取具体类型的Data字段
// if v, ok := msg.(interface{ SetData(json.RawMessage) error }); ok {
// if err := v.SetData(raw.Data); err != nil {
// // return nil, fmt.Errorf("解析消息数据失败: %v", err)
// log.Println("解析消息数据失败:", err)
// continue
// }
// } else {
// log.Printf("消息类型 %s 未实现 SetData 方法\n", raw.Type)
// continue
// }
// messages = append(messages, msg)
// }
// return messages
}