* fix(ap): add safe constructors, getters, and validators to ActivityPub actors to address #4701 * chore: replace nil check with the new Validate() method * chore(test): added test to verify the values extracted from actors * fix: return the specific error type + test for it * fix(ap): add recovery for each AP inbox worker for a worst case scenario * fix(ap): add additional safe accessor methods to other AP entities other than actors * chore(tests): add tests for the new safe accessors * fix(ap): handle empty public keys in AP actors
67 lines
2.1 KiB
Go
67 lines
2.1 KiB
Go
package inbox
|
|
|
|
import (
|
|
"fmt"
|
|
|
|
"github.com/go-fed/activity/streams/vocab"
|
|
"github.com/owncast/owncast/activitypub/resolvers"
|
|
"github.com/owncast/owncast/core/chat"
|
|
"github.com/owncast/owncast/core/chat/events"
|
|
"github.com/owncast/owncast/persistence/configrepository"
|
|
)
|
|
|
|
func handleEngagementActivity(eventType events.EventType, isLiveNotification bool, actorReference vocab.ActivityStreamsActorProperty, action string) error {
|
|
configRepository := configrepository.Get()
|
|
|
|
// Do nothing if displaying engagement actions has been turned off.
|
|
if !configRepository.GetFederationShowEngagement() {
|
|
return nil
|
|
}
|
|
|
|
// Do nothing if chat is disabled
|
|
if configRepository.GetChatDisabled() {
|
|
return nil
|
|
}
|
|
|
|
// Get actor of the action
|
|
actor, err := resolvers.GetResolvedActorFromActorProperty(actorReference)
|
|
if err != nil {
|
|
return fmt.Errorf("unable to resolve actor for engagement activity: %w", err)
|
|
}
|
|
|
|
// Send chat message
|
|
actorName := actor.Name
|
|
if actorName == "" {
|
|
actorName = actor.Username
|
|
}
|
|
actorIRI := actor.ActorIriString()
|
|
|
|
userPrefix := fmt.Sprintf("%s ", actorName)
|
|
var suffix string
|
|
if isLiveNotification && action == events.FediverseEngagementLike {
|
|
suffix = "liked that this stream went live."
|
|
} else if action == events.FediverseEngagementLike {
|
|
suffix = fmt.Sprintf("liked a post from %s.", configRepository.GetServerName())
|
|
} else if isLiveNotification && action == events.FediverseEngagementRepost {
|
|
suffix = "shared this stream with their followers."
|
|
} else if action == events.FediverseEngagementRepost {
|
|
suffix = fmt.Sprintf("shared a post from %s.", configRepository.GetServerName())
|
|
} else if action == events.FediverseEngagementFollow {
|
|
suffix = "followed this stream."
|
|
} else {
|
|
return fmt.Errorf("could not handle event for sending to chat: %s", action)
|
|
}
|
|
body := fmt.Sprintf("%s %s", userPrefix, suffix)
|
|
|
|
var image *string
|
|
if imageStr := actor.ImageString(); imageStr != "" {
|
|
image = &imageStr
|
|
}
|
|
|
|
if err := chat.SendFediverseAction(eventType, actor.FullUsername, image, body, actorIRI); err != nil {
|
|
return err
|
|
}
|
|
|
|
return nil
|
|
}
|