]> git.mxchange.org Git - friendica-addons.git/blobdiff - facebook/facebook.php
missing paren
[friendica-addons.git] / facebook / facebook.php
index 874ef3022da9ea972732f686228f3d206931fa08..e48d73ad403b1e2cfb6a169f00e02724a06e1eb5 100644 (file)
@@ -33,6 +33,7 @@ define('FACEBOOK_MAXPOSTLEN', 63206);
 define('FACEBOOK_SESSION_ERR_NOTIFICATION_INTERVAL', 259200); // 3 days
 define('FACEBOOK_DEFAULT_POLL_INTERVAL', 60); // given in minutes
 define('FACEBOOK_MIN_POLL_INTERVAL', 5);
+define('FACEBOOK_RTU_ERR_MAIL_AFTER_MINUTES', 180); // 3 hours
 
 require_once('include/security.php');
 
@@ -78,38 +79,38 @@ function facebook_init(&$a) {
 
        if (x($_REQUEST, "realtime_cb") && x($_REQUEST, "realtime_cb")) {
                logger("facebook_init: Facebook Real-Time callback called", LOGGER_DEBUG);
-               
+
                if (x($_REQUEST, "hub_verify_token")) {
                        // this is the verification callback while registering for real time updates
-                       
+
                        $verify_token = get_config('facebook', 'cb_verify_token');
                        if ($verify_token != $_REQUEST["hub_verify_token"]) {
                                logger('facebook_init: Wrong Facebook Callback Verifier - expected ' . $verify_token . ', got ' . $_REQUEST["hub_verify_token"]);
                                return;
                        }
-                       
+
                        if (x($_REQUEST, "hub_challenge")) {
                                logger('facebook_init: Answering Challenge: ' . $_REQUEST["hub_challenge"], LOGGER_DATA);
                                echo $_REQUEST["hub_challenge"];
                                die();
                        }
                }
-               
+
                require_once('include/items.php');
-               
+
                // this is a status update
                $content = file_get_contents("php://input");
                if (is_numeric($content)) $content = file_get_contents("php://input");
                $js = json_decode($content);
                logger(print_r($js, true), LOGGER_DATA);
-               
+
                if (!isset($js->object) || $js->object != "user" || !isset($js->entry)) {
                        logger('facebook_init: Could not parse Real-Time Update data', LOGGER_DEBUG);
                        return;
                }
-               
+
                $affected_users = array("feed" => array(), "friends" => array());
-               
+
                foreach ($js->entry as $entry) {
                        $fbuser = $entry->uid;
                        foreach ($entry->changed_fields as $field) {
@@ -118,20 +119,20 @@ function facebook_init(&$a) {
                                        continue;
                                }
                                if (in_array($fbuser, $affected_users[$field])) continue;
-                               
+
                                $r = q("SELECT `uid` FROM `pconfig` WHERE `cat` = 'facebook' AND `k` = 'self_id' AND `v` = '%s' LIMIT 1", dbesc($fbuser));
                                if(! count($r))
                                        continue;
                                $uid = $r[0]['uid'];
-                               
+
                                $access_token = get_pconfig($uid,'facebook','access_token');
                                if(! $access_token)
                                        return;
-                               
+
                                switch ($field) {
                                        case "feed":
                                                logger('facebook_init: FB-User ' . $fbuser . ' / feed', LOGGER_DEBUG);
-                                               
+
                                                if(! get_pconfig($uid,'facebook','no_wall')) {
                                                        $private_wall = intval(get_pconfig($uid,'facebook','private_wall'));
                                                        $s = fetch_url('https://graph.facebook.com/me/feed?access_token=' . $access_token);
@@ -145,11 +146,11 @@ function facebook_init(&$a) {
                                                                }
                                                        }
                                                }
-                                               
+
                                        break;
                                        case "friends":
                                                logger('facebook_init: FB-User ' . $fbuser . ' / friends', LOGGER_DEBUG);
-                                               
+
                                                fb_get_friends($uid, false);
                                                set_pconfig($uid,'facebook','friend_check',time());
                                        break;
@@ -161,7 +162,7 @@ function facebook_init(&$a) {
                }
        }
 
-       
+
        if($a->argc != 2)
                return;
        $nick = $a->argv[1];
@@ -187,7 +188,7 @@ function facebook_init(&$a) {
 
                $x = fetch_url('https://graph.facebook.com/oauth/access_token?client_id='
                        . $appid . '&client_secret=' . $appsecret . '&redirect_uri='
-                       . urlencode($a->get_baseurl() . '/facebook/' . $nick) 
+                       . urlencode($a->get_baseurl() . '/facebook/' . $nick)
                        . '&code=' . $auth_code);
 
                logger('facebook_init: returned access token: ' . $x, LOGGER_DATA);
@@ -269,9 +270,13 @@ function fb_get_friends_sync_parsecontact($uid, $contact) {
 
     if(count($r)) {
 
+               // update profile photos once every two weeks as we have no notification of when they change.
+
+               $update_photo = (($r[0]['avatar-date'] < datetime_convert('','','now -14 days')) ? true : false);
+
         // 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'])) {
+        if((! $r[0]['photo']) || (! $r[0]['thumb']) || (! $r[0]['micro']) || ($update_photo)) {
             require_once("Photo.php");
 
             $photos = import_profile_photo('https://graph.facebook.com/' . $contact->id . '/picture', $uid, $r[0]['id']);
@@ -311,7 +316,7 @@ function fb_get_friends_sync_parsecontact($uid, $contact) {
             dbesc($contact->id),
             dbesc('facebook ' . $contact->id),
             dbesc($contact->name),
-            dbesc(($contact->nickname) ? $contact->nickname : strtolower($contact->first_name)),
+            dbesc(($contact->nickname) ? $contact->nickname : mb_convert_case($contact->first_name, MB_CASE_LOWER, "UTF-8")),
             dbesc('https://graph.facebook.com/' . $contact->id . '/picture'),
             dbesc(NETWORK_FACEBOOK),
             intval(CONTACT_IS_FRIEND),
@@ -331,6 +336,14 @@ function fb_get_friends_sync_parsecontact($uid, $contact) {
 
     $contact_id  = $r[0]['id'];
 
+       $g = q("select def_gid from user where uid = %d limit 1",
+               intval($uid)
+       );
+       if($g && intval($g[0]['def_gid'])) {
+               require_once('include/group.php');
+               group_add_member($uid,'',$contact_id,$g[0]['def_gid']);
+       }
+
     require_once("Photo.php");
 
     $photos = import_profile_photo($r[0]['photo'],$uid,$contact_id);
@@ -395,6 +408,7 @@ function fb_get_friends($uid, $fullsync = true) {
        $access_token = get_pconfig($uid,'facebook','access_token');
 
        $no_linking = get_pconfig($uid,'facebook','no_linking');
+
        if($no_linking)
                return;
 
@@ -419,7 +433,7 @@ function fb_get_friends($uid, $fullsync = true) {
 }
 
 // This is the POST method to the facebook settings page
-// Content is posted to Facebook in the function facebook_post_hook() 
+// Content is posted to Facebook in the function facebook_post_hook()
 
 /**
  * @param App $a
@@ -429,6 +443,10 @@ function facebook_post(&$a) {
        $uid = local_user();
        if($uid){
 
+
+               $fb_limited = get_config('facebook','crestrict');
+
+
                $value = ((x($_POST,'post_by_default')) ? intval($_POST['post_by_default']) : 0);
                set_pconfig($uid,'facebook','post_by_default', $value);
 
@@ -439,12 +457,18 @@ function facebook_post(&$a) {
 
                $private_wall = ((x($_POST,'facebook_private_wall')) ? intval($_POST['facebook_private_wall']) : 0);
                set_pconfig($uid,'facebook','private_wall',$private_wall);
-       
+
 
                set_pconfig($uid,'facebook','blocked_apps',escape_tags(trim($_POST['blocked_apps'])));
 
                $linkvalue = ((x($_POST,'facebook_linking')) ? intval($_POST['facebook_linking']) : 0);
-               set_pconfig($uid,'facebook','no_linking', (($linkvalue) ? 0 : 1));
+
+               if($fb_limited) {
+                       if($linkvalue == 0)
+                               set_pconfig($uid,'facebook','no_linking', 1);
+               }
+               else
+                       set_pconfig($uid,'facebook','no_linking', (($linkvalue) ? 0 : 1));
 
                // FB linkage was allowed but has just been turned off - remove all FB contacts and posts
 
@@ -485,6 +509,13 @@ function facebook_content(&$a) {
                return '';
        }
 
+
+       if(! service_class_allows(local_user(),'facebook_connect')) {
+               notice( t('Permission denied.') . EOL);
+               return upgrade_bool_message();
+       }
+
+
        if($a->argc > 1 && $a->argv[1] === 'remove') {
                del_pconfig(local_user(),'facebook','post');
                info( t('Facebook disabled') . EOL);
@@ -495,6 +526,9 @@ function facebook_content(&$a) {
                info( t('Updating contacts') . EOL);
        }
 
+
+       $fb_limited = get_config('facebook','restrict');
+
        $o = '';
        
        $fb_installed = false;
@@ -548,6 +582,15 @@ function facebook_content(&$a) {
 
                $no_linking = get_pconfig(local_user(),'facebook','no_linking');
                $checked = (($no_linking) ? '' : ' checked="checked" ');
+               if($fb_limited) {
+                       if($no_linking) {
+                               $o .= EOL . '<strong>' . t('Facebook friend linking has been disabled on this site. The following settings will have no effect.') . '</strong>' . EOL;
+                               $checked .= " disabled ";
+                       }
+                       else {
+                               $o .= EOL . '<strong>' . t('Facebook friend linking has been disabled on this site. If you disable it, you will be unable to re-enable it.') . '</strong>' . EOL;
+                       }
+               }
                $o .= '<input type="checkbox" name="facebook_linking" value="1"' . $checked . '/>' . ' ' . t('Link all your Facebook friends and conversations on this website') . EOL ;
 
                $o .= '<p>' . t('Facebook conversations consist of your <em>profile wall</em> and your friend <em>stream</em>.');
@@ -592,7 +635,7 @@ function facebook_cron($a,$b) {
                $poll_interval = FACEBOOK_DEFAULT_POLL_INTERVAL;
 
        if($last) {
-               $next = $last + $poll_interval;
+               $next = $last + ($poll_interval * 60);
                if($next > time()) 
                        return;
        }
@@ -643,8 +686,15 @@ function facebook_cron($a,$b) {
                                logger('facebook_cron: Successful', LOGGER_NORMAL);
                        else {
                                logger('facebook_cron: Failed', LOGGER_NORMAL);
-                               
-                               if(strlen($a->config['admin_email']) && !get_config('facebook', 'realtime_err_mailsent')) {
+
+                               $first_err = get_config('facebook', 'realtime_first_err');
+                               if (!$first_err) {
+                                       $first_err = time();
+                                       set_config('facebook', 'realtime_first_err', $first_err);
+                               }
+                               $first_err_ago = (time() - $first_err);
+
+                               if(strlen($a->config['admin_email']) && !get_config('facebook', 'realtime_err_mailsent') && $first_err_ago > (FACEBOOK_RTU_ERR_MAIL_AFTER_MINUTES * 60)) {
                                        mail($a->config['admin_email'], t('Problems with Facebook Real-Time Updates'),
                                                "Hi!\n\nThere's a problem with the Facebook Real-Time Updates that cannot be solved automatically. Maybe a permission issue?\n\nPlease try to re-activate it on " . $a->config["system"]["url"] . "/admin/plugins/facebook\n\nThis e-mail will only be sent once.",
                                                'From: ' . t('Administrator') . '@' . $_SERVER['SERVER_NAME'] . "\n"
@@ -657,6 +707,7 @@ function facebook_cron($a,$b) {
                        }
                } else { // !facebook_check_realtime_active()
                        del_config('facebook', 'realtime_err_mailsent');
+                       del_config('facebook', 'realtime_first_err');
                }
        }
        
@@ -712,7 +763,7 @@ function facebook_plugin_admin(&$a, &$o){
        
        $o .= '<label for="fb_appid">' . t('App-ID / API-Key') . '</label><input id="fb_appid" name="appid" type="text" value="' . escape_tags($appid ? $appid : "") . '"><br style="clear: both;">';
        $o .= '<label for="fb_appsecret">' . t('Application secret') . '</label><input id="fb_appsecret" name="appsecret" type="text" value="' . escape_tags($appsecret ? $appsecret : "") . '"><br style="clear: both;">';
-       $o .= '<label for="fb_poll_interval">' . sprintf(t('Polling Interval (min. %1$s minutes)'), FACEBOOK_MIN_POLL_INTERVAL) . '</label><input name="poll_interval" id="fb_poll_interval" type="number" min="' . FACEBOOK_MIN_POLL_INTERVAL . '" value="' . $poll_interval . '"><br style="clear: both;">';
+       $o .= '<label for="fb_poll_interval">' . sprintf(t('Polling Interval in minutes (minimum %1$s minutes)'), FACEBOOK_MIN_POLL_INTERVAL) . '</label><input name="poll_interval" id="fb_poll_interval" type="number" min="' . FACEBOOK_MIN_POLL_INTERVAL . '" value="' . $poll_interval . '"><br style="clear: both;">';
        $o .= '<label for="fb_sync_comments">' . t('Synchronize comments (no comments on Facebook are missed, at the cost of increased system load)') . '</label><input name="sync_comments" id="fb_sync_comments" type="checkbox" ' . ($sync_comments ? 'checked' : '') . '><br style="clear: both;">';
        $o .= '<input type="submit" name="fb_save_keys" value="' . t('Save') . '">';
        
@@ -731,9 +782,9 @@ function facebook_plugin_admin(&$a, &$o){
 
 /**
  * @param App $a
- * @param null|object $o
  */
-function facebook_plugin_admin_post(&$a, &$o){
+
+function facebook_plugin_admin_post(&$a){
        check_form_security_token_redirectOnErr('/admin/plugins/facebook', 'fbsave');
        
        if (x($_REQUEST,'fb_save_keys')) {
@@ -897,7 +948,7 @@ function facebook_post_hook(&$a,&$b) {
                        if($fb_token && ($toplevel || $b['private'] || $reply)) {
                                logger('facebook: able to post');
                                require_once('library/facebook.php');
-                               require_once('include/bbcode.php');     
+                               require_once('include/bbcode.php');
 
                                $msg = $b['body'];
 
@@ -972,7 +1023,7 @@ function facebook_post_hook(&$a,&$b) {
                                }
 
                                // At first convert the text to html
-                               $html = bbcode($body);
+                               $html = bbcode($body, false, false);
 
                                // Then convert it to plain text
                                $msg = trim($b['title']." \n\n".html2plain($html, 0, true));
@@ -1089,8 +1140,8 @@ function facebook_post_hook(&$a,&$b) {
                                } else {
                                        // if its only a message and a subject and the message is larger than 500 characters then post it as note
                                        $postvars = array(
-                                               'access_token' => $fb_token, 
-                                               'message' => bbcode($b['body']),
+                                               'access_token' => $fb_token,
+                                               'message' => bbcode($b['body'], false, false),
                                                'subject' => $b['title'],
                                        );
                                        $url = 'https://graph.facebook.com/me/notes';
@@ -1425,7 +1476,7 @@ function fb_consume_comment(&$a, &$user, &$self, $fb_id, $wall, &$orig_post, &$c
     $cmntdata['body'] = $cmnt->message;
     $item = item_store($cmntdata);
 
-    $myconv = q("SELECT `author-link`, `author-avatar`, `parent` FROM `item` WHERE `parent-uri` = '%s' AND `uid` = %d AND `parent` != 0 ",
+    $myconv = q("SELECT `author-link`, `author-avatar`, `parent` FROM `item` WHERE `parent-uri` = '%s' AND `uid` = %d AND `parent` != 0 AND `deleted` = 0",
         dbesc($orig_post['uri']),
         intval($uid)
     );