hyprland again, waybar updates, bluetooth updates, wallpaper updates
This commit is contained in:
@@ -17,6 +17,8 @@ in
|
|||||||
# Bluetooth
|
# Bluetooth
|
||||||
bluetooth.enable = lib.mkDefault true;
|
bluetooth.enable = lib.mkDefault true;
|
||||||
|
|
||||||
|
i2c.enable = true;
|
||||||
|
|
||||||
# Enable all firmware
|
# Enable all firmware
|
||||||
enableAllFirmware = lib.mkForce true;
|
enableAllFirmware = lib.mkForce true;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -135,7 +135,7 @@ in
|
|||||||
environment = {
|
environment = {
|
||||||
systemPackages = systemPackages;
|
systemPackages = systemPackages;
|
||||||
|
|
||||||
etc."lact/config.yaml".text = lactConfig;
|
# etc."lact/config.yaml".text = lactConfig;
|
||||||
|
|
||||||
variables = environmentVariables;
|
variables = environmentVariables;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -33,7 +33,7 @@ in
|
|||||||
# https://wiki.hyprland.org/Configuring/Binds/#mouse-buttons
|
# https://wiki.hyprland.org/Configuring/Binds/#mouse-buttons
|
||||||
|
|
||||||
bind = [
|
bind = [
|
||||||
"$mod, Return, exec, kitty"
|
"$mod, Return, exec, ${theme.defaultApps.terminal.pname}"
|
||||||
"$mod, SPACE, exec, wofi --show drun"
|
"$mod, SPACE, exec, wofi --show drun"
|
||||||
"$mod, Q, killactive, "
|
"$mod, Q, killactive, "
|
||||||
"$mod, M, exec, wlogout --protocol layer-shell"
|
"$mod, M, exec, wlogout --protocol layer-shell"
|
||||||
@@ -91,7 +91,7 @@ in
|
|||||||
"$mod SHIFT, k, movewindow, u"
|
"$mod SHIFT, k, movewindow, u"
|
||||||
"$mod SHIFT, j, movewindow, d"
|
"$mod SHIFT, j, movewindow, d"
|
||||||
|
|
||||||
"$mod, b, exec, firefox"
|
"$mod, b, exec, ${theme.defaultApps.browser.pname}"
|
||||||
];
|
];
|
||||||
|
|
||||||
bindm = [
|
bindm = [
|
||||||
@@ -198,6 +198,7 @@ in
|
|||||||
"float, title:(.*branchdialog.*)"
|
"float, title:(.*branchdialog.*)"
|
||||||
"float, class:(.*pavucontrol.*)"
|
"float, class:(.*pavucontrol.*)"
|
||||||
"move onscreen cursor 0% 0%, class:(.*pavucontrol.*)"
|
"move onscreen cursor 0% 0%, class:(.*pavucontrol.*)"
|
||||||
|
"float, class:(.*[Oo]verskride.*)"
|
||||||
"float, class:(.*FileRoller.*)"
|
"float, class:(.*FileRoller.*)"
|
||||||
"float, class:(.*wlogout.*)"
|
"float, class:(.*wlogout.*)"
|
||||||
"idleinhibit stayfocused, title:(.*mpv.*)"
|
"idleinhibit stayfocused, title:(.*mpv.*)"
|
||||||
@@ -214,6 +215,9 @@ in
|
|||||||
"float, class:(.*vesktop),title:(.*Discord Popout.*)"
|
"float, class:(.*vesktop),title:(.*Discord Popout.*)"
|
||||||
"pin, class:(.*vesktop),title:(.*Discord Popout.*)"
|
"pin, class:(.*vesktop),title:(.*Discord Popout.*)"
|
||||||
|
|
||||||
|
# Music
|
||||||
|
"workspace: name:discord, class:(Apple Music.*)"
|
||||||
|
|
||||||
# Steam
|
# Steam
|
||||||
"float, class:(.*[Ss]team), title:(.*[Ss]team.*)$"
|
"float, class:(.*[Ss]team), title:(.*[Ss]team.*)$"
|
||||||
"workspace name:steam silent, class:(.*[Ss]team), title:(.*[Ss]team.*)$"
|
"workspace name:steam silent, class:(.*[Ss]team), title:(.*[Ss]team.*)$"
|
||||||
@@ -276,11 +280,9 @@ in
|
|||||||
exec-once = systemctl --user import-environment WAYLAND_DISPLAY XDG_CURRENT_DESKTOP
|
exec-once = systemctl --user import-environment WAYLAND_DISPLAY XDG_CURRENT_DESKTOP
|
||||||
exec-once = /usr/lib/polkit-gnome/polkit-gnome-authentication-agent-1
|
exec-once = /usr/lib/polkit-gnome/polkit-gnome-authentication-agent-1
|
||||||
exec-once = xhost +SI:localuser:root
|
exec-once = xhost +SI:localuser:root
|
||||||
exec-once = bing-wallpaper
|
|
||||||
exec-once = nwg-look -a
|
exec-once = nwg-look -a
|
||||||
exec-once = nwg-dock-hyprland -d
|
exec-once = nwg-dock-hyprland -d
|
||||||
exec-once = nm-applet
|
exec-once = nm-applet
|
||||||
exec-once = blueberry-tray
|
|
||||||
exec-once = [silent] firefox
|
exec-once = [silent] firefox
|
||||||
exec-once = [silent] vesktop
|
exec-once = [silent] vesktop
|
||||||
exec-once = [silent] chromium --app="https://music.apple.com"
|
exec-once = [silent] chromium --app="https://music.apple.com"
|
||||||
|
|||||||
@@ -22,6 +22,9 @@ let
|
|||||||
'';
|
'';
|
||||||
in
|
in
|
||||||
{
|
{
|
||||||
|
imports = [
|
||||||
|
./scripts/weather.nix
|
||||||
|
];
|
||||||
# https://github.com/Alexays/Waybar/wiki/Module:-Hyprland
|
# https://github.com/Alexays/Waybar/wiki/Module:-Hyprland
|
||||||
# https://www.nerdfonts.com/cheat-sheet
|
# https://www.nerdfonts.com/cheat-sheet
|
||||||
|
|
||||||
@@ -53,6 +56,7 @@ in
|
|||||||
"keyboard-state#numlock"
|
"keyboard-state#numlock"
|
||||||
"pulseaudio"
|
"pulseaudio"
|
||||||
"pulseaudio#microphone"
|
"pulseaudio#microphone"
|
||||||
|
"bluetooth"
|
||||||
"clock"
|
"clock"
|
||||||
"custom/weather"
|
"custom/weather"
|
||||||
];
|
];
|
||||||
@@ -175,6 +179,22 @@ in
|
|||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
"bluetooth" = {
|
||||||
|
on-click = "overskride";
|
||||||
|
tooltip = true;
|
||||||
|
format = "{format-off}";
|
||||||
|
format-disabled = "";
|
||||||
|
format-off = "";
|
||||||
|
format-on = "";
|
||||||
|
format-connected = "";
|
||||||
|
tooltip-format = "{status}";
|
||||||
|
tooltip-format-disabled = "{status}";
|
||||||
|
tooltip-format-off = "{status}";
|
||||||
|
tooltip-format-on = "{status}";
|
||||||
|
tooltip-format-connected = "{status}";
|
||||||
|
tooltip-format-enumerate-connected = { };
|
||||||
|
};
|
||||||
|
|
||||||
"pulseaudio#microphone" = {
|
"pulseaudio#microphone" = {
|
||||||
format = "{format_source}";
|
format = "{format_source}";
|
||||||
format-source = "";
|
format-source = "";
|
||||||
@@ -286,11 +306,19 @@ in
|
|||||||
|
|
||||||
/* ------------- */
|
/* ------------- */
|
||||||
|
|
||||||
|
#bluetooth {
|
||||||
|
color: ${theme.nord.frost.nord9};
|
||||||
|
background-color: ${theme.nord.polarNight.nord0};
|
||||||
|
${defaultOpacity}
|
||||||
|
${borderRight}
|
||||||
|
}
|
||||||
|
|
||||||
#pulseaudio.microphone {
|
#pulseaudio.microphone {
|
||||||
color: ${theme.nord.frost.nord8};
|
color: ${theme.nord.frost.nord8};
|
||||||
background-color: ${theme.nord.polarNight.nord0};
|
background-color: ${theme.nord.polarNight.nord0};
|
||||||
${defaultOpacity}
|
${defaultOpacity}
|
||||||
${borderRight}
|
${defaultCenterOptions}
|
||||||
|
border-radius: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
#pulseaudio {
|
#pulseaudio {
|
||||||
|
|||||||
@@ -1,379 +0,0 @@
|
|||||||
#!/usr/bin/env nix-shell
|
|
||||||
#! nix-shell -i python3 --pure
|
|
||||||
#! nix-shell -p python3 python3Packages.requests
|
|
||||||
|
|
||||||
import json
|
|
||||||
from datetime import datetime
|
|
||||||
|
|
||||||
import requests
|
|
||||||
|
|
||||||
WWO_CODE = {
|
|
||||||
"113": "Sunny",
|
|
||||||
"116": "PartlyCloudy",
|
|
||||||
"119": "Cloudy",
|
|
||||||
"122": "VeryCloudy",
|
|
||||||
"143": "Fog",
|
|
||||||
"176": "LightShowers",
|
|
||||||
"179": "LightSleetShowers",
|
|
||||||
"182": "LightSleet",
|
|
||||||
"185": "LightSleet",
|
|
||||||
"200": "ThunderyShowers",
|
|
||||||
"227": "LightSnow",
|
|
||||||
"230": "HeavySnow",
|
|
||||||
"248": "Fog",
|
|
||||||
"260": "Fog",
|
|
||||||
"263": "LightShowers",
|
|
||||||
"266": "LightRain",
|
|
||||||
"281": "LightSleet",
|
|
||||||
"284": "LightSleet",
|
|
||||||
"293": "LightRain",
|
|
||||||
"296": "LightRain",
|
|
||||||
"299": "HeavyShowers",
|
|
||||||
"302": "HeavyRain",
|
|
||||||
"305": "HeavyShowers",
|
|
||||||
"308": "HeavyRain",
|
|
||||||
"311": "LightSleet",
|
|
||||||
"314": "LightSleet",
|
|
||||||
"317": "LightSleet",
|
|
||||||
"320": "LightSnow",
|
|
||||||
"323": "LightSnowShowers",
|
|
||||||
"326": "LightSnowShowers",
|
|
||||||
"329": "HeavySnow",
|
|
||||||
"332": "HeavySnow",
|
|
||||||
"335": "HeavySnowShowers",
|
|
||||||
"338": "HeavySnow",
|
|
||||||
"350": "LightSleet",
|
|
||||||
"353": "LightShowers",
|
|
||||||
"356": "HeavyShowers",
|
|
||||||
"359": "HeavyRain",
|
|
||||||
"362": "LightSleetShowers",
|
|
||||||
"365": "LightSleetShowers",
|
|
||||||
"368": "LightSnowShowers",
|
|
||||||
"371": "HeavySnowShowers",
|
|
||||||
"374": "LightSleetShowers",
|
|
||||||
"377": "LightSleet",
|
|
||||||
"386": "ThunderyShowers",
|
|
||||||
"389": "ThunderyHeavyRain",
|
|
||||||
"392": "ThunderySnowShowers",
|
|
||||||
"395": "HeavySnowShowers",
|
|
||||||
}
|
|
||||||
|
|
||||||
WEATHER_SYMBOL_EMOJI = {
|
|
||||||
"Unknown": "✨",
|
|
||||||
"Cloudy": "☁️",
|
|
||||||
"Fog": "🌫",
|
|
||||||
"HeavyRain": "🌧",
|
|
||||||
"HeavyShowers": "🌧",
|
|
||||||
"HeavySnow": "❄️",
|
|
||||||
"HeavySnowShowers": "❄️",
|
|
||||||
"LightRain": "🌦",
|
|
||||||
"LightShowers": "🌦",
|
|
||||||
"LightSleet": "🌧",
|
|
||||||
"LightSleetShowers": "🌧",
|
|
||||||
"LightSnow": "🌨",
|
|
||||||
"LightSnowShowers": "🌨",
|
|
||||||
"PartlyCloudy": "⛅️",
|
|
||||||
"Sunny": "☀️",
|
|
||||||
"ThunderyHeavyRain": "🌩",
|
|
||||||
"ThunderyShowers": "⛈",
|
|
||||||
"ThunderySnowShowers": "⛈",
|
|
||||||
"VeryCloudy": "☁️",
|
|
||||||
}
|
|
||||||
|
|
||||||
WEATHER_SYMBOL = {
|
|
||||||
"Unknown": "✨",
|
|
||||||
"Cloudy": "☁️",
|
|
||||||
"Fog": "🌫",
|
|
||||||
"HeavyRain": "🌧",
|
|
||||||
"HeavyShowers": "🌧",
|
|
||||||
"HeavySnow": "❄️",
|
|
||||||
"HeavySnowShowers": "❄️",
|
|
||||||
"LightRain": "🌦",
|
|
||||||
"LightShowers": "🌦",
|
|
||||||
"LightSleet": "🌧",
|
|
||||||
"LightSleetShowers": "🌧",
|
|
||||||
"LightSnow": "🌨",
|
|
||||||
"LightSnowShowers": "🌨",
|
|
||||||
"PartlyCloudy": "⛅️",
|
|
||||||
"Sunny": "☀️",
|
|
||||||
"ThunderyHeavyRain": "🌩",
|
|
||||||
"ThunderyShowers": "⛈",
|
|
||||||
"ThunderySnowShowers": "⛈",
|
|
||||||
"VeryCloudy": "☁️",
|
|
||||||
}
|
|
||||||
|
|
||||||
WEATHER_CODES = {key: WEATHER_SYMBOL[value] for key, value in WWO_CODE.items()}
|
|
||||||
|
|
||||||
WIND_DIRECTION = [
|
|
||||||
"↓", "↙", "←", "↖", "↑", "↗", "→", "↘",
|
|
||||||
]
|
|
||||||
|
|
||||||
MOON_PHASES = (
|
|
||||||
"🌑", "🌒", "🌓", "🌔", "🌕", "🌖", "🌗", "🌘"
|
|
||||||
)
|
|
||||||
|
|
||||||
WEATHER_SYMBOL_WI_DAY = {
|
|
||||||
"Unknown": "",
|
|
||||||
"Cloudy": "",
|
|
||||||
"Fog": "",
|
|
||||||
"HeavyRain": "",
|
|
||||||
"HeavyShowers": "",
|
|
||||||
"HeavySnow": "",
|
|
||||||
"HeavySnowShowers": "",
|
|
||||||
"LightRain": "",
|
|
||||||
"LightShowers": "",
|
|
||||||
"LightSleet": "",
|
|
||||||
"LightSleetShowers": "",
|
|
||||||
"LightSnow": "",
|
|
||||||
"LightSnowShowers": "",
|
|
||||||
"PartlyCloudy": "",
|
|
||||||
"Sunny": "",
|
|
||||||
"ThunderyHeavyRain": "",
|
|
||||||
"ThunderyShowers": "",
|
|
||||||
"ThunderySnowShowers": "",
|
|
||||||
"VeryCloudy": "",
|
|
||||||
}
|
|
||||||
|
|
||||||
WEATHER_CODES_WI_DAY = {key: WEATHER_SYMBOL_WI_DAY[value] for key, value in WWO_CODE.items()}
|
|
||||||
|
|
||||||
WEATHER_SYMBOL_WI_NIGHT = {
|
|
||||||
"Unknown": "",
|
|
||||||
"Cloudy": "",
|
|
||||||
"Fog": "",
|
|
||||||
"HeavyRain": "",
|
|
||||||
"HeavyShowers": "",
|
|
||||||
"HeavySnow": "",
|
|
||||||
"HeavySnowShowers": "",
|
|
||||||
"LightRain": "",
|
|
||||||
"LightShowers": "",
|
|
||||||
"LightSleet": "",
|
|
||||||
"LightSleetShowers": "",
|
|
||||||
"LightSnow": "",
|
|
||||||
"LightSnowShowers": "",
|
|
||||||
"PartlyCloudy": "",
|
|
||||||
"Sunny": "",
|
|
||||||
"ThunderyHeavyRain": "",
|
|
||||||
"ThunderyShowers": "",
|
|
||||||
"ThunderySnowShowers": "",
|
|
||||||
"VeryCloudy": "",
|
|
||||||
}
|
|
||||||
|
|
||||||
WEATHER_CODES_WI_NIGHT = {key: WEATHER_SYMBOL_WI_NIGHT[value] for key, value in WWO_CODE.items()}
|
|
||||||
|
|
||||||
WIND_DIRECTION_WI = [
|
|
||||||
"", "", "", "", "", "", "", "",
|
|
||||||
]
|
|
||||||
|
|
||||||
WIND_SCALE_WI = [
|
|
||||||
"", "", "", "", "", "", "", "", "", "", "", "", "",
|
|
||||||
]
|
|
||||||
|
|
||||||
MOON_PHASES_WI = (
|
|
||||||
"", "", "", "", "", "", "",
|
|
||||||
"", "", "", "", "", "", "",
|
|
||||||
"", "", "", "", "", "", "",
|
|
||||||
"", "", "", "", "", "", "",
|
|
||||||
)
|
|
||||||
|
|
||||||
WEATHER_SYMBOL_WEGO = {
|
|
||||||
"Unknown": [
|
|
||||||
" .-. ",
|
|
||||||
" __) ",
|
|
||||||
" ( ",
|
|
||||||
" `-’ ",
|
|
||||||
" • "],
|
|
||||||
"Sunny": [
|
|
||||||
"\033[38;5;226m \\ / \033[0m",
|
|
||||||
"\033[38;5;226m .-. \033[0m",
|
|
||||||
"\033[38;5;226m ― ( ) ― \033[0m",
|
|
||||||
"\033[38;5;226m `-’ \033[0m",
|
|
||||||
"\033[38;5;226m / \\ \033[0m"],
|
|
||||||
"PartlyCloudy": [
|
|
||||||
"\033[38;5;226m \\ /\033[0m ",
|
|
||||||
"\033[38;5;226m _ /\"\"\033[38;5;250m.-. \033[0m",
|
|
||||||
"\033[38;5;226m \\_\033[38;5;250m( ). \033[0m",
|
|
||||||
"\033[38;5;226m /\033[38;5;250m(___(__) \033[0m",
|
|
||||||
" "],
|
|
||||||
"Cloudy": [
|
|
||||||
" ",
|
|
||||||
"\033[38;5;250m .--. \033[0m",
|
|
||||||
"\033[38;5;250m .-( ). \033[0m",
|
|
||||||
"\033[38;5;250m (___.__)__) \033[0m",
|
|
||||||
" "],
|
|
||||||
"VeryCloudy": [
|
|
||||||
" ",
|
|
||||||
"\033[38;5;240;1m .--. \033[0m",
|
|
||||||
"\033[38;5;240;1m .-( ). \033[0m",
|
|
||||||
"\033[38;5;240;1m (___.__)__) \033[0m",
|
|
||||||
" "],
|
|
||||||
"LightShowers": [
|
|
||||||
"\033[38;5;226m _`/\"\"\033[38;5;250m.-. \033[0m",
|
|
||||||
"\033[38;5;226m ,\\_\033[38;5;250m( ). \033[0m",
|
|
||||||
"\033[38;5;226m /\033[38;5;250m(___(__) \033[0m",
|
|
||||||
"\033[38;5;111m ‘ ‘ ‘ ‘ \033[0m",
|
|
||||||
"\033[38;5;111m ‘ ‘ ‘ ‘ \033[0m"],
|
|
||||||
"HeavyShowers": [
|
|
||||||
"\033[38;5;226m _`/\"\"\033[38;5;240;1m.-. \033[0m",
|
|
||||||
"\033[38;5;226m ,\\_\033[38;5;240;1m( ). \033[0m",
|
|
||||||
"\033[38;5;226m /\033[38;5;240;1m(___(__) \033[0m",
|
|
||||||
"\033[38;5;21;1m ‚‘‚‘‚‘‚‘ \033[0m",
|
|
||||||
"\033[38;5;21;1m ‚’‚’‚’‚’ \033[0m"],
|
|
||||||
"LightSnowShowers": [
|
|
||||||
"\033[38;5;226m _`/\"\"\033[38;5;250m.-. \033[0m",
|
|
||||||
"\033[38;5;226m ,\\_\033[38;5;250m( ). \033[0m",
|
|
||||||
"\033[38;5;226m /\033[38;5;250m(___(__) \033[0m",
|
|
||||||
"\033[38;5;255m * * * \033[0m",
|
|
||||||
"\033[38;5;255m * * * \033[0m"],
|
|
||||||
"HeavySnowShowers": [
|
|
||||||
"\033[38;5;226m _`/\"\"\033[38;5;240;1m.-. \033[0m",
|
|
||||||
"\033[38;5;226m ,\\_\033[38;5;240;1m( ). \033[0m",
|
|
||||||
"\033[38;5;226m /\033[38;5;240;1m(___(__) \033[0m",
|
|
||||||
"\033[38;5;255;1m * * * * \033[0m",
|
|
||||||
"\033[38;5;255;1m * * * * \033[0m"],
|
|
||||||
"LightSleetShowers": [
|
|
||||||
"\033[38;5;226m _`/\"\"\033[38;5;250m.-. \033[0m",
|
|
||||||
"\033[38;5;226m ,\\_\033[38;5;250m( ). \033[0m",
|
|
||||||
"\033[38;5;226m /\033[38;5;250m(___(__) \033[0m",
|
|
||||||
"\033[38;5;111m ‘ \033[38;5;255m*\033[38;5;111m ‘ \033[38;5;255m* \033[0m",
|
|
||||||
"\033[38;5;255m *\033[38;5;111m ‘ \033[38;5;255m*\033[38;5;111m ‘ \033[0m"],
|
|
||||||
"ThunderyShowers": [
|
|
||||||
"\033[38;5;226m _`/\"\"\033[38;5;250m.-. \033[0m",
|
|
||||||
"\033[38;5;226m ,\\_\033[38;5;250m( ). \033[0m",
|
|
||||||
"\033[38;5;226m /\033[38;5;250m(___(__) \033[0m",
|
|
||||||
"\033[38;5;228;5m ⚡\033[38;5;111;25m‘ ‘\033[38;5;228;5m⚡\033[38;5;111;25m‘ ‘ \033[0m",
|
|
||||||
"\033[38;5;111m ‘ ‘ ‘ ‘ \033[0m"],
|
|
||||||
"ThunderyHeavyRain": [
|
|
||||||
"\033[38;5;240;1m .-. \033[0m",
|
|
||||||
"\033[38;5;240;1m ( ). \033[0m",
|
|
||||||
"\033[38;5;240;1m (___(__) \033[0m",
|
|
||||||
"\033[38;5;21;1m ‚‘\033[38;5;228;5m⚡\033[38;5;21;25m‘‚\033[38;5;228;5m⚡\033[38;5;21;25m‚‘ \033[0m",
|
|
||||||
"\033[38;5;21;1m ‚’‚’\033[38;5;228;5m⚡\033[38;5;21;25m’‚’ \033[0m"],
|
|
||||||
"ThunderySnowShowers": [
|
|
||||||
"\033[38;5;226m _`/\"\"\033[38;5;250m.-. \033[0m",
|
|
||||||
"\033[38;5;226m ,\\_\033[38;5;250m( ). \033[0m",
|
|
||||||
"\033[38;5;226m /\033[38;5;250m(___(__) \033[0m",
|
|
||||||
"\033[38;5;255m *\033[38;5;228;5m⚡\033[38;5;255;25m*\033[38;5;228;5m⚡\033[38;5;255;25m* \033[0m",
|
|
||||||
"\033[38;5;255m * * * \033[0m"],
|
|
||||||
"LightRain": [
|
|
||||||
"\033[38;5;250m .-. \033[0m",
|
|
||||||
"\033[38;5;250m ( ). \033[0m",
|
|
||||||
"\033[38;5;250m (___(__) \033[0m",
|
|
||||||
"\033[38;5;111m ‘ ‘ ‘ ‘ \033[0m",
|
|
||||||
"\033[38;5;111m ‘ ‘ ‘ ‘ \033[0m"],
|
|
||||||
"HeavyRain": [
|
|
||||||
"\033[38;5;240;1m .-. \033[0m",
|
|
||||||
"\033[38;5;240;1m ( ). \033[0m",
|
|
||||||
"\033[38;5;240;1m (___(__) \033[0m",
|
|
||||||
"\033[38;5;21;1m ‚‘‚‘‚‘‚‘ \033[0m",
|
|
||||||
"\033[38;5;21;1m ‚’‚’‚’‚’ \033[0m"],
|
|
||||||
"LightSnow": [
|
|
||||||
"\033[38;5;250m .-. \033[0m",
|
|
||||||
"\033[38;5;250m ( ). \033[0m",
|
|
||||||
"\033[38;5;250m (___(__) \033[0m",
|
|
||||||
"\033[38;5;255m * * * \033[0m",
|
|
||||||
"\033[38;5;255m * * * \033[0m"],
|
|
||||||
"HeavySnow": [
|
|
||||||
"\033[38;5;240;1m .-. \033[0m",
|
|
||||||
"\033[38;5;240;1m ( ). \033[0m",
|
|
||||||
"\033[38;5;240;1m (___(__) \033[0m",
|
|
||||||
"\033[38;5;255;1m * * * * \033[0m",
|
|
||||||
"\033[38;5;255;1m * * * * \033[0m"],
|
|
||||||
"LightSleet": [
|
|
||||||
"\033[38;5;250m .-. \033[0m",
|
|
||||||
"\033[38;5;250m ( ). \033[0m",
|
|
||||||
"\033[38;5;250m (___(__) \033[0m",
|
|
||||||
"\033[38;5;111m ‘ \033[38;5;255m*\033[38;5;111m ‘ \033[38;5;255m* \033[0m",
|
|
||||||
"\033[38;5;255m *\033[38;5;111m ‘ \033[38;5;255m*\033[38;5;111m ‘ \033[0m"],
|
|
||||||
"Fog": [
|
|
||||||
" ",
|
|
||||||
"\033[38;5;251m _ - _ - _ - \033[0m",
|
|
||||||
"\033[38;5;251m _ - _ - _ \033[0m",
|
|
||||||
"\033[38;5;251m _ - _ - _ - \033[0m",
|
|
||||||
" "],
|
|
||||||
}
|
|
||||||
|
|
||||||
data = {}
|
|
||||||
|
|
||||||
|
|
||||||
weather = requests.get("https://wttr.in/?u&format=j1").json()
|
|
||||||
moon = requests.get("https://wttr.in/?format=%m").text
|
|
||||||
|
|
||||||
|
|
||||||
def format_time(time):
|
|
||||||
return datetime.strptime(format_24_time(time), "%H").strftime("%I %p")
|
|
||||||
|
|
||||||
def format_24_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"]
|
|
||||||
+ "°F"
|
|
||||||
)
|
|
||||||
|
|
||||||
data["tooltip"] = (
|
|
||||||
f"<b>{weather['current_condition'][0]['weatherDesc'][0]['value']} {weather['current_condition'][0]['temp_F']}°</b>\n"
|
|
||||||
)
|
|
||||||
data["tooltip"] += f"Feels like: {weather['current_condition'][0]['FeelsLikeF']}°\n"
|
|
||||||
data["tooltip"] += f"Wind: {weather['current_condition'][0]['windspeedMiles']}mph\n"
|
|
||||||
data["tooltip"] += f"Humidity: {weather['current_condition'][0]['humidity']}%\n"
|
|
||||||
data["tooltip"] += f"Moon phase: {weather["weather"][0]['astronomy'][0]['moon_phase']} " + moon + "\n"
|
|
||||||
for i, day in enumerate(weather["weather"]):
|
|
||||||
data["tooltip"] += f"\n<b>"
|
|
||||||
if i == 0:
|
|
||||||
data["tooltip"] += "Today, "
|
|
||||||
if i == 1:
|
|
||||||
data["tooltip"] += "Tomorrow, "
|
|
||||||
date = datetime.strptime(day['date'], "%Y-%m-%d").strftime("%a %b %d %Y")
|
|
||||||
data["tooltip"] += f"{date}</b>\n"
|
|
||||||
data["tooltip"] += f" {day['maxtempF']}°F {day['mintempF']}°F"
|
|
||||||
data[
|
|
||||||
"tooltip"
|
|
||||||
] += f" {day['astronomy'][0]['sunrise']} {day['astronomy'][0]['sunset']}\n"
|
|
||||||
for hour in day["hourly"]:
|
|
||||||
if i == 0:
|
|
||||||
if int(format_24_time(hour["time"])) < datetime.now().hour - 2:
|
|
||||||
continue
|
|
||||||
if int(format_24_time(hour["time"])) > datetime.strptime(day['astronomy'][0]['sunset'], "%I:%M %p").hour or int(format_24_time(hour["time"])) < datetime.strptime(day['astronomy'][0]['sunrise'], "%I:%M %p").hour:
|
|
||||||
codes = WEATHER_CODES_WI_NIGHT
|
|
||||||
else:
|
|
||||||
codes = WEATHER_CODES_WI_DAY
|
|
||||||
data[
|
|
||||||
"tooltip"
|
|
||||||
] += f"{format_time(hour['time'])} {codes[hour['weatherCode']]} {format_temp(hour['FeelsLikeF'])} {hour['weatherDesc'][0]['value']}, {format_chances(hour)}\n"
|
|
||||||
|
|
||||||
|
|
||||||
print(json.dumps(data))
|
|
||||||
@@ -0,0 +1,387 @@
|
|||||||
|
{ pkgs, ... }:
|
||||||
|
let
|
||||||
|
waybar-weather = pkgs.writeScriptBin "waybar-weather" ''
|
||||||
|
#!/usr/bin/env nix-shell
|
||||||
|
#! nix-shell -i python3 --pure
|
||||||
|
#! nix-shell -p python3 python3Packages.requests
|
||||||
|
|
||||||
|
import json
|
||||||
|
from datetime import datetime
|
||||||
|
|
||||||
|
import requests
|
||||||
|
|
||||||
|
WWO_CODE = {
|
||||||
|
"113": "Sunny",
|
||||||
|
"116": "PartlyCloudy",
|
||||||
|
"119": "Cloudy",
|
||||||
|
"122": "VeryCloudy",
|
||||||
|
"143": "Fog",
|
||||||
|
"176": "LightShowers",
|
||||||
|
"179": "LightSleetShowers",
|
||||||
|
"182": "LightSleet",
|
||||||
|
"185": "LightSleet",
|
||||||
|
"200": "ThunderyShowers",
|
||||||
|
"227": "LightSnow",
|
||||||
|
"230": "HeavySnow",
|
||||||
|
"248": "Fog",
|
||||||
|
"260": "Fog",
|
||||||
|
"263": "LightShowers",
|
||||||
|
"266": "LightRain",
|
||||||
|
"281": "LightSleet",
|
||||||
|
"284": "LightSleet",
|
||||||
|
"293": "LightRain",
|
||||||
|
"296": "LightRain",
|
||||||
|
"299": "HeavyShowers",
|
||||||
|
"302": "HeavyRain",
|
||||||
|
"305": "HeavyShowers",
|
||||||
|
"308": "HeavyRain",
|
||||||
|
"311": "LightSleet",
|
||||||
|
"314": "LightSleet",
|
||||||
|
"317": "LightSleet",
|
||||||
|
"320": "LightSnow",
|
||||||
|
"323": "LightSnowShowers",
|
||||||
|
"326": "LightSnowShowers",
|
||||||
|
"329": "HeavySnow",
|
||||||
|
"332": "HeavySnow",
|
||||||
|
"335": "HeavySnowShowers",
|
||||||
|
"338": "HeavySnow",
|
||||||
|
"350": "LightSleet",
|
||||||
|
"353": "LightShowers",
|
||||||
|
"356": "HeavyShowers",
|
||||||
|
"359": "HeavyRain",
|
||||||
|
"362": "LightSleetShowers",
|
||||||
|
"365": "LightSleetShowers",
|
||||||
|
"368": "LightSnowShowers",
|
||||||
|
"371": "HeavySnowShowers",
|
||||||
|
"374": "LightSleetShowers",
|
||||||
|
"377": "LightSleet",
|
||||||
|
"386": "ThunderyShowers",
|
||||||
|
"389": "ThunderyHeavyRain",
|
||||||
|
"392": "ThunderySnowShowers",
|
||||||
|
"395": "HeavySnowShowers",
|
||||||
|
}
|
||||||
|
|
||||||
|
WEATHER_SYMBOL_EMOJI = {
|
||||||
|
"Unknown": "✨",
|
||||||
|
"Cloudy": "☁️",
|
||||||
|
"Fog": "🌫",
|
||||||
|
"HeavyRain": "🌧",
|
||||||
|
"HeavyShowers": "🌧",
|
||||||
|
"HeavySnow": "❄️",
|
||||||
|
"HeavySnowShowers": "❄️",
|
||||||
|
"LightRain": "🌦",
|
||||||
|
"LightShowers": "🌦",
|
||||||
|
"LightSleet": "🌧",
|
||||||
|
"LightSleetShowers": "🌧",
|
||||||
|
"LightSnow": "🌨",
|
||||||
|
"LightSnowShowers": "🌨",
|
||||||
|
"PartlyCloudy": "⛅️",
|
||||||
|
"Sunny": "☀️",
|
||||||
|
"ThunderyHeavyRain": "🌩",
|
||||||
|
"ThunderyShowers": "⛈",
|
||||||
|
"ThunderySnowShowers": "⛈",
|
||||||
|
"VeryCloudy": "☁️",
|
||||||
|
}
|
||||||
|
|
||||||
|
WEATHER_SYMBOL = {
|
||||||
|
"Unknown": "✨",
|
||||||
|
"Cloudy": "☁️",
|
||||||
|
"Fog": "🌫",
|
||||||
|
"HeavyRain": "🌧",
|
||||||
|
"HeavyShowers": "🌧",
|
||||||
|
"HeavySnow": "❄️",
|
||||||
|
"HeavySnowShowers": "❄️",
|
||||||
|
"LightRain": "🌦",
|
||||||
|
"LightShowers": "🌦",
|
||||||
|
"LightSleet": "🌧",
|
||||||
|
"LightSleetShowers": "🌧",
|
||||||
|
"LightSnow": "🌨",
|
||||||
|
"LightSnowShowers": "🌨",
|
||||||
|
"PartlyCloudy": "⛅️",
|
||||||
|
"Sunny": "☀️",
|
||||||
|
"ThunderyHeavyRain": "🌩",
|
||||||
|
"ThunderyShowers": "⛈",
|
||||||
|
"ThunderySnowShowers": "⛈",
|
||||||
|
"VeryCloudy": "☁️",
|
||||||
|
}
|
||||||
|
|
||||||
|
WEATHER_CODES = {key: WEATHER_SYMBOL[value] for key, value in WWO_CODE.items()}
|
||||||
|
|
||||||
|
WIND_DIRECTION = [
|
||||||
|
"↓", "↙", "←", "↖", "↑", "↗", "→", "↘",
|
||||||
|
]
|
||||||
|
|
||||||
|
MOON_PHASES = (
|
||||||
|
"🌑", "🌒", "🌓", "🌔", "🌕", "🌖", "🌗", "🌘"
|
||||||
|
)
|
||||||
|
|
||||||
|
WEATHER_SYMBOL_WI_DAY = {
|
||||||
|
"Unknown": "",
|
||||||
|
"Cloudy": "",
|
||||||
|
"Fog": "",
|
||||||
|
"HeavyRain": "",
|
||||||
|
"HeavyShowers": "",
|
||||||
|
"HeavySnow": "",
|
||||||
|
"HeavySnowShowers": "",
|
||||||
|
"LightRain": "",
|
||||||
|
"LightShowers": "",
|
||||||
|
"LightSleet": "",
|
||||||
|
"LightSleetShowers": "",
|
||||||
|
"LightSnow": "",
|
||||||
|
"LightSnowShowers": "",
|
||||||
|
"PartlyCloudy": "",
|
||||||
|
"Sunny": "",
|
||||||
|
"ThunderyHeavyRain": "",
|
||||||
|
"ThunderyShowers": "",
|
||||||
|
"ThunderySnowShowers": "",
|
||||||
|
"VeryCloudy": "",
|
||||||
|
}
|
||||||
|
|
||||||
|
WEATHER_CODES_WI_DAY = {key: WEATHER_SYMBOL_WI_DAY[value] for key, value in WWO_CODE.items()}
|
||||||
|
|
||||||
|
WEATHER_SYMBOL_WI_NIGHT = {
|
||||||
|
"Unknown": "",
|
||||||
|
"Cloudy": "",
|
||||||
|
"Fog": "",
|
||||||
|
"HeavyRain": "",
|
||||||
|
"HeavyShowers": "",
|
||||||
|
"HeavySnow": "",
|
||||||
|
"HeavySnowShowers": "",
|
||||||
|
"LightRain": "",
|
||||||
|
"LightShowers": "",
|
||||||
|
"LightSleet": "",
|
||||||
|
"LightSleetShowers": "",
|
||||||
|
"LightSnow": "",
|
||||||
|
"LightSnowShowers": "",
|
||||||
|
"PartlyCloudy": "",
|
||||||
|
"Sunny": "",
|
||||||
|
"ThunderyHeavyRain": "",
|
||||||
|
"ThunderyShowers": "",
|
||||||
|
"ThunderySnowShowers": "",
|
||||||
|
"VeryCloudy": "",
|
||||||
|
}
|
||||||
|
|
||||||
|
WEATHER_CODES_WI_NIGHT = {key: WEATHER_SYMBOL_WI_NIGHT[value] for key, value in WWO_CODE.items()}
|
||||||
|
|
||||||
|
WIND_DIRECTION_WI = [
|
||||||
|
"", "", "", "", "", "", "", "",
|
||||||
|
]
|
||||||
|
|
||||||
|
WIND_SCALE_WI = [
|
||||||
|
"", "", "", "", "", "", "", "", "", "", "", "", "",
|
||||||
|
]
|
||||||
|
|
||||||
|
MOON_PHASES_WI = (
|
||||||
|
"", "", "", "", "", "", "",
|
||||||
|
"", "", "", "", "", "", "",
|
||||||
|
"", "", "", "", "", "", "",
|
||||||
|
"", "", "", "", "", "", "",
|
||||||
|
)
|
||||||
|
|
||||||
|
WEATHER_SYMBOL_WEGO = {
|
||||||
|
"Unknown": [
|
||||||
|
" .-. ",
|
||||||
|
" __) ",
|
||||||
|
" ( ",
|
||||||
|
" `-’ ",
|
||||||
|
" • "],
|
||||||
|
"Sunny": [
|
||||||
|
"\033[38;5;226m \\ / \033[0m",
|
||||||
|
"\033[38;5;226m .-. \033[0m",
|
||||||
|
"\033[38;5;226m ― ( ) ― \033[0m",
|
||||||
|
"\033[38;5;226m `-’ \033[0m",
|
||||||
|
"\033[38;5;226m / \\ \033[0m"],
|
||||||
|
"PartlyCloudy": [
|
||||||
|
"\033[38;5;226m \\ /\033[0m ",
|
||||||
|
"\033[38;5;226m _ /\"\"\033[38;5;250m.-. \033[0m",
|
||||||
|
"\033[38;5;226m \\_\033[38;5;250m( ). \033[0m",
|
||||||
|
"\033[38;5;226m /\033[38;5;250m(___(__) \033[0m",
|
||||||
|
" "],
|
||||||
|
"Cloudy": [
|
||||||
|
" ",
|
||||||
|
"\033[38;5;250m .--. \033[0m",
|
||||||
|
"\033[38;5;250m .-( ). \033[0m",
|
||||||
|
"\033[38;5;250m (___.__)__) \033[0m",
|
||||||
|
" "],
|
||||||
|
"VeryCloudy": [
|
||||||
|
" ",
|
||||||
|
"\033[38;5;240;1m .--. \033[0m",
|
||||||
|
"\033[38;5;240;1m .-( ). \033[0m",
|
||||||
|
"\033[38;5;240;1m (___.__)__) \033[0m",
|
||||||
|
" "],
|
||||||
|
"LightShowers": [
|
||||||
|
"\033[38;5;226m _`/\"\"\033[38;5;250m.-. \033[0m",
|
||||||
|
"\033[38;5;226m ,\\_\033[38;5;250m( ). \033[0m",
|
||||||
|
"\033[38;5;226m /\033[38;5;250m(___(__) \033[0m",
|
||||||
|
"\033[38;5;111m ‘ ‘ ‘ ‘ \033[0m",
|
||||||
|
"\033[38;5;111m ‘ ‘ ‘ ‘ \033[0m"],
|
||||||
|
"HeavyShowers": [
|
||||||
|
"\033[38;5;226m _`/\"\"\033[38;5;240;1m.-. \033[0m",
|
||||||
|
"\033[38;5;226m ,\\_\033[38;5;240;1m( ). \033[0m",
|
||||||
|
"\033[38;5;226m /\033[38;5;240;1m(___(__) \033[0m",
|
||||||
|
"\033[38;5;21;1m ‚‘‚‘‚‘‚‘ \033[0m",
|
||||||
|
"\033[38;5;21;1m ‚’‚’‚’‚’ \033[0m"],
|
||||||
|
"LightSnowShowers": [
|
||||||
|
"\033[38;5;226m _`/\"\"\033[38;5;250m.-. \033[0m",
|
||||||
|
"\033[38;5;226m ,\\_\033[38;5;250m( ). \033[0m",
|
||||||
|
"\033[38;5;226m /\033[38;5;250m(___(__) \033[0m",
|
||||||
|
"\033[38;5;255m * * * \033[0m",
|
||||||
|
"\033[38;5;255m * * * \033[0m"],
|
||||||
|
"HeavySnowShowers": [
|
||||||
|
"\033[38;5;226m _`/\"\"\033[38;5;240;1m.-. \033[0m",
|
||||||
|
"\033[38;5;226m ,\\_\033[38;5;240;1m( ). \033[0m",
|
||||||
|
"\033[38;5;226m /\033[38;5;240;1m(___(__) \033[0m",
|
||||||
|
"\033[38;5;255;1m * * * * \033[0m",
|
||||||
|
"\033[38;5;255;1m * * * * \033[0m"],
|
||||||
|
"LightSleetShowers": [
|
||||||
|
"\033[38;5;226m _`/\"\"\033[38;5;250m.-. \033[0m",
|
||||||
|
"\033[38;5;226m ,\\_\033[38;5;250m( ). \033[0m",
|
||||||
|
"\033[38;5;226m /\033[38;5;250m(___(__) \033[0m",
|
||||||
|
"\033[38;5;111m ‘ \033[38;5;255m*\033[38;5;111m ‘ \033[38;5;255m* \033[0m",
|
||||||
|
"\033[38;5;255m *\033[38;5;111m ‘ \033[38;5;255m*\033[38;5;111m ‘ \033[0m"],
|
||||||
|
"ThunderyShowers": [
|
||||||
|
"\033[38;5;226m _`/\"\"\033[38;5;250m.-. \033[0m",
|
||||||
|
"\033[38;5;226m ,\\_\033[38;5;250m( ). \033[0m",
|
||||||
|
"\033[38;5;226m /\033[38;5;250m(___(__) \033[0m",
|
||||||
|
"\033[38;5;228;5m ⚡\033[38;5;111;25m‘ ‘\033[38;5;228;5m⚡\033[38;5;111;25m‘ ‘ \033[0m",
|
||||||
|
"\033[38;5;111m ‘ ‘ ‘ ‘ \033[0m"],
|
||||||
|
"ThunderyHeavyRain": [
|
||||||
|
"\033[38;5;240;1m .-. \033[0m",
|
||||||
|
"\033[38;5;240;1m ( ). \033[0m",
|
||||||
|
"\033[38;5;240;1m (___(__) \033[0m",
|
||||||
|
"\033[38;5;21;1m ‚‘\033[38;5;228;5m⚡\033[38;5;21;25m‘‚\033[38;5;228;5m⚡\033[38;5;21;25m‚‘ \033[0m",
|
||||||
|
"\033[38;5;21;1m ‚’‚’\033[38;5;228;5m⚡\033[38;5;21;25m’‚’ \033[0m"],
|
||||||
|
"ThunderySnowShowers": [
|
||||||
|
"\033[38;5;226m _`/\"\"\033[38;5;250m.-. \033[0m",
|
||||||
|
"\033[38;5;226m ,\\_\033[38;5;250m( ). \033[0m",
|
||||||
|
"\033[38;5;226m /\033[38;5;250m(___(__) \033[0m",
|
||||||
|
"\033[38;5;255m *\033[38;5;228;5m⚡\033[38;5;255;25m*\033[38;5;228;5m⚡\033[38;5;255;25m* \033[0m",
|
||||||
|
"\033[38;5;255m * * * \033[0m"],
|
||||||
|
"LightRain": [
|
||||||
|
"\033[38;5;250m .-. \033[0m",
|
||||||
|
"\033[38;5;250m ( ). \033[0m",
|
||||||
|
"\033[38;5;250m (___(__) \033[0m",
|
||||||
|
"\033[38;5;111m ‘ ‘ ‘ ‘ \033[0m",
|
||||||
|
"\033[38;5;111m ‘ ‘ ‘ ‘ \033[0m"],
|
||||||
|
"HeavyRain": [
|
||||||
|
"\033[38;5;240;1m .-. \033[0m",
|
||||||
|
"\033[38;5;240;1m ( ). \033[0m",
|
||||||
|
"\033[38;5;240;1m (___(__) \033[0m",
|
||||||
|
"\033[38;5;21;1m ‚‘‚‘‚‘‚‘ \033[0m",
|
||||||
|
"\033[38;5;21;1m ‚’‚’‚’‚’ \033[0m"],
|
||||||
|
"LightSnow": [
|
||||||
|
"\033[38;5;250m .-. \033[0m",
|
||||||
|
"\033[38;5;250m ( ). \033[0m",
|
||||||
|
"\033[38;5;250m (___(__) \033[0m",
|
||||||
|
"\033[38;5;255m * * * \033[0m",
|
||||||
|
"\033[38;5;255m * * * \033[0m"],
|
||||||
|
"HeavySnow": [
|
||||||
|
"\033[38;5;240;1m .-. \033[0m",
|
||||||
|
"\033[38;5;240;1m ( ). \033[0m",
|
||||||
|
"\033[38;5;240;1m (___(__) \033[0m",
|
||||||
|
"\033[38;5;255;1m * * * * \033[0m",
|
||||||
|
"\033[38;5;255;1m * * * * \033[0m"],
|
||||||
|
"LightSleet": [
|
||||||
|
"\033[38;5;250m .-. \033[0m",
|
||||||
|
"\033[38;5;250m ( ). \033[0m",
|
||||||
|
"\033[38;5;250m (___(__) \033[0m",
|
||||||
|
"\033[38;5;111m ‘ \033[38;5;255m*\033[38;5;111m ‘ \033[38;5;255m* \033[0m",
|
||||||
|
"\033[38;5;255m *\033[38;5;111m ‘ \033[38;5;255m*\033[38;5;111m ‘ \033[0m"],
|
||||||
|
"Fog": [
|
||||||
|
" ",
|
||||||
|
"\033[38;5;251m _ - _ - _ - \033[0m",
|
||||||
|
"\033[38;5;251m _ - _ - _ \033[0m",
|
||||||
|
"\033[38;5;251m _ - _ - _ - \033[0m",
|
||||||
|
" "],
|
||||||
|
}
|
||||||
|
|
||||||
|
data = {}
|
||||||
|
|
||||||
|
|
||||||
|
weather = requests.get("https://wttr.in/?u&format=j1").json()
|
||||||
|
moon = requests.get("https://wttr.in/?format=%m").text
|
||||||
|
|
||||||
|
|
||||||
|
def format_time(time):
|
||||||
|
return datetime.strptime(format_24_time(time), "%H").strftime("%I %p")
|
||||||
|
|
||||||
|
def format_24_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"]
|
||||||
|
+ "°F"
|
||||||
|
)
|
||||||
|
|
||||||
|
data["tooltip"] = (
|
||||||
|
f"<b>{weather['current_condition'][0]['weatherDesc'][0]['value']} {weather['current_condition'][0]['temp_F']}°</b>\n"
|
||||||
|
)
|
||||||
|
data["tooltip"] += f"Feels like: {weather['current_condition'][0]['FeelsLikeF']}°\n"
|
||||||
|
data["tooltip"] += f"Wind: {weather['current_condition'][0]['windspeedMiles']}mph\n"
|
||||||
|
data["tooltip"] += f"Humidity: {weather['current_condition'][0]['humidity']}%\n"
|
||||||
|
data["tooltip"] += f"Moon phase: {weather["weather"][0]['astronomy'][0]['moon_phase']} " + moon + "\n"
|
||||||
|
for i, day in enumerate(weather["weather"]):
|
||||||
|
data["tooltip"] += f"\n<b>"
|
||||||
|
if i == 0:
|
||||||
|
data["tooltip"] += "Today, "
|
||||||
|
if i == 1:
|
||||||
|
data["tooltip"] += "Tomorrow, "
|
||||||
|
date = datetime.strptime(day['date'], "%Y-%m-%d").strftime("%a %b %d %Y")
|
||||||
|
data["tooltip"] += f"{date}</b>\n"
|
||||||
|
data["tooltip"] += f" {day['maxtempF']}°F {day['mintempF']}°F"
|
||||||
|
data[
|
||||||
|
"tooltip"
|
||||||
|
] += f" {day['astronomy'][0]['sunrise']} {day['astronomy'][0]['sunset']}\n"
|
||||||
|
for hour in day["hourly"]:
|
||||||
|
if i == 0:
|
||||||
|
if int(format_24_time(hour["time"])) < datetime.now().hour - 2:
|
||||||
|
continue
|
||||||
|
if int(format_24_time(hour["time"])) > datetime.strptime(day['astronomy'][0]['sunset'], "%I:%M %p").hour or int(format_24_time(hour["time"])) < datetime.strptime(day['astronomy'][0]['sunrise'], "%I:%M %p").hour:
|
||||||
|
codes = WEATHER_CODES_WI_NIGHT
|
||||||
|
else:
|
||||||
|
codes = WEATHER_CODES_WI_DAY
|
||||||
|
data[
|
||||||
|
"tooltip"
|
||||||
|
] += f"{format_time(hour['time'])} {codes[hour['weatherCode']]} {format_temp(hour['FeelsLikeF'])} {hour['weatherDesc'][0]['value']}, {format_chances(hour)}\n"
|
||||||
|
|
||||||
|
|
||||||
|
print(json.dumps(data))
|
||||||
|
'';
|
||||||
|
in
|
||||||
|
{
|
||||||
|
home.packages = [ waybar-weather ];
|
||||||
|
}
|
||||||
@@ -0,0 +1,99 @@
|
|||||||
|
{ pkgs, ... }:
|
||||||
|
let
|
||||||
|
theme = import ../../theme.nix { inherit pkgs; };
|
||||||
|
in
|
||||||
|
{
|
||||||
|
programs.wlogout = {
|
||||||
|
enable = true;
|
||||||
|
layout = {
|
||||||
|
lock = {
|
||||||
|
label = "lock";
|
||||||
|
action = "hyprlock --immediate";
|
||||||
|
text = "Lock";
|
||||||
|
keybind = "l";
|
||||||
|
};
|
||||||
|
hibernate = {
|
||||||
|
label = "hibernate";
|
||||||
|
action = "systemctl hibernate";
|
||||||
|
text = "Hibernate";
|
||||||
|
keybind = "h";
|
||||||
|
};
|
||||||
|
logout = {
|
||||||
|
label = "logout";
|
||||||
|
action = "sleep 1; hyprctl dispatch exit";
|
||||||
|
text = "Logout";
|
||||||
|
keybind = "e";
|
||||||
|
};
|
||||||
|
shutdown = {
|
||||||
|
label = "shutdown";
|
||||||
|
action = "systemctl poweroff";
|
||||||
|
text = "Shutdown";
|
||||||
|
keybind = "s";
|
||||||
|
};
|
||||||
|
suspend = {
|
||||||
|
label = "suspend";
|
||||||
|
action = "systemctl suspend";
|
||||||
|
text = "Suspend";
|
||||||
|
keybind = "u";
|
||||||
|
};
|
||||||
|
reboot = {
|
||||||
|
label = "reboot";
|
||||||
|
action = "reboot";
|
||||||
|
text = "Reboot";
|
||||||
|
keybind = "r";
|
||||||
|
};
|
||||||
|
};
|
||||||
|
style = ''
|
||||||
|
* {
|
||||||
|
background-image: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
window {
|
||||||
|
background-color: ${theme.nord.polarNight.nord0}f0
|
||||||
|
}
|
||||||
|
|
||||||
|
button {
|
||||||
|
margin: 8px;
|
||||||
|
color: ${theme.nord.frost.nord7};
|
||||||
|
background-color: ${theme.nord.polarNight.nord1};
|
||||||
|
border-style: solid;
|
||||||
|
border-width: 2px;
|
||||||
|
background-repeat: no-repeat;
|
||||||
|
background-position: center;
|
||||||
|
background-size: 25%;
|
||||||
|
}
|
||||||
|
|
||||||
|
button:active,
|
||||||
|
button:focus,
|
||||||
|
button:hover {
|
||||||
|
color: ${theme.nord.frost.nord8};
|
||||||
|
background-color: ${theme.nord.polarNight.nord2};
|
||||||
|
outline-style: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
#lock {
|
||||||
|
background-image: image(url("icons/lock.png"));
|
||||||
|
}
|
||||||
|
|
||||||
|
#logout {
|
||||||
|
background-image: image(url("icons/logout.png"));
|
||||||
|
}
|
||||||
|
|
||||||
|
#suspend {
|
||||||
|
background-image: image(url("icons/suspend.png"));
|
||||||
|
}
|
||||||
|
|
||||||
|
#hibernate {
|
||||||
|
background-image: image(url("icons/hibernate.png"));
|
||||||
|
}
|
||||||
|
|
||||||
|
#shutdown {
|
||||||
|
background-image: image(url("icons/shutdown.png"));
|
||||||
|
}
|
||||||
|
|
||||||
|
#reboot {
|
||||||
|
background-image: image(url("icons/reboot.png"));
|
||||||
|
}
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
}
|
||||||
@@ -1,36 +0,0 @@
|
|||||||
{
|
|
||||||
"label" : "lock",
|
|
||||||
"action" : "swaylock",
|
|
||||||
"text" : "Lock",
|
|
||||||
"keybind" : "l"
|
|
||||||
}
|
|
||||||
{
|
|
||||||
"label" : "hibernate",
|
|
||||||
"action" : "systemctl hibernate",
|
|
||||||
"text" : "Hibernate",
|
|
||||||
"keybind" : "h"
|
|
||||||
}
|
|
||||||
{
|
|
||||||
"label" : "logout",
|
|
||||||
"action" : "sleep 1; hyprctl dispatch exit",
|
|
||||||
"text" : "Logout",
|
|
||||||
"keybind" : "e"
|
|
||||||
}
|
|
||||||
{
|
|
||||||
"label" : "shutdown",
|
|
||||||
"action" : "systemctl poweroff",
|
|
||||||
"text" : "Shutdown",
|
|
||||||
"keybind" : "s"
|
|
||||||
}
|
|
||||||
{
|
|
||||||
"label" : "suspend",
|
|
||||||
"action" : "systemctl suspend",
|
|
||||||
"text" : "Suspend",
|
|
||||||
"keybind" : "u"
|
|
||||||
}
|
|
||||||
{
|
|
||||||
"label" : "reboot",
|
|
||||||
"action" : "systemctl reboot",
|
|
||||||
"text" : "Reboot",
|
|
||||||
"keybind" : "r"
|
|
||||||
}
|
|
||||||
@@ -1,50 +0,0 @@
|
|||||||
* {
|
|
||||||
background-image: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
window {
|
|
||||||
background-color: rgba(36, 39, 58, 0.9);
|
|
||||||
}
|
|
||||||
|
|
||||||
button {
|
|
||||||
margin: 8px;
|
|
||||||
color: #cad3f5;
|
|
||||||
background-color: #363a4f;
|
|
||||||
border-style: solid;
|
|
||||||
border-width: 2px;
|
|
||||||
background-repeat: no-repeat;
|
|
||||||
background-position: center;
|
|
||||||
background-size: 25%;
|
|
||||||
}
|
|
||||||
|
|
||||||
button:active,
|
|
||||||
button:focus,
|
|
||||||
button:hover {
|
|
||||||
color: #8bd5ca;
|
|
||||||
background-color: #24273a;
|
|
||||||
outline-style: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
#lock {
|
|
||||||
background-image: image(url("icons/lock.png"));
|
|
||||||
}
|
|
||||||
|
|
||||||
#logout {
|
|
||||||
background-image: image(url("icons/logout.png"));
|
|
||||||
}
|
|
||||||
|
|
||||||
#suspend {
|
|
||||||
background-image: image(url("icons/suspend.png"));
|
|
||||||
}
|
|
||||||
|
|
||||||
#hibernate {
|
|
||||||
background-image: image(url("icons/hibernate.png"));
|
|
||||||
}
|
|
||||||
|
|
||||||
#shutdown {
|
|
||||||
background-image: image(url("icons/shutdown.png"));
|
|
||||||
}
|
|
||||||
|
|
||||||
#reboot {
|
|
||||||
background-image: image(url("icons/reboot.png"));
|
|
||||||
}
|
|
||||||
@@ -1,7 +1,17 @@
|
|||||||
{ pkgs, lib, ... }:
|
{ pkgs, lib, ... }:
|
||||||
let
|
let
|
||||||
# sddmTheme = "catppuccin-mocha";
|
|
||||||
theme = import ./theme.nix { inherit pkgs; };
|
theme = import ./theme.nix { inherit pkgs; };
|
||||||
|
|
||||||
|
bing-wallpaper = pkgs.writeScriptBin "bing-wallpaper" ''
|
||||||
|
# Directory to store wallpapers
|
||||||
|
IMG_PATH="/tmp/wallpaper.jpg"
|
||||||
|
|
||||||
|
# Download if not already downloaded
|
||||||
|
URL=$(curl -s "https://www.bing.com/HPImageArchive.aspx?format=js&idx=0&n=1" | \
|
||||||
|
jq -r '.images[0].url')
|
||||||
|
FULL_URL="https://www.bing.com$URL"
|
||||||
|
curl -s -o "$IMG_PATH" "$FULL_URL"
|
||||||
|
'';
|
||||||
in
|
in
|
||||||
{
|
{
|
||||||
imports = [
|
imports = [
|
||||||
@@ -15,7 +25,8 @@ in
|
|||||||
sddm = {
|
sddm = {
|
||||||
enable = true;
|
enable = true;
|
||||||
package = pkgs.kdePackages.sddm;
|
package = pkgs.kdePackages.sddm;
|
||||||
theme = theme.sddmTheme;
|
extraPackages = [ theme.sddm.package ];
|
||||||
|
theme = theme.sddm.themeName;
|
||||||
wayland.enable = true;
|
wayland.enable = true;
|
||||||
};
|
};
|
||||||
# Disable gdm
|
# Disable gdm
|
||||||
@@ -47,6 +58,22 @@ in
|
|||||||
};
|
};
|
||||||
|
|
||||||
systemd = {
|
systemd = {
|
||||||
|
services = {
|
||||||
|
preload-bing-wallpaper = {
|
||||||
|
wants = [ "network.target" ];
|
||||||
|
after = [ "network.target" ];
|
||||||
|
wantedBy = [ "graphical-session.target" ];
|
||||||
|
path = [
|
||||||
|
pkgs.bash
|
||||||
|
pkgs.jq
|
||||||
|
pkgs.curl
|
||||||
|
bing-wallpaper
|
||||||
|
];
|
||||||
|
script = ''
|
||||||
|
bing-wallpaper
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
};
|
||||||
user.services.polkit-gnome-authentication-agent-1 = {
|
user.services.polkit-gnome-authentication-agent-1 = {
|
||||||
description = "polkit-gnome-authentication-agent-1";
|
description = "polkit-gnome-authentication-agent-1";
|
||||||
wantedBy = [ "graphical-session.target" ];
|
wantedBy = [ "graphical-session.target" ];
|
||||||
@@ -92,6 +119,7 @@ in
|
|||||||
xdgOpenUsePortal = false;
|
xdgOpenUsePortal = false;
|
||||||
extraPortals = [
|
extraPortals = [
|
||||||
pkgs.xdg-desktop-portal-hyprland
|
pkgs.xdg-desktop-portal-hyprland
|
||||||
|
pkgs.xdg-desktop-portal-gnome
|
||||||
pkgs.xdg-desktop-portal-gtk
|
pkgs.xdg-desktop-portal-gtk
|
||||||
];
|
];
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -1,28 +1,6 @@
|
|||||||
{ pkgs, ... }:
|
{ pkgs, ... }:
|
||||||
let
|
|
||||||
|
|
||||||
waybarWeatherScript = pkgs.writeScriptBin "waybar-weather" ''
|
|
||||||
/home/matt/.config/waybar/scripts/waybar-wttr.py
|
|
||||||
'';
|
|
||||||
|
|
||||||
waybarUpdatesScript = pkgs.writeScriptBin "waybar-updates" ''
|
|
||||||
/home/matt/.config/waybar/scripts/waybar-updates.py
|
|
||||||
'';
|
|
||||||
|
|
||||||
bing-wallpaper = pkgs.writeScriptBin "bing-wallpaper" ''
|
|
||||||
# Directory to store wallpapers
|
|
||||||
IMG_PATH="/tmp/wallpaper.jpg"
|
|
||||||
|
|
||||||
# Download if not already downloaded
|
|
||||||
URL=$(curl -s "https://www.bing.com/HPImageArchive.aspx?format=js&idx=0&n=1" | \
|
|
||||||
jq -r '.images[0].url')
|
|
||||||
FULL_URL="https://www.bing.com$URL"
|
|
||||||
curl -s -o "$IMG_PATH" "$FULL_URL"
|
|
||||||
'';
|
|
||||||
in
|
|
||||||
{
|
{
|
||||||
environment.systemPackages = with pkgs; [
|
environment.systemPackages = with pkgs; [
|
||||||
bing-wallpaper
|
|
||||||
ddcutil
|
ddcutil
|
||||||
dunst
|
dunst
|
||||||
egl-wayland
|
egl-wayland
|
||||||
@@ -42,6 +20,7 @@ in
|
|||||||
hyprcursor
|
hyprcursor
|
||||||
hyprland
|
hyprland
|
||||||
hyprshot
|
hyprshot
|
||||||
|
kdePackages.qtmultimedia
|
||||||
libnotify
|
libnotify
|
||||||
mako
|
mako
|
||||||
meson
|
meson
|
||||||
@@ -51,6 +30,7 @@ in
|
|||||||
nwg-dock-hyprland
|
nwg-dock-hyprland
|
||||||
nwg-drawer
|
nwg-drawer
|
||||||
nwg-look
|
nwg-look
|
||||||
|
overskride
|
||||||
pamixer
|
pamixer
|
||||||
pavucontrol
|
pavucontrol
|
||||||
playerctl
|
playerctl
|
||||||
@@ -60,8 +40,6 @@ in
|
|||||||
qt6.qtwayland
|
qt6.qtwayland
|
||||||
rofi-wayland
|
rofi-wayland
|
||||||
waybar
|
waybar
|
||||||
waybarUpdatesScript
|
|
||||||
waybarWeatherScript
|
|
||||||
wayland-protocols
|
wayland-protocols
|
||||||
wayland-utils
|
wayland-utils
|
||||||
waypaper
|
waypaper
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
{ lib, pkgs, ... }:
|
{ lib, pkgs, ... }:
|
||||||
let
|
let
|
||||||
theme = import ./theme.nix { inherit pkgs; };
|
theme = import ./theme.nix { inherit pkgs; };
|
||||||
wallpaper = "/home/matt/.config/wallpapers/wall.png";
|
wallpaper = "/tmp/wallpaper.jpg";
|
||||||
in
|
in
|
||||||
{
|
{
|
||||||
imports = [
|
imports = [
|
||||||
@@ -93,8 +93,6 @@ in
|
|||||||
};
|
};
|
||||||
|
|
||||||
services = {
|
services = {
|
||||||
blueman-applet.enable = true;
|
|
||||||
|
|
||||||
hyprpaper = {
|
hyprpaper = {
|
||||||
enable = true;
|
enable = true;
|
||||||
settings = {
|
settings = {
|
||||||
|
|||||||
@@ -6,6 +6,13 @@ let
|
|||||||
themeColor = "dark"; # [ "standard" "light" "dark" ]
|
themeColor = "dark"; # [ "standard" "light" "dark" ]
|
||||||
iconThemeVariant = "all"; # [ "default" "purple" "pink" "red" "orange" "yellow" "green" "teal" "grey" "all" ]
|
iconThemeVariant = "all"; # [ "default" "purple" "pink" "red" "orange" "yellow" "green" "teal" "grey" "all" ]
|
||||||
iconScheme = "nord"; # [ "default" "nord" "dracula" "gruvbox" "everforest" "catppuccin" "all" ]
|
iconScheme = "nord"; # [ "default" "nord" "dracula" "gruvbox" "everforest" "catppuccin" "all" ]
|
||||||
|
|
||||||
|
# customized_sddm_astronaut = pkgs.sddm-astronaut.override {
|
||||||
|
# embeddedTheme = "hyprland_kath";
|
||||||
|
# themeConfig = {
|
||||||
|
# Background = "path/to/background.jpg";
|
||||||
|
# };
|
||||||
|
# };
|
||||||
in
|
in
|
||||||
{
|
{
|
||||||
# Displays
|
# Displays
|
||||||
@@ -52,7 +59,10 @@ in
|
|||||||
fontSize = 12;
|
fontSize = 12;
|
||||||
|
|
||||||
# SDDM/Locking
|
# SDDM/Locking
|
||||||
sddmTheme = "sddm-astronaut";
|
sddm = {
|
||||||
|
themeName = "sddm-astronaut-theme";
|
||||||
|
package = pkgs.sddm-astronaut;
|
||||||
|
};
|
||||||
lockScreenTimer = 900; # 15 min
|
lockScreenTimer = 900; # 15 min
|
||||||
screenOffTimer = 930; # 15.5 min
|
screenOffTimer = 930; # 15.5 min
|
||||||
suspendTimer = 3600; # 1hr
|
suspendTimer = 3600; # 1hr
|
||||||
|
|||||||
Reference in New Issue
Block a user