feat: 完善消息模块,新增多种消息类型和统一消息解析机制

This commit is contained in:
lixiangwuxian
2025-03-08 16:50:38 +08:00
parent 13ea5d7f98
commit f1e2fb6a20
19 changed files with 840 additions and 37 deletions

67
message/music.go Normal file
View File

@@ -0,0 +1,67 @@
package message
import (
"encoding/json"
"fmt"
"regexp"
)
// MusicMessage 音乐分享消息
type MusicMessage struct {
Type string `json:"type"`
Data MusicMessageData `json:"data"`
}
type MusicMessageData struct {
Type string `json:"type"` // 音乐平台类型(qq、163、kugou、migu、kuwo)
ID string `json:"id,omitempty"` // 音乐ID
URL string `json:"url,omitempty"` // 音乐URL自定义音乐
Audio string `json:"audio,omitempty"` // 音频URL自定义音乐
Title string `json:"title,omitempty"` // 标题(自定义音乐)
Singer string `json:"singer,omitempty"` // 歌手(自定义音乐)
Image string `json:"image,omitempty"` // 封面图(自定义音乐)
}
func init() {
RegisterMessageType(TypeMusic, func() CQMessage {
return &MusicMessage{Type: TypeMusic}
})
}
func (msg *MusicMessage) SetData(data json.RawMessage) error {
return json.Unmarshal(data, &msg.Data)
}
func (msg *MusicMessage) ToCQString() string {
if msg.Data.Type == "custom" {
return fmt.Sprintf("[CQ:music,type=custom,url=%s,audio=%s,title=%s,singer=%s,image=%s]",
msg.Data.URL, msg.Data.Audio, msg.Data.Title, msg.Data.Singer, msg.Data.Image)
}
return fmt.Sprintf("[CQ:music,type=%s,id=%s]", msg.Data.Type, msg.Data.ID)
}
func (msg *MusicMessage) ParseMessage(data string) error {
// 解析自定义音乐
customRe := regexp.MustCompile(`\[CQ:music,type=custom,url=(.*?),audio=(.*?),title=(.*?),singer=(.*?),image=(.*?)\]`)
matches := customRe.FindStringSubmatch(data)
if len(matches) == 6 {
msg.Data.Type = "custom"
msg.Data.URL = matches[1]
msg.Data.Audio = matches[2]
msg.Data.Title = matches[3]
msg.Data.Singer = matches[4]
msg.Data.Image = matches[5]
return nil
}
// 解析平台音乐
platformRe := regexp.MustCompile(`\[CQ:music,type=(qq|163|kugou|migu|kuwo),id=(\d+)\]`)
matches = platformRe.FindStringSubmatch(data)
if len(matches) == 3 {
msg.Data.Type = matches[1]
msg.Data.ID = matches[2]
return nil
}
return fmt.Errorf("音乐分享消息格式不正确")
}