diff options
Diffstat (limited to 'plugins/Irc/extlib/phergie/Phergie/Plugin/Lart.php')
-rw-r--r-- | plugins/Irc/extlib/phergie/Phergie/Plugin/Lart.php | 303 |
1 files changed, 303 insertions, 0 deletions
diff --git a/plugins/Irc/extlib/phergie/Phergie/Plugin/Lart.php b/plugins/Irc/extlib/phergie/Phergie/Plugin/Lart.php new file mode 100644 index 000000000..d00cae0dd --- /dev/null +++ b/plugins/Irc/extlib/phergie/Phergie/Plugin/Lart.php @@ -0,0 +1,303 @@ +<?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_Lart + * @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_Lart + */ + +/** + * Accepts terms and corresponding definitions for storage to a local data + * source and performs and returns the result of lookups for term definitions + * as they are requested. + * + * @category Phergie + * @package Phergie_Plugin_Lart + * @author Phergie Development Team <team@phergie.org> + * @license http://phergie.org/license New BSD License + * @link http://pear.phergie.org/package/Phergie_Plugin_Lart + * @uses Phergie_Plugin_Command pear.phergie.org + * @uses extension PDO + * @uses extension pdo_sqlite + */ +class Phergie_Plugin_Lart extends Phergie_Plugin_Abstract +{ + /** + * PDO instance for the database + * + * @var PDO + */ + protected $db; + + /** + * Prepared statement for inserting a new definition + * + * @var PDOStatement + */ + protected $save; + + /** + * Prepared statement for deleting the definition for a given term + * + * @var PDOStatement + */ + protected $delete; + + /** + * Prepared statement for searching for a definition for which the term + * matches as a regular expression against a given search string + * + * @var PDOStatement + */ + protected $process; + + /** + * Prepared statement for searching for a definition by its exact term + * + * @var PDOStatement + */ + protected $select; + + /** + * Checks for dependencies and initializes the database. + * + * @return void + */ + public function onLoad() + { + if (!extension_loaded('PDO') || !extension_loaded('pdo_sqlite')) { + $this->fail('PDO and pdo_sqlite extensions must be installed'); + } + + $this->plugins->getPlugin('Command'); + + $dir = dirname(__FILE__) . '/' . $this->getName(); + $path = $dir . '/lart.db'; + $exists = file_exists($path); + if (!$exists) { + mkdir($dir); + } + + try { + $this->db = new PDO('sqlite:' . $path); + } catch (PDO_Exception $e) { + throw new Phergie_Plugin_Exception($e->getMessage()); + } + + $this->db->sqliteCreateFunction('preg_match', 'preg_match'); + + if (!$exists) { + $this->db->exec(' + CREATE TABLE lart ( + name VARCHAR(255), + definition TEXT, + hostmask VARCHAR(50), + tstamp VARCHAR(19) + ) + '); + $this->db->exec(' + CREATE UNIQUE INDEX lart_name ON lart (name) + '); + } + + $this->save = $this->db->prepare(' + REPLACE INTO lart (name, definition, hostmask, tstamp) + VALUES (:name, :definition, :hostmask, :tstamp) + '); + + $this->process = $this->db->prepare(' + SELECT * + FROM lart + WHERE preg_match(name, :name) + '); + + $this->select = $this->db->prepare(' + SELECT * + FROM lart + WHERE name = :name + '); + + $this->delete = $this->db->prepare(' + DELETE FROM lart + WHERE name = :name + '); + } + + /** + * Retrieves the definition for a given term if it exists. + * + * @param string $term Term to search for + * + * @return mixed String containing the definition or FALSE if no definition + * exists + */ + protected function getLart($term) + { + $this->process->execute(array(':name' => $term)); + $row = $this->process->fetchObject(); + if ($row === false) { + return false; + } + preg_match($row->name, $term, $match); + $definition = preg_replace( + "/(?:\\\\|\\$)([0-9]+)/e", + '$match[\1]', + $row->definition + ); + $event = $this->getEvent(); + $definition = str_replace( + array('$source', '$nick'), + array($event->getSource(), $event->getNick()), + $definition + ); + return $definition; + } + + /** + * Deletes a given definition. + * + * @param string $term Term for which the definition should be deleted + * + * @return boolean TRUE if the definition was found and deleted, FALSE + * otherwise + */ + protected function deleteLart($term) + { + $this->delete->execute(array(':name' => $term)); + return ($this->delete->rowCount() > 0); + } + + /** + * Saves a given definition. + * + * @param string $term Term to trigger a response containing the + * corresponding definition, may be a regular expression + * @param string $definition Definition corresponding to the term + * + * @return boolean TRUE if the definition was saved successfully, FALSE + * otherwise + */ + protected function saveLart($term, $definition) + { + $data = array( + ':name' => $term, + ':definition' => $definition, + ':hostmask' => (string) $this->getEvent()->getHostmask(), + ':tstamp' => time() + ); + $this->save->execute($data); + return ($this->save->rowCount() > 0); + } + + /** + * Returns information about a definition. + * + * @param string $term Term about which to return information + * + * @return void + */ + public function onCommandLartinfo($term) + { + $this->select->execute(array(':name' => $term)); + $row = $this->select->fetchObject(); + $msg = $this->getEvent()->getNick() . ': '; + if (!$row) { + $msg .= 'Lart not found'; + } else { + $msg .= 'Term: ' . $row->name + . ', Definition: ' . $row->definition + . ', User: ' . $row->hostmask + . ', Added: ' . date('n/j/y g:i A', $row->tstamp); + } + $this->doNotice($this->getEvent()->getSource(), $msg); + } + + /** + * Creates a new definition. + * + * @param string $term Term to add + * @param string $definition Definition to add + * + * @return void + */ + public function onCommandAddlart($term, $definition) + { + $result = $this->saveLart($term, $definition); + if ($result) { + $msg = 'Lart saved successfully'; + } else { + $msg = 'Lart could not be saved'; + } + $this->doNotice($this->getEvent()->getSource(), $msg); + } + + /** + * Removes an existing definition. + * + * @param string $term Term for which the definition should be removed + * + * @return void + */ + public function onCommandDeletelart($term) + { + $source = $this->getEvent()->getSource(); + if ($this->deleteLart($term)) { + $msg = 'Lart deleted successfully'; + } else { + $msg = 'Lart not found'; + } + $this->doNotice($source, $msg); + } + + /** + * Processes definition triggers in the text of the current event. + * + * @return void + */ + protected function processLart() + { + $lart = $this->getLart($this->getEvent()->getText()); + if ($lart) { + if (strpos($lart, '/me') === 0) { + $lart = substr($lart, 4); + $method = 'doAction'; + } else { + $method = 'doPrivmsg'; + } + $this->$method($this->getEvent()->getSource(), $lart); + } + } + + /** + * Processes definition triggers in messages. + * + * @return void + */ + public function onPrivmsg() + { + $this->processLart(); + } + + /** + * Processes definition triggers in CTCP actions. + * + * @return void + */ + public function onAction() + { + $this->processLart(); + } +} |