X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=plugins%2FRealtime%2FRealtimePlugin.php;h=eca3a8b029be1f90ebee22158f761f68c9117460;hb=e7bbe6c1b664d579622d4103293b99e2650a6b8a;hp=709d65ac5db14ec88224b4864085ee39a5045079;hpb=c97048d01bea468e0cf8865b60c3c250b4515c39;p=quix0rs-gnu-social.git diff --git a/plugins/Realtime/RealtimePlugin.php b/plugins/Realtime/RealtimePlugin.php index 709d65ac5d..eca3a8b029 100644 --- a/plugins/Realtime/RealtimePlugin.php +++ b/plugins/Realtime/RealtimePlugin.php @@ -59,10 +59,58 @@ class RealtimePlugin extends Plugin array('notice' => '0000000000')); return true; } + + function onCheckSchema() + { + $schema = Schema::get(); + $schema->ensureTable('realtime_channel', Realtime_channel::schemaDef()); + return true; + } + + function onAutoload($cls) + { + $dir = dirname(__FILE__); + + switch ($cls) + { + case 'KeepalivechannelAction': + case 'ClosechannelAction': + include_once $dir . '/' . strtolower(mb_substr($cls, 0, -6)) . '.php'; + return false; + case 'Realtime_channel': + include_once $dir.'/'.$cls.'.php'; + return false; + default: + return true; + } + } + + /** + * Hook for RouterInitialized event. + * + * @param Net_URL_Mapper $m path-to-action mapper + * @return boolean hook return + */ + function onRouterInitialized($m) + { + $m->connect('main/channel/:channelkey/keepalive', + array('action' => 'keepalivechannel'), + array('channelkey' => '[a-z0-9]{32}')); + $m->connect('main/channel/:channelkey/close', + array('action' => 'closechannel'), + array('channelkey' => '[a-z0-9]{32}')); + return true; + } function onEndShowScripts($action) { - $timeline = $this->_getTimeline($action); + $channel = $this->_getChannel($action); + + if (empty($channel)) { + return true; + } + + $timeline = $this->_pathToChannel(array($channel->channel_key)); // If there's not a timeline on this page, // just return true @@ -97,12 +145,14 @@ class RealtimePlugin extends Plugin } else { $pluginPath = common_path('plugins/Realtime/'); - $realtimeUI = ' RealtimeUpdate.initActions("'.$url.'", "'.$timeline.'", "'. $pluginPath .'");'; + $keepalive = common_local_url('keepalivechannel', array('channelkey' => $channel->channel_key)); + $close = common_local_url('closechannel', array('channelkey' => $channel->channel_key)); + $realtimeUI = ' RealtimeUpdate.initActions("'.$url.'", "'.$timeline.'", "'. $pluginPath .'", "'.$keepalive.'", "'.$close.'"); '; } $script = ' $(document).ready(function() { '. $realtimeUI. - $this->_updateInitialize($timeline, $user_id). + $this->_updateInitialize($timeline, $user_id). '}); '; $action->inlineScript($script); @@ -126,14 +176,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 @@ -142,7 +192,7 @@ class RealtimePlugin extends Plugin if (!empty($tags)) { foreach ($tags as $tag) { - $paths[] = array('tag', $tag); + $paths[] = array('tag', $tag, null); } } @@ -153,7 +203,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 @@ -165,7 +215,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); } } } @@ -179,7 +229,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); } } @@ -188,10 +238,31 @@ class RealtimePlugin extends Plugin $json = $this->noticeAsJson($notice); $this->_connect(); + + // XXX: We should probably fan-out here and do a + // new queue item for each path 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) { + + // XXX: We should probably fan-out here and do a + // new queue item for each user/path combo + + 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(); @@ -370,21 +441,40 @@ class RealtimePlugin extends Plugin return ''; } + function _getTimeline($action) { - $path = null; - $timeline = null; + $channel = $this->_getChannel($action); + if (empty($channel)) { + return null; + } + + return $this->_pathToChannel(array($channel->channel_key)); + } + function _getChannel($action) + { + $timeline = null; + $arg1 = null; + $arg2 = null; + $action_name = $action->trimmed('action'); + // FIXME: lists + // FIXME: search (!) + // 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': @@ -393,17 +483,31 @@ 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; + return null; } - if (!empty($path)) { - $timeline = $this->_pathToChannel($path); - } + $user = common_current_user(); + + $user_id = (!empty($user)) ? $user->id : null; + + $channel = Realtime_channel::getChannel($user_id, + $action_name, + $arg1, + $arg2); - return $timeline; + return $channel; + } + + function onStartReadWriteTables(&$alwaysRW, &$rwdb) + { + $alwaysRW[] = 'realtime_channel'; + return true; } }