+ api_register_func('api/statuses/retweet','api_statuses_repeat', true);
+
+ /**
+ *
+ */
+ function api_statuses_destroy(&$a, $type){
+ if (local_user()===false) return false;
+
+ $user_info = api_get_user($a);
+
+ // params
+ $id = intval($a->argv[3]);
+
+ logger('API: api_statuses_destroy: '.$id);
+
+ require_once('include/items.php');
+ drop_item($id, false);
+
+ if ($type == 'xml')
+ $ok = "true";
+ else
+ $ok = "ok";
+
+ return api_apply_template('test', $type, array('$ok' => $ok));
+ }
+ api_register_func('api/statuses/destroy','api_statuses_destroy', true);
+
+ /**
+ *
+ * http://developer.twitter.com/doc/get/statuses/mentions
+ *
+ */
+ function api_statuses_mentions(&$a, $type){
+ if (local_user()===false) return false;
+
+ $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);
+
+ $start = $page*$count;
+
+ //$include_entities = (x($_REQUEST,'include_entities')?$_REQUEST['include_entities']:false);
+
+ $myurl = $a->get_baseurl() . '/profile/'. $a->user['nickname'];
+ $myurl = substr($myurl,strpos($myurl,'://')+3);
+ $myurl = str_replace(array('www.','.'),array('','\\.'),$myurl);
+ $diasp_url = str_replace('/profile/','/u/',$myurl);
+ $sql_extra .= sprintf(" AND `item`.`parent` IN (SELECT distinct(`parent`) from item where ( `author-link` regexp '%s' or `tag` regexp '%s' or tag regexp '%s' )) ",
+ dbesc($myurl . '$'),
+ dbesc($myurl . '\\]'),
+ dbesc($diasp_url . '\\]')
+ );
+
+ if ($max_id > 0)
+ $sql_extra .= ' AND `item`.`id` <= '.intval($max_id);
+
+ $r = q("SELECT `item`.*, `item`.`id` AS `item_id`,
+ `contact`.`name`, `contact`.`photo`, `contact`.`url`, `contact`.`rel`,
+ `contact`.`network`, `contact`.`thumb`, `contact`.`dfrn-id`, `contact`.`self`,
+ `contact`.`id` AS `cid`, `contact`.`uid` AS `contact-uid`
+ FROM `item`, `contact`
+ WHERE `item`.`uid` = %d
+ AND `item`.`visible` = 1 and `item`.`moderated` = 0 AND `item`.`deleted` = 0
+ AND `contact`.`id` = `item`.`contact-id`
+ AND `contact`.`blocked` = 0 AND `contact`.`pending` = 0
+ $sql_extra
+ AND `item`.`id`>%d
+ ORDER BY `item`.`received` DESC LIMIT %d ,%d ",
+ intval($user_info['uid']),
+ intval($since_id),
+ intval($start), intval($count)
+ );
+
+ $ret = api_format_items($r,$user_info);
+
+
+ $data = array('$statuses' => $ret);
+ switch($type){
+ case "atom":
+ case "rss":
+ $data = api_rss_extra($a, $data, $user_info);
+ break;
+ case "as":
+ $as = api_format_as($a, $ret, $user_info);
+ $as["title"] = $a->config['sitename']." Mentions";
+ $as['link']['url'] = $a->get_baseurl()."/";
+ return($as);
+ break;
+ }
+
+ return api_apply_template("timeline", $type, $data);
+ }
+ api_register_func('api/statuses/mentions','api_statuses_mentions', true);
+ api_register_func('api/statuses/replies','api_statuses_mentions', true);
+
+
+ function api_statuses_user_timeline(&$a, $type){
+ if (local_user()===false) return false;
+
+ $user_info = api_get_user($a);
+ // get last newtork messages
+
+
+ logger("api_statuses_user_timeline: local_user: ". local_user() .
+ "\nuser_info: ".print_r($user_info, true) .
+ "\n_REQUEST: ".print_r($_REQUEST, true),
+ LOGGER_DEBUG);
+
+ // 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);
+ //$since_id = 0;//$since_id = (x($_REQUEST,'since_id')?$_REQUEST['since_id']:0);
+
+ $start = $page*$count;
+
+ if ($user_info['self']==1) $sql_extra = "AND `item`.`wall` = 1 ";
+
+ $r = q("SELECT `item`.*, `item`.`id` AS `item_id`,
+ `contact`.`name`, `contact`.`photo`, `contact`.`url`, `contact`.`rel`,
+ `contact`.`network`, `contact`.`thumb`, `contact`.`dfrn-id`, `contact`.`self`,
+ `contact`.`id` AS `cid`, `contact`.`uid` AS `contact-uid`
+ FROM `item`, `contact`
+ WHERE `item`.`uid` = %d
+ AND `item`.`contact-id` = %d
+ AND `item`.`visible` = 1 and `item`.`moderated` = 0 AND `item`.`deleted` = 0
+ AND `contact`.`id` = `item`.`contact-id`
+ AND `contact`.`blocked` = 0 AND `contact`.`pending` = 0
+ $sql_extra
+ AND `item`.`id`>%d
+ ORDER BY `item`.`received` DESC LIMIT %d ,%d ",
+ intval(local_user()),
+ intval($user_info['id']),
+ intval($since_id),
+ intval($start), intval($count)
+ );
+
+ $ret = api_format_items($r,$user_info);
+
+
+ $data = array('$statuses' => $ret);
+ switch($type){
+ case "atom":
+ case "rss":
+ $data = api_rss_extra($a, $data, $user_info);
+ }
+
+ return api_apply_template("timeline", $type, $data);
+ }
+
+ api_register_func('api/statuses/user_timeline','api_statuses_user_timeline', true);
+
+
+ function api_favorites(&$a, $type){
+ if (local_user()===false) return false;
+
+ $user_info = api_get_user($a);
+ // in friendica starred item are private
+ // return favorites only for self
+ logger('api_favorites: self:' . $user_info['self']);
+
+ if ($user_info['self']==0) {
+ $ret = array();
+ } else {
+
+
+ // params
+ $count = (x($_GET,'count')?$_GET['count']:20);
+ $page = (x($_REQUEST,'page')?$_REQUEST['page']-1:0);
+ if ($page<0) $page=0;
+
+ $start = $page*$count;
+
+ $r = q("SELECT `item`.*, `item`.`id` AS `item_id`,
+ `contact`.`name`, `contact`.`photo`, `contact`.`url`, `contact`.`rel`,
+ `contact`.`network`, `contact`.`thumb`, `contact`.`dfrn-id`, `contact`.`self`,
+ `contact`.`id` AS `cid`, `contact`.`uid` AS `contact-uid`
+ FROM `item`, `contact`
+ WHERE `item`.`uid` = %d
+ 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
+ $sql_extra
+ ORDER BY `item`.`received` DESC LIMIT %d ,%d ",
+ intval($user_info['uid']),
+ intval($start), intval($count)
+ );
+
+ $ret = api_format_items($r,$user_info);
+
+ }
+
+ $data = array('$statuses' => $ret);
+ switch($type){
+ case "atom":
+ case "rss":
+ $data = api_rss_extra($a, $data, $user_info);
+ }
+
+ return api_apply_template("timeline", $type, $data);
+ }
+
+ api_register_func('api/favorites','api_favorites', true);
+
+ function api_format_as($a, $ret, $user_info) {
+
+ $as = array();
+ $as['title'] = $a->config['sitename']." Public Timeline";
+ $items = array();
+ foreach ($ret as $item) {
+ $singleitem["actor"]["displayName"] = $item["user"]["name"];
+ $singleitem["actor"]["id"] = $item["user"]["contact_url"];
+ $avatar[0]["url"] = $item["user"]["profile_image_url"];
+ $avatar[0]["rel"] = "avatar";
+ $avatar[0]["type"] = "";
+ $avatar[0]["width"] = 96;
+ $avatar[0]["height"] = 96;
+ $avatar[1]["url"] = $item["user"]["profile_image_url"];
+ $avatar[1]["rel"] = "avatar";
+ $avatar[1]["type"] = "";
+ $avatar[1]["width"] = 48;
+ $avatar[1]["height"] = 48;
+ $avatar[2]["url"] = $item["user"]["profile_image_url"];
+ $avatar[2]["rel"] = "avatar";
+ $avatar[2]["type"] = "";
+ $avatar[2]["width"] = 24;
+ $avatar[2]["height"] = 24;
+ $singleitem["actor"]["avatarLinks"] = $avatar;
+
+ $singleitem["actor"]["image"]["url"] = $item["user"]["profile_image_url"];
+ $singleitem["actor"]["image"]["rel"] = "avatar";
+ $singleitem["actor"]["image"]["type"] = "";
+ $singleitem["actor"]["image"]["width"] = 96;
+ $singleitem["actor"]["image"]["height"] = 96;
+ $singleitem["actor"]["type"] = "person";
+ $singleitem["actor"]["url"] = $item["person"]["contact_url"];
+ $singleitem["actor"]["statusnet:profile_info"]["local_id"] = $item["user"]["id"];
+ $singleitem["actor"]["statusnet:profile_info"]["following"] = $item["user"]["following"] ? "true" : "false";
+ $singleitem["actor"]["statusnet:profile_info"]["blocking"] = "false";
+ $singleitem["actor"]["contact"]["preferredUsername"] = $item["user"]["screen_name"];
+ $singleitem["actor"]["contact"]["displayName"] = $item["user"]["name"];
+ $singleitem["actor"]["contact"]["addresses"] = "";
+
+ $singleitem["body"] = $item["text"];
+ $singleitem["object"]["displayName"] = $item["text"];
+ $singleitem["object"]["id"] = $item["url"];
+ $singleitem["object"]["type"] = "note";
+ $singleitem["object"]["url"] = $item["url"];
+ //$singleitem["context"] =;
+ $singleitem["postedTime"] = date("c", strtotime($item["published"]));
+ $singleitem["provider"]["objectType"] = "service";
+ $singleitem["provider"]["displayName"] = "Test";
+ $singleitem["provider"]["url"] = "http://test.tld";
+ $singleitem["title"] = $item["text"];
+ $singleitem["verb"] = "post";
+ $singleitem["statusnet:notice_info"]["local_id"] = $item["id"];
+ $singleitem["statusnet:notice_info"]["source"] = $item["source"];
+ $singleitem["statusnet:notice_info"]["favorite"] = "false";
+ $singleitem["statusnet:notice_info"]["repeated"] = "false";
+ //$singleitem["original"] = $item;
+ $items[] = $singleitem;
+ }
+ $as['items'] = $items;
+ $as['link']['url'] = $a->get_baseurl()."/".$user_info["screen_name"]."/all";
+ $as['link']['rel'] = "alternate";
+ $as['link']['type'] = "text/html";
+ return($as);
+ }
+
+ function api_format_items($r,$user_info) {
+
+ //logger('api_format_items: ' . print_r($r,true));
+
+ //logger('api_format_items: ' . print_r($user_info,true));
+
+ $a = get_app();
+ $ret = Array();
+
+ foreach($r as $item) {
+ localize_item($item);
+ $status_user = (($item['cid']==$user_info['id'])?$user_info: api_item_get_user($a,$item));
+
+ if ($item['parent']!=$item['id']) {
+ $r = q("select id from item where parent=%s and id<%s order by id desc limit 1",
+ intval($item['parent']), intval($item['id']));
+ if ($r)
+ $in_reply_to_status_id = $r[0]['id'];
+ else
+ $in_reply_to_status_id = $item['parent'];
+
+ $r = q("select `item`.`contact-id`, `contact`.nick, `item`.`author-name` from item, contact
+ where `contact`.`id` = `item`.`contact-id` and `item`.id=%d", intval($in_reply_to_status_id));
+
+ $in_reply_to_screen_name = $r[0]['author-name'];
+ $in_reply_to_user_id = $r[0]['contact-id'];
+
+ } else {
+ $in_reply_to_screen_name = '';
+ $in_reply_to_user_id = 0;
+ $in_reply_to_status_id = 0;
+ }
+
+ // Workaround for ostatus messages where the title is identically to the body
+ $statusbody = trim(html2plain(bbcode($item['body']), 0));
+ $statustitle = trim($item['title']);
+
+ if (($statustitle != '') and (strpos($statusbody, $statustitle) !== false))
+ $statustext = trim($statusbody);
+ else
+ $statustext = trim($statustitle."\n\n".$statusbody);
+
+ $status = array(
+ 'text' => $statustext,
+ 'truncated' => False,
+ 'created_at'=> api_date($item['created']),
+ 'in_reply_to_status_id' => $in_reply_to_status_id,
+ 'source' => (($item['app']) ? $item['app'] : 'web'),
+ 'id' => intval($item['id']),
+ 'in_reply_to_user_id' => $in_reply_to_user_id,
+ 'in_reply_to_screen_name' => $in_reply_to_screen_name,
+ 'geo' => '',
+ 'favorited' => $item['starred'] ? true : false,
+ 'user' => $status_user ,
+ 'statusnet_html' => trim(bbcode($item['body'])),
+ 'statusnet_conversation_id' => $item['parent'],
+ );
+
+ // Seesmic doesn't like the following content
+ if ($_SERVER['HTTP_USER_AGENT'] != 'Seesmic') {
+ $status2 = array(
+ 'updated' => api_date($item['edited']),
+ 'published' => api_date($item['created']),
+ 'message_id' => $item['uri'],
+ 'url' => ($item['plink']!=''?$item['plink']:$item['author-link']),
+ 'coordinates' => $item['coord'],
+ 'place' => $item['location'],
+ 'contributors' => '',
+ 'annotations' => '',
+ 'entities' => '',
+ 'objecttype' => (($item['object-type']) ? $item['object-type'] : ACTIVITY_OBJ_NOTE),
+ 'verb' => (($item['verb']) ? $item['verb'] : ACTIVITY_POST),
+ 'self' => $a->get_baseurl()."/api/statuses/show/".$item['id'].".".$type,
+ 'edit' => $a->get_baseurl()."/api/statuses/show/".$item['id'].".".$type,
+ );
+
+ $status = array_merge($status, $status2);
+ }
+
+ $ret[]=$status;
+ };
+ return $ret;
+ }
+
+
+ function api_account_rate_limit_status(&$a,$type) {
+
+ $hash = array(
+ 'reset_time_in_seconds' => strtotime('now + 1 hour'),
+ 'remaining_hits' => (string) 150,
+ 'hourly_limit' => (string) 150,
+ 'reset_time' => datetime_convert('UTC','UTC','now + 1 hour',ATOM_TIME),
+ );
+ if ($type == "xml")
+ $hash['resettime_in_seconds'] = $hash['reset_time_in_seconds'];
+
+ return api_apply_template('ratelimit', $type, array('$hash' => $hash));
+
+ }
+ api_register_func('api/account/rate_limit_status','api_account_rate_limit_status',true);
+
+ function api_help_test(&$a,$type) {
+
+ if ($type == 'xml')
+ $ok = "true";
+ else
+ $ok = "ok";
+
+ return api_apply_template('test', $type, array('$ok' => $ok));
+
+ }
+ api_register_func('api/help/test','api_help_test',true);
+
+ /**
+ * https://dev.twitter.com/docs/api/1/get/statuses/friends
+ * This function is deprecated by Twitter
+ * returns: json, xml
+ **/
+ function api_statuses_f(&$a, $type, $qtype) {
+ if (local_user()===false) return false;
+ $user_info = api_get_user($a);
+
+
+ // friends and followers only for self
+ if ($user_info['self']==0){
+ return false;
+ }
+
+ 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
+ */
+
+ /*$ret=Array();
+ return array('$users' => $ret);*/
+ return false;
+ }
+
+ 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));
+
+ $r = q("SELECT id FROM `contact` WHERE `uid` = %d AND `self` = 0 AND `blocked` = 0 AND `pending` = 0 $sql_extra",
+ intval(local_user())
+ );
+
+ $ret = array();
+ foreach($r as $cid){
+ $ret[] = api_get_user($a, $cid['id']);
+ }
+
+
+ return array('$users' => $ret);
+
+ }
+ function api_statuses_friends(&$a, $type){
+ $data = api_statuses_f($a,$type,"friends");
+ if ($data===false) return false;
+ return api_apply_template("friends", $type, $data);
+ }
+ function api_statuses_followers(&$a, $type){
+ $data = api_statuses_f($a,$type,"followers");
+ if ($data===false) return false;
+ return api_apply_template("friends", $type, $data);
+ }
+ api_register_func('api/statuses/friends','api_statuses_friends',true);
+ api_register_func('api/statuses/followers','api_statuses_followers',true);
+
+
+
+
+
+
+ function api_statusnet_config(&$a,$type) {
+ $name = $a->config['sitename'];
+ $server = $a->get_hostname();
+ $logo = $a->get_baseurl() . '/images/friendica-64.png';
+ $email = $a->config['admin_email'];
+ $closed = (($a->config['register_policy'] == REGISTER_CLOSED) ? 'true' : 'false');
+ $private = (($a->config['system']['block_public']) ? 'true' : 'false');
+ $textlimit = (string) (($a->config['max_import_size']) ? $a->config['max_import_size'] : 200000);
+ if($a->config['api_import_size'])
+ $texlimit = string($a->config['api_import_size']);
+ $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' => '',
+ 'logo' => $logo, 'fancy' => 'true', 'language' => 'en', 'email' => $email, 'broughtby' => '',
+ 'broughtbyurl' => '', 'timezone' => 'UTC', 'closed' => $closed, 'inviteonly' => 'false',
+ 'private' => $private, 'textlimit' => $textlimit, 'sslserver' => $sslserver, 'ssl' => $ssl,
+ 'shorturllength' => '30'
+ ),
+ );
+
+ return api_apply_template('config', $type, array('$config' => $config));
+
+ }
+ api_register_func('api/statusnet/config','api_statusnet_config',false);
+
+ function api_statusnet_version(&$a,$type) {
+
+ // liar
+
+ if($type === 'xml') {
+ header("Content-type: application/xml");
+ echo '<?xml version="1.0" encoding="UTF-8"?>' . "\r\n" . '<version>0.9.7</version>' . "\r\n";
+ killme();
+ }
+ elseif($type === 'json') {
+ header("Content-type: application/json");
+ echo '"0.9.7"';
+ killme();
+ }
+ }
+ api_register_func('api/statusnet/version','api_statusnet_version',false);
+
+
+ function api_ff_ids(&$a,$type,$qtype) {
+ if(! local_user())
+ return false;
+
+ 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));
+
+
+ $r = q("SELECT id FROM `contact` WHERE `uid` = %d AND `self` = 0 AND `blocked` = 0 AND `pending` = 0 $sql_extra",
+ intval(local_user())
+ );
+
+ if(is_array($r)) {
+ if($type === 'xml') {
+ header("Content-type: application/xml");
+ echo '<?xml version="1.0" encoding="UTF-8"?>' . "\r\n" . '<ids>' . "\r\n";
+ foreach($r as $rr)
+ echo '<id>' . $rr['id'] . '</id>' . "\r\n";
+ echo '</ids>' . "\r\n";
+ killme();
+ }
+ elseif($type === 'json') {
+ $ret = array();
+ header("Content-type: application/json");
+ foreach($r as $rr) $ret[] = $rr['id'];
+ echo json_encode($ret);
+ killme();
+ }
+ }
+ }
+
+ function api_friends_ids(&$a,$type) {
+ api_ff_ids($a,$type,'friends');
+ }
+ function api_followers_ids(&$a,$type) {
+ api_ff_ids($a,$type,'followers');
+ }
+ api_register_func('api/friends/ids','api_friends_ids',true);
+ api_register_func('api/followers/ids','api_followers_ids',true);
+
+
+ function api_direct_messages_new(&$a, $type) {
+ if (local_user()===false) return false;
+
+ if (!x($_POST, "text") || !x($_POST,"screen_name")) return;
+
+ $sender = api_get_user($a);
+
+ $r = q("SELECT `id` FROM `contact` WHERE `uid`=%d AND `nick`='%s'",
+ intval(local_user()),
+ dbesc($_POST['screen_name']));
+
+ $recipient = api_get_user($a, $r[0]['id']);
+
+
+ require_once("include/message.php");
+ $sub = ( (strlen($_POST['text'])>10)?substr($_POST['text'],0,10)."...":$_POST['text']);
+ $id = send_message($recipient['id'], $_POST['text'], $sub);
+
+
+ if ($id>-1) {
+ $r = q("SELECT * FROM `mail` WHERE id=%d", intval($id));
+ $item = $r[0];
+ $ret=Array(
+ 'id' => $item['id'],
+ 'created_at'=> api_date($item['created']),
+ 'sender_id'=> $sender['id'] ,
+ 'sender_screen_name'=> $sender['screen_name'],
+ 'sender'=> $sender,
+ 'recipient_id'=> $recipient['id'],
+ 'recipient_screen_name'=> $recipient['screen_name'],
+ 'recipient'=> $recipient,
+
+ 'text'=> $item['title']."\n".html2plain(bbcode($item['body']), 0) ,
+
+ );
+
+ } else {
+ $ret = array("error"=>$id);
+ }
+
+ $data = Array('$messages'=>$ret);
+
+ switch($type){
+ case "atom":
+ case "rss":
+ $data = api_rss_extra($a, $data, $user_info);
+ }
+
+ return api_apply_template("direct_messages", $type, $data);
+
+ }
+ api_register_func('api/direct_messages/new','api_direct_messages_new',true);
+
+ function api_direct_messages_box(&$a, $type, $box) {
+ if (local_user()===false) return false;
+
+ $user_info = api_get_user($a);
+
+ // params
+ $count = (x($_GET,'count')?$_GET['count']:20);
+ $page = (x($_REQUEST,'page')?$_REQUEST['page']-1:0);
+ if ($page<0) $page=0;
+
+ $start = $page*$count;
+
+
+ if ($box=="sentbox") {
+ $sql_extra = "`from-url`='%s'";
+ } else {
+ $sql_extra = "`from-url`!='%s'";
+ }
+
+ $r = q("SELECT * FROM `mail` WHERE uid=%d AND $sql_extra ORDER BY created DESC LIMIT %d,%d",
+ intval(local_user()),
+ dbesc( $a->get_baseurl() . '/profile/' . $a->user['nickname'] ),
+ intval($start), intval($count)
+ );
+
+ $ret = Array();
+ foreach($r as $item){
+ switch ($box){
+ case "inbox":
+ $recipient = $user_info;
+ $sender = api_get_user($a,$item['contact-id']);
+ break;
+ case "sentbox":
+ $recipient = api_get_user($a,$item['contact-id']);
+ $sender = $user_info;
+ break;
+ }
+
+ $ret[]=Array(
+ 'id' => $item['id'],
+ 'created_at'=> api_date($item['created']),
+ 'sender_id'=> $sender['id'] ,
+ 'sender_screen_name'=> $sender['screen_name'],
+ 'sender'=> $sender,
+ 'recipient_id'=> $recipient['id'],
+ 'recipient_screen_name'=> $recipient['screen_name'],
+ 'recipient'=> $recipient,
+
+ 'text'=> $item['title']."\n".html2plain(bbcode($item['body']), 0) ,
+
+ );
+
+ }
+
+
+ $data = array('$messages' => $ret);
+ switch($type){
+ case "atom":
+ case "rss":
+ $data = api_rss_extra($a, $data, $user_info);
+ }
+
+ return api_apply_template("direct_messages", $type, $data);
+
+ }
+
+ 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");
+ }
+ api_register_func('api/direct_messages/sent','api_direct_messages_sentbox',true);
+ api_register_func('api/direct_messages','api_direct_messages_inbox',true);
+
+
+
+ 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();
+ }
+ echo $r;
+ killme();
+ }
+ 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();
+ }
+ echo $r;
+ killme();
+ }
+
+ api_register_func('api/oauth/request_token', 'api_oauth_request_token', false);
+ api_register_func('api/oauth/access_token', 'api_oauth_access_token', false);
+
+/*
+Not implemented by now:
+favorites
+favorites/create
+favorites/destroy
+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
+oauth/authorize
+
+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
+*/