2011-02-15 11:24:21 +00:00
< ? php
2012-12-28 21:51:50 +00:00
require_once ( " include/bbcode.php " );
require_once ( " include/datetime.php " );
require_once ( " include/conversation.php " );
require_once ( " include/oauth.php " );
require_once ( " include/html2plain.php " );
2012-04-22 16:00:24 +00:00
/*
2011-02-15 11:24:21 +00:00
* Twitter - Like API
2012-04-22 16:00:24 +00:00
*
2011-02-15 11:24:21 +00:00
*/
$API = Array ();
2012-04-22 16:00:24 +00:00
$called_api = Null ;
2011-04-21 15:03:31 +00:00
2012-12-01 00:26:54 +00:00
function api_user () {
// It is not sufficient to use local_user() to check whether someone is allowed to use the API,
// because this will open CSRF holes (just embed an image with src=friendicasite.com/api/statuses/update?status=CSRF
// into a page, and visitors will post something without noticing it).
// Instead, use this function.
if ( $_SESSION [ " allow_api " ])
return local_user ();
return false ;
}
2011-02-15 11:24:21 +00:00
function api_date ( $str ){
//Wed May 23 06:01:13 +0000 2007
2011-08-16 11:55:38 +00:00
return datetime_convert ( 'UTC' , 'UTC' , $str , " D M d H:i:s +0000 Y " );
2011-02-15 11:24:21 +00:00
}
2012-04-22 16:00:24 +00:00
2011-02-15 11:24:21 +00:00
function api_register_func ( $path , $func , $auth = false ){
global $API ;
$API [ $path ] = array ( 'func' => $func ,
2011-02-16 07:56:47 +00:00
'auth' => $auth );
2011-02-15 11:24:21 +00:00
}
2012-04-22 16:00:24 +00:00
2011-02-15 11:24:21 +00:00
/**
* Simple HTTP Login
*/
2012-01-15 21:57:00 +00:00
2011-02-15 11:24:21 +00:00
function api_login ( & $a ){
2011-11-07 16:36:58 +00:00
// login with oauth
try {
$oauth = new FKOAuth1 ();
list ( $consumer , $token ) = $oauth -> verify_request ( OAuthRequest :: from_request ());
if ( ! is_null ( $token )){
$oauth -> loginUser ( $token -> uid );
call_hooks ( 'logged_in' , $a -> user );
return ;
}
echo __file__ . __line__ . __function__ . " <pre> " ; var_dump ( $consumer , $token ); die ();
} catch ( Exception $e ){
logger ( __file__ . __line__ . __function__ . " \n " . $e );
//die(__file__.__line__.__function__."<pre>".$e); die();
}
2011-06-20 03:13:24 +00:00
// workaround for HTTP-auth in CGI mode
if ( x ( $_SERVER , 'REDIRECT_REMOTE_USER' )) {
$userpass = base64_decode ( substr ( $_SERVER [ " REDIRECT_REMOTE_USER " ], 6 )) ;
if ( strlen ( $userpass )) {
list ( $name , $password ) = explode ( ':' , $userpass );
$_SERVER [ 'PHP_AUTH_USER' ] = $name ;
$_SERVER [ 'PHP_AUTH_PW' ] = $password ;
}
}
2011-02-15 11:24:21 +00:00
if ( ! isset ( $_SERVER [ 'PHP_AUTH_USER' ])) {
2011-06-20 03:13:24 +00:00
logger ( 'API_login: ' . print_r ( $_SERVER , true ), LOGGER_DEBUG );
2012-01-15 21:57:00 +00:00
header ( 'WWW-Authenticate: Basic realm="Friendica"' );
2011-02-15 11:24:21 +00:00
header ( 'HTTP/1.0 401 Unauthorized' );
2011-06-20 03:13:24 +00:00
die ( 'This api requires login' );
2011-02-15 11:24:21 +00:00
}
$user = $_SERVER [ 'PHP_AUTH_USER' ];
$encrypted = hash ( 'whirlpool' , trim ( $_SERVER [ 'PHP_AUTH_PW' ]));
2011-04-21 15:03:31 +00:00
/**
* next code from mod / auth . php . needs better solution
*/
2011-02-15 11:24:21 +00:00
// process normal login request
$r = q ( " SELECT * FROM `user` WHERE ( `email` = '%s' OR `nickname` = '%s' )
2012-11-02 20:43:47 +00:00
AND `password` = '%s' AND `blocked` = 0 AND `account_expired` = 0 AND `account_removed` = 0 AND `verified` = 1 LIMIT 1 " ,
2011-02-15 11:24:21 +00:00
dbesc ( trim ( $user )),
dbesc ( trim ( $user )),
dbesc ( $encrypted )
);
2011-04-27 15:46:23 +00:00
if ( count ( $r )){
2011-02-15 11:24:21 +00:00
$record = $r [ 0 ];
2011-04-27 15:46:23 +00:00
} else {
2011-06-20 03:13:24 +00:00
logger ( 'API_login failure: ' . print_r ( $_SERVER , true ), LOGGER_DEBUG );
2012-04-01 07:52:45 +00:00
header ( 'WWW-Authenticate: Basic realm="Friendica"' );
2011-04-27 15:46:23 +00:00
header ( 'HTTP/1.0 401 Unauthorized' );
2011-06-20 03:13:24 +00:00
die ( 'This api requires login' );
2011-04-27 15:46:23 +00:00
}
2011-02-15 11:24:21 +00:00
2012-01-12 23:46:39 +00:00
require_once ( 'include/security.php' );
2012-12-01 00:26:54 +00:00
authenticate_success ( $record ); $_SESSION [ " allow_api " ] = true ;
2011-02-15 11:24:21 +00:00
call_hooks ( 'logged_in' , $a -> user );
}
2011-04-21 15:03:31 +00:00
/**************************
* MAIN API ENTRY POINT *
**************************/
2011-02-15 11:24:21 +00:00
function api_call ( & $a ){
2011-08-26 14:35:51 +00:00
GLOBAL $API , $called_api ;
2012-02-20 00:53:22 +00:00
// preset
$type = " json " ;
2011-02-15 11:24:21 +00:00
foreach ( $API as $p => $info ){
if ( strpos ( $a -> query_string , $p ) === 0 ){
2011-08-26 14:35:51 +00:00
$called_api = explode ( " / " , $p );
2012-01-12 23:46:39 +00:00
//unset($_SERVER['PHP_AUTH_USER']);
2012-12-01 00:26:54 +00:00
if ( $info [ 'auth' ] === true && api_user () === false ) {
2011-04-21 15:03:31 +00:00
api_login ( $a );
2011-02-15 11:24:21 +00:00
}
2011-07-31 23:35:53 +00:00
2012-12-01 00:26:54 +00:00
load_contact_links ( api_user ());
2011-07-31 23:35:53 +00:00
2012-02-20 00:53:22 +00:00
logger ( 'API call for ' . $a -> user [ 'username' ] . ': ' . $a -> query_string );
2011-08-01 12:13:59 +00:00
logger ( 'API parameters: ' . print_r ( $_REQUEST , true ));
2012-02-20 00:53:22 +00:00
$type = " json " ;
2011-04-21 15:03:31 +00:00
if ( strpos ( $a -> query_string , " .xml " ) > 0 ) $type = " xml " ;
if ( strpos ( $a -> query_string , " .json " ) > 0 ) $type = " json " ;
if ( strpos ( $a -> query_string , " .rss " ) > 0 ) $type = " rss " ;
2012-02-20 00:53:22 +00:00
if ( strpos ( $a -> query_string , " .atom " ) > 0 ) $type = " atom " ;
2012-04-08 15:23:38 +00:00
if ( strpos ( $a -> query_string , " .as " ) > 0 ) $type = " as " ;
2012-02-20 00:53:22 +00:00
2011-04-21 15:03:31 +00:00
$r = call_user_func ( $info [ 'func' ], $a , $type );
if ( $r === false ) return ;
switch ( $type ){
case " xml " :
$r = mb_convert_encoding ( $r , " UTF-8 " , mb_detect_encoding ( $r ));
header ( " Content-Type: text/xml " );
return '<?xml version="1.0" encoding="UTF-8"?>' . " \n " . $r ;
break ;
2012-02-20 00:53:22 +00:00
case " json " :
//header ("Content-Type: application/json");
2011-06-21 00:16:13 +00:00
foreach ( $r as $rr )
return json_encode ( $rr );
2011-04-21 15:03:31 +00:00
break ;
case " rss " :
header ( " Content-Type: application/rss+xml " );
return '<?xml version="1.0" encoding="UTF-8"?>' . " \n " . $r ;
break ;
case " atom " :
2011-06-21 09:41:16 +00:00
header ( " Content-Type: application/atom+xml " );
2011-04-21 15:03:31 +00:00
return '<?xml version="1.0" encoding="UTF-8"?>' . " \n " . $r ;
break ;
2012-04-08 15:23:38 +00:00
case " as " :
//header ("Content-Type: application/json");
//foreach($r as $rr)
// return json_encode($rr);
return json_encode ( $r );
break ;
2012-02-20 00:53:22 +00:00
2011-02-15 11:24:21 +00:00
}
//echo "<pre>"; var_dump($r); die();
}
}
2012-07-13 21:23:31 +00:00
header ( " HTTP/1.1 404 Not Found " );
2012-02-20 10:15:22 +00:00
logger ( 'API call not implemented: ' . $a -> query_string . " - " . print_r ( $_REQUEST , true ));
2011-08-01 03:01:00 +00:00
$r = '<status><error>not implemented</error></status>' ;
switch ( $type ){
case " xml " :
header ( " Content-Type: text/xml " );
return '<?xml version="1.0" encoding="UTF-8"?>' . " \n " . $r ;
break ;
2012-02-20 00:53:22 +00:00
case " json " :
header ( " Content-Type: application/json " );
2011-08-01 03:01:00 +00:00
return json_encode ( array ( 'error' => 'not implemented' ));
break ;
case " rss " :
header ( " Content-Type: application/rss+xml " );
return '<?xml version="1.0" encoding="UTF-8"?>' . " \n " . $r ;
break ;
case " atom " :
header ( " Content-Type: application/atom+xml " );
return '<?xml version="1.0" encoding="UTF-8"?>' . " \n " . $r ;
break ;
}
2011-02-15 11:24:21 +00:00
}
2011-04-21 15:03:31 +00:00
/**
* RSS extra info
*/
function api_rss_extra ( & $a , $arr , $user_info ){
if ( is_null ( $user_info )) $user_info = api_get_user ( $a );
2011-06-21 09:41:16 +00:00
$arr [ '$user' ] = $user_info ;
2011-04-21 15:03:31 +00:00
$arr [ '$rss' ] = array (
'alternate' => $user_info [ 'url' ],
'self' => $a -> get_baseurl () . " / " . $a -> query_string ,
2011-07-31 23:35:53 +00:00
'base' => $a -> get_baseurl (),
2011-04-21 15:03:31 +00:00
'updated' => api_date ( null ),
2011-07-31 23:35:53 +00:00
'atom_updated' => datetime_convert ( 'UTC' , 'UTC' , 'now' , ATOM_TIME ),
2011-04-21 15:03:31 +00:00
'language' => $user_info [ 'language' ],
2012-02-19 18:34:48 +00:00
'logo' => $a -> get_baseurl () . " /images/friendica-32.png " ,
2011-04-21 15:03:31 +00:00
);
return $arr ;
}
2011-02-15 11:24:21 +00:00
/**
2011-04-21 15:03:31 +00:00
* Returns user info array .
2011-02-15 11:24:21 +00:00
*/
2011-07-31 07:53:46 +00:00
function api_get_user ( & $a , $contact_id = Null ){
2011-08-26 14:35:51 +00:00
global $called_api ;
2011-02-15 11:24:21 +00:00
$user = null ;
$extra_query = " " ;
2011-07-31 07:53:46 +00:00
2011-08-19 14:55:43 +00:00
2011-06-21 09:41:16 +00:00
if ( ! is_null ( $contact_id )){
$user = $contact_id ;
$extra_query = " AND `contact`.`id` = %d " ;
}
if ( is_null ( $user ) && x ( $_GET , 'user_id' )) {
2011-02-15 11:24:21 +00:00
$user = intval ( $_GET [ 'user_id' ]);
2011-04-21 15:03:31 +00:00
$extra_query = " AND `contact`.`id` = %d " ;
2011-02-15 11:24:21 +00:00
}
2011-06-21 09:41:16 +00:00
if ( is_null ( $user ) && x ( $_GET , 'screen_name' )) {
2011-02-15 11:24:21 +00:00
$user = dbesc ( $_GET [ 'screen_name' ]);
2011-04-21 15:03:31 +00:00
$extra_query = " AND `contact`.`nick` = '%s' " ;
2012-12-01 00:26:54 +00:00
if ( api_user () !== false ) $extra_query .= " AND `contact`.`uid`= " . intval ( api_user ());
2011-08-26 14:35:51 +00:00
2011-02-15 11:24:21 +00:00
}
2011-08-26 14:35:51 +00:00
if ( is_null ( $user ) && $a -> argc > ( count ( $called_api ) - 1 )){
$argid = count ( $called_api );
list ( $user , $null ) = explode ( " . " , $a -> argv [ $argid ]);
2011-02-15 11:24:21 +00:00
if ( is_numeric ( $user )){
$user = intval ( $user );
2011-04-21 15:03:31 +00:00
$extra_query = " AND `contact`.`id` = %d " ;
2011-02-15 11:24:21 +00:00
} else {
$user = dbesc ( $user );
2011-04-21 15:03:31 +00:00
$extra_query = " AND `contact`.`nick` = '%s' " ;
2012-12-01 00:26:54 +00:00
if ( api_user () !== false ) $extra_query .= " AND `contact`.`uid`= " . intval ( api_user ());
2011-02-15 11:24:21 +00:00
}
}
2011-08-01 12:13:59 +00:00
if ( ! $user ) {
2012-12-01 00:26:54 +00:00
if ( api_user () === false ) {
2011-02-16 07:56:47 +00:00
api_login ( $a ); return False ;
} else {
$user = $_SESSION [ 'uid' ];
2011-07-31 03:48:55 +00:00
$extra_query = " AND `contact`.`uid` = %d AND `contact`.`self` = 1 " ;
2011-02-16 07:56:47 +00:00
}
2011-02-15 11:24:21 +00:00
}
2012-06-12 02:21:35 +00:00
logger ( 'api_user: ' . $extra_query . ', user: ' . $user );
2011-02-15 11:24:21 +00:00
// user info
2011-06-21 09:41:16 +00:00
$uinfo = q ( " SELECT *, `contact`.`id` as `cid` FROM `contact`
WHERE 1
2011-02-15 11:24:21 +00:00
$extra_query " ,
$user
);
if ( count ( $uinfo ) == 0 ) {
return False ;
}
2011-08-01 03:01:00 +00:00
if ( $uinfo [ 0 ][ 'self' ]) {
2011-08-05 12:17:18 +00:00
$usr = q ( " select * from user where uid = %d limit 1 " ,
2012-12-01 00:26:54 +00:00
intval ( api_user ())
2011-08-05 12:17:18 +00:00
);
$profile = q ( " select * from profile where uid = %d and `is-default` = 1 limit 1 " ,
2012-12-01 00:26:54 +00:00
intval ( api_user ())
2011-08-05 12:17:18 +00:00
);
2011-08-01 03:01:00 +00:00
// count public wall messages
$r = q ( " SELECT COUNT(`id`) as `count` FROM `item`
WHERE `uid` = % d
AND `type` = 'wall'
AND `allow_cid` = '' AND `allow_gid` = '' AND `deny_cid` = '' AND `deny_gid` = '' " ,
intval ( $uinfo [ 0 ][ 'uid' ])
);
$countitms = $r [ 0 ][ 'count' ];
}
else {
$r = q ( " SELECT COUNT(`id`) as `count` FROM `item`
WHERE `contact-id` = % d
AND `allow_cid` = '' AND `allow_gid` = '' AND `deny_cid` = '' AND `deny_gid` = '' " ,
intval ( $uinfo [ 0 ][ 'id' ])
);
$countitms = $r [ 0 ][ 'count' ];
}
2011-02-15 11:24:21 +00:00
// count friends
$r = q ( " SELECT COUNT(`id`) as `count` FROM `contact`
2011-08-01 05:22:34 +00:00
WHERE `uid` = % d AND `rel` IN ( % d , % d )
2011-12-05 10:16:59 +00:00
AND `self` = 0 AND `blocked` = 0 AND `pending` = 0 AND `hidden` = 0 " ,
2011-08-01 05:22:34 +00:00
intval ( $uinfo [ 0 ][ 'uid' ]),
2011-08-07 23:15:54 +00:00
intval ( CONTACT_IS_SHARING ),
intval ( CONTACT_IS_FRIEND )
2011-02-15 11:24:21 +00:00
);
$countfriends = $r [ 0 ][ 'count' ];
2011-08-01 03:01:00 +00:00
2011-08-01 05:22:34 +00:00
$r = q ( " SELECT COUNT(`id`) as `count` FROM `contact`
WHERE `uid` = % d AND `rel` IN ( % d , % d )
2011-12-05 10:16:59 +00:00
AND `self` = 0 AND `blocked` = 0 AND `pending` = 0 AND `hidden` = 0 " ,
2011-08-01 05:22:34 +00:00
intval ( $uinfo [ 0 ][ 'uid' ]),
2011-08-07 23:15:54 +00:00
intval ( CONTACT_IS_FOLLOWER ),
intval ( CONTACT_IS_FRIEND )
2011-08-01 05:22:34 +00:00
);
$countfollowers = $r [ 0 ][ 'count' ];
2011-08-05 12:17:18 +00:00
$r = q ( " SELECT count(`id`) as `count` FROM item where starred = 1 and uid = %d and deleted = 0 " ,
intval ( $uinfo [ 0 ][ 'uid' ])
);
$starred = $r [ 0 ][ 'count' ];
2011-08-01 03:01:00 +00:00
if ( ! $uinfo [ 0 ][ 'self' ]) {
$countfriends = 0 ;
2011-08-01 05:22:34 +00:00
$countfollowers = 0 ;
2011-08-05 12:17:18 +00:00
$starred = 0 ;
2011-08-01 03:01:00 +00:00
}
2011-02-16 07:56:47 +00:00
$ret = Array (
2012-03-18 16:52:51 +00:00
'id' => intval ( $uinfo [ 0 ][ 'cid' ]),
2011-08-26 14:35:51 +00:00
'self' => intval ( $uinfo [ 0 ][ 'self' ]),
2011-08-05 02:47:45 +00:00
'uid' => intval ( $uinfo [ 0 ][ 'uid' ]),
2012-03-18 16:52:51 +00:00
'name' => (( $uinfo [ 0 ][ 'name' ]) ? $uinfo [ 0 ][ 'name' ] : $uinfo [ 0 ][ 'nick' ]),
2011-08-06 04:30:12 +00:00
'screen_name' => (( $uinfo [ 0 ][ 'nick' ]) ? $uinfo [ 0 ][ 'nick' ] : $uinfo [ 0 ][ 'name' ]),
2011-08-05 12:17:18 +00:00
'location' => ( $usr ) ? $usr [ 0 ][ 'default-location' ] : '' ,
2011-04-27 15:46:23 +00:00
'profile_image_url' => $uinfo [ 0 ][ 'micro' ],
2011-02-16 07:56:47 +00:00
'url' => $uinfo [ 0 ][ 'url' ],
2011-06-21 10:00:52 +00:00
'contact_url' => $a -> get_baseurl () . " /contacts/ " . $uinfo [ 0 ][ 'cid' ],
2011-08-05 12:17:18 +00:00
'protected' => false ,
2011-08-05 02:47:45 +00:00
'friends_count' => intval ( $countfriends ),
2011-06-21 09:41:16 +00:00
'created_at' => api_date ( $uinfo [ 0 ][ 'name-date' ]),
2011-08-05 12:17:18 +00:00
'utc_offset' => " +00:00 " ,
'time_zone' => 'UTC' , //$uinfo[0]['timezone'],
2011-02-16 07:56:47 +00:00
'geo_enabled' => false ,
2011-08-05 02:47:45 +00:00
'statuses_count' => intval ( $countitms ), #XXX: fix me
2011-02-16 07:56:47 +00:00
'lang' => 'en' , #XXX: fix me
2011-08-05 12:17:18 +00:00
'description' => (( $profile ) ? $profile [ 0 ][ 'pdesc' ] : '' ),
'followers_count' => intval ( $countfollowers ),
'favourites_count' => intval ( $starred ),
2011-02-16 07:56:47 +00:00
'contributors_enabled' => false ,
2011-08-26 14:35:51 +00:00
'follow_request_sent' => true ,
2011-02-16 07:56:47 +00:00
'profile_background_color' => 'cfe8f6' ,
'profile_text_color' => '000000' ,
'profile_link_color' => 'FF8500' ,
'profile_sidebar_fill_color' => 'AD0066' ,
'profile_sidebar_border_color' => 'AD0066' ,
'profile_background_image_url' => '' ,
'profile_background_tile' => false ,
'profile_use_background_image' => false ,
2011-04-21 15:03:31 +00:00
'notifications' => false ,
2011-08-05 12:17:18 +00:00
'following' => '' , #XXX: fix me
2011-04-21 15:03:31 +00:00
'verified' => true , #XXX: fix me
2011-08-19 14:55:43 +00:00
'status' => array ()
2011-02-16 07:56:47 +00:00
);
2011-04-21 15:03:31 +00:00
2011-02-16 07:56:47 +00:00
return $ret ;
}
2011-04-21 15:03:31 +00:00
2011-07-31 07:53:46 +00:00
function api_item_get_user ( & $a , $item ) {
2012-03-18 16:52:51 +00:00
global $usercache ;
2011-07-31 23:35:53 +00:00
// The author is our direct contact, in a conversation with us.
if ( link_compare ( $item [ 'url' ], $item [ 'author-link' ])) {
2011-07-31 07:53:46 +00:00
return api_get_user ( $a , $item [ 'cid' ]);
2011-07-31 23:35:53 +00:00
}
else {
// The author may be a contact of ours, but is replying to somebody else.
// Figure out if we know him/her.
$normalised = normalise_link (( strlen ( $item [ 'author-link' ])) ? $item [ 'author-link' ] : $item [ 'url' ]);
if (( $normalised != 'mailbox' ) && ( x ( $a -> contacts [ $normalised ])))
return api_get_user ( $a , $a -> contacts [ $normalised ][ 'id' ]);
}
// We don't know this person directly.
2011-08-19 18:33:34 +00:00
list ( $nick , $name ) = array_map ( " trim " , explode ( " ( " , $item [ 'author-name' ]));
$name = str_replace ( " ) " , " " , $name );
2012-03-18 16:52:51 +00:00
if ( $name == '' )
$name = $nick ;
if ( $nick == '' )
$nick = $name ;
// Generating a random ID
2012-05-01 02:51:22 +00:00
if ( is_null ( $usercache [ $nick ]) or ! array_key_exists ( $nick , $usercache ))
2012-03-18 16:52:51 +00:00
$usercache [ $nick ] = mt_rand ( 2000000 , 2100000 );
2011-07-31 07:53:46 +00:00
$ret = array (
2012-03-18 16:52:51 +00:00
'id' => $usercache [ $nick ],
2011-08-19 18:33:34 +00:00
'name' => $name ,
'screen_name' => $nick ,
2011-07-31 07:53:46 +00:00
'location' => '' , //$uinfo[0]['default-location'],
2012-03-18 16:52:51 +00:00
'description' => '' ,
2011-07-31 07:53:46 +00:00
'profile_image_url' => $item [ 'author-avatar' ],
'url' => $item [ 'author-link' ],
'protected' => false , #
2012-03-18 16:52:51 +00:00
'followers_count' => 0 ,
2011-07-31 07:53:46 +00:00
'friends_count' => 0 ,
2011-07-31 23:35:53 +00:00
'created_at' => '' ,
2012-03-18 16:52:51 +00:00
'favourites_count' => 0 ,
2011-07-31 07:53:46 +00:00
'utc_offset' => 0 , #XXX: fix me
'time_zone' => '' , //$uinfo[0]['timezone'],
'statuses_count' => 0 ,
2012-03-18 16:52:51 +00:00
'following' => 1 ,
'statusnet_blocking' => false ,
'notifications' => false ,
'uid' => 0 ,
'contact_url' => 0 ,
'geo_enabled' => false ,
2011-07-31 07:53:46 +00:00
'lang' => 'en' , #XXX: fix me
'contributors_enabled' => false ,
'follow_request_sent' => false ,
'profile_background_color' => 'cfe8f6' ,
'profile_text_color' => '000000' ,
'profile_link_color' => 'FF8500' ,
'profile_sidebar_fill_color' => 'AD0066' ,
'profile_sidebar_border_color' => 'AD0066' ,
'profile_background_image_url' => '' ,
'profile_background_tile' => false ,
'profile_use_background_image' => false ,
'verified' => true , #XXX: fix me
'followers' => '' , #XXX: fix me
2011-08-19 18:33:34 +00:00
'status' => array ()
2011-07-31 07:53:46 +00:00
);
return $ret ;
}
2011-04-21 15:03:31 +00:00
/**
* load api $templatename for $type and replace $data array
*/
function api_apply_template ( $templatename , $type , $data ){
2011-06-21 00:16:13 +00:00
2011-07-31 23:35:53 +00:00
$a = get_app ();
2011-04-21 15:03:31 +00:00
switch ( $type ){
case " atom " :
2011-07-31 23:35:53 +00:00
case " rss " :
2011-04-21 15:03:31 +00:00
case " xml " :
2011-10-27 08:54:52 +00:00
$data = array_xmlify ( $data );
2011-05-11 11:37:13 +00:00
$tpl = get_markup_template ( " api_ " . $templatename . " _ " . $type . " .tpl " );
2013-01-24 01:07:55 +00:00
if ( ! $tpl ) {
header ( " Content-Type: text/xml " );
echo '<?xml version="1.0" encoding="UTF-8"?>' . " \n " . '<status><error>not implemented</error></status>' ;
killme ();
}
2011-04-21 15:03:31 +00:00
$ret = replace_macros ( $tpl , $data );
break ;
case " json " :
$ret = $data ;
break ;
}
return $ret ;
}
2011-02-16 07:56:47 +00:00
/**
** TWITTER API
*/
/**
* Returns an HTTP 200 OK response code and a representation of the requesting user if authentication was successful ;
* returns a 401 status code and an error message if not .
* http :// developer . twitter . com / doc / get / account / verify_credentials
*/
2011-04-21 15:03:31 +00:00
function api_account_verify_credentials ( & $a , $type ){
2012-12-01 00:26:54 +00:00
if ( api_user () === false ) return false ;
2011-02-16 07:56:47 +00:00
$user_info = api_get_user ( $a );
2011-04-21 15:03:31 +00:00
return api_apply_template ( " user " , $type , array ( '$user' => $user_info ));
2011-02-16 07:56:47 +00:00
}
api_register_func ( 'api/account/verify_credentials' , 'api_account_verify_credentials' , true );
2011-06-20 01:50:18 +00:00
2011-07-29 15:21:02 +00:00
/**
* get data from $_POST or $_GET
*/
function requestdata ( $k ){
if ( isset ( $_POST [ $k ])){
return $_POST [ $k ];
}
if ( isset ( $_GET [ $k ])){
return $_GET [ $k ];
}
return null ;
}
2011-09-12 04:52:50 +00:00
2012-02-22 07:35:50 +00:00
/*Waitman Gobble Mod*/
function api_statuses_mediap ( & $a , $type ) {
2012-12-01 00:26:54 +00:00
if ( api_user () === false ) {
2012-02-22 07:35:50 +00:00
logger ( 'api_statuses_update: no user' );
return false ;
}
$user_info = api_get_user ( $a );
$_REQUEST [ 'type' ] = 'wall' ;
2012-12-01 00:26:54 +00:00
$_REQUEST [ 'profile_uid' ] = api_user ();
2012-02-22 07:35:50 +00:00
$_REQUEST [ 'api_source' ] = true ;
2012-07-08 16:27:11 +00:00
$txt = requestdata ( 'status' );
//$txt = urldecode(requestdata('status'));
2012-02-22 07:35:50 +00:00
require_once ( 'library/HTMLPurifier.auto.php' );
require_once ( 'include/html2bbcode.php' );
if (( strpos ( $txt , '<' ) !== false ) || ( strpos ( $txt , '>' ) !== false )) {
$txt = html2bb_video ( $txt );
$config = HTMLPurifier_Config :: createDefault ();
$config -> set ( 'Cache.DefinitionImpl' , null );
$purifier = new HTMLPurifier ( $config );
$txt = $purifier -> purify ( $txt );
}
$txt = html2bbcode ( $txt );
2013-02-15 19:14:45 +00:00
2012-02-22 07:35:50 +00:00
$a -> argv [ 1 ] = $user_info [ 'screen_name' ]; //should be set to username?
2013-02-15 19:14:45 +00:00
2012-02-22 07:35:50 +00:00
$_REQUEST [ 'hush' ] = 'yeah' ; //tell wall_upload function to return img info instead of echo
require_once ( 'mod/wall_upload.php' );
$bebop = wall_upload_post ( $a );
2013-02-15 19:14:45 +00:00
2012-02-22 07:35:50 +00:00
//now that we have the img url in bbcode we can add it to the status and insert the wall item.
$_REQUEST [ 'body' ] = $txt . " \n \n " . $bebop ;
require_once ( 'mod/item.php' );
item_post ( $a );
// this should output the last post (the one we just posted).
return api_status_show ( $a , $type );
}
api_register_func ( 'api/statuses/mediap' , 'api_statuses_mediap' , true );
/*Waitman Gobble Mod*/
2011-06-20 03:13:24 +00:00
function api_statuses_update ( & $a , $type ) {
2012-12-01 00:26:54 +00:00
if ( api_user () === false ) {
2012-01-15 21:57:00 +00:00
logger ( 'api_statuses_update: no user' );
return false ;
}
2011-06-20 01:50:18 +00:00
$user_info = api_get_user ( $a );
// convert $_POST array items to the form we use for web posts.
2011-08-01 00:52:36 +00:00
// logger('api_post: ' . print_r($_POST,true));
2011-09-12 04:52:50 +00:00
if ( requestdata ( 'htmlstatus' )) {
require_once ( 'library/HTMLPurifier.auto.php' );
require_once ( 'include/html2bbcode.php' );
$txt = requestdata ( 'htmlstatus' );
if (( strpos ( $txt , '<' ) !== false ) || ( strpos ( $txt , '>' ) !== false )) {
2011-10-12 01:24:37 +00:00
$txt = html2bb_video ( $txt );
2011-09-12 04:52:50 +00:00
$config = HTMLPurifier_Config :: createDefault ();
$config -> set ( 'Cache.DefinitionImpl' , null );
$purifier = new HTMLPurifier ( $config );
$txt = $purifier -> purify ( $txt );
2012-01-15 21:57:00 +00:00
$_REQUEST [ 'body' ] = html2bbcode ( $txt );
2011-09-12 04:52:50 +00:00
}
}
else
2012-07-08 16:27:11 +00:00
$_REQUEST [ 'body' ] = requestdata ( 'status' );
//$_REQUEST['body'] = urldecode(requestdata('status'));
2011-08-01 00:52:36 +00:00
2012-11-04 22:18:52 +00:00
$_REQUEST [ 'title' ] = requestdata ( 'title' );
2011-08-01 00:52:36 +00:00
$parent = requestdata ( 'in_reply_to_status_id' );
if ( ctype_digit ( $parent ))
2012-01-15 21:57:00 +00:00
$_REQUEST [ 'parent' ] = $parent ;
2011-08-01 00:52:36 +00:00
else
2012-01-15 21:57:00 +00:00
$_REQUEST [ 'parent_uri' ] = $parent ;
2011-08-01 00:52:36 +00:00
2011-07-29 15:21:02 +00:00
if ( requestdata ( 'lat' ) && requestdata ( 'long' ))
2012-01-15 21:57:00 +00:00
$_REQUEST [ 'coord' ] = sprintf ( " %s %s " , requestdata ( 'lat' ), requestdata ( 'long' ));
2012-12-01 00:26:54 +00:00
$_REQUEST [ 'profile_uid' ] = api_user ();
2012-06-26 00:45:33 +00:00
2012-06-17 03:41:23 +00:00
if ( $parent )
2012-01-15 21:57:00 +00:00
$_REQUEST [ 'type' ] = 'net-comment' ;
2012-04-22 17:37:25 +00:00
else {
2012-01-15 21:57:00 +00:00
$_REQUEST [ 'type' ] = 'wall' ;
2012-06-17 03:41:23 +00:00
if ( x ( $_FILES , 'media' )) {
// upload the image if we have one
$_REQUEST [ 'hush' ] = 'yeah' ; //tell wall_upload function to return img info instead of echo
require_once ( 'mod/wall_upload.php' );
$media = wall_upload_post ( $a );
if ( strlen ( $media ) > 0 )
$_REQUEST [ 'body' ] .= " \n \n " . $media ;
}
2012-04-22 17:37:25 +00:00
}
2011-06-20 01:50:18 +00:00
// set this so that the item_post() function is quiet and doesn't redirect or emit json
2012-01-15 21:57:00 +00:00
$_REQUEST [ 'api_source' ] = true ;
2011-06-20 01:50:18 +00:00
// call out normal post function
require_once ( 'mod/item.php' );
item_post ( $a );
// this should output the last post (the one we just posted).
2011-06-20 04:08:51 +00:00
return api_status_show ( $a , $type );
2011-06-20 01:50:18 +00:00
}
api_register_func ( 'api/statuses/update' , 'api_statuses_update' , true );
2011-06-20 04:08:51 +00:00
function api_status_show ( & $a , $type ){
$user_info = api_get_user ( $a );
// get last public wall message
$lastwall = q ( " SELECT `item`.*, `i`.`contact-id` as `reply_uid`, `i`.`nick` as `reply_author`
FROM `item` , `contact` ,
( SELECT `item` . `id` , `item` . `contact-id` , `contact` . `nick` FROM `item` , `contact` WHERE `contact` . `id` = `item` . `contact-id` ) as `i`
WHERE `item` . `contact-id` = % d
AND `i` . `id` = `item` . `parent`
AND `contact` . `id` = `item` . `contact-id` AND `contact` . `self` = 1
AND `type` != 'activity'
AND `item` . `allow_cid` = '' AND `item` . `allow_gid` = '' AND `item` . `deny_cid` = '' AND `item` . `deny_gid` = ''
ORDER BY `created` DESC
LIMIT 1 " ,
intval ( $user_info [ 'id' ])
);
if ( count ( $lastwall ) > 0 ){
$lastwall = $lastwall [ 0 ];
2013-02-15 19:14:45 +00:00
2011-06-20 04:08:51 +00:00
$in_reply_to_status_id = '' ;
$in_reply_to_user_id = '' ;
$in_reply_to_screen_name = '' ;
if ( $lastwall [ 'parent' ] != $lastwall [ 'id' ]) {
$in_reply_to_status_id = $lastwall [ 'parent' ];
$in_reply_to_user_id = $lastwall [ 'reply_uid' ];
$in_reply_to_screen_name = $lastwall [ 'reply_author' ];
2013-02-15 19:14:45 +00:00
}
2011-06-20 04:08:51 +00:00
$status_info = array (
2013-02-15 19:14:45 +00:00
'text' => html2plain ( bbcode ( $lastwall [ 'body' ], false , false , true ), 0 ),
2011-06-20 04:08:51 +00:00
'truncated' => false ,
2012-03-18 16:52:51 +00:00
'created_at' => api_date ( $lastwall [ 'created' ]),
2011-06-20 04:08:51 +00:00
'in_reply_to_status_id' => $in_reply_to_status_id ,
2012-03-18 16:52:51 +00:00
'source' => (( $lastwall [ 'app' ]) ? $lastwall [ 'app' ] : 'web' ),
'id' => $lastwall [ 'contact-id' ],
2011-06-20 04:08:51 +00:00
'in_reply_to_user_id' => $in_reply_to_user_id ,
'in_reply_to_screen_name' => $in_reply_to_screen_name ,
'geo' => '' ,
2012-03-18 16:52:51 +00:00
'favorited' => false ,
2011-06-20 04:08:51 +00:00
'coordinates' => $lastwall [ 'coord' ],
'place' => $lastwall [ 'location' ],
'contributors' => ''
);
$status_info [ 'user' ] = $user_info ;
}
return api_apply_template ( " status " , $type , array ( '$status' => $status_info ));
}
2011-02-16 07:56:47 +00:00
/**
* Returns extended information of a given user , specified by ID or screen name as per the required id parameter .
* The author ' s most recent status will be returned inline .
* http :// developer . twitter . com / doc / get / users / show
*/
2011-04-21 15:03:31 +00:00
function api_users_show ( & $a , $type ){
2011-02-16 07:56:47 +00:00
$user_info = api_get_user ( $a );
2011-02-15 11:24:21 +00:00
// get last public wall message
2011-04-21 15:03:31 +00:00
$lastwall = q ( " SELECT `item`.*, `i`.`contact-id` as `reply_uid`, `i`.`nick` as `reply_author`
FROM `item` , `contact` ,
( SELECT `item` . `id` , `item` . `contact-id` , `contact` . `nick` FROM `item` , `contact` WHERE `contact` . `id` = `item` . `contact-id` ) as `i`
WHERE `item` . `contact-id` = % d
AND `i` . `id` = `item` . `parent`
AND `contact` . `id` = `item` . `contact-id` AND `contact` . `self` = 1
AND `type` != 'activity'
AND `item` . `allow_cid` = '' AND `item` . `allow_gid` = '' AND `item` . `deny_cid` = '' AND `item` . `deny_gid` = ''
ORDER BY `created` DESC
LIMIT 1 " ,
intval ( $user_info [ 'id' ])
2011-02-15 11:24:21 +00:00
);
2011-02-16 07:56:47 +00:00
2011-04-21 15:03:31 +00:00
if ( count ( $lastwall ) > 0 ){
$lastwall = $lastwall [ 0 ];
$in_reply_to_status_id = '' ;
$in_reply_to_user_id = '' ;
$in_reply_to_screen_name = '' ;
if ( $lastwall [ 'parent' ] != $lastwall [ 'id' ]) {
$in_reply_to_status_id = $lastwall [ 'parent' ];
$in_reply_to_user_id = $lastwall [ 'reply_uid' ];
$in_reply_to_screen_name = $lastwall [ 'reply_author' ];
2013-02-15 19:14:45 +00:00
}
2011-04-21 15:03:31 +00:00
$user_info [ 'status' ] = array (
'created_at' => api_date ( $lastwall [ 'created' ]),
'id' => $lastwall [ 'contact-id' ],
2013-02-15 19:14:45 +00:00
'text' => html2plain ( bbcode ( $lastwall [ 'body' ], false , false , true ), 0 ),
2011-06-21 02:08:40 +00:00
'source' => (( $lastwall [ 'app' ]) ? $lastwall [ 'app' ] : 'web' ),
2011-04-21 15:03:31 +00:00
'truncated' => false ,
'in_reply_to_status_id' => $in_reply_to_status_id ,
'in_reply_to_user_id' => $in_reply_to_user_id ,
'favorited' => false ,
'in_reply_to_screen_name' => $in_reply_to_screen_name ,
'geo' => '' ,
'coordinates' => $lastwall [ 'coord' ],
'place' => $lastwall [ 'location' ],
2012-04-22 16:00:24 +00:00
'contributors' => ''
2011-04-21 15:03:31 +00:00
);
}
return api_apply_template ( " user " , $type , array ( '$user' => $user_info ));
2012-04-22 16:00:24 +00:00
2011-02-15 11:24:21 +00:00
}
api_register_func ( 'api/users/show' , 'api_users_show' );
2012-04-22 16:00:24 +00:00
2011-02-15 11:24:21 +00:00
/**
2012-04-22 16:00:24 +00:00
*
2011-02-15 11:24:21 +00:00
* http :// developer . twitter . com / doc / get / statuses / home_timeline
2012-04-22 16:00:24 +00:00
*
2011-04-21 15:03:31 +00:00
* TODO : Optional parameters
* TODO : Add reply info
2011-02-15 11:24:21 +00:00
*/
2011-04-21 15:03:31 +00:00
function api_statuses_home_timeline ( & $a , $type ){
2012-12-01 00:26:54 +00:00
if ( api_user () === false ) return false ;
2012-04-22 16:00:24 +00:00
2011-02-16 07:56:47 +00:00
$user_info = api_get_user ( $a );
2011-02-15 11:24:21 +00:00
// get last newtork messages
2011-07-31 23:35:53 +00:00
2011-08-26 14:35:51 +00:00
2011-08-19 12:57:54 +00:00
// params
2011-08-19 18:33:34 +00:00
$count = ( x ( $_REQUEST , 'count' ) ? $_REQUEST [ 'count' ] : 20 );
$page = ( x ( $_REQUEST , 'page' ) ? $_REQUEST [ 'page' ] - 1 : 0 );
if ( $page < 0 ) $page = 0 ;
2012-03-18 16:52:51 +00:00
$since_id = ( x ( $_REQUEST , 'since_id' ) ? $_REQUEST [ 'since_id' ] : 0 );
2012-03-18 18:00:24 +00:00
$max_id = ( x ( $_REQUEST , 'max_id' ) ? $_REQUEST [ 'max_id' ] : 0 );
2012-03-18 16:52:51 +00:00
//$since_id = 0;//$since_id = (x($_REQUEST,'since_id')?$_REQUEST['since_id']:0);
2013-06-16 11:28:04 +00:00
$exclude_replies = ( x ( $_REQUEST , 'exclude_replies' ) ? 1 : 0 );
$parent_id = ( x ( $_REQUEST , 'parent_id' ) ? $_REQUEST [ 'parent_id' ] : 0 );
2012-04-22 16:00:24 +00:00
2011-08-19 12:57:54 +00:00
$start = $page * $count ;
2012-03-18 16:52:51 +00:00
//$include_entities = (x($_REQUEST,'include_entities')?$_REQUEST['include_entities']:false);
2012-06-19 14:15:19 +00:00
$sql_extra = '' ;
2012-03-18 18:00:24 +00:00
if ( $max_id > 0 )
2012-06-19 14:15:19 +00:00
$sql_extra .= ' AND `item`.`id` <= ' . intval ( $max_id );
if ( $exclude_replies > 0 )
$sql_extra .= ' AND `item`.`parent` = `item`.`id`' ;
2013-06-16 11:28:04 +00:00
if ( $parent_id > 0 )
$sql_extra .= ' AND `item`.`parent` = ' . intval ( $parent_id );
2012-03-18 18:00:24 +00:00
2012-04-22 16:00:24 +00:00
$r = q ( " SELECT `item`.*, `item`.`id` AS `item_id`,
2011-07-31 23:35:53 +00:00
`contact` . `name` , `contact` . `photo` , `contact` . `url` , `contact` . `rel` ,
`contact` . `network` , `contact` . `thumb` , `contact` . `dfrn-id` , `contact` . `self` ,
`contact` . `id` AS `cid` , `contact` . `uid` AS `contact-uid`
FROM `item` , `contact`
WHERE `item` . `uid` = % d
2012-01-24 04:56:11 +00:00
AND `item` . `visible` = 1 and `item` . `moderated` = 0 AND `item` . `deleted` = 0
2011-07-31 23:35:53 +00:00
AND `contact` . `id` = `item` . `contact-id`
AND `contact` . `blocked` = 0 AND `contact` . `pending` = 0
$sql_extra
2011-08-19 18:33:34 +00:00
AND `item` . `id` >% d
2011-07-31 23:35:53 +00:00
ORDER BY `item` . `received` DESC LIMIT % d , % d " ,
intval ( $user_info [ 'uid' ]),
2011-08-19 18:33:34 +00:00
intval ( $since_id ),
2011-08-19 14:55:43 +00:00
intval ( $start ), intval ( $count )
2011-07-31 23:35:53 +00:00
);
$ret = api_format_items ( $r , $user_info );
2012-08-13 02:29:37 +00:00
// We aren't going to try to figure out at the item, group, and page
// level which items you've seen and which you haven't. If you're looking
// at the network timeline just mark everything seen.
$r = q ( " UPDATE `item` SET `unseen` = 0
WHERE `unseen` = 1 AND `uid` = % d " ,
intval ( $user_info [ 'uid' ])
);
2012-04-22 16:00:24 +00:00
2011-07-31 23:35:53 +00:00
$data = array ( '$statuses' => $ret );
switch ( $type ){
case " atom " :
case " rss " :
$data = api_rss_extra ( $a , $data , $user_info );
2012-04-08 15:23:38 +00:00
break ;
case " as " :
2012-04-08 15:51:05 +00:00
$as = api_format_as ( $a , $ret , $user_info );
2012-04-08 18:19:14 +00:00
$as [ 'title' ] = $a -> config [ 'sitename' ] . " Home Timeline " ;
$as [ 'link' ][ 'url' ] = $a -> get_baseurl () . " / " . $user_info [ " screen_name " ] . " /all " ;
2012-04-08 15:23:38 +00:00
return ( $as );
break ;
2011-07-31 23:35:53 +00:00
}
2012-04-22 16:00:24 +00:00
2011-07-31 23:35:53 +00:00
return api_apply_template ( " timeline " , $type , $data );
}
api_register_func ( 'api/statuses/home_timeline' , 'api_statuses_home_timeline' , true );
api_register_func ( 'api/statuses/friends_timeline' , 'api_statuses_home_timeline' , true );
2012-04-08 18:19:14 +00:00
function api_statuses_public_timeline ( & $a , $type ){
2012-12-01 00:26:54 +00:00
if ( api_user () === false ) return false ;
2012-04-22 16:00:24 +00:00
2012-04-08 18:19:14 +00:00
$user_info = api_get_user ( $a );
// get last newtork messages
// params
$count = ( x ( $_REQUEST , 'count' ) ? $_REQUEST [ 'count' ] : 20 );
$page = ( x ( $_REQUEST , 'page' ) ? $_REQUEST [ 'page' ] - 1 : 0 );
if ( $page < 0 ) $page = 0 ;
$since_id = ( x ( $_REQUEST , 'since_id' ) ? $_REQUEST [ 'since_id' ] : 0 );
$max_id = ( x ( $_REQUEST , 'max_id' ) ? $_REQUEST [ 'max_id' ] : 0 );
//$since_id = 0;//$since_id = (x($_REQUEST,'since_id')?$_REQUEST['since_id']:0);
2013-06-16 11:28:04 +00:00
$exclude_replies = ( x ( $_REQUEST , 'exclude_replies' ) ? 1 : 0 );
$parent_id = ( x ( $_REQUEST , 'parent_id' ) ? $_REQUEST [ 'parent_id' ] : 0 );
2012-04-22 16:00:24 +00:00
2012-04-08 18:19:14 +00:00
$start = $page * $count ;
//$include_entities = (x($_REQUEST,'include_entities')?$_REQUEST['include_entities']:false);
if ( $max_id > 0 )
$sql_extra = 'AND `item`.`id` <= ' . intval ( $max_id );
2013-06-16 11:28:04 +00:00
if ( $exclude_replies > 0 )
$sql_extra .= ' AND `item`.`parent` = `item`.`id`' ;
if ( $parent_id > 0 )
$sql_extra .= ' AND `item`.`parent` = ' . intval ( $parent_id );
2012-04-08 18:19:14 +00:00
2012-04-22 16:00:24 +00:00
/* $r = q ( " SELECT `item`.*, `item`.`id` AS `item_id`,
2012-04-08 18:19:14 +00:00
`contact` . `name` , `contact` . `photo` , `contact` . `url` , `contact` . `rel` ,
`contact` . `network` , `contact` . `thumb` , `contact` . `dfrn-id` , `contact` . `self` ,
`contact` . `id` AS `cid` , `contact` . `uid` AS `contact-uid`
FROM `item` , `contact`
WHERE `item` . `visible` = 1 and `item` . `moderated` = 0 AND `item` . `deleted` = 0
AND `item` . `allow_cid` = '' AND `item` . `allow_gid` = ''
AND `item` . `deny_cid` = '' AND `item` . `deny_gid` = ''
AND `item` . `private` = 0 AND `item` . `wall` = 1 AND `user` . `hidewall` = 0
AND `contact` . `id` = `item` . `contact-id`
AND `contact` . `blocked` = 0 AND `contact` . `pending` = 0
$sql_extra
AND `item` . `id` >% d
ORDER BY `item` . `received` DESC LIMIT % d , % d " ,
intval ( $since_id ),
intval ( $start ), intval ( $count )
); */
2012-04-22 16:00:24 +00:00
$r = q ( " SELECT `item`.*, `item`.`id` AS `item_id`,
2012-04-08 18:19:14 +00:00
`contact` . `name` , `contact` . `photo` , `contact` . `url` , `contact` . `rel` ,
2012-04-22 16:00:24 +00:00
`contact` . `network` , `contact` . `thumb` , `contact` . `self` , `contact` . `writable` ,
2012-04-08 18:19:14 +00:00
`contact` . `id` AS `cid` , `contact` . `uid` AS `contact-uid` ,
`user` . `nickname` , `user` . `hidewall`
FROM `item` LEFT JOIN `contact` ON `contact` . `id` = `item` . `contact-id`
LEFT JOIN `user` ON `user` . `uid` = `item` . `uid`
WHERE `item` . `visible` = 1 AND `item` . `deleted` = 0 and `item` . `moderated` = 0
2012-04-22 16:00:24 +00:00
AND `item` . `allow_cid` = '' AND `item` . `allow_gid` = ''
AND `item` . `deny_cid` = '' AND `item` . `deny_gid` = ''
AND `item` . `private` = 0 AND `item` . `wall` = 1 AND `user` . `hidewall` = 0
2012-04-08 18:19:14 +00:00
AND `contact` . `blocked` = 0 AND `contact` . `pending` = 0
$sql_extra
AND `item` . `id` >% d
ORDER BY `received` DESC LIMIT % d , % d " ,
intval ( $since_id ),
intval ( $start ),
intval ( $count ));
$ret = api_format_items ( $r , $user_info );
2012-04-22 16:00:24 +00:00
2012-04-08 18:19:14 +00:00
$data = array ( '$statuses' => $ret );
switch ( $type ){
case " atom " :
case " rss " :
$data = api_rss_extra ( $a , $data , $user_info );
break ;
case " as " :
$as = api_format_as ( $a , $ret , $user_info );
$as [ 'title' ] = $a -> config [ 'sitename' ] . " Public Timeline " ;
$as [ 'link' ][ 'url' ] = $a -> get_baseurl () . " / " ;
return ( $as );
break ;
}
2012-04-22 16:00:24 +00:00
2012-04-08 18:19:14 +00:00
return api_apply_template ( " timeline " , $type , $data );
}
api_register_func ( 'api/statuses/public_timeline' , 'api_statuses_public_timeline' , true );
2012-03-18 16:52:51 +00:00
/**
*
*/
function api_statuses_show ( & $a , $type ){
2012-12-01 00:26:54 +00:00
if ( api_user () === false ) return false ;
2012-03-18 16:52:51 +00:00
$user_info = api_get_user ( $a );
// params
$id = intval ( $a -> argv [ 3 ]);
2012-04-22 16:00:24 +00:00
logger ( 'API: api_statuses_show: ' . $id );
2012-03-18 16:52:51 +00:00
//$include_entities = (x($_REQUEST,'include_entities')?$_REQUEST['include_entities']:false);
2012-06-22 11:35:36 +00:00
$conversation = ( x ( $_REQUEST , 'conversation' ) ? 1 : 0 );
$sql_extra = '' ;
if ( $conversation )
$sql_extra .= " AND `item`.`parent` = %d ORDER BY `received` ASC " ;
else
$sql_extra .= " AND `item`.`id` = %d " ;
2012-03-18 16:52:51 +00:00
2012-04-22 16:00:24 +00:00
$r = q ( " SELECT `item`.*, `item`.`id` AS `item_id`,
2012-03-18 16:52:51 +00:00
`contact` . `name` , `contact` . `photo` , `contact` . `url` , `contact` . `rel` ,
`contact` . `network` , `contact` . `thumb` , `contact` . `dfrn-id` , `contact` . `self` ,
`contact` . `id` AS `cid` , `contact` . `uid` AS `contact-uid`
FROM `item` , `contact`
WHERE `item` . `visible` = 1 and `item` . `moderated` = 0 AND `item` . `deleted` = 0
AND `contact` . `id` = `item` . `contact-id`
AND `contact` . `blocked` = 0 AND `contact` . `pending` = 0
2012-06-22 11:35:36 +00:00
$sql_extra " ,
2012-03-18 16:52:51 +00:00
intval ( $id )
);
2012-06-22 11:35:36 +00:00
2012-03-18 16:52:51 +00:00
$ret = api_format_items ( $r , $user_info );
2012-06-22 11:35:36 +00:00
if ( $conversation ) {
2012-06-21 08:53:48 +00:00
$data = array ( '$statuses' => $ret );
2012-06-22 11:35:36 +00:00
return api_apply_template ( " timeline " , $type , $data );
2012-06-21 08:53:48 +00:00
} else {
$data = array ( '$status' => $ret [ 0 ]);
/* switch ( $type ){
case " atom " :
case " rss " :
$data = api_rss_extra ( $a , $data , $user_info );
} */
return api_apply_template ( " status " , $type , $data );
}
2012-03-18 16:52:51 +00:00
}
api_register_func ( 'api/statuses/show' , 'api_statuses_show' , true );
2011-07-31 23:35:53 +00:00
2012-04-07 22:02:25 +00:00
/**
*
*/
function api_statuses_repeat ( & $a , $type ){
2012-12-01 00:26:54 +00:00
if ( api_user () === false ) return false ;
2012-04-07 22:02:25 +00:00
$user_info = api_get_user ( $a );
// params
$id = intval ( $a -> argv [ 3 ]);
2012-06-04 06:08:45 +00:00
logger ( 'API: api_statuses_repeat: ' . $id );
2012-04-07 22:02:25 +00:00
//$include_entities = (x($_REQUEST,'include_entities')?$_REQUEST['include_entities']:false);
$r = q ( " SELECT `item`.*, `item`.`id` AS `item_id`, `contact`.`nick` as `reply_author`,
2012-12-30 20:30:39 +00:00
`contact` . `name` , `contact` . `photo` as `reply_photo` , `contact` . `url` as `reply_url` , `contact` . `rel` ,
2012-04-07 22:02:25 +00:00
`contact` . `network` , `contact` . `thumb` , `contact` . `dfrn-id` , `contact` . `self` ,
`contact` . `id` AS `cid` , `contact` . `uid` AS `contact-uid`
FROM `item` , `contact`
WHERE `item` . `visible` = 1 and `item` . `moderated` = 0 AND `item` . `deleted` = 0
AND `contact` . `id` = `item` . `contact-id`
AND `contact` . `blocked` = 0 AND `contact` . `pending` = 0
$sql_extra
AND `item` . `id` =% d " ,
intval ( $id )
);
2012-06-04 06:08:45 +00:00
if ( $r [ 0 ][ 'body' ] != " " ) {
2012-12-30 20:30:39 +00:00
if ( intval ( get_config ( 'system' , 'new_share' ))) {
$post = " [share author=' " . str_replace ( " ' " , " ' " , $r [ 0 ][ 'reply_author' ]) .
" ' profile=' " . $r [ 0 ][ 'reply_url' ] .
" ' avatar=' " . $r [ 0 ][ 'reply_photo' ] .
" ' link=' " . $r [ 0 ][ 'plink' ] . " '] " ;
$post .= $r [ 0 ][ 'body' ];
$post .= " [/share] " ;
$_REQUEST [ 'body' ] = $post ;
} else
$_REQUEST [ 'body' ] = html_entity_decode ( " ♲ " , ENT_QUOTES , 'UTF-8' ) . " [url= " . $r [ 0 ][ 'reply_url' ] . " ] " . $r [ 0 ][ 'reply_author' ] . " [/url] \n " . $r [ 0 ][ 'body' ];
2012-12-01 00:26:54 +00:00
$_REQUEST [ 'profile_uid' ] = api_user ();
2012-06-04 06:08:45 +00:00
$_REQUEST [ 'type' ] = 'wall' ;
$_REQUEST [ 'api_source' ] = true ;
2012-04-07 22:02:25 +00:00
2012-06-04 06:08:45 +00:00
require_once ( 'mod/item.php' );
item_post ( $a );
}
2012-04-07 22:02:25 +00:00
if ( $type == 'xml' )
$ok = " true " ;
else
$ok = " ok " ;
return api_apply_template ( 'test' , $type , array ( '$ok' => $ok ));
}
api_register_func ( 'api/statuses/retweet' , 'api_statuses_repeat' , true );
/**
*
*/
function api_statuses_destroy ( & $a , $type ){
2012-12-01 00:26:54 +00:00
if ( api_user () === false ) return false ;
2012-04-07 22:02:25 +00:00
$user_info = api_get_user ( $a );
// params
$id = intval ( $a -> argv [ 3 ]);
2012-06-04 06:08:45 +00:00
logger ( 'API: api_statuses_destroy: ' . $id );
2012-04-07 22:02:25 +00:00
require_once ( 'include/items.php' );
drop_item ( $id , false );
if ( $type == 'xml' )
$ok = " true " ;
else
$ok = " ok " ;
return api_apply_template ( 'test' , $type , array ( '$ok' => $ok ));
}
api_register_func ( 'api/statuses/destroy' , 'api_statuses_destroy' , true );
/**
*
* http :// developer . twitter . com / doc / get / statuses / mentions
*
*/
function api_statuses_mentions ( & $a , $type ){
2012-12-01 00:26:54 +00:00
if ( api_user () === false ) return false ;
2012-04-07 22:02:25 +00:00
$user_info = api_get_user ( $a );
// get last newtork messages
// params
$count = ( x ( $_REQUEST , 'count' ) ? $_REQUEST [ 'count' ] : 20 );
$page = ( x ( $_REQUEST , 'page' ) ? $_REQUEST [ 'page' ] - 1 : 0 );
if ( $page < 0 ) $page = 0 ;
$since_id = ( x ( $_REQUEST , 'since_id' ) ? $_REQUEST [ 'since_id' ] : 0 );
$max_id = ( x ( $_REQUEST , 'max_id' ) ? $_REQUEST [ 'max_id' ] : 0 );
//$since_id = 0;//$since_id = (x($_REQUEST,'since_id')?$_REQUEST['since_id']:0);
2012-05-26 01:21:07 +00:00
2012-04-07 22:02:25 +00:00
$start = $page * $count ;
//$include_entities = (x($_REQUEST,'include_entities')?$_REQUEST['include_entities']:false);
$myurl = $a -> get_baseurl () . '/profile/' . $a -> user [ 'nickname' ];
$myurl = substr ( $myurl , strpos ( $myurl , '://' ) + 3 );
2013-01-13 13:50:55 +00:00
//$myurl = str_replace(array('www.','.'),array('','\\.'),$myurl);
$myurl = str_replace ( 'www.' , '' , $myurl );
2012-04-07 22:02:25 +00:00
$diasp_url = str_replace ( '/profile/' , '/u/' , $myurl );
2012-05-26 01:21:07 +00:00
2013-01-13 13:50:55 +00:00
/* if ( get_config ( 'system' , 'use_fulltext_engine' ))
2013-01-13 08:37:15 +00:00
$sql_extra .= sprintf ( " AND `item`.`parent` IN (SELECT distinct(`parent`) from item where (MATCH(`author-link`) AGAINST (' " . '"%s"' . " ' in boolean mode) or MATCH(`tag`) AGAINST (' " . '"%s"' . " ' in boolean mode) or MATCH(tag) AGAINST (' " . '"%s"' . " ' in boolean mode))) " ,
dbesc ( protect_sprintf ( $myurl )),
dbesc ( protect_sprintf ( $myurl )),
dbesc ( protect_sprintf ( $diasp_url ))
);
else
$sql_extra .= sprintf ( " AND `item`.`parent` IN (SELECT distinct(`parent`) from item where ( `author-link` like '%s' or `tag` like '%s' or tag like '%s' )) " ,
dbesc ( protect_sprintf ( '%' . $myurl )),
dbesc ( protect_sprintf ( '%' . $myurl . ']%' )),
dbesc ( protect_sprintf ( '%' . $diasp_url . ']%' ))
2013-01-13 13:50:55 +00:00
);
*/
2013-01-13 08:37:15 +00:00
$sql_extra .= sprintf ( " AND `item`.`parent` IN (SELECT distinct(`parent`) from item where `author-link` IN ('https://%s', 'http://%s') OR `mention`) " ,
dbesc ( protect_sprintf ( $myurl )),
dbesc ( protect_sprintf ( $myurl ))
);
2012-04-07 22:02:25 +00:00
if ( $max_id > 0 )
$sql_extra .= ' AND `item`.`id` <= ' . intval ( $max_id );
$r = q ( " SELECT `item`.*, `item`.`id` AS `item_id`,
`contact` . `name` , `contact` . `photo` , `contact` . `url` , `contact` . `rel` ,
`contact` . `network` , `contact` . `thumb` , `contact` . `dfrn-id` , `contact` . `self` ,
`contact` . `id` AS `cid` , `contact` . `uid` AS `contact-uid`
FROM `item` , `contact`
WHERE `item` . `uid` = % d
AND `item` . `visible` = 1 and `item` . `moderated` = 0 AND `item` . `deleted` = 0
AND `contact` . `id` = `item` . `contact-id`
AND `contact` . `blocked` = 0 AND `contact` . `pending` = 0
$sql_extra
AND `item` . `id` >% d
ORDER BY `item` . `received` DESC LIMIT % d , % d " ,
intval ( $user_info [ 'uid' ]),
intval ( $since_id ),
intval ( $start ), intval ( $count )
);
$ret = api_format_items ( $r , $user_info );
2012-04-22 16:00:24 +00:00
2012-04-07 22:02:25 +00:00
$data = array ( '$statuses' => $ret );
switch ( $type ){
case " atom " :
case " rss " :
$data = api_rss_extra ( $a , $data , $user_info );
2012-04-08 15:51:05 +00:00
break ;
case " as " :
$as = api_format_as ( $a , $ret , $user_info );
$as [ " title " ] = $a -> config [ 'sitename' ] . " Mentions " ;
2012-04-08 18:19:14 +00:00
$as [ 'link' ][ 'url' ] = $a -> get_baseurl () . " / " ;
2012-04-08 15:51:05 +00:00
return ( $as );
break ;
2012-04-07 22:02:25 +00:00
}
2012-04-22 16:00:24 +00:00
2012-04-07 22:02:25 +00:00
return api_apply_template ( " timeline " , $type , $data );
}
api_register_func ( 'api/statuses/mentions' , 'api_statuses_mentions' , true );
api_register_func ( 'api/statuses/replies' , 'api_statuses_mentions' , true );
2012-03-18 18:00:24 +00:00
2011-07-31 23:35:53 +00:00
function api_statuses_user_timeline ( & $a , $type ){
2012-12-01 00:26:54 +00:00
if ( api_user () === false ) return false ;
2011-07-31 23:35:53 +00:00
$user_info = api_get_user ( $a );
// get last newtork messages
2011-08-26 14:35:51 +00:00
2012-12-01 00:26:54 +00:00
logger ( " api_statuses_user_timeline: api_user: " . api_user () .
2011-08-26 14:35:51 +00:00
" \n user_info: " . print_r ( $user_info , true ) .
" \n _REQUEST: " . print_r ( $_REQUEST , true ),
LOGGER_DEBUG );
2011-08-19 12:57:54 +00:00
// params
2011-08-19 18:33:34 +00:00
$count = ( x ( $_REQUEST , 'count' ) ? $_REQUEST [ 'count' ] : 20 );
$page = ( x ( $_REQUEST , 'page' ) ? $_REQUEST [ 'page' ] - 1 : 0 );
if ( $page < 0 ) $page = 0 ;
2012-03-18 16:52:51 +00:00
$since_id = ( x ( $_REQUEST , 'since_id' ) ? $_REQUEST [ 'since_id' ] : 0 );
//$since_id = 0;//$since_id = (x($_REQUEST,'since_id')?$_REQUEST['since_id']:0);
2013-06-16 11:28:04 +00:00
$exclude_replies = ( x ( $_REQUEST , 'exclude_replies' ) ? 1 : 0 );
$parent_id = ( x ( $_REQUEST , 'parent_id' ) ? $_REQUEST [ 'parent_id' ] : 0 );
2011-08-19 12:57:54 +00:00
$start = $page * $count ;
2012-06-19 14:27:23 +00:00
$sql_extra = '' ;
if ( $user_info [ 'self' ] == 1 ) $sql_extra .= " AND `item`.`wall` = 1 " ;
2013-06-16 11:28:04 +00:00
if ( $exclude_replies > 0 )
$sql_extra .= ' AND `item`.`parent` = `item`.`id`' ;
if ( $parent_id > 0 )
$sql_extra .= ' AND `item`.`parent` = ' . intval ( $parent_id );
2011-08-19 12:57:54 +00:00
2011-07-31 23:35:53 +00:00
$r = q ( " SELECT `item`.*, `item`.`id` AS `item_id`,
`contact` . `name` , `contact` . `photo` , `contact` . `url` , `contact` . `rel` ,
`contact` . `network` , `contact` . `thumb` , `contact` . `dfrn-id` , `contact` . `self` ,
`contact` . `id` AS `cid` , `contact` . `uid` AS `contact-uid`
FROM `item` , `contact`
WHERE `item` . `uid` = % d
2011-08-26 14:35:51 +00:00
AND `item` . `contact-id` = % d
2012-01-24 04:56:11 +00:00
AND `item` . `visible` = 1 and `item` . `moderated` = 0 AND `item` . `deleted` = 0
2011-07-31 23:35:53 +00:00
AND `contact` . `id` = `item` . `contact-id`
AND `contact` . `blocked` = 0 AND `contact` . `pending` = 0
$sql_extra
2011-08-19 18:33:34 +00:00
AND `item` . `id` >% d
2011-07-31 23:35:53 +00:00
ORDER BY `item` . `received` DESC LIMIT % d , % d " ,
2012-12-01 00:26:54 +00:00
intval ( api_user ()),
2011-08-26 14:35:51 +00:00
intval ( $user_info [ 'id' ]),
2011-08-19 18:33:34 +00:00
intval ( $since_id ),
2011-08-19 14:55:43 +00:00
intval ( $start ), intval ( $count )
2011-07-31 23:35:53 +00:00
);
$ret = api_format_items ( $r , $user_info );
2012-04-22 16:00:24 +00:00
2011-07-31 23:35:53 +00:00
$data = array ( '$statuses' => $ret );
switch ( $type ){
case " atom " :
case " rss " :
$data = api_rss_extra ( $a , $data , $user_info );
}
2012-04-22 16:00:24 +00:00
2011-07-31 23:35:53 +00:00
return api_apply_template ( " timeline " , $type , $data );
}
api_register_func ( 'api/statuses/user_timeline' , 'api_statuses_user_timeline' , true );
function api_favorites ( & $a , $type ){
2012-12-01 00:26:54 +00:00
if ( api_user () === false ) return false ;
2012-04-22 16:00:24 +00:00
2011-07-31 23:35:53 +00:00
$user_info = api_get_user ( $a );
2012-02-19 18:34:48 +00:00
// in friendica starred item are private
2011-08-26 14:35:51 +00:00
// return favorites only for self
logger ( 'api_favorites: self:' . $user_info [ 'self' ]);
2012-04-22 16:00:24 +00:00
2011-08-26 14:35:51 +00:00
if ( $user_info [ 'self' ] == 0 ) {
$ret = array ();
} else {
2012-04-22 16:00:24 +00:00
2011-08-26 14:35:51 +00:00
// params
$count = ( x ( $_GET , 'count' ) ? $_GET [ 'count' ] : 20 );
$page = ( x ( $_REQUEST , 'page' ) ? $_REQUEST [ 'page' ] - 1 : 0 );
if ( $page < 0 ) $page = 0 ;
2012-04-22 16:00:24 +00:00
2011-08-26 14:35:51 +00:00
$start = $page * $count ;
2012-04-22 16:00:24 +00:00
$r = q ( " SELECT `item`.*, `item`.`id` AS `item_id`,
2011-08-26 14:35:51 +00:00
`contact` . `name` , `contact` . `photo` , `contact` . `url` , `contact` . `rel` ,
`contact` . `network` , `contact` . `thumb` , `contact` . `dfrn-id` , `contact` . `self` ,
`contact` . `id` AS `cid` , `contact` . `uid` AS `contact-uid`
FROM `item` , `contact`
WHERE `item` . `uid` = % d
2012-01-24 04:56:11 +00:00
AND `item` . `visible` = 1 and `item` . `moderated` = 0 AND `item` . `deleted` = 0
2011-08-26 14:35:51 +00:00
AND `item` . `starred` = 1
AND `contact` . `id` = `item` . `contact-id`
AND `contact` . `blocked` = 0 AND `contact` . `pending` = 0
$sql_extra
ORDER BY `item` . `received` DESC LIMIT % d , % d " ,
intval ( $user_info [ 'uid' ]),
intval ( $start ), intval ( $count )
);
2011-07-31 23:35:53 +00:00
2011-08-26 14:35:51 +00:00
$ret = api_format_items ( $r , $user_info );
2012-04-22 16:00:24 +00:00
2011-08-26 14:35:51 +00:00
}
2012-04-22 16:00:24 +00:00
2011-07-31 23:35:53 +00:00
$data = array ( '$statuses' => $ret );
switch ( $type ){
case " atom " :
case " rss " :
$data = api_rss_extra ( $a , $data , $user_info );
}
2012-04-22 16:00:24 +00:00
2011-07-31 23:35:53 +00:00
return api_apply_template ( " timeline " , $type , $data );
}
api_register_func ( 'api/favorites' , 'api_favorites' , true );
2012-04-08 15:51:05 +00:00
function api_format_as ( $a , $ret , $user_info ) {
$as = array ();
$as [ 'title' ] = $a -> config [ 'sitename' ] . " Public Timeline " ;
$items = array ();
foreach ( $ret as $item ) {
$singleitem [ " actor " ][ " displayName " ] = $item [ " user " ][ " name " ];
$singleitem [ " actor " ][ " id " ] = $item [ " user " ][ " contact_url " ];
$avatar [ 0 ][ " url " ] = $item [ " user " ][ " profile_image_url " ];
$avatar [ 0 ][ " rel " ] = " avatar " ;
$avatar [ 0 ][ " type " ] = " " ;
$avatar [ 0 ][ " width " ] = 96 ;
$avatar [ 0 ][ " height " ] = 96 ;
$avatar [ 1 ][ " url " ] = $item [ " user " ][ " profile_image_url " ];
$avatar [ 1 ][ " rel " ] = " avatar " ;
$avatar [ 1 ][ " type " ] = " " ;
$avatar [ 1 ][ " width " ] = 48 ;
$avatar [ 1 ][ " height " ] = 48 ;
$avatar [ 2 ][ " url " ] = $item [ " user " ][ " profile_image_url " ];
$avatar [ 2 ][ " rel " ] = " avatar " ;
$avatar [ 2 ][ " type " ] = " " ;
$avatar [ 2 ][ " width " ] = 24 ;
$avatar [ 2 ][ " height " ] = 24 ;
$singleitem [ " actor " ][ " avatarLinks " ] = $avatar ;
$singleitem [ " actor " ][ " image " ][ " url " ] = $item [ " user " ][ " profile_image_url " ];
$singleitem [ " actor " ][ " image " ][ " rel " ] = " avatar " ;
$singleitem [ " actor " ][ " image " ][ " type " ] = " " ;
$singleitem [ " actor " ][ " image " ][ " width " ] = 96 ;
$singleitem [ " actor " ][ " image " ][ " height " ] = 96 ;
$singleitem [ " actor " ][ " type " ] = " person " ;
$singleitem [ " actor " ][ " url " ] = $item [ " person " ][ " contact_url " ];
$singleitem [ " actor " ][ " statusnet:profile_info " ][ " local_id " ] = $item [ " user " ][ " id " ];
$singleitem [ " actor " ][ " statusnet:profile_info " ][ " following " ] = $item [ " user " ][ " following " ] ? " true " : " false " ;
$singleitem [ " actor " ][ " statusnet:profile_info " ][ " blocking " ] = " false " ;
$singleitem [ " actor " ][ " contact " ][ " preferredUsername " ] = $item [ " user " ][ " screen_name " ];
$singleitem [ " actor " ][ " contact " ][ " displayName " ] = $item [ " user " ][ " name " ];
$singleitem [ " actor " ][ " contact " ][ " addresses " ] = " " ;
$singleitem [ " body " ] = $item [ " text " ];
$singleitem [ " object " ][ " displayName " ] = $item [ " text " ];
$singleitem [ " object " ][ " id " ] = $item [ " url " ];
$singleitem [ " object " ][ " type " ] = " note " ;
$singleitem [ " object " ][ " url " ] = $item [ " url " ];
//$singleitem["context"] =;
$singleitem [ " postedTime " ] = date ( " c " , strtotime ( $item [ " published " ]));
$singleitem [ " provider " ][ " objectType " ] = " service " ;
$singleitem [ " provider " ][ " displayName " ] = " Test " ;
$singleitem [ " provider " ][ " url " ] = " http://test.tld " ;
$singleitem [ " title " ] = $item [ " text " ];
$singleitem [ " verb " ] = " post " ;
$singleitem [ " statusnet:notice_info " ][ " local_id " ] = $item [ " id " ];
$singleitem [ " statusnet:notice_info " ][ " source " ] = $item [ " source " ];
$singleitem [ " statusnet:notice_info " ][ " favorite " ] = " false " ;
$singleitem [ " statusnet:notice_info " ][ " repeated " ] = " false " ;
//$singleitem["original"] = $item;
$items [] = $singleitem ;
}
$as [ 'items' ] = $items ;
2012-04-08 18:19:14 +00:00
$as [ 'link' ][ 'url' ] = $a -> get_baseurl () . " / " . $user_info [ " screen_name " ] . " /all " ;
$as [ 'link' ][ 'rel' ] = " alternate " ;
$as [ 'link' ][ 'type' ] = " text/html " ;
2012-04-08 15:51:05 +00:00
return ( $as );
}
2012-04-22 16:00:24 +00:00
2012-06-26 06:54:01 +00:00
function api_format_messages ( $item , $recipient , $sender ) {
// standard meta information
$ret = Array (
'id' => $item [ 'id' ],
'created_at' => api_date ( $item [ 'created' ]),
'sender_id' => $sender [ 'id' ] ,
'sender_screen_name' => $sender [ 'screen_name' ],
'sender' => $sender ,
'recipient_id' => $recipient [ 'id' ],
'recipient_screen_name' => $recipient [ 'screen_name' ],
'recipient' => $recipient ,
);
//don't send title to regular StatusNET requests to avoid confusing these apps
if ( x ( $_GET , 'getText' )) {
$ret [ 'title' ] = $item [ 'title' ] ;
if ( $_GET [ " getText " ] == " html " ) {
$ret [ 'text' ] = bbcode ( $item [ 'body' ]);
}
elseif ( $_GET [ " getText " ] == " plain " ) {
2013-02-15 19:14:45 +00:00
$ret [ 'text' ] = html2plain ( bbcode ( $item [ 'body' ], false , false , true ), 0 );
2012-06-26 06:54:01 +00:00
}
}
else {
2013-02-15 19:14:45 +00:00
$ret [ 'text' ] = $item [ 'title' ] . " \n " . html2plain ( bbcode ( $item [ 'body' ], false , false , true ), 0 );
2012-06-26 06:54:01 +00:00
}
if ( isset ( $_GET [ " getUserObjects " ]) && $_GET [ " getUserObjects " ] == " false " ) {
unset ( $ret [ 'sender' ]);
unset ( $ret [ 'recipient' ]);
}
return $ret ;
}
2011-07-31 23:35:53 +00:00
function api_format_items ( $r , $user_info ) {
2011-08-01 03:01:00 +00:00
//logger('api_format_items: ' . print_r($r,true));
//logger('api_format_items: ' . print_r($user_info,true));
2011-07-31 23:35:53 +00:00
$a = get_app ();
2011-04-21 15:03:31 +00:00
$ret = Array ();
2011-02-15 11:24:21 +00:00
2011-02-16 07:56:47 +00:00
foreach ( $r as $item ) {
2011-08-26 14:35:51 +00:00
localize_item ( $item );
2011-07-31 07:53:46 +00:00
$status_user = (( $item [ 'cid' ] == $user_info [ 'id' ]) ? $user_info : api_item_get_user ( $a , $item ));
2012-03-18 16:52:51 +00:00
if ( $item [ 'parent' ] != $item [ 'id' ]) {
2012-04-22 16:00:24 +00:00
$r = q ( " select id from item where parent=%s and id<%s order by id desc limit 1 " ,
2012-03-18 17:21:51 +00:00
intval ( $item [ 'parent' ]), intval ( $item [ 'id' ]));
if ( $r )
$in_reply_to_status_id = $r [ 0 ][ 'id' ];
else
$in_reply_to_status_id = $item [ 'parent' ];
2012-03-18 16:52:51 +00:00
2012-04-22 16:00:24 +00:00
$r = q ( " select `item`.`contact-id`, `contact`.nick, `item`.`author-name` from item, contact
2012-03-18 17:21:51 +00:00
where `contact` . `id` = `item` . `contact-id` and `item` . id =% d " , intval( $in_reply_to_status_id ));
2012-03-18 16:52:51 +00:00
2012-03-18 17:21:51 +00:00
$in_reply_to_screen_name = $r [ 0 ][ 'author-name' ];
2012-03-18 16:52:51 +00:00
$in_reply_to_user_id = $r [ 0 ][ 'contact-id' ];
2012-03-18 17:21:51 +00:00
2012-03-18 16:52:51 +00:00
} else {
$in_reply_to_screen_name = '' ;
$in_reply_to_user_id = 0 ;
2012-03-18 17:21:51 +00:00
$in_reply_to_status_id = 0 ;
2012-03-18 16:52:51 +00:00
}
2012-04-11 17:31:01 +00:00
// Workaround for ostatus messages where the title is identically to the body
2013-02-15 19:14:45 +00:00
$statusbody = trim ( html2plain ( bbcode ( $item [ 'body' ], false , false , true ), 0 ));
2012-04-11 17:31:01 +00:00
$statustitle = trim ( $item [ 'title' ]);
if (( $statustitle != '' ) and ( strpos ( $statusbody , $statustitle ) !== false ))
$statustext = trim ( $statusbody );
else
$statustext = trim ( $statustitle . " \n \n " . $statusbody );
2012-04-22 16:00:24 +00:00
if (( $item [ " network " ] == NETWORK_FEED ) and ( strlen ( $statustext ) > 1000 ))
$statustext = substr ( $statustext , 0 , 1000 ) . " ... \n " . $item [ " plink " ];
2011-04-21 15:03:31 +00:00
$status = array (
2012-04-11 17:31:01 +00:00
'text' => $statustext ,
2011-02-15 11:24:21 +00:00
'truncated' => False ,
2012-03-18 16:52:51 +00:00
'created_at' => api_date ( $item [ 'created' ]),
2012-03-18 17:21:51 +00:00
'in_reply_to_status_id' => $in_reply_to_status_id ,
2012-03-18 16:52:51 +00:00
'source' => (( $item [ 'app' ]) ? $item [ 'app' ] : 'web' ),
'id' => intval ( $item [ 'id' ]),
'in_reply_to_user_id' => $in_reply_to_user_id ,
'in_reply_to_screen_name' => $in_reply_to_screen_name ,
2011-02-15 11:24:21 +00:00
'geo' => '' ,
2012-03-18 16:52:51 +00:00
'favorited' => $item [ 'starred' ] ? true : false ,
2011-06-21 09:41:16 +00:00
'user' => $status_user ,
2012-04-11 17:31:01 +00:00
'statusnet_html' => trim ( bbcode ( $item [ 'body' ])),
'statusnet_conversation_id' => $item [ 'parent' ],
2011-04-21 15:03:31 +00:00
);
2012-03-18 16:52:51 +00:00
// Seesmic doesn't like the following content
if ( $_SERVER [ 'HTTP_USER_AGENT' ] != 'Seesmic' ) {
$status2 = array (
'updated' => api_date ( $item [ 'edited' ]),
'published' => api_date ( $item [ 'created' ]),
'message_id' => $item [ 'uri' ],
'url' => ( $item [ 'plink' ] != '' ? $item [ 'plink' ] : $item [ 'author-link' ]),
'coordinates' => $item [ 'coord' ],
'place' => $item [ 'location' ],
'contributors' => '' ,
'annotations' => '' ,
'entities' => '' ,
'objecttype' => (( $item [ 'object-type' ]) ? $item [ 'object-type' ] : ACTIVITY_OBJ_NOTE ),
'verb' => (( $item [ 'verb' ]) ? $item [ 'verb' ] : ACTIVITY_POST ),
'self' => $a -> get_baseurl () . " /api/statuses/show/ " . $item [ 'id' ] . " . " . $type ,
'edit' => $a -> get_baseurl () . " /api/statuses/show/ " . $item [ 'id' ] . " . " . $type ,
);
$status = array_merge ( $status , $status2 );
}
2011-02-15 11:24:21 +00:00
$ret [] = $status ;
};
2011-07-31 23:35:53 +00:00
return $ret ;
2011-02-16 07:56:47 +00:00
}
2011-07-31 23:35:53 +00:00
2011-06-21 00:16:13 +00:00
function api_account_rate_limit_status ( & $a , $type ) {
$hash = array (
2012-03-18 16:52:51 +00:00
'reset_time_in_seconds' => strtotime ( 'now + 1 hour' ),
2011-06-21 00:16:13 +00:00
'remaining_hits' => ( string ) 150 ,
'hourly_limit' => ( string ) 150 ,
'reset_time' => datetime_convert ( 'UTC' , 'UTC' , 'now + 1 hour' , ATOM_TIME ),
);
2012-03-18 16:52:51 +00:00
if ( $type == " xml " )
$hash [ 'resettime_in_seconds' ] = $hash [ 'reset_time_in_seconds' ];
2011-06-21 00:16:13 +00:00
return api_apply_template ( 'ratelimit' , $type , array ( '$hash' => $hash ));
}
api_register_func ( 'api/account/rate_limit_status' , 'api_account_rate_limit_status' , true );
2011-07-29 04:56:56 +00:00
2012-03-18 16:52:51 +00:00
function api_help_test ( & $a , $type ) {
if ( $type == 'xml' )
$ok = " true " ;
else
$ok = " ok " ;
return api_apply_template ( 'test' , $type , array ( '$ok' => $ok ));
}
2013-03-07 13:16:53 +00:00
api_register_func ( 'api/help/test' , 'api_help_test' , false );
2012-03-18 16:52:51 +00:00
2011-08-19 12:57:54 +00:00
/**
* https :// dev . twitter . com / docs / api / 1 / get / statuses / friends
2011-08-19 13:09:10 +00:00
* This function is deprecated by Twitter
* returns : json , xml
2011-08-19 12:57:54 +00:00
**/
function api_statuses_f ( & $a , $type , $qtype ) {
2012-12-01 00:26:54 +00:00
if ( api_user () === false ) return false ;
2011-08-19 12:57:54 +00:00
$user_info = api_get_user ( $a );
2011-08-26 14:35:51 +00:00
// friends and followers only for self
if ( $user_info [ 'self' ] == 0 ){
return false ;
}
2011-08-19 13:09:10 +00:00
if ( x ( $_GET , 'cursor' ) && $_GET [ 'cursor' ] == 'undefined' ){
/* this is to stop Hotot to load friends multiple times
* I 'm not sure if I' m missing return something or
* is a bug in hotot . Workaround , meantime
*/
2011-08-26 14:35:51 +00:00
/* $ret = Array ();
return array ( '$users' => $ret ); */
return false ;
2011-08-19 13:09:10 +00:00
}
2011-08-19 12:57:54 +00:00
if ( $qtype == 'friends' )
$sql_extra = sprintf ( " AND ( `rel` = %d OR `rel` = %d ) " , intval ( CONTACT_IS_SHARING ), intval ( CONTACT_IS_FRIEND ));
if ( $qtype == 'followers' )
$sql_extra = sprintf ( " AND ( `rel` = %d OR `rel` = %d ) " , intval ( CONTACT_IS_FOLLOWER ), intval ( CONTACT_IS_FRIEND ));
$r = q ( " SELECT id FROM `contact` WHERE `uid` = %d AND `self` = 0 AND `blocked` = 0 AND `pending` = 0 $sql_extra " ,
2012-12-01 00:26:54 +00:00
intval ( api_user ())
2011-08-19 12:57:54 +00:00
);
$ret = array ();
foreach ( $r as $cid ){
$ret [] = api_get_user ( $a , $cid [ 'id' ]);
}
2011-08-19 13:09:10 +00:00
2011-08-26 14:35:51 +00:00
return array ( '$users' => $ret );
2011-08-19 12:57:54 +00:00
}
function api_statuses_friends ( & $a , $type ){
2011-08-26 14:35:51 +00:00
$data = api_statuses_f ( $a , $type , " friends " );
if ( $data === false ) return false ;
return api_apply_template ( " friends " , $type , $data );
2011-08-19 12:57:54 +00:00
}
function api_statuses_followers ( & $a , $type ){
2011-08-26 14:35:51 +00:00
$data = api_statuses_f ( $a , $type , " followers " );
if ( $data === false ) return false ;
return api_apply_template ( " friends " , $type , $data );
2011-08-19 12:57:54 +00:00
}
api_register_func ( 'api/statuses/friends' , 'api_statuses_friends' , true );
api_register_func ( 'api/statuses/followers' , 'api_statuses_followers' , true );
2011-07-29 04:56:56 +00:00
function api_statusnet_config ( & $a , $type ) {
$name = $a -> config [ 'sitename' ];
$server = $a -> get_hostname ();
2012-02-19 18:34:48 +00:00
$logo = $a -> get_baseurl () . '/images/friendica-64.png' ;
2011-07-29 04:56:56 +00:00
$email = $a -> config [ 'admin_email' ];
$closed = (( $a -> config [ 'register_policy' ] == REGISTER_CLOSED ) ? 'true' : 'false' );
$private = (( $a -> config [ 'system' ][ 'block_public' ]) ? 'true' : 'false' );
2011-08-03 03:02:07 +00:00
$textlimit = ( string ) (( $a -> config [ 'max_import_size' ]) ? $a -> config [ 'max_import_size' ] : 200000 );
2011-08-03 03:08:40 +00:00
if ( $a -> config [ 'api_import_size' ])
$texlimit = string ( $a -> config [ 'api_import_size' ]);
2011-07-29 04:56:56 +00:00
$ssl = (( $a -> config [ 'system' ][ 'have_ssl' ]) ? 'true' : 'false' );
$sslserver = (( $ssl === 'true' ) ? str_replace ( 'http:' , 'https:' , $a -> get_baseurl ()) : '' );
$config = array (
'site' => array ( 'name' => $name , 'server' => $server , 'theme' => 'default' , 'path' => '' ,
'logo' => $logo , 'fancy' => 'true' , 'language' => 'en' , 'email' => $email , 'broughtby' => '' ,
'broughtbyurl' => '' , 'timezone' => 'UTC' , 'closed' => $closed , 'inviteonly' => 'false' ,
'private' => $private , 'textlimit' => $textlimit , 'sslserver' => $sslserver , 'ssl' => $ssl ,
2012-06-23 20:52:50 +00:00
'shorturllength' => '30' ,
'friendica' => array (
'FRIENDICA_PLATFORM' => FRIENDICA_PLATFORM ,
'FRIENDICA_VERSION' => FRIENDICA_VERSION ,
'DFRN_PROTOCOL_VERSION' => DFRN_PROTOCOL_VERSION ,
'DB_UPDATE_VERSION' => DB_UPDATE_VERSION
)
2011-07-29 04:56:56 +00:00
),
);
return api_apply_template ( 'config' , $type , array ( '$config' => $config ));
}
2011-07-30 00:01:57 +00:00
api_register_func ( 'api/statusnet/config' , 'api_statusnet_config' , false );
2011-07-29 04:56:56 +00:00
2011-07-30 01:21:54 +00:00
function api_statusnet_version ( & $a , $type ) {
// liar
if ( $type === 'xml' ) {
header ( " Content-type: application/xml " );
echo '<?xml version="1.0" encoding="UTF-8"?>' . " \r \n " . '<version>0.9.7</version>' . " \r \n " ;
killme ();
}
elseif ( $type === 'json' ) {
header ( " Content-type: application/json " );
echo '"0.9.7"' ;
killme ();
}
}
api_register_func ( 'api/statusnet/version' , 'api_statusnet_version' , false );
2011-08-01 05:22:34 +00:00
function api_ff_ids ( & $a , $type , $qtype ) {
2012-12-01 00:26:54 +00:00
if ( ! api_user ())
2011-08-01 05:22:34 +00:00
return false ;
if ( $qtype == 'friends' )
2011-08-07 23:15:54 +00:00
$sql_extra = sprintf ( " AND ( `rel` = %d OR `rel` = %d ) " , intval ( CONTACT_IS_SHARING ), intval ( CONTACT_IS_FRIEND ));
2011-08-01 05:22:34 +00:00
if ( $qtype == 'followers' )
2011-08-07 23:15:54 +00:00
$sql_extra = sprintf ( " AND ( `rel` = %d OR `rel` = %d ) " , intval ( CONTACT_IS_FOLLOWER ), intval ( CONTACT_IS_FRIEND ));
2011-08-01 05:22:34 +00:00
$r = q ( " SELECT id FROM `contact` WHERE `uid` = %d AND `self` = 0 AND `blocked` = 0 AND `pending` = 0 $sql_extra " ,
2012-12-01 00:26:54 +00:00
intval ( api_user ())
2011-08-01 05:22:34 +00:00
);
if ( is_array ( $r )) {
if ( $type === 'xml' ) {
header ( " Content-type: application/xml " );
echo '<?xml version="1.0" encoding="UTF-8"?>' . " \r \n " . '<ids>' . " \r \n " ;
foreach ( $r as $rr )
echo '<id>' . $rr [ 'id' ] . '</id>' . " \r \n " ;
echo '</ids>' . " \r \n " ;
killme ();
}
elseif ( $type === 'json' ) {
$ret = array ();
header ( " Content-type: application/json " );
foreach ( $r as $rr ) $ret [] = $rr [ 'id' ];
echo json_encode ( $ret );
killme ();
}
}
}
function api_friends_ids ( & $a , $type ) {
api_ff_ids ( $a , $type , 'friends' );
}
function api_followers_ids ( & $a , $type ) {
api_ff_ids ( $a , $type , 'followers' );
}
api_register_func ( 'api/friends/ids' , 'api_friends_ids' , true );
api_register_func ( 'api/followers/ids' , 'api_followers_ids' , true );
2011-08-19 12:57:54 +00:00
2011-08-19 14:55:43 +00:00
function api_direct_messages_new ( & $a , $type ) {
2012-12-01 00:26:54 +00:00
if ( api_user () === false ) return false ;
2011-08-19 14:55:43 +00:00
if ( ! x ( $_POST , " text " ) || ! x ( $_POST , " screen_name " )) return ;
2012-06-22 12:54:31 +00:00
2011-08-19 14:55:43 +00:00
$sender = api_get_user ( $a );
2012-06-25 13:53:56 +00:00
require_once ( " include/message.php " );
2011-08-19 14:55:43 +00:00
$r = q ( " SELECT `id` FROM `contact` WHERE `uid`=%d AND `nick`='%s' " ,
2012-12-01 00:26:54 +00:00
intval ( api_user ()),
2011-08-19 14:55:43 +00:00
dbesc ( $_POST [ 'screen_name' ]));
2012-06-22 12:54:31 +00:00
2011-08-19 14:55:43 +00:00
$recipient = api_get_user ( $a , $r [ 0 ][ 'id' ]);
2012-06-22 12:54:31 +00:00
$replyto = '' ;
2012-06-25 13:53:56 +00:00
$sub = '' ;
2012-06-22 12:54:31 +00:00
if ( x ( $_REQUEST , 'replyto' )) {
2012-06-25 14:25:34 +00:00
$r = q ( 'SELECT `parent-uri`, `title` FROM `mail` WHERE `uid`=%d AND `id`=%d' ,
2012-12-01 00:26:54 +00:00
intval ( api_user ()),
2012-06-22 12:54:31 +00:00
intval ( $_REQUEST [ 'replyto' ]));
2012-06-25 14:25:34 +00:00
$replyto = $r [ 0 ][ 'parent-uri' ];
2012-06-25 13:53:56 +00:00
$sub = $r [ 0 ][ 'title' ];
2012-06-22 12:54:31 +00:00
}
else {
2012-06-25 13:53:56 +00:00
if ( x ( $_REQUEST , 'title' )) {
$sub = $_REQUEST [ 'title' ];
}
else {
$sub = (( strlen ( $_POST [ 'text' ]) > 10 ) ? substr ( $_POST [ 'text' ], 0 , 10 ) . " ... " : $_POST [ 'text' ]);
}
2012-06-22 12:54:31 +00:00
}
2012-06-25 13:53:56 +00:00
2012-06-22 12:54:31 +00:00
$id = send_message ( $recipient [ 'id' ], $_POST [ 'text' ], $sub , $replyto );
2011-08-19 14:55:43 +00:00
if ( $id >- 1 ) {
$r = q ( " SELECT * FROM `mail` WHERE id=%d " , intval ( $id ));
2012-06-26 06:54:01 +00:00
$ret = api_format_messages ( $r [ 0 ], $recipient , $sender );
2011-08-19 14:55:43 +00:00
} else {
$ret = array ( " error " => $id );
}
$data = Array ( '$messages' => $ret );
switch ( $type ){
case " atom " :
case " rss " :
$data = api_rss_extra ( $a , $data , $user_info );
}
return api_apply_template ( " direct_messages " , $type , $data );
}
api_register_func ( 'api/direct_messages/new' , 'api_direct_messages_new' , true );
2012-06-26 06:54:01 +00:00
function api_direct_messages_box ( & $a , $type , $box ) {
2012-12-01 00:26:54 +00:00
if ( api_user () === false ) return false ;
2011-08-19 14:55:43 +00:00
$user_info = api_get_user ( $a );
// params
$count = ( x ( $_GET , 'count' ) ? $_GET [ 'count' ] : 20 );
2011-08-19 18:33:34 +00:00
$page = ( x ( $_REQUEST , 'page' ) ? $_REQUEST [ 'page' ] - 1 : 0 );
if ( $page < 0 ) $page = 0 ;
2011-08-19 14:55:43 +00:00
$start = $page * $count ;
2012-06-26 06:54:01 +00:00
$profile_url = $a -> get_baseurl () . '/profile/' . $a -> user [ 'nickname' ];
2011-08-19 14:55:43 +00:00
if ( $box == " sentbox " ) {
2012-06-23 17:29:58 +00:00
$sql_extra = " `from-url`=' " . dbesc ( $profile_url ) . " ' " ;
2012-06-26 06:54:01 +00:00
}
elseif ( $box == " conversation " ) {
$sql_extra = " `parent-uri`=' " . dbesc ( $_GET [ " uri " ] ) . " ' " ;
}
elseif ( $box == " all " ) {
$sql_extra = " true " ;
}
elseif ( $box == " inbox " ) {
2012-06-23 17:29:58 +00:00
$sql_extra = " `from-url`!=' " . dbesc ( $profile_url ) . " ' " ;
2011-08-19 14:55:43 +00:00
}
$r = q ( " SELECT * FROM `mail` WHERE uid=%d AND $sql_extra ORDER BY created DESC LIMIT %d,%d " ,
2012-12-01 00:26:54 +00:00
intval ( api_user ()),
2011-08-19 14:55:43 +00:00
intval ( $start ), intval ( $count )
2012-06-23 17:21:48 +00:00
);
2011-08-19 14:55:43 +00:00
$ret = Array ();
2012-06-26 06:54:01 +00:00
foreach ( $r as $item ) {
2012-06-23 17:29:58 +00:00
if ( $box == " inbox " || $item [ 'from-url' ] != $profile_url ){
2012-06-26 06:54:01 +00:00
$recipient = $user_info ;
$sender = api_get_user ( $a , $item [ 'contact-id' ]);
2011-08-19 14:55:43 +00:00
}
2012-06-26 06:54:01 +00:00
elseif ( $box == " sentbox " || $item [ 'from-url' ] != $profile_url ){
$recipient = api_get_user ( $a , $item [ 'contact-id' ]);
$sender = $user_info ;
}
$ret [] = api_format_messages ( $item , $recipient , $sender );
2011-08-19 14:55:43 +00:00
}
$data = array ( '$messages' => $ret );
switch ( $type ){
case " atom " :
case " rss " :
$data = api_rss_extra ( $a , $data , $user_info );
}
return api_apply_template ( " direct_messages " , $type , $data );
}
function api_direct_messages_sentbox ( & $a , $type ){
return api_direct_messages_box ( $a , $type , " sentbox " );
}
function api_direct_messages_inbox ( & $a , $type ){
return api_direct_messages_box ( $a , $type , " inbox " );
}
2012-06-23 17:21:48 +00:00
function api_direct_messages_all ( & $a , $type ){
return api_direct_messages_box ( $a , $type , " all " );
}
function api_direct_messages_conversation ( & $a , $type ){
return api_direct_messages_box ( $a , $type , " conversation " );
}
api_register_func ( 'api/direct_messages/conversation' , 'api_direct_messages_conversation' , true );
api_register_func ( 'api/direct_messages/all' , 'api_direct_messages_all' , true );
2011-08-19 14:55:43 +00:00
api_register_func ( 'api/direct_messages/sent' , 'api_direct_messages_sentbox' , true );
api_register_func ( 'api/direct_messages' , 'api_direct_messages_inbox' , true );
2011-10-20 13:57:35 +00:00
function api_oauth_request_token ( & $a , $type ){
try {
$oauth = new FKOAuth1 ();
$r = $oauth -> fetch_request_token ( OAuthRequest :: from_request ());
} catch ( Exception $e ){
echo " error= " . OAuthUtil :: urlencode_rfc3986 ( $e -> getMessage ()); killme ();
}
2011-11-07 16:36:58 +00:00
echo $r ;
2011-10-20 13:57:35 +00:00
killme ();
}
function api_oauth_access_token ( & $a , $type ){
try {
$oauth = new FKOAuth1 ();
$r = $oauth -> fetch_access_token ( OAuthRequest :: from_request ());
} catch ( Exception $e ){
echo " error= " . OAuthUtil :: urlencode_rfc3986 ( $e -> getMessage ()); killme ();
}
2011-11-07 16:36:58 +00:00
echo $r ;
2011-10-20 13:57:35 +00:00
killme ();
}
2011-10-26 15:15:36 +00:00
2011-10-20 13:57:35 +00:00
api_register_func ( 'api/oauth/request_token' , 'api_oauth_request_token' , false );
api_register_func ( 'api/oauth/access_token' , 'api_oauth_access_token' , false );
2011-10-26 15:15:36 +00:00
2012-03-21 09:08:40 +00:00
/*
Not implemented by now :
2012-04-07 22:02:25 +00:00
favorites
favorites / create
favorites / destroy
2012-03-21 09:08:40 +00:00
statuses / retweets_of_me
friendships / create
friendships / destroy
friendships / exists
friendships / show
account / update_location
account / update_profile_background_image
account / update_profile_image
blocks / create
blocks / destroy
Not implemented in status . net :
statuses / retweeted_to_me
statuses / retweeted_by_me
direct_messages / destroy
account / end_session
account / update_delivery_device
notifications / follow
notifications / leave
blocks / exists
blocks / blocking
2012-07-12 21:41:04 +00:00
lists
2012-03-21 09:08:40 +00:00
*/
2012-07-05 21:36:00 +00:00