12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788 |
- package inbox
- import (
- "context"
- "fmt"
- "time"
- "github.com/go-fed/activity/streams/vocab"
- "github.com/owncast/owncast/activitypub/persistence"
- "github.com/owncast/owncast/activitypub/requests"
- "github.com/owncast/owncast/activitypub/resolvers"
- "github.com/owncast/owncast/core/chat/events"
- "github.com/owncast/owncast/core/data"
- "github.com/pkg/errors"
- log "github.com/sirupsen/logrus"
- )
- func handleFollowInboxRequest(c context.Context, activity vocab.ActivityStreamsFollow) error {
- follow, err := resolvers.MakeFollowRequest(c, activity)
- if err != nil {
- log.Errorln("unable to create follow inbox request", err)
- return err
- }
- if follow == nil {
- return fmt.Errorf("unable to handle request")
- }
- approved := !data.GetFederationIsPrivate()
- followRequest := *follow
- if err := persistence.AddFollow(followRequest, approved); err != nil {
- log.Errorln("unable to save follow request", err)
- return err
- }
- localAccountName := data.GetDefaultFederationUsername()
- if approved {
- if err := requests.SendFollowAccept(follow.Inbox, activity, localAccountName); err != nil {
- log.Errorln("unable to send follow accept", err)
- return err
- }
- }
- // Save as an accepted activity
- actorReference := activity.GetActivityStreamsActor()
- object := activity.GetActivityStreamsObject()
- objectIRI := object.At(0).GetIRI().String()
- actorIRI := actorReference.At(0).GetIRI().String()
- // If this request is approved and we have not previously sent an action to
- // chat due to a previous follow request, then do so.
- hasPreviouslyhandled := true // Default so we don't send anything if it fails.
- if approved {
- hasPreviouslyhandled, err = persistence.HasPreviouslyHandledInboundActivity(objectIRI, actorIRI, events.FediverseEngagementFollow)
- if err != nil {
- log.Errorln("error checking for previously handled follow activity", err)
- }
- }
- // Save this follow action to our activities table.
- if err := persistence.SaveInboundFediverseActivity(objectIRI, actorIRI, events.FediverseEngagementFollow, time.Now()); err != nil {
- return errors.Wrap(err, "unable to save inbound share/re-post activity")
- }
- // Send action to chat if it has not been previously handled.
- if !hasPreviouslyhandled {
- return handleEngagementActivity(events.FediverseEngagementFollow, false, actorReference, events.FediverseEngagementFollow)
- }
- return nil
- }
- func handleUnfollowRequest(c context.Context, activity vocab.ActivityStreamsUndo) error {
- request := resolvers.MakeUnFollowRequest(c, activity)
- if request == nil {
- log.Errorf("unable to handle unfollow request")
- return errors.New("unable to handle unfollow request")
- }
- unfollowRequest := *request
- log.Traceln("unfollow request:", unfollowRequest)
- return persistence.RemoveFollow(unfollowRequest)
- }
|