| 
									
										
										
										
											2010-11-05 06:34:06 +00:00
										 |  |  | <?php | 
					
						
							|  |  |  | /** | 
					
						
							|  |  |  |  * StatusNet, the distributed open-source microblogging tool | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * Class for communicating with Facebook | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * PHP version 5 | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * LICENCE: This program is free software: you can redistribute it and/or modify | 
					
						
							|  |  |  |  * it under the terms of the GNU Affero General Public License as published by | 
					
						
							|  |  |  |  * the Free Software Foundation, either version 3 of the License, or | 
					
						
							|  |  |  |  * (at your option) any later version. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * This program is distributed in the hope that it will be useful, | 
					
						
							|  |  |  |  * but WITHOUT ANY WARRANTY; without even the implied warranty of | 
					
						
							|  |  |  |  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | 
					
						
							|  |  |  |  * GNU Affero General Public License for more details. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * You should have received a copy of the GNU Affero General Public License | 
					
						
							|  |  |  |  * along with this program.  If not, see <http://www.gnu.org/licenses/>. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * @category  Plugin | 
					
						
							|  |  |  |  * @package   StatusNet | 
					
						
							|  |  |  |  * @author    Craig Andrews <candrews@integralblue.com> | 
					
						
							|  |  |  |  * @author    Zach Copley <zach@status.net> | 
					
						
							| 
									
										
										
										
											2011-09-27 04:09:47 +00:00
										 |  |  |  * @copyright 2009-2011 StatusNet, Inc. | 
					
						
							| 
									
										
										
										
											2010-11-05 06:34:06 +00:00
										 |  |  |  * @license   http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 | 
					
						
							|  |  |  |  * @link      http://status.net/ | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | if (!defined('STATUSNET')) { | 
					
						
							|  |  |  |     exit(1); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /** | 
					
						
							|  |  |  |  * Class for communication with Facebook | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * @category Plugin | 
					
						
							|  |  |  |  * @package  StatusNet | 
					
						
							|  |  |  |  * @author   Zach Copley <zach@status.net> | 
					
						
							|  |  |  |  * @license  http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 | 
					
						
							|  |  |  |  * @link     http://status.net/ | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | class Facebookclient | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     protected $facebook      = null; // Facebook Graph client obj
 | 
					
						
							|  |  |  |     protected $flink         = null; // Foreign_link StatusNet -> Facebook
 | 
					
						
							|  |  |  |     protected $notice        = null; // The user's notice
 | 
					
						
							|  |  |  |     protected $user          = null; // Sender of the notice
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-03-30 17:01:06 -07:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @param Notice $notice the notice to manipulate | 
					
						
							|  |  |  |      * @param Profile $profile local user to act as; if left empty, the notice's poster will be used. | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     function __construct($notice, $profile=null) | 
					
						
							| 
									
										
										
										
											2010-11-05 06:34:06 +00:00
										 |  |  |     { | 
					
						
							|  |  |  |         $this->facebook = self::getFacebook(); | 
					
						
							| 
									
										
										
										
											2011-02-24 12:52:31 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |         if (empty($this->facebook)) { | 
					
						
							|  |  |  |             throw new FacebookApiException( | 
					
						
							|  |  |  |                 "Could not create Facebook client! Bad application ID or secret?" | 
					
						
							|  |  |  |             ); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $this->notice = $notice; | 
					
						
							| 
									
										
										
										
											2010-11-05 06:34:06 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-03-30 17:01:06 -07:00
										 |  |  |         $profile_id = $profile ? $profile->id : $notice->profile_id; | 
					
						
							| 
									
										
										
										
											2015-07-18 11:39:34 +02:00
										 |  |  |         try { | 
					
						
							|  |  |  |             $this->flink = Foreign_link::getByUserID($profile_id, FACEBOOK_SERVICE); | 
					
						
							| 
									
										
										
										
											2010-11-29 23:57:41 +00:00
										 |  |  |             $this->user = $this->flink->getUser(); | 
					
						
							| 
									
										
										
										
											2015-07-18 11:39:34 +02:00
										 |  |  |         } catch (NoResultException $e) { | 
					
						
							|  |  |  |             // at least $this->flink could've gotten set to something,
 | 
					
						
							|  |  |  |             // but the logic that was here before didn't care, so let's not care either
 | 
					
						
							| 
									
										
										
										
											2010-11-29 23:57:41 +00:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2010-11-05 06:34:06 +00:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /* | 
					
						
							|  |  |  |      * Get an instance of the Facebook Graph SDK object | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @param string $appId     Application | 
					
						
							|  |  |  |      * @param string $secret    Facebook API secret | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @return Facebook A Facebook SDK obj | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     static function getFacebook($appId = null, $secret = null) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         // Check defaults and configuration for application ID and secret
 | 
					
						
							|  |  |  |         if (empty($appId)) { | 
					
						
							|  |  |  |             $appId = common_config('facebook', 'appid'); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if (empty($secret)) { | 
					
						
							|  |  |  |             $secret = common_config('facebook', 'secret'); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         // If there's no app ID and secret set in the local config, look
 | 
					
						
							|  |  |  |         // for a global one
 | 
					
						
							|  |  |  |         if (empty($appId) || empty($secret)) { | 
					
						
							|  |  |  |             $appId  = common_config('facebook', 'global_appid'); | 
					
						
							|  |  |  |             $secret = common_config('facebook', 'global_secret'); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-24 12:52:31 -08:00
										 |  |  |         if (empty($appId)) { | 
					
						
							|  |  |  |             common_log( | 
					
						
							|  |  |  |                 LOG_WARNING, | 
					
						
							|  |  |  |                 "Couldn't find Facebook application ID!", | 
					
						
							|  |  |  |                 __FILE__ | 
					
						
							|  |  |  |             ); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if (empty($secret)) { | 
					
						
							|  |  |  |             common_log( | 
					
						
							|  |  |  |                 LOG_WARNING, | 
					
						
							|  |  |  |                 "Couldn't find Facebook application ID!", | 
					
						
							|  |  |  |                 __FILE__ | 
					
						
							|  |  |  |             ); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-11-05 06:34:06 +00:00
										 |  |  |         return new Facebook( | 
					
						
							|  |  |  |             array( | 
					
						
							|  |  |  |                'appId'  => $appId, | 
					
						
							|  |  |  |                'secret' => $secret, | 
					
						
							|  |  |  |                'cookie' => true | 
					
						
							|  |  |  |             ) | 
					
						
							|  |  |  |         ); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /* | 
					
						
							|  |  |  |      * Broadcast a notice to Facebook | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @param Notice $notice    the notice to send | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     static function facebookBroadcastNotice($notice) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $client = new Facebookclient($notice); | 
					
						
							| 
									
										
										
										
											2010-11-09 00:56:53 +00:00
										 |  |  |         return $client->sendNotice(); | 
					
						
							| 
									
										
										
										
											2010-11-05 06:34:06 +00:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /* | 
					
						
							|  |  |  |      * Should the notice go to Facebook? | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     function isFacebookBound() { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if (empty($this->flink)) { | 
					
						
							| 
									
										
										
										
											2011-02-10 10:24:38 -08:00
										 |  |  |             // User hasn't setup bridging
 | 
					
						
							| 
									
										
										
										
											2010-11-05 06:34:06 +00:00
										 |  |  |             return false; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         // Avoid a loop
 | 
					
						
							|  |  |  |         if ($this->notice->source == 'Facebook') { | 
					
						
							|  |  |  |             common_log( | 
					
						
							|  |  |  |                 LOG_INFO, | 
					
						
							|  |  |  |                 sprintf( | 
					
						
							|  |  |  |                     'Skipping notice %d because its source is Facebook.', | 
					
						
							|  |  |  |                     $this->notice->id | 
					
						
							|  |  |  |                 ), | 
					
						
							|  |  |  |                 __FILE__ | 
					
						
							|  |  |  |             ); | 
					
						
							|  |  |  |             return false; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         // If the user does not want to broadcast to Facebook, move along
 | 
					
						
							|  |  |  |         if (!($this->flink->noticesync & FOREIGN_NOTICE_SEND == FOREIGN_NOTICE_SEND)) { | 
					
						
							|  |  |  |             common_log( | 
					
						
							|  |  |  |                 LOG_INFO, | 
					
						
							|  |  |  |                 sprintf( | 
					
						
							|  |  |  |                     'Skipping notice %d because user has FOREIGN_NOTICE_SEND bit off.', | 
					
						
							|  |  |  |                     $this->notice->id | 
					
						
							|  |  |  |                 ), | 
					
						
							|  |  |  |                 __FILE__ | 
					
						
							|  |  |  |             ); | 
					
						
							|  |  |  |             return false; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         // If it's not a reply, or if the user WANTS to send @-replies,
 | 
					
						
							|  |  |  |         // then, yeah, it can go to Facebook.
 | 
					
						
							| 
									
										
										
										
											2012-02-20 10:58:56 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-02-20 11:29:49 -05:00
										 |  |  |         if (empty($this->notice->reply_to) || | 
					
						
							| 
									
										
										
										
											2010-11-05 06:34:06 +00:00
										 |  |  |             ($this->flink->noticesync & FOREIGN_NOTICE_SEND_REPLY)) { | 
					
						
							|  |  |  |             return true; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         return false; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /* | 
					
						
							|  |  |  |      * Determine whether we should send this notice using the Graph API or the | 
					
						
							|  |  |  |      * old REST API and then dispatch | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     function sendNotice() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         // If there's nothing in the credentials field try to send via
 | 
					
						
							|  |  |  |         // the Old Rest API
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-11-09 00:56:53 +00:00
										 |  |  |         if ($this->isFacebookBound()) { | 
					
						
							|  |  |  |             common_debug("notice is facebook bound", __FILE__); | 
					
						
							|  |  |  |             if (empty($this->flink->credentials)) { | 
					
						
							| 
									
										
										
										
											2010-11-16 02:30:08 +00:00
										 |  |  |                 return $this->sendOldRest(); | 
					
						
							| 
									
										
										
										
											2010-11-09 00:56:53 +00:00
										 |  |  |             } else { | 
					
						
							| 
									
										
										
										
											2010-11-05 06:34:06 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-11-09 00:56:53 +00:00
										 |  |  |                 // Otherwise we most likely have an access token
 | 
					
						
							| 
									
										
										
										
											2010-11-16 02:30:08 +00:00
										 |  |  |                 return $this->sendGraph(); | 
					
						
							| 
									
										
										
										
											2010-11-09 00:56:53 +00:00
										 |  |  |             } | 
					
						
							| 
									
										
										
										
											2010-11-05 06:34:06 +00:00
										 |  |  |         } | 
					
						
							| 
									
										
										
										
											2011-02-24 13:29:56 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |         // dequeue
 | 
					
						
							|  |  |  |         return true; | 
					
						
							| 
									
										
										
										
											2010-11-05 06:34:06 +00:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /* | 
					
						
							|  |  |  |      * Send a notice to Facebook using the Graph API | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     function sendGraph() | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2010-11-09 00:56:53 +00:00
										 |  |  |         try { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             $fbuid = $this->flink->foreign_id; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             common_debug( | 
					
						
							|  |  |  |                 sprintf( | 
					
						
							| 
									
										
										
										
											2010-11-17 21:53:56 +00:00
										 |  |  |                     "Attempting use Graph API to post notice %d as a stream item for %s (%d), fbuid %d", | 
					
						
							| 
									
										
										
										
											2010-11-09 00:56:53 +00:00
										 |  |  |                     $this->notice->id, | 
					
						
							|  |  |  |                     $this->user->nickname, | 
					
						
							|  |  |  |                     $this->user->id, | 
					
						
							|  |  |  |                     $fbuid | 
					
						
							|  |  |  |                 ), | 
					
						
							|  |  |  |                 __FILE__ | 
					
						
							|  |  |  |             ); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             $params = array( | 
					
						
							|  |  |  |                 'access_token' => $this->flink->credentials, | 
					
						
							| 
									
										
										
										
											2010-11-16 02:30:08 +00:00
										 |  |  |                 // XXX: Need to worrry about length of the message?
 | 
					
						
							| 
									
										
										
										
											2010-11-09 00:56:53 +00:00
										 |  |  |                 'message'      => $this->notice->content | 
					
						
							|  |  |  |             ); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             $attachments = $this->notice->attachments(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             if (!empty($attachments)) { | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-11-16 02:30:08 +00:00
										 |  |  |                 // We can only send one attachment with the Graph API :(
 | 
					
						
							| 
									
										
										
										
											2010-11-09 00:56:53 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |                 $first = array_shift($attachments); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                 if (substr($first->mimetype, 0, 6) == 'image/' | 
					
						
							|  |  |  |                     || in_array( | 
					
						
							|  |  |  |                         $first->mimetype, | 
					
						
							|  |  |  |                         array('application/x-shockwave-flash', 'audio/mpeg' ))) { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                    $params['picture'] = $first->url; | 
					
						
							|  |  |  |                    $params['caption'] = 'Click for full size'; | 
					
						
							|  |  |  |                    $params['source']  = $first->url; | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             $result = $this->facebook->api( | 
					
						
							|  |  |  |                 sprintf('/%s/feed', $fbuid), 'post', $params | 
					
						
							|  |  |  |             ); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-11-16 02:30:08 +00:00
										 |  |  |             // Save a mapping
 | 
					
						
							|  |  |  |             Notice_to_item::saveNew($this->notice->id, $result['id']); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             common_log( | 
					
						
							|  |  |  |                 LOG_INFO, | 
					
						
							|  |  |  |                 sprintf( | 
					
						
							| 
									
										
										
										
											2010-11-17 21:53:56 +00:00
										 |  |  |                     "Posted notice %d as a stream item for %s (%d), fbuid %d", | 
					
						
							| 
									
										
										
										
											2010-11-16 02:30:08 +00:00
										 |  |  |                     $this->notice->id, | 
					
						
							|  |  |  |                     $this->user->nickname, | 
					
						
							|  |  |  |                     $this->user->id, | 
					
						
							|  |  |  |                     $fbuid | 
					
						
							|  |  |  |                 ), | 
					
						
							|  |  |  |                 __FILE__ | 
					
						
							|  |  |  |             ); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-11-09 00:56:53 +00:00
										 |  |  |         } catch (FacebookApiException $e) { | 
					
						
							|  |  |  |             return $this->handleFacebookError($e); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         return true; | 
					
						
							| 
									
										
										
										
											2010-11-05 06:34:06 +00:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /* | 
					
						
							|  |  |  |      * Send a notice to Facebook using the deprecated Old REST API. We need this | 
					
						
							|  |  |  |      * for backwards compatibility. Users who signed up for Facebook bridging | 
					
						
							|  |  |  |      * using the old Facebook Canvas application do not have an OAuth 2.0 | 
					
						
							|  |  |  |      * access token. | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     function sendOldRest() | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2010-11-09 00:56:53 +00:00
										 |  |  |         try { | 
					
						
							| 
									
										
										
										
											2010-11-05 06:34:06 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-11-09 00:56:53 +00:00
										 |  |  |             $canPublish = $this->checkPermission('publish_stream'); | 
					
						
							|  |  |  |             $canUpdate  = $this->checkPermission('status_update'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             // We prefer to use stream.publish, because it can handle
 | 
					
						
							|  |  |  |             // attachments and returns the ID of the published item
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             if ($canPublish == 1) { | 
					
						
							|  |  |  |                 $this->restPublishStream(); | 
					
						
							|  |  |  |             } else if ($canUpdate == 1) { | 
					
						
							|  |  |  |                 // as a last resort we can just update the user's "status"
 | 
					
						
							|  |  |  |                 $this->restStatusUpdate(); | 
					
						
							|  |  |  |             } else { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                 $msg = 'Not sending notice %d to Facebook because user %s ' | 
					
						
							| 
									
										
										
										
											2010-11-17 21:53:56 +00:00
										 |  |  |                      . '(%d), fbuid %d,  does not have \'status_update\' ' | 
					
						
							| 
									
										
										
										
											2010-11-09 00:56:53 +00:00
										 |  |  |                      . 'or \'publish_stream\' permission.'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                 common_log( | 
					
						
							|  |  |  |                     LOG_WARNING, | 
					
						
							|  |  |  |                     sprintf( | 
					
						
							|  |  |  |                         $msg, | 
					
						
							|  |  |  |                         $this->notice->id, | 
					
						
							|  |  |  |                         $this->user->nickname, | 
					
						
							|  |  |  |                         $this->user->id, | 
					
						
							|  |  |  |                         $this->flink->foreign_id | 
					
						
							|  |  |  |                     ), | 
					
						
							|  |  |  |                     __FILE__ | 
					
						
							|  |  |  |                 ); | 
					
						
							| 
									
										
										
										
											2010-11-05 06:34:06 +00:00
										 |  |  |             } | 
					
						
							| 
									
										
										
										
											2010-11-09 00:56:53 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         } catch (FacebookApiException $e) { | 
					
						
							|  |  |  |             return $this->handleFacebookError($e); | 
					
						
							| 
									
										
										
										
											2010-11-05 06:34:06 +00:00
										 |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         return true; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /* | 
					
						
							|  |  |  |      * Query Facebook to to see if a user has permission | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @param $permission the permission to check for - must be either | 
					
						
							|  |  |  |      *                    public_stream or status_update | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @return boolean result | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     function checkPermission($permission) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         if (!in_array($permission, array('publish_stream', 'status_update'))) { | 
					
						
							| 
									
										
										
										
											2011-04-08 10:59:10 +02:00
										 |  |  |              // TRANS: Server exception thrown when permission check fails.
 | 
					
						
							|  |  |  |              throw new ServerException(_('No such permission!')); | 
					
						
							| 
									
										
										
										
											2010-11-05 06:34:06 +00:00
										 |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-11-09 00:56:53 +00:00
										 |  |  |         $fbuid = $this->flink->foreign_id; | 
					
						
							| 
									
										
										
										
											2010-11-05 06:34:06 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         common_debug( | 
					
						
							|  |  |  |             sprintf( | 
					
						
							| 
									
										
										
										
											2010-11-17 21:53:56 +00:00
										 |  |  |                 'Checking for %s permission for user %s (%d), fbuid %d', | 
					
						
							| 
									
										
										
										
											2010-11-05 06:34:06 +00:00
										 |  |  |                 $permission, | 
					
						
							|  |  |  |                 $this->user->nickname, | 
					
						
							|  |  |  |                 $this->user->id, | 
					
						
							|  |  |  |                 $fbuid | 
					
						
							|  |  |  |             ), | 
					
						
							|  |  |  |             __FILE__ | 
					
						
							|  |  |  |         ); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-11-09 00:56:53 +00:00
										 |  |  |         $hasPermission = $this->facebook->api( | 
					
						
							|  |  |  |             array( | 
					
						
							|  |  |  |                 'method'   => 'users.hasAppPermission', | 
					
						
							|  |  |  |                 'ext_perm' => $permission, | 
					
						
							|  |  |  |                 'uid'      => $fbuid | 
					
						
							|  |  |  |             ) | 
					
						
							| 
									
										
										
										
											2010-11-05 06:34:06 +00:00
										 |  |  |         ); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if ($hasPermission == 1) { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             common_debug( | 
					
						
							|  |  |  |                 sprintf( | 
					
						
							| 
									
										
										
										
											2010-11-17 21:53:56 +00:00
										 |  |  |                     '%s (%d), fbuid %d has %s permission', | 
					
						
							| 
									
										
										
										
											2010-11-05 06:34:06 +00:00
										 |  |  |                     $permission, | 
					
						
							|  |  |  |                     $this->user->nickname, | 
					
						
							|  |  |  |                     $this->user->id, | 
					
						
							|  |  |  |                     $fbuid | 
					
						
							|  |  |  |                 ), | 
					
						
							|  |  |  |                 __FILE__ | 
					
						
							|  |  |  |             ); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             return true; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         } else { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             $logMsg = '%s (%d), fbuid $fbuid does NOT have %s permission.' | 
					
						
							|  |  |  |                     . 'Facebook returned: %s'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             common_debug( | 
					
						
							|  |  |  |                 sprintf( | 
					
						
							|  |  |  |                     $logMsg, | 
					
						
							|  |  |  |                     $this->user->nickname, | 
					
						
							|  |  |  |                     $this->user->id, | 
					
						
							|  |  |  |                     $permission, | 
					
						
							|  |  |  |                     $fbuid, | 
					
						
							|  |  |  |                     var_export($result, true) | 
					
						
							|  |  |  |                 ), | 
					
						
							|  |  |  |                 __FILE__ | 
					
						
							|  |  |  |             ); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             return false; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-11-09 00:56:53 +00:00
										 |  |  |     /* | 
					
						
							|  |  |  |      * Handle a Facebook API Exception | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @param FacebookApiException $e the exception | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2010-11-05 06:34:06 +00:00
										 |  |  |     function handleFacebookError($e) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $fbuid  = $this->flink->foreign_id; | 
					
						
							|  |  |  |         $errmsg = $e->getMessage(); | 
					
						
							| 
									
										
										
										
											2010-11-09 00:56:53 +00:00
										 |  |  |         $code   = $e->getCode(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         // The Facebook PHP SDK seems to always set the code attribute
 | 
					
						
							| 
									
										
										
										
											2010-11-09 23:14:50 +00:00
										 |  |  |         // of the Exception to 0; they put the real error code in
 | 
					
						
							| 
									
										
										
										
											2010-11-09 00:56:53 +00:00
										 |  |  |         // the message. Gar!
 | 
					
						
							|  |  |  |         if ($code == 0) { | 
					
						
							|  |  |  |             preg_match('/^\(#(?<code>\d+)\)/', $errmsg, $matches); | 
					
						
							|  |  |  |             $code = $matches['code']; | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2010-11-05 06:34:06 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         // XXX: Check for any others?
 | 
					
						
							|  |  |  |         switch($code) { | 
					
						
							|  |  |  |          case 100: // Invalid parameter
 | 
					
						
							|  |  |  |             $msg = 'Facebook claims notice %d was posted with an invalid ' | 
					
						
							|  |  |  |                  . 'parameter (error code 100 - %s) Notice details: ' | 
					
						
							|  |  |  |                  . '[nickname=%s, user id=%d, fbuid=%d, content="%s"]. ' | 
					
						
							|  |  |  |                  . 'Dequeing.'; | 
					
						
							|  |  |  |             common_log( | 
					
						
							|  |  |  |                 LOG_ERR, sprintf( | 
					
						
							|  |  |  |                     $msg, | 
					
						
							|  |  |  |                     $this->notice->id, | 
					
						
							|  |  |  |                     $errmsg, | 
					
						
							|  |  |  |                     $this->user->nickname, | 
					
						
							|  |  |  |                     $this->user->id, | 
					
						
							|  |  |  |                     $fbuid, | 
					
						
							|  |  |  |                     $this->notice->content | 
					
						
							|  |  |  |                 ), | 
					
						
							|  |  |  |                 __FILE__ | 
					
						
							|  |  |  |             ); | 
					
						
							|  |  |  |             return true; | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  |          case 200: // Permissions error
 | 
					
						
							|  |  |  |          case 250: // Updating status requires the extended permission status_update
 | 
					
						
							|  |  |  |             $this->disconnect(); | 
					
						
							|  |  |  |             return true; // dequeue
 | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  |          case 341: // Feed action request limit reached
 | 
					
						
							|  |  |  |                 $msg = '%s (userid=%d, fbuid=%d) has exceeded his/her limit ' | 
					
						
							|  |  |  |                      . 'for posting notices to Facebook today. Dequeuing ' | 
					
						
							|  |  |  |                      . 'notice %d'; | 
					
						
							|  |  |  |                 common_log( | 
					
						
							|  |  |  |                     LOG_INFO, sprintf( | 
					
						
							|  |  |  |                         $msg, | 
					
						
							|  |  |  |                         $user->nickname, | 
					
						
							|  |  |  |                         $user->id, | 
					
						
							|  |  |  |                         $fbuid, | 
					
						
							|  |  |  |                         $this->notice->id | 
					
						
							|  |  |  |                     ), | 
					
						
							|  |  |  |                     __FILE__ | 
					
						
							|  |  |  |                 ); | 
					
						
							| 
									
										
										
										
											2011-04-08 10:59:10 +02:00
										 |  |  |             // @todo FIXME: We want to rety at a later time when the throttling has expired
 | 
					
						
							| 
									
										
										
										
											2010-11-05 06:34:06 +00:00
										 |  |  |             // instead of just giving up.
 | 
					
						
							|  |  |  |             return true; | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  |          default: | 
					
						
							|  |  |  |             $msg = 'Facebook returned an error we don\'t know how to deal with ' | 
					
						
							|  |  |  |                  . 'when posting notice %d. Error code: %d, error message: "%s"' | 
					
						
							|  |  |  |                  . ' Notice details: [nickname=%s, user id=%d, fbuid=%d, ' | 
					
						
							|  |  |  |                  . 'notice content="%s"]. Dequeing.'; | 
					
						
							|  |  |  |             common_log( | 
					
						
							|  |  |  |                 LOG_ERR, sprintf( | 
					
						
							|  |  |  |                     $msg, | 
					
						
							|  |  |  |                     $this->notice->id, | 
					
						
							|  |  |  |                     $code, | 
					
						
							|  |  |  |                     $errmsg, | 
					
						
							|  |  |  |                     $this->user->nickname, | 
					
						
							|  |  |  |                     $this->user->id, | 
					
						
							|  |  |  |                     $fbuid, | 
					
						
							|  |  |  |                     $this->notice->content | 
					
						
							|  |  |  |                 ), | 
					
						
							|  |  |  |                 __FILE__ | 
					
						
							|  |  |  |             ); | 
					
						
							|  |  |  |             return true; // dequeue
 | 
					
						
							|  |  |  |             break; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-11-09 00:56:53 +00:00
										 |  |  |     /* | 
					
						
							|  |  |  |      * Publish a notice to Facebook as a status update | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * This is the least preferable way to send a notice to Facebook because | 
					
						
							|  |  |  |      * it doesn't support attachments and the API method doesn't return | 
					
						
							|  |  |  |      * the ID of the post on Facebook. | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2010-11-05 06:34:06 +00:00
										 |  |  |     function restStatusUpdate() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $fbuid = $this->flink->foreign_id; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         common_debug( | 
					
						
							|  |  |  |             sprintf( | 
					
						
							| 
									
										
										
										
											2010-11-17 21:53:56 +00:00
										 |  |  |                 "Attempting to post notice %d as a status update for %s (%d), fbuid %d", | 
					
						
							| 
									
										
										
										
											2010-11-05 06:34:06 +00:00
										 |  |  |                 $this->notice->id, | 
					
						
							|  |  |  |                 $this->user->nickname, | 
					
						
							|  |  |  |                 $this->user->id, | 
					
						
							|  |  |  |                 $fbuid | 
					
						
							|  |  |  |             ), | 
					
						
							|  |  |  |             __FILE__ | 
					
						
							|  |  |  |         ); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-11-09 00:56:53 +00:00
										 |  |  |         $result = $this->facebook->api( | 
					
						
							|  |  |  |             array( | 
					
						
							|  |  |  |                 'method'               => 'users.setStatus', | 
					
						
							| 
									
										
										
										
											2010-11-16 02:30:08 +00:00
										 |  |  |                 'status'               => $this->formatMessage(), | 
					
						
							| 
									
										
										
										
											2010-11-09 00:56:53 +00:00
										 |  |  |                 'status_includes_verb' => true, | 
					
						
							|  |  |  |                 'uid'                  => $fbuid | 
					
						
							|  |  |  |             ) | 
					
						
							| 
									
										
										
										
											2010-11-05 06:34:06 +00:00
										 |  |  |         ); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-11-16 02:30:08 +00:00
										 |  |  |         if ($result == 1) { // 1 is success
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             common_log( | 
					
						
							|  |  |  |                 LOG_INFO, | 
					
						
							|  |  |  |                 sprintf( | 
					
						
							| 
									
										
										
										
											2010-11-17 21:53:56 +00:00
										 |  |  |                     "Posted notice %s as a status update for %s (%d), fbuid %d", | 
					
						
							| 
									
										
										
										
											2010-11-16 02:30:08 +00:00
										 |  |  |                     $this->notice->id, | 
					
						
							|  |  |  |                     $this->user->nickname, | 
					
						
							|  |  |  |                     $this->user->id, | 
					
						
							|  |  |  |                     $fbuid | 
					
						
							|  |  |  |                 ), | 
					
						
							|  |  |  |                 __FILE__ | 
					
						
							|  |  |  |             ); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             // There is no item ID returned for status update so we can't
 | 
					
						
							|  |  |  |             // save a Notice_to_item mapping
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         } else { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             $msg = sprintf( | 
					
						
							| 
									
										
										
										
											2010-11-17 21:53:56 +00:00
										 |  |  |                 "Error posting notice %s as a status update for %s (%d), fbuid %d - error code: %s", | 
					
						
							| 
									
										
										
										
											2010-11-05 06:34:06 +00:00
										 |  |  |                 $this->notice->id, | 
					
						
							|  |  |  |                 $this->user->nickname, | 
					
						
							|  |  |  |                 $this->user->id, | 
					
						
							| 
									
										
										
										
											2010-11-16 02:30:08 +00:00
										 |  |  |                 $fbuid, | 
					
						
							|  |  |  |                 $result // will contain 0, or an error
 | 
					
						
							|  |  |  |             ); | 
					
						
							| 
									
										
										
										
											2010-11-09 00:56:53 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-11-16 02:30:08 +00:00
										 |  |  |             throw new FacebookApiException($msg, $result); | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2010-11-05 06:34:06 +00:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-11-09 00:56:53 +00:00
										 |  |  |     /* | 
					
						
							|  |  |  |      * Publish a notice to a Facebook user's stream using the old REST API | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2010-11-05 06:34:06 +00:00
										 |  |  |     function restPublishStream() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $fbuid = $this->flink->foreign_id; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         common_debug( | 
					
						
							|  |  |  |             sprintf( | 
					
						
							| 
									
										
										
										
											2010-11-17 21:53:56 +00:00
										 |  |  |                 'Attempting to post notice %d as stream item for %s (%d) fbuid %d', | 
					
						
							| 
									
										
										
										
											2010-11-05 06:34:06 +00:00
										 |  |  |                 $this->notice->id, | 
					
						
							|  |  |  |                 $this->user->nickname, | 
					
						
							|  |  |  |                 $this->user->id, | 
					
						
							|  |  |  |                 $fbuid | 
					
						
							|  |  |  |             ), | 
					
						
							|  |  |  |             __FILE__ | 
					
						
							|  |  |  |         ); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-11-09 00:56:53 +00:00
										 |  |  |         $fbattachment = $this->formatAttachments(); | 
					
						
							| 
									
										
										
										
											2010-11-05 06:34:06 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-11-09 00:56:53 +00:00
										 |  |  |         $result = $this->facebook->api( | 
					
						
							|  |  |  |             array( | 
					
						
							|  |  |  |                 'method'     => 'stream.publish', | 
					
						
							| 
									
										
										
										
											2010-11-16 02:30:08 +00:00
										 |  |  |                 'message'    => $this->formatMessage(), | 
					
						
							| 
									
										
										
										
											2010-11-09 00:56:53 +00:00
										 |  |  |                 'attachment' => $fbattachment, | 
					
						
							|  |  |  |                 'uid'        => $fbuid | 
					
						
							|  |  |  |             ) | 
					
						
							| 
									
										
										
										
											2010-11-05 06:34:06 +00:00
										 |  |  |         ); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-11-16 02:30:08 +00:00
										 |  |  |         if (!empty($result)) { // result will contain the item ID
 | 
					
						
							|  |  |  |             // Save a mapping
 | 
					
						
							|  |  |  |             Notice_to_item::saveNew($this->notice->id, $result); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             common_log( | 
					
						
							|  |  |  |                 LOG_INFO, | 
					
						
							|  |  |  |                 sprintf( | 
					
						
							| 
									
										
										
										
											2010-11-17 21:53:56 +00:00
										 |  |  |                     'Posted notice %d as a %s for %s (%d), fbuid %d', | 
					
						
							| 
									
										
										
										
											2010-11-16 02:30:08 +00:00
										 |  |  |                     $this->notice->id, | 
					
						
							|  |  |  |                     empty($fbattachment) ? 'stream item' : 'stream item with attachment', | 
					
						
							|  |  |  |                     $this->user->nickname, | 
					
						
							|  |  |  |                     $this->user->id, | 
					
						
							|  |  |  |                     $fbuid | 
					
						
							|  |  |  |                 ), | 
					
						
							|  |  |  |                 __FILE__ | 
					
						
							|  |  |  |             ); | 
					
						
							|  |  |  |         } else { | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             $msg = sprintf( | 
					
						
							| 
									
										
										
										
											2010-11-17 21:53:56 +00:00
										 |  |  |                 'Could not post notice %d as a %s for %s (%d), fbuid %d - error code: %s', | 
					
						
							| 
									
										
										
										
											2010-11-05 06:34:06 +00:00
										 |  |  |                 $this->notice->id, | 
					
						
							| 
									
										
										
										
											2010-11-09 00:56:53 +00:00
										 |  |  |                 empty($fbattachment) ? 'stream item' : 'stream item with attachment', | 
					
						
							| 
									
										
										
										
											2010-11-05 06:34:06 +00:00
										 |  |  |                 $this->user->nickname, | 
					
						
							|  |  |  |                 $this->user->id, | 
					
						
							| 
									
										
										
										
											2010-11-16 02:30:08 +00:00
										 |  |  |                 $result, // result will contain an error code
 | 
					
						
							| 
									
										
										
										
											2010-11-05 06:34:06 +00:00
										 |  |  |                 $fbuid | 
					
						
							| 
									
										
										
										
											2010-11-16 02:30:08 +00:00
										 |  |  |             ); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             throw new FacebookApiException($msg, $result); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2010-11-09 00:56:53 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-11-16 02:30:08 +00:00
										 |  |  |     /* | 
					
						
							|  |  |  |      * Format the text message of a stream item so it's appropriate for | 
					
						
							|  |  |  |      * sending to Facebook. If the notice is too long, truncate it, and | 
					
						
							|  |  |  |      * add a linkback to the original notice at the end. | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @return String $txt the formated message | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     function formatMessage() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         // Start with the plaintext source of this notice...
 | 
					
						
							|  |  |  |         $txt = $this->notice->content; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         // Facebook has a 420-char hardcoded max.
 | 
					
						
							|  |  |  |         if (mb_strlen($statustxt) > 420) { | 
					
						
							| 
									
										
										
										
											2014-04-30 20:44:23 +02:00
										 |  |  |             $noticeUrl = common_shorten_url($this->notice->getUrl()); | 
					
						
							| 
									
										
										
										
											2010-11-16 02:30:08 +00:00
										 |  |  |             $urlLen = mb_strlen($noticeUrl); | 
					
						
							|  |  |  |             $txt = mb_substr($statustxt, 0, 420 - ($urlLen + 3)) . ' … ' . $noticeUrl; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         return $txt; | 
					
						
							| 
									
										
										
										
											2010-11-05 06:34:06 +00:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-11-09 00:56:53 +00:00
										 |  |  |     /* | 
					
						
							|  |  |  |      * Format attachments for the old REST API stream.publish method | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * Note: Old REST API supports multiple attachments per post | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     function formatAttachments() | 
					
						
							| 
									
										
										
										
											2010-11-05 06:34:06 +00:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2010-11-09 00:56:53 +00:00
										 |  |  |         $attachments = $this->notice->attachments(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-11-05 06:34:06 +00:00
										 |  |  |         $fbattachment          = array(); | 
					
						
							|  |  |  |         $fbattachment['media'] = array(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         foreach($attachments as $attachment) | 
					
						
							|  |  |  |         { | 
					
						
							| 
									
										
										
										
											2014-06-02 01:26:23 +02:00
										 |  |  |             try { | 
					
						
							|  |  |  |                 $enclosure = $attachment->getEnclosure(); | 
					
						
							| 
									
										
										
										
											2010-11-09 00:56:53 +00:00
										 |  |  |                 $fbmedia = $this->getFacebookMedia($enclosure); | 
					
						
							| 
									
										
										
										
											2014-06-02 01:26:23 +02:00
										 |  |  |             } catch (ServerException $e) { | 
					
						
							| 
									
										
										
										
											2010-11-09 00:56:53 +00:00
										 |  |  |                 $fbmedia = $this->getFacebookMedia($attachment); | 
					
						
							| 
									
										
										
										
											2010-11-05 06:34:06 +00:00
										 |  |  |             } | 
					
						
							|  |  |  |             if($fbmedia){ | 
					
						
							|  |  |  |                 $fbattachment['media'][]=$fbmedia; | 
					
						
							|  |  |  |             }else{ | 
					
						
							|  |  |  |                 $fbattachment['name'] = ($attachment->title ? | 
					
						
							|  |  |  |                                       $attachment->title : $attachment->url); | 
					
						
							|  |  |  |                 $fbattachment['href'] = $attachment->url; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         if(count($fbattachment['media'])>0){ | 
					
						
							|  |  |  |             unset($fbattachment['name']); | 
					
						
							|  |  |  |             unset($fbattachment['href']); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         return $fbattachment; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							| 
									
										
										
										
											2010-11-09 00:56:53 +00:00
										 |  |  |      * given a File objects, returns an associative array suitable for Facebook media | 
					
						
							| 
									
										
										
										
											2010-11-05 06:34:06 +00:00
										 |  |  |      */ | 
					
						
							| 
									
										
										
										
											2010-11-09 00:56:53 +00:00
										 |  |  |     function getFacebookMedia($attachment) | 
					
						
							| 
									
										
										
										
											2010-11-05 06:34:06 +00:00
										 |  |  |     { | 
					
						
							|  |  |  |         $fbmedia    = array(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if (strncmp($attachment->mimetype, 'image/', strlen('image/')) == 0) { | 
					
						
							|  |  |  |             $fbmedia['type']         = 'image'; | 
					
						
							|  |  |  |             $fbmedia['src']          = $attachment->url; | 
					
						
							|  |  |  |             $fbmedia['href']         = $attachment->url; | 
					
						
							|  |  |  |         } else if ($attachment->mimetype == 'audio/mpeg') { | 
					
						
							|  |  |  |             $fbmedia['type']         = 'mp3'; | 
					
						
							|  |  |  |             $fbmedia['src']          = $attachment->url; | 
					
						
							|  |  |  |         }else if ($attachment->mimetype == 'application/x-shockwave-flash') { | 
					
						
							|  |  |  |             $fbmedia['type']         = 'flash'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             // http://wiki.developers.facebook.com/index.php/Attachment_%28Streams%29
 | 
					
						
							|  |  |  |             // says that imgsrc is required... but we have no value to put in it
 | 
					
						
							|  |  |  |             // $fbmedia['imgsrc']='';
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             $fbmedia['swfsrc']       = $attachment->url; | 
					
						
							|  |  |  |         }else{ | 
					
						
							|  |  |  |             return false; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         return $fbmedia; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-11-09 00:56:53 +00:00
										 |  |  |     /* | 
					
						
							|  |  |  |      * Disconnect a user from Facebook by deleting his Foreign_link. | 
					
						
							|  |  |  |      * Notifies the user his account has been disconnected by email. | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2010-11-05 06:34:06 +00:00
										 |  |  |     function disconnect() | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2010-11-09 00:56:53 +00:00
										 |  |  |         $fbuid = $this->flink->foreign_id; | 
					
						
							| 
									
										
										
										
											2010-11-05 06:34:06 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         common_log( | 
					
						
							|  |  |  |             LOG_INFO, | 
					
						
							|  |  |  |             sprintf( | 
					
						
							| 
									
										
										
										
											2010-11-17 21:53:56 +00:00
										 |  |  |                 'Removing Facebook link for %s (%d), fbuid %d', | 
					
						
							| 
									
										
										
										
											2010-11-05 06:34:06 +00:00
										 |  |  |                 $this->user->nickname, | 
					
						
							|  |  |  |                 $this->user->id, | 
					
						
							|  |  |  |                 $fbuid | 
					
						
							|  |  |  |             ), | 
					
						
							|  |  |  |             __FILE__ | 
					
						
							|  |  |  |         ); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-11-09 00:56:53 +00:00
										 |  |  |         $result = $this->flink->delete(); | 
					
						
							| 
									
										
										
										
											2010-11-05 06:34:06 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         if (empty($result)) { | 
					
						
							|  |  |  |             common_log( | 
					
						
							|  |  |  |                 LOG_ERR, | 
					
						
							|  |  |  |                 sprintf( | 
					
						
							| 
									
										
										
										
											2010-11-17 21:53:56 +00:00
										 |  |  |                     'Could not remove Facebook link for %s (%d), fbuid %d', | 
					
						
							| 
									
										
										
										
											2010-11-05 06:34:06 +00:00
										 |  |  |                     $this->user->nickname, | 
					
						
							|  |  |  |                     $this->user->id, | 
					
						
							|  |  |  |                     $fbuid | 
					
						
							|  |  |  |                 ), | 
					
						
							|  |  |  |                 __FILE__ | 
					
						
							|  |  |  |             ); | 
					
						
							|  |  |  |             common_log_db_error($flink, 'DELETE', __FILE__); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         // Notify the user that we are removing their Facebook link
 | 
					
						
							| 
									
										
										
										
											2010-11-17 21:53:56 +00:00
										 |  |  |         if (!empty($this->user->email)) { | 
					
						
							|  |  |  |             $result = $this->mailFacebookDisconnect(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             if (!$result) { | 
					
						
							|  |  |  |                 $msg = 'Unable to send email to notify %s (%d), fbuid %d ' | 
					
						
							|  |  |  |                      . 'about his/her Facebook link being removed.'; | 
					
						
							| 
									
										
										
										
											2010-11-05 06:34:06 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-11-17 21:53:56 +00:00
										 |  |  |                 common_log( | 
					
						
							|  |  |  |                     LOG_WARNING, | 
					
						
							|  |  |  |                     sprintf( | 
					
						
							|  |  |  |                         $msg, | 
					
						
							|  |  |  |                         $this->user->nickname, | 
					
						
							|  |  |  |                         $this->user->id, | 
					
						
							|  |  |  |                         $fbuid | 
					
						
							|  |  |  |                     ), | 
					
						
							|  |  |  |                     __FILE__ | 
					
						
							|  |  |  |                 ); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } else { | 
					
						
							|  |  |  |             $msg = 'Unable to send email to notify %s (%d), fbuid %d ' | 
					
						
							|  |  |  |                  . 'about his/her Facebook link being removed because the ' | 
					
						
							|  |  |  |                  . 'user has not set an email address.'; | 
					
						
							| 
									
										
										
										
											2010-11-05 06:34:06 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |             common_log( | 
					
						
							|  |  |  |                 LOG_WARNING, | 
					
						
							|  |  |  |                 sprintf( | 
					
						
							|  |  |  |                     $msg, | 
					
						
							|  |  |  |                     $this->user->nickname, | 
					
						
							|  |  |  |                     $this->user->id, | 
					
						
							|  |  |  |                     $fbuid | 
					
						
							|  |  |  |                 ), | 
					
						
							|  |  |  |                 __FILE__ | 
					
						
							|  |  |  |             ); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Send a mail message to notify a user that her Facebook link | 
					
						
							|  |  |  |      * has been terminated. | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @return boolean success flag | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     function mailFacebookDisconnect() | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2010-11-10 01:18:06 +00:00
										 |  |  |         $profile = $this->user->getProfile(); | 
					
						
							| 
									
										
										
										
											2010-11-05 06:34:06 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         $siteName = common_config('site', 'name'); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-11-10 01:18:06 +00:00
										 |  |  |         common_switch_locale($this->user->language); | 
					
						
							| 
									
										
										
										
											2010-11-05 06:34:06 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-04-08 10:59:10 +02:00
										 |  |  |         // TRANS: E-mail subject.
 | 
					
						
							| 
									
										
										
										
											2010-11-10 01:18:06 +00:00
										 |  |  |         $subject = _m('Your Facebook connection has been removed'); | 
					
						
							| 
									
										
										
										
											2010-11-05 06:34:06 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-04-08 10:59:10 +02:00
										 |  |  |         // TRANS: E-mail body. %1$s is a username, %2$s is the StatusNet sitename.
 | 
					
						
							| 
									
										
										
										
											2011-04-08 17:01:32 +02:00
										 |  |  |         $msg = _m("Hi %1\$s,\n\n". | 
					
						
							|  |  |  |                   "We are sorry to inform you we are unable to publish your notice to\n". | 
					
						
							|  |  |  |                   "Facebook, and have removed the connection between your %2\$s account and\n". | 
					
						
							|  |  |  |                   "Facebook.\n\n". | 
					
						
							|  |  |  |                   "This may have happened because you have removed permission for %2\$s\n". | 
					
						
							|  |  |  |                   "to post on your behalf, or perhaps you have deactivated your Facebook\n". | 
					
						
							|  |  |  |                   "account. You can reconnect your %2\$s account to Facebook at any time by\n". | 
					
						
							|  |  |  |                   "logging in with Facebook again.\n\n". | 
					
						
							|  |  |  |                   "Sincerely,\n\n". | 
					
						
							|  |  |  |                   "%2\$s\n"); | 
					
						
							| 
									
										
										
										
											2010-11-10 01:18:06 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-11-05 06:34:06 +00:00
										 |  |  |         $body = sprintf( | 
					
						
							| 
									
										
										
										
											2011-04-08 10:59:10 +02:00
										 |  |  |             $msg, | 
					
						
							| 
									
										
										
										
											2010-11-05 06:34:06 +00:00
										 |  |  |             $this->user->nickname, | 
					
						
							|  |  |  |             $siteName | 
					
						
							|  |  |  |         ); | 
					
						
							| 
									
										
										
										
											2010-11-09 00:56:53 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-11-05 06:34:06 +00:00
										 |  |  |         common_switch_locale(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-11-17 21:53:56 +00:00
										 |  |  |         $result = mail_to_user($this->user, $subject, $body); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if (empty($this->user->password)) { | 
					
						
							|  |  |  |             $result = self::emailWarn($this->user); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         return $result; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /* | 
					
						
							|  |  |  |      * Send the user an email warning that their account has been | 
					
						
							|  |  |  |      * disconnected and he/she has no way to login and must contact | 
					
						
							|  |  |  |      * the site administrator for help. | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @param User $user the deauthorizing user | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     static function emailWarn($user) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $profile = $user->getProfile(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $siteName  = common_config('site', 'name'); | 
					
						
							|  |  |  |         $siteEmail = common_config('site', 'email'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if (empty($siteEmail)) { | 
					
						
							|  |  |  |             common_log( | 
					
						
							|  |  |  |                 LOG_WARNING, | 
					
						
							|  |  |  |                     "No site email address configured. Please set one." | 
					
						
							|  |  |  |             ); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         common_switch_locale($user->language); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-04-08 10:59:10 +02:00
										 |  |  |         // TRANS: E-mail subject. %s is the StatusNet sitename.
 | 
					
						
							| 
									
										
										
										
											2010-11-17 21:53:56 +00:00
										 |  |  |         $subject = _m('Contact the %s administrator to retrieve your account'); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-04-08 10:59:10 +02:00
										 |  |  |         // TRANS: E-mail body. %1$s is a username,
 | 
					
						
							|  |  |  |         // TRANS: %2$s is the StatusNet sitename, %3$s is the site contact e-mail address.
 | 
					
						
							| 
									
										
										
										
											2011-04-08 17:01:32 +02:00
										 |  |  |         $msg = _m("Hi %1\$s,\n\n". | 
					
						
							|  |  |  |                   "We have noticed you have deauthorized the Facebook connection for your\n". | 
					
						
							|  |  |  |                   "%2\$s account.  You have not set a password for your %2\$s account yet, so\n". | 
					
						
							|  |  |  |                   "you will not be able to login. If you wish to continue using your %2\$s\n". | 
					
						
							|  |  |  |                   "account, please contact the site administrator (%3\$s) to set a password.\n\n". | 
					
						
							|  |  |  |                   "Sincerely,\n\n". | 
					
						
							|  |  |  |                   "%2\$s\n"); | 
					
						
							| 
									
										
										
										
											2010-11-17 21:53:56 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         $body = sprintf( | 
					
						
							| 
									
										
										
										
											2011-04-08 10:59:10 +02:00
										 |  |  |             $msg, | 
					
						
							| 
									
										
										
										
											2010-11-17 21:53:56 +00:00
										 |  |  |             $user->nickname, | 
					
						
							|  |  |  |             $siteName, | 
					
						
							|  |  |  |             $siteEmail | 
					
						
							|  |  |  |         ); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         common_switch_locale(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if (mail_to_user($user, $subject, $body)) { | 
					
						
							|  |  |  |             common_log( | 
					
						
							|  |  |  |                 LOG_INFO, | 
					
						
							|  |  |  |                 sprintf( | 
					
						
							|  |  |  |                     'Sent account lockout warning to %s (%d)', | 
					
						
							|  |  |  |                     $user->nickname, | 
					
						
							|  |  |  |                     $user->id | 
					
						
							|  |  |  |                 ), | 
					
						
							|  |  |  |                 __FILE__ | 
					
						
							|  |  |  |             ); | 
					
						
							|  |  |  |         } else { | 
					
						
							|  |  |  |             common_log( | 
					
						
							|  |  |  |                 LOG_WARNING, | 
					
						
							|  |  |  |                 sprintf( | 
					
						
							|  |  |  |                     'Unable to send account lockout warning to %s (%d)', | 
					
						
							|  |  |  |                     $user->nickname, | 
					
						
							|  |  |  |                     $user->id | 
					
						
							|  |  |  |                 ), | 
					
						
							|  |  |  |                 __FILE__ | 
					
						
							|  |  |  |             ); | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2010-11-05 06:34:06 +00:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-11-16 02:30:08 +00:00
										 |  |  |     /* | 
					
						
							|  |  |  |      * Check to see if we have a mapping to a copy of this notice | 
					
						
							|  |  |  |      * on Facebook | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @param Notice $notice the notice to check | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @return mixed null if it can't find one, or the id of the Facebook | 
					
						
							|  |  |  |      *               stream item | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     static function facebookStatusId($notice) | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2013-08-18 13:04:58 +02:00
										 |  |  |         $n2i = Notice_to_item::getKV('notice_id', $notice->id); | 
					
						
							| 
									
										
										
										
											2010-11-16 02:30:08 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         if (empty($n2i)) { | 
					
						
							|  |  |  |             return null; | 
					
						
							|  |  |  |         } else { | 
					
						
							|  |  |  |             return $n2i->item_id; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /* | 
					
						
							|  |  |  |      * Save a Foreign_user record of a Facebook user | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @param object $fbuser a Facebook Graph API user obj | 
					
						
							|  |  |  |      *                       See: http://developers.facebook.com/docs/reference/api/user | 
					
						
							|  |  |  |      * @return mixed $result Id or key | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     static function addFacebookUser($fbuser) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         // remove any existing, possibly outdated, record
 | 
					
						
							| 
									
										
										
										
											2015-07-17 18:44:09 +02:00
										 |  |  |         try { | 
					
						
							|  |  |  |             $fuser = Foreign_user::getForeignUser($fbuser->id, FACEBOOK_SERVICE); | 
					
						
							|  |  |  |             $result = $fuser->delete(); | 
					
						
							| 
									
										
										
										
											2010-11-16 02:30:08 +00:00
										 |  |  |             if ($result != false) { | 
					
						
							|  |  |  |                 common_log( | 
					
						
							|  |  |  |                     LOG_INFO, | 
					
						
							|  |  |  |                     sprintf( | 
					
						
							|  |  |  |                         'Removed old Facebook user: %s, fbuid %d', | 
					
						
							| 
									
										
										
										
											2011-09-27 04:09:47 +00:00
										 |  |  |                         $fbuid->name, | 
					
						
							|  |  |  |                         $fbuid->id | 
					
						
							| 
									
										
										
										
											2010-11-16 02:30:08 +00:00
										 |  |  |                     ), | 
					
						
							|  |  |  |                     __FILE__ | 
					
						
							|  |  |  |                 ); | 
					
						
							|  |  |  |             } | 
					
						
							| 
									
										
										
										
											2015-07-17 18:44:09 +02:00
										 |  |  |         } catch (NoResultException $e) { | 
					
						
							|  |  |  |             // no old foreign users exist for this id
 | 
					
						
							| 
									
										
										
										
											2010-11-16 02:30:08 +00:00
										 |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $fuser = new Foreign_user(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-09-26 05:32:19 +00:00
										 |  |  |         $fuser->nickname = $fbuser->username; | 
					
						
							| 
									
										
										
										
											2011-09-27 04:09:47 +00:00
										 |  |  |         $fuser->uri      = $fbuser->link; | 
					
						
							| 
									
										
										
										
											2011-09-26 05:32:19 +00:00
										 |  |  |         $fuser->id       = $fbuser->id; | 
					
						
							| 
									
										
										
										
											2010-11-16 02:30:08 +00:00
										 |  |  |         $fuser->service  = FACEBOOK_SERVICE; | 
					
						
							|  |  |  |         $fuser->created  = common_sql_now(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $result = $fuser->insert(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if (empty($result)) { | 
					
						
							|  |  |  |             common_log( | 
					
						
							|  |  |  |                 LOG_WARNING, | 
					
						
							|  |  |  |                     sprintf( | 
					
						
							|  |  |  |                         'Failed to add new Facebook user: %s, fbuid %d', | 
					
						
							| 
									
										
										
										
											2011-09-26 05:32:19 +00:00
										 |  |  |                         $fbuser->username, | 
					
						
							|  |  |  |                         $fbuser->id | 
					
						
							| 
									
										
										
										
											2010-11-16 02:30:08 +00:00
										 |  |  |                     ), | 
					
						
							|  |  |  |                     __FILE__ | 
					
						
							|  |  |  |             ); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             common_log_db_error($fuser, 'INSERT', __FILE__); | 
					
						
							|  |  |  |         } else { | 
					
						
							|  |  |  |             common_log( | 
					
						
							|  |  |  |                 LOG_INFO, | 
					
						
							|  |  |  |                 sprintf( | 
					
						
							|  |  |  |                     'Added new Facebook user: %s, fbuid %d', | 
					
						
							| 
									
										
										
										
											2011-09-26 05:32:19 +00:00
										 |  |  |                     $fbuser->name, | 
					
						
							|  |  |  |                     $fbuser->id | 
					
						
							| 
									
										
										
										
											2010-11-16 02:30:08 +00:00
										 |  |  |                 ), | 
					
						
							|  |  |  |                 __FILE__ | 
					
						
							|  |  |  |             ); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         return $result; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /* | 
					
						
							|  |  |  |      * Remove an item from a Facebook user's feed if we have a mapping | 
					
						
							|  |  |  |      * for it. | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     function streamRemove() | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2013-08-18 13:04:58 +02:00
										 |  |  |         $n2i = Notice_to_item::getKV('notice_id', $this->notice->id); | 
					
						
							| 
									
										
										
										
											2010-11-16 02:30:08 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         if (!empty($this->flink) && !empty($n2i)) { | 
					
						
							| 
									
										
										
										
											2010-11-22 21:40:47 +00:00
										 |  |  |             try { | 
					
						
							|  |  |  |                 $result = $this->facebook->api( | 
					
						
							|  |  |  |                     array( | 
					
						
							|  |  |  |                         'method'  => 'stream.remove', | 
					
						
							|  |  |  |                         'post_id' => $n2i->item_id, | 
					
						
							|  |  |  |                         'uid'     => $this->flink->foreign_id | 
					
						
							|  |  |  |                     ) | 
					
						
							| 
									
										
										
										
											2010-11-16 02:30:08 +00:00
										 |  |  |                 ); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-11-22 21:40:47 +00:00
										 |  |  |                 if (!empty($result) && result == true) { | 
					
						
							|  |  |  |                     common_log( | 
					
						
							|  |  |  |                       LOG_INFO, | 
					
						
							|  |  |  |                         sprintf( | 
					
						
							|  |  |  |                             'Deleted Facebook item: %s for %s (%d), fbuid %d', | 
					
						
							|  |  |  |                             $n2i->item_id, | 
					
						
							|  |  |  |                             $this->user->nickname, | 
					
						
							|  |  |  |                             $this->user->id, | 
					
						
							|  |  |  |                             $this->flink->foreign_id | 
					
						
							|  |  |  |                         ), | 
					
						
							|  |  |  |                         __FILE__ | 
					
						
							|  |  |  |                     ); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                     $n2i->delete(); | 
					
						
							| 
									
										
										
										
											2010-11-16 02:30:08 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-11-22 21:40:47 +00:00
										 |  |  |                 } else { | 
					
						
							|  |  |  |                     throw new FaceboookApiException(var_export($result, true)); | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |             } catch (FacebookApiException $e) { | 
					
						
							| 
									
										
										
										
											2010-11-16 02:30:08 +00:00
										 |  |  |                 common_log( | 
					
						
							|  |  |  |                   LOG_WARNING, | 
					
						
							|  |  |  |                     sprintf( | 
					
						
							| 
									
										
										
										
											2010-11-22 21:40:47 +00:00
										 |  |  |                         'Could not deleted Facebook item: %s for %s (%d), ' | 
					
						
							|  |  |  |                             . 'fbuid %d - (API error: %s) item already deleted ' | 
					
						
							|  |  |  |                             . 'on Facebook? ', | 
					
						
							| 
									
										
										
										
											2010-11-16 02:30:08 +00:00
										 |  |  |                         $n2i->item_id, | 
					
						
							|  |  |  |                         $this->user->nickname, | 
					
						
							|  |  |  |                         $this->user->id, | 
					
						
							| 
									
										
										
										
											2010-11-22 21:40:47 +00:00
										 |  |  |                         $this->flink->foreign_id, | 
					
						
							|  |  |  |                         $e | 
					
						
							| 
									
										
										
										
											2010-11-16 02:30:08 +00:00
										 |  |  |                     ), | 
					
						
							|  |  |  |                     __FILE__ | 
					
						
							|  |  |  |                 ); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /* | 
					
						
							|  |  |  |      * Like an item in a Facebook user's feed if we have a mapping | 
					
						
							|  |  |  |      * for it. | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     function like() | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2013-08-18 13:04:58 +02:00
										 |  |  |         $n2i = Notice_to_item::getKV('notice_id', $this->notice->id); | 
					
						
							| 
									
										
										
										
											2010-11-16 02:30:08 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         if (!empty($this->flink) && !empty($n2i)) { | 
					
						
							| 
									
										
										
										
											2010-11-22 21:40:47 +00:00
										 |  |  |             try { | 
					
						
							|  |  |  |                 $result = $this->facebook->api( | 
					
						
							|  |  |  |                     array( | 
					
						
							|  |  |  |                         'method'  => 'stream.addlike', | 
					
						
							|  |  |  |                         'post_id' => $n2i->item_id, | 
					
						
							|  |  |  |                         'uid'     => $this->flink->foreign_id | 
					
						
							|  |  |  |                     ) | 
					
						
							| 
									
										
										
										
											2010-11-16 02:30:08 +00:00
										 |  |  |                 ); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-11-22 21:40:47 +00:00
										 |  |  |                 if (!empty($result) && result == true) { | 
					
						
							|  |  |  |                     common_log( | 
					
						
							|  |  |  |                       LOG_INFO, | 
					
						
							|  |  |  |                         sprintf( | 
					
						
							|  |  |  |                             'Added like for item: %s for %s (%d), fbuid %d', | 
					
						
							|  |  |  |                             $n2i->item_id, | 
					
						
							|  |  |  |                             $this->user->nickname, | 
					
						
							|  |  |  |                             $this->user->id, | 
					
						
							|  |  |  |                             $this->flink->foreign_id | 
					
						
							|  |  |  |                         ), | 
					
						
							|  |  |  |                         __FILE__ | 
					
						
							|  |  |  |                     ); | 
					
						
							|  |  |  |                 } else { | 
					
						
							|  |  |  |                     throw new FacebookApiException(var_export($result, true)); | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |             } catch (FacebookApiException $e) { | 
					
						
							| 
									
										
										
										
											2010-11-16 02:30:08 +00:00
										 |  |  |                 common_log( | 
					
						
							|  |  |  |                   LOG_WARNING, | 
					
						
							|  |  |  |                     sprintf( | 
					
						
							| 
									
										
										
										
											2010-11-22 21:40:47 +00:00
										 |  |  |                         'Could not like Facebook item: %s for %s (%d), ' | 
					
						
							|  |  |  |                             . 'fbuid %d (API error: %s)', | 
					
						
							| 
									
										
										
										
											2010-11-16 02:30:08 +00:00
										 |  |  |                         $n2i->item_id, | 
					
						
							|  |  |  |                         $this->user->nickname, | 
					
						
							|  |  |  |                         $this->user->id, | 
					
						
							| 
									
										
										
										
											2010-11-22 21:40:47 +00:00
										 |  |  |                         $this->flink->foreign_id, | 
					
						
							|  |  |  |                         $e | 
					
						
							| 
									
										
										
										
											2010-11-16 02:30:08 +00:00
										 |  |  |                     ), | 
					
						
							|  |  |  |                     __FILE__ | 
					
						
							|  |  |  |                 ); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /* | 
					
						
							|  |  |  |      * Unlike an item in a Facebook user's feed if we have a mapping | 
					
						
							|  |  |  |      * for it. | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     function unLike() | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2013-08-18 13:04:58 +02:00
										 |  |  |         $n2i = Notice_to_item::getKV('notice_id', $this->notice->id); | 
					
						
							| 
									
										
										
										
											2010-11-16 02:30:08 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |         if (!empty($this->flink) && !empty($n2i)) { | 
					
						
							| 
									
										
										
										
											2010-11-22 21:40:47 +00:00
										 |  |  |             try { | 
					
						
							|  |  |  |                 $result = $this->facebook->api( | 
					
						
							|  |  |  |                     array( | 
					
						
							|  |  |  |                         'method'  => 'stream.removeLike', | 
					
						
							|  |  |  |                         'post_id' => $n2i->item_id, | 
					
						
							|  |  |  |                         'uid'     => $this->flink->foreign_id | 
					
						
							|  |  |  |                     ) | 
					
						
							| 
									
										
										
										
											2010-11-16 02:30:08 +00:00
										 |  |  |                 ); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-11-22 21:40:47 +00:00
										 |  |  |                 if (!empty($result) && result == true) { | 
					
						
							|  |  |  |                     common_log( | 
					
						
							|  |  |  |                       LOG_INFO, | 
					
						
							|  |  |  |                         sprintf( | 
					
						
							|  |  |  |                             'Removed like for item: %s for %s (%d), fbuid %d', | 
					
						
							|  |  |  |                             $n2i->item_id, | 
					
						
							|  |  |  |                             $this->user->nickname, | 
					
						
							|  |  |  |                             $this->user->id, | 
					
						
							|  |  |  |                             $this->flink->foreign_id | 
					
						
							|  |  |  |                         ), | 
					
						
							|  |  |  |                         __FILE__ | 
					
						
							|  |  |  |                     ); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |                 } else { | 
					
						
							|  |  |  |                     throw new FacebookApiException(var_export($result, true)); | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |             } catch (FacebookApiException $e) { | 
					
						
							|  |  |  |                   common_log( | 
					
						
							| 
									
										
										
										
											2010-11-16 02:30:08 +00:00
										 |  |  |                   LOG_WARNING, | 
					
						
							|  |  |  |                     sprintf( | 
					
						
							| 
									
										
										
										
											2010-11-22 21:40:47 +00:00
										 |  |  |                         'Could not remove like for Facebook item: %s for %s ' | 
					
						
							|  |  |  |                           . '(%d), fbuid %d (API error: %s)', | 
					
						
							| 
									
										
										
										
											2010-11-16 02:30:08 +00:00
										 |  |  |                         $n2i->item_id, | 
					
						
							|  |  |  |                         $this->user->nickname, | 
					
						
							|  |  |  |                         $this->user->id, | 
					
						
							| 
									
										
										
										
											2010-11-22 21:40:47 +00:00
										 |  |  |                         $this->flink->foreign_id, | 
					
						
							|  |  |  |                         $e | 
					
						
							| 
									
										
										
										
											2010-11-16 02:30:08 +00:00
										 |  |  |                     ), | 
					
						
							|  |  |  |                     __FILE__ | 
					
						
							|  |  |  |                 ); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2010-11-05 06:34:06 +00:00
										 |  |  | } |