]> git.mxchange.org Git - quix0rs-gnu-social.git/blobdiff - lib/api.php
Merge branch '0.9.x' of git@gitorious.org:statusnet/mainline into 0.9.x
[quix0rs-gnu-social.git] / lib / api.php
index fb4c4289b4f0303d5bb84935553434c3ff02c7be..d21851d503c4bcb1ef14085c5dc899979d108757 100644 (file)
@@ -53,33 +53,34 @@ if (!defined('STATUSNET')) {
 
 class ApiAction extends Action
 {
-     var $format   = null;
-     var $user     = null;
-     var $page     = null;
-     var $count    = null;
-     var $max_id   = null;
-     var $since_id = null;
-     var $since    = null;
-     
+    var $format    = null;
+    var $user      = null;
+    var $auth_user = null;
+    var $page      = null;
+    var $count     = null;
+    var $max_id    = null;
+    var $since_id  = null;
+    var $since     = null;
+
     /**
      * Initialization.
      *
      * @param array $args Web and URL arguments
      *
-     * @return boolean false if user does not exist
+     * @return boolean false if user doesn't exist
      */
 
     function prepare($args)
     {
         parent::prepare($args);
-        
+
         $this->format   = $this->arg('format');
         $this->page     = (int)$this->arg('page', 1);
         $this->count    = (int)$this->arg('count', 20);
         $this->max_id   = (int)$this->arg('max_id', 0);
         $this->since_id = (int)$this->arg('since_id', 0);
         $this->since    = $this->arg('since');
-        
+
         return true;
     }
 
@@ -134,11 +135,12 @@ class ApiAction extends Action
         $twitter_user['protected'] = false; # not supported by StatusNet yet
         $twitter_user['followers_count'] = $profile->subscriberCount();
 
-        $defaultDesign = Design::siteDesign();
         $design        = null;
         $user          = $profile->getUser();
 
-        // Note: some profiles do not have an associated user
+        // Note: some profiles don't have an associated user
+
+        $defaultDesign = Design::siteDesign();
 
         if (!empty($user)) {
             $design = $user->getDesign();
@@ -164,7 +166,6 @@ class ApiAction extends Action
 
         $twitter_user['favourites_count'] = $profile->faveCount(); // British spelling!
 
-
         $timezone = 'UTC';
 
         if ($user->timezone) {
@@ -177,9 +178,14 @@ class ApiAction extends Action
         $twitter_user['utc_offset'] = $t->format('Z');
         $twitter_user['time_zone'] = $timezone;
 
-        // To be supported some day, perhaps
-        $twitter_user['profile_background_image_url'] = '';
-        $twitter_user['profile_background_tile'] = false;
+        $twitter_user['profile_background_image_url']
+            = empty($design->backgroundimage)
+            ? '' : ($design->disposition & BACKGROUND_ON)
+            ? Design::url($design->backgroundimage) : '';
+
+        $twitter_user['profile_background_tile']
+            = empty($design->disposition)
+            ? '' : ($design->disposition & BACKGROUND_TILE) ? 'true' : 'false';
 
         $twitter_user['statuses_count'] = $profile->noticeCount();
 
@@ -187,13 +193,14 @@ class ApiAction extends Action
         $twitter_user['following'] = false;
         $twitter_user['notifications'] = false;
 
-        if (isset($apidata['user'])) {
+        if (isset($this->auth_user)) {
 
-            $twitter_user['following'] = $apidata['user']->isSubscribed($profile);
+            $twitter_user['following'] = $this->auth_user->isSubscribed($profile);
 
             // Notifications on?
             $sub = Subscription::pkeyGet(array('subscriber' =>
-                $apidata['user']->id, 'subscribed' => $profile->id));
+                                               $this->auth_user->id,
+                                               'subscribed' => $profile->id));
 
             if ($sub) {
                 $twitter_user['notifications'] = ($sub->jabber || $sub->sms);
@@ -203,7 +210,7 @@ class ApiAction extends Action
         if ($get_notice) {
             $notice = $profile->getCurrentNotice();
             if ($notice) {
-                # do not get user!
+                # don't get user!
                 $twitter_user['status'] = $this->twitterStatusArray($notice, false);
             }
         }
@@ -212,6 +219,21 @@ class ApiAction extends Action
     }
 
     function twitterStatusArray($notice, $include_user=true)
+    {
+        $base = $this->twitterSimpleStatusArray($notice, $include_user);
+
+        if (!empty($notice->repeat_of)) {
+            $original = Notice::staticGet('id', $notice->repeat_of);
+            if (!empty($original)) {
+                $original_array = $this->twitterSimpleStatusArray($original, $include_user);
+                $base['retweeted_status'] = $original_array;
+            }
+        }
+
+        return $base;
+    }
+
+    function twitterSimpleStatusArray($notice, $include_user=true)
     {
         $profile = $notice->getProfile();
 
@@ -238,6 +260,15 @@ class ApiAction extends Action
         $twitter_status['in_reply_to_screen_name'] =
             ($replier_profile) ? $replier_profile->nickname : null;
 
+        if (isset($notice->lat) && isset($notice->lon)) {
+            // This is the format that GeoJSON expects stuff to be in
+            $twitter_status['geo'] = array('type' => 'Point',
+                                           'coordinates' => array((float) $notice->lat,
+                                                                  (float) $notice->lon));
+        } else {
+            $twitter_status['geo'] = null;
+        }
+
         if (isset($this->auth_user)) {
             $twitter_status['favorited'] = $this->auth_user->hasFave($notice);
         } else {
@@ -263,7 +294,7 @@ class ApiAction extends Action
         }
 
         if ($include_user) {
-            # Do not get notice (recursive!)
+            # Don't get notice (recursive!)
             $twitter_user = $this->twitterUserArray($profile, false);
             $twitter_status['user'] = $twitter_user;
         }
@@ -362,10 +393,19 @@ class ApiAction extends Action
         $entry['pubDate'] = common_date_rfc2822($notice->created);
         $entry['guid'] = $entry['link'];
 
+        if (isset($notice->lat) && isset($notice->lon)) {
+            // This is the format that GeoJSON expects stuff to be in.
+            // showGeoRSS() below uses it for XML output, so we reuse it
+            $entry['geo'] = array('type' => 'Point',
+                                  'coordinates' => array((float) $notice->lat,
+                                                         (float) $notice->lon));
+        } else {
+            $entry['geo'] = null;
+        }
+
         return $entry;
     }
 
-
     function twitterRelationshipArray($source, $target)
     {
         $relationship = array();
@@ -427,9 +467,9 @@ class ApiAction extends Action
         }
     }
 
-    function showTwitterXmlStatus($twitter_status)
+    function showTwitterXmlStatus($twitter_status, $tag='status')
     {
-        $this->elementStart('status');
+        $this->elementStart($tag);
         foreach($twitter_status as $element => $value) {
             switch ($element) {
             case 'user':
@@ -441,11 +481,17 @@ class ApiAction extends Action
             case 'attachments':
                 $this->showXmlAttachments($twitter_status['attachments']);
                 break;
+            case 'geo':
+                $this->showGeoRSS($value);
+                break;
+            case 'retweeted_status':
+                $this->showTwitterXmlStatus($value, 'retweeted_status');
+                break;
             default:
                 $this->element($element, null, $value);
             }
         }
-        $this->elementEnd('status');
+        $this->elementEnd($tag);
     }
 
     function showTwitterXmlGroup($twitter_group)
@@ -484,6 +530,18 @@ class ApiAction extends Action
         }
     }
 
+    function showGeoRSS($geo)
+    {
+        if (empty($geo)) {
+            // empty geo element
+            $this->element('geo');
+        } else {
+            $this->elementStart('geo', array('xmlns:georss' => 'http://www.georss.org/georss'));
+            $this->element('georss:point', null, $geo['coordinates'][0] . ' ' . $geo['coordinates'][1]);
+            $this->elementEnd('geo');
+        }
+    }
+
     function showTwitterRssItem($entry)
     {
         $this->elementStart('item');
@@ -505,6 +563,7 @@ class ApiAction extends Action
             }
         }
 
+        $this->showGeoRSS($entry['geo']);
         $this->elementEnd('item');
     }
 
@@ -529,7 +588,6 @@ class ApiAction extends Action
         $this->endDocument('json');
     }
 
-
     function showXmlTimeline($notice)
     {
 
@@ -552,7 +610,7 @@ class ApiAction extends Action
         $this->endDocument('xml');
     }
 
-    function showRssTimeline($notice, $title, $link, $subtitle, $suplink=null)
+    function showRssTimeline($notice, $title, $link, $subtitle, $suplink=null, $logo=null)
     {
 
         $this->initDocument('rss');
@@ -566,6 +624,15 @@ class ApiAction extends Action
                                          'href' => $suplink,
                                          'type' => 'application/json'));
         }
+
+        if (!is_null($logo)) {
+            $this->elementStart('image');
+            $this->element('link', null, $link);
+            $this->element('title', null, $title);
+            $this->element('url', null, $logo);
+            $this->elementEnd('image');
+        }
+
         $this->element('description', null, $subtitle);
         $this->element('language', null, 'en-us');
         $this->element('ttl', null, '40');
@@ -585,7 +652,7 @@ class ApiAction extends Action
         $this->endTwitterRss();
     }
 
-    function showAtomTimeline($notice, $title, $id, $link, $subtitle=null, $suplink=null, $selfuri=null)
+    function showAtomTimeline($notice, $title, $id, $link, $subtitle=null, $suplink=null, $selfuri=null, $logo=null)
     {
 
         $this->initDocument('atom');
@@ -594,6 +661,10 @@ class ApiAction extends Action
         $this->element('id', null, $id);
         $this->element('link', array('href' => $link, 'rel' => 'alternate', 'type' => 'text/html'), null);
 
+        if (!is_null($logo)) {
+            $this->element('logo',null,$logo);
+        }
+
         if (!is_null($suplink)) {
             # For FriendFeed's SUP protocol
             $this->element('link', array('rel' => 'http://api.friendfeed.com/2008/03#sup',
@@ -649,7 +720,6 @@ class ApiAction extends Action
         $this->endTwitterRss();
     }
 
-
     function showTwitterAtomEntry($entry)
     {
         $this->elementStart('entry');
@@ -719,7 +789,7 @@ class ApiAction extends Action
 
         $from = $message->getFrom();
 
-        $entry['title'] = sprintf('Message from %s to %s',
+        $entry['title'] = sprintf('Message from %1$s to %2$s',
             $from->nickname, $message->getTo()->nickname);
 
         $entry['content'] = common_xml_safe_str($message->rendered);
@@ -1074,7 +1144,7 @@ class ApiAction extends Action
     function initTwitterAtom()
     {
         $this->startXML();
-        // FIXME: do not hardcode the language here!
+        // FIXME: don't hardcode the language here!
         $this->elementStart('feed', array('xmlns' => 'http://www.w3.org/2005/Atom',
                                           'xml:lang' => 'en-US',
                                           'xmlns:thr' => 'http://purl.org/syndication/thread/1.0'));
@@ -1116,7 +1186,7 @@ class ApiAction extends Action
                 return User::staticGet('nickname', $nickname);
             } else if ($this->arg('user_id')) {
                 // This is to ensure that a non-numeric user_id still
-                // overrides screen_name even if it does not get used
+                // overrides screen_name even if it doesn't get used
                 if (is_numeric($this->arg('user_id'))) {
                     return User::staticGet('id', $this->arg('user_id'));
                 }
@@ -1146,7 +1216,7 @@ class ApiAction extends Action
                 return User_group::staticGet('nickname', $nickname);
             } else if ($this->arg('group_id')) {
                 // This is to ensure that a non-numeric user_id still
-                // overrides screen_name even if it does not get used
+                // overrides screen_name even if it doesn't get used
                 if (is_numeric($this->arg('group_id'))) {
                     return User_group::staticGet('id', $this->arg('group_id'));
                 }