From d97d02d31b91e3c85ef96933eafe43b8b40f9664 Mon Sep 17 00:00:00 2001 From: deepend-tildeclub <58404188+deepend-tildeclub@users.noreply.github.com> Date: Wed, 25 Sep 2024 09:48:55 -0600 Subject: [PATCH] Create weather_wttr.py wttr.in support for getting weather. --- weather_wttr.py | 63 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 63 insertions(+) create mode 100644 weather_wttr.py diff --git a/weather_wttr.py b/weather_wttr.py new file mode 100644 index 0000000..34d34bb --- /dev/null +++ b/weather_wttr.py @@ -0,0 +1,63 @@ +#--depends-on commands +#--depends-on location +#--Untested code + +from src import ModuleManager, utils + +WTTR_URL = "http://wttr.in" + +class Module(ModuleManager.BaseModule): + def _user_location(self, user): + user_location = user.get_setting("location", None) + if user_location: + name = user_location.get("name", None) + return [user_location["lat"], user_location["lon"], name] + + @utils.hook("received.command.w", alias_of="weather") + @utils.hook("received.command.weather") + def weather(self, event): + """ + :help: Get current weather for you or someone else + :usage: [nickname] + :require_setting: location + :require_setting_unless: 1 + """ + location = None + query = None + nickname = None + + if event["args"]: + query = event["args"] + if len(event["args_split"]) == 1 and event["server"].has_user_id(event["args_split"][0]): + target_user = event["server"].get_user(event["args_split"][0]) + location = self._user_location(target_user) + if location: + nickname = target_user.nickname + else: + location = self._user_location(event["user"]) + nickname = event["user"].nickname + if not location: + raise utils.EventError("You don't have a location set") + + if not location and query: + location_info = self.exports.get("get-location")(query) + if location_info: + location = [location_info["lat"], location_info["lon"], location_info.get("name", None)] + if not location: + raise utils.EventError("Unknown location") + + lat, lon, location_name = location + location_str = f"{lat},{lon}" + + # Requesting weather data from wttr.in + weather_url = f"{WTTR_URL}/{location_str}?format=3" + response = utils.http.request(weather_url).text.strip() + + if not response: + raise utils.EventResultsError("Failed to fetch weather data") + + # Formatting the output for the IRC bot + if nickname: + response = f"({nickname}) {response}" + + event["stdout"].write(response)