]> git.mxchange.org Git - friendica.git/blobdiff - include/items.php
Merge pull request #351 from annando/master
[friendica.git] / include / items.php
index 037de35eb04f63991ef013c17709be05e191f761..a0dd1c8159fc0a61130d7079541cba5c27960ca0 100755 (executable)
@@ -22,8 +22,6 @@ function get_feed_for(&$a, $dfrn_id, $owner_nick, $last_update, $direction = 0)
                        if($a->argv[$x] === 'category' && $a->argc > ($x + 1) && strlen($a->argv[$x+1]))
                                $category = $a->argv[$x+1];
                }
-
-
        }
 
        
@@ -448,6 +446,8 @@ function get_atom_elements($feed,$item) {
                $res['body'] = $purifier->purify($res['body']);
 
                $res['body'] = @html2bbcode($res['body']);
+
+
        }
        elseif(! $have_real_body) {
 
@@ -693,6 +693,8 @@ function encode_rel_links($links) {
        return xmlify($o);
 }
 
+
+
 function item_store($arr,$force_parent = false) {
 
        // If a Diaspora signature structure was passed in, pull it out of the 
@@ -806,6 +808,20 @@ function item_store($arr,$force_parent = false) {
                        $deny_cid       = $r[0]['deny_cid'];
                        $deny_gid       = $r[0]['deny_gid'];
                        $arr['wall']    = $r[0]['wall'];
+
+                       // if the parent is private, force privacy for the entire conversation
+                       // This differs from the above settings as it subtly allows comments from 
+                       // email correspondents to be private even if the overall thread is not. 
+
+                       if($r[0]['private'])
+                               $arr['private'] = 1;
+
+                       // Edge case. We host a public forum that was originally posted to privately.
+                       // The original author commented, but as this is a comment, the permissions
+                       // weren't fixed up so it will still show the comment as private unless we fix it here. 
+
+                       if((intval($r[0]['forum_mode']) == 1) && (! $r[0]['private']))
+                               $arr['private'] = 0;
                }
                else {
 
@@ -1250,6 +1266,12 @@ function dfrn_deliver($owner,$contact,$atom, $dissolve = false) {
                return 3;
        }
 
+       if($contact['term-date'] != '0000-00-00 00:00:00') {
+               logger("dfrn_deliver: $url back from the dead - removing mark for death");
+               require_once('include/Contact.php');
+               unmark_for_death($contact);
+       }
+
        $res = parse_xml_string($xml);
 
        return $res->status; 
@@ -1314,6 +1336,7 @@ function consume_feed($xml,$importer,&$contact, &$hub, $datedir = 0, $pass = 0)
        $birthday = '';
 
        $hubs = $feed->get_links('hub');
+       logger('consume_feed: hubs: ' . print_r($hubs,true), LOGGER_DATA);
 
        if(count($hubs))
                $hub = implode(',', $hubs);
@@ -1356,7 +1379,11 @@ function consume_feed($xml,$importer,&$contact, &$hub, $datedir = 0, $pass = 0)
                }
                        
                $img_str = fetch_url($photo_url,true);
-               $img = new Photo($img_str);
+               // guess mimetype from headers or filename
+               $type = guess_image_type($photo_url,true);
+               
+               
+               $img = new Photo($img_str, $type);
                if($img->is_valid()) {
                        if($have_photo) {
                                q("DELETE FROM `photo` WHERE `resource-id` = '%s' AND `contact-id` = %d AND `uid` = %d",
@@ -1382,9 +1409,9 @@ function consume_feed($xml,$importer,&$contact, &$hub, $datedir = 0, $pass = 0)
                        q("UPDATE `contact` SET `avatar-date` = '%s', `photo` = '%s', `thumb` = '%s', `micro` = '%s'  
                                WHERE `uid` = %d AND `id` = %d LIMIT 1",
                                dbesc(datetime_convert()),
-                               dbesc($a->get_baseurl() . '/photo/' . $hash . '-4.jpg'),
-                               dbesc($a->get_baseurl() . '/photo/' . $hash . '-5.jpg'),
-                               dbesc($a->get_baseurl() . '/photo/' . $hash . '-6.jpg'),
+                               dbesc($a->get_baseurl() . '/photo/' . $hash . '-4.'.$img->getExt()),
+                               dbesc($a->get_baseurl() . '/photo/' . $hash . '-5.'.$img->getExt()),
+                               dbesc($a->get_baseurl() . '/photo/' . $hash . '-6.'.$img->getExt()),
                                intval($contact['uid']),
                                intval($contact['id'])
                        );
@@ -1640,6 +1667,11 @@ function consume_feed($xml,$importer,&$contact, &$hub, $datedir = 0, $pass = 0)
 
                                if(count($r)) {
                                        if((x($datarray,'edited') !== false) && (datetime_convert('UTC','UTC',$datarray['edited']) !== $r[0]['edited'])) {  
+
+                                               // do not accept (ignore) an earlier edit than one we currently have.
+                                               if(datetime_convert('UTC','UTC',$datarray['edited']) < $r[0]['edited'])
+                                                       continue;
+
                                                $r = q("UPDATE `item` SET `title` = '%s', `body` = '%s', `tag` = '%s', `edited` = '%s' WHERE `uri` = '%s' AND `uid` = %d LIMIT 1",
                                                        dbesc($datarray['title']),
                                                        dbesc($datarray['body']),
@@ -1786,6 +1818,11 @@ function consume_feed($xml,$importer,&$contact, &$hub, $datedir = 0, $pass = 0)
 
                                if(count($r)) {
                                        if((x($datarray,'edited') !== false) && (datetime_convert('UTC','UTC',$datarray['edited']) !== $r[0]['edited'])) {  
+
+                                               // do not accept (ignore) an earlier edit than one we currently have.
+                                               if(datetime_convert('UTC','UTC',$datarray['edited']) < $r[0]['edited'])
+                                                       continue;
+
                                                $r = q("UPDATE `item` SET `title` = '%s', `body` = '%s', `tag` = '%s', `edited` = '%s' WHERE `uri` = '%s' AND `uid` = %d LIMIT 1",
                                                        dbesc($datarray['title']),
                                                        dbesc($datarray['body']),
@@ -1841,9 +1878,11 @@ function consume_feed($xml,$importer,&$contact, &$hub, $datedir = 0, $pass = 0)
                                }
 
                                if(($contact['network'] === NETWORK_FEED) || (! strlen($contact['notify']))) {
-                                       // one way feed - no remote comment ability
-                                       $datarray['last-child'] = 0;
+                                               // one way feed - no remote comment ability
+                                               $datarray['last-child'] = 0;
                                }
+                               if($contact['network'] === NETWORK_FEED)
+                                       $datarray['private'] = 1;
 
                                // This is my contact on another system, but it's really me.
                                // Turn this into a wall post.
@@ -2269,7 +2308,12 @@ function local_delivery($importer,$data) {
 
                                if(count($r)) {
                                        $iid = $r[0]['id'];
-                                       if((x($datarray,'edited') !== false) && (datetime_convert('UTC','UTC',$datarray['edited']) !== $r[0]['edited'])) {  
+                                       if((x($datarray,'edited') !== false) && (datetime_convert('UTC','UTC',$datarray['edited']) !== $r[0]['edited'])) {
+                                       
+                                               // do not accept (ignore) an earlier edit than one we currently have.
+                                               if(datetime_convert('UTC','UTC',$datarray['edited']) < $r[0]['edited'])
+                                                       continue;
+  
                                                logger('received updated comment' , LOGGER_DEBUG);
                                                $r = q("UPDATE `item` SET `title` = '%s', `body` = '%s', `tag` = '%s', `edited` = '%s' WHERE `uri` = '%s' AND `uid` = %d LIMIT 1",
                                                        dbesc($datarray['title']),
@@ -2448,6 +2492,11 @@ function local_delivery($importer,$data) {
 
                                if(count($r)) {
                                        if((x($datarray,'edited') !== false) && (datetime_convert('UTC','UTC',$datarray['edited']) !== $r[0]['edited'])) {  
+
+                                               // do not accept (ignore) an earlier edit than one we currently have.
+                                               if(datetime_convert('UTC','UTC',$datarray['edited']) < $r[0]['edited'])
+                                                       continue;
+
                                                $r = q("UPDATE `item` SET `title` = '%s', `body` = '%s', `tag` = '%s', `edited` = '%s' WHERE `uri` = '%s' AND `uid` = %d LIMIT 1",
                                                        dbesc($datarray['title']),
                                                        dbesc($datarray['body']),
@@ -2614,6 +2663,11 @@ function local_delivery($importer,$data) {
 
                        if(count($r)) {
                                if((x($datarray,'edited') !== false) && (datetime_convert('UTC','UTC',$datarray['edited']) !== $r[0]['edited'])) {  
+
+                                       // do not accept (ignore) an earlier edit than one we currently have.
+                                       if(datetime_convert('UTC','UTC',$datarray['edited']) < $r[0]['edited'])
+                                               continue;
+
                                        $r = q("UPDATE `item` SET `title` = '%s', `body` = '%s', `tag` = '%s', `edited` = '%s' WHERE `uri` = '%s' AND `uid` = %d LIMIT 1",
                                                dbesc($datarray['title']),
                                                dbesc($datarray['body']),
@@ -2958,7 +3012,7 @@ function fix_private_photos($s,$uid, $item = null, $cid = 0) {
                if(stristr($image , $site . '/photo/')) {
                        $replace = false;
                        $i = basename($image);
-                       $i = str_replace('.jpg','',$i);
+                       $i = str_replace(array('.jpg','.png'),array('',''),$i);
                        $x = strpos($i,'-');
                        if($x) {
                                $res = substr($i,$x+1);
@@ -3000,7 +3054,7 @@ function fix_private_photos($s,$uid, $item = null, $cid = 0) {
                                        }
                                        if($replace) {
                                                logger('fix_private_photos: replacing photo', LOGGER_DEBUG);
-                                               $s = str_replace($image, 'data:image/jpg;base64,' . base64_encode($r[0]['data']), $s);
+                                               $s = str_replace($image, 'data:' . $r[0]['type'] . ';base64,' . base64_encode($r[0]['data']), $s);
                                                logger('fix_private_photos: replaced: ' . $s, LOGGER_DATA);
                                        }
                                }
@@ -3350,3 +3404,69 @@ function drop_item($id,$interactive = true) {
        }
        
 }
+
+
+function first_post_date($uid,$wall = false) {
+       $r = q("select id, created from item 
+               where uid = %d and wall = %d and deleted = 0 and visible = 1 AND moderated = 0 
+               and id = parent
+               order by created asc limit 1",
+               intval($uid),
+               intval($wall ? 1 : 0)
+       );
+       if(count($r)) {
+//             logger('first_post_date: ' . $r[0]['id'] . ' ' . $r[0]['created'], LOGGER_DATA);
+               return substr(datetime_convert('',date_default_timezone_get(),$r[0]['created']),0,10);
+       }
+       return false;
+}
+
+function posted_dates($uid,$wall) {
+       $dnow = datetime_convert('',date_default_timezone_get(),'now','Y-m-d');
+
+       $dthen = first_post_date($uid,$wall);
+       if(! $dthen)
+               return array();
+
+       // If it's near the end of a long month, backup to the 28th so that in 
+       // consecutive loops we'll always get a whole month difference.
+
+       if(intval(substr($dnow,8)) > 28)
+               $dnow = substr($dnow,0,8) . '28';
+       if(intval(substr($dthen,8)) > 28)
+               $dnow = substr($dthen,0,8) . '28';
+
+       $ret = array();
+       while($dnow >= $dthen) {
+               $dstart = substr($dnow,0,8) . '01';
+               $dend = substr($dnow,0,8) . get_dim(intval($dnow),intval(substr($dnow,5)));
+               $start_month = datetime_convert('','',$dstart,'Y-m-d');
+               $end_month = datetime_convert('','',$dend,'Y-m-d');
+               $str = day_translate(datetime_convert('','',$dnow,'F Y'));
+               $ret[] = array($str,$end_month,$start_month);
+               $dnow = datetime_convert('','',$dnow . ' -1 month', 'Y-m-d');
+       }
+       return $ret;
+}
+
+
+function posted_date_widget($url,$uid,$wall) {
+       $o = '';
+
+       // For former Facebook folks that left because of "timeline"
+
+       if($wall && intval(get_pconfig($uid,'system','no_wall_archive_widget')))
+               return $o;
+
+       $ret = posted_dates($uid,$wall);
+       if(! count($ret))
+               return $o;
+
+       $o = replace_macros(get_markup_template('posted_date_widget.tpl'),array(
+               '$title' => t('Archives'),
+               '$size' => ((count($ret) > 6) ? 6 : count($ret)),
+               '$url' => $url,
+               '$dates' => $ret
+       ));
+       return $o;
+}
\ No newline at end of file