function onStartActivityObjectFromNotice($notice, &$object)
{
+ common_log(LOG_INFO,
+ "Checking {$notice->uri} to see if it's a bookmark.");
+
$nb = Notice_bookmark::staticGet('notice_id',
$notice->id);
if (!empty($nb)) {
+ common_log(LOG_INFO,
+ "Formatting notice {$notice->uri} as a bookmark.");
+
$object->id = $notice->uri;
$object->type = ActivityObject::BOOKMARK;
$object->title = $nb->title;
return true;
}
+
+ /**
+ * Handle a posted bookmark from PuSH
+ *
+ * @param Activity $activity activity to handle
+ * @param Ostatus_profile $oprofile Profile for the feed
+ *
+ * @return boolean hook value
+ */
+
+ function onStartHandleFeedEntryWithProfile($activity, $oprofile) {
+
+ common_log(LOG_INFO, "BookmarkPlugin called for new feed entry.");
+
+ if ($activity->verb == ActivityVerb::POST &&
+ $activity->objects[0]->type == ActivityObject::BOOKMARK) {
+
+ common_log(LOG_INFO, "Importing activity {$activity->id} as a bookmark.");
+
+ $author = $oprofile->checkAuthorship($activity);
+
+ if (empty($author)) {
+ throw new ClientException(_('Can\'t get author for activity.'));
+ }
+
+ self::_postRemoteBookmark($author,
+ $activity);
+
+ return false;
+ }
+
+ return true;
+ }
+
+ static private function _postRemoteBookmark(Ostatus_profile $author, Activity $activity)
+ {
+ $bookmark = $activity->objects[0];
+
+ $relLinkEls = ActivityUtils::getLinks($bookmark->element, 'related');
+
+ if (count($relLinkEls) < 1) {
+ throw new ClientException(_('Expected exactly 1 link rel=related in a Bookmark.'));
+ }
+
+ if (count($relLinkEls) > 1) {
+ common_log(LOG_WARNING, "Got too many link rel=related in a Bookmark.");
+ }
+
+ $linkEl = $relLinkEls[0];
+
+ $url = $linkEl->getAttribute('href');
+
+ $tags = array();
+
+ foreach ($activity->categories as $category) {
+ $tags[] = common_canonical_tag($category->term);
+ }
+
+ $options = array('uri' => $bookmark->id,
+ 'url' => $bookmark->link,
+ 'created' => common_sql_time($activity->time),
+ 'is_local' => Notice::REMOTE_OMB,
+ 'source' => 'ostatus');
+
+ // Fill in location if available
+
+ $location = $activity->context->location;
+
+ if ($location) {
+ $options['lat'] = $location->lat;
+ $options['lon'] = $location->lon;
+ if ($location->location_id) {
+ $options['location_ns'] = $location->location_ns;
+ $options['location_id'] = $location->location_id;
+ }
+ }
+
+ $replies = $activity->context->attention;
+ $options['groups'] = $author->filterReplies($author, $replies);
+ $options['replies'] = $replies;
+
+ // Maintain direct reply associations
+ // @fixme what about conversation ID?
+
+ if (!empty($activity->context->replyToID)) {
+ $orig = Notice::staticGet('uri',
+ $activity->context->replyToID);
+ if (!empty($orig)) {
+ $options['reply_to'] = $orig->id;
+ }
+ }
+
+ Notice_bookmark::saveNew($author->localProfile(),
+ $bookmark->title,
+ $url,
+ $tags,
+ $bookmark->summary,
+ $options);
+ }
}
{
$activity = new Activity($entry, $feed);
- if (Event::handle('StartHandleFeedEntry', array($activity))) {
+ if (Event::handle('StartHandleFeedEntryWithProfile', array($activity, $this)) &&
+ Event::handle('StartHandleFeedEntry', array($activity))) {
// @todo process all activity objects
switch ($activity->objects[0]->type) {
}
Event::handle('EndHandleFeedEntry', array($activity));
+ Event::handle('EndHandleFeedEntryWithProfile', array($activity, $this));
}
}
*/
public function processPost($activity, $method)
{
- if ($this->isGroup()) {
- // A group feed will contain posts from multiple authors.
- // @fixme validate these profiles in some way!
- $oprofile = self::ensureActorProfile($activity);
- if ($oprofile->isGroup()) {
- // Groups can't post notices in StatusNet.
- common_log(LOG_WARNING, "OStatus: skipping post with group listed as author: $oprofile->uri in feed from $this->uri");
- return false;
- }
- } else {
- $actor = $activity->actor;
+ $oprofile = $this->checkAuthorship($activity);
- if (empty($actor)) {
- // OK here! assume the default
- } else if ($actor->id == $this->uri || $actor->link == $this->uri) {
- $this->updateFromActivityObject($actor);
- } else if ($actor->id) {
- // We have an ActivityStreams actor with an explicit ID that doesn't match the feed owner.
- // This isn't what we expect from mainline OStatus person feeds!
- // Group feeds go down another path, with different validation...
- // Most likely this is a plain ol' blog feed of some kind which
- // doesn't match our expectations. We'll take the entry, but ignore
- // the <author> info.
- common_log(LOG_WARNING, "Got an actor '{$actor->title}' ({$actor->id}) on single-user feed for {$this->uri}");
- } else {
- // Plain <author> without ActivityStreams actor info.
- // We'll just ignore this info for now and save the update under the feed's identity.
- }
-
- $oprofile = $this;
+ if (empty($oprofile)) {
+ return false;
}
// It's not always an ActivityObject::NOTE, but... let's just say it is.
}
return $oprofile;
}
+
+ function checkAuthorship($activity)
+ {
+ if ($this->isGroup()) {
+ // A group feed will contain posts from multiple authors.
+ // @fixme validate these profiles in some way!
+ $oprofile = self::ensureActorProfile($activity);
+ if ($oprofile->isGroup()) {
+ // Groups can't post notices in StatusNet.
+ common_log(LOG_WARNING,
+ "OStatus: skipping post with group listed as author: ".
+ "$oprofile->uri in feed from $this->uri");
+ return false;
+ }
+ } else {
+ $actor = $activity->actor;
+
+ if (empty($actor)) {
+ // OK here! assume the default
+ } else if ($actor->id == $this->uri || $actor->link == $this->uri) {
+ $this->updateFromActivityObject($actor);
+ } else if ($actor->id) {
+ // We have an ActivityStreams actor with an explicit ID that doesn't match the feed owner.
+ // This isn't what we expect from mainline OStatus person feeds!
+ // Group feeds go down another path, with different validation...
+ // Most likely this is a plain ol' blog feed of some kind which
+ // doesn't match our expectations. We'll take the entry, but ignore
+ // the <author> info.
+ common_log(LOG_WARNING, "Got an actor '{$actor->title}' ({$actor->id}) on single-user feed for {$this->uri}");
+ } else {
+ // Plain <author> without ActivityStreams actor info.
+ // We'll just ignore this info for now and save the update under the feed's identity.
+ }
+
+ $oprofile = $this;
+ }
+
+ return $oprofile;
+ }
}
/**