# See readme.md for instructions on running this code. from __future__ import print_function import requests import json import os import sys from six.moves.configparser import SafeConfigParser class WeatherHandler(object): def __init__(self): self.directory = os.path.dirname(os.path.realpath(__file__)) + '/' self.config_name = '.weather_config' self.response_pattern = 'Weather in {}, {}:\n{} F / {} C\n{}' if not os.path.exists(self.directory + self.config_name): print('Weather bot config file not found, please set it up in {} file in this bot main directory' '\n\nUsing format:\n\n[weather-config]\nkey=\n\n'.format(self.config_name)) sys.exit(1) super(WeatherHandler, self).__init__() def usage(self): return ''' This plugin will give info about weather in a specified city ''' def handle_message(self, message, client, state_handler): help_content = ''' This bot returns weather info for specified city. You specify city in the following format: city, state/country state and country parameter is optional(useful when there are many cities with the same name) For example: @**Weather Bot** Portland @**Weather Bot** Portland, Me '''.strip() if (message['content'] == 'help') or (message['content'] == ''): response = help_content else: url = 'http://api.openweathermap.org/data/2.5/weather?q=' + message['content'] + '&APPID=' r = requests.get(url + get_weather_api_key_from_config(self.directory, self.config_name)) if "city not found" in r.text: response = "Sorry, city not found" else: response = format_response(r.text, message['content'], self.response_pattern) client.send_reply(message, response) def format_response(text, city, response_pattern): j = json.loads(text) city = j['name'] country = j['sys']['country'] fahrenheit = to_fahrenheit(j['main']['temp']) celsius = to_celsius(j['main']['temp']) description = j['weather'][0]['description'].title() return response_pattern.format(city, country, fahrenheit, celsius, description) def to_celsius(temp_kelvin): return int(temp_kelvin) - 273.15 def to_fahrenheit(temp_kelvin): return int(temp_kelvin) * 9 / 5 - 459.67 def get_weather_api_key_from_config(directory, config_name): config = SafeConfigParser() with open(directory + config_name, 'r') as config_file: config.readfp(config_file) return config.get("weather-config", "key") handler_class = WeatherHandler