]> git.mxchange.org Git - quix0rs-gnu-social.git/blobdiff - classes/Profile.php
Qvitter API changes (thanks hannes2peer)
[quix0rs-gnu-social.git] / classes / Profile.php
index cefcaf90b5b6a31823163bf27cfd50c8dd873ff6..e1bba076e9e31d0d9020b8d757537395e2afd5c1 100644 (file)
@@ -44,11 +44,6 @@ class Profile extends Managed_DataObject
     public $created;                         // datetime()   not_null
     public $modified;                        // timestamp()   not_null default_CURRENT_TIMESTAMP
 
-    /* Static get */
-    function staticGet($k,$v=NULL) {
-        return Memcached_DataObject::staticGet('Profile',$k,$v);
-    }
-
     public static function schemaDef()
     {
         $def = array(
@@ -83,94 +78,52 @@ class Profile extends Managed_DataObject
 
         return $def;
     }
-
-       function multiGet($keyCol, $keyVals, $skipNulls=true)
-       {
-           return parent::multiGet('Profile', $keyCol, $keyVals, $skipNulls);
-       }
        
     /* the code above is auto generated do not remove the tag below */
     ###END_AUTOCODE
 
-    protected $_user = -1;  // Uninitialized value distinct from null
-
-    function getUser()
+    public static function getByEmail($email)
     {
-        if (is_int($this->_user) && $this->_user == -1) {
-            $this->_user = User::staticGet('id', $this->id);
+        // in the future, profiles should have emails stored...
+        $user = User::getKV('email', $email);
+        if (!($user instanceof User)) {
+            throw new NoSuchUserException(array('email'=>$email));
         }
+        return $user->getProfile();
+    } 
 
-        return $this->_user;
-    }
-
-    protected $_avatars;
+    protected $_user = -1;  // Uninitialized value distinct from null
 
-    function getAvatar($width, $height=null)
+    public function getUser()
     {
-        if (is_null($height)) {
-            $height = $width;
+        if ($this->_user === -1) {
+            $this->_user = User::getKV('id', $this->id);
         }
-
-        $avatar = $this->_getAvatar($width);
-
-        if (empty($avatar)) {
-
-            if (Event::handle('StartProfileGetAvatar', array($this, $width, &$avatar))) {
-                $avatar = Avatar::pkeyGet(
-                    array(
-                        'profile_id' => $this->id,
-                        'width'      => $width,
-                        'height'     => $height
-                    )
-                );
-                Event::handle('EndProfileGetAvatar', array($this, $width, &$avatar));
-            }
-
-            $this->_fillAvatar($width, $avatar);
+        if (!($this->_user instanceof User)) {
+            throw new NoSuchUserException(array('id'=>$this->id));
         }
 
-        return $avatar;
+        return $this->_user;
     }
 
-    // XXX: @Fix me gargargar
-    function _getAvatar($width)
+    public function isLocal()
     {
-        if (empty($this->_avatars)) {
-            $this->_avatars = array();
-        }
-
-        // GAR! I cannot figure out where _avatars gets pre-filled with the avatar from
-        // the previously used profile! Please shoot me now! --Zach
-        if (array_key_exists($width, $this->_avatars)) {
-            // Don't return cached avatar unless it's really for this profile
-            if ($this->_avatars[$width]->profile_id == $this->id) {
-                return $this->_avatars[$width];
-            }
+        try {
+            $this->getUser();
+        } catch (NoSuchUserException $e) {
+            return false;
         }
-
-        return null;
+        return true;
     }
 
-    function _fillAvatar($width, $avatar)
-    {
-      //common_debug("Storing avatar of width: {$avatar->width} and profile_id {$avatar->profile_id} in profile {$this->id}.");
-        $this->_avatars[$width] = $avatar;
-
-    }
+    protected $_avatars = array();
 
-    function getOriginalAvatar()
+    public function getAvatar($width, $height=null)
     {
-        $avatar = DB_DataObject::factory('avatar');
-        $avatar->profile_id = $this->id;
-        $avatar->original = true;
-        if ($avatar->find(true)) {
-            return $avatar;
-        } else {
-            return null;
-        }
+        return Avatar::byProfile($this, $width, $height);
     }
 
-    function setOriginal($filename)
+    public function setOriginal($filename)
     {
         $imagefile = new ImageFile($this->id, Avatar::path($filename));
 
@@ -185,8 +138,8 @@ class Profile extends Managed_DataObject
         $avatar->created = DB_DataObject_Cast::dateTime(); # current time
 
         // XXX: start a transaction here
-
-        if (!$this->delete_avatars() || !$avatar->insert()) {
+        if (!Avatar::deleteFromProfile($this, true) || !$avatar->insert()) {
+            // If we can't delete the old avatars, let's abort right here.
             @unlink(Avatar::path($filename));
             return null;
         }
@@ -194,21 +147,10 @@ class Profile extends Managed_DataObject
         foreach (array(AVATAR_PROFILE_SIZE, AVATAR_STREAM_SIZE, AVATAR_MINI_SIZE) as $size) {
             // We don't do a scaled one if original is our scaled size
             if (!($avatar->width == $size && $avatar->height == $size)) {
-                $scaled_filename = $imagefile->resize($size);
-
-                //$scaled = DB_DataObject::factory('avatar');
-                $scaled = new Avatar();
-                $scaled->profile_id = $this->id;
-                $scaled->width = $size;
-                $scaled->height = $size;
-                $scaled->original = false;
-                $scaled->mediatype = image_type_to_mime_type($imagefile->type);
-                $scaled->filename = $scaled_filename;
-                $scaled->url = Avatar::url($scaled_filename);
-                $scaled->created = DB_DataObject_Cast::dateTime(); # current time
-
-                if (!$scaled->insert()) {
-                    return null;
+                try {
+                    Avatar::newSize($this, $size);
+                } catch (Exception $e) {
+                    // should we abort the generation and live without smaller avatars?
                 }
             }
         }
@@ -216,30 +158,6 @@ class Profile extends Managed_DataObject
         return $avatar;
     }
 
-    /**
-     * Delete attached avatars for this user from the database and filesystem.
-     * This should be used instead of a batch delete() to ensure that files
-     * get removed correctly.
-     *
-     * @param boolean $original true to delete only the original-size file
-     * @return <type>
-     */
-    function delete_avatars($original=true)
-    {
-        $avatar = new Avatar();
-        $avatar->profile_id = $this->id;
-        $avatar->find();
-        while ($avatar->fetch()) {
-            if ($avatar->original) {
-                if ($original == false) {
-                    continue;
-                }
-            }
-            $avatar->delete();
-        }
-        return true;
-    }
-
     /**
      * Gets either the full name (if filled) or the nickname.
      *
@@ -293,9 +211,9 @@ class Profile extends Managed_DataObject
         return $stream->getNotices($offset, $limit, $since_id, $max_id);
     }
 
-    function getNotices($offset=0, $limit=NOTICES_PER_PAGE, $since_id=0, $max_id=0)
+    function getNotices($offset=0, $limit=NOTICES_PER_PAGE, $since_id=0, $max_id=0, Profile $scoped=null)
     {
-        $stream = new ProfileNoticeStream($this);
+        $stream = new ProfileNoticeStream($this, $scoped);
 
         return $stream->getNotices($offset, $limit, $since_id, $max_id);
     }
@@ -445,7 +363,7 @@ class Profile extends Managed_DataObject
         $lists = array();
 
         foreach ($ids as $id) {
-            $list = Profile_list::staticGet('id', $id);
+            $list = Profile_list::getKV('id', $id);
             if (!empty($list) &&
                 ($showPrivate || !$list->private)) {
 
@@ -554,7 +472,7 @@ class Profile extends Managed_DataObject
         $lists = new Profile_list();
         $subs = new Profile_tag_subscription();
 
-        $lists->joinAdd('id', 'profile_tag_subscription:profile_tag_id');
+        $lists->joinAdd(array('id', 'profile_tag_subscription:profile_tag_id'));
 
         #@fixme: postgres (round(date_part('epoch', my_date)))
         $lists->selectAdd('unix_timestamp(profile_tag_subscription.created) as "cursor"');
@@ -595,6 +513,8 @@ class Profile extends Managed_DataObject
             if (Event::handle('StartJoinGroup', array($group, $this))) {
                 $join = Group_member::join($group->id, $this->id);
                 self::blow('profile:groups:%d', $this->id);
+                self::blow('group:member_ids:%d', $group->id);
+                self::blow('group:member_count:%d', $group->id);
                 Event::handle('EndJoinGroup', array($group, $this));
             }
         }
@@ -615,54 +535,29 @@ class Profile extends Managed_DataObject
         if (Event::handle('StartLeaveGroup', array($group, $this))) {
             Group_member::leave($group->id, $this->id);
             self::blow('profile:groups:%d', $this->id);
+            self::blow('group:member_ids:%d', $group->id);
+            self::blow('group:member_count:%d', $group->id);
             Event::handle('EndLeaveGroup', array($group, $this));
         }
     }
 
     function avatarUrl($size=AVATAR_PROFILE_SIZE)
     {
-        $avatar = $this->getAvatar($size);
-        if ($avatar) {
-            return $avatar->displayUrl();
-        } else {
-            return Avatar::defaultImage($size);
-        }
+        return Avatar::urlByProfile($this, $size);
     }
 
-    function getSubscriptions($offset=0, $limit=null)
+    function getSubscribed($offset=0, $limit=null)
     {
-        $subs = Subscription::bySubscriber($this->id,
-                                           $offset,
-                                           $limit);
-
-        $profiles = array();
-
-        while ($subs->fetch()) {
-            $profile = Profile::staticGet($subs->subscribed);
-            if ($profile) {
-                $profiles[] = $profile;
-            }
-        }
-
-        return new ArrayWrapper($profiles);
+        $subs = Subscription::getSubscribedIDs($this->id, $offset, $limit);
+        $profiles = Profile::listFind('id', $subs);
+        return $profiles;
     }
 
     function getSubscribers($offset=0, $limit=null)
     {
-        $subs = Subscription::bySubscribed($this->id,
-                                           $offset,
-                                           $limit);
-
-        $profiles = array();
-
-        while ($subs->fetch()) {
-            $profile = Profile::staticGet($subs->subscriber);
-            if ($profile) {
-                $profiles[] = $profile;
-            }
-        }
-
-        return new ArrayWrapper($profiles);
+        $subs = Subscription::getSubscriberIDs($this->id, $offset, $limit);
+        $profiles = Profile::listFind('id', $subs);
+        return $profiles;
     }
 
     function getTaggedSubscribers($tag)
@@ -682,7 +577,7 @@ class Profile extends Managed_DataObject
         $profile = new Profile();
         $tagged = array();
 
-        $cnt = $profile->query(sprintf($qry, $this->id, $this->id, $tag));
+        $cnt = $profile->query(sprintf($qry, $this->id, $this->id, $profile->escape($tag)));
 
         while ($profile->fetch()) {
             $tagged[] = clone($profile);
@@ -920,7 +815,7 @@ class Profile extends Managed_DataObject
         $this->_deleteMessages();
         $this->_deleteTags();
         $this->_deleteBlocks();
-        $this->delete_avatars();
+        Avatar::deleteFromProfile($this, true);
 
         // Warning: delete() will run on the batch objects,
         // not on individual objects.
@@ -959,7 +854,7 @@ class Profile extends Managed_DataObject
         $sub->find();
 
         while ($sub->fetch()) {
-            $other = Profile::staticGet('id', $sub->subscribed);
+            $other = Profile::getKV('id', $sub->subscribed);
             if (empty($other)) {
                 continue;
             }
@@ -974,7 +869,7 @@ class Profile extends Managed_DataObject
         $subd->find();
 
         while ($subd->fetch()) {
-            $other = Profile::staticGet('id', $subd->subscriber);
+            $other = Profile::getKV('id', $subd->subscriber);
             if (empty($other)) {
                 continue;
             }
@@ -1023,7 +918,7 @@ class Profile extends Managed_DataObject
 
     // XXX: identical to Notice::getLocation.
 
-    function getLocation()
+    public function getLocation()
     {
         $location = null;
 
@@ -1046,6 +941,29 @@ class Profile extends Managed_DataObject
         return $location;
     }
 
+    public function shareLocation()
+    {
+        $cfg = common_config('location', 'share');
+
+        if ($cfg == 'always') {
+            return true;
+        } else if ($cfg == 'never') {
+            return false;
+        } else { // user
+            $share = common_config('location', 'sharedefault');
+
+            // Check if user has a personal setting for this
+            $prefs = User_location_prefs::getKV('user_id', $this->id);
+
+            if (!empty($prefs)) {
+                $share = $prefs->share_location;
+                $prefs->free();
+            }
+
+            return $share;
+        }
+    }
+
     function hasRole($name)
     {
         $has_role = false;
@@ -1239,13 +1157,13 @@ class Profile extends Managed_DataObject
         return $result;
     }
 
-    function hasRepeated($notice_id)
+    // FIXME: Can't put Notice typing here due to ArrayWrapper
+    public function hasRepeated($notice)
     {
         // XXX: not really a pkey, but should work
 
-        $notice = Memcached_DataObject::pkeyGet('Notice',
-                                                array('profile_id' => $this->id,
-                                                      'repeat_of' => $notice_id));
+        $notice = Notice::pkeyGet(array('profile_id' => $this->id,
+                                        'repeat_of' => $notice->id));
 
         return !empty($notice);
     }
@@ -1333,12 +1251,26 @@ class Profile extends Managed_DataObject
         return $noun->asString('activity:' . $element);
     }
 
+    /**
+     * Returns the profile's canonical url, not necessarily a uri/unique id
+     *
+     * @return string $profileurl
+     */
+    public function getUrl()
+    {
+        if (empty($this->profileurl) ||
+                !filter_var($this->profileurl, FILTER_VALIDATE_URL)) {
+            throw new InvalidUrlException($this->profileurl);
+        }
+        return $this->profileurl;
+    }
+
     /**
      * Returns the best URI for a profile. Plugins may override.
      *
      * @return string $uri
      */
-    function getUri()
+    public function getUri()
     {
         $uri = null;
 
@@ -1346,7 +1278,7 @@ class Profile extends Managed_DataObject
         if (Event::handle('StartGetProfileUri', array($this, &$uri))) {
 
             // check for a local user first
-            $user = User::staticGet('id', $this->id);
+            $user = User::getKV('id', $this->id);
 
             if (!empty($user)) {
                 $uri = $user->uri;
@@ -1360,15 +1292,8 @@ class Profile extends Managed_DataObject
 
     function hasBlocked($other)
     {
-        $block = Profile_block::get($this->id, $other->id);
-
-        if (empty($block)) {
-            $result = false;
-        } else {
-            $result = true;
-        }
-
-        return $result;
+        $block = Profile_block::exists($this, $other);
+        return !empty($block);
     }
 
     function getAtomFeed()
@@ -1376,7 +1301,7 @@ class Profile extends Managed_DataObject
         $feed = null;
 
         if (Event::handle('StartProfileGetAtomFeed', array($this, &$feed))) {
-            $user = User::staticGet('id', $this->id);
+            $user = User::getKV('id', $this->id);
             if (!empty($user)) {
                 $feed = common_local_url('ApiTimelineUser', array('id' => $user->id,
                                                                   'format' => 'atom'));
@@ -1393,7 +1318,7 @@ class Profile extends Managed_DataObject
 
         if (Event::handle('StartGetProfileFromURI', array($uri, &$profile))) {
             // Get a local user or remote (OMB 0.1) profile
-            $user = User::staticGet('uri', $uri);
+            $user = User::getKV('uri', $uri);
             if (!empty($user)) {
                 $profile = $user->getProfile();
             }
@@ -1470,34 +1395,9 @@ class Profile extends Managed_DataObject
         $skip = array('_user', '_avatars');
         return array_diff($vars, $skip);
     }
-    
-    static function fillAvatars(&$profiles, $width)
-    {
-       $ids = array();
-       foreach ($profiles as $profile) {
-            if (!empty($profile)) {
-                $ids[] = $profile->id;
-            }
-       }
-       
-       $avatars = Avatar::pivotGet('profile_id', $ids, array('width' => $width,
-                                                                                                                         'height' => $width));
-       
-       foreach ($profiles as $profile) {
-            if (!empty($profile)) { // ???
-                $profile->_fillAvatar($width, $avatars[$profile->id]);
-            }
-       }
-    }
-    
-    // Can't seem to find how to fix this.
 
-    function getProfile()
+    public function getProfile()
     {
         return $this;
     }
-
-    static function pivotGet($key, $values, $otherCols=array()) {
-        return Memcached_DataObject::pivotGet('Profile', $key, $values, $otherCols);
-    }
 }