]> git.mxchange.org Git - quix0rs-gnu-social.git/blobdiff - lib/location.php
Fixed 2 parser errors.
[quix0rs-gnu-social.git] / lib / location.php
index f4ce7f67ac74138bb112502b2a77f5d11836839c..191550d6d6ca53e213f4a13f3b6b8bd2fc763a65 100644 (file)
@@ -34,6 +34,10 @@ if (!defined('STATUSNET') && !defined('LACONICA')) {
 /**
  * class for locations
  *
+ * These are stored in the DB as part of notice and profile records,
+ * but since they're about the same in both, we have a separate class
+ * for them.
+ *
  * @category Location
  * @package  StatusNet
  * @author   Evan Prodromou <evan@status.net>
@@ -43,78 +47,104 @@ if (!defined('STATUSNET') && !defined('LACONICA')) {
 
 class Location
 {
-    public $lat;
-    public $lon;
-    public $location_id;
-    public $location_ns;
+    public  $lat;
+    public  $lon;
+    public  $location_id;
+    public  $location_ns;
+    private $_url;
+    private $_rdfurl;
+
+    var $names = array();
+
+    /**
+     * Constructor that makes a Location from a string name
+     *
+     * @param string $name     Human-readable name (any kind)
+     * @param string $language Language, default = common_language()
+     *
+     * @return Location Location with that name (or null if not found)
+     */
+
+    static function fromName($name, $language=null)
+    {
+        if (is_null($language)) {
+            $language = common_language();
+        }
+
+        $location = null;
+
+        // Let a third-party handle it
 
-    var $names;
+        Event::handle('LocationFromName', array($name, $language, &$location));
 
-    const geonames = 1;
-    const whereOnEarth = 2;
+        return $location;
+    }
 
-    static function fromName($name, $language=null, $location_ns=null)
+    /**
+     * Constructor that makes a Location from an ID
+     *
+     * @param integer $id       Identifier ID
+     * @param integer $ns       Namespace of the identifier
+     * @param string  $language Language to return name in (default is common)
+     *
+     * @return Location The location with this ID (or null if none)
+     */
+
+    static function fromId($id, $ns, $language=null)
     {
         if (is_null($language)) {
             $language = common_language();
         }
-        if (is_null($location_ns)) {
-            $location_ns = common_config('location', 'namespace');
-        }
 
         $location = null;
 
-        if (Event::handle('LocationFromName', array($name, $language, $location_ns, &$location))) {
+        // Let a third-party handle it
 
-            switch ($location_ns) {
-             case Location::geonames:
-                return Location::fromGeonamesName($name, $language);
-                break;
-             case Location::whereOnEarth:
-                return Location::fromWhereOnEarthName($name, $language);
-                break;
-            }
-        }
+        Event::handle('LocationFromId', array($id, $ns, $language, &$location));
 
         return $location;
     }
 
-    static function fromGeonamesName($name, $language)
+    /**
+     * Constructor that finds the nearest location to a lat/lon pair
+     *
+     * @param float  $lat      Latitude
+     * @param float  $lon      Longitude
+     * @param string $language Language for results, default = current
+     *
+     * @return Location the location found, or null if none found
+     */
+
+    static function fromLatLon($lat, $lon, $language=null)
     {
+        if (is_null($language)) {
+            $language = common_language();
+        }
+
         $location = null;
-        $client = HTTPClient::start();
-
-        // XXX: break down a name by commas, narrow by each
-
-        $str = http_build_query(array('maxRows' => 1,
-                                      'q' => $name,
-                                      'lang' => $language,
-                                      'type' => 'json'));
-
-        $result = $client->get('http://ws.geonames.org/search?'.$str);
-
-        if ($result->code == "200") {
-            $rj = json_decode($result->body);
-            if (count($rj['geonames']) > 0) {
-                $n = $rj['geonames'][0];
-                $location = new Location();
-                $location->lat = $n->lat;
-                $location->lon = $n->lon;
-                $location->name = $n->name;
-                $location->location_id = $n->geonameId;
-                $location->location_ns = Location:geonames;
-            }
+
+        // Let a third-party handle it
+
+        if (Event::handle('LocationFromLatLon',
+                          array($lat, $lon, $language, &$location))) {
+            // Default is just the lat/lon pair
+
+            $location = new Location();
+
+            $location->lat = $lat;
+            $location->lon = $lon;
         }
 
         return $location;
     }
 
-    static function fromId($location_id, $location_ns = null)
-    {
-        if (is_null($location_ns)) {
-            $location_ns = common_config('location', 'namespace');
-        }
-    }
+    /**
+     * Get the name for this location in the given language
+     *
+     * @param string $language language to use, default = current
+     *
+     * @return string location name or null if not found
+     */
 
     function getName($language=null)
     {
@@ -122,8 +152,61 @@ class Location
             $language = common_language();
         }
 
-        if (array_key_exists($this->names, $language)) {
+        if (array_key_exists($language, $this->names)) {
             return $this->names[$language];
+        } else {
+            $name = null;
+            Event::handle('LocationNameLanguage', array($this, $language, &$name));
+            if (!empty($name)) {
+                $this->names[$language] = $name;
+                return $name;
+            }
+        }
+    }
+
+    /**
+     * Get an URL suitable for this location
+     *
+     * @return string URL for this location or NULL
+     */
+
+    function getURL()
+    {
+        // Keep one cached
+
+        if (is_string($this->_url)) {
+            return $this->_url;
         }
+
+        $url = null;
+
+        Event::handle('LocationUrl', array($this, &$url));
+
+        $this->_url = $url;
+
+        return $url;
+    }
+
+    /**
+     * Get an URL for this location, suitable for embedding in RDF
+     *
+     * @return string URL for this location or NULL
+     */
+
+    function getRdfURL()
+    {
+        // Keep one cached
+
+        if (is_string($this->_rdfurl)) {
+            return $this->_rdfurl;
+        }
+
+        $url = null;
+
+        Event::handle('LocationRdfUrl', array($this, &$url));
+
+        $this->_rdfurl = $url;
+
+        return $url;
     }
 }