| 
									
										
										
										
											2009-06-30 23:33:47 -04:00
										 |  |  | <?php | 
					
						
							|  |  |  | /** | 
					
						
							|  |  |  |  * Laconica, the distributed open-source microblogging tool | 
					
						
							|  |  |  |  * | 
					
						
							| 
									
										
										
										
											2009-07-21 11:00:03 -07:00
										 |  |  |  * Plugin to do "real time" updates using Orbited + STOMP | 
					
						
							| 
									
										
										
										
											2009-06-30 23:33:47 -04:00
										 |  |  |  * | 
					
						
							|  |  |  |  * PHP version 5 | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * LICENCE: This program is free software: you can redistribute it and/or modify | 
					
						
							|  |  |  |  * it under the terms of the GNU Affero General Public License as published by | 
					
						
							|  |  |  |  * the Free Software Foundation, either version 3 of the License, or | 
					
						
							|  |  |  |  * (at your option) any later version. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * This program is distributed in the hope that it will be useful, | 
					
						
							|  |  |  |  * but WITHOUT ANY WARRANTY; without even the implied warranty of | 
					
						
							|  |  |  |  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | 
					
						
							|  |  |  |  * GNU Affero General Public License for more details. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * You should have received a copy of the GNU Affero General Public License | 
					
						
							|  |  |  |  * along with this program.  If not, see <http://www.gnu.org/licenses/>. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * @category  Plugin | 
					
						
							|  |  |  |  * @package   Laconica | 
					
						
							|  |  |  |  * @author    Evan Prodromou <evan@controlyourself.ca> | 
					
						
							|  |  |  |  * @copyright 2009 Control Yourself, Inc. | 
					
						
							|  |  |  |  * @license   http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 | 
					
						
							|  |  |  |  * @link      http://laconi.ca/ | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-24 00:59:29 +01:00
										 |  |  | if (!defined('GNUSOCIAL') && !defined('STATUSNET')) { | 
					
						
							| 
									
										
										
										
											2009-06-30 23:33:47 -04:00
										 |  |  |     exit(1); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-27 23:30:35 +01:00
										 |  |  | require_once INSTALLDIR.'/plugins/Realtime/RealtimePlugin.php'; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-06-30 23:33:47 -04:00
										 |  |  | /** | 
					
						
							| 
									
										
										
										
											2009-07-21 11:00:03 -07:00
										 |  |  |  * Plugin to do realtime updates using Orbited + STOMP | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * This plugin pushes data to a STOMP server which is then served to the | 
					
						
							|  |  |  |  * browser by the Orbited server. | 
					
						
							| 
									
										
										
										
											2009-06-30 23:33:47 -04:00
										 |  |  |  * | 
					
						
							|  |  |  |  * @category Plugin | 
					
						
							|  |  |  |  * @package  Laconica | 
					
						
							|  |  |  |  * @author   Evan Prodromou <evan@controlyourself.ca> | 
					
						
							|  |  |  |  * @license  http://www.fsf.org/licensing/licenses/agpl-3.0.html GNU Affero General Public License version 3.0 | 
					
						
							|  |  |  |  * @link     http://laconi.ca/ | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2009-07-21 11:00:03 -07:00
										 |  |  | class OrbitedPlugin extends RealtimePlugin | 
					
						
							| 
									
										
										
										
											2009-06-30 23:33:47 -04:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2009-07-21 11:00:03 -07:00
										 |  |  |     public $webserver   = null; | 
					
						
							|  |  |  |     public $webport     = null; | 
					
						
							|  |  |  |     public $channelbase = null; | 
					
						
							|  |  |  |     public $stompserver = null; | 
					
						
							| 
									
										
										
										
											2009-10-04 03:02:04 -04:00
										 |  |  |     public $stompport   = null; | 
					
						
							| 
									
										
										
										
											2009-07-21 11:00:03 -07:00
										 |  |  |     public $username    = null; | 
					
						
							|  |  |  |     public $password    = null; | 
					
						
							| 
									
										
										
										
											2009-10-04 03:02:04 -04:00
										 |  |  |     public $webuser     = null; | 
					
						
							|  |  |  |     public $webpass     = null; | 
					
						
							| 
									
										
										
										
											2009-06-30 23:33:47 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-07-21 11:00:03 -07:00
										 |  |  |     protected $con      = null; | 
					
						
							| 
									
										
										
										
											2009-06-30 23:33:47 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-10-04 04:05:40 -04:00
										 |  |  |     function onStartShowHeadElements($action) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         // See http://orbited.org/wiki/Deployment#Cross-SubdomainDeployment
 | 
					
						
							|  |  |  |         $action->element('script', null, ' document.domain = document.domain; '); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-07-21 11:00:03 -07:00
										 |  |  |     function _getScripts() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $scripts = parent::_getScripts(); | 
					
						
							| 
									
										
										
										
											2009-10-04 03:02:04 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |         $port = (is_null($this->webport)) ? 8000 : $this->webport; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $server = (is_null($this->webserver)) ? common_config('site', 'server') : $this->webserver; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $root = 'http://'.$server.(($port == 80) ? '':':'.$port); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-07-21 11:00:03 -07:00
										 |  |  |         $scripts[] = $root.'/static/Orbited.js'; | 
					
						
							| 
									
										
										
										
											2014-02-24 00:59:29 +01:00
										 |  |  |         $scripts[] = $this->path('js/orbitedextra.js'); | 
					
						
							| 
									
										
										
										
											2009-07-21 11:00:03 -07:00
										 |  |  |         $scripts[] = $root.'/static/protocols/stomp/stomp.js'; | 
					
						
							| 
									
										
										
										
											2014-02-24 00:59:29 +01:00
										 |  |  |         $scripts[] = $this->path('js/orbitedupdater.js'); | 
					
						
							| 
									
										
										
										
											2009-10-04 03:02:04 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-07-21 11:00:03 -07:00
										 |  |  |         return $scripts; | 
					
						
							| 
									
										
										
										
											2009-06-30 23:33:47 -04:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-07-21 11:00:03 -07:00
										 |  |  |     function _updateInitialize($timeline, $user_id) | 
					
						
							| 
									
										
										
										
											2009-06-30 23:33:47 -04:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2009-07-21 11:00:03 -07:00
										 |  |  |         $script = parent::_updateInitialize($timeline, $user_id); | 
					
						
							| 
									
										
										
										
											2009-10-04 03:02:04 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |         $server = $this->_getStompServer(); | 
					
						
							|  |  |  |         $port   = $this->_getStompPort(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         return $script." OrbitedUpdater.init(\"$server\", $port, ".
 | 
					
						
							|  |  |  |           "\"{$timeline}\", \"{$this->webuser}\", \"{$this->webpass}\");"; | 
					
						
							| 
									
										
										
										
											2009-06-30 23:33:47 -04:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-07-21 11:00:03 -07:00
										 |  |  |     function _connect() | 
					
						
							| 
									
										
										
										
											2009-06-30 23:33:47 -04:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2009-10-04 04:05:40 -04:00
										 |  |  |         require_once(INSTALLDIR.'/extlib/Stomp.php'); | 
					
						
							| 
									
										
										
										
											2009-06-30 23:33:47 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-10-04 03:02:04 -04:00
										 |  |  |         $url = $this->_getStompUrl(); | 
					
						
							| 
									
										
										
										
											2009-06-30 23:33:47 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-10-04 03:02:04 -04:00
										 |  |  |         $this->con = new Stomp($url); | 
					
						
							| 
									
										
										
										
											2009-06-30 23:33:47 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-07-21 11:00:03 -07:00
										 |  |  |         if ($this->con->connect($this->username, $this->password)) { | 
					
						
							| 
									
										
										
										
											2009-10-04 04:05:40 -04:00
										 |  |  |             $this->log(LOG_INFO, "Connected."); | 
					
						
							| 
									
										
										
										
											2009-07-21 11:00:03 -07:00
										 |  |  |         } else { | 
					
						
							| 
									
										
										
										
											2009-10-04 04:05:40 -04:00
										 |  |  |             $this->log(LOG_ERR, 'Failed to connect to queue server'); | 
					
						
							| 
									
										
										
										
											2011-04-29 17:11:22 +02:00
										 |  |  |             // TRANS: Server exception thrown when no connection can be made to a queue server.
 | 
					
						
							|  |  |  |             throw new ServerException(_m('Failed to connect to queue server.')); | 
					
						
							| 
									
										
										
										
											2009-06-30 23:33:47 -04:00
										 |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-07-21 11:00:03 -07:00
										 |  |  |     function _publish($channel, $message) | 
					
						
							| 
									
										
										
										
											2009-06-30 23:33:47 -04:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2009-07-21 11:00:03 -07:00
										 |  |  |         $result = $this->con->send($channel, | 
					
						
							|  |  |  |                                    json_encode($message)); | 
					
						
							| 
									
										
										
										
											2009-06-30 23:33:47 -04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-07-21 11:00:03 -07:00
										 |  |  |         return $result; | 
					
						
							| 
									
										
										
										
											2011-04-29 17:11:22 +02:00
										 |  |  |         // @todo Parse and deal with result.
 | 
					
						
							| 
									
										
										
										
											2009-06-30 23:33:47 -04:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-07-21 11:00:03 -07:00
										 |  |  |     function _disconnect() | 
					
						
							| 
									
										
										
										
											2009-06-30 23:33:47 -04:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2009-07-21 11:00:03 -07:00
										 |  |  |         $this->con->disconnect(); | 
					
						
							| 
									
										
										
										
											2009-06-30 23:33:47 -04:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-07-21 11:00:03 -07:00
										 |  |  |     function _pathToChannel($path) | 
					
						
							| 
									
										
										
										
											2009-06-30 23:33:47 -04:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2009-07-21 11:00:03 -07:00
										 |  |  |         if (!empty($this->channelbase)) { | 
					
						
							|  |  |  |             array_unshift($path, $this->channelbase); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         return '/' . implode('/', $path); | 
					
						
							| 
									
										
										
										
											2009-06-30 23:33:47 -04:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2009-10-04 03:02:04 -04:00
										 |  |  | 
 | 
					
						
							|  |  |  |     function _getStompServer() | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2009-10-04 04:05:40 -04:00
										 |  |  |         return (!is_null($this->stompserver)) ? $this->stompserver : | 
					
						
							| 
									
										
										
										
											2009-10-04 03:02:04 -04:00
										 |  |  |         (!is_null($this->webserver)) ? $this->webserver : | 
					
						
							|  |  |  |         common_config('site', 'server'); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     function _getStompPort() | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2009-10-04 04:05:40 -04:00
										 |  |  |         return (!is_null($this->stompport)) ? $this->stompport : 61613; | 
					
						
							| 
									
										
										
										
											2009-10-04 03:02:04 -04:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     function _getStompUrl() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $server = $this->_getStompServer(); | 
					
						
							|  |  |  |         $port   = $this->_getStompPort(); | 
					
						
							|  |  |  |         return "tcp://$server:$port/"; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2011-04-29 17:11:22 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Add our version information to output | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @param array &$versions Array of version-data arrays | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @return boolean hook value | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     function onPluginVersion(&$versions) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $versions[] = array('name' => 'Orbited', | 
					
						
							| 
									
										
										
										
											2013-11-01 13:51:41 +01:00
										 |  |  |                             'version' => GNUSOCIAL_VERSION, | 
					
						
							| 
									
										
										
										
											2011-04-29 17:11:22 +02:00
										 |  |  |                             'author' => 'Evan Prodromou', | 
					
						
							|  |  |  |                             'homepage' => 'http://status.net/wiki/Plugin:Orbited', | 
					
						
							|  |  |  |                             'rawdescription' => | 
					
						
							|  |  |  |                             // TRANS: Plugin description.
 | 
					
						
							|  |  |  |                             _m('Plugin to make updates using Orbited and STOMP.')); | 
					
						
							|  |  |  |         return true; | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2009-06-30 23:33:47 -04:00
										 |  |  | } |