public function execute() { if (!class_exists('MassMessageServerSideJob')) { $this->error('This script requires the MassMessage extension', 1); } $message = $this->getLocalizedText($this->getOption('message')); $message = str_replace('{{WIKI}}', wfWikiID(), $message); $message .= " ~~~~~\n<!-- SUL finalisation notification -->"; $dbw = CentralAuthUser::getCentralDB(); $updates = new UsersToRenameDatabaseUpdates($dbw); $commonParams = array('subject' => $this->getLocalizedText($this->getOption('subject'))); while (true) { $jobs = array(); $markNotified = array(); $rows = $updates->findUsers(wfWikiID(), 0, $this->mBatchSize); if ($rows->numRows() === 0) { break; } $lb = new LinkBatch(); foreach ($rows as $row) { $title = Title::makeTitleSafe(NS_USER_TALK, $row->utr_name); if (!$title) { $this->output("ERROR: Invalid username for {$row->utr_name}\n"); continue; } $lb->addObj($title); } $lb->execute(); foreach ($rows as $row) { $title = 'User talk:' . $row->utr_name; $titleObj = Title::newFromText($title); if ($titleObj->isRedirect()) { // @fixme find a way to notify users with a redirected user-talk $this->output("Skipping {$title} because it is a redirect\n"); $updates->markRedirectSkipped($row->utr_name, $row->utr_wiki); continue; } $jobs[] = new MassMessageServerSideJob(Title::newFromText($title), array('title' => $title, 'message' => str_replace('{{subst:PAGENAME}}', $row->utr_name, $message)) + $commonParams); $this->output("Will notify {$row->utr_name}\n"); $markNotified[] = $row; } $count = count($jobs); $this->output("Queued job for {$count} users.\n"); JobQueueGroup::singleton()->push($jobs); foreach ($markNotified as $row) { $updates->markNotified($row->utr_name, $row->utr_wiki); } $this->output("Waiting for slaves..."); CentralAuthUser::waitForSlaves(); // users_to_rename wfWaitForSlaves(); // And on the local wiki! $this->output(" done.\n"); $queued = $this->getQueuedCount(); while ($queued > 100000) { $this->output("Currently {$queued} jobs, sleeping for 5 seconds...\n"); sleep(5); $queued = $this->getQueuedCount(); } } }