97 if ( $params[
'prop'] !==
null ) {
98 $this->prop = array_fill_keys( $params[
'prop'],
true );
102 $useNames = $params[
'users'] !==
null;
104 $users = (array)$params[
'users'];
105 $userids = (array)$params[
'userids'];
107 $goodNames = $done = [];
110 foreach ( $users as $u ) {
111 $n = $this->userNameUtils->getCanonical( $u );
112 if ( $n ===
false || $n ===
'' ) {
113 $vals = [
'name' => $u,
'invalid' =>
true ];
114 $fit = $result->addValue( [
'query', $this->
getModuleName() ],
118 implode(
'|', array_diff( $users, $done ) ) );
129 $parameters = &$goodNames;
131 $parameters = &$userids;
136 if ( count( $parameters ) ) {
144 $this->addDeletedUserFilter();
147 $res = $this->
select( __METHOD__ );
151 if ( isset( $this->prop[
'groups'] ) || isset( $this->prop[
'rights'] ) ) {
162 $this->
addJoinConds( [
'user_groups' => [
'JOIN',
'ug_user=user_id' ] ] );
164 $this->
addFields( [
'ug_user',
'ug_group',
'ug_expiry' ] );
166 $db->expr(
'ug_expiry',
'=',
null )->or(
'ug_expiry',
'>=', $db->timestamp() )
168 $userGroupsRes = $this->
select( __METHOD__ );
170 foreach ( $userGroupsRes as $row ) {
171 $userGroups[$row->user_name][] = $row;
174 if ( isset( $this->prop[
'gender'] ) ) {
176 foreach ( $res as $row ) {
177 $userNames[] = $row->user_name;
179 $this->genderCache->doQuery( $userNames, __METHOD__ );
182 if ( isset( $this->prop[
'blockinfo'] ) ) {
183 $blockInfos = $this->getBlockDetailsForRows( $res );
188 foreach ( $res as $row ) {
191 if ( !isset( $userGroups ) ) {
192 $user = $this->userFactory->newFromRow( $row );
194 if ( !isset( $userGroups[$row->user_name] ) || !is_array( $userGroups[$row->user_name] ) ) {
195 $userGroups[$row->user_name] = [];
197 $user = $this->userFactory->newFromRow( $row, [
'user_groups' => $userGroups[$row->user_name] ] );
200 $key = $user->getName();
202 $key = $user->getId();
204 $data[$key][
'userid'] = $user->getId();
205 $data[$key][
'name'] = $user->getName();
207 if ( isset( $this->prop[
'editcount'] ) ) {
208 $data[$key][
'editcount'] = $user->getEditCount();
211 if ( isset( $this->prop[
'registration'] ) ) {
212 $data[$key][
'registration'] =
wfTimestampOrNull( TS_ISO_8601, $user->getRegistration() );
215 if ( isset( $this->prop[
'groups'] ) ) {
216 $data[$key][
'groups'] = $this->userGroupManager->getUserEffectiveGroups( $user );
219 if ( isset( $this->prop[
'groupmemberships'] ) ) {
220 $data[$key][
'groupmemberships'] = array_map(
static function ( $ugm ) {
222 'group' => $ugm->getGroup(),
223 'expiry' => ApiResult::formatExpiry( $ugm->getExpiry() ),
225 }, $this->userGroupManager->getUserGroupMemberships( $user ) );
228 if ( isset( $this->prop[
'implicitgroups'] ) ) {
229 $data[$key][
'implicitgroups'] = $this->userGroupManager->getUserImplicitGroups( $user );
232 if ( isset( $this->prop[
'rights'] ) ) {
234 ->getUserPermissions( $user );
236 if ( $row->hu_deleted ) {
237 $data[$key][
'hidden'] =
true;
239 if ( isset( $this->prop[
'blockinfo'] ) && isset( $blockInfos[$row->user_id] ) ) {
240 $data[$key] += $blockInfos[$row->user_id];
243 if ( isset( $this->prop[
'emailable'] ) ) {
244 $data[$key][
'emailable'] = $user->canReceiveEmail();
247 if ( isset( $this->prop[
'gender'] ) ) {
248 $data[$key][
'gender'] = $this->genderCache->getGenderOf( $user, __METHOD__ );
251 if ( isset( $this->prop[
'centralids'] ) ) {
253 $this->
getConfig(), $user, $params[
'attachedwiki']
260 foreach ( $parameters as $u ) {
261 if ( !isset( $data[$u] ) ) {
263 $data[$u] = [
'name' => $u,
'missing' =>
true ];
264 if ( isset( $this->prop[
'cancreate'] ) ) {
265 $status = $this->authManager->canCreateAccount( $u );
266 $data[$u][
'cancreate'] = $status->isGood();
267 if ( !$status->isGood() ) {
268 $data[$u][
'cancreateerror'] = $this->
getErrorFormatter()->arrayFromStatus( $status );
272 $data[$u] = [
'userid' => $u,
'missing' =>
true ];
276 if ( isset( $this->prop[
'groups'] ) && isset( $data[$u][
'groups'] ) ) {
277 ApiResult::setArrayType( $data[$u][
'groups'],
'array' );
278 ApiResult::setIndexedTagName( $data[$u][
'groups'],
'g' );
280 if ( isset( $this->prop[
'groupmemberships'] ) && isset( $data[$u][
'groupmemberships'] ) ) {
281 ApiResult::setArrayType( $data[$u][
'groupmemberships'],
'array' );
282 ApiResult::setIndexedTagName( $data[$u][
'groupmemberships'],
'groupmembership' );
284 if ( isset( $this->prop[
'implicitgroups'] ) && isset( $data[$u][
'implicitgroups'] ) ) {
285 ApiResult::setArrayType( $data[$u][
'implicitgroups'],
'array' );
286 ApiResult::setIndexedTagName( $data[$u][
'implicitgroups'],
'g' );
288 if ( isset( $this->prop[
'rights'] ) && isset( $data[$u][
'rights'] ) ) {
289 ApiResult::setArrayType( $data[$u][
'rights'],
'array' );
290 ApiResult::setIndexedTagName( $data[$u][
'rights'],
'r' );
294 $fit = $result->addValue( [
'query', $this->
getModuleName() ],
null, $data[$u] );
298 implode(
'|', array_diff( $users, $done ) ) );
301 implode(
'|', array_diff( $userids, $done ) ) );
307 $result->addIndexedTagName( [
'query', $this->
getModuleName() ],
'user' );