diff --git a/home/default.nix b/home/default.nix index 0301485..0b709a0 100644 --- a/home/default.nix +++ b/home/default.nix @@ -4,10 +4,12 @@ ./bat.nix ./dunst.nix ./git.nix + ./gtk.nix ./hyprland.nix ./kitty.nix ./librewolf.nix ./neovim.nix ./waybar.nix + ./xresources.nix ]; } diff --git a/home/dunst.nix b/home/dunst.nix index 363da93..9a7a163 100644 --- a/home/dunst.nix +++ b/home/dunst.nix @@ -6,5 +6,23 @@ package = pkgs.papirus-icon-theme; name = "Papirus"; }; + settings = { + global = { + geometry = "1870x5-25+45"; + width = 350; + separator_height = 5; + padding = 24; + horizontal_padding = 24; + frame_width = 3; + idle_threshold = 120; + alignment = "center"; + word_wrap = "yes"; + transparency = 5; + format = "%s: %b"; + markup = "full"; + min_icon_size = 32; + max_icon_size = 128; + }; + }; }; } diff --git a/home/gtk.nix b/home/gtk.nix new file mode 100644 index 0000000..9c395f8 --- /dev/null +++ b/home/gtk.nix @@ -0,0 +1,21 @@ +{ pkgs, ... }: { + gtk = { + enable = true; + cursorTheme = { + package = pkgs.phinger-cursor; + name = "phinger-cursors"; + }; + gtk3.extraConfig = { + gtk-decoration-layout = "menu"; + gtk-xft-antialias = 1; + gtk-xft-hinting = 1; + gtk-xft-hintstyle = "hintfull"; + gtk-xft-rgba = "rgb"; + gtk-recent-files-enable = false; + }; + iconTheme = { + package = pkgs.fluent-icon-theme; + name = "Fluent-dark"; + }; + }; +} diff --git a/home/hyprland.nix b/home/hyprland.nix index b85895a..4aaa4e1 100644 --- a/home/hyprland.nix +++ b/home/hyprland.nix @@ -2,11 +2,17 @@ modifier = "SUPER"; in { xdg.configFile."hypr/hyprland.conf".text = '' - + + env = XDG_CURRENT_DESKTOP,Hyprland + env = XDG_SESSION_TYPE,wayland + env = XDG_SESSION_DESKTOP,hyprland + env = GDK_BACKEND,wayland + env = QT_QPA_PLATFORM,wayland + general { - gaps_in = 0 - gaps_out = -1 - border_size = 0 + gaps_in = 1 + gaps_out = 1 + border_size = 1 layout = master } @@ -31,7 +37,7 @@ in { special_scale_factor = 1 } - + exec-once = waybar $SUPER = ${modifier}; bind = $SUPER, Q, exec, kitty diff --git a/home/waybar.nix b/home/waybar.nix index 6deae20..693a4e1 100644 --- a/home/waybar.nix +++ b/home/waybar.nix @@ -1,429 +1,393 @@ { xdg.configFile."waybar/config".text = /* json */ '' - { "layer": "top", - "position": "bottom", - "height": 35, - "spacing": 4, - "margin-top": 0, - "margin-bottom":0, - - // Choose the order of the modules + "position": "top", + "mod": "dock", + "exclusive": true, + "passthrough": false, + "gtk-layer-shell": true, + "height": 0, + "modules-left": [ + "clock", + "custom/weather", + "wlr/workspaces" + ], + "modules-center": ["hyprland/window"], + "modules-right": [ + "tray", + "custom/updates", + "custom/language", + "battery", + "backlight", + "pulseaudio", + "pulseaudio#microphone" + ], - "modules-left":[ "custom/launcher", "wlr/taskbar"], - "modules-center":["custom/media"], - "modules-right":["backlight", "battery", "battery#bat2", "idle_inhibitor", "custom/updater", "pulseaudio", "custom/snip", "custom/wallpaper", "tray", "clock", "custom/power"], - // Modules configuration - - "wlr/taskbar": { - "format": "{icon}", - "icon-size": 20, - "icon-theme": "Star", - "tooltip-format": "{title}", + "hyprland/window": { + "format": "{}" + }, + "wlr/workspaces": { + "disable-scroll": true, + "all-outputs": true, "on-click": "activate", - "on-click-middle": "close", - "on-click-right": "minimize" - }, - "keyboard-state": { - "numlock": true, - "capslock": true, - "format": " {name} {icon}", - "format-icons": { - "locked": "", - "unlocked": "" + //"format": "{icon}", + "persistent_workspaces": { + "1": [], + "2": [], + "3": [], + "4": [], + "5": [], + "6": [], + "7": [], + "8": [], + "9": [], + "10": [] } }, - "sway/language": { - "format": " {}", + "custom/updates": { + "format": " {}", + "interval": 7200, // every two hours + "exec": "i=$(checkupdates); echo \"$i\" |wc -l; echo \"$i\" |column -t |tr '\n' '\r'", // # of updates and tooltip details + "exec-if": "exit 0", // always run; consider advanced run conditions + "on-click": "kitty -e sudo pacman -Syu", // update system + "signal": 8 }, - "idle_inhibitor": { - "format": "{icon}", - "format-icons": { - "activated": "", - "deactivated": "" - } + "custom/weather" : { + "tooltip" : true, + "format" : "{}", + "interval" : 30, + "exec" : "~/.config/waybar/waybar-wttr.py", + "return-type" : "json" }, "tray": { - "icon-size": 20, + "icon-size": 13, "spacing": 10 }, "clock": { - // "timezone": "America/New_York", - "tooltip-format": "{:%Y %B}\n{calendar}", - "format-alt": "{:%Y-%m-%d}" - }, - "cpu": { - "format": "{usage}% ", - "tooltip": false - }, - "memory": { - "format": "{}% " - }, - "temperature": { - // "thermal-zone": 2, - // "hwmon-path": "/sys/class/hwmon/hwmon2/temp1_input", - "critical-threshold": 80, - // "format-critical": "{temperatureC}°C {icon}", - "format": "{temperatureC}°C {icon}", - "format-icons": ["", "", ""] + "format": "{: %R  %d/%m}", + "tooltip-format": "{:%Y %B}\n{calendar}" }, "backlight": { - // "device": "acpi_video1", - "format": "{icon}", - "format-icons": ["", ""], - "on-click": "bash $HOME/.config/system_scripts/brightness up", - "on-click-right": "bash $HOME/.config/system_scripts/brightness down", - "on-scroll-up": "", - "on-scroll-down": "" + "device": "intel_backlight", + "format": "{icon} {percent}%", + "format-icons": ["", "", ""], + "on-scroll-up": "brightnessctl set 1%+", + "on-scroll-down": "brightnessctl set 1%-", + "min-length": 6 }, "battery": { "states": { - // "good": 95, + "good": 95, "warning": 30, - "critical": 15 + "critical": 20 }, - "format": "{icon}", - "format-charging": "{capacity}% ", - "format-plugged": "{capacity}% ", + "format": "{icon} {capacity}%", + "format-charging": " {capacity}%", + "format-plugged": " {capacity}%", "format-alt": "{time} {icon}", - // "format-good": "", // An empty format will hide the module - // "format-full": "", - "format-icons": ["", "", "", "", ""] - }, - "battery#bat2": { - "bat": "CMB1" - }, - "network": { - // "interface": "wlp2*", // (Optional) To force the use of this interface - "format-wifi": "{essid} ({signalStrength}%) ", - "format-ethernet": "Connected  ", - "tooltip-format": "{ifname} via {gwaddr} ", - "format-linked": "{ifname} (No IP) ", - "format-disconnected": "Disconnected ⚠", - "format-alt": "{ifname}: {ipaddr}/{cidr}", - "on-click-right": "bash ~/.config/rofi/wifi_menu/rofi_wifi_menu" + "format-icons": ["", "", "", "", "", "", "", "", "", "", ""] }, "pulseaudio": { - // "scroll-step": 1, // %, can be a float - "format": "{icon}", - "format-bluetooth": "{volume}% {icon}", - "format-bluetooth-muted": "{icon} {format_source}", - "format-muted": "{format_source}", - "format-source": "", - "format-source-muted": "", + "format": "{icon} {volume}%", + "tooltip": false, + "format-muted": " Muted", + "on-click": "pamixer -t", + "on-scroll-up": "pamixer -i 5", + "on-scroll-down": "pamixer -d 5", + "scroll-step": 5, "format-icons": { "headphone": "", - "hands-free": "", - "headset": "", - "phone": "", - "portable": "", + "hands-free": "", + "headset": "", + "phone": "", + "portable": "", "car": "", - "default": ["", "", ""] - }, - "on-click": "bash $HOME/.config/system_scripts/volume up", - "on-click-right": "bash $HOME/.config/system_scripts/volume down", - "on-scroll-up": "", - "on-scroll-down": "" + "default": ["", "", ""] + } }, - "custom/media": { - "format": "{icon} {}", - "return-type": "json", - "max-length": 30, - "format-icons": { - "spotify": " ", - "default": "" - }, - "escape": true, - "exec": "$HOME/.config/system_scripts/mediaplayer.py 2> /dev/null", - "on-click": "playerctl play-pause" - }, - "custom/launcher":{ - "format": "", - "on-click": "wofi --show drun", - "on-click-right": "killall wofi" - }, - "custom/power":{ - "format": " ", - "on-click": "nwg-bar", - "on-click-right": "killall nwg-bar" - }, - "custom/updater":{ - "format": "{} Updates", - "exec": "checkupdates | wc -l", - "exec-if": "[[ $(checkupdates | wc -l) != 0 ]]", - "interval": 15, - "on-click": "alacritty -e yay -Syu" - }, - "custom/snip":{ - "format": "", - "on-click": "grimshot --notify save area $HOME/Pictures/$(zenity --entry --text 'Set filename:' --entry-text '.png')" - }, - "custom/wallpaper":{ - "format": "", - "on-click": "bash ~/.config/system_scripts/pkill_bc" + "pulseaudio#microphone": { + "format": "{format_source}", + "format-source": " {volume}%", + "format-source-muted": " Muted", + "on-click": "pamixer --default-source -t", + "on-scroll-up": "pamixer --default-source -i 5", + "on-scroll-down": "pamixer --default-source -d 5", + "scroll-step": 5 } } ''; xdg.configFile."waybar/style.css".text = /* css */ '' * { border: none; - border-radius: 0px; - /* `otf-font-awesome` is required to be installed for icons */ - font-family: Material, Roboto, Helvetica, Arial, sans-serif; - font-size: 13px; + border-radius: 0; + font-family: Cartograph CF Nerd Font, monospace; + font-weight: bold; + font-size: 14px; min-height: 0; - /*border-radius: 20px;*/ - } + window#waybar { - background-image: linear-gradient(to right, #000000 0%, #434343 51%, #000000 100%); - color: #ffffff; - transition-property: background-color; - transition-duration: .5s; + background: rgba(21, 18, 27, 0); + color: #cdd6f4; } -window#waybar.hidden { - opacity: 0.2; +tooltip { + background: #1e1e2e; + border-radius: 10px; + border-width: 2px; + border-style: solid; + border-color: #11111b; } - #workspaces button { - background: #1f1f1f; - color: #ffffff; - border-radius: 20px; - + padding: 5px; + color: #313244; + margin-right: 5px; } -/* https://github.com/Alexays/Waybar/wiki/FAQ#the-workspace-buttons-have-a-strange-hover-effect */ -#workspaces button:hover { - background: lightblue; - color: black; - border-bottom: 3px solid #ffffff; - +#workspaces button.active { + color: #a6adc8; } #workspaces button.focused { - background: #1f1f1f; -} - -#workspaces button.focused:hover { - background: lightblue; - color: black; - border-bottom: 3px solid #ffffff; - + color: #a6adc8; + background: #eba0ac; + border-radius: 10px; } #workspaces button.urgent { - background-color: #eb4d4b; + color: #11111b; + background: #a6e3a1; + border-radius: 10px; } -#mode { - background-color: #64727D; - border-bottom: 3px solid #ffffff; +#workspaces button:hover { + background: #11111b; + color: #cdd6f4; + border-radius: 10px; } +#custom-language, +#custom-updates, +#custom-caffeine, +#custom-weather, +#window, #clock, #battery, -#cpu, -#memory, -#disk, -#temperature, -#backlight, -#network, #pulseaudio, -#custom-media, -#custom-launcher, -#custom-power, -#custom-wallpaper, -#custom-updater, -#custom-snip, -#taskbar, +#network, +#workspaces, #tray, -#mode, -#idle_inhibitor, -#mpd { - padding: 0 10px; - color: #ffffff; +#backlight { + background: #1e1e2e; + padding: 0px 10px; + margin: 3px 0px; + margin-top: 10px; + border: 1px solid #181825; +} + +#tray { + border-radius: 10px; + margin-right: 10px; } -#window, #workspaces { - margin: 0px 4px; + background: #1e1e2e; + border-radius: 10px; + margin-left: 10px; + padding-right: 0px; + padding-left: 5px; } -/* If workspaces is the leftmost module, omit left margin */ -.modules-left > widget:first-child > #workspaces { - margin-left: 0px; +#custom-caffeine { + color: #89dceb; + border-radius: 10px 0px 0px 10px; + border-right: 0px; + margin-left: 10px; } -/* If workspaces is the rightmost module, omit right margin */ -.modules-right > widget:last-child > #workspaces { - margin-right: 0px; +#custom-language { + color: #f38ba8; + border-left: 0px; + border-right: 0px; +} + +#custom-updates { + color: #f5c2e7; + border-radius: 10px 0px 0px 10px; + border-left: 0px; + border-right: 0px; +} + +#window { + border-radius: 10px; + margin-left: 60px; + margin-right: 60px; } #clock { - background-color: #090909; - color: #ffffff; + color: #fab387; + border-radius: 10px 0px 0px 10px; + margin-left: 5px; + border-right: 0px; } -#battery { - background-color: #ffffff; - color: #000000; -} - -#battery.charging, #battery.plugged { - color: #ffffff; - background-color: #26A65B; -} - -@keyframes blink { - to { - background-color: #ffffff; - color: #000000; - } -} - -#battery.critical:not(.charging) { - background-color: #f53c3c; - color: #ffffff; - animation-name: blink; - animation-duration: 0.5s; - animation-timing-function: linear; - animation-iteration-count: infinite; - animation-direction: alternate; -} - -label:focus { - background-color: #000000; -} - -#cpu { - color: #ffffff; -} - -#memory { - color: #ffffff; -} - -#disk { - color: #ffffff; -} - -#backlight { - background-color: #90b1b1; +#network { + color: #f9e2af; + border-left: 0px; + border-right: 0px; } #pulseaudio { - color: #ffffff; - font-size: 18px; + color: #89b4fa; + border-left: 0px; + border-right: 0px; } -#pulseaudio.muted { - color: red; -} - -#custom-media { - color: whitesmoke; - margin: 5px; - font-size: 13px; -} - -#custom-media.custom-spotify { - background-color: #8EC5FC; - background-image: linear-gradient(to right, #434343 0%, #000000 51%, #434343 100%); - color: whitesmoke; +#pulseaudio.microphone { + color: #cba6f7; + border-radius: 0px 10px 10px 0px; + border-left: 0px; + border-right: 0px; margin-right: 5px; } -#custom-media.custom-vlc { - background-color: #8EC5FC; - background-image: linear-gradient(to right, #434343 0%, #000000 51%, #434343 100%); - color: whitesmoke; - margin-right: 5px; +#battery { + color: #a6e3a1; + border-radius: 0 10px 10px 0; + margin-right: 10px; + border-left: 0px; } -#custom-power{ - background-image: linear-gradient(to left, #000000 0%, #000000 51%, #434343 100%); - font-size: 20px; - margin-right: 5px; - +#custom-weather { + border-radius: 0px 10px 10px 0px; + border-right: 0px; + margin-left: 0px; } -#custom-launcher{ - background-image: linear-gradient(to right, #000000 0%, #000000 51%, #434343 100%); - font-size: 20px; - margin-left: 5px; + ''; + xdg.configFile."waybar/waybar-wttr.py".text = /* python */ '' +#!/usr/bin/env python + +import json +import requests +from datetime import datetime + +WEATHER_CODES = { + '113': '☀️ ', + '116': '⛅ ', + '119': '☁️ ', + '122': '☁️ ', + '143': '☁️ ', + '176': '🌧️', + '179': '🌧️', + '182': '🌧️', + '185': '🌧️', + '200': '⛈️ ', + '227': '🌨️', + '230': '🌨️', + '248': '☁️ ', + '260': '☁️ ', + '263': '🌧️', + '266': '🌧️', + '281': '🌧️', + '284': '🌧️', + '293': '🌧️', + '296': '🌧️', + '299': '🌧️', + '302': '🌧️', + '305': '🌧️', + '308': '🌧️', + '311': '🌧️', + '314': '🌧️', + '317': '🌧️', + '320': '🌨️', + '323': '🌨️', + '326': '🌨️', + '329': '❄️ ', + '332': '❄️ ', + '335': '❄️ ', + '338': '❄️ ', + '350': '🌧️', + '353': '🌧️', + '356': '🌧️', + '359': '🌧️', + '362': '🌧️', + '365': '🌧️', + '368': '🌧️', + '371': '❄️', + '374': '🌨️', + '377': '🌨️', + '386': '🌨️', + '389': '🌨️', + '392': '🌧️', + '395': '❄️ ' } -#custom-wallpaper{ - color: white; - font-size:18px; -} +data = {} -#custom-updater { - color: white; -} -#custom-snip { - color: white; - font-size: 20px; -} +weather = requests.get("https://wttr.in/?format=j1").json() -#taskbar{ - color: white; -} -#temperature { - color: #ffffff; -} +def format_time(time): + return time.replace("00", "").zfill(2) -#temperature.critical { - background-color: #eb4d4b; -} - -#tray { - color: #ffffff; -} -#tray > .passive { - -gtk-icon-effect: dim; - color: #ffffff; -} +def format_temp(temp): + return (hour['FeelsLikeF']+"°").ljust(3) -#tray > .needs-attention { - -gtk-icon-effect: highlight; - color: #ffffff; -} -#idle_inhibitor { - font-size: 18px; +def format_chances(hour): + chances = { + "chanceoffog": "Fog", + "chanceoffrost": "Frost", + "chanceofovercast": "Overcast", + "chanceofrain": "Rain", + "chanceofsnow": "Snow", + "chanceofsunshine": "Sunshine", + "chanceofthunder": "Thunder", + "chanceofwindy": "Wind" + } -} + conditions = [] + for event in chances.keys(): + if int(hour[event]) > 0: + conditions.append(chances[event]+" "+hour[event]+"%") + return ", ".join(conditions) -#idle_inhibitor.activated { - color: #ffffff; +tempint = int(weather['current_condition'][0]['FeelsLikeF']) +extrachar = "" +if tempint > 0 and tempint < 10: + extrachar = '+' -} -#language { - color: #ffffff; - min-width: 16px; -} +data['text'] = ' '+WEATHER_CODES[weather['current_condition'][0]['weatherCode']] + \ + " "+extrachar+weather['current_condition'][0]['FeelsLikeF']+"°" -#keyboard-state { - background: #97e1ad; - color: #000000; - min-width: 16px; -} +data['tooltip'] = f"{weather['current_condition'][0]['weatherDesc'][0]['value']} {weather['current_condition'][0]['temp_C']}°\n" +data['tooltip'] += f"Feels like: {weather['current_condition'][0]['FeelsLikeF']}°\n" +data['tooltip'] += f"Wind: {weather['current_condition'][0]['windspeedKmph']}Km/h\n" +data['tooltip'] += f"Humidity: {weather['current_condition'][0]['humidity']}%\n" +for i, day in enumerate(weather['weather']): + data['tooltip'] += f"\n" + if i == 0: + data['tooltip'] += "Today, " + if i == 1: + data['tooltip'] += "Tomorrow, " + data['tooltip'] += f"{day['date']}\n" + data['tooltip'] += f"⬆️ {day['maxtempF']}° ⬇️ {day['mintempF']}° " + data['tooltip'] += f"🌅 {day['astronomy'][0]['sunrise']} 🌇 {day['astronomy'][0]['sunset']}\n" + for hour in day['hourly']: + if i == 0: + if int(format_time(hour['time'])) < datetime.now().hour-2: + continue + data['tooltip'] += f"{format_time(hour['time'])} {WEATHER_CODES[hour['weatherCode']]} {format_temp(hour['FeelsLikeF'])} {hour['weatherDesc'][0]['value']}, {format_chances(hour)}\n" -#keyboard-state > label { - padding: 0px 5px; -} -#keyboard-state > label.locked { - background: rgba(0, 0, 0, 0.2); -} +print(json.dumps(data)) + ''; } diff --git a/home/xresources.nix b/home/xresources.nix new file mode 100644 index 0000000..5fa02ef --- /dev/null +++ b/home/xresources.nix @@ -0,0 +1,10 @@ +{ + xresources.properties = { + "Xft.hinting" = true; + "Xft.antialias" = true; + "Xft.autohint" = false; + "Xft.lcdfilter" = "lcddefault"; + "Xft.hintstyle" = "hintfull"; + "Xft.rgba" = "rgb"; + }; +} diff --git a/modules/packages.nix b/modules/packages.nix index 051ecec..6a48dd6 100644 --- a/modules/packages.nix +++ b/modules/packages.nix @@ -1,6 +1,7 @@ { config, pkgs, ... }: { environment.systemPackages = with pkgs; [ git + neofetch tree wget ]; diff --git a/scripts/waybar-wttr.py b/scripts/waybar-wttr.py new file mode 100644 index 0000000..90f428d --- /dev/null +++ b/scripts/waybar-wttr.py @@ -0,0 +1,120 @@ +#!/usr/bin/env python + +import json +import requests +from datetime import datetime + +WEATHER_CODES = { + '113': '☀️ ', + '116': '⛅ ', + '119': '☁️ ', + '122': '☁️ ', + '143': '☁️ ', + '176': '🌧️', + '179': '🌧️', + '182': '🌧️', + '185': '🌧️', + '200': '⛈️ ', + '227': '🌨️', + '230': '🌨️', + '248': '☁️ ', + '260': '☁️ ', + '263': '🌧️', + '266': '🌧️', + '281': '🌧️', + '284': '🌧️', + '293': '🌧️', + '296': '🌧️', + '299': '🌧️', + '302': '🌧️', + '305': '🌧️', + '308': '🌧️', + '311': '🌧️', + '314': '🌧️', + '317': '🌧️', + '320': '🌨️', + '323': '🌨️', + '326': '🌨️', + '329': '❄️ ', + '332': '❄️ ', + '335': '❄️ ', + '338': '❄️ ', + '350': '🌧️', + '353': '🌧️', + '356': '🌧️', + '359': '🌧️', + '362': '🌧️', + '365': '🌧️', + '368': '🌧️', + '371': '❄️', + '374': '🌨️', + '377': '🌨️', + '386': '🌨️', + '389': '🌨️', + '392': '🌧️', + '395': '❄️ ' +} + +data = {} + + +weather = requests.get("https://wttr.in/?format=j1").json() + + +def format_time(time): + return time.replace("00", "").zfill(2) + + +def format_temp(temp): + return (hour['FeelsLikeF']+"°").ljust(3) + + +def format_chances(hour): + chances = { + "chanceoffog": "Fog", + "chanceoffrost": "Frost", + "chanceofovercast": "Overcast", + "chanceofrain": "Rain", + "chanceofsnow": "Snow", + "chanceofsunshine": "Sunshine", + "chanceofthunder": "Thunder", + "chanceofwindy": "Wind" + } + + conditions = [] + for event in chances.keys(): + if int(hour[event]) > 0: + conditions.append(chances[event]+" "+hour[event]+"%") + return ", ".join(conditions) + +tempint = int(weather['current_condition'][0]['FeelsLikeF']) +extrachar = '' +if tempint > 0 and tempint < 10: + extrachar = '+' + + +data['text'] = ' '+WEATHER_CODES[weather['current_condition'][0]['weatherCode']] + \ + " "+extrachar+weather['current_condition'][0]['FeelsLikeF']+"°" + +data['tooltip'] = f"{weather['current_condition'][0]['weatherDesc'][0]['value']} {weather['current_condition'][0]['temp_C']}°\n" +data['tooltip'] += f"Feels like: {weather['current_condition'][0]['FeelsLikeF']}°\n" +data['tooltip'] += f"Wind: {weather['current_condition'][0]['windspeedKmph']}Km/h\n" +data['tooltip'] += f"Humidity: {weather['current_condition'][0]['humidity']}%\n" +for i, day in enumerate(weather['weather']): + data['tooltip'] += f"\n" + if i == 0: + data['tooltip'] += "Today, " + if i == 1: + data['tooltip'] += "Tomorrow, " + data['tooltip'] += f"{day['date']}\n" + data['tooltip'] += f"⬆️ {day['maxtempF']}° ⬇️ {day['mintempF']}° " + data['tooltip'] += f"🌅 {day['astronomy'][0]['sunrise']} 🌇 {day['astronomy'][0]['sunset']}\n" + for hour in day['hourly']: + if i == 0: + if int(format_time(hour['time'])) < datetime.now().hour-2: + continue + data['tooltip'] += f"{format_time(hour['time'])} {WEATHER_CODES[hour['weatherCode']]} {format_temp(hour['FeelsLikeF'])} {hour['weatherDesc'][0]['value']}, {format_chances(hour)}\n" + + +print(json.dumps(data)) +