]> git.mxchange.org Git - quix0rs-gnu-social.git/blobdiff - actions/twitapifriendships.php
change Laconica and Control Yourself to StatusNet in PHP files
[quix0rs-gnu-social.git] / actions / twitapifriendships.php
index c8fe950291265c5f744ef0a82b0f55abeda46661..21ac16183c627d4418de16aca521616201960d1c 100644 (file)
@@ -1,7 +1,7 @@
 <?php
 /*
- * Laconica - a distributed open-source microblogging tool
- * Copyright (C) 2008, Controlez-Vous, Inc.
+ * StatusNet - a distributed open-source microblogging tool
+ * Copyright (C) 2008, 2009, StatusNet, Inc.
  *
  * This program is free software: you can redistribute it and/or modify
  * it under the terms of the GNU Affero General Public License as published by
  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
-if (!defined('LACONICA')) { exit(1); }
+if (!defined('LACONICA')) {
+    exit(1);
+}
 
 require_once(INSTALLDIR.'/lib/twitterapi.php');
 
-class TwitapifriendshipsAction extends TwitterapiAction {
-
-       function create($args, $apidata) {
-               parent::handle($args);
-
-               $id = $this->trimmed('id');
-
-               $other = $this->get_user($id);
-
-               if (!$other) {
-                       $this->client_error(_('No such user'));
-                       return;
-               }
-               
-               $user = $apidata['user'];
-               
-               if ($user->isSubscribed($other)) {
-                       $this->client_error(_('Already subscribed.'));
-                       return;
-               }
-               
-               $sub = new Subscription();
-               $sub->subscriber = $user->id;
-               $sub->subscribed = $other->id;
-
-               $result = $sub->insert();
-
-               if (!$result) {
-                       $this->server_error(_('Could not subscribe'));
-                       return;
-               }
-               
-               mail_subscribe_notify($other, $user);
-
-               $this->show_profile($other);
-               exit();
-       }
-       
-       //destroy
-       //
-       //Discontinues friendship with the user specified in the ID parameter as the authenticating user.  Returns the un-friended user in the requested format when successful.  Returns a string describing the failure condition when unsuccessful. 
-       //
-       //URL: http://twitter.com/friendships/destroy/id.format
-       //
-       //Formats: xml, json
-       //
-       //Parameters:
-       //
-       //* id.  Required.  The ID or screen name of the user with whom to discontinue friendship.  Ex: http://twitter.com/friendships/destroy/12345.json or http://twitter.com/friendships/destroy/bob.xml
-       
-       function destroy($args, $apidata) {
-               parent::handle($args);
-               $id = $this->trimmed('id');
-
-               # We can't subscribe to a remote person, but we can unsub
-               
-               $other = $this->get_profile($id);
-               $user = $apidata['user'];
-               
-               $sub = new Subscription();
-               $sub->subscriber = $user->id;
-               $sub->subscribed = $other->id;
-               
-               if ($sub->fetch(TRUE)) {
-                       $sub->delete();
-               }
-
-               $this->show_profile($other);
-               exit();
-       }
-
-       //      Tests if a friendship exists between two users.
-       //        
-       //        
-       //        URL: http://twitter.com/friendships/exists.format
-       //      
-       //      Formats: xml, json, none
-       //        
-       //        Parameters:
-       //      
-       //          * user_a.  Required.  The ID or screen_name of the first user to test friendship for.
-       //            * user_b.  Required.  The ID or screen_name of the second user to test friendship for.
-       //        * Ex: http://twitter.com/friendships/exists.xml?user_a=alice&user_b=bob
-       
-       function exists($args, $apidata) {
-               parent::handle($args);
-               $user_a_id = $this->trimmed('user_a');
-               $user_b_id = $this->trimmed('user_b');
-               $user_a = $this->get_profile($user_a_id);
-               $user_b = $this->get_profile($user_b_id);
-               
-               if (!$user_a || !$user_b) {
-                       $this->client_error(_('No such user'));
-                       return;
-               }
-               
-               if ($user_a->isSubscribed($user_b)) {
-                       $result = 'true';
-               } else {
-                       $result = 'false';
-               }
-               
-               switch ($apidata['content-type']) {
-                case 'xml':
-                       common_start_xml();
-                       common_element('friends', NULL, $result);
-                       common_end_xml();
-                       break;
-                case 'json':
-                       print json_encode($result);
-                       print "\n";
-                       break;
-                default:
-                       print $result;
-                       break;
-               }
-               
-       }
-
-       function get_profile($id) {
-               if (is_numeric($id)) {
-                       return Profile::staticGet($id);
-               } else {
-                       $user = User::staticGet('nickname', $id);
-                       return $user->getProfile();
-               }
-       }
-       
-       function get_user($id) {
-               if (is_numeric($id)) {
-                       return User::staticGet($id);
-               } else {
-                       $user = User::staticGet('nickname', $id);
-                       return $user->getProfile();
-               }
-       }
-       
-       function show_profile($profile) {
-               $profile_array = $this->user_array($profile);
-               $notice = $profile->getCurrentStatus();
-               if ($notice) {
-                       $status_array = $this->status_array($notice):
-               }
-       }
-}
\ No newline at end of file
+class TwitapifriendshipsAction extends TwitterapiAction
+{
+
+    function create($args, $apidata)
+    {
+        parent::handle($args);
+
+        if ($_SERVER['REQUEST_METHOD'] != 'POST') {
+            $this->clientError(_('This method requires a POST.'),
+                400, $apidata['content-type']);
+            return;
+        }
+
+        $id    = $apidata['api_arg'];
+        $other = $this->get_user($id);
+
+        if (empty($other)) {
+            $this->clientError(_('Could not follow user: User not found.'),
+                403, $apidata['content-type']);
+            return;
+        }
+
+        $user = $apidata['user'];
+
+        if ($user->isSubscribed($other)) {
+            $errmsg = sprintf(_('Could not follow user: %s is already on your list.'),
+                $other->nickname);
+            $this->clientError($errmsg, 403, $apidata['content-type']);
+            return;
+        }
+
+        $sub = new Subscription();
+
+        $sub->query('BEGIN');
+
+        $sub->subscriber = $user->id;
+        $sub->subscribed = $other->id;
+        $sub->created = DB_DataObject_Cast::dateTime(); # current time
+
+        $result = $sub->insert();
+
+        if (empty($result)) {
+            $errmsg = sprintf(_('Could not follow user: %s is already on your list.'),
+                $other->nickname);
+            $this->clientError($errmsg, 400, $apidata['content-type']);
+            return;
+        }
+
+        $sub->query('COMMIT');
+
+        mail_subscribe_notify($other, $user);
+
+        $type = $apidata['content-type'];
+        $this->init_document($type);
+        $this->show_profile($other, $type);
+        $this->end_document($type);
+
+    }
+
+    function destroy($args, $apidata)
+    {
+        parent::handle($args);
+
+        if (!in_array($_SERVER['REQUEST_METHOD'], array('POST', 'DELETE'))) {
+            $this->clientError(_('This method requires a POST or DELETE.'),
+                400, $apidata['content-type']);
+            return;
+        }
+
+        $id = $apidata['api_arg'];
+
+        # We can't subscribe to a remote person, but we can unsub
+
+        $other = $this->get_profile($id);
+        $user = $apidata['user']; // Alwyas the auth user
+
+        $sub = new Subscription();
+        $sub->subscriber = $user->id;
+        $sub->subscribed = $other->id;
+
+        if ($sub->find(true)) {
+            $sub->query('BEGIN');
+            $sub->delete();
+            $sub->query('COMMIT');
+        } else {
+            $this->clientError(_('You are not friends with the specified user.'),
+                403, $apidata['content-type']);
+            return;
+        }
+
+        $type = $apidata['content-type'];
+        $this->init_document($type);
+        $this->show_profile($other, $type);
+        $this->end_document($type);
+
+    }
+
+    function exists($args, $apidata)
+    {
+        parent::handle($args);
+
+        if (!in_array($apidata['content-type'], array('xml', 'json'))) {
+            $this->clientError(_('API method not found!'), $code = 404);
+            return;
+        }
+
+        $user_a_id = $this->trimmed('user_a');
+        $user_b_id = $this->trimmed('user_b');
+
+        $user_a = $this->get_user($user_a_id);
+        $user_b = $this->get_user($user_b_id);
+
+        if (empty($user_a) || empty($user_b)) {
+            $this->clientError(_('Two user ids or screen_names must be supplied.'),
+                400, $apidata['content-type']);
+            return;
+        }
+
+        $result = $user_a->isSubscribed($user_b);
+
+        switch ($apidata['content-type']) {
+         case 'xml':
+            $this->init_document('xml');
+            $this->element('friends', null, $result);
+            $this->end_document('xml');
+            break;
+         case 'json':
+            $this->init_document('json');
+            print json_encode($result);
+            $this->end_document('json');
+            break;
+         default:
+            break;
+        }
+
+    }
+
+    function show($args, $apidata)
+    {
+        parent::handle($args);
+
+        if (!in_array($apidata['content-type'], array('xml', 'json'))) {
+            $this->clientError(_('API method not found!'), $code = 404);
+            return;
+        }
+
+        $source_id          = (int)$this->trimmed('source_id');
+        $source_screen_name = $this->trimmed('source_screen_name');
+
+        // If the source is not specified for an unauthenticated request,
+        // the method will return an HTTP 403.
+
+        if (empty($source_id) && empty($source_screen_name)) {
+            if (empty($apidata['user'])) {
+                $this->clientError(_('Could not determine source user.'),
+                        $code = 403);
+                return;
+            }
+        }
+
+        $source = null;
+
+        if (!empty($source_id)) {
+            $source = User::staticGet($source_id);
+        } elseif (!empty($source_screen_name)) {
+            $source = User::staticGet('nickname', $source_screen_name);
+        } else {
+            $source = $apidata['user'];
+        }
+
+        // If a source or target is specified but does not exist,
+        // the method will return an HTTP 404.
+
+        if (empty($source)) {
+            $this->clientError(_('Could not determine source user.'),
+                $code = 404);
+            return;
+        }
+
+        $target_id          = (int)$this->trimmed('target_id');
+        $target_screen_name = $this->trimmed('target_screen_name');
+
+        $target = null;
+
+        if (!empty($target_id)) {
+            $target = User::staticGet($target_id);
+        } elseif (!empty($target_screen_name)) {
+            $target = User::staticGet('nickname', $target_screen_name);
+        } else {
+            $this->clientError(_('Target user not specified.'),
+                $code = 403);
+            return;
+        }
+
+        if (empty($target)) {
+            $this->clientError(_('Could not find target user.'),
+                $code = 404);
+            return;
+        }
+
+        $result = $this->twitter_relationship_array($source, $target);
+
+        switch ($apidata['content-type']) {
+        case 'xml':
+            $this->init_document('xml');
+            $this->show_twitter_xml_relationship($result[relationship]);
+            $this->end_document('xml');
+            break;
+        case 'json':
+            $this->init_document('json');
+            print json_encode($result);
+            $this->end_document('json');
+            break;
+        default:
+            break;
+        }
+    }
+
+}