diff --git a/classes/Profile_block.php b/classes/Profile_block.php index f806701765..d6a3e7288a 100644 --- a/classes/Profile_block.php +++ b/classes/Profile_block.php @@ -4,7 +4,7 @@ */ require_once 'classes/Memcached_DataObject'; -class Profile_block extends Memcached_DataObject +class Profile_block extends Memcached_DataObject { ###START_AUTOCODE /* the code below is auto generated do not remove the above tag */ @@ -19,4 +19,9 @@ class Profile_block extends Memcached_DataObject /* the code above is auto generated do not remove the tag below */ ###END_AUTOCODE + + static function get($blocker, $blocked) { + return Profile_block::pkeyGet(array('blocker' => $blocker, + 'blocked' => $blocked)); + } } diff --git a/classes/User.php b/classes/User.php index 920b306670..10c6d6b247 100644 --- a/classes/User.php +++ b/classes/User.php @@ -25,7 +25,7 @@ if (!defined('LACONICA')) { exit(1); } require_once INSTALLDIR.'/classes/Memcached_DataObject.php'; require_once 'Validate.php'; -class User extends Memcached_DataObject +class User extends Memcached_DataObject { ###START_AUTOCODE /* the code below is auto generated do not remove the above tag */ @@ -33,7 +33,7 @@ class User extends Memcached_DataObject public $__table = 'user'; // table name public $id; // int(4) primary_key not_null public $nickname; // varchar(64) unique_key - public $password; // varchar(255) + public $password; // varchar(255) public $email; // varchar(255) unique_key public $incomingemail; // varchar(255) unique_key public $emailnotifysub; // tinyint(1) default_1 @@ -41,23 +41,23 @@ class User extends Memcached_DataObject public $emailnotifynudge; // 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 $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 $jabbernotify; // tinyint(1) + public $jabberreplies; // tinyint(1) public $jabbermicroid; // tinyint(1) default_1 - public $updatefrompresence; // tinyint(1) + public $updatefrompresence; // tinyint(1) public $sms; // varchar(64) unique_key - public $carrier; // int(4) - public $smsnotify; // tinyint(1) - public $smsreplies; // tinyint(1) - public $smsemail; // varchar(255) + public $carrier; // int(4) + public $smsnotify; // tinyint(1) + public $smsreplies; // tinyint(1) + public $smsemail; // varchar(255) public $uri; // varchar(255) unique_key - public $autosubscribe; // tinyint(1) + public $autosubscribe; // tinyint(1) public $urlshorteningservice; // varchar(50) default_ur1.ca - public $inboxed; // tinyint(1) + public $inboxed; // tinyint(1) public $created; // datetime() not_null public $modified; // timestamp() not_null default_CURRENT_TIMESTAMP @@ -144,6 +144,19 @@ class User extends Memcached_DataObject return true; } + function hasBlocked($other) { + $block = Profile_block::get($this->id, $other->id); + + if (is_null($block)) { + $result = false; + } else { + $result = true; + $block->free(); + } + + return $result; + } + static function register($fields) { # MAGICALLY put fields into current scope @@ -198,11 +211,11 @@ class User extends Memcached_DataObject } $inboxes = common_config('inboxes', 'enabled'); - + if ($inboxes === true || $inboxes == 'transitional') { $user->inboxed = 1; } - + $user->created = common_sql_now(); $user->uri = common_user_uri($user); @@ -277,13 +290,13 @@ class User extends Memcached_DataObject $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 @@ -303,27 +316,27 @@ class User extends Memcached_DataObject # 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)); @@ -335,39 +348,41 @@ class User extends Memcached_DataObject '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) { - $profile = $this->getProfile(); - if (!$profile) { - return NULL; - } else { - return $profile->getNotices($offset, $limit, $since_id, $before_id); - } + $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 || + + if ($enabled === false || ($enabled == 'transitional' && $this->inboxed == 0)) { $qry = 'SELECT notice.* ' . @@ -375,7 +390,7 @@ class User extends Memcached_DataObject 'WHERE subscription.subscriber = %d '; $order = NULL; } else if ($enabled === true || - ($enabled == 'transitional' && $this->inboxed == 1)) { + ($enabled == 'transitional' && $this->inboxed == 1)) { $qry = 'SELECT notice.* ' . 'FROM notice JOIN notice_inbox ON notice.id = notice_inbox.notice_id ' . @@ -383,13 +398,13 @@ class User extends Memcached_DataObject # 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) { @@ -399,11 +414,11 @@ class User extends Memcached_DataObject $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); } diff --git a/lib/subs.php b/lib/subs.php index 51ae54059f..91fc8445d7 100644 --- a/lib/subs.php +++ b/lib/subs.php @@ -25,7 +25,7 @@ require_once('XMPPHP/XMPP.php'); Returns true or an error message. */ -function subs_subscribe_user($user,$other_nickname) { +function subs_subscribe_user($user, $other_nickname) { $other = User::staticGet('nickname', $other_nickname); @@ -36,18 +36,27 @@ function subs_subscribe_user($user,$other_nickname) { return subs_subscribe_to($user, $other); } +/* Subscribe user $user to other user $other. + * Note: $other must be a local user, not a remote profile. + * Because the other way is quite a bit more complicated. + */ + function subs_subscribe_to($user, $other) { if ($user->isSubscribed($other)) { return _('Already subscribed!.'); } + if ($other->hasBlocked($user)) { + return _('User has blocked you.'); + } + if (!$user->subscribeTo($other)) { return _('Could not subscribe.'); return; } - subs_notify($other, $user); + subs_notify($other, $user); if (common_config('memcached', 'enabled')) { $cache = new Memcache(); @@ -55,8 +64,8 @@ function subs_subscribe_to($user, $other) { $cache->delete(common_cache_key('user:notices_with_friends:' . $user->id)); } } - - if ($other->autosubscribe && !$other->isSubscribed($user)) { + + if ($other->autosubscribe && !$other->isSubscribed($user) && !$user->hasBlocked($other)) { if (!$other->subscribeTo($user)) { return _('Could not subscribe other to you.'); } @@ -66,7 +75,7 @@ function subs_subscribe_to($user, $other) { $cache->delete(common_cache_key('user:notices_with_friends:' . $other->id)); } } - + subs_notify($user, $other); } @@ -87,6 +96,7 @@ function subs_notify_email($listenee, $listener) { /* Unsubscribe $user from nickname $other_nickname Returns true or an error message. */ + function subs_unsubscribe_user($user, $other_nickname) { $other = User::staticGet('nickname', $other_nickname); @@ -95,9 +105,12 @@ function subs_unsubscribe_user($user, $other_nickname) { return _('No such user.'); } - return subs_unsubscribe_to($user, $other); + return subs_unsubscribe_to($user, $other->getProfile()); } +/* Unsubscribe user $user from profile $other + * NB: other can be a remote user. */ + function subs_unsubscribe_to($user, $other) { if (!$user->isSubscribed($other)) @@ -121,7 +134,7 @@ function subs_unsubscribe_to($user, $other) { $cache->delete(common_cache_key('user:notices_with_friends:' . $user->id)); } } - + return true; }