.. _fbf.plugs.extra.weather: weather ~~~~~~~ .. automodule:: fbf.plugs.extra.weather :show-inheritance: :members: :undoc-members: CODE ---- :: # fbf/plugs/common/weather.py # # """ show weather based on Google's weather API """ __copyright__ = 'this file is in the public domain' __author__ = 'Landon Fowles' .. _fbf.plugs.extra.weather_fbf_imports: fbf imports -------------- :: from fbf.utils.url import geturl, geturl2 from fbf.utils.generic import getwho from fbf.lib.commands import cmnds from fbf.lib.persist import Persist from fbf.lib.examples import examples from fbf.lib.persiststate import UserState .. _fbf.plugs.extra.weather_basic_imports: basic imports ---------------- :: from xml.dom import minidom import urllib from urllib.parse import urlencode import logging import time .. _fbf.plugs.extra.weather_weather_command: weather command ------------------ :: def handle_weather(bot, ievent): """ show weather using Google's weather API """ userhost = "" loc = "" try: nick = ievent.rest if nick: userhost = getwho(bot, nick) if not userhost: pass else: try: name = bot.users.getname(userhost) if not name: ievent.reply("%s is not known with the bot" % nick) ; return us = UserState(name) loc = us['location'] except KeyError: ievent.reply("%s doesn't have his location set in userstate" % nick) ; return except KeyError: pass if not loc: if ievent.rest: loc = ievent.rest else: ievent.missing('|') ; return query = urlencode({'weather':loc}) try: weathertxt = geturl2('http://www.google.ca/ig/api?%s' % query) except urllib.error.HTTPError as ex: ievent.reply(str(ex)) ; return if 'problem_cause' in bytes(weathertxt, "utf-8"): logging.error(weathertxt) ievent.reply('an error occured looking up data for %s' % loc) return logging.debug("weather - got reply: %s" % weathertxt) resultstr = "" if weathertxt: gweather = minidom.parseString(weathertxt) gweather = gweather.getElementsByTagName('weather')[0] if ievent.usercmnd == "weather": info = gweather.getElementsByTagName('forecast_information')[0] if info: city = info.getElementsByTagName('city')[0].attributes["data"].value zip = info.getElementsByTagName('postal_code')[0].attributes["data"].value time = info.getElementsByTagName('current_date_time')[0].attributes["data"].value weather = gweather.getElementsByTagName('current_conditions')[0] condition = weather.getElementsByTagName('condition')[0].attributes["data"].value temp_f = weather.getElementsByTagName('temp_f')[0].attributes["data"].value temp_c = weather.getElementsByTagName('temp_c')[0].attributes["data"].value humidity = weather.getElementsByTagName('humidity')[0].attributes["data"].value try: wind = weather.getElementsByTagName('wind_condition')[0].attributes["data"].value except IndexError: wind = "" try: wind_km = round(int(wind[-6:-4]) * 1.609344) except ValueError: wind_km = "" if (not condition == ""): condition = " Oh, and it's " + condition + "." resultstr = "As of %s, %s (%s) has a temperature of %sC/%sF with %s. %s (%s km/h).%s" % (time, city, zip, temp_c, temp_f, humidity, wind, wind_km, condition) elif ievent.usercmnd == "forecast": forecasts = gweather.getElementsByTagName('forecast_conditions') for forecast in forecasts: condition = forecast.getElementsByTagName('condition')[0].attributes["data"].value low_f = forecast.getElementsByTagName('low')[0].attributes["data"].value high_f = forecast.getElementsByTagName('high')[0].attributes["data"].value day = forecast.getElementsByTagName('day_of_week')[0].attributes["data"].value low_c = round((int(low_f) - 32) * 5.0 / 9.0) high_c = round((int(high_f) - 32) * 5.0 / 9.0) resultstr += "[%s: F(%sl/%sh) C(%sl/%sh) %s]" % (day, low_f, high_f, low_c, high_c, condition) if not resultstr: ievent.reply('%s not found!' % loc) ; return else: ievent.reply(resultstr) cmnds.add('weather', handle_weather, ['OPER', 'USER', 'GUEST']) examples.add('weather', 'get weather for or ', '1) weather London, England 2) weather dunker')