package internal import ( "encoding/json" "fmt" "strings" "time" "github.com/samber/lo" ) type ChannelMessage struct { ID int GroupID int64 Message string Medias ChannelMessageMedia PublishAt time.Time } type ChannelMessageMedia struct { MsgID int `json:"msg_id,omitempty"` AssetID int64 `json:"asset_id,omitempty"` Photo *string `json:"photo,omitempty"` Video *string `json:"video,omitempty"` Document *ChannelMessageDocument `json:"document,omitempty"` WebPage *ChannelMessageMediaWebPage `json:"web_page,omitempty"` } type ChannelMessageDocument struct { Ext string Filename string MimeType string Size int64 Video *ChannelMessageDocumentVideo } type ChannelMessageDocumentVideo struct { Duration float64 Width int Height int } type ChannelMessageMediaWebPage struct { Title string URL string } func NewChannelMessage(id, ts int) *ChannelMessage { return &ChannelMessage{ID: id, PublishAt: time.Unix(int64(ts), 0)} } func (c *ChannelMessage) WithGroupID(groupID int64) *ChannelMessage { c.GroupID = groupID return c } func (c *ChannelMessage) WithMessage(message string) *ChannelMessage { c.Message = message return c } func (c *ChannelMessage) WithPhoto(assetID int64, ext string) *ChannelMessage { c.Medias = ChannelMessageMedia{ MsgID: c.ID, AssetID: assetID, Photo: lo.ToPtr(fmt.Sprintf("%d.%s", assetID, strings.Trim(ext, "."))), } return c } func (c *ChannelMessage) WithDocument(assetID int64, d ChannelMessageDocument) *ChannelMessage { c.Medias = ChannelMessageMedia{ MsgID: c.ID, AssetID: assetID, Document: lo.ToPtr(d), } return c } func (c *ChannelMessage) WithWebPage(assetID int64, title, url string) *ChannelMessage { c.Medias = ChannelMessageMedia{ MsgID: c.ID, AssetID: assetID, WebPage: lo.ToPtr(ChannelMessageMediaWebPage{Title: title, URL: url}), } return c } func (c *ChannelMessage) GetMedias() string { b, _ := json.Marshal([]ChannelMessageMedia{c.Medias}) return string(b) }