OStatus: save updated profile bits when they come in over the wire; fix up nicknames
This commit is contained in:
parent
5cabb63e4e
commit
07214f1370
|
@ -33,6 +33,7 @@ class Ostatus_profile extends Memcached_DataObject
|
||||||
|
|
||||||
public $feeduri;
|
public $feeduri;
|
||||||
public $salmonuri;
|
public $salmonuri;
|
||||||
|
public $avatar; // remote URL of the last avatar we saved
|
||||||
|
|
||||||
public $created;
|
public $created;
|
||||||
public $modified;
|
public $modified;
|
||||||
|
@ -58,6 +59,7 @@ class Ostatus_profile extends Memcached_DataObject
|
||||||
'group_id' => DB_DATAOBJECT_INT,
|
'group_id' => DB_DATAOBJECT_INT,
|
||||||
'feeduri' => DB_DATAOBJECT_STR,
|
'feeduri' => DB_DATAOBJECT_STR,
|
||||||
'salmonuri' => DB_DATAOBJECT_STR,
|
'salmonuri' => DB_DATAOBJECT_STR,
|
||||||
|
'avatar' => DB_DATAOBJECT_STR,
|
||||||
'created' => DB_DATAOBJECT_STR + DB_DATAOBJECT_DATE + DB_DATAOBJECT_TIME + DB_DATAOBJECT_NOTNULL,
|
'created' => DB_DATAOBJECT_STR + DB_DATAOBJECT_DATE + DB_DATAOBJECT_TIME + DB_DATAOBJECT_NOTNULL,
|
||||||
'modified' => DB_DATAOBJECT_STR + DB_DATAOBJECT_DATE + DB_DATAOBJECT_TIME + DB_DATAOBJECT_NOTNULL);
|
'modified' => DB_DATAOBJECT_STR + DB_DATAOBJECT_DATE + DB_DATAOBJECT_TIME + DB_DATAOBJECT_NOTNULL);
|
||||||
}
|
}
|
||||||
|
@ -74,6 +76,8 @@ class Ostatus_profile extends Memcached_DataObject
|
||||||
255, true, 'UNI'),
|
255, true, 'UNI'),
|
||||||
new ColumnDef('salmonuri', 'text',
|
new ColumnDef('salmonuri', 'text',
|
||||||
null, true),
|
null, true),
|
||||||
|
new ColumnDef('avatar', 'text',
|
||||||
|
null, true),
|
||||||
new ColumnDef('created', 'datetime',
|
new ColumnDef('created', 'datetime',
|
||||||
null, false),
|
null, false),
|
||||||
new ColumnDef('modified', 'datetime',
|
new ColumnDef('modified', 'datetime',
|
||||||
|
@ -543,7 +547,8 @@ class Ostatus_profile extends Memcached_DataObject
|
||||||
// through PuSH setup or Salmon signature checks.
|
// through PuSH setup or Salmon signature checks.
|
||||||
$actorUri = self::getActorProfileURI($activity);
|
$actorUri = self::getActorProfileURI($activity);
|
||||||
if ($actorUri == $this->uri) {
|
if ($actorUri == $this->uri) {
|
||||||
// @fixme check if profile info has changed and update it
|
// Check if profile info has changed and update it
|
||||||
|
$this->updateFromActivityObject($activity->actor);
|
||||||
} else {
|
} else {
|
||||||
common_log(LOG_WARNING, "OStatus: skipping post with bad author: got $actorUri expected $this->uri");
|
common_log(LOG_WARNING, "OStatus: skipping post with bad author: got $actorUri expected $this->uri");
|
||||||
return false;
|
return false;
|
||||||
|
@ -785,6 +790,11 @@ class Ostatus_profile extends Memcached_DataObject
|
||||||
*/
|
*/
|
||||||
protected function updateAvatar($url)
|
protected function updateAvatar($url)
|
||||||
{
|
{
|
||||||
|
if ($url == $this->avatar) {
|
||||||
|
// We've already got this one.
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if ($this->isGroup()) {
|
if ($this->isGroup()) {
|
||||||
$self = $this->localGroup();
|
$self = $this->localGroup();
|
||||||
} else {
|
} else {
|
||||||
|
@ -816,12 +826,28 @@ class Ostatus_profile extends Memcached_DataObject
|
||||||
common_timestamp());
|
common_timestamp());
|
||||||
rename($temp_filename, Avatar::path($filename));
|
rename($temp_filename, Avatar::path($filename));
|
||||||
$self->setOriginal($filename);
|
$self->setOriginal($filename);
|
||||||
|
|
||||||
|
$orig = clone($this);
|
||||||
|
$this->avatar = $url;
|
||||||
|
$this->update($orig);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected static function getActivityObjectAvatar($object)
|
/**
|
||||||
|
* Pull avatar URL from ActivityObject or profile hints
|
||||||
|
*
|
||||||
|
* @param ActivityObject $object
|
||||||
|
* @param array $hints
|
||||||
|
* @return mixed URL string or false
|
||||||
|
*/
|
||||||
|
|
||||||
|
protected static function getActivityObjectAvatar($object, $hints=array())
|
||||||
{
|
{
|
||||||
// XXX: go poke around in the feed
|
if ($object->avatar) {
|
||||||
return $object->avatar;
|
return $object->avatar;
|
||||||
|
} else if (array_key_exists('avatar', $hints)) {
|
||||||
|
return $hints['avatar'];
|
||||||
|
}
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -888,7 +914,9 @@ class Ostatus_profile extends Memcached_DataObject
|
||||||
public static function ensureActivityObjectProfile($object, $feeduri=null, $salmonuri=null, $hints=array())
|
public static function ensureActivityObjectProfile($object, $feeduri=null, $salmonuri=null, $hints=array())
|
||||||
{
|
{
|
||||||
$profile = self::getActivityObjectProfile($object);
|
$profile = self::getActivityObjectProfile($object);
|
||||||
if (!$profile) {
|
if ($profile) {
|
||||||
|
$profile->updateFromActivityObject($object, $hints);
|
||||||
|
} else {
|
||||||
$profile = self::createActivityObjectProfile($object, $feeduri, $salmonuri, $hints);
|
$profile = self::createActivityObjectProfile($object, $feeduri, $salmonuri, $hints);
|
||||||
}
|
}
|
||||||
return $profile;
|
return $profile;
|
||||||
|
@ -957,8 +985,6 @@ class Ostatus_profile extends Memcached_DataObject
|
||||||
protected static function createActivityObjectProfile($object, $feeduri=null, $salmonuri=null, $hints=array())
|
protected static function createActivityObjectProfile($object, $feeduri=null, $salmonuri=null, $hints=array())
|
||||||
{
|
{
|
||||||
$homeuri = $object->id;
|
$homeuri = $object->id;
|
||||||
$nickname = self::getActivityObjectNickname($object, $hints);
|
|
||||||
$avatar = self::getActivityObjectAvatar($object);
|
|
||||||
|
|
||||||
if (!$homeuri) {
|
if (!$homeuri) {
|
||||||
common_log(LOG_DEBUG, __METHOD__ . " empty actor profile URI: " . var_export($activity, true));
|
common_log(LOG_DEBUG, __METHOD__ . " empty actor profile URI: " . var_export($activity, true));
|
||||||
|
@ -1002,43 +1028,19 @@ class Ostatus_profile extends Memcached_DataObject
|
||||||
|
|
||||||
if ($object->type == ActivityObject::PERSON) {
|
if ($object->type == ActivityObject::PERSON) {
|
||||||
$profile = new Profile();
|
$profile = new Profile();
|
||||||
$profile->nickname = $nickname;
|
self::updateProfile($profile, $object, $hints);
|
||||||
$profile->fullname = $object->title;
|
|
||||||
if (!empty($object->link)) {
|
|
||||||
$profile->profileurl = $object->link;
|
|
||||||
} else if (array_key_exists('profileurl', $hints)) {
|
|
||||||
$profile->profileurl = $hints['profileurl'];
|
|
||||||
}
|
|
||||||
$profile->created = common_sql_now();
|
$profile->created = common_sql_now();
|
||||||
|
|
||||||
// @fixme bio
|
|
||||||
// @fixme tags/categories
|
|
||||||
// @fixme location?
|
|
||||||
// @todo tags from categories
|
|
||||||
// @todo lat/lon/location?
|
|
||||||
|
|
||||||
$oprofile->profile_id = $profile->insert();
|
$oprofile->profile_id = $profile->insert();
|
||||||
|
|
||||||
if (!$oprofile->profile_id) {
|
if (!$oprofile->profile_id) {
|
||||||
throw new ServerException("Can't save local profile");
|
throw new ServerException("Can't save local profile");
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
$group = new User_group();
|
$group = new User_group();
|
||||||
$group->nickname = $nickname;
|
|
||||||
$group->fullname = $object->title;
|
|
||||||
// @fixme no canonical profileurl; using homepage instead for now
|
|
||||||
$group->homepage = $homeuri;
|
|
||||||
$group->created = common_sql_now();
|
$group->created = common_sql_now();
|
||||||
|
self::updateGroup($group, $object, $hints);
|
||||||
// @fixme homepage
|
|
||||||
// @fixme bio
|
|
||||||
// @fixme tags/categories
|
|
||||||
// @fixme location?
|
|
||||||
// @todo tags from categories
|
|
||||||
// @todo lat/lon/location?
|
|
||||||
|
|
||||||
$oprofile->group_id = $group->insert();
|
$oprofile->group_id = $group->insert();
|
||||||
|
|
||||||
if (!$oprofile->group_id) {
|
if (!$oprofile->group_id) {
|
||||||
throw new ServerException("Can't save local profile");
|
throw new ServerException("Can't save local profile");
|
||||||
}
|
}
|
||||||
|
@ -1047,6 +1049,7 @@ class Ostatus_profile extends Memcached_DataObject
|
||||||
$ok = $oprofile->insert();
|
$ok = $oprofile->insert();
|
||||||
|
|
||||||
if ($ok) {
|
if ($ok) {
|
||||||
|
$avatar = self::getActivityObjectAvatar($object, $hints);
|
||||||
if ($avatar) {
|
if ($avatar) {
|
||||||
$oprofile->updateAvatar($avatar);
|
$oprofile->updateAvatar($avatar);
|
||||||
}
|
}
|
||||||
|
@ -1056,8 +1059,82 @@ class Ostatus_profile extends Memcached_DataObject
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Save any updated profile information to our local copy.
|
||||||
|
* @param ActivityObject $object
|
||||||
|
* @param array $hints
|
||||||
|
*/
|
||||||
|
protected function updateFromActivityObject($object, $hints=array())
|
||||||
|
{
|
||||||
|
if ($this->isGroup()) {
|
||||||
|
$group = $this->localGroup();
|
||||||
|
self::updateGroup($group, $object, $hints);
|
||||||
|
} else {
|
||||||
|
$profile = $this->localProfile();
|
||||||
|
self::updateProfile($profile, $object, $hints);
|
||||||
|
}
|
||||||
|
$avatar = self::getActivityObjectAvatar($object, $hints);
|
||||||
|
if ($avatar) {
|
||||||
|
$this->updateAvatar($avatar);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected static function updateProfile($profile, $object, $hints=array())
|
||||||
|
{
|
||||||
|
$orig = clone($profile);
|
||||||
|
|
||||||
|
$profile->nickname = self::getActivityObjectNickname($object, $hints);
|
||||||
|
$profile->fullname = $object->title;
|
||||||
|
if (!empty($object->link)) {
|
||||||
|
$profile->profileurl = $object->link;
|
||||||
|
} else if (array_key_exists('profileurl', $hints)) {
|
||||||
|
$profile->profileurl = $hints['profileurl'];
|
||||||
|
}
|
||||||
|
|
||||||
|
// @fixme bio
|
||||||
|
// @fixme tags/categories
|
||||||
|
// @fixme location?
|
||||||
|
// @todo tags from categories
|
||||||
|
// @todo lat/lon/location?
|
||||||
|
|
||||||
|
if ($profile->id) {
|
||||||
|
common_log(LOG_DEBUG, "Updating OStatus profile $profile->id from remote info $object->id: " . var_export($object, true) . var_export($hints, true));
|
||||||
|
$profile->update($orig);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
protected static function updateGroup($group, $object, $hints=array())
|
||||||
|
{
|
||||||
|
$orig = clone($group);
|
||||||
|
|
||||||
|
// @fixme need to make nick unique etc *hack hack*
|
||||||
|
$group->nickname = self::getActivityObjectNickname($object, $hints);
|
||||||
|
$group->fullname = $object->title;
|
||||||
|
|
||||||
|
// @fixme no canonical profileurl; using homepage instead for now
|
||||||
|
$group->homepage = $object->id;
|
||||||
|
|
||||||
|
// @fixme homepage
|
||||||
|
// @fixme bio
|
||||||
|
// @fixme tags/categories
|
||||||
|
// @fixme location?
|
||||||
|
// @todo tags from categories
|
||||||
|
// @todo lat/lon/location?
|
||||||
|
|
||||||
|
if ($group->id) {
|
||||||
|
common_log(LOG_DEBUG, "Updating OStatus group $group->id from remote info $object->id: " . var_export($object, true) . var_export($hints, true));
|
||||||
|
$group->update($orig);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
protected static function getActivityObjectNickname($object, $hints=array())
|
protected static function getActivityObjectNickname($object, $hints=array())
|
||||||
{
|
{
|
||||||
|
if ($object->poco) {
|
||||||
|
if (!empty($object->poco->preferredUsername)) {
|
||||||
|
return common_nicknamize($object->poco->preferredUsername);
|
||||||
|
}
|
||||||
|
}
|
||||||
if (!empty($object->nickname)) {
|
if (!empty($object->nickname)) {
|
||||||
return common_nicknamize($object->nickname);
|
return common_nicknamize($object->nickname);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user