API:
authorRoan Kattouw <catrope@users.mediawiki.org>
Thu, 24 Jan 2008 17:59:07 +0000 (17:59 +0000)
committerRoan Kattouw <catrope@users.mediawiki.org>
Thu, 24 Jan 2008 17:59:07 +0000 (17:59 +0000)
* Added uiuser parameter to meta=userinfo that gets information about users other than the current user.
* Pretty much completely rewrote userinfo to facilitate this

RELEASE-NOTES
includes/api/ApiQueryUserInfo.php

index ee08a66..71eb966 100644 (file)
@@ -468,6 +468,7 @@ Full API documentation is available at http://www.mediawiki.org/wiki/API
 * Added iiurlwidth and iiurlheight parameters to prop=imageinfo
 * Added format=txt and format=dbg, imported from query.php
 * Added uiprop=editcount to meta=userinfo
+* meta=userinfo can now fetch information on other users as well, through the uiusers parameter
 
 === Languages updated in 1.12 ===
 
index ca8d5da..1211797 100644 (file)
@@ -40,45 +40,117 @@ class ApiQueryUserInfo extends ApiQueryBase {
        }
 
        public function execute() {
-
-               global $wgUser;
-
                $params = $this->extractRequestParams();
                $result = $this->getResult();
+               $r = array();
+
+               if (!is_null($params['prop'])) {
+                       $this->prop = array_flip($params['prop']);
+               } else {
+                       $this->prop = array();
+               }
+               $r['currentuser'] = $this->getCurrentUserInfo();
+               
+               if(is_array($params['users'])) {
+                       $r['users'] = $this->getOtherUsersInfo($params['users']);
+                       $result->setIndexedTagName($r['users'], 'user');
+               }
+               $result->addValue("query", $this->getModuleName(), $r);
+       }
+       
+       protected function getOtherUsersInfo($users) {
+               $goodNames = $retval = array();
+               // Canonicalize user names
+               foreach($users as $u) {
+                       $n = User::getCanonicalName($u);
+                       if($n === false) 
+                               $retval[] = array('name' => $u, 'invalid' => '');
+                        else
+                               $goodNames[] = $n;
+               }
 
+               $db = $this->getDb();
+               $userTable = $db->tableName('user');
+               $tables = "$userTable AS u1";
+               $this->addFields('u1.user_name');
+               $this->addWhereFld('u1.user_name', $goodNames);
+               $this->addFieldsIf('u1.user_editcount', isset($this->prop['editcount']));
+               
+               if(isset($this->prop['groups'])) {
+                       $ug = $db->tableName('user_groups');
+                       $tables = "$tables LEFT JOIN $ug ON ug_user=u1.user_id";
+                       $this->addFields('ug_group');
+               }
+               if(isset($this->prop['blockinfo'])) {
+                       $ipb = $db->tableName('ipblocks');
+                       $tables = "$tables LEFT JOIN $ipb ON ipb_user=u1.user_id";
+                       $tables = "$tables LEFT JOIN $userTable AS u2 ON ipb_by=u2.user_id";
+                       $this->addFields(array('ipb_reason', 'u2.user_name AS blocker_name'));
+               }
+               $this->addTables($tables);
+               
+               $data = array();
+               $res = $this->select(__METHOD__);
+               while(($r = $db->fetchObject($res))) {
+                       $data[$r->user_name]['name'] = $r->user_name;
+                       if(isset($this->prop['editcount']))
+                               $data[$r->user_name]['editcount'] = $r->user_editcount;
+                       if(isset($this->prop['groups']))
+                               // This row contains only one group, others will be added from other rows
+                               if(!is_null($r->ug_group))
+                                       $data[$r->user_name]['groups'][] = $r->ug_group;
+                       if(isset($this->prop['blockinfo']))
+                               if(!is_null($r->blocker_name)) {
+                                       $data[$r->user_name]['blockedby'] = $r->blocker_name;
+                                       $data[$r->user_name]['blockreason'] = $r->ipb_reason;
+                               }
+               }
+               
+               // Second pass: add result data to $retval
+               foreach($goodNames as $u) {
+                       if(!isset($data[$u]))
+                               $retval[] = array('name' => $u, 'missing' => '');
+                       else {
+                               if(isset($this->prop['groups']) && isset($data[$u]['groups']))
+                                       $this->getResult()->setIndexedTagName($data[$u]['groups'], 'g');
+                               $retval[] = $data[$u];
+                       }
+               }
+               return $retval;         
+       }
+       
+       protected function getCurrentUserInfo() {
+               global $wgUser;
+               $result = $this->getResult();
                $vals = array();
+               $vals['id'] = $wgUser->getId();
                $vals['name'] = $wgUser->getName();
 
                if( $wgUser->isAnon() ) $vals['anon'] = '';
-
-               if (!is_null($params['prop'])) {
-                       $prop = array_flip($params['prop']);
-                       if (isset($prop['blockinfo'])) {
-                               if ($wgUser->isBlocked()) {
-                                       $vals['blockedby'] = User::whoIs($wgUser->blockedBy());
-                                       $vals['blockreason'] = $wgUser->blockedFor();
-                               }
-                       }               
-                       if (isset($prop['hasmsg']) && $wgUser->getNewtalk()) {
-                               $vals['messages'] = '';
-                       }
-                       if (isset($prop['groups'])) {
-                               $vals['groups'] = $wgUser->getGroups();
-                               $result->setIndexedTagName($vals['groups'], 'g');       // even if empty
-                       }
-                       if (isset($prop['rights'])) {
-                               $vals['rights'] = $wgUser->getRights();
-                               $result->setIndexedTagName($vals['rights'], 'r');       // even if empty
-                       }
-                       if (isset($prop['options'])) {
-                               $vals['options'] = (is_null($wgUser->mOptions) ? User::getDefaultOptions() : $wgUser->mOptions);
-                       }
-                       if (isset($prop['editcount'])) {
-                               $vals['editcount'] = $wgUser->getEditCount();
+               if (isset($this->prop['blockinfo'])) {
+                       if ($wgUser->isBlocked()) {
+                               $vals['blockedby'] = User::whoIs($wgUser->blockedBy());
+                               $vals['blockreason'] = $wgUser->blockedFor();
                        }
+               }               
+               if (isset($this->prop['hasmsg']) && $wgUser->getNewtalk()) {
+                       $vals['messages'] = '';
                }
-               
-               $result->addValue("query", $this->getModuleName(), $vals);
+               if (isset($this->prop['groups'])) {
+                       $vals['groups'] = $wgUser->getGroups();
+                       $result->setIndexedTagName($vals['groups'], 'g');       // even if empty
+               }
+               if (isset($this->prop['rights'])) {
+                       $vals['rights'] = $wgUser->getRights();
+                       $result->setIndexedTagName($vals['rights'], 'r');       // even if empty
+               }
+               if (isset($this->prop['options'])) {
+                       $vals['options'] = (is_null($wgUser->mOptions) ? User::getDefaultOptions() : $wgUser->mOptions);
+               }
+               if (isset($this->prop['editcount'])) {
+                       $vals['editcount'] = $wgUser->getEditCount();
+               }
+               return $vals;
        }
 
        protected function getAllowedParams() {
@@ -93,7 +165,11 @@ class ApiQueryUserInfo extends ApiQueryBase {
                                        'rights',
                                        'options',
                                        'editcount'
-                               ))
+                               )
+                       ),
+                       'users' => array(
+                               ApiBase :: PARAM_ISMULTI => true
+                       )
                );
        }
 
@@ -102,17 +178,18 @@ class ApiQueryUserInfo extends ApiQueryBase {
                        'prop' => array(
                                'What pieces of information to include',
                                '  blockinfo - tags if the user is blocked, by whom, and for what reason',
-                               '  hasmsg    - adds a tag "message" if user has pending messages',
-                               '  groups    - lists all the groups the current user belongs to',
-                               '  rights    - lists of all rights the current user has',
-                               '  options   - lists all preferences the current user has set',
+                               '  hasmsg    - adds a tag "message" if user has pending messages (current user only)',
+                               '  groups    - lists all the groups the user belongs to',
+                               '  rights    - lists of all rights the user has (current user only)',
+                               '  options   - lists all preferences the user has set (current user only)',
                                '  editcount - adds the user\'s edit count'
-                       )
+                       ),
+                       'users' => 'A list of other users to obtain the same information for'
                );
        }
 
        protected function getDescription() {
-               return 'Get information about the current user';
+               return 'Get information about the current user and other users';
        }
 
        protected function getExamples() {
@@ -127,4 +204,3 @@ class ApiQueryUserInfo extends ApiQueryBase {
                return __CLASS__ . ': $Id$';
        }
 }
-