summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--classes/Notice.php21
-rw-r--r--classes/Profile.php78
-rw-r--r--lib/activity.php (renamed from plugins/OStatus/lib/activity.php)155
3 files changed, 152 insertions, 102 deletions
diff --git a/classes/Notice.php b/classes/Notice.php
index 754c126ed..92d959dc5 100644
--- a/classes/Notice.php
+++ b/classes/Notice.php
@@ -1218,25 +1218,8 @@ class Notice extends Memcached_DataObject
*/
function asActivityNoun($element)
{
- $xs = new XMLStringer(true);
-
- $xs->elementStart('activity:' . $element);
- $xs->element('activity:object-type',
- null,
- 'http://activitystrea.ms/schema/1.0/note');
- $xs->element('id',
- null,
- $this->uri);
- $xs->element('content',
- array('type' => 'text/html'),
- $this->rendered);
- $xs->element('link',
- array('type' => 'text/html',
- 'rel' => 'alternate',
- 'href' => $this->bestUrl()));
- $xs->elementEnd('activity:' . $element);
-
- return $xs->getString();
+ $noun = ActivityObject::fromNotice($this);
+ return $noun->asString('activity:' . $element);
}
function bestUrl()
diff --git a/classes/Profile.php b/classes/Profile.php
index 7fb2b87bc..78223b34a 100644
--- a/classes/Profile.php
+++ b/classes/Profile.php
@@ -801,82 +801,8 @@ class Profile extends Memcached_DataObject
*/
function asActivityNoun($element)
{
- $xs = new XMLStringer(true);
-
- $xs->elementStart('activity:' . $element);
- $xs->element(
- 'activity:object-type',
- null,
- 'http://activitystrea.ms/schema/1.0/person'
- );
- $xs->element(
- 'id',
- null,
- $this->getUri()
- );
-
- // title should contain fullname
- $xs->element('title', null, $this->getBestName());
-
- $xs->element('link', array('rel' => 'alternate',
- 'type' => 'text/html'),
- $this->profileurl);
-
- $xs->element('poco:preferredUsername', null, $this->nickname);
-
- // Portable Contacts stuff
-
- if (isset($this->bio)) {
-
- // XXX: Possible to use OpenSocial's aboutMe?
-
- $xs->element('poco:note', null, $this->bio);
- }
-
- if (isset($this->homepage)) {
-
- $xs->elementStart('poco:urls');
- $xs->element('poco:value', null, $this->homepage);
- $xs->element('poco:type', null, 'homepage');
- $xs->element('poco:primary', null, 'true');
- $xs->elementEnd('poco:urls');
- }
-
- if (isset($this->location)) {
- $xs->elementStart('poco:address');
- $xs->element('poco:formatted', null, $this->location);
- $xs->elementEnd('poco:address');
- }
-
- if (isset($this->lat) && isset($this->lon)) {
- $this->element(
- 'georss:point',
- null,
- (float)$this->lat . ' ' . (float)$this->lon
- );
- }
-
- // XXX: Should we send all avatar sizes we have? I think
- // cliqset does -Z
-
- $avatar = $this->getAvatar(AVATAR_PROFILE_SIZE);
-
- $xs->element(
- 'link', array(
- 'type' => empty($avatar) ? 'image/png' : $avatar->mediatype,
- 'rel' => 'avatar',
- 'href' => empty($avatar)
- ? Avatar::defaultImage(AVATAR_PROFILE_SIZE)
- : $avatar->displayUrl()
- ),
- ''
- );
-
- $xs->elementEnd('activity:' . $element);
-
- // XXX: Add people tags with <poco:tags> plural?
-
- return $xs->getString();
+ $noun = ActivityObject::fromProfile($this);
+ return $noun->asString('activity:' . $element);
}
/**
diff --git a/plugins/OStatus/lib/activity.php b/lib/activity.php
index 6cb9881bf..d91e04260 100644
--- a/plugins/OStatus/lib/activity.php
+++ b/lib/activity.php
@@ -19,9 +19,10 @@
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
- * @category OStatus
+ * @category Feed
* @package StatusNet
* @author Evan Prodromou <evan@status.net>
+ * @author Zach Copley <zach@status.net>
* @copyright 2010 StatusNet, Inc.
* @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPLv3
* @link http://status.net/
@@ -31,10 +32,117 @@ if (!defined('STATUSNET')) {
exit(1);
}
+class PoCoURL
+{
+ const TYPE = 'type';
+ const VALUE = 'value';
+ const PRIMARY = 'primary';
+
+ public $type;
+ public $value;
+ public $primary;
+
+ function __construct($type, $value, $primary = false)
+ {
+ $this->type = $type;
+ $this->value = $value;
+ $this->primary = $primary;
+ }
+
+ function asString()
+ {
+ $xs = new XMLStringer(true);
+ $xs->elementStart('poco:urls');
+ $xs->element('poco:type', null, $this->type);
+ $xs->element('poco:value', null, $this->value);
+ if ($this->primary) {
+ $xs->element('poco:primary', null, 'true');
+ }
+ $xs->elementEnd('poco:urls');
+ return $xs->getString();
+ }
+}
+
+class PoCoAddress
+{
+ const ADDRESS = 'address';
+ const FORMATTED = 'formatted';
+
+ public $formatted;
+
+ function __construct($formatted)
+ {
+ if (empty($formatted)) {
+ return null;
+ }
+ $this->formatted = $formatted;
+ }
+
+ function asString()
+ {
+ $xs = new XMLStringer(true);
+ $xs->elementStart('poco:address');
+ $xs->element('poco:formatted', null, $this->formatted);
+ $xs->elementEnd('poco:address');
+ return $xs->getString();
+ }
+}
+
class PoCo
{
const NS = 'http://portablecontacts.net/spec/1.0';
- const USERNAME = 'preferredUsername';
+
+ const USERNAME = 'preferredUsername';
+ const NOTE = 'note';
+ const URLS = 'urls';
+
+ public $preferredUsername;
+ public $note;
+ public $address;
+ public $urls = array();
+
+ function __construct($profile)
+ {
+ $this->preferredUsername = $profile->nickname;
+
+ $this->note = $profile->bio;
+ $this->address = new PoCoAddress($profile->location);
+
+ if (!empty($profile->homepage)) {
+ array_push(
+ $this->urls,
+ new PoCoURL(
+ 'homepage',
+ $profile->homepage,
+ true
+ )
+ );
+ }
+ }
+
+ function asString()
+ {
+ $xs = new XMLStringer(true);
+ $xs->element(
+ 'poco:preferredUsername',
+ null,
+ $this->preferredUsername
+ );
+
+ if (!empty($this->note)) {
+ $xs->element('poco:note', null, $this->note);
+ }
+
+ if (!empty($this->address)) {
+ $xs->raw($this->address->asString());
+ }
+
+ foreach ($this->urls as $url) {
+ $xs->raw($url->asString());
+ }
+
+ return $xs->getString();
+ }
}
/**
@@ -265,6 +373,7 @@ class ActivityObject
public $link;
public $source;
public $avatar;
+ public $geopoint;
/**
* Constructor
@@ -374,10 +483,17 @@ class ActivityObject
{
$object = new ActivityObject();
- $object->type = ActivityObject::PERSON;
- $object->id = $profile->getUri();
- $object->title = $profile->getBestName();
- $object->link = $profile->profileurl;
+ $object->type = ActivityObject::PERSON;
+ $object->id = $profile->getUri();
+ $object->title = $profile->getBestName();
+ $object->link = $profile->profileurl;
+ $object->avatar = $profile->getAvatar(AVATAR_PROFILE_SIZE);
+
+ if (isset($profile->lat) && isset($profile->lon)) {
+ $object->geopoint = (float)$profile->lat . ' ' . (float)$profile->lon;
+ }
+
+ $object->poco = new PoCo($profile);
return $object;
}
@@ -410,7 +526,32 @@ class ActivityObject
if (!empty($this->link)) {
$xs->element('link', array('rel' => 'alternate', 'type' => 'text/html'),
- $this->content);
+ $this->link);
+ }
+
+ if ($this->type == ActivityObject::PERSON) {
+ $xs->element(
+ 'link', array(
+ 'type' => empty($this->avatar) ? 'image/png' : $this->avatar->mediatype,
+ 'rel' => 'avatar',
+ 'href' => empty($this->avatar)
+ ? Avatar::defaultImage(AVATAR_PROFILE_SIZE)
+ : $this->avatar->displayUrl()
+ ),
+ ''
+ );
+ }
+
+ if (!empty($this->geopoint)) {
+ $xs->element(
+ 'georss:point',
+ null,
+ $this->geopoint
+ );
+ }
+
+ if (!empty($this->poco)) {
+ $xs->raw($this->poco->asString());
}
$xs->elementEnd($tag);