PluginProbe
ActivityPub / 1.0.0
ActivityPub v1.0.0
9.3.1 9.3.0 9.2.2 9.2.1 9.2.0 9.1.0 9.0.2 9.0.1 9.0.0 8.3.0 8.2.1 8.2.0 8.1.1 1.0.5 1.0.6 1.0.7 1.0.8 1.0.9 1.1.0 1.2.0 1.3.0 2.0.0 2.0.1 2.1.0 2.1.1 All 160 releases
← All changes | includes/activity/class-activity.php +82 -180 8.3.01.0.0 View file →
@@ -2,16 +2,13 @@
2 2 /**
3 3 * Inspired by the PHP ActivityPub Library by @Landrok
4 4 *
5 5 * @link https://github.com/landrok/activitypub
6 - *
7 - * @package Activitypub
8 6 */
9 7
10 8 namespace Activitypub\Activity;
11 9
12 -use Activitypub\Activity\Extended_Object\Event;
13 -use Activitypub\Activity\Extended_Object\Place;
10 +use Activitypub\Activity\Base_Object;
14 11
15 12 /**
16 13 * \Activitypub\Activity\Activity implements the common
17 14 * attributes of an Activity.
@@ -17,77 +14,72 @@
17 14 * attributes of an Activity.
18 15 *
19 16 * @see https://www.w3.org/TR/activitystreams-core/#activities
20 17 * @see https://www.w3.org/TR/activitystreams-core/#intransitiveactivities
21 - *
22 - * @method string|array get_actor() Gets one or more entities that performed or are expected to perform the activity.
23 - * @method string|array|null get_instrument() Gets one or more objects used in the completion of an Activity.
24 - * @method Base_Object|string|array|null get_object() Gets the direct object of the activity.
25 - * @method string|string[]|null get_origin() Gets the origin property of the activity.
26 - * @method array|null get_replies() Gets the collection of responses to this activity.
27 - * @method string|null get_result() Gets the result property of the activity.
28 - * @method string|string[]|null get_target() Gets the target property of the activity.
29 - *
30 - * @method Activity set_actor( string|array $actor ) Sets one or more entities that performed the activity.
31 - * @method Activity set_instrument( string|array $instrument ) Sets one or more objects used in the completion of an Activity.
32 - * @method Activity set_origin( string|array|null $origin ) Sets the origin property of the activity.
33 - * @method Activity set_replies( array $replies ) Sets the collection of responses to this activity.
34 - * @method Activity set_result( string|null $result ) Sets the result property of the activity.
35 - * @method Activity set_target( string|array|null $target ) Sets the target property of the activity.
36 18 */
37 19 class Activity extends Base_Object {
38 - const JSON_LD_CONTEXT = array(
20 + const CONTEXT = array(
39 21 'https://www.w3.org/ns/activitystreams',
22 + 'https://w3id.org/security/v1',
40 23 array(
41 - 'toot' => 'http://joinmastodon.org/ns#',
42 - 'QuoteRequest' => 'toot:QuoteRequest',
24 + 'manuallyApprovesFollowers' => 'as:manuallyApprovesFollowers',
25 + 'PropertyValue' => 'schema:PropertyValue',
26 + 'schema' => 'http://schema.org#',
27 + 'pt' => 'https://joinpeertube.org/ns#',
28 + 'toot' => 'http://joinmastodon.org/ns#',
29 + 'webfinger' => 'https://webfinger.net/#',
30 + 'litepub' => 'http://litepub.social/ns#',
31 + 'value' => 'schema:value',
32 + 'Hashtag' => 'as:Hashtag',
33 + 'featured' => array(
34 + '@id' => 'toot:featured',
35 + '@type' => '@id',
36 + ),
37 + 'featuredTags' => array(
38 + '@id' => 'toot:featuredTags',
39 + '@type' => '@id',
40 + ),
41 + 'alsoKnownAs' => array(
42 + '@id' => 'as:alsoKnownAs',
43 + '@type' => '@id',
44 + ),
45 + 'discoverable' => 'toot:discoverable',
46 + 'sensitive' => 'as:sensitive',
47 + 'resource' => 'webfinger:resource',
43 48 ),
44 49 );
45 50
46 51 /**
47 - * The default types for Activities.
52 + * The object's unique global identifier
48 53 *
49 - * @see https://www.w3.org/TR/activitystreams-vocabulary/#activity-types
54 + * @see https://www.w3.org/TR/activitypub/#obj-id
50 55 *
51 - * @var array
56 + * @var string
52 57 */
53 - const TYPES = array(
54 - 'Accept',
55 - 'Add',
56 - 'Announce',
57 - 'Arrive',
58 - 'Block',
59 - 'Create',
60 - 'Delete',
61 - 'Dislike',
62 - 'Follow',
63 - 'Flag',
64 - 'Ignore',
65 - 'Invite',
66 - 'Join',
67 - 'Leave',
68 - 'Like',
69 - 'Listen',
70 - 'Move',
71 - 'Offer',
72 - 'QuoteRequest', // @see https://codeberg.org/fediverse/fep/src/branch/main/fep/044f/fep-044f.md
73 - 'Read',
74 - 'Reject',
75 - 'Remove',
76 - 'TentativeAccept',
77 - 'TentativeReject',
78 - 'Travel',
79 - 'Undo',
80 - 'Update',
81 - 'View',
82 - );
58 + protected $id;
83 59
84 60 /**
85 - * The type of the object.
61 + * @var string
62 + */
63 + protected $type = 'Activity';
64 +
65 + /**
66 + * The context within which the object exists or an activity was
67 + * performed.
68 + * The notion of "context" used is intentionally vague.
69 + * The intended function is to serve as a means of grouping objects
70 + * and activities that share a common originating context or
71 + * purpose. An example could be all activities relating to a common
72 + * project or event.
86 73 *
74 + * @see https://www.w3.org/TR/activitystreams-vocabulary/#dfn-context
75 + *
87 76 * @var string
77 + * | ObjectType
78 + * | Link
79 + * | null
88 80 */
89 - protected $type = 'Activity';
81 + protected $context = self::CONTEXT;
90 82
91 83 /**
92 84 * Describes the direct object of the activity.
93 85 * For instance, in the activity "John added a movie to his
@@ -94,9 +86,12 @@
94 86 * wishlist", the object of the activity is the movie added.
95 87 *
96 88 * @see https://www.w3.org/TR/activitystreams-vocabulary/#dfn-object-term
97 89 *
98 - * @var string|Base_Object|array|null
90 + * @var string
91 + * | Base_Objectr
92 + * | Link
93 + * | null
99 94 */
100 95 protected $object;
101 96
102 97 /**
@@ -106,9 +101,13 @@
106 101 * The actor MAY be specified using an indirect Link.
107 102 *
108 103 * @see https://www.w3.org/TR/activitystreams-vocabulary/#dfn-actor
109 104 *
110 - * @var string|array
105 + * @var string
106 + * | \ActivityPhp\Type\Extended\AbstractActor
107 + * | array<Actor>
108 + * | array<Link>
109 + * | Link
111 110 */
112 111 protected $actor;
113 112
114 113 /**
@@ -121,9 +120,13 @@
121 120 * An activity can have more than one target.
122 121 *
123 122 * @see https://www.w3.org/TR/activitystreams-vocabulary/#dfn-target
124 123 *
125 - * @var string|array|null
124 + * @var string
125 + * | ObjectType
126 + * | array<ObjectType>
127 + * | Link
128 + * | array<Link>
126 129 */
127 130 protected $target;
128 131
129 132 /**
@@ -133,25 +136,16 @@
133 136 * that new resource.
134 137 *
135 138 * @see https://www.w3.org/TR/activitystreams-vocabulary/#dfn-result
136 139 *
137 - * @var string|Base_Object|null
140 + * @var string
141 + * | ObjectType
142 + * | Link
143 + * | null
138 144 */
139 145 protected $result;
140 146
141 147 /**
142 - * Identifies a Collection containing objects considered to be responses
143 - * to this object.
144 - * WordPress has a strong core system of approving replies. We only include
145 - * approved replies here.
146 - *
147 - * @see https://www.w3.org/TR/activitystreams-vocabulary/#dfn-replies
148 - *
149 - * @var array|null
150 - */
151 - protected $replies;
152 -
153 - /**
154 148 * An indirect object of the activity from which the
155 149 * activity is directed.
156 150 * The precise meaning of the origin is the object of the English
157 151 * preposition "from".
@@ -159,9 +153,12 @@
159 153 * from List A", the origin of the activity is "List A".
160 154 *
161 155 * @see https://www.w3.org/TR/activitystreams-vocabulary/#dfn-origin
162 156 *
163 - * @var string|array|null
157 + * @var string
158 + * | ObjectType
159 + * | Link
160 + * | null
164 161 */
165 162 protected $origin;
166 163
167 164 /**
@@ -169,9 +166,12 @@
169 166 * Activity.
170 167 *
171 168 * @see https://www.w3.org/TR/activitystreams-vocabulary/#dfn-instrument
172 169 *
173 - * @var string|array|null
170 + * @var string
171 + * | ObjectType
172 + * | Link
173 + * | null
174 174 */
175 175 protected $instrument;
176 176
177 177 /**
@@ -177,53 +177,25 @@
177 177 /**
178 178 * Set the object and copy Object properties to the Activity.
179 179 *
180 180 * Any to, bto, cc, bcc, and audience properties specified on the object
181 - * MUST be copied over to the new "Create" activity by the server.
181 + * MUST be copied over to the new Create activity by the server.
182 182 *
183 183 * @see https://www.w3.org/TR/activitypub/#object-without-create
184 184 *
185 - * @param array|string|Base_Object|Activity|Actor|null $data Activity object.
185 + * @param string|Base_Objectr|Link|null $object
186 + *
187 + * @return void
186 188 */
187 - public function set_object( $data ) {
188 - $object = $data;
189 -
190 - // Convert array to appropriate object type.
191 - if ( is_array( $data ) ) {
192 - if ( array_is_list( $data ) ) {
193 - $object = array_map( array( $this, 'maybe_convert_to_object' ), $data );
194 - } else {
195 - $object = $this->maybe_convert_to_object( $data );
196 - }
197 - }
198 -
189 + public function set_object( $object ) {
199 190 $this->set( 'object', $object );
200 - $this->pre_fill_activity_from_object();
201 - }
202 191
203 - /**
204 - * Fills the Activity with the specified activity object.
205 - */
206 - public function pre_fill_activity_from_object() {
207 - $object = $this->get_object();
208 -
209 - // Check if `$object` is a URL and use it to generate an ID then.
210 - if ( is_string( $object ) && filter_var( $object, FILTER_VALIDATE_URL ) && ! $this->get_id() ) {
211 - $this->set( 'id', $object . '#activity-' . strtolower( $this->get_type() ) . '-' . time() );
212 -
213 - return;
214 - }
215 -
216 - // Check if `$object` is an object and copy some properties otherwise do nothing.
217 192 if ( ! is_object( $object ) ) {
218 193 return;
219 194 }
220 195
221 196 foreach ( array( 'to', 'bto', 'cc', 'bcc', 'audience' ) as $i ) {
222 - $value = $object->get( $i );
223 - if ( $value && ! $this->get( $i ) ) {
224 - $this->set( $i, $value );
225 - }
197 + $this->set( $i, $object->get( $i ) );
226 198 }
227 199
228 200 if ( $object->get_published() && ! $this->get_published() ) {
229 201 $this->set( 'published', $object->get_published() );
@@ -236,79 +208,9 @@
236 208 if ( $object->get_attributed_to() && ! $this->get_actor() ) {
237 209 $this->set( 'actor', $object->get_attributed_to() );
238 210 }
239 211
240 - if ( $this->get_type() !== 'Announce' && $object->get_in_reply_to() && ! $this->get_in_reply_to() ) {
241 - $this->set( 'in_reply_to', $object->get_in_reply_to() );
242 - }
243 -
244 - if ( $object->get_interaction_policy() && ! $this->get_interaction_policy() ) {
245 - $this->set( 'interaction_policy', $object->get_interaction_policy() );
246 - }
247 -
248 212 if ( $object->get_id() && ! $this->get_id() ) {
249 - $id = strtok( $object->get_id(), '#' );
250 - if ( $object->get_updated() ) {
251 - $updated = $object->get_updated();
252 - } elseif ( $object->get_published() ) {
253 - $updated = $object->get_published();
254 - } else {
255 - $updated = time();
256 - }
257 - $this->set( 'id', $id . '#activity-' . strtolower( $this->get_type() ) . '-' . $updated );
213 + $this->set( 'id', $object->get_id() . '#activity' );
258 214 }
259 - }
260 -
261 - /**
262 - * The context of an Activity is usually just the context of the object it contains.
263 - *
264 - * @return array $context A compacted JSON-LD context.
265 - */
266 - public function get_json_ld_context() {
267 - if ( \is_object( $this->object ) ) {
268 - $class = get_class( $this->object );
269 - if ( $class && $class::JSON_LD_CONTEXT ) {
270 - // Without php 5.6 support this could be just: 'return $this->object::JSON_LD_CONTEXT;'.
271 - return $class::JSON_LD_CONTEXT;
272 - }
273 - }
274 -
275 - return static::JSON_LD_CONTEXT;
276 - }
277 -
278 - /**
279 - * Convert data to the appropriate object type if it has an ActivityPub type.
280 - *
281 - * @param array|string|Base_Object|Activity|Actor|null $data The data to convert.
282 - *
283 - * @return Activity|Actor|Base_Object|Generic_Object|string|\WP_Error|null The converted object or original data.
284 - */
285 - private function maybe_convert_to_object( $data ) {
286 - if ( ! is_array( $data ) ) {
287 - return $data;
288 - }
289 -
290 - $type = $data['type'] ?? null;
291 -
292 - if ( in_array( $type, self::TYPES, true ) ) {
293 - $object = self::init_from_array( $data );
294 - } elseif ( in_array( $type, Actor::TYPES, true ) ) {
295 - $object = Actor::init_from_array( $data );
296 - } elseif ( in_array( $type, Base_Object::TYPES, true ) ) {
297 - switch ( $type ) {
298 - case 'Event':
299 - $object = Event::init_from_array( $data );
300 - break;
301 - case 'Place':
302 - $object = Place::init_from_array( $data );
303 - break;
304 - default:
305 - $object = Base_Object::init_from_array( $data );
306 - break;
307 - }
308 - } else {
309 - $object = Generic_Object::init_from_array( $data );
310 - }
311 -
312 - return $object;
313 215 }
314 216 }