2008-07-14 17:09:49 +09:00
< ? php
/*
* Laconica - a distributed open - source microblogging tool
* Copyright ( C ) 2008 , Controlez - Vous , 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
* the Free Software Foundation , either version 3 of the License , or
* ( at your option ) any later version .
*
* This program is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU Affero General Public License for more details .
*
* 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 />.
*/
if ( ! defined ( 'LACONICA' )) { exit ( 1 ); }
2008-07-15 12:18:12 +09:00
require_once ( INSTALLDIR . '/lib/twitterapi.php' );
2008-07-15 13:31:21 +09:00
class TwitapifriendshipsAction extends TwitterapiAction {
2008-07-14 17:09:49 +09:00
2008-07-23 03:29:19 +09:00
function is_readonly () {
static $write_methods = array ( 'create' ,
'destroy' );
$cmdtext = explode ( '.' , $this -> arg ( 'method' ));
if ( in_array ( $cmdtext [ 0 ], $write_methods )) {
return false ;
}
return true ;
}
2008-07-14 17:09:49 +09:00
function create ( $args , $apidata ) {
parent :: handle ( $args );
2008-07-18 13:13:23 +09:00
2008-08-20 06:49:23 +09:00
if ( $_SERVER [ 'REQUEST_METHOD' ] != 'POST' ) {
$this -> client_error ( _ ( 'This method requires a POST.' ), 400 , $apidata [ 'content-type' ]);
exit ();
}
2008-07-18 13:23:52 +09:00
$id = $apidata [ 'api_arg' ];
2008-07-18 13:13:23 +09:00
$other = $this -> get_user ( $id );
if ( ! $other ) {
2008-07-20 16:09:05 +09:00
$this -> client_error ( _ ( 'Could not follow user: User not found.' ), 403 , $apidata [ 'content-type' ]);
2008-07-18 13:34:56 +09:00
exit ();
2008-07-18 13:13:23 +09:00
}
$user = $apidata [ 'user' ];
if ( $user -> isSubscribed ( $other )) {
2008-08-19 09:29:03 +09:00
$errmsg = sprintf ( _ ( 'Could not follow user: %s is already on your list.' ), $other -> nickname );
$this -> client_error ( $errmsg , 403 , $apidata [ 'content-type' ]);
2008-07-18 13:34:56 +09:00
exit ();
2008-07-18 13:13:23 +09:00
}
$sub = new Subscription ();
2008-07-18 13:37:35 +09:00
$sub -> query ( 'BEGIN' );
2008-07-18 13:13:23 +09:00
$sub -> subscriber = $user -> id ;
$sub -> subscribed = $other -> id ;
2008-07-18 13:51:50 +09:00
$sub -> created = DB_DataObject_Cast :: dateTime (); # current time
2008-07-18 13:13:23 +09:00
$result = $sub -> insert ();
if ( ! $result ) {
2008-08-19 09:29:03 +09:00
$errmsg = sprintf ( _ ( 'Could not follow user: %s is already on your list.' ), $other -> nickname );
$this -> client_error ( $errmsg , 400 , $apidata [ 'content-type' ]);
2008-07-18 13:34:56 +09:00
exit ();
2008-07-18 13:13:23 +09:00
}
2008-07-18 13:37:35 +09:00
$sub -> query ( 'COMMIT' );
2008-07-18 13:13:23 +09:00
mail_subscribe_notify ( $other , $user );
2008-07-18 13:34:56 +09:00
$type = $apidata [ 'content-type' ];
$this -> init_document ( $type );
2008-07-20 17:34:28 +09:00
$this -> show_profile ( $other , $type );
2008-07-18 13:34:56 +09:00
$this -> end_document ( $type );
2008-07-14 17:09:49 +09:00
exit ();
}
2008-07-18 13:13:23 +09:00
//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
2008-07-14 17:09:49 +09:00
function destroy ( $args , $apidata ) {
parent :: handle ( $args );
2008-08-20 06:49:23 +09:00
if ( ! in_array ( $_SERVER [ 'REQUEST_METHOD' ], array ( 'POST' , 'DELETE' ))) {
$this -> client_error ( _ ( 'This method requires a POST or DELETE.' ), 400 , $apidata [ 'content-type' ]);
exit ();
}
2008-07-18 13:23:52 +09:00
$id = $apidata [ 'api_arg' ];
2008-07-18 13:13:23 +09:00
# 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 ;
2008-07-18 13:52:04 +09:00
if ( $sub -> find ( TRUE )) {
2008-07-18 13:37:35 +09:00
$sub -> query ( 'BEGIN' );
2008-07-18 13:13:23 +09:00
$sub -> delete ();
2008-07-18 13:37:35 +09:00
$sub -> query ( 'COMMIT' );
2008-07-18 13:49:05 +09:00
} else {
2008-07-20 16:09:05 +09:00
$this -> client_error ( _ ( 'You are not friends with the specified user.' ), 403 , $apidata [ 'content-type' ]);
2008-07-18 13:49:05 +09:00
exit ();
2008-07-18 13:13:23 +09:00
}
2008-07-18 13:34:56 +09:00
$type = $apidata [ 'content-type' ];
2008-07-20 17:34:28 +09:00
$this -> init_document ( $type );
$this -> show_profile ( $other , $type );
2008-07-18 13:34:56 +09:00
$this -> end_document ( $type );
2008-07-14 17:09:49 +09:00
exit ();
}
2008-07-18 13:13:23 +09:00
// 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
2008-07-14 17:09:49 +09:00
function exists ( $args , $apidata ) {
parent :: handle ( $args );
2008-07-20 16:09:05 +09:00
2008-07-18 13:13:23 +09:00
$user_a_id = $this -> trimmed ( 'user_a' );
$user_b_id = $this -> trimmed ( 'user_b' );
2008-07-20 16:09:05 +09:00
2008-07-20 17:39:48 +09:00
$user_a = $this -> get_user ( $user_a_id );
$user_b = $this -> get_user ( $user_b_id );
2008-07-18 13:13:23 +09:00
if ( ! $user_a || ! $user_b ) {
2008-07-20 16:09:05 +09:00
$this -> client_error ( _ ( 'Two user ids or screen_names must be supplied.' ), 400 , $apidata [ 'content-type' ]);
exit ();
2008-07-18 13:13:23 +09:00
}
if ( $user_a -> isSubscribed ( $user_b )) {
$result = 'true' ;
} else {
$result = 'false' ;
}
switch ( $apidata [ 'content-type' ]) {
case 'xml' :
2008-07-20 17:34:28 +09:00
$this -> init_document ( 'xml' );
2008-07-18 13:13:23 +09:00
common_element ( 'friends' , NULL , $result );
2008-07-20 17:34:28 +09:00
$this -> end_document ( 'xml' );
2008-07-18 13:13:23 +09:00
break ;
case 'json' :
2008-07-20 17:34:28 +09:00
$this -> init_document ( 'json' );
2008-07-18 13:13:23 +09:00
print json_encode ( $result );
2008-07-20 17:34:28 +09:00
$this -> end_document ( 'json' );
2008-07-18 13:13:23 +09:00
break ;
default :
2008-07-20 17:34:28 +09:00
print $result ; // Really? --Zach
2008-07-18 13:13:23 +09:00
break ;
}
2008-07-20 16:09:05 +09:00
exit ();
2008-07-18 13:13:23 +09:00
}
function get_profile ( $id ) {
if ( is_numeric ( $id )) {
return Profile :: staticGet ( $id );
} else {
2008-07-20 16:09:05 +09:00
$user = User :: staticGet ( 'nickname' , $id );
2008-07-18 13:20:30 +09:00
if ( $user ) {
return $user -> getProfile ();
} else {
return NULL ;
}
2008-07-18 13:13:23 +09:00
}
}
function get_user ( $id ) {
if ( is_numeric ( $id )) {
return User :: staticGet ( $id );
} else {
2008-07-18 13:20:30 +09:00
return User :: staticGet ( 'nickname' , $id );
2008-07-18 13:13:23 +09:00
}
2008-07-14 17:09:49 +09:00
}
}