2008-07-14 09:09:49 +01: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 04:18:12 +01:00
require_once ( INSTALLDIR . '/lib/twitterapi.php' );
2008-07-15 05:31:21 +01:00
class TwitapifriendshipsAction extends TwitterapiAction {
2008-07-14 09:09:49 +01:00
2008-07-22 19:29:19 +01:00
function is_readonly () {
2008-09-29 06:08:26 +01:00
2008-07-22 19:29:19 +01:00
static $write_methods = array ( 'create' ,
'destroy' );
2008-09-29 06:08:26 +01:00
$cmdtext = explode ( '.' , $this -> arg ( 'method' ));
if ( in_array ( $cmdtext [ 0 ], $write_methods )) {
2008-07-22 19:29:19 +01:00
return false ;
}
2008-09-29 06:08:26 +01:00
2008-07-22 19:29:19 +01:00
return true ;
}
2008-07-14 09:09:49 +01:00
function create ( $args , $apidata ) {
parent :: handle ( $args );
2008-07-18 05:13:23 +01:00
2008-08-19 22:49:23 +01:00
if ( $_SERVER [ 'REQUEST_METHOD' ] != 'POST' ) {
$this -> client_error ( _ ( 'This method requires a POST.' ), 400 , $apidata [ 'content-type' ]);
exit ();
}
2008-07-18 05:23:52 +01:00
$id = $apidata [ 'api_arg' ];
2008-07-18 05:13:23 +01:00
$other = $this -> get_user ( $id );
if ( ! $other ) {
2008-07-20 08:09:05 +01:00
$this -> client_error ( _ ( 'Could not follow user: User not found.' ), 403 , $apidata [ 'content-type' ]);
2008-07-18 05:34:56 +01:00
exit ();
2008-07-18 05:13:23 +01:00
}
2008-09-29 06:08:26 +01:00
2008-07-18 05:13:23 +01:00
$user = $apidata [ 'user' ];
2008-09-29 06:08:26 +01:00
2008-07-18 05:13:23 +01:00
if ( $user -> isSubscribed ( $other )) {
2008-08-19 01:29:03 +01: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 05:34:56 +01:00
exit ();
2008-07-18 05:13:23 +01:00
}
2008-09-29 06:08:26 +01:00
2008-07-18 05:13:23 +01:00
$sub = new Subscription ();
2008-09-29 06:08:26 +01:00
2008-07-18 05:37:35 +01:00
$sub -> query ( 'BEGIN' );
2008-09-29 06:08:26 +01:00
2008-07-18 05:13:23 +01:00
$sub -> subscriber = $user -> id ;
$sub -> subscribed = $other -> id ;
2008-07-18 05:51:50 +01:00
$sub -> created = DB_DataObject_Cast :: dateTime (); # current time
2008-09-29 06:08:26 +01:00
2008-07-18 05:13:23 +01:00
$result = $sub -> insert ();
if ( ! $result ) {
2008-08-19 01:29:03 +01:00
$errmsg = sprintf ( _ ( 'Could not follow user: %s is already on your list.' ), $other -> nickname );
2008-09-29 06:08:26 +01:00
$this -> client_error ( $errmsg , 400 , $apidata [ 'content-type' ]);
2008-07-18 05:34:56 +01:00
exit ();
2008-07-18 05:13:23 +01:00
}
2008-09-29 06:08:26 +01:00
2008-07-18 05:37:35 +01:00
$sub -> query ( 'COMMIT' );
2008-09-29 06:08:26 +01:00
2008-07-18 05:13:23 +01:00
mail_subscribe_notify ( $other , $user );
2008-07-18 05:34:56 +01:00
$type = $apidata [ 'content-type' ];
$this -> init_document ( $type );
2008-07-20 09:34:28 +01:00
$this -> show_profile ( $other , $type );
2008-07-18 05:34:56 +01:00
$this -> end_document ( $type );
2008-07-14 09:09:49 +01:00
exit ();
}
2008-09-29 06:08:26 +01:00
2008-07-18 05:13:23 +01:00
//destroy
//
2008-09-29 06:08:26 +01:00
//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.
2008-07-18 05:13:23 +01:00
//
//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-09-29 06:08:26 +01:00
2008-07-14 09:09:49 +01:00
function destroy ( $args , $apidata ) {
parent :: handle ( $args );
2008-09-29 06:08:26 +01:00
2008-08-19 22:49:23 +01: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-09-29 06:08:26 +01:00
2008-07-18 05:23:52 +01:00
$id = $apidata [ 'api_arg' ];
2008-07-18 05:13:23 +01:00
# We can't subscribe to a remote person, but we can unsub
2008-09-29 06:08:26 +01:00
2008-07-18 05:13:23 +01:00
$other = $this -> get_profile ( $id );
$user = $apidata [ 'user' ];
2008-09-29 06:08:26 +01:00
2008-07-18 05:13:23 +01:00
$sub = new Subscription ();
$sub -> subscriber = $user -> id ;
$sub -> subscribed = $other -> id ;
2008-09-29 06:08:26 +01:00
2008-07-18 05:52:04 +01:00
if ( $sub -> find ( TRUE )) {
2008-07-18 05:37:35 +01:00
$sub -> query ( 'BEGIN' );
2008-07-18 05:13:23 +01:00
$sub -> delete ();
2008-07-18 05:37:35 +01:00
$sub -> query ( 'COMMIT' );
2008-07-18 05:49:05 +01:00
} else {
2008-09-29 06:08:26 +01:00
$this -> client_error ( _ ( 'You are not friends with the specified user.' ), 403 , $apidata [ 'content-type' ]);
2008-07-18 05:49:05 +01:00
exit ();
2008-07-18 05:13:23 +01:00
}
2008-07-18 05:34:56 +01:00
$type = $apidata [ 'content-type' ];
2008-09-29 06:08:26 +01:00
$this -> init_document ( $type );
2008-07-20 09:34:28 +01:00
$this -> show_profile ( $other , $type );
2008-07-18 05:34:56 +01:00
$this -> end_document ( $type );
2008-07-14 09:09:49 +01:00
exit ();
}
2008-07-18 05:13:23 +01:00
// Tests if a friendship exists between two users.
2008-09-29 06:08:26 +01:00
//
//
2008-07-18 05:13:23 +01:00
// URL: http://twitter.com/friendships/exists.format
2008-09-29 06:08:26 +01:00
//
2008-07-18 05:13:23 +01:00
// Formats: xml, json, none
2008-09-29 06:08:26 +01:00
//
2008-07-18 05:13:23 +01:00
// Parameters:
2008-09-29 06:08:26 +01:00
//
2008-07-18 05:13:23 +01:00
// * 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-09-29 06:08:26 +01:00
2008-07-14 09:09:49 +01:00
function exists ( $args , $apidata ) {
parent :: handle ( $args );
2008-09-29 06:08:26 +01:00
2008-07-18 05:13:23 +01:00
$user_a_id = $this -> trimmed ( 'user_a' );
$user_b_id = $this -> trimmed ( 'user_b' );
2008-09-29 06:08:26 +01:00
2008-07-20 09:39:48 +01:00
$user_a = $this -> get_user ( $user_a_id );
$user_b = $this -> get_user ( $user_b_id );
2008-09-29 06:08:26 +01:00
2008-07-18 05:13:23 +01:00
if ( ! $user_a || ! $user_b ) {
2008-07-20 08:09:05 +01:00
$this -> client_error ( _ ( 'Two user ids or screen_names must be supplied.' ), 400 , $apidata [ 'content-type' ]);
exit ();
2008-07-18 05:13:23 +01:00
}
2008-09-29 06:08:26 +01:00
2008-07-18 05:13:23 +01:00
if ( $user_a -> isSubscribed ( $user_b )) {
$result = 'true' ;
} else {
$result = 'false' ;
}
2008-09-29 06:08:26 +01:00
2008-07-18 05:13:23 +01:00
switch ( $apidata [ 'content-type' ]) {
case 'xml' :
2008-07-20 09:34:28 +01:00
$this -> init_document ( 'xml' );
2008-07-18 05:13:23 +01:00
common_element ( 'friends' , NULL , $result );
2008-07-20 09:34:28 +01:00
$this -> end_document ( 'xml' );
2008-07-18 05:13:23 +01:00
break ;
case 'json' :
2008-07-20 09:34:28 +01:00
$this -> init_document ( 'json' );
2008-07-18 05:13:23 +01:00
print json_encode ( $result );
2008-07-20 09:34:28 +01:00
$this -> end_document ( 'json' );
2008-07-18 05:13:23 +01:00
break ;
default :
2008-07-20 09:34:28 +01:00
print $result ; // Really? --Zach
2008-07-18 05:13:23 +01:00
break ;
}
2008-09-29 06:08:26 +01:00
2008-07-20 08:09:05 +01:00
exit ();
2008-07-18 05:13:23 +01:00
}
2008-07-14 09:09:49 +01:00
}