- if ($password) { # may not have a password for OpenID users
- $user->password = common_munge_password($password, $id);
- }
-
- # Users who respond to invite email have proven their ownership of that address
-
- if ($code) {
- $invite = Invitation::staticGet($code);
- if ($invite && $invite->address && $invite->address_type == 'email' && $invite->address == $email) {
- $user->email = $invite->address;
- }
- }
-
- $inboxes = common_config('inboxes', 'enabled');
-
- if ($inboxes === true || $inboxes == 'transitional') {
- $user->inboxed = 1;
- }
-
- $user->created = common_sql_now();
- $user->uri = common_user_uri($user);
-
- $result = $user->insert();
-
- if (!$result) {
- common_log_db_error($user, 'INSERT', __FILE__);
- return FALSE;
- }
-
- # Everyone is subscribed to themself
-
- $subscription = new Subscription();
- $subscription->subscriber = $user->id;
- $subscription->subscribed = $user->id;
- $subscription->created = $user->created;
-
- $result = $subscription->insert();
-
- if (!$result) {
- common_log_db_error($subscription, 'INSERT', __FILE__);
- return FALSE;
- }
-
- if ($email && !$user->email) {
-
- $confirm = new Confirm_address();
- $confirm->code = common_confirmation_code(128);
- $confirm->user_id = $user->id;
- $confirm->address = $email;
- $confirm->address_type = 'email';
-
- $result = $confirm->insert();
- if (!$result) {
- common_log_db_error($confirm, 'INSERT', __FILE__);
- return FALSE;
- }
- }
-
- if ($code && $user->email) {
- $user->emailChanged();
- }
-
- $profile->query('COMMIT');
-
- if ($email && !$user->email) {
- mail_confirm_address($confirm->code,
- $profile->nickname,
- $email);
- }
-
- return $user;
- }
-
- # Things we do when the email changes
-
- function emailChanged() {
-
- $invites = new Invitation();
- $invites->address = $this->email;
- $invites->address_type = 'email';
-
- if ($invites->find()) {
- while ($invites->fetch()) {
- $other = User::staticGet($invites->user_id);
- subs_subscribe_to($other, $this);
- }
- }
- }
-
- function hasFave($notice) {
- $cache = common_memcache();
-
- # XXX: Kind of a hack.
-
- if ($cache) {
- # This is the stream of favorite notices, in rev chron
- # order. This forces it into cache.
- $faves = $this->favoriteNotices(0, NOTICE_CACHE_WINDOW);
- $cnt = 0;
-
- while ($faves->fetch()) {
- if ($faves->id < $notice->id) {
- # If we passed it, it's not a fave
- return false;
- } else if ($faves->id == $notice->id) {
- # If it matches a cached notice, then it's a fave
- return true;
- }
- $cnt++;
- }
- # If we're not past the end of the cache window,
- # then the cache has all available faves, so this one
- # is not a fave.
- if ($cnt < NOTICE_CACHE_WINDOW) {
- return false;
- }
- # Otherwise, cache doesn't have all faves;
- # fall through to the default
- }
-
- $fave = Fave::pkeyGet(array('user_id' => $this->id,
- 'notice_id' => $notice->id));
- return ((is_null($fave)) ? false : true);
- }
-
- function mutuallySubscribed($other) {
- return $this->isSubscribed($other) &&
- $other->isSubscribed($this);
- }
-
- function mutuallySubscribedUsers() {
-
- # 3-way join; probably should get cached
-
- $qry = 'SELECT user.* ' .
- 'FROM subscription sub1 JOIN user ON sub1.subscribed = user.id ' .
- 'JOIN subscription sub2 ON user.id = sub2.subscriber ' .
- 'WHERE sub1.subscriber = %d and sub2.subscribed = %d ' .
- 'ORDER BY user.nickname';
-
- $user = new User();
- $user->query(sprintf($qry, $this->id, $this->id));
-
- return $user;
- }
-
- function getReplies($offset=0, $limit=NOTICES_PER_PAGE, $since_id=0, $before_id=0) {
- $qry =
- 'SELECT notice.* ' .
- 'FROM notice JOIN reply ON notice.id = reply.notice_id ' .
- 'WHERE reply.profile_id = %d ';
-
- return Notice::getStream(sprintf($qry, $this->id),
- 'user:replies:'.$this->id,
- $offset, $limit, $since_id, $before_id);
- }
-
- function getNotices($offset=0, $limit=NOTICES_PER_PAGE, $since_id=0, $before_id=0) {
- $qry =
- 'SELECT * ' .
- 'FROM notice ' .
- 'WHERE profile_id = %d ';
-
- return Notice::getStream(sprintf($qry, $this->id),
- 'user:notices:'.$this->id,
- $offset, $limit, $since_id, $before_id);
- }
-
- function favoriteNotices($offset=0, $limit=NOTICES_PER_PAGE) {
- $qry =
- 'SELECT notice.* ' .
- 'FROM notice JOIN fave ON notice.id = fave.notice_id ' .
- 'WHERE fave.user_id = %d ';
-
- return Notice::getStream(sprintf($qry, $this->id),
- 'user:faves:'.$this->id,
- $offset, $limit);
- }
-
- function noticesWithFriends($offset=0, $limit=NOTICES_PER_PAGE, $since_id=0, $before_id=0) {
- $enabled = common_config('inboxes', 'enabled');
-
- # Complicated code, depending on whether we support inboxes yet
- # XXX: make this go away when inboxes become mandatory
-
- if ($enabled === false ||
- ($enabled == 'transitional' && $this->inboxed == 0)) {
- $qry =
- 'SELECT notice.* ' .
- 'FROM notice JOIN subscription ON notice.profile_id = subscription.subscribed ' .
- 'WHERE subscription.subscriber = %d ';
- $order = NULL;
- } else if ($enabled === true ||
- ($enabled == 'transitional' && $this->inboxed == 1)) {
- $qry =
- 'SELECT notice.* ' .
- 'FROM notice JOIN notice_inbox ON notice.id = notice_inbox.notice_id ' .
- 'WHERE notice_inbox.user_id = %d ';
- # NOTE: we override ORDER
- $order = 'ORDER BY notice_inbox.created DESC, notice_inbox.notice_id DESC ';
- }
-
- return Notice::getStream(sprintf($qry, $this->id),
- 'user:notices_with_friends:' . $this->id,
- $offset, $limit, $since_id, $before_id,
- $order);
- }
-
- function blowFavesCache() {
- $cache = common_memcache();
- if ($cache) {
- # Faves don't happen chronologically, so we need to blow
- # ;last cache, too
- $cache->delete(common_cache_key('user:faves:'.$this->id));
- $cache->delete(common_cache_key('user:faves:'.$this->id).';last');
- }
- }
-
- function getSelfTags() {
- return Profile_tag::getTags($this->id, $this->id);
- }
-
- function setSelfTags($newtags) {
- return Profile_tag::setTags($this->id, $this->id, $newtags);
- }
-
- function block($other) {