2011-02-15 11:24:21 +00:00
< ? php
2015-12-25 22:17:34 +00:00
/**
* @ file include / api . php
2015-12-27 16:45:20 +00:00
* Friendica implementation of statusnet / twitter API
2015-12-07 18:37:14 +00:00
*
2015-12-27 16:45:20 +00:00
* @ todo Automatically detect if incoming data is HTML or BBCode
2015-12-07 18:37:14 +00:00
*/
2015-12-27 16:45:20 +00:00
require_once ( 'include/HTTPExceptions.php' );
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' );
require_once ( 'mod/share.php' );
require_once ( 'include/Photo.php' );
require_once ( 'mod/item.php' );
2015-08-17 20:38:05 +00:00
require_once ( 'include/security.php' );
require_once ( 'include/contact_selectors.php' );
require_once ( 'include/html2bbcode.php' );
require_once ( 'mod/wall_upload.php' );
2015-12-27 16:45:20 +00:00
require_once ( 'mod/proxy.php' );
require_once ( 'include/message.php' );
require_once ( 'include/group.php' );
require_once ( 'include/like.php' );
2016-02-07 13:27:13 +00:00
require_once ( 'include/NotificationsManager.php' );
2016-04-17 18:43:41 +00:00
require_once ( 'include/plaintext.php' );
2016-07-15 13:37:51 +00:00
require_once ( 'include/xml.php' );
2015-12-27 16:45:20 +00:00
define ( 'API_METHOD_ANY' , '*' );
define ( 'API_METHOD_GET' , 'GET' );
define ( 'API_METHOD_POST' , 'POST,PUT' );
define ( 'API_METHOD_DELETE' , 'POST,DELETE' );
2015-08-17 20:38:05 +00:00
2015-04-06 01:19:12 +00:00
2011-02-15 11:24:21 +00:00
$API = Array ();
2012-04-22 16:00:24 +00:00
$called_api = Null ;
2011-04-21 15:03:31 +00:00
2015-12-27 16:45:20 +00:00
/**
* @ brief Auth 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 ) .
*/
2014-04-22 13:56:28 +00:00
function api_user () {
2015-12-27 16:45:20 +00:00
if ( $_SESSION [ 'allow_api' ])
2014-04-22 13:56:28 +00:00
return local_user ();
return false ;
}
2012-12-01 00:26:54 +00:00
2015-12-27 16:45:20 +00:00
/**
* @ brief Get source name from API client
*
* Clients can send 'source' parameter to be show in post metadata
* as " sent via <source> " .
* Some clients doesn ' t send a source param , we support ones we know
* ( only Twidere , atm )
*
* @ return string
* Client source name , default to " api " if unset / unknown
*/
2014-09-28 15:23:01 +00: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 " );
}
2015-12-27 16:45:20 +00:00
/**
* @ brief Format date for API
*
* @ param string $str Source date , as UTC
* @ return string Date in UTC formatted as " D M d H:i:s +0000 Y "
*/
2011-02-15 11:24:21 +00:00
function api_date ( $str ){
//Wed May 23 06:01:13 +0000 2007
2011-08-16 11:55:38 +00:00
return datetime_convert ( 'UTC' , 'UTC' , $str , " D M d H:i:s +0000 Y " );
2011-02-15 11:24:21 +00:00
}
2012-04-22 16:00:24 +00:00
2015-12-27 16:45:20 +00:00
/**
* @ brief Register API endpoint
*
* Register a function to be the endpont for defined API path .
*
* @ param string $path API URL path , relative to $a -> get_baseurl ()
* @ param string $func Function name to call on path request
* @ param bool $auth API need logged user
* @ param string $method
* HTTP method reqiured to call this endpoint .
* One of API_METHOD_ANY , API_METHOD_GET , API_METHOD_POST .
* Default to API_METHOD_ANY
*/
function api_register_func ( $path , $func , $auth = false , $method = API_METHOD_ANY ){
2011-02-15 11:24:21 +00:00
global $API ;
2015-12-27 16:45:20 +00:00
$API [ $path ] = array (
'func' => $func ,
'auth' => $auth ,
'method' => $method
);
2014-01-13 19:03:05 +00:00
// Workaround for hotot
$path = str_replace ( " api/ " , " api/1.1/ " , $path );
2015-12-27 16:45:20 +00:00
$API [ $path ] = array (
'func' => $func ,
'auth' => $auth ,
'method' => $method
);
2011-02-15 11:24:21 +00:00
}
2012-04-22 16:00:24 +00:00
2011-02-15 11:24:21 +00:00
/**
2015-12-27 16:45:20 +00:00
* @ brief Login API user
*
* Log in user via OAuth1 or Simple HTTP Auth .
* Simple Auth allow username in form of < pre > user @ server </ pre > , ignoring server part
*
* @ param App $a
* @ hook 'authenticate'
* array $addon_auth
* 'username' => username from login form
* 'password' => password from login form
* 'authenticated' => return status ,
* 'user_record' => return authenticated user record
* @ hook 'logged_in'
* array $user logged user record
2011-02-15 11:24:21 +00:00
*/
function api_login ( & $a ){
2011-11-07 16:36:58 +00:00
// login with oauth
try {
$oauth = new FKOAuth1 ();
list ( $consumer , $token ) = $oauth -> verify_request ( OAuthRequest :: from_request ());
if ( ! is_null ( $token )){
$oauth -> loginUser ( $token -> uid );
call_hooks ( 'logged_in' , $a -> user );
return ;
}
echo __file__ . __line__ . __function__ . " <pre> " ; var_dump ( $consumer , $token ); die ();
} catch ( Exception $e ){
2015-12-27 16:45:20 +00:00
logger ( $e );
2011-11-07 16:36:58 +00:00
}
2013-12-15 22:00:47 +00:00
2011-06-20 03:13:24 +00:00
// workaround for HTTP-auth in CGI mode
if ( x ( $_SERVER , 'REDIRECT_REMOTE_USER' )) {
2014-04-22 13:56:28 +00:00
$userpass = base64_decode ( substr ( $_SERVER [ " REDIRECT_REMOTE_USER " ], 6 )) ;
2011-06-20 03:13:24 +00:00
if ( strlen ( $userpass )) {
2014-04-22 13:56:28 +00:00
list ( $name , $password ) = explode ( ':' , $userpass );
2011-06-20 03:13:24 +00:00
$_SERVER [ 'PHP_AUTH_USER' ] = $name ;
$_SERVER [ 'PHP_AUTH_PW' ] = $password ;
}
}
2011-02-15 11:24:21 +00:00
if ( ! isset ( $_SERVER [ 'PHP_AUTH_USER' ])) {
2013-12-20 22:07:11 +00:00
logger ( 'API_login: ' . print_r ( $_SERVER , true ), LOGGER_DEBUG );
header ( 'WWW-Authenticate: Basic realm="Friendica"' );
2016-02-14 10:24:51 +00:00
throw new UnauthorizedException ( " This API requires login " );
2011-02-15 11:24:21 +00:00
}
2013-12-15 22:00:47 +00:00
2011-02-15 11:24:21 +00:00
$user = $_SERVER [ 'PHP_AUTH_USER' ];
2015-01-15 17:15:06 +00:00
$password = $_SERVER [ 'PHP_AUTH_PW' ];
$encrypted = hash ( 'whirlpool' , trim ( $password ));
2013-12-15 22:00:47 +00:00
2015-03-15 20:19:29 +00:00
// allow "user@server" login (but ignore 'server' part)
$at = strstr ( $user , " @ " , true );
if ( $at ) $user = $at ;
2013-12-15 22:00:47 +00:00
/**
* next code from mod / auth . php . needs better solution
*/
2015-01-15 17:15:06 +00:00
$record = null ;
2013-12-15 22:00:47 +00:00
2015-01-15 17:15:06 +00:00
$addon_auth = array (
2015-03-15 20:19:29 +00:00
'username' => trim ( $user ),
2015-01-15 17:15:06 +00:00
'password' => trim ( $password ),
'authenticated' => 0 ,
'user_record' => null
2011-02-15 11:24:21 +00:00
);
2015-01-15 17:15:06 +00: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 13:56:28 +00:00
logger ( 'API_login failure: ' . print_r ( $_SERVER , true ), LOGGER_DEBUG );
header ( 'WWW-Authenticate: Basic realm="Friendica"' );
2016-02-14 10:24:51 +00:00
#header('HTTP/1.0 401 Unauthorized');
#die('This api requires login');
throw new UnauthorizedException ( " This API requires login " );
2011-04-27 15:46:23 +00:00
}
2011-02-15 11:24:21 +00:00
2012-12-01 00:26:54 +00:00
authenticate_success ( $record ); $_SESSION [ " allow_api " ] = true ;
2011-02-15 11:24:21 +00:00
call_hooks ( 'logged_in' , $a -> user );
}
2013-12-15 22:00:47 +00:00
2015-12-27 16:45:20 +00:00
/**
* @ brief Check HTTP method of called API
*
* API endpoints can define which HTTP method to accept when called .
* This function check the current HTTP method agains endpoint
* registered method .
*
* @ param string $method Required methods , uppercase , separated by comma
* @ return bool
*/
function api_check_method ( $method ) {
if ( $method == " * " ) return True ;
return strpos ( $method , $_SERVER [ 'REQUEST_METHOD' ]) !== false ;
}
/**
* @ brief Main API entry point
*
* Authenticate user , call registered API function , set HTTP headers
*
* @ param App $a
* @ return string API call result
*/
2011-02-15 11:24:21 +00:00
function api_call ( & $a ){
2011-08-26 14:35:51 +00:00
GLOBAL $API , $called_api ;
2016-07-14 11:32:31 +00:00
2012-02-20 00:53:22 +00:00
$type = " json " ;
2015-12-27 16:45:20 +00:00
if ( strpos ( $a -> query_string , " .xml " ) > 0 ) $type = " xml " ;
if ( strpos ( $a -> query_string , " .json " ) > 0 ) $type = " json " ;
if ( strpos ( $a -> query_string , " .rss " ) > 0 ) $type = " rss " ;
if ( strpos ( $a -> query_string , " .atom " ) > 0 ) $type = " atom " ;
try {
foreach ( $API as $p => $info ){
if ( strpos ( $a -> query_string , $p ) === 0 ){
if ( ! api_check_method ( $info [ 'method' ])){
throw new MethodNotAllowedException ();
}
$called_api = explode ( " / " , $p );
//unset($_SERVER['PHP_AUTH_USER']);
if ( $info [ 'auth' ] === true && api_user () === false ) {
api_login ( $a );
}
2011-07-31 23:35:53 +00:00
2015-12-27 16:45:20 +00:00
logger ( 'API call for ' . $a -> user [ 'username' ] . ': ' . $a -> query_string );
logger ( 'API parameters: ' . print_r ( $_REQUEST , true ));
$stamp = microtime ( true );
$r = call_user_func ( $info [ 'func' ], $a , $type );
$duration = ( float )( microtime ( true ) - $stamp );
logger ( " API call duration: " . round ( $duration , 2 ) . " \t " . $a -> query_string , LOGGER_DEBUG );
if ( $r === false ) {
// api function returned false withour throw an
// exception. This should not happend, throw a 500
throw new InternalServerErrorException ();
}
switch ( $type ){
case " xml " :
header ( " Content-Type: text/xml " );
2016-07-17 21:59:35 +00:00
return $r ;
2015-12-27 16:45:20 +00:00
break ;
case " json " :
header ( " Content-Type: application/json " );
foreach ( $r as $rr )
$json = json_encode ( $rr );
if ( $_GET [ 'callback' ])
$json = $_GET [ 'callback' ] . " ( " . $json . " ) " ;
return $json ;
break ;
case " rss " :
header ( " Content-Type: application/rss+xml " );
return '<?xml version="1.0" encoding="UTF-8"?>' . " \n " . $r ;
break ;
case " atom " :
header ( " Content-Type: application/atom+xml " );
return '<?xml version="1.0" encoding="UTF-8"?>' . " \n " . $r ;
break ;
}
2011-02-15 11:24:21 +00:00
}
}
2015-12-27 16:45:20 +00:00
throw new NotImplementedException ();
} catch ( HTTPException $e ) {
header ( " HTTP/1.1 { $e -> httpcode } { $e -> httpdesc } " );
return api_error ( $a , $type , $e );
2011-02-15 11:24:21 +00:00
}
2013-12-20 22:07:11 +00:00
}
2015-12-27 16:45:20 +00:00
/**
* @ brief Format API error string
*
* @ param Api $a
* @ param string $type Return type ( xml , json , rss , as )
2016-02-14 10:24:51 +00:00
* @ param HTTPException $error Error object
* @ return strin error message formatted as $type
2015-12-27 16:45:20 +00:00
*/
function api_error ( & $a , $type , $e ) {
$error = ( $e -> getMessage () !== " " ? $e -> getMessage () : $e -> httpdesc );
# TODO: https://dev.twitter.com/overview/api/response-codes
2016-07-17 21:59:35 +00:00
$error = array ( " error " => $error ,
" code " => $e -> httpcode . " " . $e -> httpdesc ,
" request " => $a -> query_string );
$ret = api_format_data ( 'status' , $type , array ( 'status' => $error ));
2011-08-01 03:01:00 +00:00
switch ( $type ){
case " xml " :
header ( " Content-Type: text/xml " );
2016-07-17 21:59:35 +00:00
return $ret ;
2011-08-01 03:01:00 +00:00
break ;
2012-02-20 00:53:22 +00:00
case " json " :
header ( " Content-Type: application/json " );
2016-07-17 21:59:35 +00:00
return json_encode ( $ret );
2011-08-01 03:01:00 +00:00
break ;
case " rss " :
header ( " Content-Type: application/rss+xml " );
2016-07-17 21:59:35 +00:00
return $ret ;
2011-08-01 03:01:00 +00:00
break ;
case " atom " :
header ( " Content-Type: application/atom+xml " );
2016-07-17 21:59:35 +00:00
return $ret ;
2011-08-01 03:01:00 +00:00
break ;
}
2011-02-15 11:24:21 +00:00
}
2011-04-21 15:03:31 +00:00
/**
2015-12-27 16:45:20 +00:00
* @ brief Set values for RSS template
*
* @ param App $a
* @ param array $arr Array to be passed to template
* @ param array $user_info
* @ return array
2011-04-21 15:03:31 +00:00
*/
function api_rss_extra ( & $a , $arr , $user_info ){
if ( is_null ( $user_info )) $user_info = api_get_user ( $a );
2011-06-21 09:41:16 +00:00
$arr [ '$user' ] = $user_info ;
2011-04-21 15:03:31 +00:00
$arr [ '$rss' ] = array (
'alternate' => $user_info [ 'url' ],
'self' => $a -> get_baseurl () . " / " . $a -> query_string ,
2011-07-31 23:35:53 +00:00
'base' => $a -> get_baseurl (),
2011-04-21 15:03:31 +00:00
'updated' => api_date ( null ),
2011-07-31 23:35:53 +00:00
'atom_updated' => datetime_convert ( 'UTC' , 'UTC' , 'now' , ATOM_TIME ),
2011-04-21 15:03:31 +00:00
'language' => $user_info [ 'language' ],
2012-02-19 18:34:48 +00:00
'logo' => $a -> get_baseurl () . " /images/friendica-32.png " ,
2011-04-21 15:03:31 +00:00
);
2013-12-15 22:00:47 +00:00
2011-04-21 15:03:31 +00:00
return $arr ;
}
2013-12-15 22:00:47 +00:00
/**
2015-12-27 16:45:20 +00:00
* @ brief Unique contact to contact url .
*
* @ param int $id Contact id
* @ return bool | string
* Contact url or False if contact id is unknown
2013-12-15 22:00:47 +00:00
*/
function api_unique_id_to_url ( $id ){
2016-01-06 21:23:12 +00:00
$r = q ( " SELECT `url` FROM `gcontact` WHERE `id`=%d LIMIT 1 " ,
2013-12-15 22:00:47 +00:00
intval ( $id ));
if ( $r )
return ( $r [ 0 ][ " url " ]);
else
return false ;
}
2011-02-15 11:24:21 +00:00
/**
2015-12-27 16:45:20 +00:00
* @ brief Get user info array .
*
* @ param Api $a
* @ param int | string $contact_id Contact ID or URL
* @ param string $type Return type ( for errors )
2011-02-15 11:24:21 +00:00
*/
2013-12-20 22:07:11 +00:00
function api_get_user ( & $a , $contact_id = Null , $type = " json " ){
2011-08-26 14:35:51 +00:00
global $called_api ;
2011-02-15 11:24:21 +00:00
$user = null ;
$extra_query = " " ;
2013-12-15 22:00:47 +00:00
$url = " " ;
$nick = " " ;
2014-01-05 15:12:03 +00:00
logger ( " api_get_user: Fetching user data for user " . $contact_id , LOGGER_DEBUG );
2013-12-15 22:00:47 +00: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 07:53:46 +00:00
2013-12-15 22:00:47 +00: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 14:55:43 +00:00
2013-12-15 22:00:47 +00:00
if ( $user == " " )
2015-12-27 16:45:20 +00:00
throw new BadRequestException ( " User not found. " );
2013-12-15 22:00:47 +00:00
$url = $user ;
$extra_query = " AND `contact`.`nurl` = '%s' " ;
if ( api_user () !== false ) $extra_query .= " AND `contact`.`uid`= " . intval ( api_user ());
2011-06-21 09:41:16 +00:00
}
2013-12-15 22:00:47 +00:00
2011-06-21 09:41:16 +00:00
if ( is_null ( $user ) && x ( $_GET , 'user_id' )) {
2013-12-15 22:00:47 +00:00
$user = dbesc ( api_unique_id_to_url ( $_GET [ 'user_id' ]));
if ( $user == " " )
2015-12-27 16:45:20 +00:00
throw new BadRequestException ( " User not found. " );
2013-12-15 22:00:47 +00:00
$url = $user ;
$extra_query = " AND `contact`.`nurl` = '%s' " ;
if ( api_user () !== false ) $extra_query .= " AND `contact`.`uid`= " . intval ( api_user ());
2011-02-15 11:24:21 +00:00
}
2011-06-21 09:41:16 +00:00
if ( is_null ( $user ) && x ( $_GET , 'screen_name' )) {
2013-12-15 22:00:47 +00:00
$user = dbesc ( $_GET [ 'screen_name' ]);
$nick = $user ;
2011-04-21 15:03:31 +00:00
$extra_query = " AND `contact`.`nick` = '%s' " ;
2012-12-01 00:26:54 +00:00
if ( api_user () !== false ) $extra_query .= " AND `contact`.`uid`= " . intval ( api_user ());
2011-02-15 11:24:21 +00:00
}
2013-12-15 22:00:47 +00:00
2013-12-29 16:54:37 +00:00
if ( is_null ( $user ) AND ( $a -> argc > ( count ( $called_api ) - 1 )) AND ( count ( $called_api ) > 0 )){
2011-08-26 14:35:51 +00:00
$argid = count ( $called_api );
list ( $user , $null ) = explode ( " . " , $a -> argv [ $argid ]);
2011-02-15 11:24:21 +00:00
if ( is_numeric ( $user )){
2013-12-15 22:00:47 +00: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 11:24:21 +00:00
} else {
$user = dbesc ( $user );
2013-12-15 22:00:47 +00:00
$nick = $user ;
2011-04-21 15:03:31 +00:00
$extra_query = " AND `contact`.`nick` = '%s' " ;
2012-12-01 00:26:54 +00:00
if ( api_user () !== false ) $extra_query .= " AND `contact`.`uid`= " . intval ( api_user ());
2011-02-15 11:24:21 +00:00
}
}
2013-12-15 22:00:47 +00:00
2014-01-08 00:14:58 +00:00
logger ( " api_get_user: user " . $user , LOGGER_DEBUG );
2013-12-15 22:00:47 +00:00
if ( ! $user ) {
2012-12-01 00:26:54 +00:00
if ( api_user () === false ) {
2015-12-27 16:45:20 +00:00
api_login ( $a );
return False ;
2011-02-16 07:56:47 +00:00
} else {
$user = $_SESSION [ 'uid' ];
2011-07-31 03:48:55 +00:00
$extra_query = " AND `contact`.`uid` = %d AND `contact`.`self` = 1 " ;
2011-02-16 07:56:47 +00:00
}
2013-12-15 22:00:47 +00:00
2011-02-15 11:24:21 +00:00
}
2013-12-15 22:00:47 +00:00
2012-06-12 02:21:35 +00:00
logger ( 'api_user: ' . $extra_query . ', user: ' . $user );
2013-12-15 22:00:47 +00:00
// user info
2011-06-21 09:41:16 +00:00
$uinfo = q ( " SELECT *, `contact`.`id` as `cid` FROM `contact`
WHERE 1
2011-02-15 11:24:21 +00:00
$extra_query " ,
$user
);
2013-12-15 22:00:47 +00:00
2014-01-05 15:12:03 +00:00
// Selecting the id by priority, friendica first
api_best_nickname ( $uinfo );
2013-12-15 22:00:47 +00:00
// if the contact wasn't found, fetch it from the unique contacts
2011-02-15 11:24:21 +00:00
if ( count ( $uinfo ) == 0 ) {
2013-12-15 22:00:47 +00:00
$r = array ();
if ( $url != " " )
2016-01-06 21:23:12 +00:00
$r = q ( " SELECT * FROM `gcontact` WHERE `nurl`='%s' LIMIT 1 " , dbesc ( normalise_link ( $url )));
2013-12-15 22:00:47 +00:00
if ( $r ) {
2014-01-02 21:29:44 +00: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 22:00:47 +00:00
$ret = array (
'id' => $r [ 0 ][ " id " ],
2014-01-13 19:03:05 +00:00
'id_str' => ( string ) $r [ 0 ][ " id " ],
2013-12-15 22:00:47 +00:00
'name' => $r [ 0 ][ " name " ],
2013-12-19 05:58:11 +00:00
'screen_name' => (( $r [ 0 ][ 'nick' ]) ? $r [ 0 ][ 'nick' ] : $r [ 0 ][ 'name' ]),
2016-01-06 21:23:12 +00:00
'location' => $r [ 0 ][ " location " ],
'description' => $r [ 0 ][ " about " ],
2013-12-19 05:58:11 +00:00
'url' => $r [ 0 ][ " url " ],
2013-12-15 22:00:47 +00:00
'protected' => false ,
'followers_count' => 0 ,
'friends_count' => 0 ,
2015-06-02 14:19:40 +00:00
'listed_count' => 0 ,
2016-01-06 21:23:12 +00:00
'created_at' => api_date ( $r [ 0 ][ " created " ]),
2013-12-15 22:00:47 +00:00
'favourites_count' => 0 ,
'utc_offset' => 0 ,
'time_zone' => 'UTC' ,
2015-06-02 14:19:40 +00:00
'geo_enabled' => false ,
'verified' => false ,
2013-12-19 05:58:11 +00:00
'statuses_count' => 0 ,
2015-06-02 14:19:40 +00:00
'lang' => '' ,
'contributors_enabled' => false ,
'is_translator' => false ,
'is_translation_enabled' => false ,
2016-01-06 21:23:12 +00:00
'profile_image_url' => $r [ 0 ][ " photo " ],
'profile_image_url_https' => $r [ 0 ][ " photo " ],
2013-12-27 00:48:43 +00:00
'following' => false ,
2015-06-02 14:19:40 +00:00
'follow_request_sent' => false ,
'notifications' => false ,
2013-12-15 22:00:47 +00:00
'statusnet_blocking' => false ,
'notifications' => false ,
'statusnet_profile_url' => $r [ 0 ][ " url " ],
'uid' => 0 ,
'cid' => 0 ,
'self' => 0 ,
2016-01-06 21:23:12 +00:00
'network' => $r [ 0 ][ " network " ],
2013-12-15 22:00:47 +00:00
);
return $ret ;
2015-12-27 16:45:20 +00:00
} else {
throw new BadRequestException ( " User not found. " );
}
2011-02-15 11:24:21 +00:00
}
2013-12-15 22:00:47 +00:00
2011-08-01 03:01:00 +00:00
if ( $uinfo [ 0 ][ 'self' ]) {
2011-08-05 12:17:18 +00:00
$usr = q ( " select * from user where uid = %d limit 1 " ,
2012-12-01 00:26:54 +00:00
intval ( api_user ())
2011-08-05 12:17:18 +00:00
);
$profile = q ( " select * from profile where uid = %d and `is-default` = 1 limit 1 " ,
2012-12-01 00:26:54 +00:00
intval ( api_user ())
2011-08-05 12:17:18 +00:00
);
2014-03-11 22:52:32 +00:00
//AND `allow_cid`='' AND `allow_gid`='' AND `deny_cid`='' AND `deny_gid`=''",
2011-08-01 03:01:00 +00:00
// count public wall messages
2014-03-16 16:12:56 +00:00
$r = q ( " SELECT count(*) as `count` FROM `item`
2011-08-01 03:01:00 +00:00
WHERE `uid` = % d
2014-03-11 22:52:32 +00:00
AND `type` = 'wall' " ,
2011-08-01 03:01:00 +00:00
intval ( $uinfo [ 0 ][ 'uid' ])
);
$countitms = $r [ 0 ][ 'count' ];
}
else {
2014-03-11 22:52:32 +00: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 03:01:00 +00:00
intval ( $uinfo [ 0 ][ 'id' ])
);
$countitms = $r [ 0 ][ 'count' ];
}
2011-02-15 11:24:21 +00:00
// count friends
2014-03-11 22:52:32 +00:00
$r = q ( " SELECT count(*) as `count` FROM `contact`
2011-08-01 05:22:34 +00:00
WHERE `uid` = % d AND `rel` IN ( % d , % d )
2013-12-15 22:00:47 +00:00
AND `self` = 0 AND `blocked` = 0 AND `pending` = 0 AND `hidden` = 0 " ,
2011-08-01 05:22:34 +00:00
intval ( $uinfo [ 0 ][ 'uid' ]),
2011-08-07 23:15:54 +00:00
intval ( CONTACT_IS_SHARING ),
intval ( CONTACT_IS_FRIEND )
2011-02-15 11:24:21 +00:00
);
$countfriends = $r [ 0 ][ 'count' ];
2011-08-01 03:01:00 +00:00
2014-03-11 22:52:32 +00:00
$r = q ( " SELECT count(*) as `count` FROM `contact`
2011-08-01 05:22:34 +00:00
WHERE `uid` = % d AND `rel` IN ( % d , % d )
2013-12-15 22:00:47 +00:00
AND `self` = 0 AND `blocked` = 0 AND `pending` = 0 AND `hidden` = 0 " ,
2011-08-01 05:22:34 +00:00
intval ( $uinfo [ 0 ][ 'uid' ]),
2011-08-07 23:15:54 +00:00
intval ( CONTACT_IS_FOLLOWER ),
intval ( CONTACT_IS_FRIEND )
2011-08-01 05:22:34 +00:00
);
$countfollowers = $r [ 0 ][ 'count' ];
2014-03-11 22:52:32 +00:00
$r = q ( " SELECT count(*) as `count` FROM item where starred = 1 and uid = %d and deleted = 0 " ,
2011-08-05 12:17:18 +00:00
intval ( $uinfo [ 0 ][ 'uid' ])
);
$starred = $r [ 0 ][ 'count' ];
2013-12-15 22:00:47 +00:00
2011-08-05 12:17:18 +00:00
2011-08-01 03:01:00 +00:00
if ( ! $uinfo [ 0 ][ 'self' ]) {
$countfriends = 0 ;
2011-08-01 05:22:34 +00:00
$countfollowers = 0 ;
2011-08-05 12:17:18 +00:00
$starred = 0 ;
2011-08-01 03:01:00 +00:00
}
2011-02-16 07:56:47 +00:00
2014-01-02 21:29:44 +00: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 " ]);
}
2015-07-16 08:09:59 +00:00
$network_name = network_to_name ( $uinfo [ 0 ][ 'network' ], $uinfo [ 0 ][ 'url' ]);
2014-01-13 19:03:05 +00:00
2016-01-06 21:23:12 +00:00
$gcontact_id = get_gcontact_id ( array ( " url " => $uinfo [ 0 ][ 'url' ], " network " => $uinfo [ 0 ][ 'network' ],
" photo " => $uinfo [ 0 ][ 'micro' ], " name " => $uinfo [ 0 ][ 'name' ]));
2011-02-16 07:56:47 +00:00
$ret = Array (
2016-01-06 21:23:12 +00:00
'id' => intval ( $gcontact_id ),
'id_str' => ( string ) intval ( $gcontact_id ),
2012-03-18 16:52:51 +00:00
'name' => (( $uinfo [ 0 ][ 'name' ]) ? $uinfo [ 0 ][ 'name' ] : $uinfo [ 0 ][ 'nick' ]),
2011-08-06 04:30:12 +00:00
'screen_name' => (( $uinfo [ 0 ][ 'nick' ]) ? $uinfo [ 0 ][ 'nick' ] : $uinfo [ 0 ][ 'name' ]),
2014-01-13 19:03:05 +00:00
'location' => ( $usr ) ? $usr [ 0 ][ 'default-location' ] : $network_name ,
2013-12-15 22:00:47 +00:00
'description' => (( $profile ) ? $profile [ 0 ][ 'pdesc' ] : NULL ),
2011-04-27 15:46:23 +00:00
'profile_image_url' => $uinfo [ 0 ][ 'micro' ],
2013-12-27 00:48:43 +00:00
'profile_image_url_https' => $uinfo [ 0 ][ 'micro' ],
2011-02-16 07:56:47 +00:00
'url' => $uinfo [ 0 ][ 'url' ],
2013-12-15 22:00:47 +00:00
'protected' => false ,
'followers_count' => intval ( $countfollowers ),
2011-08-05 02:47:45 +00:00
'friends_count' => intval ( $countfriends ),
2014-01-13 19:03:05 +00:00
'created_at' => api_date ( $uinfo [ 0 ][ 'created' ]),
2011-08-05 12:17:18 +00:00
'favourites_count' => intval ( $starred ),
2014-01-13 19:03:05 +00:00
'utc_offset' => " 0 " ,
'time_zone' => 'UTC' ,
2013-12-15 22:00:47 +00:00
'statuses_count' => intval ( $countitms ),
2014-01-13 19:03:05 +00:00
'following' => (( $uinfo [ 0 ][ 'rel' ] == CONTACT_IS_FOLLOWER ) OR ( $uinfo [ 0 ][ 'rel' ] == CONTACT_IS_FRIEND )),
'verified' => true ,
2013-12-15 22:00:47 +00:00
'statusnet_blocking' => false ,
2011-04-21 15:03:31 +00:00
'notifications' => false ,
2015-11-23 18:16:27 +00:00
//'statusnet_profile_url' => $a->get_baseurl()."/contacts/".$uinfo[0]['cid'],
'statusnet_profile_url' => $uinfo [ 0 ][ 'url' ],
2013-12-15 22:00:47 +00:00
'uid' => intval ( $uinfo [ 0 ][ 'uid' ]),
'cid' => intval ( $uinfo [ 0 ][ 'cid' ]),
'self' => $uinfo [ 0 ][ 'self' ],
2014-01-05 15:12:03 +00:00
'network' => $uinfo [ 0 ][ 'network' ],
2011-02-16 07:56:47 +00:00
);
2013-12-15 22:00:47 +00:00
2011-02-16 07:56:47 +00:00
return $ret ;
2013-12-15 22:00:47 +00:00
2011-02-16 07:56:47 +00:00
}
2011-04-21 15:03:31 +00:00
2016-07-14 11:35:36 +00:00
/**
* @ brief return api - formatted array for item ' s author and owner
*
* @ param App $a
* @ param array $item : item from db
* @ return array ( array : author , array : owner )
*/
2011-07-31 07:53:46 +00:00
function api_item_get_user ( & $a , $item ) {
2012-03-18 16:52:51 +00:00
2016-01-06 21:23:12 +00:00
// Make sure that there is an entry in the global contacts for author and owner
get_gcontact_id ( array ( " url " => $item [ 'author-link' ], " network " => $item [ 'network' ],
" photo " => $item [ 'author-avatar' ], " name " => $item [ 'author-name' ]));
2015-11-12 07:59:29 +00:00
2016-01-06 21:23:12 +00:00
get_gcontact_id ( array ( " url " => $item [ 'owner-link' ], " network " => $item [ 'network' ],
" photo " => $item [ 'owner-avatar' ], " name " => $item [ 'owner-name' ]));
2013-12-19 05:58:11 +00:00
2016-07-13 17:47:15 +00:00
$status_user = api_get_user ( $a , $item [ " author-link " ]);
2014-01-15 19:35:34 +00:00
$status_user [ " protected " ] = (( $item [ " allow_cid " ] != " " ) OR
( $item [ " allow_gid " ] != " " ) OR
( $item [ " deny_cid " ] != " " ) OR
2014-03-11 22:52:32 +00:00
( $item [ " deny_gid " ] != " " ) OR
$item [ " private " ]);
2014-01-15 19:35:34 +00:00
2016-07-14 11:32:31 +00:00
$owner_user = api_get_user ( $a , $item [ " owner-link " ]);
2016-07-13 17:47:15 +00:00
return ( array ( $status_user , $owner_user ));
2011-07-31 07:53:46 +00:00
}
2016-07-16 10:32:08 +00:00
/**
* @ brief walks recursively through an array with the possibility to change value and key
*
* @ param array $array The array to walk through
* @ param string $callback The callback function
*
* @ return array the transformed array
*/
2016-07-15 13:37:51 +00:00
function api_walk_recursive ( array & $array , callable $callback ) {
$new_array = array ();
foreach ( $array as $k => $v ) {
if ( is_array ( $v )) {
if ( $callback ( $v , $k ))
$new_array [ $k ] = api_walk_recursive ( $v , $callback );
} else {
if ( $callback ( $v , $k ))
$new_array [ $k ] = $v ;
}
}
$array = $new_array ;
return $array ;
}
2016-07-16 10:32:08 +00:00
/**
* @ brief Callback function to transform the array in an array that can be transformed in a XML file
*
* @ param variant $item Array item value
* @ param string $key Array key
*
* @ return boolean Should the array item be deleted ?
*/
2016-07-15 13:37:51 +00:00
function api_reformat_xml ( & $item , & $key ) {
if ( is_bool ( $item ))
$item = ( $item ? " true " : " false " );
if ( substr ( $key , 0 , 10 ) == " statusnet_ " )
$key = " statusnet: " . substr ( $key , 10 );
elseif ( substr ( $key , 0 , 10 ) == " friendica_ " )
$key = " friendica: " . substr ( $key , 10 );
2016-07-17 21:59:35 +00:00
//else
// $key = "default:".$key;
2016-07-15 13:37:51 +00:00
2016-07-17 21:59:35 +00:00
return true ;
2016-07-15 13:37:51 +00:00
}
2016-07-16 10:32:08 +00:00
/**
* @ brief Creates the XML from a JSON style array
*
* @ param array $data JSON style array
2016-07-17 21:59:35 +00:00
* @ param string $root_element Name of the root element
2016-07-16 10:32:08 +00:00
*
2016-07-17 21:59:35 +00:00
* @ return string The XML data
2016-07-16 10:32:08 +00:00
*/
2016-07-17 17:42:30 +00:00
function api_create_xml ( $data , $root_element ) {
$childname = key ( $data );
2016-07-15 13:37:51 +00:00
$data2 = array_pop ( $data );
$key = key ( $data2 );
2016-07-17 21:59:35 +00:00
$namespaces = array ( " " => " http://api.twitter.com " ,
" statusnet " => " http://status.net/schema/api/1/ " ,
" friendica " => " http://friendi.ca/schema/api/1/ " ,
" georss " => " http://www.georss.org/georss " );
2016-07-16 10:32:08 +00:00
2016-07-17 17:42:30 +00:00
/// @todo Auto detection of needed namespaces
if ( in_array ( $root_element , array ( " ok " , " hash " , " config " , " version " , " ids " , " notes " , " photos " )))
2016-07-16 10:32:08 +00:00
$namespaces = array ();
2016-07-15 13:37:51 +00:00
if ( is_array ( $data2 ))
api_walk_recursive ( $data2 , " api_reformat_xml " );
if ( $key == " 0 " ) {
$data4 = array ();
$i = 1 ;
2016-07-16 10:32:08 +00:00
2016-07-15 13:37:51 +00:00
foreach ( $data2 AS $item )
2016-07-16 10:32:08 +00:00
$data4 [ $i ++. " : " . $childname ] = $item ;
2016-07-17 17:42:30 +00:00
$data2 = $data4 ;
}
2016-07-15 13:37:51 +00:00
2016-07-17 17:42:30 +00:00
$data3 = array ( $root_element => $data2 );
2016-07-15 13:37:51 +00:00
$ret = xml :: from_array ( $data3 , $xml , false , $namespaces );
return $ret ;
}
2011-04-21 15:03:31 +00:00
/**
2016-07-17 21:59:35 +00:00
* @ brief Formats the data according to the data type
*
* @ param string $root_element Name of the root element
* @ param string $type Return type ( atom , rss , xml , json )
* @ param array $data JSON style array
*
* @ return ( string | object ) XML data or JSON data
2011-04-21 15:03:31 +00:00
*/
2016-07-17 21:59:35 +00:00
function api_format_data ( $root_element , $type , $data ){
2011-06-21 00:16:13 +00:00
2011-07-31 23:35:53 +00:00
$a = get_app ();
2011-04-21 15:03:31 +00:00
switch ( $type ){
case " atom " :
2011-07-31 23:35:53 +00:00
case " rss " :
2011-04-21 15:03:31 +00:00
case " xml " :
2016-07-17 21:59:35 +00:00
$ret = api_create_xml ( $data , $root_element );
2011-04-21 15:03:31 +00:00
break ;
case " json " :
$ret = $data ;
break ;
}
2014-01-08 00:14:58 +00:00
2011-04-21 15:03:31 +00:00
return $ret ;
}
2013-12-15 22:00:47 +00:00
2011-02-16 07:56:47 +00:00
/**
** TWITTER API
*/
2013-12-15 22:00:47 +00:00
2011-02-16 07:56:47 +00:00
/**
2013-12-15 22:00:47 +00: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 07:56:47 +00:00
* http :// developer . twitter . com / doc / get / account / verify_credentials
*/
2011-04-21 15:03:31 +00:00
function api_account_verify_credentials ( & $a , $type ){
2015-12-27 16:45:20 +00:00
if ( api_user () === false ) throw new ForbiddenException ();
2013-12-29 16:54:37 +00:00
unset ( $_REQUEST [ " user_id " ]);
unset ( $_GET [ " user_id " ]);
2014-01-05 15:12:03 +00:00
unset ( $_REQUEST [ " screen_name " ]);
unset ( $_GET [ " screen_name " ]);
$skip_status = ( x ( $_REQUEST , 'skip_status' ) ? $_REQUEST [ 'skip_status' ] : false );
2011-02-16 07:56:47 +00:00
$user_info = api_get_user ( $a );
2013-12-15 22:00:47 +00:00
2013-12-20 22:07:11 +00:00
// "verified" isn't used here in the standard
unset ( $user_info [ " verified " ]);
// - Adding last status
2014-01-05 15:12:03 +00: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 22:07:11 +00:00
2014-01-08 00:14:58 +00:00
// "uid" and "self" are only needed for some internal stuff, so remove it from here
2013-12-20 22:07:11 +00:00
unset ( $user_info [ " uid " ]);
unset ( $user_info [ " self " ]);
2016-07-17 21:59:35 +00:00
return api_format_data ( " user " , $type , array ( 'user' => $user_info ));
2011-04-21 15:03:31 +00:00
2011-02-16 07:56:47 +00:00
}
api_register_func ( 'api/account/verify_credentials' , 'api_account_verify_credentials' , true );
2013-12-15 22:00:47 +00:00
2011-06-20 01:50:18 +00:00
2011-07-29 15:21:02 +00:00
/**
* get data from $_POST or $_GET
*/
function requestdata ( $k ){
if ( isset ( $_POST [ $k ])){
return $_POST [ $k ];
}
if ( isset ( $_GET [ $k ])){
return $_GET [ $k ];
}
return null ;
}
2011-09-12 04:52:50 +00:00
2012-02-22 07:35:50 +00:00
/*Waitman Gobble Mod*/
2014-04-22 13:56:28 +00:00
function api_statuses_mediap ( & $a , $type ) {
if ( api_user () === false ) {
logger ( 'api_statuses_update: no user' );
2015-12-27 16:45:20 +00:00
throw new ForbiddenException ();
2014-04-22 13:56:28 +00:00
}
$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'));
if (( strpos ( $txt , '<' ) !== false ) || ( strpos ( $txt , '>' ) !== false )) {
2015-08-18 06:38:42 +00:00
2012-02-22 07:35:50 +00:00
$txt = html2bb_video ( $txt );
$config = HTMLPurifier_Config :: createDefault ();
2014-04-22 13:56:28 +00:00
$config -> set ( 'Cache.DefinitionImpl' , null );
2012-02-22 07:35:50 +00:00
$purifier = new HTMLPurifier ( $config );
2014-04-22 13:56:28 +00:00
$txt = $purifier -> purify ( $txt );
2012-02-22 07:35:50 +00:00
}
$txt = html2bbcode ( $txt );
2013-02-15 19:14:45 +00:00
2014-04-22 13:56:28 +00:00
$a -> argv [ 1 ] = $user_info [ 'screen_name' ]; //should be set to username?
2013-02-15 19:14:45 +00:00
2012-02-22 07:35:50 +00:00
$_REQUEST [ 'hush' ] = 'yeah' ; //tell wall_upload function to return img info instead of echo
$bebop = wall_upload_post ( $a );
2013-02-15 19:14:45 +00:00
2012-02-22 07:35:50 +00:00
//now that we have the img url in bbcode we can add it to the status and insert the wall item.
2014-04-22 13:56:28 +00:00
$_REQUEST [ 'body' ] = $txt . " \n \n " . $bebop ;
item_post ( $a );
// this should output the last post (the one we just posted).
return api_status_show ( $a , $type );
}
2015-12-27 16:45:20 +00:00
api_register_func ( 'api/statuses/mediap' , 'api_statuses_mediap' , true , API_METHOD_POST );
2012-02-22 07:35:50 +00:00
/*Waitman Gobble Mod*/
2011-06-20 03:13:24 +00:00
function api_statuses_update ( & $a , $type ) {
2012-12-01 00:26:54 +00:00
if ( api_user () === false ) {
2012-01-15 21:57:00 +00:00
logger ( 'api_statuses_update: no user' );
2015-12-27 16:45:20 +00:00
throw new ForbiddenException ();
2012-01-15 21:57:00 +00:00
}
2014-11-18 22:55:45 +00:00
2011-06-20 01:50:18 +00:00
$user_info = api_get_user ( $a );
// convert $_POST array items to the form we use for web posts.
2011-08-01 00:52:36 +00:00
// logger('api_post: ' . print_r($_POST,true));
2011-09-12 04:52:50 +00:00
if ( requestdata ( 'htmlstatus' )) {
$txt = requestdata ( 'htmlstatus' );
if (( strpos ( $txt , '<' ) !== false ) || ( strpos ( $txt , '>' ) !== false )) {
2011-10-12 01:24:37 +00:00
$txt = html2bb_video ( $txt );
2011-09-12 04:52:50 +00:00
$config = HTMLPurifier_Config :: createDefault ();
$config -> set ( 'Cache.DefinitionImpl' , null );
$purifier = new HTMLPurifier ( $config );
$txt = $purifier -> purify ( $txt );
2012-01-15 21:57:00 +00:00
$_REQUEST [ 'body' ] = html2bbcode ( $txt );
2011-09-12 04:52:50 +00:00
}
2015-02-17 19:43:11 +00:00
} else
2012-07-08 16:27:11 +00:00
$_REQUEST [ 'body' ] = requestdata ( 'status' );
2011-08-01 00:52:36 +00:00
2012-11-04 22:18:52 +00:00
$_REQUEST [ 'title' ] = requestdata ( 'title' );
2011-08-01 00:52:36 +00:00
$parent = requestdata ( 'in_reply_to_status_id' );
2015-08-17 20:38:05 +00:00
// Twidere sends "-1" if it is no reply ...
if ( $parent == - 1 )
$parent = " " ;
2011-08-01 00:52:36 +00:00
if ( ctype_digit ( $parent ))
2012-01-15 21:57:00 +00:00
$_REQUEST [ 'parent' ] = $parent ;
2011-08-01 00:52:36 +00:00
else
2012-01-15 21:57:00 +00:00
$_REQUEST [ 'parent_uri' ] = $parent ;
2011-08-01 00:52:36 +00:00
2011-07-29 15:21:02 +00:00
if ( requestdata ( 'lat' ) && requestdata ( 'long' ))
2012-01-15 21:57:00 +00:00
$_REQUEST [ 'coord' ] = sprintf ( " %s %s " , requestdata ( 'lat' ), requestdata ( 'long' ));
2012-12-01 00:26:54 +00:00
$_REQUEST [ 'profile_uid' ] = api_user ();
2012-06-26 00:45:33 +00:00
2012-06-17 03:41:23 +00:00
if ( $parent )
2012-01-15 21:57:00 +00:00
$_REQUEST [ 'type' ] = 'net-comment' ;
2012-04-22 17:37:25 +00:00
else {
2014-11-18 22:55:45 +00: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 );
2016-02-14 10:24:51 +00:00
#die(api_error($a, $type, sprintf(t("Daily posting limit of %d posts reached. The post was rejected."), $throttle_day)));
throw new TooManyRequestsException ( sprintf ( t ( " Daily posting limit of %d posts reached. The post was rejected. " ), $throttle_day ));
2014-11-18 22:55:45 +00:00
}
}
$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 );
2016-02-14 10:24:51 +00:00
#die(api_error($a, $type, sprintf(t("Weekly posting limit of %d posts reached. The post was rejected."), $throttle_week)));
throw new TooManyRequestsException ( sprintf ( t ( " Weekly posting limit of %d posts reached. The post was rejected. " ), $throttle_week ));
2014-11-18 22:55:45 +00:00
}
}
$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 );
2016-02-14 10:24:51 +00:00
#die(api_error($a, $type, sprintf(t("Monthly posting limit of %d posts reached. The post was rejected."), $throttle_month)));
throw new TooManyRequestsException ( sprintf ( t ( " Monthly posting limit of %d posts reached. The post was rejected. " ), $throttle_month ));
2014-11-18 22:55:45 +00:00
}
}
2012-01-15 21:57:00 +00:00
$_REQUEST [ 'type' ] = 'wall' ;
2015-02-17 19:43:11 +00:00
}
if ( x ( $_FILES , 'media' )) {
// upload the image if we have one
$_REQUEST [ 'hush' ] = 'yeah' ; //tell wall_upload function to return img info instead of echo
$media = wall_upload_post ( $a );
if ( strlen ( $media ) > 0 )
$_REQUEST [ 'body' ] .= " \n \n " . $media ;
2012-04-22 17:37:25 +00:00
}
2011-06-20 01:50:18 +00:00
2015-12-27 16:45:20 +00:00
// To-Do: Multiple IDs
2015-04-06 01:19:12 +00:00
if ( requestdata ( 'media_ids' )) {
$r = q ( " SELECT `resource-id`, `scale`, `nickname`, `type` FROM `photo` INNER JOIN `user` ON `user`.`uid` = `photo`.`uid` WHERE `resource-id` IN (SELECT `resource-id` FROM `photo` WHERE `id` = %d) AND `scale` > 0 AND `photo`.`uid` = %d ORDER BY `photo`.`width` DESC LIMIT 1 " ,
intval ( requestdata ( 'media_ids' )), api_user ());
if ( $r ) {
$phototypes = Photo :: supportedTypes ();
$ext = $phototypes [ $r [ 0 ][ 'type' ]];
$_REQUEST [ 'body' ] .= " \n \n " . '[url=' . $a -> get_baseurl () . '/photos/' . $r [ 0 ][ 'nickname' ] . '/image/' . $r [ 0 ][ 'resource-id' ] . ']' ;
$_REQUEST [ 'body' ] .= '[img]' . $a -> get_baseurl () . " /photo/ " . $r [ 0 ][ 'resource-id' ] . " - " . $r [ 0 ][ 'scale' ] . " . " . $ext . " [/img][/url] " ;
}
}
2011-06-20 01:50:18 +00:00
// set this so that the item_post() function is quiet and doesn't redirect or emit json
2012-01-15 21:57:00 +00:00
$_REQUEST [ 'api_source' ] = true ;
2011-06-20 01:50:18 +00:00
2014-09-28 15:23:01 +00:00
if ( ! x ( $_REQUEST , " source " ))
$_REQUEST [ " source " ] = api_source ();
2014-09-27 21:37:05 +00:00
2011-06-20 01:50:18 +00:00
// call out normal post function
2013-12-15 22:00:47 +00:00
item_post ( $a );
2011-06-20 01:50:18 +00:00
// this should output the last post (the one we just posted).
2011-06-20 04:08:51 +00:00
return api_status_show ( $a , $type );
2011-06-20 01:50:18 +00:00
}
2015-12-27 16:45:20 +00:00
api_register_func ( 'api/statuses/update' , 'api_statuses_update' , true , API_METHOD_POST );
api_register_func ( 'api/statuses/update_with_media' , 'api_statuses_update' , true , API_METHOD_POST );
2011-06-20 01:50:18 +00:00
2011-06-20 04:08:51 +00:00
2015-04-06 01:19:12 +00:00
function api_media_upload ( & $a , $type ) {
if ( api_user () === false ) {
logger ( 'no user' );
2015-12-27 16:45:20 +00:00
throw new ForbiddenException ();
2015-04-06 01:19:12 +00:00
}
$user_info = api_get_user ( $a );
if ( ! x ( $_FILES , 'media' )) {
// Output error
2015-12-27 16:45:20 +00:00
throw new BadRequestException ( " No media. " );
2015-04-06 01:19:12 +00:00
}
$media = wall_upload_post ( $a , false );
if ( ! $media ) {
// Output error
2015-12-27 16:45:20 +00:00
throw new InternalServerErrorException ();
2015-04-06 01:19:12 +00:00
}
$returndata = array ();
$returndata [ " media_id " ] = $media [ " id " ];
$returndata [ " media_id_string " ] = ( string ) $media [ " id " ];
$returndata [ " size " ] = $media [ " size " ];
$returndata [ " image " ] = array ( " w " => $media [ " width " ],
" h " => $media [ " height " ],
" image_type " => $media [ " type " ]);
logger ( " Media uploaded: " . print_r ( $returndata , true ), LOGGER_DEBUG );
return array ( " media " => $returndata );
}
2015-12-27 16:45:20 +00:00
api_register_func ( 'api/media/upload' , 'api_media_upload' , true , API_METHOD_POST );
2015-04-06 01:19:12 +00:00
2011-06-20 04:08:51 +00:00
function api_status_show ( & $a , $type ){
$user_info = api_get_user ( $a );
2014-01-08 00:14:58 +00:00
logger ( 'api_status_show: user_info: ' . print_r ( $user_info , true ), LOGGER_DEBUG );
2015-11-07 13:36:00 +00:00
if ( $type == " raw " )
$privacy_sql = " AND `item`.`allow_cid`='' AND `item`.`allow_gid`='' AND `item`.`deny_cid`='' AND `item`.`deny_gid`='' " ;
else
$privacy_sql = " " ;
2011-06-20 04:08:51 +00:00
// get last public wall message
2014-03-11 22:52:32 +00:00
$lastwall = q ( " SELECT `item`.*, `i`.`contact-id` as `reply_uid`, `i`.`author-link` AS `item-author`
FROM `item` , `item` as `i`
2015-01-31 22:13:21 +00:00
WHERE `item` . `contact-id` = % d AND `item` . `uid` = % d
2014-01-13 19:03:05 +00:00
AND (( `item` . `author-link` IN ( '%s' , '%s' )) OR ( `item` . `owner-link` IN ( '%s' , '%s' )))
2011-06-20 04:08:51 +00:00
AND `i` . `id` = `item` . `parent`
2015-11-07 13:36:00 +00:00
AND `item` . `type` != 'activity' $privacy_sql
2013-10-05 10:30:10 +00:00
ORDER BY `item` . `created` DESC
2011-06-20 04:08:51 +00:00
LIMIT 1 " ,
2013-12-19 05:58:11 +00:00
intval ( $user_info [ 'cid' ]),
2015-01-31 22:13:21 +00:00
intval ( api_user ()),
2014-01-13 19:03:05 +00:00
dbesc ( $user_info [ 'url' ]),
dbesc ( normalise_link ( $user_info [ 'url' ])),
dbesc ( $user_info [ 'url' ]),
dbesc ( normalise_link ( $user_info [ 'url' ]))
2011-06-20 04:08:51 +00:00
);
if ( count ( $lastwall ) > 0 ){
$lastwall = $lastwall [ 0 ];
2013-02-15 19:14:45 +00:00
2013-12-15 22:00:47 +00:00
$in_reply_to_status_id = NULL ;
$in_reply_to_user_id = NULL ;
2014-01-13 19:03:05 +00:00
$in_reply_to_status_id_str = NULL ;
$in_reply_to_user_id_str = NULL ;
2013-12-15 22:00:47 +00:00
$in_reply_to_screen_name = NULL ;
2014-07-21 22:33:48 +00:00
if ( intval ( $lastwall [ 'parent' ]) != intval ( $lastwall [ 'id' ])) {
2014-01-13 19:03:05 +00:00
$in_reply_to_status_id = intval ( $lastwall [ 'parent' ]);
$in_reply_to_status_id_str = ( string ) intval ( $lastwall [ 'parent' ]);
2013-12-19 05:58:11 +00:00
2016-01-06 21:23:12 +00:00
$r = q ( " SELECT * FROM `gcontact` WHERE `nurl` = '%s' " , dbesc ( normalise_link ( $lastwall [ 'item-author' ])));
2013-12-19 05:58:11 +00:00
if ( $r ) {
2014-01-02 21:29:44 +00: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 19:03:05 +00:00
$in_reply_to_user_id = intval ( $r [ 0 ][ 'id' ]);
$in_reply_to_user_id_str = ( string ) intval ( $r [ 0 ][ 'id' ]);
2013-12-19 05:58:11 +00:00
}
2013-02-15 19:14:45 +00:00
}
2014-01-08 00:14:58 +00:00
2014-07-21 22:33:48 +00: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-11-07 13:36:00 +00:00
$converted = api_convert_item ( $lastwall );
2015-01-01 17:31:50 +00:00
2016-07-17 21:59:35 +00:00
if ( $type == " xml " )
$geo = " georss:point " ;
else
$geo = " geo " ;
2011-06-20 04:08:51 +00:00
$status_info = array (
2015-06-02 14:19:40 +00:00
'created_at' => api_date ( $lastwall [ 'created' ]),
'id' => intval ( $lastwall [ 'id' ]),
'id_str' => ( string ) $lastwall [ 'id' ],
2015-01-01 17:31:50 +00:00
'text' => $converted [ " text " ],
2015-06-02 14:19:40 +00:00
'source' => (( $lastwall [ 'app' ]) ? $lastwall [ 'app' ] : 'web' ),
2011-06-20 04:08:51 +00:00
'truncated' => false ,
'in_reply_to_status_id' => $in_reply_to_status_id ,
2014-01-13 19:03:05 +00:00
'in_reply_to_status_id_str' => $in_reply_to_status_id_str ,
2011-06-20 04:08:51 +00:00
'in_reply_to_user_id' => $in_reply_to_user_id ,
2014-01-13 19:03:05 +00:00
'in_reply_to_user_id_str' => $in_reply_to_user_id_str ,
2011-06-20 04:08:51 +00:00
'in_reply_to_screen_name' => $in_reply_to_screen_name ,
2015-06-02 14:19:40 +00:00
'user' => $user_info ,
2016-07-17 21:59:35 +00:00
$geo => NULL ,
2015-06-02 14:19:40 +00:00
'coordinates' => " " ,
'place' => " " ,
'contributors' => " " ,
'is_quote_status' => false ,
'retweet_count' => 0 ,
'favorite_count' => 0 ,
2014-12-31 11:34:32 +00:00
'favorited' => $lastwall [ 'starred' ] ? true : false ,
2015-06-02 14:19:40 +00:00
'retweeted' => false ,
'possibly_sensitive' => false ,
'lang' => " " ,
2015-01-01 17:31:50 +00:00
'statusnet_html' => $converted [ " html " ],
2013-12-15 22:00:47 +00:00
'statusnet_conversation_id' => $lastwall [ 'parent' ],
2011-06-20 04:08:51 +00:00
);
2013-12-15 22:00:47 +00:00
2015-01-01 17:31:50 +00:00
if ( count ( $converted [ " attachments " ]) > 0 )
$status_info [ " attachments " ] = $converted [ " attachments " ];
2014-03-20 17:44:24 +00:00
2015-01-01 17:31:50 +00:00
if ( count ( $converted [ " entities " ]) > 0 )
$status_info [ " entities " ] = $converted [ " entities " ];
2014-02-02 08:54:33 +00:00
2013-12-23 13:06:53 +00:00
if (( $lastwall [ 'item_network' ] != " " ) AND ( $status [ " source " ] == 'web' ))
2015-07-16 08:09:59 +00:00
$status_info [ " source " ] = network_to_name ( $lastwall [ 'item_network' ], $user_info [ 'url' ]);
elseif (( $lastwall [ 'item_network' ] != " " ) AND ( network_to_name ( $lastwall [ 'item_network' ], $user_info [ 'url' ]) != $status_info [ " source " ]))
$status_info [ " source " ] = trim ( $status_info [ " source " ] . ' (' . network_to_name ( $lastwall [ 'item_network' ], $user_info [ 'url' ]) . ')' );
2013-12-23 13:06:53 +00:00
2014-01-08 00:14:58 +00:00
// "uid" and "self" are only needed for some internal stuff, so remove it from here
2013-12-15 22:00:47 +00:00
unset ( $status_info [ " user " ][ " uid " ]);
unset ( $status_info [ " user " ][ " self " ]);
2011-06-20 04:08:51 +00:00
}
2013-12-15 22:00:47 +00:00
2015-11-07 13:36:00 +00:00
logger ( 'status_info: ' . print_r ( $status_info , true ), LOGGER_DEBUG );
2013-12-20 22:07:11 +00:00
if ( $type == " raw " )
return ( $status_info );
2016-07-17 21:59:35 +00:00
return api_format_data ( " statuses " , $type , array ( 'status' => $status_info ));
2013-12-15 22:00:47 +00:00
2011-06-20 04:08:51 +00:00
}
2013-12-15 22:00:47 +00:00
2011-02-16 07:56:47 +00:00
/**
* Returns extended information of a given user , specified by ID or screen name as per the required id parameter .
* The author ' s most recent status will be returned inline .
* http :// developer . twitter . com / doc / get / users / show
*/
2011-04-21 15:03:31 +00:00
function api_users_show ( & $a , $type ){
2011-02-16 07:56:47 +00:00
$user_info = api_get_user ( $a );
2013-12-15 22:00:47 +00:00
$lastwall = q ( " SELECT `item`.*
FROM `item` , `contact`
2014-04-22 13:56:28 +00:00
WHERE `item` . `uid` = % d AND `verb` = '%s' AND `item` . `contact-id` = % d
2014-01-13 19:03:05 +00:00
AND (( `item` . `author-link` IN ( '%s' , '%s' )) OR ( `item` . `owner-link` IN ( '%s' , '%s' )))
2013-12-15 22:00:47 +00:00
AND `contact` . `id` = `item` . `contact-id`
2011-04-21 15:03:31 +00:00
AND `type` != 'activity'
AND `item` . `allow_cid` = '' AND `item` . `allow_gid` = '' AND `item` . `deny_cid` = '' AND `item` . `deny_gid` = ''
2013-12-15 22:00:47 +00:00
ORDER BY `created` DESC
2011-04-21 15:03:31 +00:00
LIMIT 1 " ,
2014-03-09 08:19:14 +00:00
intval ( api_user ()),
2014-04-22 13:56:28 +00:00
dbesc ( ACTIVITY_POST ),
2013-12-19 05:58:11 +00:00
intval ( $user_info [ 'cid' ]),
2014-01-13 19:03:05 +00:00
dbesc ( $user_info [ 'url' ]),
dbesc ( normalise_link ( $user_info [ 'url' ])),
dbesc ( $user_info [ 'url' ]),
dbesc ( normalise_link ( $user_info [ 'url' ]))
2011-02-15 11:24:21 +00:00
);
2011-04-21 15:03:31 +00:00
if ( count ( $lastwall ) > 0 ){
$lastwall = $lastwall [ 0 ];
2013-12-15 22:00:47 +00:00
$in_reply_to_status_id = NULL ;
$in_reply_to_user_id = NULL ;
2014-01-13 19:03:05 +00:00
$in_reply_to_status_id_str = NULL ;
$in_reply_to_user_id_str = NULL ;
2013-12-15 22:00:47 +00:00
$in_reply_to_screen_name = NULL ;
2011-04-21 15:03:31 +00:00
if ( $lastwall [ 'parent' ] != $lastwall [ 'id' ]) {
2013-12-19 05:58:11 +00: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 13:56:28 +00:00
FROM `item` , `contact` WHERE `contact` . `id` = `item` . `contact-id` AND `item` . `id` = % d " , intval( $lastwall['parent'] ));
2013-12-15 22:00:47 +00:00
if ( count ( $reply ) > 0 ) {
2014-01-13 19:03:05 +00:00
$in_reply_to_status_id = intval ( $lastwall [ 'parent' ]);
$in_reply_to_status_id_str = ( string ) intval ( $lastwall [ 'parent' ]);
2016-01-06 21:23:12 +00:00
$r = q ( " SELECT * FROM `gcontact` WHERE `nurl` = '%s' " , dbesc ( normalise_link ( $reply [ 0 ][ 'item-author' ])));
2013-12-19 05:58:11 +00:00
if ( $r ) {
2014-01-02 21:29:44 +00: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 19:03:05 +00:00
$in_reply_to_user_id = intval ( $r [ 0 ][ 'id' ]);
$in_reply_to_user_id_str = ( string ) intval ( $r [ 0 ][ 'id' ]);
2013-12-19 05:58:11 +00:00
}
2013-12-15 22:00:47 +00:00
}
2013-02-15 19:14:45 +00:00
}
2015-01-01 17:31:50 +00:00
2015-11-07 13:36:00 +00:00
$converted = api_convert_item ( $lastwall );
2015-01-01 17:31:50 +00:00
2016-07-17 21:59:35 +00:00
if ( $type == " xml " )
$geo = " georss:point " ;
else
$geo = " geo " ;
2011-04-21 15:03:31 +00:00
$user_info [ 'status' ] = array (
2015-01-01 17:31:50 +00:00
'text' => $converted [ " text " ],
2011-04-21 15:03:31 +00:00
'truncated' => false ,
2013-12-15 22:00:47 +00:00
'created_at' => api_date ( $lastwall [ 'created' ]),
2011-04-21 15:03:31 +00:00
'in_reply_to_status_id' => $in_reply_to_status_id ,
2014-01-13 19:03:05 +00:00
'in_reply_to_status_id_str' => $in_reply_to_status_id_str ,
2013-12-15 22:00:47 +00:00
'source' => (( $lastwall [ 'app' ]) ? $lastwall [ 'app' ] : 'web' ),
2014-01-13 19:03:05 +00:00
'id' => intval ( $lastwall [ 'contact-id' ]),
'id_str' => ( string ) $lastwall [ 'contact-id' ],
2011-04-21 15:03:31 +00:00
'in_reply_to_user_id' => $in_reply_to_user_id ,
2014-01-13 19:03:05 +00:00
'in_reply_to_user_id_str' => $in_reply_to_user_id_str ,
2011-04-21 15:03:31 +00:00
'in_reply_to_screen_name' => $in_reply_to_screen_name ,
2016-07-17 21:59:35 +00:00
$geo => NULL ,
2014-12-31 11:34:32 +00:00
'favorited' => $lastwall [ 'starred' ] ? true : false ,
2015-01-01 17:31:50 +00:00
'statusnet_html' => $converted [ " html " ],
2013-12-15 22:00:47 +00:00
'statusnet_conversation_id' => $lastwall [ 'parent' ],
2011-04-21 15:03:31 +00:00
);
2013-12-23 13:06:53 +00:00
2015-01-01 17:31:50 +00:00
if ( count ( $converted [ " attachments " ]) > 0 )
$user_info [ " status " ][ " attachments " ] = $converted [ " attachments " ];
2014-12-31 16:01:55 +00:00
2015-01-01 17:31:50 +00:00
if ( count ( $converted [ " entities " ]) > 0 )
$user_info [ " status " ][ " entities " ] = $converted [ " entities " ];
2014-02-02 08:54:33 +00:00
2013-12-23 13:06:53 +00:00
if (( $lastwall [ 'item_network' ] != " " ) AND ( $user_info [ " status " ][ " source " ] == 'web' ))
2015-07-16 08:09:59 +00:00
$user_info [ " status " ][ " source " ] = network_to_name ( $lastwall [ 'item_network' ], $user_info [ 'url' ]);
if (( $lastwall [ 'item_network' ] != " " ) AND ( network_to_name ( $lastwall [ 'item_network' ], $user_info [ 'url' ]) != $user_info [ " status " ][ " source " ]))
$user_info [ " status " ][ " source " ] = trim ( $user_info [ " status " ][ " source " ] . ' (' . network_to_name ( $lastwall [ 'item_network' ], $user_info [ 'url' ]) . ')' );
2013-12-23 13:06:53 +00:00
2011-04-21 15:03:31 +00:00
}
2013-12-15 22:00:47 +00:00
2014-01-08 00:14:58 +00:00
// "uid" and "self" are only needed for some internal stuff, so remove it from here
2013-12-15 22:00:47 +00:00
unset ( $user_info [ " uid " ]);
unset ( $user_info [ " self " ]);
2016-07-17 21:59:35 +00:00
return api_format_data ( " user " , $type , array ( 'user' => $user_info ));
2012-04-22 16:00:24 +00:00
2011-02-15 11:24:21 +00:00
}
api_register_func ( 'api/users/show' , 'api_users_show' );
2012-04-22 16:00:24 +00:00
2014-09-07 05:32:09 +00:00
function api_users_search ( & $a , $type ) {
$page = ( x ( $_REQUEST , 'page' ) ? $_REQUEST [ 'page' ] - 1 : 0 );
$userlist = array ();
if ( isset ( $_GET [ " q " ])) {
2016-01-06 21:23:12 +00:00
$r = q ( " SELECT id FROM `gcontact` WHERE `name`='%s' " , dbesc ( $_GET [ " q " ]));
2014-09-07 05:32:09 +00:00
if ( ! count ( $r ))
2016-01-06 21:23:12 +00:00
$r = q ( " SELECT `id` FROM `gcontact` WHERE `nick`='%s' " , dbesc ( $_GET [ " q " ]));
2014-09-07 05:32:09 +00:00
if ( count ( $r )) {
2016-07-17 21:59:35 +00:00
$k = 0 ;
2014-09-07 05:32:09 +00:00
foreach ( $r AS $user ) {
2016-07-17 21:59:35 +00:00
$user_info = api_get_user ( $a , $user [ " id " ], " json " );
if ( $type == " xml " )
$userlist [ $k ++. " :user " ] = $user_info ;
else
$userlist [] = $user_info ;
2014-09-07 05:32:09 +00:00
}
$userlist = array ( " users " => $userlist );
2015-12-27 16:45:20 +00:00
} else {
throw new BadRequestException ( " User not found. " );
}
} else {
throw new BadRequestException ( " User not found. " );
}
2016-07-17 21:59:35 +00:00
return api_format_data ( " users " , $type , $userlist );
2014-09-07 05:32:09 +00:00
}
api_register_func ( 'api/users/search' , 'api_users_search' );
2011-02-15 11:24:21 +00:00
/**
2012-04-22 16:00:24 +00:00
*
2011-02-15 11:24:21 +00:00
* http :// developer . twitter . com / doc / get / statuses / home_timeline
2012-04-22 16:00:24 +00:00
*
2015-12-27 16:45:20 +00:00
* TODO : Optional parameters
* TODO : Add reply info
2011-02-15 11:24:21 +00:00
*/
2011-04-21 15:03:31 +00:00
function api_statuses_home_timeline ( & $a , $type ){
2015-12-27 16:45:20 +00:00
if ( api_user () === false ) throw new ForbiddenException ();
2012-04-22 16:00:24 +00:00
2013-12-29 16:54:37 +00:00
unset ( $_REQUEST [ " user_id " ]);
unset ( $_GET [ " user_id " ]);
2014-01-05 15:12:03 +00:00
unset ( $_REQUEST [ " screen_name " ]);
unset ( $_GET [ " screen_name " ]);
2011-02-16 07:56:47 +00:00
$user_info = api_get_user ( $a );
2011-02-15 11:24:21 +00:00
// get last newtork messages
2011-07-31 23:35:53 +00:00
2011-08-26 14:35:51 +00:00
2011-08-19 12:57:54 +00:00
// params
2011-08-19 18:33:34 +00:00
$count = ( x ( $_REQUEST , 'count' ) ? $_REQUEST [ 'count' ] : 20 );
$page = ( x ( $_REQUEST , 'page' ) ? $_REQUEST [ 'page' ] - 1 : 0 );
if ( $page < 0 ) $page = 0 ;
2012-03-18 16:52:51 +00:00
$since_id = ( x ( $_REQUEST , 'since_id' ) ? $_REQUEST [ 'since_id' ] : 0 );
2012-03-18 18:00:24 +00:00
$max_id = ( x ( $_REQUEST , 'max_id' ) ? $_REQUEST [ 'max_id' ] : 0 );
2012-03-18 16:52:51 +00:00
//$since_id = 0;//$since_id = (x($_REQUEST,'since_id')?$_REQUEST['since_id']:0);
2013-06-16 11:28:04 +00:00
$exclude_replies = ( x ( $_REQUEST , 'exclude_replies' ) ? 1 : 0 );
2013-06-16 11:42:43 +00:00
$conversation_id = ( x ( $_REQUEST , 'conversation_id' ) ? $_REQUEST [ 'conversation_id' ] : 0 );
2012-04-22 16:00:24 +00:00
2011-08-19 12:57:54 +00:00
$start = $page * $count ;
2012-06-19 14:15:19 +00:00
$sql_extra = '' ;
2012-03-18 18:00:24 +00:00
if ( $max_id > 0 )
2012-06-19 14:15:19 +00:00
$sql_extra .= ' AND `item`.`id` <= ' . intval ( $max_id );
if ( $exclude_replies > 0 )
$sql_extra .= ' AND `item`.`parent` = `item`.`id`' ;
2013-06-16 11:42:43 +00:00
if ( $conversation_id > 0 )
$sql_extra .= ' AND `item`.`parent` = ' . intval ( $conversation_id );
2012-03-18 18:00:24 +00:00
2015-05-22 23:23:31 +00:00
$r = q ( " SELECT STRAIGHT_JOIN `item`.*, `item`.`id` AS `item_id`, `item`.`network` AS `item_network`,
2011-07-31 23:35:53 +00:00
`contact` . `name` , `contact` . `photo` , `contact` . `url` , `contact` . `rel` ,
`contact` . `network` , `contact` . `thumb` , `contact` . `dfrn-id` , `contact` . `self` ,
2016-06-12 19:04:55 +00:00
`contact` . `id` AS `cid`
2011-07-31 23:35:53 +00:00
FROM `item` , `contact`
2014-04-22 13:56:28 +00:00
WHERE `item` . `uid` = % d AND `verb` = '%s'
2012-01-24 04:56:11 +00:00
AND `item` . `visible` = 1 and `item` . `moderated` = 0 AND `item` . `deleted` = 0
2011-07-31 23:35:53 +00:00
AND `contact` . `id` = `item` . `contact-id`
AND `contact` . `blocked` = 0 AND `contact` . `pending` = 0
$sql_extra
2011-08-19 18:33:34 +00:00
AND `item` . `id` >% d
2014-02-02 08:54:33 +00:00
ORDER BY `item` . `id` DESC LIMIT % d , % d " ,
2013-12-15 22:00:47 +00:00
intval ( api_user ()),
2014-04-22 13:56:28 +00:00
dbesc ( ACTIVITY_POST ),
2011-08-19 18:33:34 +00:00
intval ( $since_id ),
2011-08-19 14:55:43 +00:00
intval ( $start ), intval ( $count )
2011-07-31 23:35:53 +00:00
);
2016-01-02 11:54:57 +00:00
2016-07-17 21:59:35 +00:00
$ret = api_format_items ( $r , $user_info , false , $type );
2011-07-31 23:35:53 +00:00
2015-04-03 12:58:42 +00:00
// Set all posts from the query above to seen
$idarray = array ();
foreach ( $r AS $item )
$idarray [] = intval ( $item [ " id " ]);
$idlist = implode ( " , " , $idarray );
2016-04-28 04:56:55 +00:00
if ( $idlist != " " ) {
$unseen = q ( " SELECT `id` FROM `item` WHERE `unseen` AND `id` IN (%s) " , $idlist );
2012-08-13 02:29:37 +00:00
2016-04-28 04:56:55 +00:00
if ( $unseen )
$r = q ( " UPDATE `item` SET `unseen` = 0 WHERE `unseen` AND `id` IN (%s) " , $idlist );
}
2012-04-22 16:00:24 +00:00
2016-07-17 17:42:30 +00:00
$data = array ( 'status' => $ret );
2011-07-31 23:35:53 +00:00
switch ( $type ){
case " atom " :
case " rss " :
$data = api_rss_extra ( $a , $data , $user_info );
2012-04-08 15:23:38 +00:00
break ;
2011-07-31 23:35:53 +00:00
}
2012-04-22 16:00:24 +00:00
2016-07-17 21:59:35 +00:00
return api_format_data ( " statuses " , $type , $data );
2011-07-31 23:35:53 +00:00
}
api_register_func ( 'api/statuses/home_timeline' , 'api_statuses_home_timeline' , true );
api_register_func ( 'api/statuses/friends_timeline' , 'api_statuses_home_timeline' , true );
2012-04-08 18:19:14 +00:00
function api_statuses_public_timeline ( & $a , $type ){
2015-12-27 16:45:20 +00:00
if ( api_user () === false ) throw new ForbiddenException ();
2012-04-22 16:00:24 +00:00
2012-04-08 18:19:14 +00:00
$user_info = api_get_user ( $a );
// get last newtork messages
// params
$count = ( x ( $_REQUEST , 'count' ) ? $_REQUEST [ 'count' ] : 20 );
$page = ( x ( $_REQUEST , 'page' ) ? $_REQUEST [ 'page' ] - 1 : 0 );
if ( $page < 0 ) $page = 0 ;
$since_id = ( x ( $_REQUEST , 'since_id' ) ? $_REQUEST [ 'since_id' ] : 0 );
$max_id = ( x ( $_REQUEST , 'max_id' ) ? $_REQUEST [ 'max_id' ] : 0 );
//$since_id = 0;//$since_id = (x($_REQUEST,'since_id')?$_REQUEST['since_id']:0);
2013-06-16 11:28:04 +00:00
$exclude_replies = ( x ( $_REQUEST , 'exclude_replies' ) ? 1 : 0 );
2013-06-16 11:42:43 +00:00
$conversation_id = ( x ( $_REQUEST , 'conversation_id' ) ? $_REQUEST [ 'conversation_id' ] : 0 );
2012-04-22 16:00:24 +00:00
2012-04-08 18:19:14 +00:00
$start = $page * $count ;
if ( $max_id > 0 )
$sql_extra = 'AND `item`.`id` <= ' . intval ( $max_id );
2013-06-16 11:28:04 +00:00
if ( $exclude_replies > 0 )
$sql_extra .= ' AND `item`.`parent` = `item`.`id`' ;
2013-06-16 11:42:43 +00:00
if ( $conversation_id > 0 )
$sql_extra .= ' AND `item`.`parent` = ' . intval ( $conversation_id );
2012-04-08 18:19:14 +00:00
2014-04-22 13:56:28 +00: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` ,
2016-06-12 19:04:55 +00:00
`contact` . `id` AS `cid` ,
2014-04-22 13:56:28 +00:00
`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 18:19:14 +00:00
$sql_extra
AND `item` . `id` >% d
2014-04-22 13:56:28 +00:00
ORDER BY `item` . `id` DESC LIMIT % d , % d " ,
dbesc ( ACTIVITY_POST ),
2012-04-08 18:19:14 +00:00
intval ( $since_id ),
2014-04-22 13:56:28 +00:00
intval ( $start ),
intval ( $count ));
2012-04-08 18:19:14 +00:00
2016-07-17 21:59:35 +00:00
$ret = api_format_items ( $r , $user_info , false , $type );
2012-04-08 18:19:14 +00:00
2012-04-22 16:00:24 +00:00
2016-07-17 17:42:30 +00:00
$data = array ( 'status' => $ret );
2012-04-08 18:19:14 +00:00
switch ( $type ){
case " atom " :
case " rss " :
$data = api_rss_extra ( $a , $data , $user_info );
break ;
}
2012-04-22 16:00:24 +00:00
2016-07-17 21:59:35 +00:00
return api_format_data ( " statuses " , $type , $data );
2012-04-08 18:19:14 +00:00
}
api_register_func ( 'api/statuses/public_timeline' , 'api_statuses_public_timeline' , true );
2012-03-18 16:52:51 +00:00
/**
2014-12-31 11:34:32 +00:00
*
2012-03-18 16:52:51 +00:00
*/
function api_statuses_show ( & $a , $type ){
2015-12-27 16:45:20 +00:00
if ( api_user () === false ) throw new ForbiddenException ();
2012-03-18 16:52:51 +00:00
$user_info = api_get_user ( $a );
// params
$id = intval ( $a -> argv [ 3 ]);
2013-12-15 22:00:47 +00:00
if ( $id == 0 )
$id = intval ( $_REQUEST [ " id " ]);
2014-01-13 19:03:05 +00:00
// Hotot workaround
if ( $id == 0 )
$id = intval ( $a -> argv [ 4 ]);
2012-04-22 16:00:24 +00:00
logger ( 'API: api_statuses_show: ' . $id );
2012-03-18 16:52:51 +00:00
2012-06-22 11:35:36 +00:00
$conversation = ( x ( $_REQUEST , 'conversation' ) ? 1 : 0 );
$sql_extra = '' ;
if ( $conversation )
2013-12-15 22:00:47 +00:00
$sql_extra .= " AND `item`.`parent` = %d ORDER BY `received` ASC " ;
2012-06-22 11:35:36 +00:00
else
$sql_extra .= " AND `item`.`id` = %d " ;
2012-03-18 16:52:51 +00:00
2013-12-23 13:06:53 +00:00
$r = q ( " SELECT `item`.*, `item`.`id` AS `item_id`, `item`.`network` AS `item_network`,
2012-03-18 16:52:51 +00:00
`contact` . `name` , `contact` . `photo` , `contact` . `url` , `contact` . `rel` ,
`contact` . `network` , `contact` . `thumb` , `contact` . `dfrn-id` , `contact` . `self` ,
2016-06-12 19:04:55 +00:00
`contact` . `id` AS `cid`
2012-03-18 16:52:51 +00:00
FROM `item` , `contact`
WHERE `item` . `visible` = 1 and `item` . `moderated` = 0 AND `item` . `deleted` = 0
2014-07-26 13:01:01 +00:00
AND `contact` . `id` = `item` . `contact-id` AND `item` . `uid` = % d AND `item` . `verb` = '%s'
2012-03-18 16:52:51 +00:00
AND `contact` . `blocked` = 0 AND `contact` . `pending` = 0
2012-06-22 11:35:36 +00:00
$sql_extra " ,
2014-07-26 13:01:01 +00:00
intval ( api_user ()),
dbesc ( ACTIVITY_POST ),
2012-03-18 16:52:51 +00:00
intval ( $id )
);
2012-06-22 11:35:36 +00:00
2015-12-27 16:45:20 +00:00
if ( ! $r ) {
throw new BadRequestException ( " There is no status with this id. " );
}
2013-12-20 22:07:11 +00:00
2016-07-17 21:59:35 +00:00
$ret = api_format_items ( $r , $user_info , false , $type );
2012-06-22 11:35:36 +00:00
if ( $conversation ) {
2016-07-17 17:42:30 +00:00
$data = array ( 'status' => $ret );
2016-07-17 21:59:35 +00:00
return api_format_data ( " statuses " , $type , $data );
2012-06-21 08:53:48 +00:00
} else {
2016-07-17 17:42:30 +00:00
$data = array ( 'status' => $ret [ 0 ]);
2016-07-17 21:59:35 +00:00
return api_format_data ( " status " , $type , $data );
2012-06-21 08:53:48 +00:00
}
2012-03-18 16:52:51 +00:00
}
api_register_func ( 'api/statuses/show' , 'api_statuses_show' , true );
2011-07-31 23:35:53 +00:00
2012-04-07 22:02:25 +00:00
2014-01-15 19:35:34 +00:00
/**
*
*/
function api_conversation_show ( & $a , $type ){
2015-12-27 16:45:20 +00:00
if ( api_user () === false ) throw new ForbiddenException ();
2014-01-15 19:35:34 +00:00
$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 );
2015-04-26 11:26:48 +00:00
$r = q ( " SELECT `parent` FROM `item` WHERE `id` = %d " , intval ( $id ));
if ( $r )
$id = $r [ 0 ][ " parent " ];
2014-01-15 19:35:34 +00:00
$sql_extra = '' ;
if ( $max_id > 0 )
$sql_extra = ' AND `item`.`id` <= ' . intval ( $max_id );
2016-04-09 20:44:32 +00:00
// Not sure why this query was so complicated. We should keep it here for a while,
// just to make sure that we really don't need it.
// 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`)
2014-01-15 19:35:34 +00: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` . `dfrn-id` , `contact` . `self` ,
2016-06-12 19:04:55 +00:00
`contact` . `id` AS `cid`
2016-04-09 20:44:32 +00:00
FROM `item`
INNER JOIN `contact` ON `contact` . `id` = `item` . `contact-id`
WHERE `item` . `parent` = % d AND `item` . `visible`
AND NOT `item` . `moderated` AND NOT `item` . `deleted`
AND `item` . `uid` = % d AND `item` . `verb` = '%s'
AND NOT `contact` . `blocked` AND NOT `contact` . `pending`
2014-01-15 19:35:34 +00:00
AND `item` . `id` >% d $sql_extra
2014-02-02 08:54:33 +00:00
ORDER BY `item` . `id` DESC LIMIT % d , % d " ,
2014-01-15 19:35:34 +00:00
intval ( $id ), intval ( api_user ()),
2014-04-22 13:56:28 +00:00
dbesc ( ACTIVITY_POST ),
intval ( $since_id ),
intval ( $start ), intval ( $count )
2014-01-15 19:35:34 +00:00
);
if ( ! $r )
2015-12-27 16:45:20 +00:00
throw new BadRequestException ( " There is no conversation with this id. " );
2014-01-15 19:35:34 +00:00
2016-07-17 21:59:35 +00:00
$ret = api_format_items ( $r , $user_info , false , $type );
2014-01-15 19:35:34 +00:00
2016-07-17 17:42:30 +00:00
$data = array ( 'status' => $ret );
2016-07-17 21:59:35 +00:00
return api_format_data ( " statuses " , $type , $data );
2014-01-15 19:35:34 +00:00
}
api_register_func ( 'api/conversation/show' , 'api_conversation_show' , true );
2016-03-23 09:24:01 +00:00
api_register_func ( 'api/statusnet/conversation' , 'api_conversation_show' , true );
2014-01-15 19:35:34 +00:00
2012-04-07 22:02:25 +00:00
/**
2014-01-08 00:14:58 +00:00
*
2012-04-07 22:02:25 +00:00
*/
function api_statuses_repeat ( & $a , $type ){
2014-01-08 00:14:58 +00:00
global $called_api ;
2015-12-27 16:45:20 +00:00
if ( api_user () === false ) throw new ForbiddenException ();
2012-04-07 22:02:25 +00:00
$user_info = api_get_user ( $a );
// params
$id = intval ( $a -> argv [ 3 ]);
2013-12-15 22:00:47 +00:00
if ( $id == 0 )
$id = intval ( $_REQUEST [ " id " ]);
2014-01-13 19:03:05 +00:00
// Hotot workaround
if ( $id == 0 )
$id = intval ( $a -> argv [ 4 ]);
2012-06-04 06:08:45 +00:00
logger ( 'API: api_statuses_repeat: ' . $id );
2012-04-07 22:02:25 +00:00
2013-12-23 13:06:53 +00:00
$r = q ( " SELECT `item`.*, `item`.`id` AS `item_id`, `item`.`network` AS `item_network`, `contact`.`nick` as `reply_author`,
2012-12-30 20:30:39 +00:00
`contact` . `name` , `contact` . `photo` as `reply_photo` , `contact` . `url` as `reply_url` , `contact` . `rel` ,
2012-04-07 22:02:25 +00:00
`contact` . `network` , `contact` . `thumb` , `contact` . `dfrn-id` , `contact` . `self` ,
2016-06-12 19:04:55 +00:00
`contact` . `id` AS `cid`
2012-04-07 22:02:25 +00:00
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
2016-01-25 21:35:18 +00:00
AND NOT `item` . `private` AND `item` . `allow_cid` = '' AND `item` . `allow` . `gid` = ''
AND `item` . `deny_cid` = '' AND `item` . `deny_gid` = ''
2012-04-07 22:02:25 +00:00
$sql_extra
AND `item` . `id` =% d " ,
intval ( $id )
);
2012-06-04 06:08:45 +00:00
if ( $r [ 0 ][ 'body' ] != " " ) {
2013-10-14 22:49:49 +00:00
if ( ! intval ( get_config ( 'system' , 'old_share' ))) {
2014-01-08 00:14:58 +00:00
if ( strpos ( $r [ 0 ][ 'body' ], " [/share] " ) !== false ) {
$pos = strpos ( $r [ 0 ][ 'body' ], " [share " );
$post = substr ( $r [ 0 ][ 'body' ], $pos );
} else {
2015-04-05 18:43:06 +00:00
$post = share_header ( $r [ 0 ][ 'author-name' ], $r [ 0 ][ 'author-link' ], $r [ 0 ][ 'author-avatar' ], $r [ 0 ][ 'guid' ], $r [ 0 ][ 'created' ], $r [ 0 ][ 'plink' ]);
2014-01-08 00:14:58 +00:00
$post .= $r [ 0 ][ 'body' ];
$post .= " [/share] " ;
}
2012-12-30 20:30:39 +00: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 00:26:54 +00:00
$_REQUEST [ 'profile_uid' ] = api_user ();
2012-06-04 06:08:45 +00:00
$_REQUEST [ 'type' ] = 'wall' ;
$_REQUEST [ 'api_source' ] = true ;
2012-04-07 22:02:25 +00:00
2014-09-28 15:23:01 +00:00
if ( ! x ( $_REQUEST , " source " ))
$_REQUEST [ " source " ] = api_source ();
2014-09-27 21:37:05 +00:00
2012-06-04 06:08:45 +00:00
item_post ( $a );
2016-01-25 21:35:18 +00:00
} else
throw new ForbiddenException ();
2012-04-07 22:02:25 +00:00
2014-01-08 00:14:58 +00:00
// this should output the last post (the one we just posted).
$called_api = null ;
return ( api_status_show ( $a , $type ));
2012-04-07 22:02:25 +00:00
}
2015-12-27 16:45:20 +00:00
api_register_func ( 'api/statuses/retweet' , 'api_statuses_repeat' , true , API_METHOD_POST );
2012-04-07 22:02:25 +00:00
/**
2014-01-08 00:14:58 +00:00
*
2012-04-07 22:02:25 +00:00
*/
function api_statuses_destroy ( & $a , $type ){
2015-12-27 16:45:20 +00:00
if ( api_user () === false ) throw new ForbiddenException ();
2012-04-07 22:02:25 +00:00
$user_info = api_get_user ( $a );
// params
$id = intval ( $a -> argv [ 3 ]);
2013-12-15 22:00:47 +00:00
if ( $id == 0 )
$id = intval ( $_REQUEST [ " id " ]);
2014-01-13 19:03:05 +00:00
// Hotot workaround
if ( $id == 0 )
$id = intval ( $a -> argv [ 4 ]);
2012-06-04 06:08:45 +00:00
logger ( 'API: api_statuses_destroy: ' . $id );
2012-04-07 22:02:25 +00:00
2014-01-08 00:14:58 +00:00
$ret = api_statuses_show ( $a , $type );
2012-04-07 22:02:25 +00:00
drop_item ( $id , false );
2014-01-08 00:14:58 +00:00
return ( $ret );
2012-04-07 22:02:25 +00:00
}
2015-12-27 16:45:20 +00:00
api_register_func ( 'api/statuses/destroy' , 'api_statuses_destroy' , true , API_METHOD_DELETE );
2012-04-07 22:02:25 +00:00
/**
2014-12-31 11:34:32 +00:00
*
2012-04-07 22:02:25 +00:00
* http :// developer . twitter . com / doc / get / statuses / mentions
2014-12-31 11:34:32 +00:00
*
2012-04-07 22:02:25 +00:00
*/
function api_statuses_mentions ( & $a , $type ){
2015-12-27 16:45:20 +00:00
if ( api_user () === false ) throw new ForbiddenException ();
2013-12-15 22:00:47 +00:00
2013-12-29 16:54:37 +00:00
unset ( $_REQUEST [ " user_id " ]);
unset ( $_GET [ " user_id " ]);
2014-01-05 15:12:03 +00:00
unset ( $_REQUEST [ " screen_name " ]);
unset ( $_GET [ " screen_name " ]);
2012-04-07 22:02:25 +00:00
$user_info = api_get_user ( $a );
// get last newtork messages
// params
$count = ( x ( $_REQUEST , 'count' ) ? $_REQUEST [ 'count' ] : 20 );
$page = ( x ( $_REQUEST , 'page' ) ? $_REQUEST [ 'page' ] - 1 : 0 );
if ( $page < 0 ) $page = 0 ;
$since_id = ( x ( $_REQUEST , 'since_id' ) ? $_REQUEST [ 'since_id' ] : 0 );
$max_id = ( x ( $_REQUEST , 'max_id' ) ? $_REQUEST [ 'max_id' ] : 0 );
//$since_id = 0;//$since_id = (x($_REQUEST,'since_id')?$_REQUEST['since_id']:0);
2012-05-26 01:21:07 +00:00
2012-04-07 22:02:25 +00:00
$start = $page * $count ;
2013-12-20 22:07:11 +00:00
// Ugly code - should be changed
2012-04-07 22:02:25 +00:00
$myurl = $a -> get_baseurl () . '/profile/' . $a -> user [ 'nickname' ];
$myurl = substr ( $myurl , strpos ( $myurl , '://' ) + 3 );
2013-01-13 13:50:55 +00:00
//$myurl = str_replace(array('www.','.'),array('','\\.'),$myurl);
$myurl = str_replace ( 'www.' , '' , $myurl );
2012-04-07 22:02:25 +00:00
$diasp_url = str_replace ( '/profile/' , '/u/' , $myurl );
2012-05-26 01:21:07 +00:00
2012-04-07 22:02:25 +00:00
if ( $max_id > 0 )
2014-04-22 13:56:28 +00:00
$sql_extra = ' AND `item`.`id` <= ' . intval ( $max_id );
2012-04-07 22:02:25 +00:00
2013-12-23 13:06:53 +00:00
$r = q ( " SELECT `item`.*, `item`.`id` AS `item_id`, `item`.`network` AS `item_network`,
2012-04-07 22:02:25 +00:00
`contact` . `name` , `contact` . `photo` , `contact` . `url` , `contact` . `rel` ,
`contact` . `network` , `contact` . `thumb` , `contact` . `dfrn-id` , `contact` . `self` ,
2016-06-12 19:04:55 +00:00
`contact` . `id` AS `cid`
2016-03-01 18:17:01 +00:00
FROM `item` FORCE INDEX ( `uid_id` ), `contact`
2014-04-22 13:56:28 +00:00
WHERE `item` . `uid` = % d AND `verb` = '%s'
AND NOT ( `item` . `author-link` IN ( 'https://%s' , 'http://%s' ))
2016-03-01 18:17:01 +00:00
AND `item` . `visible` AND NOT `item` . `moderated` AND NOT `item` . `deleted`
2012-04-07 22:02:25 +00:00
AND `contact` . `id` = `item` . `contact-id`
2016-03-01 18:17:01 +00:00
AND NOT `contact` . `blocked` AND NOT `contact` . `pending`
AND `item` . `parent` IN ( SELECT `iid` FROM `thread` WHERE `uid` = % d AND `mention` AND ! `ignored` )
2012-04-07 22:02:25 +00:00
$sql_extra
AND `item` . `id` >% d
2014-02-02 08:54:33 +00:00
ORDER BY `item` . `id` DESC LIMIT % d , % d " ,
2014-04-22 13:56:28 +00:00
intval ( api_user ()),
dbesc ( ACTIVITY_POST ),
dbesc ( protect_sprintf ( $myurl )),
dbesc ( protect_sprintf ( $myurl )),
2013-12-15 22:00:47 +00:00
intval ( api_user ()),
2012-04-07 22:02:25 +00:00
intval ( $since_id ),
intval ( $start ), intval ( $count )
);
2016-07-17 21:59:35 +00:00
$ret = api_format_items ( $r , $user_info , false , $type );
2012-04-07 22:02:25 +00:00
2012-04-22 16:00:24 +00:00
2016-07-17 17:42:30 +00:00
$data = array ( 'status' => $ret );
2012-04-07 22:02:25 +00:00
switch ( $type ){
case " atom " :
case " rss " :
$data = api_rss_extra ( $a , $data , $user_info );
2012-04-08 15:51:05 +00:00
break ;
2012-04-07 22:02:25 +00:00
}
2012-04-22 16:00:24 +00:00
2016-07-17 21:59:35 +00:00
return api_format_data ( " statuses " , $type , $data );
2012-04-07 22:02:25 +00:00
}
api_register_func ( 'api/statuses/mentions' , 'api_statuses_mentions' , true );
api_register_func ( 'api/statuses/replies' , 'api_statuses_mentions' , true );
2012-03-18 18:00:24 +00:00
2011-07-31 23:35:53 +00:00
function api_statuses_user_timeline ( & $a , $type ){
2015-12-27 16:45:20 +00:00
if ( api_user () === false ) throw new ForbiddenException ();
2011-07-31 23:35:53 +00:00
2013-12-15 22:00:47 +00:00
$user_info = api_get_user ( $a );
// get last network messages
2011-08-26 14:35:51 +00:00
2012-12-01 00:26:54 +00:00
logger ( " api_statuses_user_timeline: api_user: " . api_user () .
2011-08-26 14:35:51 +00:00
" \n user_info: " . print_r ( $user_info , true ) .
" \n _REQUEST: " . print_r ( $_REQUEST , true ),
LOGGER_DEBUG );
2011-08-19 12:57:54 +00:00
// params
2011-08-19 18:33:34 +00:00
$count = ( x ( $_REQUEST , 'count' ) ? $_REQUEST [ 'count' ] : 20 );
$page = ( x ( $_REQUEST , 'page' ) ? $_REQUEST [ 'page' ] - 1 : 0 );
if ( $page < 0 ) $page = 0 ;
2012-03-18 16:52:51 +00:00
$since_id = ( x ( $_REQUEST , 'since_id' ) ? $_REQUEST [ 'since_id' ] : 0 );
//$since_id = 0;//$since_id = (x($_REQUEST,'since_id')?$_REQUEST['since_id']:0);
2013-06-16 11:28:04 +00:00
$exclude_replies = ( x ( $_REQUEST , 'exclude_replies' ) ? 1 : 0 );
2013-06-16 11:42:43 +00:00
$conversation_id = ( x ( $_REQUEST , 'conversation_id' ) ? $_REQUEST [ 'conversation_id' ] : 0 );
2013-06-16 11:28:04 +00:00
2011-08-19 12:57:54 +00:00
$start = $page * $count ;
2012-06-19 14:27:23 +00:00
$sql_extra = '' ;
2013-12-29 16:54:37 +00:00
if ( $user_info [ 'self' ] == 1 )
$sql_extra .= " AND `item`.`wall` = 1 " ;
2013-06-16 11:28:04 +00:00
if ( $exclude_replies > 0 )
$sql_extra .= ' AND `item`.`parent` = `item`.`id`' ;
2013-06-16 11:42:43 +00:00
if ( $conversation_id > 0 )
$sql_extra .= ' AND `item`.`parent` = ' . intval ( $conversation_id );
2011-08-19 12:57:54 +00:00
2013-12-23 13:06:53 +00:00
$r = q ( " SELECT `item`.*, `item`.`id` AS `item_id`, `item`.`network` AS `item_network`,
2011-07-31 23:35:53 +00:00
`contact` . `name` , `contact` . `photo` , `contact` . `url` , `contact` . `rel` ,
`contact` . `network` , `contact` . `thumb` , `contact` . `dfrn-id` , `contact` . `self` ,
2016-06-12 19:04:55 +00:00
`contact` . `id` AS `cid`
2016-07-16 10:32:08 +00:00
FROM `item`
INNER JOIN `contact` ON `contact` . `id` = `item` . `contact-id` AND `contact` . `uid` = `item` . `uid`
AND NOT `contact` . `blocked` AND NOT `contact` . `pending`
2014-04-22 13:56:28 +00:00
WHERE `item` . `uid` = % d AND `verb` = '%s'
2011-08-26 14:35:51 +00:00
AND `item` . `contact-id` = % d
2016-07-16 10:32:08 +00:00
AND `item` . `visible` AND NOT `item` . `moderated` AND NOT `item` . `deleted`
2011-07-31 23:35:53 +00:00
$sql_extra
2011-08-19 18:33:34 +00:00
AND `item` . `id` >% d
2014-02-02 08:54:33 +00:00
ORDER BY `item` . `id` DESC LIMIT % d , % d " ,
2012-12-01 00:26:54 +00:00
intval ( api_user ()),
2014-04-22 13:56:28 +00:00
dbesc ( ACTIVITY_POST ),
2013-12-15 22:00:47 +00:00
intval ( $user_info [ 'cid' ]),
2011-08-19 18:33:34 +00:00
intval ( $since_id ),
2011-08-19 14:55:43 +00:00
intval ( $start ), intval ( $count )
2011-07-31 23:35:53 +00:00
);
2016-07-17 21:59:35 +00:00
$ret = api_format_items ( $r , $user_info , true , $type );
2012-04-22 16:00:24 +00:00
2016-07-17 17:42:30 +00:00
$data = array ( 'status' => $ret );
2011-07-31 23:35:53 +00:00
switch ( $type ){
case " atom " :
case " rss " :
$data = api_rss_extra ( $a , $data , $user_info );
}
2012-04-22 16:00:24 +00:00
2016-07-17 21:59:35 +00:00
return api_format_data ( " statuses " , $type , $data );
2011-07-31 23:35:53 +00:00
}
api_register_func ( 'api/statuses/user_timeline' , 'api_statuses_user_timeline' , true );
2014-12-31 11:34:32 +00: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 ){
2015-12-27 16:45:20 +00:00
if ( api_user () === false ) throw new ForbiddenException ();
2014-12-31 11:34:32 +00:00
2015-12-25 22:17:34 +00:00
// for versioned api.
/// @TODO We need a better global soluton
2014-12-31 11:34:32 +00:00
$action_argv_id = 2 ;
if ( $a -> argv [ 1 ] == " 1.1 " ) $action_argv_id = 3 ;
2016-02-14 10:24:51 +00:00
if ( $a -> argc <= $action_argv_id ) throw new BadRequestException ( " Invalid request. " );
2014-12-31 11:34:32 +00:00
$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 ());
2015-12-27 16:45:20 +00:00
if ( $item === false || count ( $item ) == 0 )
throw new BadRequestException ( " Invalid item. " );
2014-12-31 11:34:32 +00:00
switch ( $action ){
case " create " :
$item [ 0 ][ 'starred' ] = 1 ;
break ;
case " destroy " :
$item [ 0 ][ 'starred' ] = 0 ;
break ;
2014-12-31 17:08:11 +00:00
default :
2015-12-27 16:45:20 +00:00
throw new BadRequestException ( " Invalid action " . $action );
2014-12-31 11:34:32 +00:00
}
2014-12-31 17:08:11 +00: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 11:34:32 +00:00
2015-12-27 16:45:20 +00:00
if ( $r === false )
throw InternalServerErrorException ( " DB error " );
2014-12-31 11:34:32 +00:00
$user_info = api_get_user ( $a );
2016-07-17 21:59:35 +00:00
$rets = api_format_items ( $item , $user_info , false , $type );
2015-01-27 17:21:32 +00:00
$ret = $rets [ 0 ];
2014-12-31 11:34:32 +00:00
2016-07-17 17:42:30 +00:00
$data = array ( 'status' => $ret );
2014-12-31 11:34:32 +00:00
switch ( $type ){
case " atom " :
case " rss " :
$data = api_rss_extra ( $a , $data , $user_info );
}
2016-07-17 21:59:35 +00:00
return api_format_data ( " status " , $type , $data );
2014-12-31 11:34:32 +00:00
}
2015-12-27 16:45:20 +00:00
api_register_func ( 'api/favorites/create' , 'api_favorites_create_destroy' , true , API_METHOD_POST );
api_register_func ( 'api/favorites/destroy' , 'api_favorites_create_destroy' , true , API_METHOD_DELETE );
2014-12-31 11:34:32 +00:00
2011-07-31 23:35:53 +00:00
function api_favorites ( & $a , $type ){
2013-12-29 16:54:37 +00:00
global $called_api ;
2015-12-27 16:45:20 +00:00
if ( api_user () === false ) throw new ForbiddenException ();
2012-04-22 16:00:24 +00:00
2013-12-29 16:54:37 +00:00
$called_api = array ();
2011-07-31 23:35:53 +00:00
$user_info = api_get_user ( $a );
2013-12-29 16:54:37 +00:00
2012-02-19 18:34:48 +00:00
// in friendica starred item are private
2011-08-26 14:35:51 +00:00
// return favorites only for self
logger ( 'api_favorites: self:' . $user_info [ 'self' ]);
2012-04-22 16:00:24 +00:00
2011-08-26 14:35:51 +00:00
if ( $user_info [ 'self' ] == 0 ) {
$ret = array ();
} else {
2014-01-05 15:12:03 +00:00
$sql_extra = " " ;
2012-04-22 16:00:24 +00:00
2011-08-26 14:35:51 +00:00
// params
2014-01-05 15:12:03 +00:00
$since_id = ( x ( $_REQUEST , 'since_id' ) ? $_REQUEST [ 'since_id' ] : 0 );
$max_id = ( x ( $_REQUEST , 'max_id' ) ? $_REQUEST [ 'max_id' ] : 0 );
2011-08-26 14:35:51 +00:00
$count = ( x ( $_GET , 'count' ) ? $_GET [ 'count' ] : 20 );
$page = ( x ( $_REQUEST , 'page' ) ? $_REQUEST [ 'page' ] - 1 : 0 );
if ( $page < 0 ) $page = 0 ;
2012-04-22 16:00:24 +00:00
2011-08-26 14:35:51 +00:00
$start = $page * $count ;
2014-01-05 15:12:03 +00:00
if ( $max_id > 0 )
$sql_extra .= ' AND `item`.`id` <= ' . intval ( $max_id );
2013-12-23 13:06:53 +00:00
$r = q ( " SELECT `item`.*, `item`.`id` AS `item_id`, `item`.`network` AS `item_network`,
2011-08-26 14:35:51 +00:00
`contact` . `name` , `contact` . `photo` , `contact` . `url` , `contact` . `rel` ,
`contact` . `network` , `contact` . `thumb` , `contact` . `dfrn-id` , `contact` . `self` ,
2016-06-12 19:04:55 +00:00
`contact` . `id` AS `cid`
2011-08-26 14:35:51 +00:00
FROM `item` , `contact`
2014-12-31 11:34:32 +00:00
WHERE `item` . `uid` = % d
2012-01-24 04:56:11 +00:00
AND `item` . `visible` = 1 and `item` . `moderated` = 0 AND `item` . `deleted` = 0
2011-08-26 14:35:51 +00:00
AND `item` . `starred` = 1
AND `contact` . `id` = `item` . `contact-id`
AND `contact` . `blocked` = 0 AND `contact` . `pending` = 0
$sql_extra
2014-01-05 15:12:03 +00:00
AND `item` . `id` >% d
2014-02-02 08:54:33 +00:00
ORDER BY `item` . `id` DESC LIMIT % d , % d " ,
2013-12-15 22:00:47 +00:00
intval ( api_user ()),
2014-01-05 15:12:03 +00:00
intval ( $since_id ),
2011-08-26 14:35:51 +00:00
intval ( $start ), intval ( $count )
);
2011-07-31 23:35:53 +00:00
2016-07-17 21:59:35 +00:00
$ret = api_format_items ( $r , $user_info , false , $type );
2012-04-22 16:00:24 +00:00
2011-08-26 14:35:51 +00:00
}
2012-04-22 16:00:24 +00:00
2016-07-17 17:42:30 +00:00
$data = array ( 'status' => $ret );
2011-07-31 23:35:53 +00:00
switch ( $type ){
case " atom " :
case " rss " :
$data = api_rss_extra ( $a , $data , $user_info );
}
2012-04-22 16:00:24 +00:00
2016-07-17 21:59:35 +00:00
return api_format_data ( " statuses " , $type , $data );
2011-07-31 23:35:53 +00:00
}
api_register_func ( 'api/favorites' , 'api_favorites' , true );
2012-06-26 06:54:01 +00:00
function api_format_messages ( $item , $recipient , $sender ) {
// standard meta information
$ret = Array (
'id' => $item [ 'id' ],
'sender_id' => $sender [ 'id' ] ,
2013-12-15 22:00:47 +00:00
'text' => " " ,
2012-06-26 06:54:01 +00:00
'recipient_id' => $recipient [ 'id' ],
2013-12-15 22:00:47 +00:00
'created_at' => api_date ( $item [ 'created' ]),
'sender_screen_name' => $sender [ 'screen_name' ],
2012-06-26 06:54:01 +00:00
'recipient_screen_name' => $recipient [ 'screen_name' ],
2013-12-15 22:00:47 +00:00
'sender' => $sender ,
2012-06-26 06:54:01 +00:00
'recipient' => $recipient ,
);
2014-01-08 00:14:58 +00:00
// "uid" and "self" are only needed for some internal stuff, so remove it from here
2013-12-15 22:00:47 +00:00
unset ( $ret [ " sender " ][ " uid " ]);
unset ( $ret [ " sender " ][ " self " ]);
unset ( $ret [ " recipient " ][ " uid " ]);
unset ( $ret [ " recipient " ][ " self " ]);
2012-06-26 06:54:01 +00: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 22:00:47 +00:00
$ret [ 'text' ] = bbcode ( $item [ 'body' ], false , false );
2012-06-26 06:54:01 +00:00
}
elseif ( $_GET [ " getText " ] == " plain " ) {
2013-12-15 22:00:47 +00:00
//$ret['text'] = html2plain(bbcode($item['body'], false, false, true), 0);
2014-01-02 21:29:44 +00:00
$ret [ 'text' ] = trim ( html2plain ( bbcode ( api_clean_plain_items ( $item [ 'body' ]), false , false , 2 , true ), 0 ));
2012-06-26 06:54:01 +00:00
}
}
else {
2014-01-02 21:29:44 +00:00
$ret [ 'text' ] = $item [ 'title' ] . " \n " . html2plain ( bbcode ( api_clean_plain_items ( $item [ 'body' ]), false , false , 2 , true ), 0 );
2012-06-26 06:54:01 +00:00
}
if ( isset ( $_GET [ " getUserObjects " ]) && $_GET [ " getUserObjects " ] == " false " ) {
unset ( $ret [ 'sender' ]);
unset ( $ret [ 'recipient' ]);
}
return $ret ;
}
2015-01-01 17:31:50 +00: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 ));
2016-04-12 20:53:54 +00:00
$search = array ( " <br> " , " <blockquote> " , " </blockquote> " ,
" <h1> " , " </h1> " , " <h2> " , " </h2> " ,
" <h3> " , " </h3> " , " <h4> " , " </h4> " ,
" <h5> " , " </h5> " , " <h6> " , " </h6> " );
$replace = array ( " <br> \n " , " \n <blockquote> " , " </blockquote> \n " ,
" \n <h1> " , " </h1> \n " , " \n <h2> " , " </h2> \n " ,
" \n <h3> " , " </h3> \n " , " \n <h4> " , " </h4> \n " ,
" \n <h5> " , " </h5> \n " , " \n <h6> " , " </h6> \n " );
2016-04-09 20:44:32 +00:00
$statushtml = str_replace ( $search , $replace , $statushtml );
2015-01-01 17:31:50 +00:00
if ( $item [ 'title' ] != " " )
$statushtml = " <h4> " . bbcode ( $item [ 'title' ]) . " </h4> \n " . $statushtml ;
2014-12-31 16:01:55 +00:00
2015-01-01 17:31:50 +00:00
$entities = api_get_entitities ( $statustext , $body );
2016-07-13 20:11:10 +00:00
return array (
" text " => $statustext ,
" html " => $statushtml ,
" attachments " => $attachments ,
" entities " => $entities
);
2015-01-01 17:31:50 +00:00
}
function api_get_attachments ( & $body ) {
$text = $body ;
2014-12-31 16:01:55 +00: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 ;
$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 17:31:50 +00:00
if ( strstr ( $_SERVER [ 'HTTP_USER_AGENT' ], " AndStatus " ))
foreach ( $images [ 0 ] AS $orig )
$body = str_replace ( $orig , " " , $body );
2014-12-31 16:01:55 +00:00
return $attachments ;
}
2014-06-16 20:36:59 +00:00
function api_get_entitities ( & $text , $bbcode ) {
2015-12-27 16:45:20 +00:00
/*
To - Do :
* Links at the first character of the post
*/
2014-02-02 08:54:33 +00:00
2014-06-16 20:36:59 +00:00
$a = get_app ();
2014-02-12 00:41:45 +00:00
$include_entities = strtolower ( x ( $_REQUEST , 'include_entities' ) ? $_REQUEST [ 'include_entities' ] : " false " );
2014-02-02 08:54:33 +00:00
2014-06-16 20:36:59 +00:00
if ( $include_entities != " true " ) {
2014-02-02 08:54:33 +00:00
2014-08-12 22:13:13 +00:00
preg_match_all ( " / \ [img](.*?) \ [ \ /img \ ]/ism " , $bbcode , $images );
2014-06-16 20:36:59 +00:00
2014-08-12 22:13:13 +00:00
foreach ( $images [ 1 ] AS $image ) {
$replace = proxy_url ( $image );
$text = str_replace ( $image , $replace , $text );
2014-06-16 20:36:59 +00:00
}
return array ();
}
2014-06-16 19:49:45 +00:00
2014-02-22 14:42:34 +00:00
$bbcode = bb_CleanPictureLinks ( $bbcode );
2014-02-11 22:43:34 +00: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 08:54:33 +00:00
$entities = array ();
$entities [ " hashtags " ] = array ();
$entities [ " symbols " ] = array ();
$entities [ " urls " ] = array ();
$entities [ " user_mentions " ] = array ();
2014-02-12 00:41:45 +00:00
$URLSearchString = " ^ \ [ \ ] " ;
2014-02-13 07:30:40 +00:00
$bbcode = preg_replace ( " /# \ [url \ =([ $URLSearchString ]*) \ ](.*?) \ [ \ /url \ ]/ism " , '#$2' , $bbcode );
2014-02-12 00:41:45 +00:00
$bbcode = preg_replace ( " / \ [bookmark \ =([ $URLSearchString ]*) \ ](.*?) \ [ \ /bookmark \ ]/ism " , '[url=$1]$2[/url]' , $bbcode );
2014-02-02 08:54:33 +00: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 22:43:34 +00: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 08:54:33 +00:00
$bbcode = preg_replace ( " / \ [youtube \ ](.*?) \ [ \ /youtube \ ]/ism " , '[url=$1]$1[/url]' , $bbcode );
2014-02-11 22:43:34 +00:00
2014-06-14 23:48:35 +00:00
$bbcode = preg_replace ( " / \ [vimeo \ ]([0-9]+)(.*?) \ [ \ /vimeo \ ]/ism " ,
2014-02-11 22:43:34 +00:00
'[url=https://vimeo.com/$1]https://vimeo.com/$1[/url]' , $bbcode );
2014-02-02 08:54:33 +00:00
$bbcode = preg_replace ( " / \ [vimeo \ ](.*?) \ [ \ /vimeo \ ]/ism " , '[url=$1]$1[/url]' , $bbcode );
2014-02-11 22:43:34 +00:00
2014-02-02 08:54:33 +00: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 19:49:45 +00:00
$image = get_photo_info ( $url );
2014-02-02 08:54:33 +00:00
if ( $image ) {
2014-08-12 22:13:13 +00:00
// If image cache is activated, then use the following sizes:
2014-06-16 19:49:45 +00:00
// thumb (150), small (340), medium (600) and large (1024)
2014-08-12 22:13:13 +00:00
if ( ! get_config ( " system " , " proxy_disabled " )) {
$media_url = proxy_url ( $url );
2014-06-16 19:49:45 +00: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 08:54:33 +00:00
$entities [ " media " ][] = array (
2014-02-11 22:43:34 +00:00
" id " => $start + 1 ,
" id_str " => ( string ) $start + 1 ,
2014-02-02 08:54:33 +00:00
" indices " => array ( $start , $start + strlen ( $url )),
2014-06-16 19:49:45 +00:00
" media_url " => normalise_link ( $media_url ),
" media_url_https " => $media_url ,
2014-02-02 08:54:33 +00:00
" url " => $url ,
" display_url " => $display_url ,
" expanded_url " => $url ,
" type " => " photo " ,
2014-06-16 19:49:45 +00:00
" sizes " => $sizes );
2014-02-02 08:54:33 +00:00
}
$offset = $start + 1 ;
}
}
return ( $entities );
}
2015-12-27 16:45:20 +00:00
function api_format_items_embeded_images ( & $item , $text ){
2014-10-23 14:27:30 +00:00
$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 11:34:32 +00:00
2016-07-14 11:32:31 +00:00
2016-07-13 17:47:15 +00:00
/**
* @ brief return < a href = 'url' > name </ a > as array
*
* @ param string $txt
* @ return array
* name => 'name'
* 'url => ' url '
2016-07-14 11:32:31 +00:00
*/
2016-07-13 17:47:15 +00:00
function api_contactlink_to_array ( $txt ) {
2016-07-14 11:32:31 +00:00
$match = array ();
$r = preg_match_all ( '|<a href="([^"]*)">([^<]*)</a>|' , $txt , $match );
if ( $r && count ( $match ) == 3 ) {
$res = array (
'name' => $match [ 2 ],
'url' => $match [ 1 ]
);
} else {
$res = array (
'name' => $text ,
'url' => " "
);
}
return $res ;
2016-07-13 17:47:15 +00:00
}
2016-07-14 11:32:31 +00:00
2015-12-27 16:45:20 +00:00
/**
* @ brief return likes , dislikes and attend status for item
*
* @ param array $item
* @ return array
* likes => int count
* dislikes => int count
*/
2016-07-17 21:59:35 +00:00
function api_format_items_activities ( & $item , $type = " json " ) {
2015-12-27 16:45:20 +00:00
$activities = array (
2016-01-02 11:54:57 +00:00
'like' => array (),
'dislike' => array (),
'attendyes' => array (),
'attendno' => array (),
'attendmaybe' => array ()
2015-12-27 16:45:20 +00:00
);
2016-01-02 11:54:57 +00:00
$items = q ( ' SELECT * FROM item
WHERE uid =% d AND `thr-parent` = " %s " AND visible AND NOT deleted ' ,
intval ( $item [ 'uid' ]),
dbesc ( $item [ 'uri' ]));
foreach ( $items as $i ){
builtin_activity_puller ( $i , $activities );
}
2015-12-27 16:45:20 +00:00
2016-07-17 21:59:35 +00:00
if ( $type == " xml " ) {
$xml_activities = array ();
foreach ( $activities as $k => $v )
$xml_activities [ " friendica: " . $k ] = $v ;
$activities = $xml_activities ;
}
2015-12-27 16:45:20 +00:00
$res = array ();
2016-07-13 17:47:15 +00:00
$uri = $item [ 'uri' ] . " -l " ;
2016-01-02 11:54:57 +00:00
foreach ( $activities as $k => $v ) {
2016-07-13 17:47:15 +00:00
$res [ $k ] = ( x ( $v , $uri ) ? array_map ( " api_contactlink_to_array " , $v [ $uri ]) : array () );
2015-12-27 16:45:20 +00:00
}
2016-01-02 11:54:57 +00:00
2015-12-27 16:45:20 +00:00
return $res ;
}
/**
* @ brief format items to be returned by api
*
* @ param array $r array of items
* @ param array $user_info
* @ param bool $filter_user filter items by $user_info
*/
2016-07-17 21:59:35 +00:00
function api_format_items ( $r , $user_info , $filter_user = false , $type = " json " ) {
2011-08-01 03:01:00 +00:00
2011-07-31 23:35:53 +00:00
$a = get_app ();
2011-04-21 15:03:31 +00:00
$ret = Array ();
2011-02-15 11:24:21 +00:00
2011-02-16 07:56:47 +00:00
foreach ( $r as $item ) {
2014-01-02 21:29:44 +00:00
2011-08-26 14:35:51 +00:00
localize_item ( $item );
2016-07-13 17:47:15 +00:00
list ( $status_user , $owner_user ) = api_item_get_user ( $a , $item );
2013-12-15 22:00:47 +00:00
// 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 16:52:51 +00:00
2013-12-15 22:00:47 +00: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 17:21:51 +00:00
if ( $r )
2014-01-13 19:03:05 +00:00
$in_reply_to_status_id = intval ( $r [ 0 ][ 'id' ]);
2012-03-18 17:21:51 +00:00
else
2014-01-13 19:03:05 +00:00
$in_reply_to_status_id = intval ( $item [ 'parent' ]);
$in_reply_to_status_id_str = ( string ) intval ( $item [ 'parent' ]);
2012-03-18 16:52:51 +00:00
2013-12-15 22:00:47 +00:00
$in_reply_to_screen_name = NULL ;
$in_reply_to_user_id = NULL ;
2014-01-13 19:03:05 +00:00
$in_reply_to_user_id_str = NULL ;
2012-03-18 17:21:51 +00:00
2013-12-15 22:00:47 +00: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 ) {
2016-01-06 21:23:12 +00:00
$r = q ( " SELECT * FROM `gcontact` WHERE `url` = '%s' " , dbesc ( normalise_link ( $r [ 0 ][ 'author-link' ])));
2013-12-15 22:00:47 +00:00
if ( $r ) {
2014-01-02 21:29:44 +00: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 19:03:05 +00:00
$in_reply_to_user_id = intval ( $r [ 0 ][ 'id' ]);
$in_reply_to_user_id_str = ( string ) intval ( $r [ 0 ][ 'id' ]);
2013-12-15 22:00:47 +00:00
}
}
2012-03-18 16:52:51 +00:00
} else {
2013-12-15 22:00:47 +00:00
$in_reply_to_screen_name = NULL ;
$in_reply_to_user_id = NULL ;
$in_reply_to_status_id = NULL ;
2014-01-13 19:03:05 +00:00
$in_reply_to_user_id_str = NULL ;
$in_reply_to_status_id_str = NULL ;
2012-03-18 16:52:51 +00:00
}
2015-01-01 17:31:50 +00:00
$converted = api_convert_item ( $item );
2014-12-31 11:34:32 +00:00
2016-07-17 21:59:35 +00:00
if ( $type == " xml " )
$geo = " georss:point " ;
else
$geo = " geo " ;
2011-04-21 15:03:31 +00:00
$status = array (
2015-01-01 17:31:50 +00:00
'text' => $converted [ " text " ],
2011-02-15 11:24:21 +00:00
'truncated' => False ,
2012-03-18 16:52:51 +00:00
'created_at' => api_date ( $item [ 'created' ]),
2012-03-18 17:21:51 +00:00
'in_reply_to_status_id' => $in_reply_to_status_id ,
2014-06-08 16:36:06 +00:00
'in_reply_to_status_id_str' => $in_reply_to_status_id_str ,
2012-03-18 16:52:51 +00:00
'source' => (( $item [ 'app' ]) ? $item [ 'app' ] : 'web' ),
'id' => intval ( $item [ 'id' ]),
2014-01-13 19:03:05 +00:00
'id_str' => ( string ) intval ( $item [ 'id' ]),
2012-03-18 16:52:51 +00:00
'in_reply_to_user_id' => $in_reply_to_user_id ,
2014-06-08 16:36:06 +00:00
'in_reply_to_user_id_str' => $in_reply_to_user_id_str ,
2012-03-18 16:52:51 +00:00
'in_reply_to_screen_name' => $in_reply_to_screen_name ,
2016-07-17 21:59:35 +00:00
$geo => NULL ,
2012-03-18 16:52:51 +00:00
'favorited' => $item [ 'starred' ] ? true : false ,
2011-06-21 09:41:16 +00:00
'user' => $status_user ,
2016-07-13 17:47:15 +00:00
'friendica_owner' => $owner_user ,
2014-02-02 08:54:33 +00:00
//'entities' => NULL,
2015-01-01 17:31:50 +00:00
'statusnet_html' => $converted [ " html " ],
2012-04-11 17:31:01 +00:00
'statusnet_conversation_id' => $item [ 'parent' ],
2016-07-17 21:59:35 +00:00
'friendica_activities' => api_format_items_activities ( $item , $type ),
2011-04-21 15:03:31 +00:00
);
2012-03-18 16:52:51 +00:00
2015-01-01 17:31:50 +00:00
if ( count ( $converted [ " attachments " ]) > 0 )
$status [ " attachments " ] = $converted [ " attachments " ];
2014-03-20 17:44:24 +00:00
2015-01-01 17:31:50 +00:00
if ( count ( $converted [ " entities " ]) > 0 )
$status [ " entities " ] = $converted [ " entities " ];
2014-02-02 08:54:33 +00:00
2013-12-23 13:06:53 +00:00
if (( $item [ 'item_network' ] != " " ) AND ( $status [ " source " ] == 'web' ))
2015-07-16 08:09:59 +00:00
$status [ " source " ] = network_to_name ( $item [ 'item_network' ], $user_info [ 'url' ]);
else if (( $item [ 'item_network' ] != " " ) AND ( network_to_name ( $item [ 'item_network' ], $user_info [ 'url' ]) != $status [ " source " ]))
$status [ " source " ] = trim ( $status [ " source " ] . ' (' . network_to_name ( $item [ 'item_network' ], $user_info [ 'url' ]) . ')' );
2013-12-23 13:06:53 +00:00
2013-12-19 05:58:11 +00:00
// Retweets are only valid for top postings
2014-02-13 07:30:40 +00:00
// It doesn't work reliable with the link if its a feed
2016-07-13 20:11:10 +00:00
#$IsRetweet = ($item['owner-link'] != $item['author-link']);
#if ($IsRetweet)
# $IsRetweet = (($item['owner-name'] != $item['author-name']) OR ($item['owner-avatar'] != $item['author-avatar']));
2016-07-14 11:32:31 +00:00
2016-07-14 14:39:40 +00:00
if ( $item [ " id " ] == $item [ " parent " ]) {
$retweeted_item = api_share_as_retweet ( $item );
if ( $retweeted_item !== false ) {
$retweeted_status = $status ;
try {
$retweeted_status [ " user " ] = api_get_user ( $a , $retweeted_item [ " author-link " ]);
} catch ( BadRequestException $e ) {
// user not found. should be found?
2016-07-15 09:46:19 +00:00
/// @todo check if the user should be always found
2016-07-14 14:39:40 +00:00
$retweeted_status [ " user " ] = array ();
}
2014-02-13 07:30:40 +00:00
2016-07-14 14:39:40 +00:00
$rt_converted = api_convert_item ( $retweeted_item );
2013-12-19 05:58:11 +00:00
2016-07-14 14:39:40 +00:00
$retweeted_status [ 'text' ] = $rt_converted [ " text " ];
$retweeted_status [ 'statusnet_html' ] = $rt_converted [ " html " ];
2016-07-17 21:59:35 +00:00
$retweeted_status [ 'friendica_activities' ] = api_format_items_activities ( $retweeted_item , $type );
2016-07-14 14:39:40 +00:00
$retweeted_status [ 'created_at' ] = api_date ( $retweeted_item [ 'created' ]);
$status [ 'retweeted_status' ] = $retweeted_status ;
}
2013-12-19 05:58:11 +00:00
}
2014-01-08 00:14:58 +00:00
// "uid" and "self" are only needed for some internal stuff, so remove it from here
2013-12-15 22:00:47 +00:00
unset ( $status [ " user " ][ " uid " ]);
unset ( $status [ " user " ][ " self " ]);
2015-06-23 05:32:14 +00:00
if ( $item [ " coord " ] != " " ) {
$coords = explode ( ' ' , $item [ " coord " ]);
if ( count ( $coords ) == 2 ) {
2016-07-17 21:59:35 +00:00
if ( $type == " json " )
$status [ " geo " ] = array ( 'type' => 'Point' ,
'coordinates' => array (( float ) $coords [ 0 ],
( float ) $coords [ 1 ]));
else // Not sure if this is the official format - if someone founds a documentation we can check
$status [ " georss:point " ] = $item [ " coord " ];
2015-06-23 05:32:14 +00:00
}
}
2013-12-15 22:00:47 +00:00
$ret [] = $status ;
2011-02-15 11:24:21 +00:00
};
2011-07-31 23:35:53 +00:00
return $ret ;
2011-02-16 07:56:47 +00:00
}
2011-07-31 23:35:53 +00:00
2011-06-21 00:16:13 +00:00
function api_account_rate_limit_status ( & $a , $type ) {
2016-07-17 21:59:35 +00:00
if ( $type == " xml " )
2016-07-17 17:42:30 +00:00
$hash = array (
'remaining-hits' => ( string ) 150 ,
'@attributes' => array ( " type " => " integer " ),
'hourly-limit' => ( string ) 150 ,
'@attributes2' => array ( " type " => " integer " ),
'reset-time' => datetime_convert ( 'UTC' , 'UTC' , 'now + 1 hour' , ATOM_TIME ),
'@attributes3' => array ( " type " => " datetime " ),
'reset_time_in_seconds' => strtotime ( 'now + 1 hour' ),
'@attributes4' => array ( " type " => " integer " ),
);
2016-07-17 21:59:35 +00:00
else
$hash = array (
'reset_time_in_seconds' => strtotime ( 'now + 1 hour' ),
'remaining_hits' => ( string ) 150 ,
'hourly_limit' => ( string ) 150 ,
'reset_time' => api_date ( datetime_convert ( 'UTC' , 'UTC' , 'now + 1 hour' , ATOM_TIME )),
);
2016-07-17 17:42:30 +00:00
2016-07-17 21:59:35 +00:00
return api_format_data ( 'hash' , $type , array ( 'hash' => $hash ));
2011-06-21 00:16:13 +00:00
}
api_register_func ( 'api/account/rate_limit_status' , 'api_account_rate_limit_status' , true );
2011-07-29 04:56:56 +00:00
2012-03-18 16:52:51 +00:00
function api_help_test ( & $a , $type ) {
if ( $type == 'xml' )
$ok = " true " ;
else
$ok = " ok " ;
2016-07-17 21:59:35 +00:00
return api_format_data ( 'ok' , $type , array ( " ok " => $ok ));
2012-03-18 16:52:51 +00:00
}
2013-03-07 13:16:53 +00:00
api_register_func ( 'api/help/test' , 'api_help_test' , false );
2012-03-18 16:52:51 +00:00
2014-02-02 08:54:33 +00:00
function api_lists ( & $a , $type ) {
$ret = array ();
2016-07-17 21:59:35 +00:00
return api_format_data ( 'lists' , $type , array ( " lists_list " => $ret ));
2014-02-02 08:54:33 +00:00
}
api_register_func ( 'api/lists' , 'api_lists' , true );
function api_lists_list ( & $a , $type ) {
$ret = array ();
2016-07-17 21:59:35 +00:00
return api_format_data ( 'lists' , $type , array ( " lists_list " => $ret ));
2014-02-02 08:54:33 +00:00
}
api_register_func ( 'api/lists/list' , 'api_lists_list' , true );
2011-08-19 12:57:54 +00:00
/**
2014-01-08 00:14:58 +00:00
* https :// dev . twitter . com / docs / api / 1 / get / statuses / friends
2011-08-19 13:09:10 +00:00
* This function is deprecated by Twitter
2014-01-08 00:14:58 +00:00
* returns : json , xml
2011-08-19 12:57:54 +00:00
**/
function api_statuses_f ( & $a , $type , $qtype ) {
2015-12-27 16:45:20 +00:00
if ( api_user () === false ) throw new ForbiddenException ();
2011-08-19 12:57:54 +00:00
$user_info = api_get_user ( $a );
2013-12-15 22:00:47 +00:00
2011-08-19 13:09:10 +00:00
if ( x ( $_GET , 'cursor' ) && $_GET [ 'cursor' ] == 'undefined' ){
/* this is to stop Hotot to load friends multiple times
* I 'm not sure if I' m missing return something or
* is a bug in hotot . Workaround , meantime
*/
2013-12-15 22:00:47 +00:00
2011-08-26 14:35:51 +00:00
/* $ret = Array ();
return array ( '$users' => $ret ); */
return false ;
2011-08-19 13:09:10 +00:00
}
2013-12-15 22:00:47 +00:00
2011-08-19 12:57:54 +00:00
if ( $qtype == 'friends' )
$sql_extra = sprintf ( " AND ( `rel` = %d OR `rel` = %d ) " , intval ( CONTACT_IS_SHARING ), intval ( CONTACT_IS_FRIEND ));
if ( $qtype == 'followers' )
$sql_extra = sprintf ( " AND ( `rel` = %d OR `rel` = %d ) " , intval ( CONTACT_IS_FOLLOWER ), intval ( CONTACT_IS_FRIEND ));
2013-12-15 22:00:47 +00:00
2014-01-05 15:12:03 +00: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 00:26:54 +00:00
intval ( api_user ())
2011-08-19 12:57:54 +00:00
);
$ret = array ();
foreach ( $r as $cid ){
2014-01-05 15:12:03 +00:00
$user = api_get_user ( $a , $cid [ 'nurl' ]);
2014-01-08 00:14:58 +00:00
// "uid" and "self" are only needed for some internal stuff, so remove it from here
2013-12-15 22:00:47 +00:00
unset ( $user [ " uid " ]);
unset ( $user [ " self " ]);
if ( $user )
$ret [] = $user ;
2011-08-19 12:57:54 +00:00
}
2016-07-17 17:42:30 +00:00
return array ( 'user' => $ret );
2011-08-19 12:57:54 +00:00
}
function api_statuses_friends ( & $a , $type ){
2011-08-26 14:35:51 +00:00
$data = api_statuses_f ( $a , $type , " friends " );
if ( $data === false ) return false ;
2016-07-17 21:59:35 +00:00
return api_format_data ( " users " , $type , $data );
2011-08-19 12:57:54 +00:00
}
function api_statuses_followers ( & $a , $type ){
2011-08-26 14:35:51 +00:00
$data = api_statuses_f ( $a , $type , " followers " );
if ( $data === false ) return false ;
2016-07-17 21:59:35 +00:00
return api_format_data ( " users " , $type , $data );
2011-08-19 12:57:54 +00:00
}
api_register_func ( 'api/statuses/friends' , 'api_statuses_friends' , true );
api_register_func ( 'api/statuses/followers' , 'api_statuses_followers' , true );
2011-07-29 04:56:56 +00:00
function api_statusnet_config ( & $a , $type ) {
$name = $a -> config [ 'sitename' ];
$server = $a -> get_hostname ();
2012-02-19 18:34:48 +00:00
$logo = $a -> get_baseurl () . '/images/friendica-64.png' ;
2011-07-29 04:56:56 +00:00
$email = $a -> config [ 'admin_email' ];
$closed = (( $a -> config [ 'register_policy' ] == REGISTER_CLOSED ) ? 'true' : 'false' );
$private = (( $a -> config [ 'system' ][ 'block_public' ]) ? 'true' : 'false' );
2011-08-03 03:02:07 +00:00
$textlimit = ( string ) (( $a -> config [ 'max_import_size' ]) ? $a -> config [ 'max_import_size' ] : 200000 );
2011-08-03 03:08:40 +00:00
if ( $a -> config [ 'api_import_size' ])
$texlimit = string ( $a -> config [ 'api_import_size' ]);
2011-07-29 04:56:56 +00:00
$ssl = (( $a -> config [ 'system' ][ 'have_ssl' ]) ? 'true' : 'false' );
$sslserver = (( $ssl === 'true' ) ? str_replace ( 'http:' , 'https:' , $a -> get_baseurl ()) : '' );
$config = array (
'site' => array ( 'name' => $name , 'server' => $server , 'theme' => 'default' , 'path' => '' ,
2013-12-20 22:07:11 +00:00
'logo' => $logo , 'fancy' => true , 'language' => 'en' , 'email' => $email , 'broughtby' => '' ,
'broughtbyurl' => '' , 'timezone' => 'UTC' , 'closed' => $closed , 'inviteonly' => false ,
2011-07-29 04:56:56 +00:00
'private' => $private , 'textlimit' => $textlimit , 'sslserver' => $sslserver , 'ssl' => $ssl ,
2012-06-23 20:52:50 +00:00
'shorturllength' => '30' ,
2013-12-20 22:07:11 +00: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 04:56:56 +00:00
),
2013-12-20 22:07:11 +00:00
);
2011-07-29 04:56:56 +00:00
2016-07-17 21:59:35 +00:00
return api_format_data ( 'config' , $type , array ( 'config' => $config ));
2011-07-29 04:56:56 +00:00
}
2011-07-30 00:01:57 +00:00
api_register_func ( 'api/statusnet/config' , 'api_statusnet_config' , false );
2011-07-29 04:56:56 +00:00
2011-07-30 01:21:54 +00:00
function api_statusnet_version ( & $a , $type ) {
// liar
2015-12-27 16:45:20 +00:00
$fake_statusnet_version = " 0.9.7 " ;
2011-07-30 01:21:54 +00:00
2016-07-17 21:59:35 +00:00
return api_format_data ( 'version' , $type , array ( 'version' => $fake_statusnet_version ));
2011-07-30 01:21:54 +00:00
}
api_register_func ( 'api/statusnet/version' , 'api_statusnet_version' , false );
2011-08-01 05:22:34 +00:00
2015-12-27 16:45:20 +00:00
/**
2016-07-17 21:59:35 +00:00
* @ todo use api_format_data () to return data
2015-12-27 16:45:20 +00:00
*/
2011-08-01 05:22:34 +00:00
function api_ff_ids ( & $a , $type , $qtype ) {
2015-12-27 16:45:20 +00:00
if ( ! api_user ()) throw new ForbiddenException ();
2011-08-01 05:22:34 +00:00
2014-01-05 15:12:03 +00:00
$user_info = api_get_user ( $a );
2011-08-01 05:22:34 +00:00
if ( $qtype == 'friends' )
2011-08-07 23:15:54 +00:00
$sql_extra = sprintf ( " AND ( `rel` = %d OR `rel` = %d ) " , intval ( CONTACT_IS_SHARING ), intval ( CONTACT_IS_FRIEND ));
2011-08-01 05:22:34 +00:00
if ( $qtype == 'followers' )
2011-08-07 23:15:54 +00:00
$sql_extra = sprintf ( " AND ( `rel` = %d OR `rel` = %d ) " , intval ( CONTACT_IS_FOLLOWER ), intval ( CONTACT_IS_FRIEND ));
2011-08-01 05:22:34 +00:00
2014-01-05 15:12:03 +00:00
if ( ! $user_info [ " self " ])
$sql_extra = " AND false " ;
$stringify_ids = ( x ( $_REQUEST , 'stringify_ids' ) ? $_REQUEST [ 'stringify_ids' ] : false );
2013-12-19 05:58:11 +00:00
2016-01-06 21:23:12 +00:00
$r = q ( " SELECT `gcontact`.`id` FROM `contact`, `gcontact` WHERE `contact`.`nurl` = `gcontact`.`nurl` AND `uid` = %d AND NOT `self` AND NOT `blocked` AND NOT `pending` $sql_extra " ,
2012-12-01 00:26:54 +00:00
intval ( api_user ())
2011-08-01 05:22:34 +00:00
);
2016-07-17 17:42:30 +00:00
if ( ! dbm :: is_result ( $r ))
return ;
2013-12-19 05:58:11 +00:00
2016-07-17 17:42:30 +00:00
$ids = array ();
foreach ( $r as $rr )
if ( $stringify_ids )
$ids [] = $rr [ 'id' ];
else
$ids [] = intval ( $rr [ 'id' ]);
2016-07-17 21:59:35 +00:00
return api_format_data ( " ids " , $type , array ( 'id' => $ids ));
2011-08-01 05:22:34 +00:00
}
function api_friends_ids ( & $a , $type ) {
2016-07-17 17:42:30 +00:00
return api_ff_ids ( $a , $type , 'friends' );
2011-08-01 05:22:34 +00:00
}
function api_followers_ids ( & $a , $type ) {
2016-07-17 17:42:30 +00:00
return api_ff_ids ( $a , $type , 'followers' );
2011-08-01 05:22:34 +00:00
}
api_register_func ( 'api/friends/ids' , 'api_friends_ids' , true );
api_register_func ( 'api/followers/ids' , 'api_followers_ids' , true );
2011-08-19 12:57:54 +00:00
2011-08-19 14:55:43 +00:00
function api_direct_messages_new ( & $a , $type ) {
2015-12-27 16:45:20 +00:00
if ( api_user () === false ) throw new ForbiddenException ();
2013-12-15 22:00:47 +00:00
2013-12-29 16:54:37 +00:00
if ( ! x ( $_POST , " text " ) OR ( ! x ( $_POST , " screen_name " ) AND ! x ( $_POST , " user_id " ))) return ;
2012-06-22 12:54:31 +00:00
2011-08-19 14:55:43 +00:00
$sender = api_get_user ( $a );
2013-12-15 22:00:47 +00:00
2013-12-29 16:54:37 +00:00
if ( $_POST [ 'screen_name' ]) {
2014-01-05 15:12:03 +00:00
$r = q ( " SELECT `id`, `nurl`, `network` FROM `contact` WHERE `uid`=%d AND `nick`='%s' " ,
2013-12-29 16:54:37 +00:00
intval ( api_user ()),
dbesc ( $_POST [ 'screen_name' ]));
2014-01-05 15:12:03 +00:00
// Selecting the id by priority, friendica first
api_best_nickname ( $r );
2013-12-29 16:54:37 +00:00
$recipient = api_get_user ( $a , $r [ 0 ][ 'nurl' ]);
} else
$recipient = api_get_user ( $a , $_POST [ 'user_id' ]);
2012-06-22 12:54:31 +00:00
$replyto = '' ;
2012-06-25 13:53:56 +00:00
$sub = '' ;
2012-06-22 12:54:31 +00:00
if ( x ( $_REQUEST , 'replyto' )) {
2012-06-25 14:25:34 +00:00
$r = q ( 'SELECT `parent-uri`, `title` FROM `mail` WHERE `uid`=%d AND `id`=%d' ,
2012-12-01 00:26:54 +00:00
intval ( api_user ()),
2012-06-22 12:54:31 +00:00
intval ( $_REQUEST [ 'replyto' ]));
2012-06-25 14:25:34 +00:00
$replyto = $r [ 0 ][ 'parent-uri' ];
2012-06-25 13:53:56 +00:00
$sub = $r [ 0 ][ 'title' ];
2012-06-22 12:54:31 +00:00
}
else {
2012-06-25 13:53:56 +00:00
if ( x ( $_REQUEST , 'title' )) {
$sub = $_REQUEST [ 'title' ];
}
else {
$sub = (( strlen ( $_POST [ 'text' ]) > 10 ) ? substr ( $_POST [ 'text' ], 0 , 10 ) . " ... " : $_POST [ 'text' ]);
}
2012-06-22 12:54:31 +00:00
}
2012-06-25 13:53:56 +00:00
2013-12-29 16:54:37 +00:00
$id = send_message ( $recipient [ 'cid' ], $_POST [ 'text' ], $sub , $replyto );
2011-08-19 14:55:43 +00:00
if ( $id >- 1 ) {
$r = q ( " SELECT * FROM `mail` WHERE id=%d " , intval ( $id ));
2012-06-26 06:54:01 +00:00
$ret = api_format_messages ( $r [ 0 ], $recipient , $sender );
2013-12-15 22:00:47 +00:00
2011-08-19 14:55:43 +00:00
} else {
2013-12-15 22:00:47 +00:00
$ret = array ( " error " => $id );
2011-08-19 14:55:43 +00:00
}
2013-12-15 22:00:47 +00:00
2016-07-17 17:42:30 +00:00
$data = Array ( 'direct_message' => $ret );
2013-12-15 22:00:47 +00:00
2011-08-19 14:55:43 +00:00
switch ( $type ){
case " atom " :
case " rss " :
$data = api_rss_extra ( $a , $data , $user_info );
}
2013-12-15 22:00:47 +00:00
2016-07-17 21:59:35 +00:00
return api_format_data ( " direct-messages " , $type , $data );
2013-12-15 22:00:47 +00:00
2011-08-19 14:55:43 +00:00
}
2015-12-27 16:45:20 +00:00
api_register_func ( 'api/direct_messages/new' , 'api_direct_messages_new' , true , API_METHOD_POST );
2011-08-19 14:55:43 +00:00
2012-06-26 06:54:01 +00:00
function api_direct_messages_box ( & $a , $type , $box ) {
2015-12-27 16:45:20 +00:00
if ( api_user () === false ) throw new ForbiddenException ();
2013-12-15 22:00:47 +00:00
2011-08-19 14:55:43 +00:00
// params
$count = ( x ( $_GET , 'count' ) ? $_GET [ 'count' ] : 20 );
2011-08-19 18:33:34 +00:00
$page = ( x ( $_REQUEST , 'page' ) ? $_REQUEST [ 'page' ] - 1 : 0 );
if ( $page < 0 ) $page = 0 ;
2013-12-15 22:00:47 +00:00
2013-12-19 05:58:11 +00:00
$since_id = ( x ( $_REQUEST , 'since_id' ) ? $_REQUEST [ 'since_id' ] : 0 );
2014-01-05 15:12:03 +00:00
$max_id = ( x ( $_REQUEST , 'max_id' ) ? $_REQUEST [ 'max_id' ] : 0 );
2013-12-19 05:58:11 +00:00
2014-10-23 06:59:48 +00: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 22:00:47 +00:00
2014-10-23 06:59:48 +00:00
unset ( $_REQUEST [ " screen_name " ]);
unset ( $_GET [ " screen_name " ]);
$user_info = api_get_user ( $a );
2013-12-20 22:07:11 +00:00
//$profile_url = $a->get_baseurl() . '/profile/' . $a->user['nickname'];
$profile_url = $user_info [ " url " ];
2014-10-23 06:59:48 +00:00
// pagination
$start = $page * $count ;
// filters
2011-08-19 14:55:43 +00:00
if ( $box == " sentbox " ) {
2013-12-27 13:11:13 +00:00
$sql_extra = " `mail`.`from-url`=' " . dbesc ( $profile_url ) . " ' " ;
2012-06-26 06:54:01 +00:00
}
elseif ( $box == " conversation " ) {
2013-12-27 13:11:13 +00:00
$sql_extra = " `mail`.`parent-uri`=' " . dbesc ( $_GET [ " uri " ] ) . " ' " ;
2012-06-26 06:54:01 +00:00
}
elseif ( $box == " all " ) {
$sql_extra = " true " ;
}
elseif ( $box == " inbox " ) {
2013-12-27 13:11:13 +00:00
$sql_extra = " `mail`.`from-url`!=' " . dbesc ( $profile_url ) . " ' " ;
2011-08-19 14:55:43 +00:00
}
2013-12-15 22:00:47 +00:00
2014-01-05 15:12:03 +00:00
if ( $max_id > 0 )
$sql_extra .= ' AND `mail`.`id` <= ' . intval ( $max_id );
2014-10-23 06:59:48 +00:00
if ( $user_id != " " ) {
$sql_extra .= ' AND `mail`.`contact-id` = ' . intval ( $user_id );
2014-12-31 11:34:32 +00:00
}
2014-10-23 06:59:48 +00:00
elseif ( $screen_name != " " ){
$sql_extra .= " AND `contact`.`nick` = ' " . dbesc ( $screen_name ) . " ' " ;
}
2014-02-02 08:54:33 +00: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 00:26:54 +00:00
intval ( api_user ()),
2013-12-19 05:58:11 +00:00
intval ( $since_id ),
2011-08-19 14:55:43 +00:00
intval ( $start ), intval ( $count )
2012-06-23 17:21:48 +00:00
);
2014-12-31 11:34:32 +00:00
2013-12-15 22:00:47 +00:00
2011-08-19 14:55:43 +00:00
$ret = Array ();
2012-06-26 06:54:01 +00:00
foreach ( $r as $item ) {
2012-06-23 17:29:58 +00:00
if ( $box == " inbox " || $item [ 'from-url' ] != $profile_url ){
2012-06-26 06:54:01 +00:00
$recipient = $user_info ;
2013-12-27 13:11:13 +00:00
$sender = api_get_user ( $a , normalise_link ( $item [ 'contact-url' ]));
2011-08-19 14:55:43 +00:00
}
2014-10-16 09:55:59 +00:00
elseif ( $box == " sentbox " || $item [ 'from-url' ] == $profile_url ){
2013-12-27 13:11:13 +00:00
$recipient = api_get_user ( $a , normalise_link ( $item [ 'contact-url' ]));
2012-06-26 06:54:01 +00:00
$sender = $user_info ;
2014-10-23 06:59:48 +00:00
2012-06-26 06:54:01 +00:00
}
$ret [] = api_format_messages ( $item , $recipient , $sender );
2011-08-19 14:55:43 +00:00
}
2013-12-15 22:00:47 +00:00
2011-08-19 14:55:43 +00:00
2016-07-17 17:42:30 +00:00
$data = array ( 'direct_message' => $ret );
2011-08-19 14:55:43 +00:00
switch ( $type ){
case " atom " :
case " rss " :
$data = api_rss_extra ( $a , $data , $user_info );
}
2013-12-15 22:00:47 +00:00
2016-07-17 21:59:35 +00:00
return api_format_data ( " direct-messages " , $type , $data );
2013-12-15 22:00:47 +00:00
2011-08-19 14:55:43 +00: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 17:21:48 +00:00
function api_direct_messages_all ( & $a , $type ){
return api_direct_messages_box ( $a , $type , " all " );
}
function api_direct_messages_conversation ( & $a , $type ){
return api_direct_messages_box ( $a , $type , " conversation " );
}
api_register_func ( 'api/direct_messages/conversation' , 'api_direct_messages_conversation' , true );
api_register_func ( 'api/direct_messages/all' , 'api_direct_messages_all' , true );
2011-08-19 14:55:43 +00:00
api_register_func ( 'api/direct_messages/sent' , 'api_direct_messages_sentbox' , true );
api_register_func ( 'api/direct_messages' , 'api_direct_messages_inbox' , true );
2011-10-20 13:57:35 +00:00
function api_oauth_request_token ( & $a , $type ){
try {
$oauth = new FKOAuth1 ();
$r = $oauth -> fetch_request_token ( OAuthRequest :: from_request ());
} catch ( Exception $e ){
echo " error= " . OAuthUtil :: urlencode_rfc3986 ( $e -> getMessage ()); killme ();
}
2011-11-07 16:36:58 +00:00
echo $r ;
2013-12-15 22:00:47 +00:00
killme ();
2011-10-20 13:57:35 +00: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 16:36:58 +00:00
echo $r ;
2013-12-15 22:00:47 +00:00
killme ();
2011-10-20 13:57:35 +00:00
}
2011-10-26 15:15:36 +00:00
2011-10-20 13:57:35 +00:00
api_register_func ( 'api/oauth/request_token' , 'api_oauth_request_token' , false );
api_register_func ( 'api/oauth/access_token' , 'api_oauth_access_token' , false );
2011-10-26 15:15:36 +00:00
2014-08-11 09:29:14 +00:00
function api_fr_photos_list ( & $a , $type ) {
2015-12-27 16:45:20 +00:00
if ( api_user () === false ) throw new ForbiddenException ();
$r = q ( " select `resource-id`, max(scale) as scale, album, filename, type from photo
where uid = % d and album != 'Contact Photos' group by `resource-id` " ,
2014-08-11 09:29:14 +00:00
intval ( local_user ())
);
2015-12-27 16:45:20 +00:00
$typetoext = array (
'image/jpeg' => 'jpg' ,
'image/png' => 'png' ,
'image/gif' => 'gif'
);
2016-07-17 17:42:30 +00:00
$data = array ( 'photo' => array ());
2014-08-11 09:29:14 +00:00
if ( $r ) {
2015-12-27 16:45:20 +00:00
foreach ( $r as $rr ) {
$photo = array ();
$photo [ 'id' ] = $rr [ 'resource-id' ];
$photo [ 'album' ] = $rr [ 'album' ];
$photo [ 'filename' ] = $rr [ 'filename' ];
$photo [ 'type' ] = $rr [ 'type' ];
2016-07-17 17:42:30 +00:00
$thumb = $a -> get_baseurl () . " /photo/ " . $rr [ 'resource-id' ] . " - " . $rr [ 'scale' ] . " . " . $typetoext [ $rr [ 'type' ]];
2016-07-17 21:59:35 +00:00
if ( $type == " xml " )
$data [ 'photo' ][] = array ( " @attributes " => $photo , " 1 " => $thumb );
else {
2016-07-17 17:42:30 +00:00
$photo [ 'thumb' ] = $thumb ;
$data [ 'photo' ][] = $photo ;
}
2015-12-27 16:45:20 +00:00
}
2014-08-11 09:29:14 +00:00
}
2016-07-17 21:59:35 +00:00
return api_format_data ( " photos " , $type , $data );
2014-08-11 09:29:14 +00:00
}
function api_fr_photo_detail ( & $a , $type ) {
2015-12-27 16:45:20 +00:00
if ( api_user () === false ) throw new ForbiddenException ();
if ( ! x ( $_REQUEST , 'photo_id' )) throw new BadRequestException ( " No photo id. " );
$scale = ( x ( $_REQUEST , 'scale' ) ? intval ( $_REQUEST [ 'scale' ]) : false );
$scale_sql = ( $scale === false ? " " : sprintf ( " and scale=%d " , intval ( $scale )));
$data_sql = ( $scale === false ? " " : " data, " );
2016-04-17 18:43:41 +00:00
$r = q ( " select %s `resource-id`, `created`, `edited`, `title`, `desc`, `album`, `filename`,
2015-12-27 16:45:20 +00:00
`type` , `height` , `width` , `datasize` , `profile` , min ( `scale` ) as minscale , max ( `scale` ) as maxscale
from photo where `uid` = % d and `resource-id` = '%s' % s group by `resource-id` " ,
$data_sql ,
2014-08-11 09:29:14 +00:00
intval ( local_user ()),
dbesc ( $_REQUEST [ 'photo_id' ]),
2015-12-27 16:45:20 +00:00
$scale_sql
2014-08-11 09:29:14 +00:00
);
2015-12-27 16:45:20 +00:00
$typetoext = array (
'image/jpeg' => 'jpg' ,
'image/png' => 'png' ,
'image/gif' => 'gif'
);
if ( $r ) {
$data = array ( 'photo' => $r [ 0 ]);
2016-07-17 21:59:35 +00:00
$data [ 'photo' ][ 'id' ] = $data [ 'photo' ][ 'resource-id' ];
2015-12-27 16:45:20 +00:00
if ( $scale !== false ) {
$data [ 'photo' ][ 'data' ] = base64_encode ( $data [ 'photo' ][ 'data' ]);
2015-12-28 08:45:23 +00:00
} else {
unset ( $data [ 'photo' ][ 'datasize' ]); //needed only with scale param
2015-12-27 16:45:20 +00:00
}
2016-07-17 21:59:35 +00:00
if ( $type == " xml " ) {
$data [ 'photo' ][ 'links' ] = array ();
for ( $k = intval ( $data [ 'photo' ][ 'minscale' ]); $k <= intval ( $data [ 'photo' ][ 'maxscale' ]); $k ++ )
$data [ 'photo' ][ 'links' ][ $k . " :link " ][ " @attributes " ] = array ( " type " => $data [ 'photo' ][ 'type' ],
" scale " => $k ,
" href " => $a -> get_baseurl () . " /photo/ " . $data [ 'photo' ][ 'resource-id' ] . " - " . $k . " . " . $typetoext [ $data [ 'photo' ][ 'type' ]]);
} else {
$data [ 'photo' ][ 'link' ] = array ();
for ( $k = intval ( $data [ 'photo' ][ 'minscale' ]); $k <= intval ( $data [ 'photo' ][ 'maxscale' ]); $k ++ ) {
$data [ 'photo' ][ 'link' ][ $k ] = $a -> get_baseurl () . " /photo/ " . $data [ 'photo' ][ 'resource-id' ] . " - " . $k . " . " . $typetoext [ $data [ 'photo' ][ 'type' ]];
}
2015-12-27 16:45:20 +00:00
}
unset ( $data [ 'photo' ][ 'resource-id' ]);
unset ( $data [ 'photo' ][ 'minscale' ]);
unset ( $data [ 'photo' ][ 'maxscale' ]);
} else {
throw new NotFoundException ();
2014-08-11 09:29:14 +00:00
}
2016-07-17 21:59:35 +00:00
return api_format_data ( " photo_detail " , $type , $data );
2014-08-11 09:29:14 +00: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-03-15 20:19:29 +00:00
/**
* similar as / mod / redir . php
* redirect to 'url' after dfrn auth
*
* why this when there is mod / redir . php already ?
* This use api_user () and api_login ()
*
* params
* c_url : url of remote contact to auth to
* url : string , url to redirect after auth
*/
2015-04-12 06:53:30 +00:00
function api_friendica_remoteauth ( & $a ) {
2015-03-15 20:19:29 +00:00
$url = (( x ( $_GET , 'url' )) ? $_GET [ 'url' ] : '' );
$c_url = (( x ( $_GET , 'c_url' )) ? $_GET [ 'c_url' ] : '' );
if ( $url === '' || $c_url === '' )
2015-12-27 16:45:20 +00:00
throw new BadRequestException ( " Wrong parameters. " );
2015-03-15 20:19:29 +00:00
$c_url = normalise_link ( $c_url );
// traditional DFRN
$r = q ( " SELECT * FROM `contact` WHERE `id` = %d AND `nurl` = '%s' LIMIT 1 " ,
dbesc ( $c_url ),
intval ( api_user ())
);
if (( ! count ( $r )) || ( $r [ 0 ][ 'network' ] !== NETWORK_DFRN ))
2015-12-27 16:45:20 +00:00
throw new BadRequestException ( " Unknown contact " );
2015-03-15 20:19:29 +00:00
$cid = $r [ 0 ][ 'id' ];
$dfrn_id = $orig_id = (( $r [ 0 ][ 'issued-id' ]) ? $r [ 0 ][ 'issued-id' ] : $r [ 0 ][ 'dfrn-id' ]);
if ( $r [ 0 ][ 'duplex' ] && $r [ 0 ][ 'issued-id' ]) {
$orig_id = $r [ 0 ][ 'issued-id' ];
$dfrn_id = '1:' . $orig_id ;
}
if ( $r [ 0 ][ 'duplex' ] && $r [ 0 ][ 'dfrn-id' ]) {
$orig_id = $r [ 0 ][ 'dfrn-id' ];
$dfrn_id = '0:' . $orig_id ;
}
$sec = random_string ();
q ( " INSERT INTO `profile_check` ( `uid`, `cid`, `dfrn_id`, `sec`, `expire`)
VALUES ( % d , % s , '%s' , '%s' , % d ) " ,
intval ( api_user ()),
intval ( $cid ),
dbesc ( $dfrn_id ),
dbesc ( $sec ),
intval ( time () + 45 )
);
logger ( $r [ 0 ][ 'name' ] . ' ' . $sec , LOGGER_DEBUG );
$dest = (( $url ) ? '&destination_url=' . $url : '' );
goaway ( $r [ 0 ][ 'poll' ] . '?dfrn_id=' . $dfrn_id
. '&dfrn_version=' . DFRN_PROTOCOL_VERSION
. '&type=profile&sec=' . $sec . $dest . $quiet );
}
2015-04-12 06:53:30 +00:00
api_register_func ( 'api/friendica/remoteauth' , 'api_friendica_remoteauth' , true );
2015-03-15 20:19:29 +00:00
2016-07-14 14:39:40 +00:00
/**
* @ brief Return the item shared , if the item contains only the [ share ] tag
*
* @ param array $item Sharer item
* @ return array Shared item or false if not a reshare
*/
2015-12-27 16:45:20 +00:00
function api_share_as_retweet ( & $item ) {
$body = trim ( $item [ " body " ]);
2015-03-15 20:19:29 +00:00
2016-07-15 10:22:35 +00:00
if ( diaspora :: is_reshare ( $body , false ) === false ) {
2016-07-14 14:39:40 +00:00
return false ;
2016-07-15 10:22:35 +00:00
}
2014-01-02 21:29:44 +00:00
2015-12-27 16:45:20 +00:00
$attributes = preg_replace ( " / \ [share(.*?) \ ] \ s?(.*?) \ s? \ [ \ /share \ ] \ s?/ism " , " $ 1 " , $body );
2016-07-14 14:39:40 +00:00
// Skip if there is no shared message in there
2016-07-15 10:22:35 +00:00
// we already checked this in diaspora::is_reshare()
// but better one more than one less...
2016-07-14 14:39:40 +00:00
if ( $body == $attributes )
return false ;
2016-07-15 10:22:35 +00:00
// build the fake reshared item
2016-07-14 14:39:40 +00:00
$reshared_item = $item ;
2014-01-02 21:29:44 +00:00
2015-12-27 16:45:20 +00:00
$author = " " ;
preg_match ( " /author='(.*?)'/ism " , $attributes , $matches );
if ( $matches [ 1 ] != " " )
$author = html_entity_decode ( $matches [ 1 ], ENT_QUOTES , 'UTF-8' );
2014-01-02 21:29:44 +00:00
2015-12-27 16:45:20 +00:00
preg_match ( '/author="(.*?)"/ism' , $attributes , $matches );
if ( $matches [ 1 ] != " " )
$author = $matches [ 1 ];
2014-01-02 21:29:44 +00:00
2015-12-27 16:45:20 +00:00
$profile = " " ;
preg_match ( " /profile='(.*?)'/ism " , $attributes , $matches );
if ( $matches [ 1 ] != " " )
$profile = $matches [ 1 ];
2014-01-02 21:29:44 +00:00
2015-12-27 16:45:20 +00:00
preg_match ( '/profile="(.*?)"/ism' , $attributes , $matches );
if ( $matches [ 1 ] != " " )
$profile = $matches [ 1 ];
2014-01-02 21:29:44 +00:00
2015-12-27 16:45:20 +00:00
$avatar = " " ;
preg_match ( " /avatar='(.*?)'/ism " , $attributes , $matches );
if ( $matches [ 1 ] != " " )
$avatar = $matches [ 1 ];
2014-01-02 21:29:44 +00:00
2015-12-27 16:45:20 +00:00
preg_match ( '/avatar="(.*?)"/ism' , $attributes , $matches );
if ( $matches [ 1 ] != " " )
$avatar = $matches [ 1 ];
2014-01-02 21:29:44 +00:00
2015-12-27 16:45:20 +00:00
$link = " " ;
preg_match ( " /link='(.*?)'/ism " , $attributes , $matches );
if ( $matches [ 1 ] != " " )
$link = $matches [ 1 ];
2015-01-24 23:01:58 +00:00
2015-12-27 16:45:20 +00:00
preg_match ( '/link="(.*?)"/ism' , $attributes , $matches );
if ( $matches [ 1 ] != " " )
$link = $matches [ 1 ];
2014-01-02 21:29:44 +00:00
2016-07-14 14:39:40 +00:00
$posted = " " ;
preg_match ( " /posted='(.*?)'/ism " , $attributes , $matches );
if ( $matches [ 1 ] != " " )
$posted = $matches [ 1 ];
preg_match ( '/posted="(.*?)"/ism' , $attributes , $matches );
if ( $matches [ 1 ] != " " )
$posted = $matches [ 1 ];
2015-12-27 16:45:20 +00:00
$shared_body = preg_replace ( " / \ [share(.*?) \ ] \ s?(.*?) \ s? \ [ \ /share \ ] \ s?/ism " , " $ 2 " , $body );
2014-01-02 21:29:44 +00:00
2016-07-14 14:39:40 +00:00
if (( $shared_body == " " ) || ( $profile == " " ) || ( $author == " " ) || ( $avatar == " " ) || ( $posted == " " ))
return false ;
2014-01-02 21:29:44 +00:00
2016-07-14 14:39:40 +00:00
$reshared_item [ " body " ] = $shared_body ;
$reshared_item [ " author-name " ] = $author ;
$reshared_item [ " author-link " ] = $profile ;
$reshared_item [ " author-avatar " ] = $avatar ;
$reshared_item [ " plink " ] = $link ;
$reshared_item [ " created " ] = $posted ;
$reshared_item [ " edited " ] = $posted ;
2014-01-02 21:29:44 +00:00
2016-07-14 14:39:40 +00:00
return $reshared_item ;
2014-01-02 21:29:44 +00:00
2015-12-27 16:45:20 +00:00
}
2014-01-02 21:29:44 +00:00
2015-12-27 16:45:20 +00:00
function api_get_nick ( $profile ) {
/* To - Do :
- remove trailing junk from profile url
- pump . io check has to check the website
*/
2014-01-02 21:29:44 +00:00
2015-12-27 16:45:20 +00:00
$nick = " " ;
2015-11-23 17:42:45 +00:00
2015-12-27 16:45:20 +00:00
$r = q ( " SELECT `nick` FROM `gcontact` WHERE `nurl` = '%s' " ,
2015-11-23 17:42:45 +00:00
dbesc ( normalise_link ( $profile )));
if ( $r )
$nick = $r [ 0 ][ " nick " ];
2015-12-27 16:45:20 +00:00
if ( ! $nick == " " ) {
$r = q ( " SELECT `nick` FROM `contact` WHERE `uid` = 0 AND `nurl` = '%s' " ,
dbesc ( normalise_link ( $profile )));
if ( $r )
$nick = $r [ 0 ][ " nick " ];
}
2014-01-02 21:29:44 +00:00
2015-12-27 16:45:20 +00:00
if ( ! $nick == " " ) {
$friendica = preg_replace ( " =https?://(.*)/profile/(.*)=ism " , " $ 2 " , $profile );
if ( $friendica != $profile )
$nick = $friendica ;
}
2014-01-02 21:29:44 +00:00
2015-12-27 16:45:20 +00:00
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 ;
}
2014-01-02 21:29:44 +00:00
2015-12-27 16:45:20 +00:00
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 ;
}
2014-01-02 21:29:44 +00:00
}
}
2015-12-27 16:45:20 +00:00
// To-Do: look at the page if its really a pumpio site
//if (!$nick == "") {
// $pumpio = preg_replace("=https?://(.*)/(.*)/=ism", "$2", $profile."/");
// if ($pumpio != $profile)
// $nick = $pumpio;
// <div class="media" id="profile-block" data-profile-id="acct:kabniel@microca.st">
//}
2014-01-02 21:29:44 +00:00
2016-01-06 21:23:12 +00:00
if ( $nick != " " )
2015-12-27 16:45:20 +00:00
return ( $nick );
2014-01-02 21:29:44 +00:00
2015-12-27 16:45:20 +00:00
return ( false );
2014-01-02 21:29:44 +00:00
}
2015-12-27 16:45:20 +00:00
function api_clean_plain_items ( $Text ) {
$include_entities = strtolower ( x ( $_REQUEST , 'include_entities' ) ? $_REQUEST [ 'include_entities' ] : " false " );
2014-01-02 21:29:44 +00:00
2015-12-27 16:45:20 +00:00
$Text = bb_CleanPictureLinks ( $Text );
$URLSearchString = " ^ \ [ \ ] " ;
2014-02-22 14:42:34 +00:00
2015-12-27 16:45:20 +00:00
$Text = preg_replace ( " /([!#@]) \ [url \ =([ $URLSearchString ]*) \ ](.*?) \ [ \ /url \ ]/ism " , '$1$3' , $Text );
2014-02-13 07:30:40 +00:00
2015-12-27 16:45:20 +00:00
if ( $include_entities == " true " ) {
$Text = preg_replace ( " / \ [url \ =([ $URLSearchString ]*) \ ](.*?) \ [ \ /url \ ]/ism " , '[url=$1]$1[/url]' , $Text );
}
2014-04-04 08:44:42 +00:00
2016-04-17 18:43:41 +00:00
// Simplify "attachment" element
$Text = api_clean_attachments ( $Text );
2015-12-27 16:45:20 +00:00
return ( $Text );
2014-02-13 07:30:40 +00:00
}
2014-02-12 00:41:45 +00:00
2016-04-17 18:43:41 +00:00
/**
* @ brief Removes most sharing information for API text export
*
* @ param string $body The original body
*
* @ return string Cleaned body
*/
function api_clean_attachments ( $body ) {
$data = get_attachment_data ( $body );
2014-01-02 21:29:44 +00:00
2016-04-17 18:43:41 +00:00
if ( ! $data )
return $body ;
2014-01-02 21:29:44 +00:00
2016-04-17 18:43:41 +00:00
$body = " " ;
2014-01-02 21:29:44 +00:00
2016-04-17 18:43:41 +00:00
if ( isset ( $data [ " text " ]))
$body = $data [ " text " ];
2014-01-05 15:12:03 +00:00
2016-04-17 18:43:41 +00:00
if (( $body == " " ) AND ( isset ( $data [ " title " ])))
$body = $data [ " title " ];
2014-01-05 15:57:05 +00:00
2016-04-17 18:43:41 +00:00
if ( isset ( $data [ " url " ]))
$body .= " \n " . $data [ " url " ];
2014-01-05 15:12:03 +00:00
2016-07-15 14:53:30 +00:00
$body .= $data [ " after " ];
2016-04-17 18:43:41 +00:00
return $body ;
2015-12-27 16:45:20 +00:00
}
2014-01-05 15:12:03 +00:00
2015-12-27 16:45:20 +00:00
function api_best_nickname ( & $contacts ) {
$best_contact = array ();
2014-01-05 15:12:03 +00:00
2015-12-27 16:45:20 +00:00
if ( count ( $contact ) == 0 )
return ;
2014-01-05 15:12:03 +00:00
foreach ( $contacts AS $contact )
2015-12-27 16:45:20 +00:00
if ( $contact [ " network " ] == " " ) {
$contact [ " network " ] = " dfrn " ;
2014-01-05 15:12:03 +00:00
$best_contact = array ( $contact );
2015-12-27 16:45:20 +00:00
}
2014-01-05 15:12:03 +00:00
2015-12-27 16:45:20 +00:00
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 ]);
}
2014-01-05 15:12:03 +00:00
2015-12-07 18:37:14 +00:00
// return all or a specified group of the user with the containing contacts
2015-12-07 21:18:55 +00:00
function api_friendica_group_show ( & $a , $type ) {
2015-12-27 16:45:20 +00:00
if ( api_user () === false ) throw new ForbiddenException ();
2015-12-07 18:37:14 +00:00
// params
$user_info = api_get_user ( $a );
$gid = ( x ( $_REQUEST , 'gid' ) ? $_REQUEST [ 'gid' ] : 0 );
$uid = $user_info [ 'uid' ];
2015-12-27 16:45:20 +00:00
2015-12-07 18:37:14 +00:00
// get data of the specified group id or all groups if not specified
if ( $gid != 0 ) {
$r = q ( " SELECT * FROM `group` WHERE `deleted` = 0 AND `uid` = %d AND `id` = %d " ,
2015-12-27 16:45:20 +00:00
intval ( $uid ),
2015-12-07 18:37:14 +00:00
intval ( $gid ));
// error message if specified gid is not in database
2015-12-27 16:45:20 +00:00
if ( count ( $r ) == 0 )
throw new BadRequestException ( " gid not available " );
2015-12-07 18:37:14 +00:00
}
2015-12-27 16:45:20 +00:00
else
2015-12-07 18:37:14 +00:00
$r = q ( " SELECT * FROM `group` WHERE `deleted` = 0 AND `uid` = %d " ,
intval ( $uid ));
2015-12-27 16:45:20 +00:00
2015-12-07 18:37:14 +00:00
// loop through all groups and retrieve all members for adding data in the user array
foreach ( $r as $rr ) {
$members = group_get_members ( $rr [ 'id' ]);
$users = array ();
2016-07-17 21:59:35 +00:00
if ( $type == " xml " ) {
$user_element = " users " ;
$k = 0 ;
foreach ( $members as $member ) {
$user = api_get_user ( $a , $member [ 'nurl' ]);
$users [ $k ++. " :user " ] = $user ;
}
} else {
$user_element = " user " ;
foreach ( $members as $member ) {
$user = api_get_user ( $a , $member [ 'nurl' ]);
$users [] = $user ;
}
2015-12-07 18:37:14 +00:00
}
2016-07-17 21:59:35 +00:00
$grps [] = array ( 'name' => $rr [ 'name' ], 'gid' => $rr [ 'id' ], $user_element => $users );
2015-12-07 18:37:14 +00:00
}
2016-07-17 21:59:35 +00:00
return api_format_data ( " groups " , $type , array ( 'group' => $grps ));
2015-12-07 18:37:14 +00:00
}
2015-12-07 21:18:55 +00:00
api_register_func ( 'api/friendica/group_show' , 'api_friendica_group_show' , true );
2015-12-07 18:37:14 +00:00
// delete the specified group of the user
2015-12-07 21:18:55 +00:00
function api_friendica_group_delete ( & $a , $type ) {
2015-12-27 16:45:20 +00:00
if ( api_user () === false ) throw new ForbiddenException ();
2015-12-07 18:37:14 +00:00
// params
$user_info = api_get_user ( $a );
$gid = ( x ( $_REQUEST , 'gid' ) ? $_REQUEST [ 'gid' ] : 0 );
$name = ( x ( $_REQUEST , 'name' ) ? $_REQUEST [ 'name' ] : " " );
$uid = $user_info [ 'uid' ];
2015-12-27 16:45:20 +00:00
2015-12-07 18:37:14 +00:00
// error if no gid specified
if ( $gid == 0 || $name == " " )
2015-12-27 16:45:20 +00:00
throw new BadRequestException ( 'gid or name not specified' );
2015-12-07 18:37:14 +00:00
// get data of the specified group id
$r = q ( " SELECT * FROM `group` WHERE `uid` = %d AND `id` = %d " ,
2015-12-27 16:45:20 +00:00
intval ( $uid ),
2015-12-07 18:37:14 +00:00
intval ( $gid ));
// error message if specified gid is not in database
2015-12-27 16:45:20 +00:00
if ( count ( $r ) == 0 )
throw new BadRequestException ( 'gid not available' );
2015-12-07 18:37:14 +00:00
// get data of the specified group id and group name
$rname = q ( " SELECT * FROM `group` WHERE `uid` = %d AND `id` = %d AND `name` = '%s' " ,
2015-12-27 16:45:20 +00:00
intval ( $uid ),
2015-12-07 18:37:14 +00:00
intval ( $gid ),
dbesc ( $name ));
// error message if specified gid is not in database
2015-12-27 16:45:20 +00:00
if ( count ( $rname ) == 0 )
throw new BadRequestException ( 'wrong group name' );
2015-12-07 18:37:14 +00:00
// delete group
$ret = group_rmv ( $uid , $name );
if ( $ret ) {
// return success
$success = array ( 'success' => $ret , 'gid' => $gid , 'name' => $name , 'status' => 'deleted' , 'wrong users' => array ());
2016-07-17 21:59:35 +00:00
return api_format_data ( " group_delete " , $type , array ( 'result' => $success ));
2015-12-07 18:37:14 +00:00
}
else
2015-12-27 16:45:20 +00:00
throw new BadRequestException ( 'other API error' );
2015-12-07 18:37:14 +00:00
}
2015-12-27 16:45:20 +00:00
api_register_func ( 'api/friendica/group_delete' , 'api_friendica_group_delete' , true , API_METHOD_DELETE );
2015-12-07 18:37:14 +00:00
2015-12-27 16:45:20 +00:00
// create the specified group with the posted array of contacts
2015-12-07 21:18:55 +00:00
function api_friendica_group_create ( & $a , $type ) {
2015-12-27 16:45:20 +00:00
if ( api_user () === false ) throw new ForbiddenException ();
2015-12-07 18:37:14 +00:00
// params
$user_info = api_get_user ( $a );
$name = ( x ( $_REQUEST , 'name' ) ? $_REQUEST [ 'name' ] : " " );
$uid = $user_info [ 'uid' ];
$json = json_decode ( $_POST [ 'json' ], true );
$users = $json [ 'user' ];
// error if no name specified
if ( $name == " " )
2015-12-27 16:45:20 +00:00
throw new BadRequestException ( 'group name not specified' );
2015-12-07 18:37:14 +00:00
// get data of the specified group name
$rname = q ( " SELECT * FROM `group` WHERE `uid` = %d AND `name` = '%s' AND `deleted` = 0 " ,
2015-12-27 16:45:20 +00:00
intval ( $uid ),
2015-12-07 18:37:14 +00:00
dbesc ( $name ));
// error message if specified group name already exists
2015-12-27 16:45:20 +00:00
if ( count ( $rname ) != 0 )
throw new BadRequestException ( 'group name already exists' );
2015-12-07 18:37:14 +00:00
// check if specified group name is a deleted group
$rname = q ( " SELECT * FROM `group` WHERE `uid` = %d AND `name` = '%s' AND `deleted` = 1 " ,
2015-12-27 16:45:20 +00:00
intval ( $uid ),
2015-12-07 18:37:14 +00:00
dbesc ( $name ));
// error message if specified group name already exists
2015-12-27 16:45:20 +00:00
if ( count ( $rname ) != 0 )
2015-12-07 18:37:14 +00:00
$reactivate_group = true ;
// create group
$ret = group_add ( $uid , $name );
2015-12-27 16:45:20 +00:00
if ( $ret )
2015-12-07 18:37:14 +00:00
$gid = group_byname ( $uid , $name );
else
2015-12-27 16:45:20 +00:00
throw new BadRequestException ( 'other API error' );
2015-12-07 18:37:14 +00:00
// add members
$erroraddinguser = false ;
$errorusers = array ();
foreach ( $users as $user ) {
$cid = $user [ 'cid' ];
// check if user really exists as contact
2015-12-27 16:45:20 +00:00
$contact = q ( " SELECT * FROM `contact` WHERE `id` = %d AND `uid` = %d " ,
2015-12-07 18:37:14 +00:00
intval ( $cid ),
intval ( $uid ));
if ( count ( $contact ))
$result = group_add_member ( $uid , $name , $cid , $gid );
else {
$erroraddinguser = true ;
$errorusers [] = $cid ;
}
}
// return success message incl. missing users in array
$status = ( $erroraddinguser ? " missing user " : ( $reactivate_group ? " reactivated " : " ok " ));
$success = array ( 'success' => true , 'gid' => $gid , 'name' => $name , 'status' => $status , 'wrong users' => $errorusers );
2016-07-17 21:59:35 +00:00
return api_format_data ( " group_create " , $type , array ( 'result' => $success ));
2015-11-24 01:49:29 +00:00
}
2015-12-27 16:45:20 +00:00
api_register_func ( 'api/friendica/group_create' , 'api_friendica_group_create' , true , API_METHOD_POST );
2015-12-07 18:37:14 +00:00
2015-12-27 16:45:20 +00:00
// update the specified group with the posted array of contacts
2015-12-07 21:18:55 +00:00
function api_friendica_group_update ( & $a , $type ) {
2015-12-27 16:45:20 +00:00
if ( api_user () === false ) throw new ForbiddenException ();
2015-11-24 01:49:29 +00:00
2015-12-07 18:37:14 +00:00
// params
$user_info = api_get_user ( $a );
$uid = $user_info [ 'uid' ];
$gid = ( x ( $_REQUEST , 'gid' ) ? $_REQUEST [ 'gid' ] : 0 );
$name = ( x ( $_REQUEST , 'name' ) ? $_REQUEST [ 'name' ] : " " );
$json = json_decode ( $_POST [ 'json' ], true );
$users = $json [ 'user' ];
// error if no name specified
if ( $name == " " )
2015-12-27 16:45:20 +00:00
throw new BadRequestException ( 'group name not specified' );
2015-12-07 18:37:14 +00:00
// error if no gid specified
if ( $gid == " " )
2015-12-27 16:45:20 +00:00
throw new BadRequestException ( 'gid not specified' );
2015-12-07 18:37:14 +00:00
// remove members
$members = group_get_members ( $gid );
foreach ( $members as $member ) {
$cid = $member [ 'id' ];
foreach ( $users as $user ) {
$found = ( $user [ 'cid' ] == $cid ? true : false );
}
if ( ! $found ) {
$ret = group_rmv_member ( $uid , $name , $cid );
}
}
// add members
$erroraddinguser = false ;
$errorusers = array ();
foreach ( $users as $user ) {
$cid = $user [ 'cid' ];
// check if user really exists as contact
2015-12-27 16:45:20 +00:00
$contact = q ( " SELECT * FROM `contact` WHERE `id` = %d AND `uid` = %d " ,
2015-12-07 18:37:14 +00:00
intval ( $cid ),
intval ( $uid ));
if ( count ( $contact ))
$result = group_add_member ( $uid , $name , $cid , $gid );
else {
$erroraddinguser = true ;
$errorusers [] = $cid ;
}
}
2015-12-27 16:45:20 +00:00
2015-12-07 18:37:14 +00:00
// return success message incl. missing users in array
$status = ( $erroraddinguser ? " missing user " : " ok " );
$success = array ( 'success' => true , 'gid' => $gid , 'name' => $name , 'status' => $status , 'wrong users' => $errorusers );
2016-07-17 21:59:35 +00:00
return api_format_data ( " group_update " , $type , array ( 'result' => $success ));
2015-12-07 18:37:14 +00:00
}
2015-12-27 16:45:20 +00:00
api_register_func ( 'api/friendica/group_update' , 'api_friendica_group_update' , true , API_METHOD_POST );
function api_friendica_activity ( & $a , $type ) {
if ( api_user () === false ) throw new ForbiddenException ();
$verb = strtolower ( $a -> argv [ 3 ]);
2016-01-02 11:54:57 +00:00
$verb = preg_replace ( " | \ ..* $ | " , " " , $verb );
2015-12-27 16:45:20 +00:00
$id = ( x ( $_REQUEST , 'id' ) ? $_REQUEST [ 'id' ] : 0 );
$res = do_like ( $id , $verb );
if ( $res ) {
2016-07-17 21:59:35 +00:00
if ( $type == " xml " )
2015-12-27 16:45:20 +00:00
$ok = " true " ;
else
$ok = " ok " ;
2016-07-17 21:59:35 +00:00
return api_format_data ( 'ok' , $type , array ( 'ok' => $ok ));
2015-12-27 16:45:20 +00:00
} else {
throw new BadRequestException ( 'Error adding activity' );
}
}
api_register_func ( 'api/friendica/activity/like' , 'api_friendica_activity' , true , API_METHOD_POST );
api_register_func ( 'api/friendica/activity/dislike' , 'api_friendica_activity' , true , API_METHOD_POST );
api_register_func ( 'api/friendica/activity/attendyes' , 'api_friendica_activity' , true , API_METHOD_POST );
api_register_func ( 'api/friendica/activity/attendno' , 'api_friendica_activity' , true , API_METHOD_POST );
api_register_func ( 'api/friendica/activity/attendmaybe' , 'api_friendica_activity' , true , API_METHOD_POST );
api_register_func ( 'api/friendica/activity/unlike' , 'api_friendica_activity' , true , API_METHOD_POST );
api_register_func ( 'api/friendica/activity/undislike' , 'api_friendica_activity' , true , API_METHOD_POST );
api_register_func ( 'api/friendica/activity/unattendyes' , 'api_friendica_activity' , true , API_METHOD_POST );
api_register_func ( 'api/friendica/activity/unattendno' , 'api_friendica_activity' , true , API_METHOD_POST );
api_register_func ( 'api/friendica/activity/unattendmaybe' , 'api_friendica_activity' , true , API_METHOD_POST );
2015-03-15 20:19:29 +00:00
2016-02-07 13:27:13 +00:00
/**
2016-02-08 08:47:59 +00:00
* @ brief Returns notifications
*
* @ param App $a
* @ param string $type Known types are 'atom' , 'rss' , 'xml' and 'json'
* @ return string
*/
2016-02-07 13:27:13 +00:00
function api_friendica_notification ( & $a , $type ) {
if ( api_user () === false ) throw new ForbiddenException ();
2016-02-08 08:47:59 +00:00
if ( $a -> argc !== 3 ) throw new BadRequestException ( " Invalid argument count " );
2016-02-07 13:27:13 +00:00
$nm = new NotificationsManager ();
2016-07-14 11:32:31 +00:00
2016-02-08 08:47:59 +00:00
$notes = $nm -> getAll ( array (), " +seen -date " , 50 );
2016-07-17 17:42:30 +00:00
if ( $type == " xml " ) {
$xmlnotes = array ();
foreach ( $notes AS $note )
$xmlnotes [] = array ( " @attributes " => $note );
$notes = $xmlnotes ;
}
2016-07-17 21:59:35 +00:00
return api_format_data ( " notes " , $type , array ( 'note' => $notes ));
2016-02-08 08:47:59 +00:00
}
2016-07-14 11:32:31 +00:00
2016-02-08 08:47:59 +00:00
/**
* @ brief Set notification as seen and returns associated item ( if possible )
*
* POST request with 'id' param as notification id
2016-07-14 11:32:31 +00:00
*
2016-02-08 08:47:59 +00:00
* @ param App $a
* @ param string $type Known types are 'atom' , 'rss' , 'xml' and 'json'
* @ return string
*/
function api_friendica_notification_seen ( & $a , $type ){
if ( api_user () === false ) throw new ForbiddenException ();
if ( $a -> argc !== 4 ) throw new BadRequestException ( " Invalid argument count " );
2016-07-14 11:32:31 +00:00
2016-02-08 08:47:59 +00:00
$id = ( x ( $_REQUEST , 'id' ) ? intval ( $_REQUEST [ 'id' ]) : 0 );
2016-07-14 11:32:31 +00:00
$nm = new NotificationsManager ();
2016-02-08 08:47:59 +00:00
$note = $nm -> getByID ( $id );
if ( is_null ( $note )) throw new BadRequestException ( " Invalid argument " );
2016-07-14 11:32:31 +00:00
2016-02-08 08:47:59 +00:00
$nm -> setSeen ( $note );
if ( $note [ 'otype' ] == 'item' ) {
// would be really better with an ItemsManager and $im->getByID() :-P
2016-02-08 13:35:41 +00:00
$r = q ( " SELECT * FROM `item` WHERE `id`=%d AND `uid`=%d " ,
2016-02-08 08:47:59 +00:00
intval ( $note [ 'iid' ]),
intval ( local_user ())
);
if ( $r !== false ) {
// we found the item, return it to the user
2016-02-07 13:27:13 +00:00
$user_info = api_get_user ( $a );
2016-07-17 21:59:35 +00:00
$ret = api_format_items ( $r , $user_info , false , $type );
$data = array ( 'status' => $ret );
return api_format_data ( " status " , $type , $data );
2016-02-07 13:27:13 +00:00
}
2016-02-08 08:47:59 +00:00
// the item can't be found, but we set the note as seen, so we count this as a success
2016-07-14 11:32:31 +00:00
}
2016-07-17 21:59:35 +00:00
return api_format_data ( 'result' , $type , array ( 'result' => " success " ));
2016-02-07 13:27:13 +00:00
}
2016-07-14 11:32:31 +00:00
2016-02-08 08:47:59 +00:00
api_register_func ( 'api/friendica/notification/seen' , 'api_friendica_notification_seen' , true , API_METHOD_POST );
2016-02-07 13:27:13 +00:00
api_register_func ( 'api/friendica/notification' , 'api_friendica_notification' , true , API_METHOD_GET );
2016-07-14 11:32:31 +00:00
2016-02-07 13:27:13 +00:00
2012-03-21 09:08:40 +00:00
/*
2015-06-02 14:19:40 +00:00
To . Do :
[ pagename ] => api / 1.1 / statuses / lookup . json
[ id ] => 605138389168451584
[ include_cards ] => true
[ cards_platform ] => Android - 12
[ include_entities ] => true
[ include_my_retweet ] => 1
[ include_rts ] => 1
[ include_reply_count ] => true
[ include_descendent_reply_count ] => true
2015-12-27 16:45:20 +00:00
( ? )
2015-06-02 14:19:40 +00:00
2012-03-21 09:08:40 +00: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 21:41:04 +00:00
lists
2012-03-21 09:08:40 +00:00
*/