feat: 完善消息模块,新增多种消息类型和统一消息解析机制
This commit is contained in:
67
message/music.go
Normal file
67
message/music.go
Normal 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("音乐分享消息格式不正确")
|
||||
}
|
||||
Reference in New Issue
Block a user