qq_bot/message/share.go

63 lines
1.4 KiB
Go

package message
import (
"encoding/json"
"fmt"
"regexp"
)
// ShareMessage 链接分享消息
type ShareMessage struct {
Type string `json:"type"`
Data ShareMessageData `json:"data"`
}
type ShareMessageData struct {
URL string `json:"url"`
Title string `json:"title"`
Content string `json:"content,omitempty"`
Image string `json:"image,omitempty"`
}
func init() {
RegisterMessageType(TypeShare, func() CQMessage {
return NewShareMessage()
})
}
func NewShareMessage() *ShareMessage {
return &ShareMessage{Type: TypeShare}
}
func (msg *ShareMessage) SetData(data json.RawMessage) error {
return json.Unmarshal(data, &msg.Data)
}
func (msg *ShareMessage) ToCQString() string {
base := fmt.Sprintf("[CQ:share,url=%s,title=%s", msg.Data.URL, msg.Data.Title)
if msg.Data.Content != "" {
base += fmt.Sprintf(",content=%s", msg.Data.Content)
}
if msg.Data.Image != "" {
base += fmt.Sprintf(",image=%s", msg.Data.Image)
}
return base + "]"
}
func (msg *ShareMessage) ParseMessage(data string) error {
re := regexp.MustCompile(`\[CQ:share,url=(.*?),title=(.*?)(?:,content=(.*?))?(?:,image=(.*?))?\]`)
matches := re.FindStringSubmatch(data)
if len(matches) < 3 {
return fmt.Errorf("链接分享消息格式不正确")
}
msg.Data.URL = matches[1]
msg.Data.Title = matches[2]
if len(matches) > 3 {
msg.Data.Content = matches[3]
}
if len(matches) > 4 {
msg.Data.Image = matches[4]
}
return nil
}