]> git.mxchange.org Git - quix0rs-gnu-social.git/commitdiff
low-level management of blocks
authorEvan Prodromou <evan@controlyourself.ca>
Mon, 8 Dec 2008 03:10:08 +0000 (22:10 -0500)
committerEvan Prodromou <evan@controlyourself.ca>
Mon, 8 Dec 2008 03:10:08 +0000 (22:10 -0500)
darcs-hash:20081208031008-5ed1f-c96006b5c05fa0e68f9adaacd0518016aedfee2a.gz

classes/Profile_block.php
classes/User.php
lib/subs.php

index f8067017654c8c849df0fab0c3e8354023c4bc13..d6a3e7288ab592116b7fa2b03557e751bd4e2c1d 100644 (file)
@@ -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));
+    }
 }
index 920b306670ac166549903b3155977bc2f84f3824..10c6d6b2476dc936e004577f36e367b81b86ab7a 100644 (file)
@@ -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);
        }
index 51ae54059f8dda989a8e6ceeffc14b1900760390..91fc8445d7c34bc4a130819c5986f9ffd49a3350 100644 (file)
@@ -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;
 }