summaryrefslogtreecommitdiff
path: root/htdocs/src/ModerationSchedule.inc.php
diff options
context:
space:
mode:
Diffstat (limited to 'htdocs/src/ModerationSchedule.inc.php')
-rw-r--r--htdocs/src/ModerationSchedule.inc.php94
1 files changed, 66 insertions, 28 deletions
diff --git a/htdocs/src/ModerationSchedule.inc.php b/htdocs/src/ModerationSchedule.inc.php
index 4f5c6db..4c094e4 100644
--- a/htdocs/src/ModerationSchedule.inc.php
+++ b/htdocs/src/ModerationSchedule.inc.php
@@ -18,6 +18,9 @@ class ModerationSchedule implements Iterator {
private $week;
private $expos;
+ private $moderator;
+ private $exceptionfor;
+
public function __construct() {
$this->moderators = array();
$this->exceptions = array();
@@ -31,22 +34,59 @@ class ModerationSchedule implements Iterator {
// Iterator methods
public function rewind() {
- $this->year = date('o');
+ $this->year = date('o') + 0;
$this->week = date('W') + 0;
$this->expos = 0;
+ $this->nextModerator();
}
public function current() {
+ return $this->moderator;
+ }
+
+ public function key() {
+ return strtotime($this->year . 'W' .
+ ($this->week < 10 ? '0' : '') . $this->week);
+ }
+
+ public function next() {
+ if ($this->week == 53) {
+ // Check for leap year
+ if (date('N', mktime(0, 0, 0, 1, 1, $this->year)) == 4
+ or date('N', mktime(0, 0, 0, 12, 31, $this->year)) == 4) {
+
+ $this->week++;
+
+ } else {
+ $this->week = 1;
+ $this->year++;
+ }
+
+ } else if ($this->week > 53) {
+ $this->week = 1;
+ $this->year++;
+
+ } else {
+ $this->week++;
+ }
+
+ $this->nextModerator();
+ }
+
+ private function nextModerator() {
+ // Clear out the exception flag.
+ $this->exceptionfor = null;
+
// Get the scheduled mod.
$modpos = $this->week % $this->getNumberOfModerators();
- $moderator = $this->moderators[$modpos]['user_id'];
+ $this->moderator = User::getById($this->moderators[$modpos]['user_id']);
// Check for exceptions
if (count($this->exceptions) > 0) {
// Skip exceptions prior to the current() date.
while (
// We have exceptions to search
- $this->expos < count($this->exceptions) and
+ $this->expos < (count($this->exceptions) - 1) and
// and the year is less than the current() year
($this->exceptions[$this->expos]['year'] < $this->year or
// or if it is the current() year, but less than the week.
@@ -57,30 +97,19 @@ class ModerationSchedule implements Iterator {
$this->expos++;
}
- // Check if the top exception is for today.
- if ($this->exceptions[$this->expos]['year'] == $this->year
- and $this->exceptions[$this->expos]['week'] == $this->week
- ) {
- // Yes, return the replacement
- $moderator = $this->exceptions[$this->expos]['user_id'];
- }
- }
-
- return User::getById($moderator);
- }
+ // Check if any of the top exception apply today.
+ while($this->exceptions[$this->expos]['year'] == $this->year
+ and $this->exceptions[$this->expos]['week'] == $this->week) {
- public function key() {
- return strtotime($this->year . 'W' .
- ($this->week < 10 ? '0' : '') . $this->week);
- }
+ if ($this->exceptions[$i]['user_id'] == $this->moderator->getId()) {
+ // Yes, return the replacement
+ $this->exceptionfor = $this->moderator;
+ $this->moderator = User::getById($this->exceptions[$this->expos]['user_id']);
+ break;
+ }
- public function next() {
- if ($this->week == 53) {
- $this->week = 1;
- $this->year++;
-
- } else {
- $this->week++;
+ $this->expos++;
+ }
}
}
@@ -89,12 +118,19 @@ class ModerationSchedule implements Iterator {
return true;
}
- private function query() {
+ public function isException() {
+ return $this->exceptionfor !== null;
+ }
+
+ public function getExceptionFor() {
+ return $this->exceptionfor;
+ }
+
+ public function query() {
$db = getDatabase();
- $this->rewind();
// Get the moderators
- $query = "SELECT * FROM moderation_schedule ORDER BY position";
+ $query = "SELECT * FROM moderator_schedule ORDER BY position";
$this->moderators = $db->fetchAssocRows($query);
// Get the exceptions
@@ -105,6 +141,8 @@ class ModerationSchedule implements Iterator {
. " WHERE year >= $year AND week >= $week"
. " ORDER BY year, week";
$this->exceptions = $db->fetchAssocRows($query);
+
+ $this->rewind();
}
}