title); } else { return str_replace(array('$x', '$s'), array('x', 's'), $this->title); } } public function getCondition(Watch $watch) { if (!$watch->user()->watchType($this->flag)) { if (!self::$false) { self::$false = new PFC_False(); } return self::$false; } else { return $this->buildCondition($watch); } } abstract protected function buildCondition(Watch $watch); abstract public function getOrder(); abstract public function getDate(PlUser $user); public function publicationDate(PlUser $user) { return $this->getDate($user); } public function seen(PlUser $user, $last) { return strtotime($this->getDate($user)) > $last; } public function getData(PlUser $user) { return null; } } class WatchProfileUpdate extends WatchOperation { private static $order = null; public $flag = 'profile'; public $title = 'Mise$s à jour de fiche'; private $date = null; public static function register(Profile $profile, $field) { XDB::execute('INSERT INTO watch_profile (pid, ts, field) VALUES ({?}, NOW(), {?}) ON DUPLICATE KEY UPDATE ts = NOW()', $profile->id(), $field); } protected function buildCondition(Watch $watch) { $this->date = $watch->date(); return new PFC_And(new UFC_ProfileUpdated('>', $watch->date()), $watch->contactCondition()); } public function getOrder() { if (!self::$order) { self::$order = new UFO_ProfileUpdate(); } return self::$order; } public function getDate(PlUser $user) { return $user->profile()->last_change; } public function getData(PlUser $user) { $data = XDB::fetchColumn("SELECT field FROM watch_profile WHERE pid = {?} AND ts > FROM_UNIXTIME({?}) AND field != '' ORDER BY ts", $user->profile()->id(), $this->date); if (count($data) == 0) { return null; } else { $text = array(); foreach ($data as $f) { $text[] = Profile::$descriptions[$f]; } return $text; } } } class WatchRegistration extends WatchOperation { private static $order = null; public $flag = 'registration'; public $title = 'Inscription$s'; protected function buildCondition(Watch $watch) { return new PFC_And(new UFC_Registered(false, '>', $watch->date()), new PFC_Or($watch->contactCondition(), $watch->promoCondition(), $watch->groupCondition())); } public function getOrder() { if (!self::$order) { self::$order = new UFO_Registration(); } return self::$order; } public function getDate(PlUser $user) { return $user->registration_date; } } class WatchDeath extends WatchOperation { private static $order = null; public $flag = 'death'; public $title = 'Décès'; protected function buildCondition(Watch $watch) { return new PFC_And(new UFC_Dead('>', $watch->date(), true), new PFC_Or($watch->contactCondition(), $watch->promoCondition(), $watch->groupCondition())); } public function getOrder() { if (!self::$order) { self::$order = new UFO_Death(); } return self::$order; } public function getDate(PlUser $user) { return $user->profile()->deathdate; } public function publicationDate(PlUser $user) { return $user->profile()->deathdate_rec; } public function seen(PlUser $user, $last) { return strtotime($user->profile()->deathdate_rec) > $last; } } class WatchBirthday extends WatchOperation { const WATCH_LIMIT = 604800; // 1 week private static $order = null; public $flag = 'birthday'; public $title = 'Anniversaire$s'; protected function buildCondition(Watch $watch) { $not_dead = new PFC_Not(new UFC_Dead()); $select_date = new PFC_OR(new UFC_Birthday('=', time()), new PFC_And(new UFC_Birthday('<=', time() + self::WATCH_LIMIT), new UFC_Birthday('>', $watch->date() + self::WATCH_LIMIT))); $profile = $watch->profile(); $cond = $watch->contactCondition(); if ($profile) { $cond = new PFC_Or($cond, new PFC_And($watch->promoCondition(), new UFC_Promo('>=', $profile->mainGrade(), $profile->yearpromo() - 1), new UFC_Promo('<=', $profile->mainGrade(), $profile->yearpromo() + 1)), $watch->groupCondition()); } return new PFC_And($not_dead, $select_date, $cond); } public function getOrder() { if (!self::$order) { self::$order = new UFO_Birthday(); } return self::$order; } public function getDate(PlUser $user) { return $user->profile()->next_birthday; } public function publicationDate(PlUser $user) { return date('Y-m-d', strtotime($user->profile()->next_birthday) - self::WATCH_LIMIT); } public function seen(PlUser $user, $last) { $birthday = strtotime($user->profile()->next_birthday); return $birthday > $last + self::WATCH_LIMIT || date('Ymd', $birthday) == date('Ymd'); } } class Watch { private static $classes = array('WatchRegistration', 'WatchProfileUpdate', 'WatchDeath', 'WatchBirthday'); private static $events = array(); private $user = null; private $date = null; private $contactCond = null; private $promoCond = null; private $groupCond = null; private $filters = array(); public function __construct(PlUser $user, $date = null) { $this->user = $user; $this->date = self::getDate($user, $date); } public function user() { return $this->user; } public function profile() { return $this->user->profile(); } public function date() { return $this->date; } public function contactCondition() { if (!$this->contactCond) { $this->contactCond = new UFC_WatchContact($this->user); } return $this->contactCond; } public function promoCondition() { if (!$this->promoCond) { $this->promoCond = new UFC_WatchPromo($this->user); } return $this->promoCond; } public function groupCondition() { if (!$this->groupCond) { $this->groupCond = new UFC_WatchGroup($this->user); } return $this->groupCond; } private function fetchEventWatch($class) { if (!isset(self::$events[$class])) { self::$events[$class] = new $class(); } return self::$events[$class]; } private function fetchFilter($class) { if (!isset($this->filters[$class])) { $event = $this->fetchEventWatch($class); $this->filters[$class] = new UserFilter($event->getCondition($this), array($event->getOrder(), new UFO_Name())); } return $this->filters[$class]; } public function count() { $count = 0; foreach (self::$classes as $class) { $uf = $this->fetchFilter($class); $count += $uf->getTotalCount(); } return $count; } private function fetchEvents($class) { $obj = $this->fetchEventWatch($class); $uf = $this->fetchFilter($class); $users = $uf->getUsers(); if (count($users) == 0) { return null; } else { return array('type' => $obj->flag, 'operation' => $obj, 'title' => $obj->getTitle(count($users)), 'users' => $users); } } public function events() { $events = array(); foreach (self::$classes as $class) { $e = $this->fetchEvents($class); if (!is_null($e)) { $events[] = $e; } } return $events; } private static function getDate(PlUser $user, $date) { if (is_null($date)) { $date = $user->watchLast(); $limit = time() - (7 * 86400); if ($date < $limit) { $date = $limit; } } return $date; } public static function getCount(PlUser $user, $date = null) { $watch = new Watch($user, $date); return $watch->count(); } public static function getEvents(PlUser $user, $date = null) { $watch = new Watch($user, $date); return $watch->events(); } } // vim:set et sw=4 sts=4 sws=4 foldmethod=marker fenc=utf-8: ?>