dbesc(trim($user)),
dbesc($encrypted)
);
- if(count($r))
+ if (dbm::is_result($r))
$record = $r[0];
}
$duration = (float)(microtime(true)-$stamp);
logger("API call duration: ".round($duration, 2)."\t".$a->query_string, LOGGER_DEBUG);
+ if (get_config("system", "profiler")) {
+ $duration = microtime(true)-$a->performance["start"];
+
+ logger(parse_url($a->query_string, PHP_URL_PATH).": ".sprintf("Database: %s/%s, Network: %s, I/O: %s, Other: %s, Total: %s",
+ round($a->performance["database"] - $a->performance["database_write"], 3),
+ round($a->performance["database_write"], 3),
+ round($a->performance["network"], 2),
+ round($a->performance["file"], 2),
+ round($duration - ($a->performance["database"] + $a->performance["network"]
+ + $a->performance["file"]), 2),
+ round($duration, 2)),
+ LOGGER_DEBUG);
+
+ if (get_config("rendertime", "callstack")) {
+ $o = "Database Read:\n";
+ foreach ($a->callstack["database"] AS $func => $time) {
+ $time = round($time, 3);
+ if ($time > 0)
+ $o .= $func.": ".$time."\n";
+ }
+ $o .= "\nDatabase Write:\n";
+ foreach ($a->callstack["database_write"] AS $func => $time) {
+ $time = round($time, 3);
+ if ($time > 0)
+ $o .= $func.": ".$time."\n";
+ }
+
+ $o .= "\nNetwork:\n";
+ foreach ($a->callstack["network"] AS $func => $time) {
+ $time = round($time, 3);
+ if ($time > 0)
+ $o .= $func.": ".$time."\n";
+ }
+ logger($o, LOGGER_DEBUG);
+ }
+ }
+
+
if ($r===false) {
// api function returned false withour throw an
// exception. This should not happend, throw a 500
if (is_null($user_info)) $user_info = api_get_user($a);
$arr['$user'] = $user_info;
$arr['$rss'] = array(
- 'alternate' => $user_info['url'],
- 'self' => App::get_baseurl(). "/". $a->query_string,
- 'base' => App::get_baseurl(),
- 'updated' => api_date(null),
+ 'alternate' => $user_info['url'],
+ 'self' => App::get_baseurl(). "/". $a->query_string,
+ 'base' => App::get_baseurl(),
+ 'updated' => api_date(null),
'atom_updated' => datetime_convert('UTC','UTC','now',ATOM_TIME),
- 'language' => $user_info['language'],
- 'logo' => App::get_baseurl()."/images/friendica-32.png",
+ 'language' => $user_info['language'],
+ 'logo' => App::get_baseurl()."/images/friendica-32.png",
);
return $arr;
* Contact url or False if contact id is unknown
*/
function api_unique_id_to_url($id){
- $r = q("SELECT `url` FROM `gcontact` WHERE `id`=%d LIMIT 1",
+ $r = q("SELECT `url` FROM `contact` WHERE `uid` = 0 AND `id` = %d LIMIT 1",
intval($id));
if ($r)
return ($r[0]["url"]);
if (api_user()!==false) $extra_query .= "AND `contact`.`uid`=".intval(api_user());
}
- // Searching for unique contact id
+ // Searching for contact id with uid = 0
if(!is_null($contact_id) AND (intval($contact_id) != 0)){
$user = dbesc(api_unique_id_to_url($contact_id));
// Selecting the id by priority, friendica first
api_best_nickname($uinfo);
- // if the contact wasn't found, fetch it from the unique contacts
+ // if the contact wasn't found, fetch it from the contacts with uid = 0
if (count($uinfo)==0) {
$r = array();
if ($url != "")
- $r = q("SELECT * FROM `gcontact` WHERE `nurl`='%s' LIMIT 1", dbesc(normalise_link($url)));
+ $r = q("SELECT * FROM `contact` WHERE `uid` = 0 AND `nurl` = '%s' LIMIT 1", dbesc(normalise_link($url)));
if ($r) {
+ $network_name = network_to_name($r[0]['network'], $r[0]['url']);
+
// 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"]);
'id_str' => (string) $r[0]["id"],
'name' => $r[0]["name"],
'screen_name' => (($r[0]['nick']) ? $r[0]['nick'] : $r[0]['name']),
- 'location' => $r[0]["location"],
+ 'location' => ($r[0]["location"] != "") ? $r[0]["location"] : $network_name,
'description' => $r[0]["about"],
+ 'profile_image_url' => $r[0]["micro"],
+ 'profile_image_url_https' => $r[0]["micro"],
'url' => $r[0]["url"],
'protected' => false,
'followers_count' => 0,
'contributors_enabled' => false,
'is_translator' => false,
'is_translation_enabled' => false,
- 'profile_image_url' => $r[0]["photo"],
- 'profile_image_url_https' => $r[0]["photo"],
'following' => false,
'follow_request_sent' => false,
- 'notifications' => false,
'statusnet_blocking' => false,
'notifications' => false,
'statusnet_profile_url' => $r[0]["url"],
'uid' => 0,
- 'cid' => get_contact($r[0]["url"], api_user()),
+ 'cid' => get_contact($r[0]["url"], api_user(), true),
'self' => 0,
'network' => $r[0]["network"],
);
intval(api_user())
);
- //AND `allow_cid`='' AND `allow_gid`='' AND `deny_cid`='' AND `deny_gid`=''",
+ // Counting is deactivated by now, due to performance issues
// count public wall messages
- $r = q("SELECT count(*) as `count` FROM `item`
- WHERE `uid` = %d
- AND `type`='wall'",
- intval($uinfo[0]['uid'])
- );
- $countitms = $r[0]['count'];
- }
- else {
- //AND `allow_cid`='' AND `allow_gid`='' AND `deny_cid`='' AND `deny_gid`=''",
- $r = q("SELECT count(*) as `count` FROM `item`
- WHERE `contact-id` = %d",
- intval($uinfo[0]['id'])
- );
- $countitms = $r[0]['count'];
+ //$r = q("SELECT COUNT(*) as `count` FROM `item` WHERE `uid` = %d AND `wall`",
+ // intval($uinfo[0]['uid'])
+ //);
+ //$countitms = $r[0]['count'];
+ $countitms = 0;
+ } else {
+ // Counting is deactivated by now, due to performance issues
+ //$r = q("SELECT count(*) as `count` FROM `item`
+ // WHERE `contact-id` = %d",
+ // intval($uinfo[0]['id'])
+ //);
+ //$countitms = $r[0]['count'];
+ $countitms = 0;
}
-
+/*
+ // Counting is deactivated by now, due to performance issues
// count friends
$r = q("SELECT count(*) as `count` FROM `contact`
WHERE `uid` = %d AND `rel` IN ( %d, %d )
- AND `self`=0 AND `blocked`=0 AND `pending`=0 AND `hidden`=0",
+ AND `self`=0 AND NOT `blocked` AND `hidden`=0",
intval($uinfo[0]['uid']),
intval(CONTACT_IS_SHARING),
intval(CONTACT_IS_FRIEND)
$r = q("SELECT count(*) as `count` FROM `contact`
WHERE `uid` = %d AND `rel` IN ( %d, %d )
- AND `self`=0 AND `blocked`=0 AND `pending`=0 AND `hidden`=0",
+ AND `self`=0 AND NOT `blocked` AND `hidden`=0",
intval($uinfo[0]['uid']),
intval(CONTACT_IS_FOLLOWER),
intval(CONTACT_IS_FRIEND)
$countfollowers = 0;
$starred = 0;
}
+*/
+ $countfriends = 0;
+ $countfollowers = 0;
+ $starred = 0;
// Add a nick if it isn't present there
if (($uinfo[0]['nick'] == "") OR ($uinfo[0]['name'] == $uinfo[0]['nick'])) {
$network_name = network_to_name($uinfo[0]['network'], $uinfo[0]['url']);
- $gcontact_id = get_gcontact_id(array("url" => $uinfo[0]['url'], "network" => $uinfo[0]['network'],
- "photo" => $uinfo[0]['micro'], "name" => $uinfo[0]['name']));
+ $pcontact_id = get_contact($uinfo[0]['url'], 0, true);
$ret = Array(
- 'id' => intval($gcontact_id),
- 'id_str' => (string) intval($gcontact_id),
+ 'id' => intval($pcontact_id),
+ 'id_str' => (string) intval($pcontact_id),
'name' => (($uinfo[0]['name']) ? $uinfo[0]['name'] : $uinfo[0]['nick']),
'screen_name' => (($uinfo[0]['nick']) ? $uinfo[0]['nick'] : $uinfo[0]['name']),
'location' => ($usr) ? $usr[0]['default-location'] : $network_name,
'protected' => false,
'followers_count' => intval($countfollowers),
'friends_count' => intval($countfriends),
+ 'listed_count' => 0,
'created_at' => api_date($uinfo[0]['created']),
'favourites_count' => intval($starred),
'utc_offset' => "0",
'time_zone' => 'UTC',
+ 'geo_enabled' => false,
+ 'verified' => true,
'statuses_count' => intval($countitms),
+ 'lang' => '',
+ 'contributors_enabled' => false,
+ 'is_translator' => false,
+ 'is_translation_enabled' => false,
'following' => (($uinfo[0]['rel'] == CONTACT_IS_FOLLOWER) OR ($uinfo[0]['rel'] == CONTACT_IS_FRIEND)),
- 'verified' => true,
+ 'follow_request_sent' => false,
'statusnet_blocking' => false,
'notifications' => false,
//'statusnet_profile_url' => App::get_baseurl()."/contacts/".$uinfo[0]['cid'],
*/
function api_item_get_user(&$a, $item) {
- // 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']));
-
- get_gcontact_id(array("url" => $item['owner-link'], "network" => $item['network'],
- "photo" => $item['owner-avatar'], "name" => $item['owner-name']));
+ $status_user = api_get_user($a, $item["author-link"]);
- $status_user = api_get_user($a,$item["author-link"]);
$status_user["protected"] = (($item["allow_cid"] != "") OR
($item["allow_gid"] != "") OR
($item["deny_cid"] != "") OR
($item["deny_gid"] != "") OR
$item["private"]);
- $owner_user = api_get_user($a,$item["owner-link"]);
+ $owner_user = api_get_user($a, $item["owner-link"]);
return (array($status_user, $owner_user));
}
$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`
+ $lastwall = q("SELECT `item`.*
+ FROM `item`
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' $privacy_sql
+ AND `item`.`type` != 'activity' $privacy_sql
ORDER BY `item`.`id` DESC
LIMIT 1",
intval($user_info['cid']),
if (count($lastwall)>0){
$lastwall = $lastwall[0];
- $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;
- if (intval($lastwall['parent']) != intval($lastwall['id'])) {
- $in_reply_to_status_id= intval($lastwall['parent']);
- $in_reply_to_status_id_str = (string) intval($lastwall['parent']);
-
- $r = q("SELECT * FROM `gcontact` WHERE `nurl` = '%s'", dbesc(normalise_link($lastwall['item-author'])));
- if ($r) {
- 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']);
- $in_reply_to_user_id = intval($r[0]['id']);
- $in_reply_to_user_id_str = (string) intval($r[0]['id']);
- }
- }
-
- // 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;
- }
+ $in_reply_to = api_in_reply_to($lastwall);
$converted = api_convert_item($lastwall);
'text' => $converted["text"],
'source' => (($lastwall['app']) ? $lastwall['app'] : 'web'),
'truncated' => false,
- 'in_reply_to_status_id' => $in_reply_to_status_id,
- 'in_reply_to_status_id_str' => $in_reply_to_status_id_str,
- '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,
+ 'in_reply_to_status_id' => $in_reply_to['status_id'],
+ 'in_reply_to_status_id_str' => $in_reply_to['status_id_str'],
+ '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' => "",
if (count($lastwall)>0){
$lastwall = $lastwall[0];
- $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;
- if ($lastwall['parent']!=$lastwall['id']) {
- $reply = q("SELECT `item`.`id`, `item`.`contact-id` as `reply_uid`, `contact`.`nick` as `reply_author`, `item`.`author-link` AS `item-author`
- FROM `item`,`contact` WHERE `contact`.`id`=`item`.`contact-id` AND `item`.`id` = %d", intval($lastwall['parent']));
- if (count($reply)>0) {
- $in_reply_to_status_id = intval($lastwall['parent']);
- $in_reply_to_status_id_str = (string) intval($lastwall['parent']);
-
- $r = q("SELECT * FROM `gcontact` WHERE `nurl` = '%s'", dbesc(normalise_link($reply[0]['item-author'])));
- if ($r) {
- 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']);
- $in_reply_to_user_id = intval($r[0]['id']);
- $in_reply_to_user_id_str = (string) intval($r[0]['id']);
- }
- }
- }
+ $in_reply_to = api_in_reply_to($lastwall);
$converted = api_convert_item($lastwall);
'text' => $converted["text"],
'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,
+ '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['contact-id']),
'id_str' => (string) $lastwall['contact-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,
+ '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'],
$geo => NULL,
'favorited' => $lastwall['starred'] ? true : false,
'statusnet_html' => $converted["html"],
$userlist = array();
if (isset($_GET["q"])) {
- $r = q("SELECT id FROM `gcontact` WHERE `name`='%s'", dbesc($_GET["q"]));
- if (!count($r))
- $r = q("SELECT `id` FROM `gcontact` WHERE `nick`='%s'", dbesc($_GET["q"]));
+ $r = q("SELECT id FROM `contact` WHERE `uid` = 0 AND `name` = '%s'", dbesc($_GET["q"]));
+ if (!dbm::is_result($r))
+ $r = q("SELECT `id` FROM `contact` WHERE `uid` = 0 AND `nick` = '%s'", dbesc($_GET["q"]));
- if (count($r)) {
+ if (dbm::is_result($r)) {
$k = 0;
foreach ($r AS $user) {
$user_info = api_get_user($a, $user["id"], "json");
$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);
`contact`.`id` AS `cid`
FROM `item`
STRAIGHT_JOIN `contact` ON `contact`.`id` = `item`.`contact-id` AND `contact`.`uid` = `item`.`uid`
- AND NOT `contact`.`blocked` AND NOT `contact`.`pending`
+ AND (NOT `contact`.`blocked` OR `contact`.`pending`)
WHERE `item`.`uid` = %d AND `verb` = '%s'
AND `item`.`visible` AND NOT `item`.`moderated` AND NOT `item`.`deleted`
$sql_extra
`user`.`nickname`, `user`.`hidewall`
FROM `item`
STRAIGHT_JOIN `contact` ON `contact`.`id` = `item`.`contact-id` AND `contact`.`uid` = `item`.`uid`
- AND NOT `contact`.`blocked` AND NOT `contact`.`pending`
+ AND (NOT `contact`.`blocked` OR `contact`.`pending`)
STRAIGHT_JOIN `user` ON `user`.`uid` = `item`.`uid`
AND NOT `user`.`hidewall`
WHERE `verb` = '%s' AND `item`.`visible` AND NOT `item`.`deleted` AND NOT `item`.`moderated`
`contact`.`id` AS `cid`
FROM `item`
INNER JOIN `contact` ON `contact`.`id` = `item`.`contact-id` AND `contact`.`uid` = `item`.`uid`
- AND NOT `contact`.`blocked` AND NOT `contact`.`pending`
+ AND (NOT `contact`.`blocked` OR `contact`.`pending`)
WHERE `item`.`visible` AND NOT `item`.`moderated` AND NOT `item`.`deleted`
AND `item`.`uid` = %d AND `item`.`verb` = '%s'
$sql_extra",
`contact`.`id` AS `cid`
FROM `item`
STRAIGHT_JOIN `contact` ON `contact`.`id` = `item`.`contact-id` AND `contact`.`uid` = `item`.`uid`
- AND NOT `contact`.`blocked` AND NOT `contact`.`pending`
+ AND (NOT `contact`.`blocked` OR `contact`.`pending`)
WHERE `item`.`parent` = %d AND `item`.`visible`
AND NOT `item`.`moderated` AND NOT `item`.`deleted`
AND `item`.`uid` = %d AND `item`.`verb` = '%s'
`contact`.`id` AS `cid`
FROM `item`
INNER JOIN `contact` ON `contact`.`id` = `item`.`contact-id` AND `contact`.`uid` = `item`.`uid`
- AND NOT `contact`.`blocked` AND NOT `contact`.`pending`
+ AND (NOT `contact`.`blocked` OR `contact`.`pending`)
WHERE `item`.`visible` AND NOT `item`.`moderated` AND NOT `item`.`deleted`
AND NOT `item`.`private` AND `item`.`allow_cid` = '' AND `item`.`allow`.`gid` = ''
AND `item`.`deny_cid` = '' AND `item`.`deny_gid` = ''
`contact`.`id` AS `cid`
FROM `item` FORCE INDEX (`uid_id`)
STRAIGHT_JOIN `contact` ON `contact`.`id` = `item`.`contact-id` AND `contact`.`uid` = `item`.`uid`
- AND NOT `contact`.`blocked` AND NOT `contact`.`pending`
+ AND (NOT `contact`.`blocked` OR `contact`.`pending`)
WHERE `item`.`uid` = %d AND `verb` = '%s'
AND NOT (`item`.`author-link` IN ('https://%s', 'http://%s'))
AND `item`.`visible` AND NOT `item`.`moderated` AND NOT `item`.`deleted`
`contact`.`id` AS `cid`
FROM `item` FORCE INDEX (`uid_contactid_id`)
STRAIGHT_JOIN `contact` ON `contact`.`id` = `item`.`contact-id` AND `contact`.`uid` = `item`.`uid`
- AND NOT `contact`.`blocked` AND NOT `contact`.`pending`
+ AND (NOT `contact`.`blocked` OR `contact`.`pending`)
WHERE `item`.`uid` = %d AND `verb` = '%s'
AND `item`.`contact-id` = %d
AND `item`.`visible` AND NOT `item`.`moderated` AND NOT `item`.`deleted`
AND `item`.`visible` = 1 and `item`.`moderated` = 0 AND `item`.`deleted` = 0
AND `item`.`starred` = 1
AND `contact`.`id` = `item`.`contact-id`
- AND `contact`.`blocked` = 0 AND `contact`.`pending` = 0
+ AND (NOT `contact`.`blocked` OR `contact`.`pending`)
$sql_extra
AND `item`.`id`>%d
ORDER BY `item`.`id` DESC LIMIT %d ,%d ",
'attendno' => array(),
'attendmaybe' => array()
);
+
$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);
+ // not used as result should be structured like other user data
+ //builtin_activity_puller($i, $activities);
+
+ // get user data and add it to the array of the activity
+ $user = api_get_user($a, $i['author-link']);
+ switch($i['verb']) {
+ case ACTIVITY_LIKE:
+ $activities['like'][] = $user;
+ break;
+ case ACTIVITY_DISLIKE:
+ $activities['dislike'][] = $user;
+ break;
+ case ACTIVITY_ATTEND:
+ $activities['attendyes'][] = $user;
+ break;
+ case ACTIVITY_ATTENDNO:
+ $activities['attendno'][] = $user;
+ break;
+ case ACTIVITY_ATTENDMAYBE:
+ $activities['attendmaybe'][] = $user;
+ break;
+ default:
+ break;
+ }
}
if ($type == "xml") {
$xml_activities = array();
- foreach ($activities as $k => $v)
+ foreach ($activities as $k => $v) {
+ // change xml element from "like" to "friendica:like"
$xml_activities["friendica:".$k] = $v;
-
+ // add user data into xml output
+ $k_user = 0;
+ foreach ($v as $user)
+ $xml_activities["friendica:".$k][$k_user++.":user"] = $user;
+ }
$activities = $xml_activities;
}
- $res = array();
- $uri = $item['uri']."-l";
- foreach($activities as $k => $v) {
- $res[$k] = (x($v,$uri)?count($v[$uri]):0);
- #$res[$k] = ( x($v,$uri) ? array_map("api_contactlink_to_array", $v[$uri]) : array() );
- }
- return $res;
+ return $activities;
+
+ }
+
+
+ /**
+ * @brief return data from profiles
+ *
+ * @param array $profile array containing data from db table 'profile'
+ * @param string $type Known types are 'atom', 'rss', 'xml' and 'json'
+ * @return array
+ */
+ function api_format_items_profiles(&$profile = null, $type = "json") {
+ if ($profile != null) {
+ $profile = array('profile_id' => $profile['id'],
+ 'profile_name' => $profile['profile-name'],
+ 'is_default' => $profile['is-default'] ? true : false,
+ 'hide_friends'=> $profile['hide-friends'] ? true : false,
+ 'profile_photo' => $profile['photo'],
+ 'profile_thumb' => $profile['thumb'],
+ 'publish' => $profile['publish'] ? true : false,
+ 'net_publish' => $profile['net-publish'] ? true : false,
+ 'description' => $profile['pdesc'],
+ 'date_of_birth' => $profile['dob'],
+ 'address' => $profile['address'],
+ 'city' => $profile['locality'],
+ 'region' => $profile['region'],
+ 'postal_code' => $profile['postal-code'],
+ 'country' => $profile['country-name'],
+ 'hometown' => $profile['hometown'],
+ 'gender' => $profile['gender'],
+ 'marital' => $profile['marital'],
+ 'marital_with' => $profile['with'],
+ 'marital_since' => $profile['howlong'],
+ 'sexual' => $profile['sexual'],
+ 'politic' => $profile['politic'],
+ 'religion' => $profile['religion'],
+ 'public_keywords' => $profile['pub_keywords'],
+ 'private_keywords' => $profile['prv_keywords'],
+ 'likes' => bbcode(api_clean_plain_items($profile['likes']), false, false, 2, false),
+ 'dislikes' => bbcode(api_clean_plain_items($profile['dislikes']), false, false, 2, false),
+ 'about' => bbcode(api_clean_plain_items($profile['about']), false, false, 2, false),
+ 'music' => bbcode(api_clean_plain_items($profile['music']), false, false, 2, false),
+ 'book' => bbcode(api_clean_plain_items($profile['book']), false, false, 2, false),
+ 'tv' => bbcode(api_clean_plain_items($profile['tv']), false, false, 2, false),
+ 'film' => bbcode(api_clean_plain_items($profile['film']), false, false, 2, false),
+ 'interest' => bbcode(api_clean_plain_items($profile['interest']), false, false, 2, false),
+ 'romance' => bbcode(api_clean_plain_items($profile['romance']), false, false, 2, false),
+ 'work' => bbcode(api_clean_plain_items($profile['work']), false, false, 2, false),
+ 'education' => bbcode(api_clean_plain_items($profile['education']), false, false, 2, false),
+ 'social_networks' => bbcode(api_clean_plain_items($profile['contact']), false, false, 2, false),
+ 'homepage' => $profile['homepage'],
+ 'users' => null);
+ return $profile;
+ }
}
/**
if ($filter_user AND ($status_user["id"] != $user_info["id"]))
continue;
- 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']));
- if ($r)
- $in_reply_to_status_id = intval($r[0]['id']);
- else
- $in_reply_to_status_id = intval($item['parent']);
-
- $in_reply_to_status_id_str = (string) intval($item['parent']);
-
- $in_reply_to_screen_name = NULL;
- $in_reply_to_user_id = NULL;
- $in_reply_to_user_id_str = NULL;
-
- $r = q("SELECT `author-link` FROM item WHERE uid=%d AND id=%d LIMIT 1",
- intval(api_user()),
- intval($in_reply_to_status_id));
- if ($r) {
- $r = q("SELECT * FROM `gcontact` WHERE `url` = '%s'", dbesc(normalise_link($r[0]['author-link'])));
-
- if ($r) {
- 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']);
- $in_reply_to_user_id = intval($r[0]['id']);
- $in_reply_to_user_id_str = (string) intval($r[0]['id']);
- }
- }
- } else {
- $in_reply_to_screen_name = NULL;
- $in_reply_to_user_id = NULL;
- $in_reply_to_status_id = NULL;
- $in_reply_to_user_id_str = NULL;
- $in_reply_to_status_id_str = NULL;
- }
+ $in_reply_to = api_in_reply_to($item);
$converted = api_convert_item($item);
'text' => $converted["text"],
'truncated' => False,
'created_at'=> api_date($item['created']),
- 'in_reply_to_status_id' => $in_reply_to_status_id,
- 'in_reply_to_status_id_str' => $in_reply_to_status_id_str,
+ 'in_reply_to_status_id' => $in_reply_to['status_id'],
+ 'in_reply_to_status_id_str' => $in_reply_to['status_id_str'],
'source' => (($item['app']) ? $item['app'] : 'web'),
'id' => intval($item['id']),
'id_str' => (string) intval($item['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,
+ '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'],
$geo => NULL,
'favorited' => $item['starred'] ? true : false,
'user' => $status_user ,
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",
+ $r = q("SELECT `nurl` FROM `contact` WHERE `uid` = %d AND NOT `self` AND (NOT `blocked` OR `pending`) $sql_extra",
intval(api_user())
);
$stringify_ids = (x($_REQUEST,'stringify_ids')?$_REQUEST['stringify_ids']:false);
- $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",
+ $r = q("SELECT `pcontact`.`id` FROM `contact`
+ INNER JOIN `contact` AS `pcontact` ON `contact`.`nurl` = `pcontact`.`nurl` AND `pcontact`.`uid` = 0
+ WHERE `contact`.`uid` = %s AND NOT `contact`.`self`",
intval(api_user())
);
- if(!dbm::is_result($r))
+ if (!dbm::is_result($r))
return;
$ids = array();
}
api_register_func('api/direct_messages/new','api_direct_messages_new',true, API_METHOD_POST);
+
+ /**
+ * @brief delete a direct_message from mail table through api
+ *
+ * @param string $type Known types are 'atom', 'rss', 'xml' and 'json'
+ * @return string
+ */
+ function api_direct_messages_destroy($type){
+ $a = get_app();
+
+ if (api_user()===false) throw new ForbiddenException();
+
+ // params
+ $user_info = api_get_user($a);
+ //required
+ $id = (x($_REQUEST,'id') ? $_REQUEST['id'] : 0);
+ // optional
+ $parenturi = (x($_REQUEST, 'friendica_parenturi') ? $_REQUEST['friendica_parenturi'] : "");
+ $verbose = (x($_GET,'friendica_verbose')?strtolower($_GET['friendica_verbose']):"false");
+ /// @todo optional parameter 'include_entities' from Twitter API not yet implemented
+
+ $uid = $user_info['uid'];
+ // error if no id or parenturi specified (for clients posting parent-uri as well)
+ if ($verbose == "true") {
+ if ($id == 0 || $parenturi == "") {
+ $answer = array('result' => 'error', 'message' => 'message id or parenturi not specified');
+ return api_format_data("direct_messages_delete", $type, array('$result' => $answer));
+ }
+ }
+
+ // BadRequestException if no id specified (for clients using Twitter API)
+ if ($id == 0) throw new BadRequestException('Message id not specified');
+
+ // add parent-uri to sql command if specified by calling app
+ $sql_extra = ($parenturi != "" ? " AND `parent-uri` = '" . dbesc($parenturi) . "'" : "");
+
+ // get data of the specified message id
+ $r = q("SELECT `id` FROM `mail` WHERE `uid` = %d AND `id` = %d" . $sql_extra,
+ intval($uid),
+ intval($id));
+
+ // error message if specified id is not in database
+ if (!dbm::is_result($r)) {
+ if ($verbose == "true") {
+ $answer = array('result' => 'error', 'message' => 'message id not in database');
+ return api_format_data("direct_messages_delete", $type, array('$result' => $answer));
+ }
+ /// @todo BadRequestException ok for Twitter API clients?
+ throw new BadRequestException('message id not in database');
+ }
+
+ // delete message
+ $result = q("DELETE FROM `mail` WHERE `uid` = %d AND `id` = %d" . $sql_extra,
+ intval($uid),
+ intval($id));
+
+ if ($verbose == "true") {
+ if ($result) {
+ // return success
+ $answer = array('result' => 'ok', 'message' => 'message deleted');
+ return api_format_data("direct_message_delete", $type, array('$result' => $answer));
+ }
+ else {
+ $answer = array('result' => 'error', 'message' => 'unknown error');
+ return api_format_data("direct_messages_delete", $type, array('$result' => $answer));
+ }
+ }
+ /// @todo return JSON data like Twitter API not yet implemented
+
+ }
+ api_register_func('api/direct_messages/destroy', 'api_direct_messages_destroy', true, API_METHOD_DELETE);
+
+
function api_direct_messages_box($type, $box, $verbose) {
$a = get_app();
intval(api_user())
);
- if ((! count($r)) || ($r[0]['network'] !== NETWORK_DFRN))
+ if ((! dbm::is_result($r)) || ($r[0]['network'] !== NETWORK_DFRN))
throw new BadRequestException("Unknown contact");
$cid = $r[0]['id'];
}
$attributes = preg_replace("/\[share(.*?)\]\s?(.*?)\s?\[\/share\]\s?/ism","$1",$body);
- // Skip if there is no shared message in there
- // we already checked this in diaspora::is_reshare()
- // but better one more than one less...
- if ($body == $attributes)
+ // Skip if there is no shared message in there
+ // we already checked this in diaspora::is_reshare()
+ // but better one more than one less...
+ if ($body == $attributes)
return false;
$nick = "";
- $r = q("SELECT `nick` FROM `gcontact` WHERE `nurl` = '%s'",
+ $r = q("SELECT `nick` FROM `contact` WHERE `uid` = 0 AND `nurl` = '%s'",
dbesc(normalise_link($profile)));
if ($r)
$nick = $r[0]["nick"];
return(false);
}
+ function api_in_reply_to($item) {
+ $in_reply_to = array();
+
+ $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;
+
+ if (($item['thr-parent'] != $item['uri']) AND (intval($item['parent']) != intval($item['id']))) {
+ $r = q("SELECT `id` FROM `item` WHERE `uid` = %d AND `uri` = '%s' LIMIT 1",
+ intval($item['uid']),
+ dbesc($item['thr-parent']));
+
+ if (dbm::is_result($r)) {
+ $in_reply_to['status_id'] = intval($r[0]['id']);
+ } else {
+ $in_reply_to['status_id'] = intval($item['parent']);
+ }
+
+ $in_reply_to['status_id_str'] = (string) intval($in_reply_to['status_id']);
+
+ $r = q("SELECT `contact`.`nick`, `contact`.`name`, `contact`.`id`, `contact`.`url` FROM item
+ STRAIGHT_JOIN `contact` ON `contact`.`id` = `item`.`author-id`
+ WHERE `item`.`id` = %d LIMIT 1",
+ intval($in_reply_to['status_id'])
+ );
+
+ if (dbm::is_result($r)) {
+ 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']);
+ $in_reply_to['user_id'] = intval($r[0]['id']);
+ $in_reply_to['user_id_str'] = (string) intval($r[0]['id']);
+ }
+
+ // 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($item['id'])) {
+ logger('this message should never appear: id: '.$item['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;
+ }
+ }
+
+ return $in_reply_to;
+ }
+
function api_clean_plain_items($Text) {
$include_entities = strtolower(x($_REQUEST,'include_entities')?$_REQUEST['include_entities']:"false");
intval($uid),
intval($gid));
// error message if specified gid is not in database
- if (count($r) == 0)
+ if (!dbm::is_result($r))
throw new BadRequestException("gid not available");
}
else
intval($uid),
intval($gid));
// error message if specified gid is not in database
- if (count($r) == 0)
+ if (!dbm::is_result($r))
throw new BadRequestException('gid not available');
// get data of the specified group id and group name
intval($gid),
dbesc($name));
// error message if specified gid is not in database
- if (count($rname) == 0)
+ if (!dbm::is_result($rname))
throw new BadRequestException('wrong group name');
// delete group
intval($uid),
dbesc($name));
// error message if specified group name already exists
- if (count($rname) != 0)
+ if (dbm::is_result($rname))
throw new BadRequestException('group name already exists');
// check if specified group name is a deleted group
intval($uid),
dbesc($name));
// error message if specified group name already exists
- if (count($rname) != 0)
+ if (dbm::is_result($rname))
$reactivate_group = true;
// create group
}
// get data of the specified message id
- $r = q("SELECT * FROM `mail` WHERE `id` = %d AND `uid` = %d",
+ $r = q("SELECT `id` FROM `mail` WHERE `id` = %d AND `uid` = %d",
intval($id),
intval($uid));
// error message if specified id is not in database
- if (count($r) == 0) {
+ if (!dbm::is_result($r)) {
$answer = array('result' => 'error', 'message' => 'message id not in database');
return api_format_data("direct_messages_setseen", $type, array('$result' => $answer));
}
api_register_func('api/friendica/direct_messages_setseen', 'api_friendica_direct_messages_setseen', true);
- /**
- * @brief delete a direct_message from mail table through api
- *
- * @param string $type Known types are 'atom', 'rss', 'xml' and 'json'
- * @return string (success result=ok, error result=error with error message)
- */
- function api_friendica_direct_messages_delete($type){
- $a = get_app();
-
- if (api_user()===false) throw new ForbiddenException();
-
- // params
- $user_info = api_get_user($a);
- $id = (x($_REQUEST,'id') ? $_REQUEST['id'] : 0);
- $parenturi = (x($_REQUEST, 'parenturi') ? $_REQUEST['parenturi'] : "");
- $uid = $user_info['uid'];
-
- // error if no id or parenturi specified
- if ($id == 0 || $parenturi == "") {
- $answer = array('result' => 'error', 'message' => 'message id or parenturi not specified');
- return api_format_data("direct_messages_delete", $type, array('$result' => $answer));
- }
-
- // get data of the specified message id
- $r = q("SELECT * FROM `mail` WHERE `uid` = %d AND `id` = %d",
- intval($uid),
- intval($id));
- // error message if specified id is not in database
- if (count($r) == 0) {
- $answer = array('result' => 'error', 'message' => 'message id not in database');
- return api_format_data("direct_messages_delete", $type, array('$result' => $answer));
- }
-
- // delete message
- $result = q("DELETE FROM `mail` WHERE `uid` = %d AND `id` = %d AND `parent-uri` = '%s'",
- intval($uid),
- intval($id),
- dbesc($parenturi));
-
- if ($result) {
- // return success
- $answer = array('result' => 'ok', 'message' => 'message deleted');
- return api_format_data("direct_message_delete", $type, array('$result' => $answer));
- }
- else {
- $answer = array('result' => 'error', 'message' => 'unknown error');
- return api_format_data("direct_messages_delete", $type, array('$result' => $answer));
- }
- }
- api_register_func('api/friendica/direct_messages_delete', 'api_friendica_direct_messages_delete', true);
/**
$user_info = api_get_user($a);
$searchstring = (x($_REQUEST,'searchstring') ? $_REQUEST['searchstring'] : "");
$uid = $user_info['uid'];
-
+
// error if no searchstring specified
if ($searchstring == "") {
$answer = array('result' => 'error', 'message' => 'searchstring not specified');
$profile_url = $user_info["url"];
// message if nothing was found
- if (count($r) == 0)
+ if (!dbm::is_result($r))
+ $success = array('success' => false, 'search_results' => 'problem with query');
+ else if (count($r) == 0)
$success = array('success' => false, 'search_results' => 'nothing found');
else {
$ret = Array();
}
api_register_func('api/friendica/direct_messages_search', 'api_friendica_direct_messages_search', true);
+ /**
+ * @brief return data of all the profiles a user has to the client
+ *
+ * @param string $type Known types are 'atom', 'rss', 'xml' and 'json'
+ * @return string
+ */
+ function api_friendica_profile_show($type){
+ $a = get_app();
+
+ if (api_user()===false) throw new ForbiddenException();
+
+ // input params
+ $profileid = (x($_REQUEST,'profile_id') ? $_REQUEST['profile_id'] : 0);
+
+ // retrieve general information about profiles for user
+ $multi_profiles = feature_enabled(api_user(),'multi_profiles');
+ $directory = get_config('system', 'directory');
+
+// get data of the specified profile id or all profiles of the user if not specified
+ if ($profileid != 0) {
+ $r = q("SELECT * FROM `profile` WHERE `uid` = %d AND `id` = %d",
+ intval(api_user()),
+ intval($profileid));
+ // error message if specified gid is not in database
+ if (!dbm::is_result($r))
+ throw new BadRequestException("profile_id not available");
+ }
+ else
+ $r = q("SELECT * FROM `profile` WHERE `uid` = %d",
+ intval(api_user()));
+
+ // loop through all returned profiles and retrieve data and users
+ $k = 0;
+ foreach ($r as $rr) {
+ $profile = api_format_items_profiles($rr, $type);
+
+ // select all users from contact table, loop and prepare standard return for user data
+ $users = array();
+ $r = q("SELECT `id`, `nurl` FROM `contact` WHERE `uid`= %d AND `profile-id` = %d",
+ intval(api_user()),
+ intval($rr['profile_id']));
+
+ foreach ($r as $rr) {
+ $user = api_get_user($a, $rr['nurl']);
+ ($type == "xml") ? $users[$k++.":user"] = $user : $users[] = $user;
+ }
+ $profile['users'] = $users;
+
+ // add prepared profile data to array for final return
+ if ($type == "xml") {
+ $profiles[$k++.":profile"] = $profile;
+ } else {
+ $profiles[] = $profile;
+ }
+ }
+
+ // return settings, authenticated user and profiles data
+ $result = array('multi_profiles' => $multi_profiles ? true : false,
+ 'global_dir' => $directory,
+ 'friendica_owner' => api_get_user($a, intval(api_user())),
+ 'profiles' => $profiles);
+ return api_format_data("friendica_profiles", $type, array('$result' => $result));
+ }
+ api_register_func('api/friendica/profile/show', 'api_friendica_profile_show', true, API_METHOD_GET);
/*
To.Do:
account/update_profile_image
blocks/create
blocks/destroy
+friendica/profile/update
+friendica/profile/create
+friendica/profile/delete
Not implemented in status.net:
statuses/retweeted_to_me