]> git.mxchange.org Git - quix0rs-gnu-social.git/blobdiff - classes/Profile.php
Misses this file to merge. I like the comments.
[quix0rs-gnu-social.git] / classes / Profile.php
index e48092cd8382f06c00defe93fb39429ec97b5848..db8326f0f6959dbd090e39dda6ef7bfe1f77e60e 100644 (file)
@@ -22,8 +22,6 @@ if (!defined('STATUSNET') && !defined('LACONICA')) { exit(1); }
 /**
  * Table Definition for profile
  */
-require_once INSTALLDIR.'/classes/Memcached_DataObject.php';
-
 class Profile extends Managed_DataObject
 {
     ###START_AUTOCODE
@@ -32,11 +30,11 @@ class Profile extends Managed_DataObject
     public $__table = 'profile';                         // table name
     public $id;                              // int(4)  primary_key not_null
     public $nickname;                        // varchar(64)  multiple_key not_null
-    public $fullname;                        // varchar(255)  multiple_key
-    public $profileurl;                      // varchar(255)
-    public $homepage;                        // varchar(255)  multiple_key
+    public $fullname;                        // varchar(191)  multiple_key   not 255 because utf8mb4 takes more space
+    public $profileurl;                      // varchar(191)                 not 255 because utf8mb4 takes more space
+    public $homepage;                        // varchar(191)  multiple_key   not 255 because utf8mb4 takes more space
     public $bio;                             // text()  multiple_key
-    public $location;                        // varchar(255)  multiple_key
+    public $location;                        // varchar(191)  multiple_key   not 255 because utf8mb4 takes more space
     public $lat;                             // decimal(10,7)
     public $lon;                             // decimal(10,7)
     public $location_id;                     // int(4)
@@ -51,11 +49,11 @@ class Profile extends Managed_DataObject
             'fields' => array(
                 'id' => array('type' => 'serial', 'not null' => true, 'description' => 'unique identifier'),
                 'nickname' => array('type' => 'varchar', 'length' => 64, 'not null' => true, 'description' => 'nickname or username', 'collate' => 'utf8_general_ci'),
-                'fullname' => array('type' => 'varchar', 'length' => 255, 'description' => 'display name', 'collate' => 'utf8_general_ci'),
-                'profileurl' => array('type' => 'varchar', 'length' => 255, 'description' => 'URL, cached so we dont regenerate'),
-                'homepage' => array('type' => 'varchar', 'length' => 255, 'description' => 'identifying URL', 'collate' => 'utf8_general_ci'),
+                'fullname' => array('type' => 'varchar', 'length' => 191, 'description' => 'display name', 'collate' => 'utf8_general_ci'),
+                'profileurl' => array('type' => 'varchar', 'length' => 191, 'description' => 'URL, cached so we dont regenerate'),
+                'homepage' => array('type' => 'varchar', 'length' => 191, 'description' => 'identifying URL', 'collate' => 'utf8_general_ci'),
                 'bio' => array('type' => 'text', 'description' => 'descriptive biography', 'collate' => 'utf8_general_ci'),
-                'location' => array('type' => 'varchar', 'length' => 255, 'description' => 'physical location', 'collate' => 'utf8_general_ci'),
+                'location' => array('type' => 'varchar', 'length' => 191, 'description' => 'physical location', 'collate' => 'utf8_general_ci'),
                 'lat' => array('type' => 'numeric', 'precision' => 10, 'scale' => 7, 'description' => 'latitude'),
                 'lon' => array('type' => 'numeric', 'precision' => 10, 'scale' => 7, 'description' => 'longitude'),
                 'location_id' => array('type' => 'int', 'description' => 'location id if possible'),
@@ -92,32 +90,32 @@ class Profile extends Managed_DataObject
         return $user->getProfile();
     } 
 
-    protected $_user = -1;  // Uninitialized value distinct from null
+    protected $_user = array();
 
     public function getUser()
     {
-        if ($this->_user === -1) {
-            $this->_user = User::getKV('id', $this->id);
-        }
-        if (!$this->_user instanceof User) {
-            throw new NoSuchUserException(array('id'=>$this->id));
+        if (!isset($this->_user[$this->id])) {
+            $user = User::getKV('id', $this->id);
+            if (!$user instanceof User) {
+                throw new NoSuchUserException(array('id'=>$this->id));
+            }
+            $this->_user[$this->id] = $user;
         }
-
-        return $this->_user;
+        return $this->_user[$this->id];
     }
 
-    protected $_group = -1;
+    protected $_group = array();
 
     public function getGroup()
     {
-        if ($this->_group === -1) {
-            $this->_group = User_group::getKV('profile_id', $this->id);
-        }
-        if (!$this->_group instanceof User_group) {
-            throw new NoSuchGroupException(array('profile_id'=>$this->id));
+        if (!isset($this->_group[$this->id])) {
+            $group = User_group::getKV('profile_id', $this->id);
+            if (!$group instanceof User_group) {
+                throw new NoSuchGroupException(array('profile_id'=>$this->id));
+            }
+            $this->_group[$this->id] = $group;
         }
-
-        return $this->_group;
+        return $this->_group[$this->id];
     }
 
     public function isGroup()
@@ -140,7 +138,15 @@ class Profile extends Managed_DataObject
         return true;
     }
 
-    protected $_avatars = array();
+    public function getObjectType()
+    {
+        // FIXME: More types... like peopletags and whatever
+        if ($this->isGroup()) {
+            return ActivityObject::GROUP;
+        } else {
+            return ActivityObject::PERSON;
+        }
+    }
 
     public function getAvatar($width, $height=null)
     {
@@ -149,7 +155,12 @@ class Profile extends Managed_DataObject
 
     public function setOriginal($filename)
     {
-        $imagefile = new ImageFile($this->id, Avatar::path($filename));
+        if ($this->isGroup()) {
+            // Until Group avatars are handled just like profile avatars.
+            return $this->getGroup()->setOriginal($filename);
+        }
+
+        $imagefile = new ImageFile(null, Avatar::path($filename));
 
         $avatar = new Avatar();
         $avatar->profile_id = $this->id;
@@ -299,7 +310,7 @@ class Profile extends Managed_DataObject
         }
 
         try {
-            return User_group::listFind('id', $ids);
+            return User_group::multiGet('id', $ids);
         } catch (NoResultException $e) {
             return null;    // throw exception when we handle it everywhere
         }
@@ -587,7 +598,7 @@ class Profile extends Managed_DataObject
     {
         $subs = Subscription::getSubscribedIDs($this->id, $offset, $limit);
         try {
-            $profiles = Profile::listFind('id', $subs);
+            $profiles = Profile::multiGet('id', $subs);
         } catch (NoResultException $e) {
             return $e->obj;
         }
@@ -598,7 +609,7 @@ class Profile extends Managed_DataObject
     {
         $subs = Subscription::getSubscriberIDs($this->id, $offset, $limit);
         try {
-            $profiles = Profile::listFind('id', $subs);
+            $profiles = Profile::multiGet('id', $subs);
         } catch (NoResultException $e) {
             return $e->obj;
         }
@@ -762,39 +773,6 @@ class Profile extends Managed_DataObject
           $other->isSubscribed($this);
     }
 
-    function hasFave($notice)
-    {
-        $fave = Fave::pkeyGet(array('user_id' => $this->id,
-                                    'notice_id' => $notice->id));
-        return ((is_null($fave)) ? false : true);
-    }
-
-    function faveCount()
-    {
-        $c = Cache::instance();
-        if (!empty($c)) {
-            $cnt = $c->get(Cache::key('profile:fave_count:'.$this->id));
-            if (is_integer($cnt)) {
-                return (int) $cnt;
-            }
-        }
-
-        $faves = new Fave();
-        $faves->user_id = $this->id;
-        $cnt = (int) $faves->count('notice_id');
-
-        if (!empty($c)) {
-            $c->set(Cache::key('profile:fave_count:'.$this->id), $cnt);
-        }
-
-        return $cnt;
-    }
-
-    function favoriteNotices($own=false, $offset=0, $limit=NOTICES_PER_PAGE, $since_id=0, $max_id=0)
-    {
-        return Fave::stream($this->id, $offset, $limit, $own, $since_id, $max_id);
-    }
-
     function noticeCount()
     {
         $c = Cache::instance();
@@ -817,20 +795,6 @@ class Profile extends Managed_DataObject
         return $cnt;
     }
 
-    function blowFavesCache()
-    {
-        $cache = Cache::instance();
-        if ($cache) {
-            // Faves don't happen chronologically, so we need to blow
-            // ;last cache, too
-            $cache->delete(Cache::key('fave:ids_by_user:'.$this->id));
-            $cache->delete(Cache::key('fave:ids_by_user:'.$this->id.';last'));
-            $cache->delete(Cache::key('fave:ids_by_user_own:'.$this->id));
-            $cache->delete(Cache::key('fave:ids_by_user_own:'.$this->id.';last'));
-        }
-        $this->blowFaveCount();
-    }
-
     function blowSubscriberCount()
     {
         $c = Cache::instance();
@@ -847,14 +811,6 @@ class Profile extends Managed_DataObject
         }
     }
 
-    function blowFaveCount()
-    {
-        $c = Cache::instance();
-        if (!empty($c)) {
-            $c->delete(Cache::key('profile:fave_count:'.$this->id));
-        }
-    }
-
     function blowNoticeCount()
     {
         $c = Cache::instance();
@@ -887,12 +843,8 @@ class Profile extends Managed_DataObject
                 common_debug("Updating User ({$this->id}) nickname from {$dataObject->nickname} to {$this->nickname}");
                 $origuser = clone($local);
                 $local->nickname = $this->nickname;
-                $result = $local->updateKeys($origuser);
-                if ($result === false) {
-                    common_log_db_error($local, 'UPDATE', __FILE__);
-                    // TRANS: Server error thrown when user profile settings could not be updated.
-                    throw new ServerException(_('Could not update user nickname.'));
-                }
+                // updateWithKeys throws exception on failure.
+                $local->updateWithKeys($origuser);
 
                 // Clear the site owner, in case nickname changed
                 if ($local->hasRole(Profile_role::OWNER)) {
@@ -910,7 +862,6 @@ class Profile extends Managed_DataObject
     {
         $this->_deleteNotices();
         $this->_deleteSubscriptions();
-        $this->_deleteMessages();
         $this->_deleteTags();
         $this->_deleteBlocks();
         $this->_deleteAttentions();
@@ -986,17 +937,6 @@ class Profile extends Managed_DataObject
         $self->delete();
     }
 
-    function _deleteMessages()
-    {
-        $msg = new Message();
-        $msg->from_profile = $this->id;
-        $msg->delete();
-
-        $msg = new Message();
-        $msg->to_profile = $this->id;
-        $msg->delete();
-    }
-
     function _deleteTags()
     {
         $tag = new Profile_tag();
@@ -1315,20 +1255,20 @@ class Profile extends Managed_DataObject
      * Clients use some extra profile info in the atom stream.
      * This gives it to them.
      *
-     * @param User $cur Current user
+     * @param Profile $scoped The currently logged in/scoped profile
      *
      * @return array representation of <statusnet:profile_info> element or null
      */
 
-    function profileInfo($cur)
+    function profileInfo(Profile $scoped=null)
     {
         $profileInfoAttr = array('local_id' => $this->id);
 
-        if ($cur != null) {
+        if ($scoped instanceof Profile) {
             // Whether the current user is a subscribed to this profile
-            $profileInfoAttr['following'] = $cur->isSubscribed($this) ? 'true' : 'false';
+            $profileInfoAttr['following'] = $scoped->isSubscribed($this) ? 'true' : 'false';
             // Whether the current user is has blocked this profile
-            $profileInfoAttr['blocking']  = $cur->hasBlocked($this) ? 'true' : 'false';
+            $profileInfoAttr['blocking']  = $scoped->hasBlocked($this) ? 'true' : 'false';
         }
 
         return array('statusnet:profile_info', $profileInfoAttr, null);
@@ -1360,10 +1300,67 @@ class Profile extends Managed_DataObject
      */
     function asActivityNoun($element)
     {
-        $noun = ActivityObject::fromProfile($this);
+        $noun = $this->asActivityObject();
         return $noun->asString('activity:' . $element);
     }
 
+    public function asActivityObject()
+    {
+        $object = new ActivityObject();
+
+        if (Event::handle('StartActivityObjectFromProfile', array($this, &$object))) {
+            $object->type   = $this->getObjectType();
+            $object->id     = $this->getUri();
+            $object->title  = $this->getBestName();
+            $object->link   = $this->getUrl();
+            $object->summary = $this->getDescription();
+
+            try {
+                $avatar = Avatar::getUploaded($this);
+                $object->avatarLinks[] = AvatarLink::fromAvatar($avatar);
+            } catch (NoAvatarException $e) {
+                // Could not find an original avatar to link
+            }
+
+            $sizes = array(
+                AVATAR_PROFILE_SIZE,
+                AVATAR_STREAM_SIZE,
+                AVATAR_MINI_SIZE
+            );
+
+            foreach ($sizes as $size) {
+                $alink  = null;
+                try {
+                    $avatar = Avatar::byProfile($this, $size);
+                    $alink = AvatarLink::fromAvatar($avatar);
+                } catch (NoAvatarException $e) {
+                    $alink = new AvatarLink();
+                    $alink->type   = 'image/png';
+                    $alink->height = $size;
+                    $alink->width  = $size;
+                    $alink->url    = Avatar::defaultImage($size);
+                }
+
+                $object->avatarLinks[] = $alink;
+            }
+
+            if (isset($this->lat) && isset($this->lon)) {
+                $object->geopoint = (float)$this->lat
+                    . ' ' . (float)$this->lon;
+            }
+
+            $object->poco = PoCo::fromProfile($this);
+
+            if ($this->isLocal()) {
+                $object->extra[] = array('followers', array('url' => common_local_url('subscribers', array('nickname' => $this->getNickname()))));
+            }
+
+            Event::handle('EndActivityObjectFromProfile', array($this, &$object));
+        }
+
+        return $object;
+    }
+
     /**
      * Returns the profile's canonical url, not necessarily a uri/unique id
      *
@@ -1383,6 +1380,11 @@ class Profile extends Managed_DataObject
         return $this->nickname;
     }
 
+    public function getDescription()
+    {
+        return $this->bio;
+    }
+
     /**
      * Returns the best URI for a profile. Plugins may override.
      *
@@ -1449,6 +1451,12 @@ class Profile extends Managed_DataObject
         return $feed;
     }
 
+    public function repeatedToMe($offset=0, $limit=20, $since_id=null, $max_id=null)
+    {
+        // TRANS: Exception thrown when trying view "repeated to me".
+        throw new Exception(_('Not implemented since inbox change.'));
+    }
+
     /*
      * Get a Profile object by URI. Will call external plugins for help
      * using the event StartGetProfileFromURI.
@@ -1539,7 +1547,7 @@ class Profile extends Managed_DataObject
     function __sleep()
     {
         $vars = parent::__sleep();
-        $skip = array('_user', '_avatars');
+        $skip = array('_user', '_group');
         return array_diff($vars, $skip);
     }
 
@@ -1563,4 +1571,36 @@ class Profile extends Managed_DataObject
     {
         return $this->getUser()->shortenLinks($text, $always);
     }
+
+    public function isPrivateStream()
+    {
+        // We only know of public remote users as of yet...
+        if (!$this->isLocal()) {
+            return false;
+        }
+        return $this->getUser()->private_stream ? true : false;
+    }
+
+    public function delPref($namespace, $topic) {
+        return Profile_prefs::setData($this, $namespace, $topic, null);
+    }
+
+    public function getPref($namespace, $topic, $default=null) {
+        // If you want an exception to be thrown, call Profile_prefs::getData directly
+        try {
+            return Profile_prefs::getData($this, $namespace, $topic, $default);
+        } catch (NoResultException $e) {
+            return null;
+        }
+    }
+
+    // The same as getPref but will fall back to common_config value for the same namespace/topic
+    public function getConfigPref($namespace, $topic)
+    {
+        return Profile_prefs::getConfigData($this, $namespace, $topic);
+    }
+
+    public function setPref($namespace, $topic, $data) {
+        return Profile_prefs::setData($this, $namespace, $topic, $data);
+    }
 }