99
1010namespace Activitypub \Activity ;
1111
12- use Activitypub \Link ;
12+ use Activitypub \Activity \Extended_Object \Event ;
13+ use Activitypub \Activity \Extended_Object \Place ;
1314
1415/**
1516 * \Activitypub\Activity\Activity implements the common
@@ -23,6 +24,43 @@ class Activity extends Base_Object {
2324 'https://www.w3.org/ns/activitystreams ' ,
2425 );
2526
27+ /**
28+ * The default types for Activities.
29+ *
30+ * @see https://www.w3.org/TR/activitystreams-vocabulary/#activity-types
31+ *
32+ * @var array
33+ */
34+ const DEFAULT_TYPES = array (
35+ 'Accept ' ,
36+ 'Add ' ,
37+ 'Announce ' ,
38+ 'Arrive ' ,
39+ 'Block ' ,
40+ 'Create ' ,
41+ 'Delete ' ,
42+ 'Dislike ' ,
43+ 'Follow ' ,
44+ 'Flag ' ,
45+ 'Ignore ' ,
46+ 'Invite ' ,
47+ 'Join ' ,
48+ 'Leave ' ,
49+ 'Like ' ,
50+ 'Listen ' ,
51+ 'Move ' ,
52+ 'Offer ' ,
53+ 'Read ' ,
54+ 'Reject ' ,
55+ 'Remove ' ,
56+ 'TentativeAccept ' ,
57+ 'TentativeReject ' ,
58+ 'Travel ' ,
59+ 'Undo ' ,
60+ 'Update ' ,
61+ 'View ' ,
62+ );
63+
2664 /**
2765 * The type of the object.
2866 *
@@ -124,58 +162,85 @@ class Activity extends Base_Object {
124162 *
125163 * @see https://www.w3.org/TR/activitypub/#object-without-create
126164 *
127- * @param array|string|Base_Object|Link|null $data Activity object.
165+ * @param array|string|Base_Object|Activity|Actor|null $data Activity object.
166+ * @param bool $pre_fill Whether to pre-fill the activity with object properties.
128167 */
129- public function set_object ( $ data ) {
130- // Convert array to object.
168+ public function set_object ( $ data , $ pre_fill = true ) {
169+ $ object = $ data ;
170+
171+ // Convert array to appropriate object type.
131172 if ( is_array ( $ data ) ) {
132- $ data = Generic_Object::init_from_array ( $ data );
173+ $ type = $ data ['type ' ] ?? null ;
174+
175+ if ( in_array ( $ type , self ::DEFAULT_TYPES , true ) ) {
176+ $ object = self ::init_from_array ( $ data );
177+ } elseif ( in_array ( $ type , Actor::DEFAULT_TYPES , true ) ) {
178+ $ object = Actor::init_from_array ( $ data );
179+ } elseif ( in_array ( $ type , Base_Object::DEFAULT_TYPES , true ) ) {
180+ $ object = match ( $ type ) {
181+ 'Event ' => Event::init_from_array ( $ data ),
182+ 'Place ' => Place::init_from_array ( $ data ),
183+ default => Base_Object::init_from_array ( $ data ),
184+ };
185+ } else {
186+ $ object = Generic_Object::init_from_array ( $ data );
187+ }
188+ }
189+
190+ $ this ->set ( 'object ' , $ object );
191+
192+ if ( $ pre_fill ) {
193+ $ this ->pre_fill_activity_from_object ();
133194 }
195+ }
134196
135- // Set object.
136- $ this ->set ( 'object ' , $ data );
197+ /**
198+ * Fills the Activity with the specified activity object.
199+ */
200+ public function pre_fill_activity_from_object () {
201+ $ object = $ this ->get_object ();
137202
138203 // Check if `$data` is a URL and use it to generate an ID then.
139- if ( is_string ( $ data ) && filter_var ( $ data , FILTER_VALIDATE_URL ) && ! $ this ->get_id () ) {
140- $ this ->set ( 'id ' , $ data . '#activity- ' . strtolower ( $ this ->get_type () ) . '- ' . time () );
204+ if ( is_string ( $ object ) && filter_var ( $ object , FILTER_VALIDATE_URL ) && ! $ this ->get_id () ) {
205+ $ this ->set ( 'id ' , $ object . '#activity- ' . strtolower ( $ this ->get_type () ) . '- ' . time () );
141206
142207 return ;
143208 }
144209
145210 // Check if `$data` is an object and copy some properties otherwise do nothing.
146- if ( ! is_object ( $ data ) ) {
211+ if ( ! is_object ( $ object ) ) {
147212 return ;
148213 }
149214
150215 foreach ( array ( 'to ' , 'bto ' , 'cc ' , 'bcc ' , 'audience ' ) as $ i ) {
151- $ value = $ data ->get ( $ i );
216+ $ value = $ object ->get ( $ i );
152217 if ( $ value && ! $ this ->get ( $ i ) ) {
153218 $ this ->set ( $ i , $ value );
154219 }
155220 }
156221
157- if ( $ data ->get_published () && ! $ this ->get_published () ) {
158- $ this ->set ( 'published ' , $ data ->get_published () );
222+ if ( $ object ->get_published () && ! $ this ->get_published () ) {
223+ $ this ->set ( 'published ' , $ object ->get_published () );
159224 }
160225
161- if ( $ data ->get_updated () && ! $ this ->get_updated () ) {
162- $ this ->set ( 'updated ' , $ data ->get_updated () );
226+ if ( $ object ->get_updated () && ! $ this ->get_updated () ) {
227+ $ this ->set ( 'updated ' , $ object ->get_updated () );
163228 }
164229
165- if ( $ data ->get_attributed_to () && ! $ this ->get_actor () ) {
166- $ this ->set ( 'actor ' , $ data ->get_attributed_to () );
230+ if ( $ object ->get_attributed_to () && ! $ this ->get_actor () ) {
231+ $ this ->set ( 'actor ' , $ object ->get_attributed_to () );
167232 }
168233
169- if ( $ data ->get_in_reply_to () && ! $ this ->get_in_reply_to () ) {
170- $ this ->set ( 'in_reply_to ' , $ data ->get_in_reply_to () );
234+ if ( $ object ->get_in_reply_to () && ! $ this ->get_in_reply_to () ) {
235+ $ this ->set ( 'in_reply_to ' , $ object ->get_in_reply_to () );
171236 }
172237
173- if ( $ data ->get_id () && ! $ this ->get_id () ) {
174- $ id = strtok ( $ data ->get_id (), '# ' );
175- if ( $ data ->get_updated () ) {
176- $ updated = $ data ->get_updated ();
177- } elseif ( $ data ->get_published () ) {
178- $ updated = $ data ->get_published ();
238+ if ( $ object ->get_id () && ! $ this ->get_id () ) {
239+ $ id = strtok ( $ object ->get_id (), '# ' );
240+ if ( $ object ->get_updated () ) {
241+ $ updated = $ object ->get_updated ();
242+ } elseif ( $ object ->get_published () ) {
243+ $ updated = $ object ->get_published ();
179244 } else {
180245 $ updated = time ();
181246 }
0 commit comments