+ if (!is_null($type)) {
+ if (empty($where)) {
+ $where = XDB::format('WHERE v.type = {?}', $type);
+ } else {
+ $where .= XDB::format(' AND v.type = {?}', $type);
+ }
+ }
+ if ($sub_state) {
+ return XDB::fetchAllAssoc('alias', 'SELECT v.alias, vr.redirect IS NOT NULL AS sub
+ FROM virtual AS v
+ LEFT JOIN virtual_redirect AS vr ON (v.vid = vr.vid AND ' . $join . ')
+ ' . $where);
+ } else {
+ return XDB::fetchColumn('SELECT v.alias
+ FROM virtual AS v
+ INNER JOIN virtual_redirect AS vr ON (v.vid = vr.vid AND ' . $join . ')
+ ' . $where);
+ }
+ }
+
+ /** Get the alternative forlife email
+ * TODO: remove this uber-ugly hack. The issue is that you need to remove
+ * all @m4x.org addresses in virtual_redirect first.
+ * XXX: This is juste to make code more readable, to be remove as soon as possible
+ */
+ public function m4xForlifeEmail()
+ {
+ global $globals;
+ trigger_error('USING M4X FORLIFE', E_USER_NOTICE);
+ return $this->login() . '@' . $globals->mail->domain2;
+ }
+
+
+ /** Get marketing informations
+ */
+ private function fetchMarketingData()
+ {
+ if (isset($this->last_known_email)) {
+ return;
+ }
+ $infos = XDB::fetchOneAssoc('SELECT IF (MAX(m.last) > p.relance, MAX(m.last), p.relance) AS last_relance,
+ p.email AS last_known_email
+ FROM register_pending AS p
+ LEFT JOIN register_marketing AS m ON (p.uid = m.uid)
+ WHERE p.uid = {?}
+ GROUP BY p.uid', $this->id());
+ if (!$infos) {
+ $infos = array('last_relance' => null, 'last_known_email' => null);
+ }
+ $this->fillFromArray($infos);
+ }
+
+ public function lastMarketingRelance()
+ {
+ $this->fetchMarketingData();
+ return $this->last_relance;
+ }
+
+ public function lastKnownEmail()
+ {
+ $this->fetchMarketingData();
+ return $this->last_known_email;
+ }
+
+
+ /** Get watch informations
+ */
+ private function fetchWatchData()
+ {
+ if (isset($this->watch_actions)) {
+ return;
+ }
+ $watch = XDB::fetchOneAssoc('SELECT flags AS watch_flags, actions AS watch_actions,
+ UNIX_TIMESTAMP(last) AS watch_last
+ FROM watch
+ WHERE uid = {?}', $this->id());
+ $watch['watch_flags'] = new PlFlagSet($watch['watch_flags']);
+ $watch['watch_actions'] = new PlFlagSet($watch['watch_actions']);
+ $watch['watch_promos'] = XDB::fetchColumn('SELECT promo
+ FROM watch_promo
+ WHERE uid = {?}', $this->id());
+ $watch['watch_users'] = XDB::fetchColumn('SELECT ni_id
+ FROM watch_nonins
+ WHERE uid = {?}', $this->id());
+ $this->fillFromArray($watch);
+ }
+
+ public function watch($type)
+ {
+ $this->fetchWatchData();
+ return $this->watch_actions->hasFlag($type);
+ }
+
+ public function watchContacts()
+ {
+ $this->fetchWatchData();
+ return $this->watch_flags->hasFlag('contacts');
+ }
+
+ public function watchEmail()
+ {
+ $this->fetchWatchData();
+ return $this->watch_flags->hasFlag('mail');
+ }
+
+ public function watchPromos()
+ {
+ $this->fetchWatchData();
+ return $this->watch_promos;
+ }
+
+ public function watchUsers()
+ {
+ $this->fetchWatchData();
+ return $this->watch_users;
+ }
+
+ public function watchLast()
+ {
+ $this->fetchWatchData();
+ return $this->watch_last;
+ }
+
+
+ // Contacts
+ private $contacts = null;
+ public function isContact(PlUser &$user)
+ {
+ if (is_null($this->contacts)) {
+ $this->contacts = XDB::fetchAllAssoc('contact', 'SELECT *
+ FROM contacts
+ WHERE uid = {?}',
+ $this->id());
+ }
+ return isset($this->contacts[$user->id()]);
+ }
+
+ // Return permission flags for a given permission level.
+ public static function makePerms($perms, $is_admin)
+ {
+ $flags = new PlFlagSet($perms);