aboutsummaryrefslogtreecommitdiff
path: root/webfinger/util.go
blob: fa8a62556dc2b8afabf54ea88ddcc0a7fcfed27a (plain)
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
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
package webfinger

import (
	"fmt"
	"regexp"
	"sort"
	"strings"

	"github.com/FChannel0/FChannel-Server/activitypub"
	"github.com/FChannel0/FChannel-Server/util"
)

var Boards []Board
var FollowingBoards []activitypub.ObjectBase

type Board struct {
	Name        string
	Actor       activitypub.Actor
	Summary     string
	PrefName    string
	InReplyTo   string
	Location    string
	To          string
	RedirectTo  string
	Captcha     string
	CaptchaCode string
	ModCred     string
	Domain      string
	TP          string
	Restricted  bool
	Post        activitypub.ObjectBase
}

type BoardSortAsc []Board

func (a BoardSortAsc) Len() int           { return len(a) }
func (a BoardSortAsc) Less(i, j int) bool { return a[i].Name < a[j].Name }
func (a BoardSortAsc) Swap(i, j int)      { a[i], a[j] = a[j], a[i] }

func GetActorByNameFromBoardCollection(name string) activitypub.Actor {
	var actor activitypub.Actor

	boards, _ := GetBoardCollection()
	for _, e := range boards {
		if e.Actor.Name == name {
			actor = e.Actor
		}
	}

	return actor
}

func GetBoardCollection() ([]Board, error) {
	var collection []Board

	for _, e := range FollowingBoards {
		var board Board

		boardActor, err := activitypub.GetActorFromDB(e.Id)

		if err != nil {
			return collection, util.MakeError(err, "GetBoardCollection")
		}

		if boardActor.Id == "" {
			boardActor, err = activitypub.FingerActor(e.Id)

			if err != nil {
				return collection, util.MakeError(err, "GetBoardCollection")
			}
		}

		board.Name = boardActor.Name
		board.PrefName = boardActor.PreferredUsername
		board.Location = "/" + boardActor.Name
		board.Actor = boardActor
		board.Restricted = boardActor.Restricted

		collection = append(collection, board)
	}

	sort.Sort(BoardSortAsc(collection))

	return collection, nil
}

func GetActorFromPath(location string, prefix string) (activitypub.Actor, error) {
	var actor string

	pattern := fmt.Sprintf("%s([^/\n]+)(/.+)?", prefix)
	re := regexp.MustCompile(pattern)
	match := re.FindStringSubmatch(location)

	if len(match) < 1 {
		actor = "/"
	} else {
		actor = strings.Replace(match[1], "/", "", -1)
	}

	if actor == "/" || actor == "outbox" || actor == "inbox" || actor == "following" || actor == "followers" {
		actor = "main"
	}

	var nActor activitypub.Actor

	nActor, err := activitypub.GetActorByNameFromDB(actor)

	if err != nil {
		return nActor, util.MakeError(err, "GetActorFromPath")
	}

	if nActor.Id == "" {
		nActor = GetActorByNameFromBoardCollection(actor)
	}

	return nActor, nil
}

func StartupArchive() error {
	for _, e := range FollowingBoards {
		actor, err := activitypub.GetActorFromDB(e.Id)

		if err != nil {
			return util.MakeError(err, "StartupArchive")
		}

		if err := actor.ArchivePosts(); err != nil {
			return util.MakeError(err, "StartupArchive")
		}
	}

	return nil
}