- } else { $touchedParamError = 1; }
- if( $touchedParamError == 1 ) {
- die( "Please put a valid positive integer on the --ignore-touched parameter.\n" );
- } else { $touchedSeconds = 86400 * $options['ignore-touched']; }
-}
-while( $row = $dbr->fetchObject( $res ) ) {
- # Check the account, but ignore it if it's within a $excludedGroups group or if it's touched within the $touchedSeconds seconds.
- $instance = User::newFromId( $row->user_id );
- if( count( array_intersect( $instance->getEffectiveGroups(), $excludedGroups ) ) == 0
- && isInactiveAccount( $row->user_id, true )
- && wfTimestamp( TS_UNIX, $row->user_touched ) < wfTimestamp( TS_UNIX, time() - $touchedSeconds )
- ) {
- # Inactive; print out the name and flag it
- $del[] = $row->user_id;
- echo( $row->user_name . "\n" );
+ $touched = $this->getOption( 'ignore-touched', "1" );
+ if( !ctype_digit( $touched ) ) {
+ $this->error( "Please put a valid positive integer on the --ignore-touched parameter.", true );
+ }
+ $touchedSeconds = 86400 * $touched;
+ foreach( $res as $row ) {
+ # Check the account, but ignore it if it's within a $excludedGroups group or if it's touched within the $touchedSeconds seconds.
+ $instance = User::newFromId( $row->user_id );
+ if( count( array_intersect( $instance->getEffectiveGroups(), $excludedGroups ) ) == 0
+ && $this->isInactiveAccount( $row->user_id, true )
+ && wfTimestamp( TS_UNIX, $row->user_touched ) < wfTimestamp( TS_UNIX, time() - $touchedSeconds )
+ ) {
+ # Inactive; print out the name and flag it
+ $del[] = $row->user_id;
+ $this->output( $row->user_name . "\n" );
+ }
+ }
+ $count = count( $del );
+ $this->output( "...found {$count}.\n" );
+
+ # If required, go back and delete each marked account
+ if( $count > 0 && $this->hasOption('delete') ) {
+ $this->output( "\nDeleting inactive accounts..." );
+ $dbw = wfGetDB( DB_MASTER );
+ $dbw->delete( 'user', array( 'user_id' => $del ), __METHOD__ );
+ $this->output( "done.\n" );
+ # Update the site_stats.ss_users field
+ $users = $dbw->selectField( 'user', 'COUNT(*)', array(), __METHOD__ );
+ $dbw->update( 'site_stats', array( 'ss_users' => $users ), array( 'ss_row_id' => 1 ), __METHOD__ );
+ } elseif( $count > 0 ) {
+ $this->output( "\nRun the script again with --delete to remove them from the database.\n" );
+ }
+ $this->output( "\n" );
+ }
+
+ /**
+ * Could the specified user account be deemed inactive?
+ * (No edits, no deleted edits, no log entries, no current/old uploads)
+ *
+ * @param $id User's ID
+ * @param $master Perform checking on the master
+ * @return bool
+ */
+ private function isInactiveAccount( $id, $master = false ) {
+ $dbo = wfGetDB( $master ? DB_MASTER : DB_SLAVE );
+ $checks = array( 'revision' => 'rev', 'archive' => 'ar', 'logging' => 'log',
+ 'image' => 'img', 'oldimage' => 'oi' );
+ $count = 0;
+
+ $dbo->begin();
+ foreach( $checks as $table => $fprefix ) {
+ $conds = array( $fprefix . '_user' => $id );
+ $count += (int)$dbo->selectField( $table, 'COUNT(*)', $conds, __METHOD__ );
+ }
+ $dbo->commit();
+
+ return $count == 0;