X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=include%2Fapi.php;h=531b66814f16ba81d6a82e48539b84b146920b52;hb=50c004aa5ff14a4d65fd57e4ca8231de3546b569;hp=06dbca7f143ad9911702c02292ad1fbb5d03b346;hpb=8184eac42faf99d796700371c640a5231d6cf9fa;p=friendica.git diff --git a/include/api.php b/include/api.php index 06dbca7f14..531b66814f 100644 --- a/include/api.php +++ b/include/api.php @@ -9,6 +9,14 @@ require_once("include/html2plain.php"); require_once("mod/share.php"); require_once("include/Photo.php"); + require_once("mod/item.php"); + require_once('include/security.php'); + require_once('include/contact_selectors.php'); + require_once('include/html2bbcode.php'); + require_once('mod/wall_upload.php'); + require_once("mod/proxy.php"); + require_once("include/message.php"); + /* * Twitter-Like API @@ -151,7 +159,6 @@ die('This api requires login'); } - require_once('include/security.php'); authenticate_success($record); $_SESSION["allow_api"] = true; call_hooks('logged_in', $a->user); @@ -185,7 +192,11 @@ if (strpos($a->query_string, ".atom")>0) $type="atom"; if (strpos($a->query_string, ".as")>0) $type="as"; + $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) return; switch($type){ @@ -274,7 +285,7 @@ * Unique contact to contact url. */ function api_unique_id_to_url($id){ - $r = q("SELECT url FROM unique_contacts WHERE id=%d LIMIT 1", + $r = q("SELECT `url` FROM `unique_contacts` WHERE `id`=%d LIMIT 1", intval($id)); if ($r) return ($r[0]["url"]); @@ -379,9 +390,9 @@ $r = array(); if ($url != "") - $r = q("SELECT * FROM unique_contacts WHERE url='%s' LIMIT 1", $url); + $r = q("SELECT * FROM `unique_contacts` WHERE `url`='%s' LIMIT 1", $url); elseif ($nick != "") - $r = q("SELECT * FROM unique_contacts WHERE nick='%s' LIMIT 1", $nick); + $r = q("SELECT * FROM `unique_contacts` WHERE `nick`='%s' LIMIT 1", $nick); if ($r) { // If no nick where given, extract it from the address @@ -395,19 +406,27 @@ 'screen_name' => (($r[0]['nick']) ? $r[0]['nick'] : $r[0]['name']), 'location' => NULL, 'description' => NULL, - 'profile_image_url' => $r[0]["avatar"], - 'profile_image_url_https' => $r[0]["avatar"], 'url' => $r[0]["url"], 'protected' => false, 'followers_count' => 0, 'friends_count' => 0, + 'listed_count' => 0, 'created_at' => api_date(0), 'favourites_count' => 0, 'utc_offset' => 0, 'time_zone' => 'UTC', + 'geo_enabled' => false, + 'verified' => false, 'statuses_count' => 0, + 'lang' => '', + 'contributors_enabled' => false, + 'is_translator' => false, + 'is_translation_enabled' => false, + 'profile_image_url' => $r[0]["avatar"], + 'profile_image_url_https' => $r[0]["avatar"], 'following' => false, - 'verified' => false, + 'follow_request_sent' => false, + 'notifications' => false, 'statusnet_blocking' => false, 'notifications' => false, 'statusnet_profile_url' => $r[0]["url"], @@ -486,18 +505,17 @@ } // Fetching unique id - $r = q("SELECT id FROM unique_contacts WHERE url='%s' LIMIT 1", dbesc(normalise_link($uinfo[0]['url']))); + $r = q("SELECT id FROM `unique_contacts` WHERE `url`='%s' LIMIT 1", dbesc(normalise_link($uinfo[0]['url']))); // If not there, then add it if (count($r) == 0) { - q("INSERT INTO unique_contacts (url, name, nick, avatar) VALUES ('%s', '%s', '%s', '%s')", + q("INSERT INTO `unique_contacts` (`url`, `name`, `nick`, `avatar`) VALUES ('%s', '%s', '%s', '%s')", dbesc(normalise_link($uinfo[0]['url'])), dbesc($uinfo[0]['name']),dbesc($uinfo[0]['nick']), dbesc($uinfo[0]['micro'])); - $r = q("SELECT id FROM unique_contacts WHERE url='%s' LIMIT 1", dbesc(normalise_link($uinfo[0]['url']))); + $r = q("SELECT `id` FROM `unique_contacts` WHERE `url`='%s' LIMIT 1", dbesc(normalise_link($uinfo[0]['url']))); } - require_once('include/contact_selectors.php'); - $network_name = network_to_name($uinfo[0]['network']); + $network_name = network_to_name($uinfo[0]['network'], $uinfo[0]['url']); $ret = Array( 'id' => intval($r[0]['id']), @@ -521,7 +539,8 @@ 'verified' => true, 'statusnet_blocking' => false, 'notifications' => false, - 'statusnet_profile_url' => $a->get_baseurl()."/contacts/".$uinfo[0]['cid'], + //'statusnet_profile_url' => $a->get_baseurl()."/contacts/".$uinfo[0]['cid'], + 'statusnet_profile_url' => $uinfo[0]['url'], 'uid' => intval($uinfo[0]['uid']), 'cid' => intval($uinfo[0]['cid']), 'self' => $uinfo[0]['self'], @@ -534,32 +553,44 @@ function api_item_get_user(&$a, $item) { - $author = q("SELECT * FROM unique_contacts WHERE url='%s' LIMIT 1", + $author = q("SELECT * FROM `unique_contacts` WHERE `url`='%s' LIMIT 1", dbesc(normalise_link($item['author-link']))); if (count($author) == 0) { - q("INSERT INTO unique_contacts (url, name, avatar) VALUES ('%s', '%s', '%s')", - dbesc(normalise_link($item["author-link"])), dbesc($item["author-name"]), dbesc($item["author-avatar"])); + q("INSERT INTO `unique_contacts` (`url`, `name`, `avatar`) VALUES ('%s', '%s', '%s')", + dbesc(normalise_link($item["author-link"])), dbesc($item["author-name"]), dbesc($item["author-avatar"])); - $author = q("SELECT id FROM unique_contacts WHERE url='%s' LIMIT 1", + $author = q("SELECT `id` FROM `unique_contacts` WHERE `url`='%s' LIMIT 1", dbesc(normalise_link($item['author-link']))); } else if ($item["author-link"].$item["author-name"] != $author[0]["url"].$author[0]["name"]) { - q("UPDATE unique_contacts SET name = '%s', avatar = '%s' WHERE url = '%s'", - dbesc($item["author-name"]), dbesc($item["author-avatar"]), dbesc(normalise_link($item["author-link"]))); + $r = q("SELECT `id` FROM `unique_contacts` WHERE `name` = '%s' AND `avatar` = '%s' AND url = '%s'", + dbesc($item["author-name"]), dbesc($item["author-avatar"]), + dbesc(normalise_link($item["author-link"]))); + + if (!$r) + q("UPDATE `unique_contacts` SET `name` = '%s', `avatar` = '%s' WHERE `url` = '%s'", + dbesc($item["author-name"]), dbesc($item["author-avatar"]), + dbesc(normalise_link($item["author-link"]))); } - $owner = q("SELECT id FROM unique_contacts WHERE url='%s' LIMIT 1", + $owner = q("SELECT `id` FROM `unique_contacts` WHERE `url`='%s' LIMIT 1", dbesc(normalise_link($item['owner-link']))); if (count($owner) == 0) { - q("INSERT INTO unique_contacts (url, name, avatar) VALUES ('%s', '%s', '%s')", - dbesc(normalise_link($item["owner-link"])), dbesc($item["owner-name"]), dbesc($item["owner-avatar"])); + q("INSERT INTO `unique_contacts` (`url`, `name`, `avatar`) VALUES ('%s', '%s', '%s')", + dbesc(normalise_link($item["owner-link"])), dbesc($item["owner-name"]), dbesc($item["owner-avatar"])); - $owner = q("SELECT id FROM unique_contacts WHERE url='%s' LIMIT 1", + $owner = q("SELECT `id` FROM `unique_contacts` WHERE `url`='%s' LIMIT 1", dbesc(normalise_link($item['owner-link']))); } else if ($item["owner-link"].$item["owner-name"] != $owner[0]["url"].$owner[0]["name"]) { - q("UPDATE unique_contacts SET name = '%s', avatar = '%s' WHERE url = '%s'", - dbesc($item["owner-name"]), dbesc($item["owner-avatar"]), dbesc(normalise_link($item["owner-link"]))); + $r = q("SELECT `id` FROM `unique_contacts` WHERE `name` = '%s' AND `avatar` = '%s' AND url = '%s'", + dbesc($item["owner-name"]), dbesc($item["owner-avatar"]), + dbesc(normalise_link($item["owner-link"]))); + + if (!$r) + q("UPDATE `unique_contacts` SET `name` = '%s', `avatar` = '%s' WHERE `url` = '%s'", + dbesc($item["owner-name"]), dbesc($item["owner-avatar"]), + dbesc(normalise_link($item["owner-link"]))); } // Comments in threads may appear as wall-to-wall postings. @@ -678,10 +709,10 @@ $txt = requestdata('status'); //$txt = urldecode(requestdata('status')); - require_once('library/HTMLPurifier.auto.php'); - require_once('include/html2bbcode.php'); - if((strpos($txt,'<') !== false) || (strpos($txt,'>') !== false)) { + + require_once('library/HTMLPurifier.auto.php'); + $txt = html2bb_video($txt); $config = HTMLPurifier_Config::createDefault(); $config->set('Cache.DefinitionImpl', null); @@ -693,12 +724,10 @@ $a->argv[1]=$user_info['screen_name']; //should be set to username? $_REQUEST['hush']='yeah'; //tell wall_upload function to return img info instead of echo - require_once('mod/wall_upload.php'); $bebop = wall_upload_post($a); //now that we have the img url in bbcode we can add it to the status and insert the wall item. $_REQUEST['body']=$txt."\n\n".$bebop; - require_once('mod/item.php'); item_post($a); // this should output the last post (the one we just posted). @@ -721,18 +750,16 @@ // logger('api_post: ' . print_r($_POST,true)); if(requestdata('htmlstatus')) { - require_once('library/HTMLPurifier.auto.php'); - require_once('include/html2bbcode.php'); - $txt = requestdata('htmlstatus'); if((strpos($txt,'<') !== false) || (strpos($txt,'>') !== false)) { + require_once('library/HTMLPurifier.auto.php'); + $txt = html2bb_video($txt); $config = HTMLPurifier_Config::createDefault(); $config->set('Cache.DefinitionImpl', null); - $purifier = new HTMLPurifier($config); $txt = $purifier->purify($txt); @@ -745,6 +772,11 @@ $_REQUEST['title'] = requestdata('title'); $parent = requestdata('in_reply_to_status_id'); + + // Twidere sends "-1" if it is no reply ... + if ($parent == -1) + $parent = ""; + if(ctype_digit($parent)) $_REQUEST['parent'] = $parent; else @@ -821,7 +853,6 @@ if(x($_FILES,'media')) { // upload the image if we have one $_REQUEST['hush']='yeah'; //tell wall_upload function to return img info instead of echo - require_once('mod/wall_upload.php'); $media = wall_upload_post($a); if(strlen($media)>0) $_REQUEST['body'] .= "\n\n".$media; @@ -848,7 +879,6 @@ // call out normal post function - require_once('mod/item.php'); item_post($a); // this should output the last post (the one we just posted). @@ -871,7 +901,6 @@ return false; } - require_once('mod/wall_upload.php'); $media = wall_upload_post($a, false); if(!$media) { // Output error @@ -898,14 +927,18 @@ logger('api_status_show: user_info: '.print_r($user_info, true), LOGGER_DEBUG); + if ($type == "raw") + $privacy_sql = "AND `item`.`allow_cid`='' AND `item`.`allow_gid`='' AND `item`.`deny_cid`='' AND `item`.`deny_gid`=''"; + else + $privacy_sql = ""; + // get last public wall message $lastwall = q("SELECT `item`.*, `i`.`contact-id` as `reply_uid`, `i`.`author-link` AS `item-author` FROM `item`, `item` as `i` WHERE `item`.`contact-id` = %d AND `item`.`uid` = %d AND ((`item`.`author-link` IN ('%s', '%s')) OR (`item`.`owner-link` IN ('%s', '%s'))) AND `i`.`id` = `item`.`parent` - AND `item`.`type`!='activity' - AND `item`.`allow_cid`='' AND `item`.`allow_gid`='' AND `item`.`deny_cid`='' AND `item`.`deny_gid`='' + AND `item`.`type`!='activity' $privacy_sql ORDER BY `item`.`created` DESC LIMIT 1", intval($user_info['cid']), @@ -928,7 +961,7 @@ $in_reply_to_status_id= intval($lastwall['parent']); $in_reply_to_status_id_str = (string) intval($lastwall['parent']); - $r = q("SELECT * FROM unique_contacts WHERE `url` = '%s'", dbesc(normalise_link($lastwall['item-author']))); + $r = q("SELECT * FROM `unique_contacts` WHERE `url` = '%s'", dbesc(normalise_link($lastwall['item-author']))); if ($r) { if ($r[0]['nick'] == "") $r[0]['nick'] = api_get_nick($r[0]["url"]); @@ -951,23 +984,32 @@ $in_reply_to_screen_name = NULL; } - $converted = api_convert_item($item); + $converted = api_convert_item($lastwall); $status_info = array( + 'created_at' => api_date($lastwall['created']), + 'id' => intval($lastwall['id']), + 'id_str' => (string) $lastwall['id'], 'text' => $converted["text"], + 'source' => (($lastwall['app']) ? $lastwall['app'] : 'web'), 'truncated' => false, - 'created_at' => api_date($lastwall['created']), 'in_reply_to_status_id' => $in_reply_to_status_id, 'in_reply_to_status_id_str' => $in_reply_to_status_id_str, - 'source' => (($lastwall['app']) ? $lastwall['app'] : 'web'), - 'id' => intval($lastwall['id']), - 'id_str' => (string) $lastwall['id'], 'in_reply_to_user_id' => $in_reply_to_user_id, 'in_reply_to_user_id_str' => $in_reply_to_user_id_str, 'in_reply_to_screen_name' => $in_reply_to_screen_name, + 'user' => $user_info, 'geo' => NULL, + 'coordinates' => "", + 'place' => "", + 'contributors' => "", + 'is_quote_status' => false, + 'retweet_count' => 0, + 'favorite_count' => 0, 'favorited' => $lastwall['starred'] ? true : false, - 'user' => $user_info, + 'retweeted' => false, + 'possibly_sensitive' => false, + 'lang' => "", 'statusnet_html' => $converted["html"], 'statusnet_conversation_id' => $lastwall['parent'], ); @@ -979,15 +1021,17 @@ $status_info["entities"] = $converted["entities"]; if (($lastwall['item_network'] != "") AND ($status["source"] == 'web')) - $status_info["source"] = network_to_name($lastwall['item_network']); - elseif (($lastwall['item_network'] != "") AND (network_to_name($lastwall['item_network']) != $status_info["source"])) - $status_info["source"] = trim($status_info["source"].' ('.network_to_name($lastwall['item_network']).')'); + $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']).')'); // "uid" and "self" are only needed for some internal stuff, so remove it from here unset($status_info["user"]["uid"]); unset($status_info["user"]["self"]); } + logger('status_info: '.print_r($status_info, true), LOGGER_DEBUG); + if ($type == "raw") return($status_info); @@ -1039,7 +1083,7 @@ $in_reply_to_status_id = intval($lastwall['parent']); $in_reply_to_status_id_str = (string) intval($lastwall['parent']); - $r = q("SELECT * FROM unique_contacts WHERE `url` = '%s'", dbesc(normalise_link($reply[0]['item-author']))); + $r = q("SELECT * FROM `unique_contacts` WHERE `url` = '%s'", dbesc(normalise_link($reply[0]['item-author']))); if ($r) { if ($r[0]['nick'] == "") $r[0]['nick'] = api_get_nick($r[0]["url"]); @@ -1051,7 +1095,7 @@ } } - $converted = api_convert_item($item); + $converted = api_convert_item($lastwall); $user_info['status'] = array( 'text' => $converted["text"], @@ -1078,9 +1122,9 @@ $user_info["status"]["entities"] = $converted["entities"]; if (($lastwall['item_network'] != "") AND ($user_info["status"]["source"] == 'web')) - $user_info["status"]["source"] = network_to_name($lastwall['item_network']); - if (($lastwall['item_network'] != "") AND (network_to_name($lastwall['item_network']) != $user_info["status"]["source"])) - $user_info["status"]["source"] = trim($user_info["status"]["source"].' ('.network_to_name($lastwall['item_network']).')'); + $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']).')'); } @@ -1100,9 +1144,9 @@ $userlist = array(); if (isset($_GET["q"])) { - $r = q("SELECT id FROM unique_contacts WHERE name='%s'", dbesc($_GET["q"])); + $r = q("SELECT id FROM `unique_contacts` WHERE `name`='%s'", dbesc($_GET["q"])); if (!count($r)) - $r = q("SELECT id FROM unique_contacts WHERE nick='%s'", dbesc($_GET["q"])); + $r = q("SELECT `id` FROM `unique_contacts` WHERE `nick`='%s'", dbesc($_GET["q"])); if (count($r)) { foreach ($r AS $user) { @@ -1162,7 +1206,7 @@ if ($conversation_id > 0) $sql_extra .= ' AND `item`.`parent` = '.intval($conversation_id); - $r = q("SELECT `item`.*, `item`.`id` AS `item_id`, `item`.`network` AS `item_network`, + $r = q("SELECT STRAIGHT_JOIN `item`.*, `item`.`id` AS `item_id`, `item`.`network` AS `item_network`, `contact`.`name`, `contact`.`photo`, `contact`.`url`, `contact`.`rel`, `contact`.`network`, `contact`.`thumb`, `contact`.`dfrn-id`, `contact`.`self`, `contact`.`id` AS `cid`, `contact`.`uid` AS `contact-uid` @@ -1463,7 +1507,6 @@ if (!x($_REQUEST, "source")) $_REQUEST["source"] = api_source(); - require_once('mod/item.php'); item_post($a); } @@ -1495,7 +1538,6 @@ $ret = api_statuses_show($a, $type); - require_once('include/items.php'); drop_item($id, false); return($ret); @@ -1959,7 +2001,6 @@ $include_entities = strtolower(x($_REQUEST,'include_entities')?$_REQUEST['include_entities']:"false"); if ($include_entities != "true") { - require_once("mod/proxy.php"); preg_match_all("/\[img](.*?)\[\/img\]/ism", $bbcode, $images); @@ -2062,7 +2103,6 @@ // If image cache is activated, then use the following sizes: // thumb (150), small (340), medium (600) and large (1024) if (!get_config("system", "proxy_disabled")) { - require_once("mod/proxy.php"); $media_url = proxy_url($url); $sizes = array(); @@ -2149,7 +2189,7 @@ intval(api_user()), intval($in_reply_to_status_id)); if ($r) { - $r = q("SELECT * FROM unique_contacts WHERE `url` = '%s'", dbesc(normalise_link($r[0]['author-link']))); + $r = q("SELECT * FROM `unique_contacts` WHERE `url` = '%s'", dbesc(normalise_link($r[0]['author-link']))); if ($r) { if ($r[0]['nick'] == "") @@ -2197,9 +2237,9 @@ $status["entities"] = $converted["entities"]; if (($item['item_network'] != "") AND ($status["source"] == 'web')) - $status["source"] = network_to_name($item['item_network']); - else if (($item['item_network'] != "") AND (network_to_name($item['item_network']) != $status["source"])) - $status["source"] = trim($status["source"].' ('.network_to_name($item['item_network']).')'); + $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']).')'); // Retweets are only valid for top postings @@ -2219,9 +2259,14 @@ unset($status["user"]["uid"]); unset($status["user"]["self"]); - // 'geo' => array('type' => 'Point', - // 'coordinates' => array((float) $notice->lat, - // (float) $notice->lon)); + if ($item["coord"] != "") { + $coords = explode(' ',$item["coord"]); + if (count($coords) == 2) { + $status["geo"] = array('type' => 'Point', + 'coordinates' => array((float) $coords[0], + (float) $coords[1])); + } + } $ret[] = $status; }; @@ -2403,7 +2448,7 @@ $stringify_ids = (x($_REQUEST,'stringify_ids')?$_REQUEST['stringify_ids']:false); - $r = q("SELECT unique_contacts.id FROM contact, unique_contacts WHERE contact.nurl = unique_contacts.url AND `uid` = %d AND `self` = 0 AND `blocked` = 0 AND `pending` = 0 $sql_extra", + $r = q("SELECT `unique_contact`.`id` FROM contact, `unique_contacts` WHERE contact.nurl = unique_contacts.url AND `uid` = %d AND `self` = 0 AND `blocked` = 0 AND `pending` = 0 $sql_extra", intval(api_user()) ); @@ -2449,8 +2494,6 @@ $sender = api_get_user($a); - require_once("include/message.php"); - if ($_POST['screen_name']) { $r = q("SELECT `id`, `nurl`, `network` FROM `contact` WHERE `uid`=%d AND `nick`='%s'", intval(api_user()), @@ -2807,15 +2850,29 @@ function api_share_as_retweet(&$item) { function api_get_nick($profile) { /* To-Do: - - remove trailing jung from profile url + - remove trailing junk from profile url - pump.io check has to check the website */ $nick = ""; - $friendica = preg_replace("=https?://(.*)/profile/(.*)=ism", "$2", $profile); - if ($friendica != $profile) - $nick = $friendica; + $r = q("SELECT `nick` FROM `gcontact` WHERE `nurl` = '%s'", + dbesc(normalise_link($profile))); + if ($r) + $nick = $r[0]["nick"]; + + if (!$nick == "") { + $r = q("SELECT `nick` FROM `contact` WHERE `uid` = 0 AND `nurl` = '%s'", + dbesc(normalise_link($profile))); + if ($r) + $nick = $r[0]["nick"]; + } + + if (!$nick == "") { + $friendica = preg_replace("=https?://(.*)/profile/(.*)=ism", "$2", $profile); + if ($friendica != $profile) + $nick = $friendica; + } if (!$nick == "") { $diaspora = preg_replace("=https?://(.*)/u/(.*)=ism", "$2", $profile); @@ -2853,8 +2910,8 @@ function api_get_nick($profile) { //} if ($nick != "") { - q("UPDATE unique_contacts SET nick = '%s' WHERE url = '%s'", - dbesc($nick), dbesc(normalise_link($profile))); + q("UPDATE `unique_contacts` SET `nick` = '%s' WHERE `nick` != '%s' AND url = '%s'", + dbesc($nick), dbesc($nick), dbesc(normalise_link($profile))); return($nick); } @@ -2957,6 +3014,19 @@ function api_best_nickname(&$contacts) { /* +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 + + + Not implemented by now: statuses/retweets_of_me friendships/create