]> git.mxchange.org Git - friendica.git/blobdiff - include/conversation.php
Merge remote-tracking branch 'remotes/upstream/master'
[friendica.git] / include / conversation.php
index a32cbeb8ba9cae891991253fec5e348e10505a29..4a9142bb202285c6553a2a2dd2e2317ea9c914fd 100644 (file)
@@ -1,30 +1,91 @@
 <?php
 
+// Note: the code in 'item_extract_images' and 'item_redir_and_replace_images'
+// is identical to the code in mod/message.php for 'item_extract_images' and
+// 'item_redir_and_replace_images'
+if(! function_exists('item_extract_images')) {
+function item_extract_images($body) {
+
+       $saved_image = array();
+       $orig_body = $body;
+       $new_body = '';
+
+       $cnt = 0;
+       $img_start = strpos($orig_body, '[img');
+       $img_st_close = ($img_start !== false ? strpos(substr($orig_body, $img_start), ']') : false);
+       $img_end = ($img_start !== false ? strpos(substr($orig_body, $img_start), '[/img]') : false);
+       while(($img_st_close !== false) && ($img_end !== false)) {
+
+               $img_st_close++; // make it point to AFTER the closing bracket
+               $img_end += $img_start;
+
+               if(! strcmp(substr($orig_body, $img_start + $img_st_close, 5), 'data:')) {
+                       // This is an embedded image
+
+                       $saved_image[$cnt] = substr($orig_body, $img_start + $img_st_close, $img_end - ($img_start + $img_st_close));
+                       $new_body = $new_body . substr($orig_body, 0, $img_start) . '[!#saved_image' . $cnt . '#!]';
+
+                       $cnt++;
+               }
+               else
+                       $new_body = $new_body . substr($orig_body, 0, $img_end + strlen('[/img]'));
+
+               $orig_body = substr($orig_body, $img_end + strlen('[/img]'));
+
+               if($orig_body === false) // in case the body ends on a closing image tag
+                       $orig_body = '';
+
+               $img_start = strpos($orig_body, '[img');
+               $img_st_close = ($img_start !== false ? strpos(substr($orig_body, $img_start), ']') : false);
+               $img_end = ($img_start !== false ? strpos(substr($orig_body, $img_start), '[/img]') : false);
+       }
+
+       $new_body = $new_body . $orig_body;
+
+       return array('body' => $new_body, 'images' => $saved_image);
+}}
+
+if(! function_exists('item_redir_and_replace_images')) {
+function item_redir_and_replace_images($body, $images, $cid) {
+
+       $origbody = $body;
+       $newbody = '';
+
+       for($i = 0; $i < count($images); $i++) {
+               $search = '/\[url\=(.*?)\]\[!#saved_image' . $i . '#!\]\[\/url\]' . '/is';
+               $replace = '[url=' . z_path() . '/redir/' . $cid 
+                          . '?f=1&url=' . '$1' . '][!#saved_image' . $i . '#!][/url]' ;
+
+               $img_end = strpos($origbody, '[!#saved_image' . $i . '#!][/url]') + strlen('[!#saved_image' . $i . '#!][/url]');
+               $process_part = substr($origbody, 0, $img_end);
+               $origbody = substr($origbody, $img_end);
+
+               $process_part = preg_replace($search, $replace, $process_part);
+               $newbody = $newbody . $process_part;
+       }
+       $newbody = $newbody . $origbody;
+
+       $cnt = 0;
+       foreach($images as $image) {
+               // We're depending on the property of 'foreach' (specified on the PHP website) that
+               // it loops over the array starting from the first element and going sequentially
+               // to the last element
+               $newbody = str_replace('[!#saved_image' . $cnt . '#!]', '[img]' . $image . '[/img]', $newbody);
+               $cnt++;
+       }
+       return $newbody;
+}}
+
+
+
 /**
  * Render actions localized
  */
 function localize_item(&$item){
 
-       $Text = $item['body'];
-       $saved_image = '';
-       $img_start = strpos($Text,'[img]data:');
-       $img_end = strpos($Text,'[/img]');
-
-       if($img_start !== false && $img_end !== false && $img_end > $img_start) {
-               $start_fragment = substr($Text,0,$img_start);
-               $img_start += strlen('[img]');
-               $saved_image = substr($Text,$img_start,$img_end - $img_start);
-               $end_fragment = substr($Text,$img_end + strlen('[/img]'));              
-               $Text = $start_fragment . '[!#saved_image#!]' . $end_fragment;
-               $search = '/\[url\=(.*?)\]\[!#saved_image#!\]\[\/url\]' . '/is';
-               $replace = '[url=' . z_path() . '/redir/' . $item['contact-id'] 
-                       . '?f=1&url=' . '$1' . '][!#saved_image#!][/url]' ;
-
-               $Text = preg_replace($search,$replace,$Text);
-
-               if(strlen($saved_image))
-                       $item['body'] = str_replace('[!#saved_image#!]', '[img]' . $saved_image . '[/img]',$Text);
-       }
+       $extracted = item_extract_images($item['body']);
+       if($extracted['images'])
+               $item['body'] = item_redir_and_replace_images($extracted['body'], $extracted['images'], $item['contact-id']);
 
        $xmlhead="<"."?xml version='1.0' encoding='UTF-8' ?".">";
        if ($item['verb']=== ACTIVITY_LIKE || $item['verb']=== ACTIVITY_DISLIKE){
@@ -101,6 +162,49 @@ function localize_item(&$item){
                $item['body'] = sprintf( t('%1$s is now friends with %2$s'), $A, $B)."\n\n\n".$Bphoto;
 
        }
+       if (stristr($item['verb'],ACTIVITY_POKE)) {
+               $verb = urldecode(substr($item['verb'],strpos($item['verb'],'#')+1));
+               if(! $verb)
+                       return;
+               if ($item['object-type']=="" || $item['object-type']!== ACTIVITY_OBJ_PERSON) return;
+
+               $Aname = $item['author-name'];
+               $Alink = $item['author-link'];
+               
+               $xmlhead="<"."?xml version='1.0' encoding='UTF-8' ?".">";
+               
+               $obj = parse_xml_string($xmlhead.$item['object']);
+               $links = parse_xml_string($xmlhead."<links>".unxmlify($obj->link)."</links>");
+               
+               $Bname = $obj->title;
+               $Blink = ""; $Bphoto = "";
+               foreach ($links->link as $l){
+                       $atts = $l->attributes();
+                       switch($atts['rel']){
+                               case "alternate": $Blink = $atts['href'];
+                               case "photo": $Bphoto = $atts['href'];
+                       }
+                       
+               }
+               
+               $A = '[url=' . zrl($Alink) . ']' . $Aname . '[/url]';
+               $B = '[url=' . zrl($Blink) . ']' . $Bname . '[/url]';
+               if ($Bphoto!="") $Bphoto = '[url=' . zrl($Blink) . '][img=80x80]' . $Bphoto . '[/img][/url]';
+
+               // we can't have a translation string with three positions but no distinguishable text
+               // So here is the translate string.
+
+               $txt = t('%1$s poked %2$s');
+
+               // now translate the verb
+
+               $txt = str_replace( t('poked'), t($verb), $txt);
+
+               // then do the sprintf on the translation string
+
+               $item['body'] = sprintf($txt, $A, $B). "\n\n\n" . $Bphoto;
+
+       }
     if ($item['verb']===ACTIVITY_TAG){
                $r = q("SELECT * from `item`,`contact` WHERE 
                `item`.`contact-id`=`contact`.`id` AND `item`.`uri`='%s';",
@@ -174,6 +278,25 @@ function localize_item(&$item){
                }
        }
 
+       // add zrl's to public images
+       if(preg_match_all('/\[url=(.*?)\/photos\/(.*?)\/image\/(.*?)\]\[img(.*?)\]h(.*?)\[\/img\]\[\/url\]/is',$item['body'],$matches,PREG_SET_ORDER)) {
+               foreach($matches as $mtch) {
+                               $item['body'] = str_replace($mtch[0],'[url=' . zrl($mtch[1] . '/photos/' . $mtch[2] . '/image/' . $mtch[3] ,true) . '][img' . $mtch[4] . ']h' . $mtch[5]  . '[/img][/url]',$item['body']);
+               }
+       }
+
+       // add sparkle links to appropriate permalinks
+
+       $x = stristr($item['plink'],'/display/');
+       if($x) {
+               $sparkle = false;
+               $y = best_link_url($item,$sparkle,true);
+               if(strstr($y,'/redir/'))
+                       $item['plink'] = $y . '?f=&url=' . $item['plink'];
+       } 
+
+
+
 }
 
 /**
@@ -278,6 +401,9 @@ function conversation(&$a, $items, $mode, $update, $preview = false) {
                                else
                                        $nickname = $a->user['nickname'];
                                
+                               // prevent private email from leaking.
+                               if($item['network'] === NETWORK_MAIL && local_user() != $item['uid'])
+                                               continue;
                        
                                $profile_name   = ((strlen($item['author-name']))   ? $item['author-name']   : $item['name']);
                                if($item['author-link'] && (! $item['author-name']))
@@ -298,7 +424,7 @@ function conversation(&$a, $items, $mode, $update, $preview = false) {
                                if(($normalised != 'mailbox') && (x($a->contacts[$normalised])))
                                        $profile_avatar = $a->contacts[$normalised]['thumb'];
                                else
-                                       $profile_avatar = ((strlen($item['author-avatar'])) ? $item['author-avatar'] : $item['thumb']);
+                                       $profile_avatar = ((strlen($item['author-avatar'])) ? $a->get_cached_avatar_image($item['author-avatar']) : $item['thumb']);
 
                                $locate = array('location' => $item['location'], 'coord' => $item['coord'], 'html' => '');
                                call_hooks('render_location',$locate);
@@ -342,7 +468,6 @@ function conversation(&$a, $items, $mode, $update, $preview = false) {
                                        'body' => template_escape($body),
                                        'text' => strip_tags(template_escape($body)),
                                        'ago' => (($item['app']) ? sprintf( t('%s from %s'),relative_date($item['created']),$item['app']) : relative_date($item['created'])),
-                                       'lock' => $lock,
                                        'location' => template_escape($location),
                                        'indent' => '',
                                        'owner_name' => template_escape($owner_name),
@@ -400,6 +525,7 @@ function conversation(&$a, $items, $mode, $update, $preview = false) {
                        }
 
                        $comments_collapsed = false;
+                       $comments_seen = 0;
                        $comment_lastcollapsed = false;
                        $comment_firstcollapsed = false;
                        $blowhard = 0;
@@ -422,7 +548,7 @@ function conversation(&$a, $items, $mode, $update, $preview = false) {
                                        continue;
 
                                $toplevelpost = (($item['id'] == $item['parent']) ? true : false);
-                               $toplevelprivate = false;
+
 
                                // Take care of author collapsing and comment collapsing
                                // (author collapsing is currently disabled)
@@ -430,7 +556,7 @@ function conversation(&$a, $items, $mode, $update, $preview = false) {
                                // If there are more than two comments, squash all but the last 2.
                        
                                if($toplevelpost) {
-                                       $toplevelprivate = (($toplevelpost && $item['private']) ? true : false);
+
                                        $item_writeable = (($item['writable'] || $item['self']) ? true : false);
 
                                        $comments_seen = 0;
@@ -447,8 +573,8 @@ function conversation(&$a, $items, $mode, $update, $preview = false) {
                                else {
 
                                        // prevent private email reply to public conversation from leaking.
-                                       if($item['private'] && ! $threads[$threadsid]['private'])
-                                               continue;
+                                       if($item['network'] === NETWORK_MAIL && local_user() != $item['uid'])
+                                                       continue;
 
                                        $comments_seen ++;
                                        $comment_lastcollapsed  = false;
@@ -475,7 +601,7 @@ function conversation(&$a, $items, $mode, $update, $preview = false) {
 
                                $redirect_url = $a->get_baseurl($ssl_state) . '/redir/' . $item['cid'] ;
 
-                               $lock = ((($item['private']) || (($item['uid'] == local_user()) && (strlen($item['allow_cid']) || strlen($item['allow_gid']) 
+                               $lock = ((($item['private'] == 1) || (($item['uid'] == local_user()) && (strlen($item['allow_cid']) || strlen($item['allow_gid']) 
                                        || strlen($item['deny_cid']) || strlen($item['deny_gid']))))
                                        ? t('Private Message')
                                        : false);
@@ -492,7 +618,7 @@ function conversation(&$a, $items, $mode, $update, $preview = false) {
 
                                                // On the network page, I am the owner. On the display page it will be the profile owner.
                                                // This will have been stored in $a->page_contact by our calling page.
-                                               // Put this person on the left of the wall-to-wall notice.
+                                               // Put this person as the wall owner of the wall-to-wall notice.
 
                                                $owner_url = zrl($a->page_contact['url']);
                                                $owner_photo = $a->page_contact['thumb'];
@@ -500,37 +626,52 @@ function conversation(&$a, $items, $mode, $update, $preview = false) {
                                                $template = $wallwall;
                                                $commentww = 'ww';      
                                        }
-                                       if((! $item['wall']) && (strlen($item['owner-link'])) && (! link_compare($item['owner-link'],$item['author-link']))) {
-
-                                               // Could be anybody. 
 
-                                               $owner_url = $item['owner-link'];
-                                               $owner_photo = $item['owner-avatar'];
-                                               $owner_name = $item['owner-name'];
-                                               $template = $wallwall;
-                                               $commentww = 'ww';
-                                               // If it is our contact, use a friendly redirect link
-                                               if((link_compare($item['owner-link'],$item['url'])) 
-                                                       && ($item['network'] === NETWORK_DFRN)) {
-                                                       $owner_url = $redirect_url;
-                                                       $osparkle = ' sparkle';
+                                       if((! $item['wall']) && $item['owner-link']) {
+
+                                               $owner_linkmatch = (($item['owner-link']) && link_compare($item['owner-link'],$item['author-link']));
+                                               $alias_linkmatch = (($item['alias']) && link_compare($item['alias'],$item['author-link']));
+                                               $owner_namematch = (($item['owner-name']) && $item['owner-name'] == $item['author-name']);
+                                               if((! $owner_linkmatch) && (! $alias_linkmatch) && (! $owner_namematch)) {
+
+                                                       // The author url doesn't match the owner (typically the contact)
+                                                       // and also doesn't match the contact alias. 
+                                                       // The name match is a hack to catch several weird cases where URLs are 
+                                                       // all over the park. It can be tricked, but this prevents you from
+                                                       // seeing "Bob Smith to Bob Smith via Wall-to-wall" and you know darn
+                                                       // well that it's the same Bob Smith. 
+
+                                                       // But it could be somebody else with the same name. It just isn't highly likely. 
+                                                       
+
+                                                       $owner_url = $item['owner-link'];
+                                                       $owner_photo = $item['owner-avatar'];
+                                                       $owner_name = $item['owner-name'];
+                                                       $template = $wallwall;
+                                                       $commentww = 'ww';
+                                                       // If it is our contact, use a friendly redirect link
+                                                       if((link_compare($item['owner-link'],$item['url'])) 
+                                                               && ($item['network'] === NETWORK_DFRN)) {
+                                                               $owner_url = $redirect_url;
+                                                               $osparkle = ' sparkle';
+                                                       }
+                                                       else
+                                                               $owner_url = zrl($owner_url);
                                                }
-                                               else
-                                                       $owner_url = zrl($owner_url);
                                        }
                                }
 
                                $likebuttons = '';
-                               $shareable = ((($profile_owner == local_user()) &&  (! $item['private'])) ? true : false); //($mode != 'display') &&
+                               $shareable = ((($profile_owner == local_user()) && ($item['private'] != 1)) ? true : false); 
 
                                if($page_writeable) {
-                                       if($toplevelpost) {
+/*                                     if($toplevelpost) {  */
                                                $likebuttons = array(
                                                        'like' => array( t("I like this \x28toggle\x29"), t("like")),
                                                        'dislike' => array( t("I don't like this \x28toggle\x29"), t("dislike")),
                                                );
                                                if ($shareable) $likebuttons['share'] = array( t('Share this'), t('share'));
-                                       }
+/*                                     } */
 
                                        $qc = $qcomment =  null;
 
@@ -553,16 +694,24 @@ function conversation(&$a, $items, $mode, $update, $preview = false) {
                                                        '$myphoto' => $a->contact['thumb'],
                                                        '$comment' => t('Comment'),
                                                        '$submit' => t('Submit'),
+                                                       '$edbold' => t('Bold'),
+                                                       '$editalic' => t('Italic'),
+                                                       '$eduline' => t('Underline'),
+                                                       '$edquote' => t('Quote'),
+                                                       '$edcode' => t('Code'),
+                                                       '$edimg' => t('Image'),
+                                                       '$edurl' => t('Link'),
+                                                       '$edvideo' => t('Video'),
                                                        '$preview' => t('Preview'),
                                                        '$ww' => (($mode === 'network') ? $commentww : '')
                                                ));
                                        }
                                }
 
-                               $edpost = (((($profile_owner == local_user()) && ($toplevelpost) && (intval($item['wall']) == 1)) || ($mode === 'notes'))
-                                               ? array($a->get_baseurl($ssl_state)."/editpost/".$item['id'], t("Edit"))
-                                               : False);
-
+                               if(local_user() && link_compare($a->contact['url'],$item['author-link']))
+                                       $edpost = array($a->get_baseurl($ssl_state)."/editpost/".$item['id'], t("Edit"));
+                               else
+                                       $edpost = false;
 
                                $drop = '';
                                $dropping = false;
@@ -624,10 +773,10 @@ function conversation(&$a, $items, $mode, $update, $preview = false) {
                                if(($normalised != 'mailbox') && (x($a->contacts,$normalised)))
                                        $profile_avatar = $a->contacts[$normalised]['thumb'];
                                else
-                                       $profile_avatar = (((strlen($item['author-avatar'])) && $diff_author) ? $item['author-avatar'] : $thumb);
+                                       $profile_avatar = (((strlen($item['author-avatar'])) && $diff_author) ? $item['author-avatar'] : $a->get_cached_avatar_image($thumb));
 
-                               $like    = ((x($alike,$item['id'])) ? format_like($alike[$item['id']],$alike[$item['id'] . '-l'],'like',$item['id']) : '');
-                               $dislike = ((x($dlike,$item['id'])) ? format_like($dlike[$item['id']],$dlike[$item['id'] . '-l'],'dislike',$item['id']) : '');
+                               $like    = ((x($alike,$item['uri'])) ? format_like($alike[$item['uri']],$alike[$item['uri'] . '-l'],'like',$item['uri']) : '');
+                               $dislike = ((x($dlike,$item['uri'])) ? format_like($dlike[$item['uri']],$dlike[$item['uri'] . '-l'],'dislike',$item['uri']) : '');
 
                                $locate = array('location' => $item['location'], 'coord' => $item['coord'], 'html' => '');
                                call_hooks('render_location',$locate);
@@ -666,7 +815,7 @@ function conversation(&$a, $items, $mode, $update, $preview = false) {
                                        'text' => strip_tags(template_escape($body)),
                                        'id' => $item['item_id'],
                                        'linktitle' => sprintf( t('View %s\'s profile @ %s'), $profile_name, ((strlen($item['author-link'])) ? $item['author-link'] : $item['url'])),
-                                       'olinktitle' => sprintf( t('View %s\'s profile @ %s'), $profile_name, ((strlen($item['owner-link'])) ? $item['owner-link'] : $item['url'])),
+                                       'olinktitle' => sprintf( t('View %s\'s profile @ %s'), $owner-name, ((strlen($item['owner-link'])) ? $item['owner-link'] : $item['url'])),
                                        'to' => t('to'),
                                        'wall' => t('Wall-to-Wall'),
                                        'vwall' => t('via Wall-To-Wall:'),
@@ -709,7 +858,7 @@ function conversation(&$a, $items, $mode, $update, $preview = false) {
        }
 
        $page_template = get_markup_template("conversation.tpl");
-       $o .= replace_macros($page_template, array(
+       $o = replace_macros($page_template, array(
                '$baseurl' => $a->get_baseurl($ssl_state),
                '$mode' => $mode,
                '$user' => $a->user,
@@ -761,6 +910,7 @@ function item_photo_menu($item){
                 if(! count($a->contacts))
                        load_contact_links(local_user());
        }
+       $poke_link="";
        $contact_url="";
        $pm_url="";
        $status_link="";
@@ -790,6 +940,7 @@ function item_photo_menu($item){
                }
        }
        if(($cid) && (! $item['self'])) {
+               $poke_link = $a->get_baseurl($ssl_state) . '/poke/?f=&c=' . $cid;
                $contact_url = $a->get_baseurl($ssl_state) . '/contacts/' . $cid;
                $posts_link = $a->get_baseurl($ssl_state) . '/network/?cid=' . $cid;
 
@@ -806,12 +957,13 @@ function item_photo_menu($item){
        }
 
        $menu = Array(
-               t("View status") => $status_link,
-               t("View profile") => $profile_link,
-               t("View photos") => $photos_link,
-               t("View recent") => $posts_link, 
-               t("Edit contact") => $contact_url,
+               t("View Status") => $status_link,
+               t("View Profile") => $profile_link,
+               t("View Photos") => $photos_link,
+               t("Network Posts") => $posts_link, 
+               t("Edit Contact") => $contact_url,
                t("Send PM") => $pm_url,
+               t("Poke") => $poke_link
        );
        
        
@@ -823,7 +975,7 @@ function item_photo_menu($item){
 
        $o = "";
        foreach($menu as $k=>$v){
-               if ($v!="") $o .= "<li><a href='$v'>$k</a></li>\n";
+               if ($v!="") $o .= "<li><a href=\"$v\">$k</a></li>\n";
        }
        return $o;
 }}
@@ -843,13 +995,17 @@ function like_puller($a,$item,&$arr,$mode) {
                }
                else
                        $url = zrl($url);
-               if(! ((isset($arr[$item['parent'] . '-l'])) && (is_array($arr[$item['parent'] . '-l']))))
-                       $arr[$item['parent'] . '-l'] = array();
-               if(! isset($arr[$item['parent']]))
-                       $arr[$item['parent']] = 1;
+
+               if(! $item['thr-parent'])
+                       $item['thr-parent'] = $item['parent-uri'];
+
+               if(! ((isset($arr[$item['thr-parent'] . '-l'])) && (is_array($arr[$item['thr-parent'] . '-l']))))
+                       $arr[$item['thr-parent'] . '-l'] = array();
+               if(! isset($arr[$item['thr-parent']]))
+                       $arr[$item['thr-parent']] = 1;
                else    
-                       $arr[$item['parent']] ++;
-               $arr[$item['parent'] . '-l'][] = '<a href="'. $url . '"'. $sparkle .'>' . $item['author-name'] . '</a>';
+                       $arr[$item['thr-parent']] ++;
+               $arr[$item['thr-parent'] . '-l'][] = '<a href="'. $url . '"'. $sparkle .'>' . $item['author-name'] . '</a>';
        }
        return;
 }}
@@ -951,7 +1107,7 @@ function status_editor($a,$x, $notes_cid = 0, $popup=false) {
        $tpl = replace_macros($tpl,array('$jotplugins' => $jotplugins));        
 
        $o .= replace_macros($tpl,array(
-               '$return_path' => $a->cmd,
+               '$return_path' => $a->query_string,
                '$action' =>  $a->get_baseurl(true) . '/item',
                '$share' => (x($x,'button') ? $x['button'] : t('Share')),
                '$upload' => t('Upload photo'),
@@ -1074,7 +1230,6 @@ function find_thread_parent_index($arr,$x) {
 }
 
 function render_location_google($item) {
-       $location = '';
        $location = (($item['location']) ? '<a target="map" title="' . $item['location'] . '" href="http://maps.google.com/?q=' . urlencode($item['location']) . '">' . $item['location'] . '</a>' : '');
        $coord = (($item['coord']) ? '<a target="map" title="' . $item['coord'] . '" href="http://maps.google.com/?q=' . urlencode($item['coord']) . '">' . $item['coord'] . '</a>' : '');
        if($coord) {