'recipient_screen_name' => $recipient['screen_name'],
'sender' => $sender,
'recipient' => $recipient,
+ 'title' => "",
+ 'friendica_seen' => $item['seen'],
+ 'friendica_parent_uri' => $item['parent-uri'],
);
// "uid" and "self" are only needed for some internal stuff, so remove it from here
'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, true),
+ 'dislikes' => bbcode(api_clean_plain_items($profile['dislikes']), false, false, 2, true),
+ 'about' => bbcode(api_clean_plain_items($profile['about']), false, false, 2, true),
+ 'music' => bbcode(api_clean_plain_items($profile['music']), false, false, 2, true),
+ 'book' => bbcode(api_clean_plain_items($profile['book']), false, false, 2, true),
+ 'tv' => bbcode(api_clean_plain_items($profile['tv']), false, false, 2, true),
+ 'film' => bbcode(api_clean_plain_items($profile['film']), false, false, 2, true),
+ 'interest' => bbcode(api_clean_plain_items($profile['interest']), false, false, 2, true),
+ 'romance' => bbcode(api_clean_plain_items($profile['romance']), false, false, 2, true),
+ 'work' => bbcode(api_clean_plain_items($profile['work']), false, false, 2, true),
+ 'education' => bbcode(api_clean_plain_items($profile['education']), false, false, 2, true),
+ 'social_networks' => bbcode(api_clean_plain_items($profile['contact']), false, false, 2, true),
+ 'homepage' => $profile['homepage'],
+ 'users' => null);
+ return $profile;
+ }
}
/**
}
api_register_func('api/direct_messages/new','api_direct_messages_new',true, API_METHOD_POST);
- function api_direct_messages_box($type, $box) {
+
+ /**
+ * @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($since_id),
intval($start), intval($count)
);
-
+ if ($verbose == "true") {
+ // stop execution and return error message if no mails available
+ if($r == null) {
+ $answer = array('result' => 'error', 'message' => 'no mails available');
+ return api_format_data("direct_messages_all", $type, array('$result' => $answer));
+ }
+ }
$ret = Array();
foreach($r as $item) {
}
function api_direct_messages_sentbox($type){
- return api_direct_messages_box($type, "sentbox");
+ $verbose = (x($_GET,'friendica_verbose')?strtolower($_GET['friendica_verbose']):"false");
+ return api_direct_messages_box($type, "sentbox", $verbose);
}
function api_direct_messages_inbox($type){
- return api_direct_messages_box($type, "inbox");
+ $verbose = (x($_GET,'friendica_verbose')?strtolower($_GET['friendica_verbose']):"false");
+ return api_direct_messages_box($type, "inbox", $verbose);
}
function api_direct_messages_all($type){
- return api_direct_messages_box($type, "all");
+ $verbose = (x($_GET,'friendica_verbose')?strtolower($_GET['friendica_verbose']):"false");
+ return api_direct_messages_box($type, "all", $verbose);
}
function api_direct_messages_conversation($type){
- return api_direct_messages_box($type, "conversation");
+ $verbose = (x($_GET,'friendica_verbose')?strtolower($_GET['friendica_verbose']):"false");
+ return api_direct_messages_box($type, "conversation", $verbose);
}
api_register_func('api/direct_messages/conversation','api_direct_messages_conversation',true);
api_register_func('api/direct_messages/all','api_direct_messages_all',true);
/**
- * @brief same as api_format_messages, but output extended by seen and parent-uri as needed
- * in Windows 10 client
- *
- * @param array $item
- * @param array $recipient
- * @param array $sender
- * @return array $ret
- */
- function api_format_messages_win($item, $recipient, $sender) {
- // standard meta information
- $ret=Array(
- 'id' => $item['id'],
- 'sender_id' => $sender['id'] ,
- 'text' => "",
- 'recipient_id' => $recipient['id'],
- 'created_at' => api_date($item['created']),
- 'sender_screen_name' => $sender['screen_name'],
- 'recipient_screen_name' => $recipient['screen_name'],
- 'sender' => $sender,
- 'recipient' => $recipient,
- 'title' => "",
- 'seen' => $item['seen'],
- 'parent_uri' => $item['parent-uri'],
- );
-
- // "uid" and "self" are only needed for some internal stuff, so remove it from here
- unset($ret["sender"]["uid"]);
- unset($ret["sender"]["self"]);
- unset($ret["recipient"]["uid"]);
- unset($ret["recipient"]["self"]);
-
- //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") {
- $ret['text'] = bbcode($item['body'], false, false);
- }
- elseif ($_GET["getText"] == "plain") {
- $ret['text'] = trim(html2plain(bbcode(api_clean_plain_items($item['body']), false, false, 2, true), 0));
- }
- }
- else {
- $ret['text'] = $item['title']."\n".html2plain(bbcode(api_clean_plain_items($item['body']), false, false, 2, true), 0);
- }
- if (isset($_GET["getUserObjects"]) && $_GET["getUserObjects"] == "false") {
- unset($ret['sender']);
- unset($ret['recipient']);
- }
-
- return $ret;
- }
-
- /**
- * @brief return direct_messages for Windows 10 App (similar to direct_messages/all, but seen
- * and parent-uri added to output
- *
- * @param App $a
- * @param string $type Known types are 'atom', 'rss', 'xml' and 'json'
- * @return string
- */
- function api_friendica_direct_messages_all($type){
- $a = get_app();
-
- if (api_user()===false) throw new ForbiddenException();
-
- // params
- $count = (x($_GET,'count')?$_GET['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);
-
- $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"]);
-
- unset($_REQUEST["screen_name"]);
- unset($_GET["screen_name"]);
-
- $user_info = api_get_user($a);
- $profile_url = $user_info["url"];
-
- // pagination
- $start = $page*$count;
-
- // filters
- $sql_extra = "true";
-
- if ($max_id > 0)
- $sql_extra .= ' AND `mail`.`id` <= '.intval($max_id);
-
- if ($user_id !="") {
- $sql_extra .= ' AND `mail`.`contact-id` = ' . intval($user_id);
- }
- elseif($screen_name !=""){
- $sql_extra .= " AND `contact`.`nick` = '" . dbesc($screen_name). "'";
- }
-
- $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",
- intval(api_user()),
- intval($since_id),
- intval($start), intval($count)
- );
-
- // stop execution and return error message if no mails available
- if($r == null) {
- $answer = array('result' => 'error', 'message' => 'no mails available');
- return api_format_data("direct_messages_all", $type, array('$result' => $answer));
- }
-
- $ret = Array();
- foreach($r as $item) {
- if ($box == "inbox" || $item['from-url'] != $profile_url){
- $recipient = $user_info;
- $sender = api_get_user($a,normalise_link($item['contact-url']));
- }
- elseif ($box == "sentbox" || $item['from-url'] == $profile_url){
- $recipient = api_get_user($a,normalise_link($item['contact-url']));
- $sender = $user_info;
-
- }
- $ret[]=api_format_messages_win($item, $recipient, $sender);
- }
-
-
- $data = array('$messages' => $ret);
- switch($type){
- case "atom":
- case "rss":
- $data = api_rss_extra($a, $data, $user_info);
- }
-
- return api_format_data("direct_messages_all", $type, $data);
-
- }
- api_register_func('api/friendica/direct_messages_all', 'api_friendica_direct_messages_all', true);
-
-
- /**
- * @brief update a direct_message to seen state for Windows 10 App
+ * @brief update a direct_message to seen state
*
- * @param App $a
* @param string $type Known types are 'atom', 'rss', 'xml' and 'json'
- * @return string
+ * @return string (success result=ok, error result=error with error message)
*/
function api_friendica_direct_messages_setseen($type){
$a = get_app();
}
// 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 App $a
- * @param string $type Known types are 'atom', 'rss', 'xml' and 'json'
- * @return string
- */
- 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);
/**
* @brief search for direct_messages containing a searchstring through api
*
- * @param App $a
* @param string $type Known types are 'atom', 'rss', 'xml' and 'json'
- * @return string
+ * @return string (success: success=true if found and search_result contains found messages
+ * success=false if nothing was found, search_result='nothing found',
+ * error: result=error with error message)
*/
function api_friendica_direct_messages_search($type){
$a = get_app();
$recipient = api_get_user($a,normalise_link($item['contact-url']));
$sender = $user_info;
}
- $ret[]=api_format_messages_win($item, $recipient, $sender);
+ $ret[]=api_format_messages($item, $recipient, $sender);
}
$success = array('success' => true, 'search_results' => $ret);
}
/**
- * @brief returns all messages for a specified parenturi, similar to api/direct_messages/conversation but enhanced to return parenturi and seen state
+ * @brief return data of all the profiles a user has to the client
*
- * @param App $a
* @param string $type Known types are 'atom', 'rss', 'xml' and 'json'
* @return string
*/
- function api_friendica_direct_messages_conversation($type) {
+ function api_friendica_profile_show($type){
$a = get_app();
- if (api_user()===false) return false;
-
- // params
- $count = (x($_GET,'count')?$_GET['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);
-
- $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"]);
-
- unset($_REQUEST["screen_name"]);
- unset($_GET["screen_name"]);
-
- $user_info = api_get_user($a);
- $profile_url = $user_info["url"];
-
- // pagination
- $start = $page*$count;
+ if (api_user()===false) throw new ForbiddenException();
- $sql_extra = "`mail`.`parent-uri`='".dbesc( $_GET["uri"] ) ."'";
+ // input params
+ $profileid = (x($_REQUEST,'profile_id') ? $_REQUEST['profile_id'] : 0);
- if ($max_id > 0)
- $sql_extra .= ' AND `mail`.`id` <= '.intval($max_id);
+ // retrieve general information about profiles for user
+ $multi_profiles = feature_enabled(api_user(),'multi_profiles');
+ $directory = get_config('system', 'directory');
- if ($user_id !="") {
- $sql_extra .= ' AND `mail`.`contact-id` = ' . intval($user_id);
- }
- elseif($screen_name !=""){
- $sql_extra .= " AND `contact`.`nick` = '" . dbesc($screen_name). "'";
+// 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 (count($r) == 0)
+ throw new BadRequestException("profile_id not available");
}
+ else
+ $r = q("SELECT * FROM `profile` WHERE `uid` = %d",
+ intval(api_user()));
- $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",
- intval(api_user()),
- intval($since_id),
- intval($start), intval($count)
- );
+ // 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']));
- $ret = Array();
- foreach($r as $item) {
- if ($box == "inbox" || $item['from-url'] != $profile_url){
- $recipient = $user_info;
- $sender = api_get_user($a,normalise_link($item['contact-url']));
+ foreach ($r as $rr) {
+ $user = api_get_user($a, $rr['nurl']);
+ ($type == "xml") ? $users[$k++.":user"] = $user : $users[] = $user;
}
- elseif ($box == "sentbox" || $item['from-url'] == $profile_url){
- $recipient = api_get_user($a,normalise_link($item['contact-url']));
- $sender = $user_info;
+ $profile['users'] = $users;
+ // add prepared profile data to array for final return
+ if ($type == "xml") {
+ $profiles[$k++.":profile"] = $profile;
+ } else {
+ $profiles[] = $profile;
}
- $ret[]=api_format_messages_win($item, $recipient, $sender);
- }
-
-
- $data = array('$messages' => $ret);
- switch($type){
- case "atom":
- case "rss":
- $data = api_rss_extra($a, $data, $user_info);
}
- return api_format_data("direct_messages", $type, $data);
-
+ // 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/direct_messages_conversation','api_friendica_direct_messages_conversation',true);
-
+ 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