From cb9e38d97b1350de5ce77a3c9f665c14f92dbb91 Mon Sep 17 00:00:00 2001 From: Shav Kinderlehrer Date: Sat, 22 Jun 2024 14:16:15 -0400 Subject: [PATCH] Add weather api and daemonize clock --- flake.nix | 1 - src/__pycache__/clock.cpython-311.pyc | Bin 0 -> 4076 bytes src/__pycache__/weather.cpython-311.pyc | Bin 0 -> 1999 bytes src/clock.py | 87 ++++++++++++++++++++++++ src/main.py | 31 ++++----- src/weather.py | 28 ++++++++ 6 files changed, 129 insertions(+), 18 deletions(-) create mode 100644 src/__pycache__/clock.cpython-311.pyc create mode 100644 src/__pycache__/weather.cpython-311.pyc create mode 100644 src/clock.py create mode 100644 src/weather.py diff --git a/flake.nix b/flake.nix index f238a93..e36d35f 100644 --- a/flake.nix +++ b/flake.nix @@ -18,7 +18,6 @@ pyright black ]; - OPENAI_API_BASE="https://ai.trkt.in"; shellHook = '' source .env.sh exec ${shell} diff --git a/src/__pycache__/clock.cpython-311.pyc b/src/__pycache__/clock.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5c1fcd286b98dccee4db2f9eeb481af8dc93cf07 GIT binary patch literal 4076 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 Ld4K-Hf^W!QZCAq# literal 0 HcmV?d00001 diff --git a/src/clock.py b/src/clock.py new file mode 100644 index 0000000..be50629 --- /dev/null +++ b/src/clock.py @@ -0,0 +1,87 @@ +from time import sleep +import datetime as dt +from datetime import datetime +from openai import OpenAI +import threading + +number_map = { + "0": "o'clock", + "1": "one", + "2": "two", + "3": "three", + "4": "four", + "5": "six", + "6": "six", + "7": "seven", + "8": "eight", + "9": "nine", + "10": "ten", + "11": "eleven", + "12": "twelve", + "13": "thirteen", + "14": "fourteen", + "15": "fifteen", + "16": "sixteen", + "17": "seventeen", + "18": "eighteen", + "19": "nineteen", + "20": "twenty", + "30": "thirty", + "40": "forty", + "50": "fifty", +} + + +class Clock: + def __init__(self): + pass + + def serialize_time_part(self, part): + part_string = "" + if part in number_map: + part_string += number_map[part] + else: + tens_str = number_map[f"{part[0]}0"] + ones_str = number_map[part[1]] + part_string += f"{tens_str}-{ones_str}" + return part_string + + def serialize_time(self, time): + hour = str(time.hour) + if time.hour > 12: + hour = str(time.hour - 12) + hour = self.serialize_time_part(hour) + minute = str(time.minute) + if time.minute < 10: + minute = f"o'{self.serialize_time_part(minute)}" + else: + minute = self.serialize_time_part(minute) + time_string = f"{hour} {minute}" + return time_string + + def generate_rhyme(self, time): + client = OpenAI() + response = client.chat.completions.create( + model="gpt-4", + messages=[ + { + "role": "user", + "content": f"Finish this sentence about the time with a rhyme. It's {time}, ", + } + ], + ) + rhyme = response.choices[0].message.content + return f"It's {time}, {rhyme}" + + def start_update_loop(self): + thread = threading.Thread(target=self.update_loop) + thread.daemon = True + thread.start() + + def update_loop(self): + while True: + now = datetime.now() + then = datetime(now.year, now.month, now.day, now.hour, now.minute + 1, 0) + seconds_until = (then - now).total_seconds() + print(seconds_until) + sleep(1) diff --git a/src/main.py b/src/main.py index d58784c..f7a5ab9 100644 --- a/src/main.py +++ b/src/main.py @@ -1,10 +1,11 @@ -import os -from pyowm.owm import OWM +from weather import Weather +from time import sleep +from clock import Clock from openai import OpenAI from datetime import datetime number_map = { - "0": "zero", + "0": "o'clock", "1": "one", "2": "two", "3": "three", @@ -68,23 +69,19 @@ def generate_rhyme(time): ], ) rhyme = response.choices[0].message.content - return f"It's {time} {rhyme}" - - -def get_weather(): - pass + return f"It's {time}, {rhyme}" def main(): - use_time = datetime.now() - serialized_time = serialize_time(use_time) - print(serialized_time) - sentence = generate_rhyme(serialized_time) - weather = get_weather() - - print(sentence) - print(weather) - + # weather_manager = Weather() + # weather_manager.start_update_loop() + # use_time = datetime.now() + # serialized_time = serialize_time(use_time) + # sentence = generate_rhyme(serialized_time) + clock_manager = Clock() + clock_manager.start_update_loop() + sleep(1000) + if __name__ == "__main__": main() diff --git a/src/weather.py b/src/weather.py new file mode 100644 index 0000000..8291678 --- /dev/null +++ b/src/weather.py @@ -0,0 +1,28 @@ +from time import sleep +import requests +import os +import threading + + +class Weather: + def __init__(self): + self.weather = self.get_weather() + + def get_weather(self): + api_key = os.environ["WEATHER_API_KEY"] + location = os.environ["WEATHER_LOCATION"] + units = "imperial" # TODO: Make environment variable + url = f"https://api.tomorrow.io/v4/weather/realtime?location={location}&units={units}&apikey={api_key}" + headers = {"accept": "application/json"} + response = requests.get(url, headers=headers) + return response.json() + + def start_update_loop(self): + thread = threading.Thread(target=self.update_loop) + thread.daemon = True + thread.start() + + def update_loop(self): + while True: + sleep(1200) + self.weather = self.get_weather()