]> git.mxchange.org Git - friendica-addons.git/blobdiff - statusnet/statusnet.php
fromgplus: Initial working version
[friendica-addons.git] / statusnet / statusnet.php
index 5f9800672ff3955a453a66b24697bde375ba51d5..09d01c4f4e4e1fadbd4befe3c9b0b9a7a96a6b25 100755 (executable)
@@ -342,7 +342,7 @@ function statusnet_settings(&$a,&$s) {
                        $s .= '<label id="statusnet-default-label" for="statusnet-default">'. t('Send public postings to StatusNet by default') .'</label>';
                        $s .= '<input id="statusnet-default" type="checkbox" name="statusnet-default" value="1" ' . $defchecked . '/>';
                        $s .= '<div class="clear"></div>';
-                        $s .= '<label id="statusnet-sendtaglinks-label" for="statusnet-sendtaglinks">'.t('Send #tag links to StatusNet').'</label>';
+                        $s .= '<label id="statusnet-sendtaglinks-label" for="statusnet-sendtaglinks">'.t('Send linked #-tags and @-names to StatusNet').'</label>';
                         $s .= '<input id="statusnet-sendtaglinks" type="checkbox" name="statusnet-sendtaglinks" value="1" '. $linkschecked . '/>';
                        $s .= '</div><div class="clear"></div>';
 
@@ -404,6 +404,110 @@ function short_link($url) {
     return $slinky->short();
 } };
 
+function statusnet_shortenmsg($b, $max_char) {
+       require_once("include/bbcode.php");
+       require_once("include/html2plain.php");
+
+       // Looking for the first image
+       $image = '';
+       if(preg_match("/\[img\=([0-9]*)x([0-9]*)\](.*?)\[\/img\]/is",$b['body'],$matches))
+               $image = $matches[3];
+
+       if ($image == '')
+               if(preg_match("/\[img\](.*?)\[\/img\]/is",$b['body'],$matches))
+                       $image = $matches[1];
+
+       $multipleimages = (strpos($b['body'], "[img") != strrpos($b['body'], "[img"));
+
+       // When saved into the database the content is sent through htmlspecialchars
+       // That means that we have to decode all image-urls
+       $image = htmlspecialchars_decode($image);
+
+       $body = $b["body"];
+       if ($b["title"] != "")
+               $body = $b["title"]."\n\n".$body;
+
+       // remove the recycle signs and the names since they aren't helpful on twitter
+       // recycle 1
+       $recycle = html_entity_decode("&#x2672; ", ENT_QUOTES, 'UTF-8');
+       $body = preg_replace( '/'.$recycle.'\[url\=(\w+.*?)\](\w+.*?)\[\/url\]/i', "\n", $body);
+       // recycle 2 (Test)
+       $recycle = html_entity_decode("&#x25CC; ", ENT_QUOTES, 'UTF-8');
+       $body = preg_replace( '/'.$recycle.'\[url\=(\w+.*?)\](\w+.*?)\[\/url\]/i', "\n", $body);
+
+       // At first convert the text to html
+       $html = bbcode($body, false, false);
+
+       // Then convert it to plain text
+       //$msg = trim($b['title']." \n\n".html2plain($html, 0, true));
+       $msg = trim(html2plain($html, 0, true));
+       $msg = html_entity_decode($msg,ENT_QUOTES,'UTF-8');
+
+       // Removing multiple newlines
+       while (strpos($msg, "\n\n\n") !== false)
+               $msg = str_replace("\n\n\n", "\n\n", $msg);
+
+       // Removing multiple spaces
+       while (strpos($msg, "  ") !== false)
+               $msg = str_replace("  ", " ", $msg);
+
+       // Removing URLs
+       $msg = preg_replace('/(https?\:\/\/[a-zA-Z0-9\:\/\-\?\&\;\.\=\_\~\#\%\$\!\+\,]+)/i', "", $msg);
+
+       $msg = trim($msg);
+
+       $link = '';
+       // look for bookmark-bbcode and handle it with priority
+       if(preg_match("/\[bookmark\=([^\]]*)\](.*?)\[\/bookmark\]/is",$b['body'],$matches))
+               $link = $matches[1];
+
+       $multiplelinks = (strpos($b['body'], "[bookmark") != strrpos($b['body'], "[bookmark"));
+
+       // If there is no bookmark element then take the first link
+       if ($link == '') {
+               $links = collecturls($html);
+               if (sizeof($links) > 0) {
+                       reset($links);
+                       $link = current($links);
+               }
+               $multiplelinks = (sizeof($links) > 1);
+       }
+
+       $msglink = "";
+       if ($multiplelinks)
+               $msglink = $b["plink"];
+       else if ($link != "")
+               $msglink = $link;
+       else if ($multipleimages)
+               $msglink = $b["plink"];
+       else if ($image != "")
+               $msglink = $image;
+
+       if (($msglink == "") and strlen($msg) > $max_char)
+               $msglink = $b["plink"];
+
+       if (strlen($msglink) > 20)
+               $msglink = short_link($msglink);
+
+       if (strlen(trim($msg." ".$msglink)) > $max_char) {
+               $msg = substr($msg, 0, $max_char - (strlen($msglink)));
+               $lastchar = substr($msg, -1);
+               $msg = substr($msg, 0, -1);
+               $pos = strrpos($msg, "\n");
+               if ($pos > 0)
+                       $msg = substr($msg, 0, $pos);
+               else if ($lastchar != "\n")
+                       $msg = substr($msg, 0, -3)."...";
+       }
+       $msg = str_replace("\n", " ", $msg);
+
+       // Removing multiple spaces - again
+       while (strpos($msg, "  ") !== false)
+               $msg = str_replace("  ", " ", $msg);
+
+       return(array("msg"=>trim($msg." ".$msglink), "image"=>$image));
+}
+
 function statusnet_post_hook(&$a,&$b) {
 
        /**
@@ -426,72 +530,115 @@ function statusnet_post_hook(&$a,&$b) {
 
        if($ckey && $csecret && $otoken && $osecret) {
 
-               require_once('include/bbcode.php');     
+               require_once('include/bbcode.php');
                $dent = new StatusNetOAuth($api,$ckey,$csecret,$otoken,$osecret);
                 $max_char = $dent->get_maxlength(); // max. length for a dent
                 // we will only work with up to two times the length of the dent 
-                // we can later send to StatusNet. This way we can "gain" some 
-                // information during shortening of potential links but do not 
+                // we can later send to StatusNet. This way we can "gain" some
+                // information during shortening of potential links but do not
                 // shorten all the links in a 200000 character long essay.
-                if (! $b['title']=='') {
-                    $tmp = $b['title'] . ' : '. $b['body'];
-//                    $tmp = substr($tmp, 0, 4*$max_char);
-                } else {
-                    $tmp = $b['body'] // substr($b['body'], 0, 3*$max_char);
-                }
-                // if [url=bla][img]blub.png[/img][/url] get blub.png
-                $tmp = preg_replace( '/\[url\=(https?\:\/\/[a-zA-Z0-9\:\/\-\?\&\;\.\=\_\~\#\%\$\!\+\,]+)\]\[img\](\\w+.*?)\\[\\/img\]\\[\\/url\]/i', '$2', $tmp);
-                // preserve links to images, videos and audios
-                $tmp = preg_replace( '/\[img\=([0-9]*)x([0-9]*)\](.*?)\[\/img\]/ism', '$3', $tmp);
-                $tmp = preg_replace( '/\[\\/?img(\\s+.*?\]|\])/i', '', $tmp);
-                $tmp = preg_replace( '/\[\\/?video(\\s+.*?\]|\])/i', '', $tmp);
-                $tmp = preg_replace( '/\[\\/?youtube(\\s+.*?\]|\])/i', '', $tmp);
-                $tmp = preg_replace( '/\[\\/?vimeo(\\s+.*?\]|\])/i', '', $tmp);
-                $tmp = preg_replace( '/\[\\/?audio(\\s+.*?\]|\])/i', '', $tmp);
-                $linksenabled = get_pconfig($b['uid'],'statusnet','post_taglinks');
-                // if a #tag is linked, don't send the [url] over to SN
-                // that is, don't send if the option is not set in the 
-                // connector settings
-                if ($linksenabled=='0') {
-                    $tmp = preg_replace( '/#\[url\=(\w+.*?)\](\w+.*?)\[\/url\]/i', '#$2', $tmp);
-                }
-                // preserve links to webpages
-                $tmp = preg_replace( '/\[url\=(https?\:\/\/[a-zA-Z0-9\:\/\-\?\&\;\.\=\_\~\#\%\$\!\+\,]+)\](\w+.*?)\[\/url\]/i', '$2 $1', $tmp);
-                $tmp = preg_replace( '/\[bookmark\=(https?\:\/\/[a-zA-Z0-9\:\/\-\?\&\;\.\=\_\~\#\%\$\!\+\,]+)\](\w+.*?)\[\/bookmark\]/i', '$2 $1', $tmp);
-                // find all http or https links in the body of the entry and 
-                // apply the shortener if the link is longer then 20 characters 
-                if (( strlen($tmp)>$max_char ) && ( $max_char > 0 )) {
-                    preg_match_all ( '/(https?\:\/\/[a-zA-Z0-9\:\/\-\?\&\;\.\=\_\~\#\%\$\!\+\,]+)/i', $tmp, $allurls  );
-                    foreach ($allurls as $url) {
-                        foreach ($url as $u) {
-                            if (strlen($u)>20) {
-                                $sl = short_link($u);
-                                $tmp = str_replace( $u, $sl, $tmp );
-                            }
-                        }
+
+               $tempfile = "";
+               $intelligent_shortening = get_config('statusnet','intelligent_shortening');
+               if (!$intelligent_shortening) {
+                       if (! $b['title']=='') {
+                               $tmp = $b['title'].": \n".$b['body'];
+       //                    $tmp = substr($tmp, 0, 4*$max_char);
+                       } else {
+                           $tmp = $b['body']; // substr($b['body'], 0, 3*$max_char);
+                       }
+                       // if [url=bla][img]blub.png[/img][/url] get blub.png
+                       $tmp = preg_replace( '/\[url\=(https?\:\/\/[a-zA-Z0-9\:\/\-\?\&\;\.\=\_\~\#\%\$\!\+\,]+)\]\[img\](\\w+.*?)\\[\\/img\]\\[\\/url\]/i', '$2', $tmp);
+                       // preserve links to images, videos and audios
+                       $tmp = preg_replace( '/\[img\=([0-9]*)x([0-9]*)\](.*?)\[\/img\]/ism', '$3', $tmp);
+                       $tmp = preg_replace( '/\[\\/?img(\\s+.*?\]|\])/i', '', $tmp);
+                       $tmp = preg_replace( '/\[\\/?video(\\s+.*?\]|\])/i', '', $tmp);
+                       $tmp = preg_replace( '/\[\\/?youtube(\\s+.*?\]|\])/i', '', $tmp);
+                       $tmp = preg_replace( '/\[\\/?vimeo(\\s+.*?\]|\])/i', '', $tmp);
+                       $tmp = preg_replace( '/\[\\/?audio(\\s+.*?\]|\])/i', '', $tmp);
+                       $linksenabled = get_pconfig($b['uid'],'statusnet','post_taglinks');
+                       // if a #tag is linked, don't send the [url] over to SN
+                       // that is, don't send if the option is not set in the 
+                       // connector settings
+                       if ($linksenabled=='0') {
+                               // #-tags
+                               $tmp = preg_replace( '/#\[url\=(\w+.*?)\](\w+.*?)\[\/url\]/i', '#$2', $tmp);
+                               // @-mentions
+                               $tmp = preg_replace( '/@\[url\=(\w+.*?)\](\w+.*?)\[\/url\]/i', '@$2', $tmp);
+                               // recycle 1
+                               $recycle = html_entity_decode("&#x2672; ", ENT_QUOTES, 'UTF-8');
+                               $tmp = preg_replace( '/'.$recycle.'\[url\=(\w+.*?)\](\w+.*?)\[\/url\]/i', $recycle.'$2', $tmp);
+                               // recycle 2 (test)
+                               $recycle = html_entity_decode("&#x25CC; ", ENT_QUOTES, 'UTF-8');
+                               $tmp = preg_replace( '/'.$recycle.'\[url\=(\w+.*?)\](\w+.*?)\[\/url\]/i', $recycle.'$2', $tmp);
+                       }
+                       // preserve links to webpages
+                       $tmp = preg_replace( '/\[url\=(https?\:\/\/[a-zA-Z0-9\:\/\-\?\&\;\.\=\_\~\#\%\$\!\+\,]+)\](\w+.*?)\[\/url\]/i', '$2 $1', $tmp);
+                       $tmp = preg_replace( '/\[bookmark\=(https?\:\/\/[a-zA-Z0-9\:\/\-\?\&\;\.\=\_\~\#\%\$\!\+\,]+)\](\w+.*?)\[\/bookmark\]/i', '$2 $1', $tmp);
+                       // find all http or https links in the body of the entry and 
+                       // apply the shortener if the link is longer then 20 characters 
+                       if (( strlen($tmp)>$max_char ) && ( $max_char > 0 )) {
+                           preg_match_all ( '/(https?\:\/\/[a-zA-Z0-9\:\/\-\?\&\;\.\=\_\~\#\%\$\!\+\,]+)/i', $tmp, $allurls  );
+                           foreach ($allurls as $url) {
+                               foreach ($url as $u) {
+                                   if (strlen($u)>20) {
+                                       $sl = short_link($u);
+                                       $tmp = str_replace( $u, $sl, $tmp );
+                                   }
+                               }
+                           }
+                       }
+                       // ok, all the links we want to send out are save, now strip 
+                       // away the remaining bbcode
+                       //$msg = strip_tags(bbcode($tmp, false, false));
+                       $msg = bbcode($tmp, false, false);
+                       $msg = str_replace(array('<br>','<br />'),"\n",$msg);
+                       $msg = strip_tags($msg);
+
+                       // quotes not working - let's try this
+                       $msg = html_entity_decode($msg);
+
+                       if (( strlen($msg) > $max_char) && $max_char > 0) {
+                               $shortlink = short_link( $b['plink'] );
+                               // the new message will be shortened such that "... $shortlink"
+                               // will fit into the character limit
+                               $msg = nl2br(substr($msg, 0, $max_char-strlen($shortlink)-4));
+                               $msg = str_replace(array('<br>','<br />'),' ',$msg);
+                               $e = explode(' ', $msg);
+                               //  remove the last word from the cut down message to 
+                               //  avoid sending cut words to the MicroBlog
+                               array_pop($e);
+                               $msg = implode(' ', $e);
+                               $msg .= '... ' . $shortlink;
+                       }
+
+                       $msg = trim($msg);
+                       $postdata = array('status' => $msg);
+               } else {
+                       $msgarr = statusnet_shortenmsg($b, $max_char);
+                       $msg = $msgarr["msg"];
+                       $image = $msgarr["image"];
+                       if ($image != "") {
+                               $imagedata = file_get_contents($image);
+                               $tempfile = tempnam(get_config("system","temppath"), "upload");
+                               file_put_contents($tempfile, $imagedata);
+                               $postdata = array("status"=>$msg, "media"=>"@".$tempfile);
+                       } else
+                               $postdata = array("status"=>$msg);
+               }
+
+               // and now dent it :-)
+               if(strlen($msg)) {
+                    //$result = $dent->post('statuses/update', array('status' => $msg));
+                    $result = $dent->post('statuses/update', $postdata);
+                    logger('statusnet_post send, result: ' . print_r($result, true).
+                           "\nmessage: ".$msg, LOGGER_DEBUG."\nOriginal post: ".print_r($b)."\nPost Data: ".print_r($postdata));
+                    if ($result->error) {
+                        logger('Send to StatusNet failed: "' . $result->error . '"');
                     }
                 }
-                // ok, all the links we want to send out are save, now strip 
-                // away the remaining bbcode
-               $msg = strip_tags(bbcode($tmp));
-               // quotes not working - let's try this
-               $msg = html_entity_decode($msg);
-               if (( strlen($msg) > $max_char) && $max_char > 0) {
-                       $shortlink = short_link( $b['plink'] );
-                       // the new message will be shortened such that "... $shortlink"
-                       // will fit into the character limit
-                       $msg = nl2br(substr($msg, 0, $max_char-strlen($shortlink)-4));
-                        $msg = str_replace(array('<br>','<br />'),' ',$msg);
-                        $e = explode(' ', $msg);
-                        //  remove the last word from the cut down message to 
-                        //  avoid sending cut words to the MicroBlog
-                        array_pop($e);
-                        $msg = implode(' ', $e);
-                       $msg .= '... ' . $shortlink;
-               }
-               // and now tweet it :-)
-               if(strlen($msg))
-                       $dent->post('statuses/update', array('status' => $msg));
+               if ($tempfile != "")
+                       unlink($tempfile);
        }
 }