129 $timestamp = $dbr->timestamp( (
int)
wfTimestamp( TS_UNIX ) - $activeUserSeconds );
133 $tables = [
'querycachetwo',
'user',
'actor' ];
134 $fields = [
'qcc_title',
'user_id',
'actor_id' ];
136 'user' => [
'JOIN',
'user_name = qcc_title' ],
137 'actor' => [
'JOIN',
'actor_user = user_id' ],
140 'qcc_type' =>
'activeusers',
144 if ( $data !==
null ) {
145 $options[
'ORDER BY'] =
'qcc_title ' . $data[
'order'];
146 $options[
'LIMIT'] = $data[
'limit'];
147 $conds = array_merge( $conds, $data[
'conds'] );
149 if ( $this->requestedUser !=
'' ) {
150 $conds[] = $dbr->expr(
'qcc_title',
'>=', $this->requestedUser );
152 if ( $this->groups !== [] ) {
153 $tables[
'ug1'] =
'user_groups';
154 $jconds[
'ug1'] = [
'JOIN',
'ug1.ug_user = user_id' ];
156 $conds[] =
'ug1.ug_expiry IS NULL OR ug1.ug_expiry >= ' . $dbr->addQuotes( $dbr->timestamp() );
158 if ( $this->excludegroups !== [] ) {
159 $tables[
'ug2'] =
'user_groups';
160 $jconds[
'ug2'] = [
'LEFT JOIN', [
161 'ug2.ug_user = user_id',
162 'ug2.ug_group' => $this->excludegroups,
163 'ug2.ug_expiry IS NULL OR ug2.ug_expiry >= ' . $dbr->addQuotes( $dbr->timestamp() ),
165 $conds[
'ug2.ug_user'] =
null;
168 $conds[] = $this->hideUserUtils->getExpression( $dbr );
170 $subquery = $dbr->buildSelectSubquery( $tables, $fields, $conds, $fname, $options, $jconds );
173 $tables = [
'qcc_users' => $subquery,
'recentchanges' ];
174 $jconds = [
'recentchanges' => [
'LEFT JOIN', [
175 'rc_actor = actor_id',
178 $dbr->expr(
'rc_log_type',
'=',
null )->or(
'rc_log_type',
'!=',
'newusers' ),
179 $dbr->expr(
'rc_timestamp',
'>=', $timestamp ),
187 'user_name' =>
'qcc_title',
188 'user_id' =>
'user_id',
189 'recentedits' =>
'COUNT(DISTINCT rc_id)'
191 'options' => [
'GROUP BY' => [
'qcc_title',
'user_id' ] ],
193 'join_conds' => $jconds,
200 $sortColumns = array_merge( [ $this->mIndexField ], $this->mExtraSortFields );
201 if ( $order === self::QUERY_ASCENDING ) {
203 $orderBy = $sortColumns;
204 $operator = $this->mIncludeOffset ?
'>=' :
'>';
208 foreach ( $sortColumns as $col ) {
209 $orderBy[] = $col .
' DESC';
211 $operator = $this->mIncludeOffset ?
'<=' :
'<';
214 'limit' => intval( $limit ),
217 $offset !=
'' ? [ $this->mIndexField . $operator . $this->
getDatabase()->addQuotes( $offset ) ] : [],
220 $tables = $info[
'tables'];
221 $fields = $info[
'fields'];
222 $conds = $info[
'conds'];
223 $options = $info[
'options'];
224 $join_conds = $info[
'join_conds'];
225 $options[
'ORDER BY'] = $orderBy;
226 return [ $tables, $fields, $conds, $fname, $options, $join_conds ];
230 parent::doBatchLookups();
233 foreach ( $this->mResult as $row ) {
234 $uids[] = (int)$row->user_id;
242 $res = $dbr->newSelectQueryBuilder()
244 'bt_user' =>
'ipb_user',
245 'deleted' =>
'MAX(ipb_deleted)',
246 'sitewide' =>
'MAX(ipb_sitewide)'
249 ->where( [
'ipb_user' => $uids ] )
250 ->groupBy( [
'ipb_user' ] )
251 ->caller( __METHOD__ )->fetchResultSet();
253 $res = $dbr->newSelectQueryBuilder()
256 'deleted' =>
'MAX(bl_deleted)',
257 'sitewide' =>
'MAX(bl_sitewide)'
259 ->from(
'block_target' )
260 ->join(
'block',
null,
'bl_target=bt_id' )
261 ->where( [
'bt_user' => $uids ] )
262 ->groupBy( [
'bt_user' ] )
263 ->caller( __METHOD__ )->fetchResultSet();
265 $this->blockStatusByUid = [];
266 foreach ( $res as $row ) {
267 $this->blockStatusByUid[$row->bt_user] = [
268 'deleted' => $row->deleted,
269 'sitewide' => $row->sitewide,
272 $this->mResult->seek( 0 );
276 $userName = $row->user_name;
278 $ulinks = Linker::userLink( $row->user_id, $userName );
279 $ulinks .= Linker::userToolLinks(
298 foreach ( $ugms as $ugm ) {
302 $groups = $lang->commaList( $list );
304 $item = $lang->specialList( $ulinks,
$groups );
309 $isBlocked = isset( $this->blockStatusByUid[$row->user_id] );
311 if ( $this->blockStatusByUid[$row->user_id][
'deleted'] == 1 ) {
312 $item =
"<span class=\"deleted\">$item</span>";
314 if ( $this->blockStatusByUid[$row->user_id][
'sitewide'] == 1 ) {
315 $blocked =
' ' . $this->
msg(
'listusers-blocked', $userName )->escaped();
318 $count = $this->
msg(
'activeusers-count' )->numParams( $row->recentedits )
319 ->params( $userName )->numParams( $this->RCMaxAge )->escaped();
321 return Html::rawElement(
'li', [],
"{$item} [{$count}]{$blocked}" );