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('/^' . $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
|
|
);
|
|
}
|
|
}
|
|
}
|
|
}
|