2011-02-15 12:24:21 +01:00
< ? php
2013-12-29 17:54:37 +01:00
/* To - Do :
- Automatically detect if incoming data is HTML or BBCode
*/
2012-12-28 22:51:50 +01: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 18:00:24 +02:00
/*
2011-02-15 12:24:21 +01:00
* Twitter - Like API
2012-04-22 18:00:24 +02:00
*
2011-02-15 12:24:21 +01:00
*/
$API = Array ();
2012-04-22 18:00:24 +02:00
$called_api = Null ;
2011-04-21 17:03:31 +02:00
2014-04-22 15:56:28 +02: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 ;
}
2012-12-01 01:26:54 +01:00
2014-09-28 17:23:01 +02:00
function api_source () {
if ( requestdata ( 'source' ))
return ( requestdata ( 'source' ));
// Support for known clients that doesn't send a source name
if ( strstr ( $_SERVER [ 'HTTP_USER_AGENT' ], " Twidere " ))
return ( " Twidere " );
logger ( " Unrecognized user-agent " . $_SERVER [ 'HTTP_USER_AGENT' ], LOGGER_DEBUG );
return ( " api " );
}
2011-02-15 12:24:21 +01:00
function api_date ( $str ){
//Wed May 23 06:01:13 +0000 2007
2011-08-16 13:55:38 +02:00
return datetime_convert ( 'UTC' , 'UTC' , $str , " D M d H:i:s +0000 Y " );
2011-02-15 12:24:21 +01:00
}
2012-04-22 18:00:24 +02:00
2011-02-15 12:24:21 +01:00
function api_register_func ( $path , $func , $auth = false ){
global $API ;
2014-01-13 20:03:05 +01:00
$API [ $path ] = array ( 'func' => $func , 'auth' => $auth );
// Workaround for hotot
$path = str_replace ( " api/ " , " api/1.1/ " , $path );
$API [ $path ] = array ( 'func' => $func , 'auth' => $auth );
2011-02-15 12:24:21 +01:00
}
2012-04-22 18:00:24 +02:00
2011-02-15 12:24:21 +01:00
/**
* Simple HTTP Login
*/
2012-01-15 22:57:00 +01:00
2011-02-15 12:24:21 +01:00
function api_login ( & $a ){
2011-11-07 17:36:58 +01: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 23:00:47 +01:00
2011-06-20 05:13:24 +02:00
// workaround for HTTP-auth in CGI mode
if ( x ( $_SERVER , 'REDIRECT_REMOTE_USER' )) {
2014-04-22 15:56:28 +02:00
$userpass = base64_decode ( substr ( $_SERVER [ " REDIRECT_REMOTE_USER " ], 6 )) ;
2011-06-20 05:13:24 +02:00
if ( strlen ( $userpass )) {
2014-04-22 15:56:28 +02:00
list ( $name , $password ) = explode ( ':' , $userpass );
2011-06-20 05:13:24 +02:00
$_SERVER [ 'PHP_AUTH_USER' ] = $name ;
$_SERVER [ 'PHP_AUTH_PW' ] = $password ;
}
}
2011-02-15 12:24:21 +01:00
if ( ! isset ( $_SERVER [ 'PHP_AUTH_USER' ])) {
2013-12-20 23:07:11 +01: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 19:12:26 +01:00
die (( api_error ( $a , 'json' , " This api requires login " )));
2013-12-20 23:07:11 +01:00
//die('This api requires login');
2011-02-15 12:24:21 +01:00
}
2013-12-15 23:00:47 +01:00
2011-02-15 12:24:21 +01:00
$user = $_SERVER [ 'PHP_AUTH_USER' ];
2015-01-15 18:15:06 +01:00
$password = $_SERVER [ 'PHP_AUTH_PW' ];
$encrypted = hash ( 'whirlpool' , trim ( $password ));
2013-12-15 23:00:47 +01:00
/**
* next code from mod / auth . php . needs better solution
*/
2015-01-15 18:15:06 +01:00
$record = null ;
2013-12-15 23:00:47 +01:00
2015-01-15 18:15:06 +01:00
$addon_auth = array (
'username' => trim ( $user ),
'password' => trim ( $password ),
'authenticated' => 0 ,
'user_record' => null
2011-02-15 12:24:21 +01:00
);
2015-01-15 18:15:06 +01:00
/**
*
* A plugin indicates successful login by setting 'authenticated' to non - zero value and returning a user record
* Plugins should never set 'authenticated' except to indicate success - as hooks may be chained
* and later plugins should not interfere with an earlier one that succeeded .
*
*/
call_hooks ( 'authenticate' , $addon_auth );
if (( $addon_auth [ 'authenticated' ]) && ( count ( $addon_auth [ 'user_record' ]))) {
$record = $addon_auth [ 'user_record' ];
}
else {
// process normal login request
$r = q ( " SELECT * FROM `user` WHERE ( `email` = '%s' OR `nickname` = '%s' )
AND `password` = '%s' AND `blocked` = 0 AND `account_expired` = 0 AND `account_removed` = 0 AND `verified` = 1 LIMIT 1 " ,
dbesc ( trim ( $user )),
dbesc ( trim ( $user )),
dbesc ( $encrypted )
);
if ( count ( $r ))
$record = $r [ 0 ];
}
if (( ! $record ) || ( ! count ( $record ))) {
2014-04-22 15:56:28 +02:00
logger ( 'API_login failure: ' . print_r ( $_SERVER , true ), LOGGER_DEBUG );
header ( 'WWW-Authenticate: Basic realm="Friendica"' );
header ( 'HTTP/1.0 401 Unauthorized' );
die ( 'This api requires login' );
2011-04-27 17:46:23 +02:00
}
2011-02-15 12:24:21 +01:00
2012-01-13 00:46:39 +01:00
require_once ( 'include/security.php' );
2012-12-01 01:26:54 +01:00
authenticate_success ( $record ); $_SESSION [ " allow_api " ] = true ;
2011-02-15 12:24:21 +01:00
call_hooks ( 'logged_in' , $a -> user );
}
2013-12-15 23:00:47 +01:00
2011-04-21 17:03:31 +02:00
/**************************
* MAIN API ENTRY POINT *
**************************/
2011-02-15 12:24:21 +01:00
function api_call ( & $a ){
2011-08-26 16:35:51 +02:00
GLOBAL $API , $called_api ;
2012-02-20 01:53:22 +01:00
// preset
$type = " json " ;
2011-02-15 12:24:21 +01:00
foreach ( $API as $p => $info ){
if ( strpos ( $a -> query_string , $p ) === 0 ){
2011-08-26 16:35:51 +02:00
$called_api = explode ( " / " , $p );
2012-01-13 00:46:39 +01:00
//unset($_SERVER['PHP_AUTH_USER']);
2012-12-01 01:26:54 +01:00
if ( $info [ 'auth' ] === true && api_user () === false ) {
2011-04-21 17:03:31 +02:00
api_login ( $a );
2011-02-15 12:24:21 +01:00
}
2011-08-01 01:35:53 +02:00
2012-12-01 01:26:54 +01:00
load_contact_links ( api_user ());
2011-08-01 01:35:53 +02:00
2012-02-20 01:53:22 +01:00
logger ( 'API call for ' . $a -> user [ 'username' ] . ': ' . $a -> query_string );
2011-08-01 14:13:59 +02:00
logger ( 'API parameters: ' . print_r ( $_REQUEST , true ));
2012-02-20 01:53:22 +01:00
$type = " json " ;
2011-04-21 17:03:31 +02:00
if ( strpos ( $a -> query_string , " .xml " ) > 0 ) $type = " xml " ;
if ( strpos ( $a -> query_string , " .json " ) > 0 ) $type = " json " ;
if ( strpos ( $a -> query_string , " .rss " ) > 0 ) $type = " rss " ;
2012-02-20 01:53:22 +01:00
if ( strpos ( $a -> query_string , " .atom " ) > 0 ) $type = " atom " ;
2012-04-08 17:23:38 +02:00
if ( strpos ( $a -> query_string , " .as " ) > 0 ) $type = " as " ;
2012-02-20 01:53:22 +01:00
2011-04-21 17:03:31 +02:00
$r = call_user_func ( $info [ 'func' ], $a , $type );
if ( $r === false ) return ;
switch ( $type ){
case " xml " :
$r = mb_convert_encoding ( $r , " UTF-8 " , mb_detect_encoding ( $r ));
header ( " Content-Type: text/xml " );
return '<?xml version="1.0" encoding="UTF-8"?>' . " \n " . $r ;
break ;
2012-02-20 01:53:22 +01:00
case " json " :
2013-12-15 23:00:47 +01:00
header ( " Content-Type: application/json " );
2011-06-21 02:16:13 +02:00
foreach ( $r as $rr )
2014-10-16 10:51:36 +02:00
$json = json_encode ( $rr );
if ( $_GET [ 'callback' ])
$json = $_GET [ 'callback' ] . " ( " . $json . " ) " ;
2014-11-18 23:55:45 +01:00
return $json ;
2011-04-21 17:03:31 +02: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 11:41:16 +02:00
header ( " Content-Type: application/atom+xml " );
2011-04-21 17:03:31 +02:00
return '<?xml version="1.0" encoding="UTF-8"?>' . " \n " . $r ;
break ;
2012-04-08 17:23:38 +02:00
case " as " :
//header ("Content-Type: application/json");
//foreach($r as $rr)
2014-04-22 15:56:28 +02:00
// return json_encode($rr);
2012-04-08 17:23:38 +02:00
return json_encode ( $r );
break ;
2012-02-20 01:53:22 +01:00
2011-02-15 12:24:21 +01:00
}
//echo "<pre>"; var_dump($r); die();
}
}
2012-07-13 23:23:31 +02:00
header ( " HTTP/1.1 404 Not Found " );
2012-02-20 11:15:22 +01:00
logger ( 'API call not implemented: ' . $a -> query_string . " - " . print_r ( $_REQUEST , true ));
2014-01-02 19:12:26 +01:00
return ( api_error ( $a , $type , " not implemented " ));
2013-12-20 23:07:11 +01:00
}
function api_error ( & $a , $type , $error ) {
2014-12-31 12:34:32 +01:00
# TODO: https://dev.twitter.com/overview/api/response-codes
2013-12-20 23:07:11 +01:00
$r = " <status><error> " . $error . " </error><request> " . $a -> query_string . " </request></status> " ;
2011-08-01 05:01:00 +02:00
switch ( $type ){
case " xml " :
header ( " Content-Type: text/xml " );
return '<?xml version="1.0" encoding="UTF-8"?>' . " \n " . $r ;
break ;
2012-02-20 01:53:22 +01:00
case " json " :
header ( " Content-Type: application/json " );
2013-12-20 23:07:11 +01:00
return json_encode ( array ( 'error' => $error , 'request' => $a -> query_string ));
2011-08-01 05:01:00 +02: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 12:24:21 +01:00
}
2011-04-21 17:03:31 +02: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 11:41:16 +02:00
$arr [ '$user' ] = $user_info ;
2011-04-21 17:03:31 +02:00
$arr [ '$rss' ] = array (
'alternate' => $user_info [ 'url' ],
'self' => $a -> get_baseurl () . " / " . $a -> query_string ,
2011-08-01 01:35:53 +02:00
'base' => $a -> get_baseurl (),
2011-04-21 17:03:31 +02:00
'updated' => api_date ( null ),
2011-08-01 01:35:53 +02:00
'atom_updated' => datetime_convert ( 'UTC' , 'UTC' , 'now' , ATOM_TIME ),
2011-04-21 17:03:31 +02:00
'language' => $user_info [ 'language' ],
2012-02-19 19:34:48 +01:00
'logo' => $a -> get_baseurl () . " /images/friendica-32.png " ,
2011-04-21 17:03:31 +02:00
);
2013-12-15 23:00:47 +01:00
2011-04-21 17:03:31 +02:00
return $arr ;
}
2013-12-15 23:00:47 +01:00
/**
2013-12-27 14:11:13 +01:00
* Unique contact to contact url .
2013-12-15 23:00:47 +01: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 12:24:21 +01:00
/**
2011-04-21 17:03:31 +02:00
* Returns user info array .
2011-02-15 12:24:21 +01:00
*/
2013-12-20 23:07:11 +01:00
function api_get_user ( & $a , $contact_id = Null , $type = " json " ){
2011-08-26 16:35:51 +02:00
global $called_api ;
2011-02-15 12:24:21 +01:00
$user = null ;
$extra_query = " " ;
2013-12-15 23:00:47 +01:00
$url = " " ;
$nick = " " ;
2014-01-05 16:12:03 +01:00
logger ( " api_get_user: Fetching user data for user " . $contact_id , LOGGER_DEBUG );
2013-12-15 23:00:47 +01:00
// 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 09:53:46 +02:00
2013-12-15 23:00:47 +01: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 16:55:43 +02:00
2013-12-15 23:00:47 +01:00
if ( $user == " " )
2013-12-20 23:07:11 +01:00
die ( api_error ( $a , $type , t ( " User not found. " )));
2013-12-15 23:00:47 +01:00
$url = $user ;
$extra_query = " AND `contact`.`nurl` = '%s' " ;
if ( api_user () !== false ) $extra_query .= " AND `contact`.`uid`= " . intval ( api_user ());
2011-06-21 11:41:16 +02:00
}
2013-12-15 23:00:47 +01:00
2011-06-21 11:41:16 +02:00
if ( is_null ( $user ) && x ( $_GET , 'user_id' )) {
2013-12-15 23:00:47 +01:00
$user = dbesc ( api_unique_id_to_url ( $_GET [ 'user_id' ]));
if ( $user == " " )
2013-12-20 23:07:11 +01:00
die ( api_error ( $a , $type , t ( " User not found. " )));
2013-12-15 23:00:47 +01:00
$url = $user ;
$extra_query = " AND `contact`.`nurl` = '%s' " ;
if ( api_user () !== false ) $extra_query .= " AND `contact`.`uid`= " . intval ( api_user ());
2011-02-15 12:24:21 +01:00
}
2011-06-21 11:41:16 +02:00
if ( is_null ( $user ) && x ( $_GET , 'screen_name' )) {
2013-12-15 23:00:47 +01:00
$user = dbesc ( $_GET [ 'screen_name' ]);
$nick = $user ;
2011-04-21 17:03:31 +02:00
$extra_query = " AND `contact`.`nick` = '%s' " ;
2012-12-01 01:26:54 +01:00
if ( api_user () !== false ) $extra_query .= " AND `contact`.`uid`= " . intval ( api_user ());
2011-02-15 12:24:21 +01:00
}
2013-12-15 23:00:47 +01:00
2013-12-29 17:54:37 +01:00
if ( is_null ( $user ) AND ( $a -> argc > ( count ( $called_api ) - 1 )) AND ( count ( $called_api ) > 0 )){
2011-08-26 16:35:51 +02:00
$argid = count ( $called_api );
list ( $user , $null ) = explode ( " . " , $a -> argv [ $argid ]);
2011-02-15 12:24:21 +01:00
if ( is_numeric ( $user )){
2013-12-15 23:00:47 +01: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 12:24:21 +01:00
} else {
$user = dbesc ( $user );
2013-12-15 23:00:47 +01:00
$nick = $user ;
2011-04-21 17:03:31 +02:00
$extra_query = " AND `contact`.`nick` = '%s' " ;
2012-12-01 01:26:54 +01:00
if ( api_user () !== false ) $extra_query .= " AND `contact`.`uid`= " . intval ( api_user ());
2011-02-15 12:24:21 +01:00
}
}
2013-12-15 23:00:47 +01:00
2014-01-08 01:14:58 +01:00
logger ( " api_get_user: user " . $user , LOGGER_DEBUG );
2013-12-15 23:00:47 +01:00
if ( ! $user ) {
2012-12-01 01:26:54 +01:00
if ( api_user () === false ) {
2011-02-16 08:56:47 +01:00
api_login ( $a ); return False ;
} else {
$user = $_SESSION [ 'uid' ];
2011-07-31 05:48:55 +02:00
$extra_query = " AND `contact`.`uid` = %d AND `contact`.`self` = 1 " ;
2011-02-16 08:56:47 +01:00
}
2013-12-15 23:00:47 +01:00
2011-02-15 12:24:21 +01:00
}
2013-12-15 23:00:47 +01:00
2012-06-12 04:21:35 +02:00
logger ( 'api_user: ' . $extra_query . ', user: ' . $user );
2013-12-15 23:00:47 +01:00
// user info
2011-06-21 11:41:16 +02:00
$uinfo = q ( " SELECT *, `contact`.`id` as `cid` FROM `contact`
WHERE 1
2011-02-15 12:24:21 +01:00
$extra_query " ,
$user
);
2013-12-15 23:00:47 +01:00
2014-01-05 16:12:03 +01:00
// Selecting the id by priority, friendica first
api_best_nickname ( $uinfo );
2013-12-15 23:00:47 +01:00
// if the contact wasn't found, fetch it from the unique contacts
2011-02-15 12:24:21 +01:00
if ( count ( $uinfo ) == 0 ) {
2013-12-15 23:00:47 +01: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 22:29:44 +01: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 23:00:47 +01:00
$ret = array (
'id' => $r [ 0 ][ " id " ],
2014-01-13 20:03:05 +01:00
'id_str' => ( string ) $r [ 0 ][ " id " ],
2013-12-15 23:00:47 +01:00
'name' => $r [ 0 ][ " name " ],
2013-12-19 06:58:11 +01:00
'screen_name' => (( $r [ 0 ][ 'nick' ]) ? $r [ 0 ][ 'nick' ] : $r [ 0 ][ 'name' ]),
2013-12-15 23:00:47 +01:00
'location' => NULL ,
'description' => NULL ,
'profile_image_url' => $r [ 0 ][ " avatar " ],
2013-12-27 01:48:43 +01:00
'profile_image_url_https' => $r [ 0 ][ " avatar " ],
2013-12-19 06:58:11 +01:00
'url' => $r [ 0 ][ " url " ],
2013-12-15 23:00:47 +01:00
'protected' => false ,
'followers_count' => 0 ,
'friends_count' => 0 ,
2013-12-27 01:48:43 +01:00
'created_at' => api_date ( 0 ),
2013-12-15 23:00:47 +01:00
'favourites_count' => 0 ,
'utc_offset' => 0 ,
'time_zone' => 'UTC' ,
2013-12-19 06:58:11 +01:00
'statuses_count' => 0 ,
2013-12-27 01:48:43 +01:00
'following' => false ,
'verified' => false ,
2013-12-15 23:00:47 +01:00
'statusnet_blocking' => false ,
'notifications' => false ,
'statusnet_profile_url' => $r [ 0 ][ " url " ],
'uid' => 0 ,
'cid' => 0 ,
'self' => 0 ,
2014-01-05 16:12:03 +01:00
'network' => '' ,
2013-12-15 23:00:47 +01:00
);
return $ret ;
} else
2013-12-20 23:07:11 +01:00
die ( api_error ( $a , $type , t ( " User not found. " )));
2013-12-15 23:00:47 +01:00
2011-02-15 12:24:21 +01:00
}
2013-12-15 23:00:47 +01:00
2011-08-01 05:01:00 +02:00
if ( $uinfo [ 0 ][ 'self' ]) {
2011-08-05 14:17:18 +02:00
$usr = q ( " select * from user where uid = %d limit 1 " ,
2012-12-01 01:26:54 +01:00
intval ( api_user ())
2011-08-05 14:17:18 +02:00
);
$profile = q ( " select * from profile where uid = %d and `is-default` = 1 limit 1 " ,
2012-12-01 01:26:54 +01:00
intval ( api_user ())
2011-08-05 14:17:18 +02:00
);
2014-03-11 23:52:32 +01:00
//AND `allow_cid`='' AND `allow_gid`='' AND `deny_cid`='' AND `deny_gid`=''",
2011-08-01 05:01:00 +02:00
// count public wall messages
2014-03-16 17:12:56 +01:00
$r = q ( " SELECT count(*) as `count` FROM `item`
2011-08-01 05:01:00 +02:00
WHERE `uid` = % d
2014-03-11 23:52:32 +01:00
AND `type` = 'wall' " ,
2011-08-01 05:01:00 +02:00
intval ( $uinfo [ 0 ][ 'uid' ])
);
$countitms = $r [ 0 ][ 'count' ];
}
else {
2014-03-11 23:52:32 +01:00
//AND `allow_cid`='' AND `allow_gid`='' AND `deny_cid`='' AND `deny_gid`=''",
$r = q ( " SELECT count(*) as `count` FROM `item`
WHERE `contact-id` = % d " ,
2011-08-01 05:01:00 +02:00
intval ( $uinfo [ 0 ][ 'id' ])
);
$countitms = $r [ 0 ][ 'count' ];
}
2011-02-15 12:24:21 +01:00
// count friends
2014-03-11 23:52:32 +01:00
$r = q ( " SELECT count(*) as `count` FROM `contact`
2011-08-01 07:22:34 +02:00
WHERE `uid` = % d AND `rel` IN ( % d , % d )
2013-12-15 23:00:47 +01:00
AND `self` = 0 AND `blocked` = 0 AND `pending` = 0 AND `hidden` = 0 " ,
2011-08-01 07:22:34 +02:00
intval ( $uinfo [ 0 ][ 'uid' ]),
2011-08-08 01:15:54 +02:00
intval ( CONTACT_IS_SHARING ),
intval ( CONTACT_IS_FRIEND )
2011-02-15 12:24:21 +01:00
);
$countfriends = $r [ 0 ][ 'count' ];
2011-08-01 05:01:00 +02:00
2014-03-11 23:52:32 +01:00
$r = q ( " SELECT count(*) as `count` FROM `contact`
2011-08-01 07:22:34 +02:00
WHERE `uid` = % d AND `rel` IN ( % d , % d )
2013-12-15 23:00:47 +01:00
AND `self` = 0 AND `blocked` = 0 AND `pending` = 0 AND `hidden` = 0 " ,
2011-08-01 07:22:34 +02:00
intval ( $uinfo [ 0 ][ 'uid' ]),
2011-08-08 01:15:54 +02:00
intval ( CONTACT_IS_FOLLOWER ),
intval ( CONTACT_IS_FRIEND )
2011-08-01 07:22:34 +02:00
);
$countfollowers = $r [ 0 ][ 'count' ];
2014-03-11 23:52:32 +01:00
$r = q ( " SELECT count(*) as `count` FROM item where starred = 1 and uid = %d and deleted = 0 " ,
2011-08-05 14:17:18 +02:00
intval ( $uinfo [ 0 ][ 'uid' ])
);
$starred = $r [ 0 ][ 'count' ];
2013-12-15 23:00:47 +01:00
2011-08-05 14:17:18 +02:00
2011-08-01 05:01:00 +02:00
if ( ! $uinfo [ 0 ][ 'self' ]) {
$countfriends = 0 ;
2011-08-01 07:22:34 +02:00
$countfollowers = 0 ;
2011-08-05 14:17:18 +02:00
$starred = 0 ;
2011-08-01 05:01:00 +02:00
}
2011-02-16 08:56:47 +01:00
2014-01-02 22:29:44 +01: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 " ]);
}
2013-12-15 23:00:47 +01: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' ])));
}
2014-01-13 20:03:05 +01:00
require_once ( 'include/contact_selectors.php' );
$network_name = network_to_name ( $uinfo [ 0 ][ 'network' ]);
2011-02-16 08:56:47 +01:00
$ret = Array (
2013-12-15 23:00:47 +01:00
'id' => intval ( $r [ 0 ][ 'id' ]),
2014-01-13 20:03:05 +01:00
'id_str' => ( string ) intval ( $r [ 0 ][ 'id' ]),
2012-03-18 17:52:51 +01:00
'name' => (( $uinfo [ 0 ][ 'name' ]) ? $uinfo [ 0 ][ 'name' ] : $uinfo [ 0 ][ 'nick' ]),
2011-08-06 06:30:12 +02:00
'screen_name' => (( $uinfo [ 0 ][ 'nick' ]) ? $uinfo [ 0 ][ 'nick' ] : $uinfo [ 0 ][ 'name' ]),
2014-01-13 20:03:05 +01:00
'location' => ( $usr ) ? $usr [ 0 ][ 'default-location' ] : $network_name ,
2013-12-15 23:00:47 +01:00
'description' => (( $profile ) ? $profile [ 0 ][ 'pdesc' ] : NULL ),
2011-04-27 17:46:23 +02:00
'profile_image_url' => $uinfo [ 0 ][ 'micro' ],
2013-12-27 01:48:43 +01:00
'profile_image_url_https' => $uinfo [ 0 ][ 'micro' ],
2011-02-16 08:56:47 +01:00
'url' => $uinfo [ 0 ][ 'url' ],
2013-12-15 23:00:47 +01:00
'protected' => false ,
'followers_count' => intval ( $countfollowers ),
2011-08-05 04:47:45 +02:00
'friends_count' => intval ( $countfriends ),
2014-01-13 20:03:05 +01:00
'created_at' => api_date ( $uinfo [ 0 ][ 'created' ]),
2011-08-05 14:17:18 +02:00
'favourites_count' => intval ( $starred ),
2014-01-13 20:03:05 +01:00
'utc_offset' => " 0 " ,
'time_zone' => 'UTC' ,
2013-12-15 23:00:47 +01:00
'statuses_count' => intval ( $countitms ),
2014-01-13 20:03:05 +01:00
'following' => (( $uinfo [ 0 ][ 'rel' ] == CONTACT_IS_FOLLOWER ) OR ( $uinfo [ 0 ][ 'rel' ] == CONTACT_IS_FRIEND )),
'verified' => true ,
2013-12-15 23:00:47 +01:00
'statusnet_blocking' => false ,
2011-04-21 17:03:31 +02:00
'notifications' => false ,
2013-12-15 23:00:47 +01: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' ],
2014-01-05 16:12:03 +01:00
'network' => $uinfo [ 0 ][ 'network' ],
2011-02-16 08:56:47 +01:00
);
2013-12-15 23:00:47 +01:00
2011-02-16 08:56:47 +01:00
return $ret ;
2013-12-15 23:00:47 +01:00
2011-02-16 08:56:47 +01:00
}
2011-04-21 17:03:31 +02:00
2011-07-31 09:53:46 +02:00
function api_item_get_user ( & $a , $item ) {
2012-03-18 17:52:51 +01:00
2013-12-20 23:07:11 +01:00
$author = q ( " SELECT * FROM unique_contacts WHERE url='%s' LIMIT 1 " ,
2013-12-15 23:00:47 +01:00
dbesc ( normalise_link ( $item [ 'author-link' ])));
2013-12-19 06:58:11 +01:00
if ( count ( $author ) == 0 ) {
2013-12-15 23:00:47 +01: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 06:58:11 +01:00
$author = q ( " SELECT id FROM unique_contacts WHERE url='%s' LIMIT 1 " ,
2013-12-15 23:00:47 +01:00
dbesc ( normalise_link ( $item [ 'author-link' ])));
2013-12-20 23:07:11 +01: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-08-01 01:35:53 +02:00
}
2011-07-31 09:53:46 +02:00
2013-12-19 06:58:11 +01: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 23:07:11 +01: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 06:58:11 +01: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 " ])
2014-01-15 20:35:34 +01:00
$status_user = api_get_user ( $a , $item [ " owner-link " ]);
2013-12-19 06:58:11 +01:00
else
2014-01-15 20:35:34 +01:00
$status_user = api_get_user ( $a , $item [ " author-link " ]);
$status_user [ " protected " ] = (( $item [ " allow_cid " ] != " " ) OR
( $item [ " allow_gid " ] != " " ) OR
( $item [ " deny_cid " ] != " " ) OR
2014-03-11 23:52:32 +01:00
( $item [ " deny_gid " ] != " " ) OR
$item [ " private " ]);
2014-01-15 20:35:34 +01:00
return ( $status_user );
2011-07-31 09:53:46 +02:00
}
2011-04-21 17:03:31 +02:00
/**
* load api $templatename for $type and replace $data array
*/
function api_apply_template ( $templatename , $type , $data ){
2011-06-21 02:16:13 +02:00
2011-08-01 01:35:53 +02:00
$a = get_app ();
2011-04-21 17:03:31 +02:00
switch ( $type ){
case " atom " :
2011-08-01 01:35:53 +02:00
case " rss " :
2011-04-21 17:03:31 +02:00
case " xml " :
2011-10-27 10:54:52 +02:00
$data = array_xmlify ( $data );
2011-05-11 13:37:13 +02:00
$tpl = get_markup_template ( " api_ " . $templatename . " _ " . $type . " .tpl " );
2013-01-24 02:07:55 +01: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 17:03:31 +02:00
$ret = replace_macros ( $tpl , $data );
break ;
case " json " :
$ret = $data ;
break ;
}
2014-01-08 01:14:58 +01:00
2011-04-21 17:03:31 +02:00
return $ret ;
}
2013-12-15 23:00:47 +01:00
2011-02-16 08:56:47 +01:00
/**
** TWITTER API
*/
2013-12-15 23:00:47 +01:00
2011-02-16 08:56:47 +01:00
/**
2013-12-15 23:00:47 +01: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 08:56:47 +01:00
* http :// developer . twitter . com / doc / get / account / verify_credentials
*/
2011-04-21 17:03:31 +02:00
function api_account_verify_credentials ( & $a , $type ){
2012-12-01 01:26:54 +01:00
if ( api_user () === false ) return false ;
2013-12-29 17:54:37 +01:00
unset ( $_REQUEST [ " user_id " ]);
unset ( $_GET [ " user_id " ]);
2014-01-05 16:12:03 +01:00
unset ( $_REQUEST [ " screen_name " ]);
unset ( $_GET [ " screen_name " ]);
$skip_status = ( x ( $_REQUEST , 'skip_status' ) ? $_REQUEST [ 'skip_status' ] : false );
2011-02-16 08:56:47 +01:00
$user_info = api_get_user ( $a );
2013-12-15 23:00:47 +01:00
2013-12-20 23:07:11 +01:00
// "verified" isn't used here in the standard
unset ( $user_info [ " verified " ]);
// - Adding last status
2014-01-05 16:12:03 +01:00
if ( ! $skip_status ) {
$user_info [ " status " ] = api_status_show ( $a , " raw " );
if ( ! count ( $user_info [ " status " ]))
unset ( $user_info [ " status " ]);
else
unset ( $user_info [ " status " ][ " user " ]);
}
2013-12-20 23:07:11 +01:00
2014-01-08 01:14:58 +01:00
// "uid" and "self" are only needed for some internal stuff, so remove it from here
2013-12-20 23:07:11 +01:00
unset ( $user_info [ " uid " ]);
unset ( $user_info [ " self " ]);
2011-04-21 17:03:31 +02:00
return api_apply_template ( " user " , $type , array ( '$user' => $user_info ));
2011-02-16 08:56:47 +01:00
}
api_register_func ( 'api/account/verify_credentials' , 'api_account_verify_credentials' , true );
2013-12-15 23:00:47 +01:00
2011-06-20 03:50:18 +02:00
2011-07-29 17:21:02 +02: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 06:52:50 +02:00
2012-02-22 08:35:50 +01:00
/*Waitman Gobble Mod*/
2014-04-22 15:56:28 +02:00
function api_statuses_mediap ( & $a , $type ) {
if ( api_user () === false ) {
logger ( 'api_statuses_update: no user' );
return false ;
}
$user_info = api_get_user ( $a );
$_REQUEST [ 'type' ] = 'wall' ;
$_REQUEST [ 'profile_uid' ] = api_user ();
$_REQUEST [ 'api_source' ] = true ;
$txt = requestdata ( 'status' );
//$txt = urldecode(requestdata('status'));
require_once ( 'library/HTMLPurifier.auto.php' );
require_once ( 'include/html2bbcode.php' );
if (( strpos ( $txt , '<' ) !== false ) || ( strpos ( $txt , '>' ) !== false )) {
2012-02-22 08:35:50 +01:00
$txt = html2bb_video ( $txt );
$config = HTMLPurifier_Config :: createDefault ();
2014-04-22 15:56:28 +02:00
$config -> set ( 'Cache.DefinitionImpl' , null );
2012-02-22 08:35:50 +01:00
$purifier = new HTMLPurifier ( $config );
2014-04-22 15:56:28 +02:00
$txt = $purifier -> purify ( $txt );
2012-02-22 08:35:50 +01:00
}
$txt = html2bbcode ( $txt );
2013-02-15 20:14:45 +01:00
2014-04-22 15:56:28 +02:00
$a -> argv [ 1 ] = $user_info [ 'screen_name' ]; //should be set to username?
2013-02-15 20:14:45 +01:00
2012-02-22 08:35:50 +01:00
$_REQUEST [ 'hush' ] = 'yeah' ; //tell wall_upload function to return img info instead of echo
2014-04-22 15:56:28 +02:00
require_once ( 'mod/wall_upload.php' );
2012-02-22 08:35:50 +01:00
$bebop = wall_upload_post ( $a );
2013-02-15 20:14:45 +01:00
2012-02-22 08:35:50 +01:00
//now that we have the img url in bbcode we can add it to the status and insert the wall item.
2014-04-22 15:56:28 +02:00
$_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 );
2012-02-22 08:35:50 +01:00
/*Waitman Gobble Mod*/
2011-06-20 05:13:24 +02:00
function api_statuses_update ( & $a , $type ) {
2012-12-01 01:26:54 +01:00
if ( api_user () === false ) {
2012-01-15 22:57:00 +01:00
logger ( 'api_statuses_update: no user' );
return false ;
}
2014-11-18 23:55:45 +01:00
2011-06-20 03:50:18 +02:00
$user_info = api_get_user ( $a );
// convert $_POST array items to the form we use for web posts.
2011-08-01 02:52:36 +02:00
// logger('api_post: ' . print_r($_POST,true));
2011-09-12 06:52:50 +02:00
if ( requestdata ( 'htmlstatus' )) {
require_once ( 'library/HTMLPurifier.auto.php' );
require_once ( 'include/html2bbcode.php' );
$txt = requestdata ( 'htmlstatus' );
if (( strpos ( $txt , '<' ) !== false ) || ( strpos ( $txt , '>' ) !== false )) {
2011-10-12 03:24:37 +02:00
$txt = html2bb_video ( $txt );
2011-09-12 06:52:50 +02:00
$config = HTMLPurifier_Config :: createDefault ();
$config -> set ( 'Cache.DefinitionImpl' , null );
$purifier = new HTMLPurifier ( $config );
$txt = $purifier -> purify ( $txt );
2012-01-15 22:57:00 +01:00
$_REQUEST [ 'body' ] = html2bbcode ( $txt );
2011-09-12 06:52:50 +02:00
}
}
else
2012-07-08 18:27:11 +02:00
$_REQUEST [ 'body' ] = requestdata ( 'status' );
2011-08-01 02:52:36 +02:00
2012-11-04 23:18:52 +01:00
$_REQUEST [ 'title' ] = requestdata ( 'title' );
2011-08-01 02:52:36 +02:00
$parent = requestdata ( 'in_reply_to_status_id' );
if ( ctype_digit ( $parent ))
2012-01-15 22:57:00 +01:00
$_REQUEST [ 'parent' ] = $parent ;
2011-08-01 02:52:36 +02:00
else
2012-01-15 22:57:00 +01:00
$_REQUEST [ 'parent_uri' ] = $parent ;
2011-08-01 02:52:36 +02:00
2011-07-29 17:21:02 +02:00
if ( requestdata ( 'lat' ) && requestdata ( 'long' ))
2012-01-15 22:57:00 +01:00
$_REQUEST [ 'coord' ] = sprintf ( " %s %s " , requestdata ( 'lat' ), requestdata ( 'long' ));
2012-12-01 01:26:54 +01:00
$_REQUEST [ 'profile_uid' ] = api_user ();
2012-06-26 02:45:33 +02:00
2012-06-17 05:41:23 +02:00
if ( $parent )
2012-01-15 22:57:00 +01:00
$_REQUEST [ 'type' ] = 'net-comment' ;
2012-04-22 19:37:25 +02:00
else {
2014-11-18 23:55:45 +01:00
// Check for throttling (maximum posts per day, week and month)
$throttle_day = get_config ( 'system' , 'throttle_limit_day' );
if ( $throttle_day > 0 ) {
$datefrom = date ( " Y-m-d H:i:s " , time () - 24 * 60 * 60 );
$r = q ( " SELECT COUNT(*) AS `posts_day` FROM `item` WHERE `uid`=%d AND `wall`
AND `created` > '%s' AND `id` = `parent` " ,
intval ( api_user ()), dbesc ( $datefrom ));
if ( $r )
$posts_day = $r [ 0 ][ " posts_day " ];
else
$posts_day = 0 ;
if ( $posts_day > $throttle_day ) {
logger ( 'Daily posting limit reached for user ' . api_user (), LOGGER_DEBUG );
die ( api_error ( $a , $type , sprintf ( t ( " Daily posting limit of %d posts reached. The post was rejected. " ), $throttle_day )));
}
}
$throttle_week = get_config ( 'system' , 'throttle_limit_week' );
if ( $throttle_week > 0 ) {
$datefrom = date ( " Y-m-d H:i:s " , time () - 24 * 60 * 60 * 7 );
$r = q ( " SELECT COUNT(*) AS `posts_week` FROM `item` WHERE `uid`=%d AND `wall`
AND `created` > '%s' AND `id` = `parent` " ,
intval ( api_user ()), dbesc ( $datefrom ));
if ( $r )
$posts_week = $r [ 0 ][ " posts_week " ];
else
$posts_week = 0 ;
if ( $posts_week > $throttle_week ) {
logger ( 'Weekly posting limit reached for user ' . api_user (), LOGGER_DEBUG );
die ( api_error ( $a , $type , sprintf ( t ( " Weekly posting limit of %d posts reached. The post was rejected. " ), $throttle_week )));
}
}
$throttle_month = get_config ( 'system' , 'throttle_limit_month' );
if ( $throttle_month > 0 ) {
$datefrom = date ( " Y-m-d H:i:s " , time () - 24 * 60 * 60 * 30 );
$r = q ( " SELECT COUNT(*) AS `posts_month` FROM `item` WHERE `uid`=%d AND `wall`
AND `created` > '%s' AND `id` = `parent` " ,
intval ( api_user ()), dbesc ( $datefrom ));
if ( $r )
$posts_month = $r [ 0 ][ " posts_month " ];
else
$posts_month = 0 ;
if ( $posts_month > $throttle_month ) {
logger ( 'Monthly posting limit reached for user ' . api_user (), LOGGER_DEBUG );
die ( api_error ( $a , $type , sprintf ( t ( " Monthly posting limit of %d posts reached. The post was rejected. " ), $throttle_month )));
}
}
2012-01-15 22:57:00 +01:00
$_REQUEST [ 'type' ] = 'wall' ;
2012-06-17 05:41:23 +02: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 19:37:25 +02:00
}
2011-06-20 03:50:18 +02:00
// set this so that the item_post() function is quiet and doesn't redirect or emit json
2012-01-15 22:57:00 +01:00
$_REQUEST [ 'api_source' ] = true ;
2011-06-20 03:50:18 +02:00
2014-09-28 17:23:01 +02:00
if ( ! x ( $_REQUEST , " source " ))
$_REQUEST [ " source " ] = api_source ();
2014-09-27 23:37:05 +02:00
2011-06-20 03:50:18 +02:00
// call out normal post function
require_once ( 'mod/item.php' );
2013-12-15 23:00:47 +01:00
item_post ( $a );
2011-06-20 03:50:18 +02:00
// this should output the last post (the one we just posted).
2011-06-20 06:08:51 +02:00
return api_status_show ( $a , $type );
2011-06-20 03:50:18 +02:00
}
api_register_func ( 'api/statuses/update' , 'api_statuses_update' , true );
2014-01-05 16:12:03 +01:00
api_register_func ( 'api/statuses/update_with_media' , 'api_statuses_update' , true );
2011-06-20 03:50:18 +02:00
2011-06-20 06:08:51 +02:00
function api_status_show ( & $a , $type ){
$user_info = api_get_user ( $a );
2014-01-08 01:14:58 +01:00
logger ( 'api_status_show: user_info: ' . print_r ( $user_info , true ), LOGGER_DEBUG );
2011-06-20 06:08:51 +02:00
// get last public wall message
2014-03-11 23:52:32 +01:00
$lastwall = q ( " SELECT `item`.*, `i`.`contact-id` as `reply_uid`, `i`.`author-link` AS `item-author`
FROM `item` , `item` as `i`
2014-01-13 20:03:05 +01:00
WHERE `item` . `contact-id` = % d
AND (( `item` . `author-link` IN ( '%s' , '%s' )) OR ( `item` . `owner-link` IN ( '%s' , '%s' )))
2011-06-20 06:08:51 +02:00
AND `i` . `id` = `item` . `parent`
2013-10-05 12:30:10 +02:00
AND `item` . `type` != 'activity'
2011-06-20 06:08:51 +02:00
AND `item` . `allow_cid` = '' AND `item` . `allow_gid` = '' AND `item` . `deny_cid` = '' AND `item` . `deny_gid` = ''
2013-10-05 12:30:10 +02:00
ORDER BY `item` . `created` DESC
2011-06-20 06:08:51 +02:00
LIMIT 1 " ,
2013-12-19 06:58:11 +01:00
intval ( $user_info [ 'cid' ]),
2014-01-13 20:03:05 +01:00
dbesc ( $user_info [ 'url' ]),
dbesc ( normalise_link ( $user_info [ 'url' ])),
dbesc ( $user_info [ 'url' ]),
dbesc ( normalise_link ( $user_info [ 'url' ]))
2011-06-20 06:08:51 +02:00
);
if ( count ( $lastwall ) > 0 ){
$lastwall = $lastwall [ 0 ];
2013-02-15 20:14:45 +01:00
2013-12-15 23:00:47 +01:00
$in_reply_to_status_id = NULL ;
$in_reply_to_user_id = NULL ;
2014-01-13 20:03:05 +01:00
$in_reply_to_status_id_str = NULL ;
$in_reply_to_user_id_str = NULL ;
2013-12-15 23:00:47 +01:00
$in_reply_to_screen_name = NULL ;
2014-07-22 00:33:48 +02:00
if ( intval ( $lastwall [ 'parent' ]) != intval ( $lastwall [ 'id' ])) {
2014-01-13 20:03:05 +01:00
$in_reply_to_status_id = intval ( $lastwall [ 'parent' ]);
$in_reply_to_status_id_str = ( string ) intval ( $lastwall [ 'parent' ]);
2013-12-19 06:58:11 +01:00
$r = q ( " SELECT * FROM unique_contacts WHERE `url` = '%s' " , dbesc ( normalise_link ( $lastwall [ 'item-author' ])));
if ( $r ) {
2014-01-02 22:29:44 +01: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' ]);
2014-01-13 20:03:05 +01:00
$in_reply_to_user_id = intval ( $r [ 0 ][ 'id' ]);
$in_reply_to_user_id_str = ( string ) intval ( $r [ 0 ][ 'id' ]);
2013-12-19 06:58:11 +01:00
}
2013-02-15 20:14:45 +01:00
}
2014-01-08 01:14:58 +01:00
2014-07-22 00:33:48 +02:00
// There seems to be situation, where both fields are identical:
// https://github.com/friendica/friendica/issues/1010
// This is a bugfix for that.
if ( intval ( $in_reply_to_status_id ) == intval ( $lastwall [ 'id' ])) {
logger ( 'api_status_show: this message should never appear: id: ' . $lastwall [ 'id' ] . ' similar to reply-to: ' . $in_reply_to_status_id , LOGGER_DEBUG );
$in_reply_to_status_id = NULL ;
$in_reply_to_user_id = NULL ;
$in_reply_to_status_id_str = NULL ;
$in_reply_to_user_id_str = NULL ;
$in_reply_to_screen_name = NULL ;
}
2015-01-01 18:31:50 +01:00
$converted = api_convert_item ( $item );
2011-06-20 06:08:51 +02:00
$status_info = array (
2015-01-01 18:31:50 +01:00
'text' => $converted [ " text " ],
2011-06-20 06:08:51 +02:00
'truncated' => false ,
2012-03-18 17:52:51 +01:00
'created_at' => api_date ( $lastwall [ 'created' ]),
2011-06-20 06:08:51 +02:00
'in_reply_to_status_id' => $in_reply_to_status_id ,
2014-01-13 20:03:05 +01:00
'in_reply_to_status_id_str' => $in_reply_to_status_id_str ,
2012-03-18 17:52:51 +01:00
'source' => (( $lastwall [ 'app' ]) ? $lastwall [ 'app' ] : 'web' ),
2014-01-13 20:03:05 +01:00
'id' => intval ( $lastwall [ 'id' ]),
'id_str' => ( string ) $lastwall [ 'id' ],
2011-06-20 06:08:51 +02:00
'in_reply_to_user_id' => $in_reply_to_user_id ,
2014-01-13 20:03:05 +01:00
'in_reply_to_user_id_str' => $in_reply_to_user_id_str ,
2011-06-20 06:08:51 +02:00
'in_reply_to_screen_name' => $in_reply_to_screen_name ,
2013-12-15 23:00:47 +01:00
'geo' => NULL ,
2014-12-31 12:34:32 +01:00
'favorited' => $lastwall [ 'starred' ] ? true : false ,
2013-12-15 23:00:47 +01:00
'user' => $user_info ,
2015-01-01 18:31:50 +01:00
'statusnet_html' => $converted [ " html " ],
2013-12-15 23:00:47 +01:00
'statusnet_conversation_id' => $lastwall [ 'parent' ],
2011-06-20 06:08:51 +02:00
);
2013-12-15 23:00:47 +01:00
2015-01-01 18:31:50 +01:00
if ( count ( $converted [ " attachments " ]) > 0 )
$status_info [ " attachments " ] = $converted [ " attachments " ];
2014-03-20 18:44:24 +01:00
2015-01-01 18:31:50 +01:00
if ( count ( $converted [ " entities " ]) > 0 )
$status_info [ " entities " ] = $converted [ " entities " ];
2014-02-02 09:54:33 +01:00
2013-12-23 14:06:53 +01: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' ]) . ')' );
2014-01-08 01:14:58 +01:00
// "uid" and "self" are only needed for some internal stuff, so remove it from here
2013-12-15 23:00:47 +01:00
unset ( $status_info [ " user " ][ " uid " ]);
unset ( $status_info [ " user " ][ " self " ]);
2011-06-20 06:08:51 +02:00
}
2013-12-15 23:00:47 +01:00
2013-12-20 23:07:11 +01:00
if ( $type == " raw " )
return ( $status_info );
2011-06-20 06:08:51 +02:00
return api_apply_template ( " status " , $type , array ( '$status' => $status_info ));
2013-12-15 23:00:47 +01:00
2011-06-20 06:08:51 +02:00
}
2013-12-15 23:00:47 +01:00
2011-02-16 08:56:47 +01: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 17:03:31 +02:00
function api_users_show ( & $a , $type ){
2011-02-16 08:56:47 +01:00
$user_info = api_get_user ( $a );
2013-12-15 23:00:47 +01:00
$lastwall = q ( " SELECT `item`.*
FROM `item` , `contact`
2014-04-22 15:56:28 +02:00
WHERE `item` . `uid` = % d AND `verb` = '%s' AND `item` . `contact-id` = % d
2014-01-13 20:03:05 +01:00
AND (( `item` . `author-link` IN ( '%s' , '%s' )) OR ( `item` . `owner-link` IN ( '%s' , '%s' )))
2013-12-15 23:00:47 +01:00
AND `contact` . `id` = `item` . `contact-id`
2011-04-21 17:03:31 +02:00
AND `type` != 'activity'
AND `item` . `allow_cid` = '' AND `item` . `allow_gid` = '' AND `item` . `deny_cid` = '' AND `item` . `deny_gid` = ''
2013-12-15 23:00:47 +01:00
ORDER BY `created` DESC
2011-04-21 17:03:31 +02:00
LIMIT 1 " ,
2014-03-09 09:19:14 +01:00
intval ( api_user ()),
2014-04-22 15:56:28 +02:00
dbesc ( ACTIVITY_POST ),
2013-12-19 06:58:11 +01:00
intval ( $user_info [ 'cid' ]),
2014-01-13 20:03:05 +01:00
dbesc ( $user_info [ 'url' ]),
dbesc ( normalise_link ( $user_info [ 'url' ])),
dbesc ( $user_info [ 'url' ]),
dbesc ( normalise_link ( $user_info [ 'url' ]))
2011-02-15 12:24:21 +01:00
);
2011-04-21 17:03:31 +02:00
if ( count ( $lastwall ) > 0 ){
$lastwall = $lastwall [ 0 ];
2013-12-15 23:00:47 +01:00
$in_reply_to_status_id = NULL ;
$in_reply_to_user_id = NULL ;
2014-01-13 20:03:05 +01:00
$in_reply_to_status_id_str = NULL ;
$in_reply_to_user_id_str = NULL ;
2013-12-15 23:00:47 +01:00
$in_reply_to_screen_name = NULL ;
2011-04-21 17:03:31 +02:00
if ( $lastwall [ 'parent' ] != $lastwall [ 'id' ]) {
2013-12-19 06:58:11 +01:00
$reply = q ( " SELECT `item`.`id`, `item`.`contact-id` as `reply_uid`, `contact`.`nick` as `reply_author`, `item`.`author-link` AS `item-author`
2014-04-22 15:56:28 +02:00
FROM `item` , `contact` WHERE `contact` . `id` = `item` . `contact-id` AND `item` . `id` = % d " , intval( $lastwall['parent'] ));
2013-12-15 23:00:47 +01:00
if ( count ( $reply ) > 0 ) {
2014-01-13 20:03:05 +01:00
$in_reply_to_status_id = intval ( $lastwall [ 'parent' ]);
$in_reply_to_status_id_str = ( string ) intval ( $lastwall [ 'parent' ]);
2013-12-19 06:58:11 +01:00
$r = q ( " SELECT * FROM unique_contacts WHERE `url` = '%s' " , dbesc ( normalise_link ( $reply [ 0 ][ 'item-author' ])));
if ( $r ) {
2014-01-02 22:29:44 +01: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' ]);
2014-01-13 20:03:05 +01:00
$in_reply_to_user_id = intval ( $r [ 0 ][ 'id' ]);
$in_reply_to_user_id_str = ( string ) intval ( $r [ 0 ][ 'id' ]);
2013-12-19 06:58:11 +01:00
}
2013-12-15 23:00:47 +01:00
}
2013-02-15 20:14:45 +01:00
}
2015-01-01 18:31:50 +01:00
$converted = api_convert_item ( $item );
2011-04-21 17:03:31 +02:00
$user_info [ 'status' ] = array (
2015-01-01 18:31:50 +01:00
'text' => $converted [ " text " ],
2011-04-21 17:03:31 +02:00
'truncated' => false ,
2013-12-15 23:00:47 +01:00
'created_at' => api_date ( $lastwall [ 'created' ]),
2011-04-21 17:03:31 +02:00
'in_reply_to_status_id' => $in_reply_to_status_id ,
2014-01-13 20:03:05 +01:00
'in_reply_to_status_id_str' => $in_reply_to_status_id_str ,
2013-12-15 23:00:47 +01:00
'source' => (( $lastwall [ 'app' ]) ? $lastwall [ 'app' ] : 'web' ),
2014-01-13 20:03:05 +01:00
'id' => intval ( $lastwall [ 'contact-id' ]),
'id_str' => ( string ) $lastwall [ 'contact-id' ],
2011-04-21 17:03:31 +02:00
'in_reply_to_user_id' => $in_reply_to_user_id ,
2014-01-13 20:03:05 +01:00
'in_reply_to_user_id_str' => $in_reply_to_user_id_str ,
2011-04-21 17:03:31 +02:00
'in_reply_to_screen_name' => $in_reply_to_screen_name ,
2013-12-15 23:00:47 +01:00
'geo' => NULL ,
2014-12-31 12:34:32 +01:00
'favorited' => $lastwall [ 'starred' ] ? true : false ,
2015-01-01 18:31:50 +01:00
'statusnet_html' => $converted [ " html " ],
2013-12-15 23:00:47 +01:00
'statusnet_conversation_id' => $lastwall [ 'parent' ],
2011-04-21 17:03:31 +02:00
);
2013-12-23 14:06:53 +01:00
2015-01-01 18:31:50 +01:00
if ( count ( $converted [ " attachments " ]) > 0 )
$user_info [ " status " ][ " attachments " ] = $converted [ " attachments " ];
2014-12-31 17:01:55 +01:00
2015-01-01 18:31:50 +01:00
if ( count ( $converted [ " entities " ]) > 0 )
$user_info [ " status " ][ " entities " ] = $converted [ " entities " ];
2014-02-02 09:54:33 +01:00
2013-12-23 14:06:53 +01: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 17:03:31 +02:00
}
2013-12-15 23:00:47 +01:00
2014-01-08 01:14:58 +01:00
// "uid" and "self" are only needed for some internal stuff, so remove it from here
2013-12-15 23:00:47 +01:00
unset ( $user_info [ " uid " ]);
unset ( $user_info [ " self " ]);
2011-04-21 17:03:31 +02:00
return api_apply_template ( " user " , $type , array ( '$user' => $user_info ));
2012-04-22 18:00:24 +02:00
2011-02-15 12:24:21 +01:00
}
api_register_func ( 'api/users/show' , 'api_users_show' );
2012-04-22 18:00:24 +02:00
2014-09-07 07:32:09 +02:00
function api_users_search ( & $a , $type ) {
$page = ( x ( $_REQUEST , 'page' ) ? $_REQUEST [ 'page' ] - 1 : 0 );
$userlist = array ();
if ( isset ( $_GET [ " q " ])) {
$r = q ( " SELECT id FROM unique_contacts WHERE name='%s' " , dbesc ( $_GET [ " q " ]));
if ( ! count ( $r ))
$r = q ( " SELECT id FROM unique_contacts WHERE nick='%s' " , dbesc ( $_GET [ " q " ]));
if ( count ( $r )) {
foreach ( $r AS $user ) {
$user_info = api_get_user ( $a , $user [ " id " ]);
//echo print_r($user_info, true)."\n";
$userdata = api_apply_template ( " user " , $type , array ( 'user' => $user_info ));
$userlist [] = $userdata [ " user " ];
}
$userlist = array ( " users " => $userlist );
} else
die ( api_error ( $a , $type , t ( " User not found. " )));
} else
die ( api_error ( $a , $type , t ( " User not found. " )));
return ( $userlist );
}
api_register_func ( 'api/users/search' , 'api_users_search' );
2011-02-15 12:24:21 +01:00
/**
2012-04-22 18:00:24 +02:00
*
2011-02-15 12:24:21 +01:00
* http :// developer . twitter . com / doc / get / statuses / home_timeline
2012-04-22 18:00:24 +02:00
*
2011-04-21 17:03:31 +02:00
* TODO : Optional parameters
* TODO : Add reply info
2011-02-15 12:24:21 +01:00
*/
2011-04-21 17:03:31 +02:00
function api_statuses_home_timeline ( & $a , $type ){
2012-12-01 01:26:54 +01:00
if ( api_user () === false ) return false ;
2012-04-22 18:00:24 +02:00
2013-12-29 17:54:37 +01:00
unset ( $_REQUEST [ " user_id " ]);
unset ( $_GET [ " user_id " ]);
2014-01-05 16:12:03 +01:00
unset ( $_REQUEST [ " screen_name " ]);
unset ( $_GET [ " screen_name " ]);
2011-02-16 08:56:47 +01:00
$user_info = api_get_user ( $a );
2011-02-15 12:24:21 +01:00
// get last newtork messages
2011-08-01 01:35:53 +02:00
2011-08-26 16:35:51 +02:00
2011-08-19 14:57:54 +02:00
// params
2011-08-19 20:33:34 +02:00
$count = ( x ( $_REQUEST , 'count' ) ? $_REQUEST [ 'count' ] : 20 );
$page = ( x ( $_REQUEST , 'page' ) ? $_REQUEST [ 'page' ] - 1 : 0 );
if ( $page < 0 ) $page = 0 ;
2012-03-18 17:52:51 +01:00
$since_id = ( x ( $_REQUEST , 'since_id' ) ? $_REQUEST [ 'since_id' ] : 0 );
2012-03-18 19:00:24 +01:00
$max_id = ( x ( $_REQUEST , 'max_id' ) ? $_REQUEST [ 'max_id' ] : 0 );
2012-03-18 17:52:51 +01:00
//$since_id = 0;//$since_id = (x($_REQUEST,'since_id')?$_REQUEST['since_id']:0);
2013-06-16 13:28:04 +02:00
$exclude_replies = ( x ( $_REQUEST , 'exclude_replies' ) ? 1 : 0 );
2013-06-16 13:42:43 +02:00
$conversation_id = ( x ( $_REQUEST , 'conversation_id' ) ? $_REQUEST [ 'conversation_id' ] : 0 );
2012-04-22 18:00:24 +02:00
2011-08-19 14:57:54 +02:00
$start = $page * $count ;
2012-06-19 16:15:19 +02:00
$sql_extra = '' ;
2012-03-18 19:00:24 +01:00
if ( $max_id > 0 )
2012-06-19 16:15:19 +02:00
$sql_extra .= ' AND `item`.`id` <= ' . intval ( $max_id );
if ( $exclude_replies > 0 )
$sql_extra .= ' AND `item`.`parent` = `item`.`id`' ;
2013-06-16 13:42:43 +02:00
if ( $conversation_id > 0 )
$sql_extra .= ' AND `item`.`parent` = ' . intval ( $conversation_id );
2012-03-18 19:00:24 +01:00
2013-12-23 14:06:53 +01:00
$r = q ( " SELECT `item`.*, `item`.`id` AS `item_id`, `item`.`network` AS `item_network`,
2011-08-01 01:35:53 +02: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`
2014-04-22 15:56:28 +02:00
WHERE `item` . `uid` = % d AND `verb` = '%s'
2012-01-24 05:56:11 +01:00
AND `item` . `visible` = 1 and `item` . `moderated` = 0 AND `item` . `deleted` = 0
2011-08-01 01:35:53 +02:00
AND `contact` . `id` = `item` . `contact-id`
AND `contact` . `blocked` = 0 AND `contact` . `pending` = 0
$sql_extra
2011-08-19 20:33:34 +02:00
AND `item` . `id` >% d
2014-02-02 09:54:33 +01:00
ORDER BY `item` . `id` DESC LIMIT % d , % d " ,
2013-12-15 23:00:47 +01:00
intval ( api_user ()),
2014-04-22 15:56:28 +02:00
dbesc ( ACTIVITY_POST ),
2011-08-19 20:33:34 +02:00
intval ( $since_id ),
2011-08-19 16:55:43 +02:00
intval ( $start ), intval ( $count )
2011-08-01 01:35:53 +02:00
);
$ret = api_format_items ( $r , $user_info );
2012-08-13 04:29:37 +02: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
2014-12-31 12:34:32 +01:00
// at the network timeline just mark everything seen.
2013-12-15 23:00:47 +01:00
2014-12-31 12:34:32 +01:00
$r = q ( " UPDATE `item` SET `unseen` = 0
2012-08-13 04:29:37 +02:00
WHERE `unseen` = 1 AND `uid` = % d " ,
2013-12-15 23:00:47 +01:00
//intval($user_info['uid'])
intval ( api_user ())
2012-08-13 04:29:37 +02:00
);
2012-04-22 18:00:24 +02:00
2011-08-01 01:35:53 +02:00
$data = array ( '$statuses' => $ret );
switch ( $type ){
case " atom " :
case " rss " :
$data = api_rss_extra ( $a , $data , $user_info );
2012-04-08 17:23:38 +02:00
break ;
case " as " :
2012-04-08 17:51:05 +02:00
$as = api_format_as ( $a , $ret , $user_info );
2012-04-08 20:19:14 +02:00
$as [ 'title' ] = $a -> config [ 'sitename' ] . " Home Timeline " ;
$as [ 'link' ][ 'url' ] = $a -> get_baseurl () . " / " . $user_info [ " screen_name " ] . " /all " ;
2012-04-08 17:23:38 +02:00
return ( $as );
break ;
2011-08-01 01:35:53 +02:00
}
2012-04-22 18:00:24 +02:00
2011-08-01 01:35:53 +02: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 20:19:14 +02:00
function api_statuses_public_timeline ( & $a , $type ){
2012-12-01 01:26:54 +01:00
if ( api_user () === false ) return false ;
2012-04-22 18:00:24 +02:00
2012-04-08 20:19:14 +02: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 13:28:04 +02:00
$exclude_replies = ( x ( $_REQUEST , 'exclude_replies' ) ? 1 : 0 );
2013-06-16 13:42:43 +02:00
$conversation_id = ( x ( $_REQUEST , 'conversation_id' ) ? $_REQUEST [ 'conversation_id' ] : 0 );
2012-04-22 18:00:24 +02:00
2012-04-08 20:19:14 +02:00
$start = $page * $count ;
if ( $max_id > 0 )
$sql_extra = 'AND `item`.`id` <= ' . intval ( $max_id );
2013-06-16 13:28:04 +02:00
if ( $exclude_replies > 0 )
$sql_extra .= ' AND `item`.`parent` = `item`.`id`' ;
2013-06-16 13:42:43 +02:00
if ( $conversation_id > 0 )
$sql_extra .= ' AND `item`.`parent` = ' . intval ( $conversation_id );
2012-04-08 20:19:14 +02:00
2014-04-22 15:56:28 +02:00
$r = q ( " SELECT `item`.*, `item`.`id` AS `item_id`, `item`.`network` AS `item_network`,
`contact` . `name` , `contact` . `photo` , `contact` . `url` , `contact` . `rel` ,
`contact` . `network` , `contact` . `thumb` , `contact` . `self` , `contact` . `writable` ,
`contact` . `id` AS `cid` , `contact` . `uid` AS `contact-uid` ,
`user` . `nickname` , `user` . `hidewall`
FROM `item` STRAIGHT_JOIN `contact` ON `contact` . `id` = `item` . `contact-id`
STRAIGHT_JOIN `user` ON `user` . `uid` = `item` . `uid`
WHERE `verb` = '%s' AND `item` . `visible` = 1 AND `item` . `deleted` = 0 and `item` . `moderated` = 0
AND `item` . `allow_cid` = '' AND `item` . `allow_gid` = ''
AND `item` . `deny_cid` = '' AND `item` . `deny_gid` = ''
AND `item` . `private` = 0 AND `item` . `wall` = 1 AND `user` . `hidewall` = 0
AND `contact` . `blocked` = 0 AND `contact` . `pending` = 0
2012-04-08 20:19:14 +02:00
$sql_extra
AND `item` . `id` >% d
2014-04-22 15:56:28 +02:00
ORDER BY `item` . `id` DESC LIMIT % d , % d " ,
dbesc ( ACTIVITY_POST ),
2012-04-08 20:19:14 +02:00
intval ( $since_id ),
2014-04-22 15:56:28 +02:00
intval ( $start ),
intval ( $count ));
2012-04-08 20:19:14 +02:00
$ret = api_format_items ( $r , $user_info );
2012-04-22 18:00:24 +02:00
2012-04-08 20:19:14 +02: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 18:00:24 +02:00
2012-04-08 20:19:14 +02:00
return api_apply_template ( " timeline " , $type , $data );
}
api_register_func ( 'api/statuses/public_timeline' , 'api_statuses_public_timeline' , true );
2012-03-18 17:52:51 +01:00
/**
2014-12-31 12:34:32 +01:00
*
2012-03-18 17:52:51 +01:00
*/
function api_statuses_show ( & $a , $type ){
2012-12-01 01:26:54 +01:00
if ( api_user () === false ) return false ;
2012-03-18 17:52:51 +01:00
$user_info = api_get_user ( $a );
// params
$id = intval ( $a -> argv [ 3 ]);
2013-12-15 23:00:47 +01:00
if ( $id == 0 )
$id = intval ( $_REQUEST [ " id " ]);
2014-01-13 20:03:05 +01:00
// Hotot workaround
if ( $id == 0 )
$id = intval ( $a -> argv [ 4 ]);
2012-04-22 18:00:24 +02:00
logger ( 'API: api_statuses_show: ' . $id );
2012-03-18 17:52:51 +01:00
2012-06-22 13:35:36 +02:00
$conversation = ( x ( $_REQUEST , 'conversation' ) ? 1 : 0 );
$sql_extra = '' ;
if ( $conversation )
2013-12-15 23:00:47 +01:00
$sql_extra .= " AND `item`.`parent` = %d ORDER BY `received` ASC " ;
2012-06-22 13:35:36 +02:00
else
$sql_extra .= " AND `item`.`id` = %d " ;
2012-03-18 17:52:51 +01:00
2013-12-23 14:06:53 +01:00
$r = q ( " SELECT `item`.*, `item`.`id` AS `item_id`, `item`.`network` AS `item_network`,
2012-03-18 17:52:51 +01: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
2014-07-26 15:01:01 +02:00
AND `contact` . `id` = `item` . `contact-id` AND `item` . `uid` = % d AND `item` . `verb` = '%s'
2012-03-18 17:52:51 +01:00
AND `contact` . `blocked` = 0 AND `contact` . `pending` = 0
2012-06-22 13:35:36 +02:00
$sql_extra " ,
2014-07-26 15:01:01 +02:00
intval ( api_user ()),
dbesc ( ACTIVITY_POST ),
2012-03-18 17:52:51 +01:00
intval ( $id )
);
2012-06-22 13:35:36 +02:00
2013-12-20 23:07:11 +01:00
if ( ! $r )
die ( api_error ( $a , $type , t ( " There is no status with this id. " )));
2012-03-18 17:52:51 +01:00
$ret = api_format_items ( $r , $user_info );
2012-06-22 13:35:36 +02:00
if ( $conversation ) {
2012-06-21 10:53:48 +02:00
$data = array ( '$statuses' => $ret );
2012-06-22 13:35:36 +02:00
return api_apply_template ( " timeline " , $type , $data );
2012-06-21 10:53:48 +02: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 17:52:51 +01:00
}
api_register_func ( 'api/statuses/show' , 'api_statuses_show' , true );
2011-08-01 01:35:53 +02:00
2012-04-08 00:02:25 +02:00
2014-01-15 20:35:34 +01:00
/**
*
*/
function api_conversation_show ( & $a , $type ){
if ( api_user () === false ) return false ;
$user_info = api_get_user ( $a );
// params
$id = intval ( $a -> argv [ 3 ]);
$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 );
$start = $page * $count ;
if ( $id == 0 )
$id = intval ( $_REQUEST [ " id " ]);
// Hotot workaround
if ( $id == 0 )
$id = intval ( $a -> argv [ 4 ]);
logger ( 'API: api_conversation_show: ' . $id );
$sql_extra = '' ;
if ( $max_id > 0 )
$sql_extra = ' AND `item`.`id` <= ' . intval ( $max_id );
$r = q ( " SELECT `item`.*, `item`.`id` AS `item_id`, `item`.`network` AS `item_network`,
`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` INNER JOIN ( SELECT `uri` , `parent` FROM `item` WHERE `id` = % d ) AS `temp1`
ON ( `item` . `thr-parent` = `temp1` . `uri` AND `item` . `parent` = `temp1` . `parent` ), `contact`
WHERE `item` . `visible` = 1 and `item` . `moderated` = 0 AND `item` . `deleted` = 0
2014-04-22 15:56:28 +02:00
AND `item` . `uid` = % d AND `item` . `verb` = '%s' AND `contact` . `id` = `item` . `contact-id`
2014-01-15 20:35:34 +01:00
AND `contact` . `blocked` = 0 AND `contact` . `pending` = 0
AND `item` . `id` >% d $sql_extra
2014-02-02 09:54:33 +01:00
ORDER BY `item` . `id` DESC LIMIT % d , % d " ,
2014-01-15 20:35:34 +01:00
intval ( $id ), intval ( api_user ()),
2014-04-22 15:56:28 +02:00
dbesc ( ACTIVITY_POST ),
intval ( $since_id ),
intval ( $start ), intval ( $count )
2014-01-15 20:35:34 +01:00
);
if ( ! $r )
die ( api_error ( $a , $type , t ( " There is no conversation with this id. " )));
$ret = api_format_items ( $r , $user_info );
$data = array ( '$statuses' => $ret );
return api_apply_template ( " timeline " , $type , $data );
}
api_register_func ( 'api/conversation/show' , 'api_conversation_show' , true );
2012-04-08 00:02:25 +02:00
/**
2014-01-08 01:14:58 +01:00
*
2012-04-08 00:02:25 +02:00
*/
function api_statuses_repeat ( & $a , $type ){
2014-01-08 01:14:58 +01:00
global $called_api ;
2012-12-01 01:26:54 +01:00
if ( api_user () === false ) return false ;
2012-04-08 00:02:25 +02:00
$user_info = api_get_user ( $a );
// params
$id = intval ( $a -> argv [ 3 ]);
2013-12-15 23:00:47 +01:00
if ( $id == 0 )
$id = intval ( $_REQUEST [ " id " ]);
2014-01-13 20:03:05 +01:00
// Hotot workaround
if ( $id == 0 )
$id = intval ( $a -> argv [ 4 ]);
2012-06-04 08:08:45 +02:00
logger ( 'API: api_statuses_repeat: ' . $id );
2012-04-08 00:02:25 +02:00
2013-12-23 14:06:53 +01:00
$r = q ( " SELECT `item`.*, `item`.`id` AS `item_id`, `item`.`network` AS `item_network`, `contact`.`nick` as `reply_author`,
2012-12-30 21:30:39 +01:00
`contact` . `name` , `contact` . `photo` as `reply_photo` , `contact` . `url` as `reply_url` , `contact` . `rel` ,
2012-04-08 00:02:25 +02: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 08:08:45 +02:00
if ( $r [ 0 ][ 'body' ] != " " ) {
2013-10-15 00:49:49 +02:00
if ( ! intval ( get_config ( 'system' , 'old_share' ))) {
2014-01-08 01:14:58 +01:00
if ( strpos ( $r [ 0 ][ 'body' ], " [/share] " ) !== false ) {
$pos = strpos ( $r [ 0 ][ 'body' ], " [share " );
$post = substr ( $r [ 0 ][ 'body' ], $pos );
} else {
$post = " [share author=' " . str_replace ( " ' " , " ' " , $r [ 0 ][ 'author-name' ]) .
" ' profile=' " . $r [ 0 ][ 'author-link' ] .
" ' avatar=' " . $r [ 0 ][ 'author-avatar' ] .
" ' link=' " . $r [ 0 ][ 'plink' ] . " '] " ;
$post .= $r [ 0 ][ 'body' ];
$post .= " [/share] " ;
}
2012-12-30 21:30:39 +01:00
$_REQUEST [ 'body' ] = $post ;
} else
$_REQUEST [ 'body' ] = html_entity_decode ( " ♲ " , ENT_QUOTES , 'UTF-8' ) . " [url= " . $r [ 0 ][ 'reply_url' ] . " ] " . $r [ 0 ][ 'reply_author' ] . " [/url] \n " . $r [ 0 ][ 'body' ];
2012-12-01 01:26:54 +01:00
$_REQUEST [ 'profile_uid' ] = api_user ();
2012-06-04 08:08:45 +02:00
$_REQUEST [ 'type' ] = 'wall' ;
$_REQUEST [ 'api_source' ] = true ;
2012-04-08 00:02:25 +02:00
2014-09-28 17:23:01 +02:00
if ( ! x ( $_REQUEST , " source " ))
$_REQUEST [ " source " ] = api_source ();
2014-09-27 23:37:05 +02:00
2012-06-04 08:08:45 +02:00
require_once ( 'mod/item.php' );
item_post ( $a );
}
2012-04-08 00:02:25 +02:00
2014-01-08 01:14:58 +01:00
// this should output the last post (the one we just posted).
$called_api = null ;
return ( api_status_show ( $a , $type ));
2012-04-08 00:02:25 +02:00
}
api_register_func ( 'api/statuses/retweet' , 'api_statuses_repeat' , true );
/**
2014-01-08 01:14:58 +01:00
*
2012-04-08 00:02:25 +02:00
*/
function api_statuses_destroy ( & $a , $type ){
2012-12-01 01:26:54 +01:00
if ( api_user () === false ) return false ;
2012-04-08 00:02:25 +02:00
$user_info = api_get_user ( $a );
// params
$id = intval ( $a -> argv [ 3 ]);
2013-12-15 23:00:47 +01:00
if ( $id == 0 )
$id = intval ( $_REQUEST [ " id " ]);
2014-01-13 20:03:05 +01:00
// Hotot workaround
if ( $id == 0 )
$id = intval ( $a -> argv [ 4 ]);
2012-06-04 08:08:45 +02:00
logger ( 'API: api_statuses_destroy: ' . $id );
2012-04-08 00:02:25 +02:00
2014-01-08 01:14:58 +01:00
$ret = api_statuses_show ( $a , $type );
2012-04-08 00:02:25 +02:00
require_once ( 'include/items.php' );
drop_item ( $id , false );
2014-01-08 01:14:58 +01:00
return ( $ret );
2012-04-08 00:02:25 +02:00
}
api_register_func ( 'api/statuses/destroy' , 'api_statuses_destroy' , true );
/**
2014-12-31 12:34:32 +01:00
*
2012-04-08 00:02:25 +02:00
* http :// developer . twitter . com / doc / get / statuses / mentions
2014-12-31 12:34:32 +01:00
*
2012-04-08 00:02:25 +02:00
*/
function api_statuses_mentions ( & $a , $type ){
2012-12-01 01:26:54 +01:00
if ( api_user () === false ) return false ;
2013-12-15 23:00:47 +01:00
2013-12-29 17:54:37 +01:00
unset ( $_REQUEST [ " user_id " ]);
unset ( $_GET [ " user_id " ]);
2014-01-05 16:12:03 +01:00
unset ( $_REQUEST [ " screen_name " ]);
unset ( $_GET [ " screen_name " ]);
2012-04-08 00:02:25 +02:00
$user_info = api_get_user ( $a );
// get last newtork messages
// params
$count = ( x ( $_REQUEST , 'count' ) ? $_REQUEST [ 'count' ] : 20 );
$page = ( x ( $_REQUEST , 'page' ) ? $_REQUEST [ 'page' ] - 1 : 0 );
if ( $page < 0 ) $page = 0 ;
$since_id = ( x ( $_REQUEST , 'since_id' ) ? $_REQUEST [ 'since_id' ] : 0 );
$max_id = ( x ( $_REQUEST , 'max_id' ) ? $_REQUEST [ 'max_id' ] : 0 );
//$since_id = 0;//$since_id = (x($_REQUEST,'since_id')?$_REQUEST['since_id']:0);
2012-05-26 03:21:07 +02:00
2012-04-08 00:02:25 +02:00
$start = $page * $count ;
2013-12-20 23:07:11 +01:00
// Ugly code - should be changed
2012-04-08 00:02:25 +02:00
$myurl = $a -> get_baseurl () . '/profile/' . $a -> user [ 'nickname' ];
$myurl = substr ( $myurl , strpos ( $myurl , '://' ) + 3 );
2013-01-13 14:50:55 +01:00
//$myurl = str_replace(array('www.','.'),array('','\\.'),$myurl);
$myurl = str_replace ( 'www.' , '' , $myurl );
2012-04-08 00:02:25 +02:00
$diasp_url = str_replace ( '/profile/' , '/u/' , $myurl );
2012-05-26 03:21:07 +02:00
2012-04-08 00:02:25 +02:00
if ( $max_id > 0 )
2014-04-22 15:56:28 +02:00
$sql_extra = ' AND `item`.`id` <= ' . intval ( $max_id );
2012-04-08 00:02:25 +02:00
2013-12-23 14:06:53 +01:00
$r = q ( " SELECT `item`.*, `item`.`id` AS `item_id`, `item`.`network` AS `item_network`,
2012-04-08 00:02:25 +02: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`
2014-04-22 15:56:28 +02:00
WHERE `item` . `uid` = % d AND `verb` = '%s'
AND NOT ( `item` . `author-link` IN ( 'https://%s' , 'http://%s' ))
2012-04-08 00:02:25 +02:00
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
2014-09-28 00:42:27 +02:00
AND `item` . `parent` IN ( SELECT `iid` from thread where uid = % d AND `mention` AND ! `ignored` )
2012-04-08 00:02:25 +02:00
$sql_extra
AND `item` . `id` >% d
2014-02-02 09:54:33 +01:00
ORDER BY `item` . `id` DESC LIMIT % d , % d " ,
2014-04-22 15:56:28 +02:00
intval ( api_user ()),
dbesc ( ACTIVITY_POST ),
dbesc ( protect_sprintf ( $myurl )),
dbesc ( protect_sprintf ( $myurl )),
2013-12-15 23:00:47 +01:00
intval ( api_user ()),
2012-04-08 00:02:25 +02:00
intval ( $since_id ),
intval ( $start ), intval ( $count )
);
$ret = api_format_items ( $r , $user_info );
2012-04-22 18:00:24 +02:00
2012-04-08 00:02:25 +02:00
$data = array ( '$statuses' => $ret );
switch ( $type ){
case " atom " :
case " rss " :
$data = api_rss_extra ( $a , $data , $user_info );
2012-04-08 17:51:05 +02:00
break ;
case " as " :
$as = api_format_as ( $a , $ret , $user_info );
$as [ " title " ] = $a -> config [ 'sitename' ] . " Mentions " ;
2012-04-08 20:19:14 +02:00
$as [ 'link' ][ 'url' ] = $a -> get_baseurl () . " / " ;
2012-04-08 17:51:05 +02:00
return ( $as );
break ;
2012-04-08 00:02:25 +02:00
}
2012-04-22 18:00:24 +02:00
2012-04-08 00:02:25 +02: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 19:00:24 +01:00
2011-08-01 01:35:53 +02:00
function api_statuses_user_timeline ( & $a , $type ){
2012-12-01 01:26:54 +01:00
if ( api_user () === false ) return false ;
2011-08-01 01:35:53 +02:00
2013-12-15 23:00:47 +01:00
$user_info = api_get_user ( $a );
// get last network messages
2011-08-26 16:35:51 +02:00
2012-12-01 01:26:54 +01:00
logger ( " api_statuses_user_timeline: api_user: " . api_user () .
2011-08-26 16:35:51 +02:00
" \n user_info: " . print_r ( $user_info , true ) .
" \n _REQUEST: " . print_r ( $_REQUEST , true ),
LOGGER_DEBUG );
2011-08-19 14:57:54 +02:00
// params
2011-08-19 20:33:34 +02:00
$count = ( x ( $_REQUEST , 'count' ) ? $_REQUEST [ 'count' ] : 20 );
$page = ( x ( $_REQUEST , 'page' ) ? $_REQUEST [ 'page' ] - 1 : 0 );
if ( $page < 0 ) $page = 0 ;
2012-03-18 17:52:51 +01: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 13:28:04 +02:00
$exclude_replies = ( x ( $_REQUEST , 'exclude_replies' ) ? 1 : 0 );
2013-06-16 13:42:43 +02:00
$conversation_id = ( x ( $_REQUEST , 'conversation_id' ) ? $_REQUEST [ 'conversation_id' ] : 0 );
2013-06-16 13:28:04 +02:00
2011-08-19 14:57:54 +02:00
$start = $page * $count ;
2012-06-19 16:27:23 +02:00
$sql_extra = '' ;
2013-12-29 17:54:37 +01:00
if ( $user_info [ 'self' ] == 1 )
$sql_extra .= " AND `item`.`wall` = 1 " ;
2013-06-16 13:28:04 +02:00
if ( $exclude_replies > 0 )
$sql_extra .= ' AND `item`.`parent` = `item`.`id`' ;
2013-06-16 13:42:43 +02:00
if ( $conversation_id > 0 )
$sql_extra .= ' AND `item`.`parent` = ' . intval ( $conversation_id );
2011-08-19 14:57:54 +02:00
2013-12-23 14:06:53 +01:00
$r = q ( " SELECT `item`.*, `item`.`id` AS `item_id`, `item`.`network` AS `item_network`,
2011-08-01 01:35:53 +02: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`
2014-04-22 15:56:28 +02:00
WHERE `item` . `uid` = % d AND `verb` = '%s'
2011-08-26 16:35:51 +02:00
AND `item` . `contact-id` = % d
2012-01-24 05:56:11 +01:00
AND `item` . `visible` = 1 and `item` . `moderated` = 0 AND `item` . `deleted` = 0
2011-08-01 01:35:53 +02:00
AND `contact` . `id` = `item` . `contact-id`
AND `contact` . `blocked` = 0 AND `contact` . `pending` = 0
$sql_extra
2011-08-19 20:33:34 +02:00
AND `item` . `id` >% d
2014-02-02 09:54:33 +01:00
ORDER BY `item` . `id` DESC LIMIT % d , % d " ,
2012-12-01 01:26:54 +01:00
intval ( api_user ()),
2014-04-22 15:56:28 +02:00
dbesc ( ACTIVITY_POST ),
2013-12-15 23:00:47 +01:00
intval ( $user_info [ 'cid' ]),
2011-08-19 20:33:34 +02:00
intval ( $since_id ),
2011-08-19 16:55:43 +02:00
intval ( $start ), intval ( $count )
2011-08-01 01:35:53 +02:00
);
2013-12-15 23:00:47 +01:00
$ret = api_format_items ( $r , $user_info , true );
2012-04-22 18:00:24 +02:00
2011-08-01 01:35:53 +02:00
$data = array ( '$statuses' => $ret );
switch ( $type ){
case " atom " :
case " rss " :
$data = api_rss_extra ( $a , $data , $user_info );
}
2012-04-22 18:00:24 +02:00
2011-08-01 01:35:53 +02:00
return api_apply_template ( " timeline " , $type , $data );
}
api_register_func ( 'api/statuses/user_timeline' , 'api_statuses_user_timeline' , true );
2014-12-31 12:34:32 +01:00
/**
* Star / unstar an item
* param : id : id of the item
*
* api v1 : https :// web . archive . org / web / 20131019055350 / https :// dev . twitter . com / docs / api / 1 / post / favorites / create /% 3 Aid
*/
function api_favorites_create_destroy ( & $a , $type ){
if ( api_user () === false ) return false ;
# for versioned api.
# TODO: we need a better global soluton
$action_argv_id = 2 ;
if ( $a -> argv [ 1 ] == " 1.1 " ) $action_argv_id = 3 ;
if ( $a -> argc <= $action_argv_id ) die ( api_error ( $a , $type , t ( " Invalid request. " )));
$action = str_replace ( " . " . $type , " " , $a -> argv [ $action_argv_id ]);
if ( $a -> argc == $action_argv_id + 2 ) {
$itemid = intval ( $a -> argv [ $action_argv_id + 1 ]);
} else {
$itemid = intval ( $_REQUEST [ 'id' ]);
}
$item = q ( " SELECT * FROM item WHERE id=%d AND uid=%d " ,
$itemid , api_user ());
if ( $item === false || count ( $item ) == 0 ) die ( api_error ( $a , $type , t ( " Invalid item. " )));
switch ( $action ){
case " create " :
$item [ 0 ][ 'starred' ] = 1 ;
break ;
case " destroy " :
$item [ 0 ][ 'starred' ] = 0 ;
break ;
2014-12-31 18:08:11 +01:00
default :
die ( api_error ( $a , $type , t ( " Invalid action. " . $action )));
2014-12-31 12:34:32 +01:00
}
2014-12-31 18:08:11 +01:00
$r = q ( " UPDATE item SET starred=%d WHERE id=%d AND uid=%d " ,
$item [ 0 ][ 'starred' ], $itemid , api_user ());
q ( " UPDATE thread SET starred=%d WHERE iid=%d AND uid=%d " ,
$item [ 0 ][ 'starred' ], $itemid , api_user ());
2014-12-31 12:34:32 +01:00
if ( $r === false ) die ( api_error ( $a , $type , t ( " DB error " )));
$user_info = api_get_user ( $a );
2015-01-27 18:21:32 +01:00
$rets = api_format_items ( $item , $user_info );
$ret = $rets [ 0 ];
2014-12-31 12:34:32 +01:00
$data = array ( '$status' => $ret );
switch ( $type ){
case " atom " :
case " rss " :
$data = api_rss_extra ( $a , $data , $user_info );
}
2014-12-31 18:08:11 +01:00
return api_apply_template ( " status " , $type , $data );
2014-12-31 12:34:32 +01:00
}
api_register_func ( 'api/favorites/create' , 'api_favorites_create_destroy' , true );
api_register_func ( 'api/favorites/destroy' , 'api_favorites_create_destroy' , true );
2011-08-01 01:35:53 +02:00
function api_favorites ( & $a , $type ){
2013-12-29 17:54:37 +01:00
global $called_api ;
2012-12-01 01:26:54 +01:00
if ( api_user () === false ) return false ;
2012-04-22 18:00:24 +02:00
2013-12-29 17:54:37 +01:00
$called_api = array ();
2011-08-01 01:35:53 +02:00
$user_info = api_get_user ( $a );
2013-12-29 17:54:37 +01:00
2012-02-19 19:34:48 +01:00
// in friendica starred item are private
2011-08-26 16:35:51 +02:00
// return favorites only for self
logger ( 'api_favorites: self:' . $user_info [ 'self' ]);
2012-04-22 18:00:24 +02:00
2011-08-26 16:35:51 +02:00
if ( $user_info [ 'self' ] == 0 ) {
$ret = array ();
} else {
2014-01-05 16:12:03 +01:00
$sql_extra = " " ;
2012-04-22 18:00:24 +02:00
2011-08-26 16:35:51 +02:00
// params
2014-01-05 16:12:03 +01:00
$since_id = ( x ( $_REQUEST , 'since_id' ) ? $_REQUEST [ 'since_id' ] : 0 );
$max_id = ( x ( $_REQUEST , 'max_id' ) ? $_REQUEST [ 'max_id' ] : 0 );
2011-08-26 16:35:51 +02:00
$count = ( x ( $_GET , 'count' ) ? $_GET [ 'count' ] : 20 );
$page = ( x ( $_REQUEST , 'page' ) ? $_REQUEST [ 'page' ] - 1 : 0 );
if ( $page < 0 ) $page = 0 ;
2012-04-22 18:00:24 +02:00
2011-08-26 16:35:51 +02:00
$start = $page * $count ;
2014-01-05 16:12:03 +01:00
if ( $max_id > 0 )
$sql_extra .= ' AND `item`.`id` <= ' . intval ( $max_id );
2013-12-23 14:06:53 +01:00
$r = q ( " SELECT `item`.*, `item`.`id` AS `item_id`, `item`.`network` AS `item_network`,
2011-08-26 16:35:51 +02: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`
2014-12-31 12:34:32 +01:00
WHERE `item` . `uid` = % d
2012-01-24 05:56:11 +01:00
AND `item` . `visible` = 1 and `item` . `moderated` = 0 AND `item` . `deleted` = 0
2011-08-26 16:35:51 +02:00
AND `item` . `starred` = 1
AND `contact` . `id` = `item` . `contact-id`
AND `contact` . `blocked` = 0 AND `contact` . `pending` = 0
$sql_extra
2014-01-05 16:12:03 +01:00
AND `item` . `id` >% d
2014-02-02 09:54:33 +01:00
ORDER BY `item` . `id` DESC LIMIT % d , % d " ,
2013-12-15 23:00:47 +01:00
intval ( api_user ()),
2014-01-05 16:12:03 +01:00
intval ( $since_id ),
2011-08-26 16:35:51 +02:00
intval ( $start ), intval ( $count )
);
2011-08-01 01:35:53 +02:00
2011-08-26 16:35:51 +02:00
$ret = api_format_items ( $r , $user_info );
2012-04-22 18:00:24 +02:00
2011-08-26 16:35:51 +02:00
}
2012-04-22 18:00:24 +02:00
2011-08-01 01:35:53 +02:00
$data = array ( '$statuses' => $ret );
switch ( $type ){
case " atom " :
case " rss " :
$data = api_rss_extra ( $a , $data , $user_info );
}
2012-04-22 18:00:24 +02:00
2011-08-01 01:35:53 +02:00
return api_apply_template ( " timeline " , $type , $data );
}
api_register_func ( 'api/favorites' , 'api_favorites' , true );
2014-12-31 12:34:32 +01:00
2012-04-08 17:51:05 +02: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 " ];
2014-04-22 15:56:28 +02:00
$singleitem [ " statusnet:notice_info " ][ " source " ] = $item [ " source " ];
$singleitem [ " statusnet:notice_info " ][ " favorite " ] = " false " ;
$singleitem [ " statusnet:notice_info " ][ " repeated " ] = " false " ;
//$singleitem["original"] = $item;
$items [] = $singleitem ;
2012-04-08 17:51:05 +02:00
}
$as [ 'items' ] = $items ;
2012-04-08 20:19:14 +02:00
$as [ 'link' ][ 'url' ] = $a -> get_baseurl () . " / " . $user_info [ " screen_name " ] . " /all " ;
$as [ 'link' ][ 'rel' ] = " alternate " ;
$as [ 'link' ][ 'type' ] = " text/html " ;
2012-04-08 17:51:05 +02:00
return ( $as );
}
2012-04-22 18:00:24 +02:00
2012-06-26 08:54:01 +02:00
function api_format_messages ( $item , $recipient , $sender ) {
// standard meta information
$ret = Array (
'id' => $item [ 'id' ],
'sender_id' => $sender [ 'id' ] ,
2013-12-15 23:00:47 +01:00
'text' => " " ,
2012-06-26 08:54:01 +02:00
'recipient_id' => $recipient [ 'id' ],
2013-12-15 23:00:47 +01:00
'created_at' => api_date ( $item [ 'created' ]),
'sender_screen_name' => $sender [ 'screen_name' ],
2012-06-26 08:54:01 +02:00
'recipient_screen_name' => $recipient [ 'screen_name' ],
2013-12-15 23:00:47 +01:00
'sender' => $sender ,
2012-06-26 08:54:01 +02:00
'recipient' => $recipient ,
);
2014-01-08 01:14:58 +01:00
// "uid" and "self" are only needed for some internal stuff, so remove it from here
2013-12-15 23:00:47 +01:00
unset ( $ret [ " sender " ][ " uid " ]);
unset ( $ret [ " sender " ][ " self " ]);
unset ( $ret [ " recipient " ][ " uid " ]);
unset ( $ret [ " recipient " ][ " self " ]);
2012-06-26 08:54:01 +02: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 23:00:47 +01:00
$ret [ 'text' ] = bbcode ( $item [ 'body' ], false , false );
2012-06-26 08:54:01 +02:00
}
elseif ( $_GET [ " getText " ] == " plain " ) {
2013-12-15 23:00:47 +01:00
//$ret['text'] = html2plain(bbcode($item['body'], false, false, true), 0);
2014-01-02 22:29:44 +01:00
$ret [ 'text' ] = trim ( html2plain ( bbcode ( api_clean_plain_items ( $item [ 'body' ]), false , false , 2 , true ), 0 ));
2012-06-26 08:54:01 +02:00
}
}
else {
2014-01-02 22:29:44 +01:00
$ret [ 'text' ] = $item [ 'title' ] . " \n " . html2plain ( bbcode ( api_clean_plain_items ( $item [ 'body' ]), false , false , 2 , true ), 0 );
2012-06-26 08:54:01 +02:00
}
if ( isset ( $_GET [ " getUserObjects " ]) && $_GET [ " getUserObjects " ] == " false " ) {
unset ( $ret [ 'sender' ]);
unset ( $ret [ 'recipient' ]);
}
return $ret ;
}
2015-01-01 18:31:50 +01:00
function api_convert_item ( $item ) {
$body = $item [ 'body' ];
$attachments = api_get_attachments ( $body );
// Workaround for ostatus messages where the title is identically to the body
$html = bbcode ( api_clean_plain_items ( $body ), false , false , 2 , true );
$statusbody = trim ( html2plain ( $html , 0 ));
// handle data: images
$statusbody = api_format_items_embeded_images ( $item , $statusbody );
$statustitle = trim ( $item [ 'title' ]);
if (( $statustitle != '' ) and ( strpos ( $statusbody , $statustitle ) !== false ))
$statustext = trim ( $statusbody );
else
$statustext = trim ( $statustitle . " \n \n " . $statusbody );
if (( $item [ " network " ] == NETWORK_FEED ) and ( strlen ( $statustext ) > 1000 ))
$statustext = substr ( $statustext , 0 , 1000 ) . " ... \n " . $item [ " plink " ];
$statushtml = trim ( bbcode ( $body , false , false ));
if ( $item [ 'title' ] != " " )
$statushtml = " <h4> " . bbcode ( $item [ 'title' ]) . " </h4> \n " . $statushtml ;
2014-12-31 17:01:55 +01:00
2015-01-01 18:31:50 +01:00
$entities = api_get_entitities ( $statustext , $body );
return ( array ( " text " => $statustext , " html " => $statushtml , " attachments " => $attachments , " entities " => $entities ));
}
function api_get_attachments ( & $body ) {
$text = $body ;
2014-12-31 17:01:55 +01:00
$text = preg_replace ( " / \ [img \ =([0-9]*)x([0-9]*) \ ](.*?) \ [ \ /img \ ]/ism " , '[img]$3[/img]' , $text );
$URLSearchString = " ^ \ [ \ ] " ;
$ret = preg_match_all ( " / \ [img \ ]([ $URLSearchString ]*) \ [ \ /img \ ]/ism " , $text , $images );
if ( ! $ret )
return false ;
require_once ( " include/Photo.php " );
$attachments = array ();
foreach ( $images [ 1 ] AS $image ) {
$imagedata = get_photo_info ( $image );
if ( $imagedata )
$attachments [] = array ( " url " => $image , " mimetype " => $imagedata [ " mime " ], " size " => $imagedata [ " size " ]);
}
2015-01-01 18:31:50 +01:00
if ( strstr ( $_SERVER [ 'HTTP_USER_AGENT' ], " AndStatus " ))
foreach ( $images [ 0 ] AS $orig )
$body = str_replace ( $orig , " " , $body );
2014-12-31 17:01:55 +01:00
return $attachments ;
}
2014-06-16 22:36:59 +02:00
function api_get_entitities ( & $text , $bbcode ) {
2014-02-02 09:54:33 +01:00
/*
To - Do :
* Links at the first character of the post
*/
2014-06-16 22:36:59 +02:00
$a = get_app ();
2014-02-12 01:41:45 +01:00
$include_entities = strtolower ( x ( $_REQUEST , 'include_entities' ) ? $_REQUEST [ 'include_entities' ] : " false " );
2014-02-02 09:54:33 +01:00
2014-06-16 22:36:59 +02:00
if ( $include_entities != " true " ) {
2014-08-13 00:13:13 +02:00
require_once ( " mod/proxy.php " );
2014-02-02 09:54:33 +01:00
2014-08-13 00:13:13 +02:00
preg_match_all ( " / \ [img](.*?) \ [ \ /img \ ]/ism " , $bbcode , $images );
2014-06-16 22:36:59 +02:00
2014-08-13 00:13:13 +02:00
foreach ( $images [ 1 ] AS $image ) {
$replace = proxy_url ( $image );
$text = str_replace ( $image , $replace , $text );
2014-06-16 22:36:59 +02:00
}
return array ();
}
2014-06-16 21:49:45 +02:00
2014-02-22 15:42:34 +01:00
$bbcode = bb_CleanPictureLinks ( $bbcode );
2014-02-11 23:43:34 +01:00
// Change pure links in text to bbcode uris
$bbcode = preg_replace ( " /([^ \ ] \ =' " . '"' . " ]|^)(https? \ : \ / \ /[a-zA-Z0-9 \ : \ / \ - \ ? \ & \ ; \ . \ = \ _ \ ~ \ # \ % \$ \ ! \ + \ ,]+)/ism " , '$1[url=$2]$2[/url]' , $bbcode );
2014-02-02 09:54:33 +01:00
$entities = array ();
$entities [ " hashtags " ] = array ();
$entities [ " symbols " ] = array ();
$entities [ " urls " ] = array ();
$entities [ " user_mentions " ] = array ();
2014-02-12 01:41:45 +01:00
$URLSearchString = " ^ \ [ \ ] " ;
2014-02-13 08:30:40 +01:00
$bbcode = preg_replace ( " /# \ [url \ =([ $URLSearchString ]*) \ ](.*?) \ [ \ /url \ ]/ism " , '#$2' , $bbcode );
2014-02-12 01:41:45 +01:00
$bbcode = preg_replace ( " / \ [bookmark \ =([ $URLSearchString ]*) \ ](.*?) \ [ \ /bookmark \ ]/ism " , '[url=$1]$2[/url]' , $bbcode );
2014-02-02 09:54:33 +01:00
//$bbcode = preg_replace("/\[url\](.*?)\[\/url\]/ism",'[url=$1]$1[/url]',$bbcode);
$bbcode = preg_replace ( " / \ [video \ ](.*?) \ [ \ /video \ ]/ism " , '[url=$1]$1[/url]' , $bbcode );
2014-02-11 23:43:34 +01:00
$bbcode = preg_replace ( " / \ [youtube \ ]([A-Za-z0-9 \ -_=]+)(.*?) \ [ \ /youtube \ ]/ism " ,
'[url=https://www.youtube.com/watch?v=$1]https://www.youtube.com/watch?v=$1[/url]' , $bbcode );
2014-02-02 09:54:33 +01:00
$bbcode = preg_replace ( " / \ [youtube \ ](.*?) \ [ \ /youtube \ ]/ism " , '[url=$1]$1[/url]' , $bbcode );
2014-02-11 23:43:34 +01:00
2014-06-15 01:48:35 +02:00
$bbcode = preg_replace ( " / \ [vimeo \ ]([0-9]+)(.*?) \ [ \ /vimeo \ ]/ism " ,
2014-02-11 23:43:34 +01:00
'[url=https://vimeo.com/$1]https://vimeo.com/$1[/url]' , $bbcode );
2014-02-02 09:54:33 +01:00
$bbcode = preg_replace ( " / \ [vimeo \ ](.*?) \ [ \ /vimeo \ ]/ism " , '[url=$1]$1[/url]' , $bbcode );
2014-02-11 23:43:34 +01:00
2014-02-02 09:54:33 +01:00
$bbcode = preg_replace ( " / \ [img \ =([0-9]*)x([0-9]*) \ ](.*?) \ [ \ /img \ ]/ism " , '[img]$3[/img]' , $bbcode );
//preg_match_all("/\[url\]([$URLSearchString]*)\[\/url\]/ism", $bbcode, $urls1);
preg_match_all ( " / \ [url \ =([ $URLSearchString ]*) \ ](.*?) \ [ \ /url \ ]/ism " , $bbcode , $urls );
$ordered_urls = array ();
foreach ( $urls [ 1 ] AS $id => $url ) {
//$start = strpos($text, $url, $offset);
$start = iconv_strpos ( $text , $url , 0 , " UTF-8 " );
if ( ! ( $start === false ))
$ordered_urls [ $start ] = array ( " url " => $url , " title " => $urls [ 2 ][ $id ]);
}
ksort ( $ordered_urls );
$offset = 0 ;
//foreach ($urls[1] AS $id=>$url) {
foreach ( $ordered_urls AS $url ) {
if (( substr ( $url [ " title " ], 0 , 7 ) != " http:// " ) AND ( substr ( $url [ " title " ], 0 , 8 ) != " https:// " ) AND
! strpos ( $url [ " title " ], " http:// " ) AND ! strpos ( $url [ " title " ], " https:// " ))
$display_url = $url [ " title " ];
else {
$display_url = str_replace ( array ( " http://www. " , " https://www. " ), array ( " " , " " ), $url [ " url " ]);
$display_url = str_replace ( array ( " http:// " , " https:// " ), array ( " " , " " ), $display_url );
if ( strlen ( $display_url ) > 26 )
$display_url = substr ( $display_url , 0 , 25 ) . " … " ;
}
//$start = strpos($text, $url, $offset);
$start = iconv_strpos ( $text , $url [ " url " ], $offset , " UTF-8 " );
if ( ! ( $start === false )) {
$entities [ " urls " ][] = array ( " url " => $url [ " url " ],
" expanded_url " => $url [ " url " ],
" display_url " => $display_url ,
" indices " => array ( $start , $start + strlen ( $url [ " url " ])));
$offset = $start + 1 ;
}
}
preg_match_all ( " / \ [img](.*?) \ [ \ /img \ ]/ism " , $bbcode , $images );
$ordered_images = array ();
foreach ( $images [ 1 ] AS $image ) {
//$start = strpos($text, $url, $offset);
$start = iconv_strpos ( $text , $image , 0 , " UTF-8 " );
if ( ! ( $start === false ))
$ordered_images [ $start ] = $image ;
}
//$entities["media"] = array();
$offset = 0 ;
foreach ( $ordered_images AS $url ) {
$display_url = str_replace ( array ( " http://www. " , " https://www. " ), array ( " " , " " ), $url );
$display_url = str_replace ( array ( " http:// " , " https:// " ), array ( " " , " " ), $display_url );
if ( strlen ( $display_url ) > 26 )
$display_url = substr ( $display_url , 0 , 25 ) . " … " ;
$start = iconv_strpos ( $text , $url , $offset , " UTF-8 " );
if ( ! ( $start === false )) {
2014-06-16 21:49:45 +02:00
require_once ( " include/Photo.php " );
$image = get_photo_info ( $url );
2014-02-02 09:54:33 +01:00
if ( $image ) {
2014-08-13 00:13:13 +02:00
// If image cache is activated, then use the following sizes:
2014-06-16 21:49:45 +02:00
// thumb (150), small (340), medium (600) and large (1024)
2014-08-13 00:13:13 +02:00
if ( ! get_config ( " system " , " proxy_disabled " )) {
require_once ( " mod/proxy.php " );
$media_url = proxy_url ( $url );
2014-06-16 21:49:45 +02:00
$sizes = array ();
$scale = scale_image ( $image [ 0 ], $image [ 1 ], 150 );
$sizes [ " thumb " ] = array ( " w " => $scale [ " width " ], " h " => $scale [ " height " ], " resize " => " fit " );
if (( $image [ 0 ] > 150 ) OR ( $image [ 1 ] > 150 )) {
$scale = scale_image ( $image [ 0 ], $image [ 1 ], 340 );
$sizes [ " small " ] = array ( " w " => $scale [ " width " ], " h " => $scale [ " height " ], " resize " => " fit " );
}
$scale = scale_image ( $image [ 0 ], $image [ 1 ], 600 );
$sizes [ " medium " ] = array ( " w " => $scale [ " width " ], " h " => $scale [ " height " ], " resize " => " fit " );
if (( $image [ 0 ] > 600 ) OR ( $image [ 1 ] > 600 )) {
$scale = scale_image ( $image [ 0 ], $image [ 1 ], 1024 );
$sizes [ " large " ] = array ( " w " => $scale [ " width " ], " h " => $scale [ " height " ], " resize " => " fit " );
}
} else {
$media_url = $url ;
$sizes [ " medium " ] = array ( " w " => $image [ 0 ], " h " => $image [ 1 ], " resize " => " fit " );
}
2014-02-02 09:54:33 +01:00
$entities [ " media " ][] = array (
2014-02-11 23:43:34 +01:00
" id " => $start + 1 ,
" id_str " => ( string ) $start + 1 ,
2014-02-02 09:54:33 +01:00
" indices " => array ( $start , $start + strlen ( $url )),
2014-06-16 21:49:45 +02:00
" media_url " => normalise_link ( $media_url ),
" media_url_https " => $media_url ,
2014-02-02 09:54:33 +01:00
" url " => $url ,
" display_url " => $display_url ,
" expanded_url " => $url ,
" type " => " photo " ,
2014-06-16 21:49:45 +02:00
" sizes " => $sizes );
2014-02-02 09:54:33 +01:00
}
$offset = $start + 1 ;
}
}
return ( $entities );
}
2014-10-23 16:27:30 +02:00
function api_format_items_embeded_images ( $item , $text ){
$a = get_app ();
$text = preg_replace_callback (
" |data:image/([^;]+)[^=]+=*|m " ,
function ( $match ) use ( $a , $item ) {
return $a -> get_baseurl () . " /display/ " . $item [ 'guid' ];
},
$text );
return $text ;
}
2014-12-31 12:34:32 +01:00
2013-12-15 23:00:47 +01:00
function api_format_items ( $r , $user_info , $filter_user = false ) {
2011-08-01 05:01:00 +02:00
2011-08-01 01:35:53 +02:00
$a = get_app ();
2011-04-21 17:03:31 +02:00
$ret = Array ();
2011-02-15 12:24:21 +01:00
2011-02-16 08:56:47 +01:00
foreach ( $r as $item ) {
2015-01-25 00:01:58 +01:00
api_share_as_retweet ( $item );
2014-01-02 22:29:44 +01:00
2011-08-26 16:35:51 +02:00
localize_item ( $item );
2013-12-15 23:00:47 +01: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 17:52:51 +01:00
2013-12-15 23:00:47 +01: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 18:21:51 +01:00
if ( $r )
2014-01-13 20:03:05 +01:00
$in_reply_to_status_id = intval ( $r [ 0 ][ 'id' ]);
2012-03-18 18:21:51 +01:00
else
2014-01-13 20:03:05 +01:00
$in_reply_to_status_id = intval ( $item [ 'parent' ]);
$in_reply_to_status_id_str = ( string ) intval ( $item [ 'parent' ]);
2012-03-18 17:52:51 +01:00
2013-12-15 23:00:47 +01:00
$in_reply_to_screen_name = NULL ;
$in_reply_to_user_id = NULL ;
2014-01-13 20:03:05 +01:00
$in_reply_to_user_id_str = NULL ;
2012-03-18 18:21:51 +01:00
2013-12-15 23:00:47 +01: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 22:29:44 +01: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' ]);
2014-01-13 20:03:05 +01:00
$in_reply_to_user_id = intval ( $r [ 0 ][ 'id' ]);
$in_reply_to_user_id_str = ( string ) intval ( $r [ 0 ][ 'id' ]);
2013-12-15 23:00:47 +01:00
}
}
2012-03-18 17:52:51 +01:00
} else {
2013-12-15 23:00:47 +01:00
$in_reply_to_screen_name = NULL ;
$in_reply_to_user_id = NULL ;
$in_reply_to_status_id = NULL ;
2014-01-13 20:03:05 +01:00
$in_reply_to_user_id_str = NULL ;
$in_reply_to_status_id_str = NULL ;
2012-03-18 17:52:51 +01:00
}
2015-01-01 18:31:50 +01:00
$converted = api_convert_item ( $item );
2014-12-31 12:34:32 +01:00
2011-04-21 17:03:31 +02:00
$status = array (
2015-01-01 18:31:50 +01:00
'text' => $converted [ " text " ],
2011-02-15 12:24:21 +01:00
'truncated' => False ,
2012-03-18 17:52:51 +01:00
'created_at' => api_date ( $item [ 'created' ]),
2012-03-18 18:21:51 +01:00
'in_reply_to_status_id' => $in_reply_to_status_id ,
2014-06-08 18:36:06 +02:00
'in_reply_to_status_id_str' => $in_reply_to_status_id_str ,
2012-03-18 17:52:51 +01:00
'source' => (( $item [ 'app' ]) ? $item [ 'app' ] : 'web' ),
'id' => intval ( $item [ 'id' ]),
2014-01-13 20:03:05 +01:00
'id_str' => ( string ) intval ( $item [ 'id' ]),
2012-03-18 17:52:51 +01:00
'in_reply_to_user_id' => $in_reply_to_user_id ,
2014-06-08 18:36:06 +02:00
'in_reply_to_user_id_str' => $in_reply_to_user_id_str ,
2012-03-18 17:52:51 +01:00
'in_reply_to_screen_name' => $in_reply_to_screen_name ,
2013-12-15 23:00:47 +01:00
'geo' => NULL ,
2012-03-18 17:52:51 +01:00
'favorited' => $item [ 'starred' ] ? true : false ,
2011-06-21 11:41:16 +02:00
'user' => $status_user ,
2014-02-02 09:54:33 +01:00
//'entities' => NULL,
2015-01-01 18:31:50 +01:00
'statusnet_html' => $converted [ " html " ],
2012-04-11 19:31:01 +02:00
'statusnet_conversation_id' => $item [ 'parent' ],
2011-04-21 17:03:31 +02:00
);
2012-03-18 17:52:51 +01:00
2015-01-01 18:31:50 +01:00
if ( count ( $converted [ " attachments " ]) > 0 )
$status [ " attachments " ] = $converted [ " attachments " ];
2014-03-20 18:44:24 +01:00
2015-01-01 18:31:50 +01:00
if ( count ( $converted [ " entities " ]) > 0 )
$status [ " entities " ] = $converted [ " entities " ];
2014-02-02 09:54:33 +01:00
2013-12-23 14:06:53 +01: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 06:58:11 +01:00
// Retweets are only valid for top postings
2014-02-13 08:30:40 +01:00
// It doesn't work reliable with the link if its a feed
$IsRetweet = ( $item [ 'owner-link' ] != $item [ 'author-link' ]);
if ( $IsRetweet )
$IsRetweet = (( $item [ 'owner-name' ] != $item [ 'author-name' ]) OR ( $item [ 'owner-avatar' ] != $item [ 'author-avatar' ]));
if ( $IsRetweet AND ( $item [ " id " ] == $item [ " parent " ])) {
2013-12-19 06:58:11 +01:00
$retweeted_status = $status ;
$retweeted_status [ " user " ] = api_get_user ( $a , $item [ " author-link " ]);
$status [ " retweeted_status " ] = $retweeted_status ;
}
2014-01-08 01:14:58 +01:00
// "uid" and "self" are only needed for some internal stuff, so remove it from here
2013-12-15 23:00:47 +01:00
unset ( $status [ " user " ][ " uid " ]);
unset ( $status [ " user " ][ " self " ]);
// 'geo' => array('type' => 'Point',
2014-04-22 15:56:28 +02:00
// 'coordinates' => array((float) $notice->lat,
// (float) $notice->lon));
2012-03-18 17:52:51 +01:00
2013-12-15 23:00:47 +01:00
$ret [] = $status ;
2011-02-15 12:24:21 +01:00
};
2011-08-01 01:35:53 +02:00
return $ret ;
2011-02-16 08:56:47 +01:00
}
2011-08-01 01:35:53 +02:00
2011-06-21 02:16:13 +02:00
function api_account_rate_limit_status ( & $a , $type ) {
$hash = array (
2012-03-18 17:52:51 +01:00
'reset_time_in_seconds' => strtotime ( 'now + 1 hour' ),
2011-06-21 02:16:13 +02:00
'remaining_hits' => ( string ) 150 ,
'hourly_limit' => ( string ) 150 ,
2013-12-20 23:07:11 +01:00
'reset_time' => api_date ( datetime_convert ( 'UTC' , 'UTC' , 'now + 1 hour' , ATOM_TIME )),
2011-06-21 02:16:13 +02:00
);
2012-03-18 17:52:51 +01:00
if ( $type == " xml " )
$hash [ 'resettime_in_seconds' ] = $hash [ 'reset_time_in_seconds' ];
2011-06-21 02:16:13 +02: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 06:56:56 +02:00
2012-03-18 17:52:51 +01:00
function api_help_test ( & $a , $type ) {
if ( $type == 'xml' )
$ok = " true " ;
else
$ok = " ok " ;
2014-01-08 01:14:58 +01:00
return api_apply_template ( 'test' , $type , array ( " $ok " => $ok ));
2012-03-18 17:52:51 +01:00
}
2013-03-07 14:16:53 +01:00
api_register_func ( 'api/help/test' , 'api_help_test' , false );
2012-03-18 17:52:51 +01:00
2014-02-02 09:54:33 +01:00
function api_lists ( & $a , $type ) {
$ret = array ();
return array ( $ret );
}
api_register_func ( 'api/lists' , 'api_lists' , true );
function api_lists_list ( & $a , $type ) {
$ret = array ();
return array ( $ret );
}
api_register_func ( 'api/lists/list' , 'api_lists_list' , true );
2011-08-19 14:57:54 +02:00
/**
2014-01-08 01:14:58 +01:00
* https :// dev . twitter . com / docs / api / 1 / get / statuses / friends
2011-08-19 15:09:10 +02:00
* This function is deprecated by Twitter
2014-01-08 01:14:58 +01:00
* returns : json , xml
2011-08-19 14:57:54 +02:00
**/
function api_statuses_f ( & $a , $type , $qtype ) {
2012-12-01 01:26:54 +01:00
if ( api_user () === false ) return false ;
2011-08-19 14:57:54 +02:00
$user_info = api_get_user ( $a );
2013-12-15 23:00:47 +01:00
2011-08-19 15:09:10 +02: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 23:00:47 +01:00
2011-08-26 16:35:51 +02:00
/* $ret = Array ();
return array ( '$users' => $ret ); */
return false ;
2011-08-19 15:09:10 +02:00
}
2013-12-15 23:00:47 +01:00
2011-08-19 14:57:54 +02: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 23:00:47 +01:00
2014-01-05 16:12:03 +01:00
// friends and followers only for self
if ( $user_info [ 'self' ] == 0 )
$sql_extra = " AND false " ;
$r = q ( " SELECT `nurl` FROM `contact` WHERE `uid` = %d AND `self` = 0 AND `blocked` = 0 AND `pending` = 0 $sql_extra " ,
2012-12-01 01:26:54 +01:00
intval ( api_user ())
2011-08-19 14:57:54 +02:00
);
$ret = array ();
foreach ( $r as $cid ){
2014-01-05 16:12:03 +01:00
$user = api_get_user ( $a , $cid [ 'nurl' ]);
2014-01-08 01:14:58 +01:00
// "uid" and "self" are only needed for some internal stuff, so remove it from here
2013-12-15 23:00:47 +01:00
unset ( $user [ " uid " ]);
unset ( $user [ " self " ]);
if ( $user )
$ret [] = $user ;
2011-08-19 14:57:54 +02:00
}
2011-08-26 16:35:51 +02:00
return array ( '$users' => $ret );
2011-08-19 14:57:54 +02:00
}
function api_statuses_friends ( & $a , $type ){
2011-08-26 16:35:51 +02:00
$data = api_statuses_f ( $a , $type , " friends " );
if ( $data === false ) return false ;
return api_apply_template ( " friends " , $type , $data );
2011-08-19 14:57:54 +02:00
}
function api_statuses_followers ( & $a , $type ){
2011-08-26 16:35:51 +02:00
$data = api_statuses_f ( $a , $type , " followers " );
if ( $data === false ) return false ;
return api_apply_template ( " friends " , $type , $data );
2011-08-19 14:57:54 +02:00
}
api_register_func ( 'api/statuses/friends' , 'api_statuses_friends' , true );
api_register_func ( 'api/statuses/followers' , 'api_statuses_followers' , true );
2011-07-29 06:56:56 +02:00
function api_statusnet_config ( & $a , $type ) {
$name = $a -> config [ 'sitename' ];
$server = $a -> get_hostname ();
2012-02-19 19:34:48 +01:00
$logo = $a -> get_baseurl () . '/images/friendica-64.png' ;
2011-07-29 06:56:56 +02:00
$email = $a -> config [ 'admin_email' ];
$closed = (( $a -> config [ 'register_policy' ] == REGISTER_CLOSED ) ? 'true' : 'false' );
$private = (( $a -> config [ 'system' ][ 'block_public' ]) ? 'true' : 'false' );
2011-08-03 05:02:07 +02:00
$textlimit = ( string ) (( $a -> config [ 'max_import_size' ]) ? $a -> config [ 'max_import_size' ] : 200000 );
2011-08-03 05:08:40 +02:00
if ( $a -> config [ 'api_import_size' ])
$texlimit = string ( $a -> config [ 'api_import_size' ]);
2011-07-29 06:56:56 +02: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 23:07:11 +01:00
'logo' => $logo , 'fancy' => true , 'language' => 'en' , 'email' => $email , 'broughtby' => '' ,
'broughtbyurl' => '' , 'timezone' => 'UTC' , 'closed' => $closed , 'inviteonly' => false ,
2011-07-29 06:56:56 +02:00
'private' => $private , 'textlimit' => $textlimit , 'sslserver' => $sslserver , 'ssl' => $ssl ,
2012-06-23 22:52:50 +02:00
'shorturllength' => '30' ,
2013-12-20 23:07:11 +01: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 06:56:56 +02:00
),
2013-12-20 23:07:11 +01:00
);
2011-07-29 06:56:56 +02:00
return api_apply_template ( 'config' , $type , array ( '$config' => $config ));
}
2011-07-30 02:01:57 +02:00
api_register_func ( 'api/statusnet/config' , 'api_statusnet_config' , false );
2011-07-29 06:56:56 +02:00
2011-07-30 03:21:54 +02: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 07:22:34 +02:00
function api_ff_ids ( & $a , $type , $qtype ) {
2012-12-01 01:26:54 +01:00
if ( ! api_user ())
2011-08-01 07:22:34 +02:00
return false ;
2014-01-05 16:12:03 +01:00
$user_info = api_get_user ( $a );
2011-08-01 07:22:34 +02:00
if ( $qtype == 'friends' )
2011-08-08 01:15:54 +02:00
$sql_extra = sprintf ( " AND ( `rel` = %d OR `rel` = %d ) " , intval ( CONTACT_IS_SHARING ), intval ( CONTACT_IS_FRIEND ));
2011-08-01 07:22:34 +02:00
if ( $qtype == 'followers' )
2011-08-08 01:15:54 +02:00
$sql_extra = sprintf ( " AND ( `rel` = %d OR `rel` = %d ) " , intval ( CONTACT_IS_FOLLOWER ), intval ( CONTACT_IS_FRIEND ));
2011-08-01 07:22:34 +02:00
2014-01-05 16:12:03 +01:00
if ( ! $user_info [ " self " ])
$sql_extra = " AND false " ;
$stringify_ids = ( x ( $_REQUEST , 'stringify_ids' ) ? $_REQUEST [ 'stringify_ids' ] : false );
2013-12-19 06:58:11 +01: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-12-01 01:26:54 +01:00
intval ( api_user ())
2011-08-01 07:22:34 +02:00
);
if ( is_array ( $r )) {
2013-12-19 06:58:11 +01:00
2011-08-01 07:22:34 +02: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 " );
2014-01-05 16:12:03 +01:00
foreach ( $r as $rr )
if ( $stringify_ids )
$ret [] = $rr [ 'id' ];
else
$ret [] = intval ( $rr [ 'id' ]);
2011-08-01 07:22:34 +02:00
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 14:57:54 +02:00
2011-08-19 16:55:43 +02:00
function api_direct_messages_new ( & $a , $type ) {
2012-12-01 01:26:54 +01:00
if ( api_user () === false ) return false ;
2013-12-15 23:00:47 +01:00
2013-12-29 17:54:37 +01:00
if ( ! x ( $_POST , " text " ) OR ( ! x ( $_POST , " screen_name " ) AND ! x ( $_POST , " user_id " ))) return ;
2012-06-22 14:54:31 +02:00
2011-08-19 16:55:43 +02:00
$sender = api_get_user ( $a );
2013-12-15 23:00:47 +01:00
2012-06-25 15:53:56 +02:00
require_once ( " include/message.php " );
2013-12-29 17:54:37 +01:00
if ( $_POST [ 'screen_name' ]) {
2014-01-05 16:12:03 +01:00
$r = q ( " SELECT `id`, `nurl`, `network` FROM `contact` WHERE `uid`=%d AND `nick`='%s' " ,
2013-12-29 17:54:37 +01:00
intval ( api_user ()),
dbesc ( $_POST [ 'screen_name' ]));
2014-01-05 16:12:03 +01:00
// Selecting the id by priority, friendica first
api_best_nickname ( $r );
2013-12-29 17:54:37 +01:00
$recipient = api_get_user ( $a , $r [ 0 ][ 'nurl' ]);
} else
$recipient = api_get_user ( $a , $_POST [ 'user_id' ]);
2012-06-22 14:54:31 +02:00
$replyto = '' ;
2012-06-25 15:53:56 +02:00
$sub = '' ;
2012-06-22 14:54:31 +02:00
if ( x ( $_REQUEST , 'replyto' )) {
2012-06-25 16:25:34 +02:00
$r = q ( 'SELECT `parent-uri`, `title` FROM `mail` WHERE `uid`=%d AND `id`=%d' ,
2012-12-01 01:26:54 +01:00
intval ( api_user ()),
2012-06-22 14:54:31 +02:00
intval ( $_REQUEST [ 'replyto' ]));
2012-06-25 16:25:34 +02:00
$replyto = $r [ 0 ][ 'parent-uri' ];
2012-06-25 15:53:56 +02:00
$sub = $r [ 0 ][ 'title' ];
2012-06-22 14:54:31 +02:00
}
else {
2012-06-25 15:53:56 +02:00
if ( x ( $_REQUEST , 'title' )) {
$sub = $_REQUEST [ 'title' ];
}
else {
$sub = (( strlen ( $_POST [ 'text' ]) > 10 ) ? substr ( $_POST [ 'text' ], 0 , 10 ) . " ... " : $_POST [ 'text' ]);
}
2012-06-22 14:54:31 +02:00
}
2012-06-25 15:53:56 +02:00
2013-12-29 17:54:37 +01:00
$id = send_message ( $recipient [ 'cid' ], $_POST [ 'text' ], $sub , $replyto );
2011-08-19 16:55:43 +02:00
if ( $id >- 1 ) {
$r = q ( " SELECT * FROM `mail` WHERE id=%d " , intval ( $id ));
2012-06-26 08:54:01 +02:00
$ret = api_format_messages ( $r [ 0 ], $recipient , $sender );
2013-12-15 23:00:47 +01:00
2011-08-19 16:55:43 +02:00
} else {
2013-12-15 23:00:47 +01:00
$ret = array ( " error " => $id );
2011-08-19 16:55:43 +02:00
}
2013-12-15 23:00:47 +01:00
2011-08-19 16:55:43 +02:00
$data = Array ( '$messages' => $ret );
2013-12-15 23:00:47 +01:00
2011-08-19 16:55:43 +02:00
switch ( $type ){
case " atom " :
case " rss " :
$data = api_rss_extra ( $a , $data , $user_info );
}
2013-12-15 23:00:47 +01:00
2011-08-19 16:55:43 +02:00
return api_apply_template ( " direct_messages " , $type , $data );
2013-12-15 23:00:47 +01:00
2011-08-19 16:55:43 +02:00
}
api_register_func ( 'api/direct_messages/new' , 'api_direct_messages_new' , true );
2012-06-26 08:54:01 +02:00
function api_direct_messages_box ( & $a , $type , $box ) {
2012-12-01 01:26:54 +01:00
if ( api_user () === false ) return false ;
2013-12-15 23:00:47 +01:00
2011-08-19 16:55:43 +02:00
// params
$count = ( x ( $_GET , 'count' ) ? $_GET [ 'count' ] : 20 );
2011-08-19 20:33:34 +02:00
$page = ( x ( $_REQUEST , 'page' ) ? $_REQUEST [ 'page' ] - 1 : 0 );
if ( $page < 0 ) $page = 0 ;
2013-12-15 23:00:47 +01:00
2013-12-19 06:58:11 +01:00
$since_id = ( x ( $_REQUEST , 'since_id' ) ? $_REQUEST [ 'since_id' ] : 0 );
2014-01-05 16:12:03 +01:00
$max_id = ( x ( $_REQUEST , 'max_id' ) ? $_REQUEST [ 'max_id' ] : 0 );
2013-12-19 06:58:11 +01:00
2014-10-23 08:59:48 +02:00
$user_id = ( x ( $_REQUEST , 'user_id' ) ? $_REQUEST [ 'user_id' ] : " " );
$screen_name = ( x ( $_REQUEST , 'screen_name' ) ? $_REQUEST [ 'screen_name' ] : " " );
// caller user info
unset ( $_REQUEST [ " user_id " ]);
unset ( $_GET [ " user_id " ]);
2013-12-15 23:00:47 +01:00
2014-10-23 08:59:48 +02:00
unset ( $_REQUEST [ " screen_name " ]);
unset ( $_GET [ " screen_name " ]);
$user_info = api_get_user ( $a );
2013-12-20 23:07:11 +01:00
//$profile_url = $a->get_baseurl() . '/profile/' . $a->user['nickname'];
$profile_url = $user_info [ " url " ];
2014-10-23 08:59:48 +02:00
// pagination
$start = $page * $count ;
// filters
2011-08-19 16:55:43 +02:00
if ( $box == " sentbox " ) {
2013-12-27 14:11:13 +01:00
$sql_extra = " `mail`.`from-url`=' " . dbesc ( $profile_url ) . " ' " ;
2012-06-26 08:54:01 +02:00
}
elseif ( $box == " conversation " ) {
2013-12-27 14:11:13 +01:00
$sql_extra = " `mail`.`parent-uri`=' " . dbesc ( $_GET [ " uri " ] ) . " ' " ;
2012-06-26 08:54:01 +02:00
}
elseif ( $box == " all " ) {
$sql_extra = " true " ;
}
elseif ( $box == " inbox " ) {
2013-12-27 14:11:13 +01:00
$sql_extra = " `mail`.`from-url`!=' " . dbesc ( $profile_url ) . " ' " ;
2011-08-19 16:55:43 +02:00
}
2013-12-15 23:00:47 +01:00
2014-01-05 16:12:03 +01:00
if ( $max_id > 0 )
$sql_extra .= ' AND `mail`.`id` <= ' . intval ( $max_id );
2014-10-23 08:59:48 +02:00
if ( $user_id != " " ) {
$sql_extra .= ' AND `mail`.`contact-id` = ' . intval ( $user_id );
2014-12-31 12:34:32 +01:00
}
2014-10-23 08:59:48 +02:00
elseif ( $screen_name != " " ){
$sql_extra .= " AND `contact`.`nick` = ' " . dbesc ( $screen_name ) . " ' " ;
}
2014-02-02 09:54:33 +01: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`.`id` DESC LIMIT %d,%d " ,
2012-12-01 01:26:54 +01:00
intval ( api_user ()),
2013-12-19 06:58:11 +01:00
intval ( $since_id ),
2011-08-19 16:55:43 +02:00
intval ( $start ), intval ( $count )
2012-06-23 19:21:48 +02:00
);
2014-12-31 12:34:32 +01:00
2013-12-15 23:00:47 +01:00
2011-08-19 16:55:43 +02:00
$ret = Array ();
2012-06-26 08:54:01 +02:00
foreach ( $r as $item ) {
2012-06-23 19:29:58 +02:00
if ( $box == " inbox " || $item [ 'from-url' ] != $profile_url ){
2012-06-26 08:54:01 +02:00
$recipient = $user_info ;
2013-12-27 14:11:13 +01:00
$sender = api_get_user ( $a , normalise_link ( $item [ 'contact-url' ]));
2011-08-19 16:55:43 +02:00
}
2014-10-16 11:55:59 +02:00
elseif ( $box == " sentbox " || $item [ 'from-url' ] == $profile_url ){
2013-12-27 14:11:13 +01:00
$recipient = api_get_user ( $a , normalise_link ( $item [ 'contact-url' ]));
2012-06-26 08:54:01 +02:00
$sender = $user_info ;
2014-10-23 08:59:48 +02:00
2012-06-26 08:54:01 +02:00
}
$ret [] = api_format_messages ( $item , $recipient , $sender );
2011-08-19 16:55:43 +02:00
}
2013-12-15 23:00:47 +01:00
2011-08-19 16:55:43 +02:00
$data = array ( '$messages' => $ret );
switch ( $type ){
case " atom " :
case " rss " :
$data = api_rss_extra ( $a , $data , $user_info );
}
2013-12-15 23:00:47 +01:00
2011-08-19 16:55:43 +02:00
return api_apply_template ( " direct_messages " , $type , $data );
2013-12-15 23:00:47 +01:00
2011-08-19 16:55:43 +02: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 19:21:48 +02: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 16:55:43 +02: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 15:57:35 +02: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 17:36:58 +01:00
echo $r ;
2013-12-15 23:00:47 +01:00
killme ();
2011-10-20 15:57:35 +02: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 17:36:58 +01:00
echo $r ;
2013-12-15 23:00:47 +01:00
killme ();
2011-10-20 15:57:35 +02:00
}
2011-10-26 17:15:36 +02:00
2011-10-20 15:57:35 +02: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 17:15:36 +02:00
2014-08-11 11:29:14 +02:00
function api_fr_photos_list ( & $a , $type ) {
if ( api_user () === false ) return false ;
$r = q ( " select distinct `resource-id` from photo where uid = %d and album != 'Contact Photos' " ,
intval ( local_user ())
);
if ( $r ) {
$ret = array ();
foreach ( $r as $rr )
$ret [] = $rr [ 'resource-id' ];
header ( " Content-type: application/json " );
echo json_encode ( $ret );
}
killme ();
}
function api_fr_photo_detail ( & $a , $type ) {
if ( api_user () === false ) return false ;
if ( ! $_REQUEST [ 'photo_id' ]) return false ;
$scale = (( array_key_exists ( 'scale' , $_REQUEST )) ? intval ( $_REQUEST [ 'scale' ]) : 0 );
$r = q ( " select * from photo where uid = %d and `resource-id` = '%s' and scale = %d limit 1 " ,
intval ( local_user ()),
dbesc ( $_REQUEST [ 'photo_id' ]),
intval ( $scale )
);
if ( $r ) {
header ( " Content-type: application/json " );
$r [ 0 ][ 'data' ] = base64_encode ( $r [ 0 ][ 'data' ]);
echo json_encode ( $r [ 0 ]);
}
2014-12-31 12:34:32 +01:00
killme ();
2014-08-11 11:29:14 +02:00
}
api_register_func ( 'api/friendica/photos/list' , 'api_fr_photos_list' , true );
api_register_func ( 'api/friendica/photo' , 'api_fr_photo_detail' , true );
2015-01-25 00:01:58 +01:00
function api_share_as_retweet ( & $item ) {
2014-01-02 22:29:44 +01:00
$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 ];
2015-01-25 00:01:58 +01:00
$link = " " ;
preg_match ( " /link='(.*?)'/ism " , $attributes , $matches );
if ( $matches [ 1 ] != " " )
$link = $matches [ 1 ];
preg_match ( '/link="(.*?)"/ism' , $attributes , $matches );
if ( $matches [ 1 ] != " " )
$link = $matches [ 1 ];
2014-01-02 22:29:44 +01:00
$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 ;
2015-01-25 00:01:58 +01:00
$item [ " plink " ] = $link ;
2014-01-02 22:29:44 +01:00
return ( true );
}
function api_get_nick ( $profile ) {
/* To - Do :
- remove trailing jung from profile url
2014-01-05 16:12:03 +01:00
- pump . io check has to check the website
2014-01-02 22:29:44 +01:00
*/
$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."/");
2014-04-22 15:56:28 +02:00
// if ($pumpio != $profile)
2014-01-02 22:29:44 +01:00
// $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 );
}
2014-04-22 15:56:28 +02:00
return ( false );
2014-01-02 22:29:44 +01:00
}
function api_clean_plain_items ( $Text ) {
2014-02-12 01:41:45 +01:00
$include_entities = strtolower ( x ( $_REQUEST , 'include_entities' ) ? $_REQUEST [ 'include_entities' ] : " false " );
2014-02-22 15:42:34 +01:00
$Text = bb_CleanPictureLinks ( $Text );
2014-04-04 10:44:42 +02:00
$URLSearchString = " ^ \ [ \ ] " ;
2014-02-13 08:30:40 +01:00
2014-04-04 10:44:42 +02:00
$Text = preg_replace ( " /([!#@]) \ [url \ =([ $URLSearchString ]*) \ ](.*?) \ [ \ /url \ ]/ism " , '$1$3' , $Text );
if ( $include_entities == " true " ) {
2014-02-13 08:30:40 +01:00
$Text = preg_replace ( " / \ [url \ =([ $URLSearchString ]*) \ ](.*?) \ [ \ /url \ ]/ism " , '[url=$1]$1[/url]' , $Text );
}
2014-02-12 01:41:45 +01:00
2014-01-02 22:29:44 +01:00
$Text = preg_replace_callback ( " ((.*?) \ [class=(.*?) \ ](.*?) \ [ \ /class \ ])ism " , " api_cleanup_share " , $Text );
return ( $Text );
}
function api_cleanup_share ( $shared ) {
2014-02-11 23:43:34 +01:00
if ( $shared [ 2 ] != " type-link " )
return ( $shared [ 0 ]);
2014-01-02 22:29:44 +01:00
2014-02-11 23:43:34 +01:00
if ( ! preg_match_all ( " / \ [bookmark \ =([^ \ ]]*) \ ](.*?) \ [ \ /bookmark \ ]/ism " , $shared [ 3 ], $bookmark ))
return ( $shared [ 0 ]);
2014-01-02 22:29:44 +01:00
2014-02-11 23:43:34 +01:00
$title = " " ;
$link = " " ;
2014-01-02 22:29:44 +01:00
2014-02-11 23:43:34 +01:00
if ( isset ( $bookmark [ 2 ][ 0 ]))
$title = $bookmark [ 2 ][ 0 ];
2014-01-02 22:29:44 +01:00
2014-02-11 23:43:34 +01:00
if ( isset ( $bookmark [ 1 ][ 0 ]))
$link = $bookmark [ 1 ][ 0 ];
2014-01-02 22:29:44 +01:00
if ( strpos ( $shared [ 1 ], $title ) !== false )
$title = " " ;
if ( strpos ( $shared [ 1 ], $link ) !== false )
$link = " " ;
2014-02-11 23:43:34 +01:00
$text = trim ( $shared [ 1 ]);
2014-01-02 22:29:44 +01:00
//if (strlen($text) < strlen($title))
if (( $text == " " ) AND ( $title != " " ))
$text .= " \n \n " . trim ( $title );
2014-02-11 23:43:34 +01:00
if ( $link != " " )
$text .= " \n " . trim ( $link );
2014-01-02 22:29:44 +01:00
2014-02-11 23:43:34 +01:00
return ( trim ( $text ));
2014-01-02 22:29:44 +01:00
}
2014-01-05 16:12:03 +01:00
function api_best_nickname ( & $contacts ) {
$best_contact = array ();
2014-01-05 16:57:05 +01:00
if ( count ( $contact ) == 0 )
return ;
2014-01-05 16:12:03 +01:00
foreach ( $contacts AS $contact )
if ( $contact [ " network " ] == " " ) {
$contact [ " network " ] = " dfrn " ;
$best_contact = array ( $contact );
}
if ( sizeof ( $best_contact ) == 0 )
foreach ( $contacts AS $contact )
if ( $contact [ " network " ] == " dfrn " )
$best_contact = array ( $contact );
if ( sizeof ( $best_contact ) == 0 )
foreach ( $contacts AS $contact )
if ( $contact [ " network " ] == " dspr " )
$best_contact = array ( $contact );
if ( sizeof ( $best_contact ) == 0 )
foreach ( $contacts AS $contact )
if ( $contact [ " network " ] == " stat " )
$best_contact = array ( $contact );
if ( sizeof ( $best_contact ) == 0 )
foreach ( $contacts AS $contact )
if ( $contact [ " network " ] == " pump " )
$best_contact = array ( $contact );
if ( sizeof ( $best_contact ) == 0 )
foreach ( $contacts AS $contact )
if ( $contact [ " network " ] == " twit " )
$best_contact = array ( $contact );
if ( sizeof ( $best_contact ) == 1 )
$contacts = $best_contact ;
else
$contacts = array ( $contacts [ 0 ]);
}
2012-03-21 10:08:40 +01:00
/*
Not implemented by now :
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 23:41:04 +02:00
lists
2012-03-21 10:08:40 +01:00
*/