"""Sets the monitor temperature based on the current time using Hyprsunset""" from os import environ from socket import AF_UNIX, SOCK_STREAM, socket from .evening import on_steam, Range, smoothstep, sunup_amount def setup_socket() -> socket: """Connects to the Hyprsunset socket""" hyprsunset = socket(AF_UNIX, SOCK_STREAM) hyprsunset.connect(f"{environ["XDG_RUNTIME_DIR"]}/hypr/{environ["HYPRLAND_INSTANCE_SIGNATURE"]}/.hyprsunset.sock") return hyprsunset def get_temperature(hyprsunset: socket) -> int: """Retrieves the current screen temperature""" # In theory the message might not send in one go, but in practice it does so I won't bother handling the error _ = hyprsunset.send(b"temperature") # 4 bytes should be enough but why not 8 for comfort # Just raise an error if it's not a number, nothing special to do here return int(hyprsunset.recv(8)) def set_temperature(hyprsunset: socket, temperature: float) -> None: """Sends a message to hyprsunset to set the temperature""" # In theory the message might not send in one go, but in practice it does so I won't bother handling the error _ = hyprsunset.send(f"temperature {temperature:.1f}".encode()) def main(temperature_range: Range, /, check_steam: bool = False) -> None: """Adjusts the monitor temperature based on the current time""" hyprsunset = setup_socket() temperature = int(smoothstep(sunup_amount(), temperature_range)) if temperature != get_temperature(hyprsunset): if check_steam and on_steam(): return set_temperature(hyprsunset, temperature)