]> git.mxchange.org Git - quix0rs-gnu-social.git/commitdiff
more work on salmon
authorEvan Prodromou <evan@status.net>
Thu, 18 Feb 2010 11:36:32 +0000 (06:36 -0500)
committerEvan Prodromou <evan@status.net>
Thu, 18 Feb 2010 11:36:32 +0000 (06:36 -0500)
plugins/OStatus/actions/salmon.php

index c79d09c95aa692e30371c55c504895df350731b2..9ca01982663089a1eb7f97fb8806cd4371a552a0 100644 (file)
@@ -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;
         }
     }
 }