diff options
Diffstat (limited to 'plugins/Irc/extlib/phergie/Phergie/Plugin/Weather.php')
-rw-r--r-- | plugins/Irc/extlib/phergie/Phergie/Plugin/Weather.php | 149 |
1 files changed, 149 insertions, 0 deletions
diff --git a/plugins/Irc/extlib/phergie/Phergie/Plugin/Weather.php b/plugins/Irc/extlib/phergie/Phergie/Plugin/Weather.php new file mode 100644 index 000000000..7d4f85a19 --- /dev/null +++ b/plugins/Irc/extlib/phergie/Phergie/Plugin/Weather.php @@ -0,0 +1,149 @@ +<?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_Weather + * @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_Weather + */ + +/** + * Detects and responds to requests for current weather conditions in a + * particular location using data from a web service. Requires registering + * with weather.com to obtain authentication credentials, which must be + * stored in the configuration settings weather.partner_id and + * weather.license_key for the plugin to function. + * + * @category Phergie + * @package Phergie_Plugin_Weather + * @author Phergie Development Team <team@phergie.org> + * @license http://phergie.org/license New BSD License + * @link http://pear.phergie.org/package/Phergie_Plugin_Weather + * @link http://www.weather.com/services/xmloap.html + * @uses Phergie_Plugin_Command pear.phergie.org + * @uses Phergie_Plugin_Http pear.phergie.org + * @uses Phergie_Plugin_Temperature pear.phergie.org + * @uses extension SimpleXML + */ +class Phergie_Plugin_Weather extends Phergie_Plugin_Abstract +{ + /** + * Checks for dependencies. + * + * @return void + */ + public function onLoad() + { + $plugins = $this->getPluginHandler(); + $plugins->getPlugin('Command'); + $plugins->getPlugin('Http'); + $plugins->getPlugin('Temperature'); + + if (empty($this->config['weather.partner_id']) + || empty($this->config['weather.license_key'])) { + $this->fail('weather.partner_id and weather.license_key must be specified'); + } + } + + /** + * Returns a weather report for a specified location. + * + * @param string $location Zip code or city/state/country specification + * + * @return void + */ + public function onCommandWeather($location) + { + $response = $this->plugins->http->get( + 'http://xoap.weather.com/search/search', + array('where' => $location) + ); + + if ($response->isError()) { + $this->doNotice( + $this->event->getNick(), + 'ERROR: ' . $response->getCode() . ' ' . $response->getMessage() + ); + return; + } + + $nick = $this->event->getNick(); + + $xml = $response->getContent(); + if (count($xml->loc) == 0) { + $this->doNotice($nick, 'No results for that location.'); + return; + } + + $where = (string) $xml->loc[0]['id']; + $response = $this->plugins->http->get( + 'http://xoap.weather.com/weather/local/' . $where, + array( + 'cc' => '*', + 'link' => 'xoap', + 'prod' => 'xoap', + 'par' => $this->config['weather.partner_id'], + 'key' => $this->config['weather.license_key'], + ) + ); + + if ($response->isError()) { + $this->doNotice( + $this->event->getNick(), + 'ERROR: ' . $response->getCode() . ' ' . $response->getMessage() + ); + return; + } + + $temperature = $this->plugins->getPlugin('Temperature'); + $xml = $response->getContent(); + $weather = 'Weather for ' . (string) $xml->loc->dnam . ' - '; + switch ($xml->head->ut) { + case 'F': + $tempF = $xml->cc->tmp; + $tempC = $temperature->convertFahrenheitToCelsius($tempF); + break; + case 'C': + $tempC = $xml->cc->tmp; + $tempF = $temperature->convertCelsiusToFahrenheit($tempC); + break; + default: + $this->doNotice( + $this->event->getNick(), + 'ERROR: No scale information given.'); + break; + } + $r = $xml->cc->hmid; + $hiF = $temperature->getHeatIndex($tempF, $r); + $hiC = $temperature->convertFahrenheitToCelsius($hiF); + $weather .= 'Temperature: ' . $tempF . 'F/' . $tempC . 'C'; + $weather .= ', Humidity: ' . (string) $xml->cc->hmid . '%'; + if ($hiF > $tempF || $hiC > $tempC) { + $weather .= ', Heat Index: ' . $hiF . 'F/' . $hiC . 'C'; + } + $weather .= + ', Conditions: ' . (string) $xml->cc->t . + ', Updated: ' . (string) $xml->cc->lsup . + ' [ http://weather.com/weather/today/' . + str_replace( + array('(', ')', ',', ' '), + array('', '', '', '+'), + (string) $xml->loc->dnam + ) . + ' ]'; + + $this->doPrivmsg($this->event->getSource(), $nick . ': ' . $weather); + } +} |