| 
									
										
										
										
											2010-12-15 17:53:38 -05:00
										 |  |  | <?php | 
					
						
							|  |  |  | /** | 
					
						
							|  |  |  |  * StatusNet - the distributed open-source microblogging tool | 
					
						
							|  |  |  |  * Copyright (C) 2010, StatusNet, Inc. | 
					
						
							|  |  |  |  * | 
					
						
							| 
									
										
										
										
											2010-12-17 13:12:17 -05:00
										 |  |  |  * Importer for feeds of activities | 
					
						
							| 
									
										
										
										
											2010-12-15 17:53:38 -05:00
										 |  |  |  *  | 
					
						
							|  |  |  |  * PHP version 5 | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * 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  Account | 
					
						
							|  |  |  |  * @package   StatusNet | 
					
						
							|  |  |  |  * @author    Evan Prodromou <evan@status.net> | 
					
						
							|  |  |  |  * @copyright 2010 StatusNet, Inc. | 
					
						
							|  |  |  |  * @license   http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0 | 
					
						
							|  |  |  |  * @link      http://status.net/ | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | if (!defined('STATUSNET')) { | 
					
						
							|  |  |  |     // This check helps protect against security problems;
 | 
					
						
							|  |  |  |     // your code file can't be executed directly from the web.
 | 
					
						
							|  |  |  |     exit(1); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /** | 
					
						
							| 
									
										
										
										
											2010-12-17 13:12:17 -05:00
										 |  |  |  * Importer for feeds of activities | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * Takes an XML file representing a feed of activities and imports each | 
					
						
							|  |  |  |  * activity to the user in question. | 
					
						
							| 
									
										
										
										
											2010-12-15 17:53:38 -05:00
										 |  |  |  * | 
					
						
							|  |  |  |  * @category  Account | 
					
						
							|  |  |  |  * @package   StatusNet | 
					
						
							|  |  |  |  * @author    Evan Prodromou <evan@status.net> | 
					
						
							|  |  |  |  * @copyright 2010 StatusNet, Inc. | 
					
						
							|  |  |  |  * @license   http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0 | 
					
						
							|  |  |  |  * @link      http://status.net/ | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-12-17 13:12:17 -05:00
										 |  |  | class FeedImporter extends QueueHandler | 
					
						
							| 
									
										
										
										
											2010-12-15 17:53:38 -05:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2010-12-17 13:12:17 -05:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * Transport identifier | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @return string identifier for this queue handler | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2010-12-16 16:17:38 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-12-17 13:12:17 -05:00
										 |  |  |     public function transport() | 
					
						
							| 
									
										
										
										
											2010-12-15 17:53:38 -05:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2010-12-17 13:12:17 -05:00
										 |  |  |         return 'feedimp'; | 
					
						
							| 
									
										
										
										
											2010-12-15 17:53:38 -05:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-12-17 13:12:17 -05:00
										 |  |  |     function handle($data) | 
					
						
							| 
									
										
										
										
											2010-12-15 17:53:38 -05:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2010-12-17 13:12:17 -05:00
										 |  |  |         list($user, $xml, $trusted) = $data; | 
					
						
							| 
									
										
										
										
											2010-12-15 17:53:38 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-12-17 13:12:17 -05:00
										 |  |  |         try { | 
					
						
							|  |  |  |             $doc = DOMDocument::loadXML($xml); | 
					
						
							| 
									
										
										
										
											2010-12-15 17:53:38 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-12-17 18:55:00 -05:00
										 |  |  |             $feed = $doc->documentElement; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             if ($feed->namespaceURI != Activity::ATOM || | 
					
						
							|  |  |  |                 $feed->localName != 'feed') { | 
					
						
							| 
									
										
										
										
											2010-12-17 13:12:17 -05:00
										 |  |  |                 throw new ClientException(_("Not an atom feed.")); | 
					
						
							| 
									
										
										
										
											2010-12-16 16:17:38 -05:00
										 |  |  |             } | 
					
						
							| 
									
										
										
										
											2010-12-15 17:53:38 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-12-17 13:12:17 -05:00
										 |  |  |             $author = ActivityUtils::getFeedAuthor($feed); | 
					
						
							| 
									
										
										
										
											2010-12-15 17:53:38 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-12-17 13:12:17 -05:00
										 |  |  |             if (empty($author)) { | 
					
						
							|  |  |  |                 throw new ClientException(_("No author in the feed.")); | 
					
						
							| 
									
										
										
										
											2010-12-15 17:53:38 -05:00
										 |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-12-17 13:12:17 -05:00
										 |  |  |             if (empty($user)) { | 
					
						
							|  |  |  |                 if ($trusted) { | 
					
						
							|  |  |  |                     $user = $this->userFromAuthor($author); | 
					
						
							| 
									
										
										
										
											2010-12-17 16:27:20 -05:00
										 |  |  |                 } else { | 
					
						
							|  |  |  |                     throw new ClientException(_("Can't import without a user.")); | 
					
						
							| 
									
										
										
										
											2010-12-15 17:53:38 -05:00
										 |  |  |                 } | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-12-17 16:27:20 -05:00
										 |  |  |             $activities = $this->getActivities($feed); | 
					
						
							| 
									
										
										
										
											2010-12-15 17:53:38 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-12-17 13:12:17 -05:00
										 |  |  |             $qm = QueueManager::get(); | 
					
						
							| 
									
										
										
										
											2010-12-15 17:53:38 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-12-17 13:12:17 -05:00
										 |  |  |             foreach ($activities as $activity) { | 
					
						
							|  |  |  |                 $qm->enqueue(array($user, $author, $activity, $trusted), 'actimp'); | 
					
						
							| 
									
										
										
										
											2010-12-15 17:53:38 -05:00
										 |  |  |             } | 
					
						
							| 
									
										
										
										
											2010-12-17 13:12:17 -05:00
										 |  |  |         } catch (ClientException $ce) { | 
					
						
							|  |  |  |             common_log(LOG_WARNING, $ce->getMessage()); | 
					
						
							|  |  |  |             return true; | 
					
						
							|  |  |  |         } catch (ServerException $se) { | 
					
						
							|  |  |  |             common_log(LOG_ERR, $ce->getMessage()); | 
					
						
							|  |  |  |             return false; | 
					
						
							|  |  |  |         } catch (Exception $e) { | 
					
						
							|  |  |  |             common_log(LOG_ERR, $ce->getMessage()); | 
					
						
							|  |  |  |             return false; | 
					
						
							| 
									
										
										
										
											2010-12-15 17:53:38 -05:00
										 |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-12-17 16:27:20 -05:00
										 |  |  |     function getActivities($feed) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $entries = $feed->getElementsByTagNameNS(Activity::ATOM, 'entry'); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $activities = array(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         for ($i = 0; $i < $entries->length; $i++) { | 
					
						
							|  |  |  |             $activities[] = new Activity($entries->item($i)); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         usort($activities, array("FeedImporter", "activitySort")); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         return $activities; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Sort activities oldest-first | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     static function activitySort($a, $b) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         if ($a->time == $b->time) { | 
					
						
							|  |  |  |             return 0; | 
					
						
							|  |  |  |         } else if ($a->time < $b->time) { | 
					
						
							|  |  |  |             return -1; | 
					
						
							|  |  |  |         } else { | 
					
						
							|  |  |  |             return 1; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-12-17 13:12:17 -05:00
										 |  |  |     function userFromAuthor($author) | 
					
						
							| 
									
										
										
										
											2010-12-15 17:53:38 -05:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2010-12-17 13:12:17 -05:00
										 |  |  |         $user = User::staticGet('uri', $author->id); | 
					
						
							| 
									
										
										
										
											2010-12-15 17:53:38 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |         if (empty($user)) { | 
					
						
							|  |  |  |             $attrs = | 
					
						
							| 
									
										
										
										
											2010-12-17 13:12:17 -05:00
										 |  |  |                 array('nickname' => Ostatus_profile::getActivityObjectNickname($author), | 
					
						
							|  |  |  |                       'uri' => $author->id); | 
					
						
							| 
									
										
										
										
											2010-12-15 17:53:38 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |             $user = User::register($attrs); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $profile = $user->getProfile(); | 
					
						
							| 
									
										
										
										
											2010-12-17 13:12:17 -05:00
										 |  |  |         Ostatus_profile::updateProfile($profile, $author); | 
					
						
							| 
									
										
										
										
											2010-12-15 17:53:38 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |         // FIXME: Update avatar
 | 
					
						
							|  |  |  |         return $user; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } |