/**
  * Check an autopromote condition that is defined by FlaggedRevs
  *
  * Note: some unobtrusive caching is used to avoid DB hits.
  */
 public static function checkAutoPromoteCond($cond, array $params, User $user, &$result)
 {
     global $wgMemc;
     switch ($cond) {
         case APCOND_FR_EDITSUMMARYCOUNT:
             $p = FRUserCounters::getParams($user);
             $result = $p && $p['editComments'] >= $params[0];
             break;
         case APCOND_FR_NEVERBOCKED:
             if ($user->isBlocked()) {
                 $result = false;
                 // failed
             } else {
                 $key = wfMemcKey('flaggedrevs', 'autopromote-notblocked', $user->getId());
                 $val = $wgMemc->get($key);
                 if ($val === 'false') {
                     $result = false;
                     // failed
                 } else {
                     # Hit the DB if the result is not cached or if we need
                     # to check if the user was blocked since the last check...
                     $now_unix = time();
                     $last_checked = is_int($val) ? $val : 0;
                     // TS_UNIX
                     $result = !self::wasPreviouslyBlocked($user, $last_checked);
                     $wgMemc->set($key, $result ? $now_unix : 'false', 7 * 86400);
                 }
             }
             break;
         case APCOND_FR_UNIQUEPAGECOUNT:
             $p = FRUserCounters::getParams($user);
             $result = $p && $p['uniqueContentPages'] >= $params[0];
             break;
         case APCOND_FR_EDITSPACING:
             $key = wfMemcKey('flaggedrevs', 'autopromote-editspacing', $user->getId(), $params[0], $params[1]);
             $val = $wgMemc->get($key);
             if ($val === 'true') {
                 $result = true;
                 // passed
             } elseif ($val === 'false') {
                 $result = false;
                 // failed
             } else {
                 # Hit the DB only if the result is not cached...
                 $pass = self::editSpacingCheck($user, $params[0], $params[1]);
                 # Make a key to store the results
                 if ($pass === true) {
                     $wgMemc->set($key, 'true', 14 * 86400);
                 } else {
                     $wgMemc->set($key, 'false', $pass);
                 }
                 $result = $pass === true;
             }
             break;
         case APCOND_FR_EDITCOUNT:
             # $maxNew is the *most* edits that can be too recent
             $maxNew = $user->getEditCount() - $params[0];
             if ($maxNew < 0) {
                 $result = false;
                 // doesn't meet count even *with* recent edits
             } elseif ($params[1] <= 0) {
                 $result = true;
                 // passed; we aren't excluding any recent edits
             } else {
                 # Check all recent edits...
                 $n = self::recentEditCount($user->getId(), $params[1], $maxNew);
                 $result = $n <= $maxNew;
             }
             break;
         case APCOND_FR_CONTENTEDITCOUNT:
             $p = FRUserCounters::getParams($user);
             if (!$p) {
                 $result = false;
             } else {
                 # $maxNew is the *most* edits that can be too recent
                 $maxNew = $p['totalContentEdits'] - $params[0];
                 if ($maxNew < 0) {
                     $result = false;
                     // doesn't meet count even *with* recent edits
                 } elseif ($params[1] <= 0) {
                     $result = true;
                     // passed; we aren't excluding any recent edits
                 } else {
                     # Check all recent content edits...
                     $n = self::recentContentEditCount($user->getId(), $params[1], $maxNew);
                     $result = $n <= $maxNew;
                 }
             }
             break;
         case APCOND_FR_CHECKEDEDITCOUNT:
             $key = wfMemcKey('flaggedrevs', 'autopromote-reviewededits', $user->getId(), $params[0], $params[1]);
             $val = $wgMemc->get($key);
             if ($val === 'true') {
                 $result = true;
                 // passed
             } elseif ($val === 'false') {
                 $result = false;
                 // failed
             } else {
                 # Hit the DB only if the result is not cached...
                 $result = self::reviewedEditsCheck($user, $params[0], $params[1]);
                 if ($result) {
                     $wgMemc->set($key, 'true', 7 * 86400);
                 } else {
                     $wgMemc->set($key, 'false', 3600);
                     // briefly cache
                 }
             }
             break;
         case APCOND_FR_USERPAGEBYTES:
             $result = !$params[0] || $user->getUserPage()->getLength() >= $params[0];
             break;
         case APCOND_FR_MAXREVERTEDEDITRATIO:
             $p = FRUserCounters::getParams($user);
             $result = $p && $params[0] * $user->getEditCount() >= $p['revertedEdits'];
             break;
         case APCOND_FR_NEVERDEMOTED:
             // b/c
             $p = FRUserCounters::getParams($user);
             $result = $p && empty($p['demoted']);
             break;
     }
     return true;
 }