]> git.mxchange.org Git - quix0rs-gnu-social.git/blobdiff - plugins/Autocomplete/autocomplete.php
Mark OembedAction, XrdAction, and (plugin) AutocompleteAction as read-only. Tweaked...
[quix0rs-gnu-social.git] / plugins / Autocomplete / autocomplete.php
index 96d54af8d1d40a8f91d9a4c0ffc50b12b43af29b..e15e95ec19abd2c7da8c27362497593701b1dbe9 100644 (file)
@@ -23,6 +23,7 @@
  * @package   StatusNet
  * @author    Craig Andrews <candrews@integralblue.com>
  * @copyright 2008-2009 StatusNet, Inc.
+ * @copyright 2009 Free Software Foundation, Inc http://www.fsf.org
  * @license   http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
  * @link      http://status.net/
  */
@@ -42,15 +43,61 @@ if (!defined('STATUSNET') && !defined('LACONICA')) {
  * @license  http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0
  * @link     http://status.net/
  */
-
 class AutocompleteAction extends Action
 {
     private $result;
 
+    /**
+     * Last-modified date for page
+     *
+     * When was the content of this page last modified? Based on notice,
+     * profile, avatar.
+     *
+     * @return int last-modified date as unix timestamp
+     */
+    function lastModified()
+    {
+        $max=0;
+        foreach($this->users as $user){
+            $max = max($max,strtotime($user->modified),strtotime($user->getProfile()->modified));
+        }
+        foreach($this->groups as $group){
+            $max = max($max,strtotime($group->modified));
+        }
+        return $max;
+    }
+
+    /**
+     * An entity tag for this page
+     *
+     * Shows the ETag for the page, based on the notice ID and timestamps
+     * for the notice, profile, and avatar. It's weak, since we change
+     * the date text "one hour ago", etc.
+     *
+     * @return string etag
+     */
+    function etag()
+    {
+        return '"' . implode(':', array($this->arg('action'),
+            common_user_cache_hash(),
+            crc32($this->arg('q')), //the actual string can have funny characters in we don't want showing up in the etag
+            $this->arg('limit'),
+            $this->lastModified())) . '"';
+    }
+
     function prepare($args)
     {
+        // If we die, show short error messages.
+        StatusNet::setApi(true);
+
         parent::prepare($args);
-        $this->results = array();
+
+        $cur = common_current_user();
+        if (!$cur) {
+            throw new ClientException('Access forbidden', true);
+        }
+        $this->groups=array();
+        $this->users=array();
         $q = $this->arg('q');
         $limit = $this->arg('limit');
         if($limit > 200) $limit=200; //prevent DOS attacks
@@ -60,10 +107,10 @@ class AutocompleteAction extends Action
             $user = new User();
             $user->limit($limit);
             $user->whereAdd('nickname like \'' . trim($user->escape($q), '\'') . '%\'');
-            $user->find();
-            while($user->fetch()) {
-                $profile = Profile::pkeyGet(array('id' => $user->id));
-                $this->results[]=array('nickname' => $user->nickname, 'fullname'=> $profile->fullname, 'type'=>'user');
+            if($user->find()){
+                while($user->fetch()) {
+                    $this->users[]=clone($user);
+                }
             }
         }
         if(substr($q,0,1)=='!'){
@@ -72,9 +119,10 @@ class AutocompleteAction extends Action
             $group = new User_group();
             $group->limit($limit);
             $group->whereAdd('nickname like \'' . trim($group->escape($q), '\'') . '%\'');
-            $group->find();
-            while($group->fetch()) {
-                $this->results[]=array('nickname' => $group->nickname, 'fullname'=> $group->fullname, 'type'=>'group');
+            if($group->find()){
+                while($group->fetch()) {
+                    $this->groups[]=clone($group);
+                }
             }
         }
         return true;
@@ -83,8 +131,50 @@ class AutocompleteAction extends Action
     function handle($args)
     {
         parent::handle($args);
-        foreach($this->results as $result) {
+        $results = array();
+        foreach($this->users as $user){
+            $profile = $user->getProfile();
+            $avatar = $profile->getAvatar(AVATAR_MINI_SIZE);
+            // sigh.... encapsulate this upstream!
+            if ($avatar) {
+                $avatar = $avatar->displayUrl();
+            } else {
+                $avatar = Avatar::defaultImage(AVATAR_MINI_SIZE);
+            }
+            $results[] = array(
+                'nickname' => $user->nickname,
+                'fullname'=> $profile->fullname,
+                'avatar' => $avatar,
+                'type' => 'user'
+            );
+        }
+        foreach($this->groups as $group){
+            // sigh.... encapsulate this upstream!
+            if ($group->mini_logo) {
+                $avatar = $group->mini_logo;
+            } else {
+                $avatar = User_group::defaultLogo(AVATAR_MINI_SIZE);
+            }
+            $results[] = array(
+                'nickname' => $group->nickname,
+                'fullname'=> $group->fullname,
+                'avatar' => $avatar,
+                'type' => 'group');
+        }
+        foreach($results as $result) {
             print json_encode($result) . "\n";
         }
     }
+
+    /**
+     * Is this action read-only?
+     *
+     * @param array $args other arguments
+     *
+     * @return boolean is read only action?
+     */
+    function isReadOnly($args)
+    {
+        return true;
+    }
 }