]> git.mxchange.org Git - friendica-addons.git/blobdiff - facebook/facebook.php
Merge commit 'upstream/master'
[friendica-addons.git] / facebook / facebook.php
index 8fcde40332e7ff02fc6c94a675e947c16510a017..1afa996df08aab3163ce906f024acef65093bba3 100755 (executable)
  * - Implement a configuration option to set the polling interval system-wide
  */
 
-define('FACEBOOK_MAXPOSTLEN', 420);
+// Size of maximum post length increased
+// see http://www.facebook.com/schrep/posts/203969696349811
+// define('FACEBOOK_MAXPOSTLEN', 420);
+define('FACEBOOK_MAXPOSTLEN', 63206);
 define('FACEBOOK_SESSION_ERR_NOTIFICATION_INTERVAL', 259200); // 3 days
 
-
 function facebook_install() {
        register_hook('post_local',       'addon/facebook/facebook.php', 'facebook_post_local');
        register_hook('notifier_normal',  'addon/facebook/facebook.php', 'facebook_post_hook');
@@ -464,9 +466,21 @@ function facebook_content(&$a) {
                info( t('Updating contacts') . EOL);
        }
 
-
-       $fb_installed = get_pconfig(local_user(),'facebook','post');
-
+       $o = '';
+       
+       $fb_installed = false;
+       if (get_pconfig(local_user(),'facebook','post')) {
+               $access_token = get_pconfig(local_user(),'facebook','access_token');
+               if ($access_token) {
+                       $private_wall = intval(get_pconfig($uid,'facebook','private_wall'));
+                       $s = fetch_url('https://graph.facebook.com/me/feed?access_token=' . $access_token);
+                       if($s) {
+                               $j = json_decode($s);
+                               if (isset($j->data)) $fb_installed = true;
+                       }
+               }
+       }
+       
        $appid = get_config('facebook','appid');
 
        if(! $appid) {
@@ -629,17 +643,39 @@ function facebook_plugin_settings(&$a,&$b) {
 
 
 function facebook_plugin_admin(&$a, &$o){
+       $o = '<input type="hidden" name="form_security_token" value="' . get_form_security_token("fbsave") . '">';
        
-       $activated = facebook_check_realtime_active();
-       if ($activated) {
-               $o = t('Real-Time Updates are activated.') . '<br><br>';
-               $o .= '<input type="submit" name="real_time_deactivate" value="' . t('Deactivate Real-Time Updates') . '">';
-       } else {
-               $o = t('Real-Time Updates not activated.') . '<br><input type="submit" name="real_time_activate" value="' . t('Activate Real-Time Updates') . '">';
+       $o .= '<h4>' . t('Facebook API Key') . '</h4>';
+       
+       $appid  = get_config('facebook', 'appid'  );
+       $appsecret = get_config('facebook', 'appsecret' );
+       
+       $o .= '<label for="fb_appid">' . t('App-ID / API-Key') . '</label><input name="appid" type="text" value="' . escape_tags($appid ? $appid : "") . '"><br style="clear: both;">';
+       $o .= '<label for="fb_appsecret">' . t('Application secret') . '</label><input name="appsecret" type="text" value="' . escape_tags($appsecret ? $appsecret : "") . '"><br style="clear: both;">';
+       $o .= '<input type="submit" name="fb_save_keys" value="' . t('Save') . '">';
+       
+       if ($appid && $appsecret) {
+               $o .= '<h4>' . t('Real-Time Updates') . '</h4>';
+               
+               $activated = facebook_check_realtime_active();
+               if ($activated) {
+                       $o .= t('Real-Time Updates are activated.') . '<br><br>';
+                       $o .= '<input type="submit" name="real_time_deactivate" value="' . t('Deactivate Real-Time Updates') . '">';
+               } else {
+                       $o .= t('Real-Time Updates not activated.') . '<br><input type="submit" name="real_time_activate" value="' . t('Activate Real-Time Updates') . '">';
+               }
        }
 }
 
 function facebook_plugin_admin_post(&$a, &$o){
+       check_form_security_token_redirectOnErr('/admin/plugins/facebook', 'fbsave');
+       
+       if (x($_REQUEST,'fb_save_keys')) {
+               set_config('facebook', 'appid', $_REQUEST['appid']);
+               set_config('facebook', 'appsecret', $_REQUEST['appsecret']);
+               del_config('facebook', 'app_access_token');
+               info(t('The new values have been saved.'));
+       }
        if (x($_REQUEST,'real_time_activate')) {
                facebook_subscription_add_users();
        }
@@ -794,6 +830,7 @@ function facebook_post_hook(&$a,&$b) {
                                if($b['verb'] == ACTIVITY_DISLIKE)
                                        $msg = trim(strip_tags(bbcode($msg)));
 
+                               // Old code
                                /*$search_str = $a->get_baseurl() . '/search';
 
                                if(preg_match("/\[url=(.*?)\](.*?)\[\/url\]/is",$msg,$matches)) {
@@ -825,23 +862,47 @@ function facebook_post_hook(&$a,&$b) {
 
                                $msg = trim(strip_tags(bbcode($msg)));*/
 
-                               // Test
+                               // New code
 
-                               // Looking for images
+                               // Looking for the first image
+                               $image = '';
                                if(preg_match("/\[img\=([0-9]*)x([0-9]*)\](.*?)\[\/img\]/is",$b['body'],$matches))
                                        $image = $matches[3];
 
-                               if(preg_match("/\[img\](.*?)\[\/img\]/is",$b['body'],$matches))
-                                       $image = $matches[1];
+                               if ($image != '')
+                                       if(preg_match("/\[img\](.*?)\[\/img\]/is",$b['body'],$matches))
+                                               $image = $matches[1];
+
+                               // Checking for a bookmark element
+                               $body = $b['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 the bookmark and all quotes after the bookmark
+                                       // they are mostly only the content after the bookmark.
+                                       $body2 = preg_replace("/\[bookmark\=([^\]]*)\](.*?)\[\/bookmark\]/ism",'',$body2);
+                                       $body2 = preg_replace("/\[quote\=([^\]]*)\](.*?)\[\/quote\]/ism",'',$body2);
+                                       $body2 = preg_replace("/\[quote\](.*?)\[\/quote\]/ism",'',$body2);
+
+                                       $body = $body1.$body2;
+                               }
+
+                               // At first convert the text to html
+                               $html = bbcode($body);
 
-                               $html = bbcode($b['body']);
-                               $msg = trim($b['title']." \n".html2plain($html, 0, true));
+                               // Then convert it to plain text
+                               $msg = trim($b['title']." \n\n".html2plain($html, 0, true));
                                $msg = html_entity_decode($msg,ENT_QUOTES,'UTF-8');
 
-                               $toolong = false;
+                               // Removing multiple newlines
+                               while (strpos($msg, "\n\n\n") !== false)
+                                       $msg = str_replace("\n\n\n", "\n\n", $msg);
 
                                // add any attachments as text urls
-
                                $arr = explode(',',$b['attach']);
 
                                if(count($arr)) {
@@ -855,19 +916,28 @@ function facebook_post_hook(&$a,&$b) {
                                        }
                                }
 
-                               // To-Do: look for bookmark-bbcode and handle it with priority
+                               $link = '';
+                               $linkname = '';
+                               // look for bookmark-bbcode and handle it with priority
+                               if(preg_match("/\[bookmark\=([^\]]*)\](.*?)\[\/bookmark\]/is",$b['body'],$matches)) {
+                                       $link = $matches[1];
+                                       $linkname = $matches[2];
+                               }
 
-                               $links = collecturls($html);
-                               if (sizeof($links) > 0) {
-                                       reset($links);
-                                       $link = current($links);
-                                       /*if (strlen($msg."\n".$link) <= FACEBOOK_MAXPOSTLEN)
-                                               $msg .= "\n".$link;
-                                       else
-                                               $toolong = true;*/
+                               // 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);
+                                       }
                                }
 
-                               if ((strlen($msg) > FACEBOOK_MAXPOSTLEN) or $toolong) {
+                               // Remove trailing and leading spaces
+                               $msg = trim($msg);
+
+                               // Since facebook increased the maxpostlen massively this never should happen again :)
+                               if (strlen($msg) > FACEBOOK_MAXPOSTLEN) {
                                        $shortlink = "";
                                        require_once('library/slinky.php');
 
@@ -884,7 +954,19 @@ function facebook_post_hook(&$a,&$b) {
                                        $msg = substr($msg, 0, FACEBOOK_MAXPOSTLEN - strlen($shortlink) - 4);
                                        $msg .= '... ' . $shortlink;
                                }
-                               if(! strlen($msg))
+
+                               // Fallback - if message is empty
+                               if(!strlen($msg))
+                                       $msg = $linkname;
+
+                               if(!strlen($msg))
+                                       $msg = $link;
+
+                               if(!strlen($msg))
+                                       $msg = $image;
+
+                               // If there is nothing to post then exit
+                               if(!strlen($msg))
                                        return;
 
                                logger('Facebook post: msg=' . $msg, LOGGER_DATA);
@@ -1448,8 +1530,8 @@ function fb_get_app_access_token() {
                logger('fb_get_app_access_token: appid and/or appsecret not set', LOGGER_DEBUG);
                return false;
        }
-       
-       $x = fetch_url('https://graph.facebook.com/oauth/access_token?client_id=' . $appid . '&client_secret=' . $appsecret . "&grant_type=client_credentials");
+       logger('https://graph.facebook.com/oauth/access_token?client_id=' . $appid . '&client_secret=' . $appsecret . '&grant_type=client_credentials', LOGGER_DATA);
+       $x = fetch_url('https://graph.facebook.com/oauth/access_token?client_id=' . $appid . '&client_secret=' . $appsecret . '&grant_type=client_credentials');
        
        if(strpos($x,'access_token=') !== false) {
                logger('fb_get_app_access_token: returned access token: ' . $x, LOGGER_DATA);
@@ -1480,8 +1562,7 @@ function facebook_subscription_del_users() {
        del_config('facebook', 'realtime_active');
 }
 
-function facebook_subscription_add_users() {
-       
+function facebook_subscription_add_users($second_try = false) {
        $a = get_app();
        $access_token = fb_get_app_access_token();
        
@@ -1502,9 +1583,18 @@ function facebook_subscription_add_users() {
        del_config('facebook', 'cb_verify_token');
        
        if ($j) {
+               $x = json_decode($j);
                logger("Facebook reponse: " . $j, LOGGER_DATA);
-               
-               if (facebook_check_realtime_active()) set_config('facebook', 'realtime_active', 1);
+               if (isset($x->error)) {
+                       logger('facebook_subscription_add_users: got an error: ' . $j);
+                       if ($x->error->type == "OAuthException" && $x->error->code == 190) {
+                               del_config('facebook', 'app_access_token');
+                               if ($second_try === false) facebook_subscription_add_users(true);
+                       }
+               } else {
+                       logger('facebook_subscription_add_users: sucessful');
+                       if (facebook_check_realtime_active()) set_config('facebook', 'realtime_active', 1);
+               }
        };
 }