]> git.mxchange.org Git - friendica.git/blobdiff - include/diaspora.php
prevent duplicate @ tags
[friendica.git] / include / diaspora.php
index 7207daf0cd1c7b6e6a6c310736db3e4c2eac2936..ac78beb2f9e58a9d2037307d01e19e577a71a7ac 100644 (file)
@@ -4,6 +4,7 @@ require_once('include/crypto.php');
 require_once('include/items.php');
 require_once('include/bb2diaspora.php');
 require_once('include/contact_selectors.php');
+require_once('include/queue_fn.php');
 
 
 function diaspora_dispatch_public($msg) {
@@ -28,6 +29,14 @@ function diaspora_dispatch($importer,$msg) {
 
        $ret = 0;
 
+       // php doesn't like dashes in variable names
+
+       $msg['message'] = str_replace(
+                       array('<activity_streams-photo>','</activity_streams-photo>'),
+                       array('<asphoto>','</asphoto>'),
+                       $msg['message']);
+
+
        $parsed_xml = parse_xml_string($msg['message'],false);
 
        $xmlbase = $parsed_xml->post;
@@ -47,6 +56,12 @@ function diaspora_dispatch($importer,$msg) {
        elseif($xmlbase->like) {
                $ret = diaspora_like($importer,$xmlbase->like,$msg);
        }
+       elseif($xmlbase->asphoto) {
+               $ret = diaspora_asphoto($importer,$xmlbase->asphoto);
+       }
+       elseif($xmlbase->reshare) {
+               $ret = diaspora_reshare($importer,$xmlbase->reshare);
+       }
        elseif($xmlbase->retraction) {
                $ret = diaspora_retraction($importer,$xmlbase->retraction,$msg);
        }
@@ -77,12 +92,14 @@ function find_diaspora_person_by_handle($handle) {
                dbesc($handle)
        );
        if(count($r)) {
+               logger('find_diaspora_person_by handle: in cache ' . print_r($r,true), LOGGER_DEBUG);
                // update record occasionally so it doesn't get stale
                $d = strtotime($r[0]['updated'] . ' +00:00');
                if($d > strtotime('now - 14 days'))
                        return $r[0];
                $update = true;
        }
+       logger('find_diaspora_person_by_handle: refresh',LOGGER_DEBUG);
        require_once('include/Scrape.php');
        $r = probe_url($handle, PROBE_DIASPORA);
        if((count($r)) && ($r['network'] === NETWORK_DIASPORA)) {
@@ -434,13 +451,14 @@ function diaspora_request($importer,$xml) {
 
        $batch = (($ret['batch']) ? $ret['batch'] : implode('/', array_slice(explode('/',$ret['url']),0,3)) . '/receive/public');
 
-       $r = q("INSERT INTO `contact` (`uid`, `network`,`addr`,`created`,`url`,`batch`,`name`,`nick`,`photo`,`pubkey`,`notify`,`poll`,`blocked`,`priority`)
-               VALUES ( %d, '%s', '%s', '%s','%s','%s','%s','%s','%s','%s','%s','%s',%d,%d) ",
+       $r = q("INSERT INTO `contact` (`uid`, `network`,`addr`,`created`,`url`,`nurl`,`batch`,`name`,`nick`,`photo`,`pubkey`,`notify`,`poll`,`blocked`,`priority`)
+               VALUES ( %d, '%s', '%s', '%s', '%s','%s','%s','%s','%s','%s','%s','%s','%s',%d,%d) ",
                intval($importer['uid']),
                dbesc($ret['network']),
                dbesc($ret['addr']),
                datetime_convert(),
                dbesc($ret['url']),
+               dbesc(normalise_link($ret['url'])),
                dbesc($batch),
                dbesc($ret['name']),
                dbesc($ret['nick']),
@@ -556,6 +574,244 @@ function diaspora_post($importer,$xml) {
        $datarray['tag'] = $str_tags;
        $datarray['app']  = 'Diaspora';
 
+       // if empty content it might be a photo that hasn't arrived yet. If a photo arrives, we'll make it visible.
+
+       $datarray['visible'] = ((strlen($body)) ? 1 : 0);
+
+       $message_id = item_store($datarray);
+
+       if($message_id) {
+               q("update item set plink = '%s' where id = %d limit 1",
+                       dbesc($a->get_baseurl() . '/display/' . $importer['nickname'] . '/' . $message_id),
+                       intval($message_id)
+               );
+       }
+
+       return;
+
+}
+
+function diaspora_reshare($importer,$xml) {
+
+       logger('diaspora_reshare: init: ' . print_r($xml,true));
+
+       $a = get_app();
+       $guid = notags(unxmlify($xml->guid));
+       $diaspora_handle = notags(unxmlify($xml->diaspora_handle));
+
+
+       $contact = diaspora_get_contact_by_handle($importer['uid'],$diaspora_handle);
+       if(! $contact)
+               return;
+
+       if(($contact['rel'] == CONTACT_IS_FOLLOWER) || ($contact['blocked']) || ($contact['readonly'])) { 
+               logger('diaspora_reshare: Ignoring this author: ' . $diaspora_handle . ' ' . print_r($xml,true));
+               return 202;
+       }
+
+       $message_id = $diaspora_handle . ':' . $guid;
+       $r = q("SELECT `id` FROM `item` WHERE `uid` = %d AND `uri` = '%s' AND `guid` = '%s' LIMIT 1",
+               intval($importer['uid']),
+               dbesc($message_id),
+               dbesc($guid)
+       );
+       if(count($r)) {
+               logger('diaspora_reshare: message exists: ' . $guid);
+               return;
+       }
+
+       $orig_author = notags(unxmlify($xml->root_diaspora_id));
+       $orig_guid = notags(unxmlify($xml->root_guid));
+
+       $source_url = 'https://' . substr($orig_author,strpos($orig_author,'@')+1) . '/p/' . $orig_guid . '.xml';
+       $x = fetch_url($source_url);
+       if(! $x)
+               $x = fetch_url(str_replace('https://','http://',$source_url));
+       if(! $x) {
+               logger('diaspora_reshare: unable to fetch source url ' . $source_url);
+               return;
+       }
+       logger('diaspora_reshare: source: ' . $x);
+
+       $x = str_replace(array('<activity_streams-photo>','</activity_streams-photo>'),array('<asphoto>','</asphoto>'),$x);
+       $source_xml = parse_xml_string($x,false);
+
+       if(strlen($source_xml->post->asphoto->objectId) && ($source_xml->post->asphoto->objectId != 0) && ($source_xml->post->asphoto->image_url)) {
+               $body = '[url=' . notags(unxmlify($source_xml->post->asphoto->image_url)) . '][img]' . notags(unxmlify($source_xml->post->asphoto->objectId)) . '[/img][/url]' . "\n";
+               $body = scale_diaspora_images($body,false);
+       }
+       elseif($source_xml->post->asphoto->image_url) {
+               $body = '[img]' . notags(unxmlify($source_xml->post->asphoto->image_url)) . '[/img]' . "\n";
+               $body = scale_diaspora_images($body);
+       }
+       elseif($source_xml->post->status_message) {
+               $body = diaspora2bb($source_xml->post->status_message->raw_message);
+               $body = scale_diaspora_images($body);
+
+       }
+       else {
+               logger('diaspora_reshare: no reshare content found: ' . print_r($source_xml,true));
+               return;
+       }
+       if(! $body) {
+               logger('diaspora_reshare: empty body: source= ' . $x);
+               return;
+       }
+
+       $person = find_diaspora_person_by_handle($orig_author);
+
+       if(is_array($person) && x($person,'name') && x($person,'url'))
+               $details = '[url=' . $person['url'] . ']' . $person['name'] . '[/url]';
+       else
+               $details = $orig_author;
+       
+       $prefix = '&#x2672; ' . $details . "\n"; 
+
+
+    // allocate a guid on our system - we aren't fixing any collisions.
+       // we're ignoring them
+
+       $g = q("select * from guid where guid = '%s' limit 1",
+               dbesc($guid)
+       );
+       if(! count($g)) {
+               q("insert into guid ( guid ) values ( '%s' )",
+                       dbesc($guid)
+               );
+       }
+
+       $created = unxmlify($xml->created_at);
+       $private = ((unxmlify($xml->public) == 'false') ? 1 : 0);
+
+       $datarray = array();
+
+       $str_tags = '';
+
+       $tags = get_tags($body);
+
+       if(count($tags)) {
+               foreach($tags as $tag) {
+                       if(strpos($tag,'#') === 0) {
+                               if(strpos($tag,'[url='))
+                                       continue;
+                               $basetag = str_replace('_',' ',substr($tag,1));
+                               $body = str_replace($tag,'#[url=' . $a->get_baseurl() . '/search?search=' . rawurlencode($basetag) . ']' . $basetag . '[/url]',$body);
+                               if(strlen($str_tags))
+                                       $str_tags .= ',';
+                               $str_tags .= '#[url=' . $a->get_baseurl() . '/search?search=' . rawurlencode($basetag) . ']' . $basetag . '[/url]';
+                               continue;
+                       }
+               }
+       }
+       
+       $datarray['uid'] = $importer['uid'];
+       $datarray['contact-id'] = $contact['id'];
+       $datarray['wall'] = 0;
+       $datarray['guid'] = $guid;
+       $datarray['uri'] = $datarray['parent-uri'] = $message_id;
+       $datarray['created'] = $datarray['edited'] = datetime_convert('UTC','UTC',$created);
+       $datarray['private'] = $private;
+       $datarray['parent'] = 0;
+       $datarray['owner-name'] = $contact['name'];
+       $datarray['owner-link'] = $contact['url'];
+       $datarray['owner-avatar'] = $contact['thumb'];
+       $datarray['author-name'] = $contact['name'];
+       $datarray['author-link'] = $contact['url'];
+       $datarray['author-avatar'] = $contact['thumb'];
+       $datarray['body'] = $prefix . $body;
+       $datarray['tag'] = $str_tags;
+       $datarray['app']  = 'Diaspora';
+
+       $message_id = item_store($datarray);
+
+       if($message_id) {
+               q("update item set plink = '%s' where id = %d limit 1",
+                       dbesc($a->get_baseurl() . '/display/' . $importer['nickname'] . '/' . $message_id),
+                       intval($message_id)
+               );
+       }
+
+       return;
+
+}
+
+
+function diaspora_asphoto($importer,$xml) {
+       logger('diaspora_asphoto called');
+
+       $a = get_app();
+       $guid = notags(unxmlify($xml->guid));
+       $diaspora_handle = notags(unxmlify($xml->diaspora_handle));
+
+       $contact = diaspora_get_contact_by_handle($importer['uid'],$diaspora_handle);
+       if(! $contact)
+               return;
+
+       if(($contact['rel'] == CONTACT_IS_FOLLOWER) || ($contact['blocked']) || ($contact['readonly'])) { 
+               logger('diaspora_asphoto: Ignoring this author.');
+               return 202;
+       }
+
+       $message_id = $diaspora_handle . ':' . $guid;
+       $r = q("SELECT `id` FROM `item` WHERE `uid` = %d AND `uri` = '%s' AND `guid` = '%s' LIMIT 1",
+               intval($importer['uid']),
+               dbesc($message_id),
+               dbesc($guid)
+       );
+       if(count($r)) {
+               logger('diaspora_asphoto: message exists: ' . $guid);
+               return;
+       }
+
+    // allocate a guid on our system - we aren't fixing any collisions.
+       // we're ignoring them
+
+       $g = q("select * from guid where guid = '%s' limit 1",
+               dbesc($guid)
+       );
+       if(! count($g)) {
+               q("insert into guid ( guid ) values ( '%s' )",
+                       dbesc($guid)
+               );
+       }
+
+       $created = unxmlify($xml->created_at);
+       $private = ((unxmlify($xml->public) == 'false') ? 1 : 0);
+
+       if(strlen($xml->objectId) && ($xml->objectId != 0) && ($xml->image_url)) {
+               $body = '[url=' . notags(unxmlify($xml->image_url)) . '][img]' . notags(unxmlify($xml->objectId)) . '[/img][/url]' . "\n";
+               $body = scale_diaspora_images($body,false);
+       }
+       elseif($xml->image_url) {
+               $body = '[img]' . notags(unxmlify($xml->image_url)) . '[/img]' . "\n";
+               $body = scale_diaspora_images($body);
+       }
+       else {
+               logger('diaspora_asphoto: no photo url found.');
+               return;
+       }
+
+       $datarray = array();
+
+       
+       $datarray['uid'] = $importer['uid'];
+       $datarray['contact-id'] = $contact['id'];
+       $datarray['wall'] = 0;
+       $datarray['guid'] = $guid;
+       $datarray['uri'] = $datarray['parent-uri'] = $message_id;
+       $datarray['created'] = $datarray['edited'] = datetime_convert('UTC','UTC',$created);
+       $datarray['private'] = $private;
+       $datarray['parent'] = 0;
+       $datarray['owner-name'] = $contact['name'];
+       $datarray['owner-link'] = $contact['url'];
+       $datarray['owner-avatar'] = $contact['thumb'];
+       $datarray['author-name'] = $contact['name'];
+       $datarray['author-link'] = $contact['url'];
+       $datarray['author-avatar'] = $contact['thumb'];
+       $datarray['body'] = $body;
+       
+       $datarray['app']  = 'Diaspora/Cubbi.es';
+
        $message_id = item_store($datarray);
 
        if($message_id) {
@@ -569,6 +825,11 @@ function diaspora_post($importer,$xml) {
 
 }
 
+
+
+
+
+
 function diaspora_comment($importer,$xml,$msg) {
 
        $a = get_app();
@@ -698,7 +959,10 @@ function diaspora_comment($importer,$xml,$msg) {
        $datarray['author-avatar'] = ((x($person,'thumb')) ? $person['thumb'] : $person['photo']);
        $datarray['body'] = $body;
        $datarray['tag'] = $str_tags;
-       $datarray['app']  = 'Diaspora';
+
+       // We can't be certain what the original app is if the message is relayed.
+       if(($parent_item['origin']) && (! $parent_author_signature)) 
+               $datarray['app']  = 'Diaspora';
 
        $message_id = item_store($datarray);
 
@@ -709,7 +973,7 @@ function diaspora_comment($importer,$xml,$msg) {
                );
        }
 
-       if(! $parent_author_signature) {
+       if(($parent_item['origin']) && (! $parent_author_signature)) {
                q("insert into sign (`iid`,`signed_text`,`signature`,`signer`) values (%d,'%s','%s','%s') ",
                        intval($message_id),
                        dbesc($author_signed_data),
@@ -765,8 +1029,10 @@ function diaspora_photo($importer,$xml,$msg) {
 
        $link_text = '[img]' . $remote_photo_path . $remote_photo_name . '[/img]' . "\n";
 
+       $link_text = scale_diaspora_images($link_text);
+
        if(strpos($parent_item['body'],$link_text) === false) {
-               $r = q("update item set `body` = '%s' where `id` = %d and `uid` = %d limit 1",
+               $r = q("update item set `body` = '%s', `visible` = 1 where `id` = %d and `uid` = %d limit 1",
                        dbesc($link_text . $parent_item['body']),
                        intval($parent_item['id']),
                        intval($parent_item['uid'])
@@ -914,9 +1180,9 @@ EOT;
        $arr['parent'] = $parent_item['id'];
        $arr['parent-uri'] = $parent_item['uri'];
 
-       $arr['owner-name'] = $contact['name'];
-       $arr['owner-link'] = $contact['url'];
-       $arr['owner-avatar'] = $contact['thumb'];
+       $arr['owner-name'] = $parent_item['name'];
+       $arr['owner-link'] = $parent_item['url'];
+       $arr['owner-avatar'] = $parent_item['thumb'];
 
        $arr['author-name'] = $person['name'];
        $arr['author-link'] = $person['url'];
@@ -958,9 +1224,9 @@ EOT;
 
        // if the message isn't already being relayed, notify others
        // the existence of parent_author_signature means the parent_author or owner
-       // is already relaying.
+       // is already relaying. The parent_item['origin'] indicates the message was created on our system
 
-       if(! $parent_author_signature)
+       if(($parent_item['origin']) && (! $parent_author_signature))
                proc_run('php','include/notifier.php','comment',$message_id);
 
        return;
@@ -1022,20 +1288,28 @@ function diaspora_profile($importer,$xml) {
        );
        $oldphotos = ((count($r)) ? $r : null);
 
+       require_once('include/Photo.php');
+
        $images = import_profile_photo($image_url,$importer['uid'],$contact['id']);
        
-       // TODO handle birthdays - even though we don't know the original timezone (grrr.)
+       // Generic birthday. We don't know the timezone. The year is irrelevant. 
+
+       $birthday = str_replace('1000','1901',$birthday);
 
-       $r = q("UPDATE `contact` SET `name` = '%s', `name-date` = '%s', `photo` = '%s', `thumb` = '%s', `micro` = '%s', `avatar-date` = '%s' WHERE `id` = %d AND `uid` = %d LIMIT 1",
+       $birthday = datetime_convert('UTC','UTC',$birthday,'Y-m-d');
+
+       $r = q("UPDATE `contact` SET `name` = '%s', `name-date` = '%s', `photo` = '%s', `thumb` = '%s', `micro` = '%s', `avatar-date` = '%s' , `bd` = '%s' WHERE `id` = %d AND `uid` = %d LIMIT 1",
                dbesc($name),
                dbesc(datetime_convert()),
                dbesc($images[0]),
                dbesc($images[1]),
                dbesc($images[2]),
                dbesc(datetime_convert()),
+               dbesc($birthday),
                intval($contact['id']),
                intval($importer['uid'])
        ); 
+
        if($r) {
                if($oldphotos) {
                        foreach($oldphotos as $ph) {
@@ -1119,6 +1393,14 @@ function diaspora_send_status($item,$owner,$contact,$public_batch = false) {
 
        $body = $item['body'];
 
+/*
+       // We're trying to match Diaspora's split message/photo protocol but
+       // all the photos are displayed on D* as links and not img's - even
+       // though we're sending pretty much precisely what they send us when
+       // doing the same operation.  
+       // Commented out for now, we'll use bb2diaspora to convert photos to markdown
+       // which seems to get through intact.
+
        $cnt = preg_match_all('|\[img\](.*?)\[\/img\]|',$body,$matches,PREG_SET_ORDER);
        if($cnt) {
                foreach($matches as $mtch) {
@@ -1129,12 +1411,24 @@ function diaspora_send_status($item,$owner,$contact,$public_batch = false) {
                        $detail['guid'] = $item['guid'];
                        $detail['handle'] = $myaddr;
                        $images[] = $detail;
-                       $body = str_replace($detail['str'],t('link'),$body);
+                       $body = str_replace($detail['str'],$mtch[1],$body);
                }
        }       
+*/
 
        $body = xmlify(html_entity_decode(bb2diaspora($body)));
 
+       if($item['attach']) {
+               $cnt = preg_match_all('/href=\"(.*?)\"(.*?)title=\"(.*?)\"/ism',$item['attach'],$matches,PREG_SET_ORDER);
+               if(cnt) {
+                       $body .= "\n" . t('Attachments:') . "\n";
+                       foreach($matches as $mtch) {
+                               $body .= '[' . $mtch[3] . '](' . $mtch[1] . ')' . "\n";
+                       }
+               }
+       }       
+
+
        $public = (($item['private']) ? 'false' : 'true');
 
        require_once('include/datetime.php');
@@ -1391,14 +1685,7 @@ function diaspora_transmit($owner,$contact,$slap,$public_batch) {
        if((! $return_code) || (($curl_stat == 503) && (stristr($a->get_curl_headers(),'retry-after')))) {
                logger('diaspora_transmit: queue message');
                // queue message for redelivery
-               q("INSERT INTO `queue` ( `cid`, `created`, `last`, `content`,`batch`)
-                       VALUES ( %d, '%s', '%s', '%s', %d) ",
-                       intval($contact['id']),
-                       dbesc(datetime_convert()),
-                       dbesc(datetime_convert()),
-                       dbesc($slap),
-                       intval($public_batch)
-               );
+               add_to_queue($contact['id'],NETWORK_DIASPORA,$slap,$public_batch);
        }