]> git.mxchange.org Git - quix0rs-gnu-social.git/blobdiff - plugins/Sitemap/usersitemap.php
Merge branch '1.0.x' of git://gitorious.org/statusnet/mainline
[quix0rs-gnu-social.git] / plugins / Sitemap / usersitemap.php
index 582a13b664d6d6eec30ed95ad41686a1c19358a5..c39165d0edb97bf34f6a628a1ca21aae0a2b2795 100644 (file)
@@ -40,40 +40,88 @@ if (!defined('STATUSNET')) {
  * @license  http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
  * @link     http://status.net/
  */
-
 class UsersitemapAction extends SitemapAction
 {
-    const USERS_PER_MAP = 25000;
-
-    var $user = null;
+    var $users = null;
+    var $j     = 0;
 
     function prepare($args)
     {
         parent::prepare($args);
 
-        $i = $this->trimmed('index');
+        $y = $this->trimmed('year');
 
-        $i += 0;
+        $m = $this->trimmed('month');
+        $d = $this->trimmed('day');
 
-        $offset = ($i-1) * self::USERS_PER_MAP;
-        $limit  = self::USERS_PER_MAP;
-
-        $this->user = new User();
-
-        $this->user->orderBy('id');
-        $this->user->limit($offset, $limit);
+        $i = $this->trimmed('index');
 
-        $this->user->find();
+        $y += 0;
+        $m += 0;
+        $d += 0;
+        $i += 0;
 
+        $this->users = $this->getUsers($y, $m, $d, $i);
+        $this->j     = 0;
         return true;
     }
 
     function nextUrl()
     {
-        if ($this->user->fetch()) {
-            return array(common_profile_url($this->user->nickname), null, null, null);
+        if ($this->j < count($this->users)) {
+            $nickname = $this->users[$this->j];
+            $this->j++;
+            return array(common_profile_url($nickname), null, null, '1.0');
         } else {
             return null;
         }
     }
+
+    function getUsers($y, $m, $d, $i)
+    {
+        $u = User::cacheGet("sitemap:user:$y:$m:$d:$i");
+
+        if ($u === false) {
+
+            $user = new User();
+
+            $begindt = sprintf('%04d-%02d-%02d 00:00:00', $y, $m, $d);
+
+            // XXX: estimates 1d == 24h, which screws up days
+            // with leap seconds (1d == 24h + 1s). Thankfully they're
+            // few and far between.
+
+            $theend = strtotime($begindt) + (24 * 60 * 60);
+            $enddt  = common_sql_date($theend);
+
+            $user->selectAdd();
+            $user->selectAdd('nickname');
+            $user->whereAdd("created >= '$begindt'");
+            $user->whereAdd("created <  '$enddt'");
+
+            $user->orderBy('created');
+
+            $offset = ($i-1) * SitemapPlugin::USERS_PER_MAP;
+            $limit  = SitemapPlugin::USERS_PER_MAP;
+
+            $user->limit($offset, $limit);
+
+            $user->find();
+
+            while ($user->fetch()) {
+                $u[] = $user->nickname;
+            }
+
+            $c = Cache::instance();
+
+            if (!empty($c)) {
+                $c->set(Cache::key("sitemap:user:$y:$m:$d:$i"),
+                        $u,
+                        Cache::COMPRESSED,
+                        ((time() > $theend) ? (time() + 90 * 24 * 60 * 60) : (time() + 5 * 60)));
+            }
+        }
+
+        return $u;
+    }
 }