2019-12-03 16:23:59 +00:00
package activitypub
2017-09-11 21:10:56 +00:00
2018-06-09 11:06:55 +00:00
import (
2019-05-07 21:11:15 +00:00
"errors"
2020-07-16 19:54:46 +00:00
"reflect"
2020-03-26 10:38:02 +00:00
"strings"
2018-06-09 12:05:46 +00:00
"time"
2019-12-03 11:47:27 +00:00
"unsafe"
2021-08-15 11:41:01 +00:00
"github.com/valyala/fastjson"
2018-06-09 11:06:55 +00:00
)
2018-03-24 16:54:55 +00:00
// Activity Types
2017-09-11 21:10:56 +00:00
const (
2017-10-02 09:53:09 +00:00
AcceptType ActivityVocabularyType = "Accept"
AddType ActivityVocabularyType = "Add"
AnnounceType ActivityVocabularyType = "Announce"
ArriveType ActivityVocabularyType = "Arrive"
BlockType ActivityVocabularyType = "Block"
CreateType ActivityVocabularyType = "Create"
DeleteType ActivityVocabularyType = "Delete"
DislikeType ActivityVocabularyType = "Dislike"
FlagType ActivityVocabularyType = "Flag"
FollowType ActivityVocabularyType = "Follow"
IgnoreType ActivityVocabularyType = "Ignore"
InviteType ActivityVocabularyType = "Invite"
JoinType ActivityVocabularyType = "Join"
LeaveType ActivityVocabularyType = "Leave"
LikeType ActivityVocabularyType = "Like"
ListenType ActivityVocabularyType = "Listen"
MoveType ActivityVocabularyType = "Move"
OfferType ActivityVocabularyType = "Offer"
QuestionType ActivityVocabularyType = "Question"
RejectType ActivityVocabularyType = "Reject"
ReadType ActivityVocabularyType = "Read"
RemoveType ActivityVocabularyType = "Remove"
TentativeRejectType ActivityVocabularyType = "TentativeReject"
TentativeAcceptType ActivityVocabularyType = "TentativeAccept"
TravelType ActivityVocabularyType = "Travel"
UndoType ActivityVocabularyType = "Undo"
UpdateType ActivityVocabularyType = "Update"
ViewType ActivityVocabularyType = "View"
2017-09-11 21:10:56 +00:00
)
2019-05-16 09:08:27 +00:00
func ( a ActivityVocabularyTypes ) Contains ( typ ActivityVocabularyType ) bool {
for _ , v := range a {
2020-03-26 10:38:02 +00:00
if strings . ToLower ( string ( v ) ) == strings . ToLower ( string ( typ ) ) {
2019-05-16 09:08:27 +00:00
return true
}
}
return false
}
2019-05-16 15:14:30 +00:00
// ContentManagementActivityTypes use case primarily deals with activities that involve the creation, modification or deletion of content.
// This includes, for instance, activities such as "John created a new note", "Sally updated an article", and "Joe deleted the photo".
2019-05-16 09:08:27 +00:00
var ContentManagementActivityTypes = ActivityVocabularyTypes {
2018-11-01 14:54:23 +00:00
CreateType ,
DeleteType ,
UpdateType ,
}
2019-05-16 15:14:30 +00:00
// CollectionManagementActivityTypes use case primarily deals with activities involving the management of content within collections.
// Examples of collections include things like folders, albums, friend lists, etc.
// This includes, for instance, activities such as "Sally added a file to Folder A", "John moved the file from Folder A to Folder B", etc.
2019-05-16 09:08:27 +00:00
var CollectionManagementActivityTypes = ActivityVocabularyTypes {
2018-11-01 14:54:23 +00:00
AddType ,
MoveType ,
RemoveType ,
}
2019-05-16 15:14:30 +00:00
// ReactionsActivityTypes use case primarily deals with reactions to content.
// This can include activities such as liking or disliking content, ignoring updates, flagging content as being inappropriate, accepting or rejecting objects, etc.
2019-05-16 09:08:27 +00:00
var ReactionsActivityTypes = ActivityVocabularyTypes {
2018-11-01 14:54:23 +00:00
AcceptType ,
BlockType ,
DislikeType ,
FlagType ,
IgnoreType ,
LikeType ,
RejectType ,
TentativeAcceptType ,
TentativeRejectType ,
}
2019-05-16 15:14:30 +00:00
// EventRSVPActivityTypes use case primarily deals with invitations to events and RSVP type responses.
2019-05-16 09:08:27 +00:00
var EventRSVPActivityTypes = ActivityVocabularyTypes {
2018-11-01 14:54:23 +00:00
AcceptType ,
IgnoreType ,
InviteType ,
RejectType ,
TentativeAcceptType ,
TentativeRejectType ,
}
2019-05-16 15:14:30 +00:00
// GroupManagementActivityTypes use case primarily deals with management of groups.
// It can include, for instance, activities such as "John added Sally to Group A", "Sally joined Group A", "Joe left Group A", etc.
2019-05-16 09:08:27 +00:00
var GroupManagementActivityTypes = ActivityVocabularyTypes {
2018-11-01 14:54:23 +00:00
AddType ,
JoinType ,
LeaveType ,
RemoveType ,
}
2019-05-16 15:14:30 +00:00
// ContentExperienceActivityTypes use case primarily deals with describing activities involving listening to, reading, or viewing content.
// For instance, "Sally read the article", "Joe listened to the song".
2019-05-16 09:08:27 +00:00
var ContentExperienceActivityTypes = ActivityVocabularyTypes {
2019-05-16 15:06:31 +00:00
ListenType ,
ReadType ,
ViewType ,
2018-11-01 14:54:23 +00:00
}
2019-05-16 15:14:30 +00:00
// GeoSocialEventsActivityTypes use case primarily deals with activities involving geo-tagging type activities.
// For instance, it can include activities such as "Joe arrived at work", "Sally left work", and "John is travel from home to work".
2019-05-16 09:08:27 +00:00
var GeoSocialEventsActivityTypes = ActivityVocabularyTypes {
2018-11-01 14:54:23 +00:00
ArriveType ,
LeaveType ,
TravelType ,
}
2019-05-16 15:14:30 +00:00
// NotificationActivityTypes use case primarily deals with calling attention to particular objects or notifications.
2019-05-16 09:08:27 +00:00
var NotificationActivityTypes = ActivityVocabularyTypes {
2018-11-01 14:54:23 +00:00
AnnounceType ,
}
2019-05-16 15:14:30 +00:00
// QuestionActivityTypes use case primarily deals with representing inquiries of any type.
// See 5.4 Representing Questions for more information.
2019-05-16 09:08:27 +00:00
var QuestionActivityTypes = ActivityVocabularyTypes {
2018-11-01 14:54:23 +00:00
QuestionType ,
}
2019-05-16 15:14:30 +00:00
// RelationshipManagementActivityTypes use case primarily deals with representing activities involving the management of interpersonal and social relationships
// (e.g. friend requests, management of social network, etc). See 5.2 Representing Relationships Between Entities for more information.
2019-05-16 09:08:27 +00:00
var RelationshipManagementActivityTypes = ActivityVocabularyTypes {
2018-11-01 14:54:23 +00:00
AcceptType ,
AddType ,
BlockType ,
CreateType ,
DeleteType ,
FollowType ,
IgnoreType ,
InviteType ,
RejectType ,
}
2019-05-16 15:14:30 +00:00
// NegatingActivityTypes use case primarily deals with the ability to redact previously completed activities.
// See 5.5 Inverse Activities and "Undo" for more information.
2019-05-16 09:08:27 +00:00
var NegatingActivityTypes = ActivityVocabularyTypes {
2018-11-01 14:54:23 +00:00
UndoType ,
}
2019-05-16 15:14:30 +00:00
// OffersActivityTypes use case deals with activities involving offering one object to another.
// It can include, for instance, activities such as "Company A is offering a discount on purchase of Product Z to Sally", "Sally is offering to add a File to Folder A", etc.
2019-05-16 09:08:27 +00:00
var OffersActivityTypes = ActivityVocabularyTypes {
2018-11-01 14:54:23 +00:00
OfferType ,
}
2019-05-16 15:14:30 +00:00
2019-05-16 09:08:27 +00:00
var IntransitiveActivityTypes = ActivityVocabularyTypes {
2018-11-04 19:31:04 +00:00
ArriveType ,
TravelType ,
QuestionType ,
}
2019-05-16 15:14:30 +00:00
2019-05-16 09:08:27 +00:00
var ActivityTypes = ActivityVocabularyTypes {
2017-09-11 21:10:56 +00:00
AcceptType ,
AddType ,
AnnounceType ,
BlockType ,
CreateType ,
DeleteType ,
DislikeType ,
FlagType ,
FollowType ,
IgnoreType ,
InviteType ,
JoinType ,
LeaveType ,
LikeType ,
ListenType ,
MoveType ,
OfferType ,
RejectType ,
ReadType ,
RemoveType ,
TentativeRejectType ,
TentativeAcceptType ,
UndoType ,
UpdateType ,
ViewType ,
}
2019-05-26 20:25:44 +00:00
// HasRecipients is an interface implemented by activities to return their audience
// for further propagation
type HasRecipients interface {
// Recipients is a method that should do a recipients de-duplication step and then return
// the remaining recipients
Recipients ( ) ItemCollection
2019-11-24 09:59:34 +00:00
Clean ( )
2019-05-26 20:25:44 +00:00
}
2021-11-07 13:39:30 +00:00
type Activities interface {
~ Activity
}
2018-07-18 15:39:27 +00:00
// Activity is a subtype of Object that describes some form of action that may happen,
2018-10-18 09:48:02 +00:00
// is currently happening, or has already happened.
2018-06-09 12:05:46 +00:00
// The Activity type itself serves as an abstract base type for all types of activities.
// It is important to note that the Activity type itself does not carry any specific semantics
2018-10-18 09:48:02 +00:00
// about the kind of action being taken.
2018-06-09 12:05:46 +00:00
type Activity struct {
2019-12-03 14:27:57 +00:00
// ID provides the globally unique identifier for anActivity Pub Object or Link.
2019-12-05 18:02:15 +00:00
ID ID ` jsonld:"id,omitempty" `
2019-12-03 14:27:57 +00:00
// Type identifies the Activity Pub Object or Link type. Multiple values may be specified.
Type ActivityVocabularyType ` jsonld:"type,omitempty" `
// Name a simple, human-readable, plain-text name for the object.
// HTML markup MUST NOT be included. The name MAY be expressed using multiple language-tagged values.
Name NaturalLanguageValues ` jsonld:"name,omitempty,collapsible" `
// Attachment identifies a resource attached or related to an object that potentially requires special handling.
// The intent is to provide a model that is at least semantically similar to attachments in email.
Attachment Item ` jsonld:"attachment,omitempty" `
// AttributedTo identifies one or more entities to which this object is attributed. The attributed entities might not be Actors.
// For instance, an object might be attributed to the completion of another activity.
AttributedTo Item ` jsonld:"attributedTo,omitempty" `
// Audience identifies one or more entities that represent the total population of entities
// for which the object can considered to be relevant.
Audience ItemCollection ` jsonld:"audience,omitempty" `
// Content or textual representation of the Activity Pub Object encoded as a JSON string.
// By default, the value of content is HTML.
// The mediaType property can be used in the object to indicate a different content type.
// (The content MAY be expressed using multiple language-tagged values.)
Content NaturalLanguageValues ` jsonld:"content,omitempty,collapsible" `
// Context identifies the context within which the object exists or an activity was performed.
// The notion of "context" used is intentionally vague.
// The intended function is to serve as a means of grouping objects and activities that share a
// common originating context or purpose. An example could be all activities relating to a common project or event.
Context Item ` jsonld:"context,omitempty" `
// MediaType when used on an Object, identifies the MIME media type of the value of the content property.
// If not specified, the content property is assumed to contain text/html content.
MediaType MimeType ` jsonld:"mediaType,omitempty" `
// EndTime the date and time describing the actual or expected ending time of the object.
// When used with an Activity object, for instance, the endTime property specifies the moment
// the activity concluded or is expected to conclude.
EndTime time . Time ` jsonld:"endTime,omitempty" `
// Generator identifies the entity (e.g. an application) that generated the object.
Generator Item ` jsonld:"generator,omitempty" `
// Icon indicates an entity that describes an icon for this object.
// The image should have an aspect ratio of one (horizontal) to one (vertical)
// and should be suitable for presentation at a small size.
Icon Item ` jsonld:"icon,omitempty" `
// Image indicates an entity that describes an image for this object.
// Unlike the icon property, there are no aspect ratio or display size limitations assumed.
Image Item ` jsonld:"image,omitempty" `
// InReplyTo indicates one or more entities for which this object is considered a response.
InReplyTo Item ` jsonld:"inReplyTo,omitempty" `
// Location indicates one or more physical or logical locations associated with the object.
Location Item ` jsonld:"location,omitempty" `
// Preview identifies an entity that provides a preview of this object.
Preview Item ` jsonld:"preview,omitempty" `
// Published the date and time at which the object was published
Published time . Time ` jsonld:"published,omitempty" `
// Replies identifies a Collection containing objects considered to be responses to this object.
Replies Item ` jsonld:"replies,omitempty" `
// StartTime the date and time describing the actual or expected starting time of the object.
// When used with an Activity object, for instance, the startTime property specifies
// the moment the activity began or is scheduled to begin.
StartTime time . Time ` jsonld:"startTime,omitempty" `
// Summary a natural language summarization of the object encoded as HTML.
// *Multiple language tagged summaries may be provided.)
Summary NaturalLanguageValues ` jsonld:"summary,omitempty,collapsible" `
// Tag one or more "tags" that have been associated with an objects. A tag can be any kind of Activity Pub Object.
// The key difference between attachment and tag is that the former implies association by inclusion,
// while the latter implies associated by reference.
Tag ItemCollection ` jsonld:"tag,omitempty" `
// Updated the date and time at which the object was updated
Updated time . Time ` jsonld:"updated,omitempty" `
// URL identifies one or more links to representations of the object
URL LinkOrIRI ` jsonld:"url,omitempty" `
// To identifies an entity considered to be part of the public primary audience of an Activity Pub Object
To ItemCollection ` jsonld:"to,omitempty" `
// Bto identifies anActivity Pub Object that is part of the private primary audience of this Activity Pub Object.
Bto ItemCollection ` jsonld:"bto,omitempty" `
// CC identifies anActivity Pub Object that is part of the public secondary audience of this Activity Pub Object.
CC ItemCollection ` jsonld:"cc,omitempty" `
// BCC identifies one or more Objects that are part of the private secondary audience of this Activity Pub Object.
BCC ItemCollection ` jsonld:"bcc,omitempty" `
// Duration when the object describes a time-bound resource, such as an audio or video, a meeting, etc,
// the duration property indicates the object's approximate duration.
// The value must be expressed as an xsd:duration as defined by [ xmlschema11-2],
// section 3.3.6 (e.g. a period of 5 seconds is represented as "PT5S").
Duration time . Duration ` jsonld:"duration,omitempty" `
2019-12-03 19:50:26 +00:00
// This is a list of all Like activities with this object as the object property, added as a side effect.
// The likes collection MUST be either an OrderedCollection or a Collection and MAY be filtered on privileges
// of an authenticated user or as appropriate when no authentication is given.
Likes Item ` jsonld:"likes,omitempty" `
// This is a list of all Announce activities with this object as the object property, added as a side effect.
// The shares collection MUST be either an OrderedCollection or a Collection and MAY be filtered on privileges
// of an authenticated user or as appropriate when no authentication is given.
Shares Item ` jsonld:"shares,omitempty" `
// Source property is intended to convey some sort of source from which the content markup was derived,
// as a form of provenance, or to support future editing by clients.
// In general, clients do the conversion from source to content, not the other way around.
Source Source ` jsonld:"source,omitempty" `
2019-12-03 16:23:59 +00:00
// CanReceiveActivities describes one or more entities that either performed or are expected to perform the activity.
2018-07-18 15:39:27 +00:00
// Any single activity can have multiple actors. The actor may be specified using an indirect Link.
2018-10-04 18:33:32 +00:00
Actor Item ` jsonld:"actor,omitempty" `
2018-10-24 09:28:55 +00:00
// Target describes the indirect object, or target, of the activity.
2017-09-16 17:53:11 +00:00
// The precise meaning of the target is largely dependent on the type of action being described
2018-10-18 09:48:02 +00:00
// but will often be the object of the English preposition "to".
2017-09-16 17:53:11 +00:00
// For instance, in the activity "John added a movie to his wishlist",
2018-10-18 09:48:02 +00:00
// the target of the activity is John's wishlist. An activity can have more than one target.
2018-10-04 18:33:32 +00:00
Target Item ` jsonld:"target,omitempty" `
2018-10-24 09:28:55 +00:00
// Result describes the result of the activity. For instance, if a particular action results in the creation
2018-10-18 09:48:02 +00:00
// of a new resource, the result property can be used to describe that new resource.
2018-10-04 18:33:32 +00:00
Result Item ` jsonld:"result,omitempty" `
2018-10-24 09:28:55 +00:00
// Origin describes an indirect object of the activity from which the activity is directed.
2017-09-16 17:53:11 +00:00
// The precise meaning of the origin is the object of the English preposition "from".
// For instance, in the activity "John moved an item to List B from List A", the origin of the activity is "List A".
2018-10-04 18:33:32 +00:00
Origin Item ` jsonld:"origin,omitempty" `
2018-10-24 09:28:55 +00:00
// Instrument identifies one or more objects used (or to be used) in the completion of an Activity.
Instrument Item ` jsonld:"instrument,omitempty" `
// Object When used within an Activity, describes the direct object of the activity.
2017-09-12 15:46:43 +00:00
// For instance, in the activity "John added a movie to his wishlist",
2018-10-18 09:48:02 +00:00
// the object of the activity is the movie added.
2017-09-12 15:46:43 +00:00
// When used within a Relationship describes the entity to which the subject is related.
2018-10-04 18:33:32 +00:00
Object Item ` jsonld:"object,omitempty" `
2017-09-11 21:10:56 +00:00
}
2019-12-03 14:27:57 +00:00
// GetType returns the ActivityVocabulary type of the current Activity
func ( a Activity ) GetType ( ) ActivityVocabularyType {
return a . Type
}
// IsLink returns false for Activity objects
func ( a Activity ) IsLink ( ) bool {
return false
}
2019-12-05 18:02:15 +00:00
// GetID returns the ID corresponding to the Activity object
func ( a Activity ) GetID ( ) ID {
2019-12-03 15:26:43 +00:00
return a . ID
2019-12-03 14:27:57 +00:00
}
// GetLink returns the IRI corresponding to the Activity object
func ( a Activity ) GetLink ( ) IRI {
return IRI ( a . ID )
}
// IsObject returns true for Activity objects
func ( a Activity ) IsObject ( ) bool {
return true
}
// IsCollection returns false for Activity objects
func ( a Activity ) IsCollection ( ) bool {
return false
}
2019-12-03 18:59:20 +00:00
func removeFromCollection ( col ItemCollection , items ... Item ) ItemCollection {
result := make ( ItemCollection , 0 )
if len ( items ) == 0 {
return col
}
for _ , ob := range col {
found := false
for _ , it := range items {
2021-01-01 12:59:01 +00:00
if ob . GetID ( ) . Equals ( it . GetID ( ) , false ) {
2019-12-03 18:59:20 +00:00
found = true
break
}
}
if ! found {
result = append ( result , ob )
}
}
return result
}
func removeFromAudience ( a * Activity , items ... Item ) error {
if a . To != nil {
a . To = removeFromCollection ( a . To , items ... )
}
if a . Bto != nil {
a . Bto = removeFromCollection ( a . Bto , items ... )
}
if a . CC != nil {
a . CC = removeFromCollection ( a . CC , items ... )
}
if a . BCC != nil {
a . BCC = removeFromCollection ( a . BCC , items ... )
}
if a . Audience != nil {
a . Audience = removeFromCollection ( a . Audience , items ... )
}
return nil
}
2019-12-03 14:27:57 +00:00
// Recipients performs recipient de-duplication on the Activity's To, Bto, CC and BCC properties
func ( a * Activity ) Recipients ( ) ItemCollection {
2019-12-03 18:59:20 +00:00
var alwaysRemove ItemCollection
if a . GetType ( ) == BlockType && a . Object != nil {
alwaysRemove = append ( alwaysRemove , a . Object )
}
2020-07-12 18:42:56 +00:00
if a . Actor != nil {
alwaysRemove = append ( alwaysRemove , a . Actor )
}
2019-12-03 18:59:20 +00:00
if len ( alwaysRemove ) > 0 {
removeFromAudience ( a , alwaysRemove ... )
}
2020-05-15 13:17:35 +00:00
return ItemCollectionDeduplication ( & a . To , & a . Bto , & a . CC , & a . BCC , & a . Audience )
2019-12-03 14:27:57 +00:00
}
// Clean removes Bto and BCC properties
func ( a * Activity ) Clean ( ) {
a . BCC = nil
a . Bto = nil
2020-02-09 07:32:57 +00:00
if a . Object != nil && a . Object . IsObject ( ) {
OnObject ( a . Object , func ( o * Object ) error {
o . Clean ( )
return nil
} )
}
if a . Actor != nil && a . Actor . IsObject ( ) {
OnObject ( a . Actor , func ( o * Object ) error {
o . Clean ( )
return nil
} )
}
if a . Target != nil && a . Target . IsObject ( ) {
OnObject ( a . Target , func ( o * Object ) error {
o . Clean ( )
return nil
} )
}
2018-06-09 12:05:46 +00:00
}
2017-09-16 17:53:11 +00:00
type (
2018-03-24 16:54:55 +00:00
// Accept indicates that the actor accepts the object. The target property can be used in certain circumstances to indicate
2018-10-18 09:48:02 +00:00
// the context into which the object has been accepted.
2019-12-01 18:36:46 +00:00
Accept = Activity
2017-09-12 16:53:41 +00:00
2018-03-24 16:54:55 +00:00
// Add indicates that the actor has added the object to the target. If the target property is not explicitly specified,
2018-10-18 09:48:02 +00:00
// the target would need to be determined implicitly by context.
2017-09-16 17:53:11 +00:00
// The origin can be used to identify the context from which the object originated.
2019-12-01 18:36:46 +00:00
Add = Activity
2017-09-12 16:53:41 +00:00
2018-03-24 16:54:55 +00:00
// Announce indicates that the actor is calling the target's attention the object.
2017-09-16 17:53:11 +00:00
// The origin typically has no defined meaning.
2019-12-01 18:36:46 +00:00
Announce = Activity
2017-09-12 16:53:41 +00:00
2018-03-24 16:54:55 +00:00
// Block indicates that the actor is blocking the object. Blocking is a stronger form of Ignore.
2017-09-16 17:53:11 +00:00
// The typical use is to support social systems that allow one user to block activities or content of other users.
// The target and origin typically have no defined meaning.
2019-12-01 18:36:46 +00:00
Block = Ignore
2017-09-12 16:53:41 +00:00
2018-03-24 16:54:55 +00:00
// Create indicates that the actor has created the object.
2019-12-01 18:36:46 +00:00
Create = Activity
2017-09-12 16:53:41 +00:00
2018-03-24 16:54:55 +00:00
// Delete indicates that the actor has deleted the object.
2017-09-16 17:53:11 +00:00
// If specified, the origin indicates the context from which the object was deleted.
2019-12-01 18:36:46 +00:00
Delete = Activity
2017-09-12 16:53:41 +00:00
2018-03-24 16:54:55 +00:00
// Dislike indicates that the actor dislikes the object.
2019-12-01 18:36:46 +00:00
Dislike = Activity
2017-09-12 16:53:41 +00:00
2018-03-24 16:54:55 +00:00
// Flag indicates that the actor is "flagging" the object.
2017-09-16 17:53:11 +00:00
// Flagging is defined in the sense common to many social platforms as reporting content as being
2018-10-18 09:48:02 +00:00
// inappropriate for any number of reasons.
2019-12-01 18:36:46 +00:00
Flag = Activity
2017-09-12 16:53:41 +00:00
2018-03-24 16:54:55 +00:00
// Follow indicates that the actor is "following" the object. Following is defined in the sense typically used within
2018-10-18 09:48:02 +00:00
// Social systems in which the actor is interested in any activity performed by or on the object.
2017-09-16 17:53:11 +00:00
// The target and origin typically have no defined meaning.
2019-12-01 18:36:46 +00:00
Follow = Activity
2017-09-12 16:53:41 +00:00
2018-03-24 16:54:55 +00:00
// Ignore indicates that the actor is ignoring the object. The target and origin typically have no defined meaning.
2019-12-01 18:36:46 +00:00
Ignore = Activity
2017-09-12 16:53:41 +00:00
2018-03-24 16:54:55 +00:00
// Invite is a specialization of Offer in which the actor is extending an invitation for the object to the target.
2019-12-01 18:36:46 +00:00
Invite = Offer
2017-09-12 16:53:41 +00:00
2018-03-24 16:54:55 +00:00
// Join indicates that the actor has joined the object. The target and origin typically have no defined meaning.
2019-12-01 18:36:46 +00:00
Join = Activity
2017-09-12 16:53:41 +00:00
2018-03-24 16:54:55 +00:00
// Leave indicates that the actor has left the object. The target and origin typically have no meaning.
2019-12-01 18:36:46 +00:00
Leave = Activity
2017-09-12 16:53:41 +00:00
2018-03-24 16:54:55 +00:00
// Like indicates that the actor likes, recommends or endorses the object.
2017-09-16 17:53:11 +00:00
// The target and origin typically have no defined meaning.
2019-12-01 18:36:46 +00:00
Like = Activity
2017-09-12 16:53:41 +00:00
2018-03-24 16:54:55 +00:00
// Listen inherits all properties from Activity.
2019-12-01 18:36:46 +00:00
Listen = Activity
2017-09-12 16:53:41 +00:00
2018-03-24 16:54:55 +00:00
// Move indicates that the actor has moved object from origin to target.
2017-09-16 17:53:11 +00:00
// If the origin or target are not specified, either can be determined by context.
2019-12-01 18:36:46 +00:00
Move = Activity
2017-09-12 16:53:41 +00:00
2018-03-24 16:54:55 +00:00
// Offer indicates that the actor is offering the object.
2017-09-16 17:53:11 +00:00
// If specified, the target indicates the entity to which the object is being offered.
2019-12-01 18:36:46 +00:00
Offer = Activity
2017-09-12 16:53:41 +00:00
2018-03-24 16:54:55 +00:00
// Reject indicates that the actor is rejecting the object. The target and origin typically have no defined meaning.
2019-12-01 18:36:46 +00:00
Reject = Activity
2017-09-12 16:53:41 +00:00
2018-03-24 16:54:55 +00:00
// Read indicates that the actor has read the object.
2019-12-01 18:36:46 +00:00
Read = Activity
2017-09-12 16:53:41 +00:00
2018-03-24 16:54:55 +00:00
// Remove indicates that the actor is removing the object. If specified,
2018-10-18 09:48:02 +00:00
// the origin indicates the context from which the object is being removed.
2019-12-01 18:36:46 +00:00
Remove = Activity
2017-09-12 16:53:41 +00:00
2018-03-24 16:54:55 +00:00
// TentativeReject is a specialization of Reject in which the rejection is considered tentative.
2019-12-01 18:36:46 +00:00
TentativeReject = Reject
2017-09-12 16:53:41 +00:00
2018-03-24 16:54:55 +00:00
// TentativeAccept is a specialization of Accept indicating that the acceptance is tentative.
2019-12-01 18:36:46 +00:00
TentativeAccept = Accept
2017-09-12 16:53:41 +00:00
2018-03-24 16:54:55 +00:00
// Undo indicates that the actor is undoing the object. In most cases, the object will be an Activity describing
2018-10-18 09:48:02 +00:00
// some previously performed action (for instance, a person may have previously "liked" an article but,
// for whatever reason, might choose to undo that like at some later point in time).
2017-09-16 17:53:11 +00:00
// The target and origin typically have no defined meaning.
2019-10-13 21:32:32 +00:00
Undo = Activity
2017-09-12 16:53:41 +00:00
2018-03-24 16:54:55 +00:00
// Update indicates that the actor has updated the object. Note, however, that this vocabulary does not define a mechanism
2018-10-18 09:48:02 +00:00
// for describing the actual set of modifications made to object.
2017-09-16 17:53:11 +00:00
// The target and origin typically have no defined meaning.
2019-12-01 18:36:46 +00:00
Update = Activity
2017-09-12 16:53:41 +00:00
2018-03-24 16:54:55 +00:00
// View indicates that the actor has viewed the object.
2019-12-01 18:36:46 +00:00
View = Activity
2017-09-16 17:53:11 +00:00
)
2017-09-12 16:53:41 +00:00
2018-03-25 18:54:51 +00:00
// AcceptNew initializes an Accept activity
2019-12-05 18:02:15 +00:00
func AcceptNew ( id ID , ob Item ) * Accept {
2017-10-03 20:46:03 +00:00
a := ActivityNew ( id , AcceptType , ob )
2017-09-12 16:53:41 +00:00
o := Accept ( * a )
return & o
}
2018-03-25 18:54:51 +00:00
// AddNew initializes an Add activity
2019-12-05 18:02:15 +00:00
func AddNew ( id ID , ob Item , trgt Item ) * Add {
2017-10-03 20:46:03 +00:00
a := ActivityNew ( id , AddType , ob )
2017-09-12 16:53:41 +00:00
o := Add ( * a )
2018-03-27 15:40:25 +00:00
o . Target = trgt
2017-09-12 16:53:41 +00:00
return & o
}
2018-03-25 18:54:51 +00:00
// AnnounceNew initializes an Announce activity
2019-12-05 18:02:15 +00:00
func AnnounceNew ( id ID , ob Item ) * Announce {
2017-10-03 20:46:03 +00:00
a := ActivityNew ( id , AnnounceType , ob )
2017-09-12 16:53:41 +00:00
o := Announce ( * a )
return & o
}
2018-03-25 18:54:51 +00:00
// BlockNew initializes a Block activity
2019-12-05 18:02:15 +00:00
func BlockNew ( id ID , ob Item ) * Block {
2017-10-03 20:46:03 +00:00
a := ActivityNew ( id , BlockType , ob )
2017-09-12 16:53:41 +00:00
o := Block ( * a )
return & o
}
2018-03-25 18:54:51 +00:00
// CreateNew initializes a Create activity
2019-12-05 18:02:15 +00:00
func CreateNew ( id ID , ob Item ) * Create {
2017-10-03 20:46:03 +00:00
a := ActivityNew ( id , CreateType , ob )
2017-09-12 16:53:41 +00:00
o := Create ( * a )
return & o
}
2018-03-25 18:54:51 +00:00
// DeleteNew initializes a Delete activity
2019-12-05 18:02:15 +00:00
func DeleteNew ( id ID , ob Item ) * Delete {
2017-10-03 20:46:03 +00:00
a := ActivityNew ( id , DeleteType , ob )
2017-09-12 16:53:41 +00:00
o := Delete ( * a )
return & o
}
2018-03-25 18:54:51 +00:00
// DislikeNew initializes a Dislike activity
2019-12-05 18:02:15 +00:00
func DislikeNew ( id ID , ob Item ) * Dislike {
2017-10-03 20:46:03 +00:00
a := ActivityNew ( id , DislikeType , ob )
2017-09-12 16:53:41 +00:00
o := Dislike ( * a )
return & o
}
2018-03-25 18:54:51 +00:00
// FlagNew initializes a Flag activity
2019-12-05 18:02:15 +00:00
func FlagNew ( id ID , ob Item ) * Flag {
2017-10-03 20:46:03 +00:00
a := ActivityNew ( id , FlagType , ob )
2017-09-12 16:53:41 +00:00
o := Flag ( * a )
return & o
}
2018-03-25 18:54:51 +00:00
// FollowNew initializes a Follow activity
2019-12-05 18:02:15 +00:00
func FollowNew ( id ID , ob Item ) * Follow {
2017-10-03 20:46:03 +00:00
a := ActivityNew ( id , FollowType , ob )
2017-09-12 16:53:41 +00:00
o := Follow ( * a )
return & o
}
2018-03-25 18:54:51 +00:00
// IgnoreNew initializes an Ignore activity
2019-12-05 18:02:15 +00:00
func IgnoreNew ( id ID , ob Item ) * Ignore {
2017-10-03 20:46:03 +00:00
a := ActivityNew ( id , IgnoreType , ob )
2017-09-12 16:53:41 +00:00
o := Ignore ( * a )
return & o
}
2018-03-25 18:54:51 +00:00
// InviteNew initializes an Invite activity
2019-12-05 18:02:15 +00:00
func InviteNew ( id ID , ob Item ) * Invite {
2017-10-03 20:46:03 +00:00
a := ActivityNew ( id , InviteType , ob )
2017-09-12 16:53:41 +00:00
o := Invite ( * a )
return & o
}
2018-03-25 18:54:51 +00:00
// JoinNew initializes a Join activity
2019-12-05 18:02:15 +00:00
func JoinNew ( id ID , ob Item ) * Join {
2017-10-03 20:46:03 +00:00
a := ActivityNew ( id , JoinType , ob )
2017-09-12 16:53:41 +00:00
o := Join ( * a )
return & o
}
2018-03-25 18:54:51 +00:00
// LeaveNew initializes a Leave activity
2019-12-05 18:02:15 +00:00
func LeaveNew ( id ID , ob Item ) * Leave {
2017-10-03 20:46:03 +00:00
a := ActivityNew ( id , LeaveType , ob )
2017-09-12 16:53:41 +00:00
o := Leave ( * a )
return & o
}
2018-03-25 18:54:51 +00:00
// LikeNew initializes a Like activity
2019-12-05 18:02:15 +00:00
func LikeNew ( id ID , ob Item ) * Like {
2017-10-03 20:46:03 +00:00
a := ActivityNew ( id , LikeType , ob )
2017-09-12 16:53:41 +00:00
o := Like ( * a )
return & o
}
2018-03-25 18:54:51 +00:00
// ListenNew initializes a Listen activity
2019-12-05 18:02:15 +00:00
func ListenNew ( id ID , ob Item ) * Listen {
2017-10-03 20:46:03 +00:00
a := ActivityNew ( id , ListenType , ob )
2017-09-12 16:53:41 +00:00
o := Listen ( * a )
return & o
}
2018-03-25 18:54:51 +00:00
// MoveNew initializes a Move activity
2019-12-05 18:02:15 +00:00
func MoveNew ( id ID , ob Item ) * Move {
2017-10-03 20:46:03 +00:00
a := ActivityNew ( id , MoveType , ob )
2017-09-12 16:53:41 +00:00
o := Move ( * a )
return & o
}
2018-03-25 18:54:51 +00:00
// OfferNew initializes an Offer activity
2019-12-05 18:02:15 +00:00
func OfferNew ( id ID , ob Item ) * Offer {
2017-10-03 20:46:03 +00:00
a := ActivityNew ( id , OfferType , ob )
2017-09-12 16:53:41 +00:00
o := Offer ( * a )
return & o
}
2018-03-25 18:54:51 +00:00
// RejectNew initializes a Reject activity
2019-12-05 18:02:15 +00:00
func RejectNew ( id ID , ob Item ) * Reject {
2017-10-03 20:46:03 +00:00
a := ActivityNew ( id , RejectType , ob )
2017-09-12 16:53:41 +00:00
o := Reject ( * a )
return & o
}
2018-03-25 18:54:51 +00:00
// ReadNew initializes a Read activity
2019-12-05 18:02:15 +00:00
func ReadNew ( id ID , ob Item ) * Read {
2017-10-03 20:46:03 +00:00
a := ActivityNew ( id , ReadType , ob )
2017-09-12 16:53:41 +00:00
o := Read ( * a )
return & o
}
2018-03-25 18:54:51 +00:00
// RemoveNew initializes a Remove activity
2019-12-05 18:02:15 +00:00
func RemoveNew ( id ID , ob Item , trgt Item ) * Remove {
2017-10-03 20:46:03 +00:00
a := ActivityNew ( id , RemoveType , ob )
2017-09-12 16:53:41 +00:00
o := Remove ( * a )
2018-03-27 15:40:25 +00:00
o . Target = trgt
2017-09-12 16:53:41 +00:00
return & o
}
2018-03-25 18:54:51 +00:00
// TentativeRejectNew initializes a TentativeReject activity
2019-12-05 18:02:15 +00:00
func TentativeRejectNew ( id ID , ob Item ) * TentativeReject {
2017-10-03 20:46:03 +00:00
a := ActivityNew ( id , TentativeRejectType , ob )
2017-09-12 16:53:41 +00:00
o := TentativeReject ( * a )
return & o
}
2018-03-25 18:54:51 +00:00
// TentativeAcceptNew initializes a TentativeAccept activity
2019-12-05 18:02:15 +00:00
func TentativeAcceptNew ( id ID , ob Item ) * TentativeAccept {
2017-10-03 20:46:03 +00:00
a := ActivityNew ( id , TentativeAcceptType , ob )
2017-09-12 16:53:41 +00:00
o := TentativeAccept ( * a )
return & o
}
2018-03-25 18:54:51 +00:00
// UndoNew initializes an Undo activity
2019-12-05 18:02:15 +00:00
func UndoNew ( id ID , ob Item ) * Undo {
2017-10-03 20:46:03 +00:00
a := ActivityNew ( id , UndoType , ob )
2017-09-12 16:53:41 +00:00
o := Undo ( * a )
return & o
}
2018-03-25 18:54:51 +00:00
// UpdateNew initializes an Update activity
2019-12-05 18:02:15 +00:00
func UpdateNew ( id ID , ob Item ) * Update {
2017-10-03 20:46:03 +00:00
a := ActivityNew ( id , UpdateType , ob )
2018-10-02 09:22:38 +00:00
u := Update ( * a )
return & u
2017-09-12 16:53:41 +00:00
}
2018-03-25 18:54:51 +00:00
// ViewNew initializes a View activity
2019-12-05 18:02:15 +00:00
func ViewNew ( id ID , ob Item ) * View {
2017-10-03 20:46:03 +00:00
a := ActivityNew ( id , ViewType , ob )
2017-09-12 16:53:41 +00:00
o := View ( * a )
return & o
}
2018-03-25 18:54:51 +00:00
// ActivityNew initializes a basic activity
2019-12-05 18:02:15 +00:00
func ActivityNew ( id ID , typ ActivityVocabularyType , ob Item ) * Activity {
2019-05-16 09:08:27 +00:00
if ! ActivityTypes . Contains ( typ ) {
2018-06-09 12:05:46 +00:00
typ = ActivityType
2017-09-11 21:10:56 +00:00
}
2019-12-03 14:27:57 +00:00
a := Activity { ID : id , Type : typ }
2019-02-21 16:54:11 +00:00
a . Name = NaturalLanguageValuesNew ( )
a . Content = NaturalLanguageValuesNew ( )
2017-09-12 15:26:37 +00:00
2017-10-03 20:46:03 +00:00
a . Object = ob
return & a
2017-09-12 15:26:37 +00:00
}
2021-11-12 18:10:31 +00:00
// UnmarshalJSON decodes an incoming JSON document into the receiver object.
2018-08-31 15:55:41 +00:00
func ( a * Activity ) UnmarshalJSON ( data [ ] byte ) error {
2021-08-15 11:41:01 +00:00
p := fastjson . Parser { }
val , err := p . ParseBytes ( data )
if err != nil {
return err
}
return loadActivity ( val , a )
2018-08-31 15:55:41 +00:00
}
2018-10-11 09:26:00 +00:00
2019-05-04 22:52:14 +00:00
// ToActivity
2019-05-07 21:11:15 +00:00
func ToActivity ( it Item ) ( * Activity , error ) {
2019-05-04 22:52:14 +00:00
switch i := it . ( type ) {
case * Activity :
2019-05-07 21:11:15 +00:00
return i , nil
2019-05-04 22:52:14 +00:00
case Activity :
2019-05-07 21:11:15 +00:00
return & i , nil
2019-12-03 11:47:27 +00:00
case * IntransitiveActivity :
return ( * Activity ) ( unsafe . Pointer ( i ) ) , nil
case IntransitiveActivity :
return ( * Activity ) ( unsafe . Pointer ( & i ) ) , nil
case * Question :
return ( * Activity ) ( unsafe . Pointer ( i ) ) , nil
case Question :
return ( * Activity ) ( unsafe . Pointer ( & i ) ) , nil
2020-07-16 19:54:46 +00:00
default :
// NOTE(marius): this is an ugly way of dealing with the interface conversion error: types from different scopes
typ := reflect . TypeOf ( new ( Activity ) )
if reflect . TypeOf ( it ) . ConvertibleTo ( typ ) {
if i , ok := reflect . ValueOf ( it ) . Convert ( typ ) . Interface ( ) . ( * Activity ) ; ok {
return i , nil
}
}
2019-05-04 22:52:14 +00:00
}
2019-05-07 21:11:15 +00:00
return nil , errors . New ( "unable to convert activity" )
2019-05-04 22:52:14 +00:00
}
2019-05-11 08:31:19 +00:00
2021-11-12 18:10:31 +00:00
// MarshalJSON encodes the receiver object to a JSON document.
2019-12-18 16:34:47 +00:00
func ( a Activity ) MarshalJSON ( ) ( [ ] byte , error ) {
2019-12-19 16:05:12 +00:00
b := make ( [ ] byte , 0 )
write ( & b , '{' )
2019-12-18 16:34:47 +00:00
2021-01-01 12:59:01 +00:00
if ! writeActivityJSONValue ( & b , a ) {
2019-12-18 16:34:47 +00:00
return nil , nil
}
2019-12-19 16:05:12 +00:00
write ( & b , '}' )
return b , nil
2019-12-18 16:34:47 +00:00
}
2020-05-07 14:44:17 +00:00
2021-04-02 11:52:04 +00:00
/ *
2021-03-14 18:36:32 +00:00
// UnmarshalBinary implements the encoding.BinaryUnmarshaler interface.
func ( a * Activity ) UnmarshalBinary ( data [ ] byte ) error {
return errors . New ( fmt . Sprintf ( "UnmarshalBinary is not implemented for %T" , * a ) )
}
// MarshalBinary implements the encoding.BinaryMarshaler interface.
func ( a Activity ) MarshalBinary ( ) ( [ ] byte , error ) {
return nil , errors . New ( fmt . Sprintf ( "MarshalBinary is not implemented for %T" , a ) )
}
// GobEncode
func ( a Activity ) GobEncode ( ) ( [ ] byte , error ) {
return nil , errors . New ( fmt . Sprintf ( "GobEncode is not implemented for %T" , a ) )
}
// GobDecode
func ( a * Activity ) GobDecode ( [ ] byte ) error {
return errors . New ( fmt . Sprintf ( "GobDecode is not implemented for %T" , * a ) )
}
2021-11-12 17:26:50 +00:00
* /
2021-03-14 18:36:32 +00:00
2020-05-07 14:44:17 +00:00
// Equals verifies if our receiver Object is equals with the "with" Object
func ( a Activity ) Equals ( with Item ) bool {
result := true
OnActivity ( with , func ( w * Activity ) error {
OnObject ( a , func ( o * Object ) error {
result = o . Equals ( w )
return nil
} )
if w . Object != nil {
if ! ItemsEqual ( a . Object , w . Object ) {
result = false
return nil
}
}
if w . Actor != nil {
if ! ItemsEqual ( a . Actor , w . Actor ) {
result = false
return nil
}
}
if w . Target != nil {
if ! ItemsEqual ( a . Target , w . Target ) {
result = false
return nil
}
}
if w . Result != nil {
if ! ItemsEqual ( a . Result , w . Result ) {
result = false
return nil
}
}
if w . Origin != nil {
if ! ItemsEqual ( a . Origin , w . Origin ) {
result = false
return nil
}
}
if w . Result != nil {
if ! ItemsEqual ( a . Result , w . Result ) {
result = false
return nil
}
}
if w . Instrument != nil {
if ! ItemsEqual ( a . Instrument , w . Instrument ) {
result = false
return nil
}
}
return nil
} )
return result
}