| 
									
										
										
										
											2010-06-16 01:55:39 +01:00
										 |  |  | <?php | 
					
						
							|  |  |  | /** | 
					
						
							| 
									
										
										
										
											2010-06-30 09:33:29 -07:00
										 |  |  |  * Phergie | 
					
						
							| 
									
										
										
										
											2010-06-16 01:55:39 +01:00
										 |  |  |  * | 
					
						
							|  |  |  |  * PHP version 5 | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * LICENSE | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * This source file is subject to the new BSD license that is bundled | 
					
						
							|  |  |  |  * with this package in the file LICENSE. | 
					
						
							|  |  |  |  * It is also available through the world-wide-web at this URL: | 
					
						
							|  |  |  |  * http://phergie.org/license | 
					
						
							|  |  |  |  * | 
					
						
							| 
									
										
										
										
											2010-06-30 09:33:29 -07:00
										 |  |  |  * @category  Phergie | 
					
						
							| 
									
										
										
										
											2010-06-16 01:55:39 +01:00
										 |  |  |  * @package   Phergie | 
					
						
							|  |  |  |  * @author    Phergie Development Team <team@phergie.org> | 
					
						
							|  |  |  |  * @copyright 2008-2010 Phergie Development Team (http://phergie.org) | 
					
						
							|  |  |  |  * @license   http://phergie.org/license New BSD License | 
					
						
							|  |  |  |  * @link      http://pear.phergie.org/package/Phergie | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /** | 
					
						
							|  |  |  |  * Composite class for other components to represent the bot. | 
					
						
							|  |  |  |  * | 
					
						
							| 
									
										
										
										
											2010-06-30 09:33:29 -07:00
										 |  |  |  * @category Phergie | 
					
						
							| 
									
										
										
										
											2010-06-16 01:55:39 +01:00
										 |  |  |  * @package  Phergie | 
					
						
							|  |  |  |  * @author   Phergie Development Team <team@phergie.org> | 
					
						
							|  |  |  |  * @license  http://phergie.org/license New BSD License | 
					
						
							|  |  |  |  * @link     http://pear.phergie.org/package/Phergie | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | class Phergie_Bot | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Current version of Phergie | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     const VERSION = '2.0.1'; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Current driver instance | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @var Phergie_Driver_Abstract | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     protected $driver; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Current configuration instance | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @var Phergie_Config | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     protected $config; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							| 
									
										
										
										
											2010-06-30 09:33:29 -07:00
										 |  |  |      * Current connection handler instance | 
					
						
							| 
									
										
										
										
											2010-06-16 01:55:39 +01:00
										 |  |  |      * | 
					
						
							| 
									
										
										
										
											2010-06-30 09:33:29 -07:00
										 |  |  |      * @var Phergie_Connection_Handler | 
					
						
							| 
									
										
										
										
											2010-06-16 01:55:39 +01:00
										 |  |  |      */ | 
					
						
							|  |  |  |     protected $connections; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Current plugin handler instance | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @var Phergie_Plugin_Handler | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     protected $plugins; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Current event handler instance | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @var Phergie_Event_Handler | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     protected $events; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Current end-user interface instance | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @var Phergie_Ui_Abstract | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     protected $ui; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Current processor instance | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @var Phergie_Process_Abstract | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     protected $processor; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							| 
									
										
										
										
											2010-06-30 09:33:29 -07:00
										 |  |  |      * Returns a driver instance, creating one of the default class if | 
					
						
							| 
									
										
										
										
											2010-06-16 01:55:39 +01:00
										 |  |  |      * none has been set. | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @return Phergie_Driver_Abstract | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     public function getDriver() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         if (empty($this->driver)) { | 
					
						
							|  |  |  |             // Check if a driver has been defined in the configuration to use
 | 
					
						
							|  |  |  |             // as the default
 | 
					
						
							|  |  |  |             $config = $this->getConfig(); | 
					
						
							|  |  |  |             if (isset($config['driver'])) { | 
					
						
							|  |  |  |                 $class = 'Phergie_Driver_' . ucfirst($config['driver']); | 
					
						
							|  |  |  |             } else { | 
					
						
							|  |  |  |                 // Otherwise default to the Streams driver.
 | 
					
						
							|  |  |  |                 $class = 'Phergie_Driver_Streams'; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             $this->driver = new $class; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         return $this->driver; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Sets the driver instance to use. | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @param Phergie_Driver_Abstract $driver Driver instance | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @return Phergie_Bot Provides a fluent interface | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     public function setDriver(Phergie_Driver_Abstract $driver) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $this->driver = $driver; | 
					
						
							|  |  |  |         return $this; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Sets the configuration to use. | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @param Phergie_Config $config Configuration instance | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @return Phergie_Runner_Abstract Provides a fluent interface | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     public function setConfig(Phergie_Config $config) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $this->config = $config; | 
					
						
							|  |  |  |         return $this; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							| 
									
										
										
										
											2010-06-30 09:33:29 -07:00
										 |  |  |      * Returns the entire configuration in use or the value of a specific | 
					
						
							| 
									
										
										
										
											2010-06-16 01:55:39 +01:00
										 |  |  |      * configuration setting. | 
					
						
							|  |  |  |      * | 
					
						
							| 
									
										
										
										
											2010-06-30 09:33:29 -07:00
										 |  |  |      * @param string $index   Optional index of a specific configuration | 
					
						
							| 
									
										
										
										
											2010-06-16 01:55:39 +01:00
										 |  |  |      *        setting for which the corresponding value should be returned | 
					
						
							|  |  |  |      * @param mixed  $default Value to return if no match is found for $index | 
					
						
							|  |  |  |      * | 
					
						
							| 
									
										
										
										
											2010-06-30 09:33:29 -07:00
										 |  |  |      * @return mixed Value corresponding to $index or the entire | 
					
						
							| 
									
										
										
										
											2010-06-16 01:55:39 +01:00
										 |  |  |      *         configuration if $index is not specified | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     public function getConfig($index = null, $default = null) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         if (empty($this->config)) { | 
					
						
							|  |  |  |             $this->config = new Phergie_Config; | 
					
						
							|  |  |  |             $this->config->read('Settings.php'); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         if ($index !== null) { | 
					
						
							|  |  |  |             if (isset($this->config[$index])) { | 
					
						
							|  |  |  |                 return $this->config[$index]; | 
					
						
							|  |  |  |             } else { | 
					
						
							|  |  |  |                 return $default; | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         return $this->config; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Returns a plugin handler instance, creating it if it does not already | 
					
						
							|  |  |  |      * exist and using a default class if none has been set. | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @return Phergie_Plugin_Handler | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     public function getPluginHandler() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         if (empty($this->plugins)) { | 
					
						
							|  |  |  |             $this->plugins = new Phergie_Plugin_Handler( | 
					
						
							|  |  |  |                 $this->getConfig(), | 
					
						
							|  |  |  |                 $this->getEventHandler() | 
					
						
							|  |  |  |             ); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         return $this->plugins; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Sets the plugin handler instance to use. | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @param Phergie_Plugin_Handler $handler Plugin handler instance | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @return Phergie_Bot Provides a fluent interface | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     public function setPluginHandler(Phergie_Plugin_Handler $handler) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $this->plugins = $handler; | 
					
						
							|  |  |  |         return $this; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Returns an event handler instance, creating it if it does not already | 
					
						
							|  |  |  |      * exist and using a default class if none has been set. | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @return Phergie_Event_Handler | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     public function getEventHandler() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         if (empty($this->events)) { | 
					
						
							|  |  |  |             $this->events = new Phergie_Event_Handler; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         return $this->events; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Sets the event handler instance to use. | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @param Phergie_Event_Handler $handler Event handler instance | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @return Phergie_Bot Provides a fluent interface | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     public function setEventHandler(Phergie_Event_Handler $handler) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $this->events = $handler; | 
					
						
							|  |  |  |         return $this; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							| 
									
										
										
										
											2010-06-30 09:33:29 -07:00
										 |  |  |      * Returns a connection handler instance, creating it if it does not | 
					
						
							| 
									
										
										
										
											2010-06-16 01:55:39 +01:00
										 |  |  |      * already exist and using a default class if none has been set. | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @return Phergie_Connection_Handler | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     public function getConnectionHandler() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         if (empty($this->connections)) { | 
					
						
							|  |  |  |             $this->connections = new Phergie_Connection_Handler; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         return $this->connections; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Sets the connection handler instance to use. | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @param Phergie_Connection_Handler $handler Connection handler instance | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @return Phergie_Bot Provides a fluent interface | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     public function setConnectionHandler(Phergie_Connection_Handler $handler) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $this->connections = $handler; | 
					
						
							|  |  |  |         return $this; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							| 
									
										
										
										
											2010-06-30 09:33:29 -07:00
										 |  |  |      * Returns an end-user interface instance, creating it if it does not | 
					
						
							| 
									
										
										
										
											2010-06-16 01:55:39 +01:00
										 |  |  |      * already exist and using a default class if none has been set. | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @return Phergie_Ui_Abstract | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     public function getUi() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         if (empty($this->ui)) { | 
					
						
							|  |  |  |             $this->ui = new Phergie_Ui_Console; | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         return $this->ui; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Sets the end-user interface instance to use. | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @param Phergie_Ui_Abstract $ui End-user interface instance | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @return Phergie_Bot Provides a fluent interface | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     public function setUi(Phergie_Ui_Abstract $ui) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $this->ui = $ui; | 
					
						
							|  |  |  |         return $this; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							| 
									
										
										
										
											2010-06-30 09:33:29 -07:00
										 |  |  |      * Returns a processer instance, creating one if none exists. | 
					
						
							| 
									
										
										
										
											2010-06-16 01:55:39 +01:00
										 |  |  |      * | 
					
						
							|  |  |  |      * @return Phergie_Process_Abstract | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     public function getProcessor() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         if (empty($this->processor)) { | 
					
						
							|  |  |  |             $class = 'Phergie_Process_Standard'; | 
					
						
							| 
									
										
										
										
											2010-06-30 09:33:29 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-06-16 01:55:39 +01:00
										 |  |  |             $type = $this->getConfig('processor'); | 
					
						
							|  |  |  |             if (!empty($type)) { | 
					
						
							|  |  |  |                 $class = 'Phergie_Process_' . ucfirst($type); | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             $this->processor = new $class( | 
					
						
							| 
									
										
										
										
											2010-06-30 09:33:29 -07:00
										 |  |  |                 $this, | 
					
						
							| 
									
										
										
										
											2010-06-16 01:55:39 +01:00
										 |  |  |                 $this->getConfig('processor.options', array()) | 
					
						
							|  |  |  |             ); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         return $this->processor; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Sets the processer instance to use. | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @param Phergie_Process_Abstract $processor Processer instance | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @return Phergie_Bot Provides a fluent interface | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     public function setProcessor(Phergie_Process_Abstract $processor) | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $this->processor = $processor; | 
					
						
							|  |  |  |         return $this; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Loads plugins into the plugin handler. | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @return void | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     protected function loadPlugins() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $config = $this->getConfig(); | 
					
						
							|  |  |  |         $plugins = $this->getPluginHandler(); | 
					
						
							|  |  |  |         $ui = $this->getUi(); | 
					
						
							| 
									
										
										
										
											2010-06-30 09:33:29 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-06-16 01:55:39 +01:00
										 |  |  |         $plugins->setAutoload($config['plugins.autoload']); | 
					
						
							|  |  |  |         foreach ($config['plugins'] as $name) { | 
					
						
							|  |  |  |             try { | 
					
						
							|  |  |  |                 $plugin = $plugins->addPlugin($name); | 
					
						
							|  |  |  |                 $ui->onPluginLoad($name); | 
					
						
							|  |  |  |             } catch (Phergie_Plugin_Exception $e) { | 
					
						
							|  |  |  |                 $ui->onPluginFailure($name, $e->getMessage()); | 
					
						
							|  |  |  |                 if (!empty($plugin)) { | 
					
						
							|  |  |  |                     $plugins->removePlugin($plugin); | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |             } | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							|  |  |  |      * Configures and establishes connections to IRC servers. | 
					
						
							|  |  |  |      * | 
					
						
							|  |  |  |      * @return void | 
					
						
							|  |  |  |      */ | 
					
						
							|  |  |  |     protected function loadConnections() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         $config = $this->getConfig(); | 
					
						
							|  |  |  |         $driver = $this->getDriver(); | 
					
						
							|  |  |  |         $connections = $this->getConnectionHandler(); | 
					
						
							|  |  |  |         $plugins = $this->getPluginHandler(); | 
					
						
							|  |  |  |         $ui = $this->getUi(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         foreach ($config['connections'] as $data) { | 
					
						
							|  |  |  |             $connection = new Phergie_Connection($data); | 
					
						
							|  |  |  |             $connections->addConnection($connection); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |             $ui->onConnect($data['host']); | 
					
						
							|  |  |  |             $driver->setConnection($connection)->doConnect(); | 
					
						
							|  |  |  |             $plugins->setConnection($connection); | 
					
						
							|  |  |  |             $plugins->onConnect(); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /** | 
					
						
							| 
									
										
										
										
											2010-06-30 09:33:29 -07:00
										 |  |  |      * Establishes server connections and initiates an execution loop to | 
					
						
							| 
									
										
										
										
											2010-06-16 01:55:39 +01:00
										 |  |  |      * continuously receive and process events. | 
					
						
							|  |  |  |      * | 
					
						
							| 
									
										
										
										
											2010-06-30 09:33:29 -07:00
										 |  |  |      * @return Phergie_Bot Provides a fluent interface | 
					
						
							| 
									
										
										
										
											2010-06-16 01:55:39 +01:00
										 |  |  |      */ | 
					
						
							|  |  |  |     public function run() | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         set_time_limit(0); | 
					
						
							| 
									
										
										
										
											2010-06-30 09:33:29 -07:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-06-16 01:55:39 +01:00
										 |  |  |         $timezone = $this->getConfig('timezone', 'UTC'); | 
					
						
							|  |  |  |         date_default_timezone_set($timezone); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $ui = $this->getUi(); | 
					
						
							|  |  |  |         $ui->setEnabled($this->getConfig('ui.enabled')); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $this->loadPlugins(); | 
					
						
							|  |  |  |         $this->loadConnections(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $processor = $this->getProcessor(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $connections = $this->getConnectionHandler(); | 
					
						
							|  |  |  |         while (count($connections)) { | 
					
						
							|  |  |  |             $processor->handleEvents(); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         $ui->onShutdown(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         return $this; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } |