X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=fromgplus%2Ffromgplus.php;h=9699ba9b32d8c3059297a0564138f1c0a2021167;hb=418ce62d7b974c691c37660d523fda00c7afa640;hp=88d2622ff16fcf46306d47e919c336c082e4c5d5;hpb=daed8c8720360461c53643d45c9520a094d8bd08;p=friendica-addons.git diff --git a/fromgplus/fromgplus.php b/fromgplus/fromgplus.php index 88d2622f..9699ba9b 100644 --- a/fromgplus/fromgplus.php +++ b/fromgplus/fromgplus.php @@ -1,18 +1,26 @@ * */ +define('FROMGPLUS_DEFAULT_POLL_INTERVAL', 30); // given in minutes + function fromgplus_install() { - register_hook('plugin_settings', 'addon/fromgplus/fromgplus.php', 'fromgplus_addon_settings'); - register_hook('plugin_settings_post', 'addon/fromgplus/fromgplus.php', 'fromgplus_addon_settings_post'); + register_hook('connector_settings', 'addon/fromgplus/fromgplus.php', 'fromgplus_addon_settings'); + register_hook('connector_settings_post', 'addon/fromgplus/fromgplus.php', 'fromgplus_addon_settings_post'); + register_hook('cron', 'addon/fromgplus/fromgplus.php', 'fromgplus_cron'); } function fromgplus_uninstall() { + unregister_hook('connector_settings', 'addon/fromgplus/fromgplus.php', 'fromgplus_addon_settings'); + unregister_hook('connector_settings_post', 'addon/fromgplus/fromgplus.php', 'fromgplus_addon_settings_post'); + unregister_hook('cron', 'addon/fromgplus/fromgplus.php', 'fromgplus_cron'); + + // Old hooks unregister_hook('plugin_settings', 'addon/fromgplus/fromgplus.php', 'fromgplus_addon_settings'); unregister_hook('plugin_settings_post', 'addon/fromgplus/fromgplus.php', 'fromgplus_addon_settings_post'); } @@ -22,11 +30,22 @@ function fromgplus_addon_settings(&$a,&$s) { if(! local_user()) return; + // If "gpluspost" is installed as well, then the settings are displayed there + $result = q("SELECT `installed` FROM `addon` WHERE `name` = 'gpluspost' AND `installed`"); + if (count($result) > 0) + return; + $enable_checked = (intval(get_pconfig(local_user(),'fromgplus','enable')) ? ' checked="checked"' : ''); $account = get_pconfig(local_user(),'fromgplus','account'); - $s .= '
'; - $s .= '

' . t('Google+ Import Settings').'

'; + $s .= ''; + $s .= '

'. t('Google+ Mirror').'

'; + $s .= '
'; + $s .= ''; $s .= '
'; return; @@ -52,132 +71,400 @@ function fromgplus_addon_settings_post(&$a,&$b) { set_pconfig(local_user(),'fromgplus','account',trim($_POST['fromgplus-account'])); $enable = ((x($_POST,'fromgplus-enable')) ? intval($_POST['fromgplus-enable']) : 0); set_pconfig(local_user(),'fromgplus','enable', $enable); + + if (!$enable) + del_pconfig(local_user(),'fromgplus','lastdate'); + info( t('Google+ Import Settings saved.') . EOL); } } -/* -function html2bbcode($html) { + +function fromgplus_cron($a,$b) { + $last = get_config('fromgplus','last_poll'); + + $poll_interval = intval(get_config('fromgplus','poll_interval')); + if(! $poll_interval) + $poll_interval = FROMGPLUS_DEFAULT_POLL_INTERVAL; + + if($last) { + $next = $last + ($poll_interval * 60); + if($next > time()) { + logger('fromgplus: poll intervall not reached'); + return; + } + } + + logger('fromgplus: cron_start'); + + $r = q("SELECT * FROM `pconfig` WHERE `cat` = 'fromgplus' AND `k` = 'enable' AND `v` = '1' ORDER BY RAND() "); + if(count($r)) { + foreach($r as $rr) { + $account = get_pconfig($rr['uid'],'fromgplus','account'); + if ($account) { + logger('fromgplus: fetching for user '.$rr['uid']); + fromgplus_fetch($a, $rr['uid']); + } + } + } + + logger('fromgplus: cron_end'); + + set_config('fromgplus','last_poll', time()); +} + +function fromgplus_post($a, $uid, $source, $body, $location) { + + //$uid = 2; + + // Don't know what it is. Maybe some trash from the mobile client + $trash = html_entity_decode("", ENT_QUOTES, 'UTF-8'); + $body = str_replace($trash, "", $body); + + $body = trim($body); + + if (substr($body, 0, 3) == "[b]") { + $pos = strpos($body, "[/b]"); + $title = substr($body, 3, $pos-3); + $body = trim(substr($body, $pos+4)); + } else + $title = ""; + + $_SESSION['authenticated'] = true; + $_SESSION['uid'] = $uid; + + unset($_REQUEST); + $_REQUEST['type'] = 'wall'; + $_REQUEST['api_source'] = true; + + $_REQUEST['profile_uid'] = $uid; + $_REQUEST['source'] = $source; + + // $_REQUEST['verb'] + // $_REQUEST['parent'] + // $_REQUEST['parent_uri'] + + $_REQUEST['title'] = $title; + $_REQUEST['body'] = $body; + $_REQUEST['location'] = $location; + + if (($_REQUEST['title'] == "") AND ($_REQUEST['body'] == "")) { + logger('fromgplus: empty post for user '.$uid." ".print_r($_REQUEST, true)); + return; + } + + require_once('mod/item.php'); + //print_r($_REQUEST); + logger('fromgplus: posting for user '.$uid." ".print_r($_REQUEST, true)); + item_post($a); + logger('fromgplus: done for user '.$uid); +} + +function fromgplus_html2bbcode($html) { $bbcode = html_entity_decode($html, ENT_QUOTES, 'UTF-8'); - $bbcode = str_replace(array("\n"), array(""), $bbcode); - $bbcode = str_replace(array("", ""), array("[b]", "[/b]"), $bbcode); - $bbcode = str_replace(array("", ""), array("[i]", "[/i]"), $bbcode); - $bbcode = str_replace(array("", ""), array("[s]", "[/s]"), $bbcode); - $bbcode = str_replace(array("
"), array("\n"), $bbcode); + $bbcode = str_ireplace(array("\n"), array(""), $bbcode); + $bbcode = str_ireplace(array("", ""), array("[b]", "[/b]"), $bbcode); + $bbcode = str_ireplace(array("", ""), array("[i]", "[/i]"), $bbcode); + $bbcode = str_ireplace(array("", ""), array("[s]", "[/s]"), $bbcode); + $bbcode = str_ireplace(array("
"), array("\n"), $bbcode); + $bbcode = str_ireplace(array("
"), array("\n"), $bbcode); + $bbcode = str_ireplace(array("
"), array("\n"), $bbcode); $bbcode = trim(strip_tags($bbcode)); return($bbcode); } -function friendicapost($post) { - global $friendica; +function fromgplus_parse_query($var) + { + /** + * Use this function to parse out the query array element from + * the output of parse_url(). + */ + $var = parse_url($var, PHP_URL_QUERY); + $var = html_entity_decode($var); + $var = explode('&', $var); + $arr = array(); + + foreach($var as $val) { + $x = explode('=', $val); + $arr[$x[0]] = $x[1]; + } + unset($val, $x, $var); + return $arr; +} + +function fromgplus_cleanupgoogleproxy($fullImage, $image) { + //$preview = "/w".$fullImage->width."-h".$fullImage->height."/"; + //$preview2 = "/w".$fullImage->width."-h".$fullImage->height."-p/"; + //$fullImage = str_replace(array($preview, $preview2), array("/", "/"), $fullImage->url); + $fullImage = $fullImage->url; + + //$preview = "/w".$image->width."-h".$image->height."/"; + //$preview2 = "/w".$image->width."-h".$image->height."-p/"; + //$image = str_replace(array($preview, $preview2), array("/", "/"), $image->url); + $image = $image->url; + + $cleaned = array(); + + $queryvar = fromgplus_parse_query($fullImage); + if ($queryvar['url'] != "") + $cleaned["full"] = urldecode($queryvar['url']); + else + $cleaned["full"] = $fullImage; + if (@exif_imagetype($cleaned["full"]) == 0) + $cleaned["full"] = ""; + + $queryvar = fromgplus_parse_query($image); + if ($queryvar['url'] != "") + $cleaned["preview"] = urldecode($queryvar['url']); + else + $cleaned["preview"] = $image; + if (@exif_imagetype($cleaned["preview"]) == 0) + $cleaned["preview"] = ""; + + if ($cleaned["full"] == "") { + $cleaned["full"] = $cleaned["preview"]; + $cleaned["preview"] = ""; + } + + if ($cleaned["full"] != "") + $infoFull = get_photo_info($cleaned["full"]); + else + $infoFull = array("0" => 0, "1" => 0); + + if ($cleaned["preview"] != "") + $infoPreview = get_photo_info($cleaned["preview"]); + else + $infoFull = array("0" => 0, "1" => 0); + + if (($infoPreview[0] >= $infoFull[0]) AND ($infoPreview[1] >= $infoFull[1])) { + $temp = $cleaned["full"]; + $cleaned["full"] = $cleaned["preview"]; + $cleaned["preview"] = $temp; + } - $api = new Statusnet($friendica["user"], $friendica["pw"], "GooglePlus", $friendica["server"]); - $ret = $api->updateStatus($post); - $api->endSession(); + if (($cleaned["full"] == $cleaned["preview"]) OR (($infoPreview[0] == $infoFull[0]) AND ($infoPreview[1] == $infoFull[1]))) + $cleaned["preview"] = ""; + + if ($cleaned["full"] == "") + if (@exif_imagetype($fullImage) != 0) + $cleaned["full"] = $fullImage; + + if ($cleaned["full"] == "") + if (@exif_imagetype($image) != 0) + $cleaned["full"] = $image; + + // Could be changed in the future to a link to the album + $cleaned["page"] = $cleaned["full"]; + + return($cleaned); } -function handleattachments($item) { +function fromgplus_cleantext($text) { + + // Don't know what it is. But it is added to the text. + $trash = html_entity_decode("", ENT_QUOTES, 'UTF-8'); + + $text = strip_tags($text); + $text = html_entity_decode($text, ENT_QUOTES); + $text = trim($text); + $text = str_replace(array("\n", "\r", " ", $trash), array("", "", "", ""), $text); + return($text); +} + +function fromgplus_handleattachments($a, $uid, $item, $displaytext, $shared) { + require_once("include/Photo.php"); + $post = ""; + $quote = ""; + $type = ""; foreach ($item->object->attachments as $attachment) { switch($attachment->objectType) { case "video": - //$post .= "\n\n[url=".$attachment->url."]". - // "[size=large][b]".html2bbcode($attachment->displayName)."[/b][/size][/url]\n"; - $post .= "\n\n[bookmark=".$attachment->url."]".html2bbcode($attachment->displayName)."[/bookmark]\n"; - - //if (strpos($attachment->embed->url, "youtube.com")) - // $post .= "[youtube]".$attachment->url."[/youtube]\n"; - //else - /// $post .= "[url=".$attachment->url."][img]".$attachment->image->url."[/img][/url]\n"; - - ///$post .= "[quote]".trim(html2bbcode($attachment->content))."[/quote]"; + $post .= "\n[class=type-video][bookmark=".$attachment->url."]".fromgplus_html2bbcode($attachment->displayName)."[/bookmark]\n[/class]"; break; case "article": - //$post .= "\n\n[url=".$attachment->url."]". - // "[size=large][b]".html2bbcode($attachment->displayName)."[/b][/size][/url]\n"; - $post .= "\n\n[bookmark=".$attachment->url."]".html2bbcode($attachment->displayName)."[/bookmark]\n"; - $post .= "[quote]".trim(html2bbcode($attachment->content))."[/quote]"; + $post .= "\n[class=type-link][bookmark=".$attachment->url."]".fromgplus_html2bbcode($attachment->displayName)."[/bookmark]\n"; + + $images = fromgplus_cleanupgoogleproxy($attachment->fullImage, $attachment->image); + if ($images["full"] != "") + $post .= "\n[img]".$images["full"]."[/img]"; + + $quote = trim(fromgplus_html2bbcode($attachment->content)); + if ($quote != "") + $quote = "\n[quote]".$quote."[/quote]"; + + $quote .= "[/class]"; break; case "photo": - //$post .= "\n\n[url=".$attachment->fullImage->url."]". - // "[img]".$attachment->fullImage->url."[/img][/url]\n"; - $post .= "\n\n[img]".$attachment->fullImage->url."[/img]\n"; - if ($attachment->displayName != "") - $post .= html2bbcode($attachment->displayName)."\n"; + // Don't store shared pictures in your wall photos (to prevent a possible violating of licenses) + if ($shared) + $images = fromgplus_cleanupgoogleproxy($attachment->fullImage, $attachment->image); + else { + if ($attachment->fullImage->url != "") + $images = store_photo($a, $uid, "", $attachment->fullImage->url); + elseif ($attachment->image->url != "") + $images = store_photo($a, $uid, "", $attachment->image->url); + } + + if ($images["preview"] != "") + $post .= "\n[url=".$images["page"]."][img]".$images["preview"]."[/img][/url]\n"; + elseif ($images["full"] != "") + $post .= "\n[img]".$images["full"]."[/img]\n"; + + if (($attachment->displayName != "") AND (fromgplus_cleantext($attachment->displayName) != fromgplus_cleantext($displaytext))) + $post .= fromgplus_html2bbcode($attachment->displayName)."\n"; break; case "photo-album": - $post .= "\n\n[url=".$attachment->url."]". - "[size=large][b]".html2bbcode($attachment->displayName)."[/b][/size][/url]\n"; + $post .= "\n\n[bookmark=".$attachment->url."]".fromgplus_html2bbcode($attachment->displayName)."[/bookmark]\n"; + + $images = fromgplus_cleanupgoogleproxy($attachment->fullImage, $attachment->image); + if ($images["preview"] != "") + $post .= "\n[url=".$images["full"]."][img]".$images["preview"]."[/img][/url]\n"; + elseif ($images["full"] != "") + $post .= "\n[img]".$images["full"]."[/img]\n"; + break; - default: - print_r($attachment); - die(); + case "album": + $post .= "\n[class=type-link][bookmark=".$attachment->url."]".fromgplus_html2bbcode($attachment->displayName)."[/bookmark]"; + + $thumb = $attachment->thumbnails[0]; + $post .= "\n[img]".$thumb->image->url."[/img]"; + + $quote = trim(fromgplus_html2bbcode($thumb->description)); + if ($quote != "") + $quote = "\n[quote]".$quote."[/quote]"; + + //foreach($attachment->thumbnails as $thumb) { + // $preview = "/w".$thumb->image->width."-h".$thumb->image->height."/"; + // $preview2 = "/w".$thumb->image->width."-h".$thumb->image->height."-p/"; + // $image = str_replace(array($preview, $preview2), array("/", "/"), $thumb->image->url); + + // $post .= "\n[url=".$thumb->url."][img]".$image."[/img][/url]\n"; + //} + $quote .= "[/class]"; + break; + case "audio": + $post .= "\n\n[bookmark=".$attachment->url."]".fromgplus_html2bbcode($attachment->displayName)."[/bookmark]\n"; break; + //default: + // die($attachment->objectType); } } - return($post); + return($post.$quote); } -$result = -file_get_contents("https://www.googleapis.com/plus/v1/people/".$google["id"]."/activities/public?alt=json&pp=1&key=".$google["key"]."&maxResults=".$google["maxfetch"]); -$activities = json_decode($result); +function fromgplus_fetch($a, $uid) { + $maxfetch = 20; -$state = array("lastid"=>''); -if (file_exists($statefile)) - $state = unserialize(file_get_contents($statefile)); + // Special blank to identify postings from the googleplus connector + $blank = html_entity_decode(" ", ENT_QUOTES, 'UTF-8'); -$lastid = ""; + $account = get_pconfig($uid,'fromgplus','account'); + $key = get_config('fromgplus','key'); -foreach($activities->items as $item) { - if ($item->id == $state["lastid"]) - break; + $result = fetch_url("https://www.googleapis.com/plus/v1/people/".$account."/activities/public?alt=json&pp=1&key=".$key."&maxResults=".$maxfetch); + //$result = file_get_contents("google.txt"); + //$result = file_get_contents("addon/fromgplus/album.txt"); + //file_put_contents("google.txt", $result); - if ($lastid == "") - $lastid = $item->id; + $activities = json_decode($result); - switch($item->object->objectType) { - case "note": - $post = html2bbcode($item->object->content); + $initiallastdate = get_pconfig($uid,'fromgplus','lastdate'); - if (is_array($item->object->attachments)) - $post .= handleattachments($item); - friendicapost($post); - break; + $first_time = ($initiallastdate == ""); - case "activity": - $post = html2bbcode($item->annotation)."\n"; - //$post .= html2bbcode("♲ "); - $post .= html2bbcode("♻ "); - $post .= "[url=".$item->object->actor->url."]".$item->object->actor->displayName."[/url]"; - $post .= " \n"; - //$post .= "[quote]"; + $lastdate = 0; - $post .= html2bbcode($item->object->content); + if (!is_array($activities->items)) + return; - if (is_array($item->object->attachments)) - $post .= "\n".trim(handleattachments($item)); + $reversed = array_reverse($activities->items); - //$post .= "[/quote]"; + foreach($reversed as $item) { + if (strtotime($item->published) <= $initiallastdate) + continue; - friendicapost($post); - break; + // Don't publish items that are too young + if (strtotime($item->published) > (time() - 3*60)) { + logger('fromgplus_fetch: item too new '.$item->published); + continue; + } - default: - print_r($item); - die(); - break; - } -} + if ($lastdate < strtotime($item->published)) + $lastdate = strtotime($item->published); + + if ($first_time) + continue; + + if ($item->access->description == "Public") + + // Loop prevention - ignore postings from HootSuite + if ($item->provider->title == "HootSuite") + continue; + + // Loop prevention through the special blank from the googleplus connector + if (strstr($item->object->content, $blank)) + continue; + + switch($item->object->objectType) { + case "note": + $post = fromgplus_html2bbcode($item->object->content); + + if (is_array($item->object->attachments)) + $post .= fromgplus_handleattachments($a, $uid, $item, $item->object->content, false); + + // geocode, placeName + if (isset($item->address)) + $location = $item->address; + else + $location = ""; -if ($lastid != "") { - $state['lastid'] = $lastid; - file_put_contents($statefile, serialize($state)); + fromgplus_post($a, $uid, "Google+", $post, $location); + //fromgplus_post($a, $uid, $item->provider->title, $post, $location); + + break; + + case "activity": + $post = fromgplus_html2bbcode($item->annotation)."\n"; + + if (!intval(get_config('system','old_share'))) { + $post .= "[share author='".str_replace("'", "'",$item->object->actor->displayName). + "' profile='".$item->object->actor->url. + "' avatar='".$item->object->actor->image->url. + "' link='".$item->object->url."']"; + + $post .= fromgplus_html2bbcode($item->object->content); + + if (is_array($item->object->attachments)) + $post .= "\n".trim(fromgplus_handleattachments($a, $uid, $item, $item->object->content, true)); + + $post .= "[/share]"; + } else { + $post .= fromgplus_html2bbcode("♲"); + $post .= " [url=".$item->object->actor->url."]".$item->object->actor->displayName."[/url] \n"; + $post .= fromgplus_html2bbcode($item->object->content); + + if (is_array($item->object->attachments)) + $post .= "\n".trim(fromgplus_handleattachments($a, $uid, $item, $item->object->content, true)); + } + + if (isset($item->address)) + $location = $item->address; + else + $location = ""; + + fromgplus_post($a, $uid, "Google+", $post, $location); + //fromgplus_post($a, $uid, $item->provider->title, $post, $location); + break; + } + } + if ($lastdate != 0) + set_pconfig($uid,'fromgplus','lastdate', $lastdate); } -*/