| 
									
										
										
										
											2010-03-20 16:06:22 -05:00
										 |  |  | <?php | 
					
						
							|  |  |  | /** | 
					
						
							|  |  |  |  * StatusNet, the distributed open-source microblogging tool | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * An activity | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * 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  Feed | 
					
						
							|  |  |  |  * @package   StatusNet | 
					
						
							|  |  |  |  * @author    Evan Prodromou <evan@status.net> | 
					
						
							|  |  |  |  * @author    Zach Copley <zach@status.net> | 
					
						
							|  |  |  |  * @copyright 2010 StatusNet, Inc. | 
					
						
							|  |  |  |  * @license   http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPLv3 | 
					
						
							|  |  |  |  * @link      http://status.net/ | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | if (!defined('STATUSNET')) { | 
					
						
							|  |  |  |     exit(1); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | class ActivityContext | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     public $replyToID; | 
					
						
							|  |  |  |     public $replyToUrl; | 
					
						
							|  |  |  |     public $location; | 
					
						
							|  |  |  |     public $attention = array(); | 
					
						
							|  |  |  |     public $conversation; | 
					
						
							| 
									
										
										
										
											2010-12-05 16:15:05 -05:00
										 |  |  |     public $forwardID; // deprecated, use ActivityVerb::SHARE instead
 | 
					
						
							|  |  |  |     public $forwardUrl; // deprecated, use ActivityVerb::SHARE instead
 | 
					
						
							| 
									
										
										
										
											2010-03-20 16:06:22 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  |     const THR     = 'http://purl.org/syndication/thread/1.0'; | 
					
						
							|  |  |  |     const GEORSS  = 'http://www.georss.org/georss'; | 
					
						
							|  |  |  |     const OSTATUS = 'http://ostatus.org/schema/1.0'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     const INREPLYTO = 'in-reply-to'; | 
					
						
							|  |  |  |     const REF       = 'ref'; | 
					
						
							|  |  |  |     const HREF      = 'href'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     const POINT     = 'point'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     const ATTENTION    = 'ostatus:attention'; | 
					
						
							| 
									
										
										
										
											2010-08-02 14:06:14 -04:00
										 |  |  |     const MENTIONED    = 'mentioned'; | 
					
						
							| 
									
										
										
										
											2010-03-20 16:06:22 -05:00
										 |  |  |     const CONVERSATION = 'ostatus:conversation'; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-09-13 16:23:10 -04:00
										 |  |  |     function __construct($element = null) | 
					
						
							| 
									
										
										
										
											2010-03-20 16:06:22 -05:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2010-09-13 16:23:10 -04:00
										 |  |  |         if (empty($element)) { | 
					
						
							|  |  |  |             return; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-20 16:06:22 -05:00
										 |  |  |         $replyToEl = ActivityUtils::child($element, self::INREPLYTO, self::THR); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         if (!empty($replyToEl)) { | 
					
						
							|  |  |  |             $this->replyToID  = $replyToEl->getAttribute(self::REF); | 
					
						
							|  |  |  |             $this->replyToUrl = $replyToEl->getAttribute(self::HREF); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $this->location = $this->getLocation($element); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $this->conversation = ActivityUtils::getLink($element, self::CONVERSATION); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         // Multiple attention links allowed
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $links = $element->getElementsByTagNameNS(ActivityUtils::ATOM, ActivityUtils::LINK); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-08-10 13:36:38 -07:00
										 |  |  |         $attention = array(); | 
					
						
							| 
									
										
										
										
											2010-03-20 16:06:22 -05:00
										 |  |  |         for ($i = 0; $i < $links->length; $i++) { | 
					
						
							|  |  |  |             $link = $links->item($i); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             $linkRel = $link->getAttribute(ActivityUtils::REL); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-08-02 14:06:14 -04:00
										 |  |  |             // XXX: Deprecate this in favour of "mentioned" from Salmon spec
 | 
					
						
							|  |  |  |             // http://salmon-protocol.googlecode.com/svn/trunk/draft-panzer-salmon-00.html#SALR
 | 
					
						
							| 
									
										
										
										
											2010-03-20 16:06:22 -05:00
										 |  |  |             if ($linkRel == self::ATTENTION) { | 
					
						
							| 
									
										
										
										
											2010-08-10 13:36:38 -07:00
										 |  |  |                 $attention[] = $link->getAttribute(self::HREF); | 
					
						
							| 
									
										
										
										
											2010-08-02 14:24:50 -04:00
										 |  |  |             } elseif ($linkRel == self::MENTIONED) { | 
					
						
							| 
									
										
										
										
											2010-08-10 13:36:38 -07:00
										 |  |  |                 $attention[] = $link->getAttribute(self::HREF); | 
					
						
							| 
									
										
										
										
											2010-03-20 16:06:22 -05:00
										 |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							| 
									
										
										
										
											2010-08-10 13:36:38 -07:00
										 |  |  |         $this->attention = array_unique($attention); | 
					
						
							| 
									
										
										
										
											2010-03-20 16:06:22 -05:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Parse location given as a GeoRSS-simple point, if provided. | 
					
						
							|  |  |  |      * http://www.georss.org/simple | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @param feed item $entry | 
					
						
							|  |  |  |      * @return mixed Location or false | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     function getLocation($dom) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $points = $dom->getElementsByTagNameNS(self::GEORSS, self::POINT); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         for ($i = 0; $i < $points->length; $i++) { | 
					
						
							|  |  |  |             $point = $points->item($i)->textContent; | 
					
						
							|  |  |  |             return self::locationFromPoint($point); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         return null; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     // XXX: Move to ActivityUtils or Location?
 | 
					
						
							|  |  |  |     static function locationFromPoint($point) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $point = str_replace(',', ' ', $point); // per spec "treat commas as whitespace"
 | 
					
						
							|  |  |  |         $point = preg_replace('/\s+/', ' ', $point); | 
					
						
							|  |  |  |         $point = trim($point); | 
					
						
							|  |  |  |         $coords = explode(' ', $point); | 
					
						
							|  |  |  |         if (count($coords) == 2) { | 
					
						
							|  |  |  |             list($lat, $lon) = $coords; | 
					
						
							|  |  |  |             if (is_numeric($lat) && is_numeric($lon)) { | 
					
						
							|  |  |  |                 common_log(LOG_INFO, "Looking up location for $lat $lon from georss point"); | 
					
						
							|  |  |  |                 return Location::fromLatLon($lat, $lon); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         common_log(LOG_ERR, "Ignoring bogus georss:point value $point"); | 
					
						
							|  |  |  |         return null; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2011-02-18 00:51:08 -08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Returns context (StatusNet stuff) as an array suitable for serializing | 
					
						
							|  |  |  |      * in JSON. Right now context stuff is an extension to Activity. | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @return array the context | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2011-02-18 10:02:41 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-18 00:51:08 -08:00
										 |  |  |     function asArray() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $context = array(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-18 18:52:49 -08:00
										 |  |  |         $context['inReplyTo']    = $this->getInReplyToArray(); | 
					
						
							| 
									
										
										
										
											2011-02-18 00:51:08 -08:00
										 |  |  |         $context['conversation'] = $this->conversation; | 
					
						
							|  |  |  |         $context['forwardId']    = $this->forwardID; | 
					
						
							|  |  |  |         $context['forwardUrl']   = $this->forwardUrl; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         return array_filter($context); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Returns an array of arrays representing Activity Objects (intended to be | 
					
						
							|  |  |  |      * serialized in JSON) that represent WHO the Activity is supposed to | 
					
						
							|  |  |  |      * be received by. This is not really specified but appears in an example | 
					
						
							|  |  |  |      * of the current spec as an extension. We might want to figure out a JSON | 
					
						
							|  |  |  |      * serialization for OStatus and use that to express mentions instead. | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * XXX: People's ideas on how to do this are all over the place | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @return array the array of recipients | 
					
						
							|  |  |  |      */ | 
					
						
							| 
									
										
										
										
											2011-02-18 10:02:41 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-18 00:51:08 -08:00
										 |  |  |     function getToArray() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $tos = array(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         foreach ($this->attention as $attnUrl) { | 
					
						
							| 
									
										
										
										
											2011-02-18 10:02:41 -08:00
										 |  |  |             $to = array( | 
					
						
							|  |  |  |                 'objectType' => 'person', | 
					
						
							|  |  |  |                 'id'         => $attnUrl, | 
					
						
							|  |  |  |                 'url'        => $attnUrl | 
					
						
							|  |  |  |             ); | 
					
						
							| 
									
										
										
										
											2011-02-18 00:51:08 -08:00
										 |  |  |             $tos[] = $to; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         return $tos; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-18 18:52:49 -08:00
										 |  |  |     /** | 
					
						
							|  |  |  |      * Return an array for the notices this notice is a reply to  | 
					
						
							|  |  |  |      * suitable for serializing as JSON note objects. | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @return array the array of notes | 
					
						
							| 
									
										
										
										
											2011-02-18 10:02:41 -08:00
										 |  |  |      */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |      function getInReplyToArray() | 
					
						
							|  |  |  |      { | 
					
						
							| 
									
										
										
										
											2011-02-18 18:52:49 -08:00
										 |  |  |          if (empty($this->replyToID) && empty($this->replyToUrl)) { | 
					
						
							|  |  |  |              return null; | 
					
						
							|  |  |  |          } | 
					
						
							| 
									
										
										
										
											2011-02-18 10:02:41 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-18 18:52:49 -08:00
										 |  |  |          $replyToObj = array('objectType' => 'note'); | 
					
						
							| 
									
										
										
										
											2011-02-18 10:02:41 -08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-18 18:52:49 -08:00
										 |  |  |          // XXX: Possibly shorten this to just the numeric ID?
 | 
					
						
							|  |  |  |          //      Currently, it's the full URI of the notice.
 | 
					
						
							|  |  |  |          if (!empty($this->replyToID)) { | 
					
						
							|  |  |  |              $replyToObj['id'] = $this->replyToID; | 
					
						
							|  |  |  |          } | 
					
						
							| 
									
										
										
										
											2011-02-18 10:02:41 -08:00
										 |  |  |          if (!empty($this->replyToUrl)) { | 
					
						
							|  |  |  |              $replyToObj['url'] = $this->replyToUrl; | 
					
						
							|  |  |  |          } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-18 18:52:49 -08:00
										 |  |  |          return $replyToObj; | 
					
						
							| 
									
										
										
										
											2011-02-18 10:02:41 -08:00
										 |  |  |      } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-03-20 16:06:22 -05:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2011-02-18 10:02:41 -08:00
										 |  |  | 
 |