X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=classes%2FUser.php;h=e3fa93395e322f7ad7f68ff0fa1a6f43f4f02c41;hb=15c1d4f5e4947b9c60439ab5a17694ad57d06704;hp=4f46653e4383afdfbb7bead0751a9df902122ea9;hpb=81e6d50c533964899308e5745745381c340a1764;p=quix0rs-gnu-social.git diff --git a/classes/User.php b/classes/User.php index 4f46653e43..e3fa93395e 100644 --- a/classes/User.php +++ b/classes/User.php @@ -18,13 +18,14 @@ */ if (!defined('LACONICA')) { exit(1); } + /** * Table Definition for user */ -require_once 'DB/DataObject.php'; +require_once INSTALLDIR.'/classes/Memcached_DataObject.php'; require_once 'Validate.php'; -class User extends DB_DataObject +class User extends Memcached_DataObject { ###START_AUTOCODE /* the code below is auto generated do not remove the above tag */ @@ -36,10 +37,16 @@ class User extends DB_DataObject public $email; // varchar(255) unique_key public $incomingemail; // varchar(255) unique_key public $emailnotifysub; // tinyint(1) default_1 + public $emailnotifyfav; // tinyint(1) default_1 + public $emailnotifymsg; // tinyint(1) default_1 + public $emailmicroid; // tinyint(1) default_1 + public $language; // varchar(50) + public $timezone; // varchar(50) public $emailpost; // tinyint(1) default_1 public $jabber; // varchar(255) unique_key public $jabbernotify; // tinyint(1) public $jabberreplies; // tinyint(1) + public $jabbermicroid; // tinyint(1) default_1 public $updatefrompresence; // tinyint(1) public $sms; // varchar(64) unique_key public $carrier; // int(4) @@ -48,38 +55,33 @@ class User extends DB_DataObject public $smsemail; // varchar(255) public $uri; // varchar(255) unique_key public $autosubscribe; // tinyint(1) + public $urlshorteningservice; // varchar(50) public $created; // datetime() not_null public $modified; // timestamp() not_null default_CURRENT_TIMESTAMP /* Static get */ - function staticGet($k,$v=NULL) { return DB_DataObject::staticGet('User',$k,$v); } + function staticGet($k,$v=NULL) { return Memcached_DataObject::staticGet('User',$k,$v); } /* the code above is auto generated do not remove the tag below */ ###END_AUTOCODE function getProfile() { - $profile = DB_DataObject::factory('profile'); - $profile->id = $this->id; - if ($profile->find()) { - $profile->fetch(); - return $profile; - } - return NULL; + return Profile::staticGet('id', $this->id); } function isSubscribed($other) { assert(!is_null($other)); - $sub = DB_DataObject::factory('subscription'); - $sub->subscriber = $this->id; - $sub->subscribed = $other->id; - return $sub->find(); + # XXX: cache results of this query + $sub = Subscription::pkeyGet(array('subscriber' => $this->id, + 'subscribed' => $other->id)); + return (is_null($sub)) ? false : true; } # 'update' won't write key columns, so we have to do it ourselves. function updateKeys(&$orig) { $parts = array(); - foreach (array('nickname', 'email', 'jabber', 'incomingemail', 'sms', 'carrier', 'smsemail') as $k) { + foreach (array('nickname', 'email', 'jabber', 'incomingemail', 'sms', 'carrier', 'smsemail', 'language', 'timezone') as $k) { if (strcmp($this->$k, $orig->$k) != 0) { $parts[] = $k . ' = ' . $this->_quote($this->$k); } @@ -89,16 +91,27 @@ class User extends DB_DataObject return true; } $toupdate = implode(', ', $parts); - $qry = 'UPDATE ' . $this->tableName() . ' SET ' . $toupdate . + + $table = $this->tableName(); + if(common_config('db','quote_identifiers')) { + $table = '"' . $table . '"'; + } + $qry = 'UPDATE ' . $table . ' SET ' . $toupdate . ' WHERE id = ' . $this->id; - return $this->query($qry); + $orig->decache(); + $result = $this->query($qry); + if ($result) { + $this->encache(); + } + return $result; } function allowed_nickname($nickname) { # XXX: should already be validated for size, content, etc. static $blacklist = array('rss', 'xrds', 'doc', 'main', 'settings', 'notice', 'user', - 'search', 'avatar'); + 'search', 'avatar', 'tag', 'tags', + 'api', 'message'); $merged = array_merge($blacklist, common_config('nickname', 'blacklist')); return !in_array($nickname, $merged); } @@ -110,35 +123,226 @@ class User extends DB_DataObject } return $profile->getCurrentNotice($dt); } - + function getCarrier() { - return Sms_carrier::staticGet($this->carrier); + return Sms_carrier::staticGet('id', $this->carrier); } - + function subscribeTo($other) { $sub = new Subscription(); $sub->subscriber = $this->id; $sub->subscribed = $other->id; - $sub->created = DB_DataObject_Cast::dateTime(); # current time + $sub->created = common_sql_now(); # current time if (!$sub->insert()) { return false; } - + return true; } - function noticesWithFriends($offset=0, $limit=20) { + static function register($fields) { + + # MAGICALLY put fields into current scope + + extract($fields); + + $profile = new Profile(); + + $profile->query('BEGIN'); + + $profile->nickname = $nickname; + $profile->profileurl = common_profile_url($nickname); + + if ($fullname) { + $profile->fullname = $fullname; + } + if ($homepage) { + $profile->homepage = $homepage; + } + if ($bio) { + $profile->bio = $bio; + } + if ($location) { + $profile->location = $location; + } + + $profile->created = common_sql_now(); + + $id = $profile->insert(); + + if (!$id) { + common_log_db_error($profile, 'INSERT', __FILE__); + return FALSE; + } + + $user = new User(); + + $user->id = $id; + $user->nickname = $nickname; + + 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; + } + } + + $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) { + $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 - $notice = new Notice(); + $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'; - $notice->query('SELECT notice.* ' . - 'FROM notice JOIN subscription on notice.profile_id = subscription.subscribed' . - 'WHERE subscription.subscriber = ' . $this->id . - 'ORDER BY created DESC, notice.id DESC ' . - 'LIMIT ' . $offset . ', ' . $limit); + $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; + 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) { + $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 + + return Notice::getStream(sprintf($qry, $this->id), + 'user:notices_with_friends:' . $this->id, + $offset, $limit, $since_id, $before_id, + 'ORDER BY notice_inbox.created DESC, notice_inbox.notice_id DESC '); + } + + function blowFavesCache() { + $cache = common_memcache(); + if ($cache) { + $cache->delete(common_cache_key('user:faves:'.$this->id)); + } } }