*/
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 */
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 $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.
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);
}
}
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) {
-
- $notice = new Notice();
-
- $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);
-
- return $notice;
- }
-
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 ($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);
$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) {
+
+ if ($email && !$user->email) {
$confirm = new Confirm_address();
$confirm->code = common_confirmation_code(128);
}
}
+ if ($code && $user->email) {
+ $user->emailChanged();
+ }
+
$profile->query('COMMIT');
- if ($email) {
+ 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
+
+ $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) {
+ $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));
+ }
+ }
}