X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=actions%2Ffoaf.php;h=a17962b97e49d70f04d525fb82e3ccb06f717f3f;hb=26703076f66f77f337559416cc02101c532d7aa8;hp=416935b1b724316daefc046172b9f567bedc6754;hpb=590cc0c9a41206ba58c9333b4e9ef8931285f7e4;p=quix0rs-gnu-social.git diff --git a/actions/foaf.php b/actions/foaf.php index 416935b1b7..a17962b97e 100644 --- a/actions/foaf.php +++ b/actions/foaf.php @@ -1,7 +1,7 @@ . */ -if (!defined('LACONICA')) { exit(1); } +if (!defined('STATUSNET') && !defined('LACONICA')) { exit(1); } define('LISTENER', 1); define('LISTENEE', -1); define('BOTH', 0); +// @todo XXX: Documentation missing. class FoafAction extends Action { - function isReadOnly() + function isReadOnly(array $args=array()) { return true; } - function prepare($args) + function prepare(array $args=array()) { parent::prepare($args); $nickname_arg = $this->arg('nickname'); if (empty($nickname_arg)) { + // TRANS: Client error displayed when requesting Friends of a Friend feed without providing a user nickname. $this->clientError(_('No such user.'), 404); - return false; } $this->nickname = common_canonical_nickname($nickname_arg); @@ -49,27 +50,26 @@ class FoafAction extends Action common_redirect(common_local_url('foaf', array('nickname' => $this->nickname)), 301); - return false; } - $this->user = User::staticGet('nickname', $this->nickname); + $this->user = User::getKV('nickname', $this->nickname); if (!$this->user) { + // TRANS: Client error displayed when requesting Friends of a Friend feed for an object that is not a user. $this->clientError(_('No such user.'), 404); - return false; } $this->profile = $this->user->getProfile(); if (!$this->profile) { + // TRANS: Error message displayed when referring to a user without a profile. $this->serverError(_('User has no profile.'), 500); - return false; } return true; } - function handle($args) + function handle(array $args=array()) { parent::handle($args); @@ -82,86 +82,84 @@ class FoafAction extends Action 'http://www.w3.org/2000/01/rdf-schema#', 'xmlns:geo' => 'http://www.w3.org/2003/01/geo/wgs84_pos#', + 'xmlns:bio' => + 'http://purl.org/vocab/bio/0.1/', + 'xmlns:sioc' => + 'http://rdfs.org/sioc/ns#', 'xmlns' => 'http://xmlns.com/foaf/0.1/')); // This is the document about the user - $this->showPpd('', $this->user->uri); + $this->showPpd('', $this->user->getUri()); - // XXX: might not be a person - $this->elementStart('Person', array('rdf:about' => - $this->user->uri)); - $this->element('mbox_sha1sum', null, sha1('mailto:' . $this->user->email)); + // Would be nice to tell if they were a Person or not (e.g. a #person usertag?) + $this->elementStart('Agent', array('rdf:about' => $this->user->getUri())); + if ($this->user->email) { + $this->element('mbox_sha1sum', null, sha1('mailto:' . $this->user->email)); + } if ($this->profile->fullname) { $this->element('name', null, $this->profile->fullname); } if ($this->profile->homepage) { $this->element('homepage', array('rdf:resource' => $this->profile->homepage)); } + if ($this->profile->profileurl) { + $this->element('weblog', array('rdf:resource' => $this->profile->profileurl)); + } if ($this->profile->bio) { - $this->element('rdfs:comment', null, $this->profile->bio); + $this->element('bio:olb', null, $this->profile->bio); } - // XXX: more structured location data - if ($this->profile->location) { + + $location = $this->profile->getLocation(); + if ($location) { + $attr = array(); + if ($location->getRdfURL()) { + $attr['rdf:about'] = $location->getRdfURL(); + } + $location_name = $location->getName(); + $this->elementStart('based_near'); - $this->elementStart('geo:SpatialThing'); - $this->element('name', null, $this->profile->location); + $this->elementStart('geo:SpatialThing', $attr); + if ($location_name) { + $this->element('name', null, $location_name); + } + if ($location->lat) { + $this->element('geo:lat', null, $location->lat); + } + if ($location->lon) { + $this->element('geo:long', null, $location->lon); + } + if ($location->getURL()) { + $this->element('page', array('rdf:resource'=>$location->getURL())); + } $this->elementEnd('geo:SpatialThing'); $this->elementEnd('based_near'); } - $this->showMicrobloggingAccount($this->profile, common_root_url()); - - $avatar = $this->profile->getOriginalAvatar(); - - if ($avatar) { + try { + $avatar = Avatar::getUploaded($this->profile); $this->elementStart('img'); - $this->elementStart('Image', array('rdf:about' => $avatar->url)); + $this->elementStart('Image', array('rdf:about' => $avatar->displayUrl())); foreach (array(AVATAR_PROFILE_SIZE, AVATAR_STREAM_SIZE, AVATAR_MINI_SIZE) as $size) { - $scaled = $this->profile->getAvatar($size); - if (!$scaled->original) { // sometimes the original has one of our scaled sizes + try { + $scaled = $this->profile->getAvatar($size); $this->elementStart('thumbnail'); - $this->element('Image', array('rdf:about' => $scaled->url)); + $this->element('Image', array('rdf:about' => $scaled->displayUrl())); $this->elementEnd('thumbnail'); + } catch (Exception $e) { + // This avatar did not exist } } $this->elementEnd('Image'); $this->elementEnd('img'); + } catch (NoAvatarException $e) { + // No avatar for this user! } - // Get people user is subscribed to - - $person = array(); - - $sub = new Subscription(); - $sub->subscriber = $this->profile->id; - $sub->whereAdd('subscriber != subscribed'); - - if ($sub->find()) { - while ($sub->fetch()) { - if (!empty($sub->token)) { - $other = Remote_profile::staticGet('id', $sub->subscribed); - } else { - $other = User::staticGet('id', $sub->subscribed); - } - if (empty($other)) { - common_debug('Got a bad subscription: '.print_r($sub,true)); - continue; - } - $this->element('knows', array('rdf:resource' => $other->uri)); - $person[$other->uri] = array(LISTENEE, - $other->id, - $other->nickname, - (empty($sub->token)) ? 'User' : 'Remote_profile'); - $other->free(); - $other = null; - unset($other); - } - } - - $sub->free(); - $sub = null; - unset($sub); + $person = $this->showMicrobloggingAccount($this->profile, + common_root_url(), $this->user->getUri(), + /*$fetchSubscriptions*/true, + /*$isSubscriber*/false); // Get people who subscribe to user @@ -171,52 +169,56 @@ class FoafAction extends Action if ($sub->find()) { while ($sub->fetch()) { - if ($sub->token) { - $other = Remote_profile::staticGet('id', $sub->subscriber); - } else { - $other = User::staticGet('id', $sub->subscriber); - } - if (!$other) { + $profile = Profile::getKV('id', $sub->subscriber); + if (!$profile instanceof Profile) { common_debug('Got a bad subscription: '.print_r($sub,true)); continue; } - if (array_key_exists($other->uri, $person)) { - $person[$other->uri][0] = BOTH; + $other_uri = $profile->getUri(); + if (array_key_exists($other_uri, $person)) { + $person[$other_uri][0] = BOTH; } else { - $person[$other->uri] = array(LISTENER, - $other->id, - $other->nickname, - (empty($sub->token)) ? 'User' : 'Remote_profile'); + $person[$other_uri] = array(LISTENER, + $profile->id, + $profile->nickname, + $profile->isLocal() ? 'local' : 'remote'); } - $other->free(); - $other = null; - unset($other); + unset($profile); } } - $sub->free(); - $sub = null; unset($sub); - $this->elementEnd('Person'); + foreach ($person as $uri => $p) { + list($type, $id, $nickname, $local) = $p; + if ($type == BOTH) { + $this->element('knows', array('rdf:resource' => $uri)); + } + } + + $this->elementEnd('Agent'); + foreach ($person as $uri => $p) { $foaf_url = null; - list($type, $id, $nickname, $cls) = $p; - if ($cls == 'User') { + list($type, $id, $nickname, $local) = $p; + if ($local == 'local') { $foaf_url = common_local_url('foaf', array('nickname' => $nickname)); } - $profile = Profile::staticGet($id); - $this->elementStart('Person', array('rdf:about' => $uri)); - if ($type == LISTENER || $type == BOTH) { - $this->element('knows', array('rdf:resource' => $this->user->uri)); + $profile = Profile::getKV($id); + $this->elementStart('Agent', array('rdf:about' => $uri)); + if ($type == BOTH) { + $this->element('knows', array('rdf:resource' => $this->user->getUri())); } - $this->showMicrobloggingAccount($profile, ($cls == 'User') ? - common_root_url() : null); + $this->showMicrobloggingAccount($profile, + ($local == 'local') ? common_root_url() : null, + $uri, + /*$fetchSubscriptions*/false, + /*$isSubscriber*/($type == LISTENER || $type == BOTH)); if ($foaf_url) { $this->element('rdfs:seeAlso', array('rdf:resource' => $foaf_url)); } - $this->elementEnd('Person'); + $this->elementEnd('Agent'); if ($foaf_url) { $this->showPpd($foaf_url, $uri); } @@ -237,18 +239,73 @@ class FoafAction extends Action $this->elementEnd('PersonalProfileDocument'); } - function showMicrobloggingAccount($profile, $service=null) + /** + * Output FOAF bit for the given profile. + * + * @param Profile $profile + * @param mixed $service Root URL of this StatusNet instance for a local + * user, otherwise null. + * @param mixed $useruri URI string for the referenced profile.. + * @param boolean $fetchSubscriptions Should we load and list all their subscriptions? + * @param boolean $isSubscriber if not fetching subs, we can still mark the user as following the current page. + * + * @return array if $fetchSubscribers is set, return a list of info on those + * subscriptions. + */ + function showMicrobloggingAccount($profile, $service=null, $useruri=null, $fetchSubscriptions=false, $isSubscriber=false) { + $attr = array(); + if ($useruri) { + $attr['rdf:about'] = $useruri . '#acct'; + } + // Their account - $this->elementStart('holdsAccount'); - $this->elementStart('OnlineAccount'); + $this->elementStart('account'); + $this->elementStart('OnlineAccount', $attr); if ($service) { $this->element('accountServiceHomepage', array('rdf:resource' => $service)); } $this->element('accountName', null, $profile->nickname); - $this->element('homepage', array('rdf:resource' => $profile->profileurl)); + $this->element('accountProfilePage', array('rdf:resource' => $profile->profileurl)); + if ($useruri) { + $this->element('sioc:account_of', array('rdf:resource'=>$useruri)); + } + + $person = array(); + + if ($fetchSubscriptions) { + // Get people user is subscribed to + $sub = new Subscription(); + $sub->subscriber = $profile->id; + $sub->whereAdd('subscriber != subscribed'); + + if ($sub->find()) { + while ($sub->fetch()) { + $profile = Profile::getKV('id', $sub->subscribed); + if (empty($profile)) { + common_debug('Got a bad subscription: '.print_r($sub,true)); + continue; + } + $other_uri = $profile->getUri(); + $this->element('sioc:follows', array('rdf:resource' => $other_uri.'#acct')); + $person[$other_uri] = array(LISTENEE, + $profile->id, + $profile->nickname, + $profile->isLocal() ? 'local' : 'remote'); + unset($profile); + } + } + + unset($sub); + } else if ($isSubscriber) { + // Just declare that they follow the user whose FOAF we're showing. + $this->element('sioc:follows', array('rdf:resource' => $this->user->getUri() . '#acct')); + } + $this->elementEnd('OnlineAccount'); - $this->elementEnd('holdsAccount'); + $this->elementEnd('account'); + + return $person; } }