X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=lib%2Factivity.php;h=a52f29e9ca64e06bdf317f995f4c597acc20559b;hb=a6e33bdd6a9c44e5fd06af3c3973c0112792d743;hp=592c56bcbd1bc85f61916c779c4f7824120f212e;hpb=2ad5aece55fed8fb4242961bcb301ad33ae7ca38;p=quix0rs-gnu-social.git diff --git a/lib/activity.php b/lib/activity.php index 592c56bcbd..a52f29e9ca 100644 --- a/lib/activity.php +++ b/lib/activity.php @@ -100,12 +100,13 @@ class Activity public $title; // title of the activity public $categories = array(); // list of AtomCategory objects public $enclosures = array(); // list of enclosure URL references + public $attachments = array(); // list of attachments public $extra = array(); // extra elements as array(tag, attrs, content) public $source; // ActivitySource object representing 'home feed' public $selfLink; // public $editLink; // - + public $generator; // ActivityObject representing the generating application /** * Turns a regular old Atom into a magical activity * @@ -179,7 +180,7 @@ class Activity foreach ($objectEls as $objectEl) { // Special case for embedded activities $objectType = ActivityUtils::childContent($objectEl, self::OBJECTTYPE, self::SPEC); - if (!empty($objectType) && $objectType == ActivityObject::ACTIVITY) { + if ((!empty($objectType) && $objectType == ActivityObject::ACTIVITY) || $this->verb == ActivityVerb::SHARE) { $this->objects[] = new Activity($objectEl); } else { $this->objects[] = new ActivityObject($objectEl); @@ -243,6 +244,9 @@ class Activity if (!empty($targetEl)) { $this->target = new ActivityObject($targetEl); + } elseif (ActivityUtils::compareVerbs($this->verb, array(ActivityVerb::FAVORITE))) { + // StatusNet didn't send a 'target' for their Favorite atom entries + $this->target = clone($this->objects[0]); } $this->summary = ActivityUtils::childContent($entry, 'summary'); @@ -263,7 +267,7 @@ class Activity // From APP. Might be useful. - $this->selfLink = ActivityUtils::getLink($entry, 'self', 'application/atom+xml'); + $this->selfLink = ActivityUtils::getSelfLink($entry); $this->editLink = ActivityUtils::getLink($entry, 'edit', 'application/atom+xml'); } @@ -365,8 +369,11 @@ class Activity // content $activity['content'] = $this->content; - // generator <-- We could use this when we know a notice is created - // locally. Or if we know the upstream Generator. + // generator + + if (!empty($this->generator)) { + $activity['generator'] = $this->generator->asArray(); + } // icon <-- possibly a mini object representing verb? @@ -385,9 +392,10 @@ class Activity if ($object instanceof Activity) { // Sharing a post activity is more like sharing the original object - if ($this->verb == 'share' && $object->verb == 'post') { + if (ActivityVerb::canonical($this->verb) == ActivityVerb::canonical(ActivityVerb::SHARE) && + ActivityVerb::canonical($object->verb) == ActivityVerb::canonical(ActivityVerb::POST)) { // XXX: Here's one for the obfuscation record books - $object = $object->object; + $object = $object->objects[0]; } } @@ -397,78 +405,56 @@ class Activity $activity['object']['objectType'] = 'activity'; } - // Context stuff. For now I'm just sticking most of it - // in a property called "context" + foreach ($this->attachments as $attachment) { + if (empty($activity['object']['attachments'])) { + $activity['object']['attachments'] = array(); + } + $activity['object']['attachments'][] = $attachment->asArray(); + } + } + + // Context stuff. - if (!empty($this->context)) { + if (!empty($this->context)) { - if (!empty($this->context->location)) { - $loc = $this->context->location; + if (!empty($this->context->location)) { + $loc = $this->context->location; - $activity['location'] = array( - 'objectType' => 'place', - 'position' => sprintf("%+02.5F%+03.5F/", $loc->lat, $loc->lon), - 'lat' => $loc->lat, - 'lon' => $loc->lon - ); + $activity['location'] = array( + 'objectType' => 'place', + 'position' => sprintf("%+02.5F%+03.5F/", $loc->lat, $loc->lon), + 'lat' => $loc->lat, + 'lon' => $loc->lon + ); - $name = $loc->getName(); + $name = $loc->getName(); - if ($name) { - $activity['location']['displayName'] = $name; - } + if ($name) { + $activity['location']['displayName'] = $name; + } - $url = $loc->getURL(); + $url = $loc->getURL(); - if ($url) { - $activity['location']['url'] = $url; - } + if ($url) { + $activity['location']['url'] = $url; } - - $activity['to'] = $this->context->getToArray(); - $activity['context'] = $this->context->asArray(); } - // Instead of adding enclosures as an extension to JSON - // Activities, it seems like we should be using the - // attachements property of ActivityObject - - $attachments = array(); - - // XXX: OK, this is kinda cheating. We should probably figure out - // what kind of objects these are based on mime-type and then - // create specific object types. Right now this rely on - // duck-typing. Also, we should include an embed code for - // video attachments. - - foreach ($this->enclosures as $enclosure) { - - if (is_string($enclosure)) { - - $attachments[]['id'] = $enclosure; - - } else { - - $attachments[]['id'] = $enclosure->url; + $activity['to'] = $this->context->getToArray(); - $mediaLink = new ActivityStreamsMediaLink( - $enclosure->url, - null, - null, - $enclosure->mimetype - // XXX: Add 'size' as an extension to MediaLink? - ); + $ctxarr = $this->context->asArray(); - $attachments[]['mediaLink'] = $mediaLink->asArray(); // extension + if (array_key_exists('inReplyTo', $ctxarr)) { + $activity['object']['inReplyTo'] = $ctxarr['inReplyTo']; + unset($ctxarr['inReplyTo']); + } - if ($enclosure->title) { - $attachments[]['displayName'] = $enclosure->title; - } - } + if (!array_key_exists('status_net', $activity)) { + $activity['status_net'] = array(); } - if (!empty($attachments)) { - $activity['object']['attachments'] = $attachments; + foreach ($ctxarr as $key => $value) { + $activity['status_net'][$key] = $value; } } @@ -496,13 +482,13 @@ class Activity // eceived a remote notice? Probably not. // verb - // - // We can probably use the whole schema URL here but probably the - // relative simple name is easier to parse - $activity['verb'] = substr($this->verb, strrpos($this->verb, '/') + 1); + + $activity['verb'] = ActivityVerb::canonical($this->verb); // url - $activity['url'] = $this->id; + if ($this->link) { + $activity['url'] = $this->link; + } /* Purely extensions hereafter */ @@ -527,7 +513,15 @@ class Activity foreach ($this->extra as $e) { list($objectName, $props, $txt) = $e; if (!empty($objectName)) { - $activity[$objectName] = $props; + $parts = explode(":", $objectName); + if (count($parts) == 2 && $parts[0] == "statusnet") { + if (!array_key_exists('status_net', $activity)) { + $activity['status_net'] = array(); + } + $activity['status_net'][$parts[1]] = $props; + } else { + $activity[$objectName] = $props; + } } } @@ -569,7 +563,13 @@ class Activity } else { $xs->element('id', null, $this->id); - $xs->element('title', null, $this->title); + + if ($this->title) { + $xs->element('title', null, $this->title); + } else { + // Require element + $xs->element('title', null, ""); + } $xs->element('content', array('type' => 'html'), $this->content); @@ -579,8 +579,8 @@ class Activity if (!empty($this->link)) { $xs->element('link', array('rel' => 'alternate', - 'type' => 'text/html'), - $this->link); + 'type' => 'text/html', + 'href' => $this->link)); } } @@ -625,30 +625,35 @@ class Activity } if (!empty($this->context->conversation)) { - $xs->element('link', array('rel' => 'ostatus:conversation', - 'href' => $this->context->conversation)); + $convattr = []; + $conv = Conversation::getKV('uri', $this->context->conversation); + if ($conv instanceof Conversation) { + $convattr['href'] = $conv->getUrl(); + $convattr['local_id'] = $conv->getID(); + $convattr['ref'] = $conv->getUri(); + $xs->element('link', array('rel' => ActivityContext::CONVERSATION, + 'href' => $convattr['href'])); + } else { + $convattr['ref'] = $this->context->conversation; + } + $xs->element(ActivityContext::CONVERSATION, + $convattr, + $this->context->conversation); + /* Since we use XMLWriter we just use the previously hardcoded prefix for ostatus, + otherwise we should use something like this: + $xs->elementNS(array(ActivityContext::OSTATUS => 'ostatus'), // namespace + 'conversation', // tag (or the element name from ActivityContext::CONVERSATION) + null, // attributes + $this->context->conversation); // content + */ } - foreach ($this->context->attention as $attnURI) { - $xs->element('link', array('rel' => 'ostatus:attention', - 'href' => $attnURI)); - $xs->element('link', array('rel' => 'mentioned', + foreach ($this->context->attention as $attnURI=>$type) { + $xs->element('link', array('rel' => ActivityContext::MENTIONED, + ActivityContext::OBJECTTYPE => $type, // FIXME: undocumented 'href' => $attnURI)); } - // XXX: shoulda used ActivityVerb::SHARE - - if (!empty($this->context->forwardID)) { - if (!empty($this->context->forwardUrl)) { - $xs->element('ostatus:forward', - array('ref' => $this->context->forwardID, - 'href' => $this->context->forwardUrl)); - } else { - $xs->element('ostatus:forward', - array('ref' => $this->context->forwardID)); - } - } - if (!empty($this->context->location)) { $loc = $this->context->location; $xs->element('georss:point', null, $loc->lat . ' ' . $loc->lon);