utils.accounts.go

 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))
	}
}