]> git.mxchange.org Git - friendica-addons.git/blobdiff - statusnet/statusnet.php
Merge pull request #223 from annando/1410-application-name
[friendica-addons.git] / statusnet / statusnet.php
index fd9c7b1ac34a9ef5d49518c588834c2f45a64959..7d0f80c3c5e8d98afa2357af7c089c4997c45b76 100644 (file)
@@ -118,6 +118,7 @@ function statusnet_install() {
        register_hook('post_local', 'addon/statusnet/statusnet.php', 'statusnet_post_local');
        register_hook('jot_networks',    'addon/statusnet/statusnet.php', 'statusnet_jot_nets');
        register_hook('cron', 'addon/statusnet/statusnet.php', 'statusnet_cron');
+       register_hook('prepare_body', 'addon/statusnet/statusnet.php', 'statusnet_prepare_body');
        logger("installed statusnet");
 }
 
@@ -129,6 +130,7 @@ function statusnet_uninstall() {
        unregister_hook('post_local', 'addon/statusnet/statusnet.php', 'statusnet_post_local');
        unregister_hook('jot_networks',    'addon/statusnet/statusnet.php', 'statusnet_jot_nets');
        unregister_hook('cron', 'addon/statusnet/statusnet.php', 'statusnet_cron');
+       unregister_hook('prepare_body', 'addon/statusnet/statusnet.php', 'statusnet_prepare_body');
 
        // old setting - remove only
        unregister_hook('post_local_end', 'addon/statusnet/statusnet.php', 'statusnet_post_hook');
@@ -168,13 +170,11 @@ function statusnet_settings_post ($a,$post) {
                del_pconfig(local_user(), 'statusnet', 'oauthtoken');
                del_pconfig(local_user(), 'statusnet', 'oauthsecret');
                del_pconfig(local_user(), 'statusnet', 'baseapi');
-               del_pconfig(local_user(), 'statusnet', 'post_taglinks');
                del_pconfig(local_user(), 'statusnet', 'lastid');
                del_pconfig(local_user(), 'statusnet', 'mirror_posts');
-               del_pconfig(local_user(), 'statusnet', 'intelligent_shortening');
                del_pconfig(local_user(), 'statusnet', 'import');
-               del_pconfig(local_user(), 'statusnet', 'create_user');
-               del_pconfig(local_user(), 'statusnet', 'own_id');
+               del_pconfig(local_user(), 'statusnet', 'create_user');
+               del_pconfig(local_user(), 'statusnet', 'own_id');
        } else {
        if (isset($_POST['statusnet-preconf-apiurl'])) {
                /***
@@ -249,11 +249,13 @@ function statusnet_settings_post ($a,$post) {
                //  to post a dent for every new __public__ posting to the wall
                set_pconfig(local_user(),'statusnet','post',intval($_POST['statusnet-enable']));
                set_pconfig(local_user(),'statusnet','post_by_default',intval($_POST['statusnet-default']));
-               set_pconfig(local_user(),'statusnet','post_taglinks',intval($_POST['statusnet-sendtaglinks']));
                set_pconfig(local_user(), 'statusnet', 'mirror_posts', intval($_POST['statusnet-mirror']));
-               set_pconfig(local_user(), 'statusnet', 'intelligent_shortening', intval($_POST['statusnet-shortening']));
                set_pconfig(local_user(), 'statusnet', 'import', intval($_POST['statusnet-import']));
                set_pconfig(local_user(), 'statusnet', 'create_user', intval($_POST['statusnet-create_user']));
+
+               if (!intval($_POST['statusnet-mirror']))
+                       del_pconfig(local_user(),'statusnet','lastid');
+
                info( t('StatusNet settings updated.') . EOL);
        }}}}
 }
@@ -268,34 +270,29 @@ function statusnet_settings(&$a,&$s) {
         * 3) Checkbox for "Send public notices (respect size limitation)
         */
        $api     = get_pconfig(local_user(), 'statusnet', 'baseapi');
-       $ckey    = get_pconfig(local_user(), 'statusnet', 'consumerkey' );
-       $csecret = get_pconfig(local_user(), 'statusnet', 'consumersecret' );
-       $otoken  = get_pconfig(local_user(), 'statusnet', 'oauthtoken'  );
-       $osecret = get_pconfig(local_user(), 'statusnet', 'oauthsecret' );
+       $ckey    = get_pconfig(local_user(), 'statusnet', 'consumerkey');
+       $csecret = get_pconfig(local_user(), 'statusnet', 'consumersecret');
+       $otoken  = get_pconfig(local_user(), 'statusnet', 'oauthtoken');
+       $osecret = get_pconfig(local_user(), 'statusnet', 'oauthsecret');
        $enabled = get_pconfig(local_user(), 'statusnet', 'post');
        $checked = (($enabled) ? ' checked="checked" ' : '');
        $defenabled = get_pconfig(local_user(),'statusnet','post_by_default');
        $defchecked = (($defenabled) ? ' checked="checked" ' : '');
-       $linksenabled = get_pconfig(local_user(),'statusnet','post_taglinks');
-       $linkschecked = (($linksenabled) ? ' checked="checked" ' : '');
        $mirrorenabled = get_pconfig(local_user(),'statusnet','mirror_posts');
        $mirrorchecked = (($mirrorenabled) ? ' checked="checked" ' : '');
-       $shorteningenabled = get_pconfig(local_user(),'statusnet','intelligent_shortening');
-       $shorteningchecked = (($shorteningenabled) ? ' checked="checked" ' : '');
        $importenabled = get_pconfig(local_user(),'statusnet','import');
-        $importchecked = (($importenabled) ? ' checked="checked" ' : '');
-        $create_userenabled = get_pconfig(local_user(),'statusnet','create_user');
-        $create_userchecked = (($create_userenabled) ? ' checked="checked" ' : '');
-
-       $globalshortening = get_config('statusnet','intelligent_shortening');
+       $importchecked = (($importenabled) ? ' checked="checked" ' : '');
+       $create_userenabled = get_pconfig(local_user(),'statusnet','create_user');
+       $create_userchecked = (($create_userenabled) ? ' checked="checked" ' : '');
 
+       $css = (($enabled) ? '' : '-disabled');
 
        $s .= '<span id="settings_statusnet_inflated" class="settings-block fakelink" style="display: block;" onclick="openClose(\'settings_statusnet_expanded\'); openClose(\'settings_statusnet_inflated\');">';
-       $s .= '<img class="connector" src="images/gnusocial.png" /><h3 class="connector">'. t('StatusNet Import/Export/Mirror').'</h3>';
+       $s .= '<img class="connector'.$css.'" src="images/gnusocial.png" /><h3 class="connector">'. t('StatusNet Import/Export/Mirror').'</h3>';
        $s .= '</span>';
        $s .= '<div id="settings_statusnet_expanded" class="settings-block" style="display: none;">';
        $s .= '<span class="fakelink" onclick="openClose(\'settings_statusnet_expanded\'); openClose(\'settings_statusnet_inflated\');">';
-       $s .= '<img class="connector" src="images/gnusocial.png" /><h3 class="connector">'. t('StatusNet Import/Export/Mirror').'</h3>';
+       $s .= '<img class="connector'.$css.'" src="images/gnusocial.png" /><h3 class="connector">'. t('StatusNet Import/Export/Mirror').'</h3>';
        $s .= '</span>';
 
        if ( (!$ckey) && (!$csecret) ) {
@@ -311,7 +308,7 @@ function statusnet_settings(&$a,&$s) {
                 */
                if (! $globalsn == null) {
                        $s .= '<h4>' . t('Globally Available StatusNet OAuthKeys') . '</h4>';
-                       $s .= '<p>'. t("There are preconfigured OAuth key pairs for some StatusNet servers available. If you are useing one of them, please use these credentials. If not feel free to connect to any other StatusNet instance \x28see below\x29.") .'</p>';
+                       $s .= '<p>'. t("There are preconfigured OAuth key pairs for some StatusNet servers available. If you are using one of them, please use these credentials. If not feel free to connect to any other StatusNet instance \x28see below\x29.") .'</p>';
                        $s .= '<div id="statusnet-preconf-wrapper">';
                        foreach ($globalsn as $asn) {
                                $s .= '<input type="radio" name="statusnet-preconf-apiurl" value="'. $asn['apiurl'] .'">'. $asn['sitename'] .'<br />';
@@ -392,25 +389,15 @@ function statusnet_settings(&$a,&$s) {
                        $s .= '<label id="statusnet-mirror-label" for="statusnet-mirror">'.t('Mirror all posts from statusnet that are no replies or repeated messages').'</label>';
                        $s .= '<input id="statusnet-mirror" type="checkbox" name="statusnet-mirror" value="1" '. $mirrorchecked . '/>';
                        $s .= '<div class="clear"></div>';
-
-                       if (!$globalshortening) {
-                               $s .= '<label id="statusnet-shortening-label" for="statusnet-shortening">'.t('Shortening method that optimizes the post').'</label>';
-                               $s .= '<input id="statusnet-shortening" type="checkbox" name="statusnet-shortening" value="1" '. $shorteningchecked . '/>';
-                               $s .= '<div class="clear"></div>';
-
-                               $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 class="clear"></div>';
-                       }
                        $s .= '</div>';
 
                        $s .= '<label id="statusnet-import-label" for="statusnet-import">'.t('Import the remote timeline').'</label>';
-                        $s .= '<input id="statusnet-import" type="checkbox" name="statusnet-import" value="1" '. $importchecked . '/>';
-                        $s .= '<div class="clear"></div>';
+                       $s .= '<input id="statusnet-import" type="checkbox" name="statusnet-import" value="1" '. $importchecked . '/>';
+                       $s .= '<div class="clear"></div>';
 /*
-                        $s .= '<label id="statusnet-create_user-label" for="statusnet-create_user">'.t('Automatically create contacts').'</label>';
-                        $s .= '<input id="statusnet-create_user" type="checkbox" name="statusnet-create_user" value="1" '. $create_userchecked . '/>';
-                        $s .= '<div class="clear"></div>';
+                       $s .= '<label id="statusnet-create_user-label" for="statusnet-create_user">'.t('Automatically create contacts').'</label>';
+                       $s .= '<input id="statusnet-create_user" type="checkbox" name="statusnet-create_user" value="1" '. $create_userchecked . '/>';
+                       $s .= '<div class="clear"></div>';
 */
                        $s .= '<div id="statusnet-disconnect-wrapper">';
                        $s .= '<label id="statusnet-disconnect-label" for="statusnet-disconnect">'. t('Clear OAuth configuration') .'</label>';
@@ -445,192 +432,6 @@ function statusnet_post_local(&$a,&$b) {
        }
 }
 
-if (! function_exists( 'short_link' )) {
-function short_link($url) {
-    require_once('library/slinky.php');
-    $slinky = new Slinky( $url );
-    $yourls_url = get_config('yourls','url1');
-    if ($yourls_url) {
-           $yourls_username = get_config('yourls','username1');
-           $yourls_password = get_config('yourls', 'password1');
-           $yourls_ssl = get_config('yourls', 'ssl1');
-           $yourls = new Slinky_YourLS();
-           $yourls->set( 'username', $yourls_username );
-           $yourls->set( 'password', $yourls_password );
-           $yourls->set( 'ssl', $yourls_ssl );
-           $yourls->set( 'yourls-url', $yourls_url );
-           $slinky->set_cascade( array( $yourls, new Slinky_UR1ca(), new Slinky_Trim(), new Slinky_IsGd(), new Slinky_TinyURL() ) );
-    }
-    else {
-           // setup a cascade of shortening services
-           // try to get a short link from these services
-           // in the order ur1.ca, trim, id.gd, tinyurl
-           $slinky->set_cascade( array( new Slinky_UR1ca(), new Slinky_Trim(), new Slinky_IsGd(), new Slinky_TinyURL() ) );
-    }
-    return $slinky->short();
-} };
-
-function statusnet_shortenmsg($b, $max_char) {
-       require_once("include/api.php");
-       require_once("include/bbcode.php");
-       require_once("include/html2plain.php");
-
-       $b['body'] = bb_CleanPictureLinks($b['body']);
-
-       // Looking for the first image
-       $cleaned_body = api_clean_plain_items($b['body']);
-       $image = '';
-       if(preg_match("/\[img\=([0-9]*)x([0-9]*)\](.*?)\[\/img\]/is",$cleaned_body,$matches))
-               $image = $matches[3];
-
-       if ($image == '')
-               if(preg_match("/\[img\](.*?)\[\/img\]/is",$cleaned_body,$matches))
-                       $image = $matches[1];
-
-       $multipleimages = (strpos($cleaned_body, "[img") != strrpos($cleaned_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;
-
-       if (strpos($body, "[bookmark") !== false) {
-               // splitting the text in two parts:
-               // before and after the bookmark
-               $pos = strpos($body, "[bookmark");
-               $body1 = substr($body, 0, $pos);
-               $body2 = substr($body, $pos);
-
-               // Removing all quotes after the bookmark
-               // they are mostly only the content after the bookmark.
-               $body2 = preg_replace("/\[quote\=([^\]]*)\](.*?)\[\/quote\]/ism",'',$body2);
-               $body2 = preg_replace("/\[quote\](.*?)\[\/quote\]/ism",'',$body2);
-               $body = $body1.$body2;
-       }
-
-       // Add some newlines so that the message could be cut better
-       $body = str_replace(array("[quote", "[bookmark", "[/bookmark]", "[/quote]"),
-                               array("\n[quote", "\n[bookmark", "[/bookmark]\n", "[/quote]\n"), $body);
-
-       // remove the recycle signs and the names since they aren't helpful on statusnet
-       // 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);
-
-       // remove the share element
-       //$body = preg_replace("/\[share(.*?)\](.*?)\[\/share\]/ism","\n\n$2\n\n",$body);
-
-       // At first convert the text to html
-       $html = bbcode(api_clean_plain_items($body), false, false, 2);
-
-       // 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);
-
-       $origmsg = $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 the message is short enough then don't modify it. (if the link exists in the original message)
-       if ((strlen(trim($origmsg)) <= $max_char) AND (($msglink == "") OR strpos($origmsg, $msglink)))
-               return(array("msg"=>trim($origmsg), "image"=>""));
-
-       // If the message is short enough and contains a picture then post the picture as well
-       if ((strlen(trim($origmsg)) <= ($max_char - 20)) AND strpos($origmsg, $msglink))
-               return(array("msg"=>trim($origmsg), "image"=>$image));
-
-       // If the message is short enough and the link exists in the original message don't modify it as well
-       if ((strlen(trim($origmsg)) <= $max_char) AND strpos($origmsg, $msglink))
-               return(array("msg"=>trim($origmsg), "image"=>""));
-
-       // Preserve the unshortened link
-       $orig_link = $msglink;
-
-       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."\n".$msglink), "image"=>$image));
-
-       // Looking if the link points to an image
-       $img_str = fetch_url($orig_link);
-
-       $tempfile = tempnam(get_config("system","temppath"), "cache");
-       file_put_contents($tempfile, $img_str);
-       $mime = image_type_to_mime_type(exif_imagetype($tempfile));
-       unlink($tempfile);
-
-       if (($image == $orig_link) OR (substr($mime, 0, 6) == "image/"))
-               return(array("msg"=>trim($msg), "image"=>$orig_link));
-       else if (($image != $orig_link) AND ($image != "") AND (strlen($msg." ".$msglink) <= ($max_char - 20)))
-               return(array("msg"=>trim($msg." ".$msglink)."\n", "image"=>$image));
-       else
-               return(array("msg"=>trim($msg." ".$msglink), "image"=>""));
-}
-
 function statusnet_action($a, $uid, $pid, $action) {
        $api     = get_pconfig($uid, 'statusnet', 'baseapi');
        $ckey    = get_pconfig($uid, 'statusnet', 'consumerkey');
@@ -640,20 +441,20 @@ function statusnet_action($a, $uid, $pid, $action) {
 
        $connection = new StatusNetOAuth($api,$ckey,$csecret,$otoken,$osecret);
 
-        logger("statusnet_action '".$action."' ID: ".$pid, LOGGER_DATA);
-
-        switch ($action) {
-                case "delete":
-                        $result = $connection->post("statuses/destroy/".$pid);
-                        break;
-                case "like":
-                        $result = $connection->post("favorites/create/".$pid);
-                        break;
-                case "unlike":
-                        $result = $connection->post("favorites/destroy/".$pid);
-                        break;
-        }
-        logger("statusnet_action '".$action."' send, result: " . print_r($result, true), LOGGER_DEBUG);
+       logger("statusnet_action '".$action."' ID: ".$pid, LOGGER_DATA);
+
+       switch ($action) {
+               case "delete":
+                       $result = $connection->post("statuses/destroy/".$pid);
+                       break;
+               case "like":
+                       $result = $connection->post("favorites/create/".$pid);
+                       break;
+               case "unlike":
+                       $result = $connection->post("favorites/destroy/".$pid);
+                       break;
+       }
+       logger("statusnet_action '".$action."' send, result: " . print_r($result, true), LOGGER_DEBUG);
 }
 
 function statusnet_post_hook(&$a,&$b) {
@@ -695,8 +496,13 @@ function statusnet_post_hook(&$a,&$b) {
                        $orig_post = $r[0];
                }
 
-               $nickname = "@[url=".$orig_post["author-link"]."]".$orig_post["contact_nick"]."[/url]";
-               $nicknameplain = "@".$orig_post["contact_nick"];
+               //$nickname = "@[url=".$orig_post["author-link"]."]".$orig_post["contact_nick"]."[/url]";
+               //$nicknameplain = "@".$orig_post["contact_nick"];
+
+               $nick = preg_replace("=https?://(.*)/(.*)=ism", "$2", $orig_post["author-link"]);
+
+               $nickname = "@[url=".$orig_post["author-link"]."]".$nick."[/url]";
+               $nicknameplain = "@".$nick;
 
                logger("statusnet_post_hook: comparing ".$nickname." and ".$nicknameplain." with ".$b["body"], LOGGER_DEBUG);
                if ((strpos($b["body"], $nickname) === false) AND (strpos($b["body"], $nicknameplain) === false))
@@ -711,21 +517,24 @@ function statusnet_post_hook(&$a,&$b) {
        }
 
        if (($b['verb'] == ACTIVITY_POST) AND $b['deleted'])
-                statusnet_action($a, $b["uid"], substr($orig_post["uri"], $hostlength), "delete");
-
-        if($b['verb'] == ACTIVITY_LIKE) {
-                logger("statusnet_post_hook: parameter 2 ".substr($b["thr-parent"], $hostlength), LOGGER_DEBUG);
-                if ($b['deleted'])
-                        statusnet_action($a, $b["uid"], substr($b["thr-parent"], $hostlength), "unlike");
-                else
-                        statusnet_action($a, $b["uid"], substr($b["thr-parent"], $hostlength), "like");
-                return;
+               statusnet_action($a, $b["uid"], substr($orig_post["uri"], $hostlength), "delete");
+
+       if($b['verb'] == ACTIVITY_LIKE) {
+               logger("statusnet_post_hook: parameter 2 ".substr($b["thr-parent"], $hostlength), LOGGER_DEBUG);
+               if ($b['deleted'])
+                       statusnet_action($a, $b["uid"], substr($b["thr-parent"], $hostlength), "unlike");
+               else
+                       statusnet_action($a, $b["uid"], substr($b["thr-parent"], $hostlength), "like");
+               return;
        }
 
-        if($b['deleted'] || ($b['created'] !== $b['edited']))
-                return;
+       if($b['deleted'] || ($b['created'] !== $b['edited']))
+               return;
 
        // if posts comes from statusnet don't send it back
+       if($b['extid'] == NETWORK_STATUSNET)
+               return;
+
        if($b['app'] == "StatusNet")
                return;
 
@@ -738,11 +547,6 @@ function statusnet_post_hook(&$a,&$b) {
        $csecret = get_pconfig($b['uid'], 'statusnet', 'consumersecret');
        $otoken  = get_pconfig($b['uid'], 'statusnet', 'oauthtoken');
        $osecret = get_pconfig($b['uid'], 'statusnet', 'oauthsecret');
-       $intelligent_shortening = get_pconfig($b['uid'], 'statusnet', 'intelligent_shortening');
-
-       // Global setting overrides this
-       if (get_config('statusnet','intelligent_shortening'))
-               $intelligent_shortening = get_config('statusnet','intelligent_shortening');
 
        if($ckey && $csecret && $otoken && $osecret) {
 
@@ -753,99 +557,36 @@ function statusnet_post_hook(&$a,&$b) {
                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
-               // shorten all the links in a 200000 character long essay.
 
-               $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, true);
-                       $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;
-                       }
+               set_pconfig($b['uid'], 'statusnet', 'max_char', $max_char);
 
-                       $msg = trim($msg);
-                       $postdata = array('status' => $msg);
-               } else {
-                       $msgarr = statusnet_shortenmsg($b, $max_char);
-                       $msg = $msgarr["msg"];
+               $tempfile = "";
+               require_once("include/plaintext.php");
+               require_once("include/network.php");
+               $msgarr = plaintext($a, $b, $max_char, true, 7);
+               $msg = $msgarr["text"];
+
+               if (($msg == "") AND isset($msgarr["title"]))
+                       $msg = shortenmsg($msgarr["title"], $max_char - 50);
+
+               $image = "";
+
+               if (isset($msgarr["url"])) {
+                       if ((strlen($msgarr["url"]) > 20) AND
+                               ((strlen($msg." \n".$msgarr["url"]) > $max_char)))
+                               $msg .= " \n".short_link($msgarr["url"]);
+                       else
+                               $msg .= " \n".$msgarr["url"];
+               } elseif (isset($msgarr["image"]) AND ($msgarr["type"] != "video"))
                        $image = $msgarr["image"];
-                       if ($image != "") {
-                               $img_str = fetch_url($image);
-                               $tempfile = tempnam(get_config("system","temppath"), "cache");
-                               file_put_contents($tempfile, $img_str);
-                               $postdata = array("status" => $msg, "media[]" => $tempfile);
-                       } else
-                               $postdata = array("status"=>$msg);
-               }
+
+               if ($image != "") {
+                       $img_str = fetch_url($image);
+                       $tempfile = tempnam(get_temppath(), "cache");
+                       file_put_contents($tempfile, $img_str);
+                       $postdata = array("status" => $msg, "media[]" => $tempfile);
+               } else
+                       $postdata = array("status"=>$msg);
 
                // and now dent it :-)
                if(strlen($msg)) {
@@ -946,6 +687,53 @@ function statusnet_plugin_admin(&$a, &$o){
        ));
 }
 
+function statusnet_prepare_body(&$a,&$b) {
+        if ($b["item"]["network"] != NETWORK_STATUSNET)
+                return;
+
+        if ($b["preview"]) {
+               $max_char = get_pconfig(local_user(),'statusnet','max_char');
+               if (intval($max_char) == 0)
+                       $max_char = 140;
+
+                require_once("include/plaintext.php");
+                $item = $b["item"];
+                $item["plink"] = $a->get_baseurl()."/display/".$a->user["nickname"]."/".$item["parent"];
+
+               $r = q("SELECT `item`.`author-link`, `item`.`uri`, `contact`.`nick` AS contact_nick
+                        FROM `item` INNER JOIN `contact` ON `contact`.`id` = `item`.`contact-id`
+                        WHERE `item`.`uri` = '%s' AND `item`.`uid` = %d LIMIT 1",
+                        dbesc($item["thr-parent"]),
+                        intval(local_user()));
+
+                if(count($r)) {
+                        $orig_post = $r[0];
+                       //$nickname = "@[url=".$orig_post["author-link"]."]".$orig_post["contact_nick"]."[/url]";
+                       //$nicknameplain = "@".$orig_post["contact_nick"];
+
+                       $nick = preg_replace("=https?://(.*)/(.*)=ism", "$2", $orig_post["author-link"]);
+
+                       $nickname = "@[url=".$orig_post["author-link"]."]".$nick."[/url]";
+                       $nicknameplain = "@".$nick;
+
+                       if ((strpos($item["body"], $nickname) === false) AND (strpos($item["body"], $nicknameplain) === false))
+                               $item["body"] = $nickname." ".$item["body"];
+                }
+
+
+                $msgarr = plaintext($a, $item, $max_char, true, 7);
+                $msg = $msgarr["text"];
+
+                if (isset($msgarr["url"]))
+                        $msg .= " ".$msgarr["url"];
+
+                if (isset($msgarr["image"]))
+                        $msg .= " ".$msgarr["image"];
+
+                $b['html'] = nl2br(htmlspecialchars($msg));
+        }
+}
+
 function statusnet_cron($a,$b) {
        $last = get_config('statusnet','last_poll');
 
@@ -971,12 +759,12 @@ function statusnet_cron($a,$b) {
        }
 
        $r = q("SELECT * FROM `pconfig` WHERE `cat` = 'statusnet' AND `k` = 'import' AND `v` = '1' ORDER BY RAND()");
-        if(count($r)) {
-                foreach($r as $rr) {
-                        logger('statusnet: importing timeline from user '.$rr['uid']);
-                        statusnet_fetchhometimeline($a, $rr["uid"]);
-                }
-        }
+       if(count($r)) {
+               foreach($r as $rr) {
+                       logger('statusnet: importing timeline from user '.$rr['uid']);
+                       statusnet_fetchhometimeline($a, $rr["uid"]);
+               }
+       }
 
        logger('statusnet: cron_end');
 
@@ -1044,7 +832,9 @@ function statusnet_fetchtimeline($a, $uid) {
                        $_REQUEST["type"] = "wall";
                        $_REQUEST["api_source"] = true;
                        $_REQUEST["profile_uid"] = $uid;
-                       $_REQUEST["source"] = "StatusNet";
+                       //$_REQUEST["source"] = "StatusNet";
+                       $_REQUEST["source"] = $post->source;
+                       $_REQUEST["extid"] = NETWORK_STATUSNET;
 
                        //$_REQUEST["date"] = $post->created_at;
 
@@ -1087,6 +877,9 @@ function statusnet_address($contact) {
 }
 
 function statusnet_fetch_contact($uid, $contact, $create_user) {
+       if ($contact->statusnet_profile_url == "")
+               return(-1);
+
        // Check if the unique contact is existing
        // To-Do: only update once a while
         $r = q("SELECT id FROM unique_contacts WHERE url='%s' LIMIT 1",
@@ -1165,16 +958,12 @@ function statusnet_fetch_contact($uid, $contact, $create_user) {
                q("UPDATE `contact` SET `photo` = '%s',
                                        `thumb` = '%s',
                                        `micro` = '%s',
-                                       `name-date` = '%s',
-                                       `uri-date` = '%s',
                                        `avatar-date` = '%s'
                                WHERE `id` = %d",
                        dbesc($photos[0]),
                        dbesc($photos[1]),
                        dbesc($photos[2]),
                        dbesc(datetime_convert()),
-                       dbesc(datetime_convert()),
-                       dbesc(datetime_convert()),
                        intval($contact_id)
                );
 
@@ -1186,7 +975,7 @@ function statusnet_fetch_contact($uid, $contact, $create_user) {
 
                // check that we have all the photos, this has been known to fail on occasion
 
-               if((! $r[0]['photo']) || (! $r[0]['thumb']) || (! $r[0]['micro']) || ($update_photo)) {
+               if((!$r[0]['photo']) || (!$r[0]['thumb']) || (!$r[0]['micro']) || ($update_photo)) {
 
                        logger("statusnet_fetch_contact: Updating contact ".$contact->screen_name, LOGGER_DEBUG);
 
@@ -1269,6 +1058,8 @@ function statusnet_createpost($a, $uid, $post, $self, $create_user, $only_existi
 
        require_once("include/html2bbcode.php");
 
+       logger("statusnet_createpost: start", LOGGER_DEBUG);
+
        $api = get_pconfig($uid, 'statusnet', 'baseapi');
        $hostname = preg_replace("=https?://([\w\.]*)/.*=ism", "$1", $api);
 
@@ -1277,7 +1068,14 @@ function statusnet_createpost($a, $uid, $post, $self, $create_user, $only_existi
        $postarray['gravity'] = 0;
        $postarray['uid'] = $uid;
        $postarray['wall'] = 0;
-       $postarray['uri'] = $hostname."::".$post->id;
+
+       if (is_object($post->retweeted_status)) {
+               $content = $post->retweeted_status;
+               statusnet_fetch_contact($uid, $content->user, false);
+       } else
+               $content = $post;
+
+       $postarray['uri'] = $hostname."::".$content->id;
 
        $r = q("SELECT * FROM `item` WHERE `extid` = '%s' AND `uid` = %d LIMIT 1",
                        dbesc($postarray['uri']),
@@ -1289,9 +1087,9 @@ function statusnet_createpost($a, $uid, $post, $self, $create_user, $only_existi
 
        $contactid = 0;
 
-       if ($post->in_reply_to_status_id != "") {
+       if ($content->in_reply_to_status_id != "") {
 
-               $parent = $hostname."::".$post->in_reply_to_status_id;
+               $parent = $hostname."::".$content->in_reply_to_status_id;
 
                $r = q("SELECT * FROM `item` WHERE `uri` = '%s' AND `uid` = %d LIMIT 1",
                                dbesc($parent),
@@ -1300,6 +1098,8 @@ function statusnet_createpost($a, $uid, $post, $self, $create_user, $only_existi
                if (count($r)) {
                        $postarray['thr-parent'] = $r[0]["uri"];
                        $postarray['parent-uri'] = $r[0]["parent-uri"];
+                       $postarray['parent'] = $r[0]["parent"];
+                       $postarray['object-type'] = ACTIVITY_OBJ_COMMENT;
                } else {
                        $r = q("SELECT * FROM `item` WHERE `extid` = '%s' AND `uid` = %d LIMIT 1",
                                        dbesc($parent),
@@ -1308,16 +1108,19 @@ function statusnet_createpost($a, $uid, $post, $self, $create_user, $only_existi
                        if (count($r)) {
                                $postarray['thr-parent'] = $r[0]['uri'];
                                $postarray['parent-uri'] = $r[0]['parent-uri'];
+                               $postarray['parent'] = $r[0]['parent'];
+                               $postarray['object-type'] = ACTIVITY_OBJ_COMMENT;
                        } else {
                                $postarray['thr-parent'] = $postarray['uri'];
                                $postarray['parent-uri'] = $postarray['uri'];
+                               $postarray['object-type'] = ACTIVITY_OBJ_NOTE;
                        }
                }
 
                // Is it me?
                $own_url = get_pconfig($uid, 'statusnet', 'own_url');
 
-               if ($post->user->id == $own_url) {
+               if ($content->user->id == $own_url) {
                        $r = q("SELECT * FROM `contact` WHERE `self` = 1 AND `uid` = %d LIMIT 1",
                                intval($uid));
 
@@ -1330,8 +1133,12 @@ function statusnet_createpost($a, $uid, $post, $self, $create_user, $only_existi
                        } else
                                return(array());
                }
-       } else
+               // Don't create accounts of people who just comment something
+               $create_user = false;
+       } else {
                $postarray['parent-uri'] = $postarray['uri'];
+               $postarray['object-type'] = ACTIVITY_OBJ_NOTE;
+       }
 
        if ($contactid == 0) {
                $contactid = statusnet_fetch_contact($uid, $post->user, $create_user);
@@ -1347,43 +1154,44 @@ function statusnet_createpost($a, $uid, $post, $self, $create_user, $only_existi
        $postarray['contact-id'] = $contactid;
 
        $postarray['verb'] = ACTIVITY_POST;
-       $postarray['author-name'] = $postarray['owner-name'];
-       $postarray['author-link'] = $postarray['owner-link'];
-       $postarray['author-avatar'] = $postarray['owner-avatar'];
+
+       $postarray['author-name'] = $content->user->name;
+       $postarray['author-link'] = $content->user->statusnet_profile_url;
+       $postarray['author-avatar'] = $content->user->profile_image_url;
 
        // To-Do: Maybe unreliable? Can the api be entered without trailing "/"?
        $hostname = str_replace("/api/", "/notice/", get_pconfig($uid, 'statusnet', 'baseapi'));
 
-       $postarray['plink'] = $hostname.$post->id;
-       $postarray['app'] = strip_tags($post->source);
+       $postarray['plink'] = $hostname.$content->id;
+       $postarray['app'] = strip_tags($content->source);
 
-       if ($post->user->protected) {
+       if ($content->user->protected) {
                $postarray['private'] = 1;
                $postarray['allow_cid'] = '<' . $self['id'] . '>';
        }
 
-       $postarray['body'] = html2bbcode($post->statusnet_html);
+       $postarray['body'] = html2bbcode($content->statusnet_html);
 
        $converted = statusnet_convertmsg($a, $postarray['body'], false);
        $postarray['body'] = $converted["body"];
        $postarray['tag'] = $converted["tags"];
 
-       $postarray['created'] = datetime_convert('UTC','UTC',$post->created_at);
-       $postarray['edited'] = datetime_convert('UTC','UTC',$post->created_at);
+       $postarray['created'] = datetime_convert('UTC','UTC',$content->created_at);
+       $postarray['edited'] = datetime_convert('UTC','UTC',$content->created_at);
 
-       if (is_string($post->place->name))
-               $postarray["location"] = $post->place->name;
+       if (is_string($content->place->name))
+               $postarray["location"] = $content->place->name;
 
-       if (is_string($post->place->full_name))
-               $postarray["location"] = $post->place->full_name;
+       if (is_string($content->place->full_name))
+               $postarray["location"] = $content->place->full_name;
 
-       if (is_array($post->geo->coordinates))
-               $postarray["coord"] = $post->geo->coordinates[0]." ".$post->geo->coordinates[1];
+       if (is_array($content->geo->coordinates))
+               $postarray["coord"] = $content->geo->coordinates[0]." ".$content->geo->coordinates[1];
 
-       if (is_array($post->coordinates->coordinates))
-               $postarray["coord"] = $post->coordinates->coordinates[1]." ".$post->coordinates->coordinates[0];
+       if (is_array($content->coordinates->coordinates))
+               $postarray["coord"] = $content->coordinates->coordinates[1]." ".$content->coordinates->coordinates[0];
 
-       if (is_object($post->retweeted_status)) {
+       /*if (is_object($post->retweeted_status)) {
                $postarray['body'] = html2bbcode($post->retweeted_status->statusnet_html);
 
                $converted = statusnet_convertmsg($a, $postarray['body'], false);
@@ -1396,12 +1204,15 @@ function statusnet_createpost($a, $uid, $post, $self, $create_user, $only_existi
                $postarray['author-name'] = $post->retweeted_status->user->name;
                $postarray['author-link'] = $post->retweeted_status->user->statusnet_profile_url;
                $postarray['author-avatar'] = $post->retweeted_status->user->profile_image_url;
-       }
+       }*/
+       logger("statusnet_createpost: end", LOGGER_DEBUG);
        return($postarray);
 }
 
 function statusnet_checknotification($a, $uid, $own_url, $top_item, $postarray) {
 
+       // This function necer worked and need cleanup
+
        $user = q("SELECT * FROM `contact` WHERE `uid` = %d AND `self` LIMIT 1",
                        intval($uid)
                );
@@ -1450,7 +1261,7 @@ function statusnet_checknotification($a, $uid, $own_url, $top_item, $postarray)
                                'to_email'     => $user[0]['email'],
                                'uid'          => $user[0]['uid'],
                                'item'         => $postarray,
-                               'link'             => $a->get_baseurl() . '/display/' . $user[0]['nickname'] . '/' . $top_item,
+                               'link'         => $a->get_baseurl().'/display/'.urlencode(get_item_guid($top_item)),
                                'source_name'  => $postarray['author-name'],
                                'source_link'  => $postarray['author-link'],
                                'source_photo' => $postarray['author-avatar'],
@@ -1531,7 +1342,16 @@ function statusnet_fetchhometimeline($a, $uid) {
        $items = $connection->get('statuses/home_timeline', $parameters);
 
        if (!is_array($items)) {
-               logger("statusnet_fetchhometimeline: Error fetching home timeline: ".print_r($items, true), LOGGER_DEBUG);
+               if (is_object($items) AND isset($items->error))
+                       $errormsg = $items->error;
+               elseif (is_object($items))
+                       $errormsg = print_r($items, true);
+               elseif (is_string($items) OR is_float($items) OR is_int($items))
+                       $errormsg = $items;
+               else
+                       $errormsg = "Unknown error";
+
+               logger("statusnet_fetchhometimeline: Error fetching home timeline: ".$errormsg, LOGGER_DEBUG);
                return;
        }
 
@@ -1618,8 +1438,10 @@ function statusnet_fetchhometimeline($a, $uid) {
                                dbesc($postarray['uri']),
                                intval($uid)
                        );
-                       if (count($r))
+                       if (count($r)) {
                                $item = $r[0]['id'];
+                               $parent_id = $r[0]['parent'];
+                       }
 
                        if ($item != 0) {
                                require_once('include/enotify.php');
@@ -1631,12 +1453,13 @@ function statusnet_fetchhometimeline($a, $uid) {
                                        'to_email'     => $u[0]['email'],
                                        'uid'          => $u[0]['uid'],
                                        'item'         => $postarray,
-                                       'link'         => $a->get_baseurl() . '/display/' . $u[0]['nickname'] . '/' . $item,
+                                       'link'         => $a->get_baseurl().'/display/'.urlencode(get_item_guid($item)),
                                        'source_name'  => $postarray['author-name'],
                                        'source_link'  => $postarray['author-link'],
                                        'source_photo' => $postarray['author-avatar'],
                                        'verb'         => ACTIVITY_TAG,
-                                       'otype'        => 'item'
+                                       'otype'        => 'item',
+                                       'parent'       => $parent_id,
                                ));
                        }
                }
@@ -1659,21 +1482,23 @@ function statusnet_complete_conversation($a, $uid, $self, $create_user, $nick, $
        $parameters["count"] = 200;
 
        $items = $connection->get('statusnet/conversation/'.$conversation, $parameters);
-       $posts = array_reverse($items);
+       if (is_array($items)) {
+               $posts = array_reverse($items);
 
-       foreach($posts AS $post) {
-               $postarray = statusnet_createpost($a, $uid, $post, $self, $create_user, true);
+               foreach($posts AS $post) {
+                       $postarray = statusnet_createpost($a, $uid, $post, $self, false, false);
 
-               if (trim($postarray['body']) == "")
-                       continue;
+                       if (trim($postarray['body']) == "")
+                               continue;
 
-               //print_r($postarray);
-               $item = item_store($postarray);
+                       //print_r($postarray);
+                       $item = item_store($postarray);
 
-               logger('statusnet_complete_conversation: User '.$self["nick"].' posted home timeline item '.$item);
+                       logger('statusnet_complete_conversation: User '.$self["nick"].' posted home timeline item '.$item);
 
-               if ($item != 0)
-                       statusnet_checknotification($a, $uid, $nick, $item, $postarray);
+                       if ($item != 0)
+                               statusnet_checknotification($a, $uid, $nick, $item, $postarray);
+               }
        }
 }
 
@@ -1683,34 +1508,47 @@ function statusnet_convertmsg($a, $body, $no_tags = false) {
        require_once("include/items.php");
        require_once("include/network.php");
 
+       $body = preg_replace("=\[url\=https?://([0-9]*).([0-9]*).([0-9]*).([0-9]*)/([0-9]*)\](.*?)\[\/url\]=ism","$1.$2.$3.$4/$5",$body);
+
        $URLSearchString = "^\[\]";
        $links = preg_match_all("/[^!#@]\[url\=([$URLSearchString]*)\](.*?)\[\/url\]/ism", $body,$matches,PREG_SET_ORDER);
 
        $footer = "";
        $footerurl = "";
+       $footerlink = "";
        $type = "";
 
        if ($links) {
                foreach ($matches AS $match) {
                        $search = "[url=".$match[1]."]".$match[2]."[/url]";
 
+                       logger("statusnet_convertmsg: expanding url ".$match[1], LOGGER_DEBUG);
+
                        $expanded_url = original_url($match[1]);
 
-                       $oembed_data = oembed_fetch_url($expanded_url);
+                       logger("statusnet_convertmsg: fetching data for ".$expanded_url, LOGGER_DEBUG);
+
+                       $oembed_data = oembed_fetch_url($expanded_url, true);
+
+                       logger("statusnet_convertmsg: fetching data: done", LOGGER_DEBUG);
 
                        if ($type == "")
                                $type = $oembed_data->type;
+                       if ($oembed_data->type == "video") {
+                               //$body = str_replace($search, "[video]".$expanded_url."[/video]", $body);
+                               $type = $oembed_data->type;
+                               $footerurl = $expanded_url;
+                               $footerlink = "[url=".$expanded_url."]".$expanded_url."[/url]";
 
-                       if ($oembed_data->type == "video")
-                               $body = str_replace($search, "[video]".$expanded_url."[/video]", $body);
-                       elseif (($oembed_data->type == "photo") AND isset($oembed_data->url) AND !$dontincludemedia)
+                               $body = str_replace($search, $footerlink, $body);
+                       } elseif (($oembed_data->type == "photo") AND isset($oembed_data->url) AND !$dontincludemedia)
                                $body = str_replace($search, "[url=".$expanded_url."][img]".$oembed_data->url."[/img][/url]", $body);
                        elseif ($oembed_data->type != "link")
                                $body = str_replace($search,  "[url=".$expanded_url."]".$expanded_url."[/url]", $body);
                        else {
                                $img_str = fetch_url($expanded_url, true, $redirects, 4);
 
-                               $tempfile = tempnam(get_config("system","temppath"), "cache");
+                               $tempfile = tempnam(get_temppath(), "cache");
                                file_put_contents($tempfile, $img_str);
                                $mime = image_type_to_mime_type(exif_imagetype($tempfile));
                                unlink($tempfile);
@@ -1723,7 +1561,7 @@ function statusnet_convertmsg($a, $body, $no_tags = false) {
                                        $footerurl = $expanded_url;
                                        $footerlink = "[url=".$expanded_url."]".$expanded_url."[/url]";
 
-                                       $body = str_replace($search, $expanded_url, $body);
+                                       $body = str_replace($search, $footerlink, $body);
                                }
                        }
                }
@@ -1734,7 +1572,7 @@ function statusnet_convertmsg($a, $body, $no_tags = false) {
                if (($footerlink != "") AND (trim($footer) != "")) {
                        $removedlink = trim(str_replace($footerlink, "", $body));
 
-                       if (strstr($body, $removedlink))
+                       if (($removedlink == "") OR strstr($body, $removedlink))
                                $body = $removedlink;
 
                        $body .= $footer;