diff --git a/actor.go b/actor.go index 6a1af86..503a6bc 100644 --- a/actor.go +++ b/actor.go @@ -192,10 +192,8 @@ func (a *Actor) NewFollower(iri string, inbox string) error { func (a *Actor) RemoveFollower(iri string) error { if _, ok := a.followers[iri]; ok { delete(a.followers, iri) - fmt.Println("Removed follower: ", iri) return a.save() } - fmt.Println(iri, "is not following") return nil } diff --git a/http.go b/http.go index 41d3004..33d35d0 100644 --- a/http.go +++ b/http.go @@ -10,6 +10,7 @@ import ( "net/url" "os" "regexp" + "strings" "time" "willnorris.com/go/webmention" ) @@ -81,14 +82,6 @@ func Serve() { w.WriteHeader(http.StatusNotFound) return } - f, err := os.OpenFile(storage+slash+"actors"+slash+actor.Name+slash+"inbox", os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644) - if err != nil { - w.WriteHeader(http.StatusInternalServerError) - return - } - defer func() { _ = f.Close() }() - _, _ = f.Write(b) - _, _ = f.WriteString("\n---\n") switch activity["type"] { case "Follow": actor.Accept(activity) @@ -106,19 +99,23 @@ func Serve() { case "Create": { if object, ok := activity["object"].(map[string]interface{}); ok { - inReplyTo, ok := object["inReplyTo"].(string) - id, ok2 := object["id"].(string) - if ok && ok2 && len(inReplyTo) > 0 && len(id) > 0 { + inReplyTo, hasReplyToString := object["inReplyTo"].(string) + id, hasId := object["id"].(string) + if hasReplyToString && hasId && len(inReplyTo) > 0 && len(id) > 0 { + // It's an ActivityPub reply + fmt.Println("Received reply to:", inReplyTo) webmentionClient := webmention.New(nil) - endpoint, err := webmentionClient.DiscoverEndpoint(inReplyTo) - if err != nil || len(endpoint) < 1 { + sendWebmention(webmentionClient, actor, id, inReplyTo) + } else if hasId && len(id) > 0 { + // May be a mention + webmentionClient := webmention.New(nil) + dl, err := webmentionClient.DiscoverLinks(id, "") + if err != nil { return } - _, err = webmentionClient.SendWebmention(endpoint, id, inReplyTo) - if err != nil { - log.Println("Sending webmention to " + inReplyTo + " failed") - } else { - log.Println("Sent webmention to " + inReplyTo) + // Send Webmentions + for _, link := range dl { + sendWebmention(webmentionClient, actor, id, link) } } } @@ -127,9 +124,11 @@ func Serve() { { if object, ok := activity["object"].(string); ok && len(object) > 0 && activity["actor"] == object { _ = actor.RemoveFollower(object) - fmt.Println("Deleted", object) } } + default: + // Log inbox request + logInbox(actor, b) } // Return 201 w.WriteHeader(http.StatusCreated) @@ -144,3 +143,30 @@ func Serve() { log.Fatal(http.ListenAndServe(":8081", nil)) } + +func logInbox(actor *Actor, b []byte) { + f, err := os.OpenFile(storage+slash+"actors"+slash+actor.Name+slash+"inbox", os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644) + if err != nil { + return + } + defer func() { _ = f.Close() }() + _, _ = f.Write(b) + _, _ = f.WriteString("\n---\n") +} + +func sendWebmention(client *webmention.Client, actor *Actor, mentioningLink, mentionedLink string) { + if !strings.Contains(mentionedLink, actor.iri) { + // Not mention of blog + return + } + endpoint, err := client.DiscoverEndpoint(mentionedLink) + if err != nil || len(endpoint) < 1 { + return + } + _, err = client.SendWebmention(endpoint, mentioningLink, mentionedLink) + if err != nil { + log.Println("Sending webmention to " + mentionedLink + " failed") + return + } + log.Println("Sent webmention to " + mentionedLink) +} \ No newline at end of file