diff --git a/hitomi/weather.py b/hitomi/weather.py new file mode 100644 index 0000000..36f84e3 --- /dev/null +++ b/hitomi/weather.py @@ -0,0 +1,54 @@ +"""Commands for the weather report.""" +import logging +from urllib.parse import quote + +from discord.ext import commands + +from hitomi import bot +from hitomi.backends import dr_botzo, DrBotzoError + +logger = logging.getLogger(__name__) + + +class Weather(commands.Cog): + """Commands for getting weather reports and whatnot.""" + + @commands.command() + async def weather(self, ctx, *, query): + """Try to look up the weather for the provided query.""" + await ctx.trigger_typing() + logger.info("query weather for: %s", query) + try: + response = dr_botzo.get(f'/weather/rpc/{quote(query)}/') + logger.debug("result of weather query: HTTP %s, %s", response.status_code, response.text) + weather = response.json() + output = (f"Weather in {weather['location']}: **{weather['current']['description']}**. " + f"**{weather['current']['temp_F']}/{weather['current']['temp_C']}**, " + f"feels like **{weather['current']['feels_like_temp_F']}/" + f"{weather['current']['feels_like_temp_C']}**. " + f"Wind **{weather['current']['wind_speed']}** " + f"from the **{weather['current']['wind_direction']}**. " + f"Visibility **{weather['current']['visibility']}**. " + f"Precipitation **{weather['current']['precipitation']}**. " + f"Pressure **{weather['current']['pressure']}**. " + f"Cloud cover **{weather['current']['cloud_cover']}**. " + f"UV index **{weather['current']['uv_index']}**. " + f"Today: {weather['today_forecast']['noteworthy']}, " + f"High {weather['today_forecast']['high_F']}/{weather['today_forecast']['high_C']}, " + f"Low {weather['today_forecast']['low_F']}/{weather['today_forecast']['low_C']}. " + f"Tomorrow: {weather['tomorrow_forecast']['noteworthy']}, " + f"High {weather['tomorrow_forecast']['high_F']}/{weather['tomorrow_forecast']['high_C']}, " + f"Low {weather['tomorrow_forecast']['low_F']}/{weather['tomorrow_forecast']['low_C']}. " + f"Day after tomorrow: {weather['day_after_tomorrow_forecast']['noteworthy']}, " + f"High {weather['day_after_tomorrow_forecast']['high_F']}/" + f"{weather['day_after_tomorrow_forecast']['high_C']}, " + f"Low {weather['day_after_tomorrow_forecast']['low_F']}/" + f"{weather['day_after_tomorrow_forecast']['low_C']}.") + + await ctx.send(output) + except DrBotzoError as drex: + logger.exception("received an error from dr.botzo attempting to weather query %s: %s", query, drex) + await ctx.send(f"*{drex.detail}*") + + +bot.add_cog(Weather(bot))