+ private function delPromo(PlPage &$page, $promo)
+ {
+ $promos = $this->getPromo($page, $promo);
+ if (!$promos || count($promos) == 0) {
+ return;
+ }
+ $to_delete = array();
+ foreach ($promos as $promo) {
+ $to_delete[] = XDB::format('{?}', $promo);
+ }
+ XDB::execute('DELETE FROM watch_promo
+ WHERE ' . XDB::format('uid = {?}', S::i('uid')) . '
+ AND promo IN (' . implode(', ', $to_delete) . ')');
+ S::user()->invalidWatchCache();
+ Platal::session()->updateNbNotifs();
+ }
+
+ public function addNonRegistered(PlPage &$page, PlUser &$user)
+ {
+ XDB::execute('INSERT IGNORE INTO watch_nonins (uid, ni_id)
+ VALUES ({?}, {?})', S::i('uid'), $user->id());
+ S::user()->invalidWatchCache();
+ Platal::session()->updateNbNotifs();
+ }
+
+ public function delNonRegistered(PlPage &$page, PlUser &$user)
+ {
+ XDB::execute('DELETE FROM watch_nonins
+ WHERE uid = {?} AND ni_id = {?}',
+ S::i('uid'), $user->id());
+ S::user()->invalidWatchCache();
+ Platal::session()->updateNbNotifs();
+ }
+
+ public function handler_notifs(&$page, $action = null, $arg = null)
+ {
+ $page->changeTpl('carnet/notifs.tpl');
+
+ if ($action) {
+ S::assert_xsrf_token();
+ switch ($action) {
+ case 'add_promo':
+ $this->addPromo($page, $arg);
+ break;
+
+ case 'del_promo':
+ $this->delPromo($page, $arg);
+ break;
+
+ case 'del_nonins':
+ $user = User::get($arg);
+ if ($user) {
+ $this->delNonRegistered($page, $user);
+ }
+ break;
+
+ case 'add_nonins':
+ $user = User::get($arg);
+ if ($user) {
+ $this->addNonRegistered($page, $user);
+ }
+ break;
+ }
+ }
+
+ if (Env::has('subs')) {
+ S::assert_xsrf_token();
+ $flags = new PlFlagSet();
+ foreach (Env::v('sub') as $key=>$value) {
+ $flags->addFlag($key, $value);
+ }
+ XDB::execute('UPDATE watch
+ SET actions = {?}
+ WHERE uid = {?}', $flags, S::i('uid'));
+ S::user()->invalidWatchCache();
+ Platal::session()->updateNbNotifs();
+ }
+
+ if (Env::has('flags_contacts')) {
+ S::assert_xsrf_token();
+ XDB::execute('UPDATE watch
+ SET ' . XDB::changeFlag('flags', 'contacts', Env::b('contacts')) . '
+ WHERE uid = {?}', S::i('uid'));
+ S::user()->invalidWatchCache();
+ Platal::session()->updateNbNotifs();
+ }
+
+ if (Env::has('flags_mail')) {
+ S::assert_xsrf_token();
+ XDB::execute('UPDATE watch
+ SET ' . XDB::changeFlag('flags', 'mail', Env::b('mail')) . '
+ WHERE uid = {?}', S::i('uid'));
+ S::user()->invalidWatchCache();
+ Platal::session()->updateNbNotifs();
+ }
+
+ $user = S::user();
+ $nonins = new UserFilter(new UFC_WatchRegistration($user));
+
+ $promo = XDB::fetchColumn('SELECT promo
+ FROM watch_promo
+ WHERE uid = {?}
+ ORDER BY promo', S::i('uid'));
+ $page->assign('promo_count', count($promo));
+ $ranges = array();
+ $range_start = null;
+ $range_end = null;
+ foreach ($promo as $p) {
+ if (is_null($range_start)) {
+ $range_start = $range_end = $p;
+ } else if ($p != $range_end + 1) {
+ $ranges[] = array($range_start, $range_end);
+ $range_start = $range_end = $p;
+ } else {
+ $range_end = $p;
+ }
+ }
+ $ranges[] = array($range_start, $range_end);
+ $page->assign('promo_ranges', $ranges);
+ $page->assign('nonins', $nonins->getUsers());
+
+ list($flags, $actions) = XDB::fetchOneRow('SELECT flags, actions
+ FROM watch
+ WHERE uid = {?}', S::i('uid'));
+ $flags = new PlFlagSet($flags);
+ $actions = new PlFlagSet($actions);
+ $page->assign('flags', $flags);
+ $page->assign('actions', $actions);
+ }
+
+ function handler_contacts(&$page, $action = null, $subaction = null, $ssaction = null)
+ {
+ $page->setTitle('Mes contacts');
+ $this->_add_rss_link($page);
+
+ $uid = S::i('uid');
+ $user = S::user();
+
+ // For XSRF protection, checks both the normal xsrf token, and the special RSS token.
+ // It allows direct linking to contact adding in the RSS feed.
+ if (Env::v('action') && Env::v('token') !== S::v('token')) {
+ S::assert_xsrf_token();
+ }
+ switch (Env::v('action')) {
+ case 'retirer':
+ if (($contact = User::get(Env::v('user')))) {
+ if (XDB::execute("DELETE FROM contacts
+ WHERE uid = {?} AND contact = {?}",
+ $uid, $contact->id())) {
+ Platal::session()->updateNbNotifs();
+ $page->trigSuccess("Contact retiré !");