| 
									
										
										
										
											2010-07-26 11:13:00 -07:00
										 |  |  | <?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_Serve | 
					
						
							|  |  |  |  * @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_Serve | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /** | 
					
						
							|  |  |  |  * Processes requests to serve a user something from a database. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * @category Phergie | 
					
						
							|  |  |  |  * @package  Phergie_Plugin_Serve | 
					
						
							|  |  |  |  * @author   Phergie Development Team <team@phergie.org> | 
					
						
							|  |  |  |  * @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<target>[^\s]+)(\s+an?\s+)?(?P<suggestion>.*)?/', | 
					
						
							|  |  |  |             $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
 | 
					
						
							| 
									
										
										
										
											2010-08-04 16:02:24 -07:00
										 |  |  |         if ($this->plugins->hasPlugin('Censor')) { | 
					
						
							| 
									
										
										
										
											2010-07-26 11:13:00 -07:00
										 |  |  |             $plugin = $this->plugins->getPlugin('Censor'); | 
					
						
							| 
									
										
										
										
											2010-08-04 16:02:24 -07:00
										 |  |  |             $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.'); | 
					
						
							| 
									
										
										
										
											2010-07-26 11:13:00 -07:00
										 |  |  |             } | 
					
						
							| 
									
										
										
										
											2010-08-03 11:45:55 -07:00
										 |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-07-26 11:13:00 -07:00
										 |  |  |         // 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); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } |