X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=statusnet%2Fstatusnet.php;h=7d0f80c3c5e8d98afa2357af7c089c4997c45b76;hb=308a615700b1b76af84ad8218b1c4ca642ad2caf;hp=abbda0e18e491a58bf89f3e350bcc15f86de62ed;hpb=419d1fbecd78ff29e24292880a3797e05857d11c;p=friendica-addons.git diff --git a/statusnet/statusnet.php b/statusnet/statusnet.php index abbda0e1..7d0f80c3 100644 --- a/statusnet/statusnet.php +++ b/statusnet/statusnet.php @@ -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 .= '

' . t('Globally Available StatusNet OAuthKeys') . '

'; - $s .= '

'. 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.") .'

'; + $s .= '

'. 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.") .'

'; $s .= '
'; foreach ($globalsn as $asn) { $s .= ''. $asn['sitename'] .'
'; @@ -390,12 +392,12 @@ function statusnet_settings(&$a,&$s) { $s .= '
'; $s .= ''; - $s .= ''; - $s .= '
'; + $s .= ''; + $s .= '
'; /* - $s .= ''; - $s .= ''; - $s .= '
'; + $s .= ''; + $s .= ''; + $s .= '
'; */ $s .= '
'; $s .= ''; @@ -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;