]> git.mxchange.org Git - quix0rs-gnu-social.git/commitdiff
use Realtime_channel to target channels to users
authorEvan Prodromou <evan@status.net>
Mon, 11 Jul 2011 13:16:16 +0000 (09:16 -0400)
committerEvan Prodromou <evan@status.net>
Mon, 11 Jul 2011 13:16:16 +0000 (09:16 -0400)
plugins/Realtime/RealtimePlugin.php
plugins/Realtime/Realtime_channel.php

index 68dc374f8c2f0e12d91548530e36240b5e284177..a7750e005ed0d64e89f6e3c77aa228059ce29ff2 100644 (file)
@@ -147,14 +147,14 @@ class RealtimePlugin extends Plugin
         $user = User::staticGet('id', $notice->profile_id);
 
         if (!empty($user)) {
-            $paths[] = array('showstream', $user->nickname);
+            $paths[] = array('showstream', $user->nickname, null);
         }
 
         // Add to the public timeline
 
         if ($notice->is_local == Notice::LOCAL_PUBLIC ||
             ($notice->is_local == Notice::REMOTE_OMB && !common_config('public', 'localonly'))) {
-            $paths[] = array('public');
+            $paths[] = array('public', null, null);
         }
 
         // Add to the tags timeline
@@ -163,7 +163,7 @@ class RealtimePlugin extends Plugin
 
         if (!empty($tags)) {
             foreach ($tags as $tag) {
-                $paths[] = array('tag', $tag);
+                $paths[] = array('tag', $tag, null);
             }
         }
 
@@ -174,7 +174,7 @@ class RealtimePlugin extends Plugin
 
         foreach (array_keys($ni) as $user_id) {
             $user = User::staticGet('id', $user_id);
-            $paths[] = array('all', $user->nickname);
+            $paths[] = array('all', $user->nickname, null);
         }
 
         // Add to the replies timeline
@@ -186,7 +186,7 @@ class RealtimePlugin extends Plugin
             while ($reply->fetch()) {
                 $user = User::staticGet('id', $reply->profile_id);
                 if (!empty($user)) {
-                    $paths[] = array('replies', $user->nickname);
+                    $paths[] = array('replies', $user->nickname, null);
                 }
             }
         }
@@ -200,7 +200,7 @@ class RealtimePlugin extends Plugin
         if ($gi->find()) {
             while ($gi->fetch()) {
                 $ug = User_group::staticGet('id', $gi->group_id);
-                $paths[] = array('showgroup', $ug->nickname);
+                $paths[] = array('showgroup', $ug->nickname, null);
             }
         }
 
@@ -211,8 +211,22 @@ class RealtimePlugin extends Plugin
             $this->_connect();
 
             foreach ($paths as $path) {
-                $timeline = $this->_pathToChannel($path);
-                $this->_publish($timeline, $json);
+               
+               list($action, $arg1, $arg2) = $path;
+               
+               $channels = Realtime_channel::getAllChannels($action, $arg1, $arg2);
+               
+               foreach ($channels as $channel) {
+                       if (is_null($channel->user_id)) {
+                               $profile = null;
+                       } else {
+                               $profile = Profile::staticGet('id', $channel->user_id);
+                       }
+                       if ($notice->inScope($profile)) {
+                               $timeline = $this->_pathToChannel(array($channel->channel_key));                
+                               $this->_publish($timeline, $json);
+                       }
+               }
             }
 
             $this->_disconnect();
@@ -393,23 +407,27 @@ class RealtimePlugin extends Plugin
 
     function _getTimeline($action)
     {
-        $path = null;
         $timeline = null;
-
+               $arg1     = null;
+               $arg2     = null;
+               
         $action_name = $action->trimmed('action');
 
                // FIXME: lists
                // FIXME: search (!)
-               // FIXME: 
+               // FIXME: profile + tag
                
         switch ($action_name) {
          case 'public':
-            $path = array('public');
+               // no arguments
             break;
          case 'tag':
             $tag = $action->trimmed('tag');
-            if (!empty($tag)) {
-                $path = array('tag', $tag);
+            if (empty($tag)) {
+                $arg1 = $tag;
+            } else {
+               $this->log(LOG_NOTICE, "Unexpected 'tag' action without tag argument");
+               return null;
             }
             break;
          case 'showstream':
@@ -418,17 +436,29 @@ class RealtimePlugin extends Plugin
          case 'showgroup':
             $nickname = common_canonical_nickname($action->trimmed('nickname'));
             if (!empty($nickname)) {
-                $path = array($action_name, $nickname);
+                $arg1 = $nickname;
+            } else {
+               $this->log(LOG_NOTICE, "Unexpected $action_name action without nickname argument.");
+               return null;
             }
             break;
          default:
-            break;
-        }
-
-        if (!empty($path)) {
-            $timeline = $this->_pathToChannel($path);
+            return null;
         }
 
+               $user = common_current_user();
+               
+               $user_id = (!empty($user)) ? $user->id : null;
+               
+               $channel = Realtime_channel::getChannel($user_id,
+                                                                                               $action_name,
+                                                                                               $arg1,
+                                                                                               $arg2);
+               
+               if (!empty($channel)) {
+                       $timeline = $this->_pathToChannel(array($channel->channel_key));
+               }
+                               
         return $timeline;
     }
 }
index a0afd2cd6bc367dfe1dec09663861a51be1d977c..17d8504c058da35e3b1e206e4fa4de353ca01c62 100644 (file)
@@ -137,8 +137,6 @@ class Realtime_channel extends Managed_DataObject
     
     static function saveNew($user_id, $action, $arg1, $arg2)
     {
-       $channel = self::getChannel($user_id, $action, $arg1, $arg2);
-       
        $channel = new Realtime_channel();
        
        $channel->user_id = $user_id;
@@ -173,6 +171,39 @@ class Realtime_channel extends Managed_DataObject
                        }
        }
        
+       if (empty($channel)) {
+               $channel = self::saveNew($user_id, $action, $arg1, $arg2);
+       }
+       
        return $channel;
     }
+    
+    static function getAllChannels($action, $arg1, $arg2)
+    {
+       $channel = new Realtime_channel();
+       
+       $channel->action = $action;
+       
+       if (is_null($arg1)) {
+               $channel->whereAdd('arg1 is null');
+       } else {
+               $channel->arg1 = $arg1;
+       }
+       
+       if (is_null($arg2)) {
+               $channel->whereAdd('arg2 is null');
+       } else {
+               $channel->arg2 = $arg2;
+       }
+       
+       $channel->whereAdd('modified > "' . common_sql_time(time() - self::TIMEOUT) . '"');
+       
+       $channels = array();
+       
+       if ($channel->find()) {
+               $channels = $channel->fetchAll();
+       }
+       
+       return $channels;
+    }
 }
\ No newline at end of file