forked from GNUsocial/gnu-social
		
	
		
			
				
	
	
		
			147 lines
		
	
	
		
			4.3 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			147 lines
		
	
	
		
			4.3 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| /**
 | |
|  * Phergie
 | |
|  *
 | |
|  * 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
 | |
|  *
 | |
|  * @category  Phergie
 | |
|  * @package   Phergie_Plugin_Command
 | |
|  * @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_Plugin_Command
 | |
|  */
 | |
| 
 | |
| /**
 | |
|  * Handles parsing and execution of commands sent by users via messages sent
 | |
|  * to channels in which the bot is present or directly to the bot.
 | |
|  *
 | |
|  * @category Phergie
 | |
|  * @package  Phergie_Plugin_Command
 | |
|  * @author   Phergie Development Team <team@phergie.org>
 | |
|  * @license  http://phergie.org/license New BSD License
 | |
|  * @link     http://pear.phergie.org/package/Phergie_Plugin_Command
 | |
|  * @uses     extension reflection
 | |
|  * @uses     Phergie_Plugin_Message pear.phergie.org
 | |
|  */
 | |
| class Phergie_Plugin_Command extends Phergie_Plugin_Abstract
 | |
| {
 | |
|     /**
 | |
|      * Prefix for command method names
 | |
|      *
 | |
|      * @var string
 | |
|      */
 | |
|     const METHOD_PREFIX = 'onCommand';
 | |
| 
 | |
|     /**
 | |
|      * Cache for command lookups used to confirm that methods exist and
 | |
|      * parameter counts match
 | |
|      *
 | |
|      * @var array
 | |
|      */
 | |
|     protected $methods = array();
 | |
| 
 | |
|     /**
 | |
|      * Load the Message plugin
 | |
|      *
 | |
|      * @return void
 | |
|      */
 | |
|     public function onLoad()
 | |
|     {
 | |
|         $plugins = $this->getPluginHandler();
 | |
|         $plugins->getPlugin('Message');
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Populates the methods cache.
 | |
|      *
 | |
|      * @return void
 | |
|      */
 | |
|     public function populateMethodCache()
 | |
|     {
 | |
|         foreach ($this->getPluginHandler()->getPlugins() as $plugin) {
 | |
|             $reflector = new ReflectionClass($plugin);
 | |
|             foreach ($reflector->getMethods() as $method) {
 | |
|                 $name = $method->getName();
 | |
|                 if (strpos($name, self::METHOD_PREFIX) === 0
 | |
|                     && !isset($this->methods[$name])
 | |
|                 ) {
 | |
|                     $this->methods[$name] = array(
 | |
|                         'total' => $method->getNumberOfParameters(),
 | |
|                         'required' => $method->getNumberOfRequiredParameters()
 | |
|                     );
 | |
|                 }
 | |
|             }
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     /**
 | |
|      * Parses a given message and, if its format corresponds to that of a
 | |
|      * defined command, calls the handler method for that command with any
 | |
|      * provided parameters.
 | |
|      *
 | |
|      * @return void
 | |
|      */
 | |
|     public function onPrivmsg()
 | |
|     {
 | |
|         // Populate the methods cache if needed
 | |
|         if (empty($this->methods)) {
 | |
|             $this->populateMethodCache();
 | |
|         }
 | |
| 
 | |
|         // Check for a prefixed message
 | |
|         $msg = $this->plugins->message->getMessage();
 | |
|         if ($msg === false) {
 | |
|             return;
 | |
|         }
 | |
| 
 | |
|         // Separate the command and arguments
 | |
|         $parsed = preg_split('/\s+/', $msg, 2);
 | |
|         $command = strtolower(array_shift($parsed));
 | |
|         $args = count($parsed) ? array_shift($parsed) : '';
 | |
| 
 | |
|         // Resolve aliases to their corresponding commands
 | |
|         $aliases = $this->getConfig('command.aliases', array());
 | |
|         $result = preg_grep('/^' . preg_quote($command, '/') . '$/i', array_keys($aliases));
 | |
|         if ($result) {
 | |
|             $command = $aliases[array_shift($result)];
 | |
|         }
 | |
| 
 | |
|         // Check to ensure the command exists
 | |
|         $method = self::METHOD_PREFIX . ucfirst($command);
 | |
|         if (empty($this->methods[$method])) {
 | |
|             return;
 | |
|         }
 | |
| 
 | |
|         // If no arguments are passed...
 | |
|         if (empty($args)) {
 | |
| 
 | |
|             // If the method requires no arguments, call it
 | |
|             if (empty($this->methods[$method]['required'])) {
 | |
|                 $this->getPluginHandler()->$method();
 | |
|             }
 | |
| 
 | |
|         } else {
 | |
|             // If arguments are passed...
 | |
| 
 | |
|             // Parse the arguments
 | |
|             $args = preg_split('/\s+/', $args, $this->methods[$method]['total']);
 | |
| 
 | |
|             // If the minimum arguments are passed, call the method
 | |
|             if ($this->methods[$method]['required'] <= count($args)) {
 | |
|                 call_user_func_array(
 | |
|                     array($this->getPluginHandler(), $method),
 | |
|                     $args
 | |
|                 );
 | |
|             }
 | |
|         }
 | |
|     }
 | |
| }
 |