1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
|
package main
import (
"encoding/json"
"fmt"
"html/template"
"os"
"strings"
"sync"
)
type User struct {
ID string
Name string
UserName string
UserNamePlain string
Icon string
PublicKey string
Summary string
SummaryHTML template.HTML
filename string
TotalPosts int
TotalFollowers int
wlock sync.Mutex
posts []*Post
followers map[string]*Actor
config *Config
}
func (u *User) AddFollower(actor Actor) {
u.wlock.Lock()
defer u.wlock.Unlock()
u.followers[actor.ID] = &actor
data, _ := json.Marshal(actor)
CacheData(u, "followers", "", actor.ID, data)
}
func (u *User) RemoveFollower(actor string) {
u.wlock.Lock()
defer u.wlock.Unlock()
delete(u.followers, actor)
DeleteFromCache(u, "followers", "", actor)
}
func UserFromFile(filename string, config *Config) *User {
data, _ := os.ReadFile(filename)
user := &User{}
err := json.Unmarshal(data, user)
if err != nil {
fmt.Printf("[error] could not load user: %v\n", err)
}
user.UserNamePlain = strings.TrimPrefix(user.UserName, "@")
user.filename = filename
user.followers = make(map[string]*Actor)
user.config = config
user.SummaryHTML = template.HTML(user.Summary)
// load followers into the cache...
WalkCache(user, "followers", "", func(id string, b []byte) {
actor := &Actor{}
if err := json.Unmarshal(b, actor); err == nil {
fmt.Printf("[user] loading follower: %v\n", actor.ID)
user.followers[actor.ID] = actor
} else {
fmt.Printf("[user] error loading follower: %v\n", err)
}
})
return user
}
func (u *User) LoadPosts(posts []*NoteMeta) {
u.wlock.Lock()
defer u.wlock.Unlock()
for _, post := range posts {
id := post.LocalID()
u.posts = append(u.posts, FromNote(CacheId(u, "notes", "", u.ID+"/posts/"+id), u, u.ID, post))
}
}
|