X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=lib%2Ffacebookutil.php;h=ec39872732fa45ae22ed95c88f4f3b34633ee28f;hb=2e221f5718c783cdb6b85d53570115e3d63c42ff;hp=61469b3c64adbec5202f681240884fe28bac4e7d;hpb=8fdf888edbd74e707d2698c7625dc90b22f0aeef;p=quix0rs-gnu-social.git diff --git a/lib/facebookutil.php b/lib/facebookutil.php index 61469b3c64..ec39872732 100644 --- a/lib/facebookutil.php +++ b/lib/facebookutil.php @@ -18,224 +18,116 @@ */ require_once INSTALLDIR.'/extlib/facebook/facebook.php'; +require_once INSTALLDIR.'/lib/facebookaction.php'; require_once INSTALLDIR.'/lib/noticelist.php'; define("FACEBOOK_SERVICE", 2); // Facebook is foreign_service ID 2 +define("FACEBOOK_NOTICE_PREFIX", 1); +define("FACEBOOK_PROMPTED_UPDATE_PREF", 2); -// Gets all the notices from users with a Facebook link since a given ID -function get_facebook_notices($since) -{ - $qry = 'SELECT notice.* ' . - 'FROM notice ' . - 'JOIN foreign_link ' . - 'WHERE notice.profile_id = foreign_link.user_id ' . - 'AND foreign_link.service = 2'; - - // XXX: What should the limit be? - return Notice::getStreamDirect($qry, 0, 100, 0, 0, null, $since); -} - -function get_facebook() +function getFacebook() { $apikey = common_config('facebook', 'apikey'); $secret = common_config('facebook', 'secret'); return new Facebook($apikey, $secret); } -function start_fbml($indent = true) -{ - global $xw; - $xw = new XMLWriter(); - $xw->openURI('php://output'); - $xw->setIndent($indent); +function updateProfileBox($facebook, $flink, $notice) { + $fbaction = new FacebookAction($output='php://output', $indent=true, $facebook, $flink); + $fbaction->updateProfileBox($notice); } -function update_profile_box($facebook, $fbuid, $user, $notice) -{ +function isFacebookBound($notice, $flink) { - // Need to include inline CSS for styling the Profile box - - $style = ''; - - global $xw; - $xw = new XMLWriter(); - $xw->openMemory(); - - $item = new FacebookNoticeListItem($notice); - $item->show(); - - $fbml = "$style " . $xw->outputMemory(false) . ""; - $fbml .= "$style " . $xw->outputMemory(false) . ""; - - $fbml_main = "$style " . $xw->outputMemory(false) . ""; - - $facebook->api_client->profile_setFBML(null, $fbuid, $fbml, null, null, $fbml_main); -} + // If the user does not want to broadcast to Facebook, move along + if (!($flink->noticesync & FOREIGN_NOTICE_SEND == FOREIGN_NOTICE_SEND)) { + common_log(LOG_INFO, "Skipping notice $notice->id " . + 'because user has FOREIGN_NOTICE_SEND bit off.'); + return false; + } -function getFacebookCSS() -{ - # Add a timestamp to the CSS file so Facebook cache wont ignore our changes - $ts = filemtime(theme_file('facebookapp.css')); - $cssurl = theme_path('facebookapp.css') . "?ts=$ts"; - return $cssurl; -} + $success = false; -function getFacebookJS() { - - # Add a timestamp to the FBJS file so Facebook cache wont ignore our changes - $ts = filemtime(INSTALLDIR.'/js/facebookapp.js'); - $jsurl = common_path('js/facebookapp.js') . "?ts=$ts"; - return $jsurl; -} + // If it's not a reply, or if the user WANTS to send @-replies... + if (!preg_match('/@[a-zA-Z0-9_]{1,15}\b/u', $notice->content) || + ($flink->noticesync & FOREIGN_NOTICE_SEND_REPLY)) { + $success = true; -class FacebookNoticeList extends NoticeList -{ - /** - * show the list of notices - * - * "Uses up" the stream by looping through it. So, probably can't - * be called twice on the same list. - * - * @return int count of notices listed. - */ - - function show() - { - common_element_start('div', array('id' =>'notices_primary')); - common_element('h2', null, _('Notices')); - common_element_start('ul', array('class' => 'notices')); - - $cnt = 0; - - while ($this->notice->fetch() && $cnt <= NOTICES_PER_PAGE) { - $cnt++; - - if ($cnt > NOTICES_PER_PAGE) { - break; - } + // The two condition below are deal breakers: - $item = $this->newListItem($this->notice); - $item->show(); + // Avoid a loop + if ($notice->source == 'Facebook') { + common_log(LOG_INFO, "Skipping notice $notice->id because its " . + 'source is Facebook.'); + $success = false; } - common_element_end('ul'); - common_element_end('div'); + $facebook = getFacebook(); + $fbuid = $flink->foreign_id; + + try { + + // Check to see if the user has given the FB app status update perms + $result = $facebook->api_client-> + users_hasAppPermission('status_update', $fbuid); + + if ($result != 1) { + $user = $flink->getUser(); + $msg = "Can't send notice $notice->id to Facebook " . + "because user $user->nickname hasn't given the " . + 'Facebook app \'status_update\' permission.'; + common_log(LOG_INFO, $msg); + $success = false; + } + + } catch(FacebookRestClientException $e){ + common_log(LOG_ERR, $e->getMessage()); + $success = false; + } - return $cnt; - } - - /** - * returns a new list item for the current notice - * - * Overridden to return a Facebook specific list item. - * - * @param Notice $notice the current notice - * - * @return FacebookNoticeListItem a list item for displaying the notice - * formatted for display in the Facebook App. - */ - - function newListItem($notice) - { - return new FacebookNoticeListItem($notice); } - + + return $success; + } -class FacebookNoticeListItem extends NoticeListItem + +function facebookBroadcastNotice($notice) { - /** - * recipe function for displaying a single notice in the Facebook App. - * - * Overridden to strip out some of the controls that we don't - * want to be available. - * - * @return void - */ - - function show() - { - $this->showStart(); - - common_element_start('div', 'entry-title'); - $this->showAuthor(); - $this->showContent(); - common_element_end('div'); - - common_element_start('div', 'entry-content'); - $this->showNoticeLink(); - $this->showNoticeSource(); - $this->showReplyTo(); - common_element_end('div'); - - $this->showEnd(); - } - - function showStart() - { - // XXX: RDFa - // TODO: add notice_type class e.g., notice_video, notice_image - common_element_start('li', array('class' => 'hentry notice', - 'id' => 'notice-' . $this->notice->id)); - } + $facebook = getFacebook(); + $flink = Foreign_link::getByUserID($notice->profile_id, FACEBOOK_SERVICE); + $fbuid = $flink->foreign_id; + + if (isFacebookBound($notice, $flink)) { + + $status = null; + + // Get the status 'verb' (prefix) the user has set + try { + $prefix = $facebook->api_client-> + data_getUserPreference(FACEBOOK_NOTICE_PREFIX, $fbuid); - function showNoticeLink() - { - $noticeurl = common_local_url('shownotice', - array('notice' => $this->notice->id)); - // XXX: we need to figure this out better. Is this right? - if (strcmp($this->notice->uri, $noticeurl) != 0 && - preg_match('/^http/', $this->notice->uri)) { - $noticeurl = $this->notice->uri; + $status = "$prefix $notice->content"; + + } catch(FacebookRestClientException $e) { + common_log(LOG_ERR, $e->getMessage()); + return false; } - - common_element_start('dl', 'timestamp'); - common_element('dt', null, _('Published')); - common_element_start('dd', null); - common_element_start('a', array('rel' => 'bookmark', - 'href' => $noticeurl)); - $dt = common_date_iso8601($this->notice->created); - common_element('abbr', array('class' => 'published', - 'title' => $dt), - common_date_string($this->notice->created)); - common_element_end('a'); - common_element_end('dd'); - common_element_end('dl'); - } -} + // Okay, we're good to go! + + try { + $facebook->api_client->users_setStatus($status, $fbuid, false, true); + updateProfileBox($facebook, $flink, $notice); + } catch(FacebookRestClientException $e) { + common_log(LOG_ERR, $e->getMessage()); + return false; + + // Should we remove flink if this fails? + } + + } + return true; +}