summaryrefslogtreecommitdiff
path: root/plugins/OStatus
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/OStatus')
-rw-r--r--plugins/OStatus/actions/salmon.php140
1 files changed, 133 insertions, 7 deletions
diff --git a/plugins/OStatus/actions/salmon.php b/plugins/OStatus/actions/salmon.php
index c79d09c95..9ca019826 100644
--- a/plugins/OStatus/actions/salmon.php
+++ b/plugins/OStatus/actions/salmon.php
@@ -62,20 +62,146 @@ class SalmonAction extends Action
// XXX: check the signature
$this->act = new Activity($dom->documentElement);
+
+ return true;
}
function handle($args)
{
- common_log(LOG_DEBUG, 'Salmon: incoming post for user: '. $user_id);
+ common_log(LOG_INFO, 'Salmon: incoming post for user '. $this->user->id);
// TODO : Insert new $xml -> notice code
- switch ($this->act->verb)
- {
- case Activity::POST:
- case Activity::SHARE:
- case Activity::FAVORITE:
- case Activity::FOLLOW:
+ if (Event::handle('StartHandleSalmon', array($this->user, $this->activity))) {
+ switch ($this->act->verb)
+ {
+ case ActivityVerb::POST:
+ $this->handlePost();
+ break;
+ case ActivityVerb::SHARE:
+ $this->handleShare();
+ break;
+ case ActivityVerb::FAVORITE:
+ $this->handleFavorite();
+ break;
+ case ActivityVerb::FOLLOW:
+ case ActivityVerb::FRIEND:
+ $this->handleFollow();
+ break;
+ }
+ Event::handle('EndHandleSalmon', array($this->user, $this->activity));
+ }
+ }
+
+ function handlePost()
+ {
+ switch ($this->act->object->type) {
+ case ActivityObject::ARTICLE:
+ case ActivityObject::BLOGENTRY:
+ case ActivityObject::NOTE:
+ case ActivityObject::STATUS:
+ case ActivityObject::COMMENT:
+ break;
+ default:
+ throw new Exception("Can't handle that kind of post.");
+ }
+
+ $profile = $this->ensureProfile();
+ }
+
+ function handleFollow()
+ {
+ }
+
+ function handleFavorite()
+ {
+ }
+
+ function handleShare()
+ {
+ }
+
+ function ensureProfile()
+ {
+ $actor = $this->act->actor;
+
+ if (empty($actor->id)) {
+ throw new Exception("Received a salmon slap from unidentified actor.");
+ }
+
+ $ostatusProfile = Ostatus_profile::staticGet('homeuri', $actor->id);
+
+ if (empty($ostatusProfile)) {
+ return $this->createProfile();
+ } else {
+ // XXX: can we receive a salmon slap from a group...?
+ assert(!empty($ostatusProfile->profile_id));
+ return Profile::staticGet($ostatusProfile->profile_id);
+ }
+ }
+
+ function createProfile()
+ {
+ $actor = $this->act->actor;
+
+ $profile = new Profile();
+
+ $profile->nickname = $this->nicknameFromURI($actor->id);
+
+ if (empty($profile->nickname)) {
+ $profile->nickname = common_nicknamize($actor->title);
+ }
+
+ $profile->fullname = $actor->title;
+ $profile->bio = $actor->summary; // XXX: is that right?
+ $profile->profileurl = $actor->link; // XXX: is that right?
+ $profile->created = common_sql_now();
+
+ $id = $profile->insert();
+
+ if (empty($id)) {
+ common_log_db_error($profile, 'INSERT', __FILE__);
+ throw new Exception("Couldn't save new profile for $actor->id\n");
+ }
+
+ // XXX: add avatars
+
+ $op = new Ostatus_profile();
+
+ $op->profile_id = $id;
+ $op->homeuri = $actor->id;
+ $op->created = $profile->created;
+
+ // XXX: determine feed URI from source or Webfinger or whatever
+
+ $id = $op->insert();
+
+ if (empty($id)) {
+ common_log_db_error($op, 'INSERT', __FILE__);
+ throw new Exception("Couldn't save new ostatus profile for $actor->id\n");
+ }
+
+ return $profile;
+ }
+
+ function nicknameFromURI($uri)
+ {
+ preg_match('/(\w+):/', $uri, $matches);
+
+ $protocol = $matches[1];
+
+ switch ($protocol) {
+ case 'acct':
+ case 'mailto':
+ if (preg_match("/^$protocol:(.*)?@.*\$/", $uri, $matches)) {
+ return common_canonical_nickname($matches[1]);
+ }
+ return null;
+ case 'http':
+ return common_url_to_nickname($uri);
+ break;
+ default:
+ return null;
}
}
}