* @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_Serve */ /** * Processes requests to serve a user something from a database. * * @category Phergie * @package Phergie_Plugin_Serve * @author Phergie Development Team * @license http://phergie.org/license New BSD License * @link http://pear.phergie.org/package/Phergie_Plugin_Serve * @uses extension pdo * @uses extension pdo_sqlite */ class Phergie_Plugin_Serve extends Phergie_Plugin_Abstract { /** * Checks for dependencies. * * @return void */ public function onLoad() { if (!extension_loaded('PDO') || !extension_loaded('pdo_sqlite')) { $this->fail('PDO and pdo_sqlite extensions must be installed'); } } /** * Retrieves a random item from the database table. * * @param string $database Path to the SQLite database file * @param string $table Name of the database table * @param array $request Parsed request * * @return object Retrieved item */ protected function getItem($database, $table, array $request) { $db = new PDO('sqlite:' . $database); if (!empty($request['suggestion'])) { $query = 'SELECT * FROM ' . $table . ' WHERE name LIKE ? ORDER BY RANDOM() LIMIT 1'; $stmt = $db->prepare($query); $stmt->execute(array('%' . $request['suggestion'] . '%')); $item = $stmt->fetchObject(); if (!$item) { $item = new stdClass; $item->name = $request['suggestion']; $item->link = null; } } else { $query = 'SELECT * FROM ' . $table . ' ORDER BY RANDOM() LIMIT 1'; $stmt = $db->query($query); $item = $stmt->fetchObject(); } return $item; } /** * Processes a request to serve a user something. * * @param string $database Path to the SQLite database file * @param string $table Name of the database table * @param string $format Format of the response where %target%, * %item%, %article%', and %link will be replaced with their * respective data * @param string $request Request string including the target and an * optional suggestion of the item to fetch * @param boolean $censor TRUE to integrate with the Censor plugin, * defaults to FALSE * * @return boolean TRUE if the request was processed successfully, FALSE * otherwise */ public function serve($database, $table, $format, $request, $censor = false) { // Parse the request $result = preg_match( '/(?P[^\s]+)(\s+an?\s+)?(?P.*)?/', $request, $match ); if (!$result) { return false; } // Resolve the target $target = $match['target']; if ($target == 'me') { $target = $this->event->getNick(); } // Process the request $item = $this->getItem($database, $table, $match); // Reprocess the request for censorship if required if ($this->plugins->hasPlugin('Censor')) { $plugin = $this->plugins->getPlugin('Censor'); $attempts = 0; while ($censor && $attempts < 3) { $clean = $plugin->cleanString($item->name); if ($item->name != $clean) { $attempts++; $item = $this->getItem($database, $table, $match); } else { $censor = false; } } if ($censor && $attempts == 3) { $this->doAction($this->event->getSource(), 'shrugs.'); } } // Derive the proper article for the item if (preg_match('/^[aeiou]/i', $item->name)) { $article = 'an'; } else { $article = 'a'; } // Format the message $replacements = array( 'target' => $target, 'item' => $item->name, 'link' => $item->link, 'article' => $article ); $msg = $format; foreach ($replacements as $placeholder => $value) { $msg = str_replace( '%' . $placeholder . '%', $value, $msg ); } // Send the message $this->doAction($this->event->getSource(), $msg); } }