/** * 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; }