package inbox import ( "context" "time" "github.com/go-fed/activity/streams/vocab" "github.com/owncast/owncast/models" "github.com/pkg/errors" ) func (api *APInbox) handleLikeRequest(c context.Context, activity vocab.ActivityStreamsLike) error { object := activity.GetActivityStreamsObject() actorReference := activity.GetActivityStreamsActor() if object.Len() < 1 { return errors.New("like activity is missing object") } if actorReference.Len() < 1 { return errors.New("like activity is missing actor") } objectIRI := object.At(0).GetIRI().String() actorIRI := actorReference.At(0).GetIRI().String() if hasPreviouslyhandled, err := api.federationRepository.HasPreviouslyHandledInboundActivity(objectIRI, actorIRI, models.FediverseEngagementLike); hasPreviouslyhandled || err != nil { return errors.Wrap(err, "inbound activity of like has already been handled") } // Likes need to match a post we had already sent. _, isLiveNotification, timestamp, err := api.federationRepository.GetObjectByIRI(objectIRI) if err != nil { return errors.Wrap(err, "Could not find post locally") } // Don't allow old activities to be liked if time.Since(timestamp) > maxAgeForEngagement { return errors.New("Activity is too old to be liked") } // Save as an accepted activity if err := api.federationRepository.SaveInboundFediverseActivity(objectIRI, actorIRI, models.FediverseEngagementLike, time.Now()); err != nil { return errors.Wrap(err, "unable to save inbound like activity") } return api.handleEngagementActivity(models.FediverseEngagementLike, isLiveNotification, actorReference, models.FediverseEngagementLike) }