arimelody.me/model/bluesky.go

82 lines
1.9 KiB
Go

package model
import (
"fmt"
"strings"
"time"
)
type (
Record struct {
Type string `json:"$type"`
CreatedAt string `json:"createdAt"`
Text string `json:"text"`
}
Profile struct {
DID string `json:"did"`
Handle string `json:"handle"`
Avatar string `json:"avatar"`
DisplayName string `json:"displayName"`
CreatedAt string `json:"createdAt"`
}
PostImage struct {
Thumbnail string `json:"thumb"`
Fullsize string `json:"fullsize"`
Alt string `json:"alt"`
}
EmbedMedia struct {
Images []PostImage `json:"images"`
}
Embed struct {
Media EmbedMedia `json:"media"`
}
Post struct {
Author Profile `json:"author"`
Record Record `json:"record"`
ReplyCount int `json:"replyCount"`
RepostCount int `json:"repostCount"`
LikeCount int `json:"likeCount"`
QuoteCount int `json:"quoteCount"`
Embed *Embed `json:"embed"`
URI string `json:"uri"`
}
ThreadViewPost struct {
Post Post `json:"post"`
Replies []*ThreadViewPost `json:"replies"`
}
)
func (record *Record) CreatedAtPrint() (string, error) {
t, err := record.CreatedAtTime()
if err != nil { return "", err }
return t.Format("2 Jan 2006, 15:04"), nil
}
func (record *Record) CreatedAtTime() (time.Time, error) {
return time.Parse("2006-01-02T15:04:05Z", record.CreatedAt)
}
func (post *Post) HasImage() bool {
return post.Embed != nil && len(post.Embed.Media.Images) > 0
}
func (post *Post) PostID() string {
return strings.TrimPrefix(
post.URI,
fmt.Sprintf("at://%s/app.bsky.feed.post/", post.Author.DID),
)
}
func (post *Post) BskyURL() string {
return fmt.Sprintf(
"https://bsky.app/profile/%s/post/%s",
post.Author.DID,
post.PostID(),
)
}