diff options
author | FChannel <> | 2022-04-30 11:00:55 -0700 |
---|---|---|
committer | FChannel <> | 2022-06-19 12:53:29 -0700 |
commit | 1892327cee2c3fa1d3bea729bd08eb63c2189a96 (patch) | |
tree | 7b846f7d9caf46fba6c9d15ff81b9d89dcca9476 /webfinger/util.go | |
parent | 5b52d269faa2ce2014d0feba603a2122361cf4eb (diff) |
restructured code base to prevent circular dependicies
Diffstat (limited to 'webfinger/util.go')
-rw-r--r-- | webfinger/util.go | 109 |
1 files changed, 109 insertions, 0 deletions
diff --git a/webfinger/util.go b/webfinger/util.go new file mode 100644 index 0000000..cd16943 --- /dev/null +++ b/webfinger/util.go @@ -0,0 +1,109 @@ +package webfinger + +import ( + "fmt" + "regexp" + "sort" + "strings" + + "github.com/FChannel0/FChannel-Server/activitypub" +) + +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 GetActorByName(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, err + } + + if boardActor.Id == "" { + boardActor, err = FingerActor(e.Id) + if err != nil { + return collection, err + } + } + + 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) { + pattern := fmt.Sprintf("%s([^/\n]+)(/.+)?", prefix) + re := regexp.MustCompile(pattern) + match := re.FindStringSubmatch(location) + + var actor string + + 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, err + } + + if nActor.Id == "" { + nActor = GetActorByName(actor) + } + + return nActor, nil +} |