summaryrefslogtreecommitdiff
path: root/plugins/Irc/extlib/phergie/Phergie/Plugin/Help.php
diff options
context:
space:
mode:
Diffstat (limited to 'plugins/Irc/extlib/phergie/Phergie/Plugin/Help.php')
-rw-r--r--plugins/Irc/extlib/phergie/Phergie/Plugin/Help.php250
1 files changed, 250 insertions, 0 deletions
diff --git a/plugins/Irc/extlib/phergie/Phergie/Plugin/Help.php b/plugins/Irc/extlib/phergie/Phergie/Plugin/Help.php
new file mode 100644
index 000000000..0de13308d
--- /dev/null
+++ b/plugins/Irc/extlib/phergie/Phergie/Plugin/Help.php
@@ -0,0 +1,250 @@
+<?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_Help
+ * @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_Help
+ */
+
+/**
+ * Provides access to descriptions of plugins and the commands they provide.
+ *
+ * @category Phergie
+ * @package Phergie_Plugin_Help
+ * @author Phergie Development Team <team@phergie.org>
+ * @license http://phergie.org/license New BSD License
+ * @link http://pear.phergie.org/package/Phergie_Plugin_Help
+ * @uses Phergie_Plugin_Command pear.phergie.org
+ *
+ * @pluginDesc Provides access to plugin help information
+ */
+class Phergie_Plugin_Help extends Phergie_Plugin_Abstract
+{
+
+ /**
+ * Holds the registry of help data indexed by plugin name
+ *
+ * @var array
+ */
+ protected $registry;
+
+ /**
+ * Whether the registry has been alpha sorted
+ *
+ * @var bool
+ */
+ protected $registry_sorted = false;
+
+ /**
+ * Checks for dependencies.
+ *
+ * @return void
+ */
+ public function onLoad()
+ {
+ $this->getPluginHandler()->getPlugin('Command');
+ $this->register($this);
+ }
+
+ /**
+ * Displays a list of plugins with help information available or
+ * commands available for a specific plugin.
+ *
+ * @param string $plugin Short name of the plugin for which commands
+ * should be returned, else a list of plugins with help
+ * information available is returned
+ *
+ * @return void
+ *
+ * @pluginCmd Show all active plugins with help available
+ * @pluginCmd [plugin] Shows commands line for a specific plugin
+ */
+ public function onCommandHelp($plugin = null)
+ {
+ $nick = $this->getEvent()->getNick();
+
+ if (!$plugin) {
+ // protect from sorting the registry each time help is called
+ if (!$this->registry_sorted) {
+ asort($this->registry);
+ $this->registry_sorted = true;
+ }
+
+ $msg = 'These plugins below have help information available.';
+ $this->doPrivMsg($nick, $msg);
+
+ foreach ($this->registry as $plugin => $data) {
+ $this->doPrivMsg($nick, "{$plugin} - {$data['desc']}");
+ }
+ } else {
+ if (isset($this->getPluginHandler()->{$plugin})
+ && isset($this->registry[strtolower($plugin)]['cmd'])
+ ) {
+ $msg
+ = 'The ' .
+ $plugin .
+ ' plugin exposes the commands shown below.';
+ $this->doPrivMsg($nick, $msg);
+ if ($this->getConfig('command.prefix')) {
+ $msg
+ = 'Note that these commands must be prefixed with "' .
+ $this->getConfig('command.prefix') .
+ '" (without quotes) when issued in a public channel.';
+ $this->doPrivMsg($nick, $msg);
+ }
+
+ foreach ($this->registry[strtolower($plugin)]['cmd']
+ as $cmd => $descs
+ ) {
+ foreach ($descs as $desc) {
+ $this->doPrivMsg($nick, "{$cmd} {$desc}");
+ }
+ }
+
+ } else {
+ $this->doPrivMsg($nick, 'That plugin is not loaded.');
+ }
+ }
+ }
+
+ /**
+ * Sets the description for the plugin instance
+ *
+ * @param Phergie_Plugin_Abstract $plugin plugin instance
+ * @param string $description plugin description
+ *
+ * @return void
+ */
+ public function setPluginDescription(
+ Phergie_Plugin_Abstract $plugin,
+ $description
+ ) {
+ $this->registry[strtolower($plugin->getName())]
+ ['desc'] = $description;
+ }
+
+ /**
+ * Sets the description for the command on the plugin instance
+ *
+ * @param Phergie_Plugin_Abstract $plugin plugin instance
+ * @param string $command from onCommand method
+ * @param string $description command description
+ *
+ * @return void
+ */
+ public function setCommandDescription(
+ Phergie_Plugin_Abstract $plugin,
+ $command,
+ array $description
+ ) {
+ $this->registry[strtolower($plugin->getName())]
+ ['cmd'][$command] = $description;
+ }
+
+ /**
+ * registers the plugin with the help plugin. this will parse the docblocks
+ * for specific annotations that this plugin will respond with when
+ * queried.
+ *
+ * @param Phergie_Plugin_Abstract $plugin plugin instance
+ *
+ * @return void
+ */
+ public function register(Phergie_Plugin_Abstract $plugin)
+ {
+ $class = new ReflectionClass($plugin);
+
+ $annotations = self::parseAnnotations($class->getDocComment());
+ if (isset($annotations['pluginDesc'])) {
+ $this->setPluginDescription(
+ $plugin,
+ join(' ', $annotations['pluginDesc'])
+ );
+ }
+
+ foreach ($class->getMethods() as $method) {
+ if (strpos($method->getName(), 'onCommand') !== false) {
+ $annotations = self::parseAnnotations($method->getDocComment());
+ if (isset($annotations['pluginCmd'])) {
+ $cmd = strtolower(substr($method->getName(), 9));
+ $this->setCommandDescription(
+ $plugin,
+ $cmd,
+ $annotations['pluginCmd']
+ );
+ }
+ }
+ }
+ }
+
+ /**
+ * Taken from PHPUnit/Util/Test.php:436
+ *
+ * PHPUnit
+ *
+ * Copyright (c) 2002-2010, Sebastian Bergmann <sb@sebastian-bergmann.de>.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * * Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * * Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in
+ * the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * * Neither the name of Sebastian Bergmann nor the names of his
+ * contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
+ * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+ * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
+ * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ *
+ * @param string $docblock docblock to parse
+ *
+ * @return array
+ */
+ protected static function parseAnnotations($docblock)
+ {
+ $annotations = array();
+
+ $regex = '/@(?P<name>[A-Za-z_-]+)(?:[ \t]+(?P<value>.*?))?[ \t]*\r?$/m';
+
+ if (preg_match_all($regex, $docblock, $matches)) {
+ $numMatches = count($matches[0]);
+
+ for ($i = 0; $i < $numMatches; ++$i) {
+ $annotations[$matches['name'][$i]][] = $matches['value'][$i];
+ }
+ }
+
+ return $annotations;
+ }
+}