]> 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 abbda0e18e491a58bf89f3e350bcc15f86de62ed..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');
@@ -171,8 +173,8 @@ function statusnet_settings_post ($a,$post) {
                del_pconfig(local_user(), 'statusnet', 'lastid');
                del_pconfig(local_user(), 'statusnet', 'mirror_posts');
                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'])) {
                /***
@@ -279,9 +281,9 @@ function statusnet_settings(&$a,&$s) {
        $mirrorenabled = get_pconfig(local_user(),'statusnet','mirror_posts');
        $mirrorchecked = (($mirrorenabled) ? ' 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" ' : '');
+       $importchecked = (($importenabled) ? ' checked="checked" ' : '');
+       $create_userenabled = get_pconfig(local_user(),'statusnet','create_user');
+       $create_userchecked = (($create_userenabled) ? ' checked="checked" ' : '');
 
        $css = (($enabled) ? '' : '-disabled');
 
@@ -306,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 />';
@@ -390,12 +392,12 @@ function statusnet_settings(&$a,&$s) {
                        $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>';
@@ -439,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) {
@@ -494,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))
@@ -510,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;
 
@@ -548,10 +558,12 @@ function statusnet_post_hook(&$a,&$b) {
                $dent = new StatusNetOAuth($api,$ckey,$csecret,$otoken,$osecret);
                $max_char = $dent->get_maxlength(); // max. length for a dent
 
+               set_pconfig($b['uid'], 'statusnet', 'max_char', $max_char);
+
                $tempfile = "";
                require_once("include/plaintext.php");
                require_once("include/network.php");
-               $msgarr = plaintext($a, $b, $max_char, true);
+               $msgarr = plaintext($a, $b, $max_char, true, 7);
                $msg = $msgarr["text"];
 
                if (($msg == "") AND isset($msgarr["title"]))
@@ -565,12 +577,12 @@ function statusnet_post_hook(&$a,&$b) {
                                $msg .= " \n".short_link($msgarr["url"]);
                        else
                                $msg .= " \n".$msgarr["url"];
-               } elseif (isset($msgarr["image"]))
+               } 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");
+                       $tempfile = tempnam(get_temppath(), "cache");
                        file_put_contents($tempfile, $img_str);
                        $postdata = array("status" => $msg, "media[]" => $tempfile);
                } else
@@ -675,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');
 
@@ -700,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');
 
@@ -773,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;
 
@@ -816,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",
@@ -894,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)
                );
 
@@ -915,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);
 
@@ -998,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);
 
@@ -1006,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']),
@@ -1018,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),
@@ -1029,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),
@@ -1037,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));
 
@@ -1059,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);
@@ -1076,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);
@@ -1125,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)
                );
@@ -1179,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'],
@@ -1260,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;
        }
 
@@ -1347,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');
@@ -1360,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,
                                ));
                        }
                }
@@ -1392,7 +1486,7 @@ function statusnet_complete_conversation($a, $uid, $self, $create_user, $nick, $
                $posts = array_reverse($items);
 
                foreach($posts AS $post) {
-                       $postarray = statusnet_createpost($a, $uid, $post, $self, $create_user, true);
+                       $postarray = statusnet_createpost($a, $uid, $post, $self, false, false);
 
                        if (trim($postarray['body']) == "")
                                continue;
@@ -1414,6 +1508,8 @@ 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);
 
@@ -1426,10 +1522,16 @@ function statusnet_convertmsg($a, $body, $no_tags = false) {
                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]);
 
+                       logger("statusnet_convertmsg: fetching data for ".$expanded_url, LOGGER_DEBUG);
+
                        $oembed_data = oembed_fetch_url($expanded_url, true);
-print_r($oembed_data);
+
+                       logger("statusnet_convertmsg: fetching data: done", LOGGER_DEBUG);
+
                        if ($type == "")
                                $type = $oembed_data->type;
                        if ($oembed_data->type == "video") {
@@ -1446,7 +1548,7 @@ print_r($oembed_data);
                        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);
@@ -1470,7 +1572,7 @@ print_r($oembed_data);
                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;