82 lines
1.9 KiB
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(),
|
|
)
|
|
}
|