2011-02-15 06:24:21 -05:00
< ? php
2013-12-29 11:54:37 -05:00
/* To - Do :
- Automatically detect if incoming data is HTML or BBCode
- search for usernames should first search friendica , then the other open networks , then the closed ones
*/
2012-12-28 16:51:50 -05: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 12:00:24 -04:00
/*
2011-02-15 06:24:21 -05:00
* Twitter - Like API
2012-04-22 12:00:24 -04:00
*
2011-02-15 06:24:21 -05:00
*/
$API = Array ();
2012-04-22 12:00:24 -04:00
$called_api = Null ;
2011-04-21 11:03:31 -04:00
2012-11-30 19:26:54 -05: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 06:24:21 -05:00
function api_date ( $str ){
//Wed May 23 06:01:13 +0000 2007
2011-08-16 07:55:38 -04:00
return datetime_convert ( 'UTC' , 'UTC' , $str , " D M d H:i:s +0000 Y " );
2011-02-15 06:24:21 -05:00
}
2012-04-22 12:00:24 -04:00
2011-02-15 06:24:21 -05:00
function api_register_func ( $path , $func , $auth = false ){
global $API ;
$API [ $path ] = array ( 'func' => $func ,
2011-02-16 02:56:47 -05:00
'auth' => $auth );
2011-02-15 06:24:21 -05:00
}
2012-04-22 12:00:24 -04:00
2011-02-15 06:24:21 -05:00
/**
* Simple HTTP Login
*/
2012-01-15 16:57:00 -05:00
2011-02-15 06:24:21 -05:00
function api_login ( & $a ){
2011-11-07 11:36:58 -05: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();
}
2013-12-15 17:00:47 -05:00
2011-06-19 23:13:24 -04: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 06:24:21 -05:00
if ( ! isset ( $_SERVER [ 'PHP_AUTH_USER' ])) {
2013-12-20 17:07:11 -05:00
logger ( 'API_login: ' . print_r ( $_SERVER , true ), LOGGER_DEBUG );
header ( 'WWW-Authenticate: Basic realm="Friendica"' );
header ( 'HTTP/1.0 401 Unauthorized' );
2014-01-02 13:12:26 -05:00
die (( api_error ( $a , 'json' , " This api requires login " )));
2013-12-20 17:07:11 -05:00
//die('This api requires login');
2011-02-15 06:24:21 -05:00
}
2013-12-15 17:00:47 -05:00
2011-02-15 06:24:21 -05:00
$user = $_SERVER [ 'PHP_AUTH_USER' ];
$encrypted = hash ( 'whirlpool' , trim ( $_SERVER [ 'PHP_AUTH_PW' ]));
2013-12-15 17:00:47 -05:00
/**
* next code from mod / auth . php . needs better solution
*/
2011-02-15 06:24:21 -05:00
// process normal login request
2013-12-15 17:00:47 -05:00
$r = q ( " SELECT * FROM `user` WHERE ( `email` = '%s' OR `nickname` = '%s' )
2012-11-02 16:43:47 -04:00
AND `password` = '%s' AND `blocked` = 0 AND `account_expired` = 0 AND `account_removed` = 0 AND `verified` = 1 LIMIT 1 " ,
2011-02-15 06:24:21 -05:00
dbesc ( trim ( $user )),
dbesc ( trim ( $user )),
dbesc ( $encrypted )
);
2011-04-27 11:46:23 -04:00
if ( count ( $r )){
2011-02-15 06:24:21 -05:00
$record = $r [ 0 ];
2011-04-27 11:46:23 -04:00
} else {
2011-06-19 23:13:24 -04:00
logger ( 'API_login failure: ' . print_r ( $_SERVER , true ), LOGGER_DEBUG );
2012-04-01 03:52:45 -04:00
header ( 'WWW-Authenticate: Basic realm="Friendica"' );
2011-04-27 11:46:23 -04:00
header ( 'HTTP/1.0 401 Unauthorized' );
2011-06-19 23:13:24 -04:00
die ( 'This api requires login' );
2011-04-27 11:46:23 -04:00
}
2011-02-15 06:24:21 -05:00
2012-01-12 18:46:39 -05:00
require_once ( 'include/security.php' );
2012-11-30 19:26:54 -05:00
authenticate_success ( $record ); $_SESSION [ " allow_api " ] = true ;
2011-02-15 06:24:21 -05:00
call_hooks ( 'logged_in' , $a -> user );
}
2013-12-15 17:00:47 -05:00
2011-04-21 11:03:31 -04:00
/**************************
* MAIN API ENTRY POINT *
**************************/
2011-02-15 06:24:21 -05:00
function api_call ( & $a ){
2011-08-26 10:35:51 -04:00
GLOBAL $API , $called_api ;
2012-02-19 19:53:22 -05:00
// preset
$type = " json " ;
2011-02-15 06:24:21 -05:00
foreach ( $API as $p => $info ){
if ( strpos ( $a -> query_string , $p ) === 0 ){
2011-08-26 10:35:51 -04:00
$called_api = explode ( " / " , $p );
2012-01-12 18:46:39 -05:00
//unset($_SERVER['PHP_AUTH_USER']);
2012-11-30 19:26:54 -05:00
if ( $info [ 'auth' ] === true && api_user () === false ) {
2011-04-21 11:03:31 -04:00
api_login ( $a );
2011-02-15 06:24:21 -05:00
}
2011-07-31 19:35:53 -04:00
2012-11-30 19:26:54 -05:00
load_contact_links ( api_user ());
2011-07-31 19:35:53 -04:00
2012-02-19 19:53:22 -05:00
logger ( 'API call for ' . $a -> user [ 'username' ] . ': ' . $a -> query_string );
2011-08-01 08:13:59 -04:00
logger ( 'API parameters: ' . print_r ( $_REQUEST , true ));
2012-02-19 19:53:22 -05:00
$type = " json " ;
2011-04-21 11:03:31 -04: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-19 19:53:22 -05:00
if ( strpos ( $a -> query_string , " .atom " ) > 0 ) $type = " atom " ;
2012-04-08 11:23:38 -04:00
if ( strpos ( $a -> query_string , " .as " ) > 0 ) $type = " as " ;
2012-02-19 19:53:22 -05:00
2011-04-21 11:03:31 -04: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-19 19:53:22 -05:00
case " json " :
2013-12-15 17:00:47 -05:00
header ( " Content-Type: application/json " );
2011-06-20 20:16:13 -04:00
foreach ( $r as $rr )
return json_encode ( $rr );
2011-04-21 11:03:31 -04: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 05:41:16 -04:00
header ( " Content-Type: application/atom+xml " );
2011-04-21 11:03:31 -04:00
return '<?xml version="1.0" encoding="UTF-8"?>' . " \n " . $r ;
break ;
2012-04-08 11:23:38 -04:00
case " as " :
//header ("Content-Type: application/json");
//foreach($r as $rr)
// return json_encode($rr);
return json_encode ( $r );
break ;
2012-02-19 19:53:22 -05:00
2011-02-15 06:24:21 -05:00
}
//echo "<pre>"; var_dump($r); die();
}
}
2012-07-13 17:23:31 -04:00
header ( " HTTP/1.1 404 Not Found " );
2012-02-20 05:15:22 -05:00
logger ( 'API call not implemented: ' . $a -> query_string . " - " . print_r ( $_REQUEST , true ));
2014-01-02 13:12:26 -05:00
return ( api_error ( $a , $type , " not implemented " ));
2013-12-20 17:07:11 -05:00
}
function api_error ( & $a , $type , $error ) {
$r = " <status><error> " . $error . " </error><request> " . $a -> query_string . " </request></status> " ;
2011-07-31 23:01:00 -04:00
switch ( $type ){
case " xml " :
header ( " Content-Type: text/xml " );
return '<?xml version="1.0" encoding="UTF-8"?>' . " \n " . $r ;
break ;
2012-02-19 19:53:22 -05:00
case " json " :
header ( " Content-Type: application/json " );
2013-12-20 17:07:11 -05:00
return json_encode ( array ( 'error' => $error , 'request' => $a -> query_string ));
2011-07-31 23:01:00 -04:00
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 06:24:21 -05:00
}
2011-04-21 11:03:31 -04: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 05:41:16 -04:00
$arr [ '$user' ] = $user_info ;
2011-04-21 11:03:31 -04:00
$arr [ '$rss' ] = array (
'alternate' => $user_info [ 'url' ],
'self' => $a -> get_baseurl () . " / " . $a -> query_string ,
2011-07-31 19:35:53 -04:00
'base' => $a -> get_baseurl (),
2011-04-21 11:03:31 -04:00
'updated' => api_date ( null ),
2011-07-31 19:35:53 -04:00
'atom_updated' => datetime_convert ( 'UTC' , 'UTC' , 'now' , ATOM_TIME ),
2011-04-21 11:03:31 -04:00
'language' => $user_info [ 'language' ],
2012-02-19 13:34:48 -05:00
'logo' => $a -> get_baseurl () . " /images/friendica-32.png " ,
2011-04-21 11:03:31 -04:00
);
2013-12-15 17:00:47 -05:00
2011-04-21 11:03:31 -04:00
return $arr ;
}
2013-12-15 17:00:47 -05:00
/**
2013-12-27 08:11:13 -05:00
* Unique contact to contact url .
2013-12-15 17:00:47 -05:00
*/
function api_unique_id_to_url ( $id ){
$r = q ( " SELECT url FROM unique_contacts WHERE id=%d LIMIT 1 " ,
intval ( $id ));
if ( $r )
return ( $r [ 0 ][ " url " ]);
else
return false ;
}
2011-02-15 06:24:21 -05:00
/**
2011-04-21 11:03:31 -04:00
* Returns user info array .
2011-02-15 06:24:21 -05:00
*/
2013-12-20 17:07:11 -05:00
function api_get_user ( & $a , $contact_id = Null , $type = " json " ){
2011-08-26 10:35:51 -04:00
global $called_api ;
2011-02-15 06:24:21 -05:00
$user = null ;
$extra_query = " " ;
2013-12-15 17:00:47 -05:00
$url = " " ;
$nick = " " ;
// Searching for contact URL
if ( ! is_null ( $contact_id ) AND ( intval ( $contact_id ) == 0 )){
$user = dbesc ( normalise_link ( $contact_id ));
$url = $user ;
$extra_query = " AND `contact`.`nurl` = '%s' " ;
if ( api_user () !== false ) $extra_query .= " AND `contact`.`uid`= " . intval ( api_user ());
}
2011-07-31 03:53:46 -04:00
2013-12-15 17:00:47 -05:00
// Searching for unique contact id
if ( ! is_null ( $contact_id ) AND ( intval ( $contact_id ) != 0 )){
$user = dbesc ( api_unique_id_to_url ( $contact_id ));
2011-08-19 10:55:43 -04:00
2013-12-15 17:00:47 -05:00
if ( $user == " " )
2013-12-20 17:07:11 -05:00
die ( api_error ( $a , $type , t ( " User not found. " )));
2013-12-15 17:00:47 -05:00
$url = $user ;
$extra_query = " AND `contact`.`nurl` = '%s' " ;
if ( api_user () !== false ) $extra_query .= " AND `contact`.`uid`= " . intval ( api_user ());
2011-06-21 05:41:16 -04:00
}
2013-12-15 17:00:47 -05:00
2011-06-21 05:41:16 -04:00
if ( is_null ( $user ) && x ( $_GET , 'user_id' )) {
2013-12-15 17:00:47 -05:00
$user = dbesc ( api_unique_id_to_url ( $_GET [ 'user_id' ]));
if ( $user == " " )
2013-12-20 17:07:11 -05:00
die ( api_error ( $a , $type , t ( " User not found. " )));
2013-12-15 17:00:47 -05:00
$url = $user ;
$extra_query = " AND `contact`.`nurl` = '%s' " ;
if ( api_user () !== false ) $extra_query .= " AND `contact`.`uid`= " . intval ( api_user ());
2011-02-15 06:24:21 -05:00
}
2011-06-21 05:41:16 -04:00
if ( is_null ( $user ) && x ( $_GET , 'screen_name' )) {
2013-12-15 17:00:47 -05:00
$user = dbesc ( $_GET [ 'screen_name' ]);
$nick = $user ;
2011-04-21 11:03:31 -04:00
$extra_query = " AND `contact`.`nick` = '%s' " ;
2012-11-30 19:26:54 -05:00
if ( api_user () !== false ) $extra_query .= " AND `contact`.`uid`= " . intval ( api_user ());
2011-02-15 06:24:21 -05:00
}
2013-12-15 17:00:47 -05:00
2013-12-29 11:54:37 -05:00
if ( is_null ( $user ) AND ( $a -> argc > ( count ( $called_api ) - 1 )) AND ( count ( $called_api ) > 0 )){
2011-08-26 10:35:51 -04:00
$argid = count ( $called_api );
list ( $user , $null ) = explode ( " . " , $a -> argv [ $argid ]);
2011-02-15 06:24:21 -05:00
if ( is_numeric ( $user )){
2013-12-15 17:00:47 -05:00
$user = dbesc ( api_unique_id_to_url ( $user ));
if ( $user == " " )
return false ;
$url = $user ;
$extra_query = " AND `contact`.`nurl` = '%s' " ;
if ( api_user () !== false ) $extra_query .= " AND `contact`.`uid`= " . intval ( api_user ());
2011-02-15 06:24:21 -05:00
} else {
$user = dbesc ( $user );
2013-12-15 17:00:47 -05:00
$nick = $user ;
2011-04-21 11:03:31 -04:00
$extra_query = " AND `contact`.`nick` = '%s' " ;
2012-11-30 19:26:54 -05:00
if ( api_user () !== false ) $extra_query .= " AND `contact`.`uid`= " . intval ( api_user ());
2011-02-15 06:24:21 -05:00
}
}
2013-12-15 17:00:47 -05:00
if ( ! $user ) {
2012-11-30 19:26:54 -05:00
if ( api_user () === false ) {
2011-02-16 02:56:47 -05:00
api_login ( $a ); return False ;
} else {
$user = $_SESSION [ 'uid' ];
2011-07-30 23:48:55 -04:00
$extra_query = " AND `contact`.`uid` = %d AND `contact`.`self` = 1 " ;
2011-02-16 02:56:47 -05:00
}
2013-12-15 17:00:47 -05:00
2011-02-15 06:24:21 -05:00
}
2013-12-15 17:00:47 -05:00
2012-06-11 22:21:35 -04:00
logger ( 'api_user: ' . $extra_query . ', user: ' . $user );
2013-12-15 17:00:47 -05:00
// user info
2011-06-21 05:41:16 -04:00
$uinfo = q ( " SELECT *, `contact`.`id` as `cid` FROM `contact`
WHERE 1
2011-02-15 06:24:21 -05:00
$extra_query " ,
$user
);
2013-12-15 17:00:47 -05:00
// if the contact wasn't found, fetch it from the unique contacts
2011-02-15 06:24:21 -05:00
if ( count ( $uinfo ) == 0 ) {
2013-12-15 17:00:47 -05:00
$r = array ();
if ( $url != " " )
$r = q ( " SELECT * FROM unique_contacts WHERE url='%s' LIMIT 1 " , $url );
elseif ( $nick != " " )
$r = q ( " SELECT * FROM unique_contacts WHERE nick='%s' LIMIT 1 " , $nick );
if ( $r ) {
2014-01-02 16:29:44 -05:00
// If no nick where given, extract it from the address
if (( $r [ 0 ][ 'nick' ] == " " ) OR ( $r [ 0 ][ 'name' ] == $r [ 0 ][ 'nick' ]))
$r [ 0 ][ 'nick' ] = api_get_nick ( $r [ 0 ][ " url " ]);
2013-12-15 17:00:47 -05:00
$ret = array (
'id' => $r [ 0 ][ " id " ],
'name' => $r [ 0 ][ " name " ],
2013-12-19 00:58:11 -05:00
'screen_name' => (( $r [ 0 ][ 'nick' ]) ? $r [ 0 ][ 'nick' ] : $r [ 0 ][ 'name' ]),
2013-12-15 17:00:47 -05:00
'location' => NULL ,
'description' => NULL ,
'profile_image_url' => $r [ 0 ][ " avatar " ],
2013-12-26 19:48:43 -05:00
'profile_image_url_https' => $r [ 0 ][ " avatar " ],
2013-12-19 00:58:11 -05:00
'url' => $r [ 0 ][ " url " ],
2013-12-15 17:00:47 -05:00
'protected' => false ,
'followers_count' => 0 ,
'friends_count' => 0 ,
2013-12-26 19:48:43 -05:00
'created_at' => api_date ( 0 ),
2013-12-15 17:00:47 -05:00
'favourites_count' => 0 ,
'utc_offset' => 0 ,
'time_zone' => 'UTC' ,
2013-12-19 00:58:11 -05:00
'statuses_count' => 0 ,
2013-12-26 19:48:43 -05:00
'following' => false ,
'verified' => false ,
2013-12-15 17:00:47 -05:00
'statusnet_blocking' => false ,
'notifications' => false ,
'statusnet_profile_url' => $r [ 0 ][ " url " ],
'uid' => 0 ,
'cid' => 0 ,
'self' => 0 ,
);
return $ret ;
} else
2013-12-20 17:07:11 -05:00
die ( api_error ( $a , $type , t ( " User not found. " )));
2013-12-15 17:00:47 -05:00
2011-02-15 06:24:21 -05:00
}
2013-12-15 17:00:47 -05:00
2011-07-31 23:01:00 -04:00
if ( $uinfo [ 0 ][ 'self' ]) {
2011-08-05 08:17:18 -04:00
$usr = q ( " select * from user where uid = %d limit 1 " ,
2012-11-30 19:26:54 -05:00
intval ( api_user ())
2011-08-05 08:17:18 -04:00
);
$profile = q ( " select * from profile where uid = %d and `is-default` = 1 limit 1 " ,
2012-11-30 19:26:54 -05:00
intval ( api_user ())
2011-08-05 08:17:18 -04:00
);
2011-07-31 23:01:00 -04:00
// count public wall messages
$r = q ( " SELECT COUNT(`id`) as `count` FROM `item`
WHERE `uid` = % d
2013-12-15 17:00:47 -05:00
AND `type` = 'wall'
2011-07-31 23:01:00 -04:00
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 06:24:21 -05:00
// count friends
$r = q ( " SELECT COUNT(`id`) as `count` FROM `contact`
2011-08-01 01:22:34 -04:00
WHERE `uid` = % d AND `rel` IN ( % d , % d )
2013-12-15 17:00:47 -05:00
AND `self` = 0 AND `blocked` = 0 AND `pending` = 0 AND `hidden` = 0 " ,
2011-08-01 01:22:34 -04:00
intval ( $uinfo [ 0 ][ 'uid' ]),
2011-08-07 19:15:54 -04:00
intval ( CONTACT_IS_SHARING ),
intval ( CONTACT_IS_FRIEND )
2011-02-15 06:24:21 -05:00
);
$countfriends = $r [ 0 ][ 'count' ];
2011-07-31 23:01:00 -04:00
2011-08-01 01:22:34 -04:00
$r = q ( " SELECT COUNT(`id`) as `count` FROM `contact`
WHERE `uid` = % d AND `rel` IN ( % d , % d )
2013-12-15 17:00:47 -05:00
AND `self` = 0 AND `blocked` = 0 AND `pending` = 0 AND `hidden` = 0 " ,
2011-08-01 01:22:34 -04:00
intval ( $uinfo [ 0 ][ 'uid' ]),
2011-08-07 19:15:54 -04:00
intval ( CONTACT_IS_FOLLOWER ),
intval ( CONTACT_IS_FRIEND )
2011-08-01 01:22:34 -04:00
);
$countfollowers = $r [ 0 ][ 'count' ];
2011-08-05 08:17:18 -04: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' ];
2013-12-15 17:00:47 -05:00
2011-08-05 08:17:18 -04:00
2011-07-31 23:01:00 -04:00
if ( ! $uinfo [ 0 ][ 'self' ]) {
$countfriends = 0 ;
2011-08-01 01:22:34 -04:00
$countfollowers = 0 ;
2011-08-05 08:17:18 -04:00
$starred = 0 ;
2011-07-31 23:01:00 -04:00
}
2011-02-16 02:56:47 -05:00
2014-01-02 16:29:44 -05:00
// Add a nick if it isn't present there
if (( $uinfo [ 0 ][ 'nick' ] == " " ) OR ( $uinfo [ 0 ][ 'name' ] == $uinfo [ 0 ][ 'nick' ])) {
$uinfo [ 0 ][ 'nick' ] = api_get_nick ( $uinfo [ 0 ][ " url " ]);
//if ($uinfo[0]['nick'] != "")
// q("UPDATE contact SET nick = '%s' WHERE id = %d",
// dbesc($uinfo[0]['nick']), intval($uinfo[0]["id"]));
}
2013-12-15 17:00:47 -05:00
// Fetching unique id
$r = q ( " SELECT id FROM unique_contacts WHERE url='%s' LIMIT 1 " , dbesc ( normalise_link ( $uinfo [ 0 ][ 'url' ])));
// If not there, then add it
if ( count ( $r ) == 0 ) {
q ( " INSERT INTO unique_contacts (url, name, nick, avatar) VALUES ('%s', '%s', '%s', '%s') " ,
dbesc ( normalise_link ( $uinfo [ 0 ][ 'url' ])), dbesc ( $uinfo [ 0 ][ 'name' ]), dbesc ( $uinfo [ 0 ][ 'nick' ]), dbesc ( $uinfo [ 0 ][ 'micro' ]));
$r = q ( " SELECT id FROM unique_contacts WHERE url='%s' LIMIT 1 " , dbesc ( normalise_link ( $uinfo [ 0 ][ 'url' ])));
}
2011-02-16 02:56:47 -05:00
$ret = Array (
2013-12-15 17:00:47 -05:00
'id' => intval ( $r [ 0 ][ 'id' ]),
2012-03-18 12:52:51 -04:00
'name' => (( $uinfo [ 0 ][ 'name' ]) ? $uinfo [ 0 ][ 'name' ] : $uinfo [ 0 ][ 'nick' ]),
2011-08-06 00:30:12 -04:00
'screen_name' => (( $uinfo [ 0 ][ 'nick' ]) ? $uinfo [ 0 ][ 'nick' ] : $uinfo [ 0 ][ 'name' ]),
2013-12-15 17:00:47 -05:00
'location' => ( $usr ) ? $usr [ 0 ][ 'default-location' ] : NULL ,
'description' => (( $profile ) ? $profile [ 0 ][ 'pdesc' ] : NULL ),
2011-04-27 11:46:23 -04:00
'profile_image_url' => $uinfo [ 0 ][ 'micro' ],
2013-12-26 19:48:43 -05:00
'profile_image_url_https' => $uinfo [ 0 ][ 'micro' ],
2011-02-16 02:56:47 -05:00
'url' => $uinfo [ 0 ][ 'url' ],
2013-12-15 17:00:47 -05:00
'protected' => false ,
'followers_count' => intval ( $countfollowers ),
2011-08-04 22:47:45 -04:00
'friends_count' => intval ( $countfriends ),
2011-06-21 05:41:16 -04:00
'created_at' => api_date ( $uinfo [ 0 ][ 'name-date' ]),
2011-08-05 08:17:18 -04:00
'favourites_count' => intval ( $starred ),
2013-12-15 17:00:47 -05:00
'utc_offset' => " 0 " , // To-Do
'time_zone' => 'UTC' , // To-Do $uinfo[0]['timezone'],
'statuses_count' => intval ( $countitms ),
'following' => true , //#XXX: fix me
'verified' => true , //#XXX: fix me
'statusnet_blocking' => false ,
2011-04-21 11:03:31 -04:00
'notifications' => false ,
2013-12-15 17:00:47 -05:00
'statusnet_profile_url' => $a -> get_baseurl () . " /contacts/ " . $uinfo [ 0 ][ 'cid' ],
'uid' => intval ( $uinfo [ 0 ][ 'uid' ]),
'cid' => intval ( $uinfo [ 0 ][ 'cid' ]),
'self' => $uinfo [ 0 ][ 'self' ],
2011-02-16 02:56:47 -05:00
);
2013-12-15 17:00:47 -05:00
2011-02-16 02:56:47 -05:00
return $ret ;
2013-12-15 17:00:47 -05:00
2011-02-16 02:56:47 -05:00
}
2011-04-21 11:03:31 -04:00
2011-07-31 03:53:46 -04:00
function api_item_get_user ( & $a , $item ) {
2012-03-18 12:52:51 -04:00
2013-12-20 17:07:11 -05:00
$author = q ( " SELECT * FROM unique_contacts WHERE url='%s' LIMIT 1 " ,
2013-12-15 17:00:47 -05:00
dbesc ( normalise_link ( $item [ 'author-link' ])));
2013-12-19 00:58:11 -05:00
if ( count ( $author ) == 0 ) {
2013-12-15 17:00:47 -05:00
q ( " INSERT INTO unique_contacts (url, name, avatar) VALUES ('%s', '%s', '%s') " ,
dbesc ( normalise_link ( $item [ " author-link " ])), dbesc ( $item [ " author-name " ]), dbesc ( $item [ " author-avatar " ]));
2013-12-19 00:58:11 -05:00
$author = q ( " SELECT id FROM unique_contacts WHERE url='%s' LIMIT 1 " ,
2013-12-15 17:00:47 -05:00
dbesc ( normalise_link ( $item [ 'author-link' ])));
2013-12-20 17:07:11 -05:00
} else if ( $item [ " author-link " ] . $item [ " author-name " ] != $author [ 0 ][ " url " ] . $author [ 0 ][ " name " ]) {
q ( " UPDATE unique_contacts SET name = '%s', avatar = '%s' WHERE url = '%s' " ,
dbesc ( $item [ " author-name " ]), dbesc ( $item [ " author-avatar " ]), dbesc ( normalise_link ( $item [ " author-link " ])));
2011-07-31 19:35:53 -04:00
}
2011-07-31 03:53:46 -04:00
2013-12-19 00:58:11 -05:00
$owner = q ( " SELECT id FROM unique_contacts WHERE url='%s' LIMIT 1 " ,
dbesc ( normalise_link ( $item [ 'owner-link' ])));
if ( count ( $owner ) == 0 ) {
q ( " INSERT INTO unique_contacts (url, name, avatar) VALUES ('%s', '%s', '%s') " ,
dbesc ( normalise_link ( $item [ " owner-link " ])), dbesc ( $item [ " owner-name " ]), dbesc ( $item [ " owner-avatar " ]));
$owner = q ( " SELECT id FROM unique_contacts WHERE url='%s' LIMIT 1 " ,
dbesc ( normalise_link ( $item [ 'owner-link' ])));
2013-12-20 17:07:11 -05:00
} else if ( $item [ " owner-link " ] . $item [ " owner-name " ] != $owner [ 0 ][ " url " ] . $owner [ 0 ][ " name " ]) {
q ( " UPDATE unique_contacts SET name = '%s', avatar = '%s' WHERE url = '%s' " ,
dbesc ( $item [ " owner-name " ]), dbesc ( $item [ " owner-avatar " ]), dbesc ( normalise_link ( $item [ " owner-link " ])));
2013-12-19 00:58:11 -05:00
}
// Comments in threads may appear as wall-to-wall postings.
// So only take the owner at the top posting.
if ( $item [ " id " ] == $item [ " parent " ])
return api_get_user ( $a , $item [ " owner-link " ]);
else
return api_get_user ( $a , $item [ " author-link " ]);
2011-07-31 03:53:46 -04:00
}
2011-04-21 11:03:31 -04:00
/**
* load api $templatename for $type and replace $data array
*/
function api_apply_template ( $templatename , $type , $data ){
2011-06-20 20:16:13 -04:00
2011-07-31 19:35:53 -04:00
$a = get_app ();
2011-04-21 11:03:31 -04:00
switch ( $type ){
case " atom " :
2011-07-31 19:35:53 -04:00
case " rss " :
2011-04-21 11:03:31 -04:00
case " xml " :
2011-10-27 04:54:52 -04:00
$data = array_xmlify ( $data );
2011-05-11 07:37:13 -04:00
$tpl = get_markup_template ( " api_ " . $templatename . " _ " . $type . " .tpl " );
2013-01-23 20:07:55 -05: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 11:03:31 -04:00
$ret = replace_macros ( $tpl , $data );
break ;
case " json " :
$ret = $data ;
break ;
}
return $ret ;
}
2013-12-15 17:00:47 -05:00
2011-02-16 02:56:47 -05:00
/**
** TWITTER API
*/
2013-12-15 17:00:47 -05:00
2011-02-16 02:56:47 -05:00
/**
2013-12-15 17:00:47 -05:00
* 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 .
2011-02-16 02:56:47 -05:00
* http :// developer . twitter . com / doc / get / account / verify_credentials
*/
2011-04-21 11:03:31 -04:00
function api_account_verify_credentials ( & $a , $type ){
2012-11-30 19:26:54 -05:00
if ( api_user () === false ) return false ;
2013-12-29 11:54:37 -05:00
unset ( $_REQUEST [ " user_id " ]);
unset ( $_GET [ " user_id " ]);
2011-02-16 02:56:47 -05:00
$user_info = api_get_user ( $a );
2013-12-15 17:00:47 -05:00
2013-12-20 17:07:11 -05:00
// "verified" isn't used here in the standard
unset ( $user_info [ " verified " ]);
// - Adding last status
$user_info [ " status " ] = api_status_show ( $a , " raw " );
2013-12-29 11:54:37 -05:00
if ( ! count ( $user_info [ " status " ]))
unset ( $user_info [ " status " ]);
else
unset ( $user_info [ " status " ][ " user " ]);
2013-12-20 17:07:11 -05:00
// "cid", "uid" and "self" are only needed for some internal stuff, so remove it from here
unset ( $user_info [ " cid " ]);
unset ( $user_info [ " uid " ]);
unset ( $user_info [ " self " ]);
2011-04-21 11:03:31 -04:00
return api_apply_template ( " user " , $type , array ( '$user' => $user_info ));
2011-02-16 02:56:47 -05:00
}
api_register_func ( 'api/account/verify_credentials' , 'api_account_verify_credentials' , true );
2013-12-15 17:00:47 -05:00
2011-06-19 21:50:18 -04:00
2011-07-29 11:21:02 -04: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 00:52:50 -04:00
2012-02-22 02:35:50 -05:00
/*Waitman Gobble Mod*/
function api_statuses_mediap ( & $a , $type ) {
2012-11-30 19:26:54 -05:00
if ( api_user () === false ) {
2012-02-22 02:35:50 -05:00
logger ( 'api_statuses_update: no user' );
return false ;
}
$user_info = api_get_user ( $a );
$_REQUEST [ 'type' ] = 'wall' ;
2012-11-30 19:26:54 -05:00
$_REQUEST [ 'profile_uid' ] = api_user ();
2012-02-22 02:35:50 -05:00
$_REQUEST [ 'api_source' ] = true ;
2012-07-08 12:27:11 -04:00
$txt = requestdata ( 'status' );
//$txt = urldecode(requestdata('status'));
2012-02-22 02:35:50 -05: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 14:14:45 -05:00
2012-02-22 02:35:50 -05:00
$a -> argv [ 1 ] = $user_info [ 'screen_name' ]; //should be set to username?
2013-02-15 14:14:45 -05:00
2012-02-22 02:35:50 -05: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 14:14:45 -05:00
2012-02-22 02:35:50 -05: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-19 23:13:24 -04:00
function api_statuses_update ( & $a , $type ) {
2012-11-30 19:26:54 -05:00
if ( api_user () === false ) {
2012-01-15 16:57:00 -05:00
logger ( 'api_statuses_update: no user' );
return false ;
}
2011-06-19 21:50:18 -04:00
$user_info = api_get_user ( $a );
// convert $_POST array items to the form we use for web posts.
2011-07-31 20:52:36 -04:00
// logger('api_post: ' . print_r($_POST,true));
2011-09-12 00:52:50 -04: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-11 21:24:37 -04:00
$txt = html2bb_video ( $txt );
2011-09-12 00:52:50 -04:00
$config = HTMLPurifier_Config :: createDefault ();
$config -> set ( 'Cache.DefinitionImpl' , null );
$purifier = new HTMLPurifier ( $config );
$txt = $purifier -> purify ( $txt );
2012-01-15 16:57:00 -05:00
$_REQUEST [ 'body' ] = html2bbcode ( $txt );
2011-09-12 00:52:50 -04:00
}
}
else
2012-07-08 12:27:11 -04:00
$_REQUEST [ 'body' ] = requestdata ( 'status' );
2011-07-31 20:52:36 -04:00
2012-11-04 17:18:52 -05:00
$_REQUEST [ 'title' ] = requestdata ( 'title' );
2011-07-31 20:52:36 -04:00
$parent = requestdata ( 'in_reply_to_status_id' );
if ( ctype_digit ( $parent ))
2012-01-15 16:57:00 -05:00
$_REQUEST [ 'parent' ] = $parent ;
2011-07-31 20:52:36 -04:00
else
2012-01-15 16:57:00 -05:00
$_REQUEST [ 'parent_uri' ] = $parent ;
2011-07-31 20:52:36 -04:00
2011-07-29 11:21:02 -04:00
if ( requestdata ( 'lat' ) && requestdata ( 'long' ))
2012-01-15 16:57:00 -05:00
$_REQUEST [ 'coord' ] = sprintf ( " %s %s " , requestdata ( 'lat' ), requestdata ( 'long' ));
2012-11-30 19:26:54 -05:00
$_REQUEST [ 'profile_uid' ] = api_user ();
2012-06-25 20:45:33 -04:00
2012-06-16 23:41:23 -04:00
if ( $parent )
2012-01-15 16:57:00 -05:00
$_REQUEST [ 'type' ] = 'net-comment' ;
2012-04-22 13:37:25 -04:00
else {
2012-01-15 16:57:00 -05:00
$_REQUEST [ 'type' ] = 'wall' ;
2012-06-16 23:41:23 -04: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 13:37:25 -04:00
}
2011-06-19 21:50:18 -04:00
// set this so that the item_post() function is quiet and doesn't redirect or emit json
2012-01-15 16:57:00 -05:00
$_REQUEST [ 'api_source' ] = true ;
2011-06-19 21:50:18 -04:00
// call out normal post function
require_once ( 'mod/item.php' );
2013-12-15 17:00:47 -05:00
item_post ( $a );
2011-06-19 21:50:18 -04:00
// this should output the last post (the one we just posted).
2011-06-20 00:08:51 -04:00
return api_status_show ( $a , $type );
2011-06-19 21:50:18 -04:00
}
api_register_func ( 'api/statuses/update' , 'api_statuses_update' , true );
2011-06-20 00:08:51 -04:00
function api_status_show ( & $a , $type ){
$user_info = api_get_user ( $a );
// get last public wall message
2013-12-19 00:58:11 -05:00
$lastwall = q ( " SELECT `item`.*, `i`.`contact-id` as `reply_uid`, `c`.`nick` as `reply_author`, `i`.`author-link` AS `item-author`
2013-10-05 06:30:10 -04:00
FROM `item` , `contact` , `item` as `i` , `contact` as `c`
2013-12-19 00:58:11 -05:00
WHERE `item` . `contact-id` = % d AND `item` . `owner-link` = '%s'
2011-06-20 00:08:51 -04:00
AND `i` . `id` = `item` . `parent`
2013-10-05 06:30:10 -04:00
AND `contact` . `id` = `item` . `contact-id` AND `c` . `id` = `i` . `contact-id` AND `contact` . `self` = 1
AND `item` . `type` != 'activity'
2011-06-20 00:08:51 -04:00
AND `item` . `allow_cid` = '' AND `item` . `allow_gid` = '' AND `item` . `deny_cid` = '' AND `item` . `deny_gid` = ''
2013-10-05 06:30:10 -04:00
ORDER BY `item` . `created` DESC
2011-06-20 00:08:51 -04:00
LIMIT 1 " ,
2013-12-19 00:58:11 -05:00
intval ( $user_info [ 'cid' ]),
dbesc ( $user_info [ 'url' ])
2011-06-20 00:08:51 -04:00
);
if ( count ( $lastwall ) > 0 ){
$lastwall = $lastwall [ 0 ];
2013-02-15 14:14:45 -05:00
2013-12-15 17:00:47 -05:00
$in_reply_to_status_id = NULL ;
$in_reply_to_user_id = NULL ;
$in_reply_to_screen_name = NULL ;
2011-06-20 00:08:51 -04:00
if ( $lastwall [ 'parent' ] != $lastwall [ 'id' ]) {
$in_reply_to_status_id = $lastwall [ 'parent' ];
2013-12-19 00:58:11 -05:00
//$in_reply_to_user_id = $lastwall['reply_uid'];
//$in_reply_to_screen_name = $lastwall['reply_author'];
$r = q ( " SELECT * FROM unique_contacts WHERE `url` = '%s' " , dbesc ( normalise_link ( $lastwall [ 'item-author' ])));
if ( $r ) {
2014-01-02 16:29:44 -05:00
if ( $r [ 0 ][ 'nick' ] == " " )
$r [ 0 ][ 'nick' ] = api_get_nick ( $r [ 0 ][ " url " ]);
$in_reply_to_screen_name = (( $r [ 0 ][ 'nick' ]) ? $r [ 0 ][ 'nick' ] : $r [ 0 ][ 'name' ]);
2013-12-19 00:58:11 -05:00
$in_reply_to_user_id = $r [ 0 ][ 'id' ];
}
2013-02-15 14:14:45 -05:00
}
2011-06-20 00:08:51 -04:00
$status_info = array (
2014-01-02 16:29:44 -05:00
'text' => trim ( html2plain ( bbcode ( api_clean_plain_items ( $lastwall [ 'body' ]), false , false , 2 , true ), 0 )),
2011-06-20 00:08:51 -04:00
'truncated' => false ,
2012-03-18 12:52:51 -04:00
'created_at' => api_date ( $lastwall [ 'created' ]),
2011-06-20 00:08:51 -04:00
'in_reply_to_status_id' => $in_reply_to_status_id ,
2012-03-18 12:52:51 -04:00
'source' => (( $lastwall [ 'app' ]) ? $lastwall [ 'app' ] : 'web' ),
2013-07-29 10:48:30 -04:00
'id' => $lastwall [ 'id' ],
2011-06-20 00:08:51 -04:00
'in_reply_to_user_id' => $in_reply_to_user_id ,
'in_reply_to_screen_name' => $in_reply_to_screen_name ,
2013-12-15 17:00:47 -05:00
'geo' => NULL ,
2012-03-18 12:52:51 -04:00
'favorited' => false ,
2013-12-20 17:07:11 -05:00
// attachments
2013-12-15 17:00:47 -05:00
'user' => $user_info ,
'statusnet_html' => trim ( bbcode ( $lastwall [ 'body' ], false , false )),
'statusnet_conversation_id' => $lastwall [ 'parent' ],
2011-06-20 00:08:51 -04:00
);
2013-12-15 17:00:47 -05:00
2013-12-23 08:06:53 -05:00
if (( $lastwall [ 'item_network' ] != " " ) AND ( $status [ " source " ] == 'web' ))
$status_info [ " source " ] = network_to_name ( $lastwall [ 'item_network' ]);
elseif (( $lastwall [ 'item_network' ] != " " ) AND ( network_to_name ( $lastwall [ 'item_network' ]) != $status_info [ " source " ]))
$status_info [ " source " ] = trim ( $status_info [ " source " ] . ' (' . network_to_name ( $lastwall [ 'item_network' ]) . ')' );
2013-12-15 17:00:47 -05:00
// "cid", "uid" and "self" are only needed for some internal stuff, so remove it from here
unset ( $status_info [ " user " ][ " cid " ]);
unset ( $status_info [ " user " ][ " uid " ]);
unset ( $status_info [ " user " ][ " self " ]);
2011-06-20 00:08:51 -04:00
}
2013-12-15 17:00:47 -05:00
2013-12-20 17:07:11 -05:00
if ( $type == " raw " )
return ( $status_info );
2011-06-20 00:08:51 -04:00
return api_apply_template ( " status " , $type , array ( '$status' => $status_info ));
2013-12-15 17:00:47 -05:00
2011-06-20 00:08:51 -04:00
}
2013-12-15 17:00:47 -05:00
2011-02-16 02:56:47 -05: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 11:03:31 -04:00
function api_users_show ( & $a , $type ){
2011-02-16 02:56:47 -05:00
$user_info = api_get_user ( $a );
2013-12-15 17:00:47 -05:00
$lastwall = q ( " SELECT `item`.*
FROM `item` , `contact`
2013-12-19 00:58:11 -05:00
WHERE `item` . `contact-id` = % d AND `item` . `owner-link` = '%s'
2013-12-15 17:00:47 -05:00
AND `contact` . `id` = `item` . `contact-id`
2011-04-21 11:03:31 -04:00
AND `type` != 'activity'
AND `item` . `allow_cid` = '' AND `item` . `allow_gid` = '' AND `item` . `deny_cid` = '' AND `item` . `deny_gid` = ''
2013-12-15 17:00:47 -05:00
ORDER BY `created` DESC
2011-04-21 11:03:31 -04:00
LIMIT 1 " ,
2013-12-19 00:58:11 -05:00
intval ( $user_info [ 'cid' ]),
dbesc ( $user_info [ 'url' ])
2011-02-15 06:24:21 -05:00
);
2011-02-16 02:56:47 -05:00
2011-04-21 11:03:31 -04:00
if ( count ( $lastwall ) > 0 ){
$lastwall = $lastwall [ 0 ];
2013-12-15 17:00:47 -05:00
$in_reply_to_status_id = NULL ;
$in_reply_to_user_id = NULL ;
$in_reply_to_screen_name = NULL ;
2011-04-21 11:03:31 -04:00
if ( $lastwall [ 'parent' ] != $lastwall [ 'id' ]) {
2013-12-19 00:58:11 -05:00
$reply = q ( " SELECT `item`.`id`, `item`.`contact-id` as `reply_uid`, `contact`.`nick` as `reply_author`, `item`.`author-link` AS `item-author`
2013-12-15 17:00:47 -05:00
FROM `item` , `contact` WHERE `contact` . `id` = `item` . `contact-id` AND `item` . `id` = % d " , intval( $lastwall['parent'] ));
if ( count ( $reply ) > 0 ) {
$in_reply_to_status_id = $lastwall [ 'parent' ];
2013-12-19 00:58:11 -05:00
//$in_reply_to_user_id = $reply[0]['reply_uid'];
//$in_reply_to_screen_name = $reply[0]['reply_author'];
$r = q ( " SELECT * FROM unique_contacts WHERE `url` = '%s' " , dbesc ( normalise_link ( $reply [ 0 ][ 'item-author' ])));
if ( $r ) {
2014-01-02 16:29:44 -05:00
if ( $r [ 0 ][ 'nick' ] == " " )
$r [ 0 ][ 'nick' ] = api_get_nick ( $r [ 0 ][ " url " ]);
$in_reply_to_screen_name = (( $r [ 0 ][ 'nick' ]) ? $r [ 0 ][ 'nick' ] : $r [ 0 ][ 'name' ]);
2013-12-19 00:58:11 -05:00
$in_reply_to_user_id = $r [ 0 ][ 'id' ];
}
2013-12-15 17:00:47 -05:00
}
2013-02-15 14:14:45 -05:00
}
2011-04-21 11:03:31 -04:00
$user_info [ 'status' ] = array (
2014-01-02 16:29:44 -05:00
'text' => trim ( html2plain ( bbcode ( api_clean_plain_items ( $lastwall [ 'body' ]), false , false , 2 , true ), 0 )),
2011-04-21 11:03:31 -04:00
'truncated' => false ,
2013-12-15 17:00:47 -05:00
'created_at' => api_date ( $lastwall [ 'created' ]),
2011-04-21 11:03:31 -04:00
'in_reply_to_status_id' => $in_reply_to_status_id ,
2013-12-15 17:00:47 -05:00
'source' => (( $lastwall [ 'app' ]) ? $lastwall [ 'app' ] : 'web' ),
'id' => $lastwall [ 'contact-id' ],
2011-04-21 11:03:31 -04:00
'in_reply_to_user_id' => $in_reply_to_user_id ,
'in_reply_to_screen_name' => $in_reply_to_screen_name ,
2013-12-15 17:00:47 -05:00
'geo' => NULL ,
'favorited' => false ,
'statusnet_html' => trim ( bbcode ( $lastwall [ 'body' ], false , false )),
'statusnet_conversation_id' => $lastwall [ 'parent' ],
2011-04-21 11:03:31 -04:00
);
2013-12-23 08:06:53 -05:00
if (( $lastwall [ 'item_network' ] != " " ) AND ( $user_info [ " status " ][ " source " ] == 'web' ))
$user_info [ " status " ][ " source " ] = network_to_name ( $lastwall [ 'item_network' ]);
if (( $lastwall [ 'item_network' ] != " " ) AND ( network_to_name ( $lastwall [ 'item_network' ]) != $user_info [ " status " ][ " source " ]))
$user_info [ " status " ][ " source " ] = trim ( $user_info [ " status " ][ " source " ] . ' (' . network_to_name ( $lastwall [ 'item_network' ]) . ')' );
2011-04-21 11:03:31 -04:00
}
2013-12-15 17:00:47 -05:00
// "cid", "uid" and "self" are only needed for some internal stuff, so remove it from here
unset ( $user_info [ " cid " ]);
unset ( $user_info [ " uid " ]);
unset ( $user_info [ " self " ]);
2011-04-21 11:03:31 -04:00
return api_apply_template ( " user " , $type , array ( '$user' => $user_info ));
2012-04-22 12:00:24 -04:00
2011-02-15 06:24:21 -05:00
}
api_register_func ( 'api/users/show' , 'api_users_show' );
2012-04-22 12:00:24 -04:00
2011-02-15 06:24:21 -05:00
/**
2012-04-22 12:00:24 -04:00
*
2011-02-15 06:24:21 -05:00
* http :// developer . twitter . com / doc / get / statuses / home_timeline
2012-04-22 12:00:24 -04:00
*
2011-04-21 11:03:31 -04:00
* TODO : Optional parameters
* TODO : Add reply info
2011-02-15 06:24:21 -05:00
*/
2011-04-21 11:03:31 -04:00
function api_statuses_home_timeline ( & $a , $type ){
2012-11-30 19:26:54 -05:00
if ( api_user () === false ) return false ;
2012-04-22 12:00:24 -04:00
2013-12-29 11:54:37 -05:00
unset ( $_REQUEST [ " user_id " ]);
unset ( $_GET [ " user_id " ]);
2011-02-16 02:56:47 -05:00
$user_info = api_get_user ( $a );
2011-02-15 06:24:21 -05:00
// get last newtork messages
2011-07-31 19:35:53 -04:00
2011-08-26 10:35:51 -04:00
2011-08-19 08:57:54 -04:00
// params
2011-08-19 14:33:34 -04:00
$count = ( x ( $_REQUEST , 'count' ) ? $_REQUEST [ 'count' ] : 20 );
$page = ( x ( $_REQUEST , 'page' ) ? $_REQUEST [ 'page' ] - 1 : 0 );
if ( $page < 0 ) $page = 0 ;
2012-03-18 12:52:51 -04:00
$since_id = ( x ( $_REQUEST , 'since_id' ) ? $_REQUEST [ 'since_id' ] : 0 );
2012-03-18 14:00:24 -04:00
$max_id = ( x ( $_REQUEST , 'max_id' ) ? $_REQUEST [ 'max_id' ] : 0 );
2012-03-18 12:52:51 -04:00
//$since_id = 0;//$since_id = (x($_REQUEST,'since_id')?$_REQUEST['since_id']:0);
2013-06-16 07:28:04 -04:00
$exclude_replies = ( x ( $_REQUEST , 'exclude_replies' ) ? 1 : 0 );
2013-06-16 07:42:43 -04:00
$conversation_id = ( x ( $_REQUEST , 'conversation_id' ) ? $_REQUEST [ 'conversation_id' ] : 0 );
2012-04-22 12:00:24 -04:00
2011-08-19 08:57:54 -04:00
$start = $page * $count ;
2012-03-18 12:52:51 -04:00
//$include_entities = (x($_REQUEST,'include_entities')?$_REQUEST['include_entities']:false);
2012-06-19 10:15:19 -04:00
$sql_extra = '' ;
2012-03-18 14:00:24 -04:00
if ( $max_id > 0 )
2012-06-19 10:15:19 -04:00
$sql_extra .= ' AND `item`.`id` <= ' . intval ( $max_id );
if ( $exclude_replies > 0 )
$sql_extra .= ' AND `item`.`parent` = `item`.`id`' ;
2013-06-16 07:42:43 -04:00
if ( $conversation_id > 0 )
$sql_extra .= ' AND `item`.`parent` = ' . intval ( $conversation_id );
2012-03-18 14:00:24 -04:00
2013-12-23 08:06:53 -05:00
$r = q ( " SELECT `item`.*, `item`.`id` AS `item_id`, `item`.`network` AS `item_network`,
2011-07-31 19:35:53 -04: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-23 23:56:11 -05:00
AND `item` . `visible` = 1 and `item` . `moderated` = 0 AND `item` . `deleted` = 0
2011-07-31 19:35:53 -04:00
AND `contact` . `id` = `item` . `contact-id`
AND `contact` . `blocked` = 0 AND `contact` . `pending` = 0
$sql_extra
2011-08-19 14:33:34 -04:00
AND `item` . `id` >% d
2011-07-31 19:35:53 -04:00
ORDER BY `item` . `received` DESC LIMIT % d , % d " ,
2013-12-15 17:00:47 -05:00
//intval($user_info['uid']),
intval ( api_user ()),
2011-08-19 14:33:34 -04:00
intval ( $since_id ),
2011-08-19 10:55:43 -04:00
intval ( $start ), intval ( $count )
2011-07-31 19:35:53 -04:00
);
$ret = api_format_items ( $r , $user_info );
2012-08-12 22:29:37 -04: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.
2013-12-15 17:00:47 -05:00
2012-08-12 22:29:37 -04:00
$r = q ( " UPDATE `item` SET `unseen` = 0
WHERE `unseen` = 1 AND `uid` = % d " ,
2013-12-15 17:00:47 -05:00
//intval($user_info['uid'])
intval ( api_user ())
2012-08-12 22:29:37 -04:00
);
2012-04-22 12:00:24 -04:00
2011-07-31 19:35:53 -04:00
$data = array ( '$statuses' => $ret );
switch ( $type ){
case " atom " :
case " rss " :
$data = api_rss_extra ( $a , $data , $user_info );
2012-04-08 11:23:38 -04:00
break ;
case " as " :
2012-04-08 11:51:05 -04:00
$as = api_format_as ( $a , $ret , $user_info );
2012-04-08 14:19:14 -04:00
$as [ 'title' ] = $a -> config [ 'sitename' ] . " Home Timeline " ;
$as [ 'link' ][ 'url' ] = $a -> get_baseurl () . " / " . $user_info [ " screen_name " ] . " /all " ;
2012-04-08 11:23:38 -04:00
return ( $as );
break ;
2011-07-31 19:35:53 -04:00
}
2012-04-22 12:00:24 -04:00
2011-07-31 19:35:53 -04: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 14:19:14 -04:00
function api_statuses_public_timeline ( & $a , $type ){
2012-11-30 19:26:54 -05:00
if ( api_user () === false ) return false ;
2012-04-22 12:00:24 -04:00
2012-04-08 14:19:14 -04: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 07:28:04 -04:00
$exclude_replies = ( x ( $_REQUEST , 'exclude_replies' ) ? 1 : 0 );
2013-06-16 07:42:43 -04:00
$conversation_id = ( x ( $_REQUEST , 'conversation_id' ) ? $_REQUEST [ 'conversation_id' ] : 0 );
2012-04-22 12:00:24 -04:00
2012-04-08 14:19:14 -04: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 07:28:04 -04:00
if ( $exclude_replies > 0 )
$sql_extra .= ' AND `item`.`parent` = `item`.`id`' ;
2013-06-16 07:42:43 -04:00
if ( $conversation_id > 0 )
$sql_extra .= ' AND `item`.`parent` = ' . intval ( $conversation_id );
2012-04-08 14:19:14 -04:00
2013-12-23 08:06:53 -05:00
$r = q ( " SELECT `item`.*, `item`.`id` AS `item_id`, `item`.`network` AS `item_network`,
2012-04-08 14:19:14 -04:00
`contact` . `name` , `contact` . `photo` , `contact` . `url` , `contact` . `rel` ,
2012-04-22 12:00:24 -04:00
`contact` . `network` , `contact` . `thumb` , `contact` . `self` , `contact` . `writable` ,
2012-04-08 14:19:14 -04: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 12:00:24 -04: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 14:19:14 -04: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 12:00:24 -04:00
2012-04-08 14:19:14 -04: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 12:00:24 -04:00
2012-04-08 14:19:14 -04:00
return api_apply_template ( " timeline " , $type , $data );
}
api_register_func ( 'api/statuses/public_timeline' , 'api_statuses_public_timeline' , true );
2012-03-18 12:52:51 -04:00
/**
*
*/
function api_statuses_show ( & $a , $type ){
2012-11-30 19:26:54 -05:00
if ( api_user () === false ) return false ;
2012-03-18 12:52:51 -04:00
$user_info = api_get_user ( $a );
// params
$id = intval ( $a -> argv [ 3 ]);
2013-12-15 17:00:47 -05:00
if ( $id == 0 )
$id = intval ( $_REQUEST [ " id " ]);
2012-04-22 12:00:24 -04:00
logger ( 'API: api_statuses_show: ' . $id );
2012-03-18 12:52:51 -04:00
//$include_entities = (x($_REQUEST,'include_entities')?$_REQUEST['include_entities']:false);
2012-06-22 07:35:36 -04:00
$conversation = ( x ( $_REQUEST , 'conversation' ) ? 1 : 0 );
$sql_extra = '' ;
if ( $conversation )
2013-12-15 17:00:47 -05:00
$sql_extra .= " AND `item`.`parent` = %d ORDER BY `received` ASC " ;
2012-06-22 07:35:36 -04:00
else
$sql_extra .= " AND `item`.`id` = %d " ;
2012-03-18 12:52:51 -04:00
2013-12-23 08:06:53 -05:00
$r = q ( " SELECT `item`.*, `item`.`id` AS `item_id`, `item`.`network` AS `item_network`,
2012-03-18 12:52:51 -04: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 07:35:36 -04:00
$sql_extra " ,
2012-03-18 12:52:51 -04:00
intval ( $id )
);
2012-06-22 07:35:36 -04:00
2013-12-20 17:07:11 -05:00
if ( ! $r )
die ( api_error ( $a , $type , t ( " There is no status with this id. " )));
2012-03-18 12:52:51 -04:00
$ret = api_format_items ( $r , $user_info );
2012-06-22 07:35:36 -04:00
if ( $conversation ) {
2012-06-21 04:53:48 -04:00
$data = array ( '$statuses' => $ret );
2012-06-22 07:35:36 -04:00
return api_apply_template ( " timeline " , $type , $data );
2012-06-21 04:53:48 -04: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 12:52:51 -04:00
}
api_register_func ( 'api/statuses/show' , 'api_statuses_show' , true );
2011-07-31 19:35:53 -04:00
2012-04-07 18:02:25 -04:00
/**
*
*/
function api_statuses_repeat ( & $a , $type ){
2012-11-30 19:26:54 -05:00
if ( api_user () === false ) return false ;
2012-04-07 18:02:25 -04:00
$user_info = api_get_user ( $a );
// params
$id = intval ( $a -> argv [ 3 ]);
2013-12-15 17:00:47 -05:00
if ( $id == 0 )
$id = intval ( $_REQUEST [ " id " ]);
2012-06-04 02:08:45 -04:00
logger ( 'API: api_statuses_repeat: ' . $id );
2012-04-07 18:02:25 -04:00
//$include_entities = (x($_REQUEST,'include_entities')?$_REQUEST['include_entities']:false);
2013-12-23 08:06:53 -05:00
$r = q ( " SELECT `item`.*, `item`.`id` AS `item_id`, `item`.`network` AS `item_network`, `contact`.`nick` as `reply_author`,
2012-12-30 15:30:39 -05:00
`contact` . `name` , `contact` . `photo` as `reply_photo` , `contact` . `url` as `reply_url` , `contact` . `rel` ,
2012-04-07 18:02:25 -04: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 02:08:45 -04:00
if ( $r [ 0 ][ 'body' ] != " " ) {
2013-10-14 18:49:49 -04:00
if ( ! intval ( get_config ( 'system' , 'old_share' ))) {
2012-12-30 15:30:39 -05:00
$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-11-30 19:26:54 -05:00
$_REQUEST [ 'profile_uid' ] = api_user ();
2012-06-04 02:08:45 -04:00
$_REQUEST [ 'type' ] = 'wall' ;
$_REQUEST [ 'api_source' ] = true ;
2012-04-07 18:02:25 -04:00
2012-06-04 02:08:45 -04:00
require_once ( 'mod/item.php' );
item_post ( $a );
}
2012-04-07 18:02:25 -04: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-11-30 19:26:54 -05:00
if ( api_user () === false ) return false ;
2012-04-07 18:02:25 -04:00
$user_info = api_get_user ( $a );
// params
$id = intval ( $a -> argv [ 3 ]);
2013-12-15 17:00:47 -05:00
if ( $id == 0 )
$id = intval ( $_REQUEST [ " id " ]);
2012-06-04 02:08:45 -04:00
logger ( 'API: api_statuses_destroy: ' . $id );
2012-04-07 18:02:25 -04: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-11-30 19:26:54 -05:00
if ( api_user () === false ) return false ;
2013-12-15 17:00:47 -05:00
2013-12-29 11:54:37 -05:00
unset ( $_REQUEST [ " user_id " ]);
unset ( $_GET [ " user_id " ]);
2012-04-07 18:02:25 -04: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-25 21:21:07 -04:00
2012-04-07 18:02:25 -04:00
$start = $page * $count ;
//$include_entities = (x($_REQUEST,'include_entities')?$_REQUEST['include_entities']:false);
2013-12-20 17:07:11 -05:00
// Ugly code - should be changed
2012-04-07 18:02:25 -04:00
$myurl = $a -> get_baseurl () . '/profile/' . $a -> user [ 'nickname' ];
$myurl = substr ( $myurl , strpos ( $myurl , '://' ) + 3 );
2013-01-13 08:50:55 -05:00
//$myurl = str_replace(array('www.','.'),array('','\\.'),$myurl);
$myurl = str_replace ( 'www.' , '' , $myurl );
2012-04-07 18:02:25 -04:00
$diasp_url = str_replace ( '/profile/' , '/u/' , $myurl );
2012-05-25 21:21:07 -04:00
2013-01-13 03:37:15 -05: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 18:02:25 -04:00
if ( $max_id > 0 )
$sql_extra .= ' AND `item`.`id` <= ' . intval ( $max_id );
2013-12-23 08:06:53 -05:00
$r = q ( " SELECT `item`.*, `item`.`id` AS `item_id`, `item`.`network` AS `item_network`,
2012-04-07 18:02:25 -04: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
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 " ,
2013-12-15 17:00:47 -05:00
//intval($user_info['uid']),
intval ( api_user ()),
2012-04-07 18:02:25 -04:00
intval ( $since_id ),
intval ( $start ), intval ( $count )
);
$ret = api_format_items ( $r , $user_info );
2012-04-22 12:00:24 -04:00
2012-04-07 18:02:25 -04:00
$data = array ( '$statuses' => $ret );
switch ( $type ){
case " atom " :
case " rss " :
$data = api_rss_extra ( $a , $data , $user_info );
2012-04-08 11:51:05 -04:00
break ;
case " as " :
$as = api_format_as ( $a , $ret , $user_info );
$as [ " title " ] = $a -> config [ 'sitename' ] . " Mentions " ;
2012-04-08 14:19:14 -04:00
$as [ 'link' ][ 'url' ] = $a -> get_baseurl () . " / " ;
2012-04-08 11:51:05 -04:00
return ( $as );
break ;
2012-04-07 18:02:25 -04:00
}
2012-04-22 12:00:24 -04:00
2012-04-07 18:02:25 -04: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 14:00:24 -04:00
2011-07-31 19:35:53 -04:00
function api_statuses_user_timeline ( & $a , $type ){
2012-11-30 19:26:54 -05:00
if ( api_user () === false ) return false ;
2011-07-31 19:35:53 -04:00
2013-12-15 17:00:47 -05:00
$user_info = api_get_user ( $a );
// get last network messages
2011-08-26 10:35:51 -04:00
2012-11-30 19:26:54 -05:00
logger ( " api_statuses_user_timeline: api_user: " . api_user () .
2011-08-26 10:35:51 -04:00
" \n user_info: " . print_r ( $user_info , true ) .
" \n _REQUEST: " . print_r ( $_REQUEST , true ),
LOGGER_DEBUG );
2011-08-19 08:57:54 -04:00
// params
2011-08-19 14:33:34 -04:00
$count = ( x ( $_REQUEST , 'count' ) ? $_REQUEST [ 'count' ] : 20 );
$page = ( x ( $_REQUEST , 'page' ) ? $_REQUEST [ 'page' ] - 1 : 0 );
if ( $page < 0 ) $page = 0 ;
2012-03-18 12:52:51 -04: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 07:28:04 -04:00
$exclude_replies = ( x ( $_REQUEST , 'exclude_replies' ) ? 1 : 0 );
2013-06-16 07:42:43 -04:00
$conversation_id = ( x ( $_REQUEST , 'conversation_id' ) ? $_REQUEST [ 'conversation_id' ] : 0 );
2013-06-16 07:28:04 -04:00
2011-08-19 08:57:54 -04:00
$start = $page * $count ;
2012-06-19 10:27:23 -04:00
$sql_extra = '' ;
2013-12-29 11:54:37 -05:00
if ( $user_info [ 'self' ] == 1 )
$sql_extra .= " AND `item`.`wall` = 1 " ;
2013-06-16 07:28:04 -04:00
if ( $exclude_replies > 0 )
$sql_extra .= ' AND `item`.`parent` = `item`.`id`' ;
2013-06-16 07:42:43 -04:00
if ( $conversation_id > 0 )
$sql_extra .= ' AND `item`.`parent` = ' . intval ( $conversation_id );
2011-08-19 08:57:54 -04:00
2013-12-23 08:06:53 -05:00
$r = q ( " SELECT `item`.*, `item`.`id` AS `item_id`, `item`.`network` AS `item_network`,
2011-07-31 19:35:53 -04: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
2011-08-26 10:35:51 -04:00
AND `item` . `contact-id` = % d
2012-01-23 23:56:11 -05:00
AND `item` . `visible` = 1 and `item` . `moderated` = 0 AND `item` . `deleted` = 0
2011-07-31 19:35:53 -04:00
AND `contact` . `id` = `item` . `contact-id`
AND `contact` . `blocked` = 0 AND `contact` . `pending` = 0
$sql_extra
2011-08-19 14:33:34 -04:00
AND `item` . `id` >% d
2011-07-31 19:35:53 -04:00
ORDER BY `item` . `received` DESC LIMIT % d , % d " ,
2012-11-30 19:26:54 -05:00
intval ( api_user ()),
2013-12-15 17:00:47 -05:00
intval ( $user_info [ 'cid' ]),
2011-08-19 14:33:34 -04:00
intval ( $since_id ),
2011-08-19 10:55:43 -04:00
intval ( $start ), intval ( $count )
2011-07-31 19:35:53 -04:00
);
2013-12-15 17:00:47 -05:00
$ret = api_format_items ( $r , $user_info , true );
2012-04-22 12:00:24 -04:00
2011-07-31 19:35:53 -04:00
$data = array ( '$statuses' => $ret );
switch ( $type ){
case " atom " :
case " rss " :
$data = api_rss_extra ( $a , $data , $user_info );
}
2012-04-22 12:00:24 -04:00
2011-07-31 19:35:53 -04: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 ){
2013-12-29 11:54:37 -05:00
global $called_api ;
2012-11-30 19:26:54 -05:00
if ( api_user () === false ) return false ;
2012-04-22 12:00:24 -04:00
2013-12-29 11:54:37 -05:00
$called_api = array ();
2011-07-31 19:35:53 -04:00
$user_info = api_get_user ( $a );
2013-12-29 11:54:37 -05:00
2012-02-19 13:34:48 -05:00
// in friendica starred item are private
2011-08-26 10:35:51 -04:00
// return favorites only for self
logger ( 'api_favorites: self:' . $user_info [ 'self' ]);
2012-04-22 12:00:24 -04:00
2011-08-26 10:35:51 -04:00
if ( $user_info [ 'self' ] == 0 ) {
$ret = array ();
} else {
2012-04-22 12:00:24 -04:00
2011-08-26 10:35:51 -04: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 12:00:24 -04:00
2011-08-26 10:35:51 -04:00
$start = $page * $count ;
2013-12-23 08:06:53 -05:00
$r = q ( " SELECT `item`.*, `item`.`id` AS `item_id`, `item`.`network` AS `item_network`,
2011-08-26 10:35:51 -04: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-23 23:56:11 -05:00
AND `item` . `visible` = 1 and `item` . `moderated` = 0 AND `item` . `deleted` = 0
2011-08-26 10:35:51 -04: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 " ,
2013-12-15 17:00:47 -05:00
//intval($user_info['uid']),
intval ( api_user ()),
2011-08-26 10:35:51 -04:00
intval ( $start ), intval ( $count )
);
2011-07-31 19:35:53 -04:00
2011-08-26 10:35:51 -04:00
$ret = api_format_items ( $r , $user_info );
2012-04-22 12:00:24 -04:00
2011-08-26 10:35:51 -04:00
}
2012-04-22 12:00:24 -04:00
2011-07-31 19:35:53 -04:00
$data = array ( '$statuses' => $ret );
switch ( $type ){
case " atom " :
case " rss " :
$data = api_rss_extra ( $a , $data , $user_info );
}
2012-04-22 12:00:24 -04:00
2011-07-31 19:35:53 -04:00
return api_apply_template ( " timeline " , $type , $data );
}
api_register_func ( 'api/favorites' , 'api_favorites' , true );
2012-04-08 11:51:05 -04: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 14:19:14 -04:00
$as [ 'link' ][ 'url' ] = $a -> get_baseurl () . " / " . $user_info [ " screen_name " ] . " /all " ;
$as [ 'link' ][ 'rel' ] = " alternate " ;
$as [ 'link' ][ 'type' ] = " text/html " ;
2012-04-08 11:51:05 -04:00
return ( $as );
}
2012-04-22 12:00:24 -04:00
2012-06-26 02:54:01 -04:00
function api_format_messages ( $item , $recipient , $sender ) {
// standard meta information
$ret = Array (
'id' => $item [ 'id' ],
'sender_id' => $sender [ 'id' ] ,
2013-12-15 17:00:47 -05:00
'text' => " " ,
2012-06-26 02:54:01 -04:00
'recipient_id' => $recipient [ 'id' ],
2013-12-15 17:00:47 -05:00
'created_at' => api_date ( $item [ 'created' ]),
'sender_screen_name' => $sender [ 'screen_name' ],
2012-06-26 02:54:01 -04:00
'recipient_screen_name' => $recipient [ 'screen_name' ],
2013-12-15 17:00:47 -05:00
'sender' => $sender ,
2012-06-26 02:54:01 -04:00
'recipient' => $recipient ,
);
2013-12-15 17:00:47 -05:00
// "cid", "uid" and "self" are only needed for some internal stuff, so remove it from here
unset ( $ret [ " sender " ][ " cid " ]);
unset ( $ret [ " sender " ][ " uid " ]);
unset ( $ret [ " sender " ][ " self " ]);
unset ( $ret [ " recipient " ][ " cid " ]);
unset ( $ret [ " recipient " ][ " uid " ]);
unset ( $ret [ " recipient " ][ " self " ]);
2012-06-26 02:54:01 -04:00
//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 " ) {
2013-12-15 17:00:47 -05:00
$ret [ 'text' ] = bbcode ( $item [ 'body' ], false , false );
2012-06-26 02:54:01 -04:00
}
elseif ( $_GET [ " getText " ] == " plain " ) {
2013-12-15 17:00:47 -05:00
//$ret['text'] = html2plain(bbcode($item['body'], false, false, true), 0);
2014-01-02 16:29:44 -05:00
$ret [ 'text' ] = trim ( html2plain ( bbcode ( api_clean_plain_items ( $item [ 'body' ]), false , false , 2 , true ), 0 ));
2012-06-26 02:54:01 -04:00
}
}
else {
2014-01-02 16:29:44 -05:00
$ret [ 'text' ] = $item [ 'title' ] . " \n " . html2plain ( bbcode ( api_clean_plain_items ( $item [ 'body' ]), false , false , 2 , true ), 0 );
2012-06-26 02:54:01 -04:00
}
if ( isset ( $_GET [ " getUserObjects " ]) && $_GET [ " getUserObjects " ] == " false " ) {
unset ( $ret [ 'sender' ]);
unset ( $ret [ 'recipient' ]);
}
return $ret ;
}
2013-12-15 17:00:47 -05:00
function api_format_items ( $r , $user_info , $filter_user = false ) {
2011-07-31 23:01:00 -04:00
2011-07-31 19:35:53 -04:00
$a = get_app ();
2011-04-21 11:03:31 -04:00
$ret = Array ();
2011-02-15 06:24:21 -05:00
2011-02-16 02:56:47 -05:00
foreach ( $r as $item ) {
2014-01-02 16:29:44 -05:00
api_share_as_retweet ( $a , api_user (), $item );
2011-08-26 10:35:51 -04:00
localize_item ( $item );
2013-12-15 17:00:47 -05:00
$status_user = api_item_get_user ( $a , $item );
// Look if the posts are matching if they should be filtered by user id
if ( $filter_user AND ( $status_user [ " id " ] != $user_info [ " id " ]))
continue ;
2012-03-18 12:52:51 -04:00
2013-12-15 17:00:47 -05:00
if ( $item [ 'thr-parent' ] != $item [ 'uri' ]) {
$r = q ( " SELECT id FROM item WHERE uid=%d AND uri='%s' LIMIT 1 " ,
intval ( api_user ()),
dbesc ( $item [ 'thr-parent' ]));
2012-03-18 13:21:51 -04:00
if ( $r )
$in_reply_to_status_id = $r [ 0 ][ 'id' ];
else
$in_reply_to_status_id = $item [ 'parent' ];
2012-03-18 12:52:51 -04:00
2013-12-15 17:00:47 -05:00
$in_reply_to_screen_name = NULL ;
$in_reply_to_user_id = NULL ;
2012-03-18 13:21:51 -04:00
2013-12-15 17:00:47 -05:00
$r = q ( " SELECT `author-link` FROM item WHERE uid=%d AND id=%d LIMIT 1 " ,
intval ( api_user ()),
intval ( $in_reply_to_status_id ));
if ( $r ) {
$r = q ( " SELECT * FROM unique_contacts WHERE `url` = '%s' " , dbesc ( normalise_link ( $r [ 0 ][ 'author-link' ])));
if ( $r ) {
2014-01-02 16:29:44 -05:00
if ( $r [ 0 ][ 'nick' ] == " " )
$r [ 0 ][ 'nick' ] = api_get_nick ( $r [ 0 ][ " url " ]);
$in_reply_to_screen_name = (( $r [ 0 ][ 'nick' ]) ? $r [ 0 ][ 'nick' ] : $r [ 0 ][ 'name' ]);
2013-12-15 17:00:47 -05:00
$in_reply_to_user_id = $r [ 0 ][ 'id' ];
}
}
2012-03-18 12:52:51 -04:00
} else {
2013-12-15 17:00:47 -05:00
$in_reply_to_screen_name = NULL ;
$in_reply_to_user_id = NULL ;
$in_reply_to_status_id = NULL ;
2012-03-18 12:52:51 -04:00
}
2012-04-11 13:31:01 -04:00
// Workaround for ostatus messages where the title is identically to the body
2014-01-02 16:29:44 -05:00
$statusbody = trim ( html2plain ( bbcode ( api_clean_plain_items ( $item [ 'body' ]), false , false , 2 , true ), 0 ));
2013-12-15 17:00:47 -05:00
2012-04-11 13:31:01 -04: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 12:00:24 -04:00
if (( $item [ " network " ] == NETWORK_FEED ) and ( strlen ( $statustext ) > 1000 ))
$statustext = substr ( $statustext , 0 , 1000 ) . " ... \n " . $item [ " plink " ];
2011-04-21 11:03:31 -04:00
$status = array (
2012-04-11 13:31:01 -04:00
'text' => $statustext ,
2011-02-15 06:24:21 -05:00
'truncated' => False ,
2012-03-18 12:52:51 -04:00
'created_at' => api_date ( $item [ 'created' ]),
2012-03-18 13:21:51 -04:00
'in_reply_to_status_id' => $in_reply_to_status_id ,
2012-03-18 12:52:51 -04: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 ,
2013-12-15 17:00:47 -05:00
'geo' => NULL ,
2012-03-18 12:52:51 -04:00
'favorited' => $item [ 'starred' ] ? true : false ,
2013-12-20 17:07:11 -05:00
//'attachments' => array(),
2011-06-21 05:41:16 -04:00
'user' => $status_user ,
2013-12-15 17:00:47 -05:00
'statusnet_html' => trim ( bbcode ( $item [ 'body' ], false , false )),
2012-04-11 13:31:01 -04:00
'statusnet_conversation_id' => $item [ 'parent' ],
2011-04-21 11:03:31 -04:00
);
2012-03-18 12:52:51 -04:00
2013-12-23 08:06:53 -05:00
if (( $item [ 'item_network' ] != " " ) AND ( $status [ " source " ] == 'web' ))
$status [ " source " ] = network_to_name ( $item [ 'item_network' ]);
else if (( $item [ 'item_network' ] != " " ) AND ( network_to_name ( $item [ 'item_network' ]) != $status [ " source " ]))
$status [ " source " ] = trim ( $status [ " source " ] . ' (' . network_to_name ( $item [ 'item_network' ]) . ')' );
2013-12-19 00:58:11 -05:00
// Retweets are only valid for top postings
if (( $item [ 'owner-link' ] != $item [ 'author-link' ]) AND ( $item [ " id " ] == $item [ " parent " ])) {
$retweeted_status = $status ;
$retweeted_status [ " user " ] = api_get_user ( $a , $item [ " author-link " ]);
$status [ " retweeted_status " ] = $retweeted_status ;
}
2013-12-15 17:00:47 -05:00
// "cid", "uid" and "self" are only needed for some internal stuff, so remove it from here
unset ( $status [ " user " ][ " cid " ]);
unset ( $status [ " user " ][ " uid " ]);
unset ( $status [ " user " ][ " self " ]);
// 'geo' => array('type' => 'Point',
// 'coordinates' => array((float) $notice->lat,
// (float) $notice->lon));
2012-03-18 12:52:51 -04:00
// Seesmic doesn't like the following content
2013-12-15 17:00:47 -05:00
// completely disabled to make friendica totally compatible to the statusnet API
/* if ( $_SERVER [ 'HTTP_USER_AGENT' ] != 'Seesmic' ) {
2012-03-18 12:52:51 -04:00
$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 );
2013-12-15 17:00:47 -05:00
} */
2012-03-18 12:52:51 -04:00
2013-12-15 17:00:47 -05:00
$ret [] = $status ;
2011-02-15 06:24:21 -05:00
};
2011-07-31 19:35:53 -04:00
return $ret ;
2011-02-16 02:56:47 -05:00
}
2011-07-31 19:35:53 -04:00
2011-06-20 20:16:13 -04:00
function api_account_rate_limit_status ( & $a , $type ) {
$hash = array (
2012-03-18 12:52:51 -04:00
'reset_time_in_seconds' => strtotime ( 'now + 1 hour' ),
2011-06-20 20:16:13 -04:00
'remaining_hits' => ( string ) 150 ,
'hourly_limit' => ( string ) 150 ,
2013-12-20 17:07:11 -05:00
'reset_time' => api_date ( datetime_convert ( 'UTC' , 'UTC' , 'now + 1 hour' , ATOM_TIME )),
2011-06-20 20:16:13 -04:00
);
2012-03-18 12:52:51 -04:00
if ( $type == " xml " )
$hash [ 'resettime_in_seconds' ] = $hash [ 'reset_time_in_seconds' ];
2011-06-20 20:16:13 -04: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 00:56:56 -04:00
2012-03-18 12:52:51 -04: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 08:16:53 -05:00
api_register_func ( 'api/help/test' , 'api_help_test' , false );
2012-03-18 12:52:51 -04:00
2011-08-19 08:57:54 -04:00
/**
* https :// dev . twitter . com / docs / api / 1 / get / statuses / friends
2011-08-19 09:09:10 -04:00
* This function is deprecated by Twitter
* returns : json , xml
2011-08-19 08:57:54 -04:00
**/
function api_statuses_f ( & $a , $type , $qtype ) {
2012-11-30 19:26:54 -05:00
if ( api_user () === false ) return false ;
2011-08-19 08:57:54 -04:00
$user_info = api_get_user ( $a );
2013-12-15 17:00:47 -05:00
2011-08-26 10:35:51 -04:00
// friends and followers only for self
if ( $user_info [ 'self' ] == 0 ){
return false ;
}
2013-12-15 17:00:47 -05:00
2011-08-19 09:09:10 -04: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
*/
2013-12-15 17:00:47 -05:00
2011-08-26 10:35:51 -04:00
/* $ret = Array ();
return array ( '$users' => $ret ); */
return false ;
2011-08-19 09:09:10 -04:00
}
2013-12-15 17:00:47 -05:00
2011-08-19 08:57:54 -04: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 ));
2013-12-15 17:00:47 -05:00
2011-08-19 08:57:54 -04:00
$r = q ( " SELECT id FROM `contact` WHERE `uid` = %d AND `self` = 0 AND `blocked` = 0 AND `pending` = 0 $sql_extra " ,
2012-11-30 19:26:54 -05:00
intval ( api_user ())
2011-08-19 08:57:54 -04:00
);
$ret = array ();
foreach ( $r as $cid ){
2013-12-15 17:00:47 -05:00
$user = api_get_user ( $a , $cid [ 'id' ]);
// "cid", "uid" and "self" are only needed for some internal stuff, so remove it from here
unset ( $user [ " cid " ]);
unset ( $user [ " uid " ]);
unset ( $user [ " self " ]);
if ( $user )
$ret [] = $user ;
2011-08-19 08:57:54 -04:00
}
2013-12-15 17:00:47 -05:00
2011-08-26 10:35:51 -04:00
return array ( '$users' => $ret );
2011-08-19 08:57:54 -04:00
}
function api_statuses_friends ( & $a , $type ){
2011-08-26 10:35:51 -04:00
$data = api_statuses_f ( $a , $type , " friends " );
if ( $data === false ) return false ;
return api_apply_template ( " friends " , $type , $data );
2011-08-19 08:57:54 -04:00
}
function api_statuses_followers ( & $a , $type ){
2011-08-26 10:35:51 -04:00
$data = api_statuses_f ( $a , $type , " followers " );
if ( $data === false ) return false ;
return api_apply_template ( " friends " , $type , $data );
2011-08-19 08:57:54 -04:00
}
api_register_func ( 'api/statuses/friends' , 'api_statuses_friends' , true );
api_register_func ( 'api/statuses/followers' , 'api_statuses_followers' , true );
2011-07-29 00:56:56 -04:00
function api_statusnet_config ( & $a , $type ) {
$name = $a -> config [ 'sitename' ];
$server = $a -> get_hostname ();
2012-02-19 13:34:48 -05:00
$logo = $a -> get_baseurl () . '/images/friendica-64.png' ;
2011-07-29 00:56:56 -04: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-02 23:02:07 -04:00
$textlimit = ( string ) (( $a -> config [ 'max_import_size' ]) ? $a -> config [ 'max_import_size' ] : 200000 );
2011-08-02 23:08:40 -04:00
if ( $a -> config [ 'api_import_size' ])
$texlimit = string ( $a -> config [ 'api_import_size' ]);
2011-07-29 00:56:56 -04: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' => '' ,
2013-12-20 17:07:11 -05:00
'logo' => $logo , 'fancy' => true , 'language' => 'en' , 'email' => $email , 'broughtby' => '' ,
'broughtbyurl' => '' , 'timezone' => 'UTC' , 'closed' => $closed , 'inviteonly' => false ,
2011-07-29 00:56:56 -04:00
'private' => $private , 'textlimit' => $textlimit , 'sslserver' => $sslserver , 'ssl' => $ssl ,
2012-06-23 16:52:50 -04:00
'shorturllength' => '30' ,
2013-12-20 17:07:11 -05:00
'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 00:56:56 -04:00
),
2013-12-20 17:07:11 -05:00
);
2011-07-29 00:56:56 -04:00
return api_apply_template ( 'config' , $type , array ( '$config' => $config ));
}
2011-07-29 20:01:57 -04:00
api_register_func ( 'api/statusnet/config' , 'api_statusnet_config' , false );
2011-07-29 00:56:56 -04:00
2011-07-29 21:21:54 -04: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 01:22:34 -04:00
function api_ff_ids ( & $a , $type , $qtype ) {
2012-11-30 19:26:54 -05:00
if ( ! api_user ())
2011-08-01 01:22:34 -04:00
return false ;
if ( $qtype == 'friends' )
2011-08-07 19:15:54 -04:00
$sql_extra = sprintf ( " AND ( `rel` = %d OR `rel` = %d ) " , intval ( CONTACT_IS_SHARING ), intval ( CONTACT_IS_FRIEND ));
2011-08-01 01:22:34 -04:00
if ( $qtype == 'followers' )
2011-08-07 19:15:54 -04:00
$sql_extra = sprintf ( " AND ( `rel` = %d OR `rel` = %d ) " , intval ( CONTACT_IS_FOLLOWER ), intval ( CONTACT_IS_FRIEND ));
2011-08-01 01:22:34 -04:00
2013-12-19 00:58:11 -05:00
$r = q ( " SELECT unique_contacts.id FROM contact, unique_contacts WHERE contact.nurl = unique_contacts.url AND `uid` = %d AND `self` = 0 AND `blocked` = 0 AND `pending` = 0 $sql_extra " ,
2012-11-30 19:26:54 -05:00
intval ( api_user ())
2011-08-01 01:22:34 -04:00
);
if ( is_array ( $r )) {
2013-12-19 00:58:11 -05:00
2011-08-01 01:22:34 -04:00
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 08:57:54 -04:00
2011-08-19 10:55:43 -04:00
function api_direct_messages_new ( & $a , $type ) {
2012-11-30 19:26:54 -05:00
if ( api_user () === false ) return false ;
2013-12-15 17:00:47 -05:00
2013-12-29 11:54:37 -05:00
if ( ! x ( $_POST , " text " ) OR ( ! x ( $_POST , " screen_name " ) AND ! x ( $_POST , " user_id " ))) return ;
2012-06-22 08:54:31 -04:00
2011-08-19 10:55:43 -04:00
$sender = api_get_user ( $a );
2013-12-15 17:00:47 -05:00
2012-06-25 09:53:56 -04:00
require_once ( " include/message.php " );
2013-12-29 11:54:37 -05:00
if ( $_POST [ 'screen_name' ]) {
$r = q ( " SELECT `id`, `nurl` FROM `contact` WHERE `uid`=%d AND `nick`='%s' " ,
intval ( api_user ()),
dbesc ( $_POST [ 'screen_name' ]));
$recipient = api_get_user ( $a , $r [ 0 ][ 'nurl' ]);
} else
$recipient = api_get_user ( $a , $_POST [ 'user_id' ]);
2012-06-22 08:54:31 -04:00
$replyto = '' ;
2012-06-25 09:53:56 -04:00
$sub = '' ;
2012-06-22 08:54:31 -04:00
if ( x ( $_REQUEST , 'replyto' )) {
2012-06-25 10:25:34 -04:00
$r = q ( 'SELECT `parent-uri`, `title` FROM `mail` WHERE `uid`=%d AND `id`=%d' ,
2012-11-30 19:26:54 -05:00
intval ( api_user ()),
2012-06-22 08:54:31 -04:00
intval ( $_REQUEST [ 'replyto' ]));
2012-06-25 10:25:34 -04:00
$replyto = $r [ 0 ][ 'parent-uri' ];
2012-06-25 09:53:56 -04:00
$sub = $r [ 0 ][ 'title' ];
2012-06-22 08:54:31 -04:00
}
else {
2012-06-25 09:53:56 -04:00
if ( x ( $_REQUEST , 'title' )) {
$sub = $_REQUEST [ 'title' ];
}
else {
$sub = (( strlen ( $_POST [ 'text' ]) > 10 ) ? substr ( $_POST [ 'text' ], 0 , 10 ) . " ... " : $_POST [ 'text' ]);
}
2012-06-22 08:54:31 -04:00
}
2012-06-25 09:53:56 -04:00
2013-12-29 11:54:37 -05:00
$id = send_message ( $recipient [ 'cid' ], $_POST [ 'text' ], $sub , $replyto );
2011-08-19 10:55:43 -04:00
if ( $id >- 1 ) {
$r = q ( " SELECT * FROM `mail` WHERE id=%d " , intval ( $id ));
2012-06-26 02:54:01 -04:00
$ret = api_format_messages ( $r [ 0 ], $recipient , $sender );
2013-12-15 17:00:47 -05:00
2011-08-19 10:55:43 -04:00
} else {
2013-12-15 17:00:47 -05:00
$ret = array ( " error " => $id );
2011-08-19 10:55:43 -04:00
}
2013-12-15 17:00:47 -05:00
2011-08-19 10:55:43 -04:00
$data = Array ( '$messages' => $ret );
2013-12-15 17:00:47 -05:00
2011-08-19 10:55:43 -04:00
switch ( $type ){
case " atom " :
case " rss " :
$data = api_rss_extra ( $a , $data , $user_info );
}
2013-12-15 17:00:47 -05:00
2011-08-19 10:55:43 -04:00
return api_apply_template ( " direct_messages " , $type , $data );
2013-12-15 17:00:47 -05:00
2011-08-19 10:55:43 -04:00
}
api_register_func ( 'api/direct_messages/new' , 'api_direct_messages_new' , true );
2012-06-26 02:54:01 -04:00
function api_direct_messages_box ( & $a , $type , $box ) {
2012-11-30 19:26:54 -05:00
if ( api_user () === false ) return false ;
2013-12-15 17:00:47 -05:00
2013-12-29 11:54:37 -05:00
unset ( $_REQUEST [ " user_id " ]);
unset ( $_GET [ " user_id " ]);
2011-08-19 10:55:43 -04:00
$user_info = api_get_user ( $a );
2013-12-15 17:00:47 -05:00
2011-08-19 10:55:43 -04:00
// params
$count = ( x ( $_GET , 'count' ) ? $_GET [ 'count' ] : 20 );
2011-08-19 14:33:34 -04:00
$page = ( x ( $_REQUEST , 'page' ) ? $_REQUEST [ 'page' ] - 1 : 0 );
if ( $page < 0 ) $page = 0 ;
2013-12-15 17:00:47 -05:00
2013-12-19 00:58:11 -05:00
$since_id = ( x ( $_REQUEST , 'since_id' ) ? $_REQUEST [ 'since_id' ] : 0 );
2011-08-19 10:55:43 -04:00
$start = $page * $count ;
2013-12-15 17:00:47 -05:00
2013-12-20 17:07:11 -05:00
//$profile_url = $a->get_baseurl() . '/profile/' . $a->user['nickname'];
$profile_url = $user_info [ " url " ];
2011-08-19 10:55:43 -04:00
if ( $box == " sentbox " ) {
2013-12-27 08:11:13 -05:00
$sql_extra = " `mail`.`from-url`=' " . dbesc ( $profile_url ) . " ' " ;
2012-06-26 02:54:01 -04:00
}
elseif ( $box == " conversation " ) {
2013-12-27 08:11:13 -05:00
$sql_extra = " `mail`.`parent-uri`=' " . dbesc ( $_GET [ " uri " ] ) . " ' " ;
2012-06-26 02:54:01 -04:00
}
elseif ( $box == " all " ) {
$sql_extra = " true " ;
}
elseif ( $box == " inbox " ) {
2013-12-27 08:11:13 -05:00
$sql_extra = " `mail`.`from-url`!=' " . dbesc ( $profile_url ) . " ' " ;
2011-08-19 10:55:43 -04:00
}
2013-12-15 17:00:47 -05:00
2013-12-27 08:11:13 -05:00
$r = q ( " SELECT `mail`.*, `contact`.`nurl` AS `contact-url` FROM `mail`,`contact` WHERE `mail`.`contact-id` = `contact`.`id` AND `mail`.`uid`=%d AND $sql_extra AND `mail`.`id` > %d ORDER BY `mail`.`created` DESC LIMIT %d,%d " ,
2012-11-30 19:26:54 -05:00
intval ( api_user ()),
2013-12-19 00:58:11 -05:00
intval ( $since_id ),
2011-08-19 10:55:43 -04:00
intval ( $start ), intval ( $count )
2012-06-23 13:21:48 -04:00
);
2013-12-15 17:00:47 -05:00
2011-08-19 10:55:43 -04:00
$ret = Array ();
2012-06-26 02:54:01 -04:00
foreach ( $r as $item ) {
2012-06-23 13:29:58 -04:00
if ( $box == " inbox " || $item [ 'from-url' ] != $profile_url ){
2012-06-26 02:54:01 -04:00
$recipient = $user_info ;
2013-12-27 08:11:13 -05:00
$sender = api_get_user ( $a , normalise_link ( $item [ 'contact-url' ]));
2011-08-19 10:55:43 -04:00
}
2012-06-26 02:54:01 -04:00
elseif ( $box == " sentbox " || $item [ 'from-url' ] != $profile_url ){
2013-12-27 08:11:13 -05:00
$recipient = api_get_user ( $a , normalise_link ( $item [ 'contact-url' ]));
2012-06-26 02:54:01 -04:00
$sender = $user_info ;
2013-12-27 08:11:13 -05:00
2012-06-26 02:54:01 -04:00
}
$ret [] = api_format_messages ( $item , $recipient , $sender );
2011-08-19 10:55:43 -04:00
}
2013-12-15 17:00:47 -05:00
2011-08-19 10:55:43 -04:00
$data = array ( '$messages' => $ret );
switch ( $type ){
case " atom " :
case " rss " :
$data = api_rss_extra ( $a , $data , $user_info );
}
2013-12-15 17:00:47 -05:00
2011-08-19 10:55:43 -04:00
return api_apply_template ( " direct_messages " , $type , $data );
2013-12-15 17:00:47 -05:00
2011-08-19 10:55:43 -04:00
}
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 13:21:48 -04: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 10:55:43 -04: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 09:57:35 -04: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 11:36:58 -05:00
echo $r ;
2013-12-15 17:00:47 -05:00
killme ();
2011-10-20 09:57:35 -04:00
}
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 11:36:58 -05:00
echo $r ;
2013-12-15 17:00:47 -05:00
killme ();
2011-10-20 09:57:35 -04:00
}
2011-10-26 11:15:36 -04:00
2011-10-20 09:57:35 -04: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 11:15:36 -04:00
2014-01-02 16:29:44 -05:00
function api_share_as_retweet ( $a , $uid , & $item ) {
$body = trim ( $item [ " body " ]);
// Skip if it isn't a pure repeated messages
// Does it start with a share?
if ( strpos ( $body , " [share " ) > 0 )
return ( false );
// Does it end with a share?
if ( strlen ( $body ) > ( strrpos ( $body , " [/share] " ) + 8 ))
return ( false );
$attributes = preg_replace ( " / \ [share(.*?) \ ] \ s?(.*?) \ s? \ [ \ /share \ ] \ s?/ism " , " $ 1 " , $body );
// Skip if there is no shared message in there
if ( $body == $attributes )
return ( false );
$author = " " ;
preg_match ( " /author='(.*?)'/ism " , $attributes , $matches );
if ( $matches [ 1 ] != " " )
$author = html_entity_decode ( $matches [ 1 ], ENT_QUOTES , 'UTF-8' );
preg_match ( '/author="(.*?)"/ism' , $attributes , $matches );
if ( $matches [ 1 ] != " " )
$author = $matches [ 1 ];
$profile = " " ;
preg_match ( " /profile='(.*?)'/ism " , $attributes , $matches );
if ( $matches [ 1 ] != " " )
$profile = $matches [ 1 ];
preg_match ( '/profile="(.*?)"/ism' , $attributes , $matches );
if ( $matches [ 1 ] != " " )
$profile = $matches [ 1 ];
$avatar = " " ;
preg_match ( " /avatar='(.*?)'/ism " , $attributes , $matches );
if ( $matches [ 1 ] != " " )
$avatar = $matches [ 1 ];
preg_match ( '/avatar="(.*?)"/ism' , $attributes , $matches );
if ( $matches [ 1 ] != " " )
$avatar = $matches [ 1 ];
$shared_body = preg_replace ( " / \ [share(.*?) \ ] \ s?(.*?) \ s? \ [ \ /share \ ] \ s?/ism " , " $ 2 " , $body );
if (( $shared_body == " " ) OR ( $profile == " " ) OR ( $author == " " ) OR ( $avatar == " " ))
return ( false );
$item [ " body " ] = $shared_body ;
$item [ " author-name " ] = $author ;
$item [ " author-link " ] = $profile ;
$item [ " author-avatar " ] = $avatar ;
return ( true );
}
function api_get_nick ( $profile ) {
/* To - Do :
- remove trailing jung from profile url
- pump . io check has to check the websitr
*/
$nick = " " ;
$friendica = preg_replace ( " =https?://(.*)/profile/(.*)=ism " , " $ 2 " , $profile );
if ( $friendica != $profile )
$nick = $friendica ;
if ( ! $nick == " " ) {
$diaspora = preg_replace ( " =https?://(.*)/u/(.*)=ism " , " $ 2 " , $profile );
if ( $diaspora != $profile )
$nick = $diaspora ;
}
if ( ! $nick == " " ) {
$twitter = preg_replace ( " =https?://twitter.com/(.*)=ism " , " $ 1 " , $profile );
if ( $twitter != $profile )
$nick = $twitter ;
}
if ( ! $nick == " " ) {
$StatusnetHost = preg_replace ( " =https?://(.*)/user/(.*)=ism " , " $ 1 " , $profile );
if ( $StatusnetHost != $profile ) {
$StatusnetUser = preg_replace ( " =https?://(.*)/user/(.*)=ism " , " $ 2 " , $profile );
if ( $StatusnetUser != $profile ) {
$UserData = fetch_url ( " http:// " . $StatusnetHost . " /api/users/show.json?user_id= " . $StatusnetUser );
$user = json_decode ( $UserData );
if ( $user )
$nick = $user -> screen_name ;
}
}
}
// To-Do: look at the page if its really a pumpio site
//if (!$nick == "") {
// $pumpio = preg_replace("=https?://(.*)/(.*)/=ism", "$2", $profile."/");
// if ($pumpio != $profile)
// $nick = $pumpio;
// <div class="media" id="profile-block" data-profile-id="acct:kabniel@microca.st">
//}
if ( $nick != " " ) {
q ( " UPDATE unique_contacts SET nick = '%s' WHERE url = '%s' " ,
dbesc ( $nick ), dbesc ( normalise_link ( $profile )));
return ( $nick );
}
return ( false );
}
function api_clean_plain_items ( $Text ) {
$Text = preg_replace_callback ( " ((.*?) \ [class=(.*?) \ ](.*?) \ [ \ /class \ ])ism " , " api_cleanup_share " , $Text );
return ( $Text );
}
function api_cleanup_share ( $shared ) {
if ( $shared [ 2 ] != " type-link " )
return ( $shared [ 3 ]);
if ( ! preg_match_all ( " / \ [bookmark \ =([^ \ ]]*) \ ](.*?) \ [ \ /bookmark \ ]/ism " , $shared [ 3 ], $bookmark ))
return ( $shared [ 3 ]);
$title = " " ;
$link = " " ;
if ( isset ( $bookmark [ 2 ][ 0 ]))
$title = $bookmark [ 2 ][ 0 ];
if ( isset ( $bookmark [ 1 ][ 0 ]))
$link = $bookmark [ 1 ][ 0 ];
if ( strpos ( $shared [ 1 ], $title ) !== false )
$title = " " ;
if ( strpos ( $shared [ 1 ], $link ) !== false )
$link = " " ;
$text = trim ( $shared [ 1 ]);
//if (strlen($text) < strlen($title))
if (( $text == " " ) AND ( $title != " " ))
$text .= " \n \n " . trim ( $title );
if ( $link != " " )
$text .= " \n " . trim ( $link );
return ( trim ( $text ));
}
2012-03-21 05:08:40 -04:00
/*
Not implemented by now :
2012-04-07 18:02:25 -04:00
favorites
favorites / create
favorites / destroy
2012-03-21 05:08:40 -04: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 17:41:04 -04:00
lists
2012-03-21 05:08:40 -04:00
*/