X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=classes%2FProfile.php;h=49addfe47fe887d72d84f73c57fde62c25ed1098;hb=5c768d7ef71ce08e505056c6f3fbdd092cd3649d;hp=1af29b262090c11d94de624f6ad1feff7d073a73;hpb=3d019f91492396f4d27858a80894af74c34bb5b9;p=quix0rs-gnu-social.git diff --git a/classes/Profile.php b/classes/Profile.php index 1af29b2620..49addfe47f 100644 --- a/classes/Profile.php +++ b/classes/Profile.php @@ -30,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) @@ -48,12 +48,12 @@ class Profile extends Managed_DataObject 'description' => 'local and remote users have profiles', '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'), - 'bio' => array('type' => 'text', 'description' => 'descriptive biography', 'collate' => 'utf8_general_ci'), - 'location' => array('type' => 'varchar', 'length' => 255, 'description' => 'physical location', 'collate' => 'utf8_general_ci'), + 'nickname' => array('type' => 'varchar', 'length' => 64, 'not null' => true, 'description' => 'nickname or username', 'collate' => 'utf8mb4_general_ci'), + 'fullname' => array('type' => 'varchar', 'length' => 191, 'description' => 'display name', 'collate' => 'utf8mb4_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' => 'utf8mb4_general_ci'), + 'bio' => array('type' => 'text', 'description' => 'descriptive biography', 'collate' => 'utf8mb4_general_ci'), + 'location' => array('type' => 'varchar', 'length' => 191, 'description' => 'physical location', 'collate' => 'utf8mb4_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'), @@ -138,6 +138,18 @@ class Profile extends Managed_DataObject return true; } + // Returns false if the user has no password (which will always + // be the case for remote users). This can be the case for OpenID + // logins or other mechanisms which don't store a password hash. + public function hasPassword() + { + try { + return $this->getUser()->hasPassword(); + } catch (NoSuchUserException $e) { + return false; + } + } + public function getObjectType() { // FIXME: More types... like peopletags and whatever @@ -155,7 +167,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; @@ -237,6 +254,11 @@ class Profile extends Managed_DataObject return null; } + function getReplies($offset=0, $limit=NOTICES_PER_PAGE, $since_id=0, $before_id=0) + { + return Reply::stream($this->getID(), $offset, $limit, $since_id, $before_id); + } + function getTaggedNotices($tag, $offset=0, $limit=NOTICES_PER_PAGE, $since_id=0, $max_id=0) { $stream = new TaggedProfileNoticeStream($this, $tag); @@ -305,7 +327,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 } @@ -593,7 +615,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; } @@ -604,7 +626,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; } @@ -838,12 +860,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)) { @@ -859,9 +877,13 @@ class Profile extends Managed_DataObject function delete($useWhere=false) { + // just in case it hadn't been done before... (usually set before adding deluser to queue handling!) + if (!$this->hasRole(Profile_role::DELETED)) { + $this->grantRole(Profile_role::DELETED); + } + $this->_deleteNotices(); $this->_deleteSubscriptions(); - $this->_deleteMessages(); $this->_deleteTags(); $this->_deleteBlocks(); $this->_deleteAttentions(); @@ -880,6 +902,11 @@ class Profile extends Managed_DataObject $inst->delete(); } + $localuser = User::getKV('id', $this->id); + if ($localuser instanceof User) { + $localuser->delete(); + } + return parent::delete($useWhere); } @@ -937,17 +964,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(); @@ -1391,6 +1407,16 @@ class Profile extends Managed_DataObject return $this->nickname; } + public function getFullname() + { + return $this->fullname; + } + + public function getHomepage() + { + return $this->homepage; + } + public function getDescription() { return $this->bio; @@ -1462,6 +1488,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. @@ -1561,6 +1593,23 @@ class Profile extends Managed_DataObject return $this; } + /** + * Test whether the given profile is the same as the current class, + * for testing identities. + * + * @param Profile $other The other profile, usually from Action's $this->scoped + * + * @return boolean + */ + public function sameAs(Profile $other=null) + { + if (is_null($other)) { + // In case $this->scoped is null or something, i.e. not a current/legitimate profile. + return false; + } + return $this->getID() === $other->getID(); + } + /** * This will perform shortenLinks with the connected User object. * @@ -1577,11 +1626,40 @@ 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) { - return Profile_prefs::getData($this, $namespace, $topic, $default); + // 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); } + + public function getConnectedApps($offset=0, $limit=null) + { + return $this->getUser()->getConnectedApps($offset, $limit); + } }