From 3c3ab128b39af6d84cee9abe4bb2b7fbee5c5288 Mon Sep 17 00:00:00 2001 From: Evan Prodromou Date: Wed, 13 Jul 2011 14:47:40 -0400 Subject: [PATCH] Actions to keep state for Realtime_channel --- plugins/Realtime/RealtimePlugin.php | 19 +++++ plugins/Realtime/closechannel.php | 115 ++++++++++++++++++++++++++ plugins/Realtime/keepalivechannel.php | 115 ++++++++++++++++++++++++++ 3 files changed, 249 insertions(+) create mode 100644 plugins/Realtime/closechannel.php create mode 100644 plugins/Realtime/keepalivechannel.php diff --git a/plugins/Realtime/RealtimePlugin.php b/plugins/Realtime/RealtimePlugin.php index 3e80d71a26..5396d6d38e 100644 --- a/plugins/Realtime/RealtimePlugin.php +++ b/plugins/Realtime/RealtimePlugin.php @@ -73,6 +73,10 @@ class RealtimePlugin extends Plugin 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; @@ -81,6 +85,21 @@ class RealtimePlugin extends Plugin } } + /** + * Hook for RouterInitialized event. + * + * @param Net_URL_Mapper $m path-to-action mapper + * @return boolean hook return + */ + function onRouterInitialized($m) + { + // Discovery actions + $m->connect('main/channel/:channel_key/keepalive', + array('action' => 'keepalivechannel')); + $m->connect('main/channel/:channel_key/close', + array('action' => 'closechannel')); + } + function onEndShowScripts($action) { $timeline = $this->_getTimeline($action); diff --git a/plugins/Realtime/closechannel.php b/plugins/Realtime/closechannel.php new file mode 100644 index 0000000000..f07e24b297 --- /dev/null +++ b/plugins/Realtime/closechannel.php @@ -0,0 +1,115 @@ +. + * + * @category Realtime + * @package StatusNet + * @author Evan Prodromou + * @copyright 2011 StatusNet, Inc. + * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0 + * @link http://status.net/ + */ + +if (!defined('STATUSNET')) { + // This check helps protect against security problems; + // your code file can't be executed directly from the web. + exit(1); +} + +/** + * Action to close a channel + * + * @category Realtime + * @package StatusNet + * @author Evan Prodromou + * @copyright 2011 StatusNet, Inc. + * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0 + * @link http://status.net/ + */ + +class ClosechannelAction extends Action +{ + protected $channelKey = null; + protected $channel = null; + + /** + * For initializing members of the class. + * + * @param array $argarray misc. arguments + * + * @return boolean true + */ + + function prepare($argarray) + { + parent::prepare($argarray); + + if (!$this->isPost()) { + throw new ClientException(_m('You have to POST it.')); + } + + $this->channelKey = $this->trimmed('channel_key'); + + if (empty($this->channelKey)) { + throw new ClientException(_m('No channel key argument.')); + } + + $this->channel = Realtime_channel::staticGet('channel_key', $this->channelKey); + + if (empty($this->channel)) { + throw new ClientException(_m('No such channel.')); + } + + return true; + } + + /** + * Handler method + * + * @param array $argarray is ignored since it's now passed in in prepare() + * + * @return void + */ + + function handle($argarray=null) + { + $this->channel->delete(); + + header('HTTP/1.1 204 No Content'); + + return; + } + + /** + * Return true if read only. + * + * MAY override + * + * @param array $args other arguments + * + * @return boolean is read only action? + */ + + function isReadOnly($args) + { + return false; + } +} diff --git a/plugins/Realtime/keepalivechannel.php b/plugins/Realtime/keepalivechannel.php new file mode 100644 index 0000000000..dc1bfb6d24 --- /dev/null +++ b/plugins/Realtime/keepalivechannel.php @@ -0,0 +1,115 @@ +. + * + * @category Realtime + * @package StatusNet + * @author Evan Prodromou + * @copyright 2011 StatusNet, Inc. + * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0 + * @link http://status.net/ + */ + +if (!defined('STATUSNET')) { + // This check helps protect against security problems; + // your code file can't be executed directly from the web. + exit(1); +} + +/** + * Action periodically pinged by a page to keep a channel alive + * + * @category Realtime + * @package StatusNet + * @author Evan Prodromou + * @copyright 2011 StatusNet, Inc. + * @license http://www.fsf.org/licensing/licenses/agpl-3.0.html AGPL 3.0 + * @link http://status.net/ + */ + +class KeepalivechannelAction extends Action +{ + protected $channelKey = null; + protected $channel = null; + + /** + * For initializing members of the class. + * + * @param array $argarray misc. arguments + * + * @return boolean true + */ + + function prepare($argarray) + { + parent::prepare($argarray); + + if (!$this->isPost()) { + throw new ClientException(_m('You have to POST it.')); + } + + $this->channelKey = $this->trimmed('channel_key'); + + if (empty($this->channelKey)) { + throw new ClientException(_m('No channel key argument.')); + } + + $this->channel = Realtime_channel::staticGet('channel_key', $this->channelKey); + + if (empty($this->channel)) { + throw new ClientException(_m('No such channel.')); + } + + return true; + } + + /** + * Handler method + * + * @param array $argarray is ignored since it's now passed in in prepare() + * + * @return void + */ + + function handle($argarray=null) + { + $this->channel->touch(); + + header('HTTP/1.1 204 No Content'); + + return; + } + + /** + * Return true if read only. + * + * MAY override + * + * @param array $args other arguments + * + * @return boolean is read only action? + */ + + function isReadOnly($args) + { + return false; + } +}