X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=statusnet%2Fstatusnet.php;h=c3591356b6237c035b79edea23bc934b58e8a533;hb=b1af3c817b5f94b1693d7b0422dc842b2c89ba86;hp=1957cc96178b1d8286247fd8ff6b3128849d8ee7;hpb=021d6265cd544bfa25f78a3ce895d65e0e470bb4;p=friendica-addons.git diff --git a/statusnet/statusnet.php b/statusnet/statusnet.php index 1957cc96..c3591356 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'])) { /*** @@ -250,6 +252,10 @@ function statusnet_settings_post ($a,$post) { set_pconfig(local_user(), 'statusnet', 'mirror_posts', intval($_POST['statusnet-mirror'])); 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); }}}} } @@ -275,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'); @@ -302,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'] .'
'; @@ -386,12 +392,12 @@ function statusnet_settings(&$a,&$s) { $s .= '
'; $s .= ''; - $s .= ''; - $s .= '
'; + $s .= ''; + $s .= '
'; /* - $s .= ''; - $s .= ''; - $s .= '
'; + $s .= ''; + $s .= ''; + $s .= '
'; */ $s .= '
'; $s .= ''; @@ -435,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) { @@ -490,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)) @@ -506,19 +517,19 @@ 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['app'] == "StatusNet") @@ -544,10 +555,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"])) @@ -561,12 +574,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 @@ -671,6 +684,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'); @@ -696,12 +756,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'); @@ -994,6 +1054,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); @@ -1002,7 +1064,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']), @@ -1014,9 +1083,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), @@ -1025,6 +1094,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), @@ -1033,16 +1104,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)); @@ -1055,8 +1129,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); @@ -1072,43 +1150,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); @@ -1121,12 +1200,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) ); @@ -1175,7 +1257,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'], @@ -1343,8 +1425,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'); @@ -1356,12 +1440,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, )); } } @@ -1388,7 +1473,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; @@ -1410,6 +1495,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); @@ -1422,10 +1509,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") { @@ -1442,7 +1535,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); @@ -1466,7 +1559,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;