]> git.mxchange.org Git - quix0rs-gnu-social.git/blobdiff - lib/apiaction.php
Use ToSelector choice again.
[quix0rs-gnu-social.git] / lib / apiaction.php
old mode 100755 (executable)
new mode 100644 (file)
index 09061e3..6f2f43a
@@ -159,7 +159,7 @@ class ApiAction extends Action
         $this->limit    = $this->count + 1;
 
         if ($this->arg('since')) {
-            header('X-StatusNet-Warning: since parameter is disabled; use since_id');
+            header('X-GNUsocial-Warning: since parameter is disabled; use since_id');
         }
 
         $this->source = $this->trimmed('source');
@@ -214,11 +214,11 @@ class ApiAction extends Action
             $user = null;
         }
 
-        $twitter_user['id'] = intval($profile->id);
+        $twitter_user['id'] = $profile->getID();
         $twitter_user['name'] = $profile->getBestName();
-        $twitter_user['screen_name'] = $profile->nickname;
-        $twitter_user['location'] = ($profile->location) ? $profile->location : null;
-        $twitter_user['description'] = ($profile->bio) ? $profile->bio : null;
+        $twitter_user['screen_name'] = $profile->getNickname();
+        $twitter_user['location'] = $profile->location;
+        $twitter_user['description'] = $profile->getDescription();
 
         // TODO: avatar url template (example.com/user/avatar?size={x}x{y})
         $twitter_user['profile_image_url'] = Avatar::urlByProfile($profile, AVATAR_STREAM_SIZE);
@@ -248,7 +248,7 @@ class ApiAction extends Action
 
         $twitter_user['friends_count'] = $profile->subscriptionCount();
 
-        $twitter_user['created_at'] = $this->dateTwitter($profile->created);
+        $twitter_user['created_at'] = self::dateTwitter($profile->created);
 
         $timezone = 'UTC';
 
@@ -274,11 +274,11 @@ class ApiAction extends Action
                 $sub = Subscription::getSubscription($this->scoped, $profile);
                 // Notifications on?
                 $twitter_user['following'] = true;
-                $twitter_user['statusnet_blocking']  = $this->scoped->hasBlocked($profile);
                 $twitter_user['notifications'] = ($sub->jabber || $sub->sms);
             } catch (NoResultException $e) {
                 // well, the values are already false...
             }
+            $twitter_user['statusnet_blocking']  = $this->scoped->hasBlocked($profile);            
         }
 
         if ($get_notice) {
@@ -303,6 +303,7 @@ class ApiAction extends Action
     {
         $base = $this->twitterSimpleStatusArray($notice, $include_user);
 
+        // FIXME: MOVE TO SHARE PLUGIN
         if (!empty($notice->repeat_of)) {
             $original = Notice::getKV('id', $notice->repeat_of);
             if ($original instanceof Notice) {
@@ -321,13 +322,16 @@ class ApiAction extends Action
         $twitter_status = array();
         $twitter_status['text'] = $notice->content;
         $twitter_status['truncated'] = false; # Not possible on StatusNet
-        $twitter_status['created_at'] = $this->dateTwitter($notice->created);
+        $twitter_status['created_at'] = self::dateTwitter($notice->created);
         try {
             // We could just do $notice->reply_to but maybe the future holds a
             // different story for parenting.
             $parent = $notice->getParent();
             $in_reply_to = $parent->id;
-        } catch (Exception $e) {
+        } catch (NoParentNoticeException $e) {
+            $in_reply_to = null;
+        } catch (NoResultException $e) {
+            // the in_reply_to message has probably been deleted
             $in_reply_to = null;
         }
         $twitter_status['in_reply_to_status_id'] = $in_reply_to;
@@ -365,21 +369,16 @@ class ApiAction extends Action
         $twitter_status['in_reply_to_screen_name'] =
             ($replier_profile) ? $replier_profile->nickname : null;
 
-        if (isset($notice->lat) && isset($notice->lon)) {
+        try {
+            $notloc = Notice_location::locFromStored($notice);
             // 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 {
+                                           'coordinates' => array((float) $notloc->lat,
+                                                                  (float) $notloc->lon));
+        } catch (ServerException $e) {
             $twitter_status['geo'] = null;
         }
 
-        if (!is_null($this->scoped)) {
-            $twitter_status['repeated']  = $this->scoped->hasRepeated($notice);
-        } else {
-            $twitter_status['repeated'] = false;
-        }
-
         // Enclosures
         $attachments = $notice->attachments();
 
@@ -409,7 +408,7 @@ class ApiAction extends Action
 
         // StatusNet-specific
 
-        $twitter_status['statusnet_html'] = $notice->rendered;
+        $twitter_status['statusnet_html'] = $notice->getRendered();
         $twitter_status['statusnet_conversation_id'] = intval($notice->conversation);
 
         // The event call to handle NoticeSimpleStatusArray lets plugins add data to the output array
@@ -445,8 +444,8 @@ class ApiAction extends Action
         $twitter_group['homepage'] = $group->homepage;
         $twitter_group['description'] = $group->description;
         $twitter_group['location'] = $group->location;
-        $twitter_group['created'] = $this->dateTwitter($group->created);
-        $twitter_group['modified'] = $this->dateTwitter($group->modified);
+        $twitter_group['created'] = self::dateTwitter($group->created);
+        $twitter_group['modified'] = self::dateTwitter($group->modified);
 
         return $twitter_group;
     }
@@ -504,7 +503,7 @@ class ApiAction extends Action
 
             // We trim() to avoid extraneous whitespace in the output
 
-            $entry['content'] = common_xml_safe_str(trim($notice->rendered));
+            $entry['content'] = common_xml_safe_str(trim($notice->getRendered()));
             $entry['title'] = $profile->nickname . ': ' . common_xml_safe_str(trim($notice->content));
             $entry['link'] = common_local_url('shownotice', array('notice' => $notice->id));
             $entry['published'] = common_date_iso8601($notice->created);
@@ -552,13 +551,14 @@ class ApiAction extends Action
             $entry['pubDate'] = common_date_rfc2822($notice->created);
             $entry['guid'] = $entry['link'];
 
-            if (isset($notice->lat) && isset($notice->lon)) {
+            try {
+                $notloc = Notice_location::locFromStored($notice);
                 // 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 {
+                                      'coordinates' => array((float) $notloc->lat,
+                                                             (float) $notloc->lon));
+            } catch (ServerException $e) {
                 $entry['geo'] = null;
             }
 
@@ -646,10 +646,16 @@ class ApiAction extends Action
                 $this->showGeoXML($value);
                 break;
             case 'retweeted_status':
+                // FIXME: MOVE TO SHARE PLUGIN
                 $this->showTwitterXmlStatus($value, 'retweeted_status');
                 break;
             default:
                 if (strncmp($element, 'statusnet_', 10) == 0) {
+                    if ($element === 'statusnet_in_groups' && is_array($value)) {
+                        // QVITTERFIX because it would cause an array to be sent as $value
+                        // THIS IS UNDOCUMENTED AND SHOULD NEVER BE RELIED UPON (qvitter uses json output)
+                        $value = json_encode($value);
+                    }
                     $this->element('statusnet:'.substr($element, 10), null, $value);
                 } else {
                     $this->element($element, null, $value);
@@ -765,9 +771,15 @@ class ApiAction extends Action
 
     function showJsonObjects($objects)
     {
-        print(json_encode($objects));
+        $json_objects = json_encode($objects);
+        if($json_objects === false) {
+            $this->clientError(_('JSON encoding failed. Error: ').json_last_error_msg());                 
+        } else {
+               print $json_objects;
+        }
     }
 
+
     function showSingleXmlStatus($notice)
     {
         $this->initDocument('xml');
@@ -797,7 +809,12 @@ class ApiAction extends Action
                                               'xmlns:statusnet' => 'http://status.net/schema/api/1/'));
 
         if (is_array($notice)) {
-            $notice = new ArrayWrapper($notice);
+            //FIXME: make everything calling showJsonTimeline use only Notice objects
+            $ids = array();
+            foreach ($notice as $n) {
+                $ids[] = $n->getID();
+            }
+            $notice = Notice::multiGet('id', $ids);
         }
 
         while ($notice->fetch()) {
@@ -853,7 +870,12 @@ class ApiAction extends Action
         $this->element('ttl', null, '40');
 
         if (is_array($notice)) {
-            $notice = new ArrayWrapper($notice);
+            //FIXME: make everything calling showJsonTimeline use only Notice objects
+            $ids = array();
+            foreach ($notice as $n) {
+                $ids[] = $n->getID();
+            }
+            $notice = Notice::multiGet('id', $ids);
         }
 
         while ($notice->fetch()) {
@@ -897,7 +919,12 @@ class ApiAction extends Action
         $this->element('subtitle', null, $subtitle);
 
         if (is_array($notice)) {
-            $notice = new ArrayWrapper($notice);
+            //FIXME: make everything calling showJsonTimeline use only Notice objects
+            $ids = array();
+            foreach ($notice as $n) {
+                $ids[] = $n->getID();
+            }
+            $notice = Notice::multiGet('id', $ids);
         }
 
         while ($notice->fetch()) {
@@ -1001,7 +1028,12 @@ class ApiAction extends Action
         $statuses = array();
 
         if (is_array($notice)) {
-            $notice = new ArrayWrapper($notice);
+            //FIXME: make everything calling showJsonTimeline use only Notice objects
+            $ids = array();
+            foreach ($notice as $n) {
+                $ids[] = $n->getID();
+            }
+            $notice = Notice::multiGet('id', $ids);
         }
 
         while ($notice->fetch()) {
@@ -1200,7 +1232,7 @@ class ApiAction extends Action
         $this->endDocument('xml');
     }
 
-    function dateTwitter($dt)
+    static function dateTwitter($dt)
     {
         $dateStr = date('d F Y H:i:s', strtotime($dt));
         $d = new DateTime($dateStr, new DateTimeZone('UTC'));
@@ -1372,20 +1404,21 @@ class ApiAction extends Action
                 if (self::is_decimal($this->arg('user_id'))) {
                     return Profile::getKV('id', $this->arg('user_id'));
                 }
-            } else if ($this->arg('screen_name')) {
+            } elseif (mb_strlen($this->arg('screen_name')) > 0) {
                 $nickname = common_canonical_nickname($this->arg('screen_name'));
-                $user = User::getKV('nickname', $nickname);
-                return $user instanceof User ? $user->getProfile() : null;
+                $user = User::getByNickname($nickname);
+                return $user->getProfile();
             } else {
                 // Fall back to trying the currently authenticated user
                 return $this->scoped;
             }
-        } else if (self::is_decimal($id)) {
-            return Profile::getKV($id);
+        } else if (self::is_decimal($id) && intval($id) > 0) {
+            return Profile::getByID($id);
         } else {
+            // FIXME: check if isAcct to identify remote profiles and not just local nicknames
             $nickname = common_canonical_nickname($id);
-            $user = User::getKV('nickname', $nickname);
-            return $user ? $user->getProfile() : null;
+            $user = User::getByNickname($nickname);
+            return $user->getProfile();
         }
     }